@feedmepos/mf-order-setting 0.0.37 → 0.0.43

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 (62) hide show
  1. package/dist/{KioskDevicesView-D9PQ22G6.js → KioskDevicesView-KBpXQJmy.js} +1 -1
  2. package/dist/{KioskDevicesView.vue_vue_type_script_setup_true_lang-BuwHk_0a.js → KioskDevicesView.vue_vue_type_script_setup_true_lang-taf41a-7.js} +2 -2
  3. package/dist/KioskSettingView-DG12ZvfT.js +528 -0
  4. package/dist/{KioskView-C6s4u6vt.js → KioskView-KNiT-upH.js} +125 -119
  5. package/dist/OrderSettingsView-CoAGawQi.js +75548 -0
  6. package/dist/{app-86WCOyBO.js → app-Db1lhCv7.js} +26 -20
  7. package/dist/app.js +1 -1
  8. package/dist/{dayjs.min-BiuO1l2_.js → dayjs.min-D9bsUd57.js} +232 -242
  9. package/dist/frontend/mf-order/src/api/menu/index.d.ts +4 -0
  10. package/dist/frontend/mf-order/src/app.d.ts +9 -3
  11. package/dist/frontend/mf-order/src/main.d.ts +9 -3
  12. package/dist/frontend/mf-order/src/stores/menu/menu.d.ts +13 -4
  13. package/dist/frontend/mf-order/src/stores/order-setting/index.d.ts +3 -3
  14. package/dist/frontend/mf-order/src/stores/restaurant/index.d.ts +1 -1
  15. package/dist/frontend/mf-order/src/views/order-settings/delivery/components/ManualIntegratedDeliverySetting.vue.d.ts +5 -0
  16. package/dist/frontend/mf-order/tsconfig.app.tsbuildinfo +1 -1
  17. package/dist/{index-DZKSDqn_.js → index-D_Tmm1qL.js} +2 -2
  18. package/dist/menu.dto-BY9dVf93.js +127239 -0
  19. package/dist/package/entity/delivery/linked-delivery.do.d.ts +9 -0
  20. package/dist/package/entity/food-court/order.dto.d.ts +1952 -1952
  21. package/dist/package/entity/incoming-order/incoming-order-to-bill.dto.d.ts +23 -23
  22. package/dist/package/entity/incoming-order/incoming-order.do.d.ts +45 -45
  23. package/dist/package/entity/incoming-order/incoming-order.dto.d.ts +34 -34
  24. package/dist/package/entity/order/dine-in/dine-in.do.d.ts +11 -11
  25. package/dist/package/entity/order/dine-in/dine-in.dto.d.ts +4 -4
  26. package/dist/package/entity/order/menu/menu.dto.d.ts +4 -4
  27. package/dist/package/entity/order/order.do.d.ts +8 -8
  28. package/dist/package/entity/order/order.dto.d.ts +3322 -3322
  29. package/dist/package/entity/order/order.enum.d.ts +1 -1
  30. package/dist/package/entity/order/payment/payment.dto.d.ts +1702 -1702
  31. package/dist/package/entity/order-setting/order-setting.do.d.ts +5 -5
  32. package/dist/package/entity/order-setting/order-setting.dto.d.ts +10 -10
  33. package/dist/package/entity/order-setting/sms/sms.do.d.ts +3 -3
  34. package/dist/package/entity/order-setting/sms/sms.dto.d.ts +3 -3
  35. package/dist/package/entity/payment/payment.dto.d.ts +3 -3
  36. package/dist/package/entity/queue/queue.dto.d.ts +872 -872
  37. package/dist/package/entity/restaurant/restaurant.dto.d.ts +282 -3
  38. package/package.json +4 -4
  39. package/src/api/menu/index.ts +4 -1
  40. package/src/locales/en-US.json +3 -1
  41. package/src/locales/th-TH.json +3 -1
  42. package/src/locales/zh-CN.json +3 -1
  43. package/src/stores/menu/menu.ts +33 -14
  44. package/src/views/kiosk/KioskView.vue +16 -4
  45. package/src/views/kiosk/settings/KioskSettingView.vue +193 -122
  46. package/src/views/order-settings/OrderSettingsView.vue +40 -13
  47. package/src/views/order-settings/delivery/DeliverySetting.vue +12 -17
  48. package/src/views/order-settings/delivery/components/ManualIntegratedDeliverySetting.vue +21 -2
  49. package/src/views/order-settings/delivery/delivery.ts +9 -5
  50. package/src/views/order-settings/delivery/integrated-delivery/ExternalSetting.vue +3 -17
  51. package/src/views/order-settings/delivery/integrated-delivery/IntegratedDelivery.vue +0 -1
  52. package/dist/KioskSettingView-C98iSa7q.js +0 -843
  53. package/dist/OrderSettingsView-DFB_C-VO.js +0 -50757
  54. package/dist/frontend/mf-order/src/views/kiosk/settings/KioskDineInSection.vue.d.ts +0 -10
  55. package/dist/frontend/mf-order/src/views/kiosk/settings/KioskEnablePaxDialogSection.vue.d.ts +0 -9
  56. package/dist/frontend/mf-order/src/views/kiosk/settings/KioskMenuItemSection.vue.d.ts +0 -9
  57. package/dist/frontend/mf-order/src/views/kiosk/settings/KioskTakeawaySection.vue.d.ts +0 -10
  58. package/dist/menu.dto-CT1XwUKO.js +0 -127978
  59. package/src/views/kiosk/settings/KioskDineInSection.vue +0 -68
  60. package/src/views/kiosk/settings/KioskEnablePaxDialogSection.vue +0 -33
  61. package/src/views/kiosk/settings/KioskMenuItemSection.vue +0 -27
  62. package/src/views/kiosk/settings/KioskTakeawaySection.vue +0 -66
