@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.
@@ -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-DzbdDgEN.js")
3124
+ component: () => import("./OrderSettingsView-DYWlafIW.js")
3125
3125
  }
3126
3126
  ], j = {
3127
3127
  "en-US": C,
package/dist/app.js CHANGED
@@ -1,4 +1,4 @@
1
- import { _ as a, i as e, r as o } from "./app-CpFcQuAa.js";
1
+ import { _ as a, i as e, r as o } from "./app-DDFI8Stx.js";
2
2
  export {
3
3
  a as FmApp,
4
4
  e as i18nMessages,
@@ -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-fc459980]::-webkit-scrollbar{width:6px}.scrollbar-thin[data-v-fc459980]::-webkit-scrollbar-track{background:transparent;border-radius:3px;margin:4px 0}.scrollbar-thin[data-v-fc459980]::-webkit-scrollbar-thumb{background:#d1d5db;border-radius:3px}.scrollbar-thin[data-v-fc459980]::-webkit-scrollbar-thumb:hover{background:#9ca3af}.time-picker-field[data-v-fc459980] .fm-text-field-input{border-width:2px;border-radius:.75rem;padding:12px 16px;font-size:1.125rem;transition:all .2s}.time-picker-field[data-v-fc459980] .fm-text-field-input:not(:focus):not(:focus-within){border-color:#d1d5db;background-color:#fff}.time-picker-field[data-v-fc459980] .fm-text-field-input:not(:focus):not(:focus-within):hover{border-color:#9ca3af}.time-picker-field.focused[data-v-fc459980] .fm-text-field-input,.time-picker-field[data-v-fc459980] .fm-text-field-input:focus,.time-picker-field[data-v-fc459980] .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}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@feedmepos/mf-order-setting",
3
- "version": "0.0.52-dev.1",
3
+ "version": "0.0.52-dev.2",
4
4
  "type": "module",
5
5
  "module": "./dist/app.js",
6
6
  "license": "UNLICENSED",
@@ -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 items-center justify-start gap-8">
56
- <FmButton label="Apply" @click="handleApply" :disabled="!canApply" :loading="isLoading" />
57
- <FmButton label="Cancel" variant="tertiary" @click="handleCancel" />
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>(availableRestaurants.value[0]?.value)
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: 60,
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: true,
116
- bookingDuration: 60,
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: ['Option 1']
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-24 w-full max-w-4xl">
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
- " :label="t('order.draftHoldTimeMinutes')" suffix="minutes" :hint="t('order.draftHoldTimeDescription')"
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
- {{ t('order.operatingWindows') }}
877
+ Time Settings
871
878
  </div>
872
879
  <div class="fm-typo-en-body-lg-400 text-fm-color-typo-secondary mb-12">
873
- Set the hours your outlet is open for business. Reservations and walk-ins outside these
874
- hours will not be allowed.
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
- Hours
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">Time Interval</div>
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">Dining Duration</div>
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
- {{ t('order.capacity') }}
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 the maximum number of guests allowed for each time slot.
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">Available Table Count</div>
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: ['Option 1']
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>