@7365admin1/layer-common 1.8.0

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 (198) hide show
  1. package/.changeset/README.md +8 -0
  2. package/.changeset/config.json +11 -0
  3. package/.editorconfig +12 -0
  4. package/.github/workflows/main.yml +17 -0
  5. package/.github/workflows/publish.yml +39 -0
  6. package/.nuxtrc +1 -0
  7. package/.playground/app.vue +41 -0
  8. package/.playground/eslint.config.mjs +6 -0
  9. package/.playground/nuxt.config.ts +22 -0
  10. package/.playground/pages/feedback.vue +30 -0
  11. package/CHANGELOG.md +263 -0
  12. package/README.md +73 -0
  13. package/app.vue +3 -0
  14. package/components/AccessCardAddForm.vue +363 -0
  15. package/components/AccessManagement.vue +420 -0
  16. package/components/Avatar/Main.vue +68 -0
  17. package/components/BillingMain.vue +66 -0
  18. package/components/BtnUploadFile.vue +139 -0
  19. package/components/BuildingForm.vue +303 -0
  20. package/components/BuildingManagement/buildings.vue +335 -0
  21. package/components/BuildingManagement/units.vue +350 -0
  22. package/components/BuildingUnitFormAdd.vue +441 -0
  23. package/components/BuildingUnitFormEdit.vue +429 -0
  24. package/components/CameraForm.vue +264 -0
  25. package/components/CameraMain.vue +352 -0
  26. package/components/Card/DeleteConfirmation.vue +51 -0
  27. package/components/Card/MemberInfoSummary.vue +44 -0
  28. package/components/Card/Toggle.vue +25 -0
  29. package/components/Chat/Bubbles.vue +53 -0
  30. package/components/Chat/Information.vue +416 -0
  31. package/components/Chat/ListCard.vue +62 -0
  32. package/components/Chat/Message.vue +158 -0
  33. package/components/Chat/Navigation.vue +150 -0
  34. package/components/ConfirmDialog.vue +66 -0
  35. package/components/Container/Standard.vue +33 -0
  36. package/components/DashboardPlaceholder.vue +1524 -0
  37. package/components/Dialog/DeleteConfirmation.vue +51 -0
  38. package/components/Dialog/ReplaceAutofillPrompt.vue +49 -0
  39. package/components/Dialog/UpdateMoreAction.vue +103 -0
  40. package/components/DocumentForm.vue +187 -0
  41. package/components/DocumentManagement.vue +376 -0
  42. package/components/Editor.vue +95 -0
  43. package/components/EntryPassMain.vue +518 -0
  44. package/components/Feedback/Form.vue +173 -0
  45. package/components/FeedbackDetail.vue +599 -0
  46. package/components/FeedbackMain.vue +588 -0
  47. package/components/FormDialog.vue +65 -0
  48. package/components/ImageCarousel.vue +138 -0
  49. package/components/Input/Date.vue +177 -0
  50. package/components/Input/DateTimePicker.vue +131 -0
  51. package/components/Input/File.vue +236 -0
  52. package/components/Input/FileV2.vue +234 -0
  53. package/components/Input/InputPhoneNumberV2.vue +164 -0
  54. package/components/Input/ListGroupSelection.vue +96 -0
  55. package/components/Input/NRICNumber.vue +53 -0
  56. package/components/Input/NewDate.vue +123 -0
  57. package/components/Input/Number.vue +124 -0
  58. package/components/Input/Password.vue +22 -0
  59. package/components/Input/PhoneNumber.vue +188 -0
  60. package/components/Input/VehicleNumber.vue +49 -0
  61. package/components/InputLabel.vue +22 -0
  62. package/components/InvitationForm.vue +359 -0
  63. package/components/InvitationMain.vue +310 -0
  64. package/components/Layout/Header.vue +129 -0
  65. package/components/Layout/NavigationDrawer.vue +44 -0
  66. package/components/ListItem.vue +35 -0
  67. package/components/ListView.vue +87 -0
  68. package/components/LocalPagination.vue +31 -0
  69. package/components/MemberMain.vue +459 -0
  70. package/components/NFC/NFCPatrolReportMain.vue +591 -0
  71. package/components/NFC/NFCPatrolRouteForm.vue +596 -0
  72. package/components/NFC/NFCPatrolRouteMain.vue +539 -0
  73. package/components/NFC/NFCTagForm.vue +236 -0
  74. package/components/NFC/NFCTagMain.vue +337 -0
  75. package/components/NFC/PatrolSettings.vue +130 -0
  76. package/components/NavigationItem.vue +83 -0
  77. package/components/NumberSettingField.vue +107 -0
  78. package/components/OnlineFormConfigurationForm.vue +290 -0
  79. package/components/OnlineFormsConfiguration.vue +429 -0
  80. package/components/PeopleForm.vue +452 -0
  81. package/components/PlaceholderComponent.vue +34 -0
  82. package/components/RolePermissionFormCreate.vue +161 -0
  83. package/components/RolePermissionFormPreviewUpdate.vue +183 -0
  84. package/components/RolePermissionMain.vue +361 -0
  85. package/components/SearchVehicleNumberUser.vue +91 -0
  86. package/components/ServiceProviderFormCreate.vue +154 -0
  87. package/components/ServiceProviderMain.vue +547 -0
  88. package/components/SignaturePad.vue +73 -0
  89. package/components/Snackbar.vue +23 -0
  90. package/components/SpecificAttr.vue +53 -0
  91. package/components/SupplyManagement.vue +292 -0
  92. package/components/SwitchContext.vue +108 -0
  93. package/components/TableList.vue +150 -0
  94. package/components/TableListSecondary.vue +164 -0
  95. package/components/TableMain.vue +142 -0
  96. package/components/TableWithButton.vue +94 -0
  97. package/components/VehicleUpdateMoreAction.vue +84 -0
  98. package/components/VideoPlayer.vue +125 -0
  99. package/components/VisitorForm.vue +659 -0
  100. package/components/VisitorFormSelection.vue +53 -0
  101. package/components/VisitorManagement.vue +490 -0
  102. package/components/WorkOrder/Create.vue +284 -0
  103. package/components/WorkOrder/Detail.vue +71 -0
  104. package/components/WorkOrder/ListView.vue +96 -0
  105. package/components/WorkOrder/Main.vue +489 -0
  106. package/components/Workorder.vue +1 -0
  107. package/composables/useAddress.ts +107 -0
  108. package/composables/useBuilding.ts +250 -0
  109. package/composables/useBuildingUnit.ts +116 -0
  110. package/composables/useCard.ts +46 -0
  111. package/composables/useCommonPermission.ts +207 -0
  112. package/composables/useCustomer.ts +113 -0
  113. package/composables/useCustomerSite.ts +56 -0
  114. package/composables/useDashboard.ts +31 -0
  115. package/composables/useDashboardData.ts +425 -0
  116. package/composables/useDocument.ts +57 -0
  117. package/composables/useFacility.ts +246 -0
  118. package/composables/useFeedback.ts +119 -0
  119. package/composables/useFile.ts +55 -0
  120. package/composables/useInvoice.ts +18 -0
  121. package/composables/useLocal.ts +131 -0
  122. package/composables/useLocalAuth.ts +137 -0
  123. package/composables/useLocalSetup.ts +13 -0
  124. package/composables/useMember.ts +111 -0
  125. package/composables/useNFCPatrolRoute.ts +77 -0
  126. package/composables/useNFCPatrolSettings.ts +19 -0
  127. package/composables/useNFCPatrolTag.ts +53 -0
  128. package/composables/useOnlineForm.ts +67 -0
  129. package/composables/useOrg.ts +129 -0
  130. package/composables/usePDFDownload.ts +25 -0
  131. package/composables/usePaymentMethod.ts +101 -0
  132. package/composables/usePeople.ts +81 -0
  133. package/composables/usePermission.ts +54 -0
  134. package/composables/usePhoneCountries.ts +561 -0
  135. package/composables/usePrice.ts +15 -0
  136. package/composables/usePromoCode.ts +36 -0
  137. package/composables/useRecapPermission.ts +26 -0
  138. package/composables/useRole.ts +104 -0
  139. package/composables/useSecurityUtils.ts +18 -0
  140. package/composables/useServiceProvider.ts +224 -0
  141. package/composables/useSite.ts +109 -0
  142. package/composables/useSiteEntryPassSettings.ts +46 -0
  143. package/composables/useSiteSettings.ts +123 -0
  144. package/composables/useSubscription.ts +150 -0
  145. package/composables/useUser.ts +132 -0
  146. package/composables/useUtils.ts +445 -0
  147. package/composables/useVerification.ts +34 -0
  148. package/composables/useVisitor.ts +120 -0
  149. package/composables/useWorkOrder.ts +85 -0
  150. package/error.vue +41 -0
  151. package/layouts/plain.vue +7 -0
  152. package/middleware/01.auth.ts +20 -0
  153. package/middleware/02.org.ts +21 -0
  154. package/middleware/03.customer.ts +13 -0
  155. package/middleware/member.ts +4 -0
  156. package/nuxt.config.ts +54 -0
  157. package/package.json +39 -0
  158. package/pages/index.vue +3 -0
  159. package/pages/payment-method-linked.vue +31 -0
  160. package/pages/require-customer.vue +56 -0
  161. package/pages/require-organization-membership.vue +47 -0
  162. package/pages/unauthorized.vue +29 -0
  163. package/plugins/API.ts +21 -0
  164. package/plugins/iconify.client.ts +5 -0
  165. package/plugins/secure-member.client.ts +86 -0
  166. package/plugins/vuetify.ts +62 -0
  167. package/public/bg-camera.jpg +0 -0
  168. package/public/bg-city.jpg +0 -0
  169. package/public/bg-condo.jpg +0 -0
  170. package/public/images/icons/delete-icon.png +0 -0
  171. package/public/sprite.svg +1 -0
  172. package/tsconfig.json +3 -0
  173. package/types/address.d.ts +13 -0
  174. package/types/building.d.ts +27 -0
  175. package/types/camera.d.ts +31 -0
  176. package/types/card.d.ts +22 -0
  177. package/types/customer.d.ts +27 -0
  178. package/types/document.d.ts +6 -0
  179. package/types/feedback.d.ts +68 -0
  180. package/types/local.d.ts +74 -0
  181. package/types/member.d.ts +21 -0
  182. package/types/online-form.d.ts +15 -0
  183. package/types/org.d.ts +13 -0
  184. package/types/people.d.ts +24 -0
  185. package/types/permission.d.ts +25 -0
  186. package/types/phone-number.d.ts +10 -0
  187. package/types/price.d.ts +17 -0
  188. package/types/promo-code.d.ts +19 -0
  189. package/types/role.d.ts +11 -0
  190. package/types/select.d.ts +4 -0
  191. package/types/service-provider.d.ts +15 -0
  192. package/types/site.d.ts +20 -0
  193. package/types/subscription.d.ts +23 -0
  194. package/types/user.d.ts +19 -0
  195. package/types/verification.d.ts +20 -0
  196. package/types/visitor.d.ts +42 -0
  197. package/types/work-order.d.ts +42 -0
  198. package/utils/phoneMasks.ts +1703 -0