@@ -1,37 +1,157 @@
1
1
  <template>
2
2
  <div v-if="!!kioskOrderSettingForm" class="flex flex-col gap-32">
3
+ <!-- Dine In Section -->
3
4
  <div class="flex flex-col gap-2">
4
5
  <span class="fm-typo-en-title-sm-600">{{ t('order.dineIn') }}</span>
5
- <KioskDineInSection
6
- :key="'dine-in-' + restaurantId"
7
- :v="kioskOrderSettingForm.dineIn"
8
- @update-dine-in="updateDineInSetting"
9
- />
6
+ <div class="flex flex-col gap-5">
7
+ <FmSwitch
8
+ v-model="kioskOrderSettingForm.dineIn.enabled"
9
+ :label="t('order.dineIn')"
10
+ label-placement="right"
11
+ />
12
+ <div v-show="kioskOrderSettingForm.dineIn.enabled" class="flex flex-col gap-16">
13
+ <!-- Pick Up at Counter -->
14
+ <div>
15
+ <FmSwitch
16
+ v-model="kioskOrderSettingForm.dineIn.pickUp.enabled"
17
+ :label="t('order.pickAtCounter')"
18
+ label-placement="right"
19
+ />
20
+ <div
21
+ v-show="kioskOrderSettingForm.dineIn.pickUp.enabled"
22
+ class="border p-[1.5rem] fm-corner-radius-lg flex flex-col gap-2 my-5 w-11/12"
23
+ >
24
+ <span class="fm-typo-en-title-sm-600">{{ t('order.submitOrderInstruction') }}</span>
25
+ <FmTextField
26
+ v-model="kioskOrderSettingForm.dineIn.pickUp.submitOrderInstruction.payAtCounter"
27
+ :label="t('order.payAtCounter')"
28
+ :placeholder="'Collect your transaction slip below and present it to the cashier'"
29
+ />
30
+ <FmTextField
31
+ v-model="kioskOrderSettingForm.dineIn.pickUp.submitOrderInstruction.paid"
32
+ :label="t('order.paid')"
33
+ :placeholder="'Please wait as we prepare your food. We\'ll call your number when it\'s ready.'"
34
+ />
35
+ </div>
36
+ </div>
37
+
38
+ <!-- Display Stand -->
39
+ <div>
40
+ <FmSwitch
41
+ v-model="kioskOrderSettingForm.dineIn.displayStand.enabled"
42
+ :label="t('order.displayStand')"
43
+ label-placement="right"
44
+ />
45
+ <div
46
+ v-show="kioskOrderSettingForm.dineIn.displayStand.enabled"
47
+ class="border p-[1.5rem] fm-corner-radius-lg flex flex-col gap-2 my-5 w-11/12"
48
+ >
49
+ <span class="fm-typo-en-title-sm-600">{{ t('order.tableServiceSetting') }}</span>
50
+ <FmTextField
51
+ v-model="kioskOrderSettingForm.dineIn.displayStand.prefix"
52
+ :label="t('order.prefix')"
53
+ :placeholder="t('order.prefix')"
54
+ />
55
+ <div class="flex flex-row gap-2">
56
+ <FmStepperField
57
+ v-model="kioskOrderSettingForm.dineIn.displayStand.standSlotRange.min"
58
+ class="w-1/2"
59
+ :label="t('order.start')"
60
+ labelMark="required"
61
+ :rules="minRules"
62
+ :placeholder="t('order.enterANumber')"
63
+ />
64
+ <FmStepperField
65
+ v-model="kioskOrderSettingForm.dineIn.displayStand.standSlotRange.max"
66
+ class="w-1/2"
67
+ :label="t('order.end')"
68
+ labelMark="required"
69
+ :rules="maxRules"
70
+ :placeholder="t('order.enterANumber')"
71
+ />
72
+ </div>
73
+ <FmStepperField
74
+ v-model="kioskOrderSettingForm.dineIn.displayStand.padDigit"
75
+ :label="t('order.padDigit')"
76
+ labelMark="required"
77
+ :rules="padDigitRules"
78
+ :placeholder="t('order.padDigit')"
79
+ />
80
+ </div>
81
+
82
+ <div
83
+ v-show="kioskOrderSettingForm.dineIn.displayStand.enabled"
84
+ class="border p-[1.5rem] fm-corner-radius-lg flex flex-col gap-2 my-5 w-11/12"
85
+ >
86
+ <span class="fm-typo-en-title-sm-600">{{ t('order.submitOrderInstruction') }}</span>
87
+ <FmTextField
88
+ v-model="
89
+ kioskOrderSettingForm.dineIn.displayStand.submitOrderInstruction.payAtCounter
90
+ "
91
+ :label="t('order.payAtCounter')"
92
+ :placeholder="'Collect your transaction slip below and present it to the cashier'"
93
+ />
94
+ <FmTextField
95
+ v-model="kioskOrderSettingForm.dineIn.displayStand.submitOrderInstruction.paid"
96
+ :label="t('order.paid')"
97
+ :placeholder="'Please collect your receipt and we\'ll bring your food to your table once it\'s ready.'"
98
+ />
99
+ </div>
100
+ </div>
101
+ </div>
102
+ </div>
10
103
  </div>
