@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,24 +1,19 @@
1
1
  <template>
2
- <v-card width="100%" :loading="processing">
3
- <v-toolbar>
4
- <v-row
5
- no-gutters
6
- class="fill-height px-6 d-flex ga-2 justify-space-between"
7
- align="center"
8
- >
9
- <span class="font-weight-bold text-h5 text-capitalize">
10
- {{ prop.mode }} Vehicle <span>({{ formatVehicleType(type) }})</span>
11
- </span>
12
- <span>
13
- <ButtonClose @click="emit('close:all')" icon-only />
14
- </span>
15
- </v-row>
16
- </v-toolbar>
17
-
18
- <v-card-text style="max-height: 100vh; overflow-y: auto" class="pa-5 my-3">
19
- <span class="text-subtitle-1 w-100 font-weight-bold mb-3"
20
- >General Information</span
21
- >
2
+ <v-card width="100%" class="screen-modal vehicle-form" :loading="processing">
3
+ <div class="vehicle-form__head">
4
+ <v-card-title class="text-capitalize">
5
+ {{ prop.mode }} Vehicle ({{ formatVehicleType(type) }})
6
+ </v-card-title>
7
+ <AppButton
8
+ variant="icon"
9
+ icon="mdi-close"
10
+ aria-label="Close"
11
+ @click="emit('close:all')"
12
+ />
13
+ </div>
14
+
15
+ <div class="screen-modal__body vehicle-form__body filter-field">
16
+ <span class="vehicle-form__section">General Information</span>
22
17
  <v-form
23
18
  ref="formRef"
24
19
  v-model="validForm"
@@ -209,24 +204,20 @@
209
204
  :cols="newPlateNumbers.length > 1 ? '1' : '0'"
210
205
  class="d-flex align-start"
211
206
  >
212
- <v-btn
213
- icon="mdi-delete-outline"
214
- variant="text"
215
- color="error"
207
+ <AppButton
216
208
  v-if="newPlateNumbers.length > 1"
209
+ variant="icon"
210
+ icon="mdi-delete-outline"
211
+ class="vehicle-form__remove"
212
+ :aria-label="`Remove plate ${index + 1}`"
217
213
  @click="removePlate(index)"
218
214
  />
219
215
  </v-col>
220
216
  </v-row>
221
217
 
222
- <v-btn
223
- prepend-icon="mdi-plus"
224
- variant="outlined"
225
- class="text-none"
226
- @click="addPlate"
227
- >
218
+ <AppButton variant="ghost" icon="mdi-plus" @click="addPlate">
228
219
  Add Plate
229
- </v-btn>
220
+ </AppButton>
230
221
  </template>
231
222
  </template>
232
223
 
@@ -300,21 +291,19 @@
300
291
 
301
292
  <v-col cols="12" :class="[showSubscriptionDateOptions && 'mt-5']">
302
293
  <v-row justify="center">
303
- <v-col cols="6">
304
- <v-btn
305
- block
306
- color="primary"
307
- variant="text"
308
- class="text-none font-weight-bold"
309
- :text="
310
- showSubscriptionDateOptions
311
- ? 'Hide Subscription Options'
312
- : 'Show Subscription Options'
313
- "
294
+ <v-col cols="6" class="d-flex justify-center">
295
+ <AppButton
296
+ variant="ghost"
314
297
  @click="
315
298
  showSubscriptionDateOptions = !showSubscriptionDateOptions
316
299
  "
317
- ></v-btn>
300
+ >
301
+ {{
302
+ showSubscriptionDateOptions
303
+ ? "Hide Subscription Options"
304
+ : "Show Subscription Options"
305
+ }}
306
+ </AppButton>
318
307
  </v-col>
319
308
  </v-row>
320
309
  </v-col>
@@ -323,82 +312,41 @@
323
312
  <v-col cols="12">
324
313
  <v-row no-gutters>
325
314
  <v-col cols="12" class="text-center">
