@operato/data-grist 1.0.0-alpha.39 → 1.0.0-alpha.41
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 +18 -0
- package/dist/src/data-grid/data-grid-header.d.ts +2 -1
- package/dist/src/data-grid/data-grid-header.js +59 -12
- package/dist/src/data-grid/data-grid-header.js.map +1 -1
- package/dist/src/data-grist.d.ts +2 -1
- package/dist/src/data-grist.js +20 -16
- package/dist/src/data-grist.js.map +1 -1
- package/dist/src/data-provider.d.ts +6 -4
- package/dist/src/data-provider.js +34 -3
- package/dist/src/data-provider.js.map +1 -1
- package/dist/src/filters/filter-checkbox.js +21 -2
- package/dist/src/filters/filter-checkbox.js.map +1 -1
- package/dist/src/filters/filter-input.js +20 -2
- package/dist/src/filters/filter-input.js.map +1 -1
- package/dist/src/filters/filter-range-date.js +47 -2
- package/dist/src/filters/filter-range-date.js.map +1 -1
- package/dist/src/filters/filter-range-number.js +47 -3
- package/dist/src/filters/filter-range-number.js.map +1 -1
- package/dist/src/filters/filter-select.js +29 -4
- package/dist/src/filters/filter-select.js.map +1 -1
- package/dist/src/filters/filters-form.d.ts +2 -1
- package/dist/src/filters/filters-form.js +45 -7
- package/dist/src/filters/filters-form.js.map +1 -1
- package/dist/src/types.d.ts +6 -1
- package/dist/src/types.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -8
- package/src/data-grid/data-grid-header.ts +57 -14
- package/src/data-grist.ts +31 -20
- package/src/data-provider.ts +47 -4
- package/src/filters/filter-checkbox.ts +24 -4
- package/src/filters/filter-input.ts +23 -4
- package/src/filters/filter-range-date.ts +57 -4
- package/src/filters/filter-range-number.ts +56 -5
- package/src/filters/filter-select.ts +43 -7
- package/src/filters/filters-form.ts +45 -9
- package/src/types.ts +11 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,24 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [1.0.0-alpha.41](https://github.com/hatiolab/operato/compare/v1.0.0-alpha.40...v1.0.0-alpha.41) (2022-03-27)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### :rocket: New Features
|
|
10
|
+
|
|
11
|
+
* grid-header filter integrated with filters-form ([ebecb71](https://github.com/hatiolab/operato/commit/ebecb71133d38bb8358909660319de6cb5b45d7d))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
## [1.0.0-alpha.40](https://github.com/hatiolab/operato/compare/v1.0.0-alpha.39...v1.0.0-alpha.40) (2022-03-26)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### :bug: Bug Fix
|
|
19
|
+
|
|
20
|
+
* filter-select support object type select options ([ab5a877](https://github.com/hatiolab/operato/commit/ab5a877157979bc96b252b6b527b4666c22e0b09))
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
6
24
|
## [1.0.0-alpha.39](https://github.com/hatiolab/operato/compare/v1.0.0-alpha.38...v1.0.0-alpha.39) (2022-03-25)
|
|
7
25
|
|
|
8
26
|
**Note:** Version bump only for package @operato/data-grist
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import '@operato/popup/ox-popup.js';
|
|
2
2
|
import '@material/mwc-icon';
|
|
3
|
-
import { LitElement, PropertyValues } from 'lit';
|
|
4
3
|
import { ColumnConfig, GristConfig, GristData } from '../types';
|
|
4
|
+
import { LitElement, PropertyValues } from 'lit';
|
|
5
5
|
export declare class DataGridHeader extends LitElement {
|
|
6
6
|
static styles: import("lit").CSSResult[];
|
|
7
7
|
config: GristConfig;
|
|
8
8
|
columns: ColumnConfig[];
|
|
9
9
|
data: GristData;
|
|
10
10
|
private _sorters;
|
|
11
|
+
private _filters;
|
|
11
12
|
private _lastAccVal?;
|
|
12
13
|
private _throttledNotifier?;
|
|
13
14
|
connectedCallback(): void;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
2
|
import '@operato/popup/ox-popup.js';
|
|
3
3
|
import '@material/mwc-icon';
|
|
4
|
-
import { css, html
|
|
5
|
-
import { customElement, property, state } from 'lit/decorators.js';
|
|
6
|
-
import throttle from 'lodash-es/throttle';
|
|
7
|
-
import { closestElement } from '@operato/utils';
|
|
4
|
+
import { LitElement, css, html } from 'lit';
|
|
8
5
|
import { ZERO_COLUMNS, ZERO_CONFIG, ZERO_DATA } from '../configure/zero-config';
|
|
6
|
+
import { customElement, property, state } from 'lit/decorators.js';
|
|
9
7
|
import { FilterStyles } from '../filters/filter-styles';
|
|
8
|
+
import { closestElement } from '@operato/utils';
|
|
10
9
|
import { getFilterRenderer } from '../filters/registry';
|
|
10
|
+
import throttle from 'lodash-es/throttle';
|
|
11
11
|
let DataGridHeader = class DataGridHeader extends LitElement {
|
|
12
12
|
constructor() {
|
|
13
13
|
super(...arguments);
|
|
@@ -15,12 +15,16 @@ let DataGridHeader = class DataGridHeader extends LitElement {
|
|
|
15
15
|
this.columns = ZERO_COLUMNS;
|
|
16
16
|
this.data = ZERO_DATA;
|
|
17
17
|
this._sorters = [];
|
|
18
|
+
this._filters = [];
|
|
18
19
|
}
|
|
19
20
|
connectedCallback() {
|
|
20
21
|
super.connectedCallback();
|
|
21
22
|
const grid = closestElement('ox-grist', this);
|
|
22
23
|
grid === null || grid === void 0 ? void 0 : grid.addEventListener('sorters-change', (e) => {
|
|
23
|
-
this._sorters = e.detail;
|
|
24
|
+
this._sorters = [...(e.detail || [])];
|
|
25
|
+
});
|
|
26
|
+
grid === null || grid === void 0 ? void 0 : grid.addEventListener('filters-change', (e) => {
|
|
27
|
+
this._filters = [...(e.detail || [])];
|
|
24
28
|
});
|
|
25
29
|
}
|
|
26
30
|
render() {
|
|
@@ -81,8 +85,11 @@ let DataGridHeader = class DataGridHeader extends LitElement {
|
|
|
81
85
|
}
|
|
82
86
|
}
|
|
83
87
|
_renderFilterHeader(column) {
|
|
84
|
-
var
|
|
88
|
+
var _a;
|
|
89
|
+
const name = column.name;
|
|
90
|
+
const filter = column.filter;
|
|
85
91
|
const type = filter.type;
|
|
92
|
+
const value = (_a = this._filters.find(filter => filter.name === name)) === null || _a === void 0 ? void 0 : _a.value;
|
|
86
93
|
const idx = filter.operator === 'between' ? 1 : 0;
|
|
87
94
|
const renderer = getFilterRenderer(type)[idx];
|
|
88
95
|
return html `
|
|
@@ -106,16 +113,53 @@ let DataGridHeader = class DataGridHeader extends LitElement {
|
|
|
106
113
|
|
|
107
114
|
${!renderer
|
|
108
115
|
? html ``
|
|
109
|
-
: type
|
|
110
|
-
? html
|
|
116
|
+
: type !== 'select'
|
|
117
|
+
? html ` <ox-popup
|
|
118
|
+
><div filter-title><mwc-icon>filter_alt</mwc-icon> filter by <strong>${column.name}</strong></div>
|
|
119
|
+
${renderer(column, value, this)}</ox-popup
|
|
120
|
+
>`
|
|
121
|
+
: filter.operator === 'in'
|
|
122
|
+
? html `<ox-popup-list
|
|
123
|
+
multiple
|
|
124
|
+
attr-selected="checked"
|
|
125
|
+
.value=${value}
|
|
126
|
+
with-search
|
|
127
|
+
@select=${(e) => {
|
|
128
|
+
var _a;
|
|
129
|
+
return (_a = e.target) === null || _a === void 0 ? void 0 : _a.dispatchEvent(new CustomEvent('filter-change', {
|
|
130
|
+
bubbles: true,
|
|
131
|
+
composed: true,
|
|
132
|
+
detail: {
|
|
133
|
+
name,
|
|
134
|
+
operator: filter.operator,
|
|
135
|
+
value: e.detail
|
|
136
|
+
}
|
|
137
|
+
}));
|
|
138
|
+
}}
|
|
111
139
|
><div filter-title slot="header">
|
|
112
140
|
<mwc-icon>filter_alt</mwc-icon> filter by <strong>${column.name}</strong>
|
|
113
141
|
</div>
|
|
114
|
-
${renderer(column, this)}</ox-popup-list
|
|
142
|
+
${renderer(column, value, this)}</ox-popup-list
|
|
115
143
|
>`
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
144
|
+
: html `<ox-popup-list
|
|
145
|
+
.value=${value}
|
|
146
|
+
with-search
|
|
147
|
+
@select=${(e) => {
|
|
148
|
+
var _a;
|
|
149
|
+
return (_a = e.target) === null || _a === void 0 ? void 0 : _a.dispatchEvent(new CustomEvent('filter-change', {
|
|
150
|
+
bubbles: true,
|
|
151
|
+
composed: true,
|
|
152
|
+
detail: {
|
|
153
|
+
name,
|
|
154
|
+
operator: filter.operator,
|
|
155
|
+
value: e.detail
|
|
156
|
+
}
|
|
157
|
+
}));
|
|
158
|
+
}}
|
|
159
|
+
><div filter-title slot="header">
|
|
160
|
+
<mwc-icon>filter_alt</mwc-icon> filter by <strong>${column.name}</strong>
|
|
161
|
+
</div>
|
|
162
|
+
${renderer(column, value, this)}</ox-popup-list
|
|
119
163
|
>`}
|
|
120
164
|
`;
|
|
121
165
|
}
|
|
@@ -304,6 +348,9 @@ __decorate([
|
|
|
304
348
|
__decorate([
|
|
305
349
|
state()
|
|
306
350
|
], DataGridHeader.prototype, "_sorters", void 0);
|
|
351
|
+
__decorate([
|
|
352
|
+
state()
|
|
353
|
+
], DataGridHeader.prototype, "_filters", void 0);
|
|
307
354
|
DataGridHeader = __decorate([
|
|
308
355
|
customElement('ox-grid-header')
|
|
309
356
|
], DataGridHeader);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-grid-header.js","sourceRoot":"","sources":["../../../src/data-grid/data-grid-header.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/popup/ox-popup.js'\nimport '@material/mwc-icon'\n\nimport { css, html, LitElement, PropertyValues } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport throttle from 'lodash-es/throttle'\n\nimport { OxPopup } from '@operato/popup'\nimport { closestElement } from '@operato/utils'\n\nimport { ZERO_COLUMNS, ZERO_CONFIG, ZERO_DATA } from '../configure/zero-config'\nimport { FilterStyles } from '../filters/filter-styles'\nimport { getFilterRenderer } from '../filters/registry'\nimport { ColumnConfig, FilterConfigObject, GristConfig, GristData, SortersConfig } from '../types'\n\n@customElement('ox-grid-header')\nexport class DataGridHeader extends LitElement {\n static styles = [\n FilterStyles,\n css`\n :host {\n display: grid;\n grid-template-columns: var(--grid-template-columns);\n\n overflow: hidden;\n }\n\n div[column] {\n display: flex;\n\n white-space: nowrap;\n overflow: hidden;\n background-color: var(--grid-header-background-color);\n border-top: var(--grid-header-top-border);\n border-bottom: var(--grid-header-bottom-border);\n padding: var(--grid-header-padding);\n\n text-overflow: ellipsis;\n font: var(--grid-header-font);\n color: var(--grid-header-color);\n }\n\n div[gutter] {\n padding: var(--padding-default) 0 var(--padding-narrow) 0;\n text-align: center;\n }\n\n span {\n display: block;\n white-space: nowrap;\n overflow: hidden;\n }\n\n span[for-title] {\n flex: 1;\n text-overflow: ellipsis;\n line-height: 1.6;\n text-transform: capitalize;\n }\n span[for-title] mwc-icon {\n font-size: var(--grid-record-fontsize);\n }\n\n span[sorter],\n span[filter] {\n padding: 0;\n border: 0;\n }\n span[sorter] mwc-icon {\n font-size: var(--grid-header-sorter-size);\n }\n\n span[filter] > mwc-icon {\n font-size: var(--fontsize-default);\n line-height: 20px;\n }\n\n span[splitter] {\n cursor: col-resize;\n border-right: var(--grid-header-splitter-border);\n }\n span[splitter]:hover {\n border-right: var(--grid-header-splitter-border-hover);\n }\n input[type='checkbox'],\n input[type='radio'] {\n margin: 3px 0 0 0;\n zoom: var(--grist-input-zoom);\n }\n [filter-title] {\n color: var(--grid-header-filter-title-color);\n font: var(--grid-header-filter-title-font);\n text-transform: capitalize;\n }\n [filter-title] * {\n vertical-align: middle;\n }\n [filter-title] mwc-icon {\n opacity: 0.7;\n color: var(--grid-header-filter-title-icon-color);\n }\n [filter] input[type='checkbox'] {\n margin-left: 10px;\n margin-bottom: 5px;\n }\n\n @media print {\n :host {\n grid-template-columns: var(--grid-template-print-columns);\n }\n }\n `\n ]\n\n @property({ type: Object }) config: GristConfig = ZERO_CONFIG\n @property({ type: Array }) columns: ColumnConfig[] = ZERO_COLUMNS\n @property({ type: Object }) data: GristData = ZERO_DATA\n\n @state() private _sorters: SortersConfig = []\n private _lastAccVal?: number\n private _throttledNotifier?: any\n\n connectedCallback() {\n super.connectedCallback()\n\n const grid = closestElement('ox-grist', this)\n grid?.addEventListener('sorters-change', (e: Event) => {\n this._sorters = (e as CustomEvent).detail\n })\n }\n\n render() {\n var columns = this.columns || []\n\n return html`\n ${columns.map((column, idx) =>\n !column.hidden\n ? html`\n <div ?gutter=${column.type == 'gutter'} column>\n <span for-title @click=${(e: MouseEvent) => this._changeSort(column)}\n >${this._renderHeader(column)}\n </span>\n\n ${column.sortable\n ? html`\n <span sorter @click=${(e: MouseEvent) => this._changeSort(column)}>\n ${this._renderSortHeader(column)}\n </span>\n `\n : undefined}\n ${column.filter && (column.filter as FilterConfigObject).operator !== 'search'\n ? html` <span filter> ${this._renderFilterHeader(column)} </span> `\n : undefined}\n ${column.resizable !== false\n ? html`\n <span splitter draggable=\"false\" @mousedown=${(e: MouseEvent) => this._mousedown(e, idx)}\n > </span\n >\n `\n : undefined}\n </div>\n `\n : undefined\n )}\n\n <div column></div>\n `\n }\n\n _renderHeader(column: ColumnConfig) {\n var { renderer } = column.header || {}\n var title = renderer.call(this, column)\n\n return html` ${title} `\n }\n\n _renderSortHeader(column: ColumnConfig) {\n var sorters = this._sorters\n\n var sorter = sorters.find(sorter => column.type !== 'gutter' && column.name == sorter.name)\n if (!sorter) {\n return html``\n }\n\n if (sorters.length > 1) {\n var rank = sorters.indexOf(sorter) + 1\n return sorter.desc\n ? html` <mwc-icon>keyboard_arrow_up</mwc-icon><sub>${rank}</sub> `\n : html` <mwc-icon>keyboard_arrow_down</mwc-icon><sub>${rank}</sub> `\n } else {\n return sorter.desc\n ? html` <mwc-icon>keyboard_arrow_up</mwc-icon> `\n : html` <mwc-icon>keyboard_arrow_down</mwc-icon> `\n }\n }\n\n _renderFilterHeader(column: ColumnConfig) {\n var filter = column.filter as FilterConfigObject\n const type = filter.type\n const idx = filter!.operator === 'between' ? 1 : 0\n const renderer = getFilterRenderer(type)[idx]\n\n return html`\n <mwc-icon\n @click=${(e: Event) => {\n const parent = (e.target as HTMLElement).closest('[column]') as HTMLElement\n const popup = parent.querySelector('ox-popup, ox-popup-list') as OxPopup | null\n // const popup = (e.target as HTMLElement).nextSibling as OxPopupList | null\n\n // absolute position인 popup의 위치 부모는 grist 이므로,\n // data-grid-header 의 포지션 부모(grist)의 위치로부터 계산해야함.\n // this의 position을 relative로 하지 못하는 이유 : ox-popup-list가 grid body에 덮히기 때문.\n const top = parent.offsetTop + parent.offsetHeight\n const right = this.clientWidth - (parent.offsetLeft + parent.offsetWidth - this.scrollLeft)\n\n popup?.open({\n right,\n top\n })\n }}\n >filter_alt</mwc-icon\n >\n\n ${!renderer\n ? html``\n : type === 'select'\n ? html`<ox-popup-list multiple attr-selected=\"checked\" with-search\n ><div filter-title slot=\"header\">\n <mwc-icon>filter_alt</mwc-icon> filter by <strong>${column.name}</strong>\n </div>\n ${renderer(column, this)}</ox-popup-list\n >`\n : html` <ox-popup\n ><div filter-title><mwc-icon>filter_alt</mwc-icon> filter by <strong>${column.name}</strong></div>\n ${renderer(column, this)}</ox-popup\n >`}\n `\n }\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('config')) {\n this._sorters = this.config.sorters || []\n }\n }\n\n _changeSort(column: ColumnConfig) {\n if (!column.sortable) {\n return\n }\n\n var sorters = [...this._sorters]\n\n var idx = sorters.findIndex(sorter => sorter.name == column.name)\n if (idx !== -1) {\n let sorter = sorters[idx]\n if (sorter.desc) {\n sorters.splice(idx, 1)\n } else {\n sorter.desc = true\n }\n } else {\n var sorter = {\n name: column.name\n }\n\n sorters.push(sorter)\n }\n\n this._sorters = sorters\n\n this.dispatchEvent(\n new CustomEvent('sorters-change', {\n bubbles: true,\n composed: true,\n detail: this._sorters\n })\n )\n }\n\n _accumalate(x: number) {\n this._lastAccVal = (this._lastAccVal ?? 0) + x\n return this._lastAccVal\n }\n\n _notifyWidthChange(idx: number, width: number) {\n if (!this._throttledNotifier) {\n this._throttledNotifier = throttle((idx: number, width: number) => {\n this.dispatchEvent(\n new CustomEvent('column-width-change', {\n bubbles: true,\n composed: true,\n detail: {\n idx,\n width\n }\n })\n )\n\n this._lastAccVal = 0\n }, 100)\n }\n\n this._throttledNotifier(idx, width)\n }\n\n _mousedown(e: MouseEvent, idx: number) {\n e.stopPropagation()\n e.preventDefault()\n\n var mousemoveHandler = ((e: MouseEvent) => {\n e.stopPropagation()\n e.preventDefault()\n let column = this.columns[idx]\n\n let width = Math.max(0, Number(column.width) + this._accumalate(e.movementX))\n if (width == 0) {\n /* CLARIFY-ME 왜 마지막 이벤트의 offsetX로 음수 값이 오는가 */\n return\n }\n\n this._notifyWidthChange(idx, width)\n }).bind(this)\n\n var mouseupHandler = ((e: MouseEvent) => {\n document.removeEventListener('mousemove', mousemoveHandler)\n document.removeEventListener('mouseup', mouseupHandler)\n\n mousemoveHandler(e)\n }).bind(this)\n\n document.addEventListener('mousemove', mousemoveHandler)\n document.addEventListener('mouseup', mouseupHandler)\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"data-grid-header.js","sourceRoot":"","sources":["../../../src/data-grid/data-grid-header.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/popup/ox-popup.js'\nimport '@material/mwc-icon'\n\nimport { ColumnConfig, FilterConfigObject, FilterValue, GristConfig, GristData, SortersConfig } from '../types'\nimport { LitElement, PropertyValues, css, html } from 'lit'\nimport { ZERO_COLUMNS, ZERO_CONFIG, ZERO_DATA } from '../configure/zero-config'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { FilterStyles } from '../filters/filter-styles'\nimport { OxPopup } from '@operato/popup'\nimport { closestElement } from '@operato/utils'\nimport { getFilterRenderer } from '../filters/registry'\nimport throttle from 'lodash-es/throttle'\n\n@customElement('ox-grid-header')\nexport class DataGridHeader extends LitElement {\n static styles = [\n FilterStyles,\n css`\n :host {\n display: grid;\n grid-template-columns: var(--grid-template-columns);\n\n overflow: hidden;\n }\n\n div[column] {\n display: flex;\n\n white-space: nowrap;\n overflow: hidden;\n background-color: var(--grid-header-background-color);\n border-top: var(--grid-header-top-border);\n border-bottom: var(--grid-header-bottom-border);\n padding: var(--grid-header-padding);\n\n text-overflow: ellipsis;\n font: var(--grid-header-font);\n color: var(--grid-header-color);\n }\n\n div[gutter] {\n padding: var(--padding-default) 0 var(--padding-narrow) 0;\n text-align: center;\n }\n\n span {\n display: block;\n white-space: nowrap;\n overflow: hidden;\n }\n\n span[for-title] {\n flex: 1;\n text-overflow: ellipsis;\n line-height: 1.6;\n text-transform: capitalize;\n }\n span[for-title] mwc-icon {\n font-size: var(--grid-record-fontsize);\n }\n\n span[sorter],\n span[filter] {\n padding: 0;\n border: 0;\n }\n span[sorter] mwc-icon {\n font-size: var(--grid-header-sorter-size);\n }\n\n span[filter] > mwc-icon {\n font-size: var(--fontsize-default);\n line-height: 20px;\n }\n\n span[splitter] {\n cursor: col-resize;\n border-right: var(--grid-header-splitter-border);\n }\n span[splitter]:hover {\n border-right: var(--grid-header-splitter-border-hover);\n }\n input[type='checkbox'],\n input[type='radio'] {\n margin: 3px 0 0 0;\n zoom: var(--grist-input-zoom);\n }\n [filter-title] {\n color: var(--grid-header-filter-title-color);\n font: var(--grid-header-filter-title-font);\n text-transform: capitalize;\n }\n [filter-title] * {\n vertical-align: middle;\n }\n [filter-title] mwc-icon {\n opacity: 0.7;\n color: var(--grid-header-filter-title-icon-color);\n }\n [filter] input[type='checkbox'] {\n margin-left: 10px;\n margin-bottom: 5px;\n }\n\n @media print {\n :host {\n grid-template-columns: var(--grid-template-print-columns);\n }\n }\n `\n ]\n\n @property({ type: Object }) config: GristConfig = ZERO_CONFIG\n @property({ type: Array }) columns: ColumnConfig[] = ZERO_COLUMNS\n @property({ type: Object }) data: GristData = ZERO_DATA\n\n @state() private _sorters: SortersConfig = []\n @state() private _filters: FilterValue[] = []\n\n private _lastAccVal?: number\n private _throttledNotifier?: any\n\n connectedCallback() {\n super.connectedCallback()\n\n const grid = closestElement('ox-grist', this)\n grid?.addEventListener('sorters-change', (e: Event) => {\n this._sorters = [...((e as CustomEvent).detail || [])]\n })\n grid?.addEventListener('filters-change', (e: Event) => {\n this._filters = [...((e as CustomEvent).detail || [])]\n })\n }\n\n render() {\n var columns = this.columns || []\n\n return html`\n ${columns.map((column, idx) =>\n !column.hidden\n ? html`\n <div ?gutter=${column.type == 'gutter'} column>\n <span for-title @click=${(e: MouseEvent) => this._changeSort(column)}\n >${this._renderHeader(column)}\n </span>\n\n ${column.sortable\n ? html`\n <span sorter @click=${(e: MouseEvent) => this._changeSort(column)}>\n ${this._renderSortHeader(column)}\n </span>\n `\n : undefined}\n ${column.filter && (column.filter as FilterConfigObject).operator !== 'search'\n ? html` <span filter> ${this._renderFilterHeader(column)} </span> `\n : undefined}\n ${column.resizable !== false\n ? html`\n <span splitter draggable=\"false\" @mousedown=${(e: MouseEvent) => this._mousedown(e, idx)}\n > </span\n >\n `\n : undefined}\n </div>\n `\n : undefined\n )}\n\n <div column></div>\n `\n }\n\n _renderHeader(column: ColumnConfig) {\n var { renderer } = column.header || {}\n var title = renderer.call(this, column)\n\n return html` ${title} `\n }\n\n _renderSortHeader(column: ColumnConfig) {\n var sorters = this._sorters\n\n var sorter = sorters.find(sorter => column.type !== 'gutter' && column.name == sorter.name)\n if (!sorter) {\n return html``\n }\n\n if (sorters.length > 1) {\n var rank = sorters.indexOf(sorter) + 1\n return sorter.desc\n ? html` <mwc-icon>keyboard_arrow_up</mwc-icon><sub>${rank}</sub> `\n : html` <mwc-icon>keyboard_arrow_down</mwc-icon><sub>${rank}</sub> `\n } else {\n return sorter.desc\n ? html` <mwc-icon>keyboard_arrow_up</mwc-icon> `\n : html` <mwc-icon>keyboard_arrow_down</mwc-icon> `\n }\n }\n\n _renderFilterHeader(column: ColumnConfig) {\n const name = column.name\n const filter = column.filter as FilterConfigObject\n const type = filter.type\n const value = this._filters.find(filter => filter.name === name)?.value\n const idx = filter!.operator === 'between' ? 1 : 0\n const renderer = getFilterRenderer(type)[idx]\n\n return html`\n <mwc-icon\n @click=${(e: Event) => {\n const parent = (e.target as HTMLElement).closest('[column]') as HTMLElement\n const popup = parent.querySelector('ox-popup, ox-popup-list') as OxPopup | null\n // const popup = (e.target as HTMLElement).nextSibling as OxPopupList | null\n\n // absolute position인 popup의 위치 부모는 grist 이므로,\n // data-grid-header 의 포지션 부모(grist)의 위치로부터 계산해야함.\n // this의 position을 relative로 하지 못하는 이유 : ox-popup-list가 grid body에 덮히기 때문.\n const top = parent.offsetTop + parent.offsetHeight\n const right = this.clientWidth - (parent.offsetLeft + parent.offsetWidth - this.scrollLeft)\n\n popup?.open({\n right,\n top\n })\n }}\n >filter_alt</mwc-icon\n >\n\n ${!renderer\n ? html``\n : type !== 'select'\n ? html` <ox-popup\n ><div filter-title><mwc-icon>filter_alt</mwc-icon> filter by <strong>${column.name}</strong></div>\n ${renderer(column, value, this)}</ox-popup\n >`\n : filter!.operator === 'in'\n ? html`<ox-popup-list\n multiple\n attr-selected=\"checked\"\n .value=${value}\n with-search\n @select=${(e: CustomEvent) =>\n e.target?.dispatchEvent(\n new CustomEvent('filter-change', {\n bubbles: true,\n composed: true,\n detail: {\n name,\n operator: filter!.operator,\n value: e.detail\n }\n })\n )}\n ><div filter-title slot=\"header\">\n <mwc-icon>filter_alt</mwc-icon> filter by <strong>${column.name}</strong>\n </div>\n ${renderer(column, value, this)}</ox-popup-list\n >`\n : html`<ox-popup-list\n .value=${value}\n with-search\n @select=${(e: CustomEvent) =>\n e.target?.dispatchEvent(\n new CustomEvent('filter-change', {\n bubbles: true,\n composed: true,\n detail: {\n name,\n operator: filter!.operator,\n value: e.detail\n }\n })\n )}\n ><div filter-title slot=\"header\">\n <mwc-icon>filter_alt</mwc-icon> filter by <strong>${column.name}</strong>\n </div>\n ${renderer(column, value, this)}</ox-popup-list\n >`}\n `\n }\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('config')) {\n this._sorters = this.config.sorters || []\n }\n }\n\n _changeSort(column: ColumnConfig) {\n if (!column.sortable) {\n return\n }\n\n var sorters = [...this._sorters]\n\n var idx = sorters.findIndex(sorter => sorter.name == column.name)\n if (idx !== -1) {\n let sorter = sorters[idx]\n if (sorter.desc) {\n sorters.splice(idx, 1)\n } else {\n sorter.desc = true\n }\n } else {\n var sorter = {\n name: column.name\n }\n\n sorters.push(sorter)\n }\n\n this._sorters = sorters\n\n this.dispatchEvent(\n new CustomEvent('sorters-change', {\n bubbles: true,\n composed: true,\n detail: this._sorters\n })\n )\n }\n\n _accumalate(x: number) {\n this._lastAccVal = (this._lastAccVal ?? 0) + x\n return this._lastAccVal\n }\n\n _notifyWidthChange(idx: number, width: number) {\n if (!this._throttledNotifier) {\n this._throttledNotifier = throttle((idx: number, width: number) => {\n this.dispatchEvent(\n new CustomEvent('column-width-change', {\n bubbles: true,\n composed: true,\n detail: {\n idx,\n width\n }\n })\n )\n\n this._lastAccVal = 0\n }, 100)\n }\n\n this._throttledNotifier(idx, width)\n }\n\n _mousedown(e: MouseEvent, idx: number) {\n e.stopPropagation()\n e.preventDefault()\n\n var mousemoveHandler = ((e: MouseEvent) => {\n e.stopPropagation()\n e.preventDefault()\n let column = this.columns[idx]\n\n let width = Math.max(0, Number(column.width) + this._accumalate(e.movementX))\n if (width == 0) {\n /* CLARIFY-ME 왜 마지막 이벤트의 offsetX로 음수 값이 오는가 */\n return\n }\n\n this._notifyWidthChange(idx, width)\n }).bind(this)\n\n var mouseupHandler = ((e: MouseEvent) => {\n document.removeEventListener('mousemove', mousemoveHandler)\n document.removeEventListener('mouseup', mouseupHandler)\n\n mousemoveHandler(e)\n }).bind(this)\n\n document.addEventListener('mousemove', mousemoveHandler)\n document.addEventListener('mouseup', mouseupHandler)\n }\n}\n"]}
|
package/dist/src/data-grist.d.ts
CHANGED
|
@@ -2,12 +2,12 @@ import './data-grid/data-grid';
|
|
|
2
2
|
import './data-list/data-list';
|
|
3
3
|
import './data-card/data-card';
|
|
4
4
|
import './empty-note';
|
|
5
|
+
import { FetchHandler, FilterValue, GristConfig, GristData, GristRecord, SortersConfig } from './types';
|
|
5
6
|
import { LitElement, PropertyValues } from 'lit';
|
|
6
7
|
import { DataCard } from './data-card/data-card';
|
|
7
8
|
import { DataConsumer } from './data-consumer';
|
|
8
9
|
import { DataGrid } from './data-grid/data-grid';
|
|
9
10
|
import { DataList } from './data-list/data-list';
|
|
10
|
-
import { FetchHandler, GristConfig, GristData, GristRecord, SortersConfig } from './types';
|
|
11
11
|
export declare class DataGrist extends LitElement implements DataConsumer {
|
|
12
12
|
static styles: import("lit").CSSResult[];
|
|
13
13
|
mode: 'GRID' | 'LIST' | 'CARD';
|
|
@@ -38,6 +38,7 @@ export declare class DataGrist extends LitElement implements DataConsumer {
|
|
|
38
38
|
updated(changes: PropertyValues<this>): Promise<void>;
|
|
39
39
|
get compiledConfig(): GristConfig;
|
|
40
40
|
get sorters(): SortersConfig | undefined;
|
|
41
|
+
get filters(): FilterValue[] | undefined;
|
|
41
42
|
get dirtyData(): GristData;
|
|
42
43
|
get dirtyRecords(): GristRecord[];
|
|
43
44
|
exportPatchList({ flagName, addedFlag, deletedFlag, modifiedFlag, idField }: {
|
package/dist/src/data-grist.js
CHANGED
|
@@ -3,16 +3,16 @@ import './data-grid/data-grid';
|
|
|
3
3
|
import './data-list/data-list';
|
|
4
4
|
import './data-card/data-card';
|
|
5
5
|
import './empty-note';
|
|
6
|
-
import {
|
|
6
|
+
import { HeadroomStyles, ScrollbarStyles, SpinnerStyles } from '@operato/styles';
|
|
7
|
+
import { LitElement, css, html } from 'lit';
|
|
8
|
+
import { ZERO_CONFIG, ZERO_DATA, ZERO_PAGINATION } from './configure/zero-config';
|
|
7
9
|
import { customElement, property, query, queryAsync, state } from 'lit/decorators.js';
|
|
10
|
+
import { DataProvider } from './data-provider';
|
|
11
|
+
import Headroom from '@operato/headroom';
|
|
12
|
+
import { buildConfig } from './configure/config-builder';
|
|
8
13
|
import isEmpty from 'lodash-es/isEmpty';
|
|
9
14
|
import isEqual from 'lodash-es/isEqual';
|
|
10
|
-
import Headroom from '@operato/headroom';
|
|
11
15
|
import { pulltorefresh } from '@operato/pull-to-refresh';
|
|
12
|
-
import { HeadroomStyles, ScrollbarStyles, SpinnerStyles } from '@operato/styles';
|
|
13
|
-
import { buildConfig } from './configure/config-builder';
|
|
14
|
-
import { ZERO_CONFIG, ZERO_DATA, ZERO_PAGINATION } from './configure/zero-config';
|
|
15
|
-
import { DataProvider } from './data-provider';
|
|
16
16
|
let DataGrist = class DataGrist extends LitElement {
|
|
17
17
|
constructor() {
|
|
18
18
|
super(...arguments);
|
|
@@ -90,10 +90,10 @@ let DataGrist = class DataGrist extends LitElement {
|
|
|
90
90
|
: html ``}
|
|
91
91
|
<div id="wrap">
|
|
92
92
|
${this.mode == 'GRID'
|
|
93
|
-
? html ` <ox-grid id="grist" .config=${this.
|
|
93
|
+
? html ` <ox-grid id="grist" .config=${this.compiledConfig} .data=${this._data}> </ox-grid> `
|
|
94
94
|
: this.mode == 'CARD'
|
|
95
|
-
? html ` <ox-card id="grist" .config=${this.
|
|
96
|
-
: html ` <ox-list id="grist" .config=${this.
|
|
95
|
+
? html ` <ox-card id="grist" .config=${this.compiledConfig} .data=${this._data}> </ox-card> `
|
|
96
|
+
: html ` <ox-list id="grist" .config=${this.compiledConfig} .data=${this._data}> </ox-list> `}
|
|
97
97
|
</div>
|
|
98
98
|
|
|
99
99
|
<div id="spinner" ?show=${this._showSpinner}></div>
|
|
@@ -102,7 +102,7 @@ let DataGrist = class DataGrist extends LitElement {
|
|
|
102
102
|
`;
|
|
103
103
|
}
|
|
104
104
|
async fetch(reset = true) {
|
|
105
|
-
if (!this.
|
|
105
|
+
if (!this.compiledConfig) {
|
|
106
106
|
/* avoid to be here */
|
|
107
107
|
console.warn('grist is not configured yet.');
|
|
108
108
|
return;
|
|
@@ -115,7 +115,7 @@ let DataGrist = class DataGrist extends LitElement {
|
|
|
115
115
|
this.grist.scrollTop = 0;
|
|
116
116
|
}
|
|
117
117
|
if (this.dataProvider) {
|
|
118
|
-
let { limit: initLimit, page: initPage, infinite } = this.
|
|
118
|
+
let { limit: initLimit, page: initPage, infinite } = this.compiledConfig.pagination || {};
|
|
119
119
|
let { limit = initLimit || ZERO_PAGINATION.limit, page = initPage || ZERO_PAGINATION.page } = this.dataProvider;
|
|
120
120
|
if (infinite || this.mode !== 'GRID') {
|
|
121
121
|
await this.dataProvider.attach(reset);
|
|
@@ -139,7 +139,7 @@ let DataGrist = class DataGrist extends LitElement {
|
|
|
139
139
|
this.dispatchEvent(new CustomEvent('config-change', {
|
|
140
140
|
bubbles: true,
|
|
141
141
|
composed: true,
|
|
142
|
-
detail: this.
|
|
142
|
+
detail: this.compiledConfig
|
|
143
143
|
}));
|
|
144
144
|
this.dataProvider && (this.dataProvider.sorters = this.sorters);
|
|
145
145
|
this.fetch();
|
|
@@ -188,7 +188,11 @@ let DataGrist = class DataGrist extends LitElement {
|
|
|
188
188
|
}
|
|
189
189
|
get sorters() {
|
|
190
190
|
var _a;
|
|
191
|
-
return (_a = this.
|
|
191
|
+
return (_a = this.compiledConfig) === null || _a === void 0 ? void 0 : _a.sorters;
|
|
192
|
+
}
|
|
193
|
+
get filters() {
|
|
194
|
+
var _a;
|
|
195
|
+
return (_a = this.dataProvider) === null || _a === void 0 ? void 0 : _a.filters;
|
|
192
196
|
}
|
|
193
197
|
get dirtyData() {
|
|
194
198
|
var _a;
|
|
@@ -222,7 +226,7 @@ let DataGrist = class DataGrist extends LitElement {
|
|
|
222
226
|
if (ifSelectedOnly && (!records || records.length == 0)) {
|
|
223
227
|
records = this.data.records;
|
|
224
228
|
}
|
|
225
|
-
let columns = this.
|
|
229
|
+
let columns = this.compiledConfig.columns.filter(column => column.type !== 'gutter');
|
|
226
230
|
if (!includeHiddenField) {
|
|
227
231
|
columns = columns.filter(column => !column.hidden);
|
|
228
232
|
}
|
|
@@ -302,7 +306,7 @@ let DataGrist = class DataGrist extends LitElement {
|
|
|
302
306
|
}
|
|
303
307
|
checkDirties() {
|
|
304
308
|
const records = this.dirtyRecords;
|
|
305
|
-
const { columns = [] } = this.
|
|
309
|
+
const { columns = [] } = this.compiledConfig || {};
|
|
306
310
|
for (var record of records || []) {
|
|
307
311
|
var origin = record['__origin__'] || {};
|
|
308
312
|
var dirtyFields = (record['__dirtyfields__'] = columns
|
|
@@ -327,7 +331,7 @@ let DataGrist = class DataGrist extends LitElement {
|
|
|
327
331
|
var cloned = {
|
|
328
332
|
__dirty__: '+'
|
|
329
333
|
};
|
|
330
|
-
this.
|
|
334
|
+
this.compiledConfig.columns
|
|
331
335
|
.filter(column => column.record.editable)
|
|
332
336
|
.forEach(column => {
|
|
333
337
|
cloned[column.name] = record[column.name];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-grist.js","sourceRoot":"","sources":["../../src/data-grist.ts"],"names":[],"mappings":"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","sourcesContent":["import './data-grid/data-grid'\nimport './data-list/data-list'\nimport './data-card/data-card'\nimport './empty-note'\n\nimport { css, html, LitElement, PropertyValues } from 'lit'\nimport { customElement, property, query, queryAsync, state } from 'lit/decorators.js'\nimport isEmpty from 'lodash-es/isEmpty'\nimport isEqual from 'lodash-es/isEqual'\n\nimport Headroom from '@operato/headroom'\nimport { pulltorefresh } from '@operato/pull-to-refresh'\nimport { HeadroomStyles, ScrollbarStyles, SpinnerStyles } from '@operato/styles'\n\nimport { buildConfig } from './configure/config-builder'\nimport { ZERO_CONFIG, ZERO_DATA, ZERO_PAGINATION } from './configure/zero-config'\nimport { DataCard } from './data-card/data-card'\nimport { DataConsumer } from './data-consumer'\nimport { DataGrid } from './data-grid/data-grid'\nimport { DataList } from './data-list/data-list'\nimport { DataProvider } from './data-provider'\nimport { FetchHandler, GristConfig, GristData, GristRecord, SortersConfig } from './types'\n\n@customElement('ox-grist')\nexport class DataGrist extends LitElement implements DataConsumer {\n static styles = [\n ScrollbarStyles,\n HeadroomStyles,\n SpinnerStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n background-color: var(--grist-background-color);\n min-height: 120px;\n\n overflow: hidden;\n\n /* for pulltorefresh controller */\n position: relative;\n\n padding: var(--ox-grist-padding);\n\n --mdc-icon-size: var(--grid-record-wide-fontsize);\n }\n\n #wrap {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: auto;\n }\n\n ox-grid,\n ox-list {\n flex: 1;\n }\n\n ox-empty-note {\n display: block;\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n }\n\n slot[name='headroom'] {\n display: block;\n\n position: absolute;\n top: 0;\n left: 0;\n\n width: 100%;\n box-sizing: border-box;\n }\n `\n ]\n\n @property() mode: 'GRID' | 'LIST' | 'CARD' = 'GRID'\n @property() config: any\n @property() data: GristData = ZERO_DATA\n @property() selectedRecords?: GristRecord[]\n @property({ type: Boolean, attribute: 'auto-fetch' }) autoFetch: boolean = false\n @property() fetchHandler?: FetchHandler\n @property() fetchOptions: any\n\n @state() _data: GristData = ZERO_DATA\n @state() _config: GristConfig = ZERO_CONFIG\n @state() private _showSpinner: boolean = false\n\n private dataProvider?: DataProvider\n private _pulltorefreshHandle?: any\n private _headroom?: Headroom\n private orginPaddingTop?: string\n private originMarginTop?: string\n\n @query('slot[name=headroom]') head!: HTMLElement\n @query('#grist') grist!: DataGrid | DataList | DataCard\n @queryAsync('#wrap') private wrap!: Promise<HTMLElement>\n\n async connectedCallback() {\n super.connectedCallback()\n\n this.dataProvider = new DataProvider(this)\n\n await this.updateComplete\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n\n this.dataProvider?.dispose()\n this._resetPullToRefresh()\n }\n\n private _resetPullToRefresh() {\n if (this._pulltorefreshHandle) {\n this._pulltorefreshHandle()\n delete this._pulltorefreshHandle\n }\n }\n\n private async _setPullToRefresh() {\n this._resetPullToRefresh()\n if (this.fetchHandler) {\n this._pulltorefreshHandle = pulltorefresh({\n container: await this.wrap,\n scrollable: this.grist.pullToRefreshTarget,\n refresh: () => {\n return this.fetch(true)\n }\n })\n }\n }\n\n private _setHeadroom() {\n this._headroom?.destroy()\n\n if (this.grist && this.head) {\n const style = getComputedStyle(this.grist)\n\n this.orginPaddingTop = style.paddingTop || '0'\n this.originMarginTop = style.marginTop || '0'\n\n console.log(this.orginPaddingTop, this.originMarginTop)\n\n this._headroom = new Headroom(this.head, {\n scroller: this.grist,\n onTop: () => {\n this.grist.style.paddingTop = this.orginPaddingTop!\n\n this.originMarginTop = this.grist.style.marginTop\n this.grist.style.marginTop = this.head.clientHeight + 'px'\n },\n onNotTop: () => {\n this.grist.style.marginTop = this.originMarginTop!\n\n this.orginPaddingTop = this.grist.style.paddingTop\n this.grist.style.paddingTop = this.head.clientHeight + 'px'\n }\n })\n this._headroom.init()\n }\n }\n\n render() {\n var oops = !this._showSpinner && this._data.records.length == 0\n\n return html`\n ${oops\n ? html`\n <ox-empty-note\n icon=\"list\"\n title=\"EMPTY LIST\"\n description=\"There are no records to be shown\"\n ></ox-empty-note>\n `\n : html``}\n <div id=\"wrap\">\n ${this.mode == 'GRID'\n ? html` <ox-grid id=\"grist\" .config=${this._config} .data=${this._data}> </ox-grid> `\n : this.mode == 'CARD'\n ? html` <ox-card id=\"grist\" .config=${this._config} .data=${this._data}> </ox-card> `\n : html` <ox-list id=\"grist\" .config=${this._config} .data=${this._data}> </ox-list> `}\n </div>\n\n <div id=\"spinner\" ?show=${this._showSpinner}></div>\n\n <slot name=\"headroom\"> </slot>\n `\n }\n\n async fetch(reset = true) {\n if (!this._config) {\n /* avoid to be here */\n console.warn('grist is not configured yet.')\n return\n }\n\n if (reset && this.grist) {\n /*\n * scroll 의 현재위치에 의해서 scroll 이벤트가 발생할 수 있으므로, 이를 방지하기 위해서 스크롤의 위치를 TOP으로 옮긴다.\n * (scroll 이 첫페이지 크기 이상으로 내려가 있는 경우, 첫페이지부터 다시 표시하는 경우에, scroll 이벤트가 발생한다.)\n */\n this.grist.scrollTop = 0\n }\n\n if (this.dataProvider) {\n let { limit: initLimit, page: initPage, infinite } = this._config.pagination || {}\n let { limit = initLimit || ZERO_PAGINATION.limit, page = initPage || ZERO_PAGINATION.page } = this.dataProvider\n\n if (infinite || this.mode !== 'GRID') {\n await this.dataProvider.attach(reset)\n } else {\n await this.dataProvider.fetch({\n limit,\n page,\n sorters: this.sorters,\n sortings: this.sorters\n })\n }\n }\n }\n\n async updated(changes: PropertyValues<this>) {\n var needToSetPullToRefresh = false\n\n if (changes.has('config')) {\n this._config = buildConfig({\n ...this.config\n })\n\n this.dispatchEvent(\n new CustomEvent('config-change', {\n bubbles: true,\n composed: true,\n detail: this._config\n })\n )\n\n this.dataProvider && (this.dataProvider.sorters = this.sorters)\n this.fetch()\n }\n\n if (changes.has('fetchHandler')) {\n this.dataProvider && (this.dataProvider.fetchHandler = this.fetchHandler)\n needToSetPullToRefresh = true\n }\n\n if (changes.has('fetchOptions')) {\n this.dataProvider && (this.dataProvider.fetchOptions = this.fetchOptions)\n }\n\n if (changes.has('data')) {\n this.reset()\n }\n\n if (changes.has('mode')) {\n if (this.mode === 'GRID') {\n this.style.removeProperty('--ox-grist-padding')\n } else {\n this.style.setProperty('--ox-grist-padding', '0')\n }\n\n needToSetPullToRefresh = true\n this._setHeadroom()\n }\n\n if (changes.has('selectedRecords')) {\n var { records } = this.data || []\n var selectedRecords = this.selectedRecords || []\n\n var _records = this._data.records\n\n /* 원본데이타에서 index를 찾아서, 복사본 데이타의 selected를 설정한다. */\n selectedRecords.forEach(selected => {\n var index = records.indexOf(selected)\n var record = _records[index]\n if (record) {\n record['__selected__'] = true\n }\n })\n\n /* update _data property intentionally */\n this.refresh()\n }\n\n if (needToSetPullToRefresh) {\n await this._setPullToRefresh()\n }\n }\n\n get compiledConfig(): GristConfig {\n return this._config\n }\n\n get sorters(): SortersConfig | undefined {\n return this._config?.sorters\n }\n\n get dirtyData(): GristData {\n return (this.grist as any)?.data || {}\n }\n\n get dirtyRecords() {\n var { records = [] } = this.dirtyData\n return records.filter(record => record['__dirty__'])\n }\n\n exportPatchList({ flagName = 'patchFlag', addedFlag = '+', deletedFlag = '-', modifiedFlag = 'M', idField = 'id' }) {\n let dirtyRecords = this.dirtyRecords\n if (!dirtyRecords || dirtyRecords.length == 0) {\n return []\n }\n\n return dirtyRecords.map(record => {\n let flag = record.__dirty__\n\n let patch = {\n [flagName]: flag == 'M' ? modifiedFlag : flag == '+' ? addedFlag : deletedFlag\n }\n\n if (idField in record && record[idField]) {\n patch[idField] = record[idField]\n }\n\n for (let key in record.__dirtyfields__) {\n patch[key] = record[key]\n }\n return patch\n })\n }\n\n exportRecords({ ifSelectedOnly = true, includeHiddenField = true } = {}) {\n let records = ifSelectedOnly ? this.selected : this.data.records\n\n if (ifSelectedOnly && (!records || records.length == 0)) {\n records = this.data.records\n }\n\n let columns = this._config.columns.filter(column => column.type !== 'gutter')\n if (!includeHiddenField) {\n columns = columns.filter(column => !column.hidden)\n }\n let columnNames = columns.map(column => column.name)\n\n return records.map(item => {\n return columnNames.reduce((record, name) => {\n record[name] = item[name]\n return record\n }, {} as any)\n })\n }\n\n get selected() {\n var { records = [] } = this.grist?.data\n return records.filter(record => record['__selected__'])\n }\n\n showSpinner() {\n this._showSpinner = true\n }\n\n hideSpinner() {\n this._showSpinner = false\n }\n\n focus() {\n super.focus()\n\n this.grist.focus()\n }\n\n commit() {\n var { page, total, limit, records } = this.grist.data\n\n this.data = {\n page,\n total,\n limit,\n records: records.map(record => {\n var copied = {\n ...record\n }\n\n delete copied.__seq__\n delete copied.__dirty__\n delete copied.__selected__\n delete copied.__changes__\n delete copied.__dirtyfields__\n delete copied.__origin__\n\n return copied\n })\n }\n }\n\n /**\n * Forced internal data to be reflected on the screen\n * Data changing through a normal method is automatically reflected on the screen, so it is a method that does not need to be used in general.\n * Therefore, it will be deprecated.\n * @method\n */\n refresh() {\n this._data = { ...this._data }\n }\n\n /**\n * This method cancels all changes in the dirty state before being reflected in the data.\n *\n * @method\n */\n reset() {\n var {\n limit = ZERO_PAGINATION.limit,\n page = ZERO_PAGINATION.page,\n total = ZERO_PAGINATION.total,\n records = []\n } = this.data || ZERO_PAGINATION\n\n /* 원본 데이타를 남기고, 복사본(_data)을 사용한다. */\n records = records.map((record, idx) => {\n return {\n ...record,\n __seq__: this.mode == 'GRID' ? (page - 1) * limit + idx + 1 : idx + 1,\n __origin__: record\n }\n })\n\n this._data = {\n limit,\n page,\n total,\n records\n }\n }\n\n checkDirties() {\n const records = this.dirtyRecords\n const { columns = [] } = this._config || {}\n\n for (var record of records || []) {\n var origin = record['__origin__'] || {}\n\n var dirtyFields = (record['__dirtyfields__'] = columns\n .filter(column => column.type !== 'gutter' && !isEqual(origin[column.name], record[column.name]))\n .reduce((sum, column) => {\n var name = column.name\n\n sum[name] = {\n before: origin[name],\n after: record[name]\n }\n\n return sum\n }, {} as any))\n\n if (record['__dirty__'] == 'M' && isEmpty(dirtyFields)) {\n delete record['__dirty__']\n }\n }\n\n this._data = { ...this._data }\n }\n\n cloneSelectedRecords() {\n const records = this.selected || ([] as GristRecord[])\n\n records.forEach(record => {\n var cloned = {\n __dirty__: '+'\n } as GristRecord\n\n this._config.columns\n .filter(column => column.record.editable)\n .forEach(column => {\n cloned[column.name] = record[column.name]\n })\n const rowIndex = this._data.records.findIndex(rec => rec === record)\n\n this._data.records.splice(rowIndex + 1, 0, cloned)\n })\n\n this.checkDirties()\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"data-grist.js","sourceRoot":"","sources":["../../src/data-grist.ts"],"names":[],"mappings":"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","sourcesContent":["import './data-grid/data-grid'\nimport './data-list/data-list'\nimport './data-card/data-card'\nimport './empty-note'\n\nimport {\n FetchHandler,\n FilterConfigObject,\n FilterValue,\n GristConfig,\n GristData,\n GristRecord,\n SortersConfig\n} from './types'\nimport { HeadroomStyles, ScrollbarStyles, SpinnerStyles } from '@operato/styles'\nimport { LitElement, PropertyValues, css, html } from 'lit'\nimport { ZERO_CONFIG, ZERO_DATA, ZERO_PAGINATION } from './configure/zero-config'\nimport { customElement, property, query, queryAsync, state } from 'lit/decorators.js'\n\nimport { DataCard } from './data-card/data-card'\nimport { DataConsumer } from './data-consumer'\nimport { DataGrid } from './data-grid/data-grid'\nimport { DataList } from './data-list/data-list'\nimport { DataProvider } from './data-provider'\nimport Headroom from '@operato/headroom'\nimport { buildConfig } from './configure/config-builder'\nimport isEmpty from 'lodash-es/isEmpty'\nimport isEqual from 'lodash-es/isEqual'\nimport { pulltorefresh } from '@operato/pull-to-refresh'\n\n@customElement('ox-grist')\nexport class DataGrist extends LitElement implements DataConsumer {\n static styles = [\n ScrollbarStyles,\n HeadroomStyles,\n SpinnerStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n background-color: var(--grist-background-color);\n min-height: 120px;\n\n overflow: hidden;\n\n /* for pulltorefresh controller */\n position: relative;\n\n padding: var(--ox-grist-padding);\n\n --mdc-icon-size: var(--grid-record-wide-fontsize);\n }\n\n #wrap {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: auto;\n }\n\n ox-grid,\n ox-list {\n flex: 1;\n }\n\n ox-empty-note {\n display: block;\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n }\n\n slot[name='headroom'] {\n display: block;\n\n position: absolute;\n top: 0;\n left: 0;\n\n width: 100%;\n box-sizing: border-box;\n }\n `\n ]\n\n @property() mode: 'GRID' | 'LIST' | 'CARD' = 'GRID'\n @property() config: any\n @property() data: GristData = ZERO_DATA\n @property() selectedRecords?: GristRecord[]\n @property({ type: Boolean, attribute: 'auto-fetch' }) autoFetch: boolean = false\n @property() fetchHandler?: FetchHandler\n @property() fetchOptions: any\n\n @state() _data: GristData = ZERO_DATA\n @state() _config: GristConfig = ZERO_CONFIG\n @state() private _showSpinner: boolean = false\n\n private dataProvider?: DataProvider\n private _pulltorefreshHandle?: any\n private _headroom?: Headroom\n private orginPaddingTop?: string\n private originMarginTop?: string\n\n @query('slot[name=headroom]') head!: HTMLElement\n @query('#grist') grist!: DataGrid | DataList | DataCard\n @queryAsync('#wrap') private wrap!: Promise<HTMLElement>\n\n async connectedCallback() {\n super.connectedCallback()\n\n this.dataProvider = new DataProvider(this)\n\n await this.updateComplete\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n\n this.dataProvider?.dispose()\n this._resetPullToRefresh()\n }\n\n private _resetPullToRefresh() {\n if (this._pulltorefreshHandle) {\n this._pulltorefreshHandle()\n delete this._pulltorefreshHandle\n }\n }\n\n private async _setPullToRefresh() {\n this._resetPullToRefresh()\n if (this.fetchHandler) {\n this._pulltorefreshHandle = pulltorefresh({\n container: await this.wrap,\n scrollable: this.grist.pullToRefreshTarget,\n refresh: () => {\n return this.fetch(true)\n }\n })\n }\n }\n\n private _setHeadroom() {\n this._headroom?.destroy()\n\n if (this.grist && this.head) {\n const style = getComputedStyle(this.grist)\n\n this.orginPaddingTop = style.paddingTop || '0'\n this.originMarginTop = style.marginTop || '0'\n\n console.log(this.orginPaddingTop, this.originMarginTop)\n\n this._headroom = new Headroom(this.head, {\n scroller: this.grist,\n onTop: () => {\n this.grist.style.paddingTop = this.orginPaddingTop!\n\n this.originMarginTop = this.grist.style.marginTop\n this.grist.style.marginTop = this.head.clientHeight + 'px'\n },\n onNotTop: () => {\n this.grist.style.marginTop = this.originMarginTop!\n\n this.orginPaddingTop = this.grist.style.paddingTop\n this.grist.style.paddingTop = this.head.clientHeight + 'px'\n }\n })\n this._headroom.init()\n }\n }\n\n render() {\n var oops = !this._showSpinner && this._data.records.length == 0\n\n return html`\n ${oops\n ? html`\n <ox-empty-note\n icon=\"list\"\n title=\"EMPTY LIST\"\n description=\"There are no records to be shown\"\n ></ox-empty-note>\n `\n : html``}\n <div id=\"wrap\">\n ${this.mode == 'GRID'\n ? html` <ox-grid id=\"grist\" .config=${this.compiledConfig} .data=${this._data}> </ox-grid> `\n : this.mode == 'CARD'\n ? html` <ox-card id=\"grist\" .config=${this.compiledConfig} .data=${this._data}> </ox-card> `\n : html` <ox-list id=\"grist\" .config=${this.compiledConfig} .data=${this._data}> </ox-list> `}\n </div>\n\n <div id=\"spinner\" ?show=${this._showSpinner}></div>\n\n <slot name=\"headroom\"> </slot>\n `\n }\n\n async fetch(reset = true) {\n if (!this.compiledConfig) {\n /* avoid to be here */\n console.warn('grist is not configured yet.')\n return\n }\n\n if (reset && this.grist) {\n /*\n * scroll 의 현재위치에 의해서 scroll 이벤트가 발생할 수 있으므로, 이를 방지하기 위해서 스크롤의 위치를 TOP으로 옮긴다.\n * (scroll 이 첫페이지 크기 이상으로 내려가 있는 경우, 첫페이지부터 다시 표시하는 경우에, scroll 이벤트가 발생한다.)\n */\n this.grist.scrollTop = 0\n }\n\n if (this.dataProvider) {\n let { limit: initLimit, page: initPage, infinite } = this.compiledConfig.pagination || {}\n let { limit = initLimit || ZERO_PAGINATION.limit, page = initPage || ZERO_PAGINATION.page } = this.dataProvider\n\n if (infinite || this.mode !== 'GRID') {\n await this.dataProvider.attach(reset)\n } else {\n await this.dataProvider.fetch({\n limit,\n page,\n sorters: this.sorters,\n sortings: this.sorters\n })\n }\n }\n }\n\n async updated(changes: PropertyValues<this>) {\n var needToSetPullToRefresh = false\n\n if (changes.has('config')) {\n this._config = buildConfig({\n ...this.config\n })\n\n this.dispatchEvent(\n new CustomEvent('config-change', {\n bubbles: true,\n composed: true,\n detail: this.compiledConfig\n })\n )\n\n this.dataProvider && (this.dataProvider.sorters = this.sorters)\n this.fetch()\n }\n\n if (changes.has('fetchHandler')) {\n this.dataProvider && (this.dataProvider.fetchHandler = this.fetchHandler)\n needToSetPullToRefresh = true\n }\n\n if (changes.has('fetchOptions')) {\n this.dataProvider && (this.dataProvider.fetchOptions = this.fetchOptions)\n }\n\n if (changes.has('data')) {\n this.reset()\n }\n\n if (changes.has('mode')) {\n if (this.mode === 'GRID') {\n this.style.removeProperty('--ox-grist-padding')\n } else {\n this.style.setProperty('--ox-grist-padding', '0')\n }\n\n needToSetPullToRefresh = true\n this._setHeadroom()\n }\n\n if (changes.has('selectedRecords')) {\n var { records } = this.data || []\n var selectedRecords = this.selectedRecords || []\n\n var _records = this._data.records\n\n /* 원본데이타에서 index를 찾아서, 복사본 데이타의 selected를 설정한다. */\n selectedRecords.forEach(selected => {\n var index = records.indexOf(selected)\n var record = _records[index]\n if (record) {\n record['__selected__'] = true\n }\n })\n\n /* update _data property intentionally */\n this.refresh()\n }\n\n if (needToSetPullToRefresh) {\n await this._setPullToRefresh()\n }\n }\n\n get compiledConfig(): GristConfig {\n return this._config\n }\n\n get sorters(): SortersConfig | undefined {\n return this.compiledConfig?.sorters\n }\n\n get filters(): FilterValue[] | undefined {\n return this.dataProvider?.filters\n }\n\n get dirtyData(): GristData {\n return (this.grist as any)?.data || {}\n }\n\n get dirtyRecords() {\n var { records = [] } = this.dirtyData\n return records.filter(record => record['__dirty__'])\n }\n\n exportPatchList({ flagName = 'patchFlag', addedFlag = '+', deletedFlag = '-', modifiedFlag = 'M', idField = 'id' }) {\n let dirtyRecords = this.dirtyRecords\n if (!dirtyRecords || dirtyRecords.length == 0) {\n return []\n }\n\n return dirtyRecords.map(record => {\n let flag = record.__dirty__\n\n let patch = {\n [flagName]: flag == 'M' ? modifiedFlag : flag == '+' ? addedFlag : deletedFlag\n }\n\n if (idField in record && record[idField]) {\n patch[idField] = record[idField]\n }\n\n for (let key in record.__dirtyfields__) {\n patch[key] = record[key]\n }\n return patch\n })\n }\n\n exportRecords({ ifSelectedOnly = true, includeHiddenField = true } = {}) {\n let records = ifSelectedOnly ? this.selected : this.data.records\n\n if (ifSelectedOnly && (!records || records.length == 0)) {\n records = this.data.records\n }\n\n let columns = this.compiledConfig.columns.filter(column => column.type !== 'gutter')\n if (!includeHiddenField) {\n columns = columns.filter(column => !column.hidden)\n }\n let columnNames = columns.map(column => column.name)\n\n return records.map(item => {\n return columnNames.reduce((record, name) => {\n record[name] = item[name]\n return record\n }, {} as any)\n })\n }\n\n get selected() {\n var { records = [] } = this.grist?.data\n return records.filter(record => record['__selected__'])\n }\n\n showSpinner() {\n this._showSpinner = true\n }\n\n hideSpinner() {\n this._showSpinner = false\n }\n\n focus() {\n super.focus()\n\n this.grist.focus()\n }\n\n commit() {\n var { page, total, limit, records } = this.grist.data\n\n this.data = {\n page,\n total,\n limit,\n records: records.map(record => {\n var copied = {\n ...record\n }\n\n delete copied.__seq__\n delete copied.__dirty__\n delete copied.__selected__\n delete copied.__changes__\n delete copied.__dirtyfields__\n delete copied.__origin__\n\n return copied\n })\n }\n }\n\n /**\n * Forced internal data to be reflected on the screen\n * Data changing through a normal method is automatically reflected on the screen, so it is a method that does not need to be used in general.\n * Therefore, it will be deprecated.\n * @method\n */\n refresh() {\n this._data = { ...this._data }\n }\n\n /**\n * This method cancels all changes in the dirty state before being reflected in the data.\n *\n * @method\n */\n reset() {\n var {\n limit = ZERO_PAGINATION.limit,\n page = ZERO_PAGINATION.page,\n total = ZERO_PAGINATION.total,\n records = []\n } = this.data || ZERO_PAGINATION\n\n /* 원본 데이타를 남기고, 복사본(_data)을 사용한다. */\n records = records.map((record, idx) => {\n return {\n ...record,\n __seq__: this.mode == 'GRID' ? (page - 1) * limit + idx + 1 : idx + 1,\n __origin__: record\n }\n })\n\n this._data = {\n limit,\n page,\n total,\n records\n }\n }\n\n checkDirties() {\n const records = this.dirtyRecords\n const { columns = [] } = this.compiledConfig || {}\n\n for (var record of records || []) {\n var origin = record['__origin__'] || {}\n\n var dirtyFields = (record['__dirtyfields__'] = columns\n .filter(column => column.type !== 'gutter' && !isEqual(origin[column.name], record[column.name]))\n .reduce((sum, column) => {\n var name = column.name\n\n sum[name] = {\n before: origin[name],\n after: record[name]\n }\n\n return sum\n }, {} as any))\n\n if (record['__dirty__'] == 'M' && isEmpty(dirtyFields)) {\n delete record['__dirty__']\n }\n }\n\n this._data = { ...this._data }\n }\n\n cloneSelectedRecords() {\n const records = this.selected || ([] as GristRecord[])\n\n records.forEach(record => {\n var cloned = {\n __dirty__: '+'\n } as GristRecord\n\n this.compiledConfig.columns\n .filter(column => column.record.editable)\n .forEach(column => {\n cloned[column.name] = record[column.name]\n })\n const rowIndex = this._data.records.findIndex(rec => rec === record)\n\n this._data.records.splice(rowIndex + 1, 0, cloned)\n })\n\n this.checkDirties()\n }\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { FilterValue, GristRecord, SorterConfig, SortersConfig } from './types';
|
|
2
2
|
import { DataConsumer } from './data-consumer';
|
|
3
3
|
export declare class DataProvider {
|
|
4
4
|
page: number;
|
|
@@ -13,6 +13,7 @@ export declare class DataProvider {
|
|
|
13
13
|
private _limitChangeHandler;
|
|
14
14
|
private _sortersChangeHandler;
|
|
15
15
|
private _filtersChangeHandler;
|
|
16
|
+
private _filterChangeHandler;
|
|
16
17
|
private _recordChangeHandler;
|
|
17
18
|
private _attachPageHandler;
|
|
18
19
|
private _fetchHandlerWrap;
|
|
@@ -23,6 +24,7 @@ export declare class DataProvider {
|
|
|
23
24
|
onPageChange(e: Event): void;
|
|
24
25
|
onLimitChange(e: Event): void;
|
|
25
26
|
onSortersChange(e: Event): void;
|
|
27
|
+
onFilterChange(e: Event): void;
|
|
26
28
|
onFiltersChange(e: Event): void;
|
|
27
29
|
onRecordChange(e: Event): void;
|
|
28
30
|
get fetchOptions(): any;
|
|
@@ -33,15 +35,15 @@ export declare class DataProvider {
|
|
|
33
35
|
set sorters(sorters: SorterConfig[] | undefined);
|
|
34
36
|
get sortings(): SorterConfig[] | undefined;
|
|
35
37
|
set sortings(sorters: SorterConfig[] | undefined);
|
|
36
|
-
get filters():
|
|
37
|
-
set filters(filters:
|
|
38
|
+
get filters(): FilterValue[] | undefined;
|
|
39
|
+
set filters(filters: FilterValue[] | undefined);
|
|
38
40
|
attach(reset?: boolean): Promise<void>;
|
|
39
41
|
fetch({ page, limit, sorters, sortings, filters }?: {
|
|
40
42
|
page?: number;
|
|
41
43
|
limit?: number;
|
|
42
44
|
sorters?: SortersConfig;
|
|
43
45
|
sortings?: SortersConfig;
|
|
44
|
-
filters?:
|
|
46
|
+
filters?: FilterValue[];
|
|
45
47
|
}): Promise<void>;
|
|
46
48
|
_update({ page, limit, total, records }: {
|
|
47
49
|
page: number;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ZERO_RECORDS } from './configure/zero-config';
|
|
2
|
+
import deepEquals from 'lodash-es/isEqual';
|
|
2
3
|
function EMPTY_FETCHHANDLER() {
|
|
3
4
|
return {
|
|
4
5
|
total: 0,
|
|
@@ -22,6 +23,7 @@ export class DataProvider {
|
|
|
22
23
|
this._limitChangeHandler = this.onLimitChange.bind(this);
|
|
23
24
|
this._sortersChangeHandler = this.onSortersChange.bind(this);
|
|
24
25
|
this._filtersChangeHandler = this.onFiltersChange.bind(this);
|
|
26
|
+
this._filterChangeHandler = this.onFilterChange.bind(this);
|
|
25
27
|
this._recordChangeHandler = this.onRecordChange.bind(this);
|
|
26
28
|
this._attachPageHandler = this.onAttachPage.bind(this);
|
|
27
29
|
this.consumer = consumer;
|
|
@@ -31,16 +33,18 @@ export class DataProvider {
|
|
|
31
33
|
this.consumer.addEventListener('limit-change', this._limitChangeHandler);
|
|
32
34
|
this.consumer.addEventListener('sorters-change', this._sortersChangeHandler);
|
|
33
35
|
this.consumer.addEventListener('filters-change', this._filtersChangeHandler);
|
|
36
|
+
this.consumer.addEventListener('filter-change', this._filterChangeHandler);
|
|
34
37
|
this.consumer.addEventListener('record-change', this._recordChangeHandler);
|
|
35
38
|
}
|
|
36
39
|
dispose() {
|
|
37
|
-
var _a, _b, _c, _d, _e, _f;
|
|
40
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
38
41
|
(_a = this.consumer) === null || _a === void 0 ? void 0 : _a.removeEventListener('attach-page', this._attachPageHandler);
|
|
39
42
|
(_b = this.consumer) === null || _b === void 0 ? void 0 : _b.removeEventListener('page-change', this._pageChangeHandler);
|
|
40
43
|
(_c = this.consumer) === null || _c === void 0 ? void 0 : _c.removeEventListener('limit-change', this._limitChangeHandler);
|
|
41
44
|
(_d = this.consumer) === null || _d === void 0 ? void 0 : _d.removeEventListener('sorters-change', this._sortersChangeHandler);
|
|
42
45
|
(_e = this.consumer) === null || _e === void 0 ? void 0 : _e.removeEventListener('filters-change', this._filtersChangeHandler);
|
|
43
|
-
(_f = this.consumer) === null || _f === void 0 ? void 0 : _f.removeEventListener('
|
|
46
|
+
(_f = this.consumer) === null || _f === void 0 ? void 0 : _f.removeEventListener('filter-change', this._filterChangeHandler);
|
|
47
|
+
(_g = this.consumer) === null || _g === void 0 ? void 0 : _g.removeEventListener('record-change', this._recordChangeHandler);
|
|
44
48
|
}
|
|
45
49
|
onAttachPage() {
|
|
46
50
|
this.attach();
|
|
@@ -61,9 +65,32 @@ export class DataProvider {
|
|
|
61
65
|
}
|
|
62
66
|
this.fetch();
|
|
63
67
|
}
|
|
68
|
+
onFilterChange(e) {
|
|
69
|
+
var _a;
|
|
70
|
+
const { name, operator, value } = e.detail;
|
|
71
|
+
const filters = this.filters instanceof Array ? [...this.filters] : [];
|
|
72
|
+
if (value === undefined || value === null) {
|
|
73
|
+
const index = filters.findIndex(filter => filter.name === name);
|
|
74
|
+
if (index === -1) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
filters.splice(index, 1);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
const index = filters.findIndex(filter => filter.name === name);
|
|
81
|
+
if (index === -1) {
|
|
82
|
+
filters.push({ name, operator, value });
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
filters.splice(index, 1, { name, operator, value });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
(_a = this.consumer) === null || _a === void 0 ? void 0 : _a.dispatchEvent(new CustomEvent('filters-change', {
|
|
89
|
+
detail: filters
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
64
92
|
onFiltersChange(e) {
|
|
65
93
|
this.filters = e.detail;
|
|
66
|
-
this.fetch();
|
|
67
94
|
}
|
|
68
95
|
onRecordChange(e) {
|
|
69
96
|
var _a;
|
|
@@ -115,7 +142,11 @@ export class DataProvider {
|
|
|
115
142
|
return this._filters;
|
|
116
143
|
}
|
|
117
144
|
set filters(filters) {
|
|
145
|
+
if (this._filters === filters || deepEquals(this._filters, filters)) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
118
148
|
this._filters = filters;
|
|
149
|
+
this.fetch();
|
|
119
150
|
}
|
|
120
151
|
async attach(reset = false) {
|
|
121
152
|
var _a;
|