104
+
105
+ <!-- Takeaway Section -->
11
106
  <div class="flex flex-col gap-2">
12
107
  <span class="fm-typo-en-title-sm-600">{{ t('order.takeawayTitle') }}</span>
13
- <KioskTakeawaySection
14
- :key="'takeaway-' + restaurantId"
15
- :v="kioskOrderSettingForm.takeaway"
16
- @update-takeaway="updateTakeawaySetting"
108
+ <FmSwitch
109
+ v-model="kioskOrderSettingForm.takeaway.enabled"
110
+ :label="t('order.takeaway')"
111
+ label-placement="right"
112
+ class="mb-5"
17
113
  />
114
+ <div
115
+ v-show="kioskOrderSettingForm.takeaway.enabled"
116
+ class="border p-[1.5rem] fm-corner-radius-lg flex flex-col gap-2 my-5 w-11/12"
117
+ >
118
+ <span class="fm-typo-en-title-sm-600">{{ t('order.submitOrderInstruction') }}</span>
119
+ <FmTextField
120
+ v-model="kioskOrderSettingForm.takeaway.submitOrderInstruction.payAtCounter"
121
+ :label="t('order.payAtCounter')"
122
+ :placeholder="'Collect your transaction slip below and present it to the cashier'"
123
+ />
124
+ <FmTextField
125
+ v-model="kioskOrderSettingForm.takeaway.submitOrderInstruction.paid"
126
+ :label="t('order.paid')"
127
+ :placeholder="'Please wait as we prepare your food. We\'ll call your number when it\'s ready.'"
128
+ />
129
+ </div>
18
130
  </div>
131
+
132
+ <!-- Menu Item Section -->
19
133
  <div class="flex flex-col gap-2">
20
- <span class="fm-typo-en-title-sm-600">{{ t('order.menuItem') }}</span>
21
- <KioskMenuItemSection
22
- :key="'menu-item-' + restaurantId"
23
- :v="kioskOrderSettingForm.menuItem.showAllOnly"
24
- @update:model-value="updateMenuItemSetting"
134
+ <span class="fm-typo-en-title-sm-600">{{ t('order.menuItem') }}</span>
135
+ <FmSwitch
136
+ v-model="kioskOrderSettingForm.menuItem.showAllOnly"
137
+ :label="t('order.showNotAvailableMenuItem')"
138
+ label-placement="right"
139
+ class="mb-5"
25
140
  />
26
141
  </div>
142
+
143
+ <!-- Display Pax Dialog Section -->
27
144
  <div class="flex flex-col gap-2">
28
145
  <span class="fm-typo-en-title-sm-600">{{ t('order.displayPaxDialogTitle') }}</span>
29
- <KioskEnablePaxDialogSection
30
- :key="'enable-pax-dialog-' + restaurantId"
31
- :v="enablePaxDialog"
32
- @update-enable-pax-dialog="updateEnablePaxDialogSetting"
146
+ <FmSwitch
147
+ v-model="enablePaxDialog"
148
+ :label="t('order.displayPaxDialogDescription')"
149
+ label-placement="right"
150
+ class="mb-5"
33
151
  />
