@iservice365/layer-common 1.4.2 → 1.5.1

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.
@@ -1,16 +1,53 @@
1
1
  <template>
2
2
  <v-row no-gutters>
3
3
  <v-col cols="12" class="mb-2">
4
- <v-row no-gutters>
5
- <v-btn
6
- class="text-none mr-2"
7
- rounded="pill"
8
- variant="tonal"
9
- @click="createDialog = true"
10
- size="large"
11
- >
12
- Add Service Provider
13
- </v-btn>
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
+ />
14
51
  </v-row>
15
52
  </v-col>
16
53
  <v-col cols="12">
@@ -23,7 +60,12 @@
23
60
  >
24
61
  <v-toolbar density="compact" color="grey-lighten-4">
25
62
  <template #prepend>
26
- <v-btn fab icon density="comfortable" @click="getServiceProvider()">
63
+ <v-btn
64
+ fab
65
+ icon
66
+ density="comfortable"
67
+ @click="_getAllServiceProvider()"
68
+ >
27
69
  <v-icon>mdi-refresh</v-icon>
28
70
  </v-btn>
29
71
  </template>
@@ -36,7 +78,7 @@
36
78
  <local-pagination
37
79
  v-model="page"
38
80
  :length="pages"
39
- @update:value="_getServiceProvider()"
81
+ @update:value="_getAllServiceProvider()"
40
82
  />
41
83
  </v-row>
42
84
  </template>
@@ -52,28 +94,8 @@
52
94
  hide-default-header
53
95
  style="max-height: calc(100vh - (180px))"
54
96
  >
55
- <template #item.permissions="{ value }">
56
- <span class="text-caption font-weight-bold text-capitalize">
57
- permissions
58
- </span>
59
- <v-chip>{{ value.length }}</v-chip>
60
- </template>
61
-
62
- <template #item.nature="{ item }">
63
- <span class="text-capitalize">
64
- {{ item.nature }}
65
- </span>
66
- </template>
67
-
68
- <template #item.action-table="{ item }">
69
- <v-menu :close-on-content-click="false" offset-y width="150">
70
- <template v-slot:activator="{ props }">
71
- <v-icon v-bind="props">mdi-dots-horizontal</v-icon>
72
- </template>
73
- <v-list>
74
- <v-list-item @click=""> Delete Service Provider </v-list-item>
75
- </v-list>
76
- </v-menu>
97
+ <template #item.category="{ item }">
98
+ <span class="text-subtitle-2">{{ item.category }}</span>
77
99
  </template>
78
100
  </v-data-table>
79
101
  </v-card>
@@ -81,16 +103,223 @@
81
103
  </v-row>
82
104
 
83
105
  <v-dialog v-model="createDialog" width="500" persistent>
84
- <ServiceProviderFormCreate
85
- @cancel="createDialog = false"
86
- :org="props.orgId"
87
- :type="props.type"
88
- :site-id="props.siteId"
89
- :service-provider-org-id="props.orgId"
90
- @success="success()"
91
- @success:create-more="getServiceProvider()"
92
- @notify="onNotify"
93
- />
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>
94
323
  </v-dialog>
95
324
 
96
325
  <Snackbar v-model="messageSnackbar" :text="message" :color="messageColor" />
@@ -130,10 +359,23 @@ const props = defineProps({
130
359
  });
131
360
 
132
361
  const headers = [
133
- { title: "Name", value: "name" },
134
- { title: "Nature", value: "nature" },
362
+ {
363
+ title: "Name",
364
+ value: "name",
365
+ },
366
+ {
367
+ title: "Status",
368
+ value: "status",
369
+ },
370
+ {
371
+ title: "Category",
372
+ value: "category",
373
+ },
135
374
  ];
136
375
 
376
+ const { natureOfBusiness } = useLocal();
377
+ const { requiredRule, emailRule } = useUtils();
378
+
137
379
  const page = ref(1);
138
380
  const pages = ref(0);
139
381
  const pageRange = ref("-- - -- of --");
@@ -144,43 +386,59 @@ const messageColor = ref("");
144
386
 
145
387
  const items = ref<Array<Record<string, any>>>([]);
146
388
 
147
- const { getAll: _getServiceProvider } = useServiceProvider();
389
+ const validServiceProvider = ref(false);
390
+ const disableServiceProvider = ref(false);
391
+ const createMoreServiceProvider = ref(false);
392
+ const messageServiceProvider = ref("");
393
+ const serviceProvider = ref({
394
+ name: "",
395
+ type: "",
396
+ email: "",
397
+ description: "",
398
+ orgId: "",
399
+ siteId: "",
400
+ siteName: "",
401
+ orgName: "",
402
+ category: "",
403
+ });
148
404
 
