@operato/form 1.13.9 → 2.0.0-alpha.103

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 (91) hide show
  1. package/CHANGELOG.md +165 -1
  2. package/demo/index.html +14 -3
  3. package/dist/src/components/ox-custom-input.d.ts +1 -1
  4. package/dist/src/components/ox-custom-select.d.ts +1 -1
  5. package/dist/src/components/ox-file-uploader.d.ts +1 -1
  6. package/dist/src/components/ox-file-uploader.js +7 -7
  7. package/dist/src/components/ox-file-uploader.js.map +1 -1
  8. package/dist/src/components/ox-form-paginator.d.ts +1 -1
  9. package/dist/src/components/ox-search-form.d.ts +10 -25
  10. package/dist/src/components/ox-search-form.js +163 -89
  11. package/dist/src/components/ox-search-form.js.map +1 -1
  12. package/dist/src/filters/filter-checkbox.d.ts +1 -1
  13. package/dist/src/filters/filter-checkbox.js +4 -2
  14. package/dist/src/filters/filter-checkbox.js.map +1 -1
  15. package/dist/src/filters/filter-input-barcode.d.ts +1 -1
  16. package/dist/src/filters/filter-input-barcode.js +2 -2
  17. package/dist/src/filters/filter-input-barcode.js.map +1 -1
  18. package/dist/src/filters/filter-input.d.ts +1 -1
  19. package/dist/src/filters/filter-input.js.map +1 -1
  20. package/dist/src/filters/filter-range-date.d.ts +1 -1
  21. package/dist/src/filters/filter-range-date.js +14 -3
  22. package/dist/src/filters/filter-range-date.js.map +1 -1
  23. package/dist/src/filters/filter-range-number.d.ts +1 -1
  24. package/dist/src/filters/filter-range-number.js.map +1 -1
  25. package/dist/src/filters/filter-select.d.ts +1 -1
  26. package/dist/src/filters/filter-select.js +23 -11
  27. package/dist/src/filters/filter-select.js.map +1 -1
  28. package/dist/src/filters/filter-styles.js +38 -28
  29. package/dist/src/filters/filter-styles.js.map +1 -1
  30. package/dist/src/filters/index.d.ts +1 -1
  31. package/dist/src/filters/index.js +1 -1
  32. package/dist/src/filters/index.js.map +1 -1
  33. package/dist/src/filters/ox-filters-form-base.d.ts +8 -9
  34. package/dist/src/filters/ox-filters-form-base.js +126 -72
  35. package/dist/src/filters/ox-filters-form-base.js.map +1 -1
  36. package/dist/src/filters/registry.d.ts +1 -1
  37. package/dist/src/filters/registry.js.map +1 -1
  38. package/dist/src/styles/search-form-styles.js +1 -1
  39. package/dist/src/styles/search-form-styles.js.map +1 -1
  40. package/dist/src/types.d.ts +59 -0
  41. package/dist/src/types.js.map +1 -0
  42. package/dist/stories/{ox-filter-form-barcode.stories.js → ox-filters-form-barcode.stories.js} +29 -12
  43. package/dist/stories/ox-filters-form-barcode.stories.js.map +1 -0
  44. package/dist/stories/{ox-filter-form-base.stories.d.ts → ox-filters-form-base-bounded.stories.d.ts} +3 -2
  45. package/dist/stories/ox-filters-form-base-bounded.stories.js +182 -0
  46. package/dist/stories/ox-filters-form-base-bounded.stories.js.map +1 -0
  47. package/dist/stories/ox-filters-form-base-change-handler.stories.d.ts +30 -0
  48. package/dist/stories/ox-filters-form-base-change-handler.stories.js +194 -0
  49. package/dist/stories/ox-filters-form-base-change-handler.stories.js.map +1 -0
  50. package/dist/stories/ox-filters-form-base-dependencies.stories.d.ts +30 -0
  51. package/dist/stories/ox-filters-form-base-dependencies.stories.js +182 -0
  52. package/dist/stories/ox-filters-form-base-dependencies.stories.js.map +1 -0
  53. package/dist/stories/ox-filters-form-base.stories.d.ts +30 -0
  54. package/dist/stories/ox-filters-form-base.stories.js +142 -0
  55. package/dist/stories/ox-filters-form-base.stories.js.map +1 -0
  56. package/dist/stories/ox-search-form.stories.d.ts +34 -0
  57. package/dist/stories/ox-search-form.stories.js +219 -0
  58. package/dist/stories/ox-search-form.stories.js.map +1 -0
  59. package/dist/tsconfig.tsbuildinfo +1 -1
  60. package/package.json +17 -16
  61. package/src/components/ox-file-uploader.ts +7 -7
  62. package/src/components/ox-search-form.ts +195 -122
  63. package/src/filters/filter-checkbox.ts +5 -3
  64. package/src/filters/filter-input-barcode.ts +3 -3
  65. package/src/filters/filter-input.ts +1 -1
  66. package/src/filters/filter-range-date.ts +21 -6
  67. package/src/filters/filter-range-number.ts +1 -1
  68. package/src/filters/filter-select.ts +29 -20
  69. package/src/filters/filter-styles.ts +38 -28
  70. package/src/filters/index.ts +1 -1
  71. package/src/filters/ox-filters-form-base.ts +136 -72
  72. package/src/filters/registry.ts +1 -1
  73. package/src/styles/search-form-styles.ts +1 -1
  74. package/src/types.ts +96 -0
  75. package/stories/{ox-filter-form-barcode.stories.ts → ox-filters-form-barcode.stories.ts} +30 -13
  76. package/stories/ox-filters-form-base-bounded.stories.ts +206 -0
  77. package/stories/ox-filters-form-base-change-handler.stories.ts +218 -0
  78. package/stories/ox-filters-form-base.stories.ts +159 -0
  79. package/stories/ox-search-form.stories.ts +244 -0
  80. package/themes/app-theme.css +7 -7
  81. package/themes/form-theme.css +1 -1
  82. package/themes/input-theme.css +32 -0
  83. package/dist/src/filters/types.d.ts +0 -17
  84. package/dist/src/filters/types.js.map +0 -1
  85. package/dist/stories/ox-filter-form-barcode.stories.js.map +0 -1
  86. package/dist/stories/ox-filter-form-base.stories.js +0 -82
  87. package/dist/stories/ox-filter-form-base.stories.js.map +0 -1
  88. package/src/filters/types.ts +0 -47
  89. package/stories/ox-filter-form-base.stories.ts +0 -97
  90. /package/dist/src/{filters/types.js → types.js} +0 -0
  91. /package/dist/stories/{ox-filter-form-barcode.stories.d.ts → ox-filters-form-barcode.stories.d.ts} +0 -0
