@feedmepos/mf-order-setting 0.0.91 → 0.0.93

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 (108) hide show
  1. package/dist/DisplaySystemView-BMRCs7o8.js +8891 -0
  2. package/dist/{KioskDevicesView-Bz6seroM.js → KioskDevicesView-BCZOqou3.js} +1 -1
  3. package/dist/{KioskDevicesView.vue_vue_type_script_setup_true_lang-I39sE8Pe.js → KioskDevicesView.vue_vue_type_script_setup_true_lang-4wFO9co5.js} +3 -3
  4. package/dist/{KioskSettingView-Cajjh4Zm.js → KioskSettingView-DIvpRwFV.js} +3 -3
  5. package/dist/{KioskView-BPSbsMi5.js → KioskView-w4txC9m2.js} +5 -5
  6. package/dist/{OrderSettingsView-jPxZ3JDM.js → OrderSettingsView-BPuBA2QC.js} +28615 -27747
  7. package/dist/{app-DIhv5ssA.js → app-xZAaURng.js} +4594 -3733
  8. package/dist/app.js +1 -1
  9. package/dist/common/order-platform/index.d.ts +20 -0
  10. package/dist/featureFlag-Cbj0uMaM.js +846 -0
  11. package/dist/frontend/mf-order/src/api/brandkit/index.d.ts +3 -0
  12. package/dist/frontend/mf-order/src/api/reservation/index.d.ts +8 -0
  13. package/dist/frontend/mf-order/src/app.d.ts +752 -0
  14. package/dist/frontend/mf-order/src/composables/featureFlag.d.ts +7 -0
  15. package/dist/frontend/mf-order/src/composables/useBusinessFeatureFlag.d.ts +4 -0
  16. package/dist/frontend/mf-order/src/composables/useLegacyOdsAccess.d.ts +4 -0
  17. package/dist/frontend/mf-order/src/composables/useMiniProgramPermission.d.ts +5 -0
  18. package/dist/frontend/mf-order/src/main.d.ts +752 -0
  19. package/dist/frontend/mf-order/src/modules/display-system/legacy-ods/interface.d.ts +80 -0
  20. package/dist/frontend/mf-order/src/stores/order-setting/index.d.ts +3 -3
  21. package/dist/frontend/mf-order/src/stores/restaurant/index.d.ts +3 -0
  22. package/dist/frontend/mf-order/src/views/display-system/legacy-ods/ColorOverrideDialog.vue.d.ts +26 -0
  23. package/dist/frontend/mf-order/src/views/display-system/legacy-ods/ColorSelection.vue.d.ts +15 -0
  24. package/dist/frontend/mf-order/src/views/display-system/legacy-ods/LegacyOdsEditorDialog.vue.d.ts +24 -0
  25. package/dist/frontend/mf-order/src/views/display-system/legacy-ods/LegacyOdsTemplateList.vue.d.ts +4 -0
  26. package/dist/frontend/mf-order/src/views/display-system/view-selection.d.ts +18 -0
  27. package/dist/frontend/mf-order/src/views/order-settings/reservation/CopySettingsSheet.vue.d.ts +186 -0
  28. package/dist/frontend/mf-order/src/views/order-settings/reservation/CustomTimePicker.vue.d.ts +11 -0
  29. package/dist/frontend/mf-order/src/views/order-settings/reservation/ReservationSetting.vue.d.ts +2 -0
  30. package/dist/frontend/mf-order/tsconfig.app.tsbuildinfo +1 -1
  31. package/dist/{index-vaSLX6r3.js → index-BAFwfvqv.js} +2 -2
  32. package/dist/{index-Clp_YRJ2.js → index-BxQKdXyN.js} +1 -1
  33. package/dist/{index-CmqNrkNl.js → index-Cipbdi6i.js} +1 -1
  34. package/dist/order.dto-yLICIGDQ.js +41528 -0
  35. package/dist/package/entity/delivery/delivery.dto.d.ts +7 -0
  36. package/dist/package/entity/food-court/food-court.dto.d.ts +315 -264
  37. package/dist/package/entity/food-court/order-v2.do.d.ts +231 -0
  38. package/dist/package/entity/food-court/order-v2.do.spec.d.ts +1 -0
  39. package/dist/package/entity/incoming-order/incoming-order-to-bill.dto.d.ts +15 -6
  40. package/dist/package/entity/index.d.ts +7 -0
  41. package/dist/package/entity/index.frontend.d.ts +2 -0
  42. package/dist/package/entity/member/member.dto.d.ts +2 -2
  43. package/dist/package/entity/order/dine-in/dine-in.do.d.ts +44 -9
  44. package/dist/package/entity/order/dine-in/dine-in.dto.d.ts +17 -3
  45. package/dist/package/entity/order/menu/menu.dto.d.ts +33 -3
  46. package/dist/package/entity/order/order-item/order-item.dto.d.ts +18 -18
  47. package/dist/package/entity/order/order.do.d.ts +87 -12
  48. package/dist/package/entity/order/order.dto.d.ts +762 -358
  49. package/dist/package/entity/order/order.enum.d.ts +1 -1
  50. package/dist/package/entity/order-platform/foodpanda/foodpanda-order.dto.d.ts +7 -0
  51. package/dist/package/entity/order-platform/grabfood/grabfood-order.do.d.ts +7 -0
  52. package/dist/package/entity/order-platform/menu.dto.d.ts +10 -10
  53. package/dist/package/entity/order-platform/order-platform.dto.d.ts +92 -0
  54. package/dist/package/entity/order-platform/shopeefood/shopeefood-order.do.d.ts +7 -0
  55. package/dist/package/entity/order-platform/tng/tng-menu.do.d.ts +6 -6
  56. package/dist/package/entity/order-setting/order-setting.do.d.ts +866 -5
  57. package/dist/package/entity/order-setting/order-setting.dto.d.ts +10 -10
  58. package/dist/package/entity/order-setting/reservationV2/reservation.do.d.ts +1269 -0
  59. package/dist/package/entity/order-setting/sms/sms.do.d.ts +3 -3
  60. package/dist/package/entity/order-setting/sms/sms.dto.d.ts +3 -3
  61. package/dist/package/entity/queue/queue.dto.d.ts +175 -121
  62. package/dist/package/entity/reservation/reservation-pos.do.d.ts +222 -0
  63. package/dist/package/entity/reservation/reservation.do.d.ts +205 -0
  64. package/dist/package/entity/reservation/reservation.dto.d.ts +428 -0
  65. package/dist/package/entity/reservation/reservation.enum.d.ts +3 -0
  66. package/dist/package/entity/reservation/reservation.utils.d.ts +152 -0
  67. package/dist/package/entity/restaurant/restaurant.dto.d.ts +39 -24
  68. package/dist/package/entity/user/user.do.d.ts +2 -2
  69. package/dist/package/entity/websocket/websocket.dto.d.ts +161 -21
  70. package/dist/package/entity/websocket/websocket.enum.d.ts +1 -1
  71. package/dist/style.css +1 -1
  72. package/env.d.ts +2 -0
  73. package/package.json +3 -2
  74. package/src/api/brandkit/index.ts +24 -0
  75. package/src/api/reservation/index.ts +25 -0
  76. package/src/assets/images/not-found.png +0 -0
  77. package/src/composables/featureFlag.ts +22 -0
  78. package/src/composables/useBusinessFeatureFlag.ts +44 -0
  79. package/src/composables/useLegacyOdsAccess.ts +35 -0
  80. package/src/composables/useMiniProgramPermission.ts +19 -0
  81. package/src/composables/useQrOrderingEnabled.ts +1 -21
  82. package/src/locales/en-US.json +188 -0
  83. package/src/locales/ja-JP.json +188 -0
  84. package/src/locales/th-TH.json +188 -0
  85. package/src/locales/zh-CN.json +188 -0
  86. package/src/modules/display-system/legacy-ods/interface.ts +108 -0
  87. package/src/router/routes.ts +1 -1
  88. package/src/views/display-system/DisplaySystemView.vue +82 -11
  89. package/src/views/display-system/legacy-ods/ColorOverrideDialog.vue +223 -0
  90. package/src/views/display-system/legacy-ods/ColorSelection.vue +67 -0
  91. package/src/views/display-system/legacy-ods/LegacyOdsEditorDialog.spec.ts +185 -0
  92. package/src/views/display-system/legacy-ods/LegacyOdsEditorDialog.vue +1677 -0
  93. package/src/views/display-system/legacy-ods/LegacyOdsTemplateList.spec.ts +124 -0
  94. package/src/views/display-system/legacy-ods/LegacyOdsTemplateList.vue +297 -0
  95. package/src/views/display-system/legacy-ods/brandkit.spec.ts +67 -0
  96. package/src/views/display-system/view-selection.spec.ts +93 -0
  97. package/src/views/display-system/view-selection.ts +54 -0
  98. package/src/views/order-settings/OrderSettingsView.vue +9 -2
  99. package/src/views/order-settings/delivery/delivery.spec.ts +21 -0
  100. package/src/views/order-settings/delivery/delivery.ts +2 -51
  101. package/src/views/order-settings/dine-in/DineInSetting.vue +11 -1
  102. package/src/views/order-settings/reservation/CopySettingsSheet.vue +256 -0
  103. package/src/views/order-settings/reservation/CustomTimePicker.vue +311 -0
  104. package/src/views/order-settings/reservation/ReservationSetting.vue +1549 -0
  105. package/vitest.config.ts +2 -1
  106. package/dist/DisplaySystemView-n7Kqdw-h.js +0 -6564
  107. package/dist/_plugin-vue_export-helper-CHgC5LLL.js +0 -9
  108. package/dist/order.dto-DV1qL3Q_.js +0 -40301
