@7365admin1/layer-common 4.136.0 → 4.137.0
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 +10 -4
- package/assets/css/primitives.css +54 -11
- package/assets/css/screens.css +3 -3
- package/assets/css/tokens.css +17 -12
- package/components/AnprCameraBadge.vue +1 -1
- package/components/CameraWall.vue +7 -7
- package/components/CameraWallTile.vue +8 -8
- package/components/Chat/ListCard.vue +1 -1
- package/components/CleaningScheduleMain.vue +56 -20
- package/components/ClientMain.vue +1 -1
- package/components/ClientSubscriptionForm.vue +1 -1
- package/components/DashboardMain.vue +13 -13
- package/components/HidAccessLogDashboard.vue +3 -3
- package/components/HidIntercomManagement.vue +14 -14
- package/components/HidQrCodeConfiguration.vue +3 -3
- package/components/HidReaderManagement.vue +1 -1
- package/components/InventoryPhotoThumbs.vue +1 -1
- package/components/Layout/Header.vue +2 -2
- package/components/Layout/NavigationDrawer.vue +1 -1
- package/components/Nfc/NFCRouteScheduleTimes.vue +1 -1
- package/components/PlateNumberDisplay.vue +1 -1
- package/components/ScheduleAreaMain.vue +6 -9
- package/components/ScheduleGuide.vue +101 -0
- package/components/ScheduleTaskForm.vue +88 -7
- package/components/ScheduleTaskMain.vue +163 -56
- package/components/StatusChip.vue +1 -1
- package/components/VisitorsReportPreview.vue +2 -2
- package/package.json +1 -1
- package/utils/breadcrumb.ts +7 -0
- package/utils/nav-sections.ts +2 -0
- package/utils/schedule-task.ts +106 -23
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @iservice365/layer-common
|
|
2
2
|
|
|
3
|
+
## 4.137.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 5e44e4e: Schedule screens explain themselves (How it works panels, worked example, status meanings, plain row sentences, Extend or repeat, link to the day's checklist, staff preview) and readable text sizes across every screen (body/table 15px, secondary at least 13px).
|
|
8
|
+
|
|
3
9
|
## 4.136.0
|
|
4
10
|
|
|
5
11
|
### Minor Changes
|
|
@@ -3371,11 +3377,11 @@ Monthly report: a month that had patrols opens the list of that month's patrol r
|
|
|
3371
3377
|
`utils/console-tier.ts` + `composables/useConsoleTier.ts` mirror the server's
|
|
3372
3378
|
own rule from two endpoints the console already calls, unprojected:
|
|
3373
3379
|
|
|
3374
|
-
|
|
3375
|
-
|
|
3380
|
+
GET /api/members/user/:user/app/admin the Seven365 staff membership
|
|
3381
|
+
GET /api/roles/id/:role that membership's role document
|
|
3376
3382
|
|
|
3377
|
-
|
|
3378
|
-
|
|
3383
|
+
owner = member.type === "admin" && role.type === "admin" && role.default === true
|
|
3384
|
+
staff = member.type === "admin" && role.type === "admin"
|
|
3379
3385
|
|
|
3380
3386
|
`role.default` is the marker because it is the only property of a platform
|
|
3381
3387
|
staff role no API caller can set - `role.controller.ts` validates create and
|
|
@@ -195,7 +195,7 @@
|
|
|
195
195
|
align-items: center;
|
|
196
196
|
gap: 5px;
|
|
197
197
|
margin-top: 4px;
|
|
198
|
-
font-size:
|
|
198
|
+
font-size: 13.5px;
|
|
199
199
|
font-weight: 600;
|
|
200
200
|
color: var(--muted);
|
|
201
201
|
}
|
|
@@ -268,7 +268,7 @@
|
|
|
268
268
|
}
|
|
269
269
|
|
|
270
270
|
.app-toolbar__count {
|
|
271
|
-
font-size:
|
|
271
|
+
font-size: 13.5px;
|
|
272
272
|
font-weight: 600;
|
|
273
273
|
color: var(--muted);
|
|
274
274
|
font-variant-numeric: tabular-nums;
|
|
@@ -336,7 +336,7 @@
|
|
|
336
336
|
align-items: center;
|
|
337
337
|
padding: var(--cellpad) var(--cellpad-x);
|
|
338
338
|
border-top: 1px solid var(--border);
|
|
339
|
-
font-size:
|
|
339
|
+
font-size: 14px;
|
|
340
340
|
font-weight: 600;
|
|
341
341
|
color: var(--text);
|
|
342
342
|
}
|
|
@@ -371,7 +371,7 @@
|
|
|
371
371
|
gap: 8px;
|
|
372
372
|
padding: 52px var(--cellpad-x);
|
|
373
373
|
border-top: 1px solid var(--border);
|
|
374
|
-
font-size:
|
|
374
|
+
font-size: 14px;
|
|
375
375
|
font-weight: 600;
|
|
376
376
|
color: var(--muted);
|
|
377
377
|
text-align: center;
|
|
@@ -605,7 +605,7 @@ button.app-btn--err {
|
|
|
605
605
|
}
|
|
606
606
|
|
|
607
607
|
.app-field__label {
|
|
608
|
-
font-size:
|
|
608
|
+
font-size: 13px;
|
|
609
609
|
font-weight: 600;
|
|
610
610
|
color: var(--muted);
|
|
611
611
|
white-space: nowrap;
|
|
@@ -928,7 +928,7 @@ select option {
|
|
|
928
928
|
background: transparent;
|
|
929
929
|
color: var(--muted);
|
|
930
930
|
font-family: inherit;
|
|
931
|
-
font-size:
|
|
931
|
+
font-size: 13.5px;
|
|
932
932
|
font-weight: 700;
|
|
933
933
|
line-height: 1.2;
|
|
934
934
|
white-space: nowrap;
|
|
@@ -1055,7 +1055,7 @@ select option {
|
|
|
1055
1055
|
padding-inline-start: 12px;
|
|
1056
1056
|
color: var(--text2);
|
|
1057
1057
|
font-family: var(--font-sans);
|
|
1058
|
-
font-size:
|
|
1058
|
+
font-size: 14.5px;
|
|
1059
1059
|
font-weight: 700;
|
|
1060
1060
|
opacity: 1;
|
|
1061
1061
|
}
|
|
@@ -1136,7 +1136,7 @@ select option {
|
|
|
1136
1136
|
align-items: center;
|
|
1137
1137
|
padding: 3px 8px;
|
|
1138
1138
|
border-radius: 999px;
|
|
1139
|
-
font-size:
|
|
1139
|
+
font-size: 13px;
|
|
1140
1140
|
font-weight: 800;
|
|
1141
1141
|
line-height: 1.2;
|
|
1142
1142
|
background: var(--ok-bg);
|
|
@@ -1150,7 +1150,7 @@ select option {
|
|
|
1150
1150
|
|
|
1151
1151
|
.app-kpi__sub {
|
|
1152
1152
|
margin-top: 6px;
|
|
1153
|
-
font-size:
|
|
1153
|
+
font-size: 13.5px;
|
|
1154
1154
|
font-weight: 600;
|
|
1155
1155
|
color: var(--muted);
|
|
1156
1156
|
}
|
|
@@ -1208,7 +1208,7 @@ select option {
|
|
|
1208
1208
|
|
|
1209
1209
|
.v-data-table__td-title {
|
|
1210
1210
|
color: var(--muted);
|
|
1211
|
-
font-size:
|
|
1211
|
+
font-size: 13px;
|
|
1212
1212
|
}
|
|
1213
1213
|
|
|
1214
1214
|
.v-data-table__td-value {
|
|
@@ -1241,7 +1241,7 @@ select option {
|
|
|
1241
1241
|
/* ------------------------------------------------------------------ */
|
|
1242
1242
|
.app-input-label {
|
|
1243
1243
|
font-family: var(--font-sans);
|
|
1244
|
-
font-size:
|
|
1244
|
+
font-size: 13.5px;
|
|
1245
1245
|
font-weight: 700;
|
|
1246
1246
|
letter-spacing: 0;
|
|
1247
1247
|
color: var(--text);
|
|
@@ -1251,3 +1251,46 @@ select option {
|
|
|
1251
1251
|
.app-input-label__req {
|
|
1252
1252
|
color: var(--err);
|
|
1253
1253
|
}
|
|
1254
|
+
|
|
1255
|
+
/* ------------------------------------------------------------------ */
|
|
1256
|
+
/* READABLE TEXT FLOOR (owner 21 Oct 2026: "the font size is too small"). */
|
|
1257
|
+
/* ------------------------------------------------------------------ */
|
|
1258
|
+
/*
|
|
1259
|
+
* Vuetify's stock small sizes, raised once here so every screen in every app
|
|
1260
|
+
* follows without per-page edits: captions, field hints/errors, small chips
|
|
1261
|
+
* and buttons, table footers and list subtitles. Body/table text is 15px via
|
|
1262
|
+
* the tokens; secondary text is at least 13px; nothing is under 12px.
|
|
1263
|
+
* `!important` only where Vuetify's own rule is a utility (`.text-caption`)
|
|
1264
|
+
* or outranks a single class.
|
|
1265
|
+
*/
|
|
1266
|
+
.text-caption {
|
|
1267
|
+
font-size: 13px !important;
|
|
1268
|
+
line-height: 1.4 !important;
|
|
1269
|
+
}
|
|
1270
|
+
.text-overline {
|
|
1271
|
+
font-size: 12px !important;
|
|
1272
|
+
}
|
|
1273
|
+
.v-messages,
|
|
1274
|
+
.v-messages__message {
|
|
1275
|
+
font-size: 13px;
|
|
1276
|
+
line-height: 1.35;
|
|
1277
|
+
}
|
|
1278
|
+
.v-chip.v-chip--size-small {
|
|
1279
|
+
font-size: 13px;
|
|
1280
|
+
}
|
|
1281
|
+
.v-chip.v-chip--size-x-small {
|
|
1282
|
+
font-size: 12px;
|
|
1283
|
+
}
|
|
1284
|
+
.v-btn.v-btn--size-small {
|
|
1285
|
+
font-size: 13px;
|
|
1286
|
+
}
|
|
1287
|
+
.v-btn.v-btn--size-x-small {
|
|
1288
|
+
font-size: 12px;
|
|
1289
|
+
}
|
|
1290
|
+
.v-data-table-footer,
|
|
1291
|
+
.v-data-table-footer .v-field__input {
|
|
1292
|
+
font-size: 13.5px;
|
|
1293
|
+
}
|
|
1294
|
+
.v-list-item-subtitle {
|
|
1295
|
+
font-size: 14px;
|
|
1296
|
+
}
|
package/assets/css/screens.css
CHANGED
|
@@ -656,7 +656,7 @@
|
|
|
656
656
|
}
|
|
657
657
|
|
|
658
658
|
.table-card__range {
|
|
659
|
-
font-size:
|
|
659
|
+
font-size: 13px;
|
|
660
660
|
font-weight: 600;
|
|
661
661
|
color: var(--muted);
|
|
662
662
|
font-variant-numeric: tabular-nums;
|
|
@@ -1233,7 +1233,7 @@
|
|
|
1233
1233
|
justify-content: center;
|
|
1234
1234
|
pointer-events: none;
|
|
1235
1235
|
font-family: var(--font-sans);
|
|
1236
|
-
font-size:
|
|
1236
|
+
font-size: 13.5px;
|
|
1237
1237
|
font-weight: 600;
|
|
1238
1238
|
letter-spacing: 0;
|
|
1239
1239
|
color: rgb(139, 143, 152); /* light `--muted` - the pad is paper */
|
|
@@ -1241,7 +1241,7 @@
|
|
|
1241
1241
|
|
|
1242
1242
|
.screen-signpad__label {
|
|
1243
1243
|
font-family: var(--font-sans);
|
|
1244
|
-
font-size:
|
|
1244
|
+
font-size: 13.5px;
|
|
1245
1245
|
font-weight: 600;
|
|
1246
1246
|
letter-spacing: 0;
|
|
1247
1247
|
color: var(--muted);
|
package/assets/css/tokens.css
CHANGED
|
@@ -122,41 +122,46 @@
|
|
|
122
122
|
--font-sans: "Manrope", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
|
|
123
123
|
"Helvetica Neue", Arial, sans-serif;
|
|
124
124
|
|
|
125
|
-
/*
|
|
126
|
-
|
|
125
|
+
/*
|
|
126
|
+
* Type scale. Raised 21 Oct 2026 (owner: "most of the pages the font size is
|
|
127
|
+
* too small"): body and table text 15px, secondary text at least 13px,
|
|
128
|
+
* nothing under 12px. Was h1 22 / card 15.5 / head 11 / cell 13.5 / dense 13 /
|
|
129
|
+
* nav 13 / section 10.5 / btn 13.5 / chip 11.5 / chip-lg 12 / crumb 12.5.
|
|
130
|
+
*/
|
|
131
|
+
--fs-h1: 24px;
|
|
127
132
|
--fw-h1: 800;
|
|
128
133
|
--ls-h1: -0.01em;
|
|
129
134
|
|
|
130
|
-
--fs-card-title:
|
|
135
|
+
--fs-card-title: 16.5px;
|
|
131
136
|
--fw-card-title: 800;
|
|
132
137
|
|
|
133
138
|
--fs-kpi: 30px;
|
|
134
139
|
--fw-kpi: 800;
|
|
135
140
|
--ls-kpi: -0.02em;
|
|
136
141
|
|
|
137
|
-
--fs-table-head:
|
|
142
|
+
--fs-table-head: 12.5px;
|
|
138
143
|
--fw-table-head: 800;
|
|
139
144
|
--ls-table-head: 0.07em;
|
|
140
145
|
|
|
141
|
-
--fs-cell:
|
|
146
|
+
--fs-cell: 15px;
|
|
142
147
|
--fw-cell: 600;
|
|
143
|
-
--fs-cell-dense:
|
|
148
|
+
--fs-cell-dense: 14px;
|
|
144
149
|
|
|
145
|
-
--fs-nav:
|
|
150
|
+
--fs-nav: 14px;
|
|
146
151
|
|
|
147
|
-
--fs-section-label:
|
|
152
|
+
--fs-section-label: 12px;
|
|
148
153
|
--fw-section-label: 800;
|
|
149
154
|
--ls-section-label: 0.09em;
|
|
150
155
|
|
|
151
|
-
--fs-btn:
|
|
156
|
+
--fs-btn: 14px;
|
|
152
157
|
--fw-btn: 700;
|
|
153
158
|
--fw-btn-strong: 800;
|
|
154
159
|
|
|
155
|
-
--fs-chip:
|
|
156
|
-
--fs-chip-lg:
|
|
160
|
+
--fs-chip: 13px;
|
|
161
|
+
--fs-chip-lg: 13px;
|
|
157
162
|
--fw-chip: 700;
|
|
158
163
|
|
|
159
|
-
--fs-breadcrumb:
|
|
164
|
+
--fs-breadcrumb: 13.5px;
|
|
160
165
|
|
|
161
166
|
/* Shape */
|
|
162
167
|
--r-card: 14px;
|
|
@@ -179,7 +179,7 @@ const isBlocked = computed(() => props.cameras?.some((c) => c.list === "blocked"
|
|
|
179
179
|
border: 1px solid var(--border);
|
|
180
180
|
background: var(--card);
|
|
181
181
|
color: var(--text);
|
|
182
|
-
font-size:
|
|
182
|
+
font-size: 12px;
|
|
183
183
|
line-height: 18px;
|
|
184
184
|
cursor: pointer;
|
|
185
185
|
}
|
|
@@ -983,7 +983,7 @@ async function toggleFullscreen() {
|
|
|
983
983
|
justify-content: space-between;
|
|
984
984
|
gap: 6px;
|
|
985
985
|
margin: 6px 0 0;
|
|
986
|
-
font-size:
|
|
986
|
+
font-size: 12px;
|
|
987
987
|
}
|
|
988
988
|
.vms__picker-range {
|
|
989
989
|
color: var(--vms-text-dim);
|
|
@@ -999,7 +999,7 @@ async function toggleFullscreen() {
|
|
|
999
999
|
align-items: center;
|
|
1000
1000
|
justify-content: space-between;
|
|
1001
1001
|
margin: 0 0 6px;
|
|
1002
|
-
font-size:
|
|
1002
|
+
font-size: 12px;
|
|
1003
1003
|
letter-spacing: 0.06em;
|
|
1004
1004
|
text-transform: uppercase;
|
|
1005
1005
|
color: var(--vms-text-dim);
|
|
@@ -1008,7 +1008,7 @@ async function toggleFullscreen() {
|
|
|
1008
1008
|
.vms__picker-empty,
|
|
1009
1009
|
.vms__picker-note {
|
|
1010
1010
|
margin: 6px 0 0;
|
|
1011
|
-
font-size:
|
|
1011
|
+
font-size: 12px;
|
|
1012
1012
|
line-height: 15px;
|
|
1013
1013
|
color: var(--vms-text-dim);
|
|
1014
1014
|
}
|
|
@@ -1017,7 +1017,7 @@ async function toggleFullscreen() {
|
|
|
1017
1017
|
background: none;
|
|
1018
1018
|
border: none;
|
|
1019
1019
|
color: var(--vms-accent);
|
|
1020
|
-
font-size:
|
|
1020
|
+
font-size: 12px;
|
|
1021
1021
|
cursor: pointer;
|
|
1022
1022
|
padding: 0;
|
|
1023
1023
|
text-transform: none;
|
|
@@ -1186,7 +1186,7 @@ async function toggleFullscreen() {
|
|
|
1186
1186
|
*/
|
|
1187
1187
|
.vms__caps-head {
|
|
1188
1188
|
margin: 0 0 6px;
|
|
1189
|
-
font-size:
|
|
1189
|
+
font-size: 12px;
|
|
1190
1190
|
letter-spacing: 0.06em;
|
|
1191
1191
|
text-transform: uppercase;
|
|
1192
1192
|
color: var(--vms-text-dim);
|
|
@@ -1238,7 +1238,7 @@ async function toggleFullscreen() {
|
|
|
1238
1238
|
}
|
|
1239
1239
|
|
|
1240
1240
|
.vms__cap-tag {
|
|
1241
|
-
font-size:
|
|
1241
|
+
font-size: 12px;
|
|
1242
1242
|
font-weight: 400;
|
|
1243
1243
|
padding: 1px 6px;
|
|
1244
1244
|
border-radius: var(--vms-radius);
|
|
@@ -1266,7 +1266,7 @@ async function toggleFullscreen() {
|
|
|
1266
1266
|
margin: 6px 0 0;
|
|
1267
1267
|
padding-top: 6px;
|
|
1268
1268
|
border-top: 1px solid var(--vms-line);
|
|
1269
|
-
font-size:
|
|
1269
|
+
font-size: 12px;
|
|
1270
1270
|
line-height: 16px;
|
|
1271
1271
|
color: var(--vms-text-dim);
|
|
1272
1272
|
}
|
|
@@ -606,7 +606,7 @@ async function toggleFullscreen() {
|
|
|
606
606
|
}
|
|
607
607
|
|
|
608
608
|
.vms-tile--dense .vms-tile__reason {
|
|
609
|
-
font-size:
|
|
609
|
+
font-size: 12px;
|
|
610
610
|
line-height: 15px;
|
|
611
611
|
}
|
|
612
612
|
|
|
@@ -659,7 +659,7 @@ async function toggleFullscreen() {
|
|
|
659
659
|
|
|
660
660
|
.vms-tile__state {
|
|
661
661
|
color: var(--vms-text, #e8ecf1);
|
|
662
|
-
font-size:
|
|
662
|
+
font-size: 12px;
|
|
663
663
|
line-height: 14px;
|
|
664
664
|
white-space: nowrap;
|
|
665
665
|
}
|
|
@@ -673,7 +673,7 @@ async function toggleFullscreen() {
|
|
|
673
673
|
}
|
|
674
674
|
|
|
675
675
|
.vms-tile--dense .vms-tile__state {
|
|
676
|
-
font-size:
|
|
676
|
+
font-size: 12px;
|
|
677
677
|
line-height: 13px;
|
|
678
678
|
}
|
|
679
679
|
|
|
@@ -715,7 +715,7 @@ async function toggleFullscreen() {
|
|
|
715
715
|
border-radius: var(--vms-radius, 3px);
|
|
716
716
|
background: var(--vms-scrim, rgba(7, 9, 12, 0.62));
|
|
717
717
|
color: var(--vms-text-dim, #94a0b0);
|
|
718
|
-
font-size:
|
|
718
|
+
font-size: 12px;
|
|
719
719
|
line-height: 15px;
|
|
720
720
|
white-space: nowrap;
|
|
721
721
|
overflow: hidden;
|
|
@@ -723,7 +723,7 @@ async function toggleFullscreen() {
|
|
|
723
723
|
}
|
|
724
724
|
|
|
725
725
|
.vms-tile--dense .vms-tile__health {
|
|
726
|
-
font-size:
|
|
726
|
+
font-size: 12px;
|
|
727
727
|
line-height: 14px;
|
|
728
728
|
}
|
|
729
729
|
|
|
@@ -752,7 +752,7 @@ async function toggleFullscreen() {
|
|
|
752
752
|
padding: 1px 6px;
|
|
753
753
|
border-radius: var(--vms-radius, 3px);
|
|
754
754
|
background: var(--vms-scrim, rgba(7, 9, 12, 0.62));
|
|
755
|
-
font-size:
|
|
755
|
+
font-size: 12px;
|
|
756
756
|
line-height: 15px;
|
|
757
757
|
/* The row is click-through; this one control is not. */
|
|
758
758
|
pointer-events: auto;
|
|
@@ -768,7 +768,7 @@ async function toggleFullscreen() {
|
|
|
768
768
|
border: none;
|
|
769
769
|
padding: 2px 2px;
|
|
770
770
|
color: var(--vms-accent, #5b9be0);
|
|
771
|
-
font-size:
|
|
771
|
+
font-size: 12px;
|
|
772
772
|
line-height: 15px;
|
|
773
773
|
cursor: pointer;
|
|
774
774
|
}
|
|
@@ -791,7 +791,7 @@ async function toggleFullscreen() {
|
|
|
791
791
|
}
|
|
792
792
|
|
|
793
793
|
.vms-tile--dense .vms-tile__name {
|
|
794
|
-
font-size:
|
|
794
|
+
font-size: 12px;
|
|
795
795
|
line-height: 15px;
|
|
796
796
|
}
|
|
797
797
|
|
|
@@ -7,8 +7,42 @@
|
|
|
7
7
|
:site="site"
|
|
8
8
|
:service-type="serviceType"
|
|
9
9
|
:schedule-route="scheduleRoute"
|
|
10
|
-
text="
|
|
11
|
-
|
|
10
|
+
text="The app makes a new checklist for every area automatically each midnight. Staff tick off each unit on their mobile app; you follow progress here."
|
|
11
|
+
how-title="How the Daily Checklist works"
|
|
12
|
+
how-key="daily-checklist"
|
|
13
|
+
>
|
|
14
|
+
<ol class="sg-steps">
|
|
15
|
+
<li>
|
|
16
|
+
Every midnight a new row appears here for the day. It holds every
|
|
17
|
+
area, with as many visits as the area's "visits per day", plus
|
|
18
|
+
any <strong>Extra Visits</strong> set for that day.
|
|
19
|
+
</li>
|
|
20
|
+
<li>
|
|
21
|
+
Staff open the same list in their mobile app and tick each unit
|
|
22
|
+
when it is done (a photo is needed to finish a visit).
|
|
23
|
+
</li>
|
|
24
|
+
<li>
|
|
25
|
+
<strong>Closes in</strong> counts down to midnight. When it
|
|
26
|
+
reaches zero the day's list closes: it becomes view-only, and any
|
|
27
|
+
unit not ticked counts as <strong>Missed</strong>.
|
|
28
|
+
</li>
|
|
29
|
+
<li>
|
|
30
|
+
Click a row to see its areas, then an area to see each unit,
|
|
31
|
+
send a unit back (<strong>Needs redo</strong>) or add a remark.
|
|
32
|
+
</li>
|
|
33
|
+
<li>
|
|
34
|
+
<strong>Download PDF</strong> saves that day's report - every
|
|
35
|
+
area, unit, who ticked it and when - to send to your client.
|
|
36
|
+
</li>
|
|
37
|
+
</ol>
|
|
38
|
+
<div class="sg-h">What the status words mean</div>
|
|
39
|
+
<dl class="sg-legend">
|
|
40
|
+
<template v-for="h in DAILY_STATUS_HELP" :key="h.word">
|
|
41
|
+
<dt><StatusChip :status="h.word" :label="h.word" /></dt>
|
|
42
|
+
<dd>{{ h.meaning }}</dd>
|
|
43
|
+
</template>
|
|
44
|
+
</dl>
|
|
45
|
+
</ScheduleGuide>
|
|
12
46
|
<TableMain
|
|
13
47
|
v-if="canViewSchedules"
|
|
14
48
|
:title="pageTitle"
|
|
@@ -24,10 +58,11 @@
|
|
|
24
58
|
>
|
|
25
59
|
<template #no-data>
|
|
26
60
|
<div class="cs-empty">
|
|
27
|
-
<strong>No daily
|
|
61
|
+
<strong>No daily checklists here yet.</strong>
|
|
28
62
|
<span>
|
|
29
|
-
A
|
|
30
|
-
and Units are set up.
|
|
63
|
+
A checklist is made automatically every midnight once your Areas
|
|
64
|
+
and Units are set up. If you filtered by date or status, clear
|
|
65
|
+
the filter to see every day.
|
|
31
66
|
</span>
|
|
32
67
|
</div>
|
|
33
68
|
</template>
|
|
@@ -122,7 +157,7 @@
|
|
|
122
157
|
@click.stop="downloadItem(item)"
|
|
123
158
|
>
|
|
124
159
|
<v-icon left>mdi-download</v-icon>
|
|
125
|
-
Download
|
|
160
|
+
Download PDF
|
|
126
161
|
</v-btn>
|
|
127
162
|
</template>
|
|
128
163
|
</TableMain>
|
|
@@ -133,7 +168,8 @@
|
|
|
133
168
|
-->
|
|
134
169
|
<AppCard class="pa-4">
|
|
135
170
|
<div class="cs-no-permission">
|
|
136
|
-
You do not have permission to view
|
|
171
|
+
You do not have permission to view the Daily Checklist. Ask your
|
|
172
|
+
administrator to give your role access to it.
|
|
137
173
|
</div>
|
|
138
174
|
</AppCard>
|
|
139
175
|
</div>
|
|
@@ -149,9 +185,10 @@
|
|
|
149
185
|
<script lang="ts" setup>
|
|
150
186
|
import useCleaningSchedules from "../composables/useCleaningSchedules";
|
|
151
187
|
import {
|
|
188
|
+
DAILY_STATUS_HELP,
|
|
189
|
+
dailyChecklistTitle,
|
|
152
190
|
dailyStatusLabel,
|
|
153
191
|
hasListForToday,
|
|
154
|
-
scheduleNameFor,
|
|
155
192
|
} from "../utils/schedule-task";
|
|
156
193
|
import useUtils from "../composables/useUtils";
|
|
157
194
|
|
|
@@ -168,20 +205,19 @@ const props = defineProps({
|
|
|
168
205
|
canGenerateChecklist: { type: Boolean, default: false },
|
|
169
206
|
});
|
|
170
207
|
|
|
171
|
-
// "Daily
|
|
172
|
-
const pageTitle =
|
|
173
|
-
/ Schedule$/,
|
|
174
|
-
"",
|
|
175
|
-
)}`;
|
|
208
|
+
// "Daily Checklist – Cleaning" / "– Landscape" / "– Pest" / "– Pool" / "– Technician"
|
|
209
|
+
const pageTitle = dailyChecklistTitle(props.serviceType);
|
|
176
210
|
|
|
177
|
-
|
|
178
|
-
const
|
|
211
|
+
// `?date=YYYY-MM-DD` (from an Extra Visit's "See that day's checklist") opens on that one day.
|
|
212
|
+
const linkedDay = String(useRoute().query.date ?? "");
|
|
213
|
+
const startDate = ref(/^\d{4}-\d{2}-\d{2}$/.test(linkedDay) ? linkedDay : "");
|
|
214
|
+
const endDate = ref(startDate.value);
|
|
179
215
|
const status = ref<TScheduleAreaStatus>("all");
|
|
180
216
|
const statusOptions = [
|
|
181
217
|
{ title: "All", value: "all" },
|
|
182
|
-
{ title: "
|
|
218
|
+
{ title: "Not started", value: "open" },
|
|
183
219
|
{ title: "In progress", value: "ongoing" },
|
|
184
|
-
{ title: "
|
|
220
|
+
{ title: "Done", value: "completed" },
|
|
185
221
|
{ title: "Closed", value: "closed" },
|
|
186
222
|
] as const;
|
|
187
223
|
|
|
@@ -191,10 +227,10 @@ const pages = ref(0);
|
|
|
191
227
|
const pageRange = ref("-- - -- of --");
|
|
192
228
|
|
|
193
229
|
const headers = [
|
|
194
|
-
{ title: "
|
|
195
|
-
{ title: "
|
|
230
|
+
{ title: "Day", value: "createdAt" },
|
|
231
|
+
{ title: "Closes in", value: "closeIn" },
|
|
196
232
|
{ title: "Status", value: "status" },
|
|
197
|
-
{ title: "
|
|
233
|
+
{ title: "Finished on", value: "completedAt" },
|
|
198
234
|
{ title: "", value: "download" },
|
|
199
235
|
];
|
|
200
236
|
const remainingTime = ref({} as Record<string, string>);
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
:y="label.y"
|
|
70
70
|
text-anchor="end"
|
|
71
71
|
alignment-baseline="middle"
|
|
72
|
-
style="fill: #64748b; font-size:
|
|
72
|
+
style="fill: #64748b; font-size: 12px; font-weight: 500"
|
|
73
73
|
>
|
|
74
74
|
{{ label.text }}
|
|
75
75
|
</text>
|
|
@@ -471,7 +471,7 @@
|
|
|
471
471
|
:y="label.y"
|
|
472
472
|
text-anchor="end"
|
|
473
473
|
alignment-baseline="middle"
|
|
474
|
-
style="fill: rgba(var(--v-theme-on-surface), var(--v-medium-emphasis-opacity)); font-size:
|
|
474
|
+
style="fill: rgba(var(--v-theme-on-surface), var(--v-medium-emphasis-opacity)); font-size: 12px; font-weight: 500"
|
|
475
475
|
>
|
|
476
476
|
{{ label.text }}
|
|
477
477
|
</text>
|
|
@@ -4283,7 +4283,7 @@ function formatDashboardTime(value?: string) {
|
|
|
4283
4283
|
|
|
4284
4284
|
.print-kpi-title {
|
|
4285
4285
|
color: #64748b;
|
|
4286
|
-
font-size:
|
|
4286
|
+
font-size: 12px;
|
|
4287
4287
|
font-weight: 700;
|
|
4288
4288
|
text-transform: uppercase;
|
|
4289
4289
|
margin-bottom: 8px;
|
|
@@ -4299,7 +4299,7 @@ function formatDashboardTime(value?: string) {
|
|
|
4299
4299
|
|
|
4300
4300
|
.print-kpi-meta {
|
|
4301
4301
|
color: #64748b;
|
|
4302
|
-
font-size:
|
|
4302
|
+
font-size: 12px;
|
|
4303
4303
|
margin-top: 6px;
|
|
4304
4304
|
}
|
|
4305
4305
|
|
|
@@ -4349,7 +4349,7 @@ function formatDashboardTime(value?: string) {
|
|
|
4349
4349
|
|
|
4350
4350
|
.print-status-badge {
|
|
4351
4351
|
display: inline-block;
|
|
4352
|
-
font-size:
|
|
4352
|
+
font-size: 12px;
|
|
4353
4353
|
font-weight: 600;
|
|
4354
4354
|
padding: 2px 8px;
|
|
4355
4355
|
border-radius: 4px;
|
|
@@ -4636,7 +4636,7 @@ function formatDashboardTime(value?: string) {
|
|
|
4636
4636
|
|
|
4637
4637
|
.figma-list-main p {
|
|
4638
4638
|
color: rgba(var(--v-theme-on-surface), var(--v-medium-emphasis-opacity));
|
|
4639
|
-
font-size:
|
|
4639
|
+
font-size: 12px;
|
|
4640
4640
|
font-weight: 700;
|
|
4641
4641
|
line-height: 1.3;
|
|
4642
4642
|
margin: 3px 0 0;
|
|
@@ -4662,7 +4662,7 @@ function formatDashboardTime(value?: string) {
|
|
|
4662
4662
|
color: var(--muted);
|
|
4663
4663
|
display: flex;
|
|
4664
4664
|
font-family: var(--font-sans);
|
|
4665
|
-
font-size:
|
|
4665
|
+
font-size: 12px;
|
|
4666
4666
|
font-weight: 700;
|
|
4667
4667
|
gap: 8px;
|
|
4668
4668
|
min-width: 0;
|
|
@@ -4766,7 +4766,7 @@ function formatDashboardTime(value?: string) {
|
|
|
4766
4766
|
.active-patrol-main span {
|
|
4767
4767
|
color: rgba(var(--v-theme-on-surface), var(--v-medium-emphasis-opacity));
|
|
4768
4768
|
display: block;
|
|
4769
|
-
font-size:
|
|
4769
|
+
font-size: 12px;
|
|
4770
4770
|
line-height: 1.25;
|
|
4771
4771
|
overflow-wrap: anywhere;
|
|
4772
4772
|
}
|
|
@@ -4811,7 +4811,7 @@ function formatDashboardTime(value?: string) {
|
|
|
4811
4811
|
|
|
4812
4812
|
.active-patrol-assignee span {
|
|
4813
4813
|
color: rgba(var(--v-theme-on-surface), var(--v-medium-emphasis-opacity));
|
|
4814
|
-
font-size:
|
|
4814
|
+
font-size: 12px;
|
|
4815
4815
|
font-weight: 600;
|
|
4816
4816
|
line-height: 1.2;
|
|
4817
4817
|
min-width: 0;
|
|
@@ -4830,7 +4830,7 @@ function formatDashboardTime(value?: string) {
|
|
|
4830
4830
|
|
|
4831
4831
|
.active-patrol-status-pill {
|
|
4832
4832
|
border-radius: 20px;
|
|
4833
|
-
font-size:
|
|
4833
|
+
font-size: 12px;
|
|
4834
4834
|
font-weight: 600;
|
|
4835
4835
|
line-height: 1.2;
|
|
4836
4836
|
padding: 5px 10px;
|
|
@@ -4846,7 +4846,7 @@ function formatDashboardTime(value?: string) {
|
|
|
4846
4846
|
color: rgba(var(--v-theme-on-surface), var(--v-medium-emphasis-opacity));
|
|
4847
4847
|
display: inline-flex;
|
|
4848
4848
|
flex: 0 0 auto;
|
|
4849
|
-
font-size:
|
|
4849
|
+
font-size: 12px;
|
|
4850
4850
|
font-weight: 800;
|
|
4851
4851
|
height: 24px;
|
|
4852
4852
|
justify-content: center;
|
|
@@ -4869,7 +4869,7 @@ function formatDashboardTime(value?: string) {
|
|
|
4869
4869
|
box-shadow: var(--shadow-menu);
|
|
4870
4870
|
color: var(--card);
|
|
4871
4871
|
content: attr(data-tooltip);
|
|
4872
|
-
font-size:
|
|
4872
|
+
font-size: 12px;
|
|
4873
4873
|
font-weight: 600;
|
|
4874
4874
|
left: 50%;
|
|
4875
4875
|
line-height: 1.35;
|
|
@@ -5099,7 +5099,7 @@ function formatDashboardTime(value?: string) {
|
|
|
5099
5099
|
color: var(--accent-text);
|
|
5100
5100
|
display: inline-flex;
|
|
5101
5101
|
flex-shrink: 0;
|
|
5102
|
-
font-size:
|
|
5102
|
+
font-size: 12px;
|
|
5103
5103
|
font-weight: 800;
|
|
5104
5104
|
height: 30px;
|
|
5105
5105
|
justify-content: center;
|