@7365admin1/layer-common 3.2.7 → 3.2.8-staging.201

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/assets/css/primitives.css +1113 -0
  2. package/assets/css/screens.css +1097 -0
  3. package/assets/css/shell.css +258 -0
  4. package/assets/css/tokens.css +236 -0
  5. package/components/AcceptDialog.vue +17 -18
  6. package/components/AccessCard/AvailableStats.vue +24 -16
  7. package/components/AccessCardAddForm.vue +42 -42
  8. package/components/AccessCardAssignToUnitForm.vue +13 -21
  9. package/components/AccessCardDeleteDialog.vue +41 -39
  10. package/components/AccessCardDetailsDialog.vue +125 -79
  11. package/components/AccessCardPreviewDialog.vue +58 -84
  12. package/components/AccessCardQrTagging.vue +60 -63
  13. package/components/AccessCardReplaceForm.vue +27 -23
  14. package/components/AccessManagement.vue +86 -85
  15. package/components/AddEqupmentForm.vue +18 -22
  16. package/components/AddPassKeyToVisitor.vue +95 -73
  17. package/components/AppButton.vue +62 -0
  18. package/components/AppCard.vue +20 -0
  19. package/components/AppDateField.vue +49 -0
  20. package/components/AppField.vue +76 -0
  21. package/components/AppKpiTile.vue +65 -0
  22. package/components/AppSegmented.vue +38 -0
  23. package/components/AppSelect.vue +247 -0
  24. package/components/AreaChecklistHistoryLogs.vue +51 -44
  25. package/components/AreaChecklistHistoryMain.vue +14 -7
  26. package/components/AreaFormDialog.vue +71 -59
  27. package/components/AreaMain.vue +73 -107
  28. package/components/AttachmentsViewer.vue +84 -22
  29. package/components/AttendanceCheckInOutDialog.vue +85 -88
  30. package/components/AttendanceDetailsDialog.vue +57 -63
  31. package/components/AttendanceMain.vue +4 -3
  32. package/components/AttendanceMapSearchDialog.vue +42 -44
  33. package/components/AttendanceSettingsDialog.vue +79 -63
  34. package/components/Avatar/Main.vue +54 -2
  35. package/components/BillingMain.vue +26 -30
  36. package/components/BtnUploadFile.vue +53 -11
  37. package/components/BuildingForm.vue +34 -27
  38. package/components/BuildingManagement/buildings.vue +39 -39
  39. package/components/BuildingManagement/units.vue +26 -42
  40. package/components/BuildingUnitFormAdd.vue +20 -23
  41. package/components/BuildingUnitFormEdit.vue +8 -4
  42. package/components/BulletinBoardForm.vue +19 -24
  43. package/components/BulletinBoardManagement.vue +49 -57
  44. package/components/BulletinBoardView.vue +9 -6
  45. package/components/BulletinExpirationChip.vue +13 -4
  46. package/components/Button/Close.vue +2 -2
  47. package/components/CameraForm.vue +21 -22
  48. package/components/CameraMain.vue +50 -49
  49. package/components/Card/DeleteConfirmation.vue +24 -22
  50. package/components/Card/MemberInfoSummary.vue +28 -3
  51. package/components/Card/Toggle.vue +15 -3
  52. package/components/CardToolbar.vue +37 -0
  53. package/components/Carousel.vue +56 -36
  54. package/components/Chat/Bubbles.vue +43 -14
  55. package/components/Chat/Information.vue +49 -32
  56. package/components/Chat/ListCard.vue +38 -9
  57. package/components/Chat/Message.vue +41 -15
  58. package/components/Chat/Navigation.vue +27 -15
  59. package/components/Chat/SkeletonLoader.vue +9 -2
  60. package/components/ChecklistItemRow.vue +25 -1
  61. package/components/CleaningScheduleMain.vue +44 -49
  62. package/components/ClientDetailForm.vue +81 -56
  63. package/components/ClientMain.vue +92 -82
  64. package/components/ConfirmDialog.vue +14 -8
  65. package/components/Container/Standard.vue +9 -7
  66. package/components/CreateSubsciptionPlan.vue +148 -89
  67. package/components/DashboardEmptyState.vue +48 -3
  68. package/components/DashboardMain.vue +924 -676
  69. package/components/DashboardPanel.vue +84 -21
  70. package/components/DeliveryCompany.vue +34 -20
  71. package/components/Dialog/DeleteConfirmation.vue +20 -21
  72. package/components/Dialog/ReplaceAutofillPrompt.vue +19 -26
  73. package/components/Dialog/ReusablePrompt.vue +30 -29
  74. package/components/Dialog/UpdateMoreAction.vue +62 -59
  75. package/components/DocumentForm.vue +14 -21
  76. package/components/DocumentManagement.vue +162 -108
  77. package/components/DocumentViewer.vue +29 -12
  78. package/components/DrawImage.vue +29 -21
  79. package/components/EntryPass/QrTemplatePreview.vue +27 -16
  80. package/components/EntryPassInformation.vue +40 -10
  81. package/components/EntryPassMain.vue +49 -27
  82. package/components/EquipmentItemMain.vue +84 -97
  83. package/components/EquipmentManagementMain.vue +81 -103
  84. package/components/Facility/BookingSetup.vue +43 -52
  85. package/components/Feedback/Form.vue +26 -12
  86. package/components/FeedbackMain.vue +35 -49
  87. package/components/FileInput.vue +75 -58
  88. package/components/FileInputWithList.vue +59 -12
  89. package/components/FormDialog.vue +60 -21
  90. package/components/HidAccessLogDashboard.vue +512 -490
  91. package/components/HidCameraCaptureDialog.vue +216 -0
  92. package/components/HidEnabledGate.vue +67 -9
  93. package/components/HidIntercomManagement.vue +1322 -653
  94. package/components/HidQrCodeConfiguration.vue +1030 -258
  95. package/components/HidReaderForm.vue +142 -59
  96. package/components/HidReaderManagement.vue +211 -323
  97. package/components/HidServiceSettingsPanel.vue +44 -13
  98. package/components/HidUserEnrollment.vue +1185 -412
  99. package/components/HygieneUpdateMoreAction.vue +44 -44
  100. package/components/IncidentReport/Authorities.vue +30 -18
  101. package/components/IncidentReport/IncidentInformation.vue +10 -10
  102. package/components/IncidentReport/IncidentInformationDownload.vue +3 -4
  103. package/components/IncidentReport/affectedEntities.vue +41 -20
  104. package/components/Input/Date.vue +3 -0
  105. package/components/Input/DatePicker.vue +1 -2
  106. package/components/Input/DateTimePicker.vue +1 -1
  107. package/components/Input/File.vue +55 -10
  108. package/components/Input/FileV2.vue +39 -6
  109. package/components/Input/InputPhoneNumberV2.vue +2 -1
  110. package/components/Input/ListGroupSelection.vue +56 -8
  111. package/components/Input/NRICNumber.vue +1 -0
  112. package/components/Input/NewDate.vue +1 -0
  113. package/components/Input/Number.vue +1 -0
  114. package/components/Input/Password.vue +1 -0
  115. package/components/Input/PhoneNumber.vue +21 -1
  116. package/components/Input/VehicleNumber.vue +1 -0
  117. package/components/InputLabel.vue +2 -2
  118. package/components/InvitationClientForm.vue +21 -19
  119. package/components/InvitationForm.vue +15 -21
  120. package/components/InvitationMain.vue +46 -61
  121. package/components/Layout/Header.vue +263 -36
  122. package/components/Layout/NavigationDrawer.vue +300 -30
  123. package/components/ListItem.vue +33 -3
  124. package/components/LocalPagination.vue +27 -3
  125. package/components/ManageChecklistMain.vue +136 -86
  126. package/components/MemberInformation.vue +32 -16
  127. package/components/MemberMain.vue +113 -93
  128. package/components/MyAttendanceMain.vue +3 -5
  129. package/components/NavigationItem.vue +83 -3
  130. package/components/Nfc/NFCPatrolReportMain.vue +47 -33
  131. package/components/Nfc/NFCPatrolRouteForm.vue +18 -20
  132. package/components/Nfc/NFCPatrolRouteMain.vue +116 -103
  133. package/components/Nfc/NFCPatrolSettings.vue +14 -4
  134. package/components/Nfc/NFCTagForm.vue +22 -8
  135. package/components/Nfc/NFCTagMain.vue +41 -43
  136. package/components/Nfc/PatrolReport/DailyReportTab.vue +8 -1
  137. package/components/Nfc/PatrolReport/MonthlyReportTab.vue +8 -1
  138. package/components/Nfc/PatrolReport/MonthlyReportTable.vue +5 -3
  139. package/components/Nfc/PatrolReport/PatrolActivityTable.vue +26 -6
  140. package/components/Nfc/PatrolReport/PatrolReportTab.vue +8 -0
  141. package/components/Nfc/PatrolReport/PatrolRouteSummary.vue +41 -9
  142. package/components/Nfc/PatrolReport/RemarksDialog.vue +39 -9
  143. package/components/Nfc/PatrolReport/ReportEmptyState.vue +29 -9
  144. package/components/Nfc/PatrolReport/ReportFilters.vue +19 -10
  145. package/components/Nfc/PatrolReport/ReportLocationHeader.vue +32 -6
  146. package/components/Nfc/PatrolReport/SummaryReportTable.vue +28 -6
  147. package/components/NotificationSettings.vue +373 -0
  148. package/components/NumberSettingField.vue +9 -2
  149. package/components/OnlineFormConfigurationForm.vue +725 -237
  150. package/components/OnlineFormFill.vue +213 -106
  151. package/components/OnlineFormRenderPreview.vue +25 -30
  152. package/components/OnlineFormsConfiguration.vue +113 -109
  153. package/components/OrgViewDialog.vue +34 -16
  154. package/components/OvernightParkingAvailability.vue +49 -26
  155. package/components/OvernightParkingManagement.vue +78 -18
  156. package/components/PageHeader.vue +43 -0
  157. package/components/PassInformation.vue +109 -53
  158. package/components/PasswordConfirmation.vue +44 -26
  159. package/components/PeopleForm.vue +41 -20
  160. package/components/PhotoUpload.vue +110 -48
  161. package/components/PlaceholderComponent.vue +35 -19
  162. package/components/PlanActionsMenu.vue +12 -2
  163. package/components/PlanStatusBadge.vue +7 -8
  164. package/components/PlateNumberDisplay.vue +9 -6
  165. package/components/QrTemplate/PrintDialog.vue +66 -43
  166. package/components/RolePermissionFormCreate.vue +104 -79
  167. package/components/RolePermissionFormPreviewUpdate.vue +111 -109
  168. package/components/RolePermissionMain.vue +183 -81
  169. package/components/ScanVisitorQRCode.vue +99 -35
  170. package/components/ScheduleAreaMain.vue +34 -59
  171. package/components/ScheduleTaskForm.vue +61 -42
  172. package/components/ScheduleTaskMain.vue +56 -69
  173. package/components/SearchVehicleNumberUser.vue +39 -37
  174. package/components/ServiceProviderFormCreate.vue +29 -20
  175. package/components/ServiceProviderInvitationPrompt.vue +155 -0
  176. package/components/ServiceProviderMain.vue +601 -432
  177. package/components/Signature.vue +40 -34
  178. package/components/SignaturePad.vue +5 -29
  179. package/components/SiteSettings.vue +41 -11
  180. package/components/SiteSettingsWorkOrder.vue +61 -30
  181. package/components/SlideCardGroup.vue +35 -11
  182. package/components/Snackbar.vue +36 -3
  183. package/components/SpecificAttr.vue +18 -8
  184. package/components/StatusChip.vue +156 -0
  185. package/components/StockCard.vue +17 -12
  186. package/components/SubscriptionPlanTable.vue +207 -140
  187. package/components/SwitchContext.vue +201 -9
  188. package/components/TableHygiene.vue +36 -46
  189. package/components/TableList.vue +10 -10
  190. package/components/TableListSecondary.vue +105 -54
  191. package/components/TableMain.vue +251 -78
  192. package/components/TableV3.vue +61 -70
  193. package/components/TiptapEditor.vue +33 -40
  194. package/components/TiptapEditorQr.vue +5 -2
  195. package/components/Tooltip/Info.vue +69 -24
  196. package/components/UnitMain.vue +40 -60
  197. package/components/UnitPersonCard.vue +42 -13
  198. package/components/VehicleAddSelection.vue +48 -32
  199. package/components/VehicleForm.vue +112 -129
  200. package/components/VehicleManagement.vue +26 -12
  201. package/components/VehicleUpdateMoreAction.vue +59 -46
  202. package/components/VisitorDataFromScannedQRCodeForm.vue +90 -65
  203. package/components/VisitorForm.vue +774 -210
  204. package/components/VisitorFormSelection.vue +40 -37
  205. package/components/VisitorManagement.vue +239 -82
  206. package/components/VisitorPassKeyQRScanner.vue +65 -18
  207. package/components/VisitorSearchResultSummary.vue +60 -16
  208. package/components/VisitorSocketPopUp.vue +22 -14
  209. package/components/VisitorsReportPreview.vue +44 -29
  210. package/components/WorkOrder/Create.vue +26 -17
  211. package/components/WorkOrder/ListView.vue +38 -7
  212. package/components/WorkOrder/Main.vue +62 -59
  213. package/composables/useFeedback.ts +3 -3
  214. package/composables/useHidAmico.ts +269 -0
  215. package/composables/useHidNavigation.ts +2 -9
  216. package/composables/useMember.ts +3 -3
  217. package/composables/useNFCPatrolDailyReport.ts +13 -0
  218. package/composables/useNFCPatrolMonthlyReport.ts +22 -56
  219. package/composables/useNFCPatrolReport.ts +13 -0
  220. package/composables/useNotificationPreference.ts +87 -0
  221. package/composables/useOnlineFormPages.ts +2 -0
  222. package/composables/useRole.ts +22 -0
  223. package/composables/useServiceProvider.ts +3 -3
  224. package/composables/useServiceProviderInvitation.ts +145 -0
  225. package/composables/useSipWebPhone.ts +336 -0
  226. package/composables/useSubscriptionPlan.ts +62 -0
  227. package/composables/useThemePreference.ts +63 -0
  228. package/composables/useVisitor.ts +6 -1
  229. package/composables/useWebUsb.ts +127 -37
  230. package/composables/useWorkOrder.ts +17 -3
  231. package/error.vue +30 -6
  232. package/nuxt.config.ts +36 -0
  233. package/package.json +25 -4
  234. package/pages/[org]/[site]/access-mgmt/administrator/index.vue +2 -2
  235. package/pages/[org]/[site]/access-mgmt/{identity-mapping → hid-cards}/index.vue +2 -2
  236. package/pages/[org]/[site]/access-mgmt/intercom/index.vue +1 -1
  237. package/pages/notification-settings.vue +19 -0
  238. package/pages/payment-method-linked.vue +34 -10
  239. package/pages/require-customer.vue +48 -10
  240. package/pages/require-organization-membership.vue +32 -8
  241. package/pages/unauthorized.vue +29 -4
  242. package/plugins/secure-member.client.ts +21 -56
  243. package/plugins/vuetify.ts +69 -2
  244. package/types/nfc-patrol-report.ts +3 -2
  245. package/types/site.d.ts +71 -0
  246. package/types/subscription.ts +18 -11
  247. package/utils/breadcrumb.test.ts +108 -0
  248. package/utils/breadcrumb.ts +82 -0
  249. package/utils/dashboard.test.ts +118 -0
  250. package/utils/dashboard.ts +53 -0
  251. package/utils/data.test.ts +95 -0
  252. package/utils/data.ts +40 -2
  253. package/utils/hid-discover.test.ts +102 -0
  254. package/utils/list-page.test.ts +60 -0
  255. package/utils/list-page.ts +38 -0
  256. package/utils/materialSymbols.ts +363 -0
  257. package/utils/nav-sections.test.ts +190 -0
  258. package/utils/nav-sections.ts +151 -0
  259. package/utils/nfc-patrol-report.test.ts +130 -0
  260. package/utils/nfc-patrol-report.ts +101 -0
  261. package/utils/role.test.ts +69 -0
  262. package/utils/role.ts +10 -0
  263. package/utils/route-name.test.ts +85 -0
  264. package/utils/route-name.ts +24 -0
  265. package/utils/status.test.ts +110 -0
  266. package/utils/status.ts +135 -0
  267. package/utils/table-card.test.ts +84 -0
  268. package/utils/theme-aa-ledger.ts +148 -0
  269. package/utils/theme.test.ts +485 -7
  270. package/utils/theme.ts +295 -110
  271. package/.changeset/README.md +0 -8
  272. package/.changeset/config.json +0 -11
  273. package/.editorconfig +0 -12
  274. package/.github/workflows/main.yml +0 -17
  275. package/.github/workflows/publish-staging.yml +0 -47
  276. package/.github/workflows/publish.yml +0 -39
  277. package/PUBLISHING.md +0 -269
  278. package/components/HidIdentityMapping.vue +0 -975
  279. package/components/ScheduleTaskAreaFormDialog.vue +0 -144
  280. package/components/ScheduleTaskAreaUpdateMoreAction.vue +0 -109
  281. package/components/ScheduleTastTicketMain.vue +0 -182
  282. package/components/TableWithButton.vue +0 -94
  283. package/test/visitor-socket.test.mjs +0 -36
