@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,16 +1,28 @@
1
1
  <template>
2
2
  <v-dialog v-model="dialogModel" max-width="700" persistent>
3
- <v-card>
4
- <v-toolbar>
5
- <v-toolbar-title>Signature</v-toolbar-title>
3
+ <v-card class="screen-modal">
4
+ <!-- Was a bare `v-toolbar`, which Vuetify paints from its own `surface`:
5
+ a grey slab across the top of the card, visibly lighter than the card
6
+ on the dark theme. A `v-card-title` is the same row on the card's own
7
+ surface, and the close is the design's borderless 32px square. -->
8
+ <v-card-title class="d-flex align-center">
9
+ Signature
6
10
  <v-spacer />
7
- <v-btn icon="mdi-close" @click="hideModal" />
8
- </v-toolbar>
9
-
10
- <v-card-text>
11
+ <v-btn
12
+ variant="text"
13
+ icon="mdi-close"
14
+ class="screen-modal__close"
15
+ aria-label="Close signature"
16
+ @click="hideModal"
17
+ />
18
+ </v-card-title>
19
+
20
+ <v-card-text class="screen-modal__body">
11
21
  <v-row no-gutters>
12
22
  <v-col cols="12">
13
- <div class="text-subtitle-1 text-medium-emphasis ml-2">
23
+ <!-- `text-medium-emphasis` is Vuetify's 60%-alpha ink; `--muted` is
24
+ the design's sub-line and follows the theme. -->
25
+ <div class="screen-hint ml-2 mb-2">
14
26
  Your signature here
15
27
  </div>
16
28
 
@@ -23,34 +35,28 @@
23
35
  class="border"
24
36
  />
25
37
  </v-col>
26
-
27
- <v-col cols="12" class="text-center">
28
- <v-row class="d-flex">
29
- <v-col class="w-50 px-3">
30
- <v-btn
31
- text="clear"
32
- color="warning"
33
- class="my-4 w-100 rounded-lg"
34
- height="40px"
35
- @click="clear"
36
- />
37
- </v-col>
38
-
39
- <v-col class="w-50 px-3">
40
- <v-btn
41
- text="submit"
42
- color="#1867C0"
43
- class="my-4 w-100 rounded-lg"
44
- height="40px"
45
- :loading="loading"
46
- :disabled="loading"
47
- @click="submit"
48
- />
49
- </v-col>
50
- </v-row>
51
- </v-col>
52
38
  </v-row>
53
39
  </v-card-text>
40
+
41
+ <!-- The design's modal footer: two equal-width buttons on a bordered
42
+ strip, ghost then primary. Was a hand-built `v-row` of two 50%
43
+ columns, one `color="warning"` and one a LITERAL `#1867C0` - a fixed
44
+ hex that is the same blue on both themes and is not the theme's
45
+ accent either. Both colours go; the shape is the shared one. -->
46
+ <div class="screen-modal__footer">
47
+ <v-btn class="text-none screen-btn-ghost" variant="outlined" @click="clear">
48
+ Clear
49
+ </v-btn>
50
+ <v-btn
51
+ class="text-none screen-btn-primary"
52
+ variant="flat"
53
+ :loading="loading"
54
+ :disabled="loading"
55
+ @click="submit"
56
+ >
57
+ Submit
58
+ </v-btn>
59
+ </div>
54
60
  </v-card>
55
61
  </v-dialog>
56
62
  </template>
@@ -1,25 +1,11 @@
1
1
  <template>
2
2
  <div>
3
- <div
4
- style="
5
- position: relative;
6
- border: 1.5px dashed #bbb;
7
- border-radius: 6px;
8
- background: #fafafa;
9
- overflow: hidden;
10
- "
11
- >
3
+ <div class="screen-signpad">
12
4
  <canvas
13
5
  ref="canvasRef"
14
6
  :width="W"
15
7
  :height="H"
