@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.
Files changed (51) hide show
  1. package/dist/{KioskDevicesView-DoTQRyXe.js → KioskDevicesView-KBpXQJmy.js} +1 -1
  2. 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
  3. package/dist/KioskSettingView-DG12ZvfT.js +528 -0
  4. package/dist/{KioskView-4-s6RwC6.js → KioskView-KNiT-upH.js} +125 -119
  5. package/dist/{OrderSettingsView-BqgGXVhY.js → OrderSettingsView-CEh1QUZm.js} +11407 -12610
  6. package/dist/{app-BbOgWoeI.js → app-CKeIud_f.js} +14 -11
  7. package/dist/app.js +1 -1
  8. package/dist/{dayjs.min-COLd3dVw.js → dayjs.min-D9bsUd57.js} +232 -242
  9. package/dist/frontend/mf-order/src/app.d.ts +6 -3
  10. package/dist/frontend/mf-order/src/main.d.ts +6 -3
  11. package/dist/frontend/mf-order/src/stores/order-setting/index.d.ts +3 -3
  12. package/dist/frontend/mf-order/src/stores/restaurant/index.d.ts +1 -1
  13. package/dist/frontend/mf-order/src/views/order-settings/delivery/components/ManualIntegratedDeliverySetting.vue.d.ts +5 -0
  14. package/dist/frontend/mf-order/tsconfig.app.tsbuildinfo +1 -1
  15. package/dist/{index-BewBuJGi.js → index-D_Tmm1qL.js} +2 -2
  16. package/dist/{menu.dto-Bf0Evx6J.js → menu.dto-BY9dVf93.js} +8216 -8201
  17. package/dist/package/entity/delivery/linked-delivery.do.d.ts +9 -0
  18. package/dist/package/entity/incoming-order/incoming-order-to-bill.dto.d.ts +17 -17
  19. package/dist/package/entity/incoming-order/incoming-order.do.d.ts +21 -21
  20. package/dist/package/entity/incoming-order/incoming-order.dto.d.ts +18 -18
  21. package/dist/package/entity/order/dine-in/dine-in.do.d.ts +11 -11
  22. package/dist/package/entity/order/dine-in/dine-in.dto.d.ts +4 -4
  23. package/dist/package/entity/order/menu/menu.dto.d.ts +4 -4
  24. package/dist/package/entity/order/order.do.d.ts +8 -8
  25. package/dist/package/entity/order/order.dto.d.ts +38 -38
  26. package/dist/package/entity/order/order.enum.d.ts +1 -1
  27. package/dist/package/entity/order-setting/order-setting.do.d.ts +5 -5
  28. package/dist/package/entity/order-setting/order-setting.dto.d.ts +10 -10
  29. package/dist/package/entity/order-setting/sms/sms.do.d.ts +3 -3
  30. package/dist/package/entity/order-setting/sms/sms.dto.d.ts +3 -3
  31. package/dist/package/entity/queue/queue.dto.d.ts +4 -4
  32. package/package.json +2 -2
  33. package/src/locales/en-US.json +2 -1
  34. package/src/locales/th-TH.json +2 -1
  35. package/src/locales/zh-CN.json +2 -1
  36. package/src/views/kiosk/KioskView.vue +16 -4
  37. package/src/views/kiosk/settings/KioskSettingView.vue +193 -122
  38. package/src/views/order-settings/OrderSettingsView.vue +10 -10
  39. package/src/views/order-settings/delivery/DeliverySetting.vue +22 -22
  40. package/src/views/order-settings/delivery/components/ManualIntegratedDeliverySetting.vue +28 -7
  41. package/src/views/order-settings/delivery/delivery.ts +9 -5
  42. package/src/views/order-settings/delivery/integrated-delivery/ExternalSetting.vue +3 -17
  43. package/dist/KioskSettingView-DRpVR7Ij.js +0 -843
  44. package/dist/frontend/mf-order/src/views/kiosk/settings/KioskDineInSection.vue.d.ts +0 -10
  45. package/dist/frontend/mf-order/src/views/kiosk/settings/KioskEnablePaxDialogSection.vue.d.ts +0 -9
  46. package/dist/frontend/mf-order/src/views/kiosk/settings/KioskMenuItemSection.vue.d.ts +0 -9
  47. package/dist/frontend/mf-order/src/views/kiosk/settings/KioskTakeawaySection.vue.d.ts +0 -10
  48. package/src/views/kiosk/settings/KioskDineInSection.vue +0 -68
  49. package/src/views/kiosk/settings/KioskEnablePaxDialogSection.vue +0 -33
  50. package/src/views/kiosk/settings/KioskMenuItemSection.vue +0 -27
  51. 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.38",
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.40",
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",
@@ -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
- "hideNotAvailableMenuItem": "Hide not available menu item",
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",
@@ -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
- "hideNotAvailableMenuItem": "ละเว้นส่วนลด",
122
+ "showNotAvailableMenuItem": "แสดงรายการเมนูที่ไม่พร้อมใช้งาน",
122
123
  "ignoreDiscount": "ละเว้นสต็อก",
123
124
  "ignoreStock": "ลูกค้าสามารถสั่งซื้อได้แม้ว่าสินค้าจะหมดสต็อกแล้ว",
124
125
  "ignoreStockSublabel": "ไม่ใช้งาน",
@@ -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
- "hideNotAvailableMenuItem": "隐藏无可用菜单项目",
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 OrderSettingStore.getSetting()
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
- <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() {
@@ -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
- return ServiceChargeSetting
68
- case 'discountRule':
69
- return DiscountRuleSetting
66
+ // case 'servicecharge':
67
+ // return ServiceChargeSetting
68
+ // case 'discountRule':
69
+ // return DiscountRuleSetting
70
70
  case 'general':
71
71
  return GeneralSetting
72
72
  }