@7365admin1/layer-common 4.90.2-staging.490 → 4.90.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.
Files changed (67) hide show
  1. package/CHANGELOG.md +10 -4
  2. package/assets/css/primitives.css +0 -57
  3. package/assets/css/screens.css +4 -8
  4. package/components/AccessCardDetailsDialog.vue +6 -59
  5. package/components/AccessCardPreviewDialog.vue +53 -371
  6. package/components/AppSelect.vue +4 -143
  7. package/components/BuildingUnitFormEdit.vue +0 -6
  8. package/components/Dialog/UpdateMoreAction.vue +1 -11
  9. package/components/DocumentForm.vue +112 -407
  10. package/components/DocumentManagement.vue +12 -213
  11. package/components/Facility/BookingSetup.vue +0 -63
  12. package/components/HidAccessLogDashboard.vue +17 -74
  13. package/components/HidIntercomManagement.vue +14 -183
  14. package/components/HidQrCodeConfiguration.vue +195 -17
  15. package/components/HidReaderManagement.vue +0 -398
  16. package/components/HidReaderUserRoster.vue +3 -44
  17. package/components/HidUserEnrollment.vue +292 -2255
  18. package/components/InvitationClientForm.vue +1 -19
  19. package/components/InvitationForm.vue +4 -31
  20. package/components/InvitationMain.vue +22 -124
  21. package/components/MemberInformation.vue +4 -4
  22. package/components/PassInformation.vue +2 -2
  23. package/components/SiteSettings.vue +0 -48
  24. package/components/TableMain.vue +7 -22
  25. package/components/VehicleManagement.vue +5 -80
  26. package/components/VisitorForm.vue +19 -65
  27. package/components/VisitorManagement.vue +5 -267
  28. package/composables/useAccessManagement.ts +1 -17
  29. package/composables/useDocument.ts +0 -7
  30. package/composables/useFacility.ts +0 -11
  31. package/composables/useHidAmico.ts +0 -165
  32. package/composables/useHidNavigation.ts +1 -25
  33. package/composables/useMember.ts +0 -12
  34. package/composables/useNFCPatrolReportFilters.ts +3 -21
  35. package/composables/useNFCPatrolRoute.ts +1 -8
  36. package/composables/usePeople.ts +0 -19
  37. package/composables/useServiceProvider.ts +2 -45
  38. package/composables/useSettingsPermission.ts +0 -14
  39. package/composables/useUser.ts +2 -6
  40. package/composables/useVehicle.ts +1 -40
  41. package/composables/useVerification.ts +0 -3
  42. package/middleware/01.auth.ts +7 -3
  43. package/package.json +1 -1
  44. package/pages/[org]/[site]/access-mgmt/administrator/index.vue +1 -1
  45. package/pages/[org]/[site]/access-mgmt/hid-cards/index.vue +1 -1
  46. package/pages/[org]/[site]/access-mgmt/hid-readers/index.vue +1 -1
  47. package/types/document.d.ts +0 -14
  48. package/types/facility.d.ts +0 -4
  49. package/types/member.d.ts +0 -4
  50. package/types/people.d.ts +1 -28
  51. package/types/service-provider.d.ts +0 -5
  52. package/types/site.d.ts +1 -7
  53. package/components/BuildingUnitManagement.vue +0 -298
  54. package/components/HidAccessPermissions.vue +0 -424
  55. package/components/HidProfileQrCode.vue +0 -332
  56. package/components/VehicleQrStickerDialog.vue +0 -249
  57. package/composables/useHidReaderSelection.ts +0 -50
  58. package/composables/useSiteCategory.ts +0 -45
  59. package/pages/[org]/[site]/access-mgmt/hid-qr-code/index.vue +0 -23
  60. package/utils/hid-enrolment-subject.ts +0 -344
  61. package/utils/hid-permission-assignments.ts +0 -198
  62. package/utils/hid-reader-selection.ts +0 -52
  63. package/utils/invite-group.ts +0 -61
  64. package/utils/invite-sites.ts +0 -25
  65. package/utils/occupancy-role.ts +0 -109
  66. package/utils/service-type.ts +0 -30
  67. package/utils/vehicle-qr-sticker.ts +0 -184
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @iservice365/layer-common
2
2
 