16
- style="
17
- display: block;
18
- width: 100%;
19
- height: 130px;
20
- cursor: crosshair;
21
- touch-action: none;
22
- "
8
+ class="screen-signpad__canvas"
23
9
  @mousedown="startMouse"
24
10
  @mousemove="moveMouse"
25
11
  @mouseup="stop"
@@ -28,23 +14,13 @@
28
14
  @touchmove.prevent="moveTouch"
29
15
  @touchend="stop"
30
16
  />
31
- <div
32
- v-if="isEmpty"
33
- style="
34
- position: absolute;
35
- inset: 0;
36
- display: flex;
37
- align-items: center;
38
- justify-content: center;
39
- pointer-events: none;
40
- "
41
- >
42
- <span class="text-caption text-disabled">Draw your signature here</span>
17
+ <div v-if="isEmpty" class="screen-signpad__hint">
18
+ Draw your signature here
43
19
  </div>
44
20
  </div>
45
21
 
46
22
  <v-row no-gutters align="center" class="mt-1" style="min-height: 28px">
47
- <span class="text-caption text-medium-emphasis">{{ label }}</span>
23
+ <span class="screen-signpad__label">{{ label }}</span>
48
24
  <v-spacer />
49
25
  <v-btn
50
26
  v-if="!isEmpty"
@@ -1,8 +1,25 @@
1
1
  <template>
2
2
  <v-row no-gutters>
3
- <v-expansion-panels multiple v-model="openPanels">
3
+ <!--
4
+ The accordion was tokenised in an earlier batch but the screen still
5
+ opened with no name on it. "Settings" is the two apps' OWN navigation
6
+ label, and both wrappers (`-property-management` and `-security`
7
+ `settings.vue`) are bare mounts with no heading of their own, so the
8
+ title belongs here. No action on this row - the screen's saves live
9
+ inside their own sections.
10
+ -->
11
+ <v-col cols="12">
12
+ <PageHeader title="Settings" />
13
+ </v-col>
14
+
15
+ <!--
16
+ The design draws settings as a stack of bordered sections with one open
17
+ at a time. `multiple` is BEHAVIOUR - which sections a user may have open
18
+ together - so it is left exactly as it was and only the drawing changes.
19
+ -->
20
+ <v-expansion-panels multiple v-model="openPanels" class="screen-accordion">
4
21
  <!-- SITE SETTINGS -->
5
- <v-expansion-panel v-if="canManageSiteInformation" color="primary">
22
+ <v-expansion-panel v-if="canManageSiteInformation">
6
23
  <v-expansion-panel-title>
7
24
  <v-icon class="mr-2">mdi-cog</v-icon>
8
25
  Site Information
@@ -22,7 +39,7 @@
22
39
  <v-img v-if="coverPhotoUrl" :src="coverPhotoUrl" aspect-ratio="16/9" cover rounded="lg"
23
40
  class="w-100 border" />
24
41
  <div v-else
25
- class="w-100 d-flex align-center justify-center rounded-lg bg-grey-lighten-4 border border-dashed"
42
+ class="w-100 d-flex align-center justify-center rounded-lg border border-dashed site-settings__placeholder"
26
43
  style="aspect-ratio: 16/9">
27
44
  <span class="text-caption text-medium-emphasis">No cover photo uploaded</span>
28
45
  </div>
@@ -76,7 +93,7 @@
76
93
  </v-expansion-panel>
77
94
 
78
95
  <!-- ANPR CAMERA -->
79
- <v-expansion-panel v-if="showAnprCamera && canManageANPRCamera" color="primary">
96
+ <v-expansion-panel v-if="showAnprCamera && canManageANPRCamera">
80
97
  <v-expansion-panel-title>
81
98
  <v-icon class="mr-2">mdi-camera</v-icon>
82
99
  ANPR Camera
@@ -118,7 +135,7 @@
118
135
  </v-expansion-panel>
119
136
 
120
137
  <!-- CCTV CAMERA -->
