@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
package/components/Signature.vue
CHANGED
|
@@ -1,16 +1,28 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<v-dialog v-model="dialogModel" max-width="700" persistent>
|
|
3
|
-
<v-card>
|
|
4
|
-
|
|
5
|
-
|
|
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
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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="
|
|
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
|
-
|
|
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"
|
|
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
|
|
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"
|
|
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"
|
|
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"
|
|
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
|
-
|
|
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"
|
|
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
|
|
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(
|
|
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
|
-
<
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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="
|
|
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(--
|
|
209
|
+
border: 2px solid var(--accent);
|
|
186
210
|
}
|
|
187
211
|
|
|
188
212
|
.remove-btn {
|
package/components/Snackbar.vue
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<v-snackbar
|
|
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">
|
|
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: "
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
<
|
|
24
|
+
<PageHeader :title="props.title" />
|
|
15
25
|
</v-col>
|
|
16
26
|
|
|
17
|
-
<v-col cols="12"
|
|
27
|
+
<v-col cols="12">
|
|
18
28
|
<slot name="default"> </slot>
|
|
19
29
|
</v-col>
|
|
20
30
|
|