@feedmepos/mf-order-setting 0.0.52-dev.1 → 0.0.52-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 -1
- package/dist/{OrderSettingsView-DzbdDgEN.js → OrderSettingsView-DYWlafIW.js} +6108 -6009
- package/dist/{app-CpFcQuAa.js → app-DDFI8Stx.js} +1 -1
- package/dist/app.js +1 -1
- package/dist/frontend/mf-order/src/views/order-settings/reservation/CustomTimePicker.vue.d.ts +1 -0
- package/dist/style.css +1 -1
- package/package.json +1 -1
- package/src/views/order-settings/reservation/CopySettingsSheet.vue +24 -6
- package/src/views/order-settings/reservation/CustomTimePicker.vue +32 -1
- package/src/views/order-settings/reservation/ReservationSetting.vue +51 -29
|
@@ -3121,7 +3121,7 @@ const E = { class: "flex-1 overflow-auto" }, H = /* @__PURE__ */ b({
|
|
|
3121
3121
|
{
|
|
3122
3122
|
path: u.OrderSettingView,
|
|
3123
3123
|
name: "Order Setting View",
|
|
3124
|
-
component: () => import("./OrderSettingsView-
|
|
3124
|
+
component: () => import("./OrderSettingsView-DYWlafIW.js")
|
|
3125
3125
|
}
|
|
3126
3126
|
], j = {
|
|
3127
3127
|
"en-US": C,
|
package/dist/app.js
CHANGED
package/dist/frontend/mf-order/src/views/order-settings/reservation/CustomTimePicker.vue.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
type __VLS_Props = {
|
|
2
2
|
modelValue: string;
|
|
3
3
|
minTime?: string;
|
|
4
|
+
isEndTime?: boolean;
|
|
4
5
|
};
|
|
5
6
|
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
6
7
|
"update:modelValue": (value: string) => any;
|
package/dist/style.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.scrollbar-thin[data-v-
|
|
1
|
+
.scrollbar-thin[data-v-cf197fa9]::-webkit-scrollbar{width:6px}.scrollbar-thin[data-v-cf197fa9]::-webkit-scrollbar-track{background:transparent;border-radius:3px;margin:4px 0}.scrollbar-thin[data-v-cf197fa9]::-webkit-scrollbar-thumb{background:#d1d5db;border-radius:3px}.scrollbar-thin[data-v-cf197fa9]::-webkit-scrollbar-thumb:hover{background:#9ca3af}.time-picker-field[data-v-cf197fa9] .fm-text-field-input{width:140px!important;border-width:2px;border-radius:.75rem;padding:12px 16px;font-size:1.125rem;transition:all .2s}.time-picker-field[data-v-cf197fa9] .fm-text-field-input:not(:focus):not(:focus-within){border-color:#d1d5db;background-color:#fff}.time-picker-field[data-v-cf197fa9] .fm-text-field-input:not(:focus):not(:focus-within):hover{border-color:#9ca3af}.time-picker-field.focused[data-v-cf197fa9] .fm-text-field-input,.time-picker-field[data-v-cf197fa9] .fm-text-field-input:focus,.time-picker-field[data-v-cf197fa9] .fm-text-field-input:focus-within{border-color:#f97316!important;background-color:#fff7ed!important}.fm-text-field-input[data-v-6a4bdab2]{font-size:1.125rem;line-height:1.75rem}
|
package/package.json
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
<div>
|
|
20
20
|
<div class="fm-typo-en-title-sm-600 mb-16">Configuration</div>
|
|
21
21
|
|
|
22
|
-
<div class="flex flex-col gap-12">
|
|
22
|
+
<div class="flex flex-col gap-12 pl-8">
|
|
23
23
|
<!-- All Checkbox -->
|
|
24
24
|
<FmCheckbox label="All" :model-value="isAllSelected" value="all" @update:model-value="toggleAll" />
|
|
25
25
|
|
|
@@ -52,9 +52,13 @@
|
|
|
52
52
|
</template>
|
|
53
53
|
|
|
54
54
|
<template #side-sheet-footer>
|
|
55
|
-
<div class="flex
|
|
56
|
-
<
|
|
57
|
-
|
|
55
|
+
<div class="flex flex-col gap-16 w-full">
|
|
56
|
+
<FmSnackbar variant="warning" class="!shadow-none"
|
|
57
|
+
:description="`This will overwrite all reservation settings for ${targetRestaurantName}`" />
|
|
58
|
+
<div class="flex items-center justify-start gap-8">
|
|
59
|
+
<FmButton label="Apply" @click="handleApply" :disabled="!canApply" :loading="isLoading" />
|
|
60
|
+
<FmButton label="Cancel" variant="tertiary" @click="handleCancel" />
|
|
61
|
+
</div>
|
|
58
62
|
</div>
|
|
59
63
|
</template>
|
|
60
64
|
</FmSideSheet>
|
|
@@ -62,7 +66,7 @@
|
|
|
62
66
|
|
|
63
67
|
<script setup lang="ts">
|
|
64
68
|
import { useCoreStore, useI18n } from '@feedmepos/mf-common'
|
|
65
|
-
import { computed, ref } from 'vue'
|
|
69
|
+
import { computed, ref, watch } from 'vue'
|
|
66
70
|
import { ReservationApi } from '@/api/reservation'
|
|
67
71
|
import { useSnackbarFunctions } from '@/components/snackbar'
|
|
68
72
|
import type { FdoOrderReservationSettingsV2 } from '@entity'
|
|
@@ -105,8 +109,18 @@ const availableRestaurants = computed(() => {
|
|
|
105
109
|
.map((r) => ({ label: r.profile.name, value: r._id }))
|
|
106
110
|
})
|
|
107
111
|
|
|
108
|
-
const selectedRestaurantId = ref<string>(
|
|
112
|
+
const selectedRestaurantId = ref<string>('')
|
|
109
113
|
|
|
114
|
+
// Watch to set initial value when availableRestaurants loads
|
|
115
|
+
watch(availableRestaurants, (newRestaurants) => {
|
|
116
|
+
if (newRestaurants.length > 0 && !selectedRestaurantId.value) {
|
|
117
|
+
selectedRestaurantId.value = newRestaurants[0].value
|
|
118
|
+
}
|
|
119
|
+
}, { immediate: true })
|
|
120
|
+
|
|
121
|
+
const targetRestaurantName = computed(() => {
|
|
122
|
+
return currentRestaurant.value?.profile.name ?? ''
|
|
123
|
+
})
|
|
110
124
|
|
|
111
125
|
const isAllSelected = computed(() => {
|
|
112
126
|
return Object.values(configOptions.value).every((v) => v === true)
|
|
@@ -205,6 +219,10 @@ async function handleApply() {
|
|
|
205
219
|
// Emit the updated settings to parent
|
|
206
220
|
emit('apply', updatedSettings)
|
|
207
221
|
|
|
222
|
+
// Show success with source outlet name
|
|
223
|
+
const sourceName = availableRestaurants.value.find(r => r.value === selectedRestaurantId.value)?.label ?? 'selected outlet'
|
|
224
|
+
showSuccess(`Settings from "${sourceName}" have been applied. Please review and save changes.`)
|
|
225
|
+
|
|
208
226
|
// Close the side sheet
|
|
209
227
|
showSheet.value = false
|
|
210
228
|
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import { ref, computed, onMounted, onUnmounted } from 'vue'
|
|
2
|
+
import { ref, computed, onMounted, onUnmounted, watch, nextTick } from 'vue'
|
|
3
3
|
|
|
4
4
|
const props = defineProps<{
|
|
5
5
|
modelValue: string
|
|
6
6
|
minTime?: string // Optional minimum time (HH:MM format)
|
|
7
|
+
isEndTime?: boolean // Whether this is an end time picker
|
|
7
8
|
}>()
|
|
8
9
|
|
|
9
10
|
const emit = defineEmits<{
|
|
@@ -23,6 +24,7 @@ const timeOptions = computed(() => {
|
|
|
23
24
|
options.push(timeString)
|
|
24
25
|
}
|
|
25
26
|
}
|
|
27
|
+
|
|
26
28
|
options.push('23:59')
|
|
27
29
|
|
|
28
30
|
// Filter out times earlier than minTime if provided
|
|
@@ -76,7 +78,28 @@ function handleFocus() {
|
|
|
76
78
|
|
|
77
79
|
function toggleDropdown(event?: Event) {
|
|
78
80
|
event?.stopPropagation()
|
|
81
|
+
// Close all other open dropdowns by dispatching a global event
|
|
82
|
+
if (!isOpen.value) {
|
|
83
|
+
window.dispatchEvent(new CustomEvent('closeTimePickers'))
|
|
84
|
+
}
|
|
79
85
|
isOpen.value = !isOpen.value
|
|
86
|
+
|
|
87
|
+
// Scroll to selected time when opening
|
|
88
|
+
if (isOpen.value) {
|
|
89
|
+
nextTick(() => {
|
|
90
|
+
scrollToSelectedTime()
|
|
91
|
+
})
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function scrollToSelectedTime() {
|
|
96
|
+
const scrollContainer = dropdownRef.value?.querySelector('.overflow-y-auto')
|
|
97
|
+
if (!scrollContainer) return
|
|
98
|
+
|
|
99
|
+
const selectedElement = scrollContainer.querySelector('[data-selected="true"]')
|
|
100
|
+
if (selectedElement) {
|
|
101
|
+
selectedElement.scrollIntoView({ block: 'center' })
|
|
102
|
+
}
|
|
80
103
|
}
|
|
81
104
|
|
|
82
105
|
function handleInputValue(value: string) {
|
|
@@ -97,10 +120,16 @@ function handleInputValue(value: string) {
|
|
|
97
120
|
|
|
98
121
|
onMounted(() => {
|
|
99
122
|
document.addEventListener('click', handleClickOutside)
|
|
123
|
+
window.addEventListener('closeTimePickers', () => {
|
|
124
|
+
isOpen.value = false
|
|
125
|
+
})
|
|
100
126
|
})
|
|
101
127
|
|
|
102
128
|
onUnmounted(() => {
|
|
103
129
|
document.removeEventListener('click', handleClickOutside)
|
|
130
|
+
window.removeEventListener('closeTimePickers', () => {
|
|
131
|
+
isOpen.value = false
|
|
132
|
+
})
|
|
104
133
|
})
|
|
105
134
|
</script>
|
|
106
135
|
|
|
@@ -137,6 +166,7 @@ onUnmounted(() => {
|
|
|
137
166
|
v-for="time in timeOptions"
|
|
138
167
|
:key="time"
|
|
139
168
|
@click.stop="selectTime(time)"
|
|
169
|
+
:data-selected="time === displayValue"
|
|
140
170
|
class="px-3 py-2 text-sm cursor-pointer transition-colors hover:bg-gray-50"
|
|
141
171
|
:class="{
|
|
142
172
|
'bg-orange-50 text-orange-600 font-medium': time === displayValue
|
|
@@ -172,6 +202,7 @@ onUnmounted(() => {
|
|
|
172
202
|
|
|
173
203
|
/* Override FmTextField styling for orange theme */
|
|
174
204
|
.time-picker-field :deep(.fm-text-field-input) {
|
|
205
|
+
width: 140px !important;
|
|
175
206
|
border-width: 2px;
|
|
176
207
|
border-radius: 0.75rem;
|
|
177
208
|
padding: 12px 16px;
|
|
@@ -25,10 +25,13 @@ import notfound from '@/assets/images/not-found.png'
|
|
|
25
25
|
|
|
26
26
|
const { t } = useI18n()
|
|
27
27
|
const { showSuccess } = useSnackbarFunctions()
|
|
28
|
-
const { currentRestaurant } = useCoreStore()
|
|
28
|
+
const { currentRestaurant, restaurants } = useCoreStore()
|
|
29
29
|
const { isLoading, startAsyncCallWithErr } = useLoading()
|
|
30
30
|
const dialog = useDialog()
|
|
31
31
|
|
|
32
|
+
// Check if multi-outlet
|
|
33
|
+
const isMultiOutlet = computed(() => (restaurants.value?.length ?? 0) > 1)
|
|
34
|
+
|
|
32
35
|
// Helper function to generate unique IDs and names for reservation ranges
|
|
33
36
|
const generateRangeDefaults = (index = 0) => ({
|
|
34
37
|
_id: new Date().toISOString() + '-' + index, // Add index to ensure uniqueness
|
|
@@ -55,7 +58,7 @@ const reservationSettings = ref<FdoOrderReservationSettingsV2>({
|
|
|
55
58
|
{
|
|
56
59
|
...generateRangeDefaults(0),
|
|
57
60
|
enable: false,
|
|
58
|
-
bookingDuration:
|
|
61
|
+
bookingDuration: 90,
|
|
59
62
|
enablePreorder: true,
|
|
60
63
|
minLeadDuration: {
|
|
61
64
|
value: 0,
|
|
@@ -112,8 +115,8 @@ const reservationSettings = ref<FdoOrderReservationSettingsV2>({
|
|
|
112
115
|
|
|
113
116
|
const rangeSetting = ref<FdoReservationRange>({
|
|
114
117
|
...generateRangeDefaults(0),
|
|
115
|
-
enable:
|
|
116
|
-
bookingDuration:
|
|
118
|
+
enable: false,
|
|
119
|
+
bookingDuration: 90,
|
|
117
120
|
enablePreorder: true,
|
|
118
121
|
minLeadDuration: {
|
|
119
122
|
value: 0,
|
|
@@ -540,7 +543,7 @@ function addPreference() {
|
|
|
540
543
|
rangeSetting.value.preferences.push({
|
|
541
544
|
name: '',
|
|
542
545
|
type: 'radio',
|
|
543
|
-
options: [
|
|
546
|
+
options: []
|
|
544
547
|
})
|
|
545
548
|
}
|
|
546
549
|
|
|
@@ -681,8 +684,6 @@ function handleCopySettings(copiedSettings: Partial<FdoOrderReservationSettingsV
|
|
|
681
684
|
|
|
682
685
|
// Reset custom mode when copying settings - let computed property determine state
|
|
683
686
|
isCustomMode.value = false
|
|
684
|
-
|
|
685
|
-
showSuccess('Settings copied successfully. Please review and save changes.')
|
|
686
687
|
}
|
|
687
688
|
</script>
|
|
688
689
|
|
|
@@ -691,7 +692,7 @@ function handleCopySettings(copiedSettings: Partial<FdoOrderReservationSettingsV
|
|
|
691
692
|
<div v-if="isLoading" class="flex justify-center items-center min-h-[400px]">
|
|
692
693
|
<FmCircularProgress size="xxl" />
|
|
693
694
|
</div>
|
|
694
|
-
<div v-else class="p-[1.5rem] flex flex-col gap-
|
|
695
|
+
<div v-else class="p-[1.5rem] flex flex-col gap-48 w-full max-w-4xl">
|
|
695
696
|
<!-- <FmCard variant="outlined" class="p-5">
|
|
696
697
|
<div class="mb-5">
|
|
697
698
|
<FmSwitch
|
|
@@ -739,7 +740,7 @@ function handleCopySettings(copiedSettings: Partial<FdoOrderReservationSettingsV
|
|
|
739
740
|
:sublabel="'Enable this to make the outlet available for reservations. This setting does not impact walk-in dining.'"
|
|
740
741
|
:model-value="rangeSetting.enable ?? false" @update:model-value="(v: boolean) => (rangeSetting.enable = v)" />
|
|
741
742
|
|
|
742
|
-
<div class="ml-56 my-8">
|
|
743
|
+
<div v-if="rangeSetting.enable && isMultiOutlet" class="ml-56 my-8">
|
|
743
744
|
<CopySettingsSheet :current-settings="reservationSettings" @apply="handleCopySettings" />
|
|
744
745
|
</div>
|
|
745
746
|
</div>
|
|
@@ -752,10 +753,16 @@ function handleCopySettings(copiedSettings: Partial<FdoOrderReservationSettingsV
|
|
|
752
753
|
</div>
|
|
753
754
|
<FmCard variant="outlined" class="p-5">
|
|
754
755
|
<div class="mb-5">
|
|
756
|
+
<div class="mb-8 fm-typo-en-body-md-600 flex items-center gap-8">
|
|
757
|
+
{{ t('order.draftHoldTimeMinutes') }}
|
|
758
|
+
<FmTooltip :content="'The amount of time a reservation is held before it is automatically released.'">
|
|
759
|
+
<FmIcon name="info" outline size="sm" class="cursor-pointer" />
|
|
760
|
+
</FmTooltip>
|
|
761
|
+
</div>
|
|
755
762
|
<FmTextField type="number" :model-value="reservationSettings.draftHoldTimeMinutes" @update:model-value="
|
|
756
763
|
(v: string | number) =>
|
|
757
764
|
updateSetting('draftHoldTimeMinutes', v === '' ? 15 : Number(v))
|
|
758
|
-
"
|
|
765
|
+
" suffix="minutes"
|
|
759
766
|
class="max-w-md" />
|
|
760
767
|
</div>
|
|
761
768
|
<div class="mb-5">
|
|
@@ -867,11 +874,11 @@ function handleCopySettings(copiedSettings: Partial<FdoOrderReservationSettingsV
|
|
|
867
874
|
|
|
868
875
|
<div class="flex flex-col">
|
|
869
876
|
<div class="flex-grow fm-typo-en-title-sm-600 mb-4">
|
|
870
|
-
|
|
877
|
+
Time Settings
|
|
871
878
|
</div>
|
|
872
879
|
<div class="fm-typo-en-body-lg-400 text-fm-color-typo-secondary mb-12">
|
|
873
|
-
|
|
874
|
-
|
|
880
|
+
Choose the start and end time for reservations, and the interval between each time slot.
|
|
881
|
+
Available time slots will be generated automatically.
|
|
875
882
|
</div>
|
|
876
883
|
|
|
877
884
|
<!-- Operating hour setting -->
|
|
@@ -884,7 +891,7 @@ function handleCopySettings(copiedSettings: Partial<FdoOrderReservationSettingsV
|
|
|
884
891
|
Open / Closed
|
|
885
892
|
</div>
|
|
886
893
|
<div class="p-12 fm-typo-en-body-md-600 text-fm-color-typo-secondary bg-fm-color-neutral-gray-100">
|
|
887
|
-
|
|
894
|
+
Reservation Time Range
|
|
888
895
|
</div>
|
|
889
896
|
<template v-for="day in [1, 2, 3, 4, 5, 6, 0] as const" :key="day">
|
|
890
897
|
<div class="fm-typo-en-body-md-400 py-12 px-12">
|
|
@@ -917,7 +924,7 @@ function handleCopySettings(copiedSettings: Partial<FdoOrderReservationSettingsV
|
|
|
917
924
|
<CustomTimePicker v-model="hour.start" :min-time="hours.hours[hi - 1]?.end ?? '00:00'"
|
|
918
925
|
class="grow" />
|
|
919
926
|
<div class="text-center w-16 flex-shrink-0">to</div>
|
|
920
|
-
<CustomTimePicker v-model="hour.end" :min-time="hour.start" class="grow" />
|
|
927
|
+
<CustomTimePicker v-model="hour.end" :min-time="hour.start" :is-end-time="true" class="grow" />
|
|
921
928
|
</div>
|
|
922
929
|
<div class="mr-8 w-32 flex-shrink">
|
|
923
930
|
<FmButton variant="plain" icon="add" v-if="hi == 0" :disabled="hours.hours.length >= 2"
|
|
@@ -942,7 +949,12 @@ function handleCopySettings(copiedSettings: Partial<FdoOrderReservationSettingsV
|
|
|
942
949
|
<FmCard variant="outlined" class="grid grid-cols-[1fr_2fr]">
|
|
943
950
|
<div class="border-r py-[24px] px-16">
|
|
944
951
|
<div class="mb-24">
|
|
945
|
-
<div class="mb-8 fm-typo-en-body-lg-600">
|
|
952
|
+
<div class="mb-8 fm-typo-en-body-lg-600 flex items-center gap-8">
|
|
953
|
+
Time Interval
|
|
954
|
+
<FmTooltip :content="'How often guests can start a reservation'">
|
|
955
|
+
<FmIcon name="info" outline size="sm" class="cursor-pointer" />
|
|
956
|
+
</FmTooltip>
|
|
957
|
+
</div>
|
|
946
958
|
<FmRadioGroup :model-value="rangeSetting.slotInterval"
|
|
947
959
|
@update:model-value="(v: number) => updateSlotInterval(v)">
|
|
948
960
|
<FmRadio label="15 min" :value="15" />
|
|
@@ -954,7 +966,12 @@ function handleCopySettings(copiedSettings: Partial<FdoOrderReservationSettingsV
|
|
|
954
966
|
</div>
|
|
955
967
|
|
|
956
968
|
<div class="mb-24">
|
|
957
|
-
<div class="mb-8 fm-typo-en-body-lg-600">
|
|
969
|
+
<div class="mb-8 fm-typo-en-body-lg-600 flex items-center gap-8">
|
|
970
|
+
Dining Duration
|
|
971
|
+
<FmTooltip :content="'How long a table is reserved for each booking'">
|
|
972
|
+
<FmIcon name="info" outline size="sm" class="cursor-pointer" />
|
|
973
|
+
</FmTooltip>
|
|
974
|
+
</div>
|
|
958
975
|
<FmRadioGroup :model-value="rangeSetting.bookingDuration"
|
|
959
976
|
@update:model-value="(v: number) => updateBookingDuration(v)">
|
|
960
977
|
<FmRadio label="60 min" :value="60" />
|
|
@@ -982,7 +999,7 @@ function handleCopySettings(copiedSettings: Partial<FdoOrderReservationSettingsV
|
|
|
982
999
|
</div>
|
|
983
1000
|
|
|
984
1001
|
<template v-if="availableSlots.morning.length > 0">
|
|
985
|
-
<div class="fm-typo-en-body-md-600">Morning</div>
|
|
1002
|
+
<div class="fm-typo-en-body-md-600 text-[#4B4B4B]">Morning</div>
|
|
986
1003
|
<div class="grid grid-cols-5 gap-8">
|
|
987
1004
|
<div v-for="slot in displayedSlots.morning" :key="slot.time"
|
|
988
1005
|
class="border-1 rounded-md text-center p-8 transition-colors" :class="{
|
|
@@ -1000,7 +1017,7 @@ function handleCopySettings(copiedSettings: Partial<FdoOrderReservationSettingsV
|
|
|
1000
1017
|
</template>
|
|
1001
1018
|
|
|
1002
1019
|
<template v-if="availableSlots.afternoon.length > 0">
|
|
1003
|
-
<div class="fm-typo-en-body-md-600">Afternoon</div>
|
|
1020
|
+
<div class="fm-typo-en-body-md-600 text-[#4B4B4B]">Afternoon</div>
|
|
1004
1021
|
<div class="grid grid-cols-5 gap-8">
|
|
1005
1022
|
<div v-for="slot in displayedSlots.afternoon" :key="slot.time"
|
|
1006
1023
|
class="border-1 rounded-md text-center p-8 transition-colors" :class="{
|
|
@@ -1018,7 +1035,7 @@ function handleCopySettings(copiedSettings: Partial<FdoOrderReservationSettingsV
|
|
|
1018
1035
|
</template>
|
|
1019
1036
|
|
|
1020
1037
|
<template v-if="availableSlots.evening.length > 0">
|
|
1021
|
-
<div class="fm-typo-en-body-md-600">Evening</div>
|
|
1038
|
+
<div class="fm-typo-en-body-md-600 text-[#4B4B4B]">Evening</div>
|
|
1022
1039
|
<div class="grid grid-cols-5 gap-8">
|
|
1023
1040
|
<div v-for="slot in displayedSlots.evening" :key="slot.time"
|
|
1024
1041
|
class="border-1 rounded-md text-center p-8 transition-colors" :class="{
|
|
@@ -1049,10 +1066,10 @@ function handleCopySettings(copiedSettings: Partial<FdoOrderReservationSettingsV
|
|
|
1049
1066
|
|
|
1050
1067
|
<div class="flex flex-col">
|
|
1051
1068
|
<div class="flex-grow fm-typo-en-title-sm-600 mb-4">
|
|
1052
|
-
|
|
1069
|
+
Table Capacity Settings
|
|
1053
1070
|
</div>
|
|
1054
1071
|
<div class="fm-typo-en-body-lg-400 text-fm-color-typo-secondary mb-24">
|
|
1055
|
-
Set
|
|
1072
|
+
Set how many tables are available for reservation per time slot. You can reduce availability to keep tables for walk-ins.
|
|
1056
1073
|
</div>
|
|
1057
1074
|
|
|
1058
1075
|
<!-- Table Capacity Settings -->
|
|
@@ -1060,21 +1077,26 @@ function handleCopySettings(copiedSettings: Partial<FdoOrderReservationSettingsV
|
|
|
1060
1077
|
<div class="grid grid-cols-[4fr_4fr_4fr_1fr]">
|
|
1061
1078
|
<div class="bg-fm-color-neutral-gray-100 p-12">Table Type</div>
|
|
1062
1079
|
<div class="bg-fm-color-neutral-gray-100 p-12">Guest Range</div>
|
|
1063
|
-
<div class="bg-fm-color-neutral-gray-100 p-12
|
|
1080
|
+
<div class="bg-fm-color-neutral-gray-100 p-12 flex items-center gap-4">
|
|
1081
|
+
Available Table Count
|
|
1082
|
+
<FmTooltip :content="'Adjust how many tables can be booked for each time slot'">
|
|
1083
|
+
<FmIcon name="info" outline size="sm" class="cursor-pointer" />
|
|
1084
|
+
</FmTooltip>
|
|
1085
|
+
</div>
|
|
1064
1086
|
<div class="bg-fm-color-neutral-gray-100 p-12"></div>
|
|
1065
1087
|
</div>
|
|
1066
1088
|
<div class="grid grid-cols-[4fr_4fr_4fr_1fr] items-center gap-8" v-for="tier in rangeSetting.capacityTiers"
|
|
1067
1089
|
:key="tier._id">
|
|
1068
1090
|
<div class="p-8">{{ tier.minPax }}{{ tier.maxPax ? `-${tier.maxPax}` : '+' }} pax</div>
|
|
1069
1091
|
<div class="flex items-center gap-4">
|
|
1070
|
-
<FmStepperField v-model="tier.minPax" />
|
|
1092
|
+
<FmStepperField v-model="tier.minPax" :min="1" />
|
|
1071
1093
|
<div>to</div>
|
|
1072
|
-
<FmStepperField :model-value="tier.maxPax ?? null" @update:model-value="(v) => (tier.maxPax = v)" />
|
|
1094
|
+
<FmStepperField :model-value="tier.maxPax ?? null" @update:model-value="(v) => (tier.maxPax = v)" :min="tier.minPax" />
|
|
1073
1095
|
</div>
|
|
1074
1096
|
<div class="flex items-center gap-8">
|
|
1075
|
-
<FmButton variant="tertiary" icon="remove" @click="tier.capacity--" :disabled="tier.capacity <= 1" />
|
|
1097
|
+
<FmButton variant="tertiary" icon="remove" @click="tier.capacity--" :disabled="tier.capacity <= 1" class="!rounded-full !w-10 !h-10 !bg-fm-color-neutral-gray-100" />
|
|
1076
1098
|
<div class="w-32 text-center">{{ tier.capacity }}</div>
|
|
1077
|
-
<FmButton variant="tertiary" icon="add" @click="tier.capacity++" />
|
|
1099
|
+
<FmButton variant="tertiary" icon="add" @click="tier.capacity++" class="!rounded-full !w-10 !h-10 !bg-fm-color-neutral-gray-100" />
|
|
1078
1100
|
|
|
1079
1101
|
<!-- <FmStepperField :model-value="tier.capacity ?? null" @update:model-value="(v) => (tier.capacity = v)" /> -->
|
|
1080
1102
|
</div>
|
|
@@ -1118,7 +1140,7 @@ function handleCopySettings(copiedSettings: Partial<FdoOrderReservationSettingsV
|
|
|
1118
1140
|
{
|
|
1119
1141
|
name: '',
|
|
1120
1142
|
type: 'radio',
|
|
1121
|
-
options: [
|
|
1143
|
+
options: []
|
|
1122
1144
|
}
|
|
1123
1145
|
]
|
|
1124
1146
|
} else {
|
|
@@ -1132,7 +1154,7 @@ function handleCopySettings(copiedSettings: Partial<FdoOrderReservationSettingsV
|
|
|
1132
1154
|
<div class="fm-typo-en-body-lg-600 mb-8">Category title</div>
|
|
1133
1155
|
<div class="grid grid-cols-[6fr_3fr_1fr] items-start gap-24 mb-24">
|
|
1134
1156
|
<div>
|
|
1135
|
-
<FmTextField v-model="preference.name" />
|
|
1157
|
+
<FmTextField v-model="preference.name" placeholder="Enter a name" />
|
|
1136
1158
|
<div class="fm-typo-en-body-md-400 text-fm-color-typo-tertiary mt-8">
|
|
1137
1159
|
This title will be shown to guests during reservation.
|
|
1138
1160
|
</div>
|