@7365admin1/layer-common 4.90.2-staging.491 → 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.
- package/CHANGELOG.md +10 -4
- package/assets/css/primitives.css +0 -57
- package/assets/css/screens.css +4 -8
- package/components/AccessCardDetailsDialog.vue +6 -59
- package/components/AccessCardPreviewDialog.vue +53 -371
- package/components/AppSelect.vue +4 -143
- package/components/BuildingUnitFormEdit.vue +0 -6
- package/components/Dialog/UpdateMoreAction.vue +1 -11
- package/components/DocumentForm.vue +112 -407
- package/components/DocumentManagement.vue +12 -213
- package/components/Facility/BookingSetup.vue +0 -63
- package/components/HidAccessLogDashboard.vue +17 -74
- package/components/HidIntercomManagement.vue +14 -183
- package/components/HidQrCodeConfiguration.vue +195 -17
- package/components/HidReaderManagement.vue +0 -398
- package/components/HidReaderUserRoster.vue +3 -44
- package/components/HidUserEnrollment.vue +292 -2255
- package/components/InventoryItemDetail.vue +1 -2
- package/components/InventoryLinesDialog.vue +13 -91
- package/components/InventoryPhotoInput.vue +6 -44
- package/components/InventoryReportsTab.vue +3 -23
- package/components/InventoryRequestsTab.vue +4 -27
- package/components/InventoryStockTab.vue +0 -3
- package/components/InvitationClientForm.vue +1 -19
- package/components/InvitationForm.vue +4 -31
- package/components/InvitationMain.vue +22 -124
- package/components/MemberInformation.vue +4 -4
- package/components/PassInformation.vue +2 -2
- package/components/SiteSettings.vue +0 -48
- package/components/TableMain.vue +7 -22
- package/components/VehicleManagement.vue +5 -80
- package/components/VisitorForm.vue +19 -65
- package/components/VisitorManagement.vue +5 -267
- package/composables/useAccessManagement.ts +1 -17
- package/composables/useDocument.ts +0 -7
- package/composables/useFacility.ts +0 -11
- package/composables/useHidAmico.ts +0 -165
- package/composables/useHidNavigation.ts +1 -25
- package/composables/useInventory.ts +1 -4
- package/composables/useMember.ts +0 -12
- package/composables/useNFCPatrolReportFilters.ts +3 -21
- package/composables/useNFCPatrolRoute.ts +1 -8
- package/composables/usePeople.ts +0 -19
- package/composables/useServiceProvider.ts +2 -45
- package/composables/useSettingsPermission.ts +0 -14
- package/composables/useUser.ts +2 -6
- package/composables/useVehicle.ts +1 -40
- package/composables/useVerification.ts +0 -3
- package/middleware/01.auth.ts +7 -3
- package/package.json +1 -1
- package/pages/[org]/[site]/access-mgmt/administrator/index.vue +1 -1
- package/pages/[org]/[site]/access-mgmt/hid-cards/index.vue +1 -1
- package/pages/[org]/[site]/access-mgmt/hid-readers/index.vue +1 -1
- package/types/document.d.ts +0 -14
- package/types/facility.d.ts +0 -4
- package/types/inventory.d.ts +0 -27
- package/types/member.d.ts +0 -4
- package/types/people.d.ts +1 -28
- package/types/service-provider.d.ts +0 -5
- package/types/site.d.ts +1 -7
- package/components/BuildingUnitManagement.vue +0 -298
- package/components/HidAccessPermissions.vue +0 -424
- package/components/HidProfileQrCode.vue +0 -332
- package/components/InventoryPoDialog.vue +0 -111
- package/components/VehicleQrStickerDialog.vue +0 -249
- package/composables/useHidReaderSelection.ts +0 -50
- package/composables/useSiteCategory.ts +0 -45
- package/pages/[org]/[site]/access-mgmt/hid-qr-code/index.vue +0 -23
- package/utils/hid-enrolment-subject.ts +0 -344
- package/utils/hid-permission-assignments.ts +0 -198
- package/utils/hid-reader-selection.ts +0 -52
- package/utils/inventory-receiving.ts +0 -90
- package/utils/invite-group.ts +0 -61
- package/utils/invite-sites.ts +0 -25
- package/utils/occupancy-role.ts +0 -109
- package/utils/service-type.ts +0 -30
- 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
|
-
|
|
2020
|
-
|
|
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
|
-
|
|
2023
|
-
|
|
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;
|
package/assets/css/screens.css
CHANGED
|
@@ -809,14 +809,10 @@
|
|
|
809
809
|
color: var(--muted);
|
|
810
810
|
}
|
|
811
811
|
|
|
812
|
-
/* The
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
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
|
-
|
|
51
|
-
|
|
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="
|
|
55
|
+
<div v-if="details.userType">
|
|
64
56
|
<div class="card-details__label">User Type</div>
|
|
65
|
-
<div class="card-details__value">{{
|
|
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
|
-
|
|
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) => {
|