@sapui5/sap.fe.templates 1.103.0 → 1.104.1

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 (80) hide show
  1. package/package.json +3 -4
  2. package/src/sap/fe/templates/.library +1 -1
  3. package/src/sap/fe/templates/ListReport/ListReport.view.xml +1 -2
  4. package/src/sap/fe/templates/ListReport/ListReportController.controller.js +60 -296
  5. package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +52 -264
  6. package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.js +367 -0
  7. package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.ts +259 -0
  8. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +16 -9
  9. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.ts +15 -9
  10. package/src/sap/fe/templates/ListReport/overrides/ViewState.js +19 -27
  11. package/src/sap/fe/templates/ListReport/overrides/ViewState.ts +23 -27
  12. package/src/sap/fe/templates/ListReport/view/fragments/CollectionVisualization.fragment.xml +1 -1
  13. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.js +19 -3
  14. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.ts +75 -47
  15. package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +1 -1
  16. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +149 -108
  17. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +56 -62
  18. package/src/sap/fe/templates/ObjectPage/components/DraftHandlerButton.tsx +132 -0
  19. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.js +1 -1
  20. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.ts +1 -1
  21. package/src/sap/fe/templates/ObjectPage/overrides/Share.js +55 -29
  22. package/src/sap/fe/templates/ObjectPage/overrides/Share.ts +28 -29
  23. package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +2 -14
  24. package/src/sap/fe/templates/ObjectPage/view/fragments/EditableHeaderFacet.fragment.xml +5 -3
  25. package/src/sap/fe/templates/ObjectPage/view/fragments/FooterContent.fragment.xml +1 -1
  26. package/src/sap/fe/templates/controls/Table.fragment.xml +1 -1
  27. package/src/sap/fe/templates/library.js +4 -3
  28. package/src/sap/fe/templates/library.ts +2 -0
  29. package/src/sap/fe/templates/messagebundle.properties +2 -5
  30. package/src/sap/fe/templates/messagebundle_ar.properties +3 -12
  31. package/src/sap/fe/templates/messagebundle_bg.properties +0 -9
  32. package/src/sap/fe/templates/messagebundle_ca.properties +2 -11
  33. package/src/sap/fe/templates/messagebundle_cs.properties +3 -12
  34. package/src/sap/fe/templates/messagebundle_cy.properties +0 -9
  35. package/src/sap/fe/templates/messagebundle_da.properties +3 -12
  36. package/src/sap/fe/templates/messagebundle_de.properties +2 -11
  37. package/src/sap/fe/templates/messagebundle_el.properties +2 -11
  38. package/src/sap/fe/templates/messagebundle_en.properties +2 -11
  39. package/src/sap/fe/templates/messagebundle_en_GB.properties +2 -11
  40. package/src/sap/fe/templates/messagebundle_en_US_sappsd.properties +2 -11
  41. package/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +2 -11
  42. package/src/sap/fe/templates/messagebundle_en_US_saptrc.properties +1 -5
  43. package/src/sap/fe/templates/messagebundle_es.properties +0 -9
  44. package/src/sap/fe/templates/messagebundle_es_MX.properties +2 -11
  45. package/src/sap/fe/templates/messagebundle_et.properties +0 -9
  46. package/src/sap/fe/templates/messagebundle_fi.properties +2 -11
  47. package/src/sap/fe/templates/messagebundle_fr.properties +3 -12
  48. package/src/sap/fe/templates/messagebundle_fr_CA.properties +2 -11
  49. package/src/sap/fe/templates/messagebundle_hi.properties +2 -11
  50. package/src/sap/fe/templates/messagebundle_hr.properties +2 -11
  51. package/src/sap/fe/templates/messagebundle_hu.properties +2 -11
  52. package/src/sap/fe/templates/messagebundle_id.properties +2 -11
  53. package/src/sap/fe/templates/messagebundle_it.properties +2 -11
  54. package/src/sap/fe/templates/messagebundle_iw.properties +2 -11
  55. package/src/sap/fe/templates/messagebundle_ja.properties +2 -11
  56. package/src/sap/fe/templates/messagebundle_kk.properties +2 -11
  57. package/src/sap/fe/templates/messagebundle_ko.properties +2 -11
  58. package/src/sap/fe/templates/messagebundle_lt.properties +2 -11
  59. package/src/sap/fe/templates/messagebundle_lv.properties +0 -9
  60. package/src/sap/fe/templates/messagebundle_ms.properties +2 -11
  61. package/src/sap/fe/templates/messagebundle_nl.properties +2 -11
  62. package/src/sap/fe/templates/messagebundle_no.properties +0 -9
  63. package/src/sap/fe/templates/messagebundle_pl.properties +0 -9
  64. package/src/sap/fe/templates/messagebundle_pt.properties +2 -11
  65. package/src/sap/fe/templates/messagebundle_pt_PT.properties +2 -11
  66. package/src/sap/fe/templates/messagebundle_ro.properties +0 -9
  67. package/src/sap/fe/templates/messagebundle_ru.properties +2 -11
  68. package/src/sap/fe/templates/messagebundle_sh.properties +2 -11
  69. package/src/sap/fe/templates/messagebundle_sk.properties +2 -11
  70. package/src/sap/fe/templates/messagebundle_sl.properties +2 -11
  71. package/src/sap/fe/templates/messagebundle_sv.properties +2 -11
  72. package/src/sap/fe/templates/messagebundle_th.properties +1 -10
  73. package/src/sap/fe/templates/messagebundle_tr.properties +2 -11
  74. package/src/sap/fe/templates/messagebundle_uk.properties +2 -11
  75. package/src/sap/fe/templates/messagebundle_vi.properties +0 -9
  76. package/src/sap/fe/templates/messagebundle_zh_CN.properties +0 -9
  77. package/src/sap/fe/templates/messagebundle_zh_TW.properties +2 -11
  78. package/src/sap/fe/templates/ObjectPage/handler/DraftHandler.js +0 -103
  79. package/src/sap/fe/templates/ObjectPage/handler/DraftHandler.ts +0 -97
  80. package/src/sap/fe/templates/ObjectPage/view/fragments/SwitchDraftAndActiveObjectPopOver.fragment.xml +0 -27
