@7365admin1/layer-common 4.147.1 → 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,11 @@
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
+
3
9
  ## 4.147.1
4
10
 
5
11
  ### Patch Changes
@@ -3487,11 +3493,11 @@ Monthly report: a month that had patrols opens the list of that month's patrol r
3487
3493
  `utils/console-tier.ts` + `composables/useConsoleTier.ts` mirror the server's
3488
3494
  own rule from two endpoints the console already calls, unprojected:
3489
3495
 
3490
- GET /api/members/user/:user/app/admin the Seven365 staff membership
3491
- 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
3492
3498
 
3493
- owner = member.type === "admin" && role.type === "admin" && role.default === true
3494
- 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"
3495
3501
 
3496
3502
  `role.default` is the marker because it is the only property of a platform
3497
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>
@@ -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.1",
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.",