@7365admin1/layer-common 3.2.1 → 3.2.2-staging.100

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 (123) hide show
  1. package/.changeset/camera-wall-gated-endpoint.md +47 -0
  2. package/.changeset/camera-wall-plain-english.md +60 -0
  3. package/.changeset/camera-wall-selection-and-guidance.md +65 -0
  4. package/.changeset/dark-primary-contrast.md +39 -0
  5. package/.changeset/dashboard-dark-theme-contrast.md +15 -0
  6. package/.changeset/notification-preferences.md +17 -0
  7. package/.changeset/pm-sidebar-grouping-and-list-scaffold.md +27 -0
  8. package/.changeset/service-provider-invitation-actions.md +28 -0
  9. package/assets/css/primitives.css +680 -0
  10. package/assets/css/screens.css +541 -0
  11. package/assets/css/shell.css +258 -0
  12. package/assets/css/tokens.css +220 -0
  13. package/components/AccessCardQrTagging.vue +1 -1
  14. package/components/AccessManagement.vue +53 -72
  15. package/components/AppButton.vue +52 -0
  16. package/components/AppCard.vue +20 -0
  17. package/components/AppDateField.vue +35 -0
  18. package/components/AppField.vue +46 -0
  19. package/components/AppKpiTile.vue +65 -0
  20. package/components/AppSegmented.vue +38 -0
  21. package/components/AppSelect.vue +203 -0
  22. package/components/AreaChecklistHistoryMain.vue +6 -2
  23. package/components/AreaMain.vue +9 -17
  24. package/components/AttendanceMain.vue +4 -3
  25. package/components/Avatar/Main.vue +54 -2
  26. package/components/BillingMain.vue +26 -30
  27. package/components/BuildingManagement/buildings.vue +27 -38
  28. package/components/BuildingManagement/units.vue +26 -42
  29. package/components/BulletinBoardManagement.vue +23 -10
  30. package/components/CameraWall.vue +1034 -0
  31. package/components/CameraWallTile.vue +818 -0
  32. package/components/CardToolbar.vue +37 -0
  33. package/components/CleaningScheduleMain.vue +29 -46
  34. package/components/ClientMain.vue +90 -78
  35. package/components/DashboardEmptyState.vue +11 -1
  36. package/components/DashboardMain.vue +349 -275
  37. package/components/DashboardPanel.vue +1 -1
  38. package/components/DocumentManagement.vue +129 -93
  39. package/components/EntryPassInformation.vue +4 -4
  40. package/components/EntryPassMain.vue +49 -27
  41. package/components/EquipmentItemMain.vue +4 -6
  42. package/components/EquipmentManagementMain.vue +9 -7
  43. package/components/FeedbackMain.vue +42 -56
  44. package/components/FormDialog.vue +60 -21
  45. package/components/HidAccessLogDashboard.vue +119 -44
  46. package/components/HidCameraCaptureDialog.vue +199 -0
  47. package/components/HidIntercomManagement.vue +825 -202
  48. package/components/HidQrCodeConfiguration.vue +927 -93
  49. package/components/HidServiceSettingsPanel.vue +20 -1
  50. package/components/HidUserEnrollment.vue +454 -106
  51. package/components/InvitationMain.vue +46 -61
  52. package/components/Layout/Header.vue +289 -37
  53. package/components/Layout/NavigationDrawer.vue +340 -30
  54. package/components/ManageChecklistMain.vue +17 -17
  55. package/components/MemberMain.vue +79 -60
  56. package/components/MyAttendanceMain.vue +3 -5
  57. package/components/NavigationItem.vue +9 -0
  58. package/components/Nfc/NFCPatrolRouteMain.vue +116 -103
  59. package/components/NotificationSettings.vue +361 -0
  60. package/components/OnlineFormConfigurationForm.vue +620 -224
  61. package/components/OnlineFormFill.vue +36 -8
  62. package/components/OnlineFormsConfiguration.vue +7 -3
  63. package/components/PageHeader.vue +43 -0
  64. package/components/PassInformation.vue +104 -45
  65. package/components/QrTemplate/CreditCardLandscape.vue +19 -12
  66. package/components/QrTemplate/PrintDialog.vue +209 -196
  67. package/components/RolePermissionMain.vue +184 -91
  68. package/components/ScanVisitorQRCode.vue +35 -7
  69. package/components/ScheduleAreaMain.vue +15 -49
  70. package/components/ScheduleTaskMain.vue +23 -26
  71. package/components/ScheduleTastTicketMain.vue +18 -43
  72. package/components/ServiceProviderInvitationPrompt.vue +150 -0
  73. package/components/ServiceProviderMain.vue +346 -157
  74. package/components/SiteSettings.vue +25 -10
  75. package/components/SpecificAttr.vue +10 -2
  76. package/components/StatusChip.vue +93 -0
  77. package/components/SwitchContext.vue +33 -1
  78. package/components/TableHygiene.vue +29 -46
  79. package/components/TableList.vue +1 -1
  80. package/components/TableListSecondary.vue +1 -1
  81. package/components/TableMain.vue +161 -77
  82. package/components/TableV3.vue +61 -66
  83. package/components/UnitMain.vue +9 -17
  84. package/components/VehicleManagement.vue +20 -9
  85. package/components/VisitorForm.vue +294 -78
  86. package/components/VisitorManagement.vue +221 -71
  87. package/components/VisitorSocketPopUp.vue +56 -2
  88. package/components/WorkOrder/Main.vue +42 -51
  89. package/composables/useComment.ts +3 -3
  90. package/composables/useHidAmico.ts +151 -0
  91. package/composables/useHidNavigation.ts +0 -7
  92. package/composables/useLocalAuth.ts +9 -36
  93. package/composables/useNotificationPreference.ts +87 -0
  94. package/composables/useOnlineFormPages.ts +2 -0
  95. package/composables/useOrg.ts +1 -1
  96. package/composables/useRole.ts +22 -0
  97. package/composables/useServiceProviderInvitation.ts +145 -0
  98. package/composables/useSipWebPhone.ts +336 -0
  99. package/composables/useSiteSettings.ts +50 -0
  100. package/composables/useThemePreference.ts +63 -0
  101. package/composables/useVisitor.ts +6 -1
  102. package/composables/useVisitorSocket.ts +26 -0
  103. package/composables/useWebUsb.ts +127 -37
  104. package/nuxt.config.ts +31 -0
  105. package/package.json +4 -1
  106. package/pages/[org]/[site]/access-mgmt/intercom/index.vue +1 -1
  107. package/pages/notification-settings.vue +19 -0
  108. package/plugins/secure-member.client.ts +21 -56
  109. package/plugins/vuetify.ts +68 -9
  110. package/test/visitor-socket.test.mjs +36 -0
  111. package/types/org.d.ts +2 -0
  112. package/types/site.d.ts +71 -0
  113. package/utils/camera-wall.test.ts +571 -0
  114. package/utils/camera-wall.ts +926 -0
  115. package/utils/nav-sections.test.ts +190 -0
  116. package/utils/nav-sections.ts +151 -0
  117. package/utils/status.test.ts +77 -0
  118. package/utils/status.ts +90 -0
  119. package/utils/theme.test.ts +534 -0
  120. package/utils/theme.ts +294 -0
  121. package/components/HidIdentityMapping.vue +0 -975
  122. package/middleware/member.ts +0 -4
  123. package/pages/[org]/[site]/access-mgmt/identity-mapping/index.vue +0 -23
