@7365admin1/layer-common 3.2.6 → 3.2.8-staging.200

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 (284) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/assets/css/primitives.css +1113 -0
  3. package/assets/css/screens.css +1097 -0
  4. package/assets/css/shell.css +258 -0
  5. package/assets/css/tokens.css +236 -0
  6. package/components/AcceptDialog.vue +17 -18
  7. package/components/AccessCard/AvailableStats.vue +24 -16
  8. package/components/AccessCardAddForm.vue +42 -42
  9. package/components/AccessCardAssignToUnitForm.vue +13 -21
  10. package/components/AccessCardDeleteDialog.vue +41 -39
  11. package/components/AccessCardDetailsDialog.vue +125 -79
  12. package/components/AccessCardPreviewDialog.vue +58 -84
  13. package/components/AccessCardQrTagging.vue +60 -63
  14. package/components/AccessCardReplaceForm.vue +27 -23
  15. package/components/AccessManagement.vue +86 -85
  16. package/components/AddEqupmentForm.vue +18 -22
  17. package/components/AddPassKeyToVisitor.vue +95 -73
  18. package/components/AppButton.vue +62 -0
  19. package/components/AppCard.vue +20 -0
  20. package/components/AppDateField.vue +49 -0
  21. package/components/AppField.vue +76 -0
  22. package/components/AppKpiTile.vue +65 -0
  23. package/components/AppSegmented.vue +38 -0
  24. package/components/AppSelect.vue +247 -0
  25. package/components/AreaChecklistHistoryLogs.vue +51 -44
  26. package/components/AreaChecklistHistoryMain.vue +14 -7
  27. package/components/AreaFormDialog.vue +71 -59
  28. package/components/AreaMain.vue +73 -107
  29. package/components/AttachmentsViewer.vue +84 -22
  30. package/components/AttendanceCheckInOutDialog.vue +85 -88
  31. package/components/AttendanceDetailsDialog.vue +57 -63
  32. package/components/AttendanceMain.vue +4 -3
  33. package/components/AttendanceMapSearchDialog.vue +42 -44
  34. package/components/AttendanceSettingsDialog.vue +79 -63
  35. package/components/Avatar/Main.vue +54 -2
  36. package/components/BillingMain.vue +26 -30
  37. package/components/BtnUploadFile.vue +53 -11
  38. package/components/BuildingForm.vue +34 -27
  39. package/components/BuildingManagement/buildings.vue +39 -39
  40. package/components/BuildingManagement/units.vue +26 -42
  41. package/components/BuildingUnitFormAdd.vue +20 -23
  42. package/components/BuildingUnitFormEdit.vue +8 -4
  43. package/components/BulletinBoardForm.vue +19 -24
  44. package/components/BulletinBoardManagement.vue +49 -57
  45. package/components/BulletinBoardView.vue +9 -6
  46. package/components/BulletinExpirationChip.vue +13 -4
  47. package/components/Button/Close.vue +2 -2
  48. package/components/CameraForm.vue +21 -22
  49. package/components/CameraMain.vue +50 -49
  50. package/components/Card/DeleteConfirmation.vue +24 -22
  51. package/components/Card/MemberInfoSummary.vue +28 -3
  52. package/components/Card/Toggle.vue +15 -3
  53. package/components/CardToolbar.vue +37 -0
  54. package/components/Carousel.vue +56 -36
  55. package/components/Chat/Bubbles.vue +43 -14
  56. package/components/Chat/Information.vue +49 -32
  57. package/components/Chat/ListCard.vue +38 -9
  58. package/components/Chat/Message.vue +41 -15
  59. package/components/Chat/Navigation.vue +27 -15
  60. package/components/Chat/SkeletonLoader.vue +9 -2
  61. package/components/ChecklistItemRow.vue +25 -1
  62. package/components/CleaningScheduleMain.vue +44 -49
  63. package/components/ClientDetailForm.vue +81 -56
  64. package/components/ClientMain.vue +92 -82
  65. package/components/ConfirmDialog.vue +14 -8
  66. package/components/Container/Standard.vue +9 -7
  67. package/components/CreateSubsciptionPlan.vue +148 -89
  68. package/components/DashboardEmptyState.vue +48 -3
  69. package/components/DashboardMain.vue +924 -676
  70. package/components/DashboardPanel.vue +84 -21
  71. package/components/DeliveryCompany.vue +34 -20
  72. package/components/Dialog/DeleteConfirmation.vue +20 -21
  73. package/components/Dialog/ReplaceAutofillPrompt.vue +19 -26
  74. package/components/Dialog/ReusablePrompt.vue +30 -29
  75. package/components/Dialog/UpdateMoreAction.vue +62 -59
  76. package/components/DocumentForm.vue +14 -21
  77. package/components/DocumentManagement.vue +162 -108
  78. package/components/DocumentViewer.vue +29 -12
  79. package/components/DrawImage.vue +29 -21
  80. package/components/EntryPass/QrTemplatePreview.vue +27 -16
  81. package/components/EntryPassInformation.vue +40 -10
  82. package/components/EntryPassMain.vue +49 -27
  83. package/components/EquipmentItemMain.vue +84 -97
  84. package/components/EquipmentManagementMain.vue +81 -103
  85. package/components/Facility/BookingSetup.vue +43 -52
  86. package/components/Feedback/Form.vue +26 -12
  87. package/components/FeedbackMain.vue +35 -49
  88. package/components/FileInput.vue +75 -58
  89. package/components/FileInputWithList.vue +59 -12
  90. package/components/FormDialog.vue +60 -21
  91. package/components/HidAccessLogDashboard.vue +512 -490
  92. package/components/HidCameraCaptureDialog.vue +216 -0
  93. package/components/HidEnabledGate.vue +67 -9
  94. package/components/HidIntercomManagement.vue +1322 -653
  95. package/components/HidQrCodeConfiguration.vue +1030 -258
  96. package/components/HidReaderForm.vue +142 -59
  97. package/components/HidReaderManagement.vue +211 -323
  98. package/components/HidServiceSettingsPanel.vue +44 -13
  99. package/components/HidUserEnrollment.vue +1185 -412
  100. package/components/HygieneUpdateMoreAction.vue +44 -44
  101. package/components/IncidentReport/Authorities.vue +30 -18
  102. package/components/IncidentReport/IncidentInformation.vue +10 -10
  103. package/components/IncidentReport/IncidentInformationDownload.vue +3 -4
  104. package/components/IncidentReport/affectedEntities.vue +41 -20
  105. package/components/Input/Date.vue +3 -0
  106. package/components/Input/DatePicker.vue +1 -2
  107. package/components/Input/DateTimePicker.vue +1 -1
  108. package/components/Input/File.vue +55 -10
  109. package/components/Input/FileV2.vue +39 -6
  110. package/components/Input/InputPhoneNumberV2.vue +2 -1
  111. package/components/Input/ListGroupSelection.vue +56 -8
  112. package/components/Input/NRICNumber.vue +1 -0
  113. package/components/Input/NewDate.vue +1 -0
  114. package/components/Input/Number.vue +1 -0
  115. package/components/Input/Password.vue +1 -0
  116. package/components/Input/PhoneNumber.vue +21 -1
  117. package/components/Input/VehicleNumber.vue +1 -0
  118. package/components/InputLabel.vue +2 -2
  119. package/components/InvitationClientForm.vue +21 -19
  120. package/components/InvitationForm.vue +15 -21
  121. package/components/InvitationMain.vue +46 -61
  122. package/components/Layout/Header.vue +263 -36
  123. package/components/Layout/NavigationDrawer.vue +300 -30
  124. package/components/ListItem.vue +33 -3
  125. package/components/LocalPagination.vue +27 -3
  126. package/components/ManageChecklistMain.vue +136 -86
  127. package/components/MemberInformation.vue +32 -16
  128. package/components/MemberMain.vue +113 -93
  129. package/components/MyAttendanceMain.vue +3 -5
  130. package/components/NavigationItem.vue +83 -3
  131. package/components/Nfc/NFCPatrolReportMain.vue +47 -33
  132. package/components/Nfc/NFCPatrolRouteForm.vue +18 -20
  133. package/components/Nfc/NFCPatrolRouteMain.vue +116 -103
  134. package/components/Nfc/NFCPatrolSettings.vue +14 -4
  135. package/components/Nfc/NFCTagForm.vue +22 -8
  136. package/components/Nfc/NFCTagMain.vue +41 -43
  137. package/components/Nfc/PatrolReport/DailyReportTab.vue +8 -1
  138. package/components/Nfc/PatrolReport/MonthlyReportTab.vue +8 -1
  139. package/components/Nfc/PatrolReport/MonthlyReportTable.vue +5 -3
  140. package/components/Nfc/PatrolReport/PatrolActivityTable.vue +26 -6
  141. package/components/Nfc/PatrolReport/PatrolReportTab.vue +8 -0
  142. package/components/Nfc/PatrolReport/PatrolRouteSummary.vue +41 -9
  143. package/components/Nfc/PatrolReport/RemarksDialog.vue +39 -9
  144. package/components/Nfc/PatrolReport/ReportEmptyState.vue +29 -9
  145. package/components/Nfc/PatrolReport/ReportFilters.vue +19 -10
  146. package/components/Nfc/PatrolReport/ReportLocationHeader.vue +32 -6
  147. package/components/Nfc/PatrolReport/SummaryReportTable.vue +28 -6
  148. package/components/NotificationSettings.vue +373 -0
  149. package/components/NumberSettingField.vue +9 -2
  150. package/components/OnlineFormConfigurationForm.vue +725 -237
  151. package/components/OnlineFormFill.vue +213 -106
  152. package/components/OnlineFormRenderPreview.vue +25 -30
  153. package/components/OnlineFormsConfiguration.vue +113 -109
  154. package/components/OrgViewDialog.vue +34 -16
  155. package/components/OvernightParkingAvailability.vue +49 -26
  156. package/components/OvernightParkingManagement.vue +78 -18
  157. package/components/PageHeader.vue +43 -0
  158. package/components/PassInformation.vue +109 -53
  159. package/components/PasswordConfirmation.vue +44 -26
  160. package/components/PeopleForm.vue +41 -20
  161. package/components/PhotoUpload.vue +110 -48
  162. package/components/PlaceholderComponent.vue +35 -19
  163. package/components/PlanActionsMenu.vue +12 -2
  164. package/components/PlanStatusBadge.vue +7 -8
  165. package/components/PlateNumberDisplay.vue +9 -6
  166. package/components/QrTemplate/PrintDialog.vue +66 -43
  167. package/components/RolePermissionFormCreate.vue +104 -79
  168. package/components/RolePermissionFormPreviewUpdate.vue +111 -109
  169. package/components/RolePermissionMain.vue +183 -81
  170. package/components/ScanVisitorQRCode.vue +99 -35
  171. package/components/ScheduleAreaMain.vue +34 -59
  172. package/components/ScheduleTaskForm.vue +61 -42
  173. package/components/ScheduleTaskMain.vue +56 -69
  174. package/components/SearchVehicleNumberUser.vue +39 -37
  175. package/components/ServiceProviderFormCreate.vue +29 -20
  176. package/components/ServiceProviderInvitationPrompt.vue +155 -0
  177. package/components/ServiceProviderMain.vue +601 -432
  178. package/components/Signature.vue +40 -34
  179. package/components/SignaturePad.vue +5 -29
  180. package/components/SiteSettings.vue +41 -11
  181. package/components/SiteSettingsWorkOrder.vue +61 -30
  182. package/components/SlideCardGroup.vue +35 -11
  183. package/components/Snackbar.vue +36 -3
  184. package/components/SpecificAttr.vue +18 -8
  185. package/components/StatusChip.vue +156 -0
  186. package/components/StockCard.vue +17 -12
  187. package/components/SubscriptionPlanTable.vue +207 -140
  188. package/components/SwitchContext.vue +201 -9
  189. package/components/TableHygiene.vue +36 -46
  190. package/components/TableList.vue +10 -10
  191. package/components/TableListSecondary.vue +105 -54
  192. package/components/TableMain.vue +241 -79
  193. package/components/TableV3.vue +61 -70
  194. package/components/TiptapEditor.vue +33 -40
  195. package/components/TiptapEditorQr.vue +5 -2
  196. package/components/Tooltip/Info.vue +69 -24
  197. package/components/UnitMain.vue +40 -60
  198. package/components/UnitPersonCard.vue +42 -13
  199. package/components/VehicleAddSelection.vue +48 -32
  200. package/components/VehicleForm.vue +112 -129
  201. package/components/VehicleManagement.vue +26 -12
  202. package/components/VehicleUpdateMoreAction.vue +59 -46
  203. package/components/VisitorDataFromScannedQRCodeForm.vue +90 -65
  204. package/components/VisitorForm.vue +774 -210
  205. package/components/VisitorFormSelection.vue +40 -37
  206. package/components/VisitorManagement.vue +239 -82
  207. package/components/VisitorPassKeyQRScanner.vue +65 -18
  208. package/components/VisitorSearchResultSummary.vue +60 -16
  209. package/components/VisitorSocketPopUp.vue +22 -14
  210. package/components/VisitorsReportPreview.vue +44 -29
  211. package/components/WorkOrder/Create.vue +26 -17
  212. package/components/WorkOrder/ListView.vue +38 -7
  213. package/components/WorkOrder/Main.vue +62 -59
  214. package/composables/useFeedback.ts +3 -3
  215. package/composables/useHidAmico.ts +269 -0
  216. package/composables/useHidNavigation.ts +2 -9
  217. package/composables/useMember.ts +3 -3
  218. package/composables/useNFCPatrolDailyReport.ts +13 -0
  219. package/composables/useNFCPatrolMonthlyReport.ts +22 -56
  220. package/composables/useNFCPatrolReport.ts +13 -0
  221. package/composables/useNotificationPreference.ts +87 -0
  222. package/composables/useOnlineFormPages.ts +2 -0
  223. package/composables/useRole.ts +22 -0
  224. package/composables/useServiceProvider.ts +3 -3
  225. package/composables/useServiceProviderInvitation.ts +145 -0
  226. package/composables/useSipWebPhone.ts +336 -0
  227. package/composables/useSubscriptionPlan.ts +62 -0
  228. package/composables/useThemePreference.ts +63 -0
  229. package/composables/useVisitor.ts +6 -1
  230. package/composables/useWebUsb.ts +127 -37
  231. package/composables/useWorkOrder.ts +17 -3
  232. package/error.vue +30 -6
  233. package/nuxt.config.ts +36 -0
  234. package/package.json +25 -4
  235. package/pages/[org]/[site]/access-mgmt/administrator/index.vue +2 -2
  236. package/pages/[org]/[site]/access-mgmt/{identity-mapping → hid-cards}/index.vue +2 -2
  237. package/pages/[org]/[site]/access-mgmt/intercom/index.vue +1 -1
  238. package/pages/notification-settings.vue +19 -0
  239. package/pages/payment-method-linked.vue +34 -10
  240. package/pages/require-customer.vue +48 -10
  241. package/pages/require-organization-membership.vue +32 -8
  242. package/pages/unauthorized.vue +29 -4
  243. package/plugins/secure-member.client.ts +21 -56
  244. package/plugins/vuetify.ts +69 -2
  245. package/types/nfc-patrol-report.ts +3 -2
  246. package/types/site.d.ts +71 -0
  247. package/types/subscription.ts +18 -11
  248. package/utils/breadcrumb.test.ts +108 -0
  249. package/utils/breadcrumb.ts +82 -0
  250. package/utils/dashboard.test.ts +118 -0
  251. package/utils/dashboard.ts +53 -0
  252. package/utils/data.test.ts +95 -0
  253. package/utils/data.ts +40 -2
  254. package/utils/hid-discover.test.ts +102 -0
  255. package/utils/list-page.test.ts +60 -0
  256. package/utils/list-page.ts +38 -0
  257. package/utils/materialSymbols.ts +363 -0
  258. package/utils/nav-sections.test.ts +190 -0
  259. package/utils/nav-sections.ts +151 -0
  260. package/utils/nfc-patrol-report.test.ts +130 -0
  261. package/utils/nfc-patrol-report.ts +101 -0
  262. package/utils/role.test.ts +69 -0
  263. package/utils/role.ts +10 -0
  264. package/utils/route-name.test.ts +85 -0
  265. package/utils/route-name.ts +24 -0
  266. package/utils/status.test.ts +110 -0
  267. package/utils/status.ts +135 -0
  268. package/utils/table-card.test.ts +84 -0
  269. package/utils/theme-aa-ledger.ts +148 -0
  270. package/utils/theme.test.ts +485 -7
  271. package/utils/theme.ts +295 -110
  272. package/.changeset/README.md +0 -8
  273. package/.changeset/config.json +0 -11
  274. package/.editorconfig +0 -12
  275. package/.github/workflows/main.yml +0 -17
  276. package/.github/workflows/publish-staging.yml +0 -47
  277. package/.github/workflows/publish.yml +0 -39
  278. package/PUBLISHING.md +0 -269
  279. package/components/HidIdentityMapping.vue +0 -975
  280. package/components/ScheduleTaskAreaFormDialog.vue +0 -144
  281. package/components/ScheduleTaskAreaUpdateMoreAction.vue +0 -109
  282. package/components/ScheduleTastTicketMain.vue +0 -182
  283. package/components/TableWithButton.vue +0 -94
  284. package/test/visitor-socket.test.mjs +0 -36
