@operato/form 1.0.0-beta.3 → 1.0.0-beta.30

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 (62) hide show
  1. package/CHANGELOG.md +369 -0
  2. package/demo/index.html +68 -2
  3. package/dist/src/filters/filter-checkbox.d.ts +3 -0
  4. package/dist/src/filters/filter-checkbox.js +26 -0
  5. package/dist/src/filters/filter-checkbox.js.map +1 -0
  6. package/dist/src/filters/filter-input-barcode.d.ts +3 -0
  7. package/dist/src/filters/filter-input-barcode.js +24 -0
  8. package/dist/src/filters/filter-input-barcode.js.map +1 -0
  9. package/dist/src/filters/filter-input.d.ts +2 -0
  10. package/dist/src/filters/filter-input.js +24 -0
  11. package/dist/src/filters/filter-input.js.map +1 -0
  12. package/dist/src/filters/filter-range-date.d.ts +2 -0
  13. package/dist/src/filters/filter-range-date.js +54 -0
  14. package/dist/src/filters/filter-range-date.js.map +1 -0
  15. package/dist/src/filters/filter-range-number.d.ts +2 -0
  16. package/dist/src/filters/filter-range-number.js +53 -0
  17. package/dist/src/filters/filter-range-number.js.map +1 -0
  18. package/dist/src/filters/filter-select.d.ts +3 -0
  19. package/dist/src/filters/filter-select.js +33 -0
  20. package/dist/src/filters/filter-select.js.map +1 -0
  21. package/dist/src/filters/filter-styles.d.ts +1 -0
  22. package/dist/src/filters/filter-styles.js +88 -0
  23. package/dist/src/filters/filter-styles.js.map +1 -0
  24. package/dist/src/filters/index.d.ts +8 -0
  25. package/dist/src/filters/index.js +9 -0
  26. package/dist/src/filters/index.js.map +1 -0
  27. package/dist/src/filters/ox-filters-form-base.d.ts +25 -0
  28. package/dist/src/filters/ox-filters-form-base.js +238 -0
  29. package/dist/src/filters/ox-filters-form-base.js.map +1 -0
  30. package/dist/src/filters/registry.d.ts +7 -0
  31. package/dist/src/filters/registry.js +46 -0
  32. package/dist/src/filters/registry.js.map +1 -0
  33. package/dist/src/filters/types.d.ts +17 -0
  34. package/dist/src/filters/types.js +2 -0
  35. package/dist/src/filters/types.js.map +1 -0
  36. package/dist/src/index.d.ts +1 -0
  37. package/dist/src/index.js +1 -0
  38. package/dist/src/index.js.map +1 -1
  39. package/dist/stories/ox-filter-form-barcode.stories.d.ts +29 -0
  40. package/dist/stories/ox-filter-form-barcode.stories.js +82 -0
  41. package/dist/stories/ox-filter-form-barcode.stories.js.map +1 -0
  42. package/dist/stories/ox-filter-form-base.stories.d.ts +29 -0
  43. package/dist/stories/ox-filter-form-base.stories.js +82 -0
  44. package/dist/stories/ox-filter-form-base.stories.js.map +1 -0
  45. package/dist/tsconfig.tsbuildinfo +1 -1
  46. package/package.json +8 -6
  47. package/src/filters/filter-checkbox.ts +31 -0
  48. package/src/filters/filter-input-barcode.ts +30 -0
  49. package/src/filters/filter-input.ts +29 -0
  50. package/src/filters/filter-range-date.ts +64 -0
  51. package/src/filters/filter-range-number.ts +62 -0
  52. package/src/filters/filter-select.ts +47 -0
  53. package/src/filters/filter-styles.ts +88 -0
  54. package/src/filters/index.ts +10 -0
  55. package/src/filters/ox-filters-form-base.ts +261 -0
  56. package/src/filters/registry.ts +54 -0
  57. package/src/filters/types.ts +47 -0
  58. package/src/index.ts +1 -0
  59. package/stories/ox-filter-form-barcode.stories.ts +97 -0
  60. package/stories/ox-filter-form-base.stories.ts +97 -0
  61. package/themes/app-theme.css +142 -0
  62. /package/{src/themes → themes}/form-theme.css +0 -0
