@operato/form 2.0.0-alpha.94 → 2.0.0-beta.0

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