@iservice365/layer-common 1.4.1 → 1.5.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.
@@ -4,11 +4,18 @@
4
4
  <v-col cols="12" class="mb-2" v-if="(canCreate || $slots.actions)">
5
5
  <v-row no-gutters>
6
6
  <slot name="actions">
7
- <v-btn v-if="canCreate" class="text-none" rounded="pill" variant="tonal" size="large"
8
- @click="emits('create')">
9
- {{ createLabel }}
10
- </v-btn>
7
+ <v-col cols="12">
8
+ <v-row no-gutters justify="space-between">
9
+ <v-btn v-if="canCreate" class="text-none" rounded="pill" variant="tonal" size="large"
10
+ @click="emits('create')">
11
+ {{ createLabel }}
12
+ </v-btn>
13
+ <v-text-field v-if="props.canSearch" v-model="searchInput" density="compact" placeholder="Search" clearable max-width="300"
14
+ append-inner-icon="mdi-magnify" hide-details />
15
+ </v-row>
16
+ </v-col>
11
17
  </slot>
18
+
12
19
  </v-row>
13
20
  </v-col>
14
21
 
@@ -35,7 +42,7 @@
35
42
  </template>
36
43
 
37
44
  <template v-if="$slots.extension" #extension>
38
- <slot name="extension"/>
45
+ <slot name="extension" />
39
46
  </template>
40
47
  </v-toolbar>
41
48
 
@@ -43,12 +50,13 @@
43
50
  <!-- Data Table -->
44
51
  <v-data-table :headers="headers" :items="items" :item-value="itemValue" :items-per-page="itemsPerPage"
45
52
  fixed-header hide-default-footer :hide-default-header="!showHeader"
46
- @click:row="(_: any, data: any) => emits('row-click', data)" :style="`max-height: calc(100vh - (${offset}px))`">
53
+ @click:row="(_: any, data: any) => emits('row-click', data)"
54
+ :style="`max-height: calc(100vh - (${offset}px))`">
47
55
  <template v-for="(_, slotName) in $slots" #[slotName]="slotProps">
48
56
  <slot :name="slotName" v-bind="slotProps" />
49
57
  </template>
50
58
  </v-data-table>
51
- <slot name="footer"/>
59
+ <slot name="footer" />
52
60
  </v-card>
53
61
  </v-col>
54
62
  </v-row>