121
- <v-expansion-panel v-if="showCctvCamera && canManageCCTVCamera" color="primary">
138
+ <v-expansion-panel v-if="showCctvCamera && canManageCCTVCamera">
122
139
  <v-expansion-panel-title>
123
140
  <v-icon class="mr-2">mdi-cctv</v-icon>
124
141
  CCTV Camera
@@ -129,18 +146,21 @@
129
146
  </v-expansion-panel-text>
130
147
  </v-expansion-panel>
131
148
 
132
- <v-expansion-panel v-if="showDeliveryCompanies && canManageDeliveryCompanies" color="primary">
149
+ <v-expansion-panel v-if="showDeliveryCompanies && canManageDeliveryCompanies">
133
150
  <v-expansion-panel-title>
134
151
  <v-icon class="mr-2">mdi-truck</v-icon>
135
152
  Delivery Companies
136
153
  </v-expansion-panel-title>
137
154
  <v-expansion-panel-text class="">
138
- <DeliveryCompany :site="siteId" v-model:initial="deliveryCompanies" @refresh-site="refreshSiteData"
155
+ <!-- The panel above already names this section, and the component
156
+ prints its own name unless told not to - so without hide-title
157
+ the words "Delivery Companies" appear twice on the open panel. -->
158
+ <DeliveryCompany :site="siteId" hide-title v-model:initial="deliveryCompanies" @refresh-site="refreshSiteData"
139
159
  @update:companiesValue="handleUpdateCompanies" :read-only="!canManageSiteSettings" />
140
160
  </v-expansion-panel-text>
141
161
  </v-expansion-panel>
142
162
 
143
- <v-expansion-panel v-if="showResidentVisitors && canManageResidentVisitors" color="primary">
163
+ <v-expansion-panel v-if="showResidentVisitors && canManageResidentVisitors">
144
164
  <v-expansion-panel-title>
145
165
  <v-icon class="mr-2">mdi-car</v-icon>
146
166
  Resident Visitors
@@ -150,7 +170,7 @@
150
170
  </v-expansion-panel-text>
151
171
  </v-expansion-panel>
152
172
 
153
- <v-expansion-panel color="primary">
173
+ <v-expansion-panel>
154
174
  <v-expansion-panel-title>
155
175
  <v-icon class="mr-2">mdi-face-recognition</v-icon>
156
176
  HID Face Reader
@@ -163,7 +183,7 @@
163
183
  @refresh="refreshSiteData"
164
184
  />
165
185
  <v-divider class="my-4" />
166
- <HidQrCodeConfiguration :site="siteId" />
186
+ <HidQrCodeConfiguration :site="siteId" :org="orgId" />
167
187
  </v-expansion-panel-text>
168
188
  </v-expansion-panel>
169
189
 
@@ -266,7 +286,9 @@ const { data: siteData, refresh: refreshSiteData } = await useLazyAsyncData(
266
286
  `site-${props.siteId}`,
267
287
  () => getSiteById(props.siteId)
268
288
  );
269
- const orgId = computed(() => props.orgId || String((siteData.value as any)?.orgId ?? ""));
289
+ const orgId = computed(
290
+ () => props.orgId || String((siteData.value as TSite | null)?.orgId ?? "")
291
+ );
270
292
 
271
293
  watch(
272
294
  siteData,
@@ -419,3 +441,11 @@ const saveANPRSettings = async () => {
419
441
  }
420
442
  };
421
443
  </script>
444
+
445
+ <style scoped>
446
+ /* Was `bg-grey-lighten-4`: a literal light grey, so the empty cover-photo tile
447
+ stayed a white slab on the dark page. */
448
+ .site-settings__placeholder {
449
+ background: var(--thead);
450
+ }
451
+ </style>
@@ -1,33 +1,53 @@
1
1
  <template>
