@7365admin1/layer-common 4.136.0 → 4.138.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.
Files changed (40) hide show
  1. package/CHANGELOG.md +16 -4
  2. package/assets/css/primitives.css +54 -11
  3. package/assets/css/screens.css +3 -3
  4. package/assets/css/tokens.css +17 -12
  5. package/components/AnprCameraBadge.vue +1 -1
  6. package/components/AreaMain.vue +11 -5
  7. package/components/BillingMain.vue +12 -53
  8. package/components/BulletinBoardManagement.vue +9 -13
  9. package/components/CameraWall.vue +7 -7
  10. package/components/CameraWallTile.vue +8 -8
  11. package/components/Chat/ListCard.vue +1 -1
  12. package/components/CleaningScheduleMain.vue +56 -20
  13. package/components/ClientMain.vue +1 -1
  14. package/components/ClientSubscriptionForm.vue +1 -1
  15. package/components/DashboardMain.vue +13 -13
  16. package/components/HidAccessLogDashboard.vue +3 -3
  17. package/components/HidIntercomManagement.vue +14 -14
  18. package/components/HidQrCodeConfiguration.vue +3 -3
  19. package/components/HidReaderManagement.vue +1 -1
  20. package/components/InventoryPhotoThumbs.vue +1 -1
  21. package/components/InvitationMain.vue +8 -0
  22. package/components/Layout/Header.vue +2 -2
  23. package/components/Layout/NavigationDrawer.vue +1 -1
  24. package/components/MemberMain.vue +8 -0
  25. package/components/Nfc/NFCRouteScheduleTimes.vue +1 -1
  26. package/components/PlateNumberDisplay.vue +1 -1
  27. package/components/RolePermissionMain.vue +13 -0
  28. package/components/ScheduleAreaMain.vue +6 -9
  29. package/components/ScheduleGuide.vue +101 -0
  30. package/components/ScheduleTaskForm.vue +88 -7
  31. package/components/ScheduleTaskMain.vue +163 -56
  32. package/components/SiteSettings.vue +5 -5
  33. package/components/StatusChip.vue +1 -1
  34. package/components/VisitorsReportPreview.vue +2 -2
  35. package/composables/useKey.ts +20 -16
  36. package/package.json +1 -1
  37. package/pages/unauthorized.vue +4 -3
  38. package/utils/breadcrumb.ts +7 -0
  39. package/utils/nav-sections.ts +2 -0
  40. package/utils/schedule-task.ts +106 -23
@@ -7,8 +7,42 @@
7
7
  :site="site"
8
8
  :service-type="serviceType"
9
9
  :schedule-route="scheduleRoute"
10
- text="A new checklist is created for every area automatically each midnight. Staff tick off each unit on the mobile app."
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 lists yet.</strong>
61
+ <strong>No daily checklists here yet.</strong>
28
62
  <span>
29
- A list is created automatically every midnight, once your Areas
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 cleaning schedules.
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 Schedule - Cleaning" / "- Landscape" / "- Pest" / "- Pool" / "- Technician"
172
- const pageTitle = `Daily Schedule – ${scheduleNameFor(props.serviceType).title.replace(
173
- / Schedule$/,
174
- "",
175
- )}`;
208
+ // "Daily Checklist – Cleaning" / "– Landscape" / "– Pest" / "– Pool" / "– Technician"
209
+ const pageTitle = dailyChecklistTitle(props.serviceType);
176
210
 
177
- const startDate = ref("");
178
- const endDate = ref("");
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: "Open", value: "open" },
218
+ { title: "Not started", value: "open" },
183
219
  { title: "In progress", value: "ongoing" },
184
- { title: "Completed", value: "completed" },
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: "Created Date", value: "createdAt" },
195
- { title: "Close in", value: "closeIn" },
230
+ { title: "Day", value: "createdAt" },
231
+ { title: "Closes in", value: "closeIn" },
196
232
  { title: "Status", value: "status" },
197
- { title: "Completion Date", value: "completedAt" },
233
+ { title: "Finished on", value: "completedAt" },
198
234
  { title: "", value: "download" },
199
235
  ];
200
236
  const remainingTime = ref({} as Record<string, string>);
