@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
@@ -60,8 +60,8 @@
60
60
  </v-alert>
61
61
  <template v-else>
62
62
  <!-- Generating / loading state -->
63
- <div v-if="generating || cardsLoading" class="d-flex align-center ga-2 mt-3 text-caption text-grey-darken-1">
64
- <v-progress-circular size="14" width="2" indeterminate color="grey" />
63
+ <div v-if="generating || cardsLoading" class="d-flex align-center ga-2 mt-3 text-caption text-fontgray">
64
+ <v-progress-circular size="14" width="2" indeterminate />
65
65
  <span>{{ generating ? 'Generating QR passes...' : 'Checking availability...' }}</span>
66
66
  </div>
67
67
  <!-- 0 available after all loading -->
@@ -79,7 +79,7 @@
79
79
  <template v-else>
80
80
  <div class="d-flex align-center justify-space-between mt-3">
81
81
  <InputLabel title="Quantity" />
82
- <span v-if="availableCount !== null" class="text-caption text-grey">
82
+ <span v-if="availableCount !== null" class="text-caption text-fontgray">
83
83
  {{ availableCount }} available
84
84
  </span>
85
85
  </div>
@@ -133,6 +133,7 @@
133
133
  :color="isBarcodeScanningActive ? 'success' : 'primary'"
134
134
  variant="outlined"
135
135
  block
136
+ class="text-none"
136
137
  prepend-icon="mdi-barcode-scan"
137
138
  @click="toggleBarcodeScanning"
138
139
  >
@@ -145,6 +146,7 @@
145
146
  variant="outlined"
146
147
  color="primary"
147
148
  block
149
+ class="text-none"
148
150
  prepend-icon="mdi-camera"
149
151
  @click="openCameraDialog"
150
152
  >
@@ -166,15 +168,35 @@
166
168
  </template>
167
169
 
168
170
  <template v-if="passType === 'HID_QR'">
171
+ <v-card variant="tonal" color="primary" class="mt-3 pa-3" rounded="lg">
172
+ <div class="d-flex align-center ga-3">
173
+ <v-icon icon="mdi-door-open" size="28" />
174
+ <div>
175
+ <div class="text-caption text-medium-emphasis">Access Reader</div>
176
+ <div class="text-subtitle-2 font-weight-bold">{{ hidReaderName || "Reader not configured" }}</div>
177
+ <div class="text-caption mt-1">Access Portal: {{ hidPortalName || "Portal not configured" }}</div>
178
+ </div>
179
+ </div>
180
+ </v-card>
169
181
  <v-alert
170
- v-if="!hidQrPrinterConfigured"
182
+ v-if="!hidPortalName"
171
183
  type="warning"
172
184
  variant="tonal"
173
185
  density="compact"
174
186
  class="mt-3"
175
- icon="mdi-printer-alert"
187
+ icon="mdi-alert"
176
188
  >
177
- No printer is configured on HID settings. QR Pass may not print.
189
+ Reconnect this HID reader and select a portal before generating a visitor QR code.
190
+ </v-alert>
191
+ <v-alert
192
+ v-else-if="!hidQrPrinterConfigured"
193
+ type="info"
194
+ variant="tonal"
195
+ density="compact"
196
+ class="mt-3"
197
+ icon="mdi-qrcode"
198
+ >
199
+ HID QR Code will be generated and shown on screen. You can download it after continuing.
178
200
  </v-alert>
179
201
  <v-alert
180
202
  v-else
@@ -184,7 +206,7 @@
184
206
  class="mt-3"
185
207
  icon="mdi-qrcode-scan"
186
208
  >
187
- HID QR Code will be generated and printed when you continue.
209
+ HID QR Code will be generated and shown on screen. Printing is also available.
188
210
  </v-alert>
189
211
  </template>
190
212
  </template>
@@ -204,11 +226,11 @@
204
226
  @after-leave="stopCamera"
205
227
  >
206
228
  <v-container class="d-flex justify-center" style="max-height: 90vh">
