@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
@@ -2,27 +2,30 @@ import { css } from 'lit'
2
2
 
3
3
  export const FilterStyles = css`
4
4
  :host {
5
- --ox-filters-input-placeholder-color: var(--input-placeholder-color, var(--primary-color));
5
+ --ox-filters-input-placeholder-color: var(--input-placeholder-color, var(--md-sys-color-on-surface-variant));
6
6
 
7
- --ox-filters-input-border: var(--input-border, 1px solid rgba(0, 0, 0, 0.2));
8
- --ox-filters-input-focus-border: var(--input-focus-border, 1px solid var(--primary-color));
7
+ --ox-filters-input-border: var(--input-border, 1px solid var(--md-sys-color-outline));
8
+ --ox-filters-input-focus-border: var(--input-focus-border, 1px solid var(--md-ref-palette-primary50));
9
9
  --ox-filters-input-font: var(--input-font, normal 14px var(--theme-font));
10
- --ox-filters-input-color: var(--input-color, var(--primary-text-color));
11
- --ox-filters-input-focus-color: var(--input-focus-color, var(--primary-color));
10
+ --ox-filters-input-color: var(--input-color, var(--md-sys-color-on-surface));
11
+ --ox-filters-input-focus-color: var(--input-focus-color, var(--md-sys-color-on-surface-variant));
12
12
  --ox-filters-label-font: var(--label-font, normal 14px var(--theme-font));
13
- --ox-filters-label-color: var(--label-color, var(--primary-text-color));
13
+ --ox-filters-label-color: var(--label-color, var(--md-sys-color-on-surface));
14
14
  --ox-filters-input-background-color: transparent;
15
15
 
16
16
  --ox-filters-form-gap: var(--input-gap-vertical, 8px) var(--input-gap-horizontal, 16px);
17
- --ox-filters-input-padding: var(--input-padding, 6px 2px);
17
+ --ox-filters-input-padding: 0 var(--spacing-small);
18
18
 
19
19
  --ox-select-padding: var(--ox-filters-input-padding);
20
20
  --ox-checkbox-background-color: var(--ox-filters-input-background-color, transparent);
21
+
22
+ --md-sys-color-on-primary: transparent;
23
+ --form-element-height-medium: var(--form-element-height-small);
21
24
  }
22
25
 
23
26
  label {
24
- font: var(--ox-filters-label-font);
25
- color: var(--ox-filters-label-color);
27
+ font-size: var(--md-sys-typescale-label-large-size, 0.875rem);
28
+ color: var(--md-sys-color-primary);
26
29
  }
27
30
 
28
31
  span {
@@ -30,28 +33,34 @@ export const FilterStyles = css`
30
33
  }
31
34
 
32
35
  input::placeholder {
33
- color: var(--ox-filters-input-placeholder-color);
34
- opacity: 0.6;
36
+ color: var(--ox-filters-input-placeholder-color, var(--md-sys-color-on-surface-variant));
37
+ opacity: 0.7;
35
38
  }
36
39
 