@@ -1,73 +1,63 @@
1
1
  <template>
2
2
  <v-row no-gutters>
3
- <v-col cols="12" class="mb-2">
4
- <v-row no-gutters style="gap: 8px">
5
- <v-btn
6
- class="text-none"
7
- rounded="pill"
8
- variant="tonal"
9
- size="large"
10
- @click="setOnlineForm()"
11
- v-if="canCreate && canCreateOnlineFormConfiguration"
12
- >
13
- Add Online Form
14
- </v-btn>
15
- </v-row>
3
+ <v-col cols="12">
4
+ <!--
5
+ The screen's name and its one primary action on the same line, which is
6
+ how the design opens every screen. "Configuration" is the app's own nav
7
+ label (Online Forms > Configuration), not invented copy. The page that
8
+ mounts this is a bare mount with no heading of its own.
9
+ -->
10
+ <PageHeader title="Configuration">
11
+ <template #actions>
12
+ <AppButton
13
+ v-if="canCreate && canCreateOnlineFormConfiguration"
14
+ @click="setOnlineForm()"
15
+ >
16
+ Add Online Form
17
+ </AppButton>
18
+ </template>
19
+ </PageHeader>
16
20
  </v-col>
17
21
  <v-col cols="12">
18
- <v-card
19
- width="100%"
20
- variant="outlined"
21
- border="thin"
22
- rounded="lg"
23
- :loading="loading"
24
- >
25
- <v-toolbar density="compact" color="grey-lighten-4">
26
- <template #prepend>
27
- <v-btn
28
- fab
29
- icon
30
- density="comfortable"
22
+ <AppCard class="table-card">
23
+ <CardToolbar :count="pageRange">
24
+ <template #left>
25
+ <!-- The design's 32px icon button, the same one every other
26
+ converted table toolbar uses, instead of Vuetify's tinted
27
+ fab. -->
28
+ <AppButton
29
+ variant="icon"
30
+ icon="mdi-refresh"
31
+ aria-label="Refresh"
31
32
  @click="getOnlineFormConfigurations"