207
- <v-card elevation="2" class="d-flex flex-column align-center pa-2 w-100">
229
+ <v-card class="screen-modal d-flex flex-column align-center pa-2 w-100">
208
230
  <v-toolbar color="transparent">
209
- <v-card-title class="text-h5">Scan Card</v-card-title>
231
+ <v-card-title>Scan Card</v-card-title>
210
232
  <v-spacer />
211
- <v-btn icon="mdi-close" color="grey-darken-1" @click="closeCameraDialog" />
233
+ <v-btn icon="mdi-close" class="screen-modal__close" @click="closeCameraDialog" />
212
234
  </v-toolbar>
213
235
 
214
236
  <div class="position-relative w-100" style="aspect-ratio: 4/3; background: #000">
@@ -283,6 +305,14 @@ const props = defineProps({
283
305
  type: Boolean,
284
306
  default: false,
285
307
  },
308
+ hidReaderName: {
309
+ type: String,
310
+ default: "",
311
+ },
312
+ hidPortalName: {
313
+ type: String,
314
+ default: "",
315
+ },
286
316
  excludedCardIds: {
287
317
  type: Array as PropType<string[]>,
288
318
  default: () => [],
@@ -5,28 +5,41 @@
5
5
  :height="'200px'"
6
6
  v-if="loading"
7
7
  />
8
- <v-row no-gutters v-if="!loading">
9
- <v-col cols="12" elevation="3" class="border">
10
- <v-tabs v-model="activeTab" color="primary" class="px-2">
11
- <v-tab value="general">
12
- <v-icon start>mdi-cog-outline</v-icon>
13
- General
14
- </v-tab>
15
- <v-tab value="qrcode">
16
- <v-icon start>mdi-qrcode</v-icon>
17
- QR Code
18
- </v-tab>
19
- <v-tab value="printer">
20
- <v-icon start>mdi-printer</v-icon>
21
- Printer
22
- </v-tab>
23
- <v-tab value="entrypass">
24
- <v-icon start>mdi-link-variant</v-icon>
25
- Entrypass
26
- </v-tab>
27
- </v-tabs>
28
-
29
- <v-divider />
8
+ <div v-if="!loading">
9
+ <!--
10
+ THE DESIGN'S CARD + TAB ROW - AND DELIBERATELY NO `PageHeader`.
11
+
12
+ This screen owns no table; it is a settings screen of switches and fields,
13
+ so it takes `AppCard` + `CardToolbar`'s tabs row and no pager, count or
14
+ refresh, because it has never had any.
15
+
16
+ It gets NO page title, unlike the other screens in this pass: its only
17
+ caller mounts it INSIDE a `v-expansion-panel` on property-management's
18
+ Settings page whose panel header already reads "Entry Pass". A
19
+ `PageHeader` here would print that title twice.
20
+
21
+ The same four tabs switch the same `v-window` on the same `activeTab`,
22
+ keeping their icons; every switch, field, button and save handler is
23
+ untouched.
24
+ -->
25
+ <AppCard class="screen-card">
26
+ <CardToolbar>
27
+ <template #tabs>
28
+ <button
29
+ v-for="tab in entryPassTabs"
30
+ :key="tab.value"
31
+ type="button"
32
+ role="tab"
33
+ class="app-tab"
34
+ :class="{ 'app-tab--active': activeTab === tab.value }"
35
+ :aria-selected="activeTab === tab.value"
36
+ @click="activeTab = tab.value"
37
+ >
38
+ <v-icon start size="16">{{ tab.icon }}</v-icon>
39
+ {{ tab.label }}
40
+ </button>
41
+ </template>
42
+ </CardToolbar>
30
43
 
31
44
  <v-window v-model="activeTab">
32
45
  <!-- ─── Tab 1: General ─────────────────────────────────── -->
@@ -38,7 +51,7 @@
38
51
  <div class="d-flex mt-3 pb-5 pr-5">
39
52
  <p class="mr-6 font-weight-medium flex-grow-1">
40
53
  NFC / QR Code Pass
41
- <span class="d-block text-caption text-grey-darken-1 mt-1">
54
+ <span class="d-block text-caption screen-hint mt-1">
42
55
  NFC Card Pass uses Near Field Communication (NFC) technology
43
56
  to enable secure and convenient entry within ~4 cm proximity.
44
57
  </span>
@@ -59,7 +72,7 @@
59
72
  <div class="mt-5 pb-5">
60
73
  <p class="font-weight-medium mb-1">
61
74
  Access Door / Lift
62
- <span class="d-block text-caption text-grey-darken-1 mt-1">
75
+ <span class="d-block text-caption screen-hint mt-1">
63
76
  Choose the access method(s) for door and lift control.
64
77
  At least one method must be enabled.
65
78
  </span>
@@ -190,7 +203,7 @@
190
203
  <div class="d-flex mt-3 pb-5">
191
204
  <p class="font-weight-medium flex-grow-1">
192
205
  Upload Access Cards Template
193
- <span class="d-block text-caption text-grey-darken-1 mt-1">
206
+ <span class="d-block text-caption screen-hint mt-1">
194
207
  <a
195
208
  v-if="currentEntryPassSettings.template?.id"
196
209
  href="#"
@@ -379,7 +392,7 @@
379
392
  </v-row>
380
393
  </v-window-item>
381
394
  </v-window>
382
- </v-col>
395
+ </AppCard>
383
396
 
384
397
  <Snackbar v-model="messageSnackbar" :text="message" :color="messageColor" />
385
398
 
@@ -388,7 +401,7 @@
388
401
  :header="currentEntryPassSettings.qrCodeTemplateHeader"
389
402
  :sub-text="currentEntryPassSettings.qrCodeTemplateHeaderSubText"
390
403
  />
391
- </v-row>
404
+ </div>
392
405
  </template>
393
406
 
394
407
  <script lang="ts" setup>
@@ -400,6 +413,15 @@ const prop = defineProps({
400
413
 
401
414
  const activeTab = ref("general");
402
415
 
416
+ /** The same four tabs, in the same order, moved out of the template so the
417
+ design's tab row can `v-for` them. Values unchanged - they key `v-window`. */
418
+ const entryPassTabs = [
419
+ { value: "general", label: "General", icon: "mdi-cog-outline" },
420
+ { value: "qrcode", label: "QR Code", icon: "mdi-qrcode" },
421
+ { value: "printer", label: "Printer", icon: "mdi-printer" },
422
+ { value: "entrypass", label: "Entrypass", icon: "mdi-link-variant" },
423
+ ];
424
+
403
425
  const currentEntryPassSettings = ref<Record<string, any>>({
404
426
  _id: "",
405
427
  site: "",
@@ -2,7 +2,7 @@
2
2
  <v-row no-gutters align="center" justify="center">
3
3
  <v-col cols="12" lg="12">
4
4
  <TableMain
5
- :title="`${siteName} Units`"
5
+ :title="`${siteName} Equipment Items`"
6
6
  :items="items"
7
7
  :headers="headers"
8
8
  :loading="loading"
@@ -20,10 +20,8 @@
20
20
  <v-row no-gutters align="center" class="w-100">
21
21
  <v-col cols="auto" v-if="canCreateEquipmentItem">
22
22
  <v-btn
23
- class="text-none"
24
- rounded="pill"
25
- variant="tonal"
26
- size="large"
23
+ class="text-none screen-btn-primary"
24
+ variant="flat"
27
25
  @click="openEquipmentItemDialog()"
28
26
  >
29
27
  Checkout Item
@@ -32,7 +30,7 @@
32
30
 
33
31
  <v-spacer />
34
32
 
35
- <v-col cols="auto">
33
+ <v-col cols="auto" class="filter-field">
36
34
  <v-text-field
37
35
  v-model="searchInput"
38
36
  density="compact"
@@ -200,22 +198,28 @@
200
198
  </v-dialog>
201
199
 
202
200
  <!-- Main Equipment Item Dialog -->
201
+ <!--
202
+ All three dialogs were hand-drawn: a 20px/700 title bar, a divider, and a
203
+ `v-card-actions` footer of two 56px block buttons with square corners, the
204
+ confirm one on `color="black"` - not a token, so it painted a light-theme
205
+ fill on the dark theme. The shared `.screen-modal` shape now. Same fields,
206
+ same labels, same handlers, same busy states.
207
+ -->
203
208
  <v-dialog v-model="dialogEquipmentItem" max-width="540" persistent>
204
- <v-card>
205
- <v-card-title class="d-flex align-center pa-4">
206
- <span class="text-h6 font-weight-bold">Equipment Item</span>
209
+ <v-card class="screen-modal">
210
+ <v-card-title class="d-flex align-center">
211
+ Equipment Item
207
212
  <v-spacer />
208
213
  <v-btn
209
214
  icon="mdi-close"
210
215
  variant="text"
211
- size="small"
216
+ class="screen-modal__close"
217
+ aria-label="Close"
212
218
  @click="dialogEquipmentItem = false"
213
219
  />
214
220
  </v-card-title>
215
221
 
216
- <v-divider />
217
-
218
- <v-card-text class="pa-6">
222
+ <v-card-text class="screen-modal__body">
219
223
  <v-form ref="equipmentItemFormRef">
220
224
  <!-- Add Equipment Section -->
221
225
  <v-row no-gutters class="mb-4">
@@ -376,49 +380,40 @@
376
380
  </v-form>
377
381
  </v-card-text>
378
382
 
379
- <v-divider />
380
-
381
- <v-card-actions class="pa-0">
382
- <v-row no-gutters>
383
- <v-col cols="6">
384
- <v-btn
385
- block
386
- variant="text"
387
- size="large"
388
- height="56"
389
- class="text-none font-weight-medium rounded-0"
390
- @click="dialogEquipmentItem = false"
391
- >
392
- Cancel
393
- </v-btn>
394
- </v-col>
395
- <v-col cols="6">
396
- <v-btn
397
- block
398
- variant="flat"
399
- color="black"
400
- size="large"
401
- height="56"
402
- class="text-none font-weight-bold rounded-0"
403
- :loading="submitting"
404
- @click="_equipmentItem()"
405
- >
406
- Checkout Item
407
- </v-btn>
408
- </v-col>
409
- </v-row>
410
- </v-card-actions>
383
+ <div class="screen-modal__footer">
384
+ <v-btn
385
+ class="screen-btn-ghost"
386
+ variant="outlined"
387
+ :disabled="submitting"
388
+ @click="dialogEquipmentItem = false"
389
+ >
390
+ Cancel
391
+ </v-btn>
392
+ <v-btn
393
+ class="screen-btn-primary"
394
+ variant="flat"
395
+ :loading="submitting"
396
+ @click="_equipmentItem()"
397
+ >
398
+ Checkout Item
399
+ </v-btn>
400
+ </div>
411
401
  </v-card>
412
402
  </v-dialog>
413
403
 
414
404
  <Snackbar v-model="messageSnackbar" :text="message" :color="messageColor" />
415
405
 
416
406
  <v-dialog v-model="dialogPhotoForItem" max-width="720" persistent>
417
- <v-card rounded="lg">
418
- <v-card-title class="d-flex align-center pa-4">
407
+ <v-card class="screen-modal">
408
+ <v-card-title class="d-flex align-center">
419
409
  <div>
420
- <div class="text-h6 font-weight-bold">Item Photos</div>
421
- <div class="text-caption text-medium-emphasis">
410
+ Item Photos
411
+ <!--
412
+ The handoff draws no sub-line under a modal title. `--muted` at
413
+ 12px, the figure batch I's `AttachmentsViewer` settled on, rather
414
+ than a third number.
415
+ -->
416
+ <div class="eqi-modal-sub">
422
417
  {{ equipmentItems[activePhotoIndex ?? 0]?.supplyName || "Item" }}
423
418
  </div>
424
419
  </div>
@@ -428,15 +423,14 @@
428
423
  <v-btn
429
424
  icon="mdi-close"
430
425
  variant="text"
431
- size="small"
426
+ class="screen-modal__close"
427
+ aria-label="Close"
432
428
  @click="dialogPhotoForItem = false"
433
429
  />
434
430
  </v-card-title>
435
431
 
436
- <v-divider />
437
-
438
432
  <!-- Body -->
439
- <v-card-text class="pa-6" v-if="activePhotoIndex !== null">
433
+ <v-card-text class="screen-modal__body" v-if="activePhotoIndex !== null">
440
434
  <PhotoUpload
441
435
  title="Add / Take Photos"
442
436
  v-model="currentPhotos"
@@ -445,63 +439,42 @@
445
439
  />
446
440
  </v-card-text>
447
441
 
448
- <v-divider />
449
-
450
442
  <!-- Footer -->
451
- <v-card-actions class="pa-0">
452
- <v-row no-gutters class="w-100">
453
- <v-col cols="6">
454
- <v-btn
455
- block
456
- variant="text"
457
- size="large"
458
- height="56"
459
- class="text-none font-weight-medium rounded-0"
460
- @click="dialogPhotoForItem = false"
461
- >
462
- Cancel
463
- </v-btn>
464
- </v-col>
465
-
466
- <v-col cols="6">
467
- <v-btn
468
- block
469
- variant="flat"
470
- color="black"
471
- size="large"
472
- height="56"
473
- class="text-none font-weight-bold rounded-0"
474
- @click="dialogPhotoForItem = false"
475
- >
476
- Done
477
- </v-btn>
478
- </v-col>
479
- </v-row>
480
- </v-card-actions>
443
+ <div class="screen-modal__footer">
444
+ <v-btn
445
+ class="screen-btn-ghost"
446
+ variant="outlined"
447
+ @click="dialogPhotoForItem = false"
448
+ >
449
+ Cancel
450
+ </v-btn>
451
+ <v-btn
452
+ class="screen-btn-primary"
453
+ variant="flat"
454
+ @click="dialogPhotoForItem = false"
455
+ >
456
+ Done
457
+ </v-btn>
458
+ </div>
481
459
  </v-card>
482
460
  </v-dialog>
483
461
 
484
462
  <v-dialog v-model="showAttachmentDialog" max-width="720" persistent>
485
- <v-card rounded="lg">
486
- <v-card-title class="d-flex align-center pa-4">
487
- <div>
488
- <div class="text-h6 font-weight-bold">Attachment</div>
489
- </div>
490
-
463
+ <v-card class="screen-modal">
464
+ <v-card-title class="d-flex align-center">
465
+ Attachment
491
466
  <v-spacer />
492
-
493
467
  <v-btn
494
468
  icon="mdi-close"
495
469
  variant="text"
496
- size="small"
470
+ class="screen-modal__close"
471
+ aria-label="Close"
497
472
  @click="(showAttachmentDialog = false), (attachmentUrl = '')"
498
473
  />
499
474
  </v-card-title>
500
475
 
501
- <v-divider />
502
-
503
476
  <!-- Body -->
504
- <v-card-text class="pa-6">
477
+ <v-card-text class="screen-modal__body">
505
478
  <v-img :src="attachmentUrl" contain />
506
479
  </v-card-text>
507
480
  </v-card>
@@ -819,4 +792,18 @@ const currentPhotoIds = computed({
819
792
  });
820
793
  </script>
821
794
 
822
- <style scoped></style>
795
+ <style scoped>
796
+ /*
797
+ The sub-line under the "Item Photos" title. The handoff draws no such line,
798
+ so it takes the figure already settled on for one: `--muted` at 12px.
799
+ Scoped to `.v-card-title` because Vuetify's own title rule would otherwise
800
+ hand it the 20px it gives everything inside.
801
+ */
802
+ .screen-modal .v-card-title .eqi-modal-sub {
803
+ font-family: var(--font-sans);
804
+ font-size: 12px;
805
+ font-weight: 400;
806
+ line-height: 1.4;
807
+ color: var(--muted);
808
+ }
809
+ </style>