2
- <v-row no-gutters>
3
- <v-expansion-panels multiple v-model="openPanels" >
4
-
5
- <!-- Work Order Settings -->
6
- <v-expansion-panel color="primary">
7
- <v-expansion-panel-title>
8
- <v-icon class="mr-2">mdi-format-list-numbered</v-icon>
9
- Work Order Settings
10
- </v-expansion-panel-title>
11
-
12
- <v-expansion-panel-text>
13
- <v-text-field v-model="prefix" label="Prefix" :disabled="isLoading || !canManageSiteSettings"
14
- @input="handleInput" />
15
-
16
- <v-select v-model="noOfDigits" :items="[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]" label="No. of Digits"
17
- :disabled="isLoading || !canManageSiteSettings" />
18
-
19
- <v-text-field v-model="orderNumberPreview" label="Preview" readonly />
20
-
21
- <v-btn v-if="canManageSiteSettings" class="mt-2" :loading="isLoading" @click="save">
22
- Save
23
- </v-btn>
24
- </v-expansion-panel-text>
25
- </v-expansion-panel>
26
-
27
- </v-expansion-panels>
28
-
29
- <Snackbar v-model="toast.show" :text="toast.message" :color="toast.color" />
30
- </v-row>
2
+ <div>
3
+ <!-- The page had no heading of its own: the five service apps mount this
4
+ component bare on `[org]/[site]/settings`, so the name only ever
5
+ appeared in the navigation rail. "Settings" is that rail's own label. -->
6
+ <PageHeader title="Settings" />
7
+
8
+ <v-row no-gutters>
9
+ <!--
10
+ `multiple` and which panel opens first are BEHAVIOUR, so they are
11
+ left exactly as they were - `.screen-accordion` only changes the
12
+ drawing, the same way `SiteSettings` already does it.
13
+ -->
14
+ <v-expansion-panels multiple v-model="openPanels" class="screen-accordion">
15
+
16
+ <!-- Work Order Settings -->
17
+ <v-expansion-panel>
18
+ <v-expansion-panel-title>
19
+ <v-icon class="mr-2">mdi-format-list-numbered</v-icon>
20
+ Work Order Settings
21
+ </v-expansion-panel-title>
22
+
23
+ <v-expansion-panel-text>
24
+ <div class="wo-settings__fields">
25
+ <AppField v-model="prefix" label="Prefix"
26
+ :disabled="isLoading || !canManageSiteSettings" @input="handleInput" />
27
+
28
+ <!-- `return-object` keeps the emitted value a NUMBER, which is
29
+ what `createWorkOrderSettings` puts on the wire today. -->
30
+ <AppSelect v-model="noOfDigits" return-object
31
+ :items="[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]" label="No. of Digits"
32
+ :disabled="isLoading || !canManageSiteSettings" />
33
+
34
+ <AppField :model-value="orderNumberPreview" label="Preview" readonly />
35
+ </div>
36
+
37
+ <!-- Still a `v-btn`: `AppButton` has no loading state, and the
38
+ spinner on save is feedback, not decoration. -->
39
+ <v-btn v-if="canManageSiteSettings" class="screen-btn-primary text-none mt-4"
40
+ variant="flat" :loading="isLoading" @click="save">
41
+ Save
42
+ </v-btn>
43
+ </v-expansion-panel-text>
44
+ </v-expansion-panel>
45
+
46
+ </v-expansion-panels>
47
+
48
+ <Snackbar v-model="toast.show" :text="toast.message" :color="toast.color" />
49
+ </v-row>
50
+ </div>
31
51
  </template>
32
52
 
33
53
  <script setup lang="ts">
@@ -173,4 +193,15 @@ function show(message: string, color: string) {
173
193
  toast.message = message
174
194
  toast.color = color
175
195
  }
