@7365admin1/layer-common 4.147.0 → 4.147.2

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 CHANGED
@@ -1,5 +1,17 @@
1
1
  # @iservice365/layer-common
2
2
 
3
+ ## 4.147.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 3a1e7ba: Stop the browser filling the saved sign-in password into the masked NRIC field on Add Visitor / Add Delivery. The field is now masked with CSS instead of being a password box.
8
+
9
+ ## 4.147.1
10
+
11
+ ### Patch Changes
12
+
13
+ - 3ce57c6: Extra Checks: the form, page help and summary now say plainly that one extra check adds exactly one round per picked area each time it runs, however many normal visits the area has.
14
+
3
15
  ## 4.147.0
4
16
 
5
17
  ### Minor Changes
@@ -3481,11 +3493,11 @@ Monthly report: a month that had patrols opens the list of that month's patrol r
3481
3493
  `utils/console-tier.ts` + `composables/useConsoleTier.ts` mirror the server's
3482
3494
  own rule from two endpoints the console already calls, unprojected:
3483
3495
 
3484
- GET /api/members/user/:user/app/admin the Seven365 staff membership
3485
- GET /api/roles/id/:role that membership's role document
3496
+ GET /api/members/user/:user/app/admin the Seven365 staff membership
3497
+ GET /api/roles/id/:role that membership's role document
3486
3498
 
3487
- owner = member.type === "admin" && role.type === "admin" && role.default === true
3488
- staff = member.type === "admin" && role.type === "admin"
3499
+ owner = member.type === "admin" && role.type === "admin" && role.default === true
3500
+ staff = member.type === "admin" && role.type === "admin"
3489
3501
 
3490
3502
  `role.default` is the marker because it is the only property of a platform
3491
3503
  staff role no API caller can set - `role.controller.ts` validates create and
@@ -1,16 +1,18 @@
1
1
  <template>
2
2
  <v-text-field
3
3
  v-model.trim="model"
4
- class="filter-field"
4
+ :class="['filter-field', { 'nric-field--masked': masked && !shown }]"
5
5
  :rules="rules"
6
6
  :maxlength="maxlength"
7
7
  :placeholder="placeholder"
8
8
  :counter="maxlength"
9
9
  @input="onInput"
10
10
  :loading="loading"
11
- :type="masked && !shown ? 'password' : 'text'"
11
+ type="text"
12
12
  :append-inner-icon="masked ? (shown ? 'mdi-eye-off' : 'mdi-eye') : undefined"
13
13
  autocomplete="off"
14
+ data-lpignore="true"
15
+ data-1p-ignore
14
16
  outlined
15
17
  clearable
16
18
  @click:append-inner="shown = !shown"
