@operato/form 2.0.0-alpha.152 → 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.
Files changed (42) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/src/components/ox-search-form.d.ts +4 -1
  3. package/dist/src/components/ox-search-form.js +42 -8
  4. package/dist/src/components/ox-search-form.js.map +1 -1
  5. package/dist/src/filters/filter-checkbox.js +2 -1
  6. package/dist/src/filters/filter-checkbox.js.map +1 -1
  7. package/dist/src/filters/filter-input-barcode.js +3 -2
  8. package/dist/src/filters/filter-input-barcode.js.map +1 -1
  9. package/dist/src/filters/filter-input.js +2 -1
  10. package/dist/src/filters/filter-input.js.map +1 -1
  11. package/dist/src/filters/filter-range-date.js +3 -1
  12. package/dist/src/filters/filter-range-date.js.map +1 -1
  13. package/dist/src/filters/filter-range-number.js +3 -1
  14. package/dist/src/filters/filter-range-number.js.map +1 -1
  15. package/dist/src/filters/filter-styles.js +4 -0
  16. package/dist/src/filters/filter-styles.js.map +1 -1
  17. package/dist/src/filters/ox-filters-form-base.d.ts +3 -1
  18. package/dist/src/filters/ox-filters-form-base.js +39 -5
  19. package/dist/src/filters/ox-filters-form-base.js.map +1 -1
  20. package/dist/src/styles/search-form-styles.js +8 -2
  21. package/dist/src/styles/search-form-styles.js.map +1 -1
  22. package/dist/src/types.d.ts +2 -0
  23. package/dist/src/types.js.map +1 -1
  24. package/dist/stories/ox-search-form-change-handler.stories.js +2 -0
  25. package/dist/stories/ox-search-form-change-handler.stories.js.map +1 -1
  26. package/dist/stories/ox-search-form.stories.d.ts +6 -0
  27. package/dist/stories/ox-search-form.stories.js +12 -1
  28. package/dist/stories/ox-search-form.stories.js.map +1 -1
  29. package/dist/tsconfig.tsbuildinfo +1 -1
  30. package/package.json +2 -2
  31. package/src/components/ox-search-form.ts +39 -8
  32. package/src/filters/filter-checkbox.ts +2 -1
  33. package/src/filters/filter-input-barcode.ts +3 -2
  34. package/src/filters/filter-input.ts +2 -1
  35. package/src/filters/filter-range-date.ts +3 -1
  36. package/src/filters/filter-range-number.ts +3 -1
  37. package/src/filters/filter-styles.ts +4 -0
  38. package/src/filters/ox-filters-form-base.ts +35 -5
  39. package/src/styles/search-form-styles.ts +8 -2
  40. package/src/types.ts +2 -0
  41. package/stories/ox-search-form-change-handler.stories.ts +2 -0
  42. 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=${field.hidden}>${field.label || field.name || field.id}</label>
158
+ <label ?hidden=${hidden}>${label || name || id}</label>
159
159
  <select
160
- .value=${field.value}
161
- name=${ifDefined(field.name)}
162
- placeholder=${ifDefined(field.placeholder)}
163
- ?hidden=${field.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
- form.reset()
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, type, options } = filter
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
  }
@@ -118,5 +118,9 @@ export const FilterStyles = css`
118
118
  input {
119
119
  flex: 1;
120
120
  }
121
+
122
+ [readonly] {
123
+ background-color: #f0f0f0;
124
+ }
121
125
  }
122
126
  `
@@ -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 name="search" .value=${value} ?autofocus=${this.autofocus}></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
- form.reset()
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> = ({ fields, hideSearchButton, autofocus, theme = 'light' }: ArgTypes) => html`
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
  }