@7365admin1/layer-common 1.11.8 → 1.11.9

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @iservice365/layer-common
2
2
 
3
+ ## 1.11.9
4
+
5
+ ### Patch Changes
6
+
7
+ - 07272c0: Update Version
8
+
3
9
  ## 1.11.8
4
10
 
5
11
  ### Patch Changes
@@ -449,6 +449,7 @@ import useUtils from "../composables/useUtils";
449
449
  const props = defineProps({
450
450
  orgId: { type: String, default: "" },
451
451
  site: { type: String, default: "" },
452
+ serviceType: { type: String, default: "" },
452
453
  });
453
454
 
454
455
  const { canCreateEquipmentItem } = useEquipmentItemPermission();
@@ -492,6 +493,7 @@ const {
492
493
  page: page.value,
493
494
  search: searchInput.value,
494
495
  site: props.site,
496
+ serviceType: props.serviceType,
495
497
  }),
496
498
  {
497
499
  watch: [page, () => props.site],
@@ -557,6 +559,7 @@ const { data: getSuppliesReq } = await useLazyAsyncData(
557
559
  getSupplies({
558
560
  site: props.site,
559
561
  limit: 100,
562
+ serviceType: props.serviceType,
560
563
  }),
561
564
  {}
562
565
  );
@@ -661,7 +664,7 @@ async function _equipmentItem() {
661
664
  : {}),
662
665
  }));
663
666
 
664
- await equipmentItemApi(props.site, { items });
667
+ await equipmentItemApi(props.site, { items, serviceType: props.serviceType });
665
668
 