37
- input {
40
+ input,
41
+ ox-input-search,
42
+ [filter-input] {
38
43
  padding: var(--ox-filters-input-padding);
44
+ height: var(--form-element-height-medium);
39
45
  }
40
46
 
41
47
  ox-select,
42
- input {
48
+ ox-input-search,
49
+ input,
50
+ [filter-input] {
43
51
  border: none;
44
- border-bottom: var(--ox-filters-input-border);
52
+ border-bottom: var(--ox-filters-input-border, var(--md-sys-color-outline));
45
53
  font: var(--ox-filters-input-font);
46
- color: var(--ox-filters-input-color);
54
+ color: var(--ox-filters-input-color, var(--md-sys-color-on-surface-variant));
47
55
  background-color: var(--ox-filters-input-background-color, transparent);
48
56
  }
49
57
 
50
58
  ox-select:focus,
51
- input:focus {
59
+ input:focus,
60
+ [filter-input]:focus {
52
61
  outline: none;
53
62
  border-bottom: var(--ox-filters-input-focus-border);
54
- color: var(--ox-filters-input-focus-color);
63
+ color: var(--ox-filters-input-focus-color, var(--md-sys-color-primary));
55
64
  }
56
65
 
57
66
  ox-select {
@@ -74,21 +83,44 @@ export const FilterStyles = css`
74
83
  max-width: 170px;
75
84
  }
76
85
 
86
+ [filter-input] {
87
+ min-width: 140px;
88
+ max-width: 170px;
89
+ }
90
+
77
91
  @media only screen and (max-width: 460px) {
78
92
  :host {
79
93
  --ox-filters-form-label-font: bold 13px var(--theme-font);
80
94
  --ox-filters-input-font: normal 16px var(--theme-font);
81
95
  }
82
96
 
83
- input[from],
84
- input[to] {
85
- max-width: 44%;
97
+ ox-input-barcode {
98
+ max-width: unset;
99
+ flex: 1;
100
+ }
101
+
102
+ ox-input-search {
103
+ max-width: unset;
104
+ }
105
+
106
+ ox-select {
107
+ max-width: unset;
108
+ }
109
+
110
+ ox-checkbox {
111
+ max-width: unset;
112
+ }
113
+
114
+ input[type='number'] {
115
+ max-width: unset;
116
+ }
117
+
118
+ input {
119
+ flex: 1;
86
120
  }
87
121
 
88
- input[type*='datetime'][from],
89
- input[type*='datetime'][to] {
90
- padding-right: var(--padding-narrow);
91
- min-width: 91%;
122
+ [readonly] {
123
+ background-color: #f0f0f0;
92
124
  }
93
125
  }
94
126
  `
@@ -0,0 +1,188 @@
1
+ import '@material/web/button/outlined-button.js'
2
+
3
+ import { css, html, LitElement } from 'lit'
4
+ import { customElement, property, state } from 'lit/decorators.js'
5
+ import { ifDefined } from 'lit/directives/if-defined.js'
6
+
7
+ import { i18next } from '@operato/i18n'
8
+ import { OxPopupList } from '@operato/popup'
9
+
10
+ import { FilterConfig, PersonalFilterPreference } from '../types.js'
11
+
12
+ import { OxFiltersFormBase } from './ox-filters-form-base'
13
+ import { OxCheckbox } from '@operato/input'
14
+
15
+ @customElement('ox-filter-personalizer')
16
+ export class OxFilterPersonalizer extends LitElement {
17
+ static styles = [
18
+ css`
19
+ md-icon {
20
+ --md-icon-size: 16px;
21
+ width: 36px;
22
+ height: 36px;
23
+ color: var(--md-sys-color-secondary-container);
24
+ cursor: pointer;
25
+
26
+ display: flex;
27
+ place-content: center;
28
+ place-items: center;
29
+ position: relative;
30
+
31
+ &:hover {
32
+ color: var(--md-sys-color-primary-container);
33
+ }
34
+ }
35
+
36
+ md-ripple {
37
+ border-radius: 50%;
38
+ inset: unset;
39
+ height: 36px;
40
+ width: 36px;
41
+ }
42
+ `
43
+ ]
44
+
45
+ @property({ type: Boolean, attribute: true }) debug: boolean = false
46
+
47
+ @state() private preference?: PersonalFilterPreference
48
+
49
+ render() {
50
+ return html`
51
+ <md-icon
52
+ @click=${async (e: MouseEvent) => {
53
+ const form = this.closest('ox-filters-form-base') as OxFiltersFormBase
54
+ const { filters, personalFilters = [] } = form
55
+ const queryFilters = await form.getQueryFilters()
56
+
57
+ this.preference = {
58
+ filters: (
59
+ personalFilters.map(filter => {
60
+ const originFilter = filters.find(f => f.name == filter.name)
61
+
62
+ if (!originFilter) {
63
+ /* 원래 filters 설정에 있는 것들 만을 유지한다. */
64
+ return
65
+ }
66
+
67
+ return {
68
+ name: filter.name,
69
+ hidden: filter.hidden,
70
+ /* 만약, filters에 기본값이 이미 설정되어 있다면, 그대로 유지한다. */
71
+ value: originFilter!.value ?? queryFilters.find(f => f.name == filter.name)?.value
72
+ }
73
+ }) || []
74
+ ).filter(Boolean) as Partial<FilterConfig>[]
75
+ }
76
+
77
+ const template = html`
78
+ <div class="personalizer-header" slot="header">
79
+ <md-icon
80
+ style="margin-left: auto;"
81
+ @click=${async (e: MouseEvent) => {
82
+ if (form.personalConfigProvider) {
83
+ form.personalConfig = await form.personalConfigProvider.save(this.preference)
84
+ }
85
+ popup.close()
86
+ }}
87
+ title=${String(i18next.t('button.save'))}
88
+ >keep</md-icon
89
+ ><md-icon
90
+ @click=${async (e: MouseEvent) => {
91
+ if (form.personalConfigProvider) {
92
+ form.personalConfig = this.preference = {}
93
+ await form.personalConfigProvider.reset()
94
+ }
95
+ popup.close()
96
+ }}
97
+ title=${String(i18next.t('button.delete'))}
98
+ >keep_off</md-icon
99
+ ><md-icon @click=${async (e: MouseEvent) => popup.close()} title=${String(i18next.t('button.close'))}
100
+ >close</md-icon
101
+ >
102
+ </div>
103
+
104
+ ${this.preference?.filters!.map(
105
+ filter => html`
106
+ <ox-checkbox label="checkbox" ?checked=${!filter.hidden} value=${ifDefined(filter.name)} option
107
+ >${filter.name}<span style="position: absolute; right: 10px; cursor: move;" handle
108
+ >☰</span
109
+ ></ox-checkbox
110
+ >
111
+ `
112
+ )}
113
+ `
114
+
115
+ const popup = OxPopupList.open({
116
+ template,
117
+ multiple: true,
118
+ sortable: true,
119
+ debug: this.debug,
120
+ attrSelected: 'checked',
121
+ top: e.pageY,
122
+ left: e.pageX,
123
+ styles: css`
124
+ :host {
125
+ width: 240px;
126
+ max-height: 300px;
127
+ overflow: auto;
128
+ }
129
+
130
+ ::slotted(.personalizer-header) {
131
+ --md-icon-size: 1.4em;
132
+
133
+ display: flex;
134
+ flex-direction: row;
135
+ align-items: center;
136
+ text-transform: capitalize;
137
+ box-shadow: 0 3px 3px rgba(0, 0, 0, 0.3);
138
+ }
139
+
140
+ ::slotted([option]) {
141
+ position: relative;
142
+ user-select: none;
143
+ }
144
+ `
145
+ })
146
+
147
+ popup.onselect = (e: Event) => {
148
+ const selected = (e as CustomEvent).detail
149
+
150
+ const pconfig: PersonalFilterPreference = { ...form.personalConfig }
151
+ const pfilters = this.preference?.filters || form.filters
152
+
153
+ pconfig.filters = pfilters.map(filter => {
154
+ return {
155
+ name: filter.name,
156
+ hidden: selected.indexOf(filter.name) == -1,
157
+ value: filter.value
158
+ }
159
+ })
160
+
161
+ form.personalConfig = this.preference = pconfig
162
+
163
+ form.applyUpdatedConfiguration()
164
+ }
165
+
166
+ popup.addEventListener('sorted', (e: Event) => {
167
+ const sorted = (e as CustomEvent).detail as HTMLElement[]
168
+
169
+ const pconfig: PersonalFilterPreference = { ...form.personalConfig }
170
+ const pfilters = this.preference?.filters || form.filters
171
+
172
+ pconfig.filters = sorted
173
+ .map(element => {
174
+ const name = (element as OxCheckbox).value
175
+ return pfilters.find(filter => filter.name == name)!
176
+ })
177
+ .filter(Boolean)
178
+
179
+ form.personalConfig = this.preference = pconfig
180
+
181
+ form.applyUpdatedConfiguration()
182
+ })
183
+ }}
184
+ >settings<md-ripple></md-ripple
185
+ ></md-icon>
186
+ `
187
+ }
188
+ }