Move SSD group save statuses to typed Kotlin

ober

3f6f222ac0801be1b3c97afafaeea5c78948eead

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index 1ffd958..60382f6 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -3730,6 +3730,10 @@
                 manualGroupLabel manualCellCount editedGroupCount
                 areaSelectionStatus detectedIdsCountText
                 detectedBoxesTitle detectedBoxesMessage
+                approveSavingStatus approveSavedStatus
+                approveCountSavingStatus approveCountSavedStatus
+                appendSavingStatus appendSavedStatus
+                deleteSavingStatus deleteSavedStatus
                 clampPageIndex shiftPageIndex displayGroupCanvasLabel
                 dropdownHeight dialogPageNumber nullableLowercaseOrEmpty
                 selectModeStatus selectionResultStatus detectStartStatus
@@ -3907,6 +3911,52 @@
           (if (> detectedCount (int32 0))
             (detectedBoxesTitle detectedCount)
             "No detected boxes; enter manual count"))
+        (def (groupCountSuffix (count : Int32)) : String
+          (string-append
+            " ("
+            (string-append
+              (int32->string count)
+              " boxes)")))
+        (def (approveSavingStatus (group : SsdGroup)) : String
+          (string-append
+            "Approved "
+            (string-append (groupDisplayLabel group) "; saving...")))
+        (def (approveSavedStatus (group : SsdGroup)) : String
+          (string-append
+            "Approved and saved "
+            (groupDisplayLabel group)))
+        (def (approveCountSavingStatus (group : SsdGroup) (count : Int32)) : String
+          (string-append
+            "Approved "
+            (string-append
+              (groupDisplayLabel group)
+              (string-append (groupCountSuffix count) "; saving..."))))
+        (def (approveCountSavedStatus (group : SsdGroup) (count : Int32)) : String
+          (string-append
+            "Approved and saved "
+            (string-append (groupDisplayLabel group) (groupCountSuffix count))))
+        (def (appendSavingStatus (group : SsdGroup) (added : Int32)) : String
+          (string-append
+            "Appended "
+            (string-append
+              (int32->string added)
+              (string-append
+                " boxes to "
+                (string-append (groupDisplayLabel group) "; saving...")))))
+        (def (appendSavedStatus (group : SsdGroup)) : String
+          (string-append
+            "Appended and saved "
+            (string-append
+              (groupDisplayLabel group)
+              (groupCountSuffix (SsdGroup-count group)))))
+        (def (deleteSavingStatus (group : SsdGroup)) : String
+          (string-append
+            "Deleted "
+            (string-append (groupDisplayLabel group) "; saving...")))
+        (def (deleteSavedStatus (group : SsdGroup)) : String
+          (string-append
+            "Deleted and saved "
+            (groupDisplayLabel group)))
         (def (dropdownHeight (screenHeight : Int32)) : Int32
           (let ((third (/ screenHeight (int32 3))))
             (if (> third (int32 620))
@@ -5425,8 +5475,8 @@
        "        reviewView.invalidate()"
        "        saveSessionAsync("
        "            session,"
-       "            \"Approved ${groupDisplayLabel(group)}; saving...\","
-       "            \"Approved and saved ${groupDisplayLabel(group)}\""
+       "            approveSavingStatus(group),"
+       "            approveSavedStatus(group)"
        "        )"
        "    }"
        ""
@@ -5795,8 +5845,8 @@
        "        reviewView.invalidate()"
        "        saveSessionAsync("
        "            session,"
-       "            \"Approved ${groupDisplayLabel(group)} (${ids.size} boxes); saving...\","
-       "            \"Approved and saved ${groupDisplayLabel(group)} (${ids.size} boxes)\""
+       "            approveCountSavingStatus(group, ids.size),"
+       "            approveCountSavedStatus(group, ids.size)"
        "        )"
        "    }"
        ""
@@ -5820,8 +5870,8 @@
        "        reviewView.invalidate()"
        "        saveSessionAsync("
        "            session,"
-       "            \"Appended $added boxes to ${groupDisplayLabel(group)}; saving...\","
-       "            \"Appended and saved ${groupDisplayLabel(group)} (${group.count} boxes)\""
+       "            appendSavingStatus(group, added),"
+       "            appendSavedStatus(group)"
        "        )"
        "    }"
        ""
@@ -5919,8 +5969,8 @@
        "        reviewView.invalidate()"
        "        saveSessionAsync("
        "            session,"
-       "            \"Deleted ${groupDisplayLabel(group)}; saving...\","
-       "            \"Deleted and saved ${groupDisplayLabel(group)}\""
+       "            deleteSavingStatus(group),"
+       "            deleteSavedStatus(group)"
        "        )"
        "    }"
        ""