@sankhyalabs/sankhyablocks 1.4.0-beta.1 → 1.4.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/dist/cjs/{SnkMessageBuilder-7717f1e4.js → SnkMessageBuilder-d8215915.js} +14 -119
  2. package/dist/cjs/{filter-item-type.enum-e2e1bc5b.js → filter-item-type.enum-3daf58d3.js} +2 -0
  3. package/dist/cjs/index-84fe3b86.js +20 -0
  4. package/dist/cjs/index-93965c41.js +141 -0
  5. package/dist/cjs/{index-02201bc9.js → index-e90ae303.js} +11 -0
  6. package/dist/cjs/loader.cjs.js +1 -1
  7. package/dist/cjs/sankhyablocks.cjs.js +1 -1
  8. package/dist/cjs/snk-application.cjs.entry.js +43 -25
  9. package/dist/cjs/snk-crud.cjs.entry.js +1 -1
  10. package/dist/cjs/snk-data-unit.cjs.entry.js +10 -18
  11. package/dist/cjs/snk-filter-bar.cjs.entry.js +334 -146
  12. package/dist/cjs/snk-filter-binary-select.cjs.entry.js +1 -1
  13. package/dist/cjs/snk-filter-detail.cjs.entry.js +37 -2
  14. package/dist/cjs/snk-filter-item.cjs.entry.js +34 -11
  15. package/dist/cjs/snk-filter-list.cjs.entry.js +1 -1
  16. package/dist/cjs/snk-filter-modal.cjs.entry.js +37 -0
  17. package/dist/cjs/snk-filter-multi-select.cjs.entry.js +1 -1
  18. package/dist/cjs/snk-filter-number.cjs.entry.js +1 -1
  19. package/dist/cjs/snk-filter-period.cjs.entry.js +1 -1
  20. package/dist/cjs/snk-filter-personalized.cjs.entry.js +89 -0
  21. package/dist/cjs/snk-filter-search.cjs.entry.js +2 -2
  22. package/dist/cjs/snk-form.cjs.entry.js +1 -1
  23. package/dist/cjs/snk-grid.cjs.entry.js +1 -1
  24. package/dist/cjs/snk-pesquisa.cjs.entry.js +1 -1
  25. package/dist/cjs/snk-taskbar.cjs.entry.js +1 -1
  26. package/dist/cjs/teste-pesquisa.cjs.entry.js +1 -1
  27. package/dist/collection/collection-manifest.json +2 -0
  28. package/dist/collection/components/snk-application/snk-application.js +54 -7
  29. package/dist/collection/components/snk-crud/snk-crud.js +2 -4
  30. package/dist/collection/components/snk-data-unit/snk-data-unit.js +0 -27
  31. package/dist/collection/components/snk-filter-bar/filter-item/dataunitfilter/data-unit-filter-builder.js +100 -0
  32. package/dist/collection/components/snk-filter-bar/filter-item/editors/snk-filter-personalized.js +161 -0
  33. package/dist/collection/components/snk-filter-bar/filter-item/filter-item-type.enum.js +2 -0
  34. package/dist/collection/components/snk-filter-bar/filter-item/snk-filter-detail.js +36 -1
  35. package/dist/collection/components/snk-filter-bar/filter-item/snk-filter-item.js +32 -9
  36. package/dist/collection/components/snk-filter-bar/filter-modal/snk-filter-modal.js +196 -0
  37. package/dist/collection/components/snk-filter-bar/snk-filter-bar.css +22 -0
  38. package/dist/collection/components/snk-filter-bar/snk-filter-bar.js +238 -139
  39. package/dist/collection/components/snk-grid/snk-grid.js +2 -4
  40. package/dist/collection/lib/http/data-fetcher/fetchers/filter-bar-config-fetcher.js +18 -10
  41. package/dist/collection/lib/message/resources/snk-filter-bar.msg.js +14 -2
  42. package/dist/components/SnkMessageBuilder.js +15 -119
  43. package/dist/components/filter-item-type.enum.js +2 -0
  44. package/dist/components/index.d.ts +2 -0
  45. package/dist/components/index.js +2 -0
  46. package/dist/components/index2.js +11 -1
  47. package/dist/components/index3.js +139 -0
  48. package/dist/components/snk-application2.js +39 -19
  49. package/dist/components/snk-crud.js +15 -9
  50. package/dist/components/snk-data-unit.js +2 -11
  51. package/dist/components/snk-filter-bar2.js +340 -146
  52. package/dist/components/snk-filter-detail2.js +36 -1
  53. package/dist/components/snk-filter-item2.js +32 -9
  54. package/dist/components/snk-filter-list2.js +1 -1
  55. package/dist/components/snk-filter-modal.d.ts +11 -0
  56. package/dist/components/snk-filter-modal.js +6 -0
  57. package/dist/components/snk-filter-modal2.js +73 -0
  58. package/dist/components/snk-filter-personalized.d.ts +11 -0
  59. package/dist/components/snk-filter-personalized.js +107 -0
  60. package/dist/components/snk-grid2.js +15 -9
  61. package/dist/{sankhyablocks/SnkMessageBuilder-a7da466b.js → esm/SnkMessageBuilder-35a20271.js} +15 -119
  62. package/dist/esm/{filter-item-type.enum-61fbf80a.js → filter-item-type.enum-a79b2fa8.js} +2 -0
  63. package/dist/esm/index-5992b7e6.js +139 -0
  64. package/dist/esm/{index-f1d3e4da.js → index-c683b2b0.js} +11 -1
  65. package/dist/esm/index-c71285cb.js +17 -0
  66. package/dist/esm/loader.js +1 -1
  67. package/dist/esm/sankhyablocks.js +1 -1
  68. package/dist/esm/snk-application.entry.js +37 -19
  69. package/dist/esm/snk-crud.entry.js +1 -1
  70. package/dist/esm/snk-data-unit.entry.js +3 -11
  71. package/dist/esm/snk-filter-bar.entry.js +328 -140
  72. package/dist/esm/snk-filter-binary-select.entry.js +1 -1
  73. package/dist/esm/snk-filter-detail.entry.js +37 -2
  74. package/dist/esm/snk-filter-item.entry.js +34 -11
  75. package/dist/esm/snk-filter-list.entry.js +1 -1
  76. package/dist/esm/snk-filter-modal.entry.js +33 -0
  77. package/dist/esm/snk-filter-multi-select.entry.js +1 -1
  78. package/dist/esm/snk-filter-number.entry.js +1 -1
  79. package/dist/esm/snk-filter-period.entry.js +1 -1
  80. package/dist/esm/snk-filter-personalized.entry.js +85 -0
  81. package/dist/esm/snk-filter-search.entry.js +2 -2
  82. package/dist/esm/snk-form.entry.js +1 -1
  83. package/dist/esm/snk-grid.entry.js +1 -1
  84. package/dist/esm/snk-pesquisa.entry.js +1 -1
  85. package/dist/esm/snk-taskbar.entry.js +1 -1
  86. package/dist/esm/teste-pesquisa.entry.js +1 -1
  87. package/dist/{esm/SnkMessageBuilder-a7da466b.js → sankhyablocks/SnkMessageBuilder-35a20271.js} +15 -119
  88. package/dist/sankhyablocks/{filter-item-type.enum-61fbf80a.js → filter-item-type.enum-a79b2fa8.js} +2 -0
  89. package/dist/sankhyablocks/index-5992b7e6.js +139 -0
  90. package/dist/sankhyablocks/{index-f1d3e4da.js → index-c683b2b0.js} +11 -1
  91. package/dist/sankhyablocks/index-c71285cb.js +17 -0
  92. package/dist/sankhyablocks/sankhyablocks.esm.js +1 -1
  93. package/dist/sankhyablocks/snk-application.entry.js +37 -19
  94. package/dist/sankhyablocks/snk-crud.entry.js +1 -1
  95. package/dist/sankhyablocks/snk-data-unit.entry.js +3 -11
  96. package/dist/sankhyablocks/snk-filter-bar.entry.js +328 -140
  97. package/dist/sankhyablocks/snk-filter-binary-select.entry.js +1 -1
  98. package/dist/sankhyablocks/snk-filter-detail.entry.js +37 -2
  99. package/dist/sankhyablocks/snk-filter-item.entry.js +34 -11
  100. package/dist/sankhyablocks/snk-filter-list.entry.js +1 -1
  101. package/dist/sankhyablocks/snk-filter-modal.entry.js +33 -0
  102. package/dist/sankhyablocks/snk-filter-multi-select.entry.js +1 -1
  103. package/dist/sankhyablocks/snk-filter-number.entry.js +1 -1
  104. package/dist/sankhyablocks/snk-filter-period.entry.js +1 -1
  105. package/dist/sankhyablocks/snk-filter-personalized.entry.js +85 -0
  106. package/dist/sankhyablocks/snk-filter-search.entry.js +2 -2
  107. package/dist/sankhyablocks/snk-form.entry.js +1 -1
  108. package/dist/sankhyablocks/snk-grid.entry.js +1 -1
  109. package/dist/sankhyablocks/snk-pesquisa.entry.js +1 -1
  110. package/dist/sankhyablocks/snk-taskbar.entry.js +1 -1
  111. package/dist/sankhyablocks/teste-pesquisa.entry.js +1 -1
  112. package/dist/types/components/snk-application/snk-application.d.ts +4 -1
  113. package/dist/types/components/snk-filter-bar/filter-item/dataunitfilter/data-unit-filter-builder.d.ts +4 -0
  114. package/dist/types/components/snk-filter-bar/filter-item/editors/snk-filter-personalized.d.ts +23 -0
  115. package/dist/types/components/snk-filter-bar/filter-item/filter-item-type.enum.d.ts +3 -1
  116. package/dist/types/components/snk-filter-bar/filter-item/snk-filter-detail.d.ts +2 -0
  117. package/dist/types/components/snk-filter-bar/filter-modal/snk-filter-modal.d.ts +23 -0
  118. package/dist/types/components.d.ts +56 -8
  119. package/package.json +3 -3
  120. package/dist/types/components/snk-filter-bar/snk-filter-bar.d.ts +0 -51
