@messaia/cdk 18.2.3-rc08 → 18.2.3-rc09

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.
@@ -2,127 +2,191 @@ import { SelectionModel } from '@angular/cdk/collections';
2
2
  import { MatTableDataSource } from '@angular/material/table';
3
3
  import { BehaviorSubject } from 'rxjs';
4
4
  /**
5
- * A generic datasource for data-table
5
+ * A generic datasource class for working with data-tables in Angular Material.
6
+ * This class extends MatTableDataSource to provide additional functionality like
7
+ * selection management, pagination, and filtering.
6
8
  */
7
9
  export class TableStaticDataSource extends MatTableDataSource {
8
10
  /**
9
- * _reloadChange: function($event)
10
- * Event emitted after the data is loaded
11
+ * @property _reloadChange
12
+ * @description A BehaviorSubject that triggers a reload of the table data.
13
+ * The value is used as a reload token, ensuring the data is reloaded when it changes.
14
+ * @type {BehaviorSubject<number>}
11
15
  */
12
16
  _reloadChange = new BehaviorSubject(0);
13
17
  /**
14
- * onDataLoaded: function($event)
15
- * Event emitted after the data is loaded
18
+ * @property onDataLoaded
19
+ * @description A BehaviorSubject that holds the loaded data or pagination information.
20
+ * This is emitted after the data is successfully loaded, providing a mechanism
21
+ * to track the loading state and any updates to the data.
22
+ * @type {BehaviorSubject<Pagination<TEntity> | any>}
16
23
  */
17
24
  onDataLoaded = new BehaviorSubject(null);
18
25
  /**
19
- * Used to power selecting one or more options from a list.
26
+ * @property selectionModel
27
+ * @description A SelectionModel to handle selection of one or more items from the data-table.
28
+ * It allows managing the selected items in the table and supports multiple selection.
29
+ * @type {SelectionModel<TEntity>}
20
30
  */
21
31
  selectionModel = new SelectionModel(true, []);
22
32
  /**
23
- * Gets reload token
33
+ * @property reloadToken
34
+ * @description A getter to return the current reload token.
35
+ * The reload token is used to trigger reloading of data.
36
+ * @type {number}
24
37
  */
25
38
  get reloadToken() { return this._reloadChange.value; }
26
39
  /**
27
- * Used to add some field filters
40
+ * @property fieldFilters
41
+ * @description An object used to store filters for specific fields in the data-table.
42
+ * It allows filtering of data based on specific field values.
43
+ * @type {any}
28
44
  */
29
45
  fieldFilters = {};
30
46
  /**
31
- * Used to add some field operators
47
+ * @property fieldOperators
48
+ * @description An object that stores operators to be applied on fields for filtering.
49
+ * It allows complex filtering operations (e.g., equals, contains, greater than).
50
+ * @type {any}
32
51
  */
33
52
  fieldOperators = {};
34
53
  /**
35
- * Used to add some static field filters
54
+ * @property staticFieldFilters
55
+ * @description An object to store static filters that are applied to the data-table.
56
+ * These filters are not dynamically set by the user but are always active.
57
+ * @type {any}
36
58
  */
37
59
  staticFieldFilters = {};
38
60
  /**
39
- * The current page index.
61
+ * @property pageIndex
62
+ * @description The index of the current page being viewed in the data-table.
63
+ * It starts from 0 and increments with each page change.
64
+ * @type {number}
40
65
  */
41
66
  pageIndex = 0;
42
67
  /**
43
- * The current total number of items being paged
68
+ * @property total
69
+ * @description The total number of items in the data source.
70
+ * This is typically used to calculate pagination.
71
+ * @type {number}
44
72
  */
45
73
  total = 0;
46
74
  /**
47
- * The current page size
75
+ * @property pageSize
76
+ * @description The number of items displayed per page in the data-table.
77
+ * It controls how many records are shown on a single page.
78
+ * @type {number}
48
79
  */
49
80
  pageSize = 15;
50
81
  /**
51
- * Number of pages
82
+ * @property pageCount
83
+ * @description The total number of pages based on the current page size and total items.
84
+ * This is calculated dynamically whenever data changes.
85
+ * @type {number}
52
86
  */
53
87
  pageCount = 0;
54
88
  /**
55
- * A flag to show loading process
89
+ * @property isLoading
90
+ * @description A flag indicating whether the data is currently being loaded.
91
+ * It is used to show a loading spinner or indicator while data is being fetched.
92
+ * @type {boolean}
56
93
  */
57
94
  isLoading = false;
58
95
  /**
59
- * Reloads items
60
- * @param clearSelection
96
+ * @method reload
97
+ * @description Reloads the table data by triggering a new random reload token.
98
+ * Optionally clears the selection if the `clearSelection` flag is set to true.
99
+ * @param {boolean} clearSelection - If true, clears the current selection after reload.
61
100
  */
62
101
  reload(clearSelection = true) {
102
+ /* Emit a new reload token to trigger data reload */
63
103
  this._reloadChange.next(Math.random());
104
+ /* Clear the selection if specified */
64
105
  if (clearSelection) {
65
106
  this.selectionModel.clear();
66
107
  }
67
108
  }
68
109
  /**
69
- * Used by the MatTable. Called when it connects to the data source.
110
+ * @method connect
111
+ * @description Called when the MatTable connects to the data source.
112
+ * This method subscribes to the reload token to trigger a filter update and data refresh.
70
113
  * @docs-private
114
+ * @returns {BehaviorSubject<TEntity[]>} A BehaviorSubject containing the current data array.
71
115
  */
72
116
  connect() {
117
+ /* Subscribe to the reload token and update filters accordingly */
73
118
  this._reloadChange.subscribe(x => {
74
- /* Remove empty filters */
75
- Object.keys(this.fieldFilters).forEach((key) => ((this.fieldFilters[key] == null || this.fieldFilters[key] == '' || this.fieldFilters[key] == 'undefined')) && this.fieldFilters[key] != 0 && delete this.fieldFilters[key]);
76
- Object.keys(this.staticFieldFilters).forEach((key) => ((this.staticFieldFilters[key] == null || this.staticFieldFilters[key] == '' || this.staticFieldFilters[key] == 'undefined')) && this.staticFieldFilters[key] != 0 && delete this.staticFieldFilters[key]);
119
+ /* Clean up any empty filters before applying them */
120
+ Object.keys(this.fieldFilters).forEach((key) => ((this.fieldFilters[key] == null || this.fieldFilters[key] === '' || this.fieldFilters[key] === 'undefined')) && this.fieldFilters[key] !== 0 && delete this.fieldFilters[key]);
121
+ Object.keys(this.staticFieldFilters).forEach((key) => ((this.staticFieldFilters[key] == null || this.staticFieldFilters[key] === '' || this.staticFieldFilters[key] === 'undefined')) && this.staticFieldFilters[key] !== 0 && delete this.staticFieldFilters[key]);
122
+ /* Apply filters dynamically to the table data */
77
123
  Object.keys(this.fieldFilters).forEach((key) => {
78
124
  this.filterPredicate = (data, filter) => !filter || `${data[key]}`.toLowerCase().includes(`${this.filter}`?.toLowerCase());
79
125
  this.filter = this.fieldFilters[key];
80
126
  });
81
127
  });
128
+ /* Return the data for the MatTable to display */
82
129
  return super.connect();
83
130
  }
84
131
  /**
85
- * Clears field filters
132
+ * @method clearFilters
133
+ * @description Clears all current field filters and resets pagination to the first page.
134
+ * Optionally accepts new filters to replace the existing ones.
135
+ * @param {any} newFilters - New filters to apply after clearing the previous ones.
86
136
  */
87
137
  clearFilters(newFilters = {}) {
138
+ /* Reset pagination to the first page */
88
139
  if (this.paginator) {
89
140
  this.paginator.pageIndex = 0;
90
141
  }
142
+ /* Apply the new filters */
91
143
  this.fieldFilters = newFilters || {};
92
144
  this.filter = '';
93
145
  this.reload();
94
146
  }
95
147
  /**
96
- * Checks, whether all items are selected
148
+ * @method isAllSelected
149
+ * @description Checks if all items in the current page are selected.
150
+ * @returns {boolean} True if all items are selected, false otherwise.
97
151
  */
98
152
  isAllSelected() {
153
+ /* If there are no selected items, return false */
99
154
  if (this.selectionModel.isEmpty()) {
100
155
  return false;
101
156
  }
157
+ /* Return true if the number of selected items matches the number of items on the current page */
102
158
  return this.selectionModel.selected.length === this.paginator?.length;
103
159
  }
104
160
  /**
105
- * Toggles selected items
106
- * @param checkbox
107
- * @param predicate
161
+ * @method toggleSelect
162
+ * @description Toggles the selection of all items in the current page.
163
+ * If items are already selected, they are cleared. If not, they are selected.
164
+ * @param {MatCheckboxChange} checkbox - The checkbox change event.
165
+ * @param {Function} predicate - Optional predicate to filter the items before selection.
108
166
  */
109
167
  toggleSelect(checkbox, predicate) {
168
+ /* If any items are selected, clear the selection */
110
169
  if (this.selectionModel.hasValue()) {
111
170
  this.selectionModel.clear();
112
171
  checkbox.source.checked = false;
113
172
  }
114
173
  else {
174
+ /* Otherwise, select all items that match the predicate */
115
175
  this.data.filter(predicate ? predicate : x => x)
116
176
  .filter(x => !x['locked'])
117
177
  .forEach(data => this.selectionModel.select(data));
178
+ /* If not all items are selected, uncheck the checkbox */
118
179
  if (this.selectionModel.selected.length !== this.paginator?.length) {
119
180
  checkbox.source.checked = false;
120
181
  }
121
182
  }
122
183
  }
123
184
  /**
124
- * Get selected Items
185
+ * @method getSelected
186
+ * @description Retrieves the selected items based on a specific key (e.g., 'id').
187
+ * @param {string} key - The key to extract from the selected items.
188
+ * @returns {TType[]} An array of selected items.
125
189
  */
126
190
  getSelected = (key = 'id') => this.selectionModel.selected.map(x => x[key]);
127
191
  }
