@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,154 @@
1
+ <template>
2
+ <v-card width="100%">
3
+ <v-toolbar>
4
+ <v-row no-gutters class="fill-height px-6" align="center">
5
+ <span class="font-weight-bold text-h5">
6
+ {{ props.title }}
7
+ </span>
8
+ </v-row>
9
+ </v-toolbar>
10
+ <v-card-text style="max-height: 100vh; overflow-y: auto">
11
+ <v-form v-model="validForm" :disabled="disable">
12
+ <v-row no-gutters>
13
+ <v-col cols="12" class="mt-2">
14
+ <v-row no-gutters>
15
+ <InputLabel class="text-capitalize" title="Email" required />
16
+ <v-col cols="12">
17
+ <v-text-field
18
+ v-model="email"
19
+ density="comfortable"
20
+ :rules="[requiredRule, emailRule]"
21
+ ></v-text-field>
22
+ </v-col>
23
+ </v-row>
24
+ </v-col>
25
+
26
+ <v-col cols="12" class="my-2">
27
+ <v-row no-gutters>
28
+ <v-col cols="12" class="text-center">
29
+ <span
30
+ class="text-none text-subtitle-2 font-weight-medium text-error"
31
+ >
32
+ {{ message }}
33
+ </span>
34
+ </v-col>
35
+ </v-row>
36
+ </v-col>
37
+ </v-row>
38
+ </v-form>
39
+ </v-card-text>
40
+
41
+ <v-toolbar>
42
+ <v-row class="px-6">
43
+ <v-col cols="6">
44
+ <v-btn
45
+ block
46
+ variant="text"
47
+ class="text-none"
48
+ size="large"
49
+ @click="cancel"
50
+ >
51
+ Cancel
52
+ </v-btn>
53
+ </v-col>
54
+
55
+ <v-col cols="6">
56
+ <v-btn
57
+ block
58
+ variant="flat"
59
+ color="black"
60
+ class="text-none"
61
+ size="large"
62
+ :disabled="!validForm"
63
+ @click="submit"
64
+ >
65
+ Submit
66
+ </v-btn>
67
+ </v-col>
68
+ </v-row>
69
+ </v-toolbar>
70
+ </v-card>
71
+ </template>
72
+
73
+ <script setup lang="ts">
74
+ const props = defineProps({
75
+ title: {
76
+ type: String,
77
+ default: "Service Provider Form",
78
+ },
79
+ org: {
80
+ type: String,
81
+ default: "",
82
+ },
83
+ siteId: {
84
+ type: String,
85
+ default: "",
86
+ },
87
+ siteName: {
88
+ type: String,
89
+ default: "",
90
+ },
91
+ type: {
92
+ type: String,
93
+ default: "app",
94
+ },
95
+ });
96
+
97
+ const emit = defineEmits<{
98
+ (e: "cancel"): void;
99
+ (e: "success"): void;
100
+ (e: "success:create-more"): void;
101
+ (e: "notify", payload: { message: string; color: string }): void;
102
+ }>();
103
+
104
+ const validForm = ref(false);
105
+
106
+ const email = ref("");
107
+ const selectedPermissions = ref([]);
108
+ const createMore = ref(false);
109
+ const disable = ref(false);
110
+
111
+ const { requiredRule, emailRule } = useUtils();
112
+
113
+ const message = ref("");
114
+
115
+ const { createServiceProviderInvite } = useServiceProvider();
116
+
117
+ async function submit() {
118
+ disable.value = true;
119
+
120
+ try {
121
+ await createServiceProviderInvite({
122
+ email: email.value,
123
+ siteId: props.siteId,
124
+ serviceProviderOrgId: props.org,
125
+ });
126
+
127
+ emit("success");
128
+ emit("success:create-more");
129
+ emit("notify", {
130
+ message: "Service provider created successfully",
131
+ color: "success",
132
+ });
133
+ } catch (error: any) {
134
+ const msg =
135
+ error?.response?._data?.message || "Failed to create service provider";
136
+ message.value = msg;
137
+
138
+ emit("notify", {
139
+ message: msg,
140
+ color: "error",
141
+ });
142
+ } finally {
143
+ disable.value = false;
144
+ }
145
+ }
146
+
147
+ function cancel() {
148
+ email.value = "";
149
+ selectedPermissions.value = [];
150
+ createMore.value = false;
151
+ message.value = "";
152
+ emit("cancel");
153
+ }
154
+ </script>
@@ -0,0 +1,547 @@
1
+ <template>
2
+ <v-row no-gutters>
3
+ <v-col cols="12" class="mb-2">
4
+ <v-row no-gutters align="center" justify="space-between">
5
+ <div>
6
+ <v-btn
7
+ class="text-none mr-2"
8
+ rounded="pill"
9
+ variant="tonal"
10
+ @click="(createDialog = true), setServiceProvider({ mode: 'add' })"
11
+ size="large"
12
+ >
13
+ Add
14
+ </v-btn>
15
+ <v-btn
16
+ class="text-none mr-2"
17
+ rounded="pill"
18
+ variant="tonal"
19
+ size="large"
20
+ @click="
21
+ (createInviteDialog = true),
22
+ setServiceProvider({ mode: 'invite' })
23
+ "
24
+ >
25
+ Invite
26
+ </v-btn>
27
+ <v-btn
28
+ class="text-none mr-2"
29
+ rounded="pill"
30
+ variant="tonal"
31
+ size="large"
32
+ @click="
33
+ useRouter().push({
34
+ name: 'org-site-service-provider-mgmt-billing',
35
+ })
36
+ "
37
+ >
38
+ Billing
39
+ </v-btn>
40
+ </div>
41
+
42
+ <v-text-field
43
+ placeholder="Search..."
44
+ variant="outlined"
45
+ density="comfortable"
46
+ clearable
47
+ hide-details
48
+ class="ml-2"
49
+ style="max-width: 250px"
50
+ />
51
+ </v-row>
52
+ </v-col>
53
+ <v-col cols="12">
54
+ <v-card
55
+ width="100%"
56
+ variant="outlined"
57
+ border="thin"
58
+ rounded="lg"
59
+ :loading="loading"
60
+ >
61
+ <v-toolbar density="compact" color="grey-lighten-4">
62
+ <template #prepend>
63
+ <v-btn
64
+ fab
65
+ icon
66
+ density="comfortable"
67
+ @click="_getAllServiceProvider()"
68
+ >
69
+ <v-icon>mdi-refresh</v-icon>
70
+ </v-btn>
71
+ </template>
72
+
73
+ <template #append>
74
+ <v-row no-gutters justify="end" align="center">
75
+ <span class="mr-2 text-caption text-fontgray">
76
+ {{ pageRange }}
77
+ </span>
78
+ <local-pagination
79
+ v-model="page"
80
+ :length="pages"
81
+ @update:value="_getAllServiceProvider()"
82
+ />
83
+ </v-row>
84
+ </template>
85
+ </v-toolbar>
86
+
87
+ <v-data-table
88
+ :headers="headers"
89
+ :items="items"
90
+ item-value="_id"
91
+ items-per-page="20"
92
+ fixed-header
93
+ hide-default-footer
94
+ hide-default-header
95
+ style="max-height: calc(100vh - (180px))"
96
+ >
97
+ <template #item.category="{ item }">
98
+ <span class="text-subtitle-2">{{ item.category }}</span>
99
+ </template>
100
+ </v-data-table>
101
+ </v-card>
102
+ </v-col>
103
+ </v-row>
104
+
105
+ <v-dialog v-model="createDialog" width="500" persistent>
106
+ <v-card width="100%">
107
+ <v-toolbar>
108
+ <v-row no-gutters class="fill-height px-6" align="center">
109
+ <span class="font-weight-bold text-h5"> Add Service Provider </span>
110
+ </v-row>
111
+ </v-toolbar>
112
+ <v-card-text style="max-height: 100vh; overflow-y: auto">
113
+ <v-form
114
+ v-model="validServiceProvider"
115
+ :disabled="disableServiceProvider"
116
+ >
117
+ <v-row no-gutters class="px-4">
118
+ <v-col cols="12" class="mt-2">
119
+ <v-row no-gutters>
120
+ <InputLabel class="text-capitalize" title="Name" required />
121
+ <v-col cols="12">
122
+ <v-text-field
123
+ v-model="serviceProvider.name"
124
+ density="comfortable"
125
+ :rules="[requiredRule]"
126
+ ></v-text-field>
127
+ </v-col>
128
+ </v-row>
129
+ </v-col>
130
+
131
+ <v-col cols="12" class="mt-2">
132
+ <v-row no-gutters>
133
+ <InputLabel class="text-capitalize" title="Type" required />
134
+ <v-col cols="12">
135
+ <v-select
136
+ v-model="serviceProvider.type"
137
+ item-title="title"
138
+ item-value="value"
139
+ :items="natureOfBusiness"
140
+ density="comfortable"
141
+ :rules="[requiredRule]"
142
+ ></v-select>
143
+ </v-col>
144
+ </v-row>
145
+ </v-col>
146
+
147
+ <v-col cols="12" class="mt-2">
148
+ <v-row no-gutters>
149
+ <InputLabel class="text-capitalize" title="Email" required />
150
+ <v-col cols="12">
151
+ <v-text-field
152
+ v-model="serviceProvider.email"
153
+ density="comfortable"
154
+ :rules="[emailRule, requiredRule]"
155
+ ></v-text-field>
156
+ </v-col>
157
+ </v-row>
158
+ </v-col>
159
+
160
+ <v-col cols="12" class="mt-2">
161
+ <v-row no-gutters>
162
+ <InputLabel class="text-capitalize" title="Description" />
163
+ <v-col cols="12">
164
+ <v-textarea
165
+ v-model="serviceProvider.description"
166
+ density="comfortable"
167
+ no-resize
168
+ rows="2"
169
+ ></v-textarea>
170
+ </v-col>
171
+ </v-row>
172
+ </v-col>
173
+
174
+ <v-col cols="12">
175
+ <v-checkbox
176
+ v-model="createMoreServiceProvider"
177
+ density="comfortable"
178
+ hide-details
179
+ >
180
+ <template #label>
181
+ <span class="text-subtitle-2 font-weight-bold">
182
+ Create more
183
+ </span>
184
+ </template>
185
+ </v-checkbox>
186
+ </v-col>
187
+
188
+ <v-col cols="12" class="my-2">
189
+ <v-row no-gutters>
190
+ <v-col cols="12" class="text-center">
191
+ <span
192
+ class="text-none text-subtitle-2 font-weight-medium text-error"
193
+ >
194
+ {{ messageServiceProvider }}
195
+ </span>
196
+ </v-col>
197
+ </v-row>
198
+ </v-col>
199
+ </v-row>
200
+ </v-form>
201
+ </v-card-text>
202
+ <v-toolbar>
203
+ <v-row class="px-6">
204
+ <v-col cols="6">
205
+ <v-btn
206
+ block
207
+ variant="text"
208
+ class="text-none"
209
+ size="large"
210
+ @click="setServiceProvider({ mode: 'add', dialog: false })"
211
+ >
212
+ Cancel
213
+ </v-btn>
214
+ </v-col>
215
+
216
+ <v-col cols="6">
217
+ <v-btn
218
+ block
219
+ variant="flat"
220
+ color="black"
221
+ class="text-none"
222
+ size="large"
223
+ :disabled="!validServiceProvider"
224
+ :loading="disableServiceProvider"
225
+ @click="submitServiceProviderAdd"
226
+ >
227
+ Submit
228
+ </v-btn>
229
+ </v-col>
230
+ </v-row>
231
+ </v-toolbar>
232
+ </v-card>
233
+ </v-dialog>
234
+
235
+ <v-dialog v-model="createInviteDialog" width="500" persistent>
236
+ <v-card width="100%">
237
+ <v-toolbar>
238
+ <v-row no-gutters class="fill-height px-6" align="center">
239
+ <span class="font-weight-bold text-h5">
240
+ Invite Service Provider
241
+ </span>
242
+ </v-row>
243
+ </v-toolbar>
244
+ <v-card-text style="max-height: 100vh; overflow-y: auto">
245
+ <v-form
246
+ v-model="validServiceProvider"
247
+ :disabled="disableServiceProvider"
248
+ >
249
+ <v-row no-gutters class="px-4">
250
+ <v-col cols="12" class="mt-2">
251
+ <v-row no-gutters>
252
+ <InputLabel class="text-capitalize" title="Email" required />
253
+ <v-col cols="12">
254
+ <v-text-field
255
+ v-model="serviceProvider.email"
256
+ density="comfortable"
257
+ :rules="[requiredRule, emailRule]"
258
+ ></v-text-field>
259
+ </v-col>
260
+ </v-row>
261
+ </v-col>
262
+
263
+ <v-col cols="12">
264
+ <v-checkbox
265
+ v-model="createMoreServiceProvider"
266
+ density="comfortable"
267
+ hide-details
268
+ >
269
+ <template #label>
270
+ <span class="text-subtitle-2 font-weight-bold">
271
+ Invite more
272
+ </span>
273
+ </template>
274
+ </v-checkbox>
275
+ </v-col>
276
+
277
+ <v-col cols="12" class="my-2">
278
+ <v-row no-gutters>
279
+ <v-col cols="12" class="text-center">
280
+ <span
281
+ class="text-none text-subtitle-2 font-weight-medium text-error"
282
+ >
283
+ {{ messageServiceProvider }}
284
+ </span>
285
+ </v-col>
286
+ </v-row>
287
+ </v-col>
288
+ </v-row>
289
+ </v-form>
290
+ </v-card-text>
291
+
292
+ <v-toolbar>
293
+ <v-row class="px-6">
294
+ <v-col cols="6">
295
+ <v-btn
296
+ block
297
+ variant="text"
298
+ class="text-none"
299
+ size="large"
300
+ @click="setServiceProvider({ mode: 'invite', dialog: false })"
301
+ >
302
+ Cancel
303
+ </v-btn>
304
+ </v-col>
305
+
306
+ <v-col cols="6">
307
+ <v-btn
308
+ block
309
+ variant="flat"
310
+ color="black"
311
+ class="text-none"
312
+ size="large"
313
+ :disabled="!validServiceProvider"
314
+ :loading="disableServiceProvider"
315
+ @click="submitServiceProviderInvite()"
316
+ >
317
+ Submit
318
+ </v-btn>
319
+ </v-col>
320
+ </v-row>
321
+ </v-toolbar>
322
+ </v-card>
323
+ </v-dialog>
324
+
325
+ <Snackbar v-model="messageSnackbar" :text="message" :color="messageColor" />
326
+ </template>
327
+
328
+ <script lang="ts" setup>
329
+ const props = defineProps({
330
+ orgId: {
331
+ type: String,
332
+ default: "",
333
+ },
334
+ customerId: {
335
+ type: String,
336
+ default: "",
337
+ },
338
+ siteId: {
339
+ type: String,
340
+ default: "",
341
+ },
342
+ siteName: {
343
+ type: String,
344
+ default: "",
345
+ },
346
+ serviceProviderOrgId: {
347
+ type: String,
348
+ default: "",
349
+ },
350
+ type: {
351
+ type: String,
352
+ required: true,
353
+ default: "app",
354
+ },
355
+ route: {
356
+ type: String,
357
+ default: "",
358
+ },
359
+ canAddServiceProvider: {
360
+ type: Boolean,
361
+ default: false,
362
+ },
363
+ canInviteServiceProvider: {
364
+ type: Boolean,
365
+ default: false,
366
+ },
367
+ canViewServiceProviders: {
368
+ type: Boolean,
369
+ default: false,
370
+ },
371
+ });
372
+
373
+ const headers = [
374
+ {
375
+ title: "Name",
376
+ value: "name",
377
+ },
378
+ {
379
+ title: "Status",
380
+ value: "status",
381
+ },
382
+ {
383
+ title: "Category",
384
+ value: "category",
385
+ },
386
+ ];
387
+
388
+ const { natureOfBusiness } = useLocal();
389
+ const { requiredRule, emailRule } = useUtils();
390
+
391
+ const page = ref(1);
392
+ const pages = ref(0);
393
+ const pageRange = ref("-- - -- of --");
394
+
395
+ const message = ref("");
396
+ const messageSnackbar = ref(false);
397
+ const messageColor = ref("");
398
+
399
+ const items = ref<Array<Record<string, any>>>([]);
400
+
401
+ const validServiceProvider = ref(false);
402
+ const disableServiceProvider = ref(false);
403
+ const createMoreServiceProvider = ref(false);
404
+ const messageServiceProvider = ref("");
405
+ const serviceProvider = ref({
406
+ name: "",
407
+ type: "",
408
+ email: "",
409
+ description: "",
410
+ orgId: "",
411
+ siteId: "",
412
+ siteName: "",
413
+ orgName: "",
414
+ category: "",
415
+ });
416
+
417
+ const {
418
+ getAll: getAllServiceProvider,
419
+ add: addServiceProvider,
420
+ invite: inviteServiceProvider,
421
+ } = useServiceProvider();
422
+
423
+ const loading = ref(true);
424
+
425
+ const { getSiteById } = useSite();
426
+
427
+ const { data: site } = await useLazyAsyncData(
428
+ "get-site-by-id-" + props.siteId,
429
+ () => getSiteById(props.siteId)
430
+ );
431
+
432
+ const { data: serviceProviderReq, refresh: _getAllServiceProvider } =
433
+ await useLazyAsyncData("get-all-service-providers", () =>
434
+ getAllServiceProvider({ siteId: props.siteId })
435
+ );
436
+
437
+ watchEffect(() => {
438
+ // console.log("serviceProviderReq", serviceProviderReq.value);
439
+ if (serviceProviderReq.value) {
440
+ items.value = serviceProviderReq.value.items;
441
+ pages.value = serviceProviderReq.value.pages;
442
+ pageRange.value = serviceProviderReq.value.pageRange;
443
+ }
444
+ loading.value = false;
445
+ });
446
+
447
+ const createDialog = ref(false);
448
+ const createInviteDialog = ref(false);
449
+
450
+ const success = () => {
451
+ createDialog.value = false;
452
+ // getServiceProvider();
453
+ _getAllServiceProvider();
454
+ };
455
+
456
+ function showMessage(msg: string, color: string) {
457
+ message.value = msg;
458
+ messageColor.value = color;
459
+ messageSnackbar.value = true;
460
+ }
461
+
462
+ function onNotify(payload: { message: string; color: string }) {
463
+ showMessage(payload.message, payload.color);
464
+ }
465
+
466
+ const dialogServiceProviderInvite = ref(false);
467
+ const dialogServiceProviderAdd = ref(false);
468
+
469
+ function setServiceProvider({
470
+ mode = "invite",
471
+ dialog = true,
472
+ data = {} as Record<string, any>,
473
+ } = {}) {
474
+ if (mode === "invite") {
475
+ // dialogServiceProviderInvite.value = dialog;
476
+ createInviteDialog.value = dialog;
477
+ }
478
+
479
+ if (mode === "add") {
480
+ // dialogServiceProviderAdd.value = dialog;
481
+ createDialog.value = dialog;
482
+ }
483
+
484
+ if (dialog) {
485
+ serviceProvider.value = {
486
+ name: "",
487
+ type: "",
488
+ email: "",
489
+ description: "",
490
+ orgId: props.orgId,
491
+ siteId: props.siteId,
492
+ siteName: site.value?.name ?? "",
493
+ orgName: "Org Name",
494
+ category: mode === "add" ? "internal" : "external",
495
+ };
496
+ return;
497
+ }
498
+
499
+ serviceProvider.value.description = data.description ?? "";
500
+ serviceProvider.value.email = data.email ?? "";
501
+ serviceProvider.value.name = data.name ?? "";
502
+ serviceProvider.value.type = data.type ?? "";
503
+ }
504
+
505
+ async function submitServiceProviderAdd() {
506
+ disableServiceProvider.value = true;
507
+ messageServiceProvider.value = "";
508
+
509
+ try {
510
+ console.log("serviceProvider.value");
511
+ console.log(serviceProvider.value);
512
+ await addServiceProvider(serviceProvider.value);
513
+ await setServiceProvider({ mode: "add", dialog: false });
514
+ await _getAllServiceProvider();
515
+ } catch (error: any) {
516
+ messageServiceProvider.value =
517
+ error?.response?._data?.message ??
518
+ "An error occurred while adding the service provider.";
519
+ } finally {
520
+ disableServiceProvider.value = false;
521
+ }
522
+ }
523
+
524
+ async function submitServiceProviderInvite() {
525
+ disableServiceProvider.value = true;
526
+ messageServiceProvider.value = "";
527
+ try {
528
+ await inviteServiceProvider({
529
+ email: serviceProvider.value.email,
530
+ orgId: props.orgId,
531
+ siteId: props.siteId,
532
+ siteName: site.value?.name ?? "",
533
+ });
534
+ if (createMoreServiceProvider.value) {
535
+ serviceProvider.value.email = "";
536
+ } else {
537
+ await setServiceProvider({ mode: "invite", dialog: false });
538
+ }
539
+ } catch (error: any) {
540
+ messageServiceProvider.value =
541
+ error?.response?._data?.message ??
542
+ "An error occurred while inviting the service provider.";
543
+ } finally {
544
+ disableServiceProvider.value = false;
545
+ }
546
+ }
547
+ </script>