32
- >
33
- <v-icon>mdi-refresh</v-icon>
34
- </v-btn>
35
- <v-btn
36
- fab
37
- icon
38
- density="comfortable"
39
- :color="sortAlpha ? 'primary' : undefined"
33
+ />
34
+ <AppButton
35
+ variant="icon"
36
+ icon="mdi-sort-alphabetical-ascending"
37
+ class="online-forms-config__sort"
38
+ :class="{ 'online-forms-config__sort--on': sortAlpha }"
40
39
  :title="sortAlpha ? 'Sorted A–Z' : 'Sort A–Z'"
41
40
  @click="sortAlpha = !sortAlpha"
42
- >
43
- <v-icon>mdi-sort-alphabetical-ascending</v-icon>
44
- </v-btn>
45
- <v-text-field
41
+ />
42
+ <AppField
46
43
  v-model="search"
47
- density="compact"
48
- variant="outlined"
44
+ search
45
+ compact
49
46
  placeholder="Search..."
50
- prepend-inner-icon="mdi-magnify"
51
- clearable
52
- hide-details
53
- style="width: 220px; margin-left: 12px;"
47
+ klass="online-forms-config__search"
54
48
  />
55
49
  </template>
56
50
 
57
- <template #append>
58
- <v-row no-gutters justify="end" align="center">
59
- <span class="mr-2 text-caption text-fontgray">
60
- {{ pageRange }}
61
- </span>
62
- <local-pagination
63
- v-model="page"
64
- :length="pages"
65
- @update:value="getOnlineFormConfigurations"
66
- />
67
- </v-row>
51
+ <template #right>
52
+ <local-pagination
53
+ v-model="page"
54
+ :length="pages"
55
+ @update:value="getOnlineFormConfigurations"
56
+ />
68
57
  </template>