128
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuc3RhdGljLWRhdGEtc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2RrL3NyYy9saWIvdGFibGUvdGFibGUuc3RhdGljLWRhdGEtc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR3ZDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHFCQUErQixTQUFRLGtCQUEyQjtJQUU5RTs7O09BR0c7SUFDSSxhQUFhLEdBQUcsSUFBSSxlQUFlLENBQVMsQ0FBQyxDQUFDLENBQUM7SUFFdEQ7OztPQUdHO0lBQ0ksWUFBWSxHQUFHLElBQUksZUFBZSxDQUE0QixJQUFJLENBQUMsQ0FBQztJQUUzRTs7T0FFRztJQUNJLGNBQWMsR0FBRyxJQUFJLGNBQWMsQ0FBVSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFOUQ7O09BRUc7SUFDSCxJQUFJLFdBQVcsS0FBYSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUU5RDs7T0FFRztJQUNJLFlBQVksR0FBUSxFQUFFLENBQUM7SUFFOUI7O09BRUc7SUFDSSxjQUFjLEdBQVEsRUFBRSxDQUFDO0lBRWhDOztPQUVHO0lBQ0ksa0JBQWtCLEdBQVEsRUFBRSxDQUFDO0lBRXBDOztPQUVHO0lBQ0ksU0FBUyxHQUFXLENBQUMsQ0FBQztJQUU3Qjs7T0FFRztJQUNJLEtBQUssR0FBVyxDQUFDLENBQUM7SUFFekI7O09BRUc7SUFDSSxRQUFRLEdBQVcsRUFBRSxDQUFDO0lBRTdCOztPQUVHO0lBQ0ksU0FBUyxHQUFXLENBQUMsQ0FBQztJQUU3Qjs7T0FFRztJQUNJLFNBQVMsR0FBWSxLQUFLLENBQUM7SUFFbEM7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLGlCQUEwQixJQUFJO1FBQzNDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBRXZDLElBQUksY0FBYyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixDQUFDO0lBQ0YsQ0FBQztJQUVEOzs7T0FHRztJQUNILE9BQU87UUFDTixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNoQywwQkFBMEI7WUFDMUIsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzdOLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUVqUSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDOUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLElBQWEsRUFBRSxNQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxJQUFJLEdBQUksSUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7Z0JBQ3JKLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0QyxDQUFDLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksWUFBWSxDQUFDLGFBQWtCLEVBQUU7UUFDdkMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLFVBQVUsSUFBSSxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0ksYUFBYTtRQUNuQixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUNuQyxPQUFPLEtBQUssQ0FBQztRQUNkLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQztJQUN2RSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFlBQVksQ0FBQyxRQUEyQixFQUFFLFNBQXdFO1FBQ3hILElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDNUIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLENBQUM7YUFBTSxDQUFDO1lBQ1AsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUM5QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFFLENBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDbEMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUVwRCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDO2dCQUNwRSxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDakMsQ0FBQztRQUNGLENBQUM7SUFDRixDQUFDO0lBRUQ7O09BRUc7SUFDSSxXQUFXLEdBQUcsQ0FBUSxNQUFjLElBQUksRUFBVyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUUsQ0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDcEgiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XHJcbmltcG9ydCB7IE1hdENoZWNrYm94Q2hhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xyXG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBQYWdpbmF0aW9uIH0gZnJvbSAnLi9tb2RlbHMvcGFnaW5hdGlvbic7XHJcblxyXG4vKipcclxuICogQSBnZW5lcmljIGRhdGFzb3VyY2UgZm9yIGRhdGEtdGFibGVcclxuICovXHJcbmV4cG9ydCBjbGFzcyBUYWJsZVN0YXRpY0RhdGFTb3VyY2U8VEVudGl0eT4gZXh0ZW5kcyBNYXRUYWJsZURhdGFTb3VyY2U8VEVudGl0eT4ge1xyXG5cclxuXHQvKipcclxuXHQgKiBfcmVsb2FkQ2hhbmdlOiBmdW5jdGlvbigkZXZlbnQpXHJcblx0ICogRXZlbnQgZW1pdHRlZCBhZnRlciB0aGUgZGF0YSBpcyBsb2FkZWRcclxuXHQgKi9cclxuXHRwdWJsaWMgX3JlbG9hZENoYW5nZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcclxuXHJcblx0LyoqXHJcblx0ICogb25EYXRhTG9hZGVkOiBmdW5jdGlvbigkZXZlbnQpXHJcblx0ICogRXZlbnQgZW1pdHRlZCBhZnRlciB0aGUgZGF0YSBpcyBsb2FkZWRcclxuXHQgKi9cclxuXHRwdWJsaWMgb25EYXRhTG9hZGVkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxQYWdpbmF0aW9uPFRFbnRpdHk+IHwgYW55PihudWxsKTtcclxuXHJcblx0LyoqXHJcblx0ICogVXNlZCB0byBwb3dlciBzZWxlY3Rpbmcgb25lIG9yIG1vcmUgb3B0aW9ucyBmcm9tIGEgbGlzdC5cclxuXHQgKi9cclxuXHRwdWJsaWMgc2VsZWN0aW9uTW9kZWwgPSBuZXcgU2VsZWN0aW9uTW9kZWw8VEVudGl0eT4odHJ1ZSwgW10pO1xyXG5cclxuXHQvKipcclxuXHQgKiBHZXRzIHJlbG9hZCB0b2tlblxyXG5cdCAqL1xyXG5cdGdldCByZWxvYWRUb2tlbigpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fcmVsb2FkQ2hhbmdlLnZhbHVlOyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVzZWQgdG8gYWRkIHNvbWUgZmllbGQgZmlsdGVyc1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBmaWVsZEZpbHRlcnM6IGFueSA9IHt9O1xyXG5cclxuXHQvKipcclxuXHQgKiBVc2VkIHRvIGFkZCBzb21lIGZpZWxkIG9wZXJhdG9yc1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBmaWVsZE9wZXJhdG9yczogYW55ID0ge307XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVzZWQgdG8gYWRkIHNvbWUgc3RhdGljIGZpZWxkIGZpbHRlcnNcclxuXHQgKi9cclxuXHRwdWJsaWMgc3RhdGljRmllbGRGaWx0ZXJzOiBhbnkgPSB7fTtcclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGN1cnJlbnQgcGFnZSBpbmRleC5cclxuXHQgKi9cclxuXHRwdWJsaWMgcGFnZUluZGV4OiBudW1iZXIgPSAwO1xyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgY3VycmVudCB0b3RhbCBudW1iZXIgb2YgaXRlbXMgYmVpbmcgcGFnZWRcclxuXHQgKi9cclxuXHRwdWJsaWMgdG90YWw6IG51bWJlciA9IDA7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBjdXJyZW50IHBhZ2Ugc2l6ZVxyXG5cdCAqL1xyXG5cdHB1YmxpYyBwYWdlU2l6ZTogbnVtYmVyID0gMTU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIE51bWJlciBvZiBwYWdlc1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBwYWdlQ291bnQ6IG51bWJlciA9IDA7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgZmxhZyB0byBzaG93IGxvYWRpbmcgcHJvY2Vzc1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogUmVsb2FkcyBpdGVtc1xyXG5cdCAqIEBwYXJhbSBjbGVhclNlbGVjdGlvbiBcclxuXHQgKi9cclxuXHRwdWJsaWMgcmVsb2FkKGNsZWFyU2VsZWN0aW9uOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG5cdFx0dGhpcy5fcmVsb2FkQ2hhbmdlLm5leHQoTWF0aC5yYW5kb20oKSk7XHJcblxyXG5cdFx0aWYgKGNsZWFyU2VsZWN0aW9uKSB7XHJcblx0XHRcdHRoaXMuc2VsZWN0aW9uTW9kZWwuY2xlYXIoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVzZWQgYnkgdGhlIE1hdFRhYmxlLiBDYWxsZWQgd2hlbiBpdCBjb25uZWN0cyB0byB0aGUgZGF0YSBzb3VyY2UuXHJcblx0ICogQGRvY3MtcHJpdmF0ZVxyXG5cdCAqL1xyXG5cdGNvbm5lY3QoKTogQmVoYXZpb3JTdWJqZWN0PFRFbnRpdHlbXT4ge1xyXG5cdFx0dGhpcy5fcmVsb2FkQ2hhbmdlLnN1YnNjcmliZSh4ID0+IHtcclxuXHRcdFx0LyogUmVtb3ZlIGVtcHR5IGZpbHRlcnMgKi9cclxuXHRcdFx0T2JqZWN0LmtleXModGhpcy5maWVsZEZpbHRlcnMpLmZvckVhY2goKGtleSkgPT4gKCh0aGlzLmZpZWxkRmlsdGVyc1trZXldID09IG51bGwgfHwgdGhpcy5maWVsZEZpbHRlcnNba2V5XSA9PSAnJyB8fCB0aGlzLmZpZWxkRmlsdGVyc1trZXldID09ICd1bmRlZmluZWQnKSkgJiYgdGhpcy5maWVsZEZpbHRlcnNba2V5XSAhPSAwICYmIGRlbGV0ZSB0aGlzLmZpZWxkRmlsdGVyc1trZXldKTtcclxuXHRcdFx0T2JqZWN0LmtleXModGhpcy5zdGF0aWNGaWVsZEZpbHRlcnMpLmZvckVhY2goKGtleSkgPT4gKCh0aGlzLnN0YXRpY0ZpZWxkRmlsdGVyc1trZXldID09IG51bGwgfHwgdGhpcy5zdGF0aWNGaWVsZEZpbHRlcnNba2V5XSA9PSAnJyB8fCB0aGlzLnN0YXRpY0ZpZWxkRmlsdGVyc1trZXldID09ICd1bmRlZmluZWQnKSkgJiYgdGhpcy5zdGF0aWNGaWVsZEZpbHRlcnNba2V5XSAhPSAwICYmIGRlbGV0ZSB0aGlzLnN0YXRpY0ZpZWxkRmlsdGVyc1trZXldKTtcclxuXHJcblx0XHRcdE9iamVjdC5rZXlzKHRoaXMuZmllbGRGaWx0ZXJzKS5mb3JFYWNoKChrZXkpID0+IHtcclxuXHRcdFx0XHR0aGlzLmZpbHRlclByZWRpY2F0ZSA9IChkYXRhOiBURW50aXR5LCBmaWx0ZXI6IHN0cmluZykgPT4gIWZpbHRlciB8fCBgJHsoZGF0YSBhcyBhbnkpW2tleV19YC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGAke3RoaXMuZmlsdGVyfWA/LnRvTG93ZXJDYXNlKCkpO1xyXG5cdFx0XHRcdHRoaXMuZmlsdGVyID0gdGhpcy5maWVsZEZpbHRlcnNba2V5XTtcclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRyZXR1cm4gc3VwZXIuY29ubmVjdCgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2xlYXJzIGZpZWxkIGZpbHRlcnNcclxuXHQgKi9cclxuXHRwdWJsaWMgY2xlYXJGaWx0ZXJzKG5ld0ZpbHRlcnM6IGFueSA9IHt9KTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5wYWdpbmF0b3IpIHtcclxuXHRcdFx0dGhpcy5wYWdpbmF0b3IucGFnZUluZGV4ID0gMDtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmZpZWxkRmlsdGVycyA9IG5ld0ZpbHRlcnMgfHwge307XHJcblx0XHR0aGlzLmZpbHRlciA9ICcnO1xyXG5cdFx0dGhpcy5yZWxvYWQoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENoZWNrcywgd2hldGhlciBhbGwgaXRlbXMgYXJlIHNlbGVjdGVkXHJcblx0ICovXHJcblx0cHVibGljIGlzQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB7XHJcblx0XHRpZiAodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc0VtcHR5KCkpIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkLmxlbmd0aCA9PT0gdGhpcy5wYWdpbmF0b3I/Lmxlbmd0aDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRvZ2dsZXMgc2VsZWN0ZWQgaXRlbXNcclxuXHQgKiBAcGFyYW0gY2hlY2tib3ggXHJcblx0ICogQHBhcmFtIHByZWRpY2F0ZVxyXG5cdCAqL1xyXG5cdHB1YmxpYyB0b2dnbGVTZWxlY3QoY2hlY2tib3g6IE1hdENoZWNrYm94Q2hhbmdlLCBwcmVkaWNhdGU/OiAodmFsdWU6IFRFbnRpdHksIGluZGV4OiBudW1iZXIsIGFycmF5OiBURW50aXR5W10pID0+IHVua25vd24pIHtcclxuXHRcdGlmICh0aGlzLnNlbGVjdGlvbk1vZGVsLmhhc1ZhbHVlKCkpIHtcclxuXHRcdFx0dGhpcy5zZWxlY3Rpb25Nb2RlbC5jbGVhcigpO1xyXG5cdFx0XHRjaGVja2JveC5zb3VyY2UuY2hlY2tlZCA9IGZhbHNlO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5kYXRhLmZpbHRlcihwcmVkaWNhdGUgPyBwcmVkaWNhdGUgOiB4ID0+IHgpXHJcblx0XHRcdFx0LmZpbHRlcih4ID0+ICEoeCBhcyBhbnkpWydsb2NrZWQnXSlcclxuXHRcdFx0XHQuZm9yRWFjaChkYXRhID0+IHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0KGRhdGEpKTtcclxuXHJcblx0XHRcdGlmICh0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkLmxlbmd0aCAhPT0gdGhpcy5wYWdpbmF0b3I/Lmxlbmd0aCkge1xyXG5cdFx0XHRcdGNoZWNrYm94LnNvdXJjZS5jaGVja2VkID0gZmFsc2U7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldCBzZWxlY3RlZCBJdGVtc1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBnZXRTZWxlY3RlZCA9IDxUVHlwZT4oa2V5OiBzdHJpbmcgPSAnaWQnKTogVFR5cGVbXSA9PiB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkLm1hcCh4ID0+ICh4IGFzIGFueSlba2V5XSk7XHJcbn0iXX0=
192
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuc3RhdGljLWRhdGEtc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2RrL3NyYy9saWIvdGFibGUvdGFibGUuc3RhdGljLWRhdGEtc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR3ZDOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8scUJBQStCLFNBQVEsa0JBQTJCO0lBRTlFOzs7OztPQUtHO0lBQ0ksYUFBYSxHQUFHLElBQUksZUFBZSxDQUFTLENBQUMsQ0FBQyxDQUFDO0lBRXREOzs7Ozs7T0FNRztJQUNJLFlBQVksR0FBRyxJQUFJLGVBQWUsQ0FBNEIsSUFBSSxDQUFDLENBQUM7SUFFM0U7Ozs7O09BS0c7SUFDSSxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQVUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRTlEOzs7OztPQUtHO0lBQ0gsSUFBSSxXQUFXLEtBQWEsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFFOUQ7Ozs7O09BS0c7SUFDSSxZQUFZLEdBQVEsRUFBRSxDQUFDO0lBRTlCOzs7OztPQUtHO0lBQ0ksY0FBYyxHQUFRLEVBQUUsQ0FBQztJQUVoQzs7Ozs7T0FLRztJQUNJLGtCQUFrQixHQUFRLEVBQUUsQ0FBQztJQUVwQzs7Ozs7T0FLRztJQUNJLFNBQVMsR0FBVyxDQUFDLENBQUM7SUFFN0I7Ozs7O09BS0c7SUFDSSxLQUFLLEdBQVcsQ0FBQyxDQUFDO0lBRXpCOzs7OztPQUtHO0lBQ0ksUUFBUSxHQUFXLEVBQUUsQ0FBQztJQUU3Qjs7Ozs7T0FLRztJQUNJLFNBQVMsR0FBVyxDQUFDLENB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RUFBVyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUUsQ0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDcEgiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XHJcbmltcG9ydCB7IE1hdENoZWNrYm94Q2hhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xyXG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBQYWdpbmF0aW9uIH0gZnJvbSAnLi9tb2RlbHMvcGFnaW5hdGlvbic7XHJcblxyXG4vKipcclxuICogQSBnZW5lcmljIGRhdGFzb3VyY2UgY2xhc3MgZm9yIHdvcmtpbmcgd2l0aCBkYXRhLXRhYmxlcyBpbiBBbmd1bGFyIE1hdGVyaWFsLlxyXG4gKiBUaGlzIGNsYXNzIGV4dGVuZHMgTWF0VGFibGVEYXRhU291cmNlIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IGxpa2UgXHJcbiAqIHNlbGVjdGlvbiBtYW5hZ2VtZW50LCBwYWdpbmF0aW9uLCBhbmQgZmlsdGVyaW5nLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFRhYmxlU3RhdGljRGF0YVNvdXJjZTxURW50aXR5PiBleHRlbmRzIE1hdFRhYmxlRGF0YVNvdXJjZTxURW50aXR5PiB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEBwcm9wZXJ0eSBfcmVsb2FkQ2hhbmdlXHJcblx0ICogQGRlc2NyaXB0aW9uIEEgQmVoYXZpb3JTdWJqZWN0IHRoYXQgdHJpZ2dlcnMgYSByZWxvYWQgb2YgdGhlIHRhYmxlIGRhdGEuIFxyXG5cdCAqIFRoZSB2YWx1ZSBpcyB1c2VkIGFzIGEgcmVsb2FkIHRva2VuLCBlbnN1cmluZyB0aGUgZGF0YSBpcyByZWxvYWRlZCB3aGVuIGl0IGNoYW5nZXMuXHJcblx0ICogQHR5cGUge0JlaGF2aW9yU3ViamVjdDxudW1iZXI+fVxyXG5cdCAqL1xyXG5cdHB1YmxpYyBfcmVsb2FkQ2hhbmdlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xyXG5cclxuXHQvKipcclxuXHQgKiBAcHJvcGVydHkgb25EYXRhTG9hZGVkXHJcblx0ICogQGRlc2NyaXB0aW9uIEEgQmVoYXZpb3JTdWJqZWN0IHRoYXQgaG9sZHMgdGhlIGxvYWRlZCBkYXRhIG9yIHBhZ2luYXRpb24gaW5mb3JtYXRpb24uXHJcblx0ICogVGhpcyBpcyBlbWl0dGVkIGFmdGVyIHRoZSBkYXRhIGlzIHN1Y2Nlc3NmdWxseSBsb2FkZWQsIHByb3ZpZGluZyBhIG1lY2hhbmlzbSBcclxuXHQgKiB0byB0cmFjayB0aGUgbG9hZGluZyBzdGF0ZSBhbmQgYW55IHVwZGF0ZXMgdG8gdGhlIGRhdGEuXHJcblx0ICogQHR5cGUge0JlaGF2aW9yU3ViamVjdDxQYWdpbmF0aW9uPFRFbnRpdHk+IHwgYW55Pn1cclxuXHQgKi9cclxuXHRwdWJsaWMgb25EYXRhTG9hZGVkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxQYWdpbmF0aW9uPFRFbnRpdHk+IHwgYW55PihudWxsKTtcclxuXHJcblx0LyoqXHJcblx0ICogQHByb3BlcnR5IHNlbGVjdGlvbk1vZGVsXHJcblx0ICogQGRlc2NyaXB0aW9uIEEgU2VsZWN0aW9uTW9kZWwgdG8gaGFuZGxlIHNlbGVjdGlvbiBvZiBvbmUgb3IgbW9yZSBpdGVtcyBmcm9tIHRoZSBkYXRhLXRhYmxlLlxyXG5cdCAqIEl0IGFsbG93cyBtYW5hZ2luZyB0aGUgc2VsZWN0ZWQgaXRlbXMgaW4gdGhlIHRhYmxlIGFuZCBzdXBwb3J0cyBtdWx0aXBsZSBzZWxlY3Rpb24uXHJcblx0ICogQHR5cGUge1NlbGVjdGlvbk1vZGVsPFRFbnRpdHk+fVxyXG5cdCAqL1xyXG5cdHB1YmxpYyBzZWxlY3Rpb25Nb2RlbCA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxURW50aXR5Pih0cnVlLCBbXSk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEBwcm9wZXJ0eSByZWxvYWRUb2tlblxyXG5cdCAqIEBkZXNjcmlwdGlvbiBBIGdldHRlciB0byByZXR1cm4gdGhlIGN1cnJlbnQgcmVsb2FkIHRva2VuLiBcclxuXHQgKiBUaGUgcmVsb2FkIHRva2VuIGlzIHVzZWQgdG8gdHJpZ2dlciByZWxvYWRpbmcgb2YgZGF0YS5cclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqL1xyXG5cdGdldCByZWxvYWRUb2tlbigpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fcmVsb2FkQ2hhbmdlLnZhbHVlOyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEBwcm9wZXJ0eSBmaWVsZEZpbHRlcnNcclxuXHQgKiBAZGVzY3JpcHRpb24gQW4gb2JqZWN0IHVzZWQgdG8gc3RvcmUgZmlsdGVycyBmb3Igc3BlY2lmaWMgZmllbGRzIGluIHRoZSBkYXRhLXRhYmxlLlxyXG5cdCAqIEl0IGFsbG93cyBmaWx0ZXJpbmcgb2YgZGF0YSBiYXNlZCBvbiBzcGVjaWZpYyBmaWVsZCB2YWx1ZXMuXHJcblx0ICogQHR5cGUge2FueX1cclxuXHQgKi9cclxuXHRwdWJsaWMgZmllbGRGaWx0ZXJzOiBhbnkgPSB7fTtcclxuXHJcblx0LyoqXHJcblx0ICogQHByb3BlcnR5IGZpZWxkT3BlcmF0b3JzXHJcblx0ICogQGRlc2NyaXB0aW9uIEFuIG9iamVjdCB0aGF0IHN0b3JlcyBvcGVyYXRvcnMgdG8gYmUgYXBwbGllZCBvbiBmaWVsZHMgZm9yIGZpbHRlcmluZy5cclxuXHQgKiBJdCBhbGxvd3MgY29tcGxleCBmaWx0ZXJpbmcgb3BlcmF0aW9ucyAoZS5nLiwgZXF1YWxzLCBjb250YWlucywgZ3JlYXRlciB0aGFuKS5cclxuXHQgKiBAdHlwZSB7YW55fVxyXG5cdCAqL1xyXG5cdHB1YmxpYyBmaWVsZE9wZXJhdG9yczogYW55ID0ge307XHJcblxyXG5cdC8qKlxyXG5cdCAqIEBwcm9wZXJ0eSBzdGF0aWNGaWVsZEZpbHRlcnNcclxuXHQgKiBAZGVzY3JpcHRpb24gQW4gb2JqZWN0IHRvIHN0b3JlIHN0YXRpYyBmaWx0ZXJzIHRoYXQgYXJlIGFwcGxpZWQgdG8gdGhlIGRhdGEtdGFibGUuXHJcblx0ICogVGhlc2UgZmlsdGVycyBhcmUgbm90IGR5bmFtaWNhbGx5IHNldCBieSB0aGUgdXNlciBidXQgYXJlIGFsd2F5cyBhY3RpdmUuXHJcblx0ICogQHR5cGUge2FueX1cclxuXHQgKi9cclxuXHRwdWJsaWMgc3RhdGljRmllbGRGaWx0ZXJzOiBhbnkgPSB7fTtcclxuXHJcblx0LyoqXHJcblx0ICogQHByb3BlcnR5IHBhZ2VJbmRleFxyXG5cdCAqIEBkZXNjcmlwdGlvbiBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgcGFnZSBiZWluZyB2aWV3ZWQgaW4gdGhlIGRhdGEtdGFibGUuIFxyXG5cdCAqIEl0IHN0YXJ0cyBmcm9tIDAgYW5kIGluY3JlbWVudHMgd2l0aCBlYWNoIHBhZ2UgY2hhbmdlLlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICovXHJcblx0cHVibGljIHBhZ2VJbmRleDogbnVtYmVyID0gMDtcclxuXHJcblx0LyoqXHJcblx0ICogQHByb3BlcnR5IHRvdGFsXHJcblx0ICogQGRlc2NyaXB0aW9uIFRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGRhdGEgc291cmNlLiBcclxuXHQgKiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIHRvIGNhbGN1bGF0ZSBwYWdpbmF0aW9uLlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICovXHJcblx0cHVibGljIHRvdGFsOiBudW1iZXIgPSAwO1xyXG5cclxuXHQvKipcclxuXHQgKiBAcHJvcGVydHkgcGFnZVNpemVcclxuXHQgKiBAZGVzY3JpcHRpb24gVGhlIG51bWJlciBvZiBpdGVtcyBkaXNwbGF5ZWQgcGVyIHBhZ2UgaW4gdGhlIGRhdGEtdGFibGUuXHJcblx0ICogSXQgY29udHJvbHMgaG93IG1hbnkgcmVjb3JkcyBhcmUgc2hvd24gb24gYSBzaW5nbGUgcGFnZS5cclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqL1xyXG5cdHB1YmxpYyBwYWdlU2l6ZTogbnVtYmVyID0gMTU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEBwcm9wZXJ0eSBwYWdlQ291bnRcclxuXHQgKiBAZGVzY3JpcHRpb24gVGhlIHRvdGFsIG51bWJlciBvZiBwYWdlcyBiYXNlZCBvbiB0aGUgY3VycmVudCBwYWdlIHNpemUgYW5kIHRvdGFsIGl0ZW1zLlxyXG5cdCAqIFRoaXMgaXMgY2FsY3VsYXRlZCBkeW5hbWljYWxseSB3aGVuZXZlciBkYXRhIGNoYW5nZXMuXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKi9cclxuXHRwdWJsaWMgcGFnZUNvdW50OiBudW1iZXIgPSAwO1xyXG5cclxuXHQvKipcclxuXHQgKiBAcHJvcGVydHkgaXNMb2FkaW5nXHJcblx0ICogQGRlc2NyaXB0aW9uIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGRhdGEgaXMgY3VycmVudGx5IGJlaW5nIGxvYWRlZC5cclxuXHQgKiBJdCBpcyB1c2VkIHRvIHNob3cgYSBsb2FkaW5nIHNwaW5uZXIgb3IgaW5kaWNhdG9yIHdoaWxlIGRhdGEgaXMgYmVpbmcgZmV0Y2hlZC5cclxuXHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHQgKi9cclxuXHRwdWJsaWMgaXNMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEBtZXRob2QgcmVsb2FkXHJcblx0ICogQGRlc2NyaXB0aW9uIFJlbG9hZHMgdGhlIHRhYmxlIGRhdGEgYnkgdHJpZ2dlcmluZyBhIG5ldyByYW5kb20gcmVsb2FkIHRva2VuLlxyXG5cdCAqIE9wdGlvbmFsbHkgY2xlYXJzIHRoZSBzZWxlY3Rpb24gaWYgdGhlIGBjbGVhclNlbGVjdGlvbmAgZmxhZyBpcyBzZXQgdG8gdHJ1ZS5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGNsZWFyU2VsZWN0aW9uIC0gSWYgdHJ1ZSwgY2xlYXJzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBhZnRlciByZWxvYWQuXHJcblx0ICovXHJcblx0cHVibGljIHJlbG9hZChjbGVhclNlbGVjdGlvbjogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuXHRcdC8qIEVtaXQgYSBuZXcgcmVsb2FkIHRva2VuIHRvIHRyaWdnZXIgZGF0YSByZWxvYWQgKi9cclxuXHRcdHRoaXMuX3JlbG9hZENoYW5nZS5uZXh0KE1hdGgucmFuZG9tKCkpO1xyXG5cclxuXHRcdC8qIENsZWFyIHRoZSBzZWxlY3Rpb24gaWYgc3BlY2lmaWVkICovXHJcblx0XHRpZiAoY2xlYXJTZWxlY3Rpb24pIHtcclxuXHRcdFx0dGhpcy5zZWxlY3Rpb25Nb2RlbC5jbGVhcigpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQG1ldGhvZCBjb25uZWN0XHJcblx0ICogQGRlc2NyaXB0aW9uIENhbGxlZCB3aGVuIHRoZSBNYXRUYWJsZSBjb25uZWN0cyB0byB0aGUgZGF0YSBzb3VyY2UuIFxyXG5cdCAqIFRoaXMgbWV0aG9kIHN1YnNjcmliZXMgdG8gdGhlIHJlbG9hZCB0b2tlbiB0byB0cmlnZ2VyIGEgZmlsdGVyIHVwZGF0ZSBhbmQgZGF0YSByZWZyZXNoLlxyXG5cdCAqIEBkb2NzLXByaXZhdGVcclxuXHQgKiBAcmV0dXJucyB7QmVoYXZpb3JTdWJqZWN0PFRFbnRpdHlbXT59IEEgQmVoYXZpb3JTdWJqZWN0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgZGF0YSBhcnJheS5cclxuXHQgKi9cclxuXHRjb25uZWN0KCk6IEJlaGF2aW9yU3ViamVjdDxURW50aXR5W10+IHtcclxuXHRcdC8qIFN1YnNjcmliZSB0byB0aGUgcmVsb2FkIHRva2VuIGFuZCB1cGRhdGUgZmlsdGVycyBhY2NvcmRpbmdseSAqL1xyXG5cdFx0dGhpcy5fcmVsb2FkQ2hhbmdlLnN1YnNjcmliZSh4ID0+IHtcclxuXHRcdFx0LyogQ2xlYW4gdXAgYW55IGVtcHR5IGZpbHRlcnMgYmVmb3JlIGFwcGx5aW5nIHRoZW0gKi9cclxuXHRcdFx0T2JqZWN0LmtleXModGhpcy5maWVsZEZpbHRlcnMpLmZvckVhY2goKGtleSkgPT5cclxuXHRcdFx0XHQoKHRoaXMuZmllbGRGaWx0ZXJzW2tleV0gPT0gbnVsbCB8fCB0aGlzLmZpZWxkRmlsdGVyc1trZXldID09PSAnJyB8fCB0aGlzLmZpZWxkRmlsdGVyc1trZXldID09PSAndW5kZWZpbmVkJykpICYmIHRoaXMuZmllbGRGaWx0ZXJzW2tleV0gIT09IDAgJiYgZGVsZXRlIHRoaXMuZmllbGRGaWx0ZXJzW2tleV0pO1xyXG5cdFx0XHRPYmplY3Qua2V5cyh0aGlzLnN0YXRpY0ZpZWxkRmlsdGVycykuZm9yRWFjaCgoa2V5KSA9PlxyXG5cdFx0XHRcdCgodGhpcy5zdGF0aWNGaWVsZEZpbHRlcnNba2V5XSA9PSBudWxsIHx8IHRoaXMuc3RhdGljRmllbGRGaWx0ZXJzW2tleV0gPT09ICcnIHx8IHRoaXMuc3RhdGljRmllbGRGaWx0ZXJzW2tleV0gPT09ICd1bmRlZmluZWQnKSkgJiYgdGhpcy5zdGF0aWNGaWVsZEZpbHRlcnNba2V5XSAhPT0gMCAmJiBkZWxldGUgdGhpcy5zdGF0aWNGaWVsZEZpbHRlcnNba2V5XSk7XHJcblxyXG5cdFx0XHQvKiBBcHBseSBmaWx0ZXJzIGR5bmFtaWNhbGx5IHRvIHRoZSB0YWJsZSBkYXRhICovXHJcblx0XHRcdE9iamVjdC5rZXlzKHRoaXMuZmllbGRGaWx0ZXJzKS5mb3JFYWNoKChrZXkpID0+IHtcclxuXHRcdFx0XHR0aGlzLmZpbHRlclByZWRpY2F0ZSA9IChkYXRhOiBURW50aXR5LCBmaWx0ZXI6IHN0cmluZykgPT4gIWZpbHRlciB8fCBgJHsoZGF0YSBhcyBhbnkpW2tleV19YC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGAke3RoaXMuZmlsdGVyfWA/LnRvTG93ZXJDYXNlKCkpO1xyXG5cdFx0XHRcdHRoaXMuZmlsdGVyID0gdGhpcy5maWVsZEZpbHRlcnNba2V5XTtcclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHJcblx0XHQvKiBSZXR1cm4gdGhlIGRhdGEgZm9yIHRoZSBNYXRUYWJsZSB0byBkaXNwbGF5ICovXHJcblx0XHRyZXR1cm4gc3VwZXIuY29ubmVjdCgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQG1ldGhvZCBjbGVhckZpbHRlcnNcclxuXHQgKiBAZGVzY3JpcHRpb24gQ2xlYXJzIGFsbCBjdXJyZW50IGZpZWxkIGZpbHRlcnMgYW5kIHJlc2V0cyBwYWdpbmF0aW9uIHRvIHRoZSBmaXJzdCBwYWdlLlxyXG5cdCAqIE9wdGlvbmFsbHkgYWNjZXB0cyBuZXcgZmlsdGVycyB0byByZXBsYWNlIHRoZSBleGlzdGluZyBvbmVzLlxyXG5cdCAqIEBwYXJhbSB7YW55fSBuZXdGaWx0ZXJzIC0gTmV3IGZpbHRlcnMgdG8gYXBwbHkgYWZ0ZXIgY2xlYXJpbmcgdGhlIHByZXZpb3VzIG9uZXMuXHJcblx0ICovXHJcblx0cHVibGljIGNsZWFyRmlsdGVycyhuZXdGaWx0ZXJzOiBhbnkgPSB7fSk6IHZvaWQge1xyXG5cdFx0LyogUmVzZXQgcGFnaW5hdGlvbiB0byB0aGUgZmlyc3QgcGFnZSAqL1xyXG5cdFx0aWYgKHRoaXMucGFnaW5hdG9yKSB7XHJcblx0XHRcdHRoaXMucGFnaW5hdG9yLnBhZ2VJbmRleCA9IDA7XHJcblx0XHR9XHJcblxyXG5cdFx0LyogQXBwbHkgdGhlIG5ldyBmaWx0ZXJzICovXHJcblx0XHR0aGlzLmZpZWxkRmlsdGVycyA9IG5ld0ZpbHRlcnMgfHwge307XHJcblx0XHR0aGlzLmZpbHRlciA9ICcnO1xyXG5cdFx0dGhpcy5yZWxvYWQoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEBtZXRob2QgaXNBbGxTZWxlY3RlZFxyXG5cdCAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYWxsIGl0ZW1zIGluIHRoZSBjdXJyZW50IHBhZ2UgYXJlIHNlbGVjdGVkLlxyXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGFsbCBpdGVtcyBhcmUgc2VsZWN0ZWQsIGZhbHNlIG90aGVyd2lzZS5cclxuXHQgKi9cclxuXHRwdWJsaWMgaXNBbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcclxuXHRcdC8qIElmIHRoZXJlIGFyZSBubyBzZWxlY3RlZCBpdGVtcywgcmV0dXJuIGZhbHNlICovXHJcblx0XHRpZiAodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc0VtcHR5KCkpIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIFJldHVybiB0cnVlIGlmIHRoZSBudW1iZXIgb2Ygc2VsZWN0ZWQgaXRlbXMgbWF0Y2hlcyB0aGUgbnVtYmVyIG9mIGl0ZW1zIG9uIHRoZSBjdXJyZW50IHBhZ2UgKi9cclxuXHRcdHJldHVybiB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkLmxlbmd0aCA9PT0gdGhpcy5wYWdpbmF0b3I/Lmxlbmd0aDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEBtZXRob2QgdG9nZ2xlU2VsZWN0XHJcblx0ICogQGRlc2NyaXB0aW9uIFRvZ2dsZXMgdGhlIHNlbGVjdGlvbiBvZiBhbGwgaXRlbXMgaW4gdGhlIGN1cnJlbnQgcGFnZS5cclxuXHQgKiBJZiBpdGVtcyBhcmUgYWxyZWFkeSBzZWxlY3RlZCwgdGhleSBhcmUgY2xlYXJlZC4gSWYgbm90LCB0aGV5IGFyZSBzZWxlY3RlZC5cclxuXHQgKiBAcGFyYW0ge01hdENoZWNrYm94Q2hhbmdlfSBjaGVja2JveCAtIFRoZSBjaGVja2JveCBjaGFuZ2UgZXZlbnQuXHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIC0gT3B0aW9uYWwgcHJlZGljYXRlIHRvIGZpbHRlciB0aGUgaXRlbXMgYmVmb3JlIHNlbGVjdGlvbi5cclxuXHQgKi9cclxuXHRwdWJsaWMgdG9nZ2xlU2VsZWN0KGNoZWNrYm94OiBNYXRDaGVja2JveENoYW5nZSwgcHJlZGljYXRlPzogKHZhbHVlOiBURW50aXR5LCBpbmRleDogbnVtYmVyLCBhcnJheTogVEVudGl0eVtdKSA9PiB1bmtub3duKSB7XHJcblx0XHQvKiBJZiBhbnkgaXRlbXMgYXJlIHNlbGVjdGVkLCBjbGVhciB0aGUgc2VsZWN0aW9uICovXHJcblx0XHRpZiAodGhpcy5zZWxlY3Rpb25Nb2RlbC5oYXNWYWx1ZSgpKSB7XHJcblx0XHRcdHRoaXMuc2VsZWN0aW9uTW9kZWwuY2xlYXIoKTtcclxuXHRcdFx0Y2hlY2tib3guc291cmNlLmNoZWNrZWQgPSBmYWxzZTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdC8qIE90aGVyd2lzZSwgc2VsZWN0IGFsbCBpdGVtcyB0aGF0IG1hdGNoIHRoZSBwcmVkaWNhdGUgKi9cclxuXHRcdFx0dGhpcy5kYXRhLmZpbHRlcihwcmVkaWNhdGUgPyBwcmVkaWNhdGUgOiB4ID0+IHgpXHJcblx0XHRcdFx0LmZpbHRlcih4ID0+ICEoeCBhcyBhbnkpWydsb2NrZWQnXSlcclxuXHRcdFx0XHQuZm9yRWFjaChkYXRhID0+IHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0KGRhdGEpKTtcclxuXHJcblx0XHRcdC8qIElmIG5vdCBhbGwgaXRlbXMgYXJlIHNlbGVjdGVkLCB1bmNoZWNrIHRoZSBjaGVja2JveCAqL1xyXG5cdFx0XHRpZiAodGhpcy5zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZC5sZW5ndGggIT09IHRoaXMucGFnaW5hdG9yPy5sZW5ndGgpIHtcclxuXHRcdFx0XHRjaGVja2JveC5zb3VyY2UuY2hlY2tlZCA9IGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBAbWV0aG9kIGdldFNlbGVjdGVkXHJcblx0ICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgc2VsZWN0ZWQgaXRlbXMgYmFzZWQgb24gYSBzcGVjaWZpYyBrZXkgKGUuZy4sICdpZCcpLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IHRvIGV4dHJhY3QgZnJvbSB0aGUgc2VsZWN0ZWQgaXRlbXMuXHJcblx0ICogQHJldHVybnMge1RUeXBlW119IEFuIGFycmF5IG9mIHNlbGVjdGVkIGl0ZW1zLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBnZXRTZWxlY3RlZCA9IDxUVHlwZT4oa2V5OiBzdHJpbmcgPSAnaWQnKTogVFR5cGVbXSA9PiB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkLm1hcCh4ID0+ICh4IGFzIGFueSlba2V5XSk7XHJcbn0iXX0=
@@ -13970,126 +13970,190 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
13970
13970
  }] });
