@operato/data-grist 0.3.4 → 0.3.13

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 (111) hide show
  1. package/CHANGELOG.md +82 -0
  2. package/custom-elements.json +984 -2383
  3. package/demo/index.html +22 -12
  4. package/dist/src/data-card/data-card.js +1 -0
  5. package/dist/src/data-card/data-card.js.map +1 -1
  6. package/dist/src/data-grid/data-grid-field.d.ts +1 -1
  7. package/dist/src/data-grid/data-grid-field.js +3 -1
  8. package/dist/src/data-grid/data-grid-field.js.map +1 -1
  9. package/dist/src/data-grid/data-grid-header.js +13 -7
  10. package/dist/src/data-grid/data-grid-header.js.map +1 -1
  11. package/dist/src/data-grist.js +1 -1
  12. package/dist/src/data-grist.js.map +1 -1
  13. package/dist/src/data-list/data-list.js +1 -0
  14. package/dist/src/data-list/data-list.js.map +1 -1
  15. package/dist/src/filters/filter-checkbox.js +1 -0
  16. package/dist/src/filters/filter-checkbox.js.map +1 -1
  17. package/dist/src/filters/filter-input.js +1 -1
  18. package/dist/src/filters/filter-input.js.map +1 -1
  19. package/dist/src/filters/filter-range-date.js +1 -1
  20. package/dist/src/filters/filter-range-date.js.map +1 -1
  21. package/dist/src/filters/filter-range-number.js +2 -1
  22. package/dist/src/filters/filter-range-number.js.map +1 -1
  23. package/dist/src/filters/filters-form.d.ts +19 -0
  24. package/dist/src/filters/filters-form.js +99 -0
  25. package/dist/src/filters/filters-form.js.map +1 -0
  26. package/dist/src/filters/index.d.ts +1 -0
  27. package/dist/src/filters/index.js +1 -0
  28. package/dist/src/filters/index.js.map +1 -1
  29. package/dist/src/filters/registry.d.ts +5 -5
  30. package/dist/src/filters/registry.js +25 -25
  31. package/dist/src/filters/registry.js.map +1 -1
  32. package/dist/src/gutters/gutter-button.js +1 -0
  33. package/dist/src/gutters/gutter-button.js.map +1 -1
  34. package/dist/src/gutters/gutter-row-selector.js +1 -0
  35. package/dist/src/gutters/gutter-row-selector.js.map +1 -1
  36. package/dist/src/index.d.ts +1 -2
  37. package/dist/src/index.js +1 -2
  38. package/dist/src/index.js.map +1 -1
  39. package/dist/src/record-view/record-view-body.d.ts +1 -1
  40. package/dist/src/record-view/record-view-body.js +5 -5
  41. package/dist/src/record-view/record-view-body.js.map +1 -1
  42. package/dist/src/record-view/record-view.d.ts +1 -1
  43. package/dist/src/record-view/record-view.js +1 -3
  44. package/dist/src/record-view/record-view.js.map +1 -1
  45. package/dist/src/types.d.ts +4 -3
  46. package/dist/src/types.js.map +1 -1
  47. package/dist/tsconfig.tsbuildinfo +1 -1
  48. package/package.json +9 -8
  49. package/src/data-card/data-card.ts +2 -0
  50. package/src/data-grid/data-grid-field.ts +4 -2
  51. package/src/data-grid/data-grid-header.ts +12 -6
  52. package/src/data-grist.ts +1 -1
  53. package/src/data-list/data-list.ts +2 -0
  54. package/src/filters/filter-checkbox.ts +1 -0
  55. package/src/filters/filter-input.ts +1 -1
  56. package/src/filters/filter-range-date.ts +1 -1
  57. package/src/filters/filter-range-number.ts +2 -1
  58. package/src/filters/filters-form.ts +132 -0
  59. package/src/filters/index.ts +2 -0
  60. package/src/filters/registry.ts +26 -26
  61. package/src/gutters/gutter-button.ts +3 -2
  62. package/src/gutters/gutter-row-selector.ts +3 -2
  63. package/src/index.ts +1 -3
  64. package/src/record-view/record-view-body.ts +7 -7
  65. package/src/record-view/record-view.ts +2 -4
  66. package/src/types.ts +34 -4
  67. package/themes/grist-theme.css +2 -22
  68. package/dist/src/interfaces/index.d.ts +0 -2
  69. package/dist/src/interfaces/index.js +0 -3
  70. package/dist/src/interfaces/index.js.map +0 -1
  71. package/dist/src/interfaces/ox-grist-search-form.d.ts +0 -6
  72. package/dist/src/interfaces/ox-grist-search-form.js +0 -2
  73. package/dist/src/interfaces/ox-grist-search-form.js.map +0 -1
  74. package/dist/src/interfaces/ox-search-field.d.ts +0 -39
  75. package/dist/src/interfaces/ox-search-field.js +0 -2
  76. package/dist/src/interfaces/ox-search-field.js.map +0 -1
  77. package/dist/src/search-form/index.d.ts +0 -7
  78. package/dist/src/search-form/index.js +0 -8
  79. package/dist/src/search-form/index.js.map +0 -1
  80. package/dist/src/search-form/ox-basic-field.d.ts +0 -18
  81. package/dist/src/search-form/ox-basic-field.js +0 -75
  82. package/dist/src/search-form/ox-basic-field.js.map +0 -1
  83. package/dist/src/search-form/ox-checkbox-field.d.ts +0 -11
  84. package/dist/src/search-form/ox-checkbox-field.js +0 -60
  85. package/dist/src/search-form/ox-checkbox-field.js.map +0 -1
  86. package/dist/src/search-form/ox-grist-search-form.d.ts +0 -11
  87. package/dist/src/search-form/ox-grist-search-form.js +0 -177
  88. package/dist/src/search-form/ox-grist-search-form.js.map +0 -1
  89. package/dist/src/search-form/ox-number-field.d.ts +0 -14
  90. package/dist/src/search-form/ox-number-field.js +0 -112
  91. package/dist/src/search-form/ox-number-field.js.map +0 -1
  92. package/dist/src/search-form/ox-search-form.d.ts +0 -15
  93. package/dist/src/search-form/ox-search-form.js +0 -53
  94. package/dist/src/search-form/ox-search-form.js.map +0 -1
  95. package/dist/src/search-form/ox-select-field.d.ts +0 -21
  96. package/dist/src/search-form/ox-select-field.js +0 -181
  97. package/dist/src/search-form/ox-select-field.js.map +0 -1
  98. package/dist/src/search-form/ox-text-field.d.ts +0 -11
  99. package/dist/src/search-form/ox-text-field.js +0 -60
  100. package/dist/src/search-form/ox-text-field.js.map +0 -1
  101. package/src/interfaces/index.ts +0 -2
  102. package/src/interfaces/ox-grist-search-form.ts +0 -7
  103. package/src/interfaces/ox-search-field.ts +0 -52
  104. package/src/search-form/index.ts +0 -7
  105. package/src/search-form/ox-basic-field.ts +0 -86
  106. package/src/search-form/ox-checkbox-field.ts +0 -57
  107. package/src/search-form/ox-grist-search-form.ts +0 -200
  108. package/src/search-form/ox-number-field.ts +0 -113
  109. package/src/search-form/ox-search-form.ts +0 -71
  110. package/src/search-form/ox-select-field.ts +0 -189
  111. package/src/search-form/ox-text-field.ts +0 -55