69
- </v-toolbar>
58
+ </CardToolbar>
70
59
  <v-data-table
60
+ :loading="loading"
71
61
  :headers="headers"
72
62
  :items="sortedItems"
73
63
  item-value="_id"
@@ -84,11 +74,11 @@
84
74
  {{ item.status ? item.status.charAt(0).toUpperCase() + item.status.slice(1) : "N/A" }}
85
75
  </template></v-data-table
86
76
  >
87
- </v-card></v-col
77
+ </AppCard></v-col
88
78
  >
89
79
 
90
80
  <!-- Create Dialog -->
91
- <v-dialog v-model="createDialog" width="450" persistent>
81
+ <v-dialog v-model="createDialog" width="720" persistent>
92
82
  <OnlineFormConfigurationForm
93
83
  mode="add"
94
84
  @cancel="createDialog = false"
@@ -97,7 +87,7 @@
97
87
  </v-dialog>
98
88
 
99
89
  <!-- Edit Dialog -->
100
- <v-dialog v-model="editDialog" width="450" persistent>
90
+ <v-dialog v-model="editDialog" width="720" persistent>
101
91
  <OnlineFormConfigurationForm
102
92
  mode="edit"
103
93
  @cancel="editDialog = false"
@@ -113,16 +103,20 @@
113
103
  :definition="selectedFormDefinition"