@@ -899,7 +899,7 @@ onUnmounted(() => {
899
899
  position: absolute;
900
900
  top: -8px;
901
901
  left: 9px;
902
- font-size: 10px;
902
+ font-size: 12px;
903
903
  color: var(--muted);
904
904
  background: var(--card);
905
905
  padding: 0 3px;
@@ -463,7 +463,7 @@ onMounted(load)
463
463
  }
464
464
  .sub-free-badge {
465
465
  display: block;
466
- font-size: 11px;
466
+ font-size: 12px;
467
467
  font-weight: 700;
468
468
  color: var(--text2);
469
469
  margin-top: 2px;
@@ -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: 11px; font-weight: 500"
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: 11px; font-weight: 500"
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: 11px;
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: 11px;
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: 11px;
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: 11px;
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: 11px;
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: 11px;
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: 11px;
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: 11px;
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: 11px;
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: 11px;
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: 11px;
5102
+ font-size: 12px;
5103
5103
  font-weight: 800;
5104
5104
  height: 30px;
5105
5105
  justify-content: center;
@@ -1447,7 +1447,7 @@ function buildPdfHtml() {
1447
1447
  background: #ffffff;
1448
1448
  color: #0a2638;
1449
1449
  font-family: Arial, Helvetica, sans-serif;
1450
- font-size: 9px;
1450
+ font-size: 12px;
1451
1451
  }
1452
1452
 
1453
1453
  .pdf-summary {
@@ -1482,7 +1482,7 @@ function buildPdfHtml() {
1482
1482
  }
1483
1483
 
1484
1484
  .pdf-value {
1485
- font-size: 10px;
1485
+ font-size: 12px;
1486
1486
  line-height: 1.35;
1487
1487
  }
1488
1488
 
@@ -1693,7 +1693,7 @@ watch(selectedReaderId, (value) => {
1693
1693
  .history-table-card :deep(th) {
1694
1694
  background: var(--thead);
1695
1695
  color: var(--muted);
1696
- font-size: 11px;
1696
+ font-size: 12px;
1697
1697
  font-weight: 800;
1698
1698
  text-transform: uppercase;
1699
1699
  letter-spacing: 0.04em;
@@ -2246,7 +2246,7 @@ export default {
2246
2246
  .field-label {
2247
2247
  margin: 12px 0 7px;
2248
2248
  color: var(--text2);
2249
- font-size: 10px;
2249
+ font-size: 12px;
2250
2250
  font-weight: 500;
2251
2251
  }
2252
2252
 
@@ -2257,7 +2257,7 @@ export default {
2257
2257
  .field-hint {
2258
2258
  margin: 6px 0 0;
2259
2259
  color: var(--text2);
2260
- font-size: 11px;
2260
+ font-size: 12px;
2261
2261
  line-height: 1.4;
2262
2262
  }
2263
2263
 
@@ -2282,7 +2282,7 @@ export default {
2282
2282
  .sip-label {
2283
2283
  margin: 12px 0 6px;
2284
2284
  color: var(--text);
2285
- font-size: 10px;
2285
+ font-size: 12px;
2286
2286
  font-weight: 500;
2287
2287
  line-height: 1.2;
2288
2288
  }
@@ -2320,7 +2320,7 @@ export default {
2320
2320
 
2321
2321
  .sip-section-switch small {
2322
2322
  color: var(--muted);
2323
- font-size: 10px;
2323
+ font-size: 12px;
2324
2324
  line-height: 1.4;
2325
2325
  }
2326
2326
 
@@ -2462,7 +2462,7 @@ export default {
2462
2462
  .call-label {
2463
2463
  margin: 8px 0 6px;
2464
2464
  color: var(--text);
2465
- font-size: 10px;
2465
+ font-size: 12px;
2466
2466
  font-weight: 500;
2467
2467
  letter-spacing: 0;
2468
2468
  }
@@ -2485,7 +2485,7 @@ export default {
2485
2485
 
2486
2486
  .call-radio-list :deep(.v-label) {
2487
2487
  color: var(--text2);
2488
- font-size: 11px;
2488
+ font-size: 12px;
2489
2489
  letter-spacing: 0;
2490
2490
  opacity: 1;
2491
2491
  }
@@ -2501,7 +2501,7 @@ export default {
2501
2501
  border-radius: 3px;
2502
2502
  background: var(--card);
2503
2503
  color: var(--text);
2504
- font-size: 11px;
2504
+ font-size: 12px;
2505
2505
  letter-spacing: 0;
2506
2506
  }
2507
2507
 
@@ -2657,7 +2657,7 @@ export default {
2657
2657
  .web-phone-status {
2658
2658
  min-width: 92px;
2659
2659
  justify-content: center;
2660
- font-size: 10px;
2660
+ font-size: 12px;
2661
2661
  }
2662
2662
 
2663
2663
  .web-phone-status.ready {
@@ -2749,7 +2749,7 @@ export default {
2749
2749
 
2750
2750
  .sip-account-label {
2751
2751
  color: var(--muted);
2752
- font-size: 11px;
2752
+ font-size: 12px;
2753
2753
  }
2754
2754
 
2755
2755
  .sip-account-extension {
@@ -2762,7 +2762,7 @@ export default {
2762
2762
  max-width: 170px;
2763
2763
  overflow: hidden;
2764
2764
  color: var(--text2);
2765
- font-size: 11px;
2765
+ font-size: 12px;
2766
2766
  text-align: right;
2767
2767
  text-overflow: ellipsis;
2768
2768
  white-space: nowrap;
@@ -2838,7 +2838,7 @@ export default {
2838
2838
  max-width: 100%;
2839
2839
  overflow: hidden;
2840
2840
  color: var(--border);
2841
- font-size: 11px;
2841
+ font-size: 12px;
2842
2842
  text-overflow: ellipsis;
2843
2843
  white-space: nowrap;
2844
2844
  }
@@ -2895,7 +2895,7 @@ export default {
2895
2895
 
2896
2896
  .web-phone-error {
2897
2897
  margin-top: 14px;
2898
- font-size: 11px;
2898
+ font-size: 12px;
2899
2899
  }
2900
2900
 
2901
2901
  .call-two-col {
@@ -2922,7 +2922,7 @@ export default {
2922
2922
  min-height: 38px;
2923
2923
  border: 1px dashed var(--border);
2924
2924
  color: var(--text2);
2925
- font-size: 11px;
2925
+ font-size: 12px;
2926
2926
  letter-spacing: 0;
2927
2927
  }
2928
2928
 
@@ -2952,7 +2952,7 @@ export default {
2952
2952
  min-height: 32px;
2953
2953
  margin: 0 0 10px;
2954
2954
  color: var(--text2);
2955
- font-size: 11px;
2955
+ font-size: 12px;
2956
2956
  }
2957
2957
 
2958
2958
  .call-file-name {
@@ -644,7 +644,7 @@ function showMessage(text: string, color: string) {
644
644
  .pass-subtext {
645
645
  min-height: 18px;
646
646
  color: #6b7280;
647
- font-size: 11px;
647
+ font-size: 12px;
648
648
  }
649
649
 
650
650
  .qr-grid {
@@ -667,7 +667,7 @@ function showMessage(text: string, color: string) {
667
667
  background-size: 10px 10px;
668
668
  background-position: 0 0, 0 5px, 5px -5px, -5px 0;
669
669
  color: #6b7280;
670
- font-size: 9px;
670
+ font-size: 12px;
671
671
  }
672
672
 
673
673
  .qr-placeholder.small {
@@ -685,7 +685,7 @@ function showMessage(text: string, color: string) {
685
685
  display: grid;
686
686
  gap: 4px;
687
687
  color: #4b5563;
688
- font-size: 10px;
688
+ font-size: 12px;
689
689
  }
690
690
 
691
691
  .pass-footer strong {
@@ -1303,7 +1303,7 @@ function formatCallback(reader?: HidRecord | null) {
1303
1303
  nobody opens. */
1304
1304
  .identification-copy small {
1305
1305
  color: var(--muted);
1306
- font-size: 11px;
1306
+ font-size: 12px;
1307
1307
  }
1308
1308
 
1309
1309
  .identification-applied {
@@ -57,7 +57,7 @@ const list = computed(() => [
57
57
  position: absolute;
58
58
  left: 2px;
59
59
  bottom: 2px;
60
- font-size: 9px;
60
+ font-size: 12px;
61
61
  line-height: 1;
62
62
  padding: 1px 3px;
63
63
  border-radius: 3px;
@@ -27,6 +27,14 @@
27
27
  </template>
28
28
 
29
29
  <template #right>
30
+ <AppField
31
+ v-model="headerSearch"
32
+ search
33
+ compact
34
+ placeholder="Search"
35
+ aria-label="Search"
36
+ klass="app-toolbar__search"
37
+ />
30
38
  <AppButton
31
39
  variant="icon"
32
40
  icon="mdi-refresh"
@@ -307,7 +307,7 @@ const { getNameInitials } = useUtils();
307
307
  }
308
308
 
309
309
  .app-profile-menu__name {
310
- font-size: 13.5px;
310
+ font-size: 14.5px;
311
311
  font-weight: 800;
312
312
  line-height: 1.3;
313
313
  color: var(--text);
@@ -317,7 +317,7 @@ const { getNameInitials } = useUtils();
317
317
  }
318
318
 
319
319
  .app-profile-menu__site {
320
- font-size: 11.5px;
320
+ font-size: 13px;
321
321
  font-weight: 600;
322
322
  line-height: 1.3;
323
323
  color: var(--muted);
@@ -297,7 +297,7 @@ const handleClick = (item: any) => {
297
297
  }
298
298
 
299
299
  .brand-drawer__suite {
300
- font-size: 11.5px;
300
+ font-size: 13px;
301
301
  font-weight: 600;
302
302
  line-height: 1.3;
303
303
  color: var(--muted);
@@ -85,6 +85,14 @@
85
85
  </template>
86
86
 
87
87
  <template #right>
88
+ <AppField
89
+ v-model="headerSearch"
90
+ search
91
+ compact
92
+ placeholder="Search"
93
+ aria-label="Search"
94
+ klass="app-toolbar__search"
95
+ />
88
96
  <AppButton
89
97
  variant="icon"
90
98
  icon="mdi-refresh"
@@ -70,7 +70,7 @@ const hidden = computed(() => (props.limit ? props.windows.slice(props.limit) :
70
70
  }
71
71
 
72
72
  .route-times__next {
73
- font-size: 10px;
73
+ font-size: 12px;
74
74
  font-weight: 700;
75
75
  color: var(--warn);
76
76
  }
@@ -144,7 +144,7 @@ const extraCount = computed(() => {
144
144
  width: fit-content;
145
145
  padding: 0 6px;
146
146
  border-radius: 999px;
147
- font-size: 11px;
147
+ font-size: 12px;
148
148
  font-weight: 600;
149
149
  line-height: 18px;
150
150
  }
@@ -32,6 +32,14 @@
32
32
  </template>
33
33
 
34
34
  <template #right>
35
+ <AppField
36
+ v-model="headerSearch"
37
+ search
38
+ compact
39
+ placeholder="Search"
40
+ aria-label="Search"
41
+ klass="app-toolbar__search"
42
+ />
35
43
  <local-pagination
36
44
  v-model="page"
37
45
  :length="pages"
@@ -446,6 +454,11 @@ const {
446
454
  }
447
455
  );
448
456
 
457
+ // A new search starts from the first page.
458
+ watch(headerSearch, () => {
459
+ page.value = 1;
460
+ });
461
+
449
462
  const loading = computed(() => getRoleReqStatus.value === "pending");
450
463
 
451
464
  watchEffect(() => {
@@ -6,7 +6,7 @@
6
6
  :site="site"
7
7
  :service-type="serviceType"
8
8
  :schedule-route="scheduleRoute"
9
- text="These are the areas on this day's checklist. Open an area to see its units and visits."
9
+ text="These are the areas on this day's checklist. Click an area to see each unit, tick it as done, or send it back to be redone."
10
10
  />
11
11
  <TableMain
12
12
  :title="pageTitle"
@@ -142,7 +142,7 @@
142
142
 
143
143
  <script setup lang="ts">
144
144
  import useCleaningSchedules from "../composables/useCleaningSchedules";
145
- import { dailyStatusLabel, scheduleNameFor } from "../utils/schedule-task";
145
+ import { dailyChecklistTitle, dailyStatusLabel } from "../utils/schedule-task";
146
146
  import useUtils from "../composables/useUtils";
147
147
 
148
148
  const props = defineProps({
@@ -157,11 +157,8 @@ const props = defineProps({
157
157
  canManageScheduleTasks: { type: Boolean, default: false },
158
158
  });
159
159
 
160
- // "Daily Schedule - Cleaning" / "- Landscape" / ... (same title as the day list)
161
- const pageTitle = `Daily Schedule – ${scheduleNameFor(props.serviceType).title.replace(
162
- / Schedule$/,
163
- "",
164
- )}`;
160
+ // "Daily Checklist – Cleaning" / "– Landscape" / ... (same title as the day list)
161
+ const pageTitle = dailyChecklistTitle(props.serviceType);
165
162
 
166
163
  const submitting = ref(false);
167
164
  const message = ref("");
@@ -198,9 +195,9 @@ const items = ref<Array<Record<string, any>>>([]);
198
195
  const statusFilter = ref<TScheduleAreaStatus>("all");
199
196
  const statusOptions = [
200
197
  { title: "All", value: "all" },
201
- { title: "Open", value: "open" },
198
+ { title: "Not started", value: "open" },
202
199
  { title: "In progress", value: "ongoing" },
203
- { title: "Completed", value: "completed" },
200
+ { title: "Done", value: "completed" },
204
201
  ];
205
202
  const areaTypeFilter = ref<TAreaType>("all");
206
203
  const typeOptions = [