326
- <span
327
- class="text-none text-subtitle-2 font-weight-medium text-error"
328
- >
329
- {{ message }}
330
- </span>
315
+ <span class="vehicle-form__error">{{ message }}</span>
331
316
  </v-col>
332
317
  </v-row>
333
318
  </v-col>
334
319
  </v-row>
335
320
  </v-form>
336
- </v-card-text>
337
- <v-row no-gutters class="w-100" v-if="errorMessage">
338
- <p class="text-error w-100 text-center text-subtitle-2">
339
- {{ errorMessage }}
340
- </p>
341
- </v-row>
342
- <v-toolbar density="compact">
343
- <v-row no-gutters>
344
- <v-col cols="6">
345
- <v-btn
346
- v-if="prop.mode === 'add'"
347
- tile
348
- block
349
- variant="text"
350
- class="text-none"
351
- size="48"
352
- @click="back"
353
- text="Back to Selection"
354
- />
355
- <v-btn
356
- v-else
357
- tile
358
- block
359
- variant="text"
360
- class="text-none"
361
- size="48"
362
- @click="close"
363
- text="Close"
364
- />
365
- </v-col>
366
- <v-col cols="6">
367
- <v-btn
368
- tile
369
- block
370
- variant="flat"
371
- color="black"
372
- class="text-none"
373
- size="48"
374
- :disabled="!validForm || processing"
375
- @click="submit"
376
- :text="prop.mode == 'add' ? 'Submit' : 'Update'"
377
- />
378
- </v-col>
379
- </v-row>
380
- </v-toolbar>
321
+ </div>
322
+ <p v-if="errorMessage" class="vehicle-form__error vehicle-form__error--block">
323
+ {{ errorMessage }}
324
+ </p>
325
+ <div class="vehicle-form__footer">
326
+ <AppButton v-if="prop.mode === 'add'" variant="ghost" @click="back">
327
+ Back to Selection
328
+ </AppButton>
329
+ <AppButton v-else variant="ghost" @click="close">Close</AppButton>
330
+ <AppButton :disabled="!validForm || processing" @click="submit">
331
+ {{ prop.mode == "add" ? "Submit" : "Update" }}
332
+ </AppButton>
333
+ </div>
381
334
 
382
335
  <v-dialog v-model="showMatchingPeopleDialog" max-width="700" persistent>
383
- <v-card :loading="checkingUnit">
384
- <v-toolbar>
385
- <v-toolbar-title>
386
- <v-row no-gutters class="d-flex align-center justify-space-between">
387
- <span class="font-weight-bold">
388
- Matching Records for "{{ searchUnitName ?? "-" }}"
389
- </span>
390
- <span>
391
- <v-btn
392
- icon="mdi-close"
393
- variant="text"
394
- @click="handleCloseMatchDialog"
395
- />
396
- </span>
397
- </v-row>
398
- </v-toolbar-title>
399
- </v-toolbar>
336
+ <v-card class="screen-modal vehicle-match" :loading="checkingUnit">
337
+ <div class="vehicle-form__head">
338
+ <v-card-title>
339
+ Matching Records for "{{ searchUnitName ?? "-" }}"
340
+ </v-card-title>
341
+ <AppButton
342
+ variant="icon"
343
+ icon="mdi-close"
344
+ aria-label="Close"
345
+ @click="handleCloseMatchDialog"
346
+ />
347
+ </div>
400
348
 
401
- <v-card-text max-height="400" style="overflow-y: auto">
349
+ <div class="screen-modal__body vehicle-match__body">
402
350
  <v-list lines="three">
403
351
  <v-list-item
404
352
  v-if="matchingPeople.length > 0 || checkingUnit"
@@ -414,24 +362,19 @@
414
362
  NRIC: {{ v.nric || "-" }}
415
363
  </v-list-item-subtitle>
416
364
 
417
- <div class="mt-1">
418
- <v-chip
365
+ <div class="mt-1 d-flex flex-wrap ga-1">
366
+ <StatusChip
419
367
  v-for="p in v.plates"
420
368
  :key="p?.plateNumber"
