@operato/form 8.0.0-beta.0 → 8.0.0-beta.1

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 (40) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/package.json +7 -7
  3. package/.editorconfig +0 -29
  4. package/.storybook/main.js +0 -3
  5. package/.storybook/preview.js +0 -52
  6. package/.storybook/server.mjs +0 -8
  7. package/src/components/ox-custom-input.ts +0 -102
  8. package/src/components/ox-custom-select.ts +0 -91
  9. package/src/components/ox-file-uploader.ts +0 -164
  10. package/src/components/ox-form-master.ts +0 -246
  11. package/src/components/ox-form-paginator.ts +0 -60
  12. package/src/components/ox-search-form-paginator.ts +0 -46
  13. package/src/components/ox-search-form.ts +0 -467
  14. package/src/filters/filter-checkbox.ts +0 -34
  15. package/src/filters/filter-input-barcode.ts +0 -35
  16. package/src/filters/filter-input.ts +0 -30
  17. package/src/filters/filter-range-date.ts +0 -81
  18. package/src/filters/filter-range-number.ts +0 -64
  19. package/src/filters/filter-select.ts +0 -56
  20. package/src/filters/filter-styles.ts +0 -127
  21. package/src/filters/index.ts +0 -10
  22. package/src/filters/ox-filter-personalizer.ts +0 -188
  23. package/src/filters/ox-filters-form-base.ts +0 -437
  24. package/src/filters/registry.ts +0 -54
  25. package/src/index.ts +0 -4
  26. package/src/styles/index.ts +0 -3
  27. package/src/styles/multi-column-form-styles.ts +0 -192
  28. package/src/styles/search-form-styles.ts +0 -160
  29. package/src/styles/single-column-form-styles.ts +0 -114
  30. package/src/types.ts +0 -106
  31. package/stories/ox-filters-form-barcode.stories.ts +0 -140
  32. package/stories/ox-filters-form-base-bounded.stories.ts +0 -208
  33. package/stories/ox-filters-form-base-change-handler.stories.ts +0 -220
  34. package/stories/ox-filters-form-base-page-preference.stories.ts +0 -177
  35. package/stories/ox-filters-form-base.stories.ts +0 -179
  36. package/stories/ox-search-form-change-handler.stories.ts +0 -253
  37. package/stories/ox-search-form.stories.ts +0 -258
  38. package/tsconfig.json +0 -24
  39. package/web-dev-server.config.mjs +0 -27
  40. package/web-test-runner.config.mjs +0 -41
