@feedmepos/mf-order-setting 0.0.21-beta.3 → 0.0.23

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 (109) hide show
  1. package/dist/{KioskDevicesView-Cb7Rw7t8.js → KioskDevicesView-BdJCcotz.js} +1 -1
  2. package/dist/{KioskDevicesView.vue_vue_type_script_setup_true_lang-raPhhBpi.js → KioskDevicesView.vue_vue_type_script_setup_true_lang-DUPfN7ti.js} +2 -2
  3. package/dist/KioskSettingView-BChhriPk.js +782 -0
  4. package/dist/KioskView-DPU-oQ1H.js +426 -0
  5. package/dist/{OrderSettingsView-BJ1b1Qjg.js → OrderSettingsView-BOiflwB_.js} +34011 -32822
  6. package/dist/{app-BY258ajB.js → app-CaYWSLe1.js} +39 -17
  7. package/dist/app.js +1 -1
  8. package/dist/common/convertor/index.d.ts +2 -0
  9. package/dist/common/sms/index.d.ts +1 -1
  10. package/dist/common/util/index.d.ts +6 -0
  11. package/dist/{dayjs.min-4COVK72W.js → dayjs.min-8NyoNely.js} +36 -36
  12. package/dist/frontend/mf-order/src/api/remoteOrder/index.d.ts +5 -2
  13. package/dist/frontend/mf-order/src/app.d.ts +22 -0
  14. package/dist/frontend/mf-order/src/helpers/menu.d.ts +1 -1
  15. package/dist/frontend/mf-order/src/modules/order-setting/kiosk/interface.d.ts +13 -0
  16. package/dist/frontend/mf-order/src/stores/app/index.d.ts +14 -4
  17. package/dist/frontend/mf-order/src/stores/menu/menu.d.ts +45 -35
  18. package/dist/frontend/mf-order/src/stores/order-setting/index.d.ts +168 -12
  19. package/dist/frontend/mf-order/src/stores/order-setting/mapper.d.ts +2 -1
  20. package/dist/frontend/mf-order/src/stores/restaurant/index.d.ts +581 -716
  21. package/dist/frontend/mf-order/src/views/all-orders/ReflowOrder.vue.d.ts +140 -174
  22. package/dist/frontend/mf-order/src/views/kiosk/settings/KioskInstructionSection.vue.d.ts +15 -0
  23. package/dist/frontend/mf-order/src/views/kiosk/settings/KioskPickAtCounterSection.vue.d.ts +4 -3
  24. package/dist/frontend/mf-order/src/views/order-settings/delivery/DeliverySetting.vue.d.ts +2 -2
  25. package/dist/frontend/mf-order/src/views/order-settings/delivery/delivery.d.ts +2 -1
  26. package/dist/frontend/mf-order/src/views/order-settings/delivery/delivery.data.d.ts +3 -0
  27. package/dist/frontend/mf-order/src/views/order-settings/delivery/integrated-delivery/ExternalSetting.vue.d.ts +97 -0
  28. package/dist/frontend/mf-order/src/views/order-settings/delivery/integrated-delivery/ShopeefoodSetting.vue.d.ts +3 -3
  29. package/dist/frontend/mf-order/tsconfig.app.tsbuildinfo +1 -1
  30. package/dist/{index-t_7ThPjm.js → index-B7GFhkAE.js} +2 -2
  31. package/dist/package/entity/booking/booking.do.d.ts +1516 -1276
  32. package/dist/package/entity/delivery/delivery.dto.d.ts +298 -251
  33. package/dist/package/entity/incoming-order/incoming-order-to-bill.dto.d.ts +539 -0
  34. package/dist/package/entity/incoming-order/incoming-order.do.d.ts +114 -9
  35. package/dist/package/entity/incoming-order/incoming-order.dto.d.ts +862 -4
  36. package/dist/package/entity/incoming-order/incoming-order.enum.d.ts +1 -1
  37. package/dist/package/entity/index.d.ts +34 -22
  38. package/dist/package/entity/kiosk/kiosk.do.d.ts +12 -12
  39. package/dist/package/entity/kiosk/kiosk.dto.d.ts +12 -12
  40. package/dist/package/entity/kiosk/marketing/marketing.dto.d.ts +1942 -1642
  41. package/dist/package/entity/member/member.dto.d.ts +33 -0
  42. package/dist/package/entity/order/order-item/order-item.dto.d.ts +15 -0
  43. package/dist/package/entity/order/order.do.d.ts +37 -0
  44. package/dist/package/entity/order/order.dto.d.ts +808 -17435
  45. package/dist/package/entity/order/order.enum.d.ts +2 -0
  46. package/dist/package/entity/order-platform/external/auth/external-auth.do.d.ts +12 -0
  47. package/dist/package/entity/order-platform/external/auth/external-auth.dto.d.ts +27 -0
  48. package/dist/package/entity/order-platform/external/menu/external-menu.do.d.ts +2868 -0
  49. package/dist/package/entity/order-platform/external/menu/external-menu.dto.d.ts +21 -0
  50. package/dist/package/entity/order-platform/external/menu/external-menu.enum.d.ts +3 -0
  51. package/dist/package/entity/order-platform/external/order/external-order.do.d.ts +1373 -0
  52. package/dist/package/entity/order-platform/external/order/external-order.dto.d.ts +2834 -0
  53. package/dist/package/entity/order-platform/external/order/external-order.enum.d.ts +9 -0
  54. package/dist/package/entity/order-platform/external/setting/external-setting.do.d.ts +127 -0
  55. package/dist/package/entity/order-platform/external/setting/external-setting.dto.d.ts +95 -0
  56. package/dist/package/entity/order-platform/foodpanda/foodpanda-order.do.d.ts +98 -98
  57. package/dist/package/entity/order-platform/foodpanda/foodpanda-order.dto.d.ts +345 -297
  58. package/dist/package/entity/order-platform/foodpanda/foodpanda-settings.do.d.ts +4 -4
  59. package/dist/package/entity/order-platform/foodpanda/foodpanda-settings.dto.d.ts +3 -3
  60. package/dist/package/entity/order-platform/grabfood/grabfood-menu.do.d.ts +65 -65
  61. package/dist/package/entity/order-platform/grabfood/grabfood-order.do.d.ts +311 -263
  62. package/dist/package/entity/order-platform/grabfood/grabfood-settings.do.d.ts +2 -2
  63. package/dist/package/entity/order-platform/grabfood/grabfood.dto.d.ts +7 -7
  64. package/dist/package/entity/order-platform/menu.dto.d.ts +126 -0
  65. package/dist/package/entity/order-platform/order-platform.dto.d.ts +4 -4
  66. package/dist/package/entity/order-platform/order-platform.enum.d.ts +1 -1
  67. package/dist/package/entity/order-platform/shopeefood/shopeefood-order.do.d.ts +298 -250
  68. package/dist/package/entity/order-setting/kiosk/kiosk.do.d.ts +115 -0
  69. package/dist/package/entity/order-setting/kiosk/kiosk.dto.d.ts +225 -41
  70. package/dist/package/entity/order-setting/kiosk/kiosk.enum.d.ts +3 -0
  71. package/dist/package/entity/order-setting/order-setting.do.d.ts +138 -8
  72. package/dist/package/entity/order-setting/order-setting.dto.d.ts +276 -16
  73. package/dist/package/entity/order-setting/sequence/sequence.do.d.ts +4 -4
  74. package/dist/package/entity/order-setting/sequence/sequence.dto.d.ts +4 -4
  75. package/dist/package/entity/payment/payment.enum.d.ts +2 -0
  76. package/dist/package/entity/printer/printer.do.d.ts +2 -2
  77. package/dist/package/entity/pubsub/ably/ably.do.d.ts +60 -9
  78. package/dist/package/entity/pubsub/ably/ably.enum.d.ts +1 -1
  79. package/dist/package/entity/queue/queue.do.d.ts +40 -0
  80. package/dist/package/entity/restaurant/restaurant.dto.d.ts +136 -6
  81. package/dist/package/entity/websocket/websocket.dto.d.ts +288 -0
  82. package/dist/{auth.dto-BOoRSQkS.js → queue.do-CIyIpp22.js} +30390 -29706
  83. package/package.json +4 -3
  84. package/src/api/remoteOrder/index.ts +13 -2
  85. package/src/helpers/menu.ts +2 -2
  86. package/src/locales/en-US.json +13 -2
  87. package/src/locales/zh-CN.json +12 -1
  88. package/src/modules/order-setting/kiosk/interface.ts +16 -0
  89. package/src/stores/order-setting/mapper.ts +58 -7
  90. package/src/stores/restaurant/index.ts +4 -1
  91. package/src/views/kiosk/settings/KioskDineInSection.vue +4 -5
  92. package/src/views/kiosk/settings/KioskDisplayStandSection.vue +36 -0
  93. package/src/views/kiosk/settings/KioskInstructionSection.vue +40 -0
  94. package/src/views/kiosk/settings/KioskPaymentTypeSection.vue +30 -19
  95. package/src/views/kiosk/settings/KioskPickAtCounterSection.vue +45 -7
  96. package/src/views/kiosk/settings/KioskSettingView.vue +15 -3
  97. package/src/views/kiosk/settings/KioskTakeawaySection.vue +38 -4
  98. package/src/views/order-settings/delivery/DeliverySetting.vue +82 -6
  99. package/src/views/order-settings/delivery/delivery.data.ts +16 -1
  100. package/src/views/order-settings/delivery/delivery.ts +1 -0
  101. package/src/views/order-settings/delivery/integrated-delivery/ExternalSetting.vue +114 -0
  102. package/src/views/order-settings/delivery/integrated-delivery/FoodpandaSetting.vue +23 -6
  103. package/src/views/order-settings/delivery/integrated-delivery/GrabfoodSetting.vue +21 -16
  104. package/src/views/order-settings/delivery/integrated-delivery/ShopeefoodSetting.vue +58 -59
  105. package/src/views/order-settings/pickup/PickUpSetting.vue +1 -1
  106. package/src/views/order-settings/servicecharge/ServiceChargeRule.vue +216 -165
  107. package/src/views/order-settings/servicecharge/ServiceChargeSetting.vue +1 -0
  108. package/dist/KioskSettingView-BQgyeWbo.js +0 -649
  109. package/dist/KioskView-BLkuqfZ_.js +0 -371