13971
13971
 
13972
13972
  /**
13973
- * A generic datasource for data-table
13973
+ * A generic datasource class for working with data-tables in Angular Material.
13974
+ * This class extends MatTableDataSource to provide additional functionality like
13975
+ * selection management, pagination, and filtering.
13974
13976
  */
13975
13977
  class TableStaticDataSource extends MatTableDataSource {
13976
13978
  /**
13977
- * _reloadChange: function($event)
13978
- * Event emitted after the data is loaded
13979
+ * @property _reloadChange
13980
+ * @description A BehaviorSubject that triggers a reload of the table data.
13981
+ * The value is used as a reload token, ensuring the data is reloaded when it changes.
13982
+ * @type {BehaviorSubject<number>}
13979
13983
  */
13980
13984
  _reloadChange = new BehaviorSubject(0);
13981
13985
  /**
13982
- * onDataLoaded: function($event)
13983
- * Event emitted after the data is loaded
13986
+ * @property onDataLoaded
13987
+ * @description A BehaviorSubject that holds the loaded data or pagination information.
13988
+ * This is emitted after the data is successfully loaded, providing a mechanism
13989
+ * to track the loading state and any updates to the data.
13990
+ * @type {BehaviorSubject<Pagination<TEntity> | any>}
13984
13991
  */
13985
13992
  onDataLoaded = new BehaviorSubject(null);
13986
13993
  /**
13987
- * Used to power selecting one or more options from a list.
13994
+ * @property selectionModel
13995
+ * @description A SelectionModel to handle selection of one or more items from the data-table.
13996
+ * It allows managing the selected items in the table and supports multiple selection.
13997
+ * @type {SelectionModel<TEntity>}
13988
13998
  */
13989
13999
  selectionModel = new SelectionModel(true, []);
13990
14000
  /**
13991
- * Gets reload token
14001
+ * @property reloadToken
14002
+ * @description A getter to return the current reload token.
14003
+ * The reload token is used to trigger reloading of data.
14004
+ * @type {number}
13992
14005
  */
13993
14006
  get reloadToken() { return this._reloadChange.value; }
13994
14007
  /**
13995
- * Used to add some field filters
14008
+ * @property fieldFilters
14009
+ * @description An object used to store filters for specific fields in the data-table.
14010
+ * It allows filtering of data based on specific field values.
14011
+ * @type {any}
13996
14012
  */
13997
14013
  fieldFilters = {};
13998
14014
  /**
13999
- * Used to add some field operators
14015
+ * @property fieldOperators
14016
+ * @description An object that stores operators to be applied on fields for filtering.
14017
+ * It allows complex filtering operations (e.g., equals, contains, greater than).
14018
+ * @type {any}
14000
14019
  */
14001
14020
  fieldOperators = {};
14002
14021
  /**
14003
- * Used to add some static field filters
14022
+ * @property staticFieldFilters
14023
+ * @description An object to store static filters that are applied to the data-table.
14024
+ * These filters are not dynamically set by the user but are always active.
14025
+ * @type {any}
14004
14026
  */
14005
14027
  staticFieldFilters = {};
14006
14028
  /**
14007
- * The current page index.
14029
+ * @property pageIndex
14030
+ * @description The index of the current page being viewed in the data-table.
14031
+ * It starts from 0 and increments with each page change.
14032
+ * @type {number}
14008
14033
  */
14009
14034
  pageIndex = 0;
14010
14035
  /**
14011
- * The current total number of items being paged
14036
+ * @property total
14037
+ * @description The total number of items in the data source.
14038
+ * This is typically used to calculate pagination.
14039
+ * @type {number}
14012
14040
  */
14013
14041
  total = 0;
14014
14042
  /**
14015
- * The current page size
14043
+ * @property pageSize
14044
+ * @description The number of items displayed per page in the data-table.
14045
+ * It controls how many records are shown on a single page.
14046
+ * @type {number}
14016
14047
  */
14017
14048
  pageSize = 15;
14018
14049
  /**
14019
- * Number of pages
14050
+ * @property pageCount
14051
+ * @description The total number of pages based on the current page size and total items.
14052
+ * This is calculated dynamically whenever data changes.
14053
+ * @type {number}
14020
14054
  */
14021
14055
  pageCount = 0;
14022
14056
  /**
14023
- * A flag to show loading process
14057
+ * @property isLoading
14058
+ * @description A flag indicating whether the data is currently being loaded.
14059
+ * It is used to show a loading spinner or indicator while data is being fetched.
14060
+ * @type {boolean}
14024
14061
  */
14025
14062
  isLoading = false;
14026
14063
  /**
14027
- * Reloads items
14028
- * @param clearSelection
14064
+ * @method reload
14065
+ * @description Reloads the table data by triggering a new random reload token.
14066
+ * Optionally clears the selection if the `clearSelection` flag is set to true.
14067
+ * @param {boolean} clearSelection - If true, clears the current selection after reload.
14029
14068
  */
14030
14069
  reload(clearSelection = true) {
14070
+ /* Emit a new reload token to trigger data reload */
14031
14071
  this._reloadChange.next(Math.random());
14072
+ /* Clear the selection if specified */
14032
14073
  if (clearSelection) {
14033
14074
  this.selectionModel.clear();
14034
14075
  }
14035
14076
  }
14036
14077
  /**
14037
- * Used by the MatTable. Called when it connects to the data source.
14078
+ * @method connect
14079
+ * @description Called when the MatTable connects to the data source.
14080
+ * This method subscribes to the reload token to trigger a filter update and data refresh.
14038
14081
  * @docs-private
14082
+ * @returns {BehaviorSubject<TEntity[]>} A BehaviorSubject containing the current data array.
14039
14083
  */
14040
14084
  connect() {
14085
+ /* Subscribe to the reload token and update filters accordingly */
14041
14086
  this._reloadChange.subscribe(x => {
14042
- /* Remove empty filters */
14043
- Object.keys(this.fieldFilters).forEach((key) => ((this.fieldFilters[key] == null || this.fieldFilters[key] == '' || this.fieldFilters[key] == 'undefined')) && this.fieldFilters[key] != 0 && delete this.fieldFilters[key]);
14044
- Object.keys(this.staticFieldFilters).forEach((key) => ((this.staticFieldFilters[key] == null || this.staticFieldFilters[key] == '' || this.staticFieldFilters[key] == 'undefined')) && this.staticFieldFilters[key] != 0 && delete this.staticFieldFilters[key]);
14087
+ /* Clean up any empty filters before applying them */
14088
+ Object.keys(this.fieldFilters).forEach((key) => ((this.fieldFilters[key] == null || this.fieldFilters[key] === '' || this.fieldFilters[key] === 'undefined')) && this.fieldFilters[key] !== 0 && delete this.fieldFilters[key]);
14089
+ Object.keys(this.staticFieldFilters).forEach((key) => ((this.staticFieldFilters[key] == null || this.staticFieldFilters[key] === '' || this.staticFieldFilters[key] === 'undefined')) && this.staticFieldFilters[key] !== 0 && delete this.staticFieldFilters[key]);
14090
+ /* Apply filters dynamically to the table data */
14045
14091
  Object.keys(this.fieldFilters).forEach((key) => {
14046
14092
  this.filterPredicate = (data, filter) => !filter || `${data[key]}`.toLowerCase().includes(`${this.filter}`?.toLowerCase());
14047
14093
  this.filter = this.fieldFilters[key];
14048
14094
  });
14049
14095
  });
14096
+ /* Return the data for the MatTable to display */
14050
14097
  return super.connect();
14051
14098
  }
14052
14099
  /**
14053
- * Clears field filters
14100
+ * @method clearFilters
14101
+ * @description Clears all current field filters and resets pagination to the first page.
14102
+ * Optionally accepts new filters to replace the existing ones.
14103
+ * @param {any} newFilters - New filters to apply after clearing the previous ones.
14054
14104
  */
14055
14105
  clearFilters(newFilters = {}) {
14106
+ /* Reset pagination to the first page */
14056
14107
  if (this.paginator) {
14057
14108
  this.paginator.pageIndex = 0;
14058
14109
  }
14110
+ /* Apply the new filters */
14059
14111
  this.fieldFilters = newFilters || {};
14060
14112
  this.filter = '';
14061
14113
  this.reload();
14062
14114
  }
14063
14115
  /**
14064
- * Checks, whether all items are selected
14116
+ * @method isAllSelected
14117
+ * @description Checks if all items in the current page are selected.
14118
+ * @returns {boolean} True if all items are selected, false otherwise.
14065
14119
  */
14066
14120
  isAllSelected() {
14121
+ /* If there are no selected items, return false */
14067
14122
  if (this.selectionModel.isEmpty()) {
14068
14123
  return false;
14069
14124
  }
14125
+ /* Return true if the number of selected items matches the number of items on the current page */
14070
14126
  return this.selectionModel.selected.length === this.paginator?.length;
14071
14127
  }
14072
14128
  /**
14073
- * Toggles selected items
14074
- * @param checkbox
14075
- * @param predicate
14129
+ * @method toggleSelect
14130
+ * @description Toggles the selection of all items in the current page.
14131
+ * If items are already selected, they are cleared. If not, they are selected.
14132
+ * @param {MatCheckboxChange} checkbox - The checkbox change event.
14133
+ * @param {Function} predicate - Optional predicate to filter the items before selection.
14076
14134
  */
14077
14135
  toggleSelect(checkbox, predicate) {
14136
+ /* If any items are selected, clear the selection */
14078
14137
  if (this.selectionModel.hasValue()) {
14079
14138
  this.selectionModel.clear();
14080
14139
  checkbox.source.checked = false;
14081
14140
  }
14082
14141
  else {
14142
+ /* Otherwise, select all items that match the predicate */
14083
14143
  this.data.filter(predicate ? predicate : x => x)
14084
14144
  .filter(x => !x['locked'])
14085
14145
  .forEach(data => this.selectionModel.select(data));
14146
+ /* If not all items are selected, uncheck the checkbox */
14086
14147
  if (this.selectionModel.selected.length !== this.paginator?.length) {
14087
14148
  checkbox.source.checked = false;
14088
14149
  }
14089
14150
  }
14090
14151
  }
14091
14152
  /**
14092
- * Get selected Items
14153
+ * @method getSelected
14154
+ * @description Retrieves the selected items based on a specific key (e.g., 'id').
14155
+ * @param {string} key - The key to extract from the selected items.
14156
+ * @returns {TType[]} An array of selected items.
14093
14157
  */
14094
14158
  getSelected = (key = 'id') => this.selectionModel.selected.map(x => x[key]);
14095
14159
  }