@@ -0,0 +1,185 @@
1
+ // @vitest-environment happy-dom
2
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
3
+ import { mount, type VueWrapper } from '@vue/test-utils'
4
+ import { ref } from 'vue'
5
+ import type { OdsConfigEntry } from '@/modules/display-system/legacy-ods/interface'
6
+
7
+ const access = {
8
+ canAccessOdsTemplateSettings: ref(true),
9
+ isAdvancedCustomizationEnabled: ref(false)
10
+ }
11
+ vi.mock('@/composables/useLegacyOdsAccess', () => ({ useLegacyOdsAccess: () => access }))
12
+ vi.mock('@feedmepos/media-picker', () => ({
13
+ MediaPickerModal: {
14
+ name: 'MediaPickerModal',
15
+ props: ['open', 'businessId', 'kinds', 'zIndex'],
16
+ template: '<div />'
17
+ }
18
+ }))
19
+ vi.mock('@feedmepos/mf-common', () => ({
20
+ RestaurantSelector: { name: 'RestaurantSelector', template: '<div />' },
21
+ useCoreStore: () => ({ currentBusiness: ref({ _id: 'business' }), namespace: ref('dev') }),
22
+ useI18n: () => ({ t: (key: string) => key })
23
+ }))
24
+ vi.mock('./ColorOverrideDialog.vue', () => ({ default: { template: '<div />' } }))
25
+ import Editor from './LegacyOdsEditorDialog.vue'
26
+
27
+ const wrappers: VueWrapper[] = []
28
+ beforeEach(() => {
29
+ access.canAccessOdsTemplateSettings.value = true
30
+ access.isAdvancedCustomizationEnabled.value = false
31
+ vi.stubGlobal(
32
+ 'ResizeObserver',
33
+ class {
34
+ observe() {}
35
+ disconnect() {}
36
+ }
37
+ )
38
+ })
39
+ afterEach(() => {
40
+ wrappers.forEach((wrapper) => wrapper.unmount())
41
+ wrappers.length = 0
42
+ vi.unstubAllGlobals()
43
+ })
44
+
45
+ async function editor(entry: OdsConfigEntry = { isDefault: true, label: '默认 🍵' }) {
46
+ const wrapper = mount(Editor, {
47
+ props: {
48
+ modelValue: false,
49
+ entry,
50
+ editingIndex: 0,
51
+ allEntries: [entry],
52
+ brandkit: { colors: { primary: '#123456' } } as never,
53
+ colorFields: []
54
+ },
55
+ global: {
56
+ stubs: {
57
+ Teleport: true,
58
+ FmButton: {
59
+ props: ['label', 'disabled'],
60
+ template: '<button :disabled="disabled">{{ label }}</button>'
61
+ },
62
+ FmIcon: true,
63
+ FmTextField: true,
64
+ FmSwitch: true,
65
+ FmButtonGroup: true,
66
+ FmStepperField: true,
67
+ FmRadio: true
68
+ }
69
+ }
70
+ })
71
+ wrappers.push(wrapper)
72
+ await wrapper.setProps({ modelValue: true })
73
+ return wrapper
74
+ }
75
+ async function confirm(wrapper: VueWrapper) {
76
+ await wrapper
77
+ .findAll('button')
78
+ .find((button) => button.text().endsWith('.confirm'))!
79
+ .trigger('click')
80
+ // The list closes the editor only once the save has landed.
81
+ expect(wrapper.emitted('update:modelValue')).toBeUndefined()
82
+ return wrapper.emitted('save')![0][0] as OdsConfigEntry
83
+ }
84
+
85
+ function previewBrandKit(wrapper: VueWrapper) {
86
+ const url = new URL(wrapper.get('iframe').attributes('src'))
87
+ expect(url.origin).toBe('https://v2-dev.feedme-ods.pages.dev')
88
+ expect(url.searchParams.get('preview')).toBe('1')
89
+ return JSON.parse(Buffer.from(url.searchParams.get('brandKit')!, 'base64url').toString('utf8'))
90
+ }
91
+
92
+ describe('legacy ODS editor', () => {
93
+ it('keeps collected-order hiding across preset changes and previews the draft as default', async () => {
94
+ const wrapper = await editor({
95
+ isDefault: false,
96
+ label: '默认 🍵',
97
+ restaurantIds: ['outlet'],
98
+ display: { hideCompletedOrders: true } as never
99
+ })
100
+ const presets = wrapper.findAllComponents({ name: 'FmButtonGroup' })[0]
101
+ presets.vm.$emit('update:modelValue', { value: 'preset2' })
102
+ await wrapper.vm.$nextTick()
103
+ const preview = previewBrandKit(wrapper)
104
+ expect(preview.colors.primary).toBe('#123456')
105
+ expect(preview.ods[0]).toMatchObject({
106
+ isDefault: true,
107
+ layout: { background: null, sidePanel: { url: '/images/feedme-side.png' } },
108
+ display: { groupBy: 'status', hideCompletedOrders: true }
109
+ })
110
+ const saved = await confirm(wrapper)
111
+ expect(saved.label).toBe('默认 🍵')
112
+ expect(saved.restaurantIds).toEqual(['outlet'])
113
+ expect(saved.isDefault).toBe(false)
114
+ expect(saved.display?.hideCompletedOrders).toBe(true)
115
+ })
116
+
117
+ it('leaves metadata, outlet selection and presets editable without the template flag', async () => {
118
+ access.canAccessOdsTemplateSettings.value = false
119
+ const wrapper = await editor({ isDefault: false, label: 'Existing', restaurantIds: ['outlet'] })
120
+ const label = wrapper.findComponent({ name: 'FmTextField' })
121
+ expect(label.attributes('disabled')).toBeUndefined()
122
+ label.vm.$emit('update:modelValue', 'Renamed')
123
+ const selector = wrapper.findComponent({ name: 'RestaurantSelector' })
124
+ expect(selector.attributes('disabled')).toBeUndefined()
125
+ expect(selector.attributes('managable-only')).toBe('false')
126
+ selector.vm.$emit('update:modelValue', ['other-outlet'])
127
+ const defaultSwitch = wrapper
128
+ .findAllComponents({ name: 'FmSwitch' })
129
+ .find((item) => item.attributes('label')?.endsWith('.defaultConfiguration'))!
130
+ expect(defaultSwitch.attributes('disabled')).toBeUndefined()
131
+ defaultSwitch.vm.$emit('update:modelValue', true)
132
+ const presets = wrapper.findComponent({ name: 'FmButtonGroup' })
133
+ expect(presets.attributes('disabled')).toBeUndefined()
134
+ presets.vm.$emit('update:modelValue', { value: 'preset2' })
135
+ const hide = wrapper
136
+ .findAllComponents({ name: 'FmSwitch' })
137
+ .find((item) => item.attributes('label')?.endsWith('.hideCollectedOrders'))!
138
+ hide.vm.$emit('update:modelValue', true)
139
+ const saved = await confirm(wrapper)
140
+ expect(saved).toMatchObject({
141
+ label: 'Renamed',
142
+ isDefault: true,
143
+ restaurantIds: ['other-outlet'],
144
+ layout: { background: null, sidePanel: { url: '/images/feedme-side.png' } },
145
+ display: { groupBy: 'status', hideCompletedOrders: true }
146
+ })
147
+ expect(wrapper.text()).not.toContain('order.displaySystem.legacyOds.displaySettingsDescription')
148
+ expect(wrapper.text()).not.toContain('order.displaySystem.legacyOds.layoutSettingsDescription')
149
+ })
150
+
151
+ it('replaces a custom image with one picked from the media library', async () => {
152
+ const media = 'https://image.feedmedev.vip/media-image/business/asset/a1/main'
153
+ const wrapper = await editor({
154
+ isDefault: true,
155
+ layout: {
156
+ background: { url: 'https://image.feedmedev.vip/business/business/ods/background/old.png' },
157
+ sidePanel: null
158
+ }
159
+ })
160
+ const picker = () => wrapper.findComponent({ name: 'MediaPickerModal' })
161
+ expect(picker().props()).toMatchObject({ open: false, businessId: 'business', kinds: ['image'] })
162
+ await wrapper
163
+ .findAll('button')
164
+ .find((button) => button.text().endsWith('.changeImage'))!
165
+ .trigger('click')
166
+ expect(picker().props('open')).toBe(true)
167
+ picker().vm.$emit('select', { url: media, kind: 'image' })
168
+ await wrapper.vm.$nextTick()
169
+ expect(picker().props('open')).toBe(false)
170
+ const saved = await confirm(wrapper)
171
+ expect(saved.layout?.background).toMatchObject({
172
+ url: media,
173
+ size: 'cover',
174
+ position: 'center'
175
+ })
176
+ })
177
+
178
+ it('shows advanced controls only when the advanced flag is enabled', async () => {
179
+ const wrapper = await editor()
180
+ expect(wrapper.text()).not.toContain('order.displaySystem.legacyOds.footerModeDescription')
181
+ access.isAdvancedCustomizationEnabled.value = true
182
+ await wrapper.vm.$nextTick()
183
+ expect(wrapper.text()).toContain('order.displaySystem.legacyOds.footerModeDescription')
184
+ })
185
+ })