666
669
  showMessage(
667
670
  `Checked out ${equipmentItems.value.length} item(s).`,
@@ -32,16 +32,37 @@
32
32
  </v-combobox>
33
33
  </v-col>
34
34
 
35
+ <v-col v-if="shouldShowField('block')" cols="12">
36
+ <InputLabel class="text-capitalize" title="Block" required />
37
+ <v-select v-model="vehicle.block" :items="blocksArray" item-value="value" item-title="title"
38
+ @update:model-value="handleChangeBlock" density="comfortable" :rules="[requiredRule]"
39
+ />
40
+ </v-col>
41
+
42
+ <v-col v-if="shouldShowField('level')" cols="12">
43
+ <InputLabel class="text-capitalize" title="Level" required />
44
+ <v-select v-model="vehicle.level" :items="levelsArray" density="comfortable"
45
+ :disabled="!vehicle.block" @update:model-value="handleChangeLevel"
46
+ :rules="[requiredRule]" />
47
+ </v-col>
48
+
49
+ <v-col v-if="shouldShowField('unit')" cols="12">
50
+ <InputLabel class="text-capitalize" title="Unit" required />
51
+ <v-select v-model="vehicle.unit" :items="unitsArray" density="comfortable"
52
+ :disabled="!vehicle.level" :rules="[requiredRule]" />
53
+ </v-col>
54
+
35
55
  <v-col v-if="shouldShowField('nric')" cols="12">
36
56
  <InputLabel class="text-capitalize" title="NRIC" required />
37
- <InputNRICNumber v-model="vehicle.nric" density="comfortable" :rules="[requiredRule]" />
57
+ <InputNRICNumber v-model="vehicle.nric" density="comfortable" :rules="[requiredRule]" :disabled="disablePrefilledInputs" />
38
58
  </v-col>
39
59
 
40
60
  <v-col v-if="shouldShowField('name')" cols="12">
41
61
  <v-row>
42
62
  <v-col cols="12">
43
63
  <InputLabel class="text-capitalize" title="Full Name" required />
44
- <v-text-field v-model.trim="vehicle.name" density="comfortable" :rules="[requiredRule]" :disabled="disablePrefilledInputs" />
64
+ <v-text-field v-model.trim="vehicle.name" density="comfortable" :rules="[requiredRule]"
65
+ :disabled="disablePrefilledInputs" />
45
66
  </v-col>
46
67
  </v-row>
47
68
  </v-col>
@@ -50,36 +71,16 @@
50
71
 
51
72
  <v-col v-if="shouldShowField('phone')" cols="12">
52
73
  <InputLabel class="text-capitalize" title="Phone Number" required />
53
- <InputPhoneNumberV2 v-model="vehicle.phoneNumber" density="comfortable" :rules="[requiredRule]"
54
- :disabled="disablePrefilledInputs" />
55
- </v-col>
56
-
57
- <v-col v-if="shouldShowField('block')" cols="12">
58
- <InputLabel class="text-capitalize" title="Block" required />
59
- <v-select v-model="vehicle.block" :items="blocksArray" item-value="value" item-title="title"
60
- @update:model-value="handleChangeBlock" density="comfortable" :rules="[requiredRule]"
61
- :disabled="disablePrefilledInputs" />
62
- </v-col>
63
-
64
- <v-col v-if="shouldShowField('level')" cols="12">
65
- <InputLabel class="text-capitalize" title="Level" required />
66
- <v-select v-model="vehicle.level" :items="levelsArray" density="comfortable"
67
- :disabled="!vehicle.block || disablePrefilledInputs" @update:model-value="handleChangeLevel"
68
- :rules="[requiredRule]" />
69
- </v-col>
70
-
71
- <v-col v-if="shouldShowField('unit')" cols="12">
72
- <InputLabel class="text-capitalize" title="Unit" required />
73
- <v-select v-model="vehicle.unit" :items="unitsArray" density="comfortable"
74
- :disabled="!vehicle.level || disablePrefilledInputs" :rules="[requiredRule]" />
74
+ <InputPhoneNumberV2 v-model="vehicle.phoneNumber" density="comfortable" :rules="[requiredRule]" />
75
75
  </v-col>
76
76
 
77
77
  <v-col v-if="shouldShowField('plateNumber')" cols="12">
78
- <InputLabel class="text-capitalize" title="Vehicle Numbers" required />
78
+
79
79
  <!-- <v-text-field v-model="vehicle.plateNumber" density="comfortable" :rules="[requiredRule]" /> -->
80
80
  <template v-for="plate in vehicle.plates" :key="plate.plateNumber">
81
+ <InputLabel class="text-capitalize" title="Existing Vehicle Numbers" required />
81
82
  <v-text-field v-model="plate.plateNumber" density="comfortable" :rules="[requiredRule]" class="mb-2"
82
- readonly>
83
+ readonly disabled>
83
84
  <template #append-inner>
84
85
  <v-chip size="small" class="ma-0" :color="formatVehicleStatus(plate?.status)?.color as string">{{
85
86
  formatVehicleStatus(plate?.status)?.label }}</v-chip>
@@ -87,11 +88,12 @@
87
88
  </v-text-field>
88
89
  </template>
89
90
 
91
+ <InputLabel class="text-capitalize" title="New Vehicle Numbers" required />
90
92
  <template v-for="(plate, index) in newPlateNumbers" :key="index">
91
93
  <v-row class="" :class="`${index === newPlateNumbers.length - 1 ? 'mb-1' : 'mb-5'}`" no-gutters>
92
94
  <v-col :cols="newPlateNumbers.length > 1 ? '11' : '12'">
93
95
  <InputVehicleNumber v-model="newPlateNumbers[index]" density="comfortable"
94
- placeholder="New Vehicle Number" :rules="[requiredRule]" />
96
+ placeholder="New Vehicle Number" :rules="[requiredRule]" />
95
97
  </v-col>
96
98
 
97
99
  <v-col :cols="newPlateNumbers.length > 1 ? '1' : '0'" class="d-flex align-start">
@@ -114,7 +116,7 @@
114
116
  <v-col v-if="shouldShowField('start')" cols="12">
115
117
  <v-expand-transition v-if="showSubscriptionDateOptions">
116
118
  <v-row no-gutters>
117
- <v-row dense justify="space-between">
119
+ <!-- <v-row dense justify="space-between">
118
120
  <template v-for="option in subscriptionOptions" :key="option.value">
119
121
  <v-col cols="4">
120
122
  <v-btn :text="option.label" class="text-capitalize" min-width="120" :ripple="false"
@@ -123,7 +125,7 @@
123
125
  </v-col>
124
126
 
125
127
  </template>
126
- </v-row>
128
+ </v-row> -->
127
129
 
128
130
  <v-row no-gutters class="mt-5">
129
131
  <v-col cols="12">
@@ -187,7 +189,7 @@
187
189
  <v-toolbar-title>
188
190
  <v-row no-gutters class="d-flex align-center justify-space-between">
189
191
  <span class="font-weight-bold">
190
- Matching Records for NRIC: {{ vehicle.nric }}
192
+ Matching Records for "{{ searchUnitName ?? "-" }}"
191
193
  </span>
192
194
  <span>
193
195
  <v-btn v-if="matchingPeople.length === 0" icon="mdi-close" variant="text"
@@ -200,14 +202,14 @@
200
202
  <v-card-text>
201
203
 
202
204
  <v-list lines="three">
203
- <v-list-item v-if="matchingPeople.length > 0 || checkingNRIC" v-for="v in matchingPeople" :key="v._id"
205
+ <v-list-item v-if="matchingPeople.length > 0 || checkingUnit" v-for="v in matchingPeople" :key="v._id"
204
206
  class="cursor-pointer">
205
207
  <v-list-item-title>
206
208
  {{ v.name }}
207
209
  </v-list-item-title>
208
210
 
209
211
  <v-list-item-subtitle>
210
- Block {{ v.block }} - {{ v.level }} - {{ v.unitName }}
212
+ NRIC: {{ v.nric || "-" }}
211
213
  </v-list-item-subtitle>
212
214
 
213
215
  <div class="mt-1">
@@ -217,7 +219,7 @@
217
219
  </div>
218
220
 
219
221
  <template #append>
220
- <v-btn variant="flat" color="primary" @click="selectNRICRecord(v)">Select</v-btn>
222
+ <v-btn variant="flat" color="primary" @click="selectPeopleRecord(v)">Select</v-btn>
221
223
  </template>
222
224
 
223
225
  </v-list-item>
@@ -266,7 +268,7 @@ const prop = defineProps({
266
268
  const { requiredRule, formatDateISO8601, debounce } = useUtils();
267
269
  const { addVehicle, getCustomSeasonPassTypes, updateVehicle, formatVehicleStatus } = useVehicle();
268
270
  const { getSiteById, getSiteLevels, getSiteUnits } = useSiteSettings();
269
- const { findPersonByNRICMultipleResult } = usePeople();
271
+ const { findPersonByNRICMultipleResult, getPeopleByUnit } = usePeople();
270
272
 
271
273
  const emit = defineEmits(['back', 'select', 'done', 'error', 'close', 'close:all']);
272
274
 
@@ -291,7 +293,7 @@ const vehicle = reactive<Omit<ExceptPartial<TVehicle>, 'type'> & { type: TVehicl
291
293
  });
292
294
 
293
295
  const newPlateNumbers = ref<string[]>(['']);
294
- const disablePrefilledInputs = ref(false);
296
+ const disablePrefilledInputs = ref(true);
295
297
 
296
298
  const blocksArray = ref<TDefaultOptionObj[]>([]);
297
299
  const levelsArray = ref<TDefaultOptionObj[]>([]);
@@ -301,6 +303,7 @@ const seasonPassTypeArray = ref<{ title: string, value: string }[]>([]);
301
303
  const matchingPeople = ref<Partial<TPeople>[]>([]);
302
304
  const showMatchingPeopleDialog = ref(false);
303
305
  const checkingNRIC = ref(false);
306
+ const checkingUnit = ref(false);
304
307
 
305
308
  const defaultSeasonPassTypeArray = computed(() => {
306
309
  return [
@@ -329,6 +332,11 @@ const shouldShowField = (fieldKey: string): boolean => {
329
332
  };
330
333
 
331
334
 
335
+ const searchUnitName = computed(() => {
336
+ return unitsArray.value.find(u => u.value === vehicle.unit)?.title || vehicle.unit;
337
+ })
338
+
339
+
332
340
  const validForm = ref(false);
333
341
  const seasonPassTypeInput = ref('')
334
342
  const formRef = ref<HTMLFormElement | null>(null);
@@ -636,36 +644,62 @@ watch([() => vehicle.end, () => vehicle.start], () => {
636
644
  });
637
645
 
638
646
 
639
- function selectNRICRecord(record: TPeople) {
647
+ function selectPeopleRecord(record: TPeople) {
640
648
 
641
649
  vehicle.name = record.name;
642
650
  vehicle.phoneNumber = record.contact;
643
- vehicle.block = Number(record.block);
644
- vehicle.level = record.level;
645
- vehicle.unit = record.unit;
646
-
651
+ vehicle.nric = record.nric;
647
652
  vehicle.plates = record.plates || [];
648
-
649
653
  disablePrefilledInputs.value = true;
650
654
  showMatchingPeopleDialog.value = false;
651
-
652
- refreshLevelsData();
653
- refreshUnitsData();
654
655
  }
655
656
 
656
657
 
657
- async function checkNRIC() {
658
- if (!vehicle.nric || vehicle.nric.length < 5) return;
658
+ // async function checkNRIC() {
659
+ // if (!vehicle.nric || vehicle.nric.length < 5) return;
660
+
661
+ // checkingNRIC.value = true;
662
+ // showMatchingPeopleDialog.value = true;
663
+ // // Lock editable fields while we verify if this NRIC has existing records.
664
+ // disablePrefilledInputs.value = true;
665
+ // try {
666
+ // const res = await findPersonByNRICMultipleResult(vehicle.nric, prop.site) as { items: TPeople[] } | null;
667
+
668
+ // if (res?.items && res.items.length > 0) {
669
+ // matchingPeople.value = res.items || []
670
+ // // Force selection from matched records.
671
+ // disablePrefilledInputs.value = true;
672
+ // } else {
673
+ // matchingPeople.value = [];
674
+ // // No match found, allow manual input.
675
+ // disablePrefilledInputs.value = false;
676
+ // }
677
+
678
+
679
+ // } catch (error) {
680
+ // console.error("NRIC search failed:", error);
681
+ // disablePrefilledInputs.value = false;
682
+ // } finally {
683
+ // checkingNRIC.value = false;
684
+ // }
685
+ // }
686
+
687
+ // const debounceedCheckNRIC = debounce(checkNRIC, 500);
688
+
689
+
659
690
 
660
- checkingNRIC.value = true;
691
+ async function checkPeopleById() {
692
+ if (!vehicle.unit) return;
693
+
694
+ checkingUnit.value = true;
661
695
  showMatchingPeopleDialog.value = true;
662
696
  // Lock editable fields while we verify if this NRIC has existing records.
663
697
  disablePrefilledInputs.value = true;
664
698
  try {
665
- const res = await findPersonByNRICMultipleResult(vehicle.nric, prop.site) as { items: TPeople[] } | null;
699
+ const res = await getPeopleByUnit(vehicle.unit) as TPeople[]| null;
666
700
 
667
- if (res?.items && res.items.length > 0) {
668
- matchingPeople.value = res.items || []
701
+ if (Array.isArray(res) && res.length > 0) {
702
+ matchingPeople.value = res || []
669
703
  // Force selection from matched records.
670
704
  disablePrefilledInputs.value = true;
671
705
  } else {
@@ -676,23 +710,23 @@ async function checkNRIC() {
676
710
 
677
711
 
678
712
  } catch (error) {
679
- console.error("NRIC search failed:", error);
680
- disablePrefilledInputs.value = false;
713
+ console.error("Unit search failed:", error);
714
+ // disablePrefilledInputs.value = false;
681
715
  } finally {
682
- checkingNRIC.value = false;
716
+ checkingUnit.value = false;
683
717
  }
684
718
  }
685
719
 
686
- const debounceedCheckNRIC = debounce(checkNRIC, 500);
720
+ const debounceedCheckUnit = debounce(checkPeopleById, 500);
687
721
 
688
722
  watch(
689
- () => vehicle.nric,
690
- async (newNRIC) => {
723
+ () => vehicle.unit,
724
+ async (newUnit) => {
691
725
  resetVehicleDetails();
692
726
  matchingPeople.value = [];
693
- if (!newNRIC || newNRIC.length < 3) return;
727
+ if (!newUnit) return;
694
728
 
695
- debounceedCheckNRIC();
729
+ debounceedCheckUnit();
696
730
  }
697
731
  );
698
732
 
@@ -700,10 +734,8 @@ watch(
700
734
  const resetVehicleDetails = () => {
701
735
  vehicle.name = '';
702
736
  vehicle.phoneNumber = '';
703
- vehicle.block = '';
704
- vehicle.level = '';
705
- vehicle.unit = '';
706
737
  vehicle.plates = [];
738
+ vehicle.nric = '';
707
739
  disablePrefilledInputs.value = false;
708
740
  }
709
741
 
@@ -47,7 +47,7 @@
47
47
  :org="org" :site="site" @close:all="handleCloseAll" />
48
48
  </v-dialog> -->
49
49
 
50
- <v-dialog v-if="canViewVehicleDetails" v-model="dialog.showMoreActions" width="600" persistent>
50
+ <v-dialog v-if="canViewVehicleDetails" v-model="dialog.showMoreActions" width="800" persistent>
51
51
  <DialogUpdateMoreAction title="Preview" :can-update="false" :can-delete="false"
52
52
  @close="dialog.showMoreActions = false">
53
53
  <template v-slot:content>
@@ -74,7 +74,7 @@
74
74
  <v-btn text="Add Vehicle Number" class="mt-6 text-capitalize" prepend-icon="mdi-plus"
75
75
  @click="addNewPlateNumbers" color="primary" />
76
76
  </v-card>
77
- </v-col
77
+ </v-col>
78
78
 
79
79
  </v-col>
80
80
 
@@ -240,7 +240,7 @@ const selectedVehicleObject = computed(() => {
240
240
 
241
241
  const { data: getVehiclesReq, refresh: getVehiclesRefresh, pending: getVehiclesPending } =
242
242
  await useLazyAsyncData(
243
- "get-all-vehicles",
243
+ `get-all-vehicles-${props.site}`,
244
244
  () =>
245
245
  getVehicles({
246
246
  page: page.value,
@@ -4,12 +4,13 @@ export default function useEquipmentItem() {
4
4
  search = "",
5
5
  limit = 10,
6
6
  site = "",
7
+ serviceType = "",
7
8
  } = {}) {
8
9
  return useNuxtApp().$api<Record<string, any>>(
9
10
  `/api/hygiene-checkout-items/site/${site}`,
10
11
  {
11
12
  method: "GET",
12
- query: { page, search, limit, site },
13
+ query: { page, search, limit, site, serviceType },
13
14
  },
14
15
  );
15
16
  }
@@ -1,10 +1,10 @@
1
1
  export default function useEquipmentManagement() {
2
- function getSupplies({ page = 1, search = "", limit = 10, site = "" } = {}) {
2
+ function getSupplies({ page = 1, search = "", limit = 10, site = "", serviceType = "" } = {}) {
3
3
  return useNuxtApp().$api<Record<string, any>>(
4
4
  `/api/hygiene-supplies/site/${site}`,
5
5
  {
6
6
  method: "GET",
7
- query: { page, search, limit, site },
7
+ query: { page, search, limit, site, serviceType },
8
8
  }
9
9
  );
10
10
  }
@@ -3,14 +3,13 @@ export default function useVehicle() {
3
3
  search = "",
4
4
  page = 1,
5
5
  limit = 10,
6
- sort = "asc",
7
- order = "",
6
+ order = "desc",
8
7
  type = "",
9
8
  category = "",
10
9
  } = {}) {
11
10
  return await useNuxtApp().$api<Record<string, any>>("/api/vehicles", {
12
11
  method: "GET",
13
- query: { search, page, limit, sort, order, type, category },
12
+ query: { search, page, limit, order, type, category },
14
13
  });
15
14
  }
16
15
 
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@7365admin1/layer-common",
3
3
  "license": "MIT",
4
4
  "type": "module",
5
- "version": "1.11.8",
5
+ "version": "1.11.9",
6
6
  "author": "7365admin1",
7
7
  "main": "./nuxt.config.ts",
8
8
  "publishConfig": {
@@ -16,6 +16,7 @@ declare type TEquipmentItemCreate = {
16
16
  qty: number;
17
17
  attachment?: string[];
18
18
  }>;
19
+ serviceType?: string;
19
20
  };
20
21
 
21
22
  declare type TEquipmentItem = {