@@ -1,55 +1,46 @@
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>
15
-
16
- <v-card-text style="max-height: 100vh; overflow-y: auto" class="pb-0">
2
+ <!-- The hygiene twin of `Dialog/UpdateMoreAction`, converted to the same
3
+ shape on staging. Its title row and its footer were both `v-toolbar`s -
4
+ fixed grey slabs that stay grey on the dark theme - and the footer's
5
+ action was a hardcoded `color="black"` fill, i.e. the same black on the
6
+ dark theme as on the light one. -->
7
+ <v-card class="screen-modal" width="100%">
8
+ <template v-if="$slots.header">
9
+ <slot name="header" :title="title" :onClose="onClose" />
10
+ </template>
11
+ <v-card-title v-else class="text-capitalize">{{ title }}</v-card-title>
12
+
13
+ <v-card-text class="screen-modal__body pb-0">
17
14
  <slot name="content" />
18
15
  </v-card-text>
19
16
 
20
- <v-toolbar class="pa-0" density="compact">
21
- <v-row no-gutters>
22
- <v-col :cols="showMoreActions ? 6 : 12" class="pa-0">
23
- <v-btn
24
- block
25
- variant="text"
26
- class="text-none"
27
- size="large"
28
- @click="emit('close')"
29
- height="48"
30
- >
31
- Close
32
- </v-btn>
33
- </v-col>
34
-
35
- <v-col v-if="showMoreActions" cols="6" class="pa-0">
36
- <v-menu>
17
+ <!-- The design's footer strip: equal-width buttons, ghost then primary. -->
18
+ <div class="screen-modal__footer">
19
+ <v-btn
20
+ variant="outlined"
21
+ class="text-none screen-btn-ghost"
22
+ @click="emit('close')"
23
+ >
24
+ Close
25
+ </v-btn>
26
+
27
+ <v-menu v-if="showMoreActions" contained>
37
28
  <template #activator="{ props }">