@@ -0,0 +1,54 @@
1
+ import { FilterCheckbox } from './filter-checkbox.js'
2
+ import { FilterInputBarcode } from './filter-input-barcode.js'
3
+ import { FilterInput } from './filter-input.js'
4
+ import { FilterRangeDate } from './filter-range-date.js'
5
+ import { FilterRangeNumber } from './filter-range-number.js'
6
+ import { FilterSelect } from './filter-select.js'
7
+ import { FilterSelectRenderer } from './types.js'
8
+
9
+ var RENDERERS: {
10
+ [name: string]: FilterSelectRenderer[]
11
+ } = {
12
+ string: [FilterInput],
13
+ text: [FilterInput],
14
+ email: [FilterInput],
15
+ tel: [FilterInput],
16
+ integer: [FilterInput, FilterRangeNumber],
17
+ float: [FilterInput, FilterRangeNumber],
18
+ number: [FilterInput, FilterRangeNumber],
19
+ select: [FilterSelect],
20
+ boolean: [FilterCheckbox],
21
+ checkbox: [FilterCheckbox],
22
+ month: [FilterInput, FilterRangeDate],
23
+ week: [FilterInput, FilterRangeDate],
24
+ date: [FilterInput, FilterRangeDate],
25
+ time: [FilterInput, FilterRangeDate],
26
+ datetime: [FilterInput, FilterRangeDate],
27
+ color: [FilterInput],
28
+ progress: [FilterInput, FilterRangeNumber],
29
+ link: [FilterInput],
30
+ image: [FilterInput],
31
+ json5: [FilterInput],
32
+ scanner: [FilterInputBarcode],
33
+ barcode: [FilterInputBarcode]
34
+ }
35
+
36
+ export function registerFilterRenderer(type: string, renderer: FilterSelectRenderer[]) {
37
+ RENDERERS[type] = renderer
38
+ }
39
+
40
+ export function unregisterFilterRenderer(type: string): void {
41
+ delete RENDERERS[type]
42
+ }
43
+
44
+ export function getFilterRenderers(): { [name: string]: FilterSelectRenderer[] } {
45
+ return { ...RENDERERS }
46
+ }
47
+
48
+ export function getFilterRenderer(type: string): FilterSelectRenderer[] {
49
+ if (typeof type == 'function') {
50
+ return type
51
+ }
52
+
53
+ return RENDERERS[type || 'text'] || [FilterInput]
54
+ }
@@ -0,0 +1,47 @@
1
+ import { TemplateResult } from 'lit-html'
2
+
3
+ export type FilterOperator =
4
+ | 'search'
5
+ | 'eq'
6
+ | 'between'
7
+ | 'gte'
8
+ | 'lte'
9
+ | 'is_not_true'
10
+ | 'in'
11
+ | 'like'
12
+ | 'i_like'
13
+ | 'noteq'
14
+ | 'is_empty_num_id'
15
+ | 'is_blank'
16
+ | 'is_present'
17
+ | 'is_not_false'
18
+ | 'is_true'
19
+ | 'is_false'
20
+ | 'is_not_null'
21
+ | 'is_null'
22
+ | 'notin_with_null'
23
+ | 'notin'
24
+ | 'gt'
25
+ | 'lt'
26
+ | 'i_nlike'
27
+ | 'nlike'
28
+
29
+ export type FilterConfig = {
30
+ name: string
31
+ label: string
32
+ type: string
33
+ operator?: FilterOperator
34
+ options?: { [key: string]: any }
35
+ }
36
+
37
+ export type FilterValue = {
38
+ name: string
39
+ operator: FilterOperator
40
+ value: string | number | boolean | string[] | number[] | undefined
41
+ }
42
+
43
+ export type FilterSelectRenderer = (
44
+ filter: FilterConfig,
45
+ value: string | number | boolean | string[] | number[] | any | undefined,
46
+ owner: Element
47
+ ) => TemplateResult | string | void
package/src/index.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from './styles'
2
2
  export * from './components/ox-search-form'
3
3
  export * from './components/ox-file-uploader'
