@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
|
@@ -1,21 +1,16 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<v-sheet
|
|
3
|
-
elevation="
|
|
3
|
+
elevation="0"
|
|
4
4
|
rounded="0"
|
|
5
|
-
class="fill-height d-flex flex-column"
|
|
6
|
-
style="border-right: 1px solid #e0e0e0; border-top: 1px solid #e0e0e0"
|
|
5
|
+
class="chat-info fill-height d-flex flex-column"
|
|
7
6
|
>
|
|
8
7
|
<v-row class="pa-4">
|
|
9
8
|
<v-sheet
|
|
10
9
|
class="overflow-y-auto flex-grow-1"
|
|
11
10
|
:style="{ height: 'calc(100vh - 250px)', overflowX: 'hidden' }"
|
|
12
11
|
>
|
|
13
|
-
<v-col
|
|
14
|
-
|
|
15
|
-
class="mb-2"
|
|
16
|
-
style="position: sticky; top: 0; background-color: white; z-index: 1"
|
|
17
|
-
>
|
|
18
|
-
<h3 class="text-h6">
|
|
12
|
+
<v-col cols="12" class="chat-info__head mb-2">
|
|
13
|
+
<h3 class="screen-card-title">
|
|
19
14
|
{{ type === "workOrder" ? "Work Order" : "Feedback" }} Information
|
|
20
15
|
</h3>
|
|
21
16
|
</v-col>
|
|
@@ -105,7 +100,7 @@
|
|
|
105
100
|
</v-col>
|
|
106
101
|
<v-col v-else cols="6" class="py-1 text-right">
|
|
107
102
|
<v-btn
|
|
108
|
-
class="
|
|
103
|
+
class="chat-info__link text-none"
|
|
109
104
|
rounded="pill"
|
|
110
105
|
variant="flat"
|
|
111
106
|
size="small"
|
|
@@ -130,13 +125,7 @@
|
|
|
130
125
|
<v-row dense class="my-1">
|
|
131
126
|
<v-col cols="6" class="py-1"><strong>Status:</strong></v-col>
|
|
132
127
|
<v-col cols="6" class="py-1 text-right">
|
|
133
|
-
<
|
|
134
|
-
:color="getColorStatus(item.status)"
|
|
135
|
-
size="x-small"
|
|
136
|
-
text-color="white"
|
|
137
|
-
>
|
|
138
|
-
{{ item.status }}
|
|
139
|
-
</v-chip>
|
|
128
|
+
<StatusChip :status="item.status" />
|
|
140
129
|
</v-col>
|
|
141
130
|
</v-row>
|
|
142
131
|
|
|
@@ -152,12 +141,11 @@
|
|
|
152
141
|
</v-sheet>
|
|
153
142
|
</v-row>
|
|
154
143
|
|
|
155
|
-
<v-sheet class="px-4 py-2">
|
|
144
|
+
<v-sheet class="chat-info__actions px-4 py-2">
|
|
156
145
|
<v-btn
|
|
157
146
|
block
|
|
158
|
-
color="primary"
|
|
159
147
|
variant="flat"
|
|
160
|
-
class="mb-2
|
|
148
|
+
class="screen-btn-primary mb-2"
|
|
161
149
|
@click="$emit('edit')"
|
|
162
150
|
>
|
|
163
151
|
Edit
|
|
@@ -165,23 +153,15 @@
|
|
|
165
153
|
<v-btn
|
|
166
154
|
v-if="item?.status !== 'Completed'"
|
|
167
155
|
block
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
class="mb-2 text-capitalize"
|
|
156
|
+
variant="flat"
|
|
157
|
+
class="screen-btn-primary mb-2"
|
|
171
158
|
@click="$emit('mark-complete-request')"
|
|
172
159
|
>
|
|
173
160
|
Mark as Complete
|
|
174
161
|
</v-btn>
|
|
175
|
-
<
|
|
176
|
-
block
|
|
177
|
-
variant="flat"
|
|
178
|
-
color="red"
|
|
179
|
-
density="default"
|
|
180
|
-
class="text-white text-capitalize"
|
|
181
|
-
@click="$emit('delete')"
|
|
182
|
-
>
|
|
162
|
+
<AppButton variant="err" class="chat-info__delete" @click="$emit('delete')">
|
|
183
163
|
Delete
|
|
184
|
-
</
|
|
164
|
+
</AppButton>
|
|
185
165
|
</v-sheet>
|
|
186
166
|
|
|
187
167
|
<WorkOrderCreate
|
|
@@ -414,3 +394,40 @@ function showWorkOrderInfo(workOrderId: string) {
|
|
|
414
394
|
};
|
|
415
395
|
}
|
|
416
396
|
</script>
|
|
397
|
+
|
|
398
|
+
<style scoped>
|
|
399
|
+
/* The same two hard-coded #e0e0e0 hairlines the other two chat panels carried,
|
|
400
|
+
and a sticky heading whose background was the literal word `white` - i.e. a
|
|
401
|
+
white bar across the dark theme. */
|
|
402
|
+
.chat-info {
|
|
403
|
+
background: var(--card);
|
|
404
|
+
border-right: 1px solid var(--border);
|
|
405
|
+
border-top: 1px solid var(--border);
|
|
406
|
+
font-family: var(--font-sans);
|
|
407
|
+
color: var(--text);
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
.chat-info__head {
|
|
411
|
+
position: sticky;
|
|
412
|
+
top: 0;
|
|
413
|
+
z-index: 1;
|
|
414
|
+
background: var(--card);
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
.chat-info__actions {
|
|
418
|
+
background: var(--card);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
/* AppButton is a <button>, not a v-btn, so `block` does not reach it. */
|
|
422
|
+
.chat-info__delete {
|
|
423
|
+
width: 100%;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
/* Was `text-blue` - a Vuetify palette word, not a token. */
|
|
427
|
+
.chat-info__link {
|
|
428
|
+
background: transparent;
|
|
429
|
+
color: var(--accent-text);
|
|
430
|
+
font-size: var(--fs-btn);
|
|
431
|
+
font-weight: var(--fw-btn-strong);
|
|
432
|
+
}
|
|
433
|
+
</style>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<v-card class="mb-2 pa-2
|
|
2
|
+
<v-card class="chat-listcard screen-card mb-2 pa-2" elevation="0">
|
|
3
3
|
<v-row no-gutters align="center">
|
|
4
4
|
<v-col cols="12" sm="4" class="d-flex justify-center align-center">
|
|
5
5
|
<v-img
|
|
@@ -15,30 +15,30 @@
|
|
|
15
15
|
<v-col cols="12" sm="8" class="py-2 pe-1">
|
|
16
16
|
<v-row dense>
|
|
17
17
|
<v-col cols="12" class="d-flex align-center flex-wrap">
|
|
18
|
-
<span class="
|
|
18
|
+
<span class="chat-listcard__label me-1">Created by</span>
|
|
19
19
|
|
|
20
|
-
<v-avatar
|
|
20
|
+
<v-avatar class="chat-listcard__avatar me-1" size="20">
|
|
21
21
|
<v-img
|
|
22
22
|
v-if="userProfile"
|
|
23
23
|
:src="userProfile"
|
|
24
24
|
width="20"
|
|
25
25
|
height="20"
|
|
26
26
|
/>
|
|
27
|
-
<span v-else class="
|
|
27
|
+
<span v-else class="chat-listcard__initials">
|
|
28
28
|
{{ getNameInitials }}
|
|
29
29
|
</span>
|
|
30
30
|
</v-avatar>
|
|
31
31
|
|
|
32
|
-
<span class="
|
|
32
|
+
<span class="chat-listcard__cell">{{ createdByName || "Unknown" }}</span>
|
|
33
33
|
</v-col>
|
|
34
34
|
|
|
35
|
-
<v-col cols="12" class="
|
|
35
|
+
<v-col cols="12" class="chat-listcard__cell">Subject: {{ subject }}</v-col>
|
|
36
36
|
|
|
37
|
-
<v-col cols="12" class="
|
|
38
|
-
Status: <
|
|
37
|
+
<v-col cols="12" class="chat-listcard__cell d-flex align-center ga-1">
|
|
38
|
+
Status: <StatusChip :status="status" />
|
|
39
39
|
</v-col>
|
|
40
40
|
|
|
41
|
-
<v-col cols="12" class="
|
|
41
|
+
<v-col cols="12" class="chat-listcard__cell">
|
|
42
42
|
Date Created: {{ createdAt }}
|
|
43
43
|
</v-col>
|
|
44
44
|
</v-row>
|
|
@@ -60,3 +60,32 @@ defineProps({
|
|
|
60
60
|
getNameInitials: Function,
|
|
61
61
|
});
|
|
62
62
|
</script>
|
|
63
|
+
|
|
64
|
+
<style scoped>
|
|
65
|
+
.chat-listcard {
|
|
66
|
+
font-family: var(--font-sans);
|
|
67
|
+
color: var(--text);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.chat-listcard__cell,
|
|
71
|
+
.chat-listcard__label {
|
|
72
|
+
font-size: var(--fs-cell-dense);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.chat-listcard__label {
|
|
76
|
+
font-weight: 600;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/* Was `color="surface-variant"` with `text-overline` initials - 10px letters
|
|
80
|
+
with 1.6px tracking inside a 20px circle, which drew as one clipped glyph. */
|
|
81
|
+
.chat-listcard__avatar {
|
|
82
|
+
background: var(--hover);
|
|
83
|
+
color: var(--text2);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.chat-listcard__initials {
|
|
87
|
+
font-size: 9px;
|
|
88
|
+
font-weight: 700;
|
|
89
|
+
letter-spacing: 0;
|
|
90
|
+
}
|
|
91
|
+
</style>
|
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<v-sheet
|
|
3
|
-
elevation="
|
|
3
|
+
elevation="0"
|
|
4
4
|
rounded="0"
|
|
5
|
-
class="fill-height d-flex flex-column"
|
|
6
|
-
style="border-right: 1px solid #e0e0e0; border-top: 1px solid #e0e0e0"
|
|
5
|
+
class="chat-panel fill-height d-flex flex-column"
|
|
7
6
|
>
|
|
8
|
-
<div
|
|
9
|
-
<h3 class="
|
|
7
|
+
<div class="chat-panel__head px-4 pt-4 pb-2 mb-2">
|
|
8
|
+
<h3 class="screen-card-title">
|
|
10
9
|
{{ type === "workOrder" ? "Work Order" : "Feedback" }} Chat
|
|
11
10
|
</h3>
|
|
12
11
|
</div>
|
|
13
12
|
|
|
14
13
|
<v-sheet
|
|
15
|
-
class="overflow-y-auto flex-grow-1 pa-3"
|
|
14
|
+
class="chat-panel__thread overflow-y-auto flex-grow-1 pa-3"
|
|
16
15
|
:style="{ height: 'calc(100vh - 300px)', overflowX: 'hidden' }"
|
|
17
16
|
>
|
|
18
17
|
<v-row
|
|
@@ -35,10 +34,11 @@
|
|
|
35
34
|
</v-row>
|
|
36
35
|
</v-sheet>
|
|
37
36
|
|
|
38
|
-
<v-card class="mx-4 mb-4 mt-2 pa-3
|
|
37
|
+
<v-card class="screen-card mx-4 mb-4 mt-2 pa-3" elevation="0">
|
|
39
38
|
<v-row no-gutters align="end">
|
|
40
39
|
<v-col cols="10">
|
|
41
40
|
<v-textarea
|
|
41
|
+
class="filter-field"
|
|
42
42
|
label="Message"
|
|
43
43
|
auto-grow
|
|
44
44
|
hide-details
|
|
@@ -47,9 +47,7 @@
|
|
|
47
47
|
/>
|
|
48
48
|
</v-col>
|
|
49
49
|
<v-col cols="2" class="pl-2">
|
|
50
|
-
<v-btn
|
|
51
|
-
>Send</v-btn
|
|
52
|
-
>
|
|
50
|
+
<v-btn class="screen-btn-primary" variant="flat" block>Send</v-btn>
|
|
53
51
|
</v-col>
|
|
54
52
|
</v-row>
|
|
55
53
|
|
|
@@ -57,23 +55,27 @@
|
|
|
57
55
|
|
|
58
56
|
<v-row justify="start" no-gutters align="center">
|
|
59
57
|
<v-col cols="auto">
|
|
60
|
-
<v-icon size="20" class="mr-3">mdi-paperclip</v-icon>
|
|
58
|
+
<v-icon size="20" class="chat-panel__tool mr-3">mdi-paperclip</v-icon>
|
|
61
59
|
</v-col>
|
|
62
60
|
|
|
63
61
|
<v-col cols="auto">
|
|
64
|
-
<v-icon size="20" class="mr-3"
|
|
62
|
+
<v-icon size="20" class="chat-panel__tool mr-3"
|
|
63
|
+
>mdi-emoticon-happy-outline</v-icon
|
|
64
|
+
>
|
|
65
65
|
</v-col>
|
|
66
66
|
|
|
67
67
|
<v-col cols="auto">
|
|
68
68
|
<v-menu location="top" offset="10">
|
|
69
69
|
<template #activator="{ props }">
|
|
70
70
|
<v-btn icon v-bind="props" density="compact" variant="text">
|
|
71
|
-
<v-icon size="20"
|
|
71
|
+
<v-icon size="20" class="chat-panel__tool"
|
|
72
|
+
>mdi-message-outline</v-icon
|
|
73
|
+
>
|
|
72
74
|
</v-btn>
|
|
73
75
|
</template>
|
|
74
76
|
|
|
75
|
-
<v-card min-width="350" class="
|
|
76
|
-
<v-card-title class="
|
|
77
|
+
<v-card min-width="350" class="screen-card">
|
|
78
|
+
<v-card-title class="screen-card-title pb-1"
|
|
77
79
|
>Quick Chat</v-card-title
|
|
78
80
|
>
|
|
79
81
|
<v-divider class="mb-1" />
|
|
@@ -156,3 +158,27 @@ const selectQuickChat = (msg: string) => {
|
|
|
156
158
|
console.log("Quick Chat Selected:", msg);
|
|
157
159
|
};
|
|
158
160
|
</script>
|
|
161
|
+
|
|
162
|
+
<style scoped>
|
|
163
|
+
/* The panel's two rules were hard-coded `1px solid #e0e0e0`, which is a light-
|
|
164
|
+
theme hairline drawn on the dark theme as well. Same lines, on `--border`. */
|
|
165
|
+
.chat-panel {
|
|
166
|
+
background: var(--card);
|
|
167
|
+
border-right: 1px solid var(--border);
|
|
168
|
+
border-top: 1px solid var(--border);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.chat-panel__head {
|
|
172
|
+
border-bottom: 1px solid var(--border);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.chat-panel__thread {
|
|
176
|
+
background: var(--bg);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/* Was a bare icon and one `color="gray"` - not a token, and not the same tone
|
|
180
|
+
as the icon beside it. */
|
|
181
|
+
.chat-panel__tool {
|
|
182
|
+
color: var(--muted);
|
|
183
|
+
}
|
|
184
|
+
</style>
|
|
@@ -1,31 +1,24 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<v-sheet
|
|
3
|
-
|
|
4
|
-
rounded="0"
|
|
5
|
-
class="pa-4 fill-height"
|
|
6
|
-
style="border-right: 1px solid #e0e0e0; border-top: 1px solid #e0e0e0"
|
|
7
|
-
>
|
|
8
|
-
<h3 class="text-h6 mb-4">{{ title }}</h3>
|
|
2
|
+
<v-sheet elevation="0" rounded="0" class="chat-nav pa-4 fill-height">
|
|
3
|
+
<h3 class="screen-card-title mb-4">{{ title }}</h3>
|
|
9
4
|
|
|
10
5
|
<v-text-field
|
|
11
6
|
v-model="search"
|
|
12
7
|
@input="_search"
|
|
13
8
|
label="Search"
|
|
14
9
|
prepend-inner-icon="mdi-magnify"
|
|
15
|
-
density="compact"
|
|
16
10
|
hide-details
|
|
17
11
|
variant="outlined"
|
|
18
|
-
class="mb-4"
|
|
12
|
+
class="filter-field mb-4"
|
|
19
13
|
/>
|
|
20
14
|
|
|
21
15
|
<v-select
|
|
22
16
|
label="Filter by Status"
|
|
23
17
|
:items="['All', 'In Progress', 'To Do', 'Done']"
|
|
24
18
|
v-model="selectedStatus"
|
|
25
|
-
density="compact"
|
|
26
19
|
hide-details
|
|
27
20
|
variant="outlined"
|
|
28
|
-
class="mb-4"
|
|
21
|
+
class="filter-field mb-4"
|
|
29
22
|
/>
|
|
30
23
|
|
|
31
24
|
<v-row dense class="mb-4" align="center">
|
|
@@ -43,7 +36,7 @@
|
|
|
43
36
|
v-bind="props"
|
|
44
37
|
v-model="startDate"
|
|
45
38
|
label="Start Date"
|
|
46
|
-
|
|
39
|
+
class="filter-field"
|
|
47
40
|
variant="outlined"
|
|
48
41
|
readonly
|
|
49
42
|
hide-details
|
|
@@ -63,7 +56,7 @@
|
|
|
63
56
|
</v-col>
|
|
64
57
|
|
|
65
58
|
<v-col cols="2" class="d-flex align-center justify-center">
|
|
66
|
-
<span class="
|
|
59
|
+
<span class="chat-nav__to">to</span>
|
|
67
60
|
</v-col>
|
|
68
61
|
|
|
69
62
|
<v-col cols="5">
|
|
@@ -80,7 +73,7 @@
|
|
|
80
73
|
v-bind="props"
|
|
81
74
|
v-model="endDate"
|
|
82
75
|
label="End Date"
|
|
83
|
-
|
|
76
|
+
class="filter-field"
|
|
84
77
|
variant="outlined"
|
|
85
78
|
readonly
|
|
86
79
|
hide-details
|
|
@@ -101,7 +94,7 @@
|
|
|
101
94
|
</v-row>
|
|
102
95
|
|
|
103
96
|
<v-sheet
|
|
104
|
-
class="overflow-y-auto flex-grow-1 pa-3"
|
|
97
|
+
class="chat-nav__list overflow-y-auto flex-grow-1 pa-3"
|
|
105
98
|
:style="{ height: 'calc(100vh - 320px)', overflowX: 'hidden' }"
|
|
106
99
|
>
|
|
107
100
|
<v-row dense>
|
|
@@ -148,3 +141,22 @@ function _search() {
|
|
|
148
141
|
emit("search", search.value);
|
|
149
142
|
}
|
|
150
143
|
</script>
|
|
144
|
+
|
|
145
|
+
<style scoped>
|
|
146
|
+
/* Same two hard-coded #e0e0e0 hairlines the chat panel carried, on --border. */
|
|
147
|
+
.chat-nav {
|
|
148
|
+
background: var(--card);
|
|
149
|
+
border-right: 1px solid var(--border);
|
|
150
|
+
border-top: 1px solid var(--border);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.chat-nav__list {
|
|
154
|
+
background: var(--bg);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
.chat-nav__to {
|
|
158
|
+
font-family: var(--font-sans);
|
|
159
|
+
font-size: var(--fs-cell);
|
|
160
|
+
color: var(--muted);
|
|
161
|
+
}
|
|
162
|
+
</style>
|
|
@@ -58,12 +58,19 @@ const chatSkeletons = ref([
|
|
|
58
58
|
overflow-y: auto;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
+
/*
|
|
62
|
+
* `background-color: white` used to sit here and never applied: the footer
|
|
63
|
+
* carries `color="background"`, and Vuetify's `.bg-background` sets the
|
|
64
|
+
* background with `!important`. It is deleted rather than out-specified - the
|
|
65
|
+
* theme colour is the one that should win, and a literal white would have been
|
|
66
|
+
* wrong in the dark theme anyway. The border was a literal `#ddd` for the same
|
|
67
|
+
* reason and is now the shared rule colour.
|
|
68
|
+
*/
|
|
61
69
|
.chat-footer {
|
|
62
70
|
position: sticky;
|
|
63
71
|
bottom: 0;
|
|
64
72
|
width: 100%;
|
|
65
|
-
|
|
66
|
-
border-top: 1px solid #ddd;
|
|
73
|
+
border-top: 1px solid var(--border);
|
|
67
74
|
display: flex;
|
|
68
75
|
justify-content: center;
|
|
69
76
|
align-items: center;
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"
|
|
11
11
|
:disabled="readOnly"
|
|
12
12
|
size="small"
|
|
13
|
-
class="me-2"
|
|
13
|
+
class="me-2 checklist-action"
|
|
14
14
|
icon
|
|
15
15
|
@click.stop="handleReject"
|
|
16
16
|
>
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
"
|
|
28
28
|
:disabled="readOnly"
|
|
29
29
|
size="small"
|
|
30
|
+
class="checklist-action"
|
|
30
31
|
icon
|
|
31
32
|
@click.stop="handleApprove"
|
|
32
33
|
>
|
|
@@ -52,3 +53,26 @@ function handleApprove() {
|
|
|
52
53
|
emit("approve", props.item);
|
|
53
54
|
}
|
|
54
55
|
</script>
|
|
56
|
+
|
|
57
|
+
<style scoped>
|
|
58
|
+
/*
|
|
59
|
+
* The reject/approve pair is the design's bordered icon square (`.screen-icon-btn`
|
|
60
|
+
* geometry) rather than Vuetify's pill: 36px, `--r-inner`, `--border`.
|
|
61
|
+
*
|
|
62
|
+
* `color="error"` / `color="success"` are LEFT ALONE - unlike `--success`/`--error`,
|
|
63
|
+
* which are not CSS tokens, Vuetify's `success`/`error` theme names are mapped in
|
|
64
|
+
* `utils/theme.ts` to the design's `ok`/`err`, so the chosen state already paints
|
|
65
|
+
* the right tone. Only the un-chosen (outlined) state was factory Vuetify.
|
|
66
|
+
*/
|
|
67
|
+
.checklist-action.v-btn {
|
|
68
|
+
width: var(--icon-btn);
|
|
69
|
+
height: var(--icon-btn);
|
|
70
|
+
min-width: var(--icon-btn);
|
|
71
|
+
border-radius: var(--r-inner);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.checklist-action.v-btn--variant-outlined {
|
|
75
|
+
border: 1px solid var(--border);
|
|
76
|
+
color: var(--text2);
|
|
77
|
+
}
|
|
78
|
+
</style>
|
|
@@ -17,11 +17,7 @@
|
|
|
17
17
|
>
|
|
18
18
|
<template #extension>
|
|
19
19
|
<v-row no-gutters class="w-100 d-flex flex-column">
|
|
20
|
-
<
|
|
21
|
-
class="w-100 px-3 d-flex align-center ga-5 py-2"
|
|
22
|
-
flat
|
|
23
|
-
:height="60"
|
|
24
|
-
>
|
|
20
|
+
<div class="filter-bar">
|
|
25
21
|
<InputDateTimePicker
|
|
26
22
|
v-model:utc="startDate"
|
|
27
23
|
density="compact"
|
|
@@ -47,7 +43,7 @@
|
|
|
47
43
|
item-value="value"
|
|
48
44
|
label="Status"
|
|
49
45
|
/>
|
|
50
|
-
</
|
|
46
|
+
</div>
|
|
51
47
|
</v-row>
|
|
52
48
|
</template>
|
|
53
49
|
|
|
@@ -60,25 +56,23 @@
|
|
|
60
56
|
: ""
|
|
61
57
|
}}
|
|
62
58
|
</template>
|
|
59
|
+
<!--
|
|
60
|
+
A countdown, not a status word, so it passes the tone the screen has
|
|
61
|
+
already worked out from the time left rather than a word to map.
|
|
62
|
+
-->
|
|
63
63
|
<template #item.closeIn="{ item }">
|
|
64
|
-
<
|
|
64
|
+
<StatusChip
|
|
65
65
|
class="text-capitalize"
|
|
66
|
-
|
|
67
|
-
:
|
|
68
|
-
|
|
69
|
-
>
|
|
70
|
-
{{ remainingTime[item._id] || "00h 00m" }}
|
|
71
|
-
</v-chip>
|
|
66
|
+
:tone="getCloseInTone(item._id)"
|
|
67
|
+
:label="remainingTime[item._id] || '00h 00m'"
|
|
68
|
+
/>
|
|
72
69
|
</template>
|
|
73
70
|
<template #item.status="{ value }">
|
|
74
|
-
<
|
|
71
|
+
<StatusChip
|
|
75
72
|
class="text-capitalize"
|
|
76
|
-
:
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
>
|
|
80
|
-
{{ value || "No Status" }}
|
|
81
|
-
</v-chip>
|
|
73
|
+
:status="value"
|
|
74
|
+
:label="value || 'No Status'"
|
|
75
|
+
/>
|
|
82
76
|
</template>
|
|
83
77
|
<template #item.completedAt="{ value }">
|
|
84
78
|
{{
|
|
@@ -104,11 +98,15 @@
|
|
|
104
98
|
</template>
|
|
105
99
|
</TableMain>
|
|
106
100
|
<div v-else class="pa-4">
|
|
107
|
-
|
|
108
|
-
|
|
101
|
+
<!--
|
|
102
|
+
Was an outlined `v-card` painted from Vuetify's own `surface`. The
|
|
103
|
+
design's card, and the notice at the design's cell size.
|
|
104
|
+
-->
|
|
105
|
+
<AppCard class="pa-4">
|
|
106
|
+
<div class="cs-no-permission">
|
|
109
107
|
You do not have permission to view cleaning schedules.
|
|
110
108
|
</div>
|
|
111
|
-
</
|
|
109
|
+
</AppCard>
|
|
112
110
|
</div>
|
|
113
111
|
</v-col>
|
|
114
112
|
</v-row>
|
|
@@ -159,33 +157,22 @@ const downloadingId = ref<string | null>(null);
|
|
|
159
157
|
const { getCleaningSchedules, downloadChecklistPdf } = useCleaningSchedules();
|
|
160
158
|
const { formatDate } = useUtils();
|
|
161
159
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
case "accepted":
|
|
174
|
-
return "success";
|
|
175
|
-
case "closed":
|
|
176
|
-
case "rejected":
|
|
177
|
-
return "error";
|
|
178
|
-
default:
|
|
179
|
-
return "secondary";
|
|
180
|
-
}
|
|
181
|
-
};
|
|
182
|
-
|
|
183
|
-
const getCloseInColor = (id: string): string => {
|
|
160
|
+
/**
|
|
161
|
+
* The status word now picks its own colour, from the one shared mapping in
|
|
162
|
+
* `utils/status.ts` - which carries every word this screen used to switch on,
|
|
163
|
+
* with the tone it used to give it. The screen no longer keeps a private
|
|
164
|
+
* palette that only it agrees with.
|
|
165
|
+
*
|
|
166
|
+
* The countdown is not a status word, so the thresholds stay here; only the
|
|
167
|
+
* NAMES change, from Vuetify colours to the design's tones. Same three bands,
|
|
168
|
+
* same boundaries.
|
|
169
|
+
*/
|
|
170
|
+
const getCloseInTone = (id: string): "info" | "warn" | "err" => {
|
|
184
171
|
const secs = remainingSeconds.value[id];
|
|
185
|
-
if (secs === undefined) return "
|
|
186
|
-
if (secs <= 0) return "
|
|
187
|
-
if (secs < 3 * 3600) return "
|
|
188
|
-
return "
|
|
172
|
+
if (secs === undefined) return "info";
|
|
173
|
+
if (secs <= 0) return "err";
|
|
174
|
+
if (secs < 3 * 3600) return "warn";
|
|
175
|
+
return "info";
|
|
189
176
|
};
|
|
190
177
|
|
|
191
178
|
const canDownloadSchedule = computed(() => props.canDownloadSchedule);
|
|
@@ -344,3 +331,11 @@ function showMessage(msg: string, color: string = "error") {
|
|
|
344
331
|
}
|
|
345
332
|
}
|
|
346
333
|
</script>
|
|
334
|
+
|
|
335
|
+
<style scoped>
|
|
336
|
+
.cs-no-permission {
|
|
337
|
+
font-family: var(--font-sans);
|
|
338
|
+
font-size: var(--fs-cell);
|
|
339
|
+
color: var(--muted);
|
|
340
|
+
}
|
|
341
|
+
</style>
|