@7365admin1/layer-common 3.2.6 → 3.2.8-staging.200
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- 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 +241 -79
- 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
|
@@ -1,55 +1,46 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
</v-toolbar>
|
|
15
|
-
|
|
16
|
-
<v-card-text style="max-height: 100vh; overflow-y: auto" class="pb-0">
|
|
2
|
+
<!-- The hygiene twin of `Dialog/UpdateMoreAction`, converted to the same
|
|
3
|
+
shape on staging. Its title row and its footer were both `v-toolbar`s -
|
|
4
|
+
fixed grey slabs that stay grey on the dark theme - and the footer's
|
|
5
|
+
action was a hardcoded `color="black"` fill, i.e. the same black on the
|
|
6
|
+
dark theme as on the light one. -->
|
|
7
|
+
<v-card class="screen-modal" width="100%">
|
|
8
|
+
<template v-if="$slots.header">
|
|
9
|
+
<slot name="header" :title="title" :onClose="onClose" />
|
|
10
|
+
</template>
|
|
11
|
+
<v-card-title v-else class="text-capitalize">{{ title }}</v-card-title>
|
|
12
|
+
|
|
13
|
+
<v-card-text class="screen-modal__body pb-0">
|
|
17
14
|
<slot name="content" />
|
|
18
15
|
</v-card-text>
|
|
19
16
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
Close
|
|
32
|
-
</v-btn>
|
|
33
|
-
</v-col>
|
|
34
|
-
|
|
35
|
-
<v-col v-if="showMoreActions" cols="6" class="pa-0">
|
|
36
|
-
<v-menu>
|
|
17
|
+
<!-- The design's footer strip: equal-width buttons, ghost then primary. -->
|
|
18
|
+
<div class="screen-modal__footer">
|
|
19
|
+
<v-btn
|
|
20
|
+
variant="outlined"
|
|
21
|
+
class="text-none screen-btn-ghost"
|
|
22
|
+
@click="emit('close')"
|
|
23
|
+
>
|
|
24
|
+
Close
|
|
25
|
+
</v-btn>
|
|
26
|
+
|
|
27
|
+
<v-menu v-if="showMoreActions" contained>
|
|
37
28
|
<template #activator="{ props }">
|
|
38
29
|
<v-btn
|
|
39
|
-
block
|
|
40
30
|
variant="flat"
|
|
41
|
-
|
|
42
|
-
class="text-none"
|
|
43
|
-
height="48"
|
|
31
|
+
class="text-none screen-btn-primary"
|
|
44
32
|
:disabled="disabled"
|
|
45
33
|
v-bind="props"
|
|
46
|
-
tile
|
|
47
34
|
>
|
|
48
35
|
More actions
|
|
49
36
|
</v-btn>
|
|
50
37
|
</template>
|
|
51
38
|
|
|
52
|
-
|
|
39
|
+
<!-- The dropdown itself is left as Vuetify draws it, exactly as the
|
|
40
|
+
converted twin left it: the handoff gives a per-row menu no
|
|
41
|
+
shape, and this menu opens on a click the harness cannot drive,
|
|
42
|
+
so it could not be render-verified either. -->
|
|
43
|
+
<v-list class="pa-0 hyg-more__list">
|
|
53
44
|
<v-list-item
|
|
54
45
|
v-if="showQrButton && qrButtonLabel"
|
|
55
46
|
@click="emit('showqr')"
|
|
@@ -110,20 +101,22 @@
|
|
|
110
101
|
</v-list-item-title>
|
|
111
102
|
</v-list-item>
|
|
112
103
|
|
|
104
|
+
<!-- `text-red` was Vuetify's fixed #f44336, the same red on both
|
|
105
|
+
themes. `text-error` is Vuetify's own class over
|
|
106
|
+
`--v-theme-error`, which IS the design's `--err` - the same
|
|
107
|
+
substitution the converted twin made. -->
|
|
113
108
|
<v-list-item
|
|
114
109
|
v-if="canDelete"
|
|
115
110
|
@click="emit('delete')"
|
|
116
|
-
class="text-
|
|
111
|
+
class="text-error"
|
|
117
112
|
>
|
|
118
113
|
<v-list-item-title class="text-subtitle-2">
|
|
119
114
|
{{ deleteButtonLabel }}
|
|
120
115
|
</v-list-item-title>
|
|
121
116
|
</v-list-item>
|
|
122
117
|
</v-list>
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
</v-row>
|
|
126
|
-
</v-toolbar>
|
|
118
|
+
</v-menu>
|
|
119
|
+
</div>
|
|
127
120
|
</v-card>
|
|
128
121
|
</template>
|
|
129
122
|
|
|
@@ -240,4 +233,11 @@ const {
|
|
|
240
233
|
} = prop;
|
|
241
234
|
</script>
|
|
242
235
|
|
|
243
|
-
<style scoped
|
|
236
|
+
<style scoped>
|
|
237
|
+
/* `text-subtitle-2` is Vuetify's 0.875rem/500; the handoff names no type for a
|
|
238
|
+
menu row, so it takes the established cell type - same rule as the twin. */
|
|
239
|
+
.hyg-more__list :deep(.v-list-item-title) {
|
|
240
|
+
font-size: var(--fs-cell);
|
|
241
|
+
font-weight: var(--fw-cell);
|
|
242
|
+
}
|
|
243
|
+
</style>
|
|
@@ -2,37 +2,39 @@
|
|
|
2
2
|
<v-row no-gutters class="px-5 pt-4">
|
|
3
3
|
<!-- Authorities (Police/SCDF/Ambulance called in at the scene) -->
|
|
4
4
|
<v-col cols="12" class="border-b pb-5 mb-5 mt-1">
|
|
5
|
-
<p class="
|
|
5
|
+
<p class="screen-card-title mb-2">
|
|
6
6
|
Authorities (Police/SCDF/Ambulance called in at the scene)?
|
|
7
7
|
</p>
|
|
8
8
|
<p
|
|
9
9
|
v-if="authorities?.authoritiesValue == 'no'"
|
|
10
|
-
class="mt-2 text-
|
|
10
|
+
class="report-answer mt-2 text-capitalize"
|
|
11
11
|
>
|
|
12
12
|
{{ authorities?.authoritiesValue }}
|
|
13
13
|
</p>
|
|
14
14
|
|
|
15
|
-
<v-
|
|
16
|
-
v-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
</
|
|
15
|
+
<AppCard v-else class="table-card mt-5">
|
|
16
|
+
<v-data-table
|
|
17
|
+
:headers="authoritiesTableHeader"
|
|
18
|
+
:items="authorities?.authoritiesCalled"
|
|
19
|
+
fixed-header
|
|
20
|
+
hide-default-footer
|
|
21
|
+
:hide-default-header="false"
|
|
22
|
+
items-per-page="100"
|
|
23
|
+
style="max-height: calc(100vh - (200px))"
|
|
24
|
+
>
|
|
25
|
+
</v-data-table>
|
|
26
|
+
</AppCard>
|
|
27
27
|
</v-col>
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
<!-- `w-100` + `mx-2` made the card 16px wider than its column, so its right
|
|
29
|
+
corner was clipped off. The card supplies its own edge now. -->
|
|
30
|
+
<AppCard class="table-card w-100 my-8">
|
|
31
|
+
<v-table class="responsive-table elevation-0">
|
|
30
32
|
<thead>
|
|
31
33
|
<tr>
|
|
32
34
|
<th
|
|
33
35
|
v-for="(item, index) in concernHeader"
|
|
34
36
|
:key="index"
|
|
35
|
-
class="text-left
|
|
37
|
+
class="text-left border-e"
|
|
36
38
|
>
|
|
37
39
|
{{ item }}
|
|
38
40
|
</th>
|
|
@@ -196,10 +198,20 @@
|
|
|
196
198
|
</tr>
|
|
197
199
|
</tbody>
|
|
198
200
|
</v-table>
|
|
199
|
-
</
|
|
201
|
+
</AppCard>
|
|
200
202
|
</v-row>
|
|
201
203
|
</template>
|
|
202
204
|
|
|
205
|
+
<style scoped>
|
|
206
|
+
/* The prototype states no size for a plain answer line, so it takes the body
|
|
207
|
+
row's own type rather than Vuetify's `text-h6`. */
|
|
208
|
+
.report-answer {
|
|
209
|
+
font-size: var(--fs-cell);
|
|
210
|
+
font-weight: var(--fw-cell);
|
|
211
|
+
color: var(--text);
|
|
212
|
+
}
|
|
213
|
+
</style>
|
|
214
|
+
|
|
203
215
|
<script lang="ts" setup>
|
|
204
216
|
definePageMeta({
|
|
205
217
|
middleware: ["01-auth", "02-org"],
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
<v-row no-gutters class="px-5 pt-4">
|
|
3
3
|
<!-- Site Information -->
|
|
4
4
|
<v-col cols="12" class="border-b pb-3 mb-5">
|
|
5
|
-
<p class="mb-2
|
|
5
|
+
<p class="mb-2 screen-card-title">
|
|
6
6
|
Site Information
|
|
7
7
|
</p>
|
|
8
8
|
<v-row no-gutters class="mt-5">
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
|
|
37
37
|
<!-- Place of Incident -->
|
|
38
38
|
<v-col cols="12" class="border-b pb-5 mb-5 mt-1">
|
|
39
|
-
<p class="mb-2
|
|
39
|
+
<p class="mb-2 screen-card-title">
|
|
40
40
|
Place of Incident
|
|
41
41
|
</p>
|
|
42
42
|
<p class="my-1 text-h6 text-capitalize">
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
|
|
47
47
|
<!-- Incident Type / Time -->
|
|
48
48
|
<v-col cols="12" class="border-b pb-5 mb-5 mt-1">
|
|
49
|
-
<p class="mb-2
|
|
49
|
+
<p class="mb-2 screen-card-title">
|
|
50
50
|
Incident Type / Time
|
|
51
51
|
</p>
|
|
52
52
|
<v-row no-gutters class="mt-5">
|
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
|
|
107
107
|
<!-- Response/Submission From (1st Contact) -->
|
|
108
108
|
<v-col cols="12" class="border-b pb-5 mb-5 mt-1">
|
|
109
|
-
<p class="mb-2
|
|
109
|
+
<p class="mb-2 screen-card-title">
|
|
110
110
|
Response/Submission From (1st Contact)
|
|
111
111
|
</p>
|
|
112
112
|
<v-row no-gutters class="mt-5">
|
|
@@ -130,7 +130,7 @@
|
|
|
130
130
|
|
|
131
131
|
<!-- Name of Informant/Complainant Information -->
|
|
132
132
|
<v-col cols="12" class="border-b pb-5 mb-5 mt-1">
|
|
133
|
-
<p class="mb-2
|
|
133
|
+
<p class="mb-2 screen-card-title">
|
|
134
134
|
Name of Informant/Complainant Information
|
|
135
135
|
</p>
|
|
136
136
|
<v-row no-gutters class="d-flex align-center mt-5">
|
|
@@ -146,7 +146,7 @@
|
|
|
146
146
|
<v-icon
|
|
147
147
|
v-if="incidentInformation?.complaintInfo?.nric"
|
|
148
148
|
size="small"
|
|
149
|
-
color="
|
|
149
|
+
color="primary"
|
|
150
150
|
class="cursor-pointer"
|
|
151
151
|
@click="toggleNRICComplainant"
|
|
152
152
|
>
|
|
@@ -172,7 +172,7 @@
|
|
|
172
172
|
|
|
173
173
|
<!-- Name of Recipient of Complaint (1st Contact) -->
|
|
174
174
|
<v-col cols="12" class="border-b pb-5 mb-5 mt-1">
|
|
175
|
-
<p class="mb-2
|
|
175
|
+
<p class="mb-2 screen-card-title">
|
|
176
176
|
Name of Recipient of Complaint (1st Contact)
|
|
177
177
|
</p>
|
|
178
178
|
<v-row no-gutters class="d-flex align-center mt-5">
|
|
@@ -188,7 +188,7 @@
|
|
|
188
188
|
<v-icon
|
|
189
189
|
v-if="incidentInformation?.recipientOfComplaint?.nric"
|
|
190
190
|
size="small"
|
|
191
|
-
color="
|
|
191
|
+
color="primary"
|
|
192
192
|
class="cursor-pointer"
|
|
193
193
|
@click="toggleNRICRecipient"
|
|
194
194
|
>
|
|
@@ -214,7 +214,7 @@
|
|
|
214
214
|
|
|
215
215
|
<!-- Complaint Received through -->
|
|
216
216
|
<v-col cols="12" class="border-b pb-5 mb-5 mt-1">
|
|
217
|
-
<p class="mb-2
|
|
217
|
+
<p class="mb-2 screen-card-title">
|
|
218
218
|
Complaint Received through
|
|
219
219
|
</p>
|
|
220
220
|
<v-col cols="12">
|
|
@@ -238,7 +238,7 @@
|
|
|
238
238
|
|
|
239
239
|
<!-- Brief Description -->
|
|
240
240
|
<v-col cols="12" class="mb-10">
|
|
241
|
-
<p class="mb-2
|
|
241
|
+
<p class="mb-2 screen-card-title">
|
|
242
242
|
Brief Description
|
|
243
243
|
</p>
|
|
244
244
|
<p class="mt-5 text-h6 text-capitalize">
|
|
@@ -2,15 +2,14 @@
|
|
|
2
2
|
<v-row no-gutters class="px-5 pt-4">
|
|
3
3
|
<!-- Site Information -->
|
|
4
4
|
<p
|
|
5
|
-
class="text-uppercase text-center w-100 text-h6"
|
|
6
|
-
style="
|
|
5
|
+
class="text-uppercase text-center w-100 text-h6 bg-error text-on-error"
|
|
6
|
+
style="padding: 10px"
|
|
7
7
|
>
|
|
8
8
|
Incident Report
|
|
9
9
|
</p>
|
|
10
10
|
<v-row no-gutters class="mt-5 border pb-5">
|
|
11
11
|
<p
|
|
12
|
-
class="w-100 text-h6 pa-2 text-
|
|
13
|
-
style="background: #fcbf49"
|
|
12
|
+
class="w-100 text-h6 pa-2 text-center bg-warning text-on-warning"
|
|
14
13
|
>
|
|
15
14
|
Incident Information
|
|
16
15
|
</p>
|
|
@@ -2,18 +2,22 @@
|
|
|
2
2
|
<v-row no-gutters class="px-5 pt-4">
|
|
3
3
|
<!-- Anyone affected/injured -->
|
|
4
4
|
<v-col cols="12" class="border-b pb-5 mb-5 mt-1">
|
|
5
|
-
|
|
5
|
+
<!-- Same shape as this report's `Authorities.vue` sibling, already on
|
|
6
|
+
staging: a `.screen-card-title` question, a `.report-answer` line
|
|
7
|
+
when the answer is "no", and the table inside an `AppCard` instead of
|
|
8
|
+
a `border` class Vuetify draws from its own fixed grey. -->
|
|
9
|
+
<p class="screen-card-title mb-2">
|
|
6
10
|
Anyone affected/injured?
|
|
7
11
|
</p>
|
|
8
12
|
<p
|
|
9
13
|
v-if="affectedEntities?.anyoneAffectedValue == 'no'"
|
|
10
|
-
class="
|
|
14
|
+
class="report-answer mt-2 text-capitalize"
|
|
11
15
|
>
|
|
12
16
|
{{ affectedEntities?.anyoneAffectedValue }}
|
|
13
17
|
</p>
|
|
14
18
|
|
|
19
|
+
<AppCard v-else class="table-card mt-5">
|
|
15
20
|
<v-data-table
|
|
16
|
-
v-else
|
|
17
21
|
:headers="injuredTableHeader"
|
|
18
22
|
:items="affectedEntities?.affectedInjured"
|
|
19
23
|
fixed-header
|
|
@@ -21,16 +25,17 @@
|
|
|
21
25
|
:hide-default-header="false"
|
|
22
26
|
items-per-page="100"
|
|
23
27
|
style="max-height: calc(100vh - (200px))"
|
|
24
|
-
class="border mt-5"
|
|
25
28
|
>
|
|
26
29
|
<template #header.nric>
|
|
27
30
|
<div class="d-flex align-center">
|
|
28
31
|
NRIC
|
|
32
|
+
<!-- `color="blue"` is a fixed Vuetify blue, the same on both
|
|
33
|
+
themes. `--accent-text` is the design's interactive ink. -->
|
|
29
34
|
<v-icon
|
|
30
35
|
v-if="isShowEyeIcon"
|
|
31
|
-
class="cursor-pointer ml-1"
|
|
36
|
+
class="cursor-pointer ml-1 affected__eye"
|
|
32
37
|
size="18"
|
|
33
|
-
|
|
38
|
+
:aria-label="isShowNRIC ? 'Hide NRIC' : 'Show NRIC'"
|
|
34
39
|
@click="isShowNRIC = !isShowNRIC"
|
|
35
40
|
>
|
|
36
41
|
{{ isShowNRIC ? "mdi-eye-off-outline" : "mdi-eye-outline" }}
|
|
@@ -45,36 +50,52 @@
|
|
|
45
50
|
</tr>
|
|
46
51
|
</template>
|
|
47
52
|
</v-data-table>
|
|
53
|
+
</AppCard>
|
|
48
54
|
</v-col>
|
|
49
55
|
|
|
50
56
|
<!-- Anyone damage to property -->
|
|
51
57
|
<v-col cols="12" class="pb-5 mb-5 mt-1">
|
|
52
|
-
<p class="
|
|
58
|
+
<p class="screen-card-title mb-2">
|
|
53
59
|
Anyone damage to property?
|
|
54
60
|
</p>
|
|
55
61
|
<p
|
|
56
62
|
v-if="affectedEntities?.anyUnitAffectedValue == 'no'"
|
|
57
|
-
class="
|
|
63
|
+
class="report-answer mt-2 text-capitalize"
|
|
58
64
|
>
|
|
59
65
|
{{ affectedEntities?.anyUnitAffectedValue }}
|
|
60
66
|
</p>
|
|
61
67
|
|
|
62
|
-
<v-
|
|
63
|
-
v-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
</
|
|
68
|
+
<AppCard v-else class="table-card mt-5">
|
|
69
|
+
<v-data-table
|
|
70
|
+
:headers="damagePropertyTableHeader"
|
|
71
|
+
:items="affectedEntities?.anyoneDamageToProperty"
|
|
72
|
+
fixed-header
|
|
73
|
+
hide-default-footer
|
|
74
|
+
:hide-default-header="false"
|
|
75
|
+
items-per-page="100"
|
|
76
|
+
style="max-height: calc(100vh - (200px))"
|
|
77
|
+
>
|
|
78
|
+
</v-data-table>
|
|
79
|
+
</AppCard>
|
|
74
80
|
</v-col>
|
|
75
81
|
</v-row>
|
|
76
82
|
</template>
|
|
77
83
|
|
|
84
|
+
<style scoped>
|
|
85
|
+
/* Same two rules as this report's `Authorities.vue` sibling: the prototype
|
|
86
|
+
states no size for a plain answer line, so it takes the body row's type
|
|
87
|
+
rather than Vuetify's `text-h6`. */
|
|
88
|
+
.report-answer {
|
|
89
|
+
font-size: var(--fs-cell);
|
|
90
|
+
font-weight: var(--fw-cell);
|
|
91
|
+
color: var(--text);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.affected__eye {
|
|
95
|
+
color: var(--accent-text);
|
|
96
|
+
}
|
|
97
|
+
</style>
|
|
98
|
+
|
|
78
99
|
<script lang="ts" setup>
|
|
79
100
|
definePageMeta({
|
|
80
101
|
middleware: ["01-auth", "02-org"],
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
v-model="month"
|
|
14
14
|
:items="props.months"
|
|
15
15
|
label="Month"
|
|
16
|
+
class="filter-field"
|
|
16
17
|
density="comfortable"
|
|
17
18
|
:name="props.name + 'custom-input-date-month'"
|
|
18
19
|
hide-details
|
|
@@ -28,6 +29,7 @@
|
|
|
28
29
|
label="Day"
|
|
29
30
|
hide-details
|
|
30
31
|
placeholder="DD"
|
|
32
|
+
class="filter-field"
|
|
31
33
|
density="comfortable"
|
|
32
34
|
:name="props.name + 'custom-input-date-day'"
|
|
33
35
|
:error="!!validationErrMsg"
|
|
@@ -42,6 +44,7 @@
|
|
|
42
44
|
label="Year"
|
|
43
45
|
hide-details
|
|
44
46
|
placeholder="YYYY"
|
|
47
|
+
class="filter-field"
|
|
45
48
|
density="comfortable"
|
|
46
49
|
:name="props.name + 'custom-input-date-year'"
|
|
47
50
|
:error="!!validationErrMsg"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div class="d-flex flex-column">
|
|
3
|
-
<v-text-field v-bind="$attrs" ref="datePickerRef" :model-value="dateFormattedReadOnly" autocomplete="off"
|
|
3
|
+
<v-text-field v-bind="$attrs" class="filter-field" ref="datePickerRef" :model-value="dateFormattedReadOnly" autocomplete="off"
|
|
4
4
|
:placeholder="placeholder" :rules="rules" style="z-index: 10" @click="openDatePicker" @click:clear.stop="clearDate">
|
|
5
5
|
<template #append-inner>
|
|
6
6
|
<v-icon icon="mdi-calendar" @click.stop="openDatePicker" />
|
|
@@ -106,6 +106,5 @@ defineExpose({
|
|
|
106
106
|
.hidden-input {
|
|
107
107
|
opacity: 0;
|
|
108
108
|
height: 0;
|
|
109
|
-
width: 1px;
|
|
110
109
|
}
|
|
111
110
|
</style>
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
<div class="d-flex flex-column">
|
|
3
3
|
<v-text-field
|
|
4
4
|
v-bind="$attrs"
|
|
5
|
+
class="filter-field"
|
|
5
6
|
ref="dateTimePickerRef"
|
|
6
7
|
:model-value="dateTimeFormattedReadOnly"
|
|
7
8
|
autocomplete="off"
|
|
@@ -196,6 +197,5 @@ defineExpose({
|
|
|
196
197
|
.hidden-input {
|
|
197
198
|
opacity: 0;
|
|
198
199
|
height: 0;
|
|
199
|
-
width: 1px;
|
|
200
200
|
}
|
|
201
201
|
</style>
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"
|
|
12
12
|
>
|
|
13
13
|
<div
|
|
14
|
-
class="d-flex align-center justify-center pa-4
|
|
14
|
+
class="file-drop d-flex align-center justify-center pa-4"
|
|
15
15
|
@dragover.prevent
|
|
16
16
|
@drop="handleDrop"
|
|
17
17
|
style="position: relative; z-index: 1"
|
|
@@ -35,12 +35,10 @@
|
|
|
35
35
|
class="d-flex align-center"
|
|
36
36
|
style="z-index: 1; pointer-events: none"
|
|
37
37
|
>
|
|
38
|
-
<v-icon size="28" class="mr-2"
|
|
38
|
+
<v-icon size="28" class="file-drop__icon mr-2"
|
|
39
39
|
>mdi-cloud-upload-outline</v-icon
|
|
40
40
|
>
|
|
41
|
-
<span class="
|
|
42
|
-
>Drag and drop files here</span
|
|
43
|
-
>
|
|
41
|
+
<span class="file-drop__hint">Drag and drop files here</span>
|
|
44
42
|
</div>
|
|
45
43
|
</div>
|
|
46
44
|
</v-col>
|
|
@@ -55,11 +53,10 @@
|
|
|
55
53
|
"
|
|
56
54
|
>
|
|
57
55
|
<v-btn
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
width="55"
|
|
61
|
-
height="55"
|
|
56
|
+
class="screen-btn-primary file-camera"
|
|
57
|
+
variant="flat"
|
|
62
58
|
elevation="0"
|
|
59
|
+
aria-label="Take a photo"
|
|
63
60
|
@click="selectAttachment"
|
|
64
61
|
>
|
|
65
62
|
<v-icon size="20">mdi-camera-outline</v-icon>
|
|
@@ -73,7 +70,7 @@
|
|
|
73
70
|
v-for="(file, index) in attachments"
|
|
74
71
|
:key="index"
|
|
75
72
|
cols="12"
|
|
76
|
-
class="d-flex align-center pa-2 mr-2 mb-2
|
|
73
|
+
class="file-row d-flex align-center pa-2 mr-2 mb-2"
|
|
77
74
|
>
|
|
78
75
|
<div class="mr-3">
|
|
79
76
|
<!-- <v-img
|
|
@@ -108,6 +105,8 @@
|
|
|
108
105
|
|
|
109
106
|
<v-icon
|
|
110
107
|
size="small"
|
|
108
|
+
class="file-row__remove"
|
|
109
|
+
aria-label="Remove file"
|
|
111
110
|
@click.stop="$emit('delete', file)"
|
|
112
111
|
v-if="
|
|
113
112
|
props.createdFrom === 'feedback' && props.attachments.length > 0
|
|
@@ -234,3 +233,49 @@ defineExpose({
|
|
|
234
233
|
},
|
|
235
234
|
});
|
|
236
235
|
</script>
|
|
236
|
+
|
|
237
|
+
<style scoped>
|
|
238
|
+
/* The drop zone was `border-dashed border border-grey` with a `primary` glyph -
|
|
239
|
+
`primary` being the FOREGROUND token, used here as an icon colour, and the
|
|
240
|
+
grey a fixed light-theme hairline. */
|
|
241
|
+
.file-drop {
|
|
242
|
+
border: 1px dashed var(--border);
|
|
243
|
+
border-radius: var(--r-inner);
|
|
244
|
+
position: relative;
|
|
245
|
+
z-index: 1;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
.file-drop__icon {
|
|
249
|
+
color: var(--accent-text);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
.file-drop__hint {
|
|
253
|
+
font-family: var(--font-sans);
|
|
254
|
+
font-size: var(--fs-cell);
|
|
255
|
+
font-weight: 600;
|
|
256
|
+
color: var(--text);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/* Was a 55px square. The design's button is 40px, which is what
|
|
260
|
+
.screen-btn-primary carries; this only keeps it square. */
|
|
261
|
+
.file-camera {
|
|
262
|
+
min-width: var(--btn-h) !important;
|
|
263
|
+
width: var(--btn-h);
|
|
264
|
+
padding: 0 !important;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/* Each attachment row was `bg-white border-sm` - a hard white slab drawn on the
|
|
268
|
+
dark theme as well. */
|
|
269
|
+
.file-row {
|
|
270
|
+
background: var(--card);
|
|
271
|
+
border: 1px solid var(--border);
|
|
272
|
+
border-radius: var(--r-inner);
|
|
273
|
+
font-family: var(--font-sans);
|
|
274
|
+
font-size: var(--fs-cell);
|
|
275
|
+
color: var(--text);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
.file-row__remove {
|
|
279
|
+
color: var(--err);
|
|
280
|
+
}
|
|
281
|
+
</style>
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
<template v-else>
|
|
23
23
|
<v-file-upload v-model="uploadFiles" density="compact" @update:model-value="handleUpdateValue"
|
|
24
24
|
:loading="processing" :disabled="processing" :height="height" :title="title" :accept="accept"
|
|
25
|
-
:name="`upload_images`" class="
|
|
25
|
+
:name="`upload_images`" class="w-100 file-v2__drop" clearable :multiple="multiple">
|
|
26
26
|
<template #item="{ props: itemProps, file }">
|
|
27
27
|
<v-file-upload-item v-bind="itemProps" lines="one" nav @click="handleClickItem(file)">
|
|
28
28
|
<template #prepend>
|
|
@@ -30,8 +30,19 @@
|
|
|
30
30
|
</template>
|
|
31
31
|
|
|
32
32
|
<!-- delete button NOT shown in view mode -->
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
<!-- This button had NO icon and NO label, so it drew as an empty
|
|
34
|
+
slab, and `color="primary"` filled that slab with the design's
|
|
35
|
+
FOREGROUND token (the link ink) rather than a fill. It is the
|
|
36
|
+
remove control for one attached file: a plain close glyph. -->
|
|
37
|
+
<template #clear>
|
|
38
|
+
<v-btn
|
|
39
|
+
v-if="!viewMode"
|
|
40
|
+
icon="mdi-close"
|
|
41
|
+
variant="text"
|
|
42
|
+
size="small"
|
|
43
|
+
aria-label="Remove file"
|
|
44
|
+
@click.stop="handleRemove(file)"
|
|
45
|
+
/>
|
|
35
46
|
</template>
|
|
36
47
|
</v-file-upload-item>
|
|
37
48
|
</template>
|
|
@@ -39,7 +50,7 @@
|
|
|
39
50
|
</template>
|
|
40
51
|
|
|
41
52
|
<v-row no-gutters class="w-100" v-if="errorMessage">
|
|
42
|
-
<p class="text-error w-100 text-center
|
|
53
|
+
<p class="text-error w-100 text-center file-v2__error">{{ errorMessage }}</p>
|
|
43
54
|
</v-row>
|
|
44
55
|
|
|
45
56
|
<ImageCarousel v-model="showImageCarousel" :files="idsArray" :active-file-id="activeImageId" />
|
|
@@ -224,12 +235,34 @@ async function downloadFile(id: string, filename: string) {
|
|
|
224
235
|
|
|
225
236
|
|
|
226
237
|
<style scoped>
|
|
238
|
+
/* The drop zone on the design's surface: `--r-inner`, a `--border` edge and the
|
|
239
|
+
13.5px cell type, instead of Vuetify's 4px radius and `text-caption` scale.
|
|
240
|
+
`:deep` because every box below is rendered by `v-file-upload`. */
|
|
241
|
+
.file-v2__drop {
|
|
242
|
+
font-family: var(--font-sans);
|
|
243
|
+
font-size: var(--fs-cell);
|
|
244
|
+
border-radius: var(--r-inner);
|
|
245
|
+
border-color: var(--border);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
.file-v2__drop :deep(.v-file-upload-item) {
|
|
249
|
+
border-radius: var(--r-inner);
|
|
250
|
+
}
|
|
251
|
+
|
|
227
252
|
* :deep(.v-file-upload-title) {
|
|
228
|
-
font-
|
|
229
|
-
font-
|
|
253
|
+
font-family: var(--font-sans);
|
|
254
|
+
font-size: var(--fs-card-title);
|
|
255
|
+
font-weight: var(--fw-card-title);
|
|
256
|
+
color: var(--text);
|
|
230
257
|
}
|
|
231
258
|
|
|
232
259
|
* :deep(.v-file-upload-items) {
|
|
233
260
|
min-width: 100%;
|
|
234
261
|
}
|
|
262
|
+
|
|
263
|
+
.file-v2__error {
|
|
264
|
+
font-family: var(--font-sans);
|
|
265
|
+
font-size: var(--fs-cell);
|
|
266
|
+
font-weight: var(--fw-cell);
|
|
267
|
+
}
|
|
235
268
|
</style>
|