34
152
  </div>
153
+
154
+ <!-- Payment Section -->
35
155
  <div class="flex flex-col gap-2">
36
156
  <span class="fm-typo-en-title-sm-600">{{ t('order.acceptedPayment') }}</span>
37
157
  <span class="fm-typo-en-title-sm-400 font-bold">{{ t('order.configuration') }}</span>
@@ -46,8 +166,9 @@
46
166
  (kioskOrderSettingForm.paymentSetting.offlinePaymentTypes = v)
47
167
  "
48
168
  @update:ePaymentTypes="updateEPaymentSetting"
49
- />
169
+ />
50
170
  </div>
171
+
51
172
  <FmButton
52
173
  class="w-1/4 mb-10"
53
174
  variant="primary"
@@ -62,15 +183,10 @@
62
183
  </template>
63
184
  <script setup lang="ts">
64
185
  import { computed, ref } from 'vue'
65
- import KioskDineInSection from './KioskDineInSection.vue'
66
- import KioskTakeawaySection from './KioskTakeawaySection.vue'
67
186
  import KioskPaymentTypeSection from './KioskPaymentTypeSection.vue'
68
187
  import { FdoOfflinePaymentMethod } from '@feedmepos/core/entity'
69
188
  import { FdoEPaymentMethod, F_ORDER_PAYMENT_TYPE } from '@entity'
70
- import KioskMenuItemSection from './KioskMenuItemSection.vue'
71
189
  import type {
72
- KioskDineInSettingForm,
73
- KioskTakeawaySettingForm,
74
190
  MfKioskOrderSetting,
75
191
  MfKioskOrderSettingForm,
76
192
  KioskPaymentTypesForm
@@ -78,7 +194,6 @@ import type {
78
194
  import { useLoading } from '@/composables/loading'
79
195
  import { useSnackbar } from '@feedmepos/ui-library'
80
196
  import { useI18n } from '@feedmepos/mf-common'
81
- import KioskEnablePaxDialogSection from './KioskEnablePaxDialogSection.vue'
82
197
 
83
198
  const { t } = useI18n()
84
199
 
@@ -99,86 +214,53 @@ const emits = defineEmits<Emits>()
99
214
 
100
215
  const kioskOrderSettingForm = ref<MfKioskOrderSettingForm>(props.form)
101
216
 
217
+ // Validation rules
218
+ const nonNegativeRule = (val: any) => {
219
+ if (val < 0) return t('order.nonNegativeRule')
220
+ return true
221
+ }
222
+
223
+ const greaterThanMinRule = (val: any) => {
224
+ if (val <= (kioskOrderSettingForm.value.dineIn.displayStand.standSlotRange.min ?? 0)) {
225
+ return t('order.greaterThanMinRule')
226
+ }
227
+ return true
228
+ }
229
+
230
+ const padDigitRules = computed(() => [nonNegativeRule])
231
+ const minRules = computed(() => [nonNegativeRule])
232
+ const maxRules = computed(() => [nonNegativeRule, greaterThanMinRule])
233
+
102
234
  const validKioskOrderSetting = computed<MfKioskOrderSetting | null>(() => {
103
235
  const f = kioskOrderSettingForm.value
104
- if (!f.dineIn.enabled) {
105
- return {
106
- ...f,
107
- dineIn: {
108
- enabled: f.dineIn.enabled,
109
- sequenceNumber: f.dineIn.sequenceNumber,
110
- pickUp: f.dineIn.pickUp,
111
- displayStand: {
112
- enabled: false,
113
- padDigit: f.dineIn.displayStand.padDigit ?? 0,
114
- standSlotRange: {
115
- min: f.dineIn.displayStand.standSlotRange.min ?? 0,
116
- max: f.dineIn.displayStand.standSlotRange.max ?? 10
117
- },
118
- prefix: f.dineIn.displayStand.prefix ?? '',
119
- enablePaxDialog: f.dineIn.displayStand.enablePaxDialog,
120
- submitOrderInstruction: {
121
- payAtCounter: f.dineIn.displayStand.submitOrderInstruction.payAtCounter ?? null,
122
- paid: f.dineIn.displayStand.submitOrderInstruction.paid ?? null
123
- }
124
- }
125
- }
126
- }
127
- }
236
+
237
+ // Validate display stand settings if both dineIn and displayStand are enabled
128
238
  if (f.dineIn.enabled && f.dineIn.displayStand.enabled) {
129
- const displayStand = f.dineIn.displayStand
130
-
131
- if (
132
- displayStand.padDigit != null &&
133
- displayStand.padDigit >= 0 &&
134
- !!displayStand.standSlotRange.min &&
135
- !!displayStand.standSlotRange.max &&
136
- displayStand.standSlotRange.min <= displayStand.standSlotRange.max
137
- ) {
138
- return {
139
- ...f,
140
- dineIn: {
141
- enabled: f.dineIn.enabled,
142
- sequenceNumber: f.dineIn.sequenceNumber,
143
- pickUp: f.dineIn.pickUp,
144
- displayStand: {
145
- enabled: displayStand.enabled,
146
- padDigit: displayStand.padDigit,
147
- standSlotRange: {
148
- min: displayStand.standSlotRange.min,
149
- max: displayStand.standSlotRange.max
150
- },
151
- prefix: displayStand.prefix ?? '',
152
- enablePaxDialog: displayStand.enablePaxDialog,
153
- submitOrderInstruction: {
154
- payAtCounter: displayStand.submitOrderInstruction.payAtCounter ?? null,
155
- paid: displayStand.submitOrderInstruction.paid ?? null
156
- }
157
- }
158
- }
159
- }
160
- }
161
- return null
239
+ const { padDigit, standSlotRange } = f.dineIn.displayStand
240
+ const isValid =
241
+ padDigit != null &&
242
+ padDigit >= 0 &&
243
+ standSlotRange.min != null &&
244
+ standSlotRange.max != null &&
245
+ standSlotRange.min <= standSlotRange.max
246
+
247
+ if (!isValid) return null
162
248
  }
249
+
250
+ // Return the form as-is if valid, with display stand disabled when dineIn is disabled
163
251
  return {
164
252
  ...f,
165
253
  dineIn: {
166
- enabled: f.dineIn.enabled,
167
- sequenceNumber: f.dineIn.sequenceNumber,
168
- pickUp: f.dineIn.pickUp,
254
+ ...f.dineIn,
169
255
  displayStand: {
170
- enabled: false,
256
+ ...f.dineIn.displayStand,
257
+ enabled: f.dineIn.enabled && f.dineIn.displayStand.enabled,
171
258
  padDigit: f.dineIn.displayStand.padDigit ?? 0,
172
259
  standSlotRange: {
173
260
  min: f.dineIn.displayStand.standSlotRange.min ?? 0,
174
261
  max: f.dineIn.displayStand.standSlotRange.max ?? 10
175
262
  },
176
- prefix: f.dineIn.displayStand.prefix ?? '',
177
- enablePaxDialog: f.dineIn.displayStand.enablePaxDialog,
178
- submitOrderInstruction: {
179
- payAtCounter: f.dineIn.displayStand.submitOrderInstruction.payAtCounter ?? null,
180
- paid: f.dineIn.displayStand.submitOrderInstruction.paid ?? null
181
- }
263
+ prefix: f.dineIn.displayStand.prefix ?? ''
182
264
  }
183
265
  }
184
266
  }
@@ -186,43 +268,32 @@ const validKioskOrderSetting = computed<MfKioskOrderSetting | null>(() => {
186
268
 
187
269
  const { startAsyncCall } = useLoading()
188
270
 
189
- async function updateDineInSetting(form: KioskDineInSettingForm) {
190
- kioskOrderSettingForm.value.dineIn = form
271
+ function updatePaymentSetting(form: KioskPaymentTypesForm) {
272
+ kioskOrderSettingForm.value.paymentSetting.paymentTypes = form
191
273
  }
192
274
 
193
- async function updateTakeawaySetting(form: KioskTakeawaySettingForm) {
194
- kioskOrderSettingForm.value.takeaway = form
195
- }
196
-
197
- async function updateMenuItemSetting(v: boolean) {
198
- kioskOrderSettingForm.value.menuItem.showAllOnly = v
199
- }
200
-
201
- async function updatePaymentSetting(form: KioskPaymentTypesForm) {
202
- kioskOrderSettingForm.value.paymentSetting.paymentTypes = form;
203
- }
204
-
205
- async function updateEPaymentSetting(form: FdoEPaymentMethod) {
206
- kioskOrderSettingForm.value.paymentSetting.ePaymentTypes = form;
275
+ function updateEPaymentSetting(form: FdoEPaymentMethod) {
276
+ kioskOrderSettingForm.value.paymentSetting.ePaymentTypes = form
207
277
  }
208
278
 
209
279
  const allowEPayment = computed(() => {
210
- const paymentTypes = kioskOrderSettingForm.value.paymentSetting.paymentTypes || [];
211
- return paymentTypes.includes(F_ORDER_PAYMENT_TYPE.enum.ePayment);
280
+ const paymentTypes = kioskOrderSettingForm.value.paymentSetting.paymentTypes || []
281
+ return paymentTypes.includes(F_ORDER_PAYMENT_TYPE.enum.ePayment)
212
282
  })
213
283
 
214
- async function updateEnablePaxDialogSetting(v: boolean) {
215
- kioskOrderSettingForm.value.dineIn.displayStand.enablePaxDialog = v
216
- kioskOrderSettingForm.value.dineIn.pickUp.enablePaxDialog = v
217
- }
218
-
219
- const enablePaxDialog = computed(() => {
220
- return (
221
- ((kioskOrderSettingForm.value.dineIn.displayStand.enabled &&
222
- kioskOrderSettingForm.value.dineIn.displayStand.enablePaxDialog) ||
223
- kioskOrderSettingForm.value.dineIn.pickUp.enablePaxDialog) ??
224
- false
225
- )
284
+ const enablePaxDialog = computed({
285
+ get: () => {
286
+ return (
287
+ ((kioskOrderSettingForm.value.dineIn.displayStand.enabled &&
288
+ kioskOrderSettingForm.value.dineIn.displayStand.enablePaxDialog) ||
289
+ kioskOrderSettingForm.value.dineIn.pickUp.enablePaxDialog) ??
290
+ false
291
+ )
292
+ },
293
+ set: (v: boolean) => {
294
+ kioskOrderSettingForm.value.dineIn.displayStand.enablePaxDialog = v
295
+ kioskOrderSettingForm.value.dineIn.pickUp.enablePaxDialog = v
296
+ }
226
297
  })
227
298
 
228
299
  async function submitForm() {
@@ -1,10 +1,14 @@
1
1
  <template>
2
2
  <div class="py-[1.5rem]">
3
3
  <FmPageHead :title="t('order.orderSetting')" />
4
- <div class="flex px-[1.5rem]">
4
+ <div class="flex px-[1.5rem] items-center">
5
5
  <div class="flex-[2_2_0%] overflow-auto">
6
6
  <FmTabs v-model:model-value="selectedOrderSetting" :items="settingItem" :showMoreAt="99" />
7
7
  </div>
8
+ <div v-if="menuStore.loadingCatalogOptions" class="flex items-center gap-2 ml-4">
9
+ <FmCircularProgress size="md" />
10
+ <span class="text-sm text-gray-600">{{ t('order.loadingCatalogs') }}</span>
11
+ </div>
8
12
  </div>
9
13
  </div>
10
14
  <component :is="currentComponent" />
@@ -12,25 +16,30 @@
12
16
 
13
17
  <script setup lang="ts">
14
18
  import { type FmTabProps } from '@feedmepos/ui-library'
15
- import { ref, computed } from 'vue'
19
+ import { ref, computed, onMounted, watch } from 'vue'
16
20
  import DeliverySetting from './delivery/DeliverySetting.vue'
17
21
  import DineInSetting from './dine-in/DineInSetting.vue'
18
22
  import PickUpSetting from './pickup/PickUpSetting.vue'
19
23
  import SmsSetting from './sms/SmsSetting.vue'
20
- import ServiceChargeSetting from './servicecharge/ServiceChargeSetting.vue'
21
- import DiscountRuleSetting from './discount-rule/DiscountRuleSetting.vue'
24
+ // import ServiceChargeSetting from './servicecharge/ServiceChargeSetting.vue'
25
+ // import DiscountRuleSetting from './discount-rule/DiscountRuleSetting.vue'
22
26
 
23
27
  import GeneralSetting from './general/GeneralSetting.vue'
24
- import { useI18n } from '@feedmepos/mf-common'
28
+ import { useI18n, useCoreStore } from '@feedmepos/mf-common'
29
+ import { useMenuStore } from '@/stores/menu/menu'
30
+ import { useSnackbarFunctions } from '@/components/snackbar'
25
31
 
26
32
  const { t } = useI18n()
33
+ const { currentRestaurant } = useCoreStore()
34
+ const menuStore = useMenuStore()
35
+ const { showError } = useSnackbarFunctions()
27
36
  type OrderSettingMenuItemValue =
28
37
  | 'delivery'
29
38
  | 'pickup'
30
39
  | 'dinein'
31
- | 'servicecharge'
40
+ // | 'servicecharge'
32
41
  | 'sms'
33
- | 'discountRule'
42
+ // | 'discountRule'
34
43
  | 'general'
35
44
  const selectedOrderSetting = ref<OrderSettingMenuItemValue>('delivery')
36
45
 
@@ -38,8 +47,8 @@ const settingItem = computed<FmTabProps[]>(() => [
38
47
  { label: t('order.delivery'), value: 'delivery' },
39
48
  { label: t('order.pickup'), value: 'pickup' },
40
49
  { label: t('order.dineIn'), value: 'dinein' },
41
- { label: t('order.serviceCharge'), value: 'servicecharge' },
42
- { label: t('order.discountRule.title'), value: 'discountRule' },
50
+ // { label: t('order.serviceCharge'), value: 'servicecharge' },
51
+ // { label: t('order.discountRule.title'), value: 'discountRule' },
43
52
  { label: t('order.sms'), value: 'sms' },
44
53
  { label: t('order.general'), value: 'general' }
45
54
  ])
@@ -54,12 +63,30 @@ const currentComponent = computed(() => {
54
63
  return PickUpSetting
55
64
  case 'sms':
56
65
  return SmsSetting
57
- case 'servicecharge':
58
- return ServiceChargeSetting
59
- case 'discountRule':
60
- return DiscountRuleSetting
66
+ // case 'servicecharge':
67
+ // return ServiceChargeSetting
68
+ // case 'discountRule':
69
+ // return DiscountRuleSetting
61
70
  case 'general':
62
71
  return GeneralSetting
63
72
  }
64
73
  })
74
+
75
+ onMounted(async () => {
76
+ if (currentRestaurant.value?._id) {
77
+ await menuStore.loadCatalogOptions(currentRestaurant.value._id)
78
+ }
79
+ })
80
+
81
+ watch(currentRestaurant, async (newRestaurant) => {
82
+ if (newRestaurant?._id) {
83
+ await menuStore.loadCatalogOptions(newRestaurant._id)
84
+ }
85
+ })
86
+
87
+ watch(() => menuStore.catalogOptionsError, (errorKey) => {
88
+ if (errorKey) {
89
+ showError(t(errorKey))
90
+ }
91
+ })
65
92
  </script>
@@ -174,13 +174,7 @@ import type {
174
174
  FdoRestaurantFeedmeDelivery,
175
175
  FdoRestaurantInHouseDelivery
176
176
  } from '@feedmepos/core/entity'
177
- import {
178
- F_COUNTRY,
179
- F_DELIVERY_TYPE,
180
- F_FEATURE,
181
- F_ORDER_PLATFORM,
182
- F_RESTAURANT_FEATURE
183
- } from '@feedmepos/core/entity'
177
+ import { F_DELIVERY_TYPE, F_ORDER_PLATFORM, F_RESTAURANT_FEATURE } from '@feedmepos/core/entity'
184
178
  import { FdoGrabfoodSettings, FdoShopeeFoodSettings } from '@entity'
185
179
  import deliveryData from './delivery.data'
186
180
  import { useDelivery, type DeliveryCompany, type LinkedDeliveryDoc } from './delivery'
@@ -203,7 +197,6 @@ import { useSnackbarFunctions } from '@/components/snackbar'
203
197
  import useSearch from '@/composables/search'
204
198
  import DeliveryList from './DeliveryList.vue'
205
199
  import DeliverooSetting from './integrated-delivery/DeliverooSetting.vue'
206
- import { Pos } from '@feedmepos/core'
207
200
  import { useI18n, useCoreStore } from '@feedmepos/mf-common'
208
201
 
209
202
  const { t } = useI18n()
@@ -530,7 +523,7 @@ const localDeliveryCompanies = computed<DeliveryRow[]>(() => {
530
523
  key,
531
524
  name,
532
525
  paymentType: getPaymentType(payment),
533
- status: !!doc ? [`${t('order.active')}`] : [`${t('order.inactive')}`],
526
+ status: doc ? [`${t('order.active')}`] : [`${t('order.inactive')}`],
534
527
  doc: company,
535
528
  catalog: getCatalog(doc?.catalogId || null)
536
529
  }
@@ -788,11 +781,11 @@ async function updateManualDelivery({
788
781
  company: DeliveryCompany
789
782
  data: FdoLinkedDelivery | null
790
783
  }) {
791
- if (!!data) {
784
+ if (data) {
792
785
  const resp = await createOrUpdateManualDeliveryDoc({ doc, company, data })
793
786
 
794
787
  if (resp) updateCached(resp)
795
- } else if (!!doc) {
788
+ } else if (doc) {
796
789
  await remoteOrderApi.deleteDeliveryCompany(doc)
797
790
  deleteCached(doc)
798
791
  }
@@ -807,7 +800,7 @@ async function createOrUpdateManualDeliveryDoc({
807
800
  company: DeliveryCompany
808
801
  data: FdoLinkedDelivery
809
802
  }): Promise<LinkedDeliveryDoc | undefined> {
810
- const { paymentTypeKey, catalogId, rounding, useCustomOrderNumber } = data
803
+ const { paymentTypeKey, catalogId, rounding, useCustomOrderNumber, requiredRemark } = data
811
804
  let newDoc: LinkedDeliveryDoc
812
805
 
813
806
  if (doc) {
@@ -816,7 +809,8 @@ async function createOrUpdateManualDeliveryDoc({
816
809
  paymentTypeKey,
817
810
  catalogId,
818
811
  rounding,
819
- useCustomOrderNumber
812
+ useCustomOrderNumber,
813
+ requiredRemark
820
814
  })
821
815
  } else {
822
816
  newDoc = await remoteOrderApi.createDeliveryCompany({
@@ -824,7 +818,8 @@ async function createOrUpdateManualDeliveryDoc({
824
818
  paymentTypeKey,
825
819
  catalogId,
826
820
  rounding,
827
- useCustomOrderNumber
821
+ useCustomOrderNumber,
822
+ requiredRemark
828
823
  })
829
824
  }
830
825
 
@@ -875,7 +870,7 @@ async function updateFeedmeExpressSetting() {
875
870
  currentRestaurant.value?._id ?? '',
876
871
  feedMeDoc.value
877
872
  )
878
- if (!!currentRestaurant.value?.feedmeDelivery) {
873
+ if (currentRestaurant.value?.feedmeDelivery) {
879
874
  currentRestaurant.value.feedmeDelivery = restaurant.feedmeDelivery
880
875
  }
881
876
  })
@@ -886,7 +881,7 @@ async function updateInHouseSetting() {
886
881
  sideSheetIntegrated.value = false
887
882
  await restaurantStore.updateInhouseDelivery(currentRestaurant.value?._id ?? '', inHouseDoc.value)
888
883
  const res = (await readRestaurants())?.find((res) => res._id === currentRestaurant.value?._id)
889
- if (!!res) {
884
+ if (res) {
890
885
  await changeRestaurant(res)
891
886
  }
892
887
  showSuccess(t('order.DeliverySettingUpdated'))
@@ -899,7 +894,7 @@ async function updateExternalDeliverySetting() {
899
894
  externalDoc.value
900
895
  )
901
896
  const res = (await readRestaurants())?.find((res) => res._id === currentRestaurant.value?._id)
902
- if (!!res) {
897
+ if (res) {
903
898
  await changeRestaurant(res)
904
899
  }
905
900
  showSuccess(t('order.DeliverySettingUpdated'))
@@ -36,13 +36,15 @@ const data = ref<LocalDeliverySettingData>(
36
36
  active: !!props.modelValue,
37
37
  catalogId: null,
38
38
  rounding: props.modelValue.rounding ?? true,
39
+ requiredRemark: props.modelValue.requiredRemark ?? false,
39
40
  ...props.modelValue
40
41
  }
41
42
  : {
42
43
  ...props.company,
43
44
  catalogId: null,
44
45
  active: false,
45
- rounding: true
46
+ rounding: true,
47
+ requiredRemark: false
46
48
  }
47
49
  )
48
50
 
@@ -54,6 +56,7 @@ watch(
54
56
  active: !!newVal,
55
57
  catalogId: null,
56
58
  rounding: newVal.rounding ?? true,
59
+ requiredRemark: newVal.requiredRemark ?? false,
57
60
  ...newVal
58
61
  }
59
62
  } else {
@@ -61,7 +64,8 @@ watch(
61
64
  ...props.company,
62
65
  catalogId: null,
63
66
  active: false,
64
- rounding: true
67
+ rounding: true,
68
+ requiredRemark: false
65
69
  }
66
70
  }
67
71
  }
@@ -120,6 +124,13 @@ function updateCatalog(catalogId: string | null) {
120
124
  catalogId
121
125
  }))
122
126
  }
127
+
128
+ function updateRequiredRemark(requiredRemark: boolean) {
129
+ emitChange((oldV) => ({
130
+ ...oldV,
131
+ requiredRemark
132
+ }))
133
+ }
123
134
  </script>
124
135
 
125
136
  <template>
@@ -170,6 +181,14 @@ function updateCatalog(catalogId: string | null) {
170
181
  @update:model-value="updateCustomOrderNumber"
171
182
  />
172
183
  </div>
184
+ <div>
185
+ <FmCheckbox
186
+ :model-value="data.requiredRemark ?? false"
187
+ value=""
188
+ :label="t('order.requiredRemark')"
189
+ @update:model-value="updateRequiredRemark"
190
+ />
191
+ </div>
173
192
  </FmCard>
174
193
  </div>
175
194
  </template>