@feedmepos/mf-order-setting 0.0.43 → 0.0.45

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 (91) hide show
  1. package/dist/{KioskDevicesView-KBpXQJmy.js → KioskDevicesView-CZ9B7VmM.js} +1 -1
  2. package/dist/{KioskDevicesView.vue_vue_type_script_setup_true_lang-taf41a-7.js → KioskDevicesView.vue_vue_type_script_setup_true_lang-B9mM8Vcl.js} +101 -96
  3. package/dist/{KioskSettingView-DG12ZvfT.js → KioskSettingView-CJAw9osg.js} +1 -1
  4. package/dist/KioskView-CN-Dk8fn.js +448 -0
  5. package/dist/{OrderSettingsView-CoAGawQi.js → OrderSettingsView-B0shsMTu.js} +33664 -34726
  6. package/dist/{app-Db1lhCv7.js → app-BK8d3ff5.js} +115 -43
  7. package/dist/app.js +1 -1
  8. package/dist/{dayjs.min-D9bsUd57.js → dayjs.min-DgWdPF1p.js} +1 -1
  9. package/dist/frontend/mf-order/src/api/remoteOrder/index.d.ts +2 -2
  10. package/dist/frontend/mf-order/src/api/restaurant-setting/index.d.ts +2 -1
  11. package/dist/frontend/mf-order/src/app.d.ts +72 -0
  12. package/dist/frontend/mf-order/src/main.d.ts +72 -0
  13. package/dist/frontend/mf-order/src/modules/kiosk/interface.d.ts +1 -0
  14. package/dist/frontend/mf-order/src/stores/kiosk/index.d.ts +3 -0
  15. package/dist/frontend/mf-order/src/stores/menu/menu.d.ts +111 -1
  16. package/dist/frontend/mf-order/src/stores/order-setting/index.d.ts +291 -288
  17. package/dist/frontend/mf-order/src/stores/restaurant/index.d.ts +20 -173
  18. package/dist/frontend/mf-order/src/views/all-orders/ReflowOrder.vue.d.ts +12 -114
  19. package/dist/frontend/mf-order/src/views/order-settings/delivery/delivery.data.d.ts +2 -2
  20. package/dist/frontend/mf-order/src/views/order-settings/delivery/inhouse/InHouseDelivery.vue.d.ts +2 -2
  21. package/dist/frontend/mf-order/src/views/order-settings/pickup/PickUpSettingDialogContent.vue.d.ts +4 -4
  22. package/dist/frontend/mf-order/src/views/order-settings/queue/PresetRemarksSheet.vue.d.ts +19 -0
  23. package/dist/frontend/mf-order/src/views/order-settings/queue/QueueSetting.vue.d.ts +2 -0
  24. package/dist/frontend/mf-order/tsconfig.app.tsbuildinfo +1 -1
  25. package/dist/{index-D_Tmm1qL.js → index-DHbH8gKt.js} +2 -2
  26. package/dist/{menu.dto-BY9dVf93.js → menu.dto-Cua9zYpc.js} +54753 -57698
  27. package/dist/package/entity/booking/booking.do.d.ts +168 -2368
  28. package/dist/package/entity/delivery/delivery.dto.d.ts +33 -473
  29. package/dist/package/entity/food-court/food-court.dto.d.ts +44 -44
  30. package/dist/package/entity/incoming-order/incoming-order-to-bill.dto.d.ts +23 -0
  31. package/dist/package/entity/incoming-order/incoming-order.do.d.ts +432 -60
  32. package/dist/package/entity/incoming-order/incoming-order.dto.d.ts +670 -628
  33. package/dist/package/entity/incoming-order/incoming-order.enum.d.ts +2 -2
  34. package/dist/package/entity/index.d.ts +2 -0
  35. package/dist/package/entity/kiosk/kiosk.do.d.ts +16 -0
  36. package/dist/package/entity/kiosk/kiosk.dto.d.ts +19 -0
  37. package/dist/package/entity/kiosk/marketing/marketing.dto.d.ts +201 -2031
  38. package/dist/package/entity/order/order-item/order-item.dto.d.ts +129 -16
  39. package/dist/package/entity/order/order.do.d.ts +8 -0
  40. package/dist/package/entity/order/order.dto.d.ts +390 -974
  41. package/dist/package/entity/order/order.enum.d.ts +2 -0
  42. package/dist/package/entity/order-platform/external/menu/external-master-menu.do.d.ts +367 -18
  43. package/dist/package/entity/order-platform/external/menu/external-menu.do.d.ts +48 -8
  44. package/dist/package/entity/order-platform/external/order/external-order.do.d.ts +1 -0
  45. package/dist/package/entity/order-platform/foodpanda/foodpanda-order.dto.d.ts +33 -473
  46. package/dist/package/entity/order-platform/grabfood/grabfood-omni.do.d.ts +672 -0
  47. package/dist/package/entity/order-platform/grabfood/grabfood-omni.dto.d.ts +9 -0
  48. package/dist/package/entity/order-platform/grabfood/grabfood-order.do.d.ts +90 -508
  49. package/dist/package/entity/order-platform/grabfood/grabfood-settings.do.d.ts +3 -0
  50. package/dist/package/entity/order-platform/grabfood/grabfood-webhook.dto.d.ts +1130 -0
  51. package/dist/package/entity/order-platform/grabfood/grabfood.dto.d.ts +34 -47
  52. package/dist/package/entity/order-platform/grabfood/grabfood.enum.d.ts +8 -2
  53. package/dist/package/entity/order-platform/menu.dto.d.ts +46 -12
  54. package/dist/package/entity/order-platform/order-platform.dto.d.ts +8 -5
  55. package/dist/package/entity/order-platform/shopeefood/shopeefood-order.do.d.ts +33 -473
  56. package/dist/package/entity/order-platform/shopeefood/shopeefood-settings.do.d.ts +3 -0
  57. package/dist/package/entity/order-platform/shopeefood/shopeefood-settings.dto.d.ts +3 -0
  58. package/dist/package/entity/order-setting/customization/color.do.d.ts +3 -0
  59. package/dist/package/entity/order-setting/kiosk/kiosk.dto.d.ts +18 -18
  60. package/dist/package/entity/order-setting/order-setting.do.d.ts +72 -88
  61. package/dist/package/entity/order-setting/order-setting.dto.d.ts +724 -1036
  62. package/dist/package/entity/order-setting/queue/queue.do.d.ts +22 -0
  63. package/dist/package/entity/order-setting/queue/queue.dto.d.ts +12 -0
  64. package/dist/package/entity/order-setting/reservation/reservation.do.d.ts +4 -51
  65. package/dist/package/entity/order-setting/reservation/reservation.dto.d.ts +248 -585
  66. package/dist/package/entity/pubsub/ably/ably.enum.d.ts +10 -1
  67. package/dist/package/entity/queue/queue.dto.d.ts +76 -14
  68. package/dist/package/entity/restaurant/restaurant.dto.d.ts +41 -26
  69. package/dist/package/entity/websocket/websocket.dto.d.ts +22 -22
  70. package/package.json +3 -3
  71. package/src/api/remoteOrder/index.ts +13 -2
  72. package/src/api/restaurant-setting/index.ts +6 -0
  73. package/src/locales/en-US.json +24 -0
  74. package/src/locales/th-TH.json +24 -0
  75. package/src/locales/zh-CN.json +24 -0
  76. package/src/modules/kiosk/interface.ts +1 -0
  77. package/src/stores/kiosk/mapper.ts +1 -0
  78. package/src/stores/order-setting/mapper.ts +20 -33
  79. package/src/stores/restaurant/index.ts +7 -3
  80. package/src/views/all-orders/FilterStatus.vue +1 -1
  81. package/src/views/kiosk/devices/KioskDeviceCard.vue +6 -0
  82. package/src/views/order-settings/OrderSettingsView.vue +13 -5
  83. package/src/views/order-settings/delivery/DeliverySetting.vue +10 -5
  84. package/src/views/order-settings/delivery/components/ManualIntegratedDeliverySetting.vue +9 -7
  85. package/src/views/order-settings/delivery/delivery.data.ts +7 -4
  86. package/src/views/order-settings/delivery/integrated-delivery/FoodpandaSetting.vue +2 -2
  87. package/src/views/order-settings/dine-in/DineInSetting.vue +18 -2
  88. package/src/views/order-settings/general/GeneralSetting.vue +2 -2
  89. package/src/views/order-settings/queue/PresetRemarksSheet.vue +103 -0
  90. package/src/views/order-settings/queue/QueueSetting.vue +358 -0
  91. package/dist/KioskView-KNiT-upH.js +0 -453
