@7365admin1/layer-common 4.2.2-staging.265 → 4.2.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 +47 -4
- package/assets/css/shell.css +33 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,48 @@
|
|
|
1
1
|
# @iservice365/layer-common
|
|
2
2
|
|
|
3
|
+
## 4.2.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 329b7e8: Self-service onboarding: a member can give an email, and every row can ask for its pass again (DV-0080).
|
|
8
|
+
|
|
9
|
+
`ContractorRegistrationForm` now requires an email per member in the Members dialog, so a member is
|
|
10
|
+
sent their OWN pass link rather than having to be handed it by the lead contractor. Both email
|
|
11
|
+
fields (the lead's, still optional, and each member's) validate their format inline — the API
|
|
12
|
+
validates them with Joi and would otherwise reject the whole submission over a field the visitor
|
|
13
|
+
could not see.
|
|
14
|
+
|
|
15
|
+
`VisitorQrCodeLinksCard` gains a Resend button on every row. A row that already has an address just
|
|
16
|
+
sends; a row with none opens an inline field, and what is typed there is saved onto that
|
|
17
|
+
registration and used. The lead row and the member rows were the same three-button row written
|
|
18
|
+
twice and are now one `v-for`.
|
|
19
|
+
|
|
20
|
+
The server's refusals are shown on the row in its own words — the 60-second per-record cooldown says
|
|
21
|
+
how many seconds are left, and a rejected address says so.
|
|
22
|
+
|
|
23
|
+
New `utils/self-service-links.ts` holds the pure part: building a pass link, deciding whether a row
|
|
24
|
+
still needs an address, and the loose format check that mirrors the API's own.
|
|
25
|
+
|
|
26
|
+
- 6ae8d37: A snackbar no longer swallows clicks meant for the dialog underneath it
|
|
27
|
+
|
|
28
|
+
Every snackbar in the layer is drawn far above Vuetify's dialog stack, and its wrapper is a solid box that takes clicks. The realtime "New plate detected" toast landed over the Add Vehicle dialog's Submit button and made the button unclickable, so on a busy gate a vehicle could not be added at all. The shared `Snackbar.vue` is mounted by 57 screens, so any toast that fired while any dialog was open could do the same.
|
|
29
|
+
|
|
30
|
+
Toasts stay above dialogs — a camera-fault warning still has to be seen — but only their own buttons and links take clicks now. Everything else passes through to what is underneath.
|
|
31
|
+
|
|
32
|
+
- 1945d95: Vehicle Management: complete row actions, per-plate targeting, readable camera errors and a form that says why it will not save
|
|
33
|
+
|
|
34
|
+
- The row menu now offers the correct action set for every status — Approve for pending, Unblock for a blocked vehicle, Block/Unblock, Edit and Delete — decided by one function shared with the Preview dialog, so a kebab can no longer open an empty menu.
|
|
35
|
+
- A row that groups several plates lists each plate under its own number instead of silently acting on the first one.
|
|
36
|
+
- Approve, Restore and Block failures are shown in the still-open dialog rather than a five-second toast.
|
|
37
|
+
- The add/edit form reports what the server says happened instead of a hardcoded "added successfully", and the Update button is no longer disabled without saying which fields are missing.
|
|
38
|
+
- Removed the debug logging that shipped with the vehicle form.
|
|
39
|
+
|
|
40
|
+
- a0bd471: Vehicle Management: surface Edit and Delete on the table row, and stop a refused delete from failing silently.
|
|
41
|
+
|
|
42
|
+
Edit and Delete were already built and already shipping, but only reachable two clicks deep — click a row, then the kebab on the nested plate table inside the read-only Preview dialog. The main table now carries the same row kebab every other table in this package draws, calling the same handlers, so there is one code path per operation.
|
|
43
|
+
|
|
44
|
+
Also: `canApproveVehicle` was shadowed by a local `computed(() => true)`, so the Approve action rendered for every role regardless of permission; the Edit and Block/Unblock actions now check `canUpdateVehicle`, matching the `vehicle-mgmt:update-vehicle` the server enforces; and a delete the server refuses (the ANPR revoke could not be confirmed on every camera) now shows the reason in the dialog instead of setting a message string that was never displayed.
|
|
45
|
+
|
|
3
46
|
## 4.2.1
|
|
4
47
|
|
|
5
48
|
### Patch Changes
|
|
@@ -415,11 +458,11 @@
|
|
|
415
458
|
`utils/console-tier.ts` + `composables/useConsoleTier.ts` mirror the server's
|
|
416
459
|
own rule from two endpoints the console already calls, unprojected:
|
|
417
460
|
|
|
418
|
-
|
|
419
|
-
|
|
461
|
+
GET /api/members/user/:user/app/admin the Seven365 staff membership
|
|
462
|
+
GET /api/roles/id/:role that membership's role document
|
|
420
463
|
|
|
421
|
-
|
|
422
|
-
|
|
464
|
+
owner = member.type === "admin" && role.type === "admin" && role.default === true
|
|
465
|
+
staff = member.type === "admin" && role.type === "admin"
|
|
423
466
|
|
|
424
467
|
`role.default` is the marker because it is the only property of a platform
|
|
425
468
|
staff role no API caller can set - `role.controller.ts` validates create and
|
package/assets/css/shell.css
CHANGED
|
@@ -256,3 +256,36 @@
|
|
|
256
256
|
min-width: 44px;
|
|
257
257
|
}
|
|
258
258
|
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* A toast must never take a click that was meant for the screen behind it.
|
|
262
|
+
*
|
|
263
|
+
* Every snackbar in the product is drawn at `z-index: 100000000` - the shared
|
|
264
|
+
* `Snackbar.vue` and both of `VisitorSocketPopUp.vue`'s - which is far above
|
|
265
|
+
* Vuetify's dialog stack (2000+). So a snackbar sits ON TOP of any dialog that
|
|
266
|
+
* is open, and its wrapper is a solid, `pointer-events: auto` box.
|
|
267
|
+
*
|
|
268
|
+
* Measured on staging, 1 Sep 2026: the realtime "New plate detected" toast
|
|
269
|
+
* landed over the Add Vehicle dialog's Submit button and swallowed the click,
|
|
270
|
+
* so on a busy gate - where a plate read arrives every few seconds - a vehicle
|
|
271
|
+
* could not be added at all. The tester could only finish the create by setting
|
|
272
|
+
* `pointer-events: none` on the snackbar by hand. It is not a vehicle problem:
|
|
273
|
+
* the same shared `Snackbar.vue` is mounted by 57 screens, so any toast that
|
|
274
|
+
* fires while any dialog is open can do this.
|
|
275
|
+
*
|
|
276
|
+
* The z-index is deliberately left alone - a camera-fault warning still has to
|
|
277
|
+
* be SEEN over a dialog. What changes is that only the toast's own controls
|
|
278
|
+
* take clicks; everything else passes through to whatever is underneath, which
|
|
279
|
+
* is exactly the behaviour the tester proved by hand.
|
|
280
|
+
*/
|
|
281
|
+
/* Two class names deep on purpose: Vuetify puts `v-overlay__content`, which
|
|
282
|
+
carries `pointer-events: auto`, on this same element. */
|
|
283
|
+
.v-snackbar .v-snackbar__wrapper {
|
|
284
|
+
pointer-events: none;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
.v-snackbar .v-snackbar__wrapper .v-btn,
|
|
288
|
+
.v-snackbar .v-snackbar__wrapper a,
|
|
289
|
+
.v-snackbar .v-snackbar__wrapper [role="button"] {
|
|
290
|
+
pointer-events: auto;
|
|
291
|
+
}
|
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.2.2
|
|
5
|
+
"version": "4.2.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.",
|