@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.
Files changed (82) hide show
  1. package/.tsbuildinfo +1 -0
  2. package/dist/{KioskDevicesView-CMKNjgWx.js → KioskDevicesView-Qv-xd_kZ.js} +1 -1
  3. package/dist/{KioskDevicesView.vue_vue_type_script_setup_true_lang-B1sNvlUC.js → KioskDevicesView.vue_vue_type_script_setup_true_lang-CCF1mKni.js} +2 -2
  4. package/dist/KioskSettingView-CvvrK6Bv.js +643 -0
  5. package/dist/{KioskView-U-Wg8oMC.js → KioskView-CppTVBv-.js} +117 -117
  6. package/dist/OrderSettingsView-C38N61dM.js +36564 -0
  7. package/dist/{app-CFfgPAd8.js → app-Bss1GkKY.js} +392 -228
  8. package/dist/app.js +1 -1
  9. package/dist/{dayjs.min-CuRr-wlf.js → dayjs.min-DZfxGUk4.js} +1 -1
  10. package/dist/frontend/mf-order/src/api/reservation/index.d.ts +8 -0
  11. package/dist/frontend/mf-order/src/app.d.ts +164 -0
  12. package/dist/frontend/mf-order/src/main.d.ts +164 -0
  13. package/dist/frontend/mf-order/src/stores/order-setting/index.d.ts +3 -0
  14. package/dist/frontend/mf-order/src/stores/restaurant/index.d.ts +1 -1
  15. package/dist/frontend/mf-order/src/views/kiosk/settings/KioskPaymentTypeSection.vue.d.ts +13 -3
  16. package/dist/frontend/mf-order/src/views/order-settings/delivery/integrated-delivery/ExternalSetting.vue.d.ts +12 -4
  17. package/dist/frontend/mf-order/src/views/order-settings/dine-in/OfflinePaymentTypeDialog.vue.d.ts +4 -4
  18. package/dist/frontend/mf-order/src/views/order-settings/dine-in/PaymentType.vue.d.ts +38 -4
  19. package/dist/frontend/mf-order/src/views/order-settings/pickup/PaymentSidesheet.vue.d.ts +1 -0
  20. package/dist/frontend/mf-order/src/views/order-settings/reservation/CopySettingsSheet.vue.d.ts +186 -0
  21. package/dist/frontend/mf-order/src/views/order-settings/reservation/CustomSelect.vue.d.ts +15 -0
  22. package/dist/frontend/mf-order/src/views/order-settings/reservation/CustomTimePicker.vue.d.ts +11 -0
  23. package/dist/frontend/mf-order/src/views/order-settings/reservation/ReservationSetting.vue.d.ts +2 -0
  24. package/dist/{index-Bj0bCGTm.js → index-B6AGCsrw.js} +3 -3
  25. package/dist/index-BpKR-Cxd.js +19757 -0
  26. package/dist/{menu.dto-DAh1J2ES.js → menu.dto-C_B3M2fs.js} +7390 -7134
  27. package/dist/package/entity/incoming-order/incoming-order.do.d.ts +22443 -3
  28. package/dist/package/entity/incoming-order/incoming-order.dto.d.ts +3 -3
  29. package/dist/package/entity/incoming-order/incoming-order.enum.d.ts +1 -1
  30. package/dist/package/entity/index.d.ts +6 -0
  31. package/dist/package/entity/marketing/marketing.dto.d.ts +1 -1
  32. package/dist/package/entity/order/dine-in/qr.dto.d.ts +38 -0
  33. package/dist/package/entity/order/order.do.d.ts +6358 -2
  34. package/dist/package/entity/order/order.dto.d.ts +22 -0
  35. package/dist/package/entity/order-platform/deliveroo/deliveroo-dto.d.ts +3 -0
  36. package/dist/package/entity/order-platform/deliveroo/deliveroo-setting.do.d.ts +3 -0
  37. package/dist/package/entity/order-platform/external/order/external-order.do.d.ts +12 -12
  38. package/dist/package/entity/order-platform/external/order/external-order.dto.d.ts +32 -32
  39. package/dist/package/entity/order-platform/external/setting/external-setting.do.d.ts +21 -3
  40. package/dist/package/entity/order-platform/external/setting/external-setting.dto.d.ts +12 -2
  41. package/dist/package/entity/order-platform/foodpanda/foodpanda-settings.do.d.ts +3 -0
  42. package/dist/package/entity/order-platform/foodpanda/foodpanda-settings.dto.d.ts +3 -0
  43. package/dist/package/entity/order-platform/grabfood/grabfood-edit-order.do.d.ts +9 -1
  44. package/dist/package/entity/order-platform/grabfood/grabfood-settings.do.d.ts +2 -2
  45. package/dist/package/entity/order-platform/grabfood/grabfood.dto.d.ts +3 -3
  46. package/dist/package/entity/order-platform/order-platform.dto.d.ts +2 -2
  47. package/dist/package/entity/order-platform/shopeefood/shopeefood-settings.do.d.ts +3 -0
  48. package/dist/package/entity/order-platform/shopeefood/shopeefood-settings.dto.d.ts +3 -0
  49. package/dist/package/entity/order-setting/order-setting.do.d.ts +864 -0
  50. package/dist/package/entity/order-setting/order-setting.dto.d.ts +6 -0
  51. package/dist/package/entity/order-setting/reservationV2/reservation.do.d.ts +1269 -0
  52. package/dist/package/entity/queue/queue.do.d.ts +3 -8
  53. package/dist/package/entity/queue/queue.dto.d.ts +10 -0
  54. package/dist/package/entity/reservation/reservation.do.d.ts +105 -0
  55. package/dist/package/entity/reservation/reservation.dto.d.ts +335 -0
  56. package/dist/package/entity/reservation/reservation.enum.d.ts +3 -0
  57. package/dist/package/entity/reservation/reservation.utils.d.ts +152 -0
  58. package/dist/style.css +1 -0
  59. package/package.json +1 -1
  60. package/src/api/reservation/index.ts +28 -0
  61. package/src/assets/images/not-found.png +0 -0
  62. package/src/locales/en-US.json +56 -0
  63. package/src/locales/th-TH.json +54 -0
  64. package/src/locales/zh-CN.json +54 -0
  65. package/src/views/kiosk/KioskSummary.vue +3 -0
  66. package/src/views/kiosk/settings/KioskPaymentTypeSection.vue +99 -211
  67. package/src/views/kiosk/settings/KioskSettingView.vue +43 -25
  68. package/src/views/order-settings/OrderSettingsView.vue +6 -1
  69. package/src/views/order-settings/dine-in/DineInSetting.vue +1 -0
  70. package/src/views/order-settings/dine-in/OfflinePaymentTypeDialog.vue +2 -3
  71. package/src/views/order-settings/dine-in/PaymentType.vue +151 -43
  72. package/src/views/order-settings/pickup/PaymentSidesheet.vue +33 -172
  73. package/src/views/order-settings/pickup/PickUpSettingDialogContent.vue +1 -0
  74. package/src/views/order-settings/reservation/CopySettingsSheet.vue +256 -0
  75. package/src/views/order-settings/reservation/CustomSelect.vue +99 -0
  76. package/src/views/order-settings/reservation/CustomTimePicker.vue +311 -0
  77. package/src/views/order-settings/reservation/ReservationSetting.vue +1555 -0
  78. package/tsconfig.app.json +8 -6
  79. package/dist/KioskSettingView-BE_pMA-i.js +0 -720
  80. package/dist/OrderSettingsView-BWzaITT6.js +0 -51916
  81. package/dist/frontend/mf-order/tsconfig.app.tsbuildinfo +0 -1
  82. 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="w-full max-w-[360px] max-h-[200px] object-cover rounded-md border border-fm-color-neutral-gray-200"
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="w-full max-w-[360px] max-h-[200px] object-cover rounded-md border border-fm-color-neutral-gray-200"
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
- const paymentTypes = kioskOrderSettingForm.value.paymentSetting.paymentTypes || []
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
- const updatedOfflinePaymentTypes = [newPaymentType]
44
- emits('update:offlinePaymentTypes', updatedOfflinePaymentTypes)
43
+ emits('add:offline-payment-type', newPaymentType)
45
44
  }