@@ -63,4 +65,14 @@ function onInput(event) {
63
65
  watch(model, (newVal) => {
64
66
  emit('update:modelValue', newVal)
65
67
  })
66
- </script>
68
+ </script>
69
+
70
+ <style scoped>
71
+ /* Masked by CSS, never type="password": a password box makes Chrome treat the
72
+ form as a login and fill the saved sign-in password into the NRIC field
73
+ (it ignores autocomplete="off" on password boxes). */
74
+ .nric-field--masked :deep(input) {
75
+ -webkit-text-security: disc;
76
+ text-security: disc;
77
+ }
78
+ </style>
@@ -2,7 +2,7 @@
2
2
  ADD / EDIT AN EXTRA CHECK - four short steps: What, Where, When, Who is told.
3
3
 
4
4
  The last step shows one sentence saying exactly what will be created
5
- ("Adds 1 extra check to 3 areas (24 units) at 08:00 every weekday ... next:
5
+ ("Adds 1 extra check to each of 3 areas (24 units) at 08:00 every weekday ... next:
6
6
  Wed 21 Oct"). The form checks what the server checks (utils/schedule-task.ts)
7
7
  so a schedule that would never run is caught before saving; whatever the
8
8
  server still refuses is shown in its own words.
@@ -85,8 +85,10 @@
85
85
  <v-stepper-window-item :value="2">
86
86
  <div class="st-step">
87
87
  <p class="st-step__help">
88
- Pick the areas to check. Every unit in a picked area gets
89
- one more tick box on the Daily Checklist for this check.
88
+ Pick the areas to check. Each time this check is due, every
89
+ picked area gets exactly one extra round on the Daily
90
+ Checklist (one more tick box per unit) - one round, however
91
+ many normal visits the area has each day.
90
92
  </p>
91
93
  <InputLabel for="selected-areas" title="Areas" required />
92
94
  <v-select
@@ -16,9 +16,11 @@
16
16
  that.
17
17
  </li>
18
18
  <li>
19
- An <strong>extra check</strong> adds one more round of ticks to
20
- that checklist, in the areas you pick, at the time you set - once,
21
- or repeating (every day, weekdays, chosen days, or monthly).
19
+ An <strong>extra check</strong> adds exactly one more round of
20
+ ticks to that checklist each time it is due, in the areas you pick,
21
+ at the time you set - once, or repeating (every day, weekdays,
22
+ chosen days, or monthly). One extra check is one round per area,
23
+ however many normal visits that area has each day.
22
24
  </li>
23
25
  <li>
24
26
  At that time, staff get a phone notification and see the extra
@@ -1912,7 +1912,8 @@ ensureANPRSettings(true).catch(() => {
1912
1912
 
1913
1913
  /*
1914
1914
  * iSecure `useUnregisteredTab`: the Unregistered tab needs BOTH the site's
1915
- * Unregistered switch AND an ANPR camera facing an entrance (entry / both) -
1915
+ * Unregistered switch AND an ANPR camera facing an entrance (entry / both /
1916
+ * visitors) -
1916
1917
  * the same rule the plate notice (VisitorSocketPopUp) already applies.
1917
1918
  */
1918
1919
  const { getAllSiteCameras } = useSiteSettings();
@@ -1928,7 +1929,7 @@ async function loadEntryFacingAnprCamera() {
1928
1929
  ? res.data.items
1929
1930
  : [];
1930
1931
  hasEntryFacingAnprCamera.value = cameras.some(
1931
- (camera: any) => camera?.direction === "entry" || camera?.direction === "both"
1932
+ (camera: any) => ["entry", "both", "visitors"].includes(camera?.direction)
1932
1933
  );
1933
1934
  } catch {
1934
1935
  hasEntryFacingAnprCamera.value = false;
@@ -150,7 +150,7 @@ const { enableUnregistered, ensureANPRSettings } = useANPRSettings(
150
150
  );
151
151
  // The security mobile app's rule (isecure365 `useUnregisteredTab`): the
152
152
  // site's Unregistered switch AND an ANPR camera facing an entrance (entry /
153
- // both). With the switch alone the notice could appear for a site whose
153
+ // both / visitors). With the switch alone the notice could appear for a site whose
154
154
  // cameras never register anyone arriving.
155
155
  const { getAllSiteCameras } = useSiteSettings();
156
156
  const hasEntryFacingAnprCamera = ref(false);
@@ -167,7 +167,7 @@ async function loadEntryFacingAnprCamera(siteId: string) {
167
167
  ? res.data.items
168
168
  : [];
169
169
  hasEntryFacingAnprCamera.value = items.some(
170
- (camera: any) => camera?.direction === "entry" || camera?.direction === "both"
170
+ (camera: any) => ["entry", "both", "visitors"].includes(camera?.direction)
171
171
  );
172
172
  } catch {
173
173
  hasEntryFacingAnprCamera.value = false;
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@7365admin1/layer-common",
3
3
  "license": "MIT",
4
4
  "type": "module",
5
- "version": "4.147.0",
5
+ "version": "4.147.2",
6
6
  "author": "7365admin1",
7
7
  "main": "./nuxt.config.ts",
8
8
  "//files": "What a consumer extending this layer actually loads. Without this npm ships the whole working tree - the changesets, the CI workflows, the render harness in tools/ and any scratch directory that happened to exist at publish time. Nuxt resolves a layer by directory, so every runtime directory below has to stay listed; adding a new top-level runtime directory means adding it here too.",
@@ -268,7 +268,8 @@ export function buildSummary(
268
268
  now: Date = new Date(),
269
269
  ): string {
270
270
  const year = sgtParts(now).date.slice(0, 4);
271
- const areas = `${f.areaCount} area${f.areaCount === 1 ? "" : "s"}`;
271
+ // One extra check = exactly one more round per picked area each time it runs (not one per normal visit).
272
+ const areas = f.areaCount === 1 ? "1 area" : `each of ${f.areaCount} areas`;
272
273
  const units = `${unitCount} unit${unitCount === 1 ? "" : "s"}`;
273
274
  const next = nextRunDate(f, now);
274
275
  const nextText = next ? `${DAYS[weekdayOf(next)]} ${fmtDate(next, year)}` : "never";