176
- </script>
196
+ </script>
197
+
198
+ <style scoped>
199
+ /* The design stacks a settings form's fields on one gap, rather than leaning on
200
+ each Vuetify field's own 22px of hint space. */
201
+ .wo-settings__fields {
202
+ display: flex;
203
+ flex-direction: column;
204
+ gap: 16px;
205
+ max-width: 420px;
206
+ }
207
+ </style>
@@ -1,22 +1,35 @@
1
+ <!--
2
+ The attachment thumbnail strip (14 caller files).
3
+
4
+ THREE THINGS WERE WRONG AND ONE OF THEM NEVER DREW AT ALL:
5
+
6
+ 1. The strip painted `backgroundColor: '#FFFF'` inline. That is opaque white
7
+ in BOTH themes - a white band behind the thumbnails on the dark page. It
8
+ is deleted rather than re-coloured: the strip has no surface of its own in
9
+ the design, it sits on whatever panel holds it.
10
+ 2. `.selected` was `border: 2px solid var(--v-theme-primary)`. `--v-theme-*`
11
+ holds a BARE TRIPLET, `74, 110, 182`, not a colour - so the declaration was
12
+ invalid and dropped silently, and a selected thumbnail has never had a
13
+ border. It is now `var(--accent)`, which is a colour.
14
+ 3. The remove button's `color="red"` is a fixed Vuetify red, the same red on
15
+ both themes; `error` is the theme's own. Its `x-large` glyph (40px) was
16
+ larger than any icon the design draws - 18px is the size the handoff gives
17
+ a control icon.
18
+ -->
1
19
  <template>
2
- <v-sheet class="mx-auto">
3
- <v-slide-group
4
- class="pa-1"
5
- show-arrows
6
- :style="{ backgroundColor: '#FFFF' }"
7
- >
20
+ <v-sheet class="mx-auto bg-transparent">
21
+ <v-slide-group class="pa-1" show-arrows>
8
22
  <v-slide-group-item
9
23
  v-for="(data, idx) in localDataFiles"
10
24
  :key="idx"
11
25
  v-slot="{ isSelected }"
12
26
  >
13
27
  <v-card
14
- :class="['ma-1', isSelected && 'selected']"
28
+ :class="['ma-1', 'slide-card', isSelected && 'selected']"
15
29
  width="150"
16
30
  height="100"
31
+ elevation="0"
17
32
  @click="clickable && emit('onClickCarousel', data)"
18
- class="rounded-lg border-thin"
19
- border=" opacity-50 thin "
20
33
  >
21
34
  <v-btn
22
35
  icon
@@ -25,7 +38,7 @@
25
38
  class="remove-btn pa-0 ma-0"
26
39
  @click.stop="removeFile(data)"
27
40
  >
28
- <v-icon color="red" class="pa-0 ma-0" size="x-large"
41
+ <v-icon color="error" class="pa-0 ma-0" size="18"
29
42
  >mdi-close-circle</v-icon
30
43
  >
31
44
  </v-btn>
@@ -181,8 +194,19 @@ const removeFile = (file) => {
181
194
  right: 8px;
182
195
  }
183
196
 
197
+ /* The thumbnail tile: the design's inner radius and its own border token,
198
+ in place of Vuetify's `rounded-lg` + `border-thin` + a `border` prop that
199
+ set an opacity as well. */
200
+ .slide-card {
201
+ border: 1px solid var(--border);
202
+ border-radius: var(--r-inner);
203
+ }
204
+
205
+ /* See the note at the top: this used to name `var(--v-theme-primary)`, a bare
206
+ triplet, so the rule was invalid and the selected tile drew no border at
207
+ all. */
184
208
  .selected {
185
- border: 2px solid var(--v-theme-primary);
209
+ border: 2px solid var(--accent);
186
210
  }
187
211
 