3
+ ## 4.90.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 46a3811: Phones: the robot site summary shows three cells per row (six in one row cut every label), and the Super Admin Client List stacks each client into a card (label: value) instead of a 1085px-wide table.
8
+
3
9
  ## 4.90.1
4
10
 
5
11
  ### Patch Changes
@@ -2016,11 +2022,11 @@
2016
2022
  `utils/console-tier.ts` + `composables/useConsoleTier.ts` mirror the server's
2017
2023
  own rule from two endpoints the console already calls, unprojected:
2018
2024
 
2019
- GET /api/members/user/:user/app/admin the Seven365 staff membership
2020
- GET /api/roles/id/:role that membership's role document
2025
+ GET /api/members/user/:user/app/admin the Seven365 staff membership
2026
+ GET /api/roles/id/:role that membership's role document
2021
2027
 
2022
- owner = member.type === "admin" && role.type === "admin" && role.default === true
2023
- staff = member.type === "admin" && role.type === "admin"
2028
+ owner = member.type === "admin" && role.type === "admin" && role.default === true
2029
+ staff = member.type === "admin" && role.type === "admin"
2024
2030
 
2025
2031
  `role.default` is the marker because it is the only property of a platform
2026
2032
  staff role no API caller can set - `role.controller.ts` validates create and
@@ -775,63 +775,6 @@ select option {
775
775
  box-shadow: var(--shadow-menu);
776
776
  }
777
777
 
778
- /* The filter box of a `searchable` AppSelect. Sticky rather than scrolled
779
- away with the options: the list it filters is long enough to need scrolling,
780
- which is the only reason the box is there. */
781
- .app-select__search {
782
- position: sticky;
783
- top: -6px;
784
- z-index: 1;
785
- display: flex;
786
- align-items: center;
787
- gap: 6px;
788
- margin: -6px -6px 4px;
789
- padding: 8px 10px;
790
- border-bottom: 1px solid var(--border);
791
- background: var(--card);
792
- color: var(--muted);
793
- }
794
-
795
- .app-select__search-input {
796
- flex: 1;
797
- min-width: 0;
798
- border: none;
799
- outline: none;
800
- background: none;
801
- font-family: var(--font-sans);
802
- font-size: var(--fs-cell);
803
- font-weight: 500;
804
- color: var(--text);
805
- }
806
-
807
- .app-select__search-input::placeholder {
808
- color: var(--muted);
809
- font-weight: 500;
810
- }
811
-
812
- .app-select__empty {
813
- margin: 0;
814
- padding: 10px 8px;
815
- font-family: var(--font-sans);
816
- font-size: var(--fs-cell);
817
- color: var(--muted);
818
- text-align: center;
819
- }
820
-
821
- /* The footer of a paging AppSelect. Same voice as the empty state - it is the
822
- same kind of message about the list rather than an option in it - with a rule
823
- above so it does not read as one more row to click. */
824
- .app-select__loading {
825
- margin: 6px 0 0;
826
- padding: 9px 8px;
827
- border-top: 1px solid var(--border);
828
- font-family: var(--font-sans);
829
- font-size: var(--fs-cell);
830
- font-weight: 600;
831
- color: var(--muted);
832
- text-align: center;
833
- }
834
-
835
778
  .app-select__option {
836
779
  display: flex;
837
780
  align-items: center;
@@ -809,14 +809,10 @@
809
809
  color: var(--muted);
810
810
  }
811
811
 