38
29
  <v-btn
39
- block
40
30
  variant="flat"
41
- color="black"
42
- class="text-none"
43
- height="48"
31
+ class="text-none screen-btn-primary"
44
32
  :disabled="disabled"
45
33
  v-bind="props"
46
- tile
47
34
  >
48
35
  More actions
49
36
  </v-btn>
50
37
  </template>
51
38
 
52
- <v-list class="pa-0 rounded-0">
39
+ <!-- The dropdown itself is left as Vuetify draws it, exactly as the
40
+ converted twin left it: the handoff gives a per-row menu no
41
+ shape, and this menu opens on a click the harness cannot drive,
42
+ so it could not be render-verified either. -->
43
+ <v-list class="pa-0 hyg-more__list">
53
44
  <v-list-item
54
45
  v-if="showQrButton && qrButtonLabel"
55
46
  @click="emit('showqr')"
@@ -110,20 +101,22 @@
110
101
  </v-list-item-title>
111
102
  </v-list-item>
112
103
 
104
+ <!-- `text-red` was Vuetify's fixed #f44336, the same red on both
105
+ themes. `text-error` is Vuetify's own class over
106
+ `--v-theme-error`, which IS the design's `--err` - the same
107
+ substitution the converted twin made. -->
113
108
  <v-list-item