@@ -0,0 +1,103 @@
1
+ <script setup lang="ts">
2
+ import { ref, watch, type PropType } from 'vue'
3
+ import { useI18n } from '@feedmepos/mf-common'
4
+
5
+ const { t } = useI18n()
6
+
7
+ const props = defineProps({
8
+ initialValue: {
9
+ type: Array as PropType<string[]>,
10
+ default: () => []
11
+ }
12
+ })
13
+
14
+ const emit = defineEmits<{
15
+ (event: 'update:modelValue', remarks: string[]): void
16
+ }>()
17
+
18
+ const remarks = ref<string[]>([...props.initialValue])
19
+ const newRemark = ref('')
20
+
21
+ watch(
22
+ () => props.initialValue,
23
+ (newValue) => {
24
+ remarks.value = [...newValue]
25
+ }
26
+ )
27
+
28
+ watch(
29
+ remarks,
30
+ (newValue) => {
31
+ const filtered = newValue.filter(remark => remark && remark.trim())
32
+ emit('update:modelValue', filtered)
33
+ },
34
+ { deep: true }
35
+ )
36
+
37
+ function addRemark() {
38
+ if (newRemark.value.trim()) {
39
+ remarks.value.push(newRemark.value.trim())
40
+ newRemark.value = ''
41
+ }
42
+ }
43
+
44
+ function removeRemark(index: number) {
45
+ remarks.value.splice(index, 1)
46
+ }
47
+
48
+ function updateRemark(index: number, value: string) {
49
+ remarks.value[index] = value
50
+ }
51
+ </script>
52
+
53
+ <template>
54
+ <div class="flex flex-col gap-6 p-6">
55
+ <!-- Add New Remark Section -->
56
+ <div class="flex flex-col gap-3">
57
+ <span class="fm-typo-en-body-md-600">{{ t('order.addNewRemark') }}</span>
58
+ <div class="flex gap-3">
59
+ <FmTextField
60
+ v-model="newRemark"
61
+ :placeholder="t('order.enterRemark')"
62
+ @keydown.enter="addRemark"
63
+ class="flex-1"
64
+ />
65
+ <FmButton
66
+ variant="secondary"
67
+ :label="t('order.add')"
68
+ icon="add"
69
+ @click="addRemark"
70
+ :disabled="!newRemark.trim()"
71
+ />
72
+ </div>
73
+ </div>
74
+
75
+ <!-- Existing Remarks Section -->
76
+ <div v-if="remarks.length > 0" class="flex flex-col gap-3">
77
+ <span class="fm-typo-en-body-md-600">{{ t('order.existingRemarks') }}</span>
78
+ <div class="flex flex-col gap-3 items-start">
79
+ <div
80
+ v-for="(remark, index) in remarks"
81
+ :key="index"
82
+ class="flex items-center gap-3 bg-gray-50 p-4 rounded-lg"
83
+ >
84
+ <FmTextField
85
+ :model-value="remark"
86
+ @update:model-value="(v: string) => updateRemark(index, v)"
87
+ class="min-w-[400px]"
88
+ />
89
+ <FmButton
90
+ color="error"
91
+ icon="delete"
92
+ @click="removeRemark(index)"
93
+ />
94
+ </div>
95
+ </div>
96
+ </div>
97
+
98
+ <!-- Empty State -->
99
+ <div v-else class="text-gray-400 text-sm text-center py-8">
100
+ {{ t('order.noPresetRemarksAdded') }}
101
+ </div>
102
+ </div>
103
+ </template>
@@ -0,0 +1,358 @@
1
+ <script setup lang="ts">
2
+ import { ref, watch, onMounted } from 'vue'
3
+ import { OrderSettingApi } from '@/api/order-setting'
4
+ import { restaurantApi, type RestaurantSettingDoc } from '@/api/restaurant-setting'
5
+ import { useLoading } from '@/composables/loading'
6
+ import {
7
+ type FdoOrderSettings,
8
+ type FdoOrderQueueSettings,
9
+ defaultQueueSetting,
10
+ OrderSettingsDto,
11
+ OrderSettingUpdateDto
12
+ } from '@entity'
13
+ import RestaurantSelector from '../components/RestaurantSelector.vue'
14
+ import { useCoreStore, useI18n } from '@feedmepos/mf-common'
15
+ import { useSnackbarFunctions } from '@/components/snackbar'
16
+ import { useDialog } from '@feedmepos/ui-library'
17
+ import PresetRemarksSheet from './PresetRemarksSheet.vue'
18
+
19
+ const { t } = useI18n()
20
+ const { showSuccess } = useSnackbarFunctions()
21
+ const { currentRestaurant } = useCoreStore()
22
+ const { isLoading, startAsyncCallWithErr } = useLoading()
23
+
24
+ const orderSettingDefault = ref<FdoOrderSettings | undefined>(undefined)
25
+ const queueSettings = ref<FdoOrderQueueSettings>({ ...defaultQueueSetting })
26
+ const restaurantSetting = ref<RestaurantSettingDoc | undefined>(undefined)
27
+ const presetRemarks = ref<string[]>([])
28
+
29
+ const Dialog = useDialog()
30
+
31
+ onMounted(() => {
32
+ init()
33
+ })
34
+
35
+ watch(
36
+ () => currentRestaurant.value,
37
+ () => {
38
+ init()
39
+ },
40
+ { immediate: true }
41
+ )
42
+
43
+ async function readOrderSetting(): Promise<OrderSettingsDto> {
44
+ return await startAsyncCallWithErr(async () => {
45
+ return await OrderSettingApi.getOrderSetting()
46
+ })
47
+ }
48
+
49
+ async function updateOrderSetting() {
50
+ await startAsyncCallWithErr(async () => {
51
+ if (orderSettingDefault.value) {
52
+ await OrderSettingApi.updateOrderSetting(
53
+ OrderSettingUpdateDto.parse({
54
+ ...orderSettingDefault.value,
55
+ queueSettings: queueSettings.value
56
+ })
57
+ )
58
+ }
59
+ await init()
60
+ })
61
+ showSuccess(t('order.settingUpdated'))
62
+ }
63
+
64
+ async function init() {
65
+ if (currentRestaurant.value) {
66
+ queueSettings.value = { ...defaultQueueSetting }
67
+ orderSettingDefault.value = await readOrderSetting()
68
+ if (orderSettingDefault.value?.queueSettings) {
69
+ queueSettings.value = { ...defaultQueueSetting, ...orderSettingDefault.value.queueSettings }
70
+ }
71
+
72
+ // Load restaurant settings for preset remarks
73
+ await startAsyncCallWithErr(async () => {
74
+ restaurantSetting.value = await restaurantApi.readRestaurantSetting(
75
+ currentRestaurant.value!._id
76
+ )
77
+ const queueQrSetting = restaurantSetting.value?.queueQrSetting
78
+ presetRemarks.value = queueQrSetting?.presetRemarks ?? []
79
+ })
80
+ }
81
+ }
82
+
83
+ function updateQueueSetting<K extends keyof FdoOrderQueueSettings>(
84
+ key: K,
85
+ value: FdoOrderQueueSettings[K]
86
+ ) {
87
+ queueSettings.value[key] = value
88
+ }
89
+
90
+ function addCodeSetting() {
91
+ if (!queueSettings.value.codeSettings) {
92
+ queueSettings.value.codeSettings = []
93
+ }
94
+ queueSettings.value.codeSettings.push({
95
+ start: 0,
96
+ end: 100,
97
+ current: 0,
98
+ prefix: '',
99
+ pax: { min: 1, max: 99 }
100
+ })
101
+ }
102
+
103
+ function removeCodeSetting(index: number) {
104
+ queueSettings.value.codeSettings?.splice(index, 1)
105
+ }
106
+
107
+ function updateCodeSetting(index: number, key: string, value: any) {
108
+ if (queueSettings.value.codeSettings && queueSettings.value.codeSettings[index]) {
109
+ const setting = queueSettings.value.codeSettings[index] as any
110
+ if (key.includes('.')) {
111
+ const [parent, child] = key.split('.')
112
+ setting[parent][child] = value
113
+ } else {
114
+ setting[key] = value
115
+ }
116
+ }
117
+ }
118
+
119
+ function openPresetRemarksSheet() {
120
+ let updatedRemarks: string[] = [...presetRemarks.value]
121
+
122
+ Dialog.open({
123
+ title: t('order.editPresetRemarks'),
124
+ contentComponent: PresetRemarksSheet,
125
+ contentComponentProps: {
126
+ initialValue: [...presetRemarks.value],
127
+ 'onUpdate:modelValue': (remarks: string[]) => {
128
+ updatedRemarks = remarks
129
+ }
130
+ },
131
+ primaryActions: {
132
+ text: t('order.save'),
133
+ variant: 'primary',
134
+ close: true
135
+ },
136
+ secondaryActions: {
137
+ text: t('order.cancel'),
138
+ variant: 'tertiary',
139
+ close: true
140
+ }
141
+ }).onPrimary(async () => {
142
+ await savePresetRemarks(updatedRemarks)
143
+ })
144
+ }
145
+
146
+ async function savePresetRemarks(remarks: string[]) {
147
+ await startAsyncCallWithErr(async () => {
148
+ if (currentRestaurant.value && restaurantSetting.value) {
149
+ const queueQrSetting = restaurantSetting.value.queueQrSetting
150
+ const result = await restaurantApi.updateQueueSetting(currentRestaurant.value._id, {
151
+ printerIds: queueQrSetting?.printerIds ?? [],
152
+ promptConfirmationDialog: queueQrSetting?.promptConfirmationDialog,
153
+ presetRemarks: remarks
154
+ })
155
+
156
+ restaurantSetting.value = result
157
+ presetRemarks.value = remarks
158
+ showSuccess(t('order.presetRemarksSaved'))
159
+ }
160
+ })
161
+ }
162
+ </script>
163
+
164
+ <template>
165
+ <RestaurantSelector />
166
+ <div v-if="isLoading" class="column">
167
+ <FmCircularProgress size="xxl" />
168
+ </div>
169
+ <div v-else>
170
+ <div class="p-[1.5rem] flex flex-col gap-5 m-5 mr-8 w-full max-w-4xl">
171
+ <div class="flex flex-col gap-5">
172
+ <div class="flex-grow fm-typo-en-title-sm-600">{{ t('order.queueSettings') }}</div>
173
+
174
+ <FmSwitch
175
+ :model-value="queueSettings.enableOrder"
176
+ @update:model-value="(v: boolean) => updateQueueSetting('enableOrder', v)"
177
+ :label="t('order.enableQueueOrder')"
178
+ label-placement="right"
179
+ />
180
+
181
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-5">
182
+ <div class="flex flex-col gap-2">
183
+ <span class="fm-typo-en-body-md-600">{{ t('order.autoCalledLimit') }}</span>
184
+ <FmTextField
185
+ type="number"
186
+ :model-value="queueSettings.autoCalledLimit"
187
+ @update:model-value="
188
+ (v: string | number) =>
189
+ updateQueueSetting('autoCalledLimit', v === '' ? 0 : Number(v))
190
+ "
191
+ />
192
+ </div>
193
+ </div>
194
+
195
+ <FmSwitch
196
+ :model-value="queueSettings.disableRemoteQueue ?? false"
197
+ @update:model-value="(v: boolean) => updateQueueSetting('disableRemoteQueue', v)"
198
+ :label="t('order.disableRemoteQueue')"
199
+ label-placement="right"
200
+ />
201
+
202
+ <FmSwitch
203
+ :model-value="queueSettings.disableSMS ?? false"
204
+ @update:model-value="(v: boolean) => updateQueueSetting('disableSMS', v)"
205
+ :label="t('order.disableSMS')"
206
+ label-placement="right"
207
+ />
208
+
209
+ <FmSwitch
210
+ :model-value="queueSettings.printChecklist ?? false"
211
+ @update:model-value="(v: boolean) => updateQueueSetting('printChecklist', v)"
212
+ :label="t('order.printChecklist')"
213
+ label-placement="right"
214
+ />
215
+
216
+ <div class="flex flex-col gap-2">
217
+ <span class="fm-typo-en-body-md-600">{{ t('order.autoSendKitchen') }}</span>
218
+ <FmSelect
219
+ :model-value="
220
+ queueSettings.autoSendKitchen === null
221
+ ? 'null'
222
+ : String(queueSettings.autoSendKitchen)
223
+ "
224
+ @update:model-value="
225
+ (v: string) =>
226
+ updateQueueSetting('autoSendKitchen', v === 'null' ? null : v === 'true')
227
+ "
228
+ :items="[
229
+ { label: t('order.followDineIn'), value: 'null' },
230
+ { label: t('order.enabled'), value: 'true' },
231
+ { label: t('order.disabled'), value: 'false' }
232
+ ]"
233
+ />
234
+ </div>
235
+
236
+ <div class="flex flex-col gap-3 mt-4">
237
+ <div class="flex justify-between items-center">
238
+ <span class="fm-typo-en-body-md-600">{{ t('order.presetRemarks') }}</span>
239
+ <FmButton
240
+ variant="secondary"
241
+ :label="t('order.edit')"
242
+ icon="edit"
243
+ @click="openPresetRemarksSheet"
244
+ />
245
+ </div>
246
+ <div v-if="presetRemarks.length > 0" class="flex flex-wrap gap-2">
247
+ <div
248
+ v-for="(remark, index) in presetRemarks"
249
+ :key="index"
250
+ class="bg-gray-100 px-3 py-1 rounded-full text-sm"
251
+ >
252
+ {{ remark }}
253
+ </div>
254
+ </div>
255
+ <div v-else class="text-gray-400 text-sm">
256
+ {{ t('order.noPresetRemarks') }}
257
+ </div>
258
+ </div>
259
+
260
+ <div class="flex flex-col gap-4 mt-4">
261
+ <div class="flex justify-between items-center">
262
+ <span class="fm-typo-en-title-sm-600">{{ t('order.codeSettings') }}</span>
263
+ <FmButton
264
+ variant="secondary"
265
+ :label="t('order.addCodeSetting')"
266
+ icon="add"
267
+ @click="addCodeSetting"
268
+ />
269
+ </div>
270
+
271
+ <div
272
+ v-for="(codeSetting, index) in queueSettings.codeSettings"
273
+ :key="index"
274
+ class="bg-gray-50 border border-gray-200 p-5 rounded-lg flex flex-col gap-4 mt-4"
275
+ >
276
+ <div class="flex justify-between items-center">
277
+ <span class="font-bold">#{{ index + 1 }}</span>
278
+ <FmButton color="error" icon="delete" @click="removeCodeSetting(index)" />
279
+ </div>
280
+
281
+ <div class="grid grid-cols-2 gap-x-6 gap-y-5">
282
+ <div class="flex flex-col gap-1">
283
+ <span class="text-sm">{{ t('order.prefix') }}</span>
284
+ <FmTextField
285
+ :model-value="codeSetting.prefix ?? ''"
286
+ @update:model-value="(v: string) => updateCodeSetting(index, 'prefix', v)"
287
+ />
288
+ </div>
289
+ <div class="flex flex-col gap-1">
290
+ <span class="text-sm">{{ t('order.current') }}</span>
291
+ <FmTextField
292
+ type="number"
293
+ :model-value="codeSetting.current"
294
+ @update:model-value="
295
+ (v: string | number) =>
296
+ updateCodeSetting(index, 'current', v === '' ? 0 : Number(v))
297
+ "
298
+ />
299
+ </div>
300
+ <div class="flex flex-col gap-1">
301
+ <span class="text-sm">{{ t('order.start') }}</span>
302
+ <FmTextField
303
+ type="number"
304
+ :model-value="codeSetting.start"
305
+ @update:model-value="
306
+ (v: string | number) =>
307
+ updateCodeSetting(index, 'start', v === '' ? 0 : Number(v))
308
+ "
309
+ />
310
+ </div>
311
+ <div class="flex flex-col gap-1">
312
+ <span class="text-sm">{{ t('order.end') }}</span>
313
+ <FmTextField
314
+ type="number"
315
+ :model-value="codeSetting.end"
316
+ @update:model-value="
317
+ (v: string | number) =>
318
+ updateCodeSetting(index, 'end', v === '' ? 0 : Number(v))
319
+ "
320
+ />
321
+ </div>
322
+ <div class="flex flex-col gap-1">
323
+ <span class="text-sm">{{ t('order.paxMin') }}</span>
324
+ <FmTextField
325
+ type="number"
326
+ :model-value="codeSetting.pax.min"
327
+ @update:model-value="
328
+ (v: string | number) =>
329
+ updateCodeSetting(index, 'pax.min', v === '' ? 0 : Number(v))
330
+ "
331
+ />
332
+ </div>
333
+ <div class="flex flex-col gap-1">
334
+ <span class="text-sm">{{ t('order.paxMax') }}</span>
335
+ <FmTextField
336
+ type="number"
337
+ :model-value="codeSetting.pax.max"
338
+ @update:model-value="
339
+ (v: string | number) =>
340
+ updateCodeSetting(index, 'pax.max', v === '' ? 0 : Number(v))
341
+ "
342
+ />
343
+ </div>
344
+ </div>
345
+ </div>
346
+ </div>
347
+ </div>
348
+ </div>
349
+ <div class="fm-corner-radius-lg flex flex-col gap-5 m-5">
350
+ <FmButton
351
+ variant="primary"
352
+ :label="t('order.saveSetting')"
353
+ class="mr-auto"
354
+ @click="updateOrderSetting"
355
+ />
356
+ </div>
357
+ </div>
358
+ </template>