@@ -0,0 +1,367 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/MessageStrip", "sap/fe/macros/DelegateUtil", "sap/m/IconTabFilter", "sap/ui/core/Control", "sap/ui/core/Core", "sap/ui/model/json/JSONModel"], function (Log, ClassSupport, MessageStrip, DelegateUtil, IconTabFilter, Control, Core, JSONModel) {
6
+ "use strict";
7
+
8
+ var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _class, _class2, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5, _descriptor6;
9
+
10
+ var property = ClassSupport.property;
11
+ var event = ClassSupport.event;
12
+ var defineUI5Class = ClassSupport.defineUI5Class;
13
+ var association = ClassSupport.association;
14
+ var aggregation = ClassSupport.aggregation;
15
+
16
+ function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }
17
+
18
+ function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
19
+
20
+ function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
21
+
22
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
23
+
24
+ function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
25
+
26
+ function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.'); }
27
+
28
+ var BindingAction;
29
+
30
+ (function (BindingAction) {
31
+ BindingAction["Suspend"] = "suspendBinding";
32
+ BindingAction["Resume"] = "resumeBinding";
33
+ })(BindingAction || (BindingAction = {}));
34
+
35
+ var MultipleModeControl = (_dec = defineUI5Class("sap.fe.templates.ListReport.controls.MultipleModeControl"), _dec2 = property({
36
+ type: "boolean"
37
+ }), _dec3 = property({
38
+ type: "boolean",
39
+ defaultValue: false
40
+ }), _dec4 = property({
41
+ type: "boolean",
42
+ defaultValue: false
43
+ }), _dec5 = aggregation({
44
+ type: "sap.m.IconTabBar",
45
+ multiple: false,
46
+ isDefault: true
47
+ }), _dec6 = association({
48
+ type: "sap.ui.core.Control",
49
+ multiple: true
50
+ }), _dec7 = event(), _dec(_class = (_class2 = /*#__PURE__*/function (_Control) {
51
+ _inheritsLoose(MultipleModeControl, _Control);
52
+
53
+ function MultipleModeControl() {
54
+ var _this;
55
+
56
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
57
+ args[_key] = arguments[_key];
58
+ }
59
+
60
+ _this = _Control.call.apply(_Control, [this].concat(args)) || this;
61
+
62
+ _initializerDefineProperty(_this, "showCounts", _descriptor, _assertThisInitialized(_this));
63
+
64
+ _initializerDefineProperty(_this, "freezeContent", _descriptor2, _assertThisInitialized(_this));
65
+
66
+ _initializerDefineProperty(_this, "countsOutDated", _descriptor3, _assertThisInitialized(_this));
67
+
68
+ _initializerDefineProperty(_this, "content", _descriptor4, _assertThisInitialized(_this));
69
+
70
+ _initializerDefineProperty(_this, "innerControls", _descriptor5, _assertThisInitialized(_this));
71
+
72
+ _initializerDefineProperty(_this, "select", _descriptor6, _assertThisInitialized(_this));
73
+
74
+ return _this;
75
+ }
76
+
77
+ var _proto = MultipleModeControl.prototype;
78
+
79
+ _proto.onBeforeRendering = function onBeforeRendering() {
80
+ var _this$getAggregation,
81
+ _this2 = this;
82
+
83
+ this.getTabsModel(); // Generate the model which is mandatory for some bindings
84
+
85
+ (_this$getAggregation = this.getAggregation("content")) === null || _this$getAggregation === void 0 ? void 0 : _this$getAggregation.attachEvent("select", this.handleTabChange.bind(this));
86
+
87
+ this._getAllInnerControls().forEach(function (oMacroAPI) {
88
+ var _oMacroAPI$suspendBin;
89
+
90
+ if (_this2.showCounts) {
91
+ oMacroAPI.attachEvent("internalDataRequested", _this2._refreshTabsCount.bind(_this2));
92
+ }
93
+
94
+ (_oMacroAPI$suspendBin = oMacroAPI.suspendBinding) === null || _oMacroAPI$suspendBin === void 0 ? void 0 : _oMacroAPI$suspendBin.call(oMacroAPI);
95
+ });
96
+ };
97
+
98
+ _proto.onAfterRendering = function onAfterRendering() {
99
+ var _this$_getSelectedInn, _this$_getSelectedInn2;
100
+
101
+ (_this$_getSelectedInn = this._getSelectedInnerControl()) === null || _this$_getSelectedInn === void 0 ? void 0 : (_this$_getSelectedInn2 = _this$_getSelectedInn.resumeBinding) === null || _this$_getSelectedInn2 === void 0 ? void 0 : _this$_getSelectedInn2.call(_this$_getSelectedInn, !this.getProperty("freezeContent"));
102
+ };
103
+
104
+ MultipleModeControl.render = function render(oRm, oControl) {
105
+ oRm.renderControl(oControl.content);
106
+ }
107
+ /**
108
+ * Manages the binding of all inner controls when the selected IconTabFilter is changed.
109
+ *
110
+ * @param {sap.ui.base.Event} oEvent Event fired by the IconTabBar
111
+ */
112
+ ;
113
+
114
+ _proto.handleTabChange = function handleTabChange(oEvent) {
115
+ var mParameters = oEvent.getParameters();
116
+
117
+ this._setInnerBinding(true);
118
+
119
+ this.fireEvent("select", {
120
+ iconTabBar: this.content,
121
+ selectedKey: mParameters === null || mParameters === void 0 ? void 0 : mParameters.selectedKey,
122
+ previousKey: mParameters === null || mParameters === void 0 ? void 0 : mParameters.previousKey
123
+ });
124
+ }
125
+ /**
126
+ * Invalidates the content of all inner controls.
127
+ */
128
+ ;
129
+
130
+ _proto.invalidateContent = function invalidateContent() {
131
+ this.setCountsOutDated(true);
132
+
133
+ this._getAllInnerControls().forEach(function (oMacroAPI) {
134
+ var _oMacroAPI$invalidate;
135
+
136
+ (_oMacroAPI$invalidate = oMacroAPI.invalidateContent) === null || _oMacroAPI$invalidate === void 0 ? void 0 : _oMacroAPI$invalidate.call(oMacroAPI);
137
+ });
138
+ }
139
+ /**
140
+ * Sets the counts to out of date or up to date
141
+ * If the counts are set to "out of date" and the selected IconTabFilter doesn't contain an inner control all inner controls are requested to get the new counts.
142
+ *
143
+ * @param {boolean} bValue Freeze or not the control
144
+ */
145
+ ;
146
+
147
+ _proto.setCountsOutDated = function setCountsOutDated() {
148
+ var bValue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
149
+ this.setProperty("countsOutDated", bValue); // if the current tab is not configured with no inner Control
150
+ // the tab counts must be manually refreshed since no Macro API will sent event internalDataRequested
151
+
152
+ if (bValue && !this._getSelectedInnerControl()) {
153
+ this._refreshTabsCount();
154
+ }
155
+ }
156
+ /**
157
+ * Freezes the content :
158
+ * - content is frozen: the binding of the inner controls are suspended.
159
+ * - content is unfrozen: the binding of inner control related to the selected IconTabFilter is resumed.
160
+ *
161
+ * @param {boolean} bValue Freeze or not the control
162
+ */
163
+ ;
164
+
165
+ _proto.setFreezeContent = function setFreezeContent(bValue) {
166
+ this.setProperty("freezeContent", bValue);
167
+
168
+ this._setInnerBinding();
169
+ }
170
+ /**
171
+ * Updates the internal model with the properties that are not applicable on each IconTabFilter (containing inner control) according to the entityType of the filter control.
172
+ *
173
+ * @param {sap.ui.mdc.FilterBar} oFilterControl The filter control
174
+ * @param {string} sEntityTypePath The entity type of the filter control
175
+ * @param oResourceBundle
176
+ */
177
+ ;
178
+
179
+ _proto.updateMultiTabNotApplicableFields = function updateMultiTabNotApplicableFields(oFilterControl, sEntityTypePath, oResourceBundle) {
180
+ var _this3 = this;
181
+
182
+ var tabsModel = this.getTabsModel();
183
+
184
+ if (tabsModel) {
185
+ var results = {};
186
+
187
+ this._getAllInnerControls().forEach(function (oMacroAPI) {
188
+ var oTab = _this3._getTabFromInnerControl(oMacroAPI);
189
+
190
+ if (oTab) {
191
+ var _oMacroAPI$refreshNot;
192
+
193
+ var sTabId = oTab.getKey();
194
+ var mIgnoredFields = ((_oMacroAPI$refreshNot = oMacroAPI.refreshNotApplicableFields) === null || _oMacroAPI$refreshNot === void 0 ? void 0 : _oMacroAPI$refreshNot.call(oMacroAPI, oFilterControl)) || [];
195
+ results[sTabId] = {
196
+ notApplicable: {
197
+ fields: mIgnoredFields,
198
+ title: _this3._setTabMessageStrip({
199
+ entityTypePath: sEntityTypePath,
200
+ filterControl: oFilterControl,
201
+ ignoredFields: mIgnoredFields,
202
+ resourceBundle: oResourceBundle,
203
+ title: oTab.getText()
204
+ })
205
+ }
206
+ };
207
+ }
208
+ });
209
+
210
+ tabsModel.setData(results);
211
+ }
212
+ }
213
+ /**
214
+ * Gets the model containing information related to the IconTabFilters.
215
+ *
216
+ * @returns {sap.ui.model.Model | undefined} The model
217
+ */
218
+ ;
219
+
220
+ _proto.getTabsModel = function getTabsModel() {
221
+ var sTabsModel = "tabsInternal";
222
+ var oContent = this.content;
223
+
224
+ if (!oContent) {
225
+ return undefined;
226
+ }
227
+
228
+ var oModel = oContent.getModel(sTabsModel);
229
+
230
+ if (!oModel) {
231
+ oModel = new JSONModel({});
232
+ oContent.setModel(oModel, sTabsModel);
233
+ }
234
+
235
+ return oModel;
236
+ };
237
+
238
+ _proto._getAllInnerControls = function _getAllInnerControls() {
239
+ var _this4 = this;
240
+
241
+ var bOnlyForVisibleTab = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
242
+ return this.innerControls.reduce(function (aInnerControls, sInnerControl) {
243
+ var oControl = Core.byId(sInnerControl);
244
+
245
+ if (oControl) {
246
+ aInnerControls.push(oControl);
247
+ }
248
+
249
+ return aInnerControls.filter(function (oInnerControl) {
250
+ var _this4$_getTabFromInn;
251
+
252
+ return !bOnlyForVisibleTab || ((_this4$_getTabFromInn = _this4._getTabFromInnerControl(oInnerControl)) === null || _this4$_getTabFromInn === void 0 ? void 0 : _this4$_getTabFromInn.getVisible());
253
+ });
254
+ }, []) || [];
255
+ };
256
+
257
+ _proto._getTabFromInnerControl = function _getTabFromInnerControl(oControl) {
258
+ var sSupportedClass = IconTabFilter.getMetadata().getName();
259
+ var oTab = oControl;
260
+
261
+ if (oTab && !oTab.isA(sSupportedClass) && oTab.getParent) {
262
+ oTab = oControl.getParent();
263
+ }
264
+
265
+ return oTab && oTab.isA(sSupportedClass) ? oTab : undefined;
266
+ };
267
+
268
+ _proto._getSelectedInnerControl = function _getSelectedInnerControl() {
269
+ var _this5 = this;
270
+
271
+ var oSelectedTab = this.content.getItems().find(function (oItem) {
272
+ return oItem.getKey() === _this5.content.getSelectedKey();
273
+ });
274
+ return oSelectedTab ? this._getAllInnerControls().find(function (oMacroAPI) {
275
+ return _this5._getTabFromInnerControl(oMacroAPI) === oSelectedTab;
276
+ }) : undefined;
277
+ };
278
+
279
+ _proto._refreshTabsCount = function _refreshTabsCount() {
280
+ var _this6 = this;
281
+
282
+ var sSelectedKey = this.content.getSelectedKey();
283
+
284
+ this._getAllInnerControls(true).forEach(function (oMacroAPI) {
285
+ var oIconTabFilter = _this6._getTabFromInnerControl(oMacroAPI);
286
+
287
+ if (oMacroAPI !== null && oMacroAPI !== void 0 && oMacroAPI.getCounts && (_this6.countsOutDated || sSelectedKey === (oIconTabFilter === null || oIconTabFilter === void 0 ? void 0 : oIconTabFilter.getKey()))) {
288
+ if (oIconTabFilter && oIconTabFilter.setCount) {
289
+ oIconTabFilter.setCount("...");
290
+ oMacroAPI.getCounts().then(function (iCount) {
291
+ return oIconTabFilter.setCount(iCount || "0");
292
+ }).catch(function (oError) {
293
+ Log.error("Error while requesting Counts for Control", oError);
294
+ });
295
+ }
296
+ }
297
+ });
298
+
299
+ this.setCountsOutDated(false);
300
+ };
301
+
302
+ _proto._setInnerBinding = function _setInnerBinding() {
303
+ var _this7 = this;
304
+
305
+ var bRequestIfNotInitialized = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
306
+
307
+ if (this.content) {
308
+ this._getAllInnerControls().forEach(function (oMacroAPI) {
309
+ var _oMacroAPI$sAction;
310
+
311
+ var oIconTabFilter = _this7._getTabFromInnerControl(oMacroAPI);
312
+
313
+ var bIsSelectedKey = (oIconTabFilter === null || oIconTabFilter === void 0 ? void 0 : oIconTabFilter.getKey()) === _this7.content.getSelectedKey();
314
+
315
+ var sAction = bIsSelectedKey && !_this7.getProperty("freezeContent") ? BindingAction.Resume : BindingAction.Suspend;
316
+ (_oMacroAPI$sAction = oMacroAPI[sAction]) === null || _oMacroAPI$sAction === void 0 ? void 0 : _oMacroAPI$sAction.call(oMacroAPI, sAction === BindingAction.Resume ? bRequestIfNotInitialized && bIsSelectedKey : undefined);
317
+ });
318
+ }
319
+ };
320
+
321
+ _proto._setTabMessageStrip = function _setTabMessageStrip(properties) {
322
+ var sText = "";
323
+ var aIgnoredFields = properties.ignoredFields;
324
+ var oFilterControl = properties.filterControl;
325
+
326
+ if (oFilterControl && Array.isArray(aIgnoredFields) && aIgnoredFields.length > 0 && properties.title) {
327
+ var aIgnoredLabels = MessageStrip.getLabels(aIgnoredFields, properties.entityTypePath, oFilterControl, properties.resourceBundle);
328
+ sText = MessageStrip.getText(aIgnoredLabels, oFilterControl, properties.title, DelegateUtil.getLocalizedText);
329
+ return sText;
330
+ }
331
+ };
332
+
333
+ return MultipleModeControl;
334
+ }(Control), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, "showCounts", [_dec2], {
335
+ configurable: true,
336
+ enumerable: true,
337
+ writable: true,
338
+ initializer: null
339
+ }), _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, "freezeContent", [_dec3], {
340
+ configurable: true,
341
+ enumerable: true,
342
+ writable: true,
343
+ initializer: null
344
+ }), _descriptor3 = _applyDecoratedDescriptor(_class2.prototype, "countsOutDated", [_dec4], {
345
+ configurable: true,
346
+ enumerable: true,
347
+ writable: true,
348
+ initializer: null
349
+ }), _descriptor4 = _applyDecoratedDescriptor(_class2.prototype, "content", [_dec5], {
350
+ configurable: true,
351
+ enumerable: true,
352
+ writable: true,
353
+ initializer: null
354
+ }), _descriptor5 = _applyDecoratedDescriptor(_class2.prototype, "innerControls", [_dec6], {
355
+ configurable: true,
356
+ enumerable: true,
357
+ writable: true,
358
+ initializer: null
359
+ }), _descriptor6 = _applyDecoratedDescriptor(_class2.prototype, "select", [_dec7], {
360
+ configurable: true,
361
+ enumerable: true,
362
+ writable: true,
363
+ initializer: null
364
+ })), _class2)) || _class);
365
+ return MultipleModeControl;
366
+ }, false);
367
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk11bHRpcGxlTW9kZUNvbnRyb2wudHMiXSwibmFtZXMiOlsiQmluZGluZ0FjdGlvbiIsIk11bHRpcGxlTW9kZUNvbnRyb2wiLCJkZWZpbmVVSTVDbGFzcyIsInByb3BlcnR5IiwidHlwZSIsImRlZmF1bHRWYWx1ZSIsImFnZ3JlZ2F0aW9uIiwibXVsdGlwbGUiLCJpc0RlZmF1bHQiLCJhc3NvY2lhdGlvbiIsImV2ZW50Iiwib25CZWZvcmVSZW5kZXJpbmciLCJnZXRUYWJzTW9kZWwiLCJnZXRBZ2dyZWdhdGlvbiIsImF0dGFjaEV2ZW50IiwiaGFuZGxlVGFiQ2hhbmdlIiwiYmluZCIsIl9nZXRBbGxJbm5lckNvbnRyb2xzIiwiZm9yRWFjaCIsIm9NYWNyb0FQSSIsInNob3dDb3VudHMiLCJfcmVmcmVzaFRhYnNDb3VudCIsInN1c3BlbmRCaW5kaW5nIiwib25BZnRlclJlbmRlcmluZyIsIl9nZXRTZWxlY3RlZElubmVyQ29udHJvbCIsInJlc3VtZUJpbmRpbmciLCJnZXRQcm9wZXJ0eSIsInJlbmRlciIsIm9SbSIsIm9Db250cm9sIiwicmVuZGVyQ29udHJvbCIsImNvbnRlbnQiLCJvRXZlbnQiLCJtUGFyYW1ldGVycyIsImdldFBhcmFtZXRlcnMiLCJfc2V0SW5uZXJCaW5kaW5nIiwiZmlyZUV2ZW50IiwiaWNvblRhYkJhciIsInNlbGVjdGVkS2V5IiwicHJldmlvdXNLZXkiLCJpbnZhbGlkYXRlQ29udGVudCIsInNldENvdW50c091dERhdGVkIiwiYlZhbHVlIiwic2V0UHJvcGVydHkiLCJzZXRGcmVlemVDb250ZW50IiwidXBkYXRlTXVsdGlUYWJOb3RBcHBsaWNhYmxlRmllbGRzIiwib0ZpbHRlckNvbnRyb2wiLCJzRW50aXR5VHlwZVBhdGgiLCJvUmVzb3VyY2VCdW5kbGUiLCJ0YWJzTW9kZWwiLCJyZXN1bHRzIiwib1RhYiIsIl9nZXRUYWJGcm9tSW5uZXJDb250cm9sIiwic1RhYklkIiwiZ2V0S2V5IiwibUlnbm9yZWRGaWVsZHMiLCJyZWZyZXNoTm90QXBwbGljYWJsZUZpZWxkcyIsIm5vdEFwcGxpY2FibGUiLCJmaWVsZHMiLCJ0aXRsZSIsIl9zZXRUYWJNZXNzYWdlU3RyaXAiLCJlbnRpdHlUeXBlUGF0aCIsImZpbHRlckNvbnRyb2wiLCJpZ25vcmVkRmllbGRzIiwicmVzb3VyY2VCdW5kbGUiLCJnZXRUZXh0Iiwic2V0RGF0YSIsInNUYWJzTW9kZWwiLCJvQ29udGVudCIsInVuZGVmaW5lZCIsIm9Nb2RlbCIsImdldE1vZGVsIiwiSlNPTk1vZGVsIiwic2V0TW9kZWwiLCJiT25seUZvclZpc2libGVUYWIiLCJpbm5lckNvbnRyb2xzIiwicmVkdWNlIiwiYUlubmVyQ29udHJvbHMiLCJzSW5uZXJDb250cm9sIiwiQ29yZSIsImJ5SWQiLCJwdXNoIiwiZmlsdGVyIiwib0lubmVyQ29udHJvbCIsImdldFZpc2libGUiLCJzU3VwcG9ydGVkQ2xhc3MiLCJJY29uVGFiRmlsdGVyIiwiZ2V0TWV0YWRhdGEiLCJnZXROYW1lIiwiaXNBIiwiZ2V0UGFyZW50Iiwib1NlbGVjdGVkVGFiIiwiZ2V0SXRlbXMiLCJmaW5kIiwib0l0ZW0iLCJnZXRTZWxlY3RlZEtleSIsInNTZWxlY3RlZEtleSIsIm9JY29uVGFiRmlsdGVyIiwiZ2V0Q291bnRzIiwiY291bnRzT3V0RGF0ZWQiLCJzZXRDb3VudCIsInRoZW4iLCJpQ291bnQiLCJjYXRjaCIsIm9FcnJvciIsIkxvZyIsImVycm9yIiwiYlJlcXVlc3RJZk5vdEluaXRpYWxpemVkIiwiYklzU2VsZWN0ZWRLZXkiLCJzQWN0aW9uIiwiUmVzdW1lIiwiU3VzcGVuZCIsInByb3BlcnRpZXMiLCJzVGV4dCIsImFJZ25vcmVkRmllbGRzIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiYUlnbm9yZWRMYWJlbHMiLCJNZXNzYWdlU3RyaXAiLCJnZXRMYWJlbHMiLCJEZWxlZ2F0ZVV0aWwiLCJnZXRMb2NhbGl6ZWRUZXh0IiwiQ29udHJvbCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7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cUN4RSxjQUFyQyxFQUFxRGtFLFVBQVUsQ0FBQ3JELEtBQWhFLEVBQXVFOEQsWUFBWSxDQUFDQyxnQkFBcEYsQ0FBUjtBQUNBLGVBQU9ULEtBQVA7QUFDQTtBQUNELEs7OztJQTFOZ0NVLE87Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7U0E2Tm5CMUgsbUIiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB7IGFnZ3JlZ2F0aW9uLCBhc3NvY2lhdGlvbiwgZGVmaW5lVUk1Q2xhc3MsIGV2ZW50LCBwcm9wZXJ0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IE1lc3NhZ2VTdHJpcCBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9NZXNzYWdlU3RyaXBcIjtcbmltcG9ydCBEZWxlZ2F0ZVV0aWwgZnJvbSBcInNhcC9mZS9tYWNyb3MvRGVsZWdhdGVVdGlsXCI7XG5pbXBvcnQgTWFjcm9BUEkgZnJvbSBcInNhcC9mZS9tYWNyb3MvTWFjcm9BUElcIjtcbmltcG9ydCBJY29uVGFiQmFyIGZyb20gXCJzYXAvbS9JY29uVGFiQmFyXCI7XG5pbXBvcnQgSWNvblRhYkZpbHRlciBmcm9tIFwic2FwL20vSWNvblRhYkZpbHRlclwiO1xuaW1wb3J0IENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgUmVuZGVyTWFuYWdlciBmcm9tIFwic2FwL3VpL2NvcmUvUmVuZGVyTWFuYWdlclwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9Nb2RlbFwiO1xuXG5leHBvcnQgdHlwZSBJbm5lckNvbnRyb2xUeXBlID0gTWFjcm9BUEkgJlxuXHRQYXJ0aWFsPHtcblx0XHRyZXN1bWVCaW5kaW5nOiBGdW5jdGlvbjtcblx0XHRzdXNwZW5kQmluZGluZzogRnVuY3Rpb247XG5cdFx0Z2V0Q291bnRzOiBGdW5jdGlvbjtcblx0XHRyZWZyZXNoTm90QXBwbGljYWJsZUZpZWxkczogRnVuY3Rpb247XG5cdFx0aW52YWxpZGF0ZUNvbnRlbnQ6IEZ1bmN0aW9uO1xuXHR9PjtcblxudHlwZSBNZXNzYWdlU3RyaXBQcm9wZXJ0aWVzID0ge1xuXHRlbnRpdHlUeXBlUGF0aDogc3RyaW5nO1xuXHRmaWx0ZXJDb250cm9sOiBDb250cm9sO1xuXHRpZ25vcmVkRmllbGRzOiBhbnlbXTtcblx0cmVzb3VyY2VCdW5kbGU6IFJlc291cmNlQnVuZGxlO1xuXHR0aXRsZTogc3RyaW5nO1xufTtcblxuZW51bSBCaW5kaW5nQWN0aW9uIHtcblx0U3VzcGVuZCA9IFwic3VzcGVuZEJpbmRpbmdcIixcblx0UmVzdW1lID0gXCJyZXN1bWVCaW5kaW5nXCJcbn1cblxuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLnRlbXBsYXRlcy5MaXN0UmVwb3J0LmNvbnRyb2xzLk11bHRpcGxlTW9kZUNvbnRyb2xcIilcbmNsYXNzIE11bHRpcGxlTW9kZUNvbnRyb2wgZXh0ZW5kcyBDb250cm9sIHtcblx0QHByb3BlcnR5KHsgdHlwZTogXCJib29sZWFuXCIgfSlcblx0c2hvd0NvdW50cyE6IGJvb2xlYW47XG5cblx0QHByb3BlcnR5KHsgdHlwZTogXCJib29sZWFuXCIsIGRlZmF1bHRWYWx1ZTogZmFsc2UgfSlcblx0ZnJlZXplQ29udGVudCE6IGJvb2xlYW47XG5cblx0QHByb3BlcnR5KHsgdHlwZTogXCJib29sZWFuXCIsIGRlZmF1bHRWYWx1ZTogZmFsc2UgfSlcblx0Y291bnRzT3V0RGF0ZWQhOiBib29sZWFuO1xuXG5cdEBhZ2dyZWdhdGlvbih7IHR5cGU6IFwic2FwLm0uSWNvblRhYkJhclwiLCBtdWx0aXBsZTogZmFsc2UsIGlzRGVmYXVsdDogdHJ1ZSB9KVxuXHRjb250ZW50ITogSWNvblRhYkJhcjtcblxuXHRAYXNzb2NpYXRpb24oeyB0eXBlOiBcInNhcC51aS5jb3JlLkNvbnRyb2xcIiwgbXVsdGlwbGU6IHRydWUgfSlcblx0aW5uZXJDb250cm9scyE6IHN0cmluZ1tdO1xuXG5cdEBldmVudCgpXG5cdHNlbGVjdCE6IEZ1bmN0aW9uO1xuXG5cdG9uQmVmb3JlUmVuZGVyaW5nKCkge1xuXHRcdHRoaXMuZ2V0VGFic01vZGVsKCk7IC8vIEdlbmVyYXRlIHRoZSBtb2RlbCB3aGljaCBpcyBtYW5kYXRvcnkgZm9yIHNvbWUgYmluZGluZ3Ncblx0XHQodGhpcy5nZXRBZ2dyZWdhdGlvbihcImNvbnRlbnRcIikgYXMgSWNvblRhYkJhciB8IHVuZGVmaW5lZCk/LmF0dGFjaEV2ZW50KFwic2VsZWN0XCIsIHRoaXMuaGFuZGxlVGFiQ2hhbmdlLmJpbmQodGhpcykpO1xuXHRcdHRoaXMuX2dldEFsbElubmVyQ29udHJvbHMoKS5mb3JFYWNoKChvTWFjcm9BUEkpID0+IHtcblx0XHRcdGlmICh0aGlzLnNob3dDb3VudHMpIHtcblx0XHRcdFx0b01hY3JvQVBJLmF0dGFjaEV2ZW50KFwiaW50ZXJuYWxEYXRhUmVxdWVzdGVkXCIsIHRoaXMuX3JlZnJlc2hUYWJzQ291bnQuYmluZCh0aGlzKSk7XG5cdFx0XHR9XG5cdFx0XHRvTWFjcm9BUEkuc3VzcGVuZEJpbmRpbmc/LigpO1xuXHRcdH0pO1xuXHR9XG5cblx0b25BZnRlclJlbmRlcmluZygpIHtcblx0XHR0aGlzLl9nZXRTZWxlY3RlZElubmVyQ29udHJvbCgpPy5yZXN1bWVCaW5kaW5nPy4oIXRoaXMuZ2V0UHJvcGVydHkoXCJmcmVlemVDb250ZW50XCIpKTtcblx0fVxuXG5cdHN0YXRpYyByZW5kZXIob1JtOiBSZW5kZXJNYW5hZ2VyLCBvQ29udHJvbDogTXVsdGlwbGVNb2RlQ29udHJvbCkge1xuXHRcdG9SbS5yZW5kZXJDb250cm9sKG9Db250cm9sLmNvbnRlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1hbmFnZXMgdGhlIGJpbmRpbmcgb2YgYWxsIGlubmVyIGNvbnRyb2xzIHdoZW4gdGhlIHNlbGVjdGVkIEljb25UYWJGaWx0ZXIgaXMgY2hhbmdlZC5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkuYmFzZS5FdmVudH0gb0V2ZW50IEV2ZW50IGZpcmVkIGJ5IHRoZSBJY29uVGFiQmFyXG5cdCAqL1xuXHRoYW5kbGVUYWJDaGFuZ2Uob0V2ZW50OiBhbnkpOiB2b2lkIHtcblx0XHRjb25zdCBtUGFyYW1ldGVycyA9IG9FdmVudC5nZXRQYXJhbWV0ZXJzKCk7XG5cblx0XHR0aGlzLl9zZXRJbm5lckJpbmRpbmcodHJ1ZSk7XG5cdFx0dGhpcy5maXJlRXZlbnQoXCJzZWxlY3RcIiwge1xuXHRcdFx0aWNvblRhYkJhcjogdGhpcy5jb250ZW50LFxuXHRcdFx0c2VsZWN0ZWRLZXk6IG1QYXJhbWV0ZXJzPy5zZWxlY3RlZEtleSxcblx0XHRcdHByZXZpb3VzS2V5OiBtUGFyYW1ldGVycz8ucHJldmlvdXNLZXlcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbnZhbGlkYXRlcyB0aGUgY29udGVudCBvZiBhbGwgaW5uZXIgY29udHJvbHMuXG5cdCAqL1xuXHRpbnZhbGlkYXRlQ29udGVudCgpIHtcblx0XHR0aGlzLnNldENvdW50c091dERhdGVkKHRydWUpO1xuXHRcdHRoaXMuX2dldEFsbElubmVyQ29udHJvbHMoKS5mb3JFYWNoKChvTWFjcm9BUEkpID0+IHtcblx0XHRcdG9NYWNyb0FQSS5pbnZhbGlkYXRlQ29udGVudD8uKCk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgY291bnRzIHRvIG91dCBvZiBkYXRlIG9yIHVwIHRvIGRhdGVcblx0ICogSWYgdGhlIGNvdW50cyBhcmUgc2V0IHRvIFwib3V0IG9mIGRhdGVcIiBhbmQgdGhlIHNlbGVjdGVkIEljb25UYWJGaWx0ZXIgZG9lc24ndCBjb250YWluIGFuIGlubmVyIGNvbnRyb2wgYWxsIGlubmVyIGNvbnRyb2xzIGFyZSByZXF1ZXN0ZWQgdG8gZ2V0IHRoZSBuZXcgY291bnRzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGJWYWx1ZSBGcmVlemUgb3Igbm90IHRoZSBjb250cm9sXG5cdCAqL1xuXHRzZXRDb3VudHNPdXREYXRlZChiVmFsdWUgPSB0cnVlKSB7XG5cdFx0dGhpcy5zZXRQcm9wZXJ0eShcImNvdW50c091dERhdGVkXCIsIGJWYWx1ZSk7XG5cdFx0Ly8gaWYgdGhlIGN1cnJlbnQgdGFiIGlzIG5vdCBjb25maWd1cmVkIHdpdGggbm8gaW5uZXIgQ29udHJvbFxuXHRcdC8vIHRoZSB0YWIgY291bnRzIG11c3QgYmUgbWFudWFsbHkgcmVmcmVzaGVkIHNpbmNlIG5vIE1hY3JvIEFQSSB3aWxsIHNlbnQgZXZlbnQgaW50ZXJuYWxEYXRhUmVxdWVzdGVkXG5cdFx0aWYgKGJWYWx1ZSAmJiAhdGhpcy5fZ2V0U2VsZWN0ZWRJbm5lckNvbnRyb2woKSkge1xuXHRcdFx0dGhpcy5fcmVmcmVzaFRhYnNDb3VudCgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBGcmVlemVzIHRoZSBjb250ZW50IDpcblx0ICogIC0gY29udGVudCBpcyBmcm96ZW46IHRoZSBiaW5kaW5nIG9mIHRoZSBpbm5lciBjb250cm9scyBhcmUgc3VzcGVuZGVkLlxuXHQgKiAgLSBjb250ZW50IGlzIHVuZnJvemVuOiB0aGUgYmluZGluZyBvZiBpbm5lciBjb250cm9sIHJlbGF0ZWQgdG8gdGhlIHNlbGVjdGVkIEljb25UYWJGaWx0ZXIgaXMgcmVzdW1lZC5cblx0ICpcblx0ICogQHBhcmFtIHtib29sZWFufSBiVmFsdWUgRnJlZXplIG9yIG5vdCB0aGUgY29udHJvbFxuXHQgKi9cblx0c2V0RnJlZXplQ29udGVudChiVmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLnNldFByb3BlcnR5KFwiZnJlZXplQ29udGVudFwiLCBiVmFsdWUpO1xuXHRcdHRoaXMuX3NldElubmVyQmluZGluZygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGludGVybmFsIG1vZGVsIHdpdGggdGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IGFwcGxpY2FibGUgb24gZWFjaCBJY29uVGFiRmlsdGVyIChjb250YWluaW5nIGlubmVyIGNvbnRyb2wpIGFjY29yZGluZyB0byB0aGUgZW50aXR5VHlwZSBvZiB0aGUgZmlsdGVyIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1kYy5GaWx0ZXJCYXJ9IG9GaWx0ZXJDb250cm9sIFRoZSBmaWx0ZXIgY29udHJvbFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0VudGl0eVR5cGVQYXRoIFRoZSBlbnRpdHkgdHlwZSBvZiB0aGUgZmlsdGVyIGNvbnRyb2xcblx0ICogQHBhcmFtIG9SZXNvdXJjZUJ1bmRsZVxuXHQgKi9cblx0dXBkYXRlTXVsdGlUYWJOb3RBcHBsaWNhYmxlRmllbGRzKG9GaWx0ZXJDb250cm9sOiBDb250cm9sLCBzRW50aXR5VHlwZVBhdGg6IHN0cmluZywgb1Jlc291cmNlQnVuZGxlOiBSZXNvdXJjZUJ1bmRsZSkge1xuXHRcdGNvbnN0IHRhYnNNb2RlbCA9IHRoaXMuZ2V0VGFic01vZGVsKCk7XG5cdFx0aWYgKHRhYnNNb2RlbCkge1xuXHRcdFx0Y29uc3QgcmVzdWx0czogYW55ID0ge307XG5cdFx0XHR0aGlzLl9nZXRBbGxJbm5lckNvbnRyb2xzKCkuZm9yRWFjaCgob01hY3JvQVBJKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9UYWIgPSB0aGlzLl9nZXRUYWJGcm9tSW5uZXJDb250cm9sKG9NYWNyb0FQSSk7XG5cdFx0XHRcdGlmIChvVGFiKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc1RhYklkID0gb1RhYi5nZXRLZXkoKTtcblx0XHRcdFx0XHRjb25zdCBtSWdub3JlZEZpZWxkcyA9IG9NYWNyb0FQSS5yZWZyZXNoTm90QXBwbGljYWJsZUZpZWxkcz8uKG9GaWx0ZXJDb250cm9sKSB8fCBbXTtcblx0XHRcdFx0XHRyZXN1bHRzW3NUYWJJZF0gPSB7XG5cdFx0XHRcdFx0XHRub3RBcHBsaWNhYmxlOiB7XG5cdFx0XHRcdFx0XHRcdGZpZWxkczogbUlnbm9yZWRGaWVsZHMsXG5cdFx0XHRcdFx0XHRcdHRpdGxlOiB0aGlzLl9zZXRUYWJNZXNzYWdlU3RyaXAoe1xuXHRcdFx0XHRcdFx0XHRcdGVudGl0eVR5cGVQYXRoOiBzRW50aXR5VHlwZVBhdGgsXG5cdFx0XHRcdFx0XHRcdFx0ZmlsdGVyQ29udHJvbDogb0ZpbHRlckNvbnRyb2wsXG5cdFx0XHRcdFx0XHRcdFx0aWdub3JlZEZpZWxkczogbUlnbm9yZWRGaWVsZHMsXG5cdFx0XHRcdFx0XHRcdFx0cmVzb3VyY2VCdW5kbGU6IG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHR0aXRsZTogb1RhYi5nZXRUZXh0KClcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdCh0YWJzTW9kZWwgYXMgYW55KS5zZXREYXRhKHJlc3VsdHMpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBtb2RlbCBjb250YWluaW5nIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIEljb25UYWJGaWx0ZXJzLlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7c2FwLnVpLm1vZGVsLk1vZGVsIHwgdW5kZWZpbmVkfSBUaGUgbW9kZWxcblx0ICovXG5cdGdldFRhYnNNb2RlbCgpOiBNb2RlbCB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgc1RhYnNNb2RlbCA9IFwidGFic0ludGVybmFsXCI7XG5cdFx0Y29uc3Qgb0NvbnRlbnQgPSB0aGlzLmNvbnRlbnQ7XG5cdFx0aWYgKCFvQ29udGVudCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0bGV0IG9Nb2RlbCA9IG9Db250ZW50LmdldE1vZGVsKHNUYWJzTW9kZWwpO1xuXHRcdGlmICghb01vZGVsKSB7XG5cdFx0XHRvTW9kZWwgPSBuZXcgSlNPTk1vZGVsKHt9KTtcblx0XHRcdG9Db250ZW50LnNldE1vZGVsKG9Nb2RlbCwgc1RhYnNNb2RlbCk7XG5cdFx0fVxuXHRcdHJldHVybiBvTW9kZWw7XG5cdH1cblxuXHRfZ2V0QWxsSW5uZXJDb250cm9scyhiT25seUZvclZpc2libGVUYWIgPSBmYWxzZSk6IElubmVyQ29udHJvbFR5cGVbXSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdHRoaXMuaW5uZXJDb250cm9scy5yZWR1Y2UoKGFJbm5lckNvbnRyb2xzOiBJbm5lckNvbnRyb2xUeXBlW10sIHNJbm5lckNvbnRyb2w6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRjb25zdCBvQ29udHJvbCA9IENvcmUuYnlJZChzSW5uZXJDb250cm9sKSBhcyBJbm5lckNvbnRyb2xUeXBlO1xuXHRcdFx0XHRpZiAob0NvbnRyb2wpIHtcblx0XHRcdFx0XHRhSW5uZXJDb250cm9scy5wdXNoKG9Db250cm9sKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gYUlubmVyQ29udHJvbHMuZmlsdGVyKFxuXHRcdFx0XHRcdChvSW5uZXJDb250cm9sKSA9PiAhYk9ubHlGb3JWaXNpYmxlVGFiIHx8IHRoaXMuX2dldFRhYkZyb21Jbm5lckNvbnRyb2wob0lubmVyQ29udHJvbCk/LmdldFZpc2libGUoKVxuXHRcdFx0XHQpO1xuXHRcdFx0fSwgW10pIHx8IFtdXG5cdFx0KTtcblx0fVxuXG5cdF9nZXRUYWJGcm9tSW5uZXJDb250cm9sKG9Db250cm9sOiBDb250cm9sKTogSWNvblRhYkZpbHRlciB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgc1N1cHBvcnRlZENsYXNzID0gSWNvblRhYkZpbHRlci5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKTtcblx0XHRsZXQgb1RhYjogYW55ID0gb0NvbnRyb2w7XG5cdFx0aWYgKG9UYWIgJiYgIW9UYWIuaXNBKHNTdXBwb3J0ZWRDbGFzcykgJiYgb1RhYi5nZXRQYXJlbnQpIHtcblx0XHRcdG9UYWIgPSBvQ29udHJvbC5nZXRQYXJlbnQoKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9UYWIgJiYgb1RhYi5pc0Eoc1N1cHBvcnRlZENsYXNzKSA/IChvVGFiIGFzIEljb25UYWJGaWx0ZXIpIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0X2dldFNlbGVjdGVkSW5uZXJDb250cm9sKCk6IElubmVyQ29udHJvbFR5cGUgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG9TZWxlY3RlZFRhYiA9IHRoaXMuY29udGVudC5nZXRJdGVtcygpLmZpbmQoKG9JdGVtKSA9PiAob0l0ZW0gYXMgSWNvblRhYkZpbHRlcikuZ2V0S2V5KCkgPT09IHRoaXMuY29udGVudC5nZXRTZWxlY3RlZEtleSgpKTtcblx0XHRyZXR1cm4gb1NlbGVjdGVkVGFiXG5cdFx0XHQ/IHRoaXMuX2dldEFsbElubmVyQ29udHJvbHMoKS5maW5kKChvTWFjcm9BUEkpID0+IHRoaXMuX2dldFRhYkZyb21Jbm5lckNvbnRyb2wob01hY3JvQVBJKSA9PT0gb1NlbGVjdGVkVGFiKVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cdH1cblxuXHRfcmVmcmVzaFRhYnNDb3VudCgpOiB2b2lkIHtcblx0XHRjb25zdCBzU2VsZWN0ZWRLZXkgPSB0aGlzLmNvbnRlbnQuZ2V0U2VsZWN0ZWRLZXkoKTtcblx0XHR0aGlzLl9nZXRBbGxJbm5lckNvbnRyb2xzKHRydWUpLmZvckVhY2goKG9NYWNyb0FQSSkgPT4ge1xuXHRcdFx0Y29uc3Qgb0ljb25UYWJGaWx0ZXIgPSB0aGlzLl9nZXRUYWJGcm9tSW5uZXJDb250cm9sKG9NYWNyb0FQSSk7XG5cdFx0XHRpZiAob01hY3JvQVBJPy5nZXRDb3VudHMgJiYgKHRoaXMuY291bnRzT3V0RGF0ZWQgfHwgc1NlbGVjdGVkS2V5ID09PSBvSWNvblRhYkZpbHRlcj8uZ2V0S2V5KCkpKSB7XG5cdFx0XHRcdGlmIChvSWNvblRhYkZpbHRlciAmJiBvSWNvblRhYkZpbHRlci5zZXRDb3VudCkge1xuXHRcdFx0XHRcdG9JY29uVGFiRmlsdGVyLnNldENvdW50KFwiLi4uXCIpO1xuXHRcdFx0XHRcdG9NYWNyb0FQSVxuXHRcdFx0XHRcdFx0LmdldENvdW50cygpXG5cdFx0XHRcdFx0XHQudGhlbigoaUNvdW50OiBzdHJpbmcpID0+IG9JY29uVGFiRmlsdGVyLnNldENvdW50KGlDb3VudCB8fCBcIjBcIikpXG5cdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3RpbmcgQ291bnRzIGZvciBDb250cm9sXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHRoaXMuc2V0Q291bnRzT3V0RGF0ZWQoZmFsc2UpO1xuXHR9XG5cblx0X3NldElubmVyQmluZGluZyhiUmVxdWVzdElmTm90SW5pdGlhbGl6ZWQgPSBmYWxzZSkge1xuXHRcdGlmICh0aGlzLmNvbnRlbnQpIHtcblx0XHRcdHRoaXMuX2dldEFsbElubmVyQ29udHJvbHMoKS5mb3JFYWNoKChvTWFjcm9BUEkpID0+IHtcblx0XHRcdFx0Y29uc3Qgb0ljb25UYWJGaWx0ZXIgPSB0aGlzLl9nZXRUYWJGcm9tSW5uZXJDb250cm9sKG9NYWNyb0FQSSk7XG5cdFx0XHRcdGNvbnN0IGJJc1NlbGVjdGVkS2V5ID0gb0ljb25UYWJGaWx0ZXI/LmdldEtleSgpID09PSB0aGlzLmNvbnRlbnQuZ2V0U2VsZWN0ZWRLZXkoKTtcblx0XHRcdFx0Y29uc3Qgc0FjdGlvbiA9IGJJc1NlbGVjdGVkS2V5ICYmICF0aGlzLmdldFByb3BlcnR5KFwiZnJlZXplQ29udGVudFwiKSA/IEJpbmRpbmdBY3Rpb24uUmVzdW1lIDogQmluZGluZ0FjdGlvbi5TdXNwZW5kO1xuXHRcdFx0XHRvTWFjcm9BUElbc0FjdGlvbl0/LihzQWN0aW9uID09PSBCaW5kaW5nQWN0aW9uLlJlc3VtZSA/IGJSZXF1ZXN0SWZOb3RJbml0aWFsaXplZCAmJiBiSXNTZWxlY3RlZEtleSA6IHVuZGVmaW5lZCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRfc2V0VGFiTWVzc2FnZVN0cmlwKHByb3BlcnRpZXM6IE1lc3NhZ2VTdHJpcFByb3BlcnRpZXMpIHtcblx0XHRsZXQgc1RleHQgPSBcIlwiO1xuXHRcdGNvbnN0IGFJZ25vcmVkRmllbGRzID0gcHJvcGVydGllcy5pZ25vcmVkRmllbGRzO1xuXHRcdGNvbnN0IG9GaWx0ZXJDb250cm9sID0gcHJvcGVydGllcy5maWx0ZXJDb250cm9sO1xuXHRcdGlmIChvRmlsdGVyQ29udHJvbCAmJiBBcnJheS5pc0FycmF5KGFJZ25vcmVkRmllbGRzKSAmJiBhSWdub3JlZEZpZWxkcy5sZW5ndGggPiAwICYmIHByb3BlcnRpZXMudGl0bGUpIHtcblx0XHRcdGNvbnN0IGFJZ25vcmVkTGFiZWxzID0gTWVzc2FnZVN0cmlwLmdldExhYmVscyhcblx0XHRcdFx0YUlnbm9yZWRGaWVsZHMsXG5cdFx0XHRcdHByb3BlcnRpZXMuZW50aXR5VHlwZVBhdGgsXG5cdFx0XHRcdG9GaWx0ZXJDb250cm9sLFxuXHRcdFx0XHRwcm9wZXJ0aWVzLnJlc291cmNlQnVuZGxlXG5cdFx0XHQpO1xuXHRcdFx0c1RleHQgPSBNZXNzYWdlU3RyaXAuZ2V0VGV4dChhSWdub3JlZExhYmVscywgb0ZpbHRlckNvbnRyb2wsIHByb3BlcnRpZXMudGl0bGUsIERlbGVnYXRlVXRpbC5nZXRMb2NhbGl6ZWRUZXh0KTtcblx0XHRcdHJldHVybiBzVGV4dDtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTXVsdGlwbGVNb2RlQ29udHJvbDtcbiJdfQ==
@@ -0,0 +1,259 @@
1
+ import type ResourceBundle from "sap/base/i18n/ResourceBundle";
2
+ import Log from "sap/base/Log";
3
+ import { aggregation, association, defineUI5Class, event, property } from "sap/fe/core/helpers/ClassSupport";
4
+ import MessageStrip from "sap/fe/core/helpers/MessageStrip";
5
+ import DelegateUtil from "sap/fe/macros/DelegateUtil";
6
+ import MacroAPI from "sap/fe/macros/MacroAPI";
7
+ import IconTabBar from "sap/m/IconTabBar";
8
+ import IconTabFilter from "sap/m/IconTabFilter";
9
+ import Control from "sap/ui/core/Control";
10
+ import Core from "sap/ui/core/Core";
11
+ import RenderManager from "sap/ui/core/RenderManager";
12
+ import JSONModel from "sap/ui/model/json/JSONModel";
13
+ import Model from "sap/ui/model/Model";
14
+
15
+ export type InnerControlType = MacroAPI &
16
+ Partial<{
17
+ resumeBinding: Function;
18
+ suspendBinding: Function;
19
+ getCounts: Function;
20
+ refreshNotApplicableFields: Function;
21
+ invalidateContent: Function;
22
+ }>;
23
+
24
+ type MessageStripProperties = {
25
+ entityTypePath: string;
26
+ filterControl: Control;
27
+ ignoredFields: any[];
28
+ resourceBundle: ResourceBundle;
29
+ title: string;
30
+ };
31
+
32
+ enum BindingAction {
33
+ Suspend = "suspendBinding",
34
+ Resume = "resumeBinding"
35
+ }
36
+
37
+ @defineUI5Class("sap.fe.templates.ListReport.controls.MultipleModeControl")
38
+ class MultipleModeControl extends Control {
39
+ @property({ type: "boolean" })
40
+ showCounts!: boolean;
41
+
42
+ @property({ type: "boolean", defaultValue: false })
43
+ freezeContent!: boolean;
44
+
45
+ @property({ type: "boolean", defaultValue: false })
46
+ countsOutDated!: boolean;
47
+
48
+ @aggregation({ type: "sap.m.IconTabBar", multiple: false, isDefault: true })
49
+ content!: IconTabBar;
50
+
51
+ @association({ type: "sap.ui.core.Control", multiple: true })
52
+ innerControls!: string[];
53
+
54
+ @event()
55
+ select!: Function;
56
+
57
+ onBeforeRendering() {
58
+ this.getTabsModel(); // Generate the model which is mandatory for some bindings
59
+ (this.getAggregation("content") as IconTabBar | undefined)?.attachEvent("select", this.handleTabChange.bind(this));
60
+ this._getAllInnerControls().forEach((oMacroAPI) => {
61
+ if (this.showCounts) {
62
+ oMacroAPI.attachEvent("internalDataRequested", this._refreshTabsCount.bind(this));
63
+ }
64
+ oMacroAPI.suspendBinding?.();
65
+ });
66
+ }
67
+
68
+ onAfterRendering() {
69
+ this._getSelectedInnerControl()?.resumeBinding?.(!this.getProperty("freezeContent"));
70
+ }
71
+
72
+ static render(oRm: RenderManager, oControl: MultipleModeControl) {
73
+ oRm.renderControl(oControl.content);
74
+ }
75
+
76
+ /**
77
+ * Manages the binding of all inner controls when the selected IconTabFilter is changed.
78
+ *
79
+ * @param {sap.ui.base.Event} oEvent Event fired by the IconTabBar
80
+ */
81
+ handleTabChange(oEvent: any): void {
82
+ const mParameters = oEvent.getParameters();
83
+
84
+ this._setInnerBinding(true);
85
+ this.fireEvent("select", {
86
+ iconTabBar: this.content,
87
+ selectedKey: mParameters?.selectedKey,
88
+ previousKey: mParameters?.previousKey
89
+ });
90
+ }
91
+
92
+ /**
93
+ * Invalidates the content of all inner controls.
94
+ */
95
+ invalidateContent() {
96
+ this.setCountsOutDated(true);
97
+ this._getAllInnerControls().forEach((oMacroAPI) => {
98
+ oMacroAPI.invalidateContent?.();
99
+ });
100
+ }
101
+
102
+ /**
103
+ * Sets the counts to out of date or up to date
104
+ * If the counts are set to "out of date" and the selected IconTabFilter doesn't contain an inner control all inner controls are requested to get the new counts.
105
+ *
106
+ * @param {boolean} bValue Freeze or not the control
107
+ */
108
+ setCountsOutDated(bValue = true) {
109
+ this.setProperty("countsOutDated", bValue);
110
+ // if the current tab is not configured with no inner Control
111
+ // the tab counts must be manually refreshed since no Macro API will sent event internalDataRequested
112
+ if (bValue && !this._getSelectedInnerControl()) {
113
+ this._refreshTabsCount();
114
+ }
115
+ }
116
+
117
+ /**
118
+ * Freezes the content :
119
+ * - content is frozen: the binding of the inner controls are suspended.
120
+ * - content is unfrozen: the binding of inner control related to the selected IconTabFilter is resumed.
121
+ *
122
+ * @param {boolean} bValue Freeze or not the control
123
+ */
124
+ setFreezeContent(bValue: boolean) {
125
+ this.setProperty("freezeContent", bValue);
126
+ this._setInnerBinding();
127
+ }
128
+
129
+ /**
130
+ * Updates the internal model with the properties that are not applicable on each IconTabFilter (containing inner control) according to the entityType of the filter control.
131
+ *
132
+ * @param {sap.ui.mdc.FilterBar} oFilterControl The filter control
133
+ * @param {string} sEntityTypePath The entity type of the filter control
134
+ * @param oResourceBundle
135
+ */
136
+ updateMultiTabNotApplicableFields(oFilterControl: Control, sEntityTypePath: string, oResourceBundle: ResourceBundle) {
137
+ const tabsModel = this.getTabsModel();
138
+ if (tabsModel) {
139
+ const results: any = {};
140
+ this._getAllInnerControls().forEach((oMacroAPI) => {
141
+ const oTab = this._getTabFromInnerControl(oMacroAPI);
142
+ if (oTab) {
143
+ const sTabId = oTab.getKey();
144
+ const mIgnoredFields = oMacroAPI.refreshNotApplicableFields?.(oFilterControl) || [];
145
+ results[sTabId] = {
146
+ notApplicable: {
147
+ fields: mIgnoredFields,
148
+ title: this._setTabMessageStrip({
149
+ entityTypePath: sEntityTypePath,
150
+ filterControl: oFilterControl,
151
+ ignoredFields: mIgnoredFields,
152
+ resourceBundle: oResourceBundle,
153
+ title: oTab.getText()
154
+ })
155
+ }
156
+ };
157
+ }
158
+ });
159
+ (tabsModel as any).setData(results);
160
+ }
161
+ }
162
+
163
+ /**
164
+ * Gets the model containing information related to the IconTabFilters.
165
+ *
166
+ * @returns {sap.ui.model.Model | undefined} The model
167
+ */
168
+ getTabsModel(): Model | undefined {
169
+ const sTabsModel = "tabsInternal";
170
+ const oContent = this.content;
171
+ if (!oContent) {
172
+ return undefined;
173
+ }
174
+ let oModel = oContent.getModel(sTabsModel);
175
+ if (!oModel) {
176
+ oModel = new JSONModel({});
177
+ oContent.setModel(oModel, sTabsModel);
178
+ }
179
+ return oModel;
180
+ }
181
+
182
+ _getAllInnerControls(bOnlyForVisibleTab = false): InnerControlType[] {
183
+ return (
184
+ this.innerControls.reduce((aInnerControls: InnerControlType[], sInnerControl: string) => {
185
+ const oControl = Core.byId(sInnerControl) as InnerControlType;
186
+ if (oControl) {
187
+ aInnerControls.push(oControl);
188
+ }
189
+ return aInnerControls.filter(
190
+ (oInnerControl) => !bOnlyForVisibleTab || this._getTabFromInnerControl(oInnerControl)?.getVisible()
191
+ );
192
+ }, []) || []
193
+ );
194
+ }
195
+
196
+ _getTabFromInnerControl(oControl: Control): IconTabFilter | undefined {
197
+ const sSupportedClass = IconTabFilter.getMetadata().getName();
198
+ let oTab: any = oControl;
199
+ if (oTab && !oTab.isA(sSupportedClass) && oTab.getParent) {
200
+ oTab = oControl.getParent();
201
+ }
202
+ return oTab && oTab.isA(sSupportedClass) ? (oTab as IconTabFilter) : undefined;
203
+ }
204
+
205
+ _getSelectedInnerControl(): InnerControlType | undefined {
206
+ const oSelectedTab = this.content.getItems().find((oItem) => (oItem as IconTabFilter).getKey() === this.content.getSelectedKey());
207
+ return oSelectedTab
208
+ ? this._getAllInnerControls().find((oMacroAPI) => this._getTabFromInnerControl(oMacroAPI) === oSelectedTab)
209
+ : undefined;
210
+ }
211
+
212
+ _refreshTabsCount(): void {
213
+ const sSelectedKey = this.content.getSelectedKey();
214
+ this._getAllInnerControls(true).forEach((oMacroAPI) => {
215
+ const oIconTabFilter = this._getTabFromInnerControl(oMacroAPI);
216
+ if (oMacroAPI?.getCounts && (this.countsOutDated || sSelectedKey === oIconTabFilter?.getKey())) {
217
+ if (oIconTabFilter && oIconTabFilter.setCount) {
218
+ oIconTabFilter.setCount("...");
219
+ oMacroAPI
220
+ .getCounts()
221
+ .then((iCount: string) => oIconTabFilter.setCount(iCount || "0"))
222
+ .catch(function (oError: any) {
223
+ Log.error("Error while requesting Counts for Control", oError);
224
+ });
225
+ }
226
+ }
227
+ });
228
+ this.setCountsOutDated(false);
229
+ }
230
+
231
+ _setInnerBinding(bRequestIfNotInitialized = false) {
232
+ if (this.content) {
233
+ this._getAllInnerControls().forEach((oMacroAPI) => {
234
+ const oIconTabFilter = this._getTabFromInnerControl(oMacroAPI);
235
+ const bIsSelectedKey = oIconTabFilter?.getKey() === this.content.getSelectedKey();
236
+ const sAction = bIsSelectedKey && !this.getProperty("freezeContent") ? BindingAction.Resume : BindingAction.Suspend;
237
+ oMacroAPI[sAction]?.(sAction === BindingAction.Resume ? bRequestIfNotInitialized && bIsSelectedKey : undefined);
238
+ });
239
+ }
240
+ }
241
+
242
+ _setTabMessageStrip(properties: MessageStripProperties) {
243
+ let sText = "";
244
+ const aIgnoredFields = properties.ignoredFields;
245
+ const oFilterControl = properties.filterControl;
246
+ if (oFilterControl && Array.isArray(aIgnoredFields) && aIgnoredFields.length > 0 && properties.title) {
247
+ const aIgnoredLabels = MessageStrip.getLabels(
248
+ aIgnoredFields,
249
+ properties.entityTypePath,
250
+ oFilterControl,
251
+ properties.resourceBundle
252
+ );
253
+ sText = MessageStrip.getText(aIgnoredLabels, oFilterControl, properties.title, DelegateUtil.getLocalizedText);
254
+ return sText;
255
+ }
256
+ }
257
+ }
258
+
259
+ export default MultipleModeControl;