114
104
  :site-id="siteId"
115
105
  :org-id="orgId"
106
+ :payment-amount="selectedPaymentAmount"
116
107
  readonly
117
108
  @cancel="previewDialog = false"
118
109
  >
119
110
  <template #title-actions>
111
+ <!-- `color="white"` was correct only while the fill's title bar was a
112
+ hardcoded dark slab. The bar now paints from `--card`, so the
113
+ pencil takes the card's own ink; `error` is a theme colour and
114
+ follows both themes. -->
120
115
  <v-btn
121
116
  v-if="canUpdate && canUpdateOnlineFormConfiguration"
122
117
  icon
123
118
  size="small"
124
119
  variant="text"
125
- color="white"
126
120
  @click="openEditDialog()"
127
121
  >
128
122
  <v-icon>mdi-pencil</v-icon>
@@ -141,34 +135,38 @@
141
135
  </OnlineFormFill>
142
136
 
143
137
  <!-- Fallback: no block definition found for this form type -->
144
- <v-card v-else width="100%">
145
- <v-card-text class="text-center pa-10">
146
- <v-icon size="48" class="mb-3 text-medium-emphasis">mdi-file-question-outline</v-icon>
147
- <div class="text-body-2 text-medium-emphasis">
148
- No preview available for "{{ selectedFormType }}".
149
- </div>
150
- </v-card-text>
151
- <v-toolbar density="compact">
152
- <v-btn tile block variant="text" class="text-none" size="48" @click="previewDialog = false">
138
+ <v-card v-else class="screen-modal" width="100%">
139
+ <!-- The design's empty block, the same one every other "nothing to
140
+ show here" surface in the layer draws. -->
141
+ <div class="screen-empty">
142
+ <v-icon size="48">mdi-file-question-outline</v-icon>
143
+ <div>No preview available for "{{ selectedFormType }}".</div>
144
+ </div>
145
+ <div class="screen-modal__footer">
146
+ <v-btn variant="outlined" class="screen-btn-ghost" @click="previewDialog = false">
153
147
  Close