114
109
  v-if="canDelete"
115
110
  @click="emit('delete')"
116
- class="text-red"
111
+ class="text-error"
117
112
  >
118
113
  <v-list-item-title class="text-subtitle-2">
119
114
  {{ deleteButtonLabel }}
120
115
  </v-list-item-title>
121
116
  </v-list-item>
122
117
  </v-list>
123
- </v-menu>
124
- </v-col>
125
- </v-row>
126
- </v-toolbar>
118
+ </v-menu>
119
+ </div>
127
120
  </v-card>
128
121
  </template>
129
122
 
@@ -240,4 +233,11 @@ const {
240
233
  } = prop;
241
234
  </script>
242
235
 
243
- <style scoped></style>
236
+ <style scoped>
237
+ /* `text-subtitle-2` is Vuetify's 0.875rem/500; the handoff names no type for a
238
+ menu row, so it takes the established cell type - same rule as the twin. */
239
+ .hyg-more__list :deep(.v-list-item-title) {
240
+ font-size: var(--fs-cell);
241
+ font-weight: var(--fw-cell);
242
+ }
243
+ </style>
@@ -2,37 +2,39 @@
2
2
  <v-row no-gutters class="px-5 pt-4">
3
3
  <!-- Authorities (Police/SCDF/Ambulance called in at the scene) -->
4
4
  <v-col cols="12" class="border-b pb-5 mb-5 mt-1">
