@operato/form 2.0.0-alpha.151 → 2.0.0-alpha.153
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.
- package/CHANGELOG.md +23 -0
- package/dist/src/components/ox-search-form.d.ts +4 -1
- package/dist/src/components/ox-search-form.js +42 -8
- package/dist/src/components/ox-search-form.js.map +1 -1
- package/dist/src/filters/filter-checkbox.js +2 -1
- package/dist/src/filters/filter-checkbox.js.map +1 -1
- package/dist/src/filters/filter-input-barcode.js +3 -2
- package/dist/src/filters/filter-input-barcode.js.map +1 -1
- package/dist/src/filters/filter-input.js +2 -1
- package/dist/src/filters/filter-input.js.map +1 -1
- package/dist/src/filters/filter-range-date.js +3 -1
- package/dist/src/filters/filter-range-date.js.map +1 -1
- package/dist/src/filters/filter-range-number.js +3 -1
- package/dist/src/filters/filter-range-number.js.map +1 -1
- package/dist/src/filters/filter-styles.js +4 -0
- package/dist/src/filters/filter-styles.js.map +1 -1
- package/dist/src/filters/ox-filters-form-base.d.ts +3 -1
- package/dist/src/filters/ox-filters-form-base.js +39 -5
- package/dist/src/filters/ox-filters-form-base.js.map +1 -1
- package/dist/src/styles/search-form-styles.js +8 -2
- package/dist/src/styles/search-form-styles.js.map +1 -1
- package/dist/src/types.d.ts +2 -0
- package/dist/src/types.js.map +1 -1
- package/dist/stories/ox-search-form-change-handler.stories.js +2 -0
- package/dist/stories/ox-search-form-change-handler.stories.js.map +1 -1
- package/dist/stories/ox-search-form.stories.d.ts +6 -0
- package/dist/stories/ox-search-form.stories.js +12 -1
- package/dist/stories/ox-search-form.stories.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/src/components/ox-search-form.ts +39 -8
- package/src/filters/filter-checkbox.ts +2 -1
- package/src/filters/filter-input-barcode.ts +3 -2
- package/src/filters/filter-input.ts +2 -1
- package/src/filters/filter-range-date.ts +3 -1
- package/src/filters/filter-range-number.ts +3 -1
- package/src/filters/filter-styles.ts +4 -0
- package/src/filters/ox-filters-form-base.ts +35 -5
- package/src/styles/search-form-styles.ts +8 -2
- package/src/types.ts +2 -0
- package/stories/ox-search-form-change-handler.stories.ts +2 -0
- package/stories/ox-search-form.stories.ts +19 -1
|
@@ -140,7 +140,7 @@ export class OxSearchForm extends LitElement {
|
|
|
140
140
|
}
|
|
141
141
|
|
|
142
142
|
renderSelect(field: SearchFormField) {
|
|
143
|
-
var { options } = field
|
|
143
|
+
var { id, options, readonly, label, name, value, placeholder, hidden } = field
|
|
144
144
|
|
|
145
145
|
if (typeof options === 'function') {
|
|
146
146
|
options = (options as Function).call(field, this)
|
|
@@ -155,12 +155,13 @@ export class OxSearchForm extends LitElement {
|
|
|
155
155
|
}
|
|
156
156
|
|
|
157
157
|
return html`
|
|
158
|
-
<label ?hidden=${
|
|
158
|
+
<label ?hidden=${hidden}>${label || name || id}</label>
|
|
159
159
|
<select
|
|
160
|
-
.value=${
|
|
161
|
-
name=${ifDefined(
|
|
162
|
-
placeholder=${ifDefined(
|
|
163
|
-
?hidden=${
|
|
160
|
+
.value=${value}
|
|
161
|
+
name=${ifDefined(name)}
|
|
162
|
+
placeholder=${ifDefined(placeholder)}
|
|
163
|
+
?hidden=${hidden}
|
|
164
|
+
?readonly=${readonly}
|
|
164
165
|
>
|
|
165
166
|
${optionsTemplate!}
|
|
166
167
|
</select>
|
|
@@ -175,6 +176,7 @@ export class OxSearchForm extends LitElement {
|
|
|
175
176
|
name=${ifDefined(field.name)}
|
|
176
177
|
?checked=${field.value}
|
|
177
178
|
?hidden=${field.hidden}
|
|
179
|
+
?readonly=${field.readonly}
|
|
178
180
|
@click=${(e: MouseEvent) => {
|
|
179
181
|
const checkbox = e.currentTarget as HTMLInputElement & { _value: any }
|
|
180
182
|
if (checkbox.hasAttribute('indeterminate')) {
|
|
@@ -211,6 +213,7 @@ export class OxSearchForm extends LitElement {
|
|
|
211
213
|
.field=${field.field}
|
|
212
214
|
.queryName=${field.queryName}
|
|
213
215
|
?hidden=${field.hidden}
|
|
216
|
+
?readonly=${field.readonly}
|
|
214
217
|
?autofocus=${!field.hidden && 0 === autofocusConsumed}
|
|
215
218
|
/>
|
|
216
219
|
`
|
|
@@ -225,6 +228,7 @@ export class OxSearchForm extends LitElement {
|
|
|
225
228
|
name=${ifDefined(field.name)}
|
|
226
229
|
placeholder=${ifDefined(field.placeholder)}
|
|
227
230
|
?hidden=${field.hidden}
|
|
231
|
+
?readonly=${field.readonly}
|
|
228
232
|
?autofocus=${!field.hidden && 0 === autofocusConsumed++}
|
|
229
233
|
/>
|
|
230
234
|
`
|
|
@@ -282,6 +286,10 @@ export class OxSearchForm extends LitElement {
|
|
|
282
286
|
}
|
|
283
287
|
}
|
|
284
288
|
|
|
289
|
+
getFieldByName(name: string) {
|
|
290
|
+
return this.renderRoot.querySelector(`[name=${name}]`)
|
|
291
|
+
}
|
|
292
|
+
|
|
285
293
|
_checkInputValidity() {
|
|
286
294
|
const names = this.fields?.map(i => i.name) || []
|
|
287
295
|
const result = names.every(name => {
|
|
@@ -417,10 +425,33 @@ export class OxSearchForm extends LitElement {
|
|
|
417
425
|
return data
|
|
418
426
|
}
|
|
419
427
|
|
|
420
|
-
reset() {
|
|
428
|
+
reset(value?: string[] | { [field: string]: any }) {
|
|
421
429
|
this.form
|
|
422
430
|
.then((form: HTMLFormElement) => {
|
|
423
|
-
|
|
431
|
+
if (value) {
|
|
432
|
+
if (value instanceof Array) {
|
|
433
|
+
value
|
|
434
|
+
.filter(item => typeof item == 'string')
|
|
435
|
+
.forEach(item => {
|
|
436
|
+
const field = this.getFieldByName(item)
|
|
437
|
+
if (field) {
|
|
438
|
+
;(field as HTMLInputElement).value = ''
|
|
439
|
+
}
|
|
440
|
+
})
|
|
441
|
+
} else {
|
|
442
|
+
const keys = Object.keys(value)
|
|
443
|
+
keys
|
|
444
|
+
.filter(key => typeof key == 'string')
|
|
445
|
+
.forEach(key => {
|
|
446
|
+
const field = this.getFieldByName(key)
|
|
447
|
+
if (field) {
|
|
448
|
+
;(field as HTMLInputElement).value = value[key]
|
|
449
|
+
}
|
|
450
|
+
})
|
|
451
|
+
}
|
|
452
|
+
} else {
|
|
453
|
+
form.reset()
|
|
454
|
+
}
|
|
424
455
|
})
|
|
425
456
|
.catch((error: any) => {
|
|
426
457
|
console.error('Error resetting the form:', error)
|
|
@@ -5,7 +5,7 @@ import { html } from 'lit-html'
|
|
|
5
5
|
import { FilterSelectRenderer } from '../types.js'
|
|
6
6
|
|
|
7
7
|
export const FilterCheckbox: FilterSelectRenderer = (filter, value, owner) => {
|
|
8
|
-
const { name, label } = filter
|
|
8
|
+
const { name, label, readonly } = filter
|
|
9
9
|
|
|
10
10
|
return html`
|
|
11
11
|
<ox-checkbox
|
|
@@ -27,6 +27,7 @@ export const FilterCheckbox: FilterSelectRenderer = (filter, value, owner) => {
|
|
|
27
27
|
})
|
|
28
28
|
)
|
|
29
29
|
}}
|
|
30
|
+
?readonly=${readonly}
|
|
30
31
|
><label><span>${label}</span></label></ox-checkbox
|
|
31
32
|
>
|
|
32
33
|
`
|
|
@@ -5,7 +5,7 @@ import { html } from 'lit-html'
|
|
|
5
5
|
import { FilterSelectRenderer } from '../types.js'
|
|
6
6
|
|
|
7
7
|
export const FilterInputBarcode: FilterSelectRenderer = (filter, value, owner) => {
|
|
8
|
-
const { name,
|
|
8
|
+
const { name, readonly, options } = filter
|
|
9
9
|
const { englishOnly, selectAfterChange } = (options || {}) as { [key: string]: any }
|
|
10
10
|
|
|
11
11
|
return html`
|
|
@@ -29,6 +29,7 @@ export const FilterInputBarcode: FilterSelectRenderer = (filter, value, owner) =
|
|
|
29
29
|
)
|
|
30
30
|
}}
|
|
31
31
|
filter-input
|
|
32
|
-
|
|
32
|
+
?readonly=${readonly}
|
|
33
|
+
></ox-input-barcode>
|
|
33
34
|
`
|
|
34
35
|
}
|
|
@@ -3,7 +3,7 @@ import { html } from 'lit-html'
|
|
|
3
3
|
import { FilterSelectRenderer } from '../types.js'
|
|
4
4
|
|
|
5
5
|
export const FilterInput: FilterSelectRenderer = (filter, value, owner) => {
|
|
6
|
-
const { name, type } = filter
|
|
6
|
+
const { name, type, readonly } = filter
|
|
7
7
|
|
|
8
8
|
return html`
|
|
9
9
|
<input
|
|
@@ -24,6 +24,7 @@ export const FilterInput: FilterSelectRenderer = (filter, value, owner) => {
|
|
|
24
24
|
})
|
|
25
25
|
)
|
|
26
26
|
}}
|
|
27
|
+
?readonly=${readonly}
|
|
27
28
|
/>
|
|
28
29
|
`
|
|
29
30
|
}
|
|
@@ -15,7 +15,7 @@ function formatDate(type: string, date: Date) {
|
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
export const FilterRangeDate: FilterSelectRenderer = (filter, value, owner) => {
|
|
18
|
-
var { name, type, operator } = filter
|
|
18
|
+
var { name, type, operator, readonly } = filter
|
|
19
19
|
var [from, to] = value instanceof Array ? value : []
|
|
20
20
|
|
|
21
21
|
if (type === 'datetime') {
|
|
@@ -49,6 +49,7 @@ export const FilterRangeDate: FilterSelectRenderer = (filter, value, owner) => {
|
|
|
49
49
|
})
|
|
50
50
|
)
|
|
51
51
|
}}
|
|
52
|
+
?readonly=${readonly}
|
|
52
53
|
/>
|
|
53
54
|
~
|
|
54
55
|
<input
|
|
@@ -74,6 +75,7 @@ export const FilterRangeDate: FilterSelectRenderer = (filter, value, owner) => {
|
|
|
74
75
|
})
|
|
75
76
|
)
|
|
76
77
|
}}
|
|
78
|
+
?readonly=${readonly}
|
|
77
79
|
/>
|
|
78
80
|
`
|
|
79
81
|
}
|
|
@@ -3,7 +3,7 @@ import { html } from 'lit-html'
|
|
|
3
3
|
import { FilterSelectRenderer } from '../types.js'
|
|
4
4
|
|
|
5
5
|
export const FilterRangeNumber: FilterSelectRenderer = (filter, value, owner) => {
|
|
6
|
-
const { name, operator } = filter
|
|
6
|
+
const { name, operator, readonly } = filter
|
|
7
7
|
const [from, to] = value instanceof Array ? value : []
|
|
8
8
|
|
|
9
9
|
return html`
|
|
@@ -31,6 +31,7 @@ export const FilterRangeNumber: FilterSelectRenderer = (filter, value, owner) =>
|
|
|
31
31
|
})
|
|
32
32
|
)
|
|
33
33
|
}}
|
|
34
|
+
?readonly=${readonly}
|
|
34
35
|
/>
|
|
35
36
|
~
|
|
36
37
|
<input
|
|
@@ -57,6 +58,7 @@ export const FilterRangeNumber: FilterSelectRenderer = (filter, value, owner) =>
|
|
|
57
58
|
})
|
|
58
59
|
)
|
|
59
60
|
}}
|
|
61
|
+
?readonly=${readonly}
|
|
60
62
|
/>
|
|
61
63
|
`
|
|
62
64
|
}
|
|
@@ -138,7 +138,7 @@ export class OxFiltersFormBase extends LitElement {
|
|
|
138
138
|
${(this.personalFilters || [])
|
|
139
139
|
.filter(filter => !filter.hidden)
|
|
140
140
|
.map((filter: FilterConfig) => {
|
|
141
|
-
const { name, label, type, operator, value: defaultValue } = filter
|
|
141
|
+
const { name, label, type, operator, readonly, value: defaultValue } = filter
|
|
142
142
|
const idx = operator === 'between' ? 1 : 0
|
|
143
143
|
const renderer = getFilterRenderer(
|
|
144
144
|
operator === 'like' || operator === 'i_like' || operator === 'i_nlike' || operator === 'nlike'
|
|
@@ -154,7 +154,12 @@ export class OxFiltersFormBase extends LitElement {
|
|
|
154
154
|
}
|
|
155
155
|
|
|
156
156
|
return type === 'search'
|
|
157
|
-
? html`<ox-input-search
|
|
157
|
+
? html`<ox-input-search
|
|
158
|
+
name="search"
|
|
159
|
+
.value=${value}
|
|
160
|
+
?autofocus=${this.autofocus}
|
|
161
|
+
?readonly=${readonly}
|
|
162
|
+
></ox-input-search>`
|
|
158
163
|
: type === 'boolean' || type === 'checkbox'
|
|
159
164
|
? renderer(filter, value, this)
|
|
160
165
|
: type !== 'select'
|
|
@@ -172,7 +177,7 @@ export class OxFiltersFormBase extends LitElement {
|
|
|
172
177
|
}
|
|
173
178
|
|
|
174
179
|
renderSelect(filter: FilterConfig, value: any, renderer: FilterSelectRenderer) {
|
|
175
|
-
const { name, label, operator, value: defaultValue } = filter
|
|
180
|
+
const { name, label, operator, readonly, value: defaultValue } = filter
|
|
176
181
|
|
|
177
182
|
return operator === 'in'
|
|
178
183
|
? html`
|
|
@@ -190,6 +195,7 @@ export class OxFiltersFormBase extends LitElement {
|
|
|
190
195
|
}
|
|
191
196
|
})
|
|
192
197
|
)}
|
|
198
|
+
?readonly=${readonly}
|
|
193
199
|
>
|
|
194
200
|
<ox-popup-list multiple attr-selected="checked" with-search>
|
|
195
201
|
${renderer(filter, value, this)}
|
|
@@ -211,6 +217,7 @@ export class OxFiltersFormBase extends LitElement {
|
|
|
211
217
|
}
|
|
212
218
|
})
|
|
213
219
|
)}
|
|
220
|
+
?readonly=${readonly}
|
|
214
221
|
>
|
|
215
222
|
<ox-popup-list with-search> ${renderer(filter, value, this)} </ox-popup-list>
|
|
216
223
|
</ox-select>
|
|
@@ -394,10 +401,33 @@ export class OxFiltersFormBase extends LitElement {
|
|
|
394
401
|
return filters
|
|
395
402
|
}
|
|
396
403
|
|
|
397
|
-
reset() {
|
|
404
|
+
reset(value?: string[] | { [field: string]: any }) {
|
|
398
405
|
this.form
|
|
399
406
|
.then((form: HTMLFormElement) => {
|
|
400
|
-
|
|
407
|
+
if (value) {
|
|
408
|
+
if (value instanceof Array) {
|
|
409
|
+
value
|
|
410
|
+
.filter(item => typeof item == 'string')
|
|
411
|
+
.forEach(item => {
|
|
412
|
+
const field = this.getFieldByName(item)
|
|
413
|
+
if (field) {
|
|
414
|
+
;(field as HTMLInputElement).value = ''
|
|
415
|
+
}
|
|
416
|
+
})
|
|
417
|
+
} else {
|
|
418
|
+
const keys = Object.keys(value)
|
|
419
|
+
keys
|
|
420
|
+
.filter(key => typeof key == 'string')
|
|
421
|
+
.forEach(key => {
|
|
422
|
+
const field = this.getFieldByName(key)
|
|
423
|
+
if (field) {
|
|
424
|
+
;(field as HTMLInputElement).value = value[key]
|
|
425
|
+
}
|
|
426
|
+
})
|
|
427
|
+
}
|
|
428
|
+
} else {
|
|
429
|
+
form.reset()
|
|
430
|
+
}
|
|
401
431
|
})
|
|
402
432
|
.catch((error: any) => {
|
|
403
433
|
console.error('Error resetting the form:', error)
|
|
@@ -12,6 +12,7 @@ export const SearchFormStyles = css`
|
|
|
12
12
|
grid-template-columns: repeat(24, 1fr);
|
|
13
13
|
grid-gap: var(--form-grid-gap, var(--spacing-medium));
|
|
14
14
|
grid-auto-rows: minmax(24px, auto);
|
|
15
|
+
background-color: var(--search-form-background-color, var(--md-sys-color-surface));
|
|
15
16
|
}
|
|
16
17
|
.search-form label {
|
|
17
18
|
grid-column: span 3;
|
|
@@ -19,7 +20,7 @@ export const SearchFormStyles = css`
|
|
|
19
20
|
align-self: center;
|
|
20
21
|
text-transform: capitalize;
|
|
21
22
|
|
|
22
|
-
font-size:var(--md-sys-typescale-label-large-size, 0.875rem);
|
|
23
|
+
font-size: var(--md-sys-typescale-label-large-size, 0.875rem);
|
|
23
24
|
color: var(--md-sys-color-on-primary-container);
|
|
24
25
|
}
|
|
25
26
|
|
|
@@ -77,11 +78,16 @@ export const SearchFormStyles = css`
|
|
|
77
78
|
color: var(--search-form-icon-color, var(--md-sys-color-on-surface));
|
|
78
79
|
}
|
|
79
80
|
|
|
81
|
+
input[readonly],
|
|
82
|
+
select[readonly] {
|
|
83
|
+
background-color: #f0f0f0;
|
|
84
|
+
}
|
|
85
|
+
|
|
80
86
|
@media screen and (max-width: 460px) {
|
|
81
87
|
.search-form {
|
|
82
88
|
grid-template-columns: repeat(12, 1fr);
|
|
83
89
|
grid-gap: var(--spacing-medium) var(--spacing-medium);
|
|
84
|
-
background-color: transparent
|
|
90
|
+
background-color: transparent;
|
|
85
91
|
|
|
86
92
|
max-height: 100%;
|
|
87
93
|
overflow-y: auto;
|
package/src/types.ts
CHANGED
|
@@ -64,6 +64,7 @@ export type FilterConfig = {
|
|
|
64
64
|
| undefined
|
|
65
65
|
boundTo?: string[]
|
|
66
66
|
hidden?: boolean
|
|
67
|
+
readonly?: boolean
|
|
67
68
|
onchange?: FilterChangedCallback
|
|
68
69
|
}
|
|
69
70
|
|
|
@@ -95,6 +96,7 @@ export type SearchFormField = {
|
|
|
95
96
|
attrs?: string[]
|
|
96
97
|
options?: SelectOption[] | ((form: OxSearchForm) => SelectOption[] | Promise<SelectOption[]>)
|
|
97
98
|
boundTo?: string[]
|
|
99
|
+
readonly?: boolean
|
|
98
100
|
handlers?: { [event: string]: EventListener }
|
|
99
101
|
onchange?: SearchFilterChangedCallback
|
|
100
102
|
}
|
|
@@ -213,7 +213,9 @@ RegularContact.args = {
|
|
|
213
213
|
label: 'name',
|
|
214
214
|
name: 'name',
|
|
215
215
|
type: 'text',
|
|
216
|
+
value: 'My Name',
|
|
216
217
|
placeholder: 'type your name.',
|
|
218
|
+
readonly: true,
|
|
217
219
|
props: { searchOper: 'i_like' },
|
|
218
220
|
onchange: value => {
|
|
219
221
|
console.log('changed', value)
|
|
@@ -15,6 +15,7 @@ export default {
|
|
|
15
15
|
fields: { control: 'object' },
|
|
16
16
|
hideSearchButton: { control: 'boolean' },
|
|
17
17
|
autofocus: { control: 'boolean' },
|
|
18
|
+
resetTarget: { control: 'object' },
|
|
18
19
|
theme: { control: 'select', options: ['light', 'dark'] }
|
|
19
20
|
}
|
|
20
21
|
}
|
|
@@ -29,10 +30,17 @@ interface ArgTypes {
|
|
|
29
30
|
fields?: SearchFormField[]
|
|
30
31
|
hideSearchButton?: boolean
|
|
31
32
|
autofocus?: boolean
|
|
33
|
+
resetTarget: string[] | { [field: string]: any }
|
|
32
34
|
theme: 'light' | 'dark'
|
|
33
35
|
}
|
|
34
36
|
|
|
35
|
-
const Template: Story<ArgTypes> = ({
|
|
37
|
+
const Template: Story<ArgTypes> = ({
|
|
38
|
+
fields,
|
|
39
|
+
hideSearchButton,
|
|
40
|
+
autofocus,
|
|
41
|
+
resetTarget,
|
|
42
|
+
theme = 'light'
|
|
43
|
+
}: ArgTypes) => html`
|
|
36
44
|
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet" />
|
|
37
45
|
|
|
38
46
|
<link href="/themes/light.css" rel="stylesheet" />
|
|
@@ -94,6 +102,9 @@ const Template: Story<ArgTypes> = ({ fields, hideSearchButton, autofocus, theme
|
|
|
94
102
|
</ox-search-form>
|
|
95
103
|
</div>
|
|
96
104
|
</div>
|
|
105
|
+
|
|
106
|
+
<button @click=${() => (document.querySelector('ox-search-form') as any)?.reset(resetTarget)}>Partial Reset</button>
|
|
107
|
+
<button @click=${() => (document.querySelector('ox-search-form') as any)?.reset()}>Full Reset</button>
|
|
97
108
|
`
|
|
98
109
|
|
|
99
110
|
const WAREHOUSE = [
|
|
@@ -208,6 +219,9 @@ Regular.args = {
|
|
|
208
219
|
}
|
|
209
220
|
],
|
|
210
221
|
hideSearchButton: true,
|
|
222
|
+
resetTarget: {
|
|
223
|
+
location: ''
|
|
224
|
+
},
|
|
211
225
|
autofocus: true
|
|
212
226
|
}
|
|
213
227
|
|
|
@@ -218,6 +232,8 @@ RegularContact.args = {
|
|
|
218
232
|
label: 'name',
|
|
219
233
|
name: 'name',
|
|
220
234
|
type: 'text',
|
|
235
|
+
readonly: true,
|
|
236
|
+
value: '남상혁',
|
|
221
237
|
placeholder: 'type your name.',
|
|
222
238
|
props: { searchOper: 'i_like' }
|
|
223
239
|
},
|
|
@@ -237,6 +253,7 @@ RegularContact.args = {
|
|
|
237
253
|
label: 'phone',
|
|
238
254
|
name: 'phone',
|
|
239
255
|
type: 'text',
|
|
256
|
+
readonly: true,
|
|
240
257
|
props: { searchOper: 'i_like' }
|
|
241
258
|
},
|
|
242
259
|
{
|
|
@@ -247,5 +264,6 @@ RegularContact.args = {
|
|
|
247
264
|
}
|
|
248
265
|
],
|
|
249
266
|
hideSearchButton: true,
|
|
267
|
+
resetTarget: ['name', 'email'],
|
|
250
268
|
autofocus: true
|
|
251
269
|
}
|