154
148
  </v-btn>
155
- </v-toolbar>
149
+ </div>
156
150
  </v-card>
157
151
  </v-dialog>
158
152
 
159
153
  <!-- Delete Dialog -->
154
+ <!-- 520px is the handoff's `--modal-w`. The two `v-toolbar`s this drew for
155
+ its title row and its footer were Vuetify `surface` slabs - a visible
156
+ grey bar on the dark card; a `v-card-title` and the shared
157
+ `.screen-modal__footer` are the same rows on the card's own surface.
158
+ The confirming button was a hardcoded `color="black"` fill, the same
159
+ black on both themes. -->
160
160
  <v-dialog
161
161
  v-model="confirmDialog"
162
162
  :loading="deleteLoading"
163
- width="450"
163
+ width="520"
164
164
  persistent
165
165
  >
166
- <v-card width="100%">
167
- <v-toolbar density="compact" class="pl-4">
168
- <span class="font-weight-medium text-h5">Delete Online Form</span>
169
- </v-toolbar>
170
- <v-card-text>
171
- <p class="text-subtitle-2 text-center">
166
+ <v-card class="screen-modal" width="100%">
167
+ <v-card-title>Delete Online Form</v-card-title>
168
+ <v-card-text class="screen-modal__body">
169
+ <p class="text-center">
172
170
  Are you sure you want to delete this online form? This action cannot
173
171
  be undone.
174
172
  </p>
@@ -179,38 +177,25 @@
179
177
  </span>
180
178
  </v-row>
181
179
  </v-card-text>
182
- <v-toolbar density="compact">
183
- <v-row no-gutters>
184
- <v-col cols="6">
185
- <v-btn
186
- tile
187
- block
188
- size="48"
189
- variant="text"
190
- class="text-none"
191
- @click="confirmDialog = false"
192
- :disabled="deleteLoading"
193
- >
194
- Close
195
- </v-btn>
196
- </v-col>
197
- <v-col cols="6">
198
- <v-btn
199
- tile
200
- block
201
- size="48"
202
- color="black"
203
- variant="flat"
204
- class="text-none"
205
- :loading="deleteLoading"
206
- :disabled="deleteLoading"
207
- @click="handleDeleteOnlineFormConfiguration()"
208
- >
209
- Delete Online Form
210
- </v-btn>
211
- </v-col>
212
- </v-row>
213
- </v-toolbar>
180
+ <div class="screen-modal__footer">
181
+ <v-btn
182
+ variant="outlined"
183
+ class="screen-btn-ghost"
184
+ :disabled="deleteLoading"
185
+ @click="confirmDialog = false"
186
+ >
187
+ Close
188
+ </v-btn>
189
+ <v-btn
190
+ variant="flat"
191
+ class="screen-btn-primary"
192
+ :loading="deleteLoading"
193
+ :disabled="deleteLoading"
194
+ @click="handleDeleteOnlineFormConfiguration()"
195
+ >
196
+ Delete Online Form
197
+ </v-btn>
198
+ </div>
214
199
  </v-card>
215
200
  </v-dialog>
216
201
 
@@ -336,6 +321,9 @@ const selectedFormDefinition = ref<any>(null);
336
321
  const deleteLoading = ref(false);
337
322
  const confirmDialog = ref(false);
338
323
  const selectedOnlineFormId = ref<string | null>(null);
324
+ const selectedPaymentAmount = computed(() =>
325
+ Number(selectedOnlineForm.value?.fields?.paymentAmount ?? 0)
326
+ );
339
327
 
