@sankhyalabs/sankhyablocks 1.3.31-beta.17 → 1.3.31-beta.18
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/dist/cjs/{SnkMessageBuilder-cb132e6d.js → SnkMessageBuilder-02c2ca02.js} +7 -3
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/sankhyablocks.cjs.js +1 -1
- package/dist/cjs/snk-application.cjs.entry.js +376 -256
- package/dist/cjs/snk-crud.cjs.entry.js +2 -1
- package/dist/cjs/snk-data-unit.cjs.entry.js +1 -1
- package/dist/cjs/snk-filter-bar.cjs.entry.js +61 -13
- package/dist/cjs/snk-filter-detail.cjs.entry.js +6 -1
- package/dist/cjs/snk-filter-item.cjs.entry.js +12 -0
- package/dist/cjs/snk-filter-list.cjs.entry.js +2 -2
- package/dist/cjs/snk-filter-multi-select.cjs.entry.js +23 -0
- package/dist/cjs/snk-filter-number.cjs.entry.js +2 -1
- package/dist/cjs/snk-filter-search.cjs.entry.js +1 -1
- package/dist/cjs/snk-form.cjs.entry.js +19 -1
- package/dist/cjs/snk-grid.cjs.entry.js +15 -5
- package/dist/cjs/snk-taskbar.cjs.entry.js +14 -11
- package/dist/cjs/{taskbar-elements-efa44ff1.js → taskbar-elements-283c737e.js} +36 -17
- package/dist/cjs/taskbar-processor-6bd0d35c.js +47 -0
- package/dist/collection/collection-manifest.json +1 -0
- package/dist/collection/components/snk-crud/snk-crud.js +41 -3
- package/dist/collection/components/snk-filter-bar/filter-item/editors/snk-filter-multi-select.js +64 -0
- package/dist/collection/components/snk-filter-bar/filter-item/editors/snk-filter-number.js +2 -1
- package/dist/collection/components/snk-filter-bar/filter-item/editors/snk-filter-search.js +1 -1
- package/dist/collection/components/snk-filter-bar/filter-item/snk-filter-detail.js +6 -1
- package/dist/collection/components/snk-filter-bar/filter-item/snk-filter-item.js +35 -0
- package/dist/collection/components/snk-filter-bar/filter-list/snk-filter-list.js +53 -2
- package/dist/collection/components/snk-filter-bar/snk-filter-bar.css +15 -0
- package/dist/collection/components/snk-filter-bar/snk-filter-bar.js +60 -12
- package/dist/collection/components/snk-form/snk-form.js +41 -1
- package/dist/collection/components/snk-grid/snk-grid.js +35 -3
- package/dist/collection/components/snk-taskbar/elements/taskbar-elements.js +35 -17
- package/dist/collection/components/snk-taskbar/processor/taskbar-processor.js +43 -0
- package/dist/collection/components/snk-taskbar/snk-taskbar.js +36 -11
- package/dist/collection/lib/http/data-fetcher/fetchers/filter-bar-config-fetcher.js +375 -255
- package/dist/collection/lib/message/resources/snk-filter-bar.msg.js +7 -3
- package/dist/components/SnkMessageBuilder.js +7 -3
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.js +1 -0
- package/dist/components/snk-application2.js +375 -255
- package/dist/components/snk-crud.js +4 -2
- package/dist/components/snk-filter-bar2.js +61 -13
- package/dist/components/snk-filter-detail2.js +6 -1
- package/dist/components/snk-filter-item2.js +14 -1
- package/dist/components/snk-filter-list2.js +5 -2
- package/dist/components/snk-filter-multi-select.d.ts +11 -0
- package/dist/components/snk-filter-multi-select.js +39 -0
- package/dist/components/snk-filter-number.js +2 -1
- package/dist/components/snk-filter-search.js +1 -1
- package/dist/components/snk-form2.js +20 -1
- package/dist/components/snk-grid2.js +15 -4
- package/dist/components/snk-taskbar2.js +49 -27
- package/dist/components/taskbar-processor.js +45 -0
- package/dist/{sankhyablocks/SnkMessageBuilder-cff80920.js → esm/SnkMessageBuilder-65d431bd.js} +7 -3
- package/dist/esm/loader.js +1 -1
- package/dist/esm/sankhyablocks.js +1 -1
- package/dist/esm/snk-application.entry.js +376 -256
- package/dist/esm/snk-crud.entry.js +3 -2
- package/dist/esm/snk-data-unit.entry.js +1 -1
- package/dist/esm/snk-filter-bar.entry.js +61 -13
- package/dist/esm/snk-filter-detail.entry.js +6 -1
- package/dist/esm/snk-filter-item.entry.js +12 -0
- package/dist/esm/snk-filter-list.entry.js +2 -2
- package/dist/esm/snk-filter-multi-select.entry.js +19 -0
- package/dist/esm/snk-filter-number.entry.js +2 -1
- package/dist/esm/snk-filter-search.entry.js +1 -1
- package/dist/esm/snk-form.entry.js +19 -1
- package/dist/esm/snk-grid.entry.js +15 -5
- package/dist/esm/snk-taskbar.entry.js +14 -11
- package/dist/esm/taskbar-elements-35d64ff9.js +90 -0
- package/dist/esm/taskbar-processor-aa6772c9.js +45 -0
- package/dist/{esm/SnkMessageBuilder-cff80920.js → sankhyablocks/SnkMessageBuilder-65d431bd.js} +7 -3
- package/dist/sankhyablocks/sankhyablocks.esm.js +1 -1
- package/dist/sankhyablocks/snk-application.entry.js +376 -256
- package/dist/sankhyablocks/snk-crud.entry.js +3 -2
- package/dist/sankhyablocks/snk-data-unit.entry.js +1 -1
- package/dist/sankhyablocks/snk-filter-bar.entry.js +61 -13
- package/dist/sankhyablocks/snk-filter-detail.entry.js +6 -1
- package/dist/sankhyablocks/snk-filter-item.entry.js +12 -0
- package/dist/sankhyablocks/snk-filter-list.entry.js +2 -2
- package/dist/sankhyablocks/snk-filter-multi-select.entry.js +19 -0
- package/dist/sankhyablocks/snk-filter-number.entry.js +2 -1
- package/dist/sankhyablocks/snk-filter-search.entry.js +1 -1
- package/dist/sankhyablocks/snk-form.entry.js +19 -1
- package/dist/sankhyablocks/snk-grid.entry.js +15 -5
- package/dist/sankhyablocks/snk-taskbar.entry.js +14 -11
- package/dist/sankhyablocks/taskbar-elements-35d64ff9.js +90 -0
- package/dist/sankhyablocks/taskbar-processor-aa6772c9.js +45 -0
- package/dist/types/components/snk-filter-bar/filter-item/editors/snk-filter-multi-select.d.ts +7 -0
- package/dist/types/components/snk-filter-bar/filter-item/snk-filter-detail.d.ts +1 -0
- package/dist/types/components/snk-filter-bar/filter-list/snk-filter-list.d.ts +3 -0
- package/dist/types/components/snk-filter-bar/snk-filter-bar.d.ts +5 -3
- package/dist/types/components/snk-taskbar/elements/taskbar-elements.d.ts +3 -2
- package/dist/types/components/snk-taskbar/processor/taskbar-processor.d.ts +12 -0
- package/dist/types/components/snk-taskbar/snk-taskbar.d.ts +17 -1
- package/dist/types/components.d.ts +78 -2
- package/package.json +1 -1
- package/dist/esm/taskbar-elements-c119510a.js +0 -72
- package/dist/sankhyablocks/taskbar-elements-c119510a.js +0 -72
package/dist/collection/components/snk-filter-bar/filter-item/editors/snk-filter-multi-select.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { h } from '@stencil/core';
|
|
2
|
+
import FilterItemType from '../filter-item-type.enum';
|
|
3
|
+
export class SnkFilterMultiSelect {
|
|
4
|
+
ezChangeListener(evt) {
|
|
5
|
+
this.value = evt.detail.value;
|
|
6
|
+
}
|
|
7
|
+
render() {
|
|
8
|
+
if (!this.config || this.config.type !== FilterItemType.MULTI_SELECT) {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
return (h("ez-combo-box", { label: this.config.label, value: this.config.value, options: this.config.props.options }));
|
|
12
|
+
}
|
|
13
|
+
static get is() { return "snk-filter-multi-select"; }
|
|
14
|
+
static get properties() {
|
|
15
|
+
return {
|
|
16
|
+
"value": {
|
|
17
|
+
"type": "any",
|
|
18
|
+
"mutable": true,
|
|
19
|
+
"complexType": {
|
|
20
|
+
"original": "any",
|
|
21
|
+
"resolved": "any",
|
|
22
|
+
"references": {}
|
|
23
|
+
},
|
|
24
|
+
"required": false,
|
|
25
|
+
"optional": false,
|
|
26
|
+
"docs": {
|
|
27
|
+
"tags": [],
|
|
28
|
+
"text": ""
|
|
29
|
+
},
|
|
30
|
+
"attribute": "value",
|
|
31
|
+
"reflect": true
|
|
32
|
+
},
|
|
33
|
+
"config": {
|
|
34
|
+
"type": "unknown",
|
|
35
|
+
"mutable": false,
|
|
36
|
+
"complexType": {
|
|
37
|
+
"original": "SnkFilterItemConfig",
|
|
38
|
+
"resolved": "SnkFilterItemConfig",
|
|
39
|
+
"references": {
|
|
40
|
+
"SnkFilterItemConfig": {
|
|
41
|
+
"location": "import",
|
|
42
|
+
"path": "../snk-filter-item"
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"required": false,
|
|
47
|
+
"optional": false,
|
|
48
|
+
"docs": {
|
|
49
|
+
"tags": [],
|
|
50
|
+
"text": ""
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
static get listeners() {
|
|
56
|
+
return [{
|
|
57
|
+
"name": "ezChange",
|
|
58
|
+
"method": "ezChangeListener",
|
|
59
|
+
"target": undefined,
|
|
60
|
+
"capture": false,
|
|
61
|
+
"passive": false
|
|
62
|
+
}];
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -5,10 +5,11 @@ export class SnkFilterPeriod {
|
|
|
5
5
|
this.value = evt.detail;
|
|
6
6
|
}
|
|
7
7
|
render() {
|
|
8
|
+
var _a;
|
|
8
9
|
if (!this.config || this.config.type !== FilterItemType.NUMBER) {
|
|
9
10
|
return undefined;
|
|
10
11
|
}
|
|
11
|
-
return (h("ez-number-input", { label: this.config.label, value: this.config.value }));
|
|
12
|
+
return (h("ez-number-input", { label: this.config.label, value: this.config.value, precision: (_a = this.config.props) === null || _a === void 0 ? void 0 : _a.precision }));
|
|
12
13
|
}
|
|
13
14
|
static get is() { return "snk-filter-number"; }
|
|
14
15
|
static get properties() {
|
|
@@ -29,7 +29,7 @@ export class SnkFilterSearch {
|
|
|
29
29
|
if (!this.config || this.config.type !== FilterItemType.SEARCH) {
|
|
30
30
|
return undefined;
|
|
31
31
|
}
|
|
32
|
-
return (h("ez-search", { value: this.config.value, label: this.config.label, ref: ref => this._searchInput = ref, optionLoader: ({ mode, argument }) => this.doSearch(mode, argument) }));
|
|
32
|
+
return (h("ez-search", { suppressEmptyOption: true, value: this.config.value, label: this.config.label, ref: ref => this._searchInput = ref, optionLoader: ({ mode, argument }) => this.doSearch(mode, argument) }));
|
|
33
33
|
}
|
|
34
34
|
static get is() { return "snk-filter-search"; }
|
|
35
35
|
static get properties() {
|
|
@@ -8,6 +8,8 @@ export class SnkFilterDetail {
|
|
|
8
8
|
switch (this.config.type) {
|
|
9
9
|
case FilterItemType.BINARY_SELECT:
|
|
10
10
|
return "snk-filter-binary-select";
|
|
11
|
+
case FilterItemType.MULTI_SELECT:
|
|
12
|
+
return "snk-filter-multi-select";
|
|
11
13
|
case FilterItemType.PERIOD:
|
|
12
14
|
return "snk-filter-period";
|
|
13
15
|
case FilterItemType.SEARCH:
|
|
@@ -17,12 +19,15 @@ export class SnkFilterDetail {
|
|
|
17
19
|
}
|
|
18
20
|
return "snk-filter-text";
|
|
19
21
|
}
|
|
22
|
+
removeItem() {
|
|
23
|
+
this.changeConfig(Object.assign(Object.assign({}, this.config), { visible: false, fixed: false, value: undefined }));
|
|
24
|
+
}
|
|
20
25
|
getPopUpHeaderButtons() {
|
|
21
26
|
if (this.config.hardFixed) {
|
|
22
27
|
return undefined;
|
|
23
28
|
}
|
|
24
29
|
return ([
|
|
25
|
-
h("ez-icon", { title: this.getMessage("snkFilterBar.removeFilter"), class: "sc-snk-filter-bar snk-filter-item__editor-header-button", iconName: "delete", onClick: () => this.
|
|
30
|
+
h("ez-icon", { title: this.getMessage("snkFilterBar.removeFilter"), class: "sc-snk-filter-bar snk-filter-item__editor-header-button", iconName: "delete", onClick: () => this.removeItem() }),
|
|
26
31
|
h("ez-icon", { title: this.getMessage(this.config.fixed ? "snkFilterBar.unpinFilter" : "snkFilterBar.pinFilter"), class: "ez-margin-left--small sc-snk-filter-bar snk-filter-item__editor-header-button", iconName: this.config.fixed ? "un-pin" : "push-pin", onClick: () => this.changeConfig(Object.assign(Object.assign({}, this.config), { fixed: !this.config.fixed })) })
|
|
27
32
|
]);
|
|
28
33
|
}
|
|
@@ -22,6 +22,14 @@ export class SnkFilterItem {
|
|
|
22
22
|
return false;
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
|
+
async showUp(open = false) {
|
|
26
|
+
this._filterItemElement.scrollIntoView({ behavior: "auto", block: "nearest", inline: "nearest" });
|
|
27
|
+
if (open) {
|
|
28
|
+
window.requestAnimationFrame(() => {
|
|
29
|
+
this.showDetail();
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
25
33
|
showDetail() {
|
|
26
34
|
this._floatingID = FloatingManager.float(this._popover, this._popoverContainer, { autoClose: true, innerClickTest: this.innerClickCheck, left: this.getScrollOffset() });
|
|
27
35
|
this.detailIsVisible = true;
|
|
@@ -76,6 +84,10 @@ export class SnkFilterItem {
|
|
|
76
84
|
return optTwo.label;
|
|
77
85
|
}
|
|
78
86
|
}
|
|
87
|
+
if (type === FilterItemType.MULTI_SELECT) {
|
|
88
|
+
const opt = props.options.find(opt => opt.value === value);
|
|
89
|
+
return `${label}: ${opt.label}`;
|
|
90
|
+
}
|
|
79
91
|
if (type === FilterItemType.PERIOD) {
|
|
80
92
|
const period = value;
|
|
81
93
|
const dateFormater = new Intl.DateTimeFormat("pt-BR");
|
|
@@ -184,6 +196,29 @@ export class SnkFilterItem {
|
|
|
184
196
|
}
|
|
185
197
|
}];
|
|
186
198
|
}
|
|
199
|
+
static get methods() {
|
|
200
|
+
return {
|
|
201
|
+
"showUp": {
|
|
202
|
+
"complexType": {
|
|
203
|
+
"signature": "(open?: boolean) => Promise<void>",
|
|
204
|
+
"parameters": [{
|
|
205
|
+
"tags": [],
|
|
206
|
+
"text": ""
|
|
207
|
+
}],
|
|
208
|
+
"references": {
|
|
209
|
+
"Promise": {
|
|
210
|
+
"location": "global"
|
|
211
|
+
}
|
|
212
|
+
},
|
|
213
|
+
"return": "Promise<void>"
|
|
214
|
+
},
|
|
215
|
+
"docs": {
|
|
216
|
+
"text": "",
|
|
217
|
+
"tags": []
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
}
|
|
187
222
|
static get elementRef() { return "_filterItemElement"; }
|
|
188
223
|
static get listeners() {
|
|
189
224
|
return [{
|
|
@@ -63,7 +63,7 @@ export class SnkFilterList {
|
|
|
63
63
|
getFilterItems() {
|
|
64
64
|
const items = this.items ? ArrayUtils.applyStringFilter(this._filterArgument, this.items.filter(item => item.kind === "FILTER")) : [];
|
|
65
65
|
if (items.length === 0) {
|
|
66
|
-
return h("div", { class: "ez-text ez-text--medium ez-text--primary ez-padding--extra-small sc-snk-filter-bar snk-filter-bar__filter-list-items-container--empty" }, this.
|
|
66
|
+
return h("div", { class: "ez-text ez-text--medium ez-text--primary ez-padding--extra-small sc-snk-filter-bar snk-filter-bar__filter-list-items-container--empty" }, this.emptyText);
|
|
67
67
|
}
|
|
68
68
|
const hideItems = !this._filterArgument && !this._showAll && (items.length > MAX_FILTERS + 1);
|
|
69
69
|
if (hideItems) {
|
|
@@ -76,7 +76,7 @@ export class SnkFilterList {
|
|
|
76
76
|
return this.items.filter(item => item.kind === "FOOTER");
|
|
77
77
|
}
|
|
78
78
|
render() {
|
|
79
|
-
return (h(Host, { class: "ez-flex ez-flex--column" }, h("ez-button", { label: this.label, onClick: () => this.buttonClick(), mode: this.iconName ? "icon" : undefined, iconName: this.iconName, size: "small" }, h("slot", { name: "leftIcon" })), h("section", { class: "ez-margin-top--small sc-snk-filter-bar snk-filter__popover-container", ref: elem => this._popoverContainer = elem }, h("div", { class: "sc-snk-filter-bar snk-filter__popover ez-padding--small", ref: elem => this._popover = elem }, h("ez-filter-input", { ref: ref => this._filterInput = ref, mode: "slim", label: this.
|
|
79
|
+
return (h(Host, { class: "ez-flex ez-flex--column" }, h("ez-button", { class: this.buttonClass, label: this.label, onClick: () => this.buttonClick(), mode: this.iconName ? "icon" : undefined, iconName: this.iconName, size: "small" }, h("slot", { name: "leftIcon" })), h("section", { class: "ez-margin-top--small sc-snk-filter-bar snk-filter__popover-container", ref: elem => this._popoverContainer = elem }, h("div", { class: "sc-snk-filter-bar snk-filter__popover ez-padding--small", ref: elem => this._popover = elem }, h("ez-filter-input", { ref: ref => this._filterInput = ref, mode: "slim", label: this.findFilterText, value: this._filterArgument, onEzChange: (evt) => this._filterArgument = evt.detail }), this.getFilterItems(), h("hr", { class: "sc-snk-filter-bar snk-filter__popover-rule" }), this.items ? this.getFooterItems().map(item => this.buildItemElement(item)) : undefined))));
|
|
80
80
|
}
|
|
81
81
|
static get is() { return "snk-filter-list"; }
|
|
82
82
|
static get properties() {
|
|
@@ -151,6 +151,57 @@ export class SnkFilterList {
|
|
|
151
151
|
"tags": [],
|
|
152
152
|
"text": ""
|
|
153
153
|
}
|
|
154
|
+
},
|
|
155
|
+
"emptyText": {
|
|
156
|
+
"type": "string",
|
|
157
|
+
"mutable": false,
|
|
158
|
+
"complexType": {
|
|
159
|
+
"original": "string",
|
|
160
|
+
"resolved": "string",
|
|
161
|
+
"references": {}
|
|
162
|
+
},
|
|
163
|
+
"required": false,
|
|
164
|
+
"optional": false,
|
|
165
|
+
"docs": {
|
|
166
|
+
"tags": [],
|
|
167
|
+
"text": ""
|
|
168
|
+
},
|
|
169
|
+
"attribute": "empty-text",
|
|
170
|
+
"reflect": false
|
|
171
|
+
},
|
|
172
|
+
"findFilterText": {
|
|
173
|
+
"type": "string",
|
|
174
|
+
"mutable": false,
|
|
175
|
+
"complexType": {
|
|
176
|
+
"original": "string",
|
|
177
|
+
"resolved": "string",
|
|
178
|
+
"references": {}
|
|
179
|
+
},
|
|
180
|
+
"required": false,
|
|
181
|
+
"optional": false,
|
|
182
|
+
"docs": {
|
|
183
|
+
"tags": [],
|
|
184
|
+
"text": ""
|
|
185
|
+
},
|
|
186
|
+
"attribute": "find-filter-text",
|
|
187
|
+
"reflect": false
|
|
188
|
+
},
|
|
189
|
+
"buttonClass": {
|
|
190
|
+
"type": "string",
|
|
191
|
+
"mutable": false,
|
|
192
|
+
"complexType": {
|
|
193
|
+
"original": "string",
|
|
194
|
+
"resolved": "string",
|
|
195
|
+
"references": {}
|
|
196
|
+
},
|
|
197
|
+
"required": false,
|
|
198
|
+
"optional": false,
|
|
199
|
+
"docs": {
|
|
200
|
+
"tags": [],
|
|
201
|
+
"text": ""
|
|
202
|
+
},
|
|
203
|
+
"attribute": "button-class",
|
|
204
|
+
"reflect": false
|
|
154
205
|
}
|
|
155
206
|
};
|
|
156
207
|
}
|
|
@@ -96,4 +96,19 @@
|
|
|
96
96
|
justify-content: center;
|
|
97
97
|
align-self: center;
|
|
98
98
|
align-items: center;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.snk-filter-bar__filter-list-items-button--active{
|
|
102
|
+
position: relative;
|
|
103
|
+
}
|
|
104
|
+
.snk-filter-bar__filter-list-items-button--active::after{
|
|
105
|
+
display: flex;
|
|
106
|
+
position: absolute;
|
|
107
|
+
content: "";
|
|
108
|
+
width: 8px;
|
|
109
|
+
height: 8px;
|
|
110
|
+
top: 7px;
|
|
111
|
+
left: 17px;
|
|
112
|
+
background-color: var(--icon--alert--color, #008561);
|
|
113
|
+
border-radius: 50%;
|
|
99
114
|
}
|
|
@@ -4,6 +4,7 @@ import FilterItemType from './filter-item/filter-item-type.enum';
|
|
|
4
4
|
import { toString } from '@sankhyalabs/core/dist/dataunit/metadata/DataType';
|
|
5
5
|
const PERSONALIZED_FILTER = "PERSONALIZED_FILTER";
|
|
6
6
|
const DEFAULT_FILTER = "DEFAULT_FILTER";
|
|
7
|
+
const CLEAR_ALL_FILTERS = "CLEAR_ALL_FILTERS";
|
|
7
8
|
export class SnkFilterBar {
|
|
8
9
|
constructor() {
|
|
9
10
|
this._updateSequence = [];
|
|
@@ -49,6 +50,9 @@ export class SnkFilterBar {
|
|
|
49
50
|
//FIXME: ajustar o backend para não exigir parametros
|
|
50
51
|
return { name: id, expression: selectedOption.expression, params: [] };
|
|
51
52
|
}
|
|
53
|
+
if (type === FilterItemType.MULTI_SELECT) {
|
|
54
|
+
return { name: id, expression: props.expression, params: [{ name: id, dataType: DataType.TEXT, value }] };
|
|
55
|
+
}
|
|
52
56
|
if (type === FilterItemType.PERIOD) {
|
|
53
57
|
const { end, start } = value;
|
|
54
58
|
const params = [];
|
|
@@ -120,11 +124,11 @@ export class SnkFilterBar {
|
|
|
120
124
|
getFilterItems() {
|
|
121
125
|
const pinnedItems = [];
|
|
122
126
|
const unpinnedItems = [];
|
|
123
|
-
this.
|
|
127
|
+
this.filterConfig
|
|
124
128
|
.filter(item => item.visible)
|
|
125
129
|
.sort((a, b) => this._filtersComparator(a, b))
|
|
126
|
-
.
|
|
127
|
-
const filterItem = (h("snk-filter-item", { config: item, class: index > 0 ? "ez-padding-left--medium" : "", getMessage: (key, props) => this.getMessage(key, props), key: item.id }));
|
|
130
|
+
.forEach((item, index) => {
|
|
131
|
+
const filterItem = (h("snk-filter-item", { id: `filter-${item.id}`, config: item, class: index > 0 ? "ez-padding-left--medium" : "", getMessage: (key, props) => this.getMessage(key, props), key: item.id }));
|
|
128
132
|
if (item.fixed || item.hardFixed) {
|
|
129
133
|
pinnedItems.push(filterItem);
|
|
130
134
|
}
|
|
@@ -142,25 +146,36 @@ export class SnkFilterBar {
|
|
|
142
146
|
return elements;
|
|
143
147
|
}
|
|
144
148
|
calculateUpdateSequence(item) {
|
|
145
|
-
|
|
146
|
-
|
|
149
|
+
if (item) {
|
|
150
|
+
this._updateSequence = this._updateSequence.filter(itemId => item.id !== itemId);
|
|
151
|
+
this._updateSequence.push(item.id);
|
|
152
|
+
}
|
|
147
153
|
}
|
|
148
154
|
filterChangeListener(evt) {
|
|
149
155
|
this.updateFilter(evt.detail);
|
|
150
156
|
}
|
|
151
|
-
updateFilter(newItem) {
|
|
157
|
+
updateFilter(newItem, clear = false) {
|
|
152
158
|
this.calculateUpdateSequence(newItem);
|
|
153
|
-
let
|
|
159
|
+
let upToDate = false;
|
|
154
160
|
this.filterConfig = this.filterConfig.map(item => {
|
|
155
|
-
if (
|
|
156
|
-
|
|
157
|
-
|
|
161
|
+
if (clear) {
|
|
162
|
+
if (item.value != undefined) {
|
|
163
|
+
upToDate = true;
|
|
164
|
+
}
|
|
165
|
+
return Object.assign(Object.assign({}, item), { value: undefined });
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
if (item.id === newItem.id) {
|
|
169
|
+
upToDate = ObjectUtils.objectToString(item.value) !== ObjectUtils.objectToString(newItem.value);
|
|
170
|
+
return newItem;
|
|
171
|
+
}
|
|
158
172
|
}
|
|
159
173
|
return item;
|
|
160
174
|
});
|
|
161
|
-
if (
|
|
175
|
+
if (upToDate) {
|
|
162
176
|
this.dataUnit.loadData();
|
|
163
177
|
}
|
|
178
|
+
return upToDate;
|
|
164
179
|
}
|
|
165
180
|
getAddListItems() {
|
|
166
181
|
const hiddenItems = this.filterConfig
|
|
@@ -173,17 +188,50 @@ export class SnkFilterBar {
|
|
|
173
188
|
{ name: DEFAULT_FILTER, label: this.getMessage("snkFilterBar.defaultFilter"), iconName: "configuration", kind: "FOOTER" }
|
|
174
189
|
]);
|
|
175
190
|
}
|
|
191
|
+
getActiveClass() {
|
|
192
|
+
const filterApplied = this.filterConfig.filter(item => item.value != undefined).length > 0;
|
|
193
|
+
return filterApplied ? "sc-snk-filter-bar snk-filter-bar__filter-list-items-button--active" : "";
|
|
194
|
+
}
|
|
195
|
+
getAppliedListItems() {
|
|
196
|
+
const appliedItems = this.filterConfig
|
|
197
|
+
.filter(item => item.value != undefined)
|
|
198
|
+
.sort(this._filtersComparator);
|
|
199
|
+
return appliedItems.map(filter => {
|
|
200
|
+
return { name: filter.id, label: filter.label, kind: "FILTER", iconName: null };
|
|
201
|
+
}).concat([
|
|
202
|
+
{ name: CLEAR_ALL_FILTERS, label: this.getMessage("snkFilterBar.clearAllFilters"), iconName: "cleaning", kind: "FOOTER" }
|
|
203
|
+
]);
|
|
204
|
+
}
|
|
176
205
|
addFilterHandler(itemName) {
|
|
177
206
|
const filterItem = this.filterConfig.find(currentFilter => currentFilter.id === itemName);
|
|
178
207
|
if (filterItem) {
|
|
179
208
|
this.updateFilter(Object.assign(Object.assign({}, filterItem), { visible: true }));
|
|
209
|
+
window.requestAnimationFrame(() => {
|
|
210
|
+
const itemElement = this._element.querySelector("#filter-" + itemName);
|
|
211
|
+
if (itemElement) {
|
|
212
|
+
itemElement.showUp();
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
appliedFilterHandler(itemName) {
|
|
218
|
+
if (itemName === CLEAR_ALL_FILTERS) {
|
|
219
|
+
if (this.updateFilter(null, true)) {
|
|
220
|
+
this._application.info(this.getMessage("snkFilterBar.successfullyCleaned"), { iconName: "check" });
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
const itemElement = this._element.querySelector("#filter-" + itemName);
|
|
225
|
+
if (itemElement) {
|
|
226
|
+
itemElement.showUp(true);
|
|
227
|
+
}
|
|
180
228
|
}
|
|
181
229
|
}
|
|
182
230
|
render() {
|
|
183
231
|
if (!this.dataUnit || !this.filterConfig || this.filterConfig.length === 0) {
|
|
184
232
|
return undefined;
|
|
185
233
|
}
|
|
186
|
-
return (h(Host, null, h("ez-scroller", { direction: "horizontal" }, this.getFilterItems()), h("
|
|
234
|
+
return (h(Host, null, h("ez-scroller", { direction: "horizontal" }, this.getFilterItems()), h("snk-filter-list", { items: this.getAppliedListItems(), getMessage: (key, params) => this.getMessage(key, params), emptyText: this.getMessage("snkFilterBar.emptyAppliedFiltersList"), findFilterText: this.getMessage("snkFilterBar.findFilter"), iconName: "filter", class: "ez-padding-left--medium", buttonClass: this.getActiveClass(), onSnkItemSelected: evt => this.appliedFilterHandler(evt.detail) }), h("snk-filter-list", { items: this.getAddListItems(), label: this.getMessage("snkFilterBar.addFilter"), getMessage: (key, params) => this.getMessage(key, params), emptyText: this.getMessage("snkFilterBar.emptyFiltersList"), findFilterText: this.getMessage("snkFilterBar.findField"), class: "ez-padding-left--medium", onSnkItemSelected: evt => this.addFilterHandler(evt.detail) }, h("ez-icon", { slot: "leftIcon", class: "ez-padding-right--small", iconName: "plus" }))));
|
|
187
235
|
}
|
|
188
236
|
static get is() { return "snk-filter-bar"; }
|
|
189
237
|
static get encapsulation() { return "scoped"; }
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import { ApplicationContext } from '@sankhyalabs/core';
|
|
2
2
|
import { h } from '@stencil/core';
|
|
3
|
+
import TaskbarProcessor from '../snk-taskbar/processor/taskbar-processor';
|
|
3
4
|
export class SnkForm {
|
|
5
|
+
constructor() {
|
|
6
|
+
this._taskbarProcessor = new TaskbarProcessor({
|
|
7
|
+
"snkForm.regular": ["PREVIOUS", "NEXT", "DIVIDER", "CLONE", "REMOVE", "MORE_OPTIONS", "DIVIDER", "GRID_MODE", "INSERT"],
|
|
8
|
+
"snkForm.finish_edition": ["CANCEL", "SAVE"]
|
|
9
|
+
});
|
|
10
|
+
}
|
|
4
11
|
getFormConfig() {
|
|
5
12
|
return (this._dataState && this._dataState.insertionMode ? this._insertionFormConfig : this._editionFormConfig);
|
|
6
13
|
}
|
|
@@ -90,11 +97,24 @@ export class SnkForm {
|
|
|
90
97
|
parent = parent.parentElement;
|
|
91
98
|
}
|
|
92
99
|
}
|
|
100
|
+
componentWillRender() {
|
|
101
|
+
var _a;
|
|
102
|
+
const taskbarId = ((_a = this._dataState) === null || _a === void 0 ? void 0 : _a.isDirty) ? "snkForm.finish_edition" : "snkForm.regular";
|
|
103
|
+
const disabledButtons = [];
|
|
104
|
+
if (!this._dataState || !this._dataState.hasPrevious) {
|
|
105
|
+
disabledButtons.push("PREVIOUS");
|
|
106
|
+
}
|
|
107
|
+
if (!this._dataState || !this._dataState.hasNext) {
|
|
108
|
+
disabledButtons.push("NEXT");
|
|
109
|
+
}
|
|
110
|
+
this._taskbarProcessor.process(taskbarId, this.taskbarManager, this._dataState, disabledButtons);
|
|
111
|
+
}
|
|
93
112
|
render() {
|
|
113
|
+
var _a;
|
|
94
114
|
if (!this._configLoaded || !this._dataUnit || !this._dataState) {
|
|
95
115
|
return undefined;
|
|
96
116
|
}
|
|
97
|
-
return (h("section", { class: "snk-form" }, h("div", { class: "snk-form__header snk-form__header--fixed ez-row" }, h("div", { class: "ez-col ez-col--sd-6 ez-col--tb-6", key: "formHeader" }, h("ez-button", { title: this.getMessage("snkForm.goBackTitle"), mode: "icon", iconName: "arrow_back", class: "ez-padding-right--medium", size: "small", onClick: () => this.exitForm() }), h("h1", { class: "ez-title ez-title--primary ez-title--xlarge ez-align--middle" }, this.getMessage("snkForm.title"))), h("div", { class: "ez-col ez-col--sd-6 ez-col--tb-6 ez-align--right" }, h("snk-taskbar", { key: "formTaskbar", buttons: this.
|
|
117
|
+
return (h("section", { class: "snk-form" }, h("div", { class: "snk-form__header snk-form__header--fixed ez-row" }, h("div", { class: "ez-col ez-col--sd-6 ez-col--tb-6", key: "formHeader" }, h("ez-button", { title: this.getMessage("snkForm.goBackTitle"), mode: "icon", iconName: "arrow_back", class: "ez-padding-right--medium", size: "small", onClick: () => this.exitForm() }), h("h1", { class: "ez-title ez-title--primary ez-title--xlarge ez-align--middle" }, this.getMessage("snkForm.title"))), h("div", { class: "ez-col ez-col--sd-6 ez-col--tb-6 ez-align--right" }, h("snk-taskbar", { key: "formTaskbar", buttons: this._taskbarProcessor.buttons, disabledButtons: this._taskbarProcessor.disabledButtons, customButtons: this._taskbarProcessor.customButtons, actionsList: this.actionsList, primaryButton: ((_a = this._dataState) === null || _a === void 0 ? void 0 : _a.isDirty) ? "SAVE" : "INSERT", dataUnit: this._dataUnit }))), h("section", null, h("div", { class: "ez-row" }, h("div", { class: "ez-col ez-col--sd-12" }, h("ez-form", { key: "ezForm" + this._snkDataUnit.entityName, dataUnit: this._dataUnit, config: this.getFormConfig(), recordsValidator: this.recordsValidator }))))));
|
|
98
118
|
}
|
|
99
119
|
static get is() { return "snk-form"; }
|
|
100
120
|
static get encapsulation() { return "scoped"; }
|
|
@@ -169,6 +189,26 @@ export class SnkForm {
|
|
|
169
189
|
"tags": [],
|
|
170
190
|
"text": "Lista de a\u00E7\u00F5es que devem ser usadas no bot\u00E3o \"Mais op\u00E7\u00F5es\""
|
|
171
191
|
}
|
|
192
|
+
},
|
|
193
|
+
"taskbarManager": {
|
|
194
|
+
"type": "unknown",
|
|
195
|
+
"mutable": false,
|
|
196
|
+
"complexType": {
|
|
197
|
+
"original": "TaskbarManager",
|
|
198
|
+
"resolved": "TaskbarManager",
|
|
199
|
+
"references": {
|
|
200
|
+
"TaskbarManager": {
|
|
201
|
+
"location": "import",
|
|
202
|
+
"path": "../snk-taskbar/snk-taskbar"
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
"required": false,
|
|
207
|
+
"optional": false,
|
|
208
|
+
"docs": {
|
|
209
|
+
"tags": [],
|
|
210
|
+
"text": "Gerenciador das barras de tarefas. \u00C9 poss\u00EDvel determinar bot\u00F5es espec\u00EDficos\nou mesmo gerenciar o estado dos bot\u00F5es."
|
|
211
|
+
}
|
|
172
212
|
}
|
|
173
213
|
};
|
|
174
214
|
}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import { ApplicationContext } from '@sankhyalabs/core';
|
|
2
2
|
import { h } from '@stencil/core';
|
|
3
3
|
import { TaskbarElement } from '../snk-taskbar/elements/taskbar-elements';
|
|
4
|
+
import TaskbarProcessor from '../snk-taskbar/processor/taskbar-processor';
|
|
4
5
|
export class SnkGrid {
|
|
5
|
-
|
|
6
|
-
|
|
6
|
+
constructor() {
|
|
7
|
+
this._topTaskbarProcessor = new TaskbarProcessor({
|
|
8
|
+
"snkGridTopTaskbar": ["FORM_MODE", "CONFIG_GRID", "INSERT"]
|
|
9
|
+
});
|
|
10
|
+
this._headerTaskbarProcessor = new TaskbarProcessor({
|
|
11
|
+
"snkGridHeaderTaskbar.unselected": ["REFRESH"],
|
|
12
|
+
"snkGridHeaderTaskbar.selected": ["UPDATE", "CLONE", "REMOVE", "MORE_OPTIONS", "DIVIDER", "REFRESH"]
|
|
13
|
+
});
|
|
7
14
|
}
|
|
8
15
|
actionClickHandler(evt) {
|
|
9
16
|
if (evt.detail === TaskbarElement.CONFIG_GRID && this._grid) {
|
|
@@ -44,11 +51,16 @@ export class SnkGrid {
|
|
|
44
51
|
parent = parent.parentElement;
|
|
45
52
|
}
|
|
46
53
|
}
|
|
54
|
+
componentWillRender() {
|
|
55
|
+
const headerTaskbarId = this._dataState && this._dataState.selectedRecords.length > 0 ? "snkGridHeaderTaskbar.selected" : "snkGridHeaderTaskbar.unselected";
|
|
56
|
+
this._headerTaskbarProcessor.process(headerTaskbarId, this.taskbarManager, this._dataState);
|
|
57
|
+
this._topTaskbarProcessor.process("snkGridTopTaskbar", this.taskbarManager, this._dataState);
|
|
58
|
+
}
|
|
47
59
|
render() {
|
|
48
60
|
if (!this._configLoaded || !this._dataUnit) {
|
|
49
61
|
return undefined;
|
|
50
62
|
}
|
|
51
|
-
return (h("div", { class: "snk-grid__container ez-flex ez-flex--column ez-flex-item--auto ez-padding--large" }, h("div", { class: "snk-grid__header ez-padding-bottom--medium ez-margin-bottom--medium" }, h("snk-filter-bar", { class: "snk-grid__filter-bar ez-align--top" }), h("hr", { class: "ez-divider-vertical ez-divider--dark ez-margin-left--medium snk-grid__header-divider" }), h("snk-taskbar", { class: "ez-padding-left--medium", onActionClick: evt => this.actionClickHandler(evt), key: "topTaskbar", dataUnit: this._dataUnit, buttons:
|
|
63
|
+
return (h("div", { class: "snk-grid__container ez-flex ez-flex--column ez-flex-item--auto ez-padding--large" }, h("div", { class: "snk-grid__header ez-padding-bottom--medium ez-margin-bottom--medium" }, h("snk-filter-bar", { class: "snk-grid__filter-bar ez-align--top" }), h("hr", { class: "ez-divider-vertical ez-divider--dark ez-margin-left--medium snk-grid__header-divider" }), h("snk-taskbar", { class: "ez-padding-left--medium", onActionClick: evt => this.actionClickHandler(evt), key: "topTaskbar", dataUnit: this._dataUnit, buttons: this._topTaskbarProcessor.buttons, disabledButtons: this._topTaskbarProcessor.disabledButtons, customButtons: this._topTaskbarProcessor.customButtons, primaryButton: "INSERT" })), h("ez-grid", { ref: ref => this._grid = ref, dataUnit: this._dataUnit, key: "grid-" + this._snkDataUnit.entityName, config: this._gridConfig, onConfigChange: evt => { this.saveConfig(evt.detail); }, onEzDoubleClick: () => this.gridDoubleClick.emit() }, h("snk-taskbar", { dataUnit: this._dataUnit, buttons: this._headerTaskbarProcessor.buttons, disabledButtons: this._headerTaskbarProcessor.disabledButtons, customButtons: this._headerTaskbarProcessor.customButtons, slot: "leftButtons", actionsList: this.actionsList })), h("div", { class: "ez-col ez-col--sd-12" }, h("slot", { name: "SnkGridFooter" }))));
|
|
52
64
|
}
|
|
53
65
|
static get is() { return "snk-grid"; }
|
|
54
66
|
static get encapsulation() { return "scoped"; }
|
|
@@ -103,6 +115,26 @@ export class SnkGrid {
|
|
|
103
115
|
"tags": [],
|
|
104
116
|
"text": "Lista de a\u00E7\u00F5es que devem ser usadas no bot\u00E3o \"Mais op\u00E7\u00F5es\""
|
|
105
117
|
}
|
|
118
|
+
},
|
|
119
|
+
"taskbarManager": {
|
|
120
|
+
"type": "unknown",
|
|
121
|
+
"mutable": false,
|
|
122
|
+
"complexType": {
|
|
123
|
+
"original": "TaskbarManager",
|
|
124
|
+
"resolved": "TaskbarManager",
|
|
125
|
+
"references": {
|
|
126
|
+
"TaskbarManager": {
|
|
127
|
+
"location": "import",
|
|
128
|
+
"path": "../snk-taskbar/snk-taskbar"
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
"required": false,
|
|
133
|
+
"optional": false,
|
|
134
|
+
"docs": {
|
|
135
|
+
"tags": [],
|
|
136
|
+
"text": "Gerenciador das barras de tarefas. \u00C9 poss\u00EDvel determinar bot\u00F5es espec\u00EDficos\nou mesmo gerenciar o estado dos bot\u00F5es."
|
|
137
|
+
}
|
|
106
138
|
}
|
|
107
139
|
};
|
|
108
140
|
}
|
|
@@ -28,41 +28,59 @@ export var VisibleWhenForbidden;
|
|
|
28
28
|
(function (VisibleWhenForbidden) {
|
|
29
29
|
VisibleWhenForbidden["CONFIG_GRID"] = "CONFIG_GRID";
|
|
30
30
|
})(VisibleWhenForbidden || (VisibleWhenForbidden = {}));
|
|
31
|
+
export const buildCustomButton = (def, className, action, isEnabled) => {
|
|
32
|
+
const { hint, text, iconName } = def;
|
|
33
|
+
if (iconName) {
|
|
34
|
+
if (text) {
|
|
35
|
+
return iconTextButton(iconName, def.name, className, hint, text, action, isEnabled);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
return iconButton(iconName, def.name, className, hint, action, isEnabled);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
return textButton(def.name, className, text, hint, action, isEnabled);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
31
45
|
export const buildElem = (element, className, getTitle, action, isEnabled, actions) => {
|
|
46
|
+
const title = getTitle(element);
|
|
32
47
|
switch (element) {
|
|
33
48
|
case TaskbarElement.PREVIOUS:
|
|
34
|
-
return iconButton("chevron-left", element, className,
|
|
49
|
+
return iconButton("chevron-left", element, className, title, action, isEnabled);
|
|
35
50
|
case TaskbarElement.NEXT:
|
|
36
|
-
return iconButton("chevron-right", element, className,
|
|
51
|
+
return iconButton("chevron-right", element, className, title, action, isEnabled);
|
|
37
52
|
case TaskbarElement.REFRESH:
|
|
38
|
-
return iconButton("sync", element, className,
|
|
53
|
+
return iconButton("sync", element, className, title, action, isEnabled);
|
|
39
54
|
case TaskbarElement.UPDATE:
|
|
40
|
-
return iconButton("edit", element, className,
|
|
55
|
+
return iconButton("edit", element, className, title, action, isEnabled);
|
|
41
56
|
case TaskbarElement.CLONE:
|
|
42
|
-
return iconButton("copy", element, className,
|
|
57
|
+
return iconButton("copy", element, className, title, action, isEnabled);
|
|
43
58
|
case TaskbarElement.REMOVE:
|
|
44
|
-
return iconButton("delete", element, className,
|
|
59
|
+
return iconButton("delete", element, className, title, action, isEnabled);
|
|
45
60
|
case TaskbarElement.INSERT:
|
|
46
|
-
return iconTextButton("plus", element, className,
|
|
61
|
+
return iconTextButton("plus", element, className, title, title, action, isEnabled);
|
|
47
62
|
case TaskbarElement.CANCEL:
|
|
48
|
-
return
|
|
63
|
+
return textButton(element, className, title, title, action, isEnabled);
|
|
49
64
|
case TaskbarElement.SAVE:
|
|
50
|
-
return iconTextButton("save", element, className,
|
|
65
|
+
return iconTextButton("save", element, className, title, title, action, isEnabled);
|
|
51
66
|
case TaskbarElement.GRID_MODE:
|
|
52
|
-
return iconButton("table", element, className,
|
|
67
|
+
return iconButton("table", element, className, title, action, isEnabled);
|
|
53
68
|
case TaskbarElement.FORM_MODE:
|
|
54
|
-
return iconButton("list", element, className,
|
|
69
|
+
return iconButton("list", element, className, title, action, isEnabled);
|
|
55
70
|
case TaskbarElement.CONFIG_GRID:
|
|
56
|
-
return iconButton("settings-inverted", element, className,
|
|
71
|
+
return iconButton("settings-inverted", element, className, title, action, isEnabled);
|
|
57
72
|
case TaskbarElement.MORE_OPTIONS:
|
|
58
|
-
return actions && actions.length > 0 ? h("ez-actions-button", { title:
|
|
73
|
+
return actions && actions.length > 0 ? h("ez-actions-button", { title: title, size: "small", class: className, enabled: isEnabled(element), onEzAction: (evt) => action(evt.detail.value), actions: actions }) : undefined;
|
|
59
74
|
case TaskbarElement.DIVIDER:
|
|
60
75
|
return h("hr", { class: "ez-divider-vertical ez-divider--dark ez-margin-horizontal--medium" });
|
|
61
76
|
}
|
|
62
77
|
};
|
|
63
|
-
function
|
|
64
|
-
return h("ez-button", {
|
|
78
|
+
function textButton(name, className, text, title, action, isEnabled) {
|
|
79
|
+
return h("ez-button", { title: title, label: text, size: "small", class: className, enabled: isEnabled(name), onClick: () => action(name) });
|
|
80
|
+
}
|
|
81
|
+
function iconButton(iconName, name, className, title, action, isEnabled) {
|
|
82
|
+
return h("ez-button", { name: iconName, title: title, mode: "icon", size: "small", class: className, iconName: iconName, enabled: isEnabled(name), onClick: () => action(name) });
|
|
65
83
|
}
|
|
66
|
-
function iconTextButton(iconName,
|
|
67
|
-
return h("ez-button", {
|
|
84
|
+
function iconTextButton(iconName, name, className, text, title, action, isEnabled) {
|
|
85
|
+
return h("ez-button", { name: iconName, title: title, label: text, size: "small", class: className, enabled: isEnabled(name), onClick: () => action(name) }, h("ez-icon", { class: "ez-padding-right--small", slot: "leftIcon", iconName: iconName }));
|
|
68
86
|
}
|