@operato/data-grist 2.0.0-alpha.11 → 2.0.0-alpha.110
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 +464 -0
- package/demo/data-grist-test.html +25 -14
- package/demo/index.html +25 -14
- package/demo/report-test.html +13 -2
- package/dist/src/configure/column-builder.js.map +1 -1
- package/dist/src/configure/rows-option-builder.js +2 -1
- package/dist/src/configure/rows-option-builder.js.map +1 -1
- package/dist/src/configure/zero-config.js +1 -0
- package/dist/src/configure/zero-config.js.map +1 -1
- package/dist/src/data-card/data-card-gutter-menu.d.ts +1 -1
- package/dist/src/data-card/data-card-gutter-menu.js +5 -5
- package/dist/src/data-card/data-card-gutter-menu.js.map +1 -1
- package/dist/src/data-card/data-card.d.ts +2 -2
- package/dist/src/data-card/data-card.js +3 -3
- package/dist/src/data-card/data-card.js.map +1 -1
- package/dist/src/data-card/event-handlers/record-card-click-handler.js +1 -1
- package/dist/src/data-card/event-handlers/record-card-click-handler.js.map +1 -1
- package/dist/src/data-card/record-card.d.ts +2 -2
- package/dist/src/data-card/record-card.js +26 -26
- package/dist/src/data-card/record-card.js.map +1 -1
- package/dist/src/data-grid/data-grid-accum-field.js +8 -3
- package/dist/src/data-grid/data-grid-accum-field.js.map +1 -1
- package/dist/src/data-grid/data-grid-body-style.js +1 -0
- package/dist/src/data-grid/data-grid-body-style.js.map +1 -1
- package/dist/src/data-grid/data-grid-body.d.ts +3 -3
- package/dist/src/data-grid/data-grid-body.js +9 -4
- package/dist/src/data-grid/data-grid-body.js.map +1 -1
- package/dist/src/data-grid/data-grid-field.d.ts +1 -1
- package/dist/src/data-grid/data-grid-field.js +2 -2
- package/dist/src/data-grid/data-grid-field.js.map +1 -1
- package/dist/src/data-grid/data-grid-footer.d.ts +2 -2
- package/dist/src/data-grid/data-grid-footer.js +17 -9
- package/dist/src/data-grid/data-grid-footer.js.map +1 -1
- package/dist/src/data-grid/data-grid-header.d.ts +1 -1
- package/dist/src/data-grid/data-grid-header.js +38 -35
- package/dist/src/data-grid/data-grid-header.js.map +1 -1
- package/dist/src/data-grid/data-grid.d.ts +1 -1
- package/dist/src/data-grid/data-grid.js +12 -2
- package/dist/src/data-grid/data-grid.js.map +1 -1
- package/dist/src/data-grist.d.ts +1 -1
- package/dist/src/data-grist.js +23 -22
- package/dist/src/data-grist.js.map +1 -1
- package/dist/src/data-list/data-list-gutter.js +12 -0
- package/dist/src/data-list/data-list-gutter.js.map +1 -1
- package/dist/src/data-list/data-list.d.ts +2 -2
- package/dist/src/data-list/data-list.js +3 -3
- package/dist/src/data-list/data-list.js.map +1 -1
- package/dist/src/data-list/event-handlers/record-partial-click-handler.js +1 -1
- package/dist/src/data-list/event-handlers/record-partial-click-handler.js.map +1 -1
- package/dist/src/data-list/record-partial.d.ts +2 -2
- package/dist/src/data-list/record-partial.js +20 -18
- package/dist/src/data-list/record-partial.js.map +1 -1
- package/dist/src/data-report/data-report-body.d.ts +1 -1
- package/dist/src/data-report/data-report-component.d.ts +1 -1
- package/dist/src/data-report.d.ts +1 -1
- package/dist/src/editors/ox-grist-editor-checkbox.d.ts +3 -2
- package/dist/src/editors/ox-grist-editor-checkbox.js +9 -2
- package/dist/src/editors/ox-grist-editor-checkbox.js.map +1 -1
- package/dist/src/editors/ox-grist-editor-color.d.ts +1 -1
- package/dist/src/editors/ox-grist-editor-date.d.ts +1 -1
- package/dist/src/editors/ox-grist-editor-datetime.d.ts +2 -2
- package/dist/src/editors/ox-grist-editor-datetime.js +1 -2
- package/dist/src/editors/ox-grist-editor-datetime.js.map +1 -1
- package/dist/src/editors/ox-grist-editor-email.d.ts +1 -1
- package/dist/src/editors/ox-grist-editor-file.d.ts +3 -2
- package/dist/src/editors/ox-grist-editor-file.js +8 -2
- package/dist/src/editors/ox-grist-editor-file.js.map +1 -1
- package/dist/src/editors/ox-grist-editor-image.d.ts +2 -2
- package/dist/src/editors/ox-grist-editor-image.js +8 -8
- package/dist/src/editors/ox-grist-editor-image.js.map +1 -1
- package/dist/src/editors/ox-grist-editor-month.d.ts +1 -1
- package/dist/src/editors/ox-grist-editor-multiple-select.d.ts +1 -1
- package/dist/src/editors/ox-grist-editor-number.d.ts +3 -2
- package/dist/src/editors/ox-grist-editor-number.js +10 -9
- package/dist/src/editors/ox-grist-editor-number.js.map +1 -1
- package/dist/src/editors/ox-grist-editor-password.d.ts +1 -1
- package/dist/src/editors/ox-grist-editor-select.d.ts +1 -1
- package/dist/src/editors/ox-grist-editor-select.js +37 -25
- package/dist/src/editors/ox-grist-editor-select.js.map +1 -1
- package/dist/src/editors/ox-grist-editor-tel.d.ts +1 -1
- package/dist/src/editors/ox-grist-editor-text.d.ts +2 -1
- package/dist/src/editors/ox-grist-editor-text.js +3 -0
- package/dist/src/editors/ox-grist-editor-text.js.map +1 -1
- package/dist/src/editors/ox-grist-editor-textarea.d.ts +2 -1
- package/dist/src/editors/ox-grist-editor-textarea.js +3 -0
- package/dist/src/editors/ox-grist-editor-textarea.js.map +1 -1
- package/dist/src/editors/ox-grist-editor-time.d.ts +1 -1
- package/dist/src/editors/ox-grist-editor-tree.d.ts +1 -1
- package/dist/src/editors/ox-grist-editor-week.d.ts +1 -1
- package/dist/src/editors/ox-grist-editor.d.ts +4 -4
- package/dist/src/editors/ox-grist-editor.js +14 -12
- package/dist/src/editors/ox-grist-editor.js.map +1 -1
- package/dist/src/editors/ox-input-tree.d.ts +1 -1
- package/dist/src/empty-note.d.ts +2 -2
- package/dist/src/empty-note.js +3 -3
- package/dist/src/empty-note.js.map +1 -1
- package/dist/src/filters/filter-checkbox.js +12 -5
- package/dist/src/filters/filter-checkbox.js.map +1 -1
- package/dist/src/filters/filter-range-date.js +12 -1
- package/dist/src/filters/filter-range-date.js.map +1 -1
- package/dist/src/filters/filter-select.js +30 -16
- package/dist/src/filters/filter-select.js.map +1 -1
- package/dist/src/filters/filter-styles.js +47 -28
- package/dist/src/filters/filter-styles.js.map +1 -1
- package/dist/src/filters/filters-form.d.ts +7 -1
- package/dist/src/filters/filters-form.js +154 -71
- package/dist/src/filters/filters-form.js.map +1 -1
- package/dist/src/gutters/gutter-button.d.ts +1 -1
- package/dist/src/gutters/gutter-button.js +3 -3
- package/dist/src/gutters/gutter-button.js.map +1 -1
- package/dist/src/gutters/gutter-dirty.d.ts +1 -1
- package/dist/src/gutters/gutter-dirty.js +5 -5
- package/dist/src/gutters/gutter-dirty.js.map +1 -1
- package/dist/src/handlers/contextmenu-tree-mutation.js +4 -22
- package/dist/src/handlers/contextmenu-tree-mutation.js.map +1 -1
- package/dist/src/index.d.ts +0 -1
- package/dist/src/index.js +0 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/record-view/record-creator.d.ts +2 -2
- package/dist/src/record-view/record-creator.js +1 -1
- package/dist/src/record-view/record-creator.js.map +1 -1
- package/dist/src/record-view/record-view-body.d.ts +3 -3
- package/dist/src/record-view/record-view-body.js +4 -4
- package/dist/src/record-view/record-view-body.js.map +1 -1
- package/dist/src/record-view/record-view.d.ts +2 -2
- package/dist/src/record-view/record-view.js +5 -5
- package/dist/src/record-view/record-view.js.map +1 -1
- package/dist/src/renderers/ox-grist-renderer-progress.d.ts +1 -1
- package/dist/src/renderers/ox-grist-renderer-select.js +34 -4
- package/dist/src/renderers/ox-grist-renderer-select.js.map +1 -1
- package/dist/src/renderers/ox-grist-renderer-tree.d.ts +1 -1
- package/dist/src/renderers/ox-grist-renderer.d.ts +2 -2
- package/dist/src/sorters/sorters-control.js +3 -3
- package/dist/src/sorters/sorters-control.js.map +1 -1
- package/dist/src/types.d.ts +15 -9
- package/dist/src/types.js.map +1 -1
- package/dist/stories/{accumulator.stories.d.ts → accumulator-format.stories.d.ts} +1 -1
- package/dist/stories/{accumulator.stories.js → accumulator-format.stories.js} +58 -129
- package/dist/stories/accumulator-format.stories.js.map +1 -0
- package/dist/stories/barcode-input-filter.stories.d.ts +1 -1
- package/dist/stories/barcode-input-filter.stories.js +41 -79
- package/dist/stories/barcode-input-filter.stories.js.map +1 -1
- package/dist/stories/bounded-select-filters.stories.d.ts +25 -0
- package/dist/stories/bounded-select-filters.stories.js +264 -0
- package/dist/stories/bounded-select-filters.stories.js.map +1 -0
- package/dist/stories/bounded-select-record.stories.d.ts +25 -0
- package/dist/stories/bounded-select-record.stories.js +267 -0
- package/dist/stories/bounded-select-record.stories.js.map +1 -0
- package/dist/stories/creatable-only-column.stories.d.ts +25 -0
- package/dist/stories/creatable-only-column.stories.js +211 -0
- package/dist/stories/creatable-only-column.stories.js.map +1 -0
- package/dist/stories/default-filters.stories.d.ts +1 -1
- package/dist/stories/default-filters.stories.js +84 -79
- package/dist/stories/default-filters.stories.js.map +1 -1
- package/dist/stories/dynamic-editable.stories.d.ts +1 -1
- package/dist/stories/dynamic-editable.stories.js +61 -86
- package/dist/stories/dynamic-editable.stories.js.map +1 -1
- package/dist/stories/empty-sorters.stories.d.ts +1 -1
- package/dist/stories/empty-sorters.stories.js +41 -78
- package/dist/stories/empty-sorters.stories.js.map +1 -1
- package/dist/stories/explicit-fetch.stories.d.ts +1 -1
- package/dist/stories/explicit-fetch.stories.js +42 -79
- package/dist/stories/explicit-fetch.stories.js.map +1 -1
- package/dist/stories/fixed-column.stories.d.ts +1 -1
- package/dist/stories/fixed-column.stories.js +45 -127
- package/dist/stories/fixed-column.stories.js.map +1 -1
- package/dist/stories/grid-setting.stories.d.ts +36 -0
- package/dist/stories/grid-setting.stories.js +403 -0
- package/dist/stories/grid-setting.stories.js.map +1 -0
- package/dist/stories/grist-modes.stories.d.ts +1 -1
- package/dist/stories/grist-modes.stories.js +74 -140
- package/dist/stories/grist-modes.stories.js.map +1 -1
- package/dist/stories/group-header.stories.d.ts +1 -1
- package/dist/stories/group-header.stories.js +45 -127
- package/dist/stories/group-header.stories.js.map +1 -1
- package/dist/stories/textarea.stories.d.ts +1 -1
- package/dist/stories/textarea.stories.js +39 -121
- package/dist/stories/textarea.stories.js.map +1 -1
- package/dist/stories/tree-column-with-checkbox.stories.d.ts +1 -1
- package/dist/stories/tree-column-with-checkbox.stories.js +49 -136
- package/dist/stories/tree-column-with-checkbox.stories.js.map +1 -1
- package/dist/stories/tree-column.stories.d.ts +1 -1
- package/dist/stories/tree-column.stories.js +49 -136
- package/dist/stories/tree-column.stories.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/docs/default-value/default-value.md +1 -1
- package/docs/default-value/value-generator/date-generator.md +31 -2
- package/docs/default-value/value-generator/hour-time-generator.md +33 -0
- package/docs/default-value/value-generator/minute-time-generator.md +33 -0
- package/docs/default-value/value-generator/month-date-generator.md +4 -2
- package/docs/default-value/value-generator/now-generator.md +29 -0
- package/docs/default-value/value-generator/time-generator.md +31 -0
- package/docs/default-value/value-generator/today-generator.md +29 -0
- package/docs/default-value/value-generator/week-date-generator.md +33 -2
- package/docs/default-value/value-generator/year-date-generator.md +33 -2
- package/package.json +21 -20
- package/src/configure/column-builder.ts +1 -0
- package/src/configure/rows-option-builder.ts +11 -1
- package/src/configure/zero-config.ts +1 -0
- package/src/data-card/data-card-gutter-menu.ts +5 -5
- package/src/data-card/data-card.ts +3 -3
- package/src/data-card/event-handlers/record-card-click-handler.ts +1 -1
- package/src/data-card/record-card.ts +30 -32
- package/src/data-grid/data-grid-accum-field.ts +8 -3
- package/src/data-grid/data-grid-body-style.ts +1 -0
- package/src/data-grid/data-grid-body.ts +10 -5
- package/src/data-grid/data-grid-field.ts +1 -1
- package/src/data-grid/data-grid-footer.ts +18 -11
- package/src/data-grid/data-grid-header.ts +68 -65
- package/src/data-grid/data-grid.ts +14 -4
- package/src/data-grist.ts +25 -24
- package/src/data-list/data-list-gutter.ts +12 -0
- package/src/data-list/data-list.ts +3 -3
- package/src/data-list/event-handlers/record-partial-click-handler.ts +1 -1
- package/src/data-list/record-partial.ts +22 -22
- package/src/editors/ox-grist-editor-checkbox.ts +12 -2
- package/src/editors/ox-grist-editor-datetime.ts +1 -2
- package/src/editors/ox-grist-editor-file.ts +12 -2
- package/src/editors/ox-grist-editor-image.ts +10 -7
- package/src/editors/ox-grist-editor-number.ts +11 -9
- package/src/editors/ox-grist-editor-select.ts +41 -28
- package/src/editors/ox-grist-editor-text.ts +4 -0
- package/src/editors/ox-grist-editor-textarea.ts +4 -0
- package/src/editors/ox-grist-editor.ts +14 -10
- package/src/empty-note.ts +3 -3
- package/src/filters/filter-checkbox.ts +15 -5
- package/src/filters/filter-range-date.ts +16 -1
- package/src/filters/filter-select.ts +41 -28
- package/src/filters/filter-styles.ts +47 -28
- package/src/filters/filters-form.ts +159 -59
- package/src/gutters/gutter-button.ts +3 -3
- package/src/gutters/gutter-dirty.ts +5 -5
- package/src/handlers/contextmenu-tree-mutation.ts +4 -22
- package/src/index.ts +0 -1
- package/src/record-view/record-creator.ts +1 -1
- package/src/record-view/record-view-body.ts +4 -4
- package/src/record-view/record-view.ts +5 -5
- package/src/renderers/ox-grist-renderer-select.ts +41 -6
- package/src/sorters/sorters-control.ts +3 -3
- package/src/types.ts +20 -10
- package/stories/{accumulator.stories.ts → accumulator-format.stories.ts} +56 -130
- package/stories/barcode-input-filter.stories.ts +53 -89
- package/stories/bounded-select-filters.stories.ts +313 -0
- package/stories/bounded-select-record.stories.ts +316 -0
- package/stories/creatable-only-column.stories.ts +231 -0
- package/stories/default-filters.stories.ts +96 -89
- package/stories/dynamic-editable.stories.ts +68 -92
- package/stories/empty-sorters.stories.ts +53 -89
- package/stories/explicit-fetch.stories.ts +54 -90
- package/stories/fixed-column.stories.ts +57 -137
- package/stories/grid-setting.stories.ts +441 -0
- package/stories/grist-modes.stories.ts +86 -155
- package/stories/group-header.stories.ts +57 -137
- package/stories/textarea.stories.ts +42 -127
- package/stories/tree-column-with-checkbox.stories.ts +53 -138
- package/stories/tree-column.stories.ts +53 -138
- package/themes/grist-theme.css +3 -1
- package/yarn-error.log +16971 -0
- package/dist/src/value-generator/date-generator.d.ts +0 -6
- package/dist/src/value-generator/date-generator.js +0 -30
- package/dist/src/value-generator/date-generator.js.map +0 -1
- package/dist/src/value-generator/hour-time-generator.d.ts +0 -7
- package/dist/src/value-generator/hour-time-generator.js +0 -29
- package/dist/src/value-generator/hour-time-generator.js.map +0 -1
- package/dist/src/value-generator/index.d.ts +0 -1
- package/dist/src/value-generator/index.js +0 -2
- package/dist/src/value-generator/index.js.map +0 -1
- package/dist/src/value-generator/minute-time-generator.d.ts +0 -7
- package/dist/src/value-generator/minute-time-generator.js +0 -29
- package/dist/src/value-generator/minute-time-generator.js.map +0 -1
- package/dist/src/value-generator/month-date-generator.d.ts +0 -7
- package/dist/src/value-generator/month-date-generator.js +0 -31
- package/dist/src/value-generator/month-date-generator.js.map +0 -1
- package/dist/src/value-generator/now-generator.d.ts +0 -4
- package/dist/src/value-generator/now-generator.js +0 -8
- package/dist/src/value-generator/now-generator.js.map +0 -1
- package/dist/src/value-generator/registry.d.ts +0 -11
- package/dist/src/value-generator/registry.js +0 -50
- package/dist/src/value-generator/registry.js.map +0 -1
- package/dist/src/value-generator/time-generator.d.ts +0 -6
- package/dist/src/value-generator/time-generator.js +0 -28
- package/dist/src/value-generator/time-generator.js.map +0 -1
- package/dist/src/value-generator/today-generator.d.ts +0 -4
- package/dist/src/value-generator/today-generator.js +0 -8
- package/dist/src/value-generator/today-generator.js.map +0 -1
- package/dist/src/value-generator/week-date-generator.d.ts +0 -7
- package/dist/src/value-generator/week-date-generator.js +0 -29
- package/dist/src/value-generator/week-date-generator.js.map +0 -1
- package/dist/src/value-generator/year-date-generator.d.ts +0 -7
- package/dist/src/value-generator/year-date-generator.js +0 -29
- package/dist/src/value-generator/year-date-generator.js.map +0 -1
- package/dist/stories/accumulator.stories.js.map +0 -1
- package/src/value-generator/date-generator.ts +0 -35
- package/src/value-generator/hour-time-generator.ts +0 -43
- package/src/value-generator/index.ts +0 -1
- package/src/value-generator/minute-time-generator.ts +0 -43
- package/src/value-generator/month-date-generator.ts +0 -38
- package/src/value-generator/now-generator.ts +0 -10
- package/src/value-generator/registry.ts +0 -58
- package/src/value-generator/time-generator.ts +0 -33
- package/src/value-generator/today-generator.ts +0 -10
- package/src/value-generator/week-date-generator.ts +0 -40
- package/src/value-generator/year-date-generator.ts +0 -36
@@ -6,6 +6,8 @@ import '@operato/input/ox-input-search.js'
|
|
6
6
|
import { css, html, LitElement, PropertyValues, TemplateResult, nothing } from 'lit'
|
7
7
|
import { customElement, property, queryAsync, state } from 'lit/decorators.js'
|
8
8
|
|
9
|
+
import { getDefaultValue } from '@operato/time-calculator'
|
10
|
+
|
9
11
|
import { FilterConfigObject } from '..'
|
10
12
|
import { DataGrist } from '../data-grist'
|
11
13
|
import { ColumnConfig, FilterOperator, FilterValue, GristConfig } from '../types'
|
@@ -21,7 +23,7 @@ export type QueryFilter = {
|
|
21
23
|
}
|
22
24
|
|
23
25
|
@customElement('ox-filters-form')
|
24
|
-
export class
|
26
|
+
export class OxFiltersForm extends LitElement {
|
25
27
|
static styles = [
|
26
28
|
FilterStyles,
|
27
29
|
css`
|
@@ -40,6 +42,7 @@ export class FiltersForm extends LitElement {
|
|
40
42
|
form > * {
|
41
43
|
display: flex;
|
42
44
|
align-items: center;
|
45
|
+
gap: var(--input-intra-gap, 7px);
|
43
46
|
}
|
44
47
|
|
45
48
|
label span {
|
@@ -65,6 +68,9 @@ export class FiltersForm extends LitElement {
|
|
65
68
|
|
66
69
|
@queryAsync('form') form!: HTMLFormElement
|
67
70
|
|
71
|
+
private autoUpdateTargetsOnChange: { [name: string]: string[] } = {}
|
72
|
+
private objectValue?: object
|
73
|
+
|
68
74
|
connectedCallback(): void {
|
69
75
|
super.connectedCallback()
|
70
76
|
|
@@ -72,7 +78,6 @@ export class FiltersForm extends LitElement {
|
|
72
78
|
|
73
79
|
if (grist) {
|
74
80
|
this.config = grist.compiledConfig
|
75
|
-
this.value = grist.filters || []
|
76
81
|
|
77
82
|
grist.addEventListener('config-change', (e: Event) => {
|
78
83
|
this.config = (e as CustomEvent).detail
|
@@ -88,20 +93,52 @@ export class FiltersForm extends LitElement {
|
|
88
93
|
})
|
89
94
|
|
90
95
|
this.renderRoot.addEventListener('change', async (e: Event) => {
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
96
|
+
const { target, detail: value } = e as CustomEvent
|
97
|
+
const name = (target as HTMLInputElement).name
|
98
|
+
const { filter } = this.filterColumns.find(filter => filter.name == name) || {}
|
99
|
+
|
100
|
+
if (this.autoUpdateTargetsOnChange[name]) {
|
101
|
+
/* 일단은 심플하게, boundTo로 연결된 필터값이 바뀌면, 폼 전체를 update하도록 함. */
|
102
|
+
;(this.autoUpdateTargetsOnChange[name] || []).forEach(name => {
|
103
|
+
const target = this.renderRoot.querySelector(`[name='${name}']`)
|
104
|
+
if (target) {
|
105
|
+
;(target as HTMLInputElement).value = ''
|
98
106
|
}
|
99
107
|
})
|
100
|
-
|
108
|
+
|
109
|
+
await this.updateObjectValues()
|
110
|
+
this.requestUpdate()
|
111
|
+
}
|
112
|
+
|
113
|
+
const onchange = typeof filter == 'object' ? filter.onchange : null
|
114
|
+
const keepGoing = onchange ? await onchange.call(null, value ?? (target as HTMLInputElement).value, this) : true
|
115
|
+
|
116
|
+
keepGoing &&
|
117
|
+
this.dispatchEvent(
|
118
|
+
new CustomEvent('fetch-params-change', {
|
119
|
+
bubbles: true,
|
120
|
+
composed: true,
|
121
|
+
detail: {
|
122
|
+
filters: await this.getQueryFilters(),
|
123
|
+
from: 'filters-form'
|
124
|
+
}
|
125
|
+
})
|
126
|
+
)
|
101
127
|
})
|
102
128
|
}
|
103
129
|
}
|
104
130
|
|
131
|
+
buildDefaultValue(operator: FilterOperator, defaultValue: any) {
|
132
|
+
if (defaultValue === undefined) {
|
133
|
+
return
|
134
|
+
}
|
135
|
+
if (operator == 'between') {
|
136
|
+
return (defaultValue as Array<any>).map(v => getDefaultValue(v, this))
|
137
|
+
} else {
|
138
|
+
return getDefaultValue(defaultValue, this)
|
139
|
+
}
|
140
|
+
}
|
141
|
+
|
105
142
|
updated(changes: PropertyValues<this>) {
|
106
143
|
if (changes.has('config')) {
|
107
144
|
const filters = this.config.columns.filter(columnConfig => !!columnConfig.filter)
|
@@ -114,7 +151,32 @@ export class FiltersForm extends LitElement {
|
|
114
151
|
return filter!.operator === 'search'
|
115
152
|
})
|
116
153
|
|
154
|
+
const grist = this.closest('ox-grist') as DataGrist
|
155
|
+
|
156
|
+
this.value = (grist?.filters || []).map(filter => {
|
157
|
+
return {
|
158
|
+
...filter,
|
159
|
+
value: this.buildDefaultValue(filter!.operator, filter!.value)
|
160
|
+
}
|
161
|
+
})
|
162
|
+
|
117
163
|
this.empty = (this.searchColumns.length === 0 || this.withoutSearch) && this.filterColumns.length === 0
|
164
|
+
|
165
|
+
this.autoUpdateTargetsOnChange = {}
|
166
|
+
this.filterColumns
|
167
|
+
?.filter(({ filter }) => {
|
168
|
+
return typeof filter == 'object' && filter.boundTo && filter.boundTo.length > 0
|
169
|
+
})
|
170
|
+
.map(({ name, filter }) => {
|
171
|
+
const boundTo = (filter as FilterConfigObject).boundTo
|
172
|
+
|
173
|
+
boundTo!.forEach(to => {
|
174
|
+
const origin = this.autoUpdateTargetsOnChange[to] || []
|
175
|
+
if (name && !origin.includes(name)) {
|
176
|
+
this.autoUpdateTargetsOnChange[to] = [...origin, name]
|
177
|
+
}
|
178
|
+
})
|
179
|
+
})
|
118
180
|
}
|
119
181
|
}
|
120
182
|
|
@@ -151,8 +213,8 @@ export class FiltersForm extends LitElement {
|
|
151
213
|
filterLabel !== undefined
|
152
214
|
? filterLabel
|
153
215
|
: typeof label === 'object' && label.renderer
|
154
|
-
|
155
|
-
|
216
|
+
? label.renderer(column)
|
217
|
+
: header.renderer(column) || name
|
156
218
|
|
157
219
|
const idx = operator === 'between' ? 1 : 0
|
158
220
|
const renderer = getFilterRenderer(
|
@@ -160,59 +222,63 @@ export class FiltersForm extends LitElement {
|
|
160
222
|
? 'text'
|
161
223
|
: type
|
162
224
|
)[idx]
|
163
|
-
const value =
|
225
|
+
const value =
|
226
|
+
this.value?.find(filter => filter.name == name)?.value ??
|
227
|
+
this.buildDefaultValue(operator!, (filter as FilterConfigObject)?.value)
|
164
228
|
|
165
229
|
if (!renderer) {
|
166
230
|
return html``
|
167
231
|
}
|
168
232
|
|
169
|
-
return type
|
170
|
-
? html`<label filter-title ?between=${operator === 'between'}
|
171
|
-
><span>${labelText}</span> ${renderer(column, value, this)}
|
172
|
-
</label> `
|
173
|
-
: type !== 'select' && !labelText
|
233
|
+
return type === 'boolean' || type === 'checkbox'
|
174
234
|
? renderer(column, value, this)
|
175
|
-
:
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
235
|
+
: type !== 'select' && labelText
|
236
|
+
? html`<label filter-title ?between=${operator === 'between'}
|
237
|
+
><span>${labelText}</span> ${renderer(column, value, this)}
|
238
|
+
</label> `
|
239
|
+
: type !== 'select' && !labelText
|
240
|
+
? renderer(column, value, this)
|
241
|
+
: operator === 'in'
|
242
|
+
? html`
|
243
|
+
<ox-select
|
244
|
+
name=${name}
|
245
|
+
placeholder=${labelText}
|
246
|
+
.value=${value}
|
247
|
+
@change=${(e: CustomEvent) =>
|
248
|
+
e.target?.dispatchEvent(
|
249
|
+
new CustomEvent('filter-change', {
|
250
|
+
detail: {
|
251
|
+
name,
|
252
|
+
operator,
|
253
|
+
value: e.detail
|
254
|
+
}
|
255
|
+
})
|
256
|
+
)}
|
257
|
+
>
|
258
|
+
<ox-popup-list multiple attr-selected="checked" with-search>
|
259
|
+
${renderer(column, value, this)}
|
260
|
+
</ox-popup-list>
|
261
|
+
</ox-select>
|
262
|
+
`
|
263
|
+
: html`
|
264
|
+
<ox-select
|
265
|
+
name=${name}
|
266
|
+
placeholder=${labelText}
|
267
|
+
.value=${value}
|
268
|
+
@change=${(e: CustomEvent) =>
|
269
|
+
e.target?.dispatchEvent(
|
270
|
+
new CustomEvent('filter-change', {
|
271
|
+
detail: {
|
272
|
+
name,
|
273
|
+
operator,
|
274
|
+
value: e.detail
|
275
|
+
}
|
276
|
+
})
|
277
|
+
)}
|
278
|
+
>
|
279
|
+
<ox-popup-list with-search> ${renderer(column, value, this)} </ox-popup-list>
|
280
|
+
</ox-select>
|
281
|
+
`
|
216
282
|
})}
|
217
283
|
</form>
|
218
284
|
`
|
@@ -293,4 +359,38 @@ export class FiltersForm extends LitElement {
|
|
293
359
|
const input = this.renderRoot.querySelector(`form [name="${name}"]`) as HTMLInputElement
|
294
360
|
return input?.value
|
295
361
|
}
|
362
|
+
|
363
|
+
private async updateObjectValues() {
|
364
|
+
const form = await this.form
|
365
|
+
if (!form) return []
|
366
|
+
|
367
|
+
const formData = new FormData(form)
|
368
|
+
|
369
|
+
const object = {} as any
|
370
|
+
formData.forEach((value, key) => {
|
371
|
+
const prev = object[key]
|
372
|
+
|
373
|
+
if (key in object) {
|
374
|
+
object[key] = prev instanceof Array ? [...prev, value] : [prev, value]
|
375
|
+
} else {
|
376
|
+
object[key] = value
|
377
|
+
}
|
378
|
+
})
|
379
|
+
|
380
|
+
this.objectValue = object
|
381
|
+
}
|
382
|
+
|
383
|
+
public getFormObjectValue() {
|
384
|
+
return this.objectValue
|
385
|
+
}
|
386
|
+
|
387
|
+
reset() {
|
388
|
+
this.form
|
389
|
+
.then((form: HTMLFormElement) => {
|
390
|
+
form.reset()
|
391
|
+
})
|
392
|
+
.catch((error: any) => {
|
393
|
+
console.error('Error resetting the form:', error)
|
394
|
+
})
|
395
|
+
}
|
296
396
|
}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import '@material/
|
1
|
+
import '@material/web/icon/icon.js'
|
2
2
|
|
3
3
|
import { html } from 'lit'
|
4
4
|
|
@@ -23,13 +23,13 @@ export class GutterButton {
|
|
23
23
|
sortable: false,
|
24
24
|
header: {
|
25
25
|
renderer: function (column) {
|
26
|
-
return html` <
|
26
|
+
return html` <md-icon style=${inlineHeaderStyle} title=${title}>${iconFn()}</md-icon> `
|
27
27
|
} as HeaderRenderer
|
28
28
|
},
|
29
29
|
record: {
|
30
30
|
align: 'center',
|
31
31
|
renderer: function (value, column, record, rowIndex, field) {
|
32
|
-
return html` <
|
32
|
+
return html` <md-icon style=${inlineRecordStyle} title=${title}>${iconFn(record)}</md-icon> `
|
33
33
|
} as FieldRenderer
|
34
34
|
},
|
35
35
|
forGrid: true,
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import '@material/
|
1
|
+
import '@material/web/icon/icon.js'
|
2
2
|
|
3
3
|
import { css, html, LitElement } from 'lit'
|
4
4
|
import { customElement, property } from 'lit/decorators.js'
|
@@ -13,7 +13,7 @@ class GutterDirtyElement extends LitElement {
|
|
13
13
|
margin: auto;
|
14
14
|
}
|
15
15
|
|
16
|
-
|
16
|
+
md-icon {
|
17
17
|
width: var(--grid-record-dirty-icon-size);
|
18
18
|
height: var(--grid-record-dirty-icon-size);
|
19
19
|
border-radius: 50%;
|
@@ -38,11 +38,11 @@ class GutterDirtyElement extends LitElement {
|
|
38
38
|
render() {
|
39
39
|
switch (this.value) {
|
40
40
|
case '+':
|
41
|
-
return html` <
|
41
|
+
return html` <md-icon style=${INLINESTYLE} center add>add</md-icon> `
|
42
42
|
case '-':
|
43
|
-
return html` <
|
43
|
+
return html` <md-icon style=${INLINESTYLE} center remove>remove</md-icon> `
|
44
44
|
case 'M':
|
45
|
-
return html` <
|
45
|
+
return html` <md-icon style=${INLINESTYLE} center done>done</md-icon> `
|
46
46
|
default:
|
47
47
|
return ''
|
48
48
|
}
|
@@ -42,7 +42,7 @@ export const ContextMenuTreeMutation = function (
|
|
42
42
|
dispatchEvent(field, 'add-sibling-node')
|
43
43
|
}}
|
44
44
|
>
|
45
|
-
<
|
45
|
+
<md-icon slot="icon">add</md-icon>
|
46
46
|
</ox-popup-menuitem>
|
47
47
|
|
48
48
|
<ox-popup-menuitem
|
@@ -51,25 +51,7 @@ export const ContextMenuTreeMutation = function (
|
|
51
51
|
dispatchEvent(field, 'add-child-node')
|
52
52
|
}}
|
53
53
|
>
|
54
|
-
<
|
55
|
-
</ox-popup-menuitem>
|
56
|
-
|
57
|
-
<ox-popup-menuitem
|
58
|
-
label="move up"
|
59
|
-
@click=${() => {
|
60
|
-
dispatchEvent(field, 'move-up')
|
61
|
-
}}
|
62
|
-
>
|
63
|
-
<mwc-icon slot="icon">arrow_upward</mwc-icon>
|
64
|
-
</ox-popup-menuitem>
|
65
|
-
|
66
|
-
<ox-popup-menuitem
|
67
|
-
label="move down"
|
68
|
-
@click=${() => {
|
69
|
-
dispatchEvent(field, 'move-down')
|
70
|
-
}}
|
71
|
-
>
|
72
|
-
<mwc-icon slot="icon">arrow_downward</mwc-icon>
|
54
|
+
<md-icon slot="icon">playlist_add</md-icon>
|
73
55
|
</ox-popup-menuitem>
|
74
56
|
|
75
57
|
<div separator></div>
|
@@ -80,7 +62,7 @@ export const ContextMenuTreeMutation = function (
|
|
80
62
|
dispatchEvent(field, 'collapse-all')
|
81
63
|
}}
|
82
64
|
>
|
83
|
-
<
|
65
|
+
<md-icon slot="icon">unfold_less</md-icon>
|
84
66
|
</ox-popup-menuitem>
|
85
67
|
|
86
68
|
<ox-popup-menuitem
|
@@ -89,7 +71,7 @@ export const ContextMenuTreeMutation = function (
|
|
89
71
|
dispatchEvent(field, 'expand-all')
|
90
72
|
}}
|
91
73
|
>
|
92
|
-
<
|
74
|
+
<md-icon slot="icon">unfold_more</md-icon>
|
93
75
|
</ox-popup-menuitem>
|
94
76
|
`,
|
95
77
|
top: e.pageY,
|
package/src/index.ts
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
import '@material/
|
1
|
+
import '@material/web/icon/icon.js'
|
2
2
|
import '../data-grid/data-grid-field'
|
3
3
|
|
4
4
|
import { css, html, LitElement } from 'lit'
|
@@ -34,7 +34,7 @@ export class RecordViewBody extends LitElement {
|
|
34
34
|
color: var(--record-view-label-color);
|
35
35
|
}
|
36
36
|
|
37
|
-
label
|
37
|
+
label md-icon {
|
38
38
|
display: none;
|
39
39
|
}
|
40
40
|
|
@@ -43,7 +43,7 @@ export class RecordViewBody extends LitElement {
|
|
43
43
|
font-weight: bold;
|
44
44
|
}
|
45
45
|
|
46
|
-
label[editable]
|
46
|
+
label[editable] md-icon {
|
47
47
|
display: inline-block;
|
48
48
|
font-size: var(--record-view-label-icon-size);
|
49
49
|
opacity: 0.5;
|
@@ -99,7 +99,7 @@ export class RecordViewBody extends LitElement {
|
|
99
99
|
|
100
100
|
return html`
|
101
101
|
<label ?editable=${editable}
|
102
|
-
><span>${mandatory ? '*' : ''}${this._renderLabel(column)}</span> <
|
102
|
+
><span>${mandatory ? '*' : ''}${this._renderLabel(column)}</span> <md-icon>edit</md-icon></label
|
103
103
|
>
|
104
104
|
<ox-grid-field
|
105
105
|
.rowIndex=${rowIndex}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import '@material/
|
1
|
+
import '@material/web/icon/icon.js'
|
2
2
|
import './record-view-body'
|
3
3
|
import '@operato/input/ox-input-file.js'
|
4
4
|
import '../data-grid/data-grid-field'
|
@@ -53,7 +53,7 @@ export class RecordView extends LitElement {
|
|
53
53
|
vertical-align: middle;
|
54
54
|
}
|
55
55
|
|
56
|
-
[footer] button
|
56
|
+
[footer] button md-icon {
|
57
57
|
margin-top: -3px;
|
58
58
|
margin-right: 5px;
|
59
59
|
font-size: var(--record-view-footer-iconbutton-size);
|
@@ -74,9 +74,9 @@ export class RecordView extends LitElement {
|
|
74
74
|
<ox-record-view-body .columns=${this.columns} .record=${this.record} .rowIndex=${this.rowIndex}>
|
75
75
|
</ox-record-view-body>
|
76
76
|
<div footer>
|
77
|
-
<button @click=${this.onReset.bind(this)}><
|
78
|
-
<button @click=${this.onCancel.bind(this)}><
|
79
|
-
<button @click=${this.onOK.bind(this)} ok><
|
77
|
+
<button @click=${this.onReset.bind(this)}><md-icon>refresh</md-icon><span>Reset</span></button>
|
78
|
+
<button @click=${this.onCancel.bind(this)}><md-icon>clear</md-icon><span>Cancel</span></button>
|
79
|
+
<button @click=${this.onOK.bind(this)} ok><md-icon>radio_button_unchecked</md-icon><span>OK</span></button>
|
80
80
|
</div>
|
81
81
|
`
|
82
82
|
}
|
@@ -1,11 +1,41 @@
|
|
1
1
|
import { html } from 'lit'
|
2
|
+
import { until } from 'lit/directives/until.js'
|
2
3
|
|
3
|
-
import { FieldRenderer } from '../types'
|
4
|
+
import { FieldRenderer, SelectOption, SelectOptionObject } from '../types'
|
5
|
+
|
6
|
+
function buildOptions(options: SelectOption[], value: any) {
|
7
|
+
const selectOptionObjects = options.map(option => {
|
8
|
+
switch (typeof option) {
|
9
|
+
case 'string':
|
10
|
+
return {
|
11
|
+
display: option,
|
12
|
+
value: option
|
13
|
+
}
|
14
|
+
case 'object':
|
15
|
+
return {
|
16
|
+
display: option.display || option.name,
|
17
|
+
value: option.value
|
18
|
+
}
|
19
|
+
default:
|
20
|
+
return option
|
21
|
+
}
|
22
|
+
}) as SelectOptionObject[]
|
23
|
+
|
24
|
+
var res = selectOptionObjects
|
25
|
+
? selectOptionObjects.filter((option: any) => option.value == String(value == null ? '' : value))
|
26
|
+
: []
|
27
|
+
|
28
|
+
if (res.length) {
|
29
|
+
return html`<span>${res[0].display || res[0].name || ''}</span>`
|
30
|
+
}
|
31
|
+
return html`<span>${value}</span>`
|
32
|
+
}
|
4
33
|
|
5
34
|
export const OxGristRendererSelect: FieldRenderer = (value, column, record, rowIndex, field) => {
|
6
35
|
if (value == null) {
|
7
36
|
return ''
|
8
37
|
}
|
38
|
+
|
9
39
|
var rowOptionField = column.record.rowOptionField && record[column.record.rowOptionField]
|
10
40
|
var options = rowOptionField?.options ? rowOptionField.options : column.record.options
|
11
41
|
|
@@ -13,11 +43,16 @@ export const OxGristRendererSelect: FieldRenderer = (value, column, record, rowI
|
|
13
43
|
console.error(`options value for select '${column.name}' column is mandatory.`)
|
14
44
|
} else if (typeof options == 'function') {
|
15
45
|
options = options.call(null, value, column, record, rowIndex, field)
|
16
|
-
}
|
17
46
|
|
18
|
-
|
19
|
-
|
20
|
-
|
47
|
+
if (options instanceof Promise) {
|
48
|
+
return html`${until(
|
49
|
+
options.then(options => buildOptions(options, value)),
|
50
|
+
value
|
51
|
+
)}`
|
52
|
+
} else {
|
53
|
+
return buildOptions((options || []) as SelectOption[], value)
|
54
|
+
}
|
55
|
+
} else {
|
56
|
+
return buildOptions((options || []) as SelectOption[], value)
|
21
57
|
}
|
22
|
-
return html`<span>${value}</span>`
|
23
58
|
}
|
@@ -29,9 +29,9 @@ export class SortersControl extends LitElement {
|
|
29
29
|
text-transform: capitalize;
|
30
30
|
user-select: none;
|
31
31
|
}
|
32
|
-
[option]
|
32
|
+
[option] md-icon {
|
33
33
|
margin-left: var(--margin-default);
|
34
|
-
--
|
34
|
+
--md-icon-size: var(--fontsize-large);
|
35
35
|
color: var(--primary-color);
|
36
36
|
}
|
37
37
|
[option] sub {
|
@@ -99,7 +99,7 @@ export class SortersControl extends LitElement {
|
|
99
99
|
${desc === null
|
100
100
|
? html``
|
101
101
|
: html`
|
102
|
-
<
|
102
|
+
<md-icon>${desc ? 'keyboard_arrow_down' : 'keyboard_arrow_up'}</md-icon>
|
103
103
|
${rank === 0 ? html`` : html`<sub>${rank}</sub>`}
|
104
104
|
`}
|
105
105
|
</div>
|
package/src/types.ts
CHANGED
@@ -9,7 +9,7 @@ import { DataListGutter } from './data-list/data-list-gutter'
|
|
9
9
|
import { RecordPartial } from './data-list/record-partial'
|
10
10
|
import { DataReportField } from './data-report/data-report-field'
|
11
11
|
import { OxGristEditor } from './editors'
|
12
|
-
import { QueryFilter } from './filters'
|
12
|
+
import { QueryFilter, OxFiltersForm } from './filters'
|
13
13
|
import { OxGristRenderer } from './renderers/ox-grist-renderer'
|
14
14
|
|
15
15
|
/**
|
@@ -83,6 +83,22 @@ export type FilterOperator =
|
|
83
83
|
| 'i_nlike'
|
84
84
|
| 'nlike'
|
85
85
|
|
86
|
+
export type SelectOptionObject =
|
87
|
+
| {
|
88
|
+
name: string
|
89
|
+
display?: never
|
90
|
+
value: string
|
91
|
+
}
|
92
|
+
| {
|
93
|
+
display: string
|
94
|
+
name?: never
|
95
|
+
value: string
|
96
|
+
}
|
97
|
+
|
98
|
+
export type SelectOption = SelectOptionObject | string
|
99
|
+
|
100
|
+
export type FilterChangedCallback = (value: any, form: OxFiltersForm) => boolean
|
101
|
+
|
86
102
|
/**
|
87
103
|
* Configuration object for specifying filter conditions.
|
88
104
|
*
|
@@ -99,6 +115,8 @@ export type FilterConfigObject = {
|
|
99
115
|
options?: { [key: string]: any }
|
100
116
|
value?: string | number | boolean | string[] | number[] | undefined
|
101
117
|
label?: string
|
118
|
+
boundTo?: string[]
|
119
|
+
onchange?: FilterChangedCallback
|
102
120
|
}
|
103
121
|
|
104
122
|
/**
|
@@ -427,15 +445,6 @@ export type HeaderConfig = {
|
|
427
445
|
*/
|
428
446
|
export type HeaderRenderer = (column: ColumnConfig) => any
|
429
447
|
|
430
|
-
/**
|
431
|
-
* Function type for generating values.
|
432
|
-
*
|
433
|
-
* @callback ValueGeneratorFn
|
434
|
-
* @param {...any} args - The arguments used for generating a value.
|
435
|
-
* @returns {*} - The generated value.
|
436
|
-
*/
|
437
|
-
export type ValueGeneratorFn = (...args: any[]) => any
|
438
|
-
|
439
448
|
/**
|
440
449
|
* Configuration for specifying default values for fields in a record.
|
441
450
|
* Default values can be set using predefined value generator functions or custom user-defined functions.
|
@@ -627,6 +636,7 @@ export type ImexConfig = {
|
|
627
636
|
export type RowsConfig = {
|
628
637
|
accumulator?: boolean
|
629
638
|
appendable: boolean
|
639
|
+
editable: boolean
|
630
640
|
insertable: boolean
|
631
641
|
selectable?: RowSelectableConfig
|
632
642
|
groups: GroupConfig[]
|