340
328
  function parseFieldsToInputs(fields: Record<string, string>): any[] {
341
329
  return Object.keys(fields)
@@ -431,3 +419,19 @@ function successUpdate() {
431
419
  }
432
420
 
433
421
  </script>
422
+
423
+ <style scoped>
424
+ /* Same 240px cap the other in-toolbar search fields use, so the field does not
425
+ eat the toolbar's whole left side. */
426
+ .online-forms-config__search {
427
+ max-width: 240px;
428
+ }
429
+
430
+ /* The sort toggle is the only control on this toolbar with an on/off state.
431
+ `--accent-strong` is the design's own accent; the icon button has no
432
+ "selected" variant, so the state is one declaration rather than a variant
433
+ nothing else would use. */
434
+ .online-forms-config__sort--on {
435
+ color: var(--accent-strong);
436
+ }
437
+ </style>
@@ -1,24 +1,28 @@
1
1
  <template>
2
+ <!-- 760px is kept: the handoff draws exactly one modal and it is the 520px
3
+ Create Role form, so a multi-section detail dialog is a case it is
4
+ silent on, and narrowing this one would wrap fifteen label/value rows
5
+ rather than follow anything. What changes is the chrome. -->
2
6
  <v-dialog v-model="model" max-width="760" scrollable>
3
- <v-card rounded="lg">
4
- <v-toolbar density="compact" color="grey-lighten-4">
5
- <v-toolbar-title class="text-subtitle-1 font-weight-bold">
6
- View Organization Information
7
- </v-toolbar-title>
8
- </v-toolbar>
7
+ <v-card class="screen-modal">
8
+ <!-- Was a `v-toolbar color="grey-lighten-4"` - a literal light grey that
9
+ stays light grey on the dark theme, i.e. a white bar across the top
10
+ of a dark card. A `v-card-title` is the same row on the card's own
11
+ surface. -->
12
+ <v-card-title>View Organization Information</v-card-title>
9
13
 
10
- <v-card-text class="py-4">
14
+ <v-card-text class="screen-modal__body py-4">
11
15
  <template v-for="section in sections" :key="section.title">
12
- <div class="text-subtitle-2 font-weight-bold mb-2">
16
+ <div class="screen-card-title mb-2">
13
17
  {{ section.title }}
14
18
  </div>
15
19
  <div
16
20
  v-for="row in section.rows"
17
21
  :key="row.label"
18
- class="d-flex justify-space-between py-1"
22
+ class="d-flex justify-space-between py-1 org-view__row"
19
23
  >
20
- <span class="text-body-2 text-medium-emphasis">{{ row.label }}</span>
21
- <span class="text-body-2 font-weight-medium text-right">
24
+ <span class="screen-hint">{{ row.label }}</span>
25
+ <span class="text-right org-view__value">
22
26
  {{ row.value || "--" }}
23
27
  </span>
24
28
  </div>
@@ -26,13 +30,13 @@
26
30
  </template>
27
31
  </v-card-text>
28
32
 
29
- <v-divider />
30
-
31
- <v-card-actions class="justify-center py-3">
32
- <v-btn variant="text" class="text-none" @click="model = false">
33
+ <!-- The design's bordered footer strip. `v-divider` plus a padded
34
+ actions row was the same thing drawn by hand. -->
35
+ <div class="screen-modal__footer">
36
+ <v-btn variant="outlined" class="screen-btn-ghost" @click="model = false">
33
37
  Close
34
38
  </v-btn>
35
- </v-card-actions>
39
+ </div>
36
40
  </v-card>
37
41
  </v-dialog>
38
42
  </template>
@@ -116,3 +120,17 @@ const sections = computed(() => {
116
120
  ];
117
121
  });
118
122
  </script>
123
+
124
+ <style scoped>
125
+ /* The handoff names no type for a label/value detail row, so both take the
126
+ established cell type: the label on `--muted` (it was `text-medium-emphasis`,
127
+ Vuetify's own 60%-alpha ink) and the value on the cell weight. */
128
+ .org-view__row {
129
+ font-size: var(--fs-cell);
130
+ }
131
+
132
+ .org-view__value {
133
+ font-weight: var(--fw-cell);
134
+ color: var(--text);
135
+ }
136
+ </style>
@@ -35,8 +35,7 @@
35
35
  />
36
36
  </span>
37
37
  </v-row>
38
- <v-card class="mt-2">
39
- <v-card-text>
38
+ <AppCard class="mt-2 pa-4">
40
39
  <template
41
40
  v-for="(slot, index) in overnightParkingSlotsArray"
42
41
  :key="slot.day"
@@ -44,9 +43,12 @@
44
43
  <v-row no-gutters class="mb-4">
45
44
  <v-col
46
45
  cols="12"
47
- class="text-capitalize mb-2 text-subtitle-1 d-flex align-center justify-space-between"
46
+ class="text-capitalize mb-2 d-flex align-center justify-space-between"
48
47
  >
49
- <span class="font-weight-black">{{ slot.day }}</span>
48
+ <span class="screen-card-title">{{ slot.day }}</span>
49
+ <!-- `black-lighten-1` is a literal black: on the dark theme
50
+ the off state was a black tick on a #1c1e24 card. Both
51
+ states take a token now. -->
50
52
  <v-icon