@@ -1,208 +0,0 @@
1
- import { CommonHeaderStyles } from '@operato/styles'
2
- import { sleep } from '@operato/utils'
3
- import '../src/filters/ox-filters-form-base.js'
4
-
5
- import { html, TemplateResult } from 'lit'
6
- import { styles as MDTypeScaleStyles } from '@material/web/typography/md-typescale-styles'
7
-
8
- import { OxFiltersFormBase, FilterConfig, FilterValue } from '../src/index.js'
9
-
10
- export default {
11
- title: 'ox-filters-form-base bounded',
12
- component: 'ox-filters-form-base',
13
- argTypes: {
14
- value: { control: 'object' },
15
- filters: { control: 'object' },
16
- urlParamsSensitive: { control: 'boolean' }
17
- }
18
- }
19
-
20
- interface Story<T> {
21
- (args: T): TemplateResult
22
- args?: Partial<T>
23
- argTypes?: Record<string, unknown>
24
- }
25
-
26
- interface ArgTypes {
27
- value?: FilterValue[]
28
- filters?: FilterConfig[]
29
- urlParamsSensitive: boolean
30
- }
31
-
32
- const Template: Story<ArgTypes> = ({ value, filters, urlParamsSensitive }: ArgTypes) => html`
33
- <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet" />
34
-
35
- <link href="/themes/light.css" rel="stylesheet" />
36
- <link href="/themes/dark.css" rel="stylesheet" />
37
- <link href="/themes/spacing.css" rel="stylesheet" />
38
- <link href="/themes/form-theme.css" rel="stylesheet" />
39
-
40
- <link
41
- href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
42
- rel="stylesheet"
43
- />
44
- <link
45
- href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL@20..48,100..700,0..1"
46
- rel="stylesheet"
47
- />
48
- <link
49
- href="https://fonts.googleapis.com/css2?family=Material+Symbols+Sharp:opsz,wght,FILL@20..48,100..700,0..1"
50
- rel="stylesheet"
51
- />
52
-
53
- <style>
54
- ${MDTypeScaleStyles.cssText}
55
- </style>
56
-
57
- <style>
58
- ${CommonHeaderStyles.cssText}
59
- </style>
60
-
61
- <style>
62
- body {
63
- width: 100%;
64
- height: 500px;
65
- text-align: center;
66
-
67
- background-color: var(--md-sys-color-background);
68
- color: var(--md-sys-color-on-background);
69
- }
70
-
71
- .header {
72
- padding: var(--spacing-medium);
73
- background-color: var(--md-sys-color-primary-container);
74
- color: var(--md-sys-color-on-primary-container);
75
- }
76
- </style>
77
-
78
- <div class="header">
79
- <div class="filters">
80
- <ox-filters-form-base
81
- .value=${value!}
82
- .filters=${filters!}
83
- ?url-params-sensitive=${urlParamsSensitive}
84
- @filters-change=${(e: CustomEvent) => {}}
85
- >
86
- </ox-filters-form-base>
87
- </div>
88
- </div>
89
- `
90
-
91
- const WAREHOUSE = [
92
- {
93
- id: '01',
94
- name: '제 1 창고',
95
- zones: [
96
- {
97
- id: 'W1Z001',
98
- name: 'Zone 01-001',
99
- locations: ['L01-001-01', 'L01-001-02', 'L01-001-03', 'L01-001-04', 'L01-001-05']
100
- },
101
- {
102
- id: 'W1Z002',
103
- name: 'Zone 01-002',
104
- locations: ['L01-002-01', 'L01-002-02', 'L01-002-03', 'L01-002-04', 'L01-002-05']
105
- }
106
- ]
107
- },
108
- {
109
- id: '02',
110
- name: '제 2 창고',
111
- zones: [
112
- {
113
- id: 'W2Z001',
114
- name: 'Zone 02-001',
115
- locations: ['L02-001-01', 'L02-001-02', 'L02-001-03', 'L02-001-04', 'L02-001-05']
116
- },
117
- {
118
- id: 'W2Z002',
119
- name: 'Zone 02-002',
120
- locations: ['L02-002-01', 'L02-002-02', 'L02-002-03', 'L02-002-04', 'L02-002-05']
121
- }
122
- ]
123
- }
124
- ]
125
-
126
- export const Regular = Template.bind({})
127
- Regular.args = {
128
- filters: [
129
- {
130
- name: 'warehouse',
131
- type: 'select',
132
- label: 'warehouse',
133
- operator: 'eq',
134
- value: '01',
135
- options: async (form: OxFiltersFormBase) => {
136
- await sleep(1000) // 테스트를 위해서 강제로 1초 쉬기
137
- return [
138
- {
139
- display: '',
140
- value: ''
141
- }
142
- ].concat(
143
- WAREHOUSE.map(w => {
144
- return {
145
- display: w.name,
146
- value: w.id
147
- }
148
- })
149
- )
150
- }
151
- },
152
- {
153
- name: 'zone',
154
- type: 'select',
155
- label: 'zone',
156
- operator: 'eq',
157
- value: 'W1Z001',
158
- boundTo: ['warehouse'],
159
- options: async (form: OxFiltersFormBase) => {
160
- await sleep(1000) // 테스트를 위해서 강제로 1초 쉬기
161
- const formData = new FormData(await form.form)
162
- const warehouse = formData?.get('warehouse')
163
- console.log('warehouse', warehouse)
164
-
165
- const targetWH = warehouse && WAREHOUSE.find(w => w.id == warehouse)
166
- const zones = targetWH
167
- ? targetWH.zones
168
- : WAREHOUSE.reduce((sum, warehouse) => {
169
- sum = sum.concat(warehouse.zones)
170
- return sum
171
- }, [] as any[])
172
-
173
- return [
174
- {
175
- display: '',
176
- value: ''
177
- }
178
- ].concat(
179
- zones.map((z: any) => {
180
- return {
181
- display: z.name,
182
- value: z.id
183
- }
184
- })
185
- )
186
- }
187
- },
188
- {
189
- name: 'location',
190
- type: 'select',
191
- label: 'location',
192
- operator: 'eq',
193
- value: '',
194
- boundTo: ['warehouse', 'zone'],
195
- options: async (form: OxFiltersFormBase) => {
196
- await sleep(1000) // 테스트를 위해서 강제로 1초 쉬기
197
- const formData = new FormData(await form.form)
198
- const warehouse = formData?.get('warehouse')
199
- const zone = formData?.get('zone')
200
- console.log('warehouse, zone', warehouse, zone)
201
-
202
- const targetWH = (warehouse && WAREHOUSE.find(w => w.id == warehouse)) || null
203
- const targetZone = zone && targetWH?.zones.find(z => z.id == zone)
204
- return targetZone ? ['', ...targetZone.locations] : []
205
- }
206
- }
207
- ]
208
- }
@@ -1,220 +0,0 @@
1
- import { CommonHeaderStyles } from '@operato/styles'
2
- import { sleep } from '@operato/utils'
3
- import '../src/filters/ox-filters-form-base.js'
4
-
5
- import { html, TemplateResult } from 'lit'
6
- import { styles as MDTypeScaleStyles } from '@material/web/typography/md-typescale-styles'
7
-
8
- import { OxFiltersFormBase, FilterConfig, FilterValue } from '../src/index.js'
9
-
10
- export default {
11
- title: 'ox-filters-form-base change-handler',
12
- component: 'ox-filters-form-base',
13
- argTypes: {
14
- value: { control: 'object' },
15
- filters: { control: 'object' },
16
- urlParamsSensitive: { control: 'boolean' }
17
- }
18
- }
19
-
20
- interface Story<T> {
21
- (args: T): TemplateResult
22
- args?: Partial<T>
23
- argTypes?: Record<string, unknown>
24
- }
25
-
26
- interface ArgTypes {
27
- value?: FilterValue[]
28
- filters?: FilterConfig[]
29
- urlParamsSensitive: boolean
30
- }
31
-
32
- const Template: Story<ArgTypes> = ({ value, filters, urlParamsSensitive }: ArgTypes) => html`
33
- <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet" />
34
-
35
- <link href="/themes/light.css" rel="stylesheet" />
36
- <link href="/themes/dark.css" rel="stylesheet" />
37
- <link href="/themes/spacing.css" rel="stylesheet" />
38
- <link href="/themes/form-theme.css" rel="stylesheet" />
39
-
40
- <link
41
- href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
42
- rel="stylesheet"
43
- />
44
- <link
45
- href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL@20..48,100..700,0..1"
46
- rel="stylesheet"
47
- />
48
- <link
49
- href="https://fonts.googleapis.com/css2?family=Material+Symbols+Sharp:opsz,wght,FILL@20..48,100..700,0..1"
50
- rel="stylesheet"
51
- />
52
-
53
- <style>
54
- ${MDTypeScaleStyles.cssText}
55
- </style>
56
-
57
- <style>
58
- ${CommonHeaderStyles.cssText}
59
- </style>
60
-
61
- <style>
62
- body {
63
- width: 100%;
64
- height: 500px;
65
- text-align: center;
66
-
67
- background-color: var(--md-sys-color-background);
68
- color: var(--md-sys-color-on-background);
69
- }
70
-
71
- .header {
72
- padding: var(--spacing-medium);
73
- background-color: var(--md-sys-color-primary-container);
74
- color: var(--md-sys-color-on-primary-container);
75
- }
76
- </style>
77
-
78
- <div class="header">
79
- <div class="filters">
80
- <ox-filters-form-base
81
- .value=${value!}
82
- .filters=${filters!}
83
- ?url-params-sensitive=${urlParamsSensitive}
84
- @filters-change=${(e: CustomEvent) => {
85
- const { filters } = e.detail
86
- const { value } = e.currentTarget as any
87
- console.log('filters-change event fired', filters, value, e.currentTarget)
88
- }}
89
- >
90
- </ox-filters-form-base>
91
- </div>
92
- </div>
93
- `
94
-
95
- const WAREHOUSE = [
96
- {
97
- id: '01',
98
- name: '제 1 창고',
99
- zones: [
100
- {
101
- id: 'W1Z001',
102
- name: 'Zone 01-001',
103
- locations: ['L01-001-01', 'L01-001-02', 'L01-001-03', 'L01-001-04', 'L01-001-05']
104
- },
105
- {
106
- id: 'W1Z002',
107
- name: 'Zone 01-002',
108
- locations: ['L01-002-01', 'L01-002-02', 'L01-002-03', 'L01-002-04', 'L01-002-05']
109
- }
110
- ]
111
- },
112
- {
113
- id: '02',
114
- name: '제 2 창고',
115
- zones: [
116
- {
117
- id: 'W2Z001',
118
- name: 'Zone 02-001',
119
- locations: ['L02-001-01', 'L02-001-02', 'L02-001-03', 'L02-001-04', 'L02-001-05']
120
- },
121
- {
122
- id: 'W2Z002',
123
- name: 'Zone 02-002',
124
- locations: ['L02-002-01', 'L02-002-02', 'L02-002-03', 'L02-002-04', 'L02-002-05']
125
- }
126
- ]
127
- }
128
- ]
129
-
130
- export const Regular = Template.bind({})
131
- Regular.args = {
132
- filters: [
133
- {
134
- name: 'warehouse',
135
- type: 'select',
136
- label: 'warehouse',
137
- operator: 'eq',
138
- value: '01',
139
- options: async (form: OxFiltersFormBase) => {
140
- await sleep(1000) // 테스트를 위해서 강제로 1초 쉬기
141
- return [
142
- {
143
- display: '',
144
- value: ''
145
- }
146
- ].concat(
147
- WAREHOUSE.map(w => {
148
- return {
149
- display: w.name,
150
- value: w.id
151
- }
152
- })
153
- )
154
- },
155
- onchange: async (value: any, form: OxFiltersFormBase) => {
156
- await sleep(1000)
157
- console.log("won't submit..")
158
- return false
159
- }
160
- },
161
- {
162
- name: 'zone',
163
- type: 'select',
164
- label: 'zone',
165
- operator: 'eq',
166
- value: 'W1Z001',
167
- boundTo: ['warehouse'],
168
- options: async (form: OxFiltersFormBase) => {
169
- await sleep(1000) // 테스트를 위해서 강제로 1초 쉬기
170
- const formData = new FormData(await form.form)
171
- const warehouse = formData?.get('warehouse')
172
- console.log('warehouse', warehouse)
173
-
174
- const targetWH = warehouse && WAREHOUSE.find(w => w.id == warehouse)
175
- const zones = targetWH
176
- ? targetWH.zones
177
- : WAREHOUSE.reduce((sum, warehouse) => {
178
- sum = sum.concat(warehouse.zones)
179
- return sum
180
- }, [] as any[])
181
-
182
- return [
183
- {
184
- display: '',
185
- value: ''
186
- }
187
- ].concat(
188
- zones.map((z: any) => {
189
- return {
190
- display: z.name,
191
- value: z.id
192
- }
193
- })
194
- )
195
- },
196
- onchange: () => {
197
- return false
198
- }
199
- },
200
- {
201
- name: 'location',
202
- type: 'select',
203
- label: 'location',
204
- operator: 'eq',
205
- value: '',
206
- boundTo: ['warehouse', 'zone'],
207
- options: async (form: OxFiltersFormBase) => {
208
- await sleep(1000) // 테스트를 위해서 강제로 1초 쉬기
209
- const formData = new FormData(await form.form)
210
- const warehouse = formData?.get('warehouse')
211
- const zone = formData?.get('zone')
212
- console.log('warehouse, zone', warehouse, zone)
213
-
214
- const targetWH = (warehouse && WAREHOUSE.find(w => w.id == warehouse)) || null
215
- const targetZone = zone && targetWH?.zones.find(z => z.id == zone)
216
- return targetZone ? ['', ...targetZone.locations] : []
217
- }
218
- }
219
- ]
220
- }
@@ -1,177 +0,0 @@
1
- import '../src/filters/ox-filters-form-base.js'
2
- import '../src/filters/ox-filter-personalizer.js'
3
-
4
- import { html, TemplateResult } from 'lit'
5
- import { sleep } from '@operato/utils'
6
- import { CommonHeaderStyles } from '@operato/styles'
7
-
8
- import { OxFiltersFormBase, FilterConfig, FilterValue } from '../src/index.js'
9
- import { PersonalFilterPreference } from '../src/types.js'
10
-
11
- export default {
12
- title: 'ox-filters-form-base page-preference',
13
- component: 'ox-filters-form-base',
14
- argTypes: {
15
- value: { control: 'object' },
16
- filters: { control: 'object' },
17
- urlParamsSensitive: { control: 'boolean' }
18
- }
19
- }
20
-
21
- interface Story<T> {
22
- (args: T): TemplateResult
23
- args?: Partial<T>
24
- argTypes?: Record<string, unknown>
25
- }
26
-
27
- interface ArgTypes {
28
- value?: FilterValue[]
29
- filters?: FilterConfig[]
30
- urlParamsSensitive: boolean
31
- }
32
-
33
- const Template: Story<ArgTypes> = ({ value, filters, urlParamsSensitive }: ArgTypes) => html`
34
- <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet" />
35
-
36
- <link href="/themes/light.css" rel="stylesheet" />
37
- <link href="/themes/dark.css" rel="stylesheet" />
38
- <link href="/themes/spacing.css" rel="stylesheet" />
39
- <link href="/themes/form-theme.css" rel="stylesheet" />
40
-
41
- <link
42
- href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
43
- rel="stylesheet"
44
- />
45
- <link
46
- href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL@20..48,100..700,0..1"
47
- rel="stylesheet"
48
- />
49
- <link
50
- href="https://fonts.googleapis.com/css2?family=Material+Symbols+Sharp:opsz,wght,FILL@20..48,100..700,0..1"
51
- rel="stylesheet"
52
- />
53
-
54
- <style>
55
- body {
56
- height: 500px;
57
- }
58
- </style>
59
-
60
- <style>
61
- div.filters {
62
- position: relative;
63
- }
64
-
65
- ox-filter-personalizer {
66
- position: absolute;
67
- top: 0;
68
- right: 0;
69
- }
70
-
71
- ${CommonHeaderStyles.cssText}
72
- </style>
73
-
74
- <div class="header">
75
- <div class="filters">
76
- <ox-filters-form-base
77
- .value=${value!}
78
- .filters=${filters!}
79
- ?url-params-sensitive=${urlParamsSensitive}
80
- .personalConfigProvider=${{
81
- async load() {
82
- await sleep(1000)
83
- return {
84
- filters: [
85
- { name: 'name', hidden: false, value: 'abc' },
86
- { name: 'description', hidden: true }
87
- ]
88
- }
89
- },
90
- async save(preference: PersonalFilterPreference) {
91
- await sleep(1000)
92
- console.log('saving preference', preference)
93
- return preference
94
- },
95
- async reset() {
96
- await sleep(1000)
97
- }
98
- }}
99
- @filters-change=${(e: CustomEvent) => {
100
- console.log('filters changed', e.detail)
101
- }}
102
- >
103
- <ox-filter-personalizer slot="setting"></ox-filter-personalizer>
104
- </ox-filters-form-base>
105
- </div>
106
- </div>
107
- `
108
-
109
- export const Regular = Template.bind({})
110
- Regular.args = {
111
- filters: [
112
- {
113
- name: 'search',
114
- type: 'search',
115
- label: 'search',
116
- operator: 'eq'
117
- },
118
- {
119
- name: 'test',
120
- type: 'string',
121
- label: 'name',
122
- operator: 'eq',
123
- value: 'No Name'
124
- },
125
- {
126
- name: 'active',
127
- type: 'boolean',
128
- label: 'active',
129
- operator: 'eq',
130
- value: true,
131
- onchange: (value, formBase: OxFiltersFormBase) => {
132
- const sss = formBase.getFieldByName('sss') as HTMLInputElement
133
- sss.value = value ? 'DEF' : 'ABC'
134
-
135
- return false
136
- }
137
- },
138
- {
139
- name: 'sss',
140
- type: 'select',
141
- label: 'sss',
142
- operator: 'eq',
143
- options: () => {
144
- return [
145
- {
146
- display: '',
147
- value: ''
148
- },
149
- {
150
- display: 'ABC',
151
- value: 'ABC'
152
- },
153
- {
154
- display: 'DEF',
155
- value: 'DEF'
156
- }
157
- ]
158
- }
159
- },
160
- {
161
- name: 'range',
162
- type: 'number',
163
- label: 'range',
164
- operator: 'between'
165
- },
166
- {
167
- name: 'date-range',
168
- type: 'date',
169
- label: 'date',
170
- operator: 'between',
171
- value: [
172
- { name: 'week', params: { relativeWeeks: -1 } },
173
- { name: 'today', params: { relativeDays: +1 } }
174
- ]
175
- }
176
- ]
177
- }