5
- <p class="mb-2" style="font-size: 17px; font-weight: 600">
5
+ <p class="screen-card-title mb-2">
6
6
  Authorities (Police/SCDF/Ambulance called in at the scene)?
7
7
  </p>
8
8
  <p
9
9
  v-if="authorities?.authoritiesValue == 'no'"
10
- class="mt-2 text-h6 text-capitalize"
10
+ class="report-answer mt-2 text-capitalize"
11
11
  >
12
12
  {{ authorities?.authoritiesValue }}
13
13
  </p>
14
14
 
15
- <v-data-table
16
- v-else
17
- :headers="authoritiesTableHeader"
18
- :items="authorities?.authoritiesCalled"
19
- fixed-header
20
- hide-default-footer
21
- :hide-default-header="false"
22
- items-per-page="100"
23
- style="max-height: calc(100vh - (200px))"
24
- class="border mt-5"
25
- >
26
- </v-data-table>
15
+ <AppCard v-else class="table-card mt-5">
16
+ <v-data-table
17
+ :headers="authoritiesTableHeader"
18
+ :items="authorities?.authoritiesCalled"
19
+ fixed-header
20
+ hide-default-footer
21
+ :hide-default-header="false"
22
+ items-per-page="100"
23
+ style="max-height: calc(100vh - (200px))"
24
+ >
25
+ </v-data-table>
26
+ </AppCard>
27
27
  </v-col>
28
- <div class="w-100 my-8 mx-2">
29
- <v-table class="responsive-table border elevation-0">
28
+ <!-- `w-100` + `mx-2` made the card 16px wider than its column, so its right
29
+ corner was clipped off. The card supplies its own edge now. -->
30
+ <AppCard class="table-card w-100 my-8">
31
+ <v-table class="responsive-table elevation-0">
30
32
  <thead>
31
33
  <tr>
32
34
  <th
33
35
  v-for="(item, index) in concernHeader"
34
36
  :key="index"
35
- class="text-left font-weight-bold text-black border-e"
37
+ class="text-left border-e"
36
38
  >
37
39
  {{ item }}
38
40
  </th>
@@ -196,10 +198,20 @@
196
198
  </tr>
197
199
  </tbody>
198
200
  </v-table>
199
- </div>
201
+ </AppCard>
200
202
  </v-row>
201
203
  </template>
202
204
 
205
+ <style scoped>
206
+ /* The prototype states no size for a plain answer line, so it takes the body
207
+ row's own type rather than Vuetify's `text-h6`. */
208
+ .report-answer {
209
+ font-size: var(--fs-cell);
210
+ font-weight: var(--fw-cell);
211
+ color: var(--text);
212
+ }
213
+ </style>
214
+
203
215
  <script lang="ts" setup>