@@ -0,0 +1,30 @@
1
+ import '../src/filters/ox-filters-form-base.js';
2
+ import { TemplateResult } from 'lit';
3
+ import { FilterConfig, FilterValue } from '../src/index.js';
4
+ declare const _default: {
5
+ title: string;
6
+ component: string;
7
+ argTypes: {
8
+ value: {
9
+ control: string;
10
+ };
11
+ filters: {
12
+ control: string;
13
+ };
14
+ urlParamsSensitive: {
15
+ control: string;
16
+ };
17
+ };
18
+ };
19
+ export default _default;
20
+ interface Story<T> {
21
+ (args: T): TemplateResult;
22
+ args?: Partial<T>;
23
+ argTypes?: Record<string, unknown>;
24
+ }
25
+ interface ArgTypes {
26
+ value?: FilterValue[];
27
+ filters?: FilterConfig[];
28
+ urlParamsSensitive: boolean;
29
+ }
30
+ export declare const Regular: Story<ArgTypes>;
@@ -0,0 +1,182 @@
1
+ import { CommonHeaderStyles } from '@operato/styles';
2
+ import { sleep } from '@operato/utils';
3
+ import '../src/filters/ox-filters-form-base.js';
4
+ import { html } from 'lit';
5
+ export default {
6
+ title: 'ox-filters-form-base dependencies',
7
+ component: 'ox-filters-form-base',
8
+ argTypes: {
9
+ value: { control: 'object' },
10
+ filters: { control: 'object' },
11
+ urlParamsSensitive: { control: 'boolean' }
12
+ }
13
+ };
14
+ const Template = ({ value, filters, urlParamsSensitive }) => html `
15
+ <link href="/themes/app-theme.css" rel="stylesheet" />
16
+ <link href="/themes/form-theme.css" rel="stylesheet" />
17
+ <link href="/themes/input-theme.css" rel="stylesheet" />
18
+
19
+ <link
20
+ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
21
+ rel="stylesheet"
22
+ />
23
+ <link
24
+ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL@20..48,100..700,0..1"
25
+ rel="stylesheet"
26
+ />
27
+ <link
28
+ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Sharp:opsz,wght,FILL@20..48,100..700,0..1"
29
+ rel="stylesheet"
30
+ />
31
+
32
+ <style>
33
+ body {
34
+ height: 500px;
35
+ }
36
+ </style>
37
+
38
+ <style>
39
+ ox-filters-form-base {
40
+ --input-gap-vertical: 8px;
41
+ --input-gap-horizontal: 16px;
42
+
43
+ --ox-filters-input-placeholder-color: var(--primary-color);
44
+
45
+ --ox-filters-input-border: 1px solid rgba(0, 0, 0, 0.2);
46
+ --ox-filters-input-focus-border: 1px solid var(--primary-color);
47
+ --ox-filters-input-font: normal 14px var(--theme-font);
48
+ --ox-filters-input-color: var(--primary-text-color);
49
+ --ox-filters-input-focus-color: var(--primary-color);
50
+ --ox-filters-label-font: normal 14px var(--theme-font);
51
+ --ox-filters-label-color: var(--primary-text-color);
52
+
53
+ --ox-filters-form-gap: var(--input-gap-vertical, 8px) var(--input-gap-horizontal, 16px);
54
+ --ox-filters-input-padding: 6px 2px;
55
+ }
56
+
57
+ ${CommonHeaderStyles.cssText}
58
+ </style>
59
+
60
+ <div class="header">
61
+ <div class="filters">
62
+ <ox-filters-form-base
63
+ .value=${value}
64
+ .filters=${filters}
65
+ ?url-params-sensitive=${urlParamsSensitive}
66
+ @filters-change=${(e) => { }}
67
+ >
68
+ </ox-filters-form-base>
69
+ </div>
70
+ </div>
71
+ `;
72
+ const WAREHOUSE = [
73
+ {
74
+ id: '01',
75
+ name: '제 1 창고',
76
+ zones: [
77
+ {
78
+ id: 'W1Z001',
79
+ name: 'Zone 01-001',
80
+ locations: ['L01-001-01', 'L01-001-02', 'L01-001-03', 'L01-001-04', 'L01-001-05']
81
+ },
82
+ {
83
+ id: 'W1Z002',
84
+ name: 'Zone 01-002',
85
+ locations: ['L01-002-01', 'L01-002-02', 'L01-002-03', 'L01-002-04', 'L01-002-05']
86
+ }
87
+ ]
88
+ },
89
+ {
90
+ id: '02',
91
+ name: '제 2 창고',
92
+ zones: [
93
+ {
94
+ id: 'W2Z001',
95
+ name: 'Zone 02-001',
96
+ locations: ['L02-001-01', 'L02-001-02', 'L02-001-03', 'L02-001-04', 'L02-001-05']
97
+ },
98
+ {
99
+ id: 'W2Z002',
100
+ name: 'Zone 02-002',
101
+ locations: ['L02-002-01', 'L02-002-02', 'L02-002-03', 'L02-002-04', 'L02-002-05']
102
+ }
103
+ ]
104
+ }
105
+ ];
106
+ export const Regular = Template.bind({});
107
+ Regular.args = {
108
+ filters: [
109
+ {
110
+ name: 'warehouse',
111
+ type: 'select',
112
+ label: 'warehouse',
113
+ operator: 'eq',
114
+ value: '01',
115
+ options: async () => {
116
+ await sleep(1000); // 테스트를 위해서 강제로 1초 쉬기
117
+ return [
118
+ {
119
+ display: '',
120
+ value: ''
121
+ }
122
+ ].concat(WAREHOUSE.map(w => {
123
+ return {
124
+ display: w.name,
125
+ value: w.id
126
+ };
127
+ }));
128
+ }
129
+ },
130
+ {
131
+ name: 'zone',
132
+ type: 'select',
133
+ label: 'zone',
134
+ operator: 'eq',
135
+ value: 'W1Z001',
136
+ boundTo: ['warehouse'],
137
+ options: async (form) => {
138
+ await sleep(1000); // 테스트를 위해서 강제로 1초 쉬기
139
+ const formData = new FormData(await form.form);
140
+ const warehouse = formData === null || formData === void 0 ? void 0 : formData.get('warehouse');
141
+ console.log('warehouse', warehouse);
142
+ const targetWH = warehouse && WAREHOUSE.find(w => w.id == warehouse);
143
+ const zones = targetWH
144
+ ? targetWH.zones
145
+ : WAREHOUSE.reduce((sum, warehouse) => {
146
+ sum = sum.concat(warehouse.zones);
147
+ return sum;
148
+ }, []);
149
+ return [
150
+ {
151
+ display: '',
152
+ value: ''
153
+ }
154
+ ].concat(zones.map((z) => {
155
+ return {
156
+ display: z.name,
157
+ value: z.id
158
+ };
159
+ }));
160
+ }
161
+ },
162
+ {
163
+ name: 'location',
164
+ type: 'select',
165
+ label: 'location',
166
+ operator: 'eq',
167
+ value: '',
168
+ boundTo: ['warehouse', 'zone'],
169
+ options: async (form) => {
170
+ await sleep(1000); // 테스트를 위해서 강제로 1초 쉬기
171
+ const formData = new FormData(await form.form);
172
+ const warehouse = formData === null || formData === void 0 ? void 0 : formData.get('warehouse');
173
+ const zone = formData === null || formData === void 0 ? void 0 : formData.get('zone');
174
+ console.log('warehouse, zone', warehouse, zone);
175
+ const targetWH = (warehouse && WAREHOUSE.find(w => w.id == warehouse)) || null;
176
+ const targetZone = zone && (targetWH === null || targetWH === void 0 ? void 0 : targetWH.zones.find(z => z.id == zone));
177
+ return targetZone ? ['', ...targetZone.locations] : [];
178
+ }
179
+ }
180
+ ]
181
+ };
182
+ //# sourceMappingURL=ox-filters-form-base-dependencies.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ox-filters-form-base-dependencies.stories.js","sourceRoot":"","sources":["../../stories/ox-filters-form-base-dependencies.stories.ts"],"names":[],"mappings":"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","sourcesContent":["import { CommonHeaderStyles } from '@operato/styles'\nimport { sleep } from '@operato/utils'\nimport '../src/filters/ox-filters-form-base.js'\n\nimport { html, TemplateResult } from 'lit'\nimport { OxFiltersFormBase, FilterConfig, FilterValue } from '../src/index.js'\n\nexport default {\n title: 'ox-filters-form-base dependencies',\n component: 'ox-filters-form-base',\n argTypes: {\n value: { control: 'object' },\n filters: { control: 'object' },\n urlParamsSensitive: { control: 'boolean' }\n }\n}\n\ninterface Story<T> {\n (args: T): TemplateResult\n args?: Partial<T>\n argTypes?: Record<string, unknown>\n}\n\ninterface ArgTypes {\n value?: FilterValue[]\n filters?: FilterConfig[]\n urlParamsSensitive: boolean\n}\n\nconst Template: Story<ArgTypes> = ({ value, filters, urlParamsSensitive }: ArgTypes) => html`\n <link href=\"/themes/app-theme.css\" rel=\"stylesheet\" />\n <link href=\"/themes/form-theme.css\" rel=\"stylesheet\" />\n <link href=\"/themes/input-theme.css\" rel=\"stylesheet\" />\n\n <link\n href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1\"\n rel=\"stylesheet\"\n />\n <link\n href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL@20..48,100..700,0..1\"\n rel=\"stylesheet\"\n />\n <link\n href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Sharp:opsz,wght,FILL@20..48,100..700,0..1\"\n rel=\"stylesheet\"\n />\n\n <style>\n body {\n height: 500px;\n }\n </style>\n\n <style>\n ox-filters-form-base {\n --input-gap-vertical: 8px;\n --input-gap-horizontal: 16px;\n\n --ox-filters-input-placeholder-color: var(--primary-color);\n\n --ox-filters-input-border: 1px solid rgba(0, 0, 0, 0.2);\n --ox-filters-input-focus-border: 1px solid var(--primary-color);\n --ox-filters-input-font: normal 14px var(--theme-font);\n --ox-filters-input-color: var(--primary-text-color);\n --ox-filters-input-focus-color: var(--primary-color);\n --ox-filters-label-font: normal 14px var(--theme-font);\n --ox-filters-label-color: var(--primary-text-color);\n\n --ox-filters-form-gap: var(--input-gap-vertical, 8px) var(--input-gap-horizontal, 16px);\n --ox-filters-input-padding: 6px 2px;\n }\n\n ${CommonHeaderStyles.cssText}\n </style>\n\n <div class=\"header\">\n <div class=\"filters\">\n <ox-filters-form-base\n .value=${value!}\n .filters=${filters!}\n ?url-params-sensitive=${urlParamsSensitive}\n @filters-change=${(e: CustomEvent) => {}}\n >\n </ox-filters-form-base>\n </div>\n </div>\n`\n\nconst WAREHOUSE = [\n {\n id: '01',\n name: '제 1 창고',\n zones: [\n {\n id: 'W1Z001',\n name: 'Zone 01-001',\n locations: ['L01-001-01', 'L01-001-02', 'L01-001-03', 'L01-001-04', 'L01-001-05']\n },\n {\n id: 'W1Z002',\n name: 'Zone 01-002',\n locations: ['L01-002-01', 'L01-002-02', 'L01-002-03', 'L01-002-04', 'L01-002-05']\n }\n ]\n },\n {\n id: '02',\n name: '제 2 창고',\n zones: [\n {\n id: 'W2Z001',\n name: 'Zone 02-001',\n locations: ['L02-001-01', 'L02-001-02', 'L02-001-03', 'L02-001-04', 'L02-001-05']\n },\n {\n id: 'W2Z002',\n name: 'Zone 02-002',\n locations: ['L02-002-01', 'L02-002-02', 'L02-002-03', 'L02-002-04', 'L02-002-05']\n }\n ]\n }\n]\n\nexport const Regular = Template.bind({})\nRegular.args = {\n filters: [\n {\n name: 'warehouse',\n type: 'select',\n label: 'warehouse',\n operator: 'eq',\n value: '01',\n options: async () => {\n await sleep(1000) // 테스트를 위해서 강제로 1초 쉬기\n return [\n {\n display: '',\n value: ''\n }\n ].concat(\n WAREHOUSE.map(w => {\n return {\n display: w.name,\n value: w.id\n }\n })\n )\n }\n },\n {\n name: 'zone',\n type: 'select',\n label: 'zone',\n operator: 'eq',\n value: 'W1Z001',\n boundTo: ['warehouse'],\n options: async (form: any) => {\n await sleep(1000) // 테스트를 위해서 강제로 1초 쉬기\n const formData = new FormData(await form.form)\n const warehouse = formData?.get('warehouse')\n console.log('warehouse', warehouse)\n\n const targetWH = warehouse && WAREHOUSE.find(w => w.id == warehouse)\n const zones = targetWH\n ? targetWH.zones\n : WAREHOUSE.reduce((sum, warehouse) => {\n sum = sum.concat(warehouse.zones)\n return sum\n }, [] as any[])\n\n return [\n {\n display: '',\n value: ''\n }\n ].concat(\n zones.map((z: any) => {\n return {\n display: z.name,\n value: z.id\n }\n })\n )\n }\n },\n {\n name: 'location',\n type: 'select',\n label: 'location',\n operator: 'eq',\n value: '',\n boundTo: ['warehouse', 'zone'],\n options: async (form: any) => {\n await sleep(1000) // 테스트를 위해서 강제로 1초 쉬기\n const formData = new FormData(await form.form)\n const warehouse = formData?.get('warehouse')\n const zone = formData?.get('zone')\n console.log('warehouse, zone', warehouse, zone)\n\n const targetWH = (warehouse && WAREHOUSE.find(w => w.id == warehouse)) || null\n const targetZone = zone && targetWH?.zones.find(z => z.id == zone)\n return targetZone ? ['', ...targetZone.locations] : []\n }\n }\n ]\n}\n"]}
@@ -0,0 +1,30 @@
1
+ import '../src/filters/ox-filters-form-base.js';
2
+ import { TemplateResult } from 'lit';
3
+ import { FilterConfig, FilterValue } from '../src/index.js';
4
+ declare const _default: {
5
+ title: string;
6
+ component: string;
7
+ argTypes: {
8
+ value: {
9
+ control: string;
10
+ };
11
+ filters: {
12
+ control: string;
13
+ };
14
+ urlParamsSensitive: {
15
+ control: string;
16
+ };
17
+ };
18
+ };
19
+ export default _default;
20
+ interface Story<T> {
21
+ (args: T): TemplateResult;
22
+ args?: Partial<T>;
23
+ argTypes?: Record<string, unknown>;
24
+ }
25
+ interface ArgTypes {
26
+ value?: FilterValue[];
27
+ filters?: FilterConfig[];
28
+ urlParamsSensitive: boolean;
29
+ }
30
+ export declare const Regular: Story<ArgTypes>;
@@ -0,0 +1,142 @@
1
+ import { CommonHeaderStyles } from '@operato/styles';
2
+ import '../src/filters/ox-filters-form-base.js';
3
+ import { html } from 'lit';
4
+ export default {
5
+ title: 'ox-filters-form-base',
6
+ component: 'ox-filters-form-base',
7
+ argTypes: {
8
+ value: { control: 'object' },
9
+ filters: { control: 'object' },
10
+ urlParamsSensitive: { control: 'boolean' }
11
+ }
12
+ };
13
+ const Template = ({ value, filters, urlParamsSensitive }) => html `
14
+ <link href="/themes/app-theme.css" rel="stylesheet" />
15
+ <link href="/themes/form-theme.css" rel="stylesheet" />
16
+ <link href="/themes/input-theme.css" rel="stylesheet" />
17
+
18
+ <link
19
+ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
20
+ rel="stylesheet"
21
+ />
22
+ <link
23
+ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL@20..48,100..700,0..1"
24
+ rel="stylesheet"
25
+ />
26
+ <link
27
+ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Sharp:opsz,wght,FILL@20..48,100..700,0..1"
28
+ rel="stylesheet"
29
+ />
30
+
31
+ <style>
32
+ body {
33
+ height: 500px;
34
+ }
35
+ </style>
36
+
37
+ <style>
38
+ ox-filters-form-base {
39
+ --input-gap-vertical: 8px;
40
+ --input-gap-horizontal: 16px;
41
+
42
+ --ox-filters-input-placeholder-color: var(--primary-color);
43
+
44
+ --ox-filters-input-border: 1px solid rgba(0, 0, 0, 0.2);
45
+ --ox-filters-input-focus-border: 1px solid var(--primary-color);
46
+ --ox-filters-input-font: normal 14px var(--theme-font);
47
+ --ox-filters-input-color: var(--primary-text-color);
48
+ --ox-filters-input-focus-color: var(--primary-color);
49
+ --ox-filters-label-font: normal 14px var(--theme-font);
50
+ --ox-filters-label-color: var(--primary-text-color);
51
+
52
+ --ox-filters-form-gap: var(--input-gap-vertical, 8px) var(--input-gap-horizontal, 16px);
53
+ --ox-filters-input-padding: 6px 2px;
54
+ }
55
+
56
+ ${CommonHeaderStyles.cssText}
57
+ </style>
58
+
59
+ <div class="header">
60
+ <div class="filters">
61
+ <ox-filters-form-base
62
+ .value=${value}
63
+ .filters=${filters}
64
+ ?url-params-sensitive=${urlParamsSensitive}
65
+ @filters-change=${(e) => {
66
+ console.log('filters changed', e.detail);
67
+ }}
68
+ >
69
+ </ox-filters-form-base>
70
+ </div>
71
+ </div>
72
+ `;
73
+ export const Regular = Template.bind({});
74
+ Regular.args = {
75
+ filters: [
76
+ {
77
+ name: 'search',
78
+ type: 'search',
79
+ label: 'search',
80
+ operator: 'eq',
81
+ value: ''
82
+ },
83
+ {
84
+ name: 'test',
85
+ type: 'string',
86
+ label: 'name',
87
+ operator: 'eq',
88
+ value: 'No Name'
89
+ },
90
+ {
91
+ name: 'active',
92
+ type: 'boolean',
93
+ label: 'active',
94
+ operator: 'eq',
95
+ value: true,
96
+ onchange: (value, formBase) => {
97
+ const sss = formBase.getFieldByName('sss');
98
+ sss.value = value ? 'DEF' : 'ABC';
99
+ return false;
100
+ }
101
+ },
102
+ {
103
+ name: 'sss',
104
+ type: 'select',
105
+ label: 'sss',
106
+ operator: 'eq',
107
+ options: () => {
108
+ return [
109
+ {
110
+ display: '',
111
+ value: ''
112
+ },
113
+ {
114
+ display: 'ABC',
115
+ value: 'ABC'
116
+ },
117
+ {
118
+ display: 'DEF',
119
+ value: 'DEF'
120
+ }
121
+ ];
122
+ }
123
+ },
124
+ {
125
+ name: 'range',
126
+ type: 'number',
127
+ label: 'range',
128
+ operator: 'between'
129
+ },
130
+ {
131
+ name: 'date-range',
132
+ type: 'date',
133
+ label: 'date',
134
+ operator: 'between',
135
+ value: [
136
+ { name: 'week', params: { relativeWeeks: -1 } },
137
+ { name: 'today', params: { relativeDays: +1 } }
138
+ ]
139
+ }
140
+ ]
141
+ };
142
+ //# sourceMappingURL=ox-filters-form-base.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ox-filters-form-base.stories.js","sourceRoot":"","sources":["../../stories/ox-filters-form-base.stories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,wCAAwC,CAAA;AAE/C,OAAO,EAAE,IAAI,EAAkB,MAAM,KAAK,CAAA;AAG1C,eAAe;IACb,KAAK,EAAE,sBAAsB;IAC7B,SAAS,EAAE,sBAAsB;IACjC,QAAQ,EAAE;QACR,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;QAC5B,OAAO,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;QAC9B,kBAAkB,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE;KAC3C;CACF,CAAA;AAcD,MAAM,QAAQ,GAAoB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAY,EAAE,EAAE,CAAC,IAAI,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA2CtF,kBAAkB,CAAC,OAAO;;;;;;iBAMf,KAAM;mBACJ,OAAQ;gCACK,kBAAkB;0BACxB,CAAC,CAAc,EAAE,EAAE;IACnC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;AAC1C,CAAC;;;;;CAKR,CAAA;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AACxC,OAAO,CAAC,IAAI,GAAG;IACb,OAAO,EAAE;QACP;YACE,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,EAAE;SACV;QACD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,MAAM;YACb,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,SAAS;SACjB;QACD;YACE,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,IAAI;YACX,QAAQ,EAAE,CAAC,KAAK,EAAE,QAA2B,EAAE,EAAE;gBAC/C,MAAM,GAAG,GAAG,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAqB,CAAA;gBAC9D,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;gBAEjC,OAAO,KAAK,CAAA;YACd,CAAC;SACF;QACD;YACE,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,KAAK;YACZ,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,GAAG,EAAE;gBACZ,OAAO;oBACL;wBACE,OAAO,EAAE,EAAE;wBACX,KAAK,EAAE,EAAE;qBACV;oBACD;wBACE,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,KAAK;qBACb;oBACD;wBACE,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,KAAK;qBACb;iBACF,CAAA;YACH,CAAC;SACF;QACD;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,OAAO;YACd,QAAQ,EAAE,SAAS;SACpB;QACD;YACE,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,MAAM;YACb,QAAQ,EAAE,SAAS;YACnB,KAAK,EAAE;gBACL,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE;gBAC/C,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE;aAChD;SACF;KACF;CACF,CAAA","sourcesContent":["import { CommonHeaderStyles } from '@operato/styles'\nimport '../src/filters/ox-filters-form-base.js'\n\nimport { html, TemplateResult } from 'lit'\nimport { OxFiltersFormBase, FilterConfig, FilterValue } from '../src/index.js'\n\nexport default {\n title: 'ox-filters-form-base',\n component: 'ox-filters-form-base',\n argTypes: {\n value: { control: 'object' },\n filters: { control: 'object' },\n urlParamsSensitive: { control: 'boolean' }\n }\n}\n\ninterface Story<T> {\n (args: T): TemplateResult\n args?: Partial<T>\n argTypes?: Record<string, unknown>\n}\n\ninterface ArgTypes {\n value?: FilterValue[]\n filters?: FilterConfig[]\n urlParamsSensitive: boolean\n}\n\nconst Template: Story<ArgTypes> = ({ value, filters, urlParamsSensitive }: ArgTypes) => html`\n <link href=\"/themes/app-theme.css\" rel=\"stylesheet\" />\n <link href=\"/themes/form-theme.css\" rel=\"stylesheet\" />\n <link href=\"/themes/input-theme.css\" rel=\"stylesheet\" />\n\n <link\n href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1\"\n rel=\"stylesheet\"\n />\n <link\n href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL@20..48,100..700,0..1\"\n rel=\"stylesheet\"\n />\n <link\n href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Sharp:opsz,wght,FILL@20..48,100..700,0..1\"\n rel=\"stylesheet\"\n />\n\n <style>\n body {\n height: 500px;\n }\n </style>\n\n <style>\n ox-filters-form-base {\n --input-gap-vertical: 8px;\n --input-gap-horizontal: 16px;\n\n --ox-filters-input-placeholder-color: var(--primary-color);\n\n --ox-filters-input-border: 1px solid rgba(0, 0, 0, 0.2);\n --ox-filters-input-focus-border: 1px solid var(--primary-color);\n --ox-filters-input-font: normal 14px var(--theme-font);\n --ox-filters-input-color: var(--primary-text-color);\n --ox-filters-input-focus-color: var(--primary-color);\n --ox-filters-label-font: normal 14px var(--theme-font);\n --ox-filters-label-color: var(--primary-text-color);\n\n --ox-filters-form-gap: var(--input-gap-vertical, 8px) var(--input-gap-horizontal, 16px);\n --ox-filters-input-padding: 6px 2px;\n }\n\n ${CommonHeaderStyles.cssText}\n </style>\n\n <div class=\"header\">\n <div class=\"filters\">\n <ox-filters-form-base\n .value=${value!}\n .filters=${filters!}\n ?url-params-sensitive=${urlParamsSensitive}\n @filters-change=${(e: CustomEvent) => {\n console.log('filters changed', e.detail)\n }}\n >\n </ox-filters-form-base>\n </div>\n </div>\n`\n\nexport const Regular = Template.bind({})\nRegular.args = {\n filters: [\n {\n name: 'search',\n type: 'search',\n label: 'search',\n operator: 'eq',\n value: ''\n },\n {\n name: 'test',\n type: 'string',\n label: 'name',\n operator: 'eq',\n value: 'No Name'\n },\n {\n name: 'active',\n type: 'boolean',\n label: 'active',\n operator: 'eq',\n value: true,\n onchange: (value, formBase: OxFiltersFormBase) => {\n const sss = formBase.getFieldByName('sss') as HTMLInputElement\n sss.value = value ? 'DEF' : 'ABC'\n\n return false\n }\n },\n {\n name: 'sss',\n type: 'select',\n label: 'sss',\n operator: 'eq',\n options: () => {\n return [\n {\n display: '',\n value: ''\n },\n {\n display: 'ABC',\n value: 'ABC'\n },\n {\n display: 'DEF',\n value: 'DEF'\n }\n ]\n }\n },\n {\n name: 'range',\n type: 'number',\n label: 'range',\n operator: 'between'\n },\n {\n name: 'date-range',\n type: 'date',\n label: 'date',\n operator: 'between',\n value: [\n { name: 'week', params: { relativeWeeks: -1 } },\n { name: 'today', params: { relativeDays: +1 } }\n ]\n }\n ]\n}\n"]}
@@ -0,0 +1,34 @@
1
+ import '../src/components/ox-search-form.js';
2
+ import { TemplateResult } from 'lit';
3
+ import { SearchFormField } from '../src/index.js';
4
+ declare const _default: {
5
+ title: string;
6
+ component: string;
7
+ argTypes: {
8
+ value: {
9
+ control: string;
10
+ };
11
+ fields: {
12
+ control: string;
13
+ };
14
+ hideSearchButton: {
15
+ control: string;
16
+ };
17
+ autofocus: {
18
+ control: string;
19
+ };
20
+ };
21
+ };
22
+ export default _default;
23
+ interface Story<T> {
24
+ (args: T): TemplateResult;
25
+ args?: Partial<T>;
26
+ argTypes?: Record<string, unknown>;
27
+ }
28
+ interface ArgTypes {
29
+ fields?: SearchFormField[];
30
+ hideSearchButton?: boolean;
31
+ autofocus?: boolean;
32
+ }
33
+ export declare const Regular: Story<ArgTypes>;
34
+ export declare const RegularContact: Story<ArgTypes>;
@@ -0,0 +1,219 @@
1
+ import { CommonHeaderStyles } from '@operato/styles';
2
+ import { sleep } from '@operato/utils';
3
+ import '../src/components/ox-search-form.js';
4
+ import { html } from 'lit';
5
+ export default {
6
+ title: 'ox-search-form',
7
+ component: 'ox-search-form',
8
+ argTypes: {
9
+ value: { control: 'object' },
10
+ fields: { control: 'object' },
11
+ hideSearchButton: { control: 'boolean' },
12
+ autofocus: { control: 'boolean' }
13
+ }
14
+ };
15
+ const Template = ({ fields, hideSearchButton, autofocus }) => html `
16
+ <link href="/themes/app-theme.css" rel="stylesheet" />
17
+ <link href="/themes/form-theme.css" rel="stylesheet" />
18
+ <link href="/themes/input-theme.css" rel="stylesheet" />
19
+
20
+ <link
21
+ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
22
+ rel="stylesheet"
23
+ />
24
+ <link
25
+ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL@20..48,100..700,0..1"
26
+ rel="stylesheet"
27
+ />
28
+ <link
29
+ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Sharp:opsz,wght,FILL@20..48,100..700,0..1"
30
+ rel="stylesheet"
31
+ />
32
+
33
+ <style>
34
+ body {
35
+ height: 500px;
36
+ }
37
+ </style>
38
+
39
+ <style>
40
+ ox-search-form {
41
+ --input-gap-vertical: 8px;
42
+ --input-gap-horizontal: 16px;
43
+
44
+ --ox-filters-input-placeholder-color: var(--primary-color);
45
+
46
+ --ox-filters-input-border: 1px solid rgba(0, 0, 0, 0.2);
47
+ --ox-filters-input-focus-border: 1px solid var(--primary-color);
48
+ --ox-filters-input-font: normal 14px var(--theme-font);
49
+ --ox-filters-input-color: var(--primary-text-color);
50
+ --ox-filters-input-focus-color: var(--primary-color);
51
+ --ox-filters-label-font: normal 14px var(--theme-font);
52
+ --ox-filters-label-color: var(--primary-text-color);
53
+
54
+ --ox-filters-form-gap: var(--input-gap-vertical, 8px) var(--input-gap-horizontal, 16px);
55
+ --ox-filters-input-padding: 6px 2px;
56
+ }
57
+
58
+ ${CommonHeaderStyles.cssText}
59
+ </style>
60
+
61
+ <div class="header">
62
+ <div class="filters">
63
+ <ox-search-form
64
+ .fields=${fields}
65
+ ?autofocus=${autofocus}
66
+ ?hideSearchButton=${hideSearchButton}
67
+ @change=${(e) => {
68
+ console.log('search form changed', e.detail);
69
+ }}
70
+ >
71
+ </ox-search-form>
72
+ </div>
73
+ </div>
74
+ `;
75
+ const WAREHOUSE = [
76
+ {
77
+ id: '01',
78
+ name: '제 1 창고',
79
+ zones: [
80
+ {
81
+ id: 'Z001',
82
+ name: 'Zone 01-001',
83
+ locations: ['L01-001-01', 'L01-001-02', 'L01-001-03', 'L01-001-04', 'L01-001-05']
84
+ },
85
+ {
86
+ id: 'Z002',
87
+ name: 'Zone 01-002',
88
+ locations: ['L01-002-01', 'L01-002-02', 'L01-002-03', 'L01-002-04', 'L01-002-05']
89
+ }
90
+ ]
91
+ },
92
+ {
93
+ id: '02',
94
+ name: '제 2 창고',
95
+ zones: [
96
+ {
97
+ id: 'Z001',
98
+ name: 'Zone 02-001',
99
+ locations: ['L02-001-01', 'L02-001-02', 'L02-001-03', 'L02-001-04', 'L02-001-05']
100
+ },
101
+ {
102
+ id: 'Z002',
103
+ name: 'Zone 02-002',
104
+ locations: ['L02-002-01', 'L02-002-02', 'L02-002-03', 'L02-002-04', 'L02-002-05']
105
+ }
106
+ ]
107
+ }
108
+ ];
109
+ export const Regular = Template.bind({});
110
+ Regular.args = {
111
+ fields: [
112
+ {
113
+ type: 'select',
114
+ name: 'warehouse',
115
+ label: 'warehouse',
116
+ options: async (form) => {
117
+ await sleep(1000); // 테스트를 위해서 강제로 1초 쉬기
118
+ return [
119
+ {
120
+ display: '',
121
+ value: ''
122
+ }
123
+ ].concat(WAREHOUSE.map(w => {
124
+ return {
125
+ display: w.name,
126
+ value: w.id
127
+ };
128
+ }));
129
+ }
130
+ },
131
+ {
132
+ type: 'select',
133
+ name: 'zone',
134
+ label: 'zone',
135
+ boundTo: ['warehouse'],
136
+ options: async (form) => {
137
+ await sleep(1000); // 테스트를 위해서 강제로 1초 쉬기
138
+ const formData = new FormData(await form.form);
139
+ const warehouse = formData === null || formData === void 0 ? void 0 : formData.get('warehouse');
140
+ console.log('warehouse', warehouse);
141
+ const targetWH = warehouse && WAREHOUSE.find(w => w.id == warehouse);
142
+ const zones = targetWH
143
+ ? targetWH.zones
144
+ : WAREHOUSE.reduce((sum, warehouse) => {
145
+ sum = sum.concat(warehouse.zones);
146
+ return sum;
147
+ }, []);
148
+ return [
149
+ {
150
+ display: '',
151
+ value: ''
152
+ }
153
+ ].concat(zones.map((z) => {
154
+ return {
155
+ display: z.name,
156
+ value: z.id
157
+ };
158
+ }));
159
+ }
160
+ },
161
+ {
162
+ name: 'location',
163
+ type: 'select',
164
+ label: 'location',
165
+ boundTo: ['warehouse', 'zone'],
166
+ options: async (form) => {
167
+ await sleep(1000); // 테스트를 위해서 강제로 1초 쉬기
168
+ const formData = new FormData(await form.form);
169
+ const warehouse = formData === null || formData === void 0 ? void 0 : formData.get('warehouse');
170
+ const zone = formData === null || formData === void 0 ? void 0 : formData.get('zone');
171
+ console.log('warehouse, zone', warehouse, zone);
172
+ const targetWH = (warehouse && WAREHOUSE.find(w => w.id == warehouse)) || null;
173
+ const targetZone = zone && (targetWH === null || targetWH === void 0 ? void 0 : targetWH.zones.find(z => z.id == zone));
174
+ return targetZone ? ['', ...targetZone.locations] : [];
175
+ }
176
+ }
177
+ ],
178
+ hideSearchButton: true,
179
+ autofocus: true
180
+ };
181
+ export const RegularContact = Template.bind({});
182
+ RegularContact.args = {
183
+ fields: [
184
+ {
185
+ label: 'name',
186
+ name: 'name',
187
+ type: 'text',
188
+ placeholder: 'type your name.',
189
+ props: { searchOper: 'i_like' }
190
+ },
191
+ {
192
+ label: 'email',
193
+ name: 'email',
194
+ type: 'text',
195
+ props: { searchOper: 'i_like' }
196
+ },
197
+ {
198
+ label: 'fax',
199
+ name: 'fax',
200
+ type: 'text',
201
+ props: { searchOper: 'i_like' }
202
+ },
203
+ {
204
+ label: 'phone',
205
+ name: 'phone',
206
+ type: 'text',
207
+ props: { searchOper: 'i_like' }
208
+ },
209
+ {
210
+ label: 'description',
211
+ name: 'description',
212
+ type: 'text',
213
+ props: { searchOper: 'i_like' }
214
+ }
215
+ ],
216
+ hideSearchButton: true,
217
+ autofocus: true
218
+ };
219
+ //# sourceMappingURL=ox-search-form.stories.js.map