@feedmepos/mf-order-setting 0.0.13 → 0.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/KioskSettingView-BYv2A8Xy.js +4 -0
- package/dist/{app-E2uM-UYx.js → app-vuQcAuTZ.js} +42464 -41973
- package/dist/app.js +1 -1
- package/dist/frontend/mf-order/src/main.d.ts +472 -0
- package/dist/frontend/mf-order/src/stores/order-setting/index.d.ts +12 -0
- package/dist/frontend/mf-order/src/stores/restaurant/index.d.ts +1 -0
- package/dist/frontend/mf-order/src/views/order-settings/delivery/DeliverySetting.vue.d.ts +1 -1
- package/dist/frontend/mf-order/src/views/order-settings/delivery/inhouse/InHouseDelivery.vue.d.ts +0 -8
- package/dist/frontend/mf-order/src/views/order-settings/general/GeneralSetting.vue.d.ts +2 -0
- package/dist/frontend/mf-order/src/views/order-settings/pickup/PaymentSidesheet.vue.d.ts +2 -16
- package/dist/frontend/mf-order/tsconfig.app.tsbuildinfo +1 -1
- package/dist/package/entity/booking/booking.do.d.ts +60 -1025
- package/dist/package/entity/delivery/delivery.dto.d.ts +39 -208
- package/dist/package/entity/delivery/gateway/pandago.dto.d.ts +6 -6
- package/dist/package/entity/food-court/order.dto.d.ts +1607 -13450
- package/dist/package/entity/incoming-order/incoming-order-to-bill.dto.d.ts +1413 -291
- package/dist/package/entity/incoming-order/incoming-order.do.d.ts +602 -99
- package/dist/package/entity/incoming-order/incoming-order.dto.d.ts +1182 -154
- package/dist/package/entity/kiosk/marketing/marketing.dto.d.ts +66 -875
- package/dist/package/entity/order/delivery/delivery.do.d.ts +12 -0
- package/dist/package/entity/order/menu/menu.dto.d.ts +6 -1
- package/dist/package/entity/order/order-item/order-item.dto.d.ts +847 -40
- package/dist/package/entity/order/order.do.d.ts +9 -3
- package/dist/package/entity/order/order.dto.d.ts +2639 -8399
- package/dist/package/entity/order-platform/foodpanda/foodpanda-order.dto.d.ts +12 -205
- package/dist/package/entity/order-platform/grabfood/grabfood-order.do.d.ts +12 -205
- package/dist/package/entity/order-platform/menu.dto.d.ts +48 -48
- package/dist/package/entity/order-platform/shopeefood/shopeefood-order.do.d.ts +12 -205
- package/dist/package/entity/order-setting/order-setting.do.d.ts +8 -0
- package/dist/package/entity/order-setting/order-setting.dto.d.ts +16 -0
- package/dist/package/entity/order-setting/v3/v3.do.d.ts +3 -0
- package/dist/package/entity/order-setting/v3/v3.dto.d.ts +3 -0
- package/dist/package/entity/queue/queue.do.d.ts +50 -50
- package/dist/package/entity/restaurant/restaurant.dto.d.ts +10 -0
- package/package.json +3 -2
- package/src/i18n.d.ts +11 -0
- package/src/locales/en-US.json +235 -0
- package/src/locales/zh-CN.json +235 -0
- package/src/main.ts +23 -1
- package/src/stores/restaurant/index.ts +31 -3
- package/src/stores/table-settings.ts +0 -5
- package/src/views/kiosk/KioskSummary.vue +16 -13
- package/src/views/kiosk/KioskView.vue +13 -10
- package/src/views/kiosk/devices/KioskDeviceCard.vue +10 -7
- package/src/views/kiosk/devices/KioskDevicesView.vue +6 -4
- package/src/views/kiosk/devices/KioskOtpDialog.vue +4 -1
- package/src/views/kiosk/devices/KioskUnbindConfirm.vue +3 -1
- package/src/views/kiosk/settings/KioskDineInSection.vue +4 -1
- package/src/views/kiosk/settings/KioskDisplayStandSection.vue +14 -11
- package/src/views/kiosk/settings/KioskPickAtCounterSection.vue +4 -1
- package/src/views/kiosk/settings/KioskSettingView.vue +8 -5
- package/src/views/kiosk/settings/KioskTakeawaySection.vue +4 -1
- package/src/views/order-settings/OrderSettingsView.vue +13 -7
- package/src/views/order-settings/components/RestaurantSelector.vue +5 -2
- package/src/views/order-settings/delivery/DeliverySetting.vue +113 -60
- package/src/views/order-settings/delivery/components/ManualIntegratedDeliverySetting.vue +11 -8
- package/src/views/order-settings/delivery/components/TaxInput.vue +1 -1
- package/src/views/order-settings/delivery/inhouse/CurrencyInput.vue +2 -2
- package/src/views/order-settings/delivery/inhouse/DeliveryCustomTime.vue +31 -0
- package/src/views/order-settings/delivery/inhouse/DeliveryOrder.vue +12 -9
- package/src/views/order-settings/delivery/inhouse/DeliveryTime.vue +9 -6
- package/src/views/order-settings/delivery/inhouse/InHouseDelivery.vue +63 -68
- package/src/views/order-settings/delivery/inhouse/TimePicker.vue +4 -1
- package/src/views/order-settings/delivery/inhouse/ZoneDialog.vue +7 -4
- package/src/views/order-settings/delivery/integrated-delivery/FeedmeDelivery.vue +38 -15
- package/src/views/order-settings/delivery/integrated-delivery/FoodpandaCampaignDialog.vue +7 -4
- package/src/views/order-settings/delivery/integrated-delivery/FoodpandaSetting.vue +7 -4
- package/src/views/order-settings/delivery/integrated-delivery/IntegratedDelivery.vue +99 -41
- package/src/views/order-settings/dinein/DineInSetting.vue +15 -12
- package/src/views/order-settings/dinein/OfflinePaymentTypeDialog.vue +9 -6
- package/src/views/order-settings/dinein/OfflinePaymentTypeDialogContent.vue +6 -3
- package/src/views/order-settings/dinein/PaymentType.vue +9 -6
- package/src/views/order-settings/general/GeneralSetting.vue +103 -0
- package/src/views/order-settings/pickup/AddressInput.vue +5 -2
- package/src/views/order-settings/pickup/CustomPayment.vue +10 -8
- package/src/views/order-settings/pickup/PaymentSidesheet.vue +114 -63
- package/src/views/order-settings/pickup/PickUpPointDialog.vue +7 -4
- package/src/views/order-settings/pickup/PickUpPointDialogContent.vue +7 -4
- package/src/views/order-settings/pickup/PickUpSetting.vue +13 -10
- package/src/views/order-settings/pickup/PickUpSettingDialog.vue +13 -8
- package/src/views/order-settings/pickup/PickUpSettingDialogContent.vue +37 -37
- package/src/views/order-settings/pickup/Preorder.vue +10 -8
- package/src/views/order-settings/servicecharge/RateInput.vue +12 -5
- package/src/views/order-settings/servicecharge/ServiceChargeRule.vue +44 -24
- package/src/views/order-settings/servicecharge/ServiceChargeSetting.vue +16 -13
- package/src/views/order-settings/sms/SmsSetting.vue +105 -29
- package/tsconfig.app.json +3 -1
- package/tsconfig.json +2 -1
- package/tsconfig.node.json +3 -1
- package/vite.config.ts +2 -1
- package/dist/KioskSettingView-_h6R-Crz.js +0 -4
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<FmTextField
|
|
3
|
-
:model-value="rate"
|
|
4
|
-
label="
|
|
5
|
-
append-icon="percent"
|
|
6
|
-
|
|
2
|
+
<FmTextField
|
|
3
|
+
:model-value="rate"
|
|
4
|
+
:label="t('order.rate')"
|
|
5
|
+
append-icon="percent"
|
|
6
|
+
:rules="[
|
|
7
|
+
(val) => (val >= 0 && val <= 100) || 'Invalid rate (0% - 100%)',
|
|
8
|
+
]"
|
|
9
|
+
type="number"
|
|
10
|
+
@update:model-value="handleInputChange"
|
|
7
11
|
/>
|
|
8
12
|
</template>
|
|
9
13
|
|
|
@@ -11,6 +15,9 @@
|
|
|
11
15
|
import { Dinero } from '@feedmepos/core'
|
|
12
16
|
import { type PropType, computed } from 'vue'
|
|
13
17
|
import { percentToAdjustment, type AdjustmentAmount } from '@/helpers/number'
|
|
18
|
+
import { useI18n } from '@feedmepos/mf-common'
|
|
19
|
+
|
|
20
|
+
const { t } = useI18n()
|
|
14
21
|
|
|
15
22
|
const props = defineProps({
|
|
16
23
|
modelValue: {
|
|
@@ -6,6 +6,9 @@ import RateInput from './RateInput.vue'
|
|
|
6
6
|
import type { FdoServiceChargeRule, FdoTable } from '@feedmepos/core/entity'
|
|
7
7
|
import type { AdjustmentAmount } from '@/helpers/number'
|
|
8
8
|
import { F_SERVICE_CHARGE_ORDER_TYPE } from '@feedmepos/core/entity'
|
|
9
|
+
import { useI18n } from '@feedmepos/mf-common'
|
|
10
|
+
|
|
11
|
+
const { t } = useI18n()
|
|
9
12
|
|
|
10
13
|
const props = defineProps({
|
|
11
14
|
modelValue: {
|
|
@@ -44,19 +47,19 @@ const emits = defineEmits<{
|
|
|
44
47
|
}>()
|
|
45
48
|
|
|
46
49
|
const itemSelected = computed(() => {
|
|
47
|
-
if (props.isLoadingMenu) return '
|
|
48
|
-
if (!props.items.length) return '
|
|
50
|
+
if (props.isLoadingMenu) return t('order.loadingMenu')
|
|
51
|
+
if (!props.items.length) return t('order.noAvailableItem')
|
|
49
52
|
const items = props.modelValue.condition.items
|
|
50
|
-
if (!items) return '
|
|
51
|
-
return `${items.length}
|
|
53
|
+
if (!items) return t('order.all')
|
|
54
|
+
return `${items.length} ${t('order.item')}`
|
|
52
55
|
})
|
|
53
56
|
|
|
54
57
|
const tableSelected = computed(() => {
|
|
55
|
-
if (props.isLoadingTable) return '
|
|
56
|
-
if (!props.tables.length) return '
|
|
58
|
+
if (props.isLoadingTable) return t('order.loadingTable')
|
|
59
|
+
if (!props.tables.length) return t('order.noAvailableTable')
|
|
57
60
|
const tables = props.modelValue.condition.tables
|
|
58
|
-
if (!tables) return '
|
|
59
|
-
return `${tables.length}
|
|
61
|
+
if (!tables) return t('order.all')
|
|
62
|
+
return `${tables.length} ${t('order.table')}`
|
|
60
63
|
})
|
|
61
64
|
|
|
62
65
|
enum ServiceChargeOrderType {
|
|
@@ -67,9 +70,26 @@ enum ServiceChargeOrderType {
|
|
|
67
70
|
pickup = 'PICKUP'
|
|
68
71
|
}
|
|
69
72
|
|
|
73
|
+
function convertServiceChargeOrderToI18n(serviceChargeType: ServiceChargeOrderType) {
|
|
74
|
+
switch (serviceChargeType) {
|
|
75
|
+
case ServiceChargeOrderType.dineIn:
|
|
76
|
+
return t('order.dineIn')
|
|
77
|
+
case ServiceChargeOrderType.takeaway:
|
|
78
|
+
return t('order.takeaway')
|
|
79
|
+
case ServiceChargeOrderType.inHouseDelivery:
|
|
80
|
+
return t('order.deliveryTitle', {company: "In house"})
|
|
81
|
+
case ServiceChargeOrderType.deliveryCompany:
|
|
82
|
+
return t('order.deliveryCompany')
|
|
83
|
+
case ServiceChargeOrderType.pickup:
|
|
84
|
+
return t('order.pickup')
|
|
85
|
+
default:
|
|
86
|
+
return
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
70
90
|
const diningOptions = computed(() => {
|
|
71
91
|
return Object.values(ServiceChargeOrderType).map((v) => ({
|
|
72
|
-
label:
|
|
92
|
+
label: convertServiceChargeOrderToI18n(v),
|
|
73
93
|
value: v
|
|
74
94
|
}))
|
|
75
95
|
})
|
|
@@ -311,15 +331,15 @@ function initializeMenuState(items: any[]) {
|
|
|
311
331
|
<FmButton append-icon="delete" variant="tertiary" @click="emits('delete')" />
|
|
312
332
|
</div>
|
|
313
333
|
<div class="flex items-center justify-between">
|
|
314
|
-
<div class="font-semibold mb-3">
|
|
334
|
+
<div class="font-semibold mb-3">{{ t('order.selectItem') }}</div>
|
|
315
335
|
<FmButton variant="plain" :label="itemSelected" size="lg" @click="toggleSideSheet" />
|
|
316
336
|
</div>
|
|
317
337
|
|
|
318
|
-
<FmSideSheet header="
|
|
338
|
+
<FmSideSheet :header="t('order.selectItem')" :maxWidth="600" dismiss-away v-model="sideSheetItem">
|
|
319
339
|
<div>
|
|
320
340
|
<div class="text-fm-color-typo-secondary mt-5 mb-5 flex flex-row">
|
|
321
|
-
{{ props.modelValue.condition.items?.length ?? initialValue?.length }}
|
|
322
|
-
<FmSearch v-model:model-value="searchValueItem" class="ml-auto" placeholder="
|
|
341
|
+
{{ props.modelValue.condition.items?.length ?? initialValue?.length }} {{ t('order.productSelected') }}
|
|
342
|
+
<FmSearch v-model:model-value="searchValueItem" class="ml-auto" :placeholder="t('order.search')" />
|
|
323
343
|
</div>
|
|
324
344
|
|
|
325
345
|
<div v-for="(item, index) in filteredItem" :key="index" class="flex flex-col mb-6">
|
|
@@ -366,20 +386,20 @@ function initializeMenuState(items: any[]) {
|
|
|
366
386
|
</div>
|
|
367
387
|
<template #side-sheet-footer>
|
|
368
388
|
<div class="flex gap-8 items-center justify-start">
|
|
369
|
-
<FmButton variant="primary" label="
|
|
370
|
-
<FmButton variant="secondary" label="
|
|
389
|
+
<FmButton variant="primary" :label="t('order.confirm')" size="lg" @click="updateItems" />
|
|
390
|
+
<FmButton variant="secondary" :label="t('order.cancel')" size="lg" @click="sideSheetItem = false" />
|
|
371
391
|
</div>
|
|
372
392
|
</template>
|
|
373
393
|
</FmSideSheet>
|
|
374
394
|
|
|
375
395
|
<div class="flex items-center justify-between">
|
|
376
|
-
<div class="font-semibold mb-3">
|
|
396
|
+
<div class="font-semibold mb-3">{{ t('order.selectTable') }}</div>
|
|
377
397
|
<FmButton variant="plain" :label="tableSelected" size="lg" @click="toggleSideSheetTable" />
|
|
378
398
|
</div>
|
|
379
|
-
<FmSideSheet header="
|
|
399
|
+
<FmSideSheet :header="t('order.selectTable')" :maxWidth="600" dismiss-away v-model="sideSheetTable">
|
|
380
400
|
<div class="text-fm-color-typo-secondary mt-5 mb-5 flex flex-row">
|
|
381
|
-
{{ props.modelValue.condition.tables?.length ?? props.tables.length }}
|
|
382
|
-
<FmSearch v-model:model-value="searchValueTable" class="ml-auto" placeholder="
|
|
401
|
+
{{ props.modelValue.condition.tables?.length ?? props.tables.length }} {{ t('order.tableSelected') }}
|
|
402
|
+
<FmSearch v-model:model-value="searchValueTable" class="ml-auto" :placeholder="t('order.search')" />
|
|
383
403
|
</div>
|
|
384
404
|
|
|
385
405
|
<FmCard variant="outlined" class="p-5">
|
|
@@ -387,7 +407,7 @@ function initializeMenuState(items: any[]) {
|
|
|
387
407
|
<FmCheckbox
|
|
388
408
|
:value="parentTable"
|
|
389
409
|
:model-value="parentTable"
|
|
390
|
-
label="
|
|
410
|
+
:label="t('order.all')"
|
|
391
411
|
:indeterminate="
|
|
392
412
|
nestedValTable.length > 0 && nestedValTable.length < checkboxChildrenTable.length
|
|
393
413
|
"
|
|
@@ -426,17 +446,17 @@ function initializeMenuState(items: any[]) {
|
|
|
426
446
|
</FmCard>
|
|
427
447
|
<template #side-sheet-footer>
|
|
428
448
|
<div class="flex gap-8 items-center justify-start">
|
|
429
|
-
<FmButton variant="primary" label="
|
|
430
|
-
<FmButton variant="secondary" label="
|
|
449
|
+
<FmButton variant="primary" :label="t('order.confirm')" size="lg" @click="updateTable" />
|
|
450
|
+
<FmButton variant="secondary" :label="t('order.cancel')" size="lg" @click="sideSheetTable = false" />
|
|
431
451
|
</div>
|
|
432
452
|
</template>
|
|
433
453
|
</FmSideSheet>
|
|
434
454
|
|
|
435
|
-
<div>
|
|
455
|
+
<div>{{ t('order.applyFor') }}</div>
|
|
436
456
|
<div class="flex flex-col">
|
|
437
457
|
<FmCheckbox
|
|
438
458
|
v-model="parent"
|
|
439
|
-
label="
|
|
459
|
+
:label="t('order.all')"
|
|
440
460
|
value="all"
|
|
441
461
|
:indeterminate="nestedVal.length > 0 && nestedVal.length < diningOptions.length"
|
|
442
462
|
@update:model-value="handleParentUpdate"
|
|
@@ -5,31 +5,31 @@
|
|
|
5
5
|
<div v-if="!isLoading">
|
|
6
6
|
<div class="p-[1.5rem] flex flex-col gap-5">
|
|
7
7
|
<FmCard variant="outlined" class="p-5 sm:w-2/3 md:w-2/3 lg:w-1/3 xl:w-1/3">
|
|
8
|
-
<div class="flex-grow fm-typo-en-title-sm-600 mb-3">
|
|
8
|
+
<div class="flex-grow fm-typo-en-title-sm-600 mb-3">{{ t('order.enableServiceCharge') }}</div>
|
|
9
9
|
<FmSwitch v-model="data.active" value="first"
|
|
10
|
-
sublabel="
|
|
11
|
-
label="
|
|
10
|
+
:sublabel="t('order.serviceChargeSublabel')"
|
|
11
|
+
:label="t('order.serviceCharge')" label-placement="right" :disabled="!canUseServiceCharge" />
|
|
12
12
|
<div v-if="!canUseServiceCharge" class="fm-typo-en-body-md-400 text-fm-color-typo-error ml-14">
|
|
13
|
-
|
|
13
|
+
{{ t('order.serviceChargeRule') }}
|
|
14
14
|
</div>
|
|
15
15
|
|
|
16
16
|
<div class="flex flex-col gap-5 m-5" v-if="data.active">
|
|
17
|
-
<FmRadioGroup :model-value="chargeTime" label="
|
|
18
|
-
<FmRadio value="beforeDiscount" label="
|
|
19
|
-
<FmRadio value="afterDiscount" label="
|
|
17
|
+
<FmRadioGroup :model-value="chargeTime" :label="t('order.chargeWhen')" @update:model-value="updateChargeWhen">
|
|
18
|
+
<FmRadio value="beforeDiscount" :label="t('order.beforeBillDiscount')" />
|
|
19
|
+
<FmRadio value="afterDiscount" :label="t('order.afterBillDiscount')" />
|
|
20
20
|
</FmRadioGroup>
|
|
21
21
|
<RateInput :model-value="data.rate" @update:model-value="handleUpdateRate" />
|
|
22
22
|
|
|
23
|
-
<FmRadioGroup :model-value="chargeValue" label="
|
|
24
|
-
<FmRadio value="exclusive" label="
|
|
25
|
-
<FmRadio value="inclusive" label="
|
|
23
|
+
<FmRadioGroup :model-value="chargeValue" :label="t('order.selectServiceChargeType')" @update:model-value="updateInclusive">
|
|
24
|
+
<FmRadio value="exclusive" :label="t('order.exclusive')" />
|
|
25
|
+
<FmRadio value="inclusive" :label="t('order.inclusive')" />
|
|
26
26
|
</FmRadioGroup>
|
|
27
27
|
</div>
|
|
28
28
|
</FmCard>
|
|
29
29
|
</div>
|
|
30
30
|
<div v-if="data.active">
|
|
31
31
|
<div class="flex flex-col gap-5 m-5">
|
|
32
|
-
<div class="flex-grow fm-typo-en-title-sm-600 mb-3 mt-3">
|
|
32
|
+
<div class="flex-grow fm-typo-en-title-sm-600 mb-3 mt-3">{{ t('order.customServiceCharge') }}</div>
|
|
33
33
|
<div class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-5">
|
|
34
34
|
<div v-for="(rule, index) in data.rules" :key="index" class="h-full">
|
|
35
35
|
<FmCard variant="outlined">
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
<div>
|
|
46
46
|
<FmCard variant="outlined" class="flex items-center justify-center w-full h-full border-dashed">
|
|
47
47
|
<FmCardSection class="flex items-center justify-center w-full">
|
|
48
|
-
<FmButton variant="plain" label="
|
|
48
|
+
<FmButton variant="plain" :label="t('order.addServiceCharge')" icon="add" @click="createRule"
|
|
49
49
|
class="border fm-corner-radius-lg border-fm-color-primary" />
|
|
50
50
|
</FmCardSection>
|
|
51
51
|
</FmCard>
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
</div>
|
|
55
55
|
</div>
|
|
56
56
|
<div class="fm-corner-radius-lg flex flex-col gap-5 m-5">
|
|
57
|
-
<FmButton variant="primary" label="
|
|
57
|
+
<FmButton variant="primary" :label="t('order.saveSetting')" class="mr-auto" @click="updateServiceChargeSetting" />
|
|
58
58
|
</div>
|
|
59
59
|
</div>
|
|
60
60
|
<FmCircularProgress size="xxl" v-else />
|
|
@@ -78,6 +78,9 @@ import { percentToAdjustment, type AdjustmentAmount } from '@/helpers/number'
|
|
|
78
78
|
import { useTableSettingStore } from '@/stores/table-settings'
|
|
79
79
|
import ServiceChargeRule from './ServiceChargeRule.vue'
|
|
80
80
|
import { Pos } from '@feedmepos/core'
|
|
81
|
+
import { useI18n } from '@feedmepos/mf-common'
|
|
82
|
+
|
|
83
|
+
const { t } = useI18n()
|
|
81
84
|
|
|
82
85
|
const isLoadingMenu = ref(false)
|
|
83
86
|
const isBeforeDiscountBoolean = computed(() => {
|
|
@@ -2,12 +2,23 @@
|
|
|
2
2
|
import { ref, watch, onMounted, computed } from 'vue'
|
|
3
3
|
import { OrderSettingApi, smsApi } from '@/api/order-setting'
|
|
4
4
|
import { useLoading } from '@/composables/loading'
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
F_ORDER_DINE_IN_TYPE,
|
|
7
|
+
F_ORDER_TYPE,
|
|
8
|
+
F_SMS_ACTION,
|
|
9
|
+
F_SMS_KEY,
|
|
10
|
+
type OrderSettingsDto,
|
|
11
|
+
type OrderSmsSettingDto
|
|
12
|
+
} from '@entity'
|
|
6
13
|
import RestaurantSelector from '../components/RestaurantSelector.vue'
|
|
7
14
|
|
|
8
15
|
import { useCoreStore } from '@feedmepos/mf-common'
|
|
9
16
|
import { Dinero } from '@feedmepos/core'
|
|
10
17
|
import { useSnackbarFunctions } from '@/components/snackbar'
|
|
18
|
+
import { useI18n } from '@feedmepos/mf-common'
|
|
19
|
+
|
|
20
|
+
const { t } = useI18n()
|
|
21
|
+
import { SMS } from '@common'
|
|
11
22
|
|
|
12
23
|
const { showSuccess, showError } = useSnackbarFunctions()
|
|
13
24
|
const { currentRestaurant } = useCoreStore()
|
|
@@ -19,8 +30,6 @@ const orderSmsSettings = ref<OrderSmsSettingDto[]>(initOrderSmsSettings())
|
|
|
19
30
|
const smsCredit = ref()
|
|
20
31
|
|
|
21
32
|
const editing = ref<number | undefined>(undefined)
|
|
22
|
-
const showTextField = ref<boolean[]>(orderSmsSettings.value.map(() => false))
|
|
23
|
-
const inputValues = ref<string[]>(orderSmsSettings.value.map((sms) => sms.message.raw))
|
|
24
33
|
|
|
25
34
|
onMounted(() => {
|
|
26
35
|
init()
|
|
@@ -34,6 +43,25 @@ watch(
|
|
|
34
43
|
{ immediate: true }
|
|
35
44
|
)
|
|
36
45
|
|
|
46
|
+
const editingOptionKeys = computed(() => {
|
|
47
|
+
if (editing.value != undefined) {
|
|
48
|
+
const setting = orderSmsSettings.value[editing.value]
|
|
49
|
+
return SMS.readKeyByType(setting.type).map((e, i) => ({ label: e, value: e }))
|
|
50
|
+
} else return []
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
const messageKeys = computed(() => {
|
|
54
|
+
if (editing.value != undefined) {
|
|
55
|
+
const rawMessage = orderSmsSettings.value[editing.value].message.raw ?? ''
|
|
56
|
+
|
|
57
|
+
return [
|
|
58
|
+
...new Set(
|
|
59
|
+
(rawMessage.match(/{{(.*?)}}/g) ?? []).map((e) => e.replace(/{/g, '').replace(/}/g, ''))
|
|
60
|
+
)
|
|
61
|
+
]
|
|
62
|
+
} else return []
|
|
63
|
+
})
|
|
64
|
+
|
|
37
65
|
async function readOrderSetting(): Promise<OrderSettingsDto> {
|
|
38
66
|
return await startAsyncCallWithErr(async () => {
|
|
39
67
|
return await OrderSettingApi.getOrderSetting()
|
|
@@ -82,26 +110,30 @@ async function init() {
|
|
|
82
110
|
|
|
83
111
|
function processEditing(index?: number) {
|
|
84
112
|
editing.value = index
|
|
85
|
-
if (index !== undefined) {
|
|
86
|
-
inputValues.value[index] = orderSmsSettings.value[index].message.raw
|
|
87
|
-
}
|
|
88
113
|
}
|
|
89
114
|
|
|
90
|
-
function confirmTextField(index: number) {
|
|
115
|
+
async function confirmTextField(index: number) {
|
|
91
116
|
if (index !== undefined) {
|
|
92
|
-
|
|
93
|
-
updateOrderSetting()
|
|
94
|
-
showTextField.value[index] = false
|
|
117
|
+
await updateOrderSetting()
|
|
95
118
|
}
|
|
96
119
|
}
|
|
97
120
|
|
|
98
|
-
function
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
121
|
+
function updateRawMessage(rawMessage: string, index: number) {
|
|
122
|
+
const settings = [...orderSmsSettings.value]
|
|
123
|
+
settings[index].message.raw = rawMessage
|
|
124
|
+
|
|
125
|
+
orderSmsSettings.value = settings
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function updateMessageKey(messageKey: string, option: string, index: number) {
|
|
129
|
+
const settings = [...orderSmsSettings.value]
|
|
130
|
+
settings[index].message.keys[messageKey] = F_SMS_KEY.parse(option)
|
|
131
|
+
|
|
132
|
+
orderSmsSettings.value = settings
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function isEditing(index: number) {
|
|
136
|
+
return editing.value === index
|
|
105
137
|
}
|
|
106
138
|
|
|
107
139
|
function initOrderSmsSettings() {
|
|
@@ -120,6 +152,26 @@ function initOrderSmsSettings() {
|
|
|
120
152
|
}
|
|
121
153
|
]
|
|
122
154
|
}
|
|
155
|
+
|
|
156
|
+
function convertTypeI18n(type: F_ORDER_TYPE | F_ORDER_DINE_IN_TYPE) {
|
|
157
|
+
switch (type) {
|
|
158
|
+
case F_ORDER_TYPE.enum.PICKUP:
|
|
159
|
+
return t('order.pickup')
|
|
160
|
+
default:
|
|
161
|
+
return ''
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function convertActionI18n(action: F_SMS_ACTION) {
|
|
166
|
+
switch (action) {
|
|
167
|
+
case F_SMS_ACTION.Enum.ACCEPT:
|
|
168
|
+
return t('order.accept')
|
|
169
|
+
case F_SMS_ACTION.Enum.SERVE:
|
|
170
|
+
return t('order.serve')
|
|
171
|
+
default:
|
|
172
|
+
throw new Error('convertActionI18n - Invalid action')
|
|
173
|
+
}
|
|
174
|
+
}
|
|
123
175
|
</script>
|
|
124
176
|
|
|
125
177
|
<template>
|
|
@@ -130,33 +182,57 @@ function initOrderSmsSettings() {
|
|
|
130
182
|
<div v-else>
|
|
131
183
|
<FmCard variant="outlined" class="p-5 m-5 w-2/3">
|
|
132
184
|
<div class="flex flex-col gap-">
|
|
133
|
-
<div class="flex-grow fm-typo-en-title-sm-600 mb-5">
|
|
185
|
+
<div class="flex-grow fm-typo-en-title-sm-600 mb-5">{{ t('order.credit') }}</div>
|
|
134
186
|
|
|
135
|
-
<span class="text-fm-color-neutral-gray-400">
|
|
187
|
+
<span class="text-fm-color-neutral-gray-400">{{ t('order.balance') }}</span>
|
|
136
188
|
<span class="font-bold">{{ Dinero.fromFdoDinero(smsCredit?.balance).toFormat(true) }}</span>
|
|
137
189
|
|
|
138
|
-
<span class="text-fm-color-neutral-gray-400">
|
|
190
|
+
<span class="text-fm-color-neutral-gray-400">{{ t('order.pricePerMessage') }}</span>
|
|
139
191
|
<span class="font-bold">{{
|
|
140
192
|
Dinero.fromFdoDinero(smsCredit?.pricePerMessage).toFormat(true)
|
|
141
|
-
|
|
193
|
+
}}</span>
|
|
142
194
|
</div>
|
|
143
195
|
</FmCard>
|
|
144
196
|
|
|
145
197
|
<FmCard variant="outlined" class="p-5 m-5 w-2/3">
|
|
146
198
|
<div class="flex flex-col gap-5">
|
|
147
|
-
<div class="flex-grow fm-typo-en-title-sm-600">
|
|
199
|
+
<div class="flex-grow fm-typo-en-title-sm-600">{{ t('order.setting') }}</div>
|
|
148
200
|
<div v-for="(sms, i) in orderSmsSettings" :key="i">
|
|
149
|
-
<FmSwitch
|
|
150
|
-
:
|
|
201
|
+
<FmSwitch
|
|
202
|
+
:model-value="sms.enable"
|
|
203
|
+
@update:model-value="(v: boolean) => toggleEnable(v, sms)"
|
|
204
|
+
:label="`${convertTypeI18n(sms.type).toUpperCase()} - ${convertActionI18n(sms.action).toUpperCase()}`"
|
|
205
|
+
:sublabel="sms.message.raw"
|
|
206
|
+
label-placement="right"
|
|
207
|
+
/>
|
|
151
208
|
<div class="mb-12"></div>
|
|
152
209
|
|
|
153
|
-
<div v-if="
|
|
154
|
-
<FmTextField
|
|
210
|
+
<div v-if="isEditing(i)">
|
|
211
|
+
<FmTextField
|
|
212
|
+
:model-value="orderSmsSettings[i].message.raw"
|
|
213
|
+
@update:model-value="(message: string) => updateRawMessage(message, i)"
|
|
214
|
+
/>
|
|
155
215
|
<div class="mb-12"></div>
|
|
216
|
+
<div v-for="(messageKey, index) of messageKeys" :key="index" class="row q-py-xs">
|
|
217
|
+
<div class="my-2 col self-center flex flex-row justify-between">
|
|
218
|
+
<div class="col self-center">{{ index + 1 }}. {{ messageKey }}</div>
|
|
219
|
+
<FmSelect
|
|
220
|
+
class="w-1/2"
|
|
221
|
+
:items="editingOptionKeys"
|
|
222
|
+
:model-value="orderSmsSettings[i].message.keys[messageKey]"
|
|
223
|
+
@update:model-value="(value: string) => updateMessageKey(messageKey, value, i)"
|
|
224
|
+
/>
|
|
225
|
+
</div>
|
|
226
|
+
</div>
|
|
156
227
|
</div>
|
|
157
|
-
<FmButton
|
|
158
|
-
|
|
159
|
-
|
|
228
|
+
<FmButton
|
|
229
|
+
variant="secondary"
|
|
230
|
+
text-color="primary"
|
|
231
|
+
border-color="primary"
|
|
232
|
+
:label="isEditing(i) ? t('order.confirm') : t('order.edit')"
|
|
233
|
+
:icon="isEditing(i) ? '' : 'edit'"
|
|
234
|
+
@click="isEditing(i) ? confirmTextField(i) : processEditing(i)"
|
|
235
|
+
/>
|
|
160
236
|
<div class="mb-12"></div>
|
|
161
237
|
</div>
|
|
162
238
|
</div>
|
package/tsconfig.app.json
CHANGED
|
@@ -5,12 +5,14 @@
|
|
|
5
5
|
"src/**/*",
|
|
6
6
|
"src/**/*.vue",
|
|
7
7
|
"../../package/entity/**/*",
|
|
8
|
-
"../../common/**/*"
|
|
8
|
+
"../../common/**/*",
|
|
9
|
+
"src/**/*.json"
|
|
9
10
|
],
|
|
10
11
|
"exclude": ["src/**/__tests__/*"],
|
|
11
12
|
"compilerOptions": {
|
|
12
13
|
"rootDir": "./../..",
|
|
13
14
|
"composite": true,
|
|
15
|
+
"resolveJsonModule": true,
|
|
14
16
|
"baseUrl": ".",
|
|
15
17
|
"isolatedModules": true,
|
|
16
18
|
"types": ["googlemaps"],
|
package/tsconfig.json
CHANGED
package/tsconfig.node.json
CHANGED
|
@@ -5,10 +5,12 @@
|
|
|
5
5
|
"vitest.config.*",
|
|
6
6
|
"cypress.config.*",
|
|
7
7
|
"nightwatch.conf.*",
|
|
8
|
-
"playwright.config.*"
|
|
8
|
+
"playwright.config.*",
|
|
9
|
+
"src/**/*.json"
|
|
9
10
|
],
|
|
10
11
|
"compilerOptions": {
|
|
11
12
|
"composite": true,
|
|
13
|
+
"resolveJsonModule": true,
|
|
12
14
|
"module": "ESNext",
|
|
13
15
|
"moduleResolution": "Bundler",
|
|
14
16
|
"types": ["node"]
|
package/vite.config.ts
CHANGED
|
@@ -12,7 +12,8 @@ export default defineConfig((env) => {
|
|
|
12
12
|
preserveSymlinks: true,
|
|
13
13
|
alias: {
|
|
14
14
|
'@': fileURLToPath(new URL('./src', import.meta.url)),
|
|
15
|
-
'@entity': fileURLToPath(new URL('./../../package/entity', import.meta.url))
|
|
15
|
+
'@entity': fileURLToPath(new URL('./../../package/entity', import.meta.url)),
|
|
16
|
+
'@common': fileURLToPath(new URL('./../../common', import.meta.url))
|
|
16
17
|
}
|
|
17
18
|
},
|
|
18
19
|
define: {
|