@@ -1,46 +1,35 @@
1
1
  <template>
2
2
  <v-row no-gutters>
3
- <v-col cols="12" class="mb-2">
4
- <v-row no-gutters>
5
- <v-btn class="text-none" rounded="pill" variant="tonal" @click="setBuilding()" size="large"
6
- v-if="canCreate && canCreateBuilding">
7
- Add Block
8
- </v-btn>
9
- </v-row>
10
- </v-col>
3
+ <!-- Title row; nav calls this screen "Blocks". The Add pill moves onto it. -->
11
4
  <v-col cols="12">
12
- <v-card width="100%" variant="outlined" border="thin" rounded="lg" :loading="loading">
13
- <v-toolbar density="compact" color="grey-lighten-4">
14
- <template #prepend>
15
- <v-btn fab icon density="comfortable" @click="getBuildings()">
16
- <v-icon>mdi-refresh</v-icon>
17
- </v-btn>
18
- <v-text-field v-model="searchInput" autocomplete="off" placeholder="Search" density="compact" hide-details
19
- dense clearable class="mx-2" style="width: 200px;" />
20
- </template>
21
-
22
- <template #append>
23
- <v-row no-gutters justify="end" align="center">
24
- <span class="mr-2 text-caption text-fontgray">
25
- {{ pageRange }}
26
- </span>
27
- <local-pagination v-model="page" :length="pages" @update:value="getBuildings()" />
28
- </v-row>
29
- </template>
30
- </v-toolbar>
31
-
32
- <v-data-table :headers="headers" :items="items" item-value="_id" items-per-page="20" fixed-header
33
- hide-default-footer @click:row="tableRowClickHandler" style="max-height: calc(100vh - (200px))">
34
- <template #item.createdAt="{ value }">
35
- {{ new Date(value).toLocaleDateString() }}
36
- </template>
37
- <template #item.levels="{ item }">
38
- {{ item.levels.length }}
39
- </template>
40
- </v-data-table>
41
- </v-card>
5
+ <PageHeader title="Blocks">
6
+ <template #actions>
7
+ <AppButton v-if="canCreate && canCreateBuilding" icon="mdi-plus" @click="setBuilding()">
8
+ Add Block
9
+ </AppButton>
10
+ </template>
11
+ </PageHeader>
42
12
  </v-col>