204
216
  definePageMeta({
205
217
  middleware: ["01-auth", "02-org"],
@@ -2,7 +2,7 @@
2
2
  <v-row no-gutters class="px-5 pt-4">
3
3
  <!-- Site Information -->
4
4
  <v-col cols="12" class="border-b pb-3 mb-5">
5
- <p class="mb-2" style="font-size: 17px; font-weight: 600">
5
+ <p class="mb-2 screen-card-title">
6
6
  Site Information
7
7
  </p>
8
8
  <v-row no-gutters class="mt-5">
@@ -36,7 +36,7 @@
36
36
 
37
37
  <!-- Place of Incident -->
38
38
  <v-col cols="12" class="border-b pb-5 mb-5 mt-1">
39
- <p class="mb-2" style="font-size: 17px; font-weight: 600">
39
+ <p class="mb-2 screen-card-title">
40
40
  Place of Incident
41
41
  </p>
42
42
  <p class="my-1 text-h6 text-capitalize">
@@ -46,7 +46,7 @@
46
46
 
47
47
  <!-- Incident Type / Time -->
48
48
  <v-col cols="12" class="border-b pb-5 mb-5 mt-1">
49
- <p class="mb-2" style="font-size: 17px; font-weight: 600">
49
+ <p class="mb-2 screen-card-title">
50
50
  Incident Type / Time
51
51
  </p>
52
52
  <v-row no-gutters class="mt-5">
@@ -106,7 +106,7 @@
106
106
 
107
107
  <!-- Response/Submission From (1st Contact) -->
108
108
  <v-col cols="12" class="border-b pb-5 mb-5 mt-1">
109
- <p class="mb-2" style="font-size: 17px; font-weight: 600">
109
+ <p class="mb-2 screen-card-title">
110
110
  Response/Submission From (1st Contact)
111
111
  </p>
112
112
  <v-row no-gutters class="mt-5">
@@ -130,7 +130,7 @@
130
130
 
131
131
  <!-- Name of Informant/Complainant Information -->
132
132
  <v-col cols="12" class="border-b pb-5 mb-5 mt-1">
133
- <p class="mb-2" style="font-size: 17px; font-weight: 600">
133
+ <p class="mb-2 screen-card-title">
134
134
  Name of Informant/Complainant Information
135
135
  </p>
136
136
  <v-row no-gutters class="d-flex align-center mt-5">
@@ -146,7 +146,7 @@
146
146
  <v-icon
147
147
  v-if="incidentInformation?.complaintInfo?.nric"
148
148
  size="small"
149
- color="blue"
149
+ color="primary"
150
150
  class="cursor-pointer"
151
151
  @click="toggleNRICComplainant"
152
152
  >
@@ -172,7 +172,7 @@
172
172
 
173
173
  <!-- Name of Recipient of Complaint (1st Contact) -->
174
174
  <v-col cols="12" class="border-b pb-5 mb-5 mt-1">
175
- <p class="mb-2" style="font-size: 17px; font-weight: 600">
175
+ <p class="mb-2 screen-card-title">
176
176
  Name of Recipient of Complaint (1st Contact)
177
177
  </p>
178
178
  <v-row no-gutters class="d-flex align-center mt-5">
@@ -188,7 +188,7 @@
188
188
  <v-icon
189
189
  v-if="incidentInformation?.recipientOfComplaint?.nric"
190
190
  size="small"
191
- color="blue"
191
+ color="primary"
192
192
  class="cursor-pointer"
193
193
  @click="toggleNRICRecipient"
194
194
  >
@@ -214,7 +214,7 @@
214
214
 
215
215
  <!-- Complaint Received through -->
216
216
  <v-col cols="12" class="border-b pb-5 mb-5 mt-1">
217
- <p class="mb-2" style="font-size: 17px; font-weight: 600">
217
+ <p class="mb-2 screen-card-title">
218
218
  Complaint Received through
219
219
  </p>
220
220
  <v-col cols="12">
@@ -238,7 +238,7 @@
238
238
 
239
239
  <!-- Brief Description -->
240
240
  <v-col cols="12" class="mb-10">
241
- <p class="mb-2" style="font-size: 17px; font-weight: 600">
241
+ <p class="mb-2 screen-card-title">
242
242
  Brief Description
243
243
  </p>
244
244
  <p class="mt-5 text-h6 text-capitalize">
@@ -2,15 +2,14 @@
2
2
  <v-row no-gutters class="px-5 pt-4">
3
3
  <!-- Site Information -->
4
4
  <p
5
- class="text-uppercase text-center w-100 text-h6"
6
- style="background: #aa212a; color: #fff; padding: 10px"
5
+ class="text-uppercase text-center w-100 text-h6 bg-error text-on-error"
6
+ style="padding: 10px"
7
7
  >
8
8
  Incident Report
9
9
  </p>
10
10
  <v-row no-gutters class="mt-5 border pb-5">
11
11
  <p
12
- class="w-100 text-h6 pa-2 text-white text-center"
13
- style="background: #fcbf49"
12
+ class="w-100 text-h6 pa-2 text-center bg-warning text-on-warning"
14
13
  >
15
14
  Incident Information
16
15
  </p>
@@ -2,18 +2,22 @@
2
2
  <v-row no-gutters class="px-5 pt-4">
3
3
  <!-- Anyone affected/injured -->
4
4
  <v-col cols="12" class="border-b pb-5 mb-5 mt-1">
5
- <p class="mb-2" style="font-size: 17px; font-weight: 600">
5
+ <!-- Same shape as this report's `Authorities.vue` sibling, already on
6
+ staging: a `.screen-card-title` question, a `.report-answer` line
7
+ when the answer is "no", and the table inside an `AppCard` instead of
8
+ a `border` class Vuetify draws from its own fixed grey. -->
9
+ <p class="screen-card-title mb-2">
6
10
  Anyone affected/injured?
7
11
  </p>
8
12
  <p
9
13
  v-if="affectedEntities?.anyoneAffectedValue == 'no'"
10
- class="my-1 text-h6 text-capitalize"
14
+ class="report-answer mt-2 text-capitalize"
11
15
  >
12
16
  {{ affectedEntities?.anyoneAffectedValue }}
13
17
  </p>
14
18
 
19
+ <AppCard v-else class="table-card mt-5">
15
20
  <v-data-table
16
- v-else
17
21
  :headers="injuredTableHeader"
18
22
  :items="affectedEntities?.affectedInjured"
19
23
  fixed-header
@@ -21,16 +25,17 @@
21
25
  :hide-default-header="false"
22
26
  items-per-page="100"
23
27
  style="max-height: calc(100vh - (200px))"
24
- class="border mt-5"
25
28
  >
26
29
  <template #header.nric>
27
30
  <div class="d-flex align-center">
28
31
  NRIC
32
+ <!-- `color="blue"` is a fixed Vuetify blue, the same on both
33
+ themes. `--accent-text` is the design's interactive ink. -->
29
34
  <v-icon
30
35
  v-if="isShowEyeIcon"
31
- class="cursor-pointer ml-1"
36
+ class="cursor-pointer ml-1 affected__eye"
32
37
  size="18"
33
- color="blue"
38
+ :aria-label="isShowNRIC ? 'Hide NRIC' : 'Show NRIC'"
34
39
  @click="isShowNRIC = !isShowNRIC"
35
40
  >
36
41
  {{ isShowNRIC ? "mdi-eye-off-outline" : "mdi-eye-outline" }}
@@ -45,36 +50,52 @@
45
50
  </tr>
46
51
  </template>
47
52
  </v-data-table>
53
+ </AppCard>
48
54
  </v-col>
49
55
 
50
56
  <!-- Anyone damage to property -->
51
57
  <v-col cols="12" class="pb-5 mb-5 mt-1">
52
- <p class="mb-2" style="font-size: 17px; font-weight: 600">
58
+ <p class="screen-card-title mb-2">
53
59
  Anyone damage to property?
54
60
  </p>
55
61
  <p
56
62
  v-if="affectedEntities?.anyUnitAffectedValue == 'no'"
57
- class="my-1 text-h6 text-capitalize"
63
+ class="report-answer mt-2 text-capitalize"
58
64
  >
59
65
  {{ affectedEntities?.anyUnitAffectedValue }}
60
66
  </p>
61
67
 
62
- <v-data-table
63
- v-else
64
- :headers="damagePropertyTableHeader"
65
- :items="affectedEntities?.anyoneDamageToProperty"
66
- fixed-header
67
- hide-default-footer
68
- :hide-default-header="false"
69
- items-per-page="100"
70
- style="max-height: calc(100vh - (200px))"
71
- class="border mt-5"
72
- >
73
- </v-data-table>
68
+ <AppCard v-else class="table-card mt-5">
69
+ <v-data-table
70
+ :headers="damagePropertyTableHeader"
71
+ :items="affectedEntities?.anyoneDamageToProperty"
72
+ fixed-header
73
+ hide-default-footer
74
+ :hide-default-header="false"
75
+ items-per-page="100"
76
+ style="max-height: calc(100vh - (200px))"
77
+ >
78
+ </v-data-table>
79
+ </AppCard>
74
80
  </v-col>
75
81
  </v-row>
76
82
  </template>
77
83
 
84
+ <style scoped>
85
+ /* Same two rules as this report's `Authorities.vue` sibling: the prototype
86
+ states no size for a plain answer line, so it takes the body row's type
87
+ rather than Vuetify's `text-h6`. */
88
+ .report-answer {
89
+ font-size: var(--fs-cell);
90
+ font-weight: var(--fw-cell);
91
+ color: var(--text);
92
+ }
93
+
94
+ .affected__eye {
95
+ color: var(--accent-text);
96
+ }
97
+ </style>
98
+
78
99
  <script lang="ts" setup>
79
100
  definePageMeta({
80
101
  middleware: ["01-auth", "02-org"],
@@ -13,6 +13,7 @@
13
13
  v-model="month"
14
14
  :items="props.months"
15
15
  label="Month"
16
+ class="filter-field"
16
17
  density="comfortable"
17
18
  :name="props.name + 'custom-input-date-month'"
18
19
  hide-details
@@ -28,6 +29,7 @@
28
29
  label="Day"
29
30
  hide-details
30
31
  placeholder="DD"
32
+ class="filter-field"
31
33
  density="comfortable"
32
34
  :name="props.name + 'custom-input-date-day'"
33
35
  :error="!!validationErrMsg"
@@ -42,6 +44,7 @@
42
44
  label="Year"
43
45
  hide-details
44
46
  placeholder="YYYY"
47
+ class="filter-field"
45
48
  density="comfortable"
46
49
  :name="props.name + 'custom-input-date-year'"
47
50
  :error="!!validationErrMsg"
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <div class="d-flex flex-column">
3
- <v-text-field v-bind="$attrs" ref="datePickerRef" :model-value="dateFormattedReadOnly" autocomplete="off"
3
+ <v-text-field v-bind="$attrs" class="filter-field" ref="datePickerRef" :model-value="dateFormattedReadOnly" autocomplete="off"
4
4
  :placeholder="placeholder" :rules="rules" style="z-index: 10" @click="openDatePicker" @click:clear.stop="clearDate">
5
5
  <template #append-inner>
6
6
  <v-icon icon="mdi-calendar" @click.stop="openDatePicker" />
@@ -106,6 +106,5 @@ defineExpose({
106
106
  .hidden-input {
107
107
  opacity: 0;
108
108
  height: 0;
109
- width: 1px;
110
109
  }
111
110
  </style>
@@ -2,6 +2,7 @@
2
2
  <div class="d-flex flex-column">
3
3
  <v-text-field
4
4
  v-bind="$attrs"
5
+ class="filter-field"
5
6
  ref="dateTimePickerRef"
6
7
  :model-value="dateTimeFormattedReadOnly"
7
8
  autocomplete="off"
@@ -196,6 +197,5 @@ defineExpose({
196
197
  .hidden-input {
197
198
  opacity: 0;
198
199
  height: 0;
199
- width: 1px;
200
200
  }
201
201
  </style>
@@ -11,7 +11,7 @@
11
11
  "
12
12
  >
13
13
  <div
14
- class="d-flex align-center justify-center pa-4 rounded-lg border-dashed border border-grey"
14
+ class="file-drop d-flex align-center justify-center pa-4"
15
15
  @dragover.prevent
16
16
  @drop="handleDrop"
17
17
  style="position: relative; z-index: 1"
@@ -35,12 +35,10 @@
35
35
  class="d-flex align-center"
36
36
  style="z-index: 1; pointer-events: none"
37
37
  >
38
- <v-icon size="28" class="mr-2" color="primary"
38
+ <v-icon size="28" class="file-drop__icon mr-2"
39
39
  >mdi-cloud-upload-outline</v-icon
40
40
  >
41
- <span class="text-body-1 font-weight-medium"
42
- >Drag and drop files here</span
43
- >
41
+ <span class="file-drop__hint">Drag and drop files here</span>
44
42
  </div>
45
43
  </div>
46
44
  </v-col>
@@ -55,11 +53,10 @@
55
53
  "
56
54
  >
57
55
  <v-btn
58
- color="primary-button"
59
- min-width="55"
60
- width="55"
61
- height="55"
56
+ class="screen-btn-primary file-camera"
57
+ variant="flat"
62
58
  elevation="0"
59
+ aria-label="Take a photo"
63
60
  @click="selectAttachment"
64
61
  >
65
62
  <v-icon size="20">mdi-camera-outline</v-icon>
@@ -73,7 +70,7 @@
73
70
  v-for="(file, index) in attachments"
74
71
  :key="index"
75
72
  cols="12"
76
- class="d-flex align-center pa-2 mr-2 mb-2 rounded bg-white border-sm"
73
+ class="file-row d-flex align-center pa-2 mr-2 mb-2"
77
74
  >
78
75
  <div class="mr-3">
79
76
  <!-- <v-img
@@ -108,6 +105,8 @@
108
105
 
109
106
  <v-icon
110
107
  size="small"
108
+ class="file-row__remove"
109
+ aria-label="Remove file"
111
110
  @click.stop="$emit('delete', file)"
112
111
  v-if="
113
112
  props.createdFrom === 'feedback' && props.attachments.length > 0
@@ -234,3 +233,49 @@ defineExpose({
234
233
  },
235
234
  });
236
235
  </script>
236
+
237
+ <style scoped>
238
+ /* The drop zone was `border-dashed border border-grey` with a `primary` glyph -
239
+ `primary` being the FOREGROUND token, used here as an icon colour, and the
240
+ grey a fixed light-theme hairline. */
241
+ .file-drop {
242
+ border: 1px dashed var(--border);
243
+ border-radius: var(--r-inner);
244
+ position: relative;
245
+ z-index: 1;
246
+ }
247
+
248
+ .file-drop__icon {
249
+ color: var(--accent-text);
250
+ }
251
+
252
+ .file-drop__hint {
253
+ font-family: var(--font-sans);
254
+ font-size: var(--fs-cell);
255
+ font-weight: 600;
256
+ color: var(--text);
257
+ }
258
+
259
+ /* Was a 55px square. The design's button is 40px, which is what
260
+ .screen-btn-primary carries; this only keeps it square. */
261
+ .file-camera {
262
+ min-width: var(--btn-h) !important;
263
+ width: var(--btn-h);
264
+ padding: 0 !important;
265
+ }
266
+
267
+ /* Each attachment row was `bg-white border-sm` - a hard white slab drawn on the
268
+ dark theme as well. */
269
+ .file-row {
270
+ background: var(--card);
271
+ border: 1px solid var(--border);
272
+ border-radius: var(--r-inner);
273
+ font-family: var(--font-sans);
274
+ font-size: var(--fs-cell);
275
+ color: var(--text);
276
+ }
277
+
278
+ .file-row__remove {
279
+ color: var(--err);
280
+ }
281
+ </style>
@@ -22,7 +22,7 @@
22
22
  <template v-else>
23
23
  <v-file-upload v-model="uploadFiles" density="compact" @update:model-value="handleUpdateValue"
24
24
  :loading="processing" :disabled="processing" :height="height" :title="title" :accept="accept"
25
- :name="`upload_images`" class="text-caption w-100" clearable :multiple="multiple">
25
+ :name="`upload_images`" class="w-100 file-v2__drop" clearable :multiple="multiple">
26
26
  <template #item="{ props: itemProps, file }">
27
27
  <v-file-upload-item v-bind="itemProps" lines="one" nav @click="handleClickItem(file)">
28
28
  <template #prepend>
@@ -30,8 +30,19 @@
30
30
  </template>
31
31
 
32
32
  <!-- delete button NOT shown in view mode -->
33
- <template #clear="{ props: clearProps }">
34
- <v-btn v-if="!viewMode" color="primary" @click.stop="handleRemove(file)"></v-btn>
33
+ <!-- This button had NO icon and NO label, so it drew as an empty
34
+ slab, and `color="primary"` filled that slab with the design's
35
+ FOREGROUND token (the link ink) rather than a fill. It is the
36
+ remove control for one attached file: a plain close glyph. -->
37
+ <template #clear>
38
+ <v-btn
39
+ v-if="!viewMode"
40
+ icon="mdi-close"
41
+ variant="text"
42
+ size="small"
43
+ aria-label="Remove file"
44
+ @click.stop="handleRemove(file)"
45
+ />
35
46
  </template>
36
47
  </v-file-upload-item>
37
48
  </template>
@@ -39,7 +50,7 @@
39
50
  </template>
40
51
 
41
52
  <v-row no-gutters class="w-100" v-if="errorMessage">
42
- <p class="text-error w-100 text-center text-subtitle-2">{{ errorMessage }}</p>
53
+ <p class="text-error w-100 text-center file-v2__error">{{ errorMessage }}</p>
43
54
  </v-row>
44
55
 
45
56
  <ImageCarousel v-model="showImageCarousel" :files="idsArray" :active-file-id="activeImageId" />
@@ -224,12 +235,34 @@ async function downloadFile(id: string, filename: string) {
224
235
 
225
236
 
226
237
  <style scoped>
238
+ /* The drop zone on the design's surface: `--r-inner`, a `--border` edge and the
239
+ 13.5px cell type, instead of Vuetify's 4px radius and `text-caption` scale.
240
+ `:deep` because every box below is rendered by `v-file-upload`. */
241
+ .file-v2__drop {
242
+ font-family: var(--font-sans);
243
+ font-size: var(--fs-cell);
244
+ border-radius: var(--r-inner);
245
+ border-color: var(--border);
246
+ }
247
+
248
+ .file-v2__drop :deep(.v-file-upload-item) {
249
+ border-radius: var(--r-inner);
250
+ }
251
+
227
252
  * :deep(.v-file-upload-title) {
228
- font-size: 1rem;
229
- font-weight: 500;
253
+ font-family: var(--font-sans);
254
+ font-size: var(--fs-card-title);
255
+ font-weight: var(--fw-card-title);
256
+ color: var(--text);
230
257
  }
231
258
 
232
259
  * :deep(.v-file-upload-items) {
233
260
  min-width: 100%;
234
261
  }
262
+
263
+ .file-v2__error {
264
+ font-family: var(--font-sans);
265
+ font-size: var(--fs-cell);
266
+ font-weight: var(--fw-cell);
267
+ }
235
268
  </style>