149
405
  const {
150
- data: getAllReq,
151
- refresh: getServiceProvider,
152
- status: getServiceProviderReqStatus,
153
- } = useLazyAsyncData(
154
- "service-provider-get-all",
155
- () =>
156
- _getServiceProvider({
157
- page: page.value,
158
- orgId: props.orgId,
159
- }),
160
- {
161
- watch: [page],
162
- }
406
+ getAll: getAllServiceProvider,
407
+ add: addServiceProvider,
408
+ invite: inviteServiceProvider,
409
+ } = useServiceProvider();
410
+
411
+ const loading = ref(true);
412
+
413
+ const { getSiteById } = useSite();
414
+
415
+ const { data: site } = await useLazyAsyncData(
416
+ "get-site-by-id-" + props.siteId,
417
+ () => getSiteById(props.siteId)
163
418
  );
164
419
 
165
- const loading = computed(() => getServiceProviderReqStatus.value === "pending");
420
+ const { data: serviceProviderReq, refresh: _getAllServiceProvider } =
421
+ await useLazyAsyncData("get-all-service-providers", () =>
422
+ getAllServiceProvider({ siteId: props.siteId })
423
+ );
166
424
 
167
425
  watchEffect(() => {
168
- if (getAllReq.value) {
169
- items.value = getAllReq.value.items.map((i: any) => ({
170
- ...i,
171
- name: i.name,
172
- nature: i.nature.replace(/_/g, " "),
173
- }));
174
- pages.value = getAllReq.value.pages;
175
- pageRange.value = getAllReq.value.pageRange;
426
+ // console.log("serviceProviderReq", serviceProviderReq.value);
427
+ if (serviceProviderReq.value) {
428
+ items.value = serviceProviderReq.value.items;
429
+ pages.value = serviceProviderReq.value.pages;
430
+ pageRange.value = serviceProviderReq.value.pageRange;
176
431
  }
432
+ loading.value = false;
177
433
  });
178
434
 
179
435
  const createDialog = ref(false);
436
+ const createInviteDialog = ref(false);
180
437
 
181
438
  const success = () => {
182
439
  createDialog.value = false;
183
- getServiceProvider();
440
+ // getServiceProvider();
441
+ _getAllServiceProvider();
184
442
  };
185
443
 
186
444
  function showMessage(msg: string, color: string) {
@@ -192,4 +450,86 @@ function showMessage(msg: string, color: string) {
192
450
  function onNotify(payload: { message: string; color: string }) {
193
451
  showMessage(payload.message, payload.color);
194
452
  }
453
+
454
+ const dialogServiceProviderInvite = ref(false);
455
+ const dialogServiceProviderAdd = ref(false);
456
+
457
+ function setServiceProvider({
458
+ mode = "invite",
459
+ dialog = true,
460
+ data = {} as Record<string, any>,
461
+ } = {}) {
462
+ if (mode === "invite") {
463
+ // dialogServiceProviderInvite.value = dialog;
464
+ createInviteDialog.value = dialog;
465
+ }
466
+
467
+ if (mode === "add") {
468
+ // dialogServiceProviderAdd.value = dialog;
469
+ createDialog.value = dialog;
470
+ }
471
+
472
+ if (dialog) {
473
+ serviceProvider.value = {
474
+ name: "",
475
+ type: "",
476
+ email: "",
477
+ description: "",
478
+ orgId: props.orgId,
479
+ siteId: props.siteId,
480
+ siteName: site.value?.name ?? "",
481
+ orgName: "Org Name",
482
+ category: mode === "add" ? "internal" : "external",
483
+ };
484
+ return;
485
+ }
486
+
487
+ serviceProvider.value.description = data.description ?? "";
488
+ serviceProvider.value.email = data.email ?? "";
489
+ serviceProvider.value.name = data.name ?? "";
490
+ serviceProvider.value.type = data.type ?? "";
491
+ }
492
+
493
+ async function submitServiceProviderAdd() {
494
+ disableServiceProvider.value = true;
495
+ messageServiceProvider.value = "";
496
+
497
+ try {
498
+ console.log("serviceProvider.value");
499
+ console.log(serviceProvider.value);
500
+ await addServiceProvider(serviceProvider.value);
501
+ await setServiceProvider({ mode: "add", dialog: false });
502
+ await _getAllServiceProvider();
503
+ } catch (error: any) {
504
+ messageServiceProvider.value =
505
+ error?.response?._data?.message ??
506
+ "An error occurred while adding the service provider.";
507
+ } finally {
508
+ disableServiceProvider.value = false;
509
+ }
510
+ }
511
+
512
+ async function submitServiceProviderInvite() {
513
+ disableServiceProvider.value = true;
514
+ messageServiceProvider.value = "";
515
+ try {
516
+ await inviteServiceProvider({
517
+ email: serviceProvider.value.email,
518
+ orgId: props.orgId,
519
+ siteId: props.siteId,
520
+ siteName: site.value?.name ?? "",
521
+ });
522
+ if (createMoreServiceProvider.value) {
523
+ serviceProvider.value.email = "";
524
+ } else {
525
+ await setServiceProvider({ mode: "invite", dialog: false });
526
+ }
527
+ } catch (error: any) {
528
+ messageServiceProvider.value =
529
+ error?.response?._data?.message ??
530
+ "An error occurred while inviting the service provider.";
531
+ } finally {
532
+ disableServiceProvider.value = false;
533
+ }
534
+ }
195
535
  </script>