@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.
- package/assets/css/primitives.css +1113 -0
- package/assets/css/screens.css +1097 -0
- package/assets/css/shell.css +258 -0
- package/assets/css/tokens.css +236 -0
- package/components/AcceptDialog.vue +17 -18
- package/components/AccessCard/AvailableStats.vue +24 -16
- package/components/AccessCardAddForm.vue +42 -42
- package/components/AccessCardAssignToUnitForm.vue +13 -21
- package/components/AccessCardDeleteDialog.vue +41 -39
- package/components/AccessCardDetailsDialog.vue +125 -79
- package/components/AccessCardPreviewDialog.vue +58 -84
- package/components/AccessCardQrTagging.vue +60 -63
- package/components/AccessCardReplaceForm.vue +27 -23
- package/components/AccessManagement.vue +86 -85
- package/components/AddEqupmentForm.vue +18 -22
- package/components/AddPassKeyToVisitor.vue +95 -73
- package/components/AppButton.vue +62 -0
- package/components/AppCard.vue +20 -0
- package/components/AppDateField.vue +49 -0
- package/components/AppField.vue +76 -0
- package/components/AppKpiTile.vue +65 -0
- package/components/AppSegmented.vue +38 -0
- package/components/AppSelect.vue +247 -0
- package/components/AreaChecklistHistoryLogs.vue +51 -44
- package/components/AreaChecklistHistoryMain.vue +14 -7
- package/components/AreaFormDialog.vue +71 -59
- package/components/AreaMain.vue +73 -107
- package/components/AttachmentsViewer.vue +84 -22
- package/components/AttendanceCheckInOutDialog.vue +85 -88
- package/components/AttendanceDetailsDialog.vue +57 -63
- package/components/AttendanceMain.vue +4 -3
- package/components/AttendanceMapSearchDialog.vue +42 -44
- package/components/AttendanceSettingsDialog.vue +79 -63
- package/components/Avatar/Main.vue +54 -2
- package/components/BillingMain.vue +26 -30
- package/components/BtnUploadFile.vue +53 -11
- package/components/BuildingForm.vue +34 -27
- package/components/BuildingManagement/buildings.vue +39 -39
- package/components/BuildingManagement/units.vue +26 -42
- package/components/BuildingUnitFormAdd.vue +20 -23
- package/components/BuildingUnitFormEdit.vue +8 -4
- package/components/BulletinBoardForm.vue +19 -24
- package/components/BulletinBoardManagement.vue +49 -57
- package/components/BulletinBoardView.vue +9 -6
- package/components/BulletinExpirationChip.vue +13 -4
- package/components/Button/Close.vue +2 -2
- package/components/CameraForm.vue +21 -22
- package/components/CameraMain.vue +50 -49
- package/components/Card/DeleteConfirmation.vue +24 -22
- package/components/Card/MemberInfoSummary.vue +28 -3
- package/components/Card/Toggle.vue +15 -3
- package/components/CardToolbar.vue +37 -0
- package/components/Carousel.vue +56 -36
- package/components/Chat/Bubbles.vue +43 -14
- package/components/Chat/Information.vue +49 -32
- package/components/Chat/ListCard.vue +38 -9
- package/components/Chat/Message.vue +41 -15
- package/components/Chat/Navigation.vue +27 -15
- package/components/Chat/SkeletonLoader.vue +9 -2
- package/components/ChecklistItemRow.vue +25 -1
- package/components/CleaningScheduleMain.vue +44 -49
- package/components/ClientDetailForm.vue +81 -56
- package/components/ClientMain.vue +92 -82
- package/components/ConfirmDialog.vue +14 -8
- package/components/Container/Standard.vue +9 -7
- package/components/CreateSubsciptionPlan.vue +148 -89
- package/components/DashboardEmptyState.vue +48 -3
- package/components/DashboardMain.vue +924 -676
- package/components/DashboardPanel.vue +84 -21
- package/components/DeliveryCompany.vue +34 -20
- package/components/Dialog/DeleteConfirmation.vue +20 -21
- package/components/Dialog/ReplaceAutofillPrompt.vue +19 -26
- package/components/Dialog/ReusablePrompt.vue +30 -29
- package/components/Dialog/UpdateMoreAction.vue +62 -59
- package/components/DocumentForm.vue +14 -21
- package/components/DocumentManagement.vue +162 -108
- package/components/DocumentViewer.vue +29 -12
- package/components/DrawImage.vue +29 -21
- package/components/EntryPass/QrTemplatePreview.vue +27 -16
- package/components/EntryPassInformation.vue +40 -10
- package/components/EntryPassMain.vue +49 -27
- package/components/EquipmentItemMain.vue +84 -97
- package/components/EquipmentManagementMain.vue +81 -103
- package/components/Facility/BookingSetup.vue +43 -52
- package/components/Feedback/Form.vue +26 -12
- package/components/FeedbackMain.vue +35 -49
- package/components/FileInput.vue +75 -58
- package/components/FileInputWithList.vue +59 -12
- package/components/FormDialog.vue +60 -21
- package/components/HidAccessLogDashboard.vue +512 -490
- package/components/HidCameraCaptureDialog.vue +216 -0
- package/components/HidEnabledGate.vue +67 -9
- package/components/HidIntercomManagement.vue +1322 -653
- package/components/HidQrCodeConfiguration.vue +1030 -258
- package/components/HidReaderForm.vue +142 -59
- package/components/HidReaderManagement.vue +211 -323
- package/components/HidServiceSettingsPanel.vue +44 -13
- package/components/HidUserEnrollment.vue +1185 -412
- package/components/HygieneUpdateMoreAction.vue +44 -44
- package/components/IncidentReport/Authorities.vue +30 -18
- package/components/IncidentReport/IncidentInformation.vue +10 -10
- package/components/IncidentReport/IncidentInformationDownload.vue +3 -4
- package/components/IncidentReport/affectedEntities.vue +41 -20
- package/components/Input/Date.vue +3 -0
- package/components/Input/DatePicker.vue +1 -2
- package/components/Input/DateTimePicker.vue +1 -1
- package/components/Input/File.vue +55 -10
- package/components/Input/FileV2.vue +39 -6
- package/components/Input/InputPhoneNumberV2.vue +2 -1
- package/components/Input/ListGroupSelection.vue +56 -8
- package/components/Input/NRICNumber.vue +1 -0
- package/components/Input/NewDate.vue +1 -0
- package/components/Input/Number.vue +1 -0
- package/components/Input/Password.vue +1 -0
- package/components/Input/PhoneNumber.vue +21 -1
- package/components/Input/VehicleNumber.vue +1 -0
- package/components/InputLabel.vue +2 -2
- package/components/InvitationClientForm.vue +21 -19
- package/components/InvitationForm.vue +15 -21
- package/components/InvitationMain.vue +46 -61
- package/components/Layout/Header.vue +263 -36
- package/components/Layout/NavigationDrawer.vue +300 -30
- package/components/ListItem.vue +33 -3
- package/components/LocalPagination.vue +27 -3
- package/components/ManageChecklistMain.vue +136 -86
- package/components/MemberInformation.vue +32 -16
- package/components/MemberMain.vue +113 -93
- package/components/MyAttendanceMain.vue +3 -5
- package/components/NavigationItem.vue +83 -3
- package/components/Nfc/NFCPatrolReportMain.vue +47 -33
- package/components/Nfc/NFCPatrolRouteForm.vue +18 -20
- package/components/Nfc/NFCPatrolRouteMain.vue +116 -103
- package/components/Nfc/NFCPatrolSettings.vue +14 -4
- package/components/Nfc/NFCTagForm.vue +22 -8
- package/components/Nfc/NFCTagMain.vue +41 -43
- package/components/Nfc/PatrolReport/DailyReportTab.vue +8 -1
- package/components/Nfc/PatrolReport/MonthlyReportTab.vue +8 -1
- package/components/Nfc/PatrolReport/MonthlyReportTable.vue +5 -3
- package/components/Nfc/PatrolReport/PatrolActivityTable.vue +26 -6
- package/components/Nfc/PatrolReport/PatrolReportTab.vue +8 -0
- package/components/Nfc/PatrolReport/PatrolRouteSummary.vue +41 -9
- package/components/Nfc/PatrolReport/RemarksDialog.vue +39 -9
- package/components/Nfc/PatrolReport/ReportEmptyState.vue +29 -9
- package/components/Nfc/PatrolReport/ReportFilters.vue +19 -10
- package/components/Nfc/PatrolReport/ReportLocationHeader.vue +32 -6
- package/components/Nfc/PatrolReport/SummaryReportTable.vue +28 -6
- package/components/NotificationSettings.vue +373 -0
- package/components/NumberSettingField.vue +9 -2
- package/components/OnlineFormConfigurationForm.vue +725 -237
- package/components/OnlineFormFill.vue +213 -106
- package/components/OnlineFormRenderPreview.vue +25 -30
- package/components/OnlineFormsConfiguration.vue +113 -109
- package/components/OrgViewDialog.vue +34 -16
- package/components/OvernightParkingAvailability.vue +49 -26
- package/components/OvernightParkingManagement.vue +78 -18
- package/components/PageHeader.vue +43 -0
- package/components/PassInformation.vue +109 -53
- package/components/PasswordConfirmation.vue +44 -26
- package/components/PeopleForm.vue +41 -20
- package/components/PhotoUpload.vue +110 -48
- package/components/PlaceholderComponent.vue +35 -19
- package/components/PlanActionsMenu.vue +12 -2
- package/components/PlanStatusBadge.vue +7 -8
- package/components/PlateNumberDisplay.vue +9 -6
- package/components/QrTemplate/PrintDialog.vue +66 -43
- package/components/RolePermissionFormCreate.vue +104 -79
- package/components/RolePermissionFormPreviewUpdate.vue +111 -109
- package/components/RolePermissionMain.vue +183 -81
- package/components/ScanVisitorQRCode.vue +99 -35
- package/components/ScheduleAreaMain.vue +34 -59
- package/components/ScheduleTaskForm.vue +61 -42
- package/components/ScheduleTaskMain.vue +56 -69
- package/components/SearchVehicleNumberUser.vue +39 -37
- package/components/ServiceProviderFormCreate.vue +29 -20
- package/components/ServiceProviderInvitationPrompt.vue +155 -0
- package/components/ServiceProviderMain.vue +601 -432
- package/components/Signature.vue +40 -34
- package/components/SignaturePad.vue +5 -29
- package/components/SiteSettings.vue +41 -11
- package/components/SiteSettingsWorkOrder.vue +61 -30
- package/components/SlideCardGroup.vue +35 -11
- package/components/Snackbar.vue +36 -3
- package/components/SpecificAttr.vue +18 -8
- package/components/StatusChip.vue +156 -0
- package/components/StockCard.vue +17 -12
- package/components/SubscriptionPlanTable.vue +207 -140
- package/components/SwitchContext.vue +201 -9
- package/components/TableHygiene.vue +36 -46
- package/components/TableList.vue +10 -10
- package/components/TableListSecondary.vue +105 -54
- package/components/TableMain.vue +251 -78
- package/components/TableV3.vue +61 -70
- package/components/TiptapEditor.vue +33 -40
- package/components/TiptapEditorQr.vue +5 -2
- package/components/Tooltip/Info.vue +69 -24
- package/components/UnitMain.vue +40 -60
- package/components/UnitPersonCard.vue +42 -13
- package/components/VehicleAddSelection.vue +48 -32
- package/components/VehicleForm.vue +112 -129
- package/components/VehicleManagement.vue +26 -12
- package/components/VehicleUpdateMoreAction.vue +59 -46
- package/components/VisitorDataFromScannedQRCodeForm.vue +90 -65
- package/components/VisitorForm.vue +774 -210
- package/components/VisitorFormSelection.vue +40 -37
- package/components/VisitorManagement.vue +239 -82
- package/components/VisitorPassKeyQRScanner.vue +65 -18
- package/components/VisitorSearchResultSummary.vue +60 -16
- package/components/VisitorSocketPopUp.vue +22 -14
- package/components/VisitorsReportPreview.vue +44 -29
- package/components/WorkOrder/Create.vue +26 -17
- package/components/WorkOrder/ListView.vue +38 -7
- package/components/WorkOrder/Main.vue +62 -59
- package/composables/useFeedback.ts +3 -3
- package/composables/useHidAmico.ts +269 -0
- package/composables/useHidNavigation.ts +2 -9
- package/composables/useMember.ts +3 -3
- package/composables/useNFCPatrolDailyReport.ts +13 -0
- package/composables/useNFCPatrolMonthlyReport.ts +22 -56
- package/composables/useNFCPatrolReport.ts +13 -0
- package/composables/useNotificationPreference.ts +87 -0
- package/composables/useOnlineFormPages.ts +2 -0
- package/composables/useRole.ts +22 -0
- package/composables/useServiceProvider.ts +3 -3
- package/composables/useServiceProviderInvitation.ts +145 -0
- package/composables/useSipWebPhone.ts +336 -0
- package/composables/useSubscriptionPlan.ts +62 -0
- package/composables/useThemePreference.ts +63 -0
- package/composables/useVisitor.ts +6 -1
- package/composables/useWebUsb.ts +127 -37
- package/composables/useWorkOrder.ts +17 -3
- package/error.vue +30 -6
- package/nuxt.config.ts +36 -0
- package/package.json +25 -4
- package/pages/[org]/[site]/access-mgmt/administrator/index.vue +2 -2
- package/pages/[org]/[site]/access-mgmt/{identity-mapping → hid-cards}/index.vue +2 -2
- package/pages/[org]/[site]/access-mgmt/intercom/index.vue +1 -1
- package/pages/notification-settings.vue +19 -0
- package/pages/payment-method-linked.vue +34 -10
- package/pages/require-customer.vue +48 -10
- package/pages/require-organization-membership.vue +32 -8
- package/pages/unauthorized.vue +29 -4
- package/plugins/secure-member.client.ts +21 -56
- package/plugins/vuetify.ts +69 -2
- package/types/nfc-patrol-report.ts +3 -2
- package/types/site.d.ts +71 -0
- package/types/subscription.ts +18 -11
- package/utils/breadcrumb.test.ts +108 -0
- package/utils/breadcrumb.ts +82 -0
- package/utils/dashboard.test.ts +118 -0
- package/utils/dashboard.ts +53 -0
- package/utils/data.test.ts +95 -0
- package/utils/data.ts +40 -2
- package/utils/hid-discover.test.ts +102 -0
- package/utils/list-page.test.ts +60 -0
- package/utils/list-page.ts +38 -0
- package/utils/materialSymbols.ts +363 -0
- package/utils/nav-sections.test.ts +190 -0
- package/utils/nav-sections.ts +151 -0
- package/utils/nfc-patrol-report.test.ts +130 -0
- package/utils/nfc-patrol-report.ts +101 -0
- package/utils/role.test.ts +69 -0
- package/utils/role.ts +10 -0
- package/utils/route-name.test.ts +85 -0
- package/utils/route-name.ts +24 -0
- package/utils/status.test.ts +110 -0
- package/utils/status.ts +135 -0
- package/utils/table-card.test.ts +84 -0
- package/utils/theme-aa-ledger.ts +148 -0
- package/utils/theme.test.ts +485 -7
- package/utils/theme.ts +295 -110
- package/.changeset/README.md +0 -8
- package/.changeset/config.json +0 -11
- package/.editorconfig +0 -12
- package/.github/workflows/main.yml +0 -17
- package/.github/workflows/publish-staging.yml +0 -47
- package/.github/workflows/publish.yml +0 -39
- package/PUBLISHING.md +0 -269
- package/components/HidIdentityMapping.vue +0 -975
- package/components/ScheduleTaskAreaFormDialog.vue +0 -144
- package/components/ScheduleTaskAreaUpdateMoreAction.vue +0 -109
- package/components/ScheduleTastTicketMain.vue +0 -182
- package/components/TableWithButton.vue +0 -94
- 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-
|
|
64
|
-
<v-progress-circular size="14" width="2" indeterminate
|
|
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-
|
|
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="!
|
|
182
|
+
v-if="!hidPortalName"
|
|
171
183
|
type="warning"
|
|
172
184
|
variant="tonal"
|
|
173
185
|
density="compact"
|
|
174
186
|
class="mt-3"
|
|
175
|
-
icon="mdi-
|
|
187
|
+
icon="mdi-alert"
|
|
176
188
|
>
|
|
177
|
-
|
|
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
|
|
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
|
|
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
|
|
231
|
+
<v-card-title>Scan Card</v-card-title>
|
|
210
232
|
<v-spacer />
|
|
211
|
-
<v-btn icon="mdi-close"
|
|
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
|
-
<
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
</
|
|
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
|
-
</
|
|
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}
|
|
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
|
-
|
|
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
|
|
206
|
-
|
|
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
|
-
|
|
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-
|
|
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
|
-
<
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
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
|
|
418
|
-
<v-card-title class="d-flex align-center
|
|
407
|
+
<v-card class="screen-modal">
|
|
408
|
+
<v-card-title class="d-flex align-center">
|
|
419
409
|
<div>
|
|
420
|
-
|
|
421
|
-
|
|
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
|
-
|
|
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="
|
|
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
|
-
<
|
|
452
|
-
<v-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
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
|
|
486
|
-
<v-card-title class="d-flex align-center
|
|
487
|
-
|
|
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
|
-
|
|
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="
|
|
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
|
|
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>
|