@@ -1,7 +1,6 @@
1
1
  <script setup lang="ts">
2
- import { sentenceCase } from 'change-case'
3
- import { type PropType, computed, onMounted, ref } from 'vue'
4
- import type { CategorizedItem } from '@/helpers/menu'
2
+ import { type PropType, computed, onMounted, ref, watch } from 'vue'
3
+ import type { CategorizedItem, Item } from '@/helpers/menu'
5
4
  import RateInput from './RateInput.vue'
6
5
  import type { FdoServiceChargeRule, FdoTable } from '@feedmepos/core/entity'
7
6
  import type { AdjustmentAmount } from '@/helpers/number'
@@ -46,14 +45,6 @@ const emits = defineEmits<{
46
45
  (event: 'delete'): void
47
46
  }>()
48
47
 
49
- const itemSelected = computed(() => {
50
- if (props.isLoadingMenu) return t('order.loadingMenu')
51
- if (!props.items.length) return t('order.noAvailableItem')
52
- const items = props.modelValue.condition.items
53
- if (!items) return t('order.all')
54
- return `${items.length} ${t('order.item')}`
55
- })
56
-
57
48
  const tableSelected = computed(() => {
58
49
  if (props.isLoadingTable) return t('order.loadingTable')
59
50
  if (!props.tables.length) return t('order.noAvailableTable')
@@ -76,8 +67,8 @@ function convertServiceChargeOrderToI18n(serviceChargeType: ServiceChargeOrderTy
76
67
  return t('order.dineIn')
77
68
  case ServiceChargeOrderType.takeaway:
78
69
  return t('order.takeaway')
79
- case ServiceChargeOrderType.inHouseDelivery:
80
- return t('order.deliveryTitle', {company: "In house"})
70
+ case ServiceChargeOrderType.inHouseDelivery:
71
+ return t('order.deliveryTitle', { company: 'In house' })
81
72
  case ServiceChargeOrderType.deliveryCompany:
82
73
  return t('order.deliveryCompany')
83
74
  case ServiceChargeOrderType.pickup:
@@ -99,33 +90,6 @@ const diningValue = computed(() => {
99
90
  return props.modelValue.condition.orderType
100
91
  })
101
92
 
102
- let initialValue = props.modelValue.condition.items
103
- if (!initialValue) {
104
- initialValue = props.items.reduce<string[]>((pv, category) => {
105
- pv = [...pv, ...category.items.map((item) => item._id)]
106
- return pv
107
- }, [])
108
- }
109
-
110
- let initialValueTable = props.modelValue.condition.tables || props.tables.map((table) => table.name)
111
- if (!initialValueTable) {
112
- initialValueTable = props.tables.map((table) => table.name)
113
- }
114
-
115
- const itemValue = ref<string[]>(initialValue)
116
- const tableValue = ref<string[]>(initialValueTable)
117
-
118
- function updateItems() {
119
- sideSheetItem.value = false
120
- emits('update:model-value', {
121
- ...props.modelValue,
122
- condition: {
123
- ...props.modelValue.condition,
124
- items: itemValue.value
125
- }
126
- })
127
- }
128
-
129
93
  function updateTable() {
130
94
  sideSheetTable.value = false
131
95
  emits('update:model-value', {
@@ -137,17 +101,6 @@ function updateTable() {
137
101
  })
138
102
  }
139
103
 
140
- function modifyItems(items: string[], parentId: string) {
141
- itemValue.value = items
142
- const parentItem = props.items.find((item) => item.id === parentId)
143
- if (parentItem) {
144
- const parentSelected = parentItem.items.every((subItem) =>
145
- itemValue.value.includes(subItem._id)
146
- )
147
- selectedCategoryItems.value[parentId] = parentSelected
148
- }
149
- }
150
-
151
104
  function updateRate(v: AdjustmentAmount) {
152
105
  emits('update:model-value', {
153
106
  ...props.modelValue,
@@ -168,13 +121,6 @@ function updateDiningOption(options: F_SERVICE_CHARGE_ORDER_TYPE[]) {
168
121
  const sideSheetItem = ref<boolean>(false)
169
122
  const sideSheetTable = ref<boolean>(false)
170
123
 
171
- function toggleSideSheet() {
172
- sideSheetItem.value = true
173
- }
174
- function toggleSideSheetTable() {
175
- sideSheetTable.value = true
176
- }
177
-
178
124
  const parent = ref<boolean>(false)
179
125
  const nestedVal = ref<F_SERVICE_CHARGE_ORDER_TYPE[]>(diningValue.value)
180
126
 
@@ -196,101 +142,128 @@ function handleChildUpdate(ev: F_SERVICE_CHARGE_ORDER_TYPE[]) {
196
142
  updateDiningOption(ev)
197
143
  }
198
144
 
199
- const parentTable = ref<boolean>(false)
200
- const nestedValTable = ref<string[]>(initialValueTable)
145
+ //Table
146
+ const tableValue = ref<string[] | null | undefined>(props.modelValue.condition.tables)
147
+
148
+ const selectedTables = computed<Record<string, { isSelected: boolean }>>(() => {
149
+ return props.tables?.reduce((pv: Record<string, { isSelected: boolean }>, curr: FdoTable) => {
150
+ const isSelected = !tableValue.value || tableValue.value?.includes(curr.name)
151
+
152
+ pv[curr.name ?? ''] = {
153
+ isSelected
154
+ }
201
155
 
156
+ return pv
157
+ }, {})
158
+ })
202
159
  const checkboxChildrenTable = computed(() => {
203
- const tables = props.tables.map((table) => table.name)
160
+ const tables = props.tables.map((table: FdoTable) => table.name)
204
161
  return Array.isArray(tables) ? tables : []
205
162
  })
206
163
 
207
164
  function handleParentUpdateTable(ev: boolean) {
208
- if (Array.isArray(checkboxChildrenTable.value)) {
209
- ev ? (nestedValTable.value = checkboxChildrenTable.value) : (nestedValTable.value = [])
210
- parentTable.value = ev
211
- tableValue.value = nestedValTable.value
165
+ if (ev) {
166
+ tableValue.value = null
167
+ } else {
168
+ tableValue.value = []
212
169
  }
213
170
  }
214
171
 
215
- function handleChildUpdateTable(ev: string[]) {
216
- nestedValTable.value = Array.isArray(ev) ? ev : []
217
- parentTable.value = nestedValTable.value.length === checkboxChildrenTable.value.length
218
- tableValue.value = ev
219
- }
220
-
221
- onMounted(() => {
222
- parent.value = nestedVal.value.length === checkboxChildren.value.length
223
-
224
- if (Array.isArray(nestedValTable.value) && Array.isArray(checkboxChildrenTable.value)) {
225
- parentTable.value = nestedValTable.value.length === checkboxChildrenTable.value.length
172
+ function handleChildUpdateTable(ev: boolean, name: string) {
173
+ if (ev) {
174
+ tableValue.value = [...(tableValue.value ?? []), name]
175
+ } else {
176
+ if (!tableValue.value) {
177
+ tableValue.value = props.tables.map((t) => t.name)
178
+ }
179
+ tableValue.value = tableValue.value.filter((t) => t !== name)
226
180
  }
227
181
 
228
- if (props.items.length > 0) {
229
- selectedCategoryItems.value = props.items.reduce(
230
- (acc, item) => {
231
- const allSubItemsSelected = item.items.every((subItem) =>
232
- itemValue.value.includes(subItem._id)
233
- )
234
- acc[item.id ?? ''] = allSubItemsSelected
235
- return acc
236
- },
237
- {} as Record<string, boolean>
238
- )
239
- }
240
-
241
- initializeMenuState(filteredItem.value);
242
-
243
- })
244
-
245
- const selectedCategoryItems = ref<Record<string, boolean>>({})
246
-
247
- function handleCategorySelection(categoryId: string, isSelected: boolean) {
248
- selectedCategoryItems.value = {
249
- ...selectedCategoryItems.value,
250
- [categoryId]: isSelected
251
- }
252
- if (isSelected) {
253
- itemValue.value = [
254
- ...itemValue.value,
255
- ...(props.items.find((item) => item.id === categoryId)?.items.map((subItem) => subItem._id) ||
256
- [])
257
- ]
258
- } else {
259
- itemValue.value = itemValue.value.filter(
260
- (id) =>
261
- !props.items
262
- .find((item) => item.id === categoryId)
263
- ?.items.map((subItem) => subItem._id)
264
- .includes(id)
265
- )
182
+ tableValue.value = Array.from(new Set(tableValue.value))
183
+ if (tableValue.value.length === props.tables.length) {
184
+ tableValue.value = null
266
185
  }
267
186
  }
268
187
 
269
- function isIndeterminate(parentId: string): boolean {
270
- const parentItem = props.items.find((item) => item.id === parentId)
271
- if (!parentItem) return false
272
-
273
- const selectedSubItemsCount = parentItem.items.filter((subItem) =>
274
- itemValue.value.includes(subItem._id)
275
- ).length
276
- return selectedSubItemsCount > 0 && selectedSubItemsCount < parentItem.items.length
277
- }
188
+ onMounted(() => {
189
+ parent.value = nestedVal.value.length === checkboxChildren.value.length
190
+ initializeMenuState(filteredItem.value)
191
+ })
278
192
 
279
193
  const searchValueTable = ref('')
280
-
281
194
  const filteredTable = computed(() =>
282
- props.tables.filter((e) =>
195
+ props.tables.filter((e: FdoTable) =>
283
196
  searchValueTable.value
284
197
  ? e.name.toLocaleLowerCase().includes(searchValueTable.value.toLocaleLowerCase())
285
198
  : true
286
199
  )
287
200
  )
288
201
 
202
+ const showTable = ref(true)
203
+ function toggleShowTable() {
204
+ showTable.value = !showTable.value
205
+ }
206
+
207
+ const showMenuState = ref<Record<string, boolean>>({})
208
+ function toggleShowMenu(itemId: number) {
209
+ showMenuState.value[itemId] = !showMenuState.value[itemId]
210
+ }
211
+ function initializeMenuState(items: any[]) {
212
+ showMenuState.value = items.reduce(
213
+ (acc, _, index) => {
214
+ acc[index] = true
215
+ return acc
216
+ },
217
+ {} as Record<number, boolean>
218
+ )
219
+ }
220
+
221
+ //Items
289
222
  const searchValueItem = ref('')
290
223
 
224
+ const itemValue = ref<string[] | null | undefined>(props.modelValue.condition.items)
225
+
226
+ const selectedCategories = computed<
227
+ Record<string, { isAllSelected: boolean; isSomeSelected: boolean }>
228
+ >(() => {
229
+ return props.items?.reduce(
230
+ (
231
+ pv: Record<string, { isAllSelected: boolean; isSomeSelected: boolean }>,
232
+ curr: CategorizedItem
233
+ ) => {
234
+ const selectedItems = curr.items.filter((itm) => itemValue.value?.includes(itm._id))
235
+ const _isAllItemSelected = !itemValue.value || selectedItems.length === curr.items.length
236
+
237
+ const isSomeSelected = !itemValue.value || selectedItems.length > 0
238
+
239
+ pv[curr?.id ?? ''] = {
240
+ isAllSelected: _isAllItemSelected,
241
+ isSomeSelected
242
+ }
243
+
244
+ return pv
245
+ },
246
+ {}
247
+ )
248
+ })
249
+
250
+ const totalCategorizedItemsCount = computed(() => {
251
+ return props.items.reduce((pv: number, curr: CategorizedItem) => {
252
+ pv += curr.items.length
253
+ return pv
254
+ }, 0)
255
+ })
256
+
257
+ const itemSelected = computed(() => {
258
+ if (props.isLoadingMenu) return t('order.loadingMenu')
259
+ if (!props.items.length) return t('order.noAvailableItem')
260
+ const items = props.modelValue.condition.items
261
+ if (!items) return t('order.all')
262
+ return `${items.length} ${t('order.item')}`
263
+ })
291
264
  const filteredItem = computed(() => {
292
265
  return props.items
293
- .map((item) => {
266
+ .map((item: CategorizedItem) => {
294
267
  const filteredSubItems = item.items.filter((subItem) =>
295
268
  searchValueItem.value
296
269
  ? subItem.name.toLowerCase().includes(searchValueItem.value.toLowerCase())
@@ -302,27 +275,79 @@ const filteredItem = computed(() => {
302
275
  items: filteredSubItems
303
276
  }
304
277
  })
305
- .filter((item) => item.items.length > 0)
278
+ .filter((item: CategorizedItem) => item.items.length > 0)
306
279
  })
307
280
 
308
- const showTable = ref(true)
309
- function toggleShowTable() {
310
- showTable.value = !showTable.value
281
+ function selectAllItems(v: boolean) {
282
+ if (v) {
283
+ itemValue.value = null
284
+ } else {
285
+ itemValue.value = []
286
+ }
311
287
  }
312
288
 
313
- const showMenuState = ref<Record<string, boolean>>({})
289
+ function handleCategorySelection(categoryId: string, isSelected: boolean) {
290
+ initItemValue(isSelected)
314
291
 
315
- function toggleShowMenu(itemId: number) {
316
- showMenuState.value[itemId] = !showMenuState.value[itemId]
292
+ const categoryItems =
293
+ props.items.find((item: CategorizedItem) => item.id === categoryId)?.items ?? []
294
+ const categoryItemIds = categoryItems.map((ci: Item) => ci._id)
295
+ if (isSelected) {
296
+ itemValue.value = [...(itemValue.value ?? []), ...categoryItemIds]
297
+ } else {
298
+ itemValue.value = itemValue.value?.filter((id: string) => !categoryItemIds.includes(id))
299
+ }
300
+ itemValue.value = Array.from(new Set(itemValue.value))
317
301
  }
318
302
 
319
- function initializeMenuState(items: any[]) {
320
- showMenuState.value = items.reduce((acc, _, index) => {
321
- acc[index] = true;
322
- return acc;
323
- }, {} as Record<number, boolean>);
303
+ function initItemValue(v: boolean) {
304
+ if (!itemValue.value) {
305
+ if (v) {
306
+ itemValue.value = []
307
+ } else {
308
+ itemValue.value = props.items.reduce((pv: string[], curr: CategorizedItem) => {
309
+ pv = [...pv, ...curr.items.map((i) => i._id)]
310
+ return pv
311
+ }, [])
312
+ }
313
+ }
314
+ }
315
+
316
+ function modifyItems(v: boolean, subItemId: string) {
317
+ initItemValue(v)
318
+ if (v) {
319
+ itemValue.value = [...(itemValue.value ?? []), subItemId]
320
+ } else {
321
+ itemValue.value = itemValue.value?.filter((i: string) => i !== subItemId)
322
+ }
323
+
324
+ itemValue.value = Array.from(new Set(itemValue.value))
324
325
  }
325
326
 
327
+ function updateItems() {
328
+ sideSheetItem.value = false
329
+ emits('update:model-value', {
330
+ ...props.modelValue,
331
+ condition: {
332
+ ...props.modelValue.condition,
333
+ items: itemValue.value
334
+ }
335
+ })
336
+ }
337
+
338
+ function toggleSideSheet() {
339
+ sideSheetItem.value = true
340
+ }
341
+ function toggleSideSheetTable() {
342
+ sideSheetTable.value = true
343
+ }
344
+
345
+ watch(
346
+ () => props.items,
347
+ () => {
348
+ initializeMenuState(filteredItem.value)
349
+ }
350
+ )
326
351
  </script>
327
352
 
328
353
  <template>
@@ -338,19 +363,31 @@ function initializeMenuState(items: any[]) {
338
363
  <FmSideSheet :header="t('order.selectItem')" :maxWidth="600" dismiss-away v-model="sideSheetItem">
339
364
  <div>
340
365
  <div class="text-fm-color-typo-secondary mt-5 mb-5 flex flex-row">
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')" />
366
+ {{ itemValue?.length ?? totalCategorizedItemsCount }}
367
+ {{ t('order.productSelected') }}
368
+ <FmSearch
369
+ v-model:model-value="searchValueItem"
370
+ class="ml-auto"
371
+ :placeholder="t('order.search')"
372
+ />
343
373
  </div>
344
374
 
375
+ <FmCheckbox
376
+ :label="t('order.selectAllItemsIncludeCustomItem')"
377
+ :model-value="!itemValue"
378
+ value=""
379
+ @update:model-value="(v: boolean) => selectAllItems(v)"
380
+ ></FmCheckbox>
381
+
345
382
  <div v-for="(item, index) in filteredItem" :key="index" class="flex flex-col mb-6">
346
383
  <FmCard variant="outlined" class="p-5">
347
384
  <div class="fm-corner-radius-lg flex flex-col">
348
385
  <div class="flex flex-row">
349
386
  <div class="flex flex-row">
350
387
  <FmCheckbox
351
- :model-value="selectedCategoryItems[item.id ?? '']"
388
+ :model-value="selectedCategories[item.id ?? ''].isAllSelected"
352
389
  value=""
353
- :indeterminate="isIndeterminate(item.id ?? '')"
390
+ :indeterminate="selectedCategories[item.id ?? ''].isSomeSelected"
354
391
  @update:model-value="handleCategorySelection(item.id ?? '', $event)"
355
392
  />
356
393
  <div class="font-bold ml-2">{{ item.name }}</div>
@@ -374,11 +411,12 @@ function initializeMenuState(items: any[]) {
374
411
  <FmCheckbox
375
412
  v-for="(subItem, subIndex) in item.items"
376
413
  :key="subIndex"
377
- :model-value="itemValue"
414
+ :model-value="!itemValue || itemValue.includes(subItem._id)"
378
415
  :label="subItem.name"
379
416
  :value="subItem._id"
380
- @update:model-value="(values: string[]) => modifyItems(values, item.id ?? '')"
381
- />
417
+ @update:model-value="(v: boolean) => modifyItems(v, subItem._id)"
418
+ >
419
+ </FmCheckbox>
382
420
  </div>
383
421
  </div>
384
422
  </FmCard>
@@ -387,7 +425,12 @@ function initializeMenuState(items: any[]) {
387
425
  <template #side-sheet-footer>
388
426
  <div class="flex gap-8 items-center justify-start">
389
427
  <FmButton variant="primary" :label="t('order.confirm')" size="lg" @click="updateItems" />
390
- <FmButton variant="secondary" :label="t('order.cancel')" size="lg" @click="sideSheetItem = false" />
428
+ <FmButton
429
+ variant="secondary"
430
+ :label="t('order.cancel')"
431
+ size="lg"
432
+ @click="sideSheetItem = false"
433
+ />
391
434
  </div>
392
435
  </template>
393
436
  </FmSideSheet>
@@ -396,21 +439,29 @@ function initializeMenuState(items: any[]) {
396
439
  <div class="font-semibold mb-3">{{ t('order.selectTable') }}</div>
397
440
  <FmButton variant="plain" :label="tableSelected" size="lg" @click="toggleSideSheetTable" />
398
441
  </div>
399
- <FmSideSheet :header="t('order.selectTable')" :maxWidth="600" dismiss-away v-model="sideSheetTable">
442
+ <FmSideSheet
443
+ :header="t('order.selectTable')"
444
+ :maxWidth="600"
445
+ dismiss-away
446
+ v-model="sideSheetTable"
447
+ >
400
448
  <div class="text-fm-color-typo-secondary mt-5 mb-5 flex flex-row">
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')" />
449
+ {{ props.modelValue.condition.tables?.length ?? props.tables.length }}
450
+ {{ t('order.tableSelected') }}
451
+ <FmSearch
452
+ v-model:model-value="searchValueTable"
453
+ class="ml-auto"
454
+ :placeholder="t('order.search')"
455
+ />
403
456
  </div>
404
457
 
405
458
  <FmCard variant="outlined" class="p-5">
406
459
  <div class="flex flex-row">
407
460
  <FmCheckbox
408
- :value="parentTable"
409
- :model-value="parentTable"
461
+ value=""
462
+ :model-value="!tableValue"
410
463
  :label="t('order.all')"
411
- :indeterminate="
412
- nestedValTable.length > 0 && nestedValTable.length < checkboxChildrenTable.length
413
- "
464
+ :indeterminate="!!tableValue && tableValue.length > 0"
414
465
  @update:model-value="handleParentUpdateTable"
415
466
  />
416
467
  <FmButton
@@ -428,18 +479,13 @@ function initializeMenuState(items: any[]) {
428
479
  class="ml-auto"
429
480
  />
430
481
  </div>
431
- <div class="fm-corner-radius-lg flex flex-col">
432
- <div
433
- v-for="(item, index) in filteredTable"
434
- :key="index"
435
- class="flex flex-col pl-6"
436
- v-if="showTable"
437
- >
482
+ <div class="fm-corner-radius-lg flex flex-col" v-if="showTable">
483
+ <div v-for="(item, index) in filteredTable" :key="index" class="flex flex-col pl-6">
438
484
  <FmCheckbox
439
- :model-value="nestedValTable"
440
- :label="item.name"
441
485
  :value="item.name"
442
- @update:model-value="handleChildUpdateTable"
486
+ :model-value="selectedTables[item.name].isSelected"
487
+ :label="item.name"
488
+ @update:model-value="(v: boolean) => handleChildUpdateTable(v, item.name)"
443
489
  />
444
490
  </div>
445
491
  </div>
@@ -447,7 +493,12 @@ function initializeMenuState(items: any[]) {
447
493
  <template #side-sheet-footer>
448
494
  <div class="flex gap-8 items-center justify-start">
449
495
  <FmButton variant="primary" :label="t('order.confirm')" size="lg" @click="updateTable" />
450
- <FmButton variant="secondary" :label="t('order.cancel')" size="lg" @click="sideSheetTable = false" />
496
+ <FmButton
497
+ variant="secondary"
498
+ :label="t('order.cancel')"
499
+ size="lg"
500
+ @click="sideSheetTable = false"
501
+ />
451
502
  </div>
452
503
  </template>
453
504
  </FmSideSheet>
@@ -253,6 +253,7 @@ watch(
253
253
  }
254
254
  initialize(restaurantSetting)
255
255
  await startAsyncCallWithErr(tableSettingStore.readTables)
256
+ await menuStore.readMenu()
256
257
  }
257
258
  },
258
259
  { immediate: true }