421
- size="small"
422
- class="mr-1"
369
+ tone="neutral"
370
+ :dot="false"
423
371
  >
424
372
  {{ p?.plateNumber }}
425
- </v-chip>
373
+ </StatusChip>
426
374
  </div>
427
375
 
428
376
  <template #append>
429
- <v-btn
430
- variant="flat"
431
- color="primary"
432
- @click="selectPeopleRecord(v)"
433
- >Select</v-btn
434
- >
377
+ <AppButton @click="selectPeopleRecord(v)">Select</AppButton>
435
378
  </template>
436
379
  </v-list-item>
437
380
  <v-empty-state
@@ -441,16 +384,13 @@
441
384
  subtitle="The NRIC you entered does not match any existing records."
442
385
  >
443
386
  <template #actions>
444
- <v-btn
445
- variant="flat"
446
- color="primary"
447
- @click="showMatchingPeopleDialog = false"
448
- >Close</v-btn
449
- >
387
+ <AppButton @click="showMatchingPeopleDialog = false">
388
+ Close
389
+ </AppButton>
450
390
  </template>
451
391
  </v-empty-state>
452
392
  </v-list>
453
- </v-card-text>
393
+ </div>
454
394
  </v-card>
455
395
  </v-dialog>
456
396
  </v-card>