@@ -20370,6 +20434,13 @@ class GenericEmbeddedListComponent extends GenericListComponent {
20370
20434
  * If true, pagination controls will be available for navigating through the data.
20371
20435
  */
20372
20436
  paginable = false;
20437
+ /**
20438
+ * @property pageSize
20439
+ * @description The number of items displayed per page in the data-table.
20440
+ * It controls how many records are shown on a single page.
20441
+ * @type {number}
20442
+ */
20443
+ pageSize = 10;
20373
20444
  /**
20374
20445
  * The name of the property representing the list of items.
20375
20446
  */
@@ -20433,10 +20504,12 @@ class GenericEmbeddedListComponent extends GenericListComponent {
20433
20504
  if (!this.parent?.id && this.paginable) {
20434
20505
  /* Initializes the dataSource with the entities */
20435
20506
  this.dataSource = new TableStaticDataSource(...this.form?.value[this.itemsPropertyName]);
20507
+ /* Set the default page size */
20508
+ this.dataSource.pageSize = this.pageSize;
20436
20509
  /* Sets the paginator for the dataSource */
20437
20510
  this.dataSource.paginator = this.paginator;
20438
20511
  /* Subscribes to the dataSource connection and assigns the result to the items array */
20439
- this.dataSource?.connect().subscribe((x) => this.items = x);
20512
+ this.connect();
20440
20513
  }
20441
20514
  }
20442
20515
  /**
@@ -20502,7 +20575,7 @@ class GenericEmbeddedListComponent extends GenericListComponent {
20502
20575
  super.addRowMenuItems();
20503
20576
  }
20504
20577
  /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: GenericEmbeddedListComponent, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
20505
- /** @nocollapse */ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.7", type: GenericEmbeddedListComponent, inputs: { form: "form", parent: "parent", hashPrefix: "hashPrefix", paginable: "paginable" }, usesInheritance: true, ngImport: i0 });
20578
+ /** @nocollapse */ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.7", type: GenericEmbeddedListComponent, inputs: { form: "form", parent: "parent", hashPrefix: "hashPrefix", paginable: "paginable", pageSize: "pageSize" }, usesInheritance: true, ngImport: i0 });
20506
20579
  }
20507
20580
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: GenericEmbeddedListComponent, decorators: [{
20508
20581
  type: Directive
@@ -20514,6 +20587,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
20514
20587
  type: Input
20515
20588
  }], paginable: [{
20516
20589
  type: Input
20590
+ }], pageSize: [{
20591
+ type: Input
20517
20592
  }] } });
20518
20593
 
20519
20594
  // @dynamic