@@ -1,13 +1,17 @@
1
1
  import { h, Host } from '@stencil/core';
2
- import { ApplicationContext, DataType, ErrorException, ObjectUtils } from '@sankhyalabs/core';
2
+ import { ApplicationContext, ErrorException, ObjectUtils, StringUtils } from '@sankhyalabs/core';
3
3
  import FilterItemType from './filter-item/filter-item-type.enum';
4
- import { toString } from '@sankhyalabs/core/dist/dataunit/metadata/DataType';
4
+ import { ModalAction } from '@sankhyalabs/ezui/dist/collection/components/ez-modal-container';
5
+ import buildFilter from './filter-item/dataunitfilter/data-unit-filter-builder';
5
6
  const PERSONALIZED_FILTER = "PERSONALIZED_FILTER";
6
7
  const DEFAULT_FILTER = "DEFAULT_FILTER";
7
8
  const CLEAR_ALL_FILTERS = "CLEAR_ALL_FILTERS";
8
9
  export class SnkFilterBar {
9
10
  constructor() {
10
11
  this._updateSequence = [];
12
+ this._loadingPending = false;
13
+ this._configUpdated = false;
14
+ this._pendingFilters = [];
11
15
  this._calculateSortIndex = (item) => {
12
16
  let index = item.hardFixed ? 1000000 : 0;
13
17
  //campos Hard Fixed não variam a ordem
@@ -22,6 +26,54 @@ export class SnkFilterBar {
22
26
  return this._calculateSortIndex(b) - this._calculateSortIndex(a);
23
27
  };
24
28
  }
29
+ observeFilterConfig(newValue, oldValue) {
30
+ if (oldValue != undefined && newValue == undefined) {
31
+ this._loadingPending = true;
32
+ this._configUpdated = true;
33
+ }
34
+ else {
35
+ const oldItems = new Map(oldValue ? oldValue.map(item => [item.id, item]) : undefined);
36
+ newValue.forEach(newItem => {
37
+ const oldItem = oldItems.get(newItem.id);
38
+ if (oldItem != undefined) {
39
+ this._configUpdated = this._configUpdated || ObjectUtils.objectToString(oldItem) != ObjectUtils.objectToString(newItem);
40
+ this._loadingPending = this._loadingPending || ObjectUtils.objectToString(oldItem.value) !== ObjectUtils.objectToString(newItem.value);
41
+ }
42
+ else {
43
+ this._configUpdated = true;
44
+ this._loadingPending = this._loadingPending || newItem.value != undefined;
45
+ }
46
+ });
47
+ }
48
+ this.processAfterUpdateConfig();
49
+ }
50
+ processPendingFilter() {
51
+ if (this._pendingFilters.length > 0 && this._currentPendingFilter == undefined) {
52
+ this._currentPendingFilter = this._element.querySelector("#filter-" + this._pendingFilters.pop());
53
+ if (this._currentPendingFilter) {
54
+ this._currentPendingFilter.showUp(true).then(() => {
55
+ this._currentPendingFilter = undefined;
56
+ this.processPendingFilter();
57
+ });
58
+ }
59
+ }
60
+ if (this._currentPendingFilter == undefined) {
61
+ this.processAfterUpdateConfig();
62
+ }
63
+ }
64
+ processAfterUpdateConfig() {
65
+ if (this._pendingFilters.length > 0) {
66
+ return;
67
+ }
68
+ if (this._loadingPending) {
69
+ this._loadingPending = false;
70
+ this.dataUnit.loadData();
71
+ }
72
+ if (this._configUpdated) {
73
+ this._configUpdated = false;
74
+ this._application.saveFilterBarConfig(this.filterConfig, this.configName);
75
+ }
76
+ }
25
77
  /**
26
78
  * Conforme mecanismo de mensagens, é possível customizar as mensagens dos blocos de construção
27
79
  * através de um pequeno modulo na estrutura da aplicação:
@@ -34,101 +86,21 @@ export class SnkFilterBar {
34
86
  getFilter(_dataUnit) {
35
87
  var _a;
36
88
  const filters = [];
37
- (_a = this.filterConfig) === null || _a === void 0 ? void 0 : _a.filter(item => item.value).forEach(item => {
38
- const filter = this.buildDUFilter(item);
89
+ (_a = this.filterConfig) === null || _a === void 0 ? void 0 : _a.filter(item => this.isActiveFilter(item)).forEach(item => {
90
+ const filter = buildFilter(item);
39
91
  if (filter) {
40
92
  filters.push(filter);
41
93
  }
42
94
  });
43
95
  return filters;
44
96
  }
45
- buildDUFilter(item) {
46
- const { id, value, type, props, visible } = item;
47
- if (value && visible) {
48
- if (type === FilterItemType.BINARY_SELECT) {
49
- const options = props.options;
50
- const selectedOption = options.find(opt => opt.name === value);
51
- //FIXME: ajustar o backend para não exigir parametros
52
- return { name: id, expression: selectedOption.expression, params: [] };
53
- }
54
- if (type === FilterItemType.MULTI_SELECT) {
55
- return { name: id, expression: props.expression, params: [{ name: id, dataType: DataType.TEXT, value }] };
56
- }
57
- if (type === FilterItemType.PERIOD) {
58
- let { end, start } = value;
59
- if (typeof end === "string") {
60
- end = new Date(end);
61
- }
62
- if (typeof start === "string") {
63
- start = new Date(start);
64
- }
65
- const params = [];
66
- let expression;
67
- if (end && start) {
68
- expression = props.expression.fullfill;
69
- params.push({ name: `${id}.START`, dataType: DataType.DATE, value: toString(DataType.DATE, start) }, { name: `${id}.END`, dataType: DataType.DATE, value: toString(DataType.DATE, end) });
70
- }
71
- else {
72
- if (start) {
73
- expression = props.expression.onlystart;
74
- params.push({ name: id, dataType: DataType.DATE, value: toString(DataType.DATE, start) });
75
- }
76
- else {
77
- expression = props.expression.onlyend;
78
- params.push({ name: id, dataType: DataType.DATE, value: toString(DataType.DATE, end) });
79
- }
80
- }
81
- return { name: id, expression, params };
82
- }
83
- if (type === FilterItemType.SEARCH) {
84
- const expression = props.expression;
85
- return { name: id, expression, params: [{ name: id, dataType: DataType.TEXT, value: toString(DataType.TEXT, value.value) }] };
86
- }
87
- if (type === FilterItemType.TEXT) {
88
- const expression = props.expression;
89
- return { name: id, expression, params: [{ name: id, dataType: DataType.TEXT, value: toString(DataType.TEXT, value) }] };
90
- }
91
- if (type === FilterItemType.NUMBER) {
92
- const expression = props.expression;
93
- return { name: id, expression, params: [{ name: id, dataType: DataType.NUMBER, value: toString(DataType.NUMBER, value) }] };
94
- }
95
- //No mapeamento dos outros tipos precisamos saber o tipo de dado.
96
- }
97
- return undefined;
97
+ isActiveFilter(item) {
98
+ return (item.visible && item.value != undefined) || item.type === FilterItemType.DEFAULT_FILTER;
98
99
  }
99
- componentWillLoad() {
100
- this._application = ApplicationContext.getContextValue("__SNK__APPLICATION__");
101
- if (this._application) {
102
- this._application.getFilterBarConfig(this.configName)
103
- .then((filters) => {
104
- this.filterConfig = filters;
105
- })
106
- .catch(reason => {
107
- throw new ErrorException(this.getMessage("snkFilterBar.failToLoadConfig"), reason);
108
- });
109
- }
110
- if (this.dataUnit == undefined) {
111
- let parent = this._element.parentElement;
112
- while (parent) {
113
- if (parent.tagName.toUpperCase() === "SNK-DATA-UNIT") {
114
- const snkDataUnit = parent;
115
- this.dataUnit = snkDataUnit.dataUnit;
116
- if (this.dataUnit) {
117
- this.dataUnit.addFilterProvider(this);
118
- }
119
- else {
120
- snkDataUnit.addEventListener("dataUnitReady", (evt) => {
121
- this.dataUnit = evt.detail;
122
- this.dataUnit.addFilterProvider(this);
123
- });
124
- }
125
- break;
126
- }
127
- }
128
- parent = parent.parentElement;
129
- }
130
- else {
131
- this.dataUnit.addFilterProvider(this);
100
+ registryFilterProvider() {
101
+ this.dataUnit.addFilterProvider(this);
102
+ if (this.filterConfig) {
103
+ this.dataUnit.loadData();
132
104
  }
133
105
  }
134
106
  getFilterItems() {
@@ -136,9 +108,8 @@ export class SnkFilterBar {
136
108
  const unpinnedItems = [];
137
109
  this.filterConfig
138
110
  .filter(item => item.visible)
139
- .sort((a, b) => this._filtersComparator(a, b))
140
111
  .forEach((item, index) => {
141
- const filterItem = (h("snk-filter-item", { id: `filter-${item.id}`, config: this.normalizeItem(item), class: index > 0 ? "ez-padding-left--medium" : "", getMessage: (key, props) => this.getMessage(key, props), key: item.id }));
112
+ 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 }));
142
113
  if (item.fixed || item.hardFixed) {
143
114
  pinnedItems.push(filterItem);
144
115
  }
@@ -161,9 +132,6 @@ export class SnkFilterBar {
161
132
  this._updateSequence.push(item.id);
162
133
  }
163
134
  }
164
- filterChangeListener(evt) {
165
- this.updateFilter(evt.detail);
166
- }
167
135
  normalizeItem(item) {
168
136
  const normalized = Object.assign({}, item);
169
137
  const optionals = ["props", "value", "hardFixed", "fixed"];
@@ -177,87 +145,207 @@ export class SnkFilterBar {
177
145
  }
178
146
  return normalized;
179
147
  }
180
- updateFilter(newItem, clear = false) {
181
- let needLoad = false;
182
- let updated = false;
148
+ updateFilter(newItem) {
183
149
  this.filterConfig = this.filterConfig.map(item => {
184
- if (clear) {
185
- if (item.value != undefined) {
186
- updated = true;
187
- needLoad = true;
188
- }
189
- return Object.assign(Object.assign({}, item), { value: undefined });
190
- }
191
- else {
192
- if (item.id === newItem.id) {
193
- const normalizedOne = this.normalizeItem(item);
194
- const normalizedTwo = this.normalizeItem(newItem);
195
- updated = ObjectUtils.objectToString(normalizedOne) != ObjectUtils.objectToString(normalizedTwo);
196
- needLoad = ObjectUtils.objectToString(normalizedOne.value) !== ObjectUtils.objectToString(normalizedTwo.value);
197
- return newItem;
150
+ newItem = this.normalizeItem(newItem);
151
+ if (item.id === newItem.id) {
152
+ if (ObjectUtils.objectToString(item) != ObjectUtils.objectToString(newItem)) {
153
+ this.calculateUpdateSequence(newItem);
198
154
  }
155
+ return newItem;
199
156
  }
200
157
  return item;
201
- });
202
- if (needLoad) {
203
- this.dataUnit.loadData();
204
- }
205
- if (updated) {
206
- this.calculateUpdateSequence(newItem);
207
- this._application.saveFilterBarConfig(this.filterConfig, this.configName);
208
- }
209
- return needLoad;
158
+ }).sort((a, b) => this._filtersComparator(a, b));
210
159
  }
211
160
  getAddListItems() {
212
161
  const hiddenItems = this.filterConfig
213
- .filter(item => !item.visible)
214
- .sort(this._filtersComparator);
215
- return hiddenItems.map(filter => {
216
- return { name: filter.id, label: filter.label, kind: "FILTER", iconName: null };
217
- }).concat([
218
- { name: PERSONALIZED_FILTER, label: this.getMessage("snkFilterBar.customFilter"), iconName: "tune", kind: "FOOTER" },
219
- { name: DEFAULT_FILTER, label: this.getMessage("snkFilterBar.defaultFilter"), iconName: "configuration", kind: "FOOTER" }
220
- ]);
162
+ .filter(item => !item.visible && this.isListable(item));
163
+ const footerItems = [{ name: PERSONALIZED_FILTER, label: this.getMessage("snkFilterBar.customFilter"), iconName: "tune", kind: "FOOTER" }];
164
+ if (this.allowDefault) {
165
+ footerItems.push({ name: DEFAULT_FILTER, label: this.getMessage("snkFilterBar.defaultFilter"), iconName: "configuration", kind: "FOOTER" });
166
+ }
167
+ return hiddenItems.map(filter => { return { name: filter.id, label: filter.label, kind: "FILTER", iconName: null }; })
168
+ .concat(footerItems);
221
169
  }
222
170
  getActiveClass() {
223
171
  const filterApplied = this.filterConfig.filter(item => item.value != undefined).length > 0;
224
172
  return filterApplied ? "sc-snk-filter-bar snk-filter-bar__filter-list-items-button--active" : "";
225
173
  }
174
+ isListable(item, allowPersonalized = false) {
175
+ return item.type !== FilterItemType.DEFAULT_FILTER && (allowPersonalized || item.type !== FilterItemType.PERSONALIZED);
176
+ }
226
177
  getAppliedListItems() {
227
178
  const appliedItems = this.filterConfig
228
- .filter(item => item.value != undefined)
229
- .sort(this._filtersComparator);
179
+ .filter(item => this.isActiveFilter(item) && this.isListable(item, true));
230
180
  return appliedItems.map(filter => {
231
181
  return { name: filter.id, label: filter.label, kind: "FILTER", iconName: null };
232
182
  }).concat([
233
183
  { name: CLEAR_ALL_FILTERS, label: this.getMessage("snkFilterBar.clearAllFilters"), iconName: "cleaning", kind: "FOOTER" }
234
184
  ]);
235
185
  }
186
+ addPersonalizedFilters(personalizedItems) {
187
+ const activeFilters = {};
188
+ personalizedItems.forEach(item => {
189
+ if (item.active) {
190
+ activeFilters[item.id] = true;
191
+ }
192
+ });
193
+ this.filterConfig = this.filterConfig.map(item => {
194
+ var _a, _b;
195
+ if (item.type === FilterItemType.PERSONALIZED) {
196
+ const visible = activeFilters[item.id];
197
+ if (!item.visible && visible) {
198
+ this.calculateUpdateSequence(item);
199
+ if (((_b = (_a = item.props) === null || _a === void 0 ? void 0 : _a.personalizedFilter) === null || _b === void 0 ? void 0 : _b.parameters) != undefined) {
200
+ this._pendingFilters.push(item.id);
201
+ }
202
+ }
203
+ return this.normalizeItem(visible ? Object.assign(Object.assign({}, item), { visible }) : Object.assign(Object.assign({}, item), { visible, value: undefined, fixed: undefined }));
204
+ }
205
+ return item;
206
+ }).sort((a, b) => this._filtersComparator(a, b));
207
+ }
208
+ openDefaultFilterModal() {
209
+ const filterModal = document.createElement("snk-filter-modal");
210
+ const defaultFilter = this.filterConfig.filter(item => item.type === FilterItemType.DEFAULT_FILTER);
211
+ filterModal.getMessage = (key, props) => this.getMessage(key, props);
212
+ filterModal.modalTitle = this.getMessage("snkFilterBar.modalDefaultFilterTitle");
213
+ filterModal.infoText = this.getMessage(defaultFilter.length == 0 ? "snkFilterBar.modalInfoTextCreateDefault" : "snkFilterBar.modalInfoTextEditDefault");
214
+ filterModal.items = defaultFilter.map(item => {
215
+ return { id: item.id, active: true, enabled: false, label: item.label };
216
+ });
217
+ filterModal.processModalAction = (_action) => {
218
+ this._application.closeModal();
219
+ };
220
+ this._application.showModal(filterModal);
221
+ }
222
+ openPersonalizedModal() {
223
+ const filterModal = document.createElement("snk-filter-modal");
224
+ const personalizedFilter = this.filterConfig
225
+ .filter(item => item.type === FilterItemType.PERSONALIZED)
226
+ .sort((itemA, itemB) => StringUtils.compare(itemA.label, itemB.label));
227
+ filterModal.getMessage = (key, props) => this.getMessage(key, props);
228
+ filterModal.modalTitle = this.getMessage("snkFilterBar.modalPersonalizedFilterTitle");
229
+ filterModal.modalSubTitle = this.getMessage("snkFilterBar.modalPersonalizedFilterSubTitle");
230
+ filterModal.okButtonLabel = this.getMessage("snkFilterBar.modalOkButtonLabel");
231
+ filterModal.cancelButtonLabel = this.getMessage("snkFilterBar.modalCancelButtonLabel");
232
+ filterModal.infoText = this.getMessage("snkFilterBar.modalInfoTextCreateEditPersonalized");
233
+ filterModal.useSearch = true;
234
+ filterModal.items = personalizedFilter.map(item => {
235
+ return { id: item.id, active: item.visible, enabled: true, label: item.label };
236
+ });
237
+ filterModal.processModalAction = (action) => {
238
+ if (action === ModalAction.CANCEL) {
239
+ // O Botão de cancelar, tem efeito específico:
240
+ // - Desmarcar todos os filtros personalizados.
241
+ filterModal.items = filterModal.items.map(item => {
242
+ return Object.assign(Object.assign({}, item), { active: false });
243
+ });
244
+ }
245
+ else {
246
+ if (action === ModalAction.OK) {
247
+ this.addPersonalizedFilters(filterModal.items);
248
+ }
249
+ this._application.closeModal();
250
+ }
251
+ };
252
+ this._application.showModal(filterModal);
253
+ }
254
+ clearFilters() {
255
+ let changed = false;
256
+ this.filterConfig = this.filterConfig.map(item => {
257
+ if (item.value != undefined) {
258
+ changed = true;
259
+ }
260
+ return Object.assign(Object.assign({}, item), { value: undefined });
261
+ }).sort((a, b) => this._filtersComparator(a, b));
262
+ return changed;
263
+ }
264
+ loadPermitions() {
265
+ this._application.isUserSup().then(value => this.allowDefault = value);
266
+ }
267
+ loadConfigFromApplication() {
268
+ this._application.getFilterBarConfig(this.configName)
269
+ .then((filters) => {
270
+ this.filterConfig = filters.map(item => this.normalizeItem(item));
271
+ if (this.dataUnit) {
272
+ this.dataUnit.loadData();
273
+ }
274
+ })
275
+ .catch(reason => {
276
+ throw new ErrorException(this.getMessage("snkFilterBar.failToLoadConfig"), reason);
277
+ });
278
+ }
279
+ attachDataUnit() {
280
+ if (this.dataUnit == undefined) {
281
+ let parent = this._element.parentElement;
282
+ while (parent) {
283
+ if (parent.tagName.toUpperCase() === "SNK-DATA-UNIT") {
284
+ const snkDataUnit = parent;
285
+ this.dataUnit = snkDataUnit.dataUnit;
286
+ if (this.dataUnit) {
287
+ this.registryFilterProvider();
288
+ }
289
+ else {
290
+ snkDataUnit.addEventListener("dataUnitReady", (evt) => {
291
+ this.dataUnit = evt.detail;
292
+ this.registryFilterProvider();
293
+ });
294
+ }
295
+ break;
296
+ }
297
+ }
298
+ parent = parent.parentElement;
299
+ }
300
+ else {
301
+ this.registryFilterProvider();
302
+ }
303
+ }
304
+ filterChangeListener(evt) {
305
+ this.updateFilter(evt.detail);
306
+ }
236
307
  addFilterHandler(itemName) {
237
308
  const filterItem = this.filterConfig.find(currentFilter => currentFilter.id === itemName);
238
- if (filterItem) {
309
+ if (itemName === PERSONALIZED_FILTER) {
310
+ this.openPersonalizedModal();
311
+ }
312
+ else if (itemName === DEFAULT_FILTER) {
313
+ this.openDefaultFilterModal();
314
+ }
315
+ else if (filterItem) {
239
316
  this.updateFilter(Object.assign(Object.assign({}, filterItem), { visible: true }));
240
317
  window.requestAnimationFrame(() => {
241
- const itemElement = this._element.querySelector("#filter-" + itemName);
242
- if (itemElement) {
243
- itemElement.showUp();
318
+ const filterItemElement = this._element.querySelector("#filter-" + itemName);
319
+ if (filterItemElement) {
320
+ filterItemElement.showUp();
244
321
  }
245
322
  });
246
323
  }
247
324
  }
248
325
  appliedFilterHandler(itemName) {
249
326
  if (itemName === CLEAR_ALL_FILTERS) {
250
- if (this.updateFilter(null, true)) {
327
+ if (this.clearFilters()) {
251
328
  this._application.info(this.getMessage("snkFilterBar.successfullyCleaned"), { iconName: "check" });
252
329
  }
253
330
  }
254
331
  else {
255
- const itemElement = this._element.querySelector("#filter-" + itemName);
256
- if (itemElement) {
257
- itemElement.showUp(true);
332
+ const filterItemElement = this._element.querySelector("#filter-" + itemName);
333
+ if (filterItemElement) {
334
+ filterItemElement.showUp(true);
258
335
  }
259
336
  }
260
337
  }
338
+ componentWillLoad() {
339
+ this._application = ApplicationContext.getContextValue("__SNK__APPLICATION__");
340
+ if (this._application) {
341
+ this.loadPermitions();
342
+ this.loadConfigFromApplication();
343
+ }
344
+ this.attachDataUnit();
345
+ }
346
+ componentDidRender() {
347
+ this.processPendingFilter();
348
+ }
261
349
  render() {
262
350
  if (!this.dataUnit || !this.filterConfig || this.filterConfig.length === 0) {
263
351
  return undefined;
@@ -340,7 +428,18 @@ export class SnkFilterBar {
340
428
  }
341
429
  };
342
430
  }
431
+ static get states() {
432
+ return {
433
+ "allowDefault": {}
434
+ };
435
+ }
343
436
  static get elementRef() { return "_element"; }
437
+ static get watchers() {
438
+ return [{
439
+ "propName": "filterConfig",
440
+ "methodName": "observeFilterConfig"
441
+ }];
442
+ }
344
443
  static get listeners() {
345
444
  return [{
346
445
  "name": "filterChange",
@@ -137,7 +137,7 @@ export class SnkGrid {
137
137
  }
138
138
  },
139
139
  "statusResolver": {
140
- "type": "any",
140
+ "type": "unknown",
141
141
  "mutable": false,
142
142
  "complexType": {
143
143
  "original": "IStatusResolver",
@@ -154,9 +154,7 @@ export class SnkGrid {
154
154
  "docs": {
155
155
  "tags": [],
156
156
  "text": "Configura\u00E7\u00E3o do valor da coluna de status.\nExemplo: { \"RECDESP\": { \"-1\" : \"#BD0025\", \"1\" : \"#157A00\" } }"
157
- },
158
- "attribute": "status-resolver",
159
- "reflect": false
157
+ }
160
158
  }
161
159
  };
162
160
  }
@@ -1,19 +1,27 @@
1
1
  import { ResourceFetcher } from "./resource-fetcher";
2
2
  function normalizeValue(value) {
3
+ if (value == undefined) {
4
+ return value;
5
+ }
3
6
  if (value instanceof Date) {
4
7
  return value.toISOString();
5
8
  }
6
9
  if (typeof value === "object") {
7
- const normalized = Object.assign({}, value);
8
- Object.keys(value).forEach(prop => {
9
- if (value[prop]) {
10
- normalized[prop] = normalizeValue(value[prop]);
11
- }
12
- else {
13
- delete normalized[prop];
14
- }
15
- });
16
- return normalized;
10
+ if (value instanceof Array) {
11
+ return value.map(item => normalizeValue(item));
12
+ }
13
+ else {
14
+ const normalized = Object.assign({}, value);
15
+ Object.keys(value).forEach(prop => {
16
+ if (value[prop]) {
17
+ normalized[prop] = normalizeValue(value[prop]);
18
+ }
19
+ else {
20
+ delete normalized[prop];
21
+ }
22
+ });
23
+ return normalized;
24
+ }
17
25
  }
18
26
  return value;
19
27
  }
@@ -7,12 +7,24 @@ const snkFilterBarMessages = {
7
7
  "applyFilter": "Aplicar",
8
8
  "findFilter": "Buscar filtros...",
9
9
  "findField": "Buscar filtros...",
10
+ "modalFindFilter": "Buscar filtro",
10
11
  "emptyFiltersList": "Não há filtros disponíveis",
11
12
  "emptyAppliedFiltersList": "Não há filtros aplicados",
12
13
  "customFilter": "Filtro personalizado",
13
- "defaultFilter": "Filtro padrao",
14
+ "defaultFilter": "Filtro padrão",
14
15
  "failToLoadConfig": "Falha ao buscar configuração de filtros",
15
16
  "clearAllFilters": "Limpar todos os filtros",
16
- "successfullyCleaned": "Filtro limpo com sucesso!"
17
+ "successfullyCleaned": "Filtro limpo com sucesso!",
18
+ "activeFilter": "{{ACTIVE_FILTERS}} filtro aplicado",
19
+ "activeFilters": "{{ACTIVE_FILTERS}} filtros aplicados",
20
+ "noActiveFilters": "Nenhum filtro aplicado",
21
+ "modalDefaultFilterTitle": "Filtro padrão",
22
+ "modalInfoTextEditDefault": "Use o layout antigo para editar o seu filtro padrão, em breve traremos uma nova experiência.",
23
+ "modalInfoTextCreateDefault": "Use o layout antigo para criar o seu filtro padrão, em breve traremos uma nova experiência.",
24
+ "modalPersonalizedFilterTitle": "Filtro personalizado",
25
+ "modalPersonalizedFilterSubTitle": "Gerencie seus filtros",
26
+ "modalInfoTextCreateEditPersonalized": "Use o layout antigo para criar ou editar filtros, em breve traremos uma nova experiência",
27
+ "modalOkButtonLabel": "Aplicar",
28
+ "modalCancelButtonLabel": "Limpar"
17
29
  };
18
30
  export default snkFilterBarMessages;