4
+ export * from './filters'
@@ -0,0 +1,97 @@
1
+ import '../src/filters/ox-filters-form-base.js'
2
+
3
+ import { html, TemplateResult } from 'lit'
4
+
5
+ export default {
6
+ title: 'ox-filters-form-barcode',
7
+ component: 'ox-filters-form-barcode',
8
+ argTypes: {
9
+ value: { control: 'object' },
10
+ filters: { control: 'object' },
11
+ urlParamsSensitive: { control: 'boolean' }
12
+ }
13
+ }
14
+
15
+ interface Story<T> {
16
+ (args: T): TemplateResult
17
+ args?: Partial<T>
18
+ argTypes?: Record<string, unknown>
19
+ }
20
+
21
+ interface ArgTypes {
22
+ value?: object
23
+ filters?: object
24
+ urlParamsSensitive: boolean
25
+ }
26
+
27
+ const Template: Story<ArgTypes> = ({ value, filters, urlParamsSensitive }: ArgTypes) => html`
28
+ <link href="/themes/app-theme.css" rel="stylesheet" />
29
+ <link href="/themes/form-theme.css" rel="stylesheet" />
30
+ <link href="https://fonts.googleapis.com/css?family=Material+Icons&display=block" rel="stylesheet" />
31
+ <style>
32
+ body {
33
+ }
34
+ </style>
35
+
36
+ <ox-filters-form-base
37
+ .value=${value}
38
+ .filters=${filters}
39
+ ?url-params-sensitive=${urlParamsSensitive}
40
+ @filters-change=${(e: CustomEvent) => {
41
+ console.log('filters changed', e.detail)
42
+ }}
43
+ >
44
+ </ox-filters-form-base>
45
+ `
46
+
47
+ export const Regular = Template.bind({})
48
+ Regular.args = {
49
+ filters: [
50
+ {
51
+ name: 'test',
52
+ type: 'barcode',
53
+ label: 'name',
54
+ operator: 'eq'
55
+ },
56
+ {
57
+ name: 'active',
58
+ type: 'boolean',
59
+ label: 'active',
60
+ operator: 'eq'
61
+ },
62
+ {
63
+ name: 'sss',
64
+ type: 'select',
65
+ label: 'sss',
66
+ operator: 'eq',
67
+ options: () => {
68
+ return [
69
+ {
70
+ display: '',
71
+ value: ''
72
+ },
73
+ {
74
+ display: 'ABC',
75
+ value: 'ABC'
76
+ },
77
+ {
78
+ display: 'DEF',
79
+ value: 'DEF'
80
+ }
81
+ ]
82
+ }
83
+ },
84
+ {
85
+ name: 'range',
86
+ type: 'number',
87
+ label: 'range',
88
+ operator: 'between'
89
+ },
90
+ {
91
+ name: 'date-range',
92
+ type: 'datetime',
93
+ label: 'date',
94
+ operator: 'between'
95
+ }
96
+ ]
97
+ }
@@ -0,0 +1,97 @@
1
+ import '../src/filters/ox-filters-form-base.js'
2
+
3
+ import { html, TemplateResult } from 'lit'
4
+
5
+ export default {
6
+ title: 'ox-filters-form-base',
7
+ component: 'ox-filters-form-base',
8
+ argTypes: {
9
+ value: { control: 'object' },
10
+ filters: { control: 'object' },
11
+ urlParamsSensitive: { control: 'boolean' }
12
+ }
13
+ }
14
+
15
+ interface Story<T> {
16
+ (args: T): TemplateResult
17
+ args?: Partial<T>
18
+ argTypes?: Record<string, unknown>
19
+ }
20
+
21
+ interface ArgTypes {
22
+ value?: object
23
+ filters?: object
24
+ urlParamsSensitive: boolean
25
+ }
26
+
27
+ const Template: Story<ArgTypes> = ({ value, filters, urlParamsSensitive }: ArgTypes) => html`
28
+ <link href="/themes/app-theme.css" rel="stylesheet" />
29
+ <link href="/themes/form-theme.css" rel="stylesheet" />
30
+ <link href="https://fonts.googleapis.com/css?family=Material+Icons&display=block" rel="stylesheet" />
31
+ <style>
32
+ body {
33
+ }
34
+ </style>
35
+
36
+ <ox-filters-form-base
37
+ .value=${value}
38
+ .filters=${filters}
39
+ ?url-params-sensitive=${urlParamsSensitive}
40
+ @filters-change=${(e: CustomEvent) => {
41
+ console.log('filters changed', e.detail)
42
+ }}
43
+ >
44
+ </ox-filters-form-base>
45
+ `
46
+
47
+ export const Regular = Template.bind({})
48
+ Regular.args = {
49
+ filters: [
50
+ {
51
+ name: 'test',
52
+ type: 'string',
53
+ label: 'name',
54
+ operator: 'eq'
55
+ },
56
+ {
57
+ name: 'active',
58
+ type: 'boolean',
59
+ label: 'active',
60
+ operator: 'eq'
61
+ },
62
+ {
63
+ name: 'sss',
64
+ type: 'select',
65
+ label: 'sss',
66
+ operator: 'eq',
67
+ options: () => {
68
+ return [
69
+ {
70
+ display: '',
71
+ value: ''
72
+ },
73
+ {
74
+ display: 'ABC',
75
+ value: 'ABC'
76
+ },
77
+ {
78
+ display: 'DEF',
79
+ value: 'DEF'
80
+ }
81
+ ]
82
+ }
83
+ },
84
+ {
85
+ name: 'range',
86
+ type: 'number',
87
+ label: 'range',
88
+ operator: 'between'
89
+ },
90
+ {
91
+ name: 'date-range',
92
+ type: 'datetime',
93
+ label: 'date',
94
+ operator: 'between'
95
+ }
96
+ ]
97
+ }
@@ -0,0 +1,142 @@
1
+ body {
2
+ /* theme color */
3
+ --primary-color-rgb: 130, 105, 96;
4
+ --primary-color: rgb(var(--primary-color-rgb));
5
+ --secondary-color-rgb: 78, 78, 90;
6
+ --secondary-color: rgb(var(--secondary-color-rgb));
7
+ --focus-color: var(--theme-white-color);
8
+ --primary-background-color: var(--secondary-color);
9
+ --secondary-background-color: #283644;
10
+ --main-section-background-color: #f5f2ee;
11
+ --theme-white-color: #fff;
12
+ --theme-black-color: rgba(0, 0, 0, 0.9);
13
+
14
+ --focus-background-color: var(--primary-color);
15
+ --primary-text-color: #3c3938;
16
+ --secondary-text-color: var(--primary-color);
17
+
18
+ --opacity-dark-color: rgba(0, 0, 0, 0.4);
19
+ --opacity-light-color: rgba(255, 255, 255, 0.8);
20
+
21
+ /* status color */
22
+ --status-success-color: #35a24a;
23
+ --status-warning-color: #ee8d03;
24
+ --status-danger-color: #d14946;
25
+ --status-info-color: #398ace;
26
+
27
+ /* common style */
28
+ --border-radius: 4px;
29
+ --border-dark-color: 1px solid rgba(0, 0, 0, 0.15);
30
+ --border-light-color: 1px solid rgba(255, 255, 255, 0.3);
31
+
32
+ --box-shadow: 2px 2px 3px 0px rgba(0, 0, 0, 0.1);
33
+
34
+ --theme-font: 'Noto', Helvetica;
35
+
36
+ --margin-default: 9px;
37
+ --margin-narrow: 4px;
38
+ --margin-wide: 15px;
39
+ --padding-default: var(--margin-default);
40
+ --padding-narrow: var(--margin-narrow);
41
+ --padding-wide: var(--margin-wide);
42
+
43
+ --scrollbar-thumb-color: rgba(57, 78, 100, 0.5);
44
+ --scrollbar-thumb-hover-color: var(--primary-color);
45
+
46
+ --fontsize-default: 14px;
47
+ --fontsize-small: 13px;
48
+ --fontsize-large: 16px;
49
+
50
+ /* app layout style */
51
+ --app-grid-template-area: 'header header header' 'nav main aside' 'nav footer aside';
52
+
53
+ /* title & description style */
54
+ --title-margin: var(--margin-narrow) 0;
55
+ --title-font: bold 24px var(--theme-font);
56
+ --title-text-color: var(--secondary-color);
57
+ --title-font-mobile: bold 20px var(--theme-font);
58
+
59
+ --page-description-margin: var(--margin-narrow) 0 var(--margin-wide) 0;
60
+ --page-description-font: normal var(--fontsize-default) / 1.2rem var(--theme-font);
61
+ --page-description-color: var(--secondary-text-color);
62
+
63
+ --subtitle-padding: 12px 5px 3px 5px;
64
+ --subtitle-font: bold 18px var(--theme-font);
65
+ --subtitle-text-color: var(--primary-color);
66
+ --subtitle-border-bottom: 1px solid var(--primary-color);
67
+
68
+ /* icon style */
69
+ --icon-tiny-size: 24px;
70
+ --icon-default-size: 36px;
71
+ --icon-big-size: 48px;
72
+ --icon-default-color: var(--theme-white-color);
73
+
74
+ /* material design component themes */
75
+ --mdc-theme-on-primary: var(--theme-white-color);
76
+ --mdc-theme-primary: var(--secondary-text-color);
77
+ --mdc-theme-on-secondary: var(--theme-white-color);
78
+ --mdc-theme-secondary: var(--primary-color);
79
+ --mdc-button-outline-color: var(--primary-color);
80
+ --mdc-danger-button-primary-color: var(--status-danger-color);
81
+ --mdc-danger-button-outline-color: var(--status-danger-color);
82
+ --mdc-button-outline-width: 1px;
83
+ --mdc-button-horizontal-padding: 16px;
84
+
85
+ /* button style */
86
+ --button-background-color: #fafbfc;
87
+ --button-background-focus-color: var(--primary-color);
88
+ --button-border: var(--border-dark-color);
89
+ --button-border-radius: var(--border-radius);
90
+ --button-margin: var(--margin-default) var(--margin-default) var(--margin-default) 0;
91
+ --button-padding: var(--padding-default);
92
+ --button-color: var(--secondary-color);
93
+ --button-font: normal 15px var(--theme-font);
94
+ --button-text-transform: capitalize;
95
+ --button-active-box-shadow: 1px 1px 1px 0px rgba(0, 0, 0, 0.2);
96
+ --button-activ-border: 1px solid var(--primary-color);
97
+
98
+ --button-primary-background-color: var(--primary-color);
99
+ --button-primary-active-background-color: var(--status-success-color);
100
+ --button-primary-padding: var(--margin-default) var(--margin-wide);
101
+ --button-primary-color: var(--theme-white-color);
102
+ --button-primary-font: bold 16px var(--theme-font);
103
+
104
+ /* table style */
105
+ --th-padding: var(--padding-default) 0 var(--padding-default) var(--padding-default);
106
+ --th-border-top: 2px solid var(--secondary-color);
107
+ --th-text-transform: capitalize;
108
+ --th-font: bold var(--fontsize-small) var(--theme-font);
109
+ --th-color: rgba(var(--secondary-color-rgb), 0.8);
110
+
111
+ --tr-background-color: var(--theme-white-color);
112
+ --tr-background-odd-color: rgba(255, 255, 255, 0.4);
113
+ --tr-background-hover-color: #e1f5fe;
114
+ --td-border-bottom: 1px solid rgba(0, 0, 0, 0.09);
115
+ --td-padding: var(--padding-default);
116
+ --td-font: normal 13px var(--theme-font);
117
+ --td-color: var(--secondary-color);
118
+
119
+ /* form style */
120
+ --label-font: normal var(--fontsize-default) var(--theme-font);
121
+ --label-color: var(--secondary-color);
122
+ --label-text-transform: capitalize;
123
+ --input-margin: var(--margin-narrow) 0;
124
+ --input-padding: var(--padding-default);
125
+ --input-min-width: 200px;
126
+ --input-font: normal var(--fontsize-default) var(--theme-font);
127
+ --input-hint-font: normal var(--fontsize-small) var(--theme-font);
128
+ --input-hint-color: #666;
129
+ --input-container-max-width: 900px;
130
+ --fieldset-margin: var(--padding-wide) 0;
131
+ --fieldset-padding: 0 var(--padding-wide) var(--padding-wide) var(--padding-wide);
132
+ --legend-padding: var(--padding-default) 0;
133
+ --legend-color: var(--secondary-text-color);
134
+ --legend-font: bold 16px var(--theme-font);
135
+ }
136
+
137
+ @media only screen and (max-width: 460px) {
138
+ body {
139
+ /* subtitle style */
140
+ --subtitle-margin: 0;
141
+ }
142
+ }
File without changes