@@ -1,11 +0,0 @@
1
- import { TemplateResult } from 'lit';
2
- import { OXTextFieldProps } from '..';
3
- import { OXBasicField } from './ox-basic-field';
4
- export declare class OXTextField extends OXBasicField {
5
- field: OXTextFieldProps;
6
- value: string;
7
- static styles: import("lit").CSSResult[];
8
- setDefaultValue(defaultValue: string): void;
9
- render(): TemplateResult;
10
- private onChangeHandler;
11
- }
@@ -1,60 +0,0 @@
1
- import { __decorate } from "tslib";
2
- import { css, html } from 'lit';
3
- import { customElement, property } from 'lit/decorators.js';
4
- import { ifDefined } from 'lit/directives/if-defined.js';
5
- import { OXBasicField } from './ox-basic-field';
6
- let OXTextField = class OXTextField extends OXBasicField {
7
- constructor() {
8
- super(...arguments);
9
- this.value = '';
10
- }
11
- setDefaultValue(defaultValue) {
12
- this.value = defaultValue;
13
- }
14
- render() {
15
- if (!this.field)
16
- return html ``;
17
- const { name, hidden, id, placeholder } = this.field;
18
- return html `
19
- <label>
20
- <span class="input-wrapper" ?hidden=${hidden}>
21
- <input
22
- id=${ifDefined(id)}
23
- name=${name}
24
- type="text"
25
- placeholder=${ifDefined(placeholder)}
26
- .value=${this.value}
27
- @input=${this.onChangeHandler.bind(this)}
28
- />
29
- </span>
30
- </label>
31
- `;
32
- }
33
- onChangeHandler() {
34
- this.value = this.input.value;
35
- }
36
- };
37
- OXTextField.styles = [
38
- ...OXBasicField.styles,
39
- css `
40
- label {
41
- display: inline-flex;
42
- flex-direction: column;
43
- }
44
- span.input-wrapper {
45
- display: inline-flex;
46
- border-bottom: var(--border-dark-color, 1px solid rgba(0, 0, 0, 0.15));
47
- }
48
- `
49
- ];
50
- __decorate([
51
- property({ type: Object })
52
- ], OXTextField.prototype, "field", void 0);
53
- __decorate([
54
- property({ type: String })
55
- ], OXTextField.prototype, "value", void 0);
56
- OXTextField = __decorate([
57
- customElement('ox-text-field')
58
- ], OXTextField);
59
- export { OXTextField };
60
- //# sourceMappingURL=ox-text-field.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ox-text-field.js","sourceRoot":"","sources":["../../../src/search-form/ox-text-field.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAkB,MAAM,KAAK,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAGxD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAG/C,IAAa,WAAW,GAAxB,MAAa,WAAY,SAAQ,YAAY;IAA7C;;QAE8B,UAAK,GAAW,EAAE,CAAA;IA4ChD,CAAC;IA5BC,eAAe,CAAC,YAAoB;QAClC,IAAI,CAAC,KAAK,GAAG,YAAY,CAAA;IAC3B,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAA,EAAE,CAAA;QAE9B,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAA;QAEpD,OAAO,IAAI,CAAA;;8CAE+B,MAAM;;iBAEnC,SAAS,CAAC,EAAE,CAAC;mBACX,IAAI;;0BAEG,SAAS,CAAC,WAAW,CAAC;qBAC3B,IAAI,CAAC,KAAK;qBACV,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;;;;KAI/C,CAAA;IACH,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAA;IAC/B,CAAC;CACF,CAAA;AA1CQ,kBAAM,GAAG;IACd,GAAG,YAAY,CAAC,MAAM;IACtB,GAAG,CAAA;;;;;;;;;KASF;CACF,CAAA;AAf2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;0CAAyB;AACxB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;0CAAmB;AAFnC,WAAW;IADvB,aAAa,CAAC,eAAe,CAAC;GAClB,WAAW,CA8CvB;SA9CY,WAAW","sourcesContent":["import { css, html, TemplateResult } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { ifDefined } from 'lit/directives/if-defined.js'\n\nimport { OXTextFieldProps } from '..'\nimport { OXBasicField } from './ox-basic-field'\n\n@customElement('ox-text-field')\nexport class OXTextField extends OXBasicField {\n @property({ type: Object }) field!: OXTextFieldProps\n @property({ type: String }) value: string = ''\n\n static styles = [\n ...OXBasicField.styles,\n css`\n label {\n display: inline-flex;\n flex-direction: column;\n }\n span.input-wrapper {\n display: inline-flex;\n border-bottom: var(--border-dark-color, 1px solid rgba(0, 0, 0, 0.15));\n }\n `\n ]\n\n setDefaultValue(defaultValue: string) {\n this.value = defaultValue\n }\n\n render(): TemplateResult {\n if (!this.field) return html``\n\n const { name, hidden, id, placeholder } = this.field\n\n return html`\n <label>\n <span class=\"input-wrapper\" ?hidden=${hidden}>\n <input\n id=${ifDefined(id)}\n name=${name}\n type=\"text\"\n placeholder=${ifDefined(placeholder)}\n .value=${this.value}\n @input=${this.onChangeHandler.bind(this)}\n />\n </span>\n </label>\n `\n }\n\n private onChangeHandler(): void {\n this.value = this.input.value\n }\n}\n"]}
@@ -1,2 +0,0 @@
1
- export * from './ox-search-field'
2
- export * from './ox-grist-search-form'
@@ -1,7 +0,0 @@
1
- export type QueryFilterRangeValue = [from: number, to: number]
2
-
3
- export type QueryFilter = {
4
- name: string
5
- operator?: string
6
- value: any
7
- }
@@ -1,52 +0,0 @@
1
- export type OXSearchFieldType = 'select' | 'checkbox' | 'text' | 'number'
2
-
3
- export interface OXFieldOptionProps {
4
- name?: string
5
- value: string
6
- }
7
-
8
- export interface OXBasicFieldProps {
9
- name: string
10
- type?: OXSearchFieldType
11
- hidden?: boolean
12
- id?: string
13
- placeholder?: string
14
- handlers?: Record<string, (event: Event) => void>
15
- defaultValue?: any
16
- operator?: string
17
- }
18
-
19
- export interface OXTextFieldProps extends OXBasicFieldProps {
20
- defaultValue?: string
21
- }
22
-
23
- export interface OXNumberFieldProps extends OXBasicFieldProps {
24
- min?: number
25
- max?: number
26
- step: number
27
- defaultValue?: number
28
- }
29
-
30
- export interface OXObjectFieldProps extends OXBasicFieldProps {
31
- field: string
32
- queryName: string
33
- defaultValue?: Record<string, any>
34
- }
35
-
36
- export interface OXSelectFieldProps extends OXBasicFieldProps {
37
- searchEnable?: boolean
38
- options: OXFieldOptionProps[]
39
- defaultValue?: any
40
- }
41
-
42
- export interface OXCheckboxFieldProps extends OXBasicFieldProps {
43
- indeterminate?: boolean
44
- defaultValue?: boolean
45
- }
46
-
47
- export type OXSearchFieldProps =
48
- | OXTextFieldProps
49
- | OXNumberFieldProps
50
- | OXObjectFieldProps
51
- | OXSelectFieldProps
52
- | OXCheckboxFieldProps
@@ -1,7 +0,0 @@
1
- export * from './ox-search-form'
2
- export * from './ox-grist-search-form'
3
- export * from './ox-basic-field'
4
- export * from './ox-checkbox-field'
5
- export * from './ox-number-field'
6
- export * from './ox-select-field'
7
- export * from './ox-text-field'
@@ -1,86 +0,0 @@
1
- import { css, LitElement } from 'lit-element'
2
-
3
- import { OXBasicFieldProps } from '../interfaces/ox-search-field'
4
-
5
- export abstract class OXBasicField extends LitElement {
6
- static styles = [
7
- css`
8
- input,
9
- select {
10
- background-color: transparent;
11
- border: none;
12
- box-sizing: border-box;
13
- outline: none;
14
- padding: 4px 9px;
15
- font-size: var(--fontsize-default, 14px);
16
- color: var(--primary-text-color, #476172);
17
- font-weight: bold;
18
- }
19
- `
20
- ]
21
-
22
- field!: OXBasicFieldProps
23
-
24
- private form: HTMLFormElement | null = null
25
- value?: any
26
-
27
- abstract setDefaultValue(defaultValue: unknown): void
28
-
29
- get input(): HTMLInputElement | HTMLSelectElement {
30
- if (!this.field.name) throw new Error('No name property provided')
31
- const input: HTMLInputElement | null = this.renderRoot.querySelector(
32
- `input[name=${this.field.name}],select[name=${this.field.name}]`
33
- )
34
- if (!input) throw new Error('Failed to find input element')
35
-
36
- return input
37
- }
38
-
39
- override connectedCallback(): void {
40
- super.connectedCallback()
41
- this.form = this.findFormElement()
42
- this.form?.addEventListener('formdata', this.appendFormData.bind(this))
43
- }
44
-
45
- override disconnectedCallback(): void {
46
- super.disconnectedCallback()
47
- this.form?.removeEventListener('formdata', this.appendFormData.bind(this))
48
- this.form = null
49
- }
50
-
51
- override firstUpdated(): void {
52
- const { handlers } = this.field || {}
53
-
54
- this.registerBasicEventHandlers()
55
- if (handlers) this.registerCustomEventHandlers(handlers)
56
- if (this.field.defaultValue !== undefined) this.setDefaultValue(this.field.defaultValue)
57
- }
58
-
59
- private findFormElement(): HTMLFormElement | null {
60
- const rootNode: HTMLElement = this.getRootNode() as HTMLElement
61
- const forms: HTMLFormElement[] = Array.from(rootNode.querySelectorAll('form'))
62
-
63
- return forms.find((form: HTMLFormElement) => form.contains(this)) || null
64
- }
65
-
66
- private registerCustomEventHandlers(handlers: Record<string, (event: Event) => void>): void {
67
- const eventNames: string[] = Object.keys(handlers)
68
- if (!eventNames.length) return
69
-
70
- eventNames.forEach((eventName: string) => this.input.addEventListener(eventName, handlers[eventName]))
71
- }
72
-
73
- private registerBasicEventHandlers(): void {
74
- this.input.onkeydown = (event: KeyboardEvent) => {
75
- if (event.key === 'Enter') this.submit()
76
- }
77
- }
78
-
79
- private appendFormData({ formData }: FormDataEvent): void {
80
- formData.append(this.field.name, this.value)
81
- }
82
-
83
- private submit(): void {
84
- if (this.form) this.dispatchEvent(new CustomEvent('submit-field', { composed: true, bubbles: true }))
85
- }
86
- }
@@ -1,57 +0,0 @@
1
- import { css, html, TemplateResult } from 'lit'
2
- import { ifDefined } from 'lit-html/directives/if-defined.js'
3
- import { customElement, property } from 'lit/decorators.js'
4
-
5
- import { OXCheckboxFieldProps } from '..'
6
- import { OXBasicField } from './ox-basic-field'
7
-
8
- @customElement('ox-checkbox-field')
9
- export class OXCheckboxField extends OXBasicField {
10
- @property({ type: Object }) field!: OXCheckboxFieldProps
11
- @property({ type: Boolean }) value?: boolean
12
-
13
- static styles = [
14
- css`
15
- label {
16
- font-size: var(--fontsize-default, 14px);
17
- color: var(--primary-text-color, #476172);
18
- }
19
- `
20
- ]
21
-
22
- setDefaultValue(defaultValue: boolean): void {
23
- this.value = defaultValue
24
- }
25
-
26
- render(): TemplateResult {
27
- const { name, hidden, placeholder, id } = this.field
28
-
29
- return html`<label ?hidden=${hidden}>
30
- <input
31
- id=${ifDefined(id)}
32
- type="checkbox"
33
- name=${name}
34
- .checked=${Boolean(this.value)}
35
- @click=${this.onClickHandler.bind(this)}
36
- />
37
- ${placeholder || name}
38
- </label>`
39
- }
40
-
41
- private onClickHandler(): void {
42
- const checkbox: HTMLInputElement = this.input as HTMLInputElement
43
-
44
- if (!this.field.indeterminate) {
45
- this.value = !this.value
46
- } else {
47
- if (this.value === false) {
48
- this.value = undefined
49
- checkbox.indeterminate = true
50
- } else if (this.value === undefined) {
51
- this.value = true
52
- } else {
53
- this.value = false
54
- }
55
- }
56
- }
57
- }
@@ -1,200 +0,0 @@
1
- import { ColumnConfig, GristConfig } from '../types'
2
- import { LitElement, TemplateResult, html } from 'lit'
3
- import {
4
- OXBasicFieldProps,
5
- OXCheckboxFieldProps,
6
- OXNumberFieldProps,
7
- OXSearchFieldProps,
8
- OXSearchFieldTypes,
9
- OXSearchForm,
10
- OXSelectFieldProps,
11
- OXTextFieldProps,
12
- QueryFilter
13
- } from '..'
14
- import { customElement, property } from 'lit/decorators.js'
15
-
16
- @customElement('ox-grist-search-form')
17
- export class OXGristSearchForm extends LitElement {
18
- @property({ type: Object }) config!: GristConfig
19
- @property({ type: String }) defaultOperator: string = 'eq'
20
-
21
- private timeout?: NodeJS.Timeout
22
-
23
- render(): TemplateResult {
24
- const fields: OXSearchFieldProps[] = this.convertToSearchFields(this.config)
25
-
26
- return html` <ox-search-form .fields=${fields}></ox-search-form> `
27
- }
28
-
29
- private convertToSearchFields(config: GristConfig): OXSearchFieldProps[] {
30
- const supportingTypes: string[] = ['string', 'integer', 'number', 'float', 'select', 'boolean', 'checkbox']
31
-
32
- return config.columns
33
- .filter((columnConfig: ColumnConfig) => supportingTypes.indexOf(columnConfig.type) >= 0)
34
- .map((columnConfig: ColumnConfig) => {
35
- let fieldProps: OXBasicFieldProps = {
36
- name: columnConfig.name,
37
- hidden: Boolean(columnConfig.hidden),
38
- placeholder: typeof columnConfig.label === 'string' ? columnConfig.label : columnConfig.name
39
- }
40
-
41
- switch (columnConfig.type) {
42
- case 'string':
43
- return {
44
- ...fieldProps,
45
- type: 'text'
46
- } as OXTextFieldProps
47
-
48
- case 'integer':
49
- return {
50
- ...fieldProps,
51
- type: 'number',
52
- min: columnConfig.record?.options?.min || undefined,
53
- max: columnConfig.record?.options?.max || undefined
54
- } as OXNumberFieldProps
55
-
56
- case 'number':
57
- return {
58
- ...fieldProps,
59
- type: 'number',
60
- min: columnConfig.record?.options?.min || undefined,
61
- max: columnConfig.record?.options?.max || undefined
62
- } as OXNumberFieldProps
63
-
64
- case 'float':
65
- return {
66
- ...fieldProps,
67
- type: 'number',
68
- min: columnConfig.record?.options?.min || undefined,
69
- max: columnConfig.record?.options?.max || undefined
70
- } as OXNumberFieldProps
71
-
72
- case 'select':
73
- return {
74
- ...fieldProps,
75
- type: 'select',
76
- searchEnable: true,
77
- options: columnConfig.record?.options.map((option: string | Record<string, any>) => {
78
- if (typeof option === 'string') {
79
- return { value: option }
80
- } else if (option.display && option.value) {
81
- return {
82
- name: option.display,
83
- value: option.value
84
- }
85
- } else {
86
- throw new Error('Unexpected option property')
87
- }
88
- })
89
- } as OXSelectFieldProps
90
-
91
- case 'boolean':
92
- return {
93
- ...fieldProps,
94
- type: 'checkbox',
95
- indeterminate: true
96
- } as OXCheckboxFieldProps
97
-
98
- case 'checkbox':
99
- return {
100
- ...fieldProps,
101
- type: 'checkbox',
102
- indeterminate: true
103
- } as OXCheckboxFieldProps
104
-
105
- default:
106
- throw new Error('Non-supported type of column config')
107
- }
108
- })
109
-
110
- // return searchFields
111
- // .filter((searchField: string) => fieldMap.has(searchField))
112
- // .map((searchField: string) => {
113
- // const columnConfig: ColumnConfig | undefined = fieldMap.get(searchField)
114
- // if (!columnConfig) throw new Error('No matched column config')
115
-
116
- // let fieldProps: OXBasicFieldProps = {
117
- // name: columnConfig.name,
118
- // hidden: Boolean(columnConfig.hidden),
119
- // label: typeof columnConfig.label === 'string' ? columnConfig.label : undefined
120
- // }
121
-
122
- // switch (columnConfig.type) {
123
- // case 'string':
124
- // return {
125
- // ...fieldProps,
126
- // type: 'text'
127
- // } as OXTextFieldProps
128
-
129
- // case 'integer':
130
- // return {
131
- // ...fieldProps,
132
- // type: 'number',
133
- // min: columnConfig.record?.options?.min || undefined,
134
- // max: columnConfig.record?.options?.max || undefined
135
- // } as OXNumberFieldProps
136
-
137
- // case 'number':
138
- // return {
139
- // ...fieldProps,
140
- // type: 'number',
141
- // min: columnConfig.record?.options?.min || undefined,
142
- // max: columnConfig.record?.options?.max || undefined
143
- // } as OXNumberFieldProps
144
-
145
- // case 'float':
146
- // return {
147
- // ...fieldProps,
148
- // type: 'number',
149
- // min: columnConfig.record?.options?.min || undefined,
150
- // max: columnConfig.record?.options?.max || undefined
151
- // } as OXNumberFieldProps
152
-
153
- // case 'select':
154
- // return {
155
- // ...fieldProps,
156
- // type: 'select',
157
- // searchEnable: true,
158
- // options: columnConfig.record?.options.map((option: Record<string, any>) => ({
159
- // name: option.display,
160
- // value: option.value
161
- // }))
162
- // } as OXSelectFieldProps
163
-
164
- // case 'boolean':
165
- // return {
166
- // ...fieldProps,
167
- // type: 'checkbox',
168
- // indeterminate: true
169
- // } as OXCheckboxFieldProps
170
-
171
- // case 'checkbox':
172
- // return {
173
- // ...fieldProps,
174
- // type: 'checkbox',
175
- // indeterminate: true
176
- // } as OXCheckboxFieldProps
177
-
178
- // default:
179
- // throw new Error('Non-supported type of column config')
180
- // }
181
- // })
182
- }
183
-
184
- get queryFilters(): QueryFilter[] {
185
- const searchForm: OXSearchForm | null = this.renderRoot.querySelector<OXSearchForm>('ox-search-form')
186
- if (!searchForm) throw new Error('Failed to find search form')
187
-
188
- const searchFields: OXSearchFieldTypes[] = searchForm.searchFields
189
-
190
- return searchFields
191
- .filter(({ value }: OXSearchFieldTypes) => value !== null && value !== undefined && value !== '')
192
- .map((searchField: OXSearchFieldTypes) => {
193
- return {
194
- name: searchField.field.name,
195
- operator: searchField.field.operator || this.defaultOperator,
196
- value: searchField.value
197
- }
198
- })
199
- }
200
- }
@@ -1,113 +0,0 @@
1
- import '@material/mwc-icon'
2
-
3
- import { css, CSSResult, html, TemplateResult } from 'lit'
4
- import { ifDefined } from 'lit-html/directives/if-defined.js'
5
- import { customElement, property } from 'lit/decorators.js'
6
-
7
- import { OXNumberFieldProps } from '..'
8
- import { OXBasicField } from './ox-basic-field'
9
-
10
- @customElement('ox-number-field')
11
- export class OXNumberField extends OXBasicField {
12
- @property({ type: Object }) field!: OXNumberFieldProps
13
- @property({ type: Number }) value?: number
14
-
15
- setDefaultValue(defaultValue: number): void {
16
- this.value = defaultValue
17
- }
18
-
19
- static styles: CSSResult[] = [
20
- css`
21
- :host {
22
- display: inline-flex;
23
- flex-direction: column;
24
- }
25
- input::-webkit-outer-spin-button,
26
- input::-webkit-inner-spin-button {
27
- -webkit-appearance: none;
28
- margin: 0;
29
- }
30
-
31
- span.input-wrapper {
32
- display: inline-flex;
33
- }
34
-
35
- button {
36
- padding: var(--padding-narrow);
37
- height: 24px;
38
- background-color: var(--theme-white-color);
39
- border: 1px solid rgba(var(--primary-color-rgb), 0.5);
40
- border-radius: 50%;
41
- opacity: 0.6;
42
- cursor: pointer;
43
- }
44
- button mwc-icon {
45
- font-size: var(--fontsize-default, 16px);
46
- color: var(--primary-text-color, #476172);
47
- }
48
- button:hover {
49
- opacity: 1;
50
- }
51
- input {
52
- border: none;
53
- outline: none;
54
- padding: 4px 9px;
55
- text-align: center;
56
- font-size: var(--fontsize-default, 14px);
57
- color: var(--primary-text-color, #476172);
58
- }
59
- `
60
- ]
61
-
62
- render(): TemplateResult {
63
- const { name, hidden, id, placeholder, min, max, step } = this.field
64
-
65
- return html`
66
- <span class="input-wrapper" ?hidden=${hidden}>
67
- <button @click=${this.decrease.bind(this)}>
68
- <mwc-icon>add</mwc-icon>
69
- </button>
70
- <input
71
- id=${ifDefined(id)}
72
- name=${name}
73
- type="number"
74
- placeholder=${ifDefined(placeholder)}
75
- min=${ifDefined(min)}
76
- max=${ifDefined(max)}
77
- step=${ifDefined(step)}
78
- .value=${String(this.value) || ''}
79
- @change=${this.onChangeHandler.bind(this)}
80
- />
81
- <button @click=${this.increase.bind(this)}>
82
- <mwc-icon>remove</mwc-icon>
83
- </button>
84
- </span>
85
- `
86
- }
87
-
88
- decrease(): void {
89
- let fractionDigits: number = 0
90
- if (this.field.step) {
91
- fractionDigits = String(this.field.step).split('.')[1].length
92
- }
93
-
94
- this.value = Number(((this.value ?? 0) - (this.field.step || 1)).toFixed(fractionDigits))
95
- }
96
-
97
- increase(): void {
98
- let fractionDigits: number = 0
99
- if (this.field.step) {
100
- fractionDigits = String(this.field.step).split('.')[1].length
101
- }
102
-
103
- this.value = Number(((this.value ?? 0) + (this.field.step || 1)).toFixed(fractionDigits))
104
- }
105
-
106
- private onChangeHandler(): void {
107
- if (this.input.value) {
108
- this.value = Number(this.input.value)
109
- } else {
110
- this.value = undefined
111
- }
112
- }
113
- }
@@ -1,71 +0,0 @@
1
- import './ox-text-field'
2
- import './ox-checkbox-field'
3
- import './ox-select-field'
4
- import './ox-number-field'
5
-
6
- import { LitElement, TemplateResult, html } from 'lit'
7
- import {
8
- OXCheckboxField,
9
- OXCheckboxFieldProps,
10
- OXNumberField,
11
- OXNumberFieldProps,
12
- OXSearchFieldProps,
13
- OXSelectField,
14
- OXSelectFieldProps,
15
- OXTextField,
16
- OXTextFieldProps
17
- } from '..'
18
- import { customElement, property, query, queryAll } from 'lit/decorators.js'
19
-
20
- export type OXSearchFieldTypes = OXTextField | OXNumberField | OXSelectField | OXCheckboxField
21
-
22
- @customElement('ox-search-form')
23
- export class OXSearchForm extends LitElement {
24
- @property({ type: Array }) fields!: OXSearchFieldProps[]
25
-
26
- @query('form') form!: HTMLFormElement
27
-
28
- render(): TemplateResult {
29
- return html`
30
- <form @submit-field=${this._submitFieldHandler.bind(this)}>
31
- <slot></slot>
32
- ${this.fields.map(this.renderField)}
33
- </form>
34
- `
35
- }
36
-
37
- get searchFields(): OXSearchFieldTypes[] {
38
- return Array.from(this.form.querySelectorAll('*'))
39
- }
40
-
41
- private renderField(field: OXSearchFieldProps): TemplateResult {
42
- const { type } = field
43
-
44
- switch (type) {
45
- case 'text':
46
- return html`<ox-text-field .field=${field as OXTextFieldProps}></ox-text-field>`
47
-
48
- case 'number':
49
- return html`<ox-number-field .field=${field as OXNumberFieldProps}></ox-number-field>`
50
-
51
- case 'select':
52
- return html`<ox-select-field .field=${field as OXSelectFieldProps}></ox-select-field>`
53
-
54
- case 'checkbox':
55
- return html`<ox-checkbox-field .field=${field as OXCheckboxFieldProps}></ox-checkbox-field>`
56
-
57
- default:
58
- return html`<ox-text-field .field=${field as OXTextFieldProps}></ox-text-field>`
59
- }
60
- }
61
-
62
- _submitFieldHandler(): void {
63
- this.dispatchEvent(
64
- new CustomEvent('submit', {
65
- composed: true,
66
- bubbles: true,
67
- cancelable: true
68
- })
69
- ) && this.form.submit()
70
- }
71
- }