812
- /* The title-row search beside the primary button. `--search` alone is
813
- `flex: 1`, written for a filter row; in the actions group that collapses it,
814
- so it gets a fixed width here and never more than the row on a phone. */
815
- .table-card__search.app-field--search {
816
- flex: 0 0 auto;
817
- width: 260px;
818
- max-width: 100%;
819
- min-width: 0;
812
+ /* The in-card variant: 34px, 10px radius, as drawn. */
813
+ .table-card__search .v-field {
814
+ border-radius: var(--r-inner);
815
+ font-size: var(--fs-cell);
820
816
  }
821
817
 
822
818
  .table-card__primary {
@@ -47,30 +47,22 @@
47
47
  <div>
48
48
  <div class="card-details__label">User</div>
49
49
  <div class="card-details__value">
50
- <template v-if="holderState === 'named'">
51
- {{ holderName }}
52
- <template v-if="details.user?.email">({{ details.user.email }})</template>
53
- </template>
54
- <!-- Assigned, but the server did not send the name back. Saying
55
- so beats "N/A", which reads as "nobody holds this card". -->
56
- <template v-else-if="holderState === 'assigned'">
57
- <span class="text-medium-emphasis">Assigned — name unavailable</span>
58
- </template>
59
- <template v-else>Unassigned</template>
50
+ {{ details.userCred?.name ?? details.user?.name ?? "N/A" }}
51
+ <template v-if="details.user?.email">({{ details.user.email }})</template>
60
52
  </div>
61
53
  </div>
62
54
 
63
- <div v-if="holderType">
55
+ <div v-if="details.userType">
64
56
  <div class="card-details__label">User Type</div>
65
- <div class="card-details__value">{{ holderType }}</div>
57
+ <div class="card-details__value">{{ details.userType }}</div>
66
58
  </div>
67
59
 
68
60
  <!-- Visitor / Resident Credentials -->
69
61
  <template v-if="details.userCred">
70
62
  <v-divider />
71
- <!-- <div class="card-details__section">
63
+ <div class="card-details__section">
72
64
  {{ details.userType ?? "Visitor Information" }}
73
- </div> -->
65
+ </div>
74
66
 
75
67
  <div v-if="details.userCred.email">
76
68
  <div class="card-details__label">Email</div>
@@ -224,51 +216,6 @@ const sortedHistory = computed(() =>
224
216
  )
225
217
  );
226
218
 
227
- /**
228
- * WHO HOLDS THIS CARD.
229
- *
230
- * `userCred` is written by the visitor-pass flow and carries the person's
231
- * details on the card itself. `user` is the resolved account - the card only
232
- * stores `userId`, so the server has to join it.
233
- *
234
- * `card-details` does not do that join today (the lookup is commented out in
235
- * core's `getCardDetailsRepo`), so this is empty for every card assigned
236
- * through Assign to Person and the field falls through to `holderState`.
237
- * Nothing here needs to change when the join is restored.
238
- */
239
- const holderName = computed(
240
- () => details.value?.userCred?.name ?? details.value?.user?.name ?? "",
241
- );
242
-
243
- /**
244
- * A card with a `userId` IS assigned, whether or not the name came back.
245
- *
246
- * Printing "N/A" for both cases is the actual defect here: it reads as "nobody
247
- * holds this card", which is the opposite of the truth for an assigned one and
248
- * could have someone hand out a card that is already in use.
249
- */
250
- const holderState = computed<"named" | "assigned" | "unassigned">(() => {
251
- if (holderName.value) return "named";
252
- return details.value?.userId ? "assigned" : "unassigned";
253
- });
254
-
255
- /**
256
- * WHICH KIND OF PERSON HOLDS THIS CARD — Visitor/Resident, Management or
257
- * Service Provider, matching the groups Assign to Person offers.
258
- *
259
- * `holderType` is what the server should send once it records the category the
260
- * card was assigned under. `userType` is NOT that: it is the card's own pool,
261
- * and `getCardDetailsRepo` filters on `EAccessCardUserTypes.DEFAULT`, so every
262
- * card this dialog can load has the literal value "Visitor/Resident" whoever
263
- * actually holds it. Preferring `holderType` means a card given to Management
264
- * stops describing itself as a resident's the day the field arrives.
265
- *
266
- * Falls back to `userType` so nothing disappears in the meantime.
267
- */
268
- const holderType = computed(
269
- () => details.value?.holderType ?? details.value?.userType ?? "",
270
- );
271
-
272
219
  watch(
273
220
  () => props.modelValue,
274
221
  async (val) => {