@feedmepos/mf-order-setting 0.0.54 → 0.0.56-dev.2
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/.tsbuildinfo +1 -0
- package/dist/{KioskDevicesView-CMKNjgWx.js → KioskDevicesView-Qv-xd_kZ.js} +1 -1
- package/dist/{KioskDevicesView.vue_vue_type_script_setup_true_lang-B1sNvlUC.js → KioskDevicesView.vue_vue_type_script_setup_true_lang-CCF1mKni.js} +2 -2
- package/dist/KioskSettingView-CvvrK6Bv.js +643 -0
- package/dist/{KioskView-U-Wg8oMC.js → KioskView-CppTVBv-.js} +117 -117
- package/dist/OrderSettingsView-C38N61dM.js +36564 -0
- package/dist/{app-CFfgPAd8.js → app-Bss1GkKY.js} +392 -228
- package/dist/app.js +1 -1
- package/dist/{dayjs.min-CuRr-wlf.js → dayjs.min-DZfxGUk4.js} +1 -1
- package/dist/frontend/mf-order/src/api/reservation/index.d.ts +8 -0
- package/dist/frontend/mf-order/src/app.d.ts +164 -0
- package/dist/frontend/mf-order/src/main.d.ts +164 -0
- package/dist/frontend/mf-order/src/stores/order-setting/index.d.ts +3 -0
- package/dist/frontend/mf-order/src/stores/restaurant/index.d.ts +1 -1
- package/dist/frontend/mf-order/src/views/kiosk/settings/KioskPaymentTypeSection.vue.d.ts +13 -3
- package/dist/frontend/mf-order/src/views/order-settings/delivery/integrated-delivery/ExternalSetting.vue.d.ts +12 -4
- package/dist/frontend/mf-order/src/views/order-settings/dine-in/OfflinePaymentTypeDialog.vue.d.ts +4 -4
- package/dist/frontend/mf-order/src/views/order-settings/dine-in/PaymentType.vue.d.ts +38 -4
- package/dist/frontend/mf-order/src/views/order-settings/pickup/PaymentSidesheet.vue.d.ts +1 -0
- package/dist/frontend/mf-order/src/views/order-settings/reservation/CopySettingsSheet.vue.d.ts +186 -0
- package/dist/frontend/mf-order/src/views/order-settings/reservation/CustomSelect.vue.d.ts +15 -0
- package/dist/frontend/mf-order/src/views/order-settings/reservation/CustomTimePicker.vue.d.ts +11 -0
- package/dist/frontend/mf-order/src/views/order-settings/reservation/ReservationSetting.vue.d.ts +2 -0
- package/dist/{index-Bj0bCGTm.js → index-B6AGCsrw.js} +3 -3
- package/dist/index-BpKR-Cxd.js +19757 -0
- package/dist/{menu.dto-DAh1J2ES.js → menu.dto-C_B3M2fs.js} +7390 -7134
- package/dist/package/entity/incoming-order/incoming-order.do.d.ts +22443 -3
- package/dist/package/entity/incoming-order/incoming-order.dto.d.ts +3 -3
- package/dist/package/entity/incoming-order/incoming-order.enum.d.ts +1 -1
- package/dist/package/entity/index.d.ts +6 -0
- package/dist/package/entity/marketing/marketing.dto.d.ts +1 -1
- package/dist/package/entity/order/dine-in/qr.dto.d.ts +38 -0
- package/dist/package/entity/order/order.do.d.ts +6358 -2
- package/dist/package/entity/order/order.dto.d.ts +22 -0
- package/dist/package/entity/order-platform/deliveroo/deliveroo-dto.d.ts +3 -0
- package/dist/package/entity/order-platform/deliveroo/deliveroo-setting.do.d.ts +3 -0
- package/dist/package/entity/order-platform/external/order/external-order.do.d.ts +12 -12
- package/dist/package/entity/order-platform/external/order/external-order.dto.d.ts +32 -32
- package/dist/package/entity/order-platform/external/setting/external-setting.do.d.ts +21 -3
- package/dist/package/entity/order-platform/external/setting/external-setting.dto.d.ts +12 -2
- package/dist/package/entity/order-platform/foodpanda/foodpanda-settings.do.d.ts +3 -0
- package/dist/package/entity/order-platform/foodpanda/foodpanda-settings.dto.d.ts +3 -0
- package/dist/package/entity/order-platform/grabfood/grabfood-edit-order.do.d.ts +9 -1
- package/dist/package/entity/order-platform/grabfood/grabfood-settings.do.d.ts +2 -2
- package/dist/package/entity/order-platform/grabfood/grabfood.dto.d.ts +3 -3
- package/dist/package/entity/order-platform/order-platform.dto.d.ts +2 -2
- package/dist/package/entity/order-platform/shopeefood/shopeefood-settings.do.d.ts +3 -0
- package/dist/package/entity/order-platform/shopeefood/shopeefood-settings.dto.d.ts +3 -0
- package/dist/package/entity/order-setting/order-setting.do.d.ts +864 -0
- package/dist/package/entity/order-setting/order-setting.dto.d.ts +6 -0
- package/dist/package/entity/order-setting/reservationV2/reservation.do.d.ts +1269 -0
- package/dist/package/entity/queue/queue.do.d.ts +3 -8
- package/dist/package/entity/queue/queue.dto.d.ts +10 -0
- package/dist/package/entity/reservation/reservation.do.d.ts +105 -0
- package/dist/package/entity/reservation/reservation.dto.d.ts +335 -0
- package/dist/package/entity/reservation/reservation.enum.d.ts +3 -0
- package/dist/package/entity/reservation/reservation.utils.d.ts +152 -0
- package/dist/style.css +1 -0
- package/package.json +1 -1
- package/src/api/reservation/index.ts +28 -0
- package/src/assets/images/not-found.png +0 -0
- package/src/locales/en-US.json +56 -0
- package/src/locales/th-TH.json +54 -0
- package/src/locales/zh-CN.json +54 -0
- package/src/views/kiosk/KioskSummary.vue +3 -0
- package/src/views/kiosk/settings/KioskPaymentTypeSection.vue +99 -211
- package/src/views/kiosk/settings/KioskSettingView.vue +43 -25
- package/src/views/order-settings/OrderSettingsView.vue +6 -1
- package/src/views/order-settings/dine-in/DineInSetting.vue +1 -0
- package/src/views/order-settings/dine-in/OfflinePaymentTypeDialog.vue +2 -3
- package/src/views/order-settings/dine-in/PaymentType.vue +151 -43
- package/src/views/order-settings/pickup/PaymentSidesheet.vue +33 -172
- package/src/views/order-settings/pickup/PickUpSettingDialogContent.vue +1 -0
- package/src/views/order-settings/reservation/CopySettingsSheet.vue +256 -0
- package/src/views/order-settings/reservation/CustomSelect.vue +99 -0
- package/src/views/order-settings/reservation/CustomTimePicker.vue +311 -0
- package/src/views/order-settings/reservation/ReservationSetting.vue +1555 -0
- package/tsconfig.app.json +8 -6
- package/dist/KioskSettingView-BE_pMA-i.js +0 -720
- package/dist/OrderSettingsView-BWzaITT6.js +0 -51916
- package/dist/frontend/mf-order/tsconfig.app.tsbuildinfo +0 -1
- package/dist/index-BXsnV_eO.js +0 -150
|
@@ -156,6 +156,7 @@
|
|
|
156
156
|
v-if="!getCoverImagePreview('coverImageLandscape')"
|
|
157
157
|
accept="image/*"
|
|
158
158
|
:max-file-size="MAX_IMAGE_FILE_SIZE"
|
|
159
|
+
content-class="w-full max-w-[400px] aspect-video"
|
|
159
160
|
@file-upload="uploadCoverImage('coverImageLandscape', $event)"
|
|
160
161
|
@file-rejected="handleCoverImageRejected('coverImageLandscape', $event)"
|
|
161
162
|
/>
|
|
@@ -163,13 +164,13 @@
|
|
|
163
164
|
<img
|
|
164
165
|
:src="getCoverImagePreview('coverImageLandscape')!"
|
|
165
166
|
:alt="t('order.coverImageLandscape')"
|
|
166
|
-
class="
|
|
167
|
-
/>
|
|
168
|
-
<FmButton
|
|
169
|
-
variant="tertiary"
|
|
170
|
-
class="mr-auto"
|
|
171
|
-
:label="t('common.delete')"
|
|
172
|
-
@click="clearCoverImage('coverImageLandscape')"
|
|
167
|
+
class="max-w-[400px] aspect-video object-cover rounded-md border border-fm-color-neutral-gray-200"
|
|
168
|
+
/>
|
|
169
|
+
<FmButton
|
|
170
|
+
variant="tertiary"
|
|
171
|
+
class="mr-auto"
|
|
172
|
+
:label="t('common.delete')"
|
|
173
|
+
@click="clearCoverImage('coverImageLandscape')"
|
|
173
174
|
/>
|
|
174
175
|
</div>
|
|
175
176
|
</div>
|
|
@@ -183,6 +184,7 @@
|
|
|
183
184
|
v-if="!getCoverImagePreview('coverImagePortrait')"
|
|
184
185
|
accept="image/*"
|
|
185
186
|
:max-file-size="MAX_IMAGE_FILE_SIZE"
|
|
187
|
+
content-class="w-[240px] aspect-[9/16]"
|
|
186
188
|
@file-upload="uploadCoverImage('coverImagePortrait', $event)"
|
|
187
189
|
@file-rejected="handleCoverImageRejected('coverImagePortrait', $event)"
|
|
188
190
|
/>
|
|
@@ -190,13 +192,13 @@
|
|
|
190
192
|
<img
|
|
191
193
|
:src="getCoverImagePreview('coverImagePortrait')!"
|
|
192
194
|
:alt="t('order.coverImagePortrait')"
|
|
193
|
-
class="
|
|
194
|
-
/>
|
|
195
|
-
<FmButton
|
|
196
|
-
variant="tertiary"
|
|
197
|
-
class="mr-auto"
|
|
198
|
-
:label="t('common.delete')"
|
|
199
|
-
@click="clearCoverImage('coverImagePortrait')"
|
|
195
|
+
class="max-w-[200px] aspect-[9/16] object-cover rounded-md border border-fm-color-neutral-gray-200"
|
|
196
|
+
/>
|
|
197
|
+
<FmButton
|
|
198
|
+
variant="tertiary"
|
|
199
|
+
class="mr-auto"
|
|
200
|
+
:label="t('common.delete')"
|
|
201
|
+
@click="clearCoverImage('coverImagePortrait')"
|
|
200
202
|
/>
|
|
201
203
|
</div>
|
|
202
204
|
</div>
|
|
@@ -215,10 +217,9 @@
|
|
|
215
217
|
|
|
216
218
|
<!-- Payment Section -->
|
|
217
219
|
<div class="flex flex-col gap-2">
|
|
218
|
-
<span class="fm-typo-en-title-sm-600">{{ t('order.acceptedPayment') }}</span>
|
|
219
|
-
<span class="fm-typo-en-title-sm-400 font-bold">{{ t('order.configuration') }}</span>
|
|
220
220
|
<KioskPaymentTypeSection
|
|
221
221
|
:payment-types="kioskOrderSettingForm.paymentSetting.paymentTypes ?? []"
|
|
222
|
+
:allow-credit="true"
|
|
222
223
|
:allow-e-payment="allowEPayment"
|
|
223
224
|
:offline-payment-types="kioskOrderSettingForm.paymentSetting.offlinePaymentTypes ?? []"
|
|
224
225
|
:ePaymentTypes="kioskOrderSettingForm.paymentSetting.ePaymentTypes ?? {}"
|
|
@@ -246,6 +247,7 @@
|
|
|
246
247
|
<script setup lang="ts">
|
|
247
248
|
import { computed, ref } from 'vue'
|
|
248
249
|
import KioskPaymentTypeSection from './KioskPaymentTypeSection.vue'
|
|
250
|
+
import { useRestaurantStore } from '@/stores/restaurant'
|
|
249
251
|
import { FdoOfflinePaymentMethod } from '@feedmepos/core/entity'
|
|
250
252
|
import { FdoEPaymentMethod, F_ORDER_PAYMENT_TYPE } from '@entity'
|
|
251
253
|
import type {
|
|
@@ -310,6 +312,22 @@ const validKioskOrderSetting = computed<MfKioskOrderSetting | null>(() => {
|
|
|
310
312
|
if (!isValid) return null
|
|
311
313
|
}
|
|
312
314
|
|
|
315
|
+
// Validate payment settings
|
|
316
|
+
const payment = f.paymentSetting
|
|
317
|
+
if (payment?.paymentTypes?.includes(F_ORDER_PAYMENT_TYPE.enum.ePayment)) {
|
|
318
|
+
const ePayment = payment.ePaymentTypes
|
|
319
|
+
if (!ePayment) return null
|
|
320
|
+
|
|
321
|
+
const hasCard = ePayment.card?.terminal || ePayment.card?.nfc
|
|
322
|
+
const hasWallet =
|
|
323
|
+
ePayment.eWallet?.qrPay ||
|
|
324
|
+
ePayment.eWallet?.scanPay ||
|
|
325
|
+
ePayment.eWallet?.terminalScanPay ||
|
|
326
|
+
ePayment.eWallet?.terminalQrPay
|
|
327
|
+
|
|
328
|
+
if (!hasCard && !hasWallet) return null
|
|
329
|
+
}
|
|
330
|
+
|
|
313
331
|
// Return the form as-is if valid, with display stand disabled when dineIn is disabled
|
|
314
332
|
return {
|
|
315
333
|
...f,
|
|
@@ -339,6 +357,7 @@ function updateEPaymentSetting(form: FdoEPaymentMethod) {
|
|
|
339
357
|
kioskOrderSettingForm.value.paymentSetting.ePaymentTypes = form
|
|
340
358
|
}
|
|
341
359
|
|
|
360
|
+
const restaurantStore = useRestaurantStore()
|
|
342
361
|
type CoverImageField = 'coverImageLandscape' | 'coverImagePortrait'
|
|
343
362
|
const MAX_IMAGE_FILE_SIZE = 10 * 1000 * 1000
|
|
344
363
|
|
|
@@ -374,10 +393,10 @@ async function uploadCoverImage(field: CoverImageField, file: File) {
|
|
|
374
393
|
}
|
|
375
394
|
}
|
|
376
395
|
|
|
377
|
-
function handleCoverImageRejected(
|
|
378
|
-
field: CoverImageField,
|
|
379
|
-
rejected: { file: File; reason: string[] }[]
|
|
380
|
-
) {
|
|
396
|
+
function handleCoverImageRejected(
|
|
397
|
+
field: CoverImageField,
|
|
398
|
+
rejected: { file: File; reason: string[] }[]
|
|
399
|
+
) {
|
|
381
400
|
const fieldName =
|
|
382
401
|
field === 'coverImageLandscape' ? t('order.coverImageLandscape') : t('order.coverImagePortrait')
|
|
383
402
|
const firstReason = rejected[0]?.reason?.[0]
|
|
@@ -385,13 +404,12 @@ function handleCoverImageRejected(
|
|
|
385
404
|
title: firstReason
|
|
386
405
|
? `${t('order.imageUploadRejected')}: ${fieldName} (${firstReason})`
|
|
387
406
|
: `${t('order.imageUploadRejected')}: ${fieldName}`,
|
|
388
|
-
type: 'error'
|
|
389
|
-
})
|
|
390
|
-
}
|
|
407
|
+
type: 'error'
|
|
408
|
+
})
|
|
409
|
+
}
|
|
391
410
|
|
|
392
411
|
const allowEPayment = computed(() => {
|
|
393
|
-
|
|
394
|
-
return paymentTypes.includes(F_ORDER_PAYMENT_TYPE.enum.ePayment)
|
|
412
|
+
return restaurantStore.getRestaurantEPayment()
|
|
395
413
|
})
|
|
396
414
|
|
|
397
415
|
const enablePaxDialog = computed({
|
|
@@ -27,6 +27,7 @@ import SmsSetting from './sms/SmsSetting.vue'
|
|
|
27
27
|
|
|
28
28
|
import GeneralSetting from './general/GeneralSetting.vue'
|
|
29
29
|
import QueueSetting from './queue/QueueSetting.vue'
|
|
30
|
+
import ReservationSetting from './reservation/ReservationSetting.vue'
|
|
30
31
|
import { useI18n, useCoreStore } from '@feedmepos/mf-common'
|
|
31
32
|
import { useMenuStore } from '@/stores/menu/menu'
|
|
32
33
|
import { useSnackbarFunctions } from '@/components/snackbar'
|
|
@@ -45,6 +46,7 @@ type OrderSettingMenuItemValue =
|
|
|
45
46
|
// | 'discountRule'
|
|
46
47
|
| 'general'
|
|
47
48
|
| 'queue'
|
|
49
|
+
| 'reservation'
|
|
48
50
|
const selectedOrderSetting = ref<OrderSettingMenuItemValue>('delivery')
|
|
49
51
|
|
|
50
52
|
const settingItem = computed<FmTabProps[]>(() => [
|
|
@@ -56,7 +58,8 @@ const settingItem = computed<FmTabProps[]>(() => [
|
|
|
56
58
|
// { label: t('order.discountRule.title'), value: 'discountRule' },
|
|
57
59
|
{ label: t('order.sms'), value: 'sms' },
|
|
58
60
|
{ label: t('order.general'), value: 'general' },
|
|
59
|
-
{ label: t('order.queue'), value: 'queue' }
|
|
61
|
+
{ label: t('order.queue'), value: 'queue' },
|
|
62
|
+
{ label: t('order.reservation'), value: 'reservation' }
|
|
60
63
|
])
|
|
61
64
|
|
|
62
65
|
const currentComponent = computed(() => {
|
|
@@ -79,6 +82,8 @@ const currentComponent = computed(() => {
|
|
|
79
82
|
return GeneralSetting
|
|
80
83
|
case 'queue':
|
|
81
84
|
return QueueSetting
|
|
85
|
+
case 'reservation':
|
|
86
|
+
return ReservationSetting
|
|
82
87
|
}
|
|
83
88
|
})
|
|
84
89
|
|
|
@@ -90,6 +90,7 @@
|
|
|
90
90
|
<PaymentType
|
|
91
91
|
:payment-types="dineInSetting.paymentTypes ?? []"
|
|
92
92
|
:allow-e-payment="allowEPayment"
|
|
93
|
+
:allow-credit="true"
|
|
93
94
|
:offline-payment-types="dineInSetting.offlinePaymentTypes ?? []"
|
|
94
95
|
@update:payment-types="(v: F_ORDER_PAYMENT_TYPE[]) => (dineInSetting.paymentTypes = v)"
|
|
95
96
|
@update:offline-payment-types="
|
|
@@ -40,12 +40,11 @@ const openDialog = () => {
|
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
async function addOfflinePayment(newPaymentType: FdoOfflinePaymentMethod) {
|
|
43
|
-
|
|
44
|
-
emits('update:offlinePaymentTypes', updatedOfflinePaymentTypes)
|
|
43
|
+
emits('add:offline-payment-type', newPaymentType)
|
|
45
44
|
}
|
|
46
45
|
|
|
47
46
|
const emits = defineEmits<{
|
|
48
|
-
(event: '
|
|
47
|
+
(event: 'add:offline-payment-type', v: FdoOfflinePaymentMethod): void
|
|
49
48
|
}>()
|
|
50
49
|
</script>
|
|
51
50
|
|
|
@@ -15,10 +15,22 @@ const props = defineProps({
|
|
|
15
15
|
type: Array as PropType<FdoOfflinePaymentMethod[]>,
|
|
16
16
|
required: true
|
|
17
17
|
},
|
|
18
|
+
showDisabledOptions: {
|
|
19
|
+
type: Boolean,
|
|
20
|
+
default: false
|
|
21
|
+
},
|
|
22
|
+
disabledSuffixes: {
|
|
23
|
+
type: Object as PropType<Record<string, string>>,
|
|
24
|
+
default: () => ({})
|
|
25
|
+
},
|
|
18
26
|
allowEPayment: {
|
|
19
27
|
type: [Boolean, String],
|
|
20
28
|
required: true
|
|
21
29
|
},
|
|
30
|
+
allowCredit: {
|
|
31
|
+
type: [Boolean, String],
|
|
32
|
+
default: false
|
|
33
|
+
},
|
|
22
34
|
maxCustomPayment: {
|
|
23
35
|
type: Number,
|
|
24
36
|
default: undefined
|
|
@@ -42,6 +54,11 @@ const allowEPayment = computed(() => {
|
|
|
42
54
|
return paymentTypes.includes(F_ORDER_PAYMENT_TYPE.enum.ePayment)
|
|
43
55
|
})
|
|
44
56
|
|
|
57
|
+
const allowCreditPayment = computed(() => {
|
|
58
|
+
const paymentTypes = props.paymentTypes || []
|
|
59
|
+
return paymentTypes.includes(F_ORDER_PAYMENT_TYPE.enum.credit)
|
|
60
|
+
})
|
|
61
|
+
|
|
45
62
|
const allowOfflinePayment = computed(() => {
|
|
46
63
|
const paymentTypes = props.paymentTypes || []
|
|
47
64
|
const offlinePaymentTypes = props.offlinePaymentTypes || []
|
|
@@ -52,23 +69,68 @@ const allowOfflinePayment = computed(() => {
|
|
|
52
69
|
const parent = ref(false)
|
|
53
70
|
const nestedVal = ref<string[]>([])
|
|
54
71
|
|
|
55
|
-
const checkboxChildren =
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
72
|
+
const checkboxChildren = computed(() => {
|
|
73
|
+
const options = [
|
|
74
|
+
{ label: t('order.offlinePayment'), value: 'offline' },
|
|
75
|
+
{
|
|
76
|
+
label: t('order.ePayment'),
|
|
77
|
+
value: 'e-payment',
|
|
78
|
+
disable: !props.allowEPayment,
|
|
79
|
+
suffix: !props.allowEPayment && props.showDisabledOptions
|
|
80
|
+
? {
|
|
81
|
+
text: `(${props.disabledSuffixes['e-payment'] || t('order.notAllowed')})`,
|
|
82
|
+
class: 'text-negative t-system'
|
|
83
|
+
}
|
|
84
|
+
: undefined
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
label: t('order.credit'),
|
|
88
|
+
value: 'credit',
|
|
89
|
+
disable: !props.allowCredit,
|
|
90
|
+
suffix: !props.allowCredit && props.showDisabledOptions
|
|
91
|
+
? {
|
|
92
|
+
text: `(${props.disabledSuffixes['credit'] || t('order.notAllowed')})`,
|
|
93
|
+
class: 'text-negative t-system'
|
|
94
|
+
}
|
|
95
|
+
: undefined
|
|
96
|
+
}
|
|
97
|
+
]
|
|
98
|
+
return options
|
|
99
|
+
})
|
|
59
100
|
|
|
60
101
|
const initializeCheckboxes = () => {
|
|
61
102
|
const initialValues: string[] = []
|
|
62
103
|
if (allowOfflinePayment.value) initialValues.push('offline')
|
|
63
104
|
if (allowEPayment.value) initialValues.push('e-payment')
|
|
105
|
+
if (allowCreditPayment.value) initialValues.push('credit')
|
|
64
106
|
nestedVal.value = initialValues
|
|
65
|
-
|
|
107
|
+
|
|
108
|
+
let availableOptionsCount = 0
|
|
109
|
+
if (props.showDisabledOptions) {
|
|
110
|
+
availableOptionsCount = checkboxChildren.value.length
|
|
111
|
+
} else {
|
|
112
|
+
availableOptionsCount = checkboxChildren.value.filter(item => {
|
|
113
|
+
if (item.value === 'e-payment' && !props.allowEPayment) return false
|
|
114
|
+
if (item.value === 'credit' && !props.allowCredit) return false
|
|
115
|
+
return true
|
|
116
|
+
}).length
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
parent.value = initialValues.length === availableOptionsCount && initialValues.length > 0
|
|
66
120
|
}
|
|
67
121
|
|
|
68
122
|
initializeCheckboxes()
|
|
69
123
|
|
|
70
124
|
const handleParentUpdate = (ev: boolean) => {
|
|
71
|
-
|
|
125
|
+
const availableOptions = checkboxChildren.value.filter(item => {
|
|
126
|
+
// If showDisabledOptions is true, we might allow selecting it? NO, usually disabled checkboxes are not selectable.
|
|
127
|
+
// So we should only select enabled ones.
|
|
128
|
+
if (item.value === 'e-payment' && !props.allowEPayment) return false
|
|
129
|
+
if (item.value === 'credit' && !props.allowCredit) return false
|
|
130
|
+
return true
|
|
131
|
+
})
|
|
132
|
+
|
|
133
|
+
nestedVal.value = ev ? availableOptions.map((item) => item.value) : []
|
|
72
134
|
parent.value = ev
|
|
73
135
|
|
|
74
136
|
const updatedPaymentTypes: F_ORDER_PAYMENT_TYPE[] = []
|
|
@@ -80,6 +142,9 @@ const handleParentUpdate = (ev: boolean) => {
|
|
|
80
142
|
if (nestedVal.value.includes('offline')) {
|
|
81
143
|
updatedPaymentTypes.push(F_ORDER_PAYMENT_TYPE.enum.cash)
|
|
82
144
|
}
|
|
145
|
+
if (nestedVal.value.includes('credit')) {
|
|
146
|
+
updatedPaymentTypes.push(F_ORDER_PAYMENT_TYPE.enum.credit)
|
|
147
|
+
}
|
|
83
148
|
|
|
84
149
|
emits('update:paymentTypes', updatedPaymentTypes)
|
|
85
150
|
emits('update:offlinePaymentTypes', updatedOfflinePaymentTypes)
|
|
@@ -87,7 +152,30 @@ const handleParentUpdate = (ev: boolean) => {
|
|
|
87
152
|
|
|
88
153
|
const handleChildUpdate = (ev: string[]) => {
|
|
89
154
|
nestedVal.value = ev
|
|
90
|
-
|
|
155
|
+
|
|
156
|
+
let availableOptionsCount = 0
|
|
157
|
+
if (props.showDisabledOptions) {
|
|
158
|
+
availableOptionsCount = checkboxChildren.value.length
|
|
159
|
+
} else {
|
|
160
|
+
availableOptionsCount = checkboxChildren.value.filter(item => {
|
|
161
|
+
if (item.value === 'e-payment' && !props.allowEPayment) return false
|
|
162
|
+
if (item.value === 'credit' && !props.allowCredit) return false
|
|
163
|
+
return true
|
|
164
|
+
}).length
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// If we have disabled options shown, the parent checkbox logic might be tricky.
|
|
168
|
+
// Usually parent is checked if ALL *checked* options are checked? No, all *available* options.
|
|
169
|
+
// If e-payment is disabled, can we toggle parent?
|
|
170
|
+
// Let's assume parent toggles all ENABLED options.
|
|
171
|
+
// And parent is checked if all ENABLED options are checked.
|
|
172
|
+
const enabledOptionsCount = checkboxChildren.value.filter(item => {
|
|
173
|
+
if (item.value === 'e-payment' && !props.allowEPayment) return false
|
|
174
|
+
if (item.value === 'credit' && !props.allowCredit) return false
|
|
175
|
+
return true
|
|
176
|
+
}).length
|
|
177
|
+
|
|
178
|
+
parent.value = ev.length === enabledOptionsCount && ev.length > 0
|
|
91
179
|
|
|
92
180
|
const updatedPaymentTypes: F_ORDER_PAYMENT_TYPE[] = []
|
|
93
181
|
const updatedOfflinePaymentTypes = ev.includes('offline') ? props.offlinePaymentTypes || [] : []
|
|
@@ -98,6 +186,9 @@ const handleChildUpdate = (ev: string[]) => {
|
|
|
98
186
|
if (ev.includes('offline')) {
|
|
99
187
|
updatedPaymentTypes.push(F_ORDER_PAYMENT_TYPE.enum.cash)
|
|
100
188
|
}
|
|
189
|
+
if (ev.includes('credit')) {
|
|
190
|
+
updatedPaymentTypes.push(F_ORDER_PAYMENT_TYPE.enum.credit)
|
|
191
|
+
}
|
|
101
192
|
|
|
102
193
|
emits('update:paymentTypes', updatedPaymentTypes)
|
|
103
194
|
emits('update:offlinePaymentTypes', updatedOfflinePaymentTypes)
|
|
@@ -117,41 +208,58 @@ onMounted(() => {
|
|
|
117
208
|
</script>
|
|
118
209
|
|
|
119
210
|
<template>
|
|
120
|
-
<div class="flex-
|
|
121
|
-
|
|
122
|
-
:
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
<
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
<
|
|
131
|
-
"
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
<
|
|
137
|
-
<
|
|
138
|
-
|
|
211
|
+
<div class="flex flex-col gap-3">
|
|
212
|
+
<div class="flex-grow fm-typo-en-title-sm-600">{{ t('order.acceptedPayment') }}</div>
|
|
213
|
+
<FmCheckbox value="" :model-value="parent" :label="t('order.all')"
|
|
214
|
+
:indeterminate="nestedVal.length > 0 && !parent"
|
|
215
|
+
@update:model-value="handleParentUpdate" />
|
|
216
|
+
|
|
217
|
+
<div class="flex flex-row items-center">
|
|
218
|
+
<FmCheckbox v-model="nestedVal" :label="checkboxChildren[0].label" :value="checkboxChildren[0].value"
|
|
219
|
+
@update:model-value="handleChildUpdate" />
|
|
220
|
+
</div>
|
|
221
|
+
<div v-if="nestedVal.includes(checkboxChildren[0].value)">
|
|
222
|
+
<div v-if="offlinePaymentTypes?.length === 0">
|
|
223
|
+
<FmCard variant="outlined">
|
|
224
|
+
<FmCardSection>{{ t('order.cash') }}</FmCardSection>
|
|
225
|
+
</FmCard>
|
|
226
|
+
</div>
|
|
227
|
+
<p v-for="(type, i) in offlinePaymentTypes" :key="i">
|
|
228
|
+
<FmCard variant="outlined" class="mb-3">
|
|
229
|
+
<FmCardSection class="flex items-center justify-between">
|
|
230
|
+
<div>
|
|
231
|
+
<span class="font-bold">{{ type.name }}</span>
|
|
232
|
+
<br />
|
|
233
|
+
<span>{{ type.instruction }}</span>
|
|
234
|
+
</div>
|
|
235
|
+
<div>
|
|
236
|
+
<FmButton append-icon="delete" variant="plain" @click="deleteOfflinePayment(i)" />
|
|
237
|
+
</div>
|
|
238
|
+
</FmCardSection>
|
|
239
|
+
</FmCard>
|
|
240
|
+
</p>
|
|
241
|
+
<div class="mt-3">
|
|
242
|
+
<OfflinePaymentTypeDialog v-if="offlinePaymentTypes.length === 0 || showDisabledOptions" @add:offline-payment-type="(v: FdoOfflinePaymentMethod) => emits('update:offlinePaymentTypes', [...props.offlinePaymentTypes, v])
|
|
243
|
+
" />
|
|
244
|
+
</div>
|
|
245
|
+
</div>
|
|
246
|
+
|
|
247
|
+
<FmCheckbox v-model="nestedVal" :label="checkboxChildren[1].label" :value="checkboxChildren[1].value"
|
|
248
|
+
@update:model-value="handleChildUpdate" :disabled="checkboxChildren[1].disable" />
|
|
249
|
+
|
|
250
|
+
<div class="text-fm-color-secondary-salmon fm-typo-en-body-sm-600 ml-7" v-if="checkboxChildren[1].suffix">
|
|
251
|
+
{{ checkboxChildren?.[1]?.suffix?.text }}
|
|
252
|
+
</div>
|
|
253
|
+
|
|
254
|
+
<div v-if="nestedVal.includes('e-payment')" class="ml-7">
|
|
255
|
+
<slot name="e-payment-content"></slot>
|
|
256
|
+
</div>
|
|
257
|
+
|
|
258
|
+
<FmCheckbox v-if="allowCredit || showDisabledOptions" v-model="nestedVal" :label="checkboxChildren[2].label" :value="checkboxChildren[2].value"
|
|
259
|
+
@update:model-value="handleChildUpdate" :disabled="checkboxChildren[2].disable" />
|
|
260
|
+
|
|
261
|
+
<div class="text-fm-color-secondary-salmon fm-typo-en-body-sm-600 ml-7" v-if="checkboxChildren[2].suffix">
|
|
262
|
+
{{ checkboxChildren?.[2]?.suffix?.text }}
|
|
139
263
|
</div>
|
|
140
|
-
|
|
141
|
-
<FmCard variant="outlined">
|
|
142
|
-
<FmCardSection class="flex items-center justify-between">
|
|
143
|
-
<div>
|
|
144
|
-
<span class="font-bold">{{ type.name }}</span>
|
|
145
|
-
<br />
|
|
146
|
-
<span>{{ type.instruction }}</span>
|
|
147
|
-
</div>
|
|
148
|
-
<div v-for="(payment, index) in offlinePaymentTypes">
|
|
149
|
-
<FmButton append-icon="delete" variant="tertiary" @click="deleteOfflinePayment(index)" />
|
|
150
|
-
</div>
|
|
151
|
-
</FmCardSection>
|
|
152
|
-
</FmCard>
|
|
153
|
-
</p>
|
|
154
|
-
</div>
|
|
155
|
-
<FmCheckbox v-model="nestedVal" :label="checkboxChildren[1].label" :value="checkboxChildren[1].value"
|
|
156
|
-
@update:model-value="handleChildUpdate" />
|
|
264
|
+
</div>
|
|
157
265
|
</template>
|