188
212
  .remove-btn {
@@ -1,9 +1,16 @@
1
1
  <template>
2
- <v-snackbar v-model="snackbar" :color="props.color" :z-index="100000000" >
2
+ <v-snackbar
3
+ v-model="snackbar"
4
+ class="app-toast"
5
+ :color="props.color || 'primary-button'"
6
+ :z-index="100000000"
7
+ >
3
8
  {{ props.text }}
4
9
 
5
10
  <template #actions>
6
- <v-btn variant="text" @click="snackbar = false"> Close </v-btn>
11
+ <v-btn class="app-toast__close" variant="text" @click="snackbar = false">
12
+ Close
13
+ </v-btn>
7
14
  </template>
8
15
  </v-snackbar>
9
16
  </template>
@@ -15,9 +22,35 @@ const props = defineProps({
15
22
  type: String,
16
23
  default: "",
17
24
  },
25
+ /**
26
+ * A Vuetify theme colour name. `success` / `warning` / `error` / `info` are
27
+ * mapped onto the design palette in `utils/theme.ts` and pass through here
28
+ * unchanged.
29
+ *
30
+ * An UNCOLOURED toast used to land on one of two wrong surfaces, and both are
31
+ * corrected by the `||` in the template rather than by 163 caller files:
32
+ *
33
+ * - the prop omitted or bound to `undefined` fell to the old default
34
+ * `"primary"`, and `theme.ts:228` maps Vuetify's `primary` to
35
+ * `--accent-text` - a FOREGROUND (the link ink), never a fill. Measured:
36
+ * `rgb(74,110,182)` light, `rgb(120,162,244)` dark - the dark one a pale
37
+ * link-blue slab that matches no other accent surface in the product.
38
+ * - `:color=""`, which is how most callers initialise their toast state
39
+ * (`reactive({ show: false, message: "", color: "" })`), is not falsy to
40
+ * Vue's default machinery, so it reached Vuetify as an empty colour and
41
+ * fell through to `.v-snackbar--variant-elevated`, i.e. `surface-variant`
42
+ * = the NAVIGATION RAIL colour with `--text2` ink.
43
+ *
44
+ * `primary-button` is the accent FILL, and its pair `on-primary-button`
45
+ * supplies the white label (4.57:1 in both themes). The same correction is
46
+ * already on `FileInput`, `FeedbackDetail` and `BuildingUnitFormEdit`.
47
+ *
48
+ * The handoff draws no toast at all, so "an uncoloured toast is the accent
49
+ * fill" is our reading of a gap in the design, not a value it states.
50
+ */
18
51
  color: {
19
52
  type: String,
20
- default: "primary",
53
+ default: "",
21
54
  },
22
55
  });
23
56
  </script>
@@ -3,18 +3,28 @@
3
3
  <v-col cols="12" :lg="props.lg" :md="props.md" :sm="props.sm">
4
4
  <v-row no-gutters>
5
5
  <v-col cols="12">
6
- <span
7
- class="font-weight-medium text-subtitle-1 text-decoration-underline cursor-pointer"
8
- @click="emit('back')"
9
- >
10
- Back
11
- </span>
6
+ <!--
7
+ The Back link. `.screen-back` is stated once in `screens.css`; the
8
+ underline and the accent colour are the handoff's own rule for a
9
+ link (line 26), the 12.5px/700 is its "View All" (line 166), and
10
+ the design draws no back control of its own - the gap is written
11
+ out next to the class.
12
+ -->
13
+ <span class="screen-back" @click="emit('back')"> Back </span>
12
14
  </v-col>
15
+ <!--
16
+ THE PAGE TITLE ROW. This wrapper is the whole scaffold for every
17
+ single-attribute form page in the estate (18 callers across 10 apps),
18
+ and its title was a `text-h5` span - Vuetify's 24px/400 Roboto, not
19
+ the design's 22px/800. `PageHeader` is placement only: same string,
20
+ same position, same Back link above it, no card added around content
21
+ that already brings its own.
22
+ -->
13
23
  <v-col cols="12">
14
- <span class="text-h5">{{ props.title }}</span>
24
+ <PageHeader :title="props.title" />
15
25
  </v-col>
16
26
 
17
- <v-col cols="12" class="mt-4">
27
+ <v-col cols="12">
18
28
  <slot name="default"> </slot>
19
29
  </v-col>
20
30