43
13
 
14
+ <!--
15
+ Was `v-card` + a `grey-lighten-4` `v-toolbar` + a bare `v-data-table`.
16
+ `TableMain` draws the same card, the same refresh/search/page-range/pager
17
+ row and the same table - with the design's uppercase header row.
18
+ -->
19
+ <TableMain :headers="headers" :items="items" :loading="loading" :page="page" :pages="pages"
20
+ :pageRange="pageRange" show-header @refresh="getBuildings()"
21
+ @update:page="page = $event; getBuildings()" @row-click="(data: any) => tableRowClickHandler(null, data)">
22
+ <template #prepend-additional>
23
+ <AppField v-model="searchInput" search compact placeholder="Search" klass="app-toolbar__search" />
24
+ </template>
25
+ <template #item.createdAt="{ value }">
26
+ {{ new Date(value).toLocaleDateString() }}
27
+ </template>
28
+ <template #item.levels="{ item }">
29
+ {{ item.levels.length }}
30
+ </template>
31
+ </TableMain>
32
+
44
33
  <!-- Create Dialog -->
45
34
  <v-dialog v-model="createDialog" width="450" persistent>
46
35
  <BuildingForm :site="site" mode="add" :blocks="items" @cancel="createDialog = false" @success="successCreate()"
@@ -1,50 +1,34 @@
1
1
  <template>
2
2
  <v-row no-gutters>
3
- <v-col cols="12" class="mb-2">
4
- <v-row no-gutters>
5
- <v-btn class="text-none" rounded="pill" variant="tonal" @click="setBuilding()" size="large"
6
- v-if="canCreate && canCreateUnit">
7
- Add Unit
8
- </v-btn>
9
- <v-btn class="text-none ml-2" rounded="pill" variant="tonal" @click="openBulkUploadFilePicker()" size="large"
10
- :loading="bulkUploadLoading" v-if="canCreate && canCreateUnit">
11
- <v-icon start>mdi-upload</v-icon>
12
- Bulk Upload
13
- </v-btn>
14
- <input ref="bulkUploadFileInput" type="file" accept=".xlsx,.xls,.csv" class="d-none"
15
- @change="handleBulkUploadFileChange" />
16
- </v-row>
17
- </v-col>
3
+ <!-- Title row; nav calls this screen "Units". Both pills move onto it. -->
18
4
  <v-col cols="12">
19
- <v-card width="100%" variant="outlined" border="thin" rounded="lg" :loading="loading">
20
- <v-toolbar density="compact" color="grey-lighten-4">
21
- <template #prepend>
22
- <v-btn fab icon density="comfortable" @click="getBuildingUnit()">
23
- <v-icon>mdi-refresh</v-icon>
24
- </v-btn>
25
- <v-text-field v-model="searchInput" placeholder="Search" density="compact" hide-details dense clearable
26
- class="mx-2" style="width: 200px;" />
27
- </template>
28
-
29
- <template #append>
30
- <v-row no-gutters justify="end" align="center">
31
- <span class="mr-2 text-caption text-fontgray">
32
- {{ pageRange }}
33
- </span>
34
- <local-pagination v-model="page" :length="pages" @update:value="getBuildingUnit()" />
35
- </v-row>
36
- </template>
37
- </v-toolbar>
38
-
39
- <v-data-table :headers="props.headers" :items="items" item-value="_id" items-per-page="20" fixed-header
40
- hide-default-footer @click:row="tableRowClickHandler" style="max-height: calc(100vh - (200px))">
41
- <template #item.block="{ value, item }">
42
- {{ value ? `Block ${value}` : "" }}
43
- </template>
44
- </v-data-table>
45
- </v-card>
5
+ <PageHeader title="Units">
6
+ <template #actions>
7
+ <AppButton v-if="canCreate && canCreateUnit" variant="ghost" icon="mdi-upload"
8
+ :disabled="bulkUploadLoading" @click="openBulkUploadFilePicker()">
9
+ Bulk Upload
10
+ </AppButton>
11
+ <AppButton v-if="canCreate && canCreateUnit" icon="mdi-plus" @click="setBuilding()">
12
+ Add Unit
13
+ </AppButton>
14
+ </template>
15
+ </PageHeader>
16
+ <input ref="bulkUploadFileInput" type="file" accept=".xlsx,.xls,.csv" class="d-none"
17
+ @change="handleBulkUploadFileChange" />
46
18
  </v-col>