@@ -1123,4 +1063,47 @@ onMounted(() => {
1123
1063
  .class-readonly {
1124
1064
  pointer-events: none;
1125
1065
  }
1066
+
1067
+ .vehicle-form__head {
1068
+ display: flex;
1069
+ align-items: center;
1070
+ justify-content: space-between;
1071
+ padding-right: 12px;
1072
+ }
1073
+
1074
+ .vehicle-form__body,
1075
+ .vehicle-match__body {
1076
+ padding: 4px 20px 0;
1077
+ }
1078
+
1079
+ .vehicle-form__section {
1080
+ display: block;
1081
+ margin-bottom: 4px;
1082
+ font-size: var(--fs-cell);
1083
+ font-weight: 800;
1084
+ color: var(--text);
1085
+ }
1086
+
1087
+ .vehicle-form__remove {
1088
+ color: var(--err);
1089
+ }
1090
+
1091
+ .vehicle-form__error {
1092
+ font-size: var(--fs-cell);
1093
+ font-weight: 500;
1094
+ color: var(--err);
1095
+ }
1096
+
1097
+ .vehicle-form__error--block {
1098
+ width: 100%;
1099
+ margin: 0;
1100
+ text-align: center;
1101
+ }
1102
+
1103
+ .vehicle-form__footer {
1104
+ display: flex;
1105
+ justify-content: flex-end;
1106
+ gap: 8px;
1107
+ padding: 16px 20px 20px;
1108
+ }
1126
1109
  </style>
@@ -1,17 +1,28 @@
1
1
  <template>
2
2
  <v-row no-gutters>
3
+ <!--
4
+ The design's title row: page name left, primary action right. Was a
5
+ `tonal` pill drawn by `TableMain` on its own row under the (absent)
6
+ heading. Same handler, same permission gate.
7
+ -->
8
+ <v-col cols="12">
9
+ <PageHeader title="Vehicle Mgmt">
10
+ <template #actions>
11
+ <AppButton v-if="canCreateVehicle" icon="mdi-plus" @click="handleAddVehicleClick">
12
+ Add Vehicle
13
+ </AppButton>
14
+ </template>
15
+ </PageHeader>
16
+ </v-col>
17
+
3
18
  <TableMain :headers="headers" :items="items" :loading="loading || getVehiclesPending" :page="page" :pages="pages"
4
- :pageRange="pageRange" :extension-height="70" :canCreate="canCreateVehicle" @refresh="getVehiclesRefresh"
5
- createLabel="Add Vehicle" show-header @row-click="handleRowClick" @create="handleAddVehicleClick"
19
+ :pageRange="pageRange" @refresh="getVehiclesRefresh"
20
+ show-header @row-click="handleRowClick"
6
21
  @update:page="handleUpdatePage">
7
22
 
8
- <template #extension>
9
- <v-row no-gutters class="px-5 py-1 d-flex align-center justify-end ga-3">
10
- <v-text-field v-model="searchInput" density="compact" placeholder="Search" clearable max-width="300"
11
- append-inner-icon="mdi-magnify" hide-details />
12
- <!-- <v-select v-model="vehicleTypeFilter" density="compact" item-title="label" item-value="value"
13
- placeholder="Filter by Type" clearable max-width="200" hide-details :items="typeOptions" /> -->
14
- </v-row>
23
+ <!-- Search joins the toolbar row rather than stacking a second one. -->
24
+ <template #prepend-additional>
25
+ <AppField v-model="searchInput" search compact placeholder="Search" klass="app-toolbar__search" />
15
26
  </template>
16
27
 
17
28
  <template #item.block="{ value }">
@@ -70,7 +81,10 @@
70
81
  <span class="d-flex ga-3 align-center"><strong>{{ label }}:</strong></span>
71
82
  <!-- <PlateNumberDisplay :plate-numbers="selectedVehicleObject[key]" show-all :default-value="selectedVehicleObject.plateNumber" /> -->
72
83
  <v-col cols="12">
73
- <v-card flat outlined class="pa-2" border="sm black" :loading="loadingPlateNumberDetails">
84
+ <!-- `border="sm black"` pinned a hard black edge on BOTH themes. Dropping only
85
+ the colour word keeps the width and lets the edge fall back to
86
+ `--v-border-color`, which is the design's `--border` in each theme. -->
87
+ <v-card flat outlined class="pa-2" border="sm" :loading="loadingPlateNumberDetails">
74
88
  <v-data-table :items="selectedVehicleObject[key]" :headers="plateHeaders" hide-default-footer>
75
89
  <template #item.status="{ value }">
76
90
  <v-chip :color="formatVehicleStatus(value).color" size="x-small" dark>
@@ -91,13 +105,13 @@
91
105
  title="Approve" prepend-icon="mdi-check-circle" base-color="success"
92
106
  @click="handleApproveVehicle(plateNumberItem as TPlateNumber)" />
93
107
  <v-list-item v-if="(plateNumberItem as TPlateNumber)?.status == 'deleted'" title="Restore"
94
- prepend-icon="mdi-restore" base-color="orange"
108
+ prepend-icon="mdi-restore" base-color="warning"
95
109
  @click="handleRestoreVehicle(plateNumberItem as TPlateNumber)" />
96
110
  <v-list-item
97
111
  v-if="((plateNumberItem as TPlateNumber)?.type === 'whitelist' || (plateNumberItem as TPlateNumber)?.type === 'blocklist') && plateNumberItem?.status == 'active'"
98
112
  :title="(plateNumberItem as TPlateNumber)?.type === 'blocklist' ? 'Whitelist' : 'Blocklist'"
99
113
  prepend-icon="mdi-swap-horizontal"
100
- :base-color="(plateNumberItem as TPlateNumber)?.type === 'blocklist' ? 'primary' : 'red'"
114
+ :base-color="(plateNumberItem as TPlateNumber)?.type === 'blocklist' ? 'primary' : 'error'"
101
115
  @click="handleUpdateType(plateNumberItem as TPlateNumber)" />
102
116
 
103
117
  <v-list-item
@@ -1,55 +1,37 @@
1
1
  <template>
2
- <v-card width="100%">
3
- <v-toolbar>
4
- <template v-if="$slots.header">
5
- <slot name="header" :title="title" :onClose="onClose" />
6
- </template>
7
- <template v-else>
8
- <v-row no-gutters class="fill-height px-6" align="center">
9
- <span class="font-weight-bold text-h5 text-capitalize">{{
10
- title
11
- }}</span>
12
- </v-row>
13
- </template>
14
- </v-toolbar>
2
+ <v-card width="100%" class="screen-modal more-action">
3
+ <template v-if="$slots.header">
4
+ <slot name="header" :title="title" :onClose="onClose" />
5
+ </template>
6
+ <v-card-title v-else class="text-capitalize">{{ title }}</v-card-title>
15
7
 
16
- <v-card-text style="max-height: 100vh; overflow-y: auto" class="pb-0">
8
+ <div class="screen-modal__body more-action__body">
17
9
  <slot name="content" />
18
- </v-card-text>
10
+ </div>
19
11
 
20
- <v-toolbar class="pa-0" density="compact">
21
- <v-row no-gutters>
22
- <v-col :cols="canDelete || canUpdate ? 6 : 12" class="pa-0">
23
- <v-btn block variant="text" class="text-none" size="large" @click="emit('close')" height="48">
24
- Close
25
- </v-btn>
26
- </v-col>
12
+ <div class="more-action__footer">
13
+ <AppButton variant="ghost" @click="emit('close')">Close</AppButton>
27
14
 
28
- <v-col cols="6" class="pa-0" v-if="canDelete || canUpdate">
29
- <v-menu>
30
- <template #activator="{ props }">
31
- <v-btn block variant="flat" color="black" class="text-none" height="48" v-bind="props" tile>
32
- More actions
33
- </v-btn>
34
- </template>
15
+ <v-menu v-if="canDelete || canUpdate">
16
+ <template #activator="{ props }">
17
+ <AppButton v-bind="props">More actions</AppButton>
18
+ </template>
35
19
 
36
- <v-list class="pa-0">
37
- <v-list-item v-if="canUpdate" @click="emit('edit')">
38
- <v-list-item-title class="text-subtitle-2">
39
- {{ editButtonLabel }}
40
- </v-list-item-title>
41
- </v-list-item>
20
+ <v-list class="more-action__menu">
21
+ <v-list-item v-if="canUpdate" @click="emit('edit')">
22
+ <v-list-item-title class="more-action__item">
23
+ {{ editButtonLabel }}
24
+ </v-list-item-title>
25
+ </v-list-item>
42
26
 
43
- <v-list-item v-if="canDelete" @click="emit('delete')" class="text-red">
44
- <v-list-item-title class="text-subtitle-2">
45
- {{ deleteButtonLabel }}
46
- </v-list-item-title>
47
- </v-list-item>
48
- </v-list>
49
- </v-menu>
50
- </v-col>
51
- </v-row>
52
- </v-toolbar>
27
+ <v-list-item v-if="canDelete" @click="emit('delete')">
28
+ <v-list-item-title class="more-action__item more-action__item--danger">
29
+ {{ deleteButtonLabel }}
30
+ </v-list-item-title>
31
+ </v-list-item>
32
+ </v-list>
33
+ </v-menu>
34
+ </div>
53
35
  </v-card>
54
36
  </template>
55
37
 
@@ -81,4 +63,35 @@ const emit = defineEmits(["close", "edit", "delete"]);
81
63
  const { canUpdate, editButtonLabel, deleteButtonLabel, title } = prop;
82
64
  </script>
83
65
 
84
- <style scoped></style>
66
+ <style scoped>
67
+ .more-action__body {
68
+ padding: 4px 20px;
69
+ }
70
+
71
+ .more-action__footer {
72
+ display: flex;
73
+ justify-content: flex-end;
74
+ gap: 8px;
75
+ padding: 16px 20px 20px;
76
+ }
77
+
78
+ /* The dropdown is teleported out of the card, so it needs the card's own
79
+ surface and rule said again rather than inheriting Vuetify's grey sheet. */
80
+ .more-action__menu {
81
+ padding: 4px 0;
82
+ background: var(--card);
83
+ border: 1px solid var(--border);
84
+ border-radius: var(--r-inner);
85
+ }
86
+
87
+ .more-action__item {
88
+ font-size: var(--fs-cell);
89
+ font-weight: var(--fw-btn);
90
+ color: var(--text);
91
+ }
92
+
93
+ /* The delete row was Vuetify's `text-red`; same meaning, on the token. */
94
+ .more-action__item--danger {
95
+ color: var(--err);
96
+ }
97
+ </style>