51
53
  :icon="
52
54
  slot?.isEnabled
@@ -54,10 +56,10 @@
54
56
  : 'mdi-check-circle-outline'
55
57
  "
56
58
  size="20"
57
- :class="{ 'cursor-pointer': !viewMode }"
58
- :color="
59
- slot.isEnabled ? 'green-darken-2' : 'black-lighten-1'
60
- "
59
+ :class="[
60
+ { 'cursor-pointer': !viewMode },
61
+ slot.isEnabled ? 'day-tick--on' : 'day-tick--off',
62
+ ]"
61
63
  @click="!viewMode && toggleEnabled(slot.day)"
62
64
  />
63
65
  </v-col>
@@ -91,7 +93,7 @@
91
93
 
92
94
  <v-col v-if="!viewMode" cols="12" class="mt-1">
93
95
  <div
94
- class="d-flex align-center ga-1 cursor-pointer text-caption text-medium-emphasis"
96
+ class="d-flex align-center ga-1 cursor-pointer screen-hint apply-link"
95
97
  @click="applyToOtherDays(slot.day)"
96
98
  >
97
99
  <v-icon icon="mdi-content-copy" size="14" />
@@ -107,10 +109,10 @@
107
109
  </template>
108
110
 
109
111
  <v-col cols="12" align="end">
112
+ <!-- Stays a `v-btn`: `:loading` is the only in-flight signal on
113
+ this form and AppButton has none. Tokenised instead. -->
110
114
  <v-btn
111
- color="primary"
112
- class="text-none mt-2"
113
- size="large"
115
+ class="screen-btn-primary mt-2"
114
116
  :loading="loading.updating"
115
117
  variant="flat"
116
118
  text="Save"
@@ -118,8 +120,7 @@
118
120
  @click="handleSave('save')"
119
121
  />
120
122
  </v-col>
121
- </v-card-text>
122
- </v-card>
123
+ </AppCard>
123
124
  </v-col>
124
125
  </v-row>
125
126
  </v-form>
@@ -132,12 +133,10 @@
132
133
  />
133
134
 
134
135
  <v-dialog v-model="applyDialog.open" max-width="360" persistent>
135
- <v-card>
136
- <v-card-title class="text-subtitle-1 font-weight-bold pt-4 px-4"
137
- >Apply to days</v-card-title
138
- >
139
- <v-card-text class="px-4 pb-2">
140
- <p class="text-caption text-medium-emphasis mb-3">
136
+ <v-card class="screen-modal">
137
+ <v-card-title class="pt-4 px-4">Apply to days</v-card-title>
138
+ <v-card-text class="screen-modal__body px-4 pb-2">
139
+ <p class="screen-hint apply-link mb-3">
141
140
  Select the days to apply
142
141
  <span class="font-weight-bold text-capitalize">{{
143
142
  applyDialog.sourceDay
@@ -154,21 +153,45 @@
154
153
  class="text-capitalize"
155
154
  />
156
155
  </v-card-text>
157
- <v-card-actions class="px-4 pb-4">
156
+ <!-- `ga-2`: v-card-actions only spaces `.v-btn` children, and these are
157
+ the design's own buttons - without it Cancel and Apply touch. -->
158
+ <v-card-actions class="px-4 pb-4 ga-2">
158
159
  <v-spacer />
159
- <v-btn variant="text" @click="applyDialog.open = false">Cancel</v-btn>
160
- <v-btn
161
- color="primary"
162
- variant="flat"
160
+ <AppButton variant="ghost" @click="applyDialog.open = false">
161
+ Cancel
162
+ </AppButton>
163
+ <AppButton
163
164
  :disabled="!applyDialog.targetDays.some((d) => d.selected)"
164
165
  @click="confirmApply"
165
- >Apply</v-btn
166
166
  >
167
+ Apply
168
+ </AppButton>
167
169
  </v-card-actions>
168
170
  </v-card>
169
171
  </v-dialog>
170
172
  </template>
171
173
 
174
+ <style scoped>
175
+ /* The prototype names no colour for a per-day enable tick, so it takes the
176
+ design's own success / muted semantics rather than two literal Vuetify
177
+ greys - the off state was `black-lighten-1`, which stayed black on the dark
178
+ theme's card. */
179
+ .day-tick--on {
180
+ /* `--ok`, not `--success`: the token is named for the design's tone, and an
181
+ undefined custom property makes the whole declaration invalid, so the tick
182
+ silently inherited `--text` instead. */
183
+ color: var(--ok);
184
+ }
185
+
186
+ .day-tick--off {
187
+ color: var(--muted);
188
+ }
189
+
190
+ .apply-link {
191
+ font-size: var(--fs-breadcrumb);
192
+ }
193
+ </style>
194
+
172
195
  <script setup lang="ts">
173
196
  const props = defineProps({
174
197
  viewMode: {