@feedmepos/mf-order-setting 0.0.38 → 0.0.44
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-DoTQRyXe.js → KioskDevicesView-KBpXQJmy.js} +1 -1
- package/dist/{KioskDevicesView.vue_vue_type_script_setup_true_lang-DB0dvpBG.js → KioskDevicesView.vue_vue_type_script_setup_true_lang-taf41a-7.js} +2 -2
- package/dist/KioskSettingView-DG12ZvfT.js +528 -0
- package/dist/{KioskView-4-s6RwC6.js → KioskView-KNiT-upH.js} +125 -119
- package/dist/{OrderSettingsView-BqgGXVhY.js → OrderSettingsView-CEh1QUZm.js} +11407 -12610
- package/dist/{app-BbOgWoeI.js → app-CKeIud_f.js} +14 -11
- package/dist/app.js +1 -1
- package/dist/{dayjs.min-COLd3dVw.js → dayjs.min-D9bsUd57.js} +232 -242
- package/dist/frontend/mf-order/src/app.d.ts +6 -3
- package/dist/frontend/mf-order/src/main.d.ts +6 -3
- 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-BewBuJGi.js → index-D_Tmm1qL.js} +2 -2
- package/dist/{menu.dto-Bf0Evx6J.js → menu.dto-BY9dVf93.js} +8216 -8201
- package/dist/package/entity/delivery/linked-delivery.do.d.ts +9 -0
- package/dist/package/entity/incoming-order/incoming-order-to-bill.dto.d.ts +17 -17
- package/dist/package/entity/incoming-order/incoming-order.do.d.ts +21 -21
- package/dist/package/entity/incoming-order/incoming-order.dto.d.ts +18 -18
- 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 +38 -38
- package/dist/package/entity/order/order.enum.d.ts +1 -1
- 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/queue/queue.dto.d.ts +4 -4
- package/package.json +2 -2
- package/src/locales/en-US.json +2 -1
- package/src/locales/th-TH.json +2 -1
- package/src/locales/zh-CN.json +2 -1
- package/src/views/kiosk/KioskView.vue +16 -4
- package/src/views/kiosk/settings/KioskSettingView.vue +193 -122
- package/src/views/order-settings/OrderSettingsView.vue +10 -10
- package/src/views/order-settings/delivery/DeliverySetting.vue +22 -22
- package/src/views/order-settings/delivery/components/ManualIntegratedDeliverySetting.vue +28 -7
- package/src/views/order-settings/delivery/delivery.ts +9 -5
- package/src/views/order-settings/delivery/integrated-delivery/ExternalSetting.vue +3 -17
- package/dist/KioskSettingView-DRpVR7Ij.js +0 -843
- 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/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
|
@@ -12,7 +12,7 @@ export declare const OrderSmsMessageSettingDto: z.ZodObject<{
|
|
|
12
12
|
export declare const OrderSmsSettingDto: z.ZodObject<{
|
|
13
13
|
enable: z.ZodBoolean;
|
|
14
14
|
action: z.ZodEnum<["ACCEPT", "SERVE"]>;
|
|
15
|
-
type: z.ZodUnion<[z.ZodEnum<["DINE_IN", "PICKUP", "DELIVERY"]>, z.ZodEnum<["QR", "QUEUE", "RESERVATION", "TAKEAWAY"]>]>;
|
|
15
|
+
type: z.ZodUnion<[z.ZodEnum<["DINE_IN", "PICKUP", "DELIVERY"]>, z.ZodEnum<["QR", "QUEUE", "RESERVATION", "TAKEAWAY", "KIOSK", "COUNTER"]>]>;
|
|
16
16
|
message: z.ZodObject<{
|
|
17
17
|
raw: z.ZodString;
|
|
18
18
|
keys: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodEnum<["Bill Receipt Number", "Bill Receipt Total Amount (Net)", "Order Type", "Order Slot", "Order Datetime", "Order Delivery Type", "Restaurant Name", "Restaurant Email", "Restaurant Address", "Restaurant Contact Number"]>>>;
|
|
@@ -28,7 +28,7 @@ export declare const OrderSmsSettingDto: z.ZodObject<{
|
|
|
28
28
|
keys: Record<string, "Bill Receipt Number" | "Bill Receipt Total Amount (Net)" | "Order Type" | "Order Slot" | "Order Datetime" | "Order Delivery Type" | "Restaurant Name" | "Restaurant Email" | "Restaurant Address" | "Restaurant Contact Number">;
|
|
29
29
|
raw: string;
|
|
30
30
|
};
|
|
31
|
-
type: "QUEUE" | "RESERVATION" | "QR" | "TAKEAWAY" | "DINE_IN" | "PICKUP" | "DELIVERY";
|
|
31
|
+
type: "QUEUE" | "RESERVATION" | "QR" | "TAKEAWAY" | "KIOSK" | "COUNTER" | "DINE_IN" | "PICKUP" | "DELIVERY";
|
|
32
32
|
enable: boolean;
|
|
33
33
|
action: "ACCEPT" | "SERVE";
|
|
34
34
|
}, {
|
|
@@ -36,7 +36,7 @@ export declare const OrderSmsSettingDto: z.ZodObject<{
|
|
|
36
36
|
keys?: Record<string, "Bill Receipt Number" | "Bill Receipt Total Amount (Net)" | "Order Type" | "Order Slot" | "Order Datetime" | "Order Delivery Type" | "Restaurant Name" | "Restaurant Email" | "Restaurant Address" | "Restaurant Contact Number"> | undefined;
|
|
37
37
|
raw: string;
|
|
38
38
|
};
|
|
39
|
-
type: "QUEUE" | "RESERVATION" | "QR" | "TAKEAWAY" | "DINE_IN" | "PICKUP" | "DELIVERY";
|
|
39
|
+
type: "QUEUE" | "RESERVATION" | "QR" | "TAKEAWAY" | "KIOSK" | "COUNTER" | "DINE_IN" | "PICKUP" | "DELIVERY";
|
|
40
40
|
enable: boolean;
|
|
41
41
|
action: "ACCEPT" | "SERVE";
|
|
42
42
|
}>;
|
|
@@ -7119,7 +7119,7 @@ export declare const RestaurantQueueDto: z.ZodObject<{
|
|
|
7119
7119
|
type: z.ZodLiteral<"DINE_IN">;
|
|
7120
7120
|
pax: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
|
|
7121
7121
|
sub: z.ZodDiscriminatedUnion<"type", z.Primitive, z.ZodObject<z.extendShape<{
|
|
7122
|
-
type: z.ZodEnum<["QR", "QUEUE", "RESERVATION", "TAKEAWAY"]>;
|
|
7122
|
+
type: z.ZodEnum<["QR", "QUEUE", "RESERVATION", "TAKEAWAY", "KIOSK", "COUNTER"]>;
|
|
7123
7123
|
}, {
|
|
7124
7124
|
type: z.ZodLiteral<"QR">;
|
|
7125
7125
|
session: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
@@ -7133,7 +7133,7 @@ export declare const RestaurantQueueDto: z.ZodObject<{
|
|
|
7133
7133
|
slot: string;
|
|
7134
7134
|
type: "QR";
|
|
7135
7135
|
}> | z.ZodObject<z.extendShape<{
|
|
7136
|
-
type: z.ZodEnum<["QR", "QUEUE", "RESERVATION", "TAKEAWAY"]>;
|
|
7136
|
+
type: z.ZodEnum<["QR", "QUEUE", "RESERVATION", "TAKEAWAY", "KIOSK", "COUNTER"]>;
|
|
7137
7137
|
}, {
|
|
7138
7138
|
type: z.ZodLiteral<"QUEUE">;
|
|
7139
7139
|
queueId: z.ZodString;
|
|
@@ -7147,7 +7147,7 @@ export declare const RestaurantQueueDto: z.ZodObject<{
|
|
|
7147
7147
|
type: "QUEUE";
|
|
7148
7148
|
queueId: string;
|
|
7149
7149
|
}> | z.ZodObject<z.extendShape<{
|
|
7150
|
-
type: z.ZodEnum<["QR", "QUEUE", "RESERVATION", "TAKEAWAY"]>;
|
|
7150
|
+
type: z.ZodEnum<["QR", "QUEUE", "RESERVATION", "TAKEAWAY", "KIOSK", "COUNTER"]>;
|
|
7151
7151
|
}, {
|
|
7152
7152
|
type: z.ZodLiteral<"RESERVATION">;
|
|
7153
7153
|
reservationId: z.ZodString;
|
|
@@ -7161,7 +7161,7 @@ export declare const RestaurantQueueDto: z.ZodObject<{
|
|
|
7161
7161
|
type: "RESERVATION";
|
|
7162
7162
|
reservationId: string;
|
|
7163
7163
|
}> | z.ZodObject<z.extendShape<{
|
|
7164
|
-
type: z.ZodEnum<["QR", "QUEUE", "RESERVATION", "TAKEAWAY"]>;
|
|
7164
|
+
type: z.ZodEnum<["QR", "QUEUE", "RESERVATION", "TAKEAWAY", "KIOSK", "COUNTER"]>;
|
|
7165
7165
|
}, {
|
|
7166
7166
|
type: z.ZodLiteral<"TAKEAWAY">;
|
|
7167
7167
|
slot: z.ZodString;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@feedmepos/mf-order-setting",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.44",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"module": "./dist/app.js",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"format": "prettier --write src/"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@feedmepos/core": "^2.14.
|
|
29
|
+
"@feedmepos/core": "^2.14.44",
|
|
30
30
|
"@feedmepos/menu": "^1.7.6",
|
|
31
31
|
"@feedmepos/mf-common": "1.20.0-beta.2",
|
|
32
32
|
"@feedmepos/ordering": "^0.0.3",
|
package/src/locales/en-US.json
CHANGED
|
@@ -65,6 +65,7 @@
|
|
|
65
65
|
"customOfflinePaymentHeader": "Custom offline payments",
|
|
66
66
|
"customOrderNumber": "Custom order number",
|
|
67
67
|
"customServiceCharge": "Custom Service Charge",
|
|
68
|
+
"requiredRemark": "Required remark",
|
|
68
69
|
"customTime": "Custom time",
|
|
69
70
|
"day": "Day",
|
|
70
71
|
"days": "days",
|
|
@@ -120,7 +121,7 @@
|
|
|
120
121
|
"generalInfo": "General Info",
|
|
121
122
|
"generalSetting": "General setting",
|
|
122
123
|
"greaterThanMinRule": "Max should be exceed to Min",
|
|
123
|
-
"
|
|
124
|
+
"showNotAvailableMenuItem": "Show not available menu item",
|
|
124
125
|
"ignoreDiscount": "Ignore Discount",
|
|
125
126
|
"ignoreStock": "Ignore stock",
|
|
126
127
|
"ignoreStockSublabel": "Customer can order even product out of stocks",
|
package/src/locales/th-TH.json
CHANGED
|
@@ -65,6 +65,7 @@
|
|
|
65
65
|
"customOfflinePaymentHeader": "การชำระเงินออฟไลน์แบบกำหนดเอง",
|
|
66
66
|
"customOrderNumber": "หมายเลขคำสั่งซื้อแบบกำหนดเอง",
|
|
67
67
|
"customServiceCharge": "ค่าบริการแบบกำหนดเอง",
|
|
68
|
+
"requiredRemark": "หมายเหตุที่จำเป็น",
|
|
68
69
|
"customTime": "เวลาแบบกำหนดเอง",
|
|
69
70
|
"day": "วัน",
|
|
70
71
|
"days": "วัน",
|
|
@@ -118,7 +119,7 @@
|
|
|
118
119
|
"generalInfo": "การตั้งค่าทั่วไป",
|
|
119
120
|
"generalSetting": "ค่าสูงสุดควรเกินค่าต่ำสุด",
|
|
120
121
|
"greaterThanMinRule": "ซ่อนรายการเมนูที่ไม่พร้อมใช้งาน",
|
|
121
|
-
"
|
|
122
|
+
"showNotAvailableMenuItem": "แสดงรายการเมนูที่ไม่พร้อมใช้งาน",
|
|
122
123
|
"ignoreDiscount": "ละเว้นสต็อก",
|
|
123
124
|
"ignoreStock": "ลูกค้าสามารถสั่งซื้อได้แม้ว่าสินค้าจะหมดสต็อกแล้ว",
|
|
124
125
|
"ignoreStockSublabel": "ไม่ใช้งาน",
|
package/src/locales/zh-CN.json
CHANGED
|
@@ -66,6 +66,7 @@
|
|
|
66
66
|
"customOfflinePaymentHeader": "自定义线下付款方式",
|
|
67
67
|
"customOrderNumber": "自定义订单号码",
|
|
68
68
|
"customServiceCharge": "自定义服务收费",
|
|
69
|
+
"requiredRemark": "必填备注",
|
|
69
70
|
"customTime": "自定义时间",
|
|
70
71
|
"day": "天",
|
|
71
72
|
"days": "天",
|
|
@@ -122,7 +123,7 @@
|
|
|
122
123
|
"generalInfo": "通用信息",
|
|
123
124
|
"generalSetting": "通用设置",
|
|
124
125
|
"greaterThanMinRule": "最大值应大于等于最小值",
|
|
125
|
-
"
|
|
126
|
+
"showNotAvailableMenuItem": "显示无可用菜单项目",
|
|
126
127
|
"ignoreDiscount": "不适用折扣",
|
|
127
128
|
"ignoreStock": "忽略库存",
|
|
128
129
|
"ignoreStockSublabel": "客户依然可以下单,即使商品缺货",
|
|
@@ -63,7 +63,7 @@ import {
|
|
|
63
63
|
type ISelectItem,
|
|
64
64
|
useBreakpoints
|
|
65
65
|
} from '@feedmepos/ui-library'
|
|
66
|
-
import { ref, computed, defineAsyncComponent, watch } from 'vue'
|
|
66
|
+
import { ref, computed, defineAsyncComponent, watch, onMounted } from 'vue'
|
|
67
67
|
import { useKioskStore } from '@/stores/kiosk'
|
|
68
68
|
import type { MfKioskDevice } from '@/modules/kiosk/interface'
|
|
69
69
|
import KioskOtpDialog from '@/views/kiosk/devices/KioskOtpDialog.vue'
|
|
@@ -118,13 +118,16 @@ function openKioskSummaryDialog() {
|
|
|
118
118
|
async function selectRestaurant(v: string) {
|
|
119
119
|
const restaurant = restaurants.value.find((r) => r._id == v)
|
|
120
120
|
await changeRestaurant(restaurant)
|
|
121
|
-
await
|
|
122
|
-
await KioskStore.getDevices()
|
|
121
|
+
await loadRestaurantData()
|
|
123
122
|
currentSelect.value = v
|
|
124
|
-
|
|
125
123
|
currentRestaurantId.value = v
|
|
126
124
|
}
|
|
127
125
|
|
|
126
|
+
async function loadRestaurantData() {
|
|
127
|
+
await OrderSettingStore.getSetting()
|
|
128
|
+
await KioskStore.getDevices()
|
|
129
|
+
}
|
|
130
|
+
|
|
128
131
|
const menuItems = computed<FmTabProps[]>(() => [
|
|
129
132
|
{
|
|
130
133
|
label: t('order.deviceBinding'),
|
|
@@ -167,9 +170,18 @@ async function updateKioskOrderSetting(form: MfKioskOrderSetting) {
|
|
|
167
170
|
}
|
|
168
171
|
}
|
|
169
172
|
|
|
173
|
+
// Load data on mount if restaurant is already selected
|
|
174
|
+
onMounted(async () => {
|
|
175
|
+
if (currentRestaurant.value?._id) {
|
|
176
|
+
currentRestaurantId.value = currentRestaurant.value._id
|
|
177
|
+
await loadRestaurantData()
|
|
178
|
+
}
|
|
179
|
+
})
|
|
180
|
+
|
|
170
181
|
watch(
|
|
171
182
|
() => restaurants.value.length,
|
|
172
183
|
async (_) => {
|
|
184
|
+
// Only auto-select if no restaurant is currently selected
|
|
173
185
|
if (currentSelect.value === undefined && restaurants.value.length > 0) {
|
|
174
186
|
await selectRestaurant(restaurants.value[0]._id)
|
|
175
187
|
}
|
|
@@ -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() {
|
|
@@ -21,8 +21,8 @@ import DeliverySetting from './delivery/DeliverySetting.vue'
|
|
|
21
21
|
import DineInSetting from './dine-in/DineInSetting.vue'
|
|
22
22
|
import PickUpSetting from './pickup/PickUpSetting.vue'
|
|
23
23
|
import SmsSetting from './sms/SmsSetting.vue'
|
|
24
|
-
import ServiceChargeSetting from './servicecharge/ServiceChargeSetting.vue'
|
|
25
|
-
import DiscountRuleSetting from './discount-rule/DiscountRuleSetting.vue'
|
|
24
|
+
// import ServiceChargeSetting from './servicecharge/ServiceChargeSetting.vue'
|
|
25
|
+
// import DiscountRuleSetting from './discount-rule/DiscountRuleSetting.vue'
|
|
26
26
|
|
|
27
27
|
import GeneralSetting from './general/GeneralSetting.vue'
|
|
28
28
|
import { useI18n, useCoreStore } from '@feedmepos/mf-common'
|
|
@@ -37,9 +37,9 @@ type OrderSettingMenuItemValue =
|
|
|
37
37
|
| 'delivery'
|
|
38
38
|
| 'pickup'
|
|
39
39
|
| 'dinein'
|
|
40
|
-
| 'servicecharge'
|
|
40
|
+
// | 'servicecharge'
|
|
41
41
|
| 'sms'
|
|
42
|
-
| 'discountRule'
|
|
42
|
+
// | 'discountRule'
|
|
43
43
|
| 'general'
|
|
44
44
|
const selectedOrderSetting = ref<OrderSettingMenuItemValue>('delivery')
|
|
45
45
|
|
|
@@ -47,8 +47,8 @@ const settingItem = computed<FmTabProps[]>(() => [
|
|
|
47
47
|
{ label: t('order.delivery'), value: 'delivery' },
|
|
48
48
|
{ label: t('order.pickup'), value: 'pickup' },
|
|
49
49
|
{ label: t('order.dineIn'), value: 'dinein' },
|
|
50
|
-
{ label: t('order.serviceCharge'), value: 'servicecharge' },
|
|
51
|
-
{ label: t('order.discountRule.title'), value: 'discountRule' },
|
|
50
|
+
// { label: t('order.serviceCharge'), value: 'servicecharge' },
|
|
51
|
+
// { label: t('order.discountRule.title'), value: 'discountRule' },
|
|
52
52
|
{ label: t('order.sms'), value: 'sms' },
|
|
53
53
|
{ label: t('order.general'), value: 'general' }
|
|
54
54
|
])
|
|
@@ -63,10 +63,10 @@ const currentComponent = computed(() => {
|
|
|
63
63
|
return PickUpSetting
|
|
64
64
|
case 'sms':
|
|
65
65
|
return SmsSetting
|
|
66
|
-
case 'servicecharge':
|
|
67
|
-
|
|
68
|
-
case 'discountRule':
|
|
69
|
-
|
|
66
|
+
// case 'servicecharge':
|
|
67
|
+
// return ServiceChargeSetting
|
|
68
|
+
// case 'discountRule':
|
|
69
|
+
// return DiscountRuleSetting
|
|
70
70
|
case 'general':
|
|
71
71
|
return GeneralSetting
|
|
72
72
|
}
|