@@ -0,0 +1,350 @@
1
+ <template>
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-row>
10
+ </v-col>
11
+ <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="getBuildingUnit()">
16
+ <v-icon>mdi-refresh</v-icon>
17
+ </v-btn>
18
+ </template>
19
+
20
+ <template #append>
21
+ <v-row no-gutters justify="end" align="center">
22
+ <span class="mr-2 text-caption text-fontgray">
23
+ {{ pageRange }}
24
+ </span>
25
+ <local-pagination v-model="page" :length="pages" @update:value="getBuildingUnit()" />
26
+ </v-row>
27
+ </template>
28
+ </v-toolbar>
29
+
30
+ <v-data-table :headers="props.headers" :items="items" item-value="_id" items-per-page="20" fixed-header
31
+ hide-default-footer hide-default-header @click:row="tableRowClickHandler"
32
+ style="max-height: calc(100vh - (200px))">
33
+ <template #item.block="{ value }">
34
+ {{ value ? `blk ${value}` : "" }}
35
+ </template>
36
+ </v-data-table>
37
+ </v-card>
38
+ </v-col>
39
+
40
+ <!-- Create Dialog -->
41
+ <v-dialog v-model="createDialog" width="450" persistent>
42
+ <BuildingUnitFormAdd :site="site" @cancel="createDialog = false" @success="successCreate()"
43
+ @success:create-more="getBuildingUnit()" />
44
+ </v-dialog>
45
+
46
+ <!-- Edit Dialog -->
47
+ <v-dialog v-model="dialogEdit" width="450" persistent>
48
+ <BuildingUnitFormEdit v-if="selectedBuildingUnit" @cancel="dialogEdit = false" @success="successUpdate()"
49
+ :roomFacility="selectedBuildingUnit" />
50
+ </v-dialog>
51
+
52
+ <!-- Preview Dialog -->
53
+ <v-dialog v-if="canViewUnitDetails" v-model="dialogPreview" width="450" persistent>
54
+ <v-card width="100%">
55
+ <v-card-text style="max-height: 100vh; overflow-y: auto" class="pb-0">
56
+ <v-row no-gutters v-if="selectedBuildingUnit" class="mb-4">
57
+ <v-col cols="12">
58
+ <strong>Name:</strong> {{ selectedBuildingUnit.name }}
59
+ </v-col>
60
+
61
+ <v-col cols="12">
62
+ <strong>Block:</strong>
63
+ {{ selectedBuildingUnit.block }}
64
+ </v-col>
65
+
66
+ <v-col cols="12">
67
+ <strong>Floors:</strong>
68
+ {{ selectedBuildingUnit.level }}
69
+ </v-col>
70
+
71
+ <v-col cols="12">
72
+ <strong>Category:</strong>
73
+ {{ selectedBuildingUnit.category }}
74
+ </v-col>
75
+
76
+ <template v-if="selectedBuildingUnit?.buildingUnitFiles.length > 0">
77
+ <v-col cols="12">
78
+ <strong>Uploaded Files:</strong>
79
+ </v-col>
80
+ <v-col cols="12">
81
+ <InputFileV2 :model-value="selectedBuildingUnit?.buildingUnitFiles" view-mode />
82
+ </v-col>
83
+ </template>
84
+ </v-row>
85
+ </v-card-text>
86
+
87
+ <v-toolbar class="pa-0" density="compact">
88
+ <v-row no-gutters>
89
+ <v-col cols="6" class="pa-0">
90
+ <v-btn block variant="text" class="text-none" size="large" @click="dialogPreview = false" height="48">
91
+ Close
92
+ </v-btn>
93
+ </v-col>
94
+
95
+ <v-col cols="6" class="pa-0" v-if="canUpdate">
96
+ <v-menu>
97
+ <template #activator="{ props }">
98
+ <v-btn block variant="flat" color="black" class="text-none" height="48" v-bind="props" tile
99
+ :disabled="!canUpdateUnit && !canDeleteUnit">
100
+ More actions
101
+ </v-btn>
102
+ </template>
103
+
104
+ <v-list class="pa-0">
105
+ <v-list-item v-if="canUpdateUnit" @click="openEditDialog()">
106
+ <v-list-item-title class="text-subtitle-2">
107
+ Edit Unit
108
+ </v-list-item-title>
109
+ </v-list-item>
110
+
111
+ <v-list-item v-if="canDeleteUnit" @click="openDeleteDialog()" class="text-red">
112
+ <v-list-item-title class="text-subtitle-2">
113
+ Delete Unit
114
+ </v-list-item-title>
115
+ </v-list-item>
116
+ </v-list>
117
+ </v-menu>
118
+ </v-col>
119
+ </v-row>
120
+ </v-toolbar>
121
+ </v-card>
122
+ </v-dialog>
123
+
124
+ <v-dialog v-model="dialogDelete" :loading="deleteLoading" width="450" persistent>
125
+ <v-card width="100%">
126
+ <v-toolbar density="compact" class="pl-4">
127
+ <span class="font-weight-medium text-h5">Delete Unit</span>
128
+ </v-toolbar>
129
+
130
+ <v-card-text>
131
+ <p class="text-subtitle-2 text-center">
132
+ Are you sure you want to delete this unit? This action cannot be
133
+ undone.
134
+ </p>
135
+
136
+ <v-row v-if="message" no-gutters justify="center" class="mt-4">
137
+ <span class="text-caption text-error text-center">
138
+ {{ message }}
139
+ </span>
140
+ </v-row>
141
+ </v-card-text>
142
+
143
+ <v-toolbar density="compact">
144
+ <v-row no-gutters>
145
+ <v-col cols="6">
146
+ <v-btn tile block size="48" variant="text" class="text-none" @click="dialogDelete = false"
147
+ :disabled="deleteLoading">
148
+ Close
149
+ </v-btn>
150
+ </v-col>
151
+ <v-col cols="6">
152
+ <v-btn tile block size="48" color="black" variant="flat" class="text-none"
153
+ @click="handleDeleteBuildingUnit" :loading="deleteLoading">
154
+ Delete Unit
155
+ </v-btn>
156
+ </v-col>
157
+ </v-row>
158
+ </v-toolbar>
159
+ </v-card>
160
+ </v-dialog>
161
+
162
+ <Snackbar v-model="messageSnackbar" :text="message" :color="messageColor" />
163
+ </v-row>
164
+ </template>
165
+
166
+ <script setup lang="ts">
167
+ const props = defineProps({
168
+ headers: {
169
+ type: Array as PropType<Array<Record<string, any>>>,
170
+ default: () => [
171
+ {
172
+ title: "Name",
173
+ value: "name",
174
+ },
175
+ {
176
+ title: "Building",
177
+ value: "buildingName",
178
+ },
179
+ {
180
+ title: "Block",
181
+ value: "block",
182
+ },
183
+ {
184
+ title: "Floor",
185
+ value: "level",
186
+ },
187
+ {
188
+ title: "Category",
189
+ value: "category",
190
+ },
191
+ {
192
+ title: "Type",
193
+ value: "type",
194
+ },
195
+ { title: "Action", value: "action-table" },
196
+ ],
197
+ },
198
+ canCreate: {
199
+ type: Boolean,
200
+ default: true,
201
+ },
202
+ canUpdate: {
203
+ type: Boolean,
204
+ default: true,
205
+ },
206
+ canDelete: {
207
+ type: Boolean,
208
+ default: true,
209
+ },
210
+ canCreateUnit: {
211
+ type: Boolean,
212
+ default: true,
213
+ },
214
+ canUpdateUnit: {
215
+ type: Boolean,
216
+ default: true,
217
+ },
218
+ canDeleteUnit: {
219
+ type: Boolean,
220
+ default: true,
221
+ },
222
+ canViewUnitDetails: {
223
+ type: Boolean,
224
+ default: true,
225
+ },
226
+ });
227
+
228
+ const site = (useRoute().params.site as string) ?? "";
229
+ const status = (useRoute().params.status as string) ?? "active";
230
+
231
+ const { toOrdinal } = useUtils();
232
+
233
+ const { headerSearch } = useLocal();
234
+ const { getAll, deleteById } = useBuildingUnit();
235
+
236
+ const page = ref(1);
237
+ const pages = ref(0);
238
+ const pageRange = ref("-- - -- of --");
239
+
240
+ const message = ref("");
241
+ const messageSnackbar = ref(false);
242
+ const messageColor = ref("");
243
+
244
+ const items = ref<Array<Record<string, any>>>([]);
245
+
246
+ const {
247
+ data: getBuildingReq,
248
+ refresh: getBuildingUnit,
249
+ status: getBuildingReqStatus,
250
+ } = useLazyAsyncData(
251
+ "get-all-building-units",
252
+ () =>
253
+ getAll({
254
+ page: page.value,
255
+ search: headerSearch.value,
256
+ status,
257
+ site: site,
258
+ }),
259
+ {
260
+ watch: [page, headerSearch],
261
+ }
262
+ );
263
+
264
+ const loading = computed(() => getBuildingReqStatus.value === "pending");
265
+
266
+ watchEffect(() => {
267
+ if (getBuildingReq.value) {
268
+ items.value = getBuildingReq.value.items;
269
+ pages.value = getBuildingReq.value.pages;
270
+ pageRange.value = getBuildingReq.value.pageRange;
271
+ }
272
+ });
273
+
274
+ function tableRowClickHandler(_: any, data: any) {
275
+ selectedBuildingUnit.value = data.item;
276
+ dialogPreview.value = true;
277
+ }
278
+
279
+ const createDialog = ref(false);
280
+ const dialogEdit = ref(false);
281
+ const dialogPreview = ref(false);
282
+ const selectedBuildingUnit = ref<TBuildingUnit | null>(null);
283
+
284
+ function successCreate() {
285
+ createDialog.value = false;
286
+ getBuildingUnit();
287
+ showMessage("Unit created successfully!", "success");
288
+ }
289
+
290
+ function successUpdate() {
291
+ dialogEdit.value = false;
292
+ dialogPreview.value = false;
293
+ getBuildingUnit();
294
+ showMessage("Unit updated successfully!", "success");
295
+ }
296
+
297
+ function openEditDialog() {
298
+ dialogEdit.value = true;
299
+ if (dialogPreview.value) {
300
+ dialogPreview.value = false;
301
+ }
302
+ }
303
+
304
+ const dialogDelete = ref(false);
305
+ const deleteLoading = ref(false);
306
+
307
+ function openDeleteDialog() {
308
+ dialogDelete.value = true;
309
+ message.value = "";
310
+ if (dialogPreview.value) {
311
+ dialogPreview.value = false;
312
+ }
313
+ }
314
+
315
+ function showMessage(msg: string, color: string) {
316
+ message.value = msg;
317
+ messageColor.value = color;
318
+ messageSnackbar.value = true;
319
+ }
320
+
321
+ async function handleDeleteBuildingUnit() {
322
+ deleteLoading.value = true;
323
+ try {
324
+ await deleteById(selectedBuildingUnit.value?._id ?? "");
325
+ await getBuildingUnit();
326
+ dialogDelete.value = false;
327
+ selectedBuildingUnit.value = null;
328
+ } catch (error: any) {
329
+ message.value = error?.response?._data?.message || "Failed to delete unit";
330
+ } finally {
331
+ deleteLoading.value = false;
332
+ }
333
+ }
334
+
335
+ function setBuilding({
336
+ mode = "create",
337
+ dialog = true,
338
+ data = {} as TBuildingUnit,
339
+ } = {}) {
340
+ if (mode === "create") {
341
+ createDialog.value = dialog;
342
+ } else if (mode === "edit") {
343
+ dialogEdit.value = dialog;
344
+ selectedBuildingUnit.value = data;
345
+ } else if (mode === "preview") {
346
+ dialogPreview.value = dialog;
347
+ selectedBuildingUnit.value = data;
348
+ }
349
+ }
350
+ </script>