47
19
 
20
+ <!-- Was `v-card` + a `grey-lighten-4` `v-toolbar` + a bare `v-data-table`. -->
21
+ <TableMain :headers="props.headers" :items="items" :loading="loading" :page="page" :pages="pages"
22
+ :pageRange="pageRange" show-header @refresh="getBuildingUnit()"
23
+ @update:page="page = $event; getBuildingUnit()" @row-click="(data: any) => tableRowClickHandler(null, data)">
24
+ <template #prepend-additional>
25
+ <AppField v-model="searchInput" search compact placeholder="Search" klass="app-toolbar__search" />
26
+ </template>
27
+ <template #item.block="{ value, item }">
28
+ {{ value ? `Block ${value}` : "" }}
29
+ </template>
30
+ </TableMain>
31
+
48
32
  <!-- Create Dialog -->
49
33
  <v-dialog v-model="createDialog" :width="smAndUp ? '50svw' : '100%'" persistent>
50
34
  <BuildingUnitFormAdd :site="site" @cancel="createDialog = false" @success="successCreate()"
@@ -1,17 +1,30 @@
1
1
  <template>
2
2
  <v-row no-gutters>
3
+ <!-- Title left, primary action right - the design's opening row. -->
4
+ <v-col cols="12">
5
+ <PageHeader title="Bulletin Board">
6
+ <template #actions>
7
+ <AppButton v-if="canCreateBulletinBoard" icon="mdi-plus" @click="handleCreateEvent">
8
+ Add Announcement
9
+ </AppButton>
10
+ </template>
11
+ </PageHeader>
12
+ </v-col>
13
+
3
14
  <TableMain :headers="headers" :items="paginatePlaceholderItem" v-model:search="searchInput"
4
15
  :loading="getAnnouncementPending" :page="page" :pages="pages" :pageRange="pageRange"
5
- @refresh="getAnnouncementsRefresh" :show-header="APP_CONSTANTS.RESIDENT === props.recipients" @update:page="handleUpdatePage" @row-click="handleRowClick"
6
- @create="handleCreateEvent" :can-create="canCreateBulletinBoard" create-label="Add Announcement">
7
- <template #extension>
8
- <v-row no-gutters class="w-100 d-flex flex-column">
9
- <v-tabs v-model="status" color="primary" :height="40" @update:model-value="toRoute" class="w-100">
10
- <v-tab v-for="tab in tabOptions" :value="tab.status" :key="tab.status" class="text-capitalize">
11
- {{ tab.name }}
12
- </v-tab>
13
- </v-tabs>
14
- </v-row>
16
+ @refresh="getAnnouncementsRefresh" :show-header="APP_CONSTANTS.RESIDENT === props.recipients" @update:page="handleUpdatePage" @row-click="handleRowClick">
17
+ <!--
18
+ The tabs move ONTO the toolbar row (the design draws them there)
19
+ instead of a stacked strip above the table. Same options, same
20
+ order, same `toRoute` - which already sets the status itself.
21
+ -->
22
+ <template #tabs>
23
+ <button v-for="tab in tabOptions" :key="tab.status" type="button" role="tab" class="app-tab"
24
+ :class="{ 'app-tab--active': status === tab.status }" :aria-selected="status === tab.status"
25
+ @click="status = tab.status as any; toRoute(tab.status)">
26
+ {{ tab.name }}
27
+ </button>
15
28
  </template>
16
29
 
17
30
  <template v-slot:item.createdAt="{ item }">