@@ -72,6 +80,10 @@ const props = defineProps({
72
80
  type: Boolean,
73
81
  default: false,
74
82
  },
83
+ canSearch: {
84
+ type: Boolean,
85
+ default: false,
86
+ },
75
87
  createLabel: {
76
88
  type: String,
77
89
  default: "Add",
@@ -112,6 +124,8 @@ const props = defineProps({
112
124
 
113
125
  const emits = defineEmits(["create", "refresh", "update:page", "row-click"]);
114
126
 
127
+ const searchInput = defineModel('search', { default: "" })
128
+
115
129
  const internalPage = ref(props.page);
116
130
  watch(
117
131
  () => props.page,
@@ -121,4 +135,8 @@ watch(
121
135
  );
122
136
  </script>
123
137
 
124
- <style scoped></style>
138
+ <style scoped>
139
+ .v-data-table :deep(thead th) {
140
+ font-weight: bold !important;
141
+ }
142
+ </style>
@@ -1,76 +1,72 @@
1
1
  <template>
2
- <v-row align="start" justify="center" class="fill-height">
3
- <v-col cols="12" lg="12" md="12">
4
- <ListView
5
- :headers="headers"
6
- :items="items"
7
- :pages="pages"
8
- :page-range="pageRange"
9
- :loading="loading || onNextPrevPageLoading"
10
- :height="'calc(100vh - 175px)'"
11
- v-model:page="page"
12
- :selected="selected"
13
- @update:value="getAllReqRefresh"
14
- @update:selected="onSelectedUpdate"
15
- @click:create="showCreateDialog = true"
16
- :length="pages"
17
- :clickable-rows="true"
18
- @update:pagination="updatePage"
2
+ <v-row no-gutters>
3
+ <v-col cols="12" class="mb-2">
4
+ <v-row no-gutters align="center" justify="space-between">
5
+ <v-btn
6
+ class="text-none text-capitalize"
7
+ rounded="pill"
8
+ variant="tonal"
9
+ size="large"
10
+ @click="showCreateDialog = true"
11
+ v-if="canCreateWorkOrder"
12
+ >
13
+ Create Work Order
14
+ </v-btn>
15
+
16
+ <v-text-field
17
+ v-model="searchText"
18
+ placeholder="Search work order..."
19
+ variant="outlined"
20
+ density="comfortable"
21
+ clearable
22
+ hide-details
23
+ class="ml-2"
24
+ style="max-width: 250px"
25
+ />
26
+ </v-row>
27
+ </v-col>
28
+ <v-col cols="12">
29
+ <v-card
30
+ width="100%"
31
+ variant="outlined"
32
+ border="thin"
33
+ rounded="lg"
34
+ :loading="loading"
19
35
  >
20
- <template #title>
21
- <span class="text-h6 font-weight-regular">Work Orders</span>
22
- </template>
23
-
24
- <template #action-button>
25
- <v-btn
26
- color="primary-button"
27
- variant="flat"
28
- @click="showCreateDialog = true"
29
- class="text-capitalize"
30
- >
31
- Create Work Order
32
- </v-btn>
33
- </template>
34
-
35
- <template #category="{ item }">
36
- <span class="text-capitalize">{{ item.category }}</span>
37
- </template>
38
-
39
- <template #createdAt="{ item }">
40
- {{ formatDate(item.createdAt) }}
41
- </template>
42
-
43
- <template #status="{ item }">
44
- <v-chip
45
- :color="getColorStatus(item.status || 'No Status')"
46
- text-color="white"
47
- variant="flat"
48
- >
49
- {{ item.status || "No Status" }}
50
- </v-chip>
51
- </template>
52
- <template #action-table="{ item }">
53
- <v-menu
54
- v-model="item.menuOpen"
55
- :close-on-content-click="false"
56
- offset-y
57
- width="150"
58
- >
59
- <template v-slot:activator="{ props }">
60
- <v-icon v-bind="props">mdi-dots-horizontal-circle-outline</v-icon>
61
- </template>
62
- <v-list>
63
- <v-list-item @click="onViewWorkOrder(item)">View</v-list-item>
64
- <v-list-item @click="editWorkOrder(item)">Edit</v-list-item>
65
- <v-list-item
66
- @click="confirmDeleteWorkOrder(item)"
67
- v-if="canDeleteWorkOrder"
68
- >Delete</v-list-item
69
- >
70
- </v-list>
71
- </v-menu>
72
- </template>
73
- </ListView>
36
+ <v-toolbar density="compact" color="grey-lighten-4">
37
+ <template #prepend>
38
+ <v-btn fab icon density="comfortable" @click="updatePage">
39
+ <v-icon>mdi-refresh</v-icon>
40
+ </v-btn>
41
+ </template>
42
+
43
+ <template #append>
44
+ <v-row no-gutters justify="end" align="center">
45
+ <span class="mr-2 text-caption text-fontgray">
46
+ {{ pageRange }}
47
+ </span>
48
+ <local-pagination
49
+ v-model="page"
50
+ :length="pages"
51
+ @update:value="updatePage"
52
+ />
53
+ </v-row>
54
+ </template>
55
+ </v-toolbar>
56
+
57
+ <v-data-table
58
+ :headers="headers"
59
+ :items="items"
60
+ item-value="_id"
61
+ items-per-page="20"
62
+ fixed-header
63
+ hide-default-footer
64
+ hide-default-header
65
+ @click:row="tableRowClickHandler"
66
+ style="max-height: calc(100vh - (200px))"
67
+ >
68
+ </v-data-table>
69
+ </v-card>
74
70
  </v-col>
75
71
  </v-row>
76
72
 
@@ -93,11 +89,87 @@
93
89
  />
94
90
 
95
91
  <Snackbar v-model="messageSnackbar" :text="message" :color="messageColor" />
92
+
93
+ <!-- Preview Dialog -->
94
+ <v-dialog v-model="dialogPreview" width="450" persistent>
95
+ <v-card width="100%">
96
+ <v-card-text style="max-height: 100vh; overflow-y: auto" class="pb-0">
97
+ <v-row no-gutters v-if="selectedWorkOrder" class="mb-4">
98
+ <v-col cols="12">
99
+ <strong>Subject:</strong> {{ selectedWorkOrder.subject }}
100
+ </v-col>
101
+ <v-col cols="12">
102
+ <strong>Category:</strong>
103
+ {{ selectedWorkOrder.category }}
104
+ </v-col>
105
+ <v-col cols="12">
106
+ <strong>Status:</strong>
107
+ {{ selectedWorkOrder.status }}
108
+ </v-col>
109
+ </v-row>
110
+ </v-card-text>
111
+ <v-toolbar class="pa-0" density="compact">
112
+ <v-row no-gutters>
113
+ <v-col cols="6" class="pa-0">
114
+ <v-btn
115
+ block
116
+ variant="text"
117
+ class="text-none"
118
+ size="large"
119
+ @click="dialogPreview = false"
120
+ height="48"
121
+ >
122
+ Close
123
+ </v-btn>
124
+ </v-col>
125
+ <v-col cols="6" class="pa-0">
126
+ <v-menu>
127
+ <template #activator="{ props }">
128
+ <v-btn
129
+ block
130
+ variant="flat"
131
+ color="black"
132
+ class="text-none"
133
+ height="48"
134
+ v-bind="props"
135
+ tile
136
+ >
137
+ More actions
138
+ </v-btn>
139
+ </template>
140
+
141
+ <v-list class="pa-0">
142
+ <v-list-item @click="onViewWorkOrder(selectedWorkOrder)">
143
+ <v-list-item-title class="text-subtitle-2">
144
+ View
145
+ </v-list-item-title>
146
+ </v-list-item>
147
+ <v-list-item @click="editWorkOrder(selectedWorkOrder)">
148
+ <v-list-item-title class="text-subtitle-2">
149
+ Edit
150
+ </v-list-item-title>
151
+ </v-list-item>
152
+
153
+ <v-list-item
154
+ @click="confirmDeleteWorkOrder(selectedWorkOrder)"
155
+ class="text-red"
156
+ v-if="canDeleteWorkOrder"
157
+ >
158
+ <v-list-item-title class="text-subtitle-2">
159
+ Delete
160
+ </v-list-item-title>
161
+ </v-list-item>
162
+ </v-list>
163
+ </v-menu>
164
+ </v-col>
165
+ </v-row>
166
+ </v-toolbar>
167
+ </v-card>
168
+ </v-dialog>
96
169
  </template>
97
170
 
98
171
  <script setup lang="ts">
99
172
  import { useTheme } from "vuetify";
100
- import useBuilding from "../../composables/useBuilding";
101
173
  const emit = defineEmits(["click:create", "update:pagination"]);
102
174
 
103
175
  const props = defineProps({
@@ -172,7 +244,7 @@ function showMessage(msg: string, color: string) {
172
244
  messageSnackbar.value = true;
173
245
  }
174
246
 
175
- const headers = [
247
+ const headers: Array<Record<string, any>> = [
176
248
  { title: "Created By", value: "createdByName", align: "start" },
177
249
  { title: "Subject", value: "subject", align: "start" },
178
250
  { title: "Category", value: "category", align: "start" },
@@ -221,7 +293,6 @@ async function updatePage(pageVal: any) {
221
293
  page.value = pageVal;
222
294
  const response = await _getWorkOrders({
223
295
  page: page.value,
224
- organization: route.params.org as string,
225
296
  site: route.params.site as string,
226
297
  });
227
298
  if (response) {
@@ -290,7 +361,7 @@ watchEffect(() => {
290
361
  serviceProviders.value = getAllReq.value.map((i: any) => ({
291
362
  title: i.nature.replace(/_/g, " "),
292
363
  subtitle: i.title,
293
- value: i.nature
364
+ value: i.nature,
294
365
  }));
295
366
  }
296
367
  });
@@ -369,4 +440,14 @@ function onViewWorkOrder(item: any) {
369
440
  function editWorkOrder(item: any) {}
370
441
 
371
442
  function confirmDeleteWorkOrder(item: any) {}
443
+
444
+ function tableRowClickHandler(_: any, data: any) {
445
+ console.log(data.item);
446
+ selectedWorkOrder.value = data.item;
447
+ dialogPreview.value = true;
448
+ }
449
+
450
+ const dialogPreview = ref(false);
451
+ const selectedWorkOrder = ref<TWorkOrder | null>(null);
452
+ const searchText = ref("");
372
453
  </script>
@@ -0,0 +1,246 @@
1
+ export default function(){
2
+
3
+ const facilityIcons = [
4
+ "001-coffee-4.svg",
5
+ "001-football.svg",
6
+ "001-ice-cream-3.svg",
7
+ "001-skin oil.svg",
8
+ "002-basketball.svg",
9
+ "002-cezve.svg",
10
+ "002-lollipop.svg",
11
+ "002-manicure.svg",
12
+ "003-aromatherapy.svg",
13
+ "003-latte.svg",
14
+ "003-sweet.svg",
15
+ "003-volleyball.svg",
16
+ "004-boxing.svg",
17
+ "004-chocolate.svg",
18
+ "004-honey.svg",
19
+ "004-hot tub.svg",
20
+ "005-candle.svg",
21
+ "005-coffee-grinder.svg",
22
+ "005-flour.svg",
23
+ "005-shuttlecock.svg",
24
+ "006-cake-3.svg",
25
+ "006-chess.svg",
26
+ "006-tea-bag-1.svg",
27
+ "006-teapot.svg",
28
+ "007-baseball.svg",
29
+ "007-cake-2.svg",
30
+ "007-juice.svg",
31
+ "007-wash feet.svg",
32
+ "008-baseball.svg",
33
+ "008-break.svg",
34
+ "008-cucumber slice.svg",
35
+ "008-tea-bag.svg",
36
+ "009-american football.svg",
37
+ "009-coffee-3.svg",
38
+ "009-gingerbread-man.svg",
39
+ "009-room heater.svg",
40
+ "010-coffee-2.svg",
41
+ "010-helmet.svg",
42
+ "010-sauna.svg",
43
+ "010-shrimp-1.svg",
44
+ "011-artichoke.svg",
45
+ "011-bowling.svg",
46
+ "011-can.svg",
47
+ "011-hot stone.svg",
48
+ "012-avocado.svg",
49
+ "012-soak.svg",
50
+ "012-Surfboard.svg",
51
+ "012-syrup.svg",
52
+ "013-beef.svg",
53
+ "013-kettle-1.svg",
54
+ "013-ping pong.svg",
55
+ "013-yoga mat.svg",
56
+ "014-carrot.svg",
57
+ "014-comb.svg",
58
+ "014-expresso.svg",
59
+ "014-football.svg",
60
+ "015-bucket.svg",
61
+ "015-coffee-machine-2.svg",
62
+ "015-ice-cream.svg",
63
+ "015-whistle.svg",
64
+ "016-coffee-machine-1.svg",
65
+ "016-coffee-shop.svg",
66
+ "016-football.svg",
67
+ "016-lotion.svg",
68
+ "017-basketball.svg",
69
+ "017-chinese-food.svg",
70
+ "017-coffee-machine.svg",
71
+ "017-humidifier.svg",
72
+ "018-chocolate.svg",
73
+ "018-medal.svg",
74
+ "018-olive branch.svg",
75
+ "018-orange-1.svg",
76
+ "019-brush.svg",
77
+ "019-kiwi.svg",
78
+ "019-mocha.svg",
79
+ "019-trophy.svg",
80
+ "020-lemon.svg",
81
+ "020-podium.svg",
82
+ "020-tea-1.svg",
83
+ "020-towel.svg",
84
+ "021-badminton.svg",
85
+ "021-bottle.svg",
86
+ "021-firewood.svg",
87
+ "021-pomegranate.svg",
88
+ "022-bullseye.svg",
89
+ "022-map.svg",
90
+ "022-noodles-1.svg",
91
+ "022-sponge.svg",
92
+ "023-mortar.svg",
93
+ "023-onigiri.svg",
94
+ "023-rafting.svg",
95
+ "023-spoons.svg",
96
+ "024-bamboo.svg",
97
+ "024-cocktail.svg",
98
+ "024-dart.svg",
99
+ "024-pie.svg",
100
+ "025-blender.svg",
101
+ "025-ice hockey.svg",
102
+ "025-potato.svg",
103
+ "025-sleeping mask.svg",
104
+ "026-chips.svg",
105
+ "026-football.svg",
106
+ "026-hair dryer.svg",
107
+ "026-sugar.svg",
108
+ "027-bathrobe.svg",
109
+ "027-croissant.svg",
110
+ "027-goal box.svg",
111
+ "027-spoon.svg",
112
+ "028-basketball.svg",
113
+ "028-sandals.svg",
114
+ "028-sandwich.svg",
115
+ "028-toast.svg",
116
+ "029-donut.svg",
117
+ "029-massage.svg",
118
+ "029-pretzel.svg",
119
+ "029-ski.svg",
120
+ "030-frappe.svg",
121
+ "030-rice-cooker-1.svg",
122
+ "030-sauna.svg",
123
+ "030-ski goggles.svg",
124
+ "031-beauty treatment.svg",
125
+ "031-flippers.svg",
126
+ "031-tea-pot.svg",
127
+ "031-watermelon.svg",
128
+ "032-apple.svg",
129
+ "032-cookies.svg",
130
+ "032-snorkeling.svg",
131
+ "032-wax.svg",
132
+ "033-archery.svg",
133
+ "033-skewer.svg",
134
+ "033-tea-bag.svg",
135
+ "034-cake-1.svg",
136
+ "034-milkshake.svg",
137
+ "034-tennis.svg",
138
+ "035-coffee-1.svg",
139
+ "035-pastry.svg",
140
+ "035-running shoe.svg",
141
+ "036-bowling.svg",
142
+ "036-french-press.svg",
143
+ "036-ham.svg",
144
+ "037-dumbbell.svg",
145
+ "037-milk.svg",
146
+ "037-pasta.svg",
147
+ "038-biscuit.svg",
148
+ "038-caviar.svg",
149
+ "038-kayak.svg",
150
+ "039-coffee-beans.svg",
151
+ "039-cricket.svg",
152
+ "039-shrimp.svg",
153
+ "040-golf.svg",
154
+ "040-pepper.svg",
155
+ "040-tea.svg",
156
+ "041-billiard.svg",
157
+ "041-coffee.svg",
158
+ "041-sauces.svg",
159
+ "042-bowling.svg",
160
+ "042-piece-of-cake.svg",
161
+ "042-pot.svg",
162
+ "043-coffee-maker.svg",
163
+ "043-golf.svg",
164
+ "043-popcorn.svg",
165
+ "044-bicycle.svg",
166
+ "044-rice-cooker.svg",
167
+ "044-water.svg",
168
+ "045-basketball.svg",
169
+ "045-kettle.svg",
170
+ "045-vegetables-1.svg",
171
+ "046-cake.svg",
172
+ "046-coffee-machine.svg",
173
+ "046-water bottle.svg",
174
+ "047-coffee-bag.svg",
175
+ "047-muffin.svg",
176
+ "047-tennis.svg",
177
+ "048-ice-cream-2.svg",
178
+ "048-muffin.svg",
179
+ "048-stopwatch.svg",
180
+ "049-croissant.svg",
181
+ "049-karate.svg",
182
+ "049-olives.svg",
183
+ "050-doughnut.svg",
184
+ "050-skipping rope.svg",
185
+ "050-take-away.svg",
186
+ "051-lobster.svg",
187
+ "052-breakfast.svg",
188
+ "053-fish-2.svg",
189
+ "054-burger.svg",
190
+ "055-steak.svg",
191
+ "056-ice-cream-1.svg",
192
+ "057-star-fruit.svg",
193
+ "058-salt.svg",
194
+ "059-cheese.svg",
195
+ "060-cracker.svg",
196
+ "061-turnip.svg",
197
+ "062-ribs-1.svg",
198
+ "063-tuna-1.svg",
199
+ "064-fried-egg-1.svg",
200
+ "065-tuna.svg",
201
+ "066-ribs.svg",
202
+ "067-feeder.svg",
203
+ "068-milk.svg",
204
+ "069-fish-1.svg",
205
+ "070-turkey.svg",
206
+ "071-vegetables.svg",
207
+ "072-fried-egg.svg",
208
+ "073-roast-chicken.svg",
209
+ "074-spaghetti.svg",
210
+ "075-french-fries.svg",
211
+ "076-fruit.svg",
212
+ "077-cake.svg",
213
+ "078-cinnamon-roll.svg",
214
+ "079-fish.svg",
215
+ "080-soup-1.svg",
216
+ "081-jelly.svg",
217
+ "082-dishes.svg",
218
+ "083-oil-bottle.svg",
219
+ "084-napkin.svg",
220
+ "085-meat-grinder-1.svg",
221
+ "086-meat-grinder.svg",
222
+ "087-soup.svg",
223
+ "088-ice-cream.svg",
224
+ "089-taco-1.svg",
225
+ "090-taco.svg",
226
+ "091-toaster.svg",
227
+ "092-sushi-2.svg",
228
+ "093-sushi-1.svg",
229
+ "094-sushi.svg",
230
+ "095-noodles.svg",
231
+ "096-rice.svg",
232
+ "097-corkscrew.svg",
233
+ "098-pear.svg",
234
+ "099-orange.svg",
235
+ "100-tomato.svg",
236
+ ];
237
+
238
+
239
+
240
+
241
+ return {
242
+
243
+ facilityIcons,
244
+
245
+ }
246
+ }
@@ -171,7 +171,10 @@ export default function useServiceProvider() {
171
171
  orgId = "",
172
172
  siteId = "",
173
173
  siteName = "",
174
- serviceProviderOrgId = "",
174
+ // serviceProviderOrgId = "",
175
+ // org = "",
176
+ orgName = "",
177
+ category = "",
175
178
  } = {}) {
176
179
  return useNuxtApp().$api<Record<string, any>>("/api/service-providers", {
177
180
  method: "POST",
@@ -183,7 +186,10 @@ export default function useServiceProvider() {
183
186
  orgId,
184
187
  siteId,
185
188
  siteName,
186
- serviceProviderOrgId,
189
+ // serviceProviderOrgId,
190
+ // org,
191
+ orgName,
192
+ category,
187
193
  },
188
194
  });
189
195
  }
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@iservice365/layer-common",
3
3
  "license": "MIT",
4
4
  "type": "module",
5
- "version": "1.4.1",
5
+ "version": "1.5.0",
6
6
  "main": "./nuxt.config.ts",
7
7
  "scripts": {
8
8
  "dev": "nuxi dev .playground",
@@ -24,8 +24,10 @@
24
24
  },
25
25
  "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e",
26
26
  "dependencies": {
27
+ "@ckeditor/ckeditor5-vue": "^7.3.0",
27
28
  "@iconify/vue": "^5.0.0",
28
29
  "@mdi/font": "^7.4.47",
30
+ "ckeditor5": "^47.2.0",
29
31
  "sass": "^1.80.6",
30
32
  "vue3-signature": "^0.2.4",
31
33
  "zod": "^3.24.2"