46
45
 
47
46
  const emits = defineEmits<{
48
- (event: 'update:offlinePaymentTypes', v: FdoOfflinePaymentMethod[]): void
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
- { label: t('order.offlinePayment'), value: 'offline' },
57
- { label: t('order.ePayment'), value: 'e-payment' }
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
- parent.value = initialValues.length === checkboxChildren.length
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
- nestedVal.value = ev ? checkboxChildren.map((item) => item.value) : []
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
- parent.value = ev.length === checkboxChildren.length
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-grow fm-typo-en-title-sm-600">{{ t('order.acceptedPayment') }}</div>
121
- <FmCheckbox value="" :model-value="parent" :label="t('order.all')"
122
- :indeterminate="nestedVal.length > 0 && nestedVal.length < checkboxChildren.length"
123
- @update:model-value="handleParentUpdate" />
124
-
125
- <div class="flex flex-row items-center">
126
- <FmCheckbox v-model="nestedVal" :label="checkboxChildren[0].label" :value="checkboxChildren[0].value"
127
- @update:model-value="handleChildUpdate" />
128
- </div>
129
- <div v-if="nestedVal.includes(checkboxChildren[0].value) && offlinePaymentTypes?.length === 0">
130
- <OfflinePaymentTypeDialog @update:offline-payment-types="(v: FdoOfflinePaymentMethod[] | undefined | null) => emits('update:offlinePaymentTypes', v)
131
- " />
132
- </div>
133
-
134
- <div v-if="nestedVal.includes('offline')">
135
- <div v-if="offlinePaymentTypes?.length === 0">
136
- <FmCard variant="outlined">
137
- <FmCardSection>{{ t('order.cash') }}</FmCardSection>
138
- </FmCard>
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
- <p v-for="(type, i) in offlinePaymentTypes" :key="i">
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>