@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.
- package/dist/{KioskDevicesView-D9PQ22G6.js → KioskDevicesView-KBpXQJmy.js} +1 -1
- 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
- package/dist/KioskSettingView-DG12ZvfT.js +528 -0
- package/dist/{KioskView-C6s4u6vt.js → KioskView-KNiT-upH.js} +125 -119
- package/dist/OrderSettingsView-CoAGawQi.js +75548 -0
- package/dist/{app-86WCOyBO.js → app-Db1lhCv7.js} +26 -20
- package/dist/app.js +1 -1
- package/dist/{dayjs.min-BiuO1l2_.js → dayjs.min-D9bsUd57.js} +232 -242
- package/dist/frontend/mf-order/src/api/menu/index.d.ts +4 -0
- package/dist/frontend/mf-order/src/app.d.ts +9 -3
- package/dist/frontend/mf-order/src/main.d.ts +9 -3
- package/dist/frontend/mf-order/src/stores/menu/menu.d.ts +13 -4
- package/dist/frontend/mf-order/src/stores/order-setting/index.d.ts +3 -3
- package/dist/frontend/mf-order/src/stores/restaurant/index.d.ts +1 -1
- package/dist/frontend/mf-order/src/views/order-settings/delivery/components/ManualIntegratedDeliverySetting.vue.d.ts +5 -0
- package/dist/frontend/mf-order/tsconfig.app.tsbuildinfo +1 -1
- package/dist/{index-DZKSDqn_.js → index-D_Tmm1qL.js} +2 -2
- package/dist/menu.dto-BY9dVf93.js +127239 -0
- package/dist/package/entity/delivery/linked-delivery.do.d.ts +9 -0
- package/dist/package/entity/food-court/order.dto.d.ts +1952 -1952
- package/dist/package/entity/incoming-order/incoming-order-to-bill.dto.d.ts +23 -23
- package/dist/package/entity/incoming-order/incoming-order.do.d.ts +45 -45
- package/dist/package/entity/incoming-order/incoming-order.dto.d.ts +34 -34
- package/dist/package/entity/order/dine-in/dine-in.do.d.ts +11 -11
- package/dist/package/entity/order/dine-in/dine-in.dto.d.ts +4 -4
- package/dist/package/entity/order/menu/menu.dto.d.ts +4 -4
- package/dist/package/entity/order/order.do.d.ts +8 -8
- package/dist/package/entity/order/order.dto.d.ts +3322 -3322
- package/dist/package/entity/order/order.enum.d.ts +1 -1
- package/dist/package/entity/order/payment/payment.dto.d.ts +1702 -1702
- package/dist/package/entity/order-setting/order-setting.do.d.ts +5 -5
- package/dist/package/entity/order-setting/order-setting.dto.d.ts +10 -10
- package/dist/package/entity/order-setting/sms/sms.do.d.ts +3 -3
- package/dist/package/entity/order-setting/sms/sms.dto.d.ts +3 -3
- package/dist/package/entity/payment/payment.dto.d.ts +3 -3
- package/dist/package/entity/queue/queue.dto.d.ts +872 -872
- package/dist/package/entity/restaurant/restaurant.dto.d.ts +282 -3
- package/package.json +4 -4
- package/src/api/menu/index.ts +4 -1
- package/src/locales/en-US.json +3 -1
- package/src/locales/th-TH.json +3 -1
- package/src/locales/zh-CN.json +3 -1
- package/src/stores/menu/menu.ts +33 -14
- package/src/views/kiosk/KioskView.vue +16 -4
- package/src/views/kiosk/settings/KioskSettingView.vue +193 -122
- package/src/views/order-settings/OrderSettingsView.vue +40 -13
- package/src/views/order-settings/delivery/DeliverySetting.vue +12 -17
- package/src/views/order-settings/delivery/components/ManualIntegratedDeliverySetting.vue +21 -2
- package/src/views/order-settings/delivery/delivery.ts +9 -5
- package/src/views/order-settings/delivery/integrated-delivery/ExternalSetting.vue +3 -17
- package/src/views/order-settings/delivery/integrated-delivery/IntegratedDelivery.vue +0 -1
- package/dist/KioskSettingView-C98iSa7q.js +0 -843
- package/dist/OrderSettingsView-DFB_C-VO.js +0 -50757
- package/dist/frontend/mf-order/src/views/kiosk/settings/KioskDineInSection.vue.d.ts +0 -10
- package/dist/frontend/mf-order/src/views/kiosk/settings/KioskEnablePaxDialogSection.vue.d.ts +0 -9
- package/dist/frontend/mf-order/src/views/kiosk/settings/KioskMenuItemSection.vue.d.ts +0 -9
- package/dist/frontend/mf-order/src/views/kiosk/settings/KioskTakeawaySection.vue.d.ts +0 -10
- package/dist/menu.dto-CT1XwUKO.js +0 -127978
- package/src/views/kiosk/settings/KioskDineInSection.vue +0 -68
- package/src/views/kiosk/settings/KioskEnablePaxDialogSection.vue +0 -33
- package/src/views/kiosk/settings/KioskMenuItemSection.vue +0 -27
- 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
|
-
<
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
<
|
|
14
|
-
|
|
15
|
-
:
|
|
16
|
-
|
|
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
|
-
|
|
21
|
-
<
|
|
22
|
-
|
|
23
|
-
:
|
|
24
|
-
|
|
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
|
-
<
|
|
30
|
-
|
|
31
|
-
:
|
|
32
|
-
|
|
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
|
-
|
|
105
|
-
|
|
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
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
-
|
|
167
|
-
sequenceNumber: f.dineIn.sequenceNumber,
|
|
168
|
-
pickUp: f.dineIn.pickUp,
|
|
254
|
+
...f.dineIn,
|
|
169
255
|
displayStand: {
|
|
170
|
-
|
|
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
|
-
|
|
190
|
-
kioskOrderSettingForm.value.
|
|
271
|
+
function updatePaymentSetting(form: KioskPaymentTypesForm) {
|
|
272
|
+
kioskOrderSettingForm.value.paymentSetting.paymentTypes = form
|
|
191
273
|
}
|
|
192
274
|
|
|
193
|
-
|
|
194
|
-
kioskOrderSettingForm.value.
|
|
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
|
-
|
|
211
|
-
|
|
280
|
+
const paymentTypes = kioskOrderSettingForm.value.paymentSetting.paymentTypes || []
|
|
281
|
+
return paymentTypes.includes(F_ORDER_PAYMENT_TYPE.enum.ePayment)
|
|
212
282
|
})
|
|
213
283
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
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
|
-
|
|
59
|
-
case 'discountRule':
|
|
60
|
-
|
|
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:
|
|
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 (
|
|
784
|
+
if (data) {
|
|
792
785
|
const resp = await createOrUpdateManualDeliveryDoc({ doc, company, data })
|
|
793
786
|
|
|
794
787
|
if (resp) updateCached(resp)
|
|
795
|
-
} else if (
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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>
|