@oneteme/jquery-organizer 0.0.4 → 0.0.5

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.
@@ -218,18 +218,26 @@ export class SlicePanelComponent {
218
218
  }
219
219
  getActiveFilters() {
220
220
  const result = {};
221
- this._cachedSlices.forEach((_, idx) => {
221
+ this._cachedSlices.forEach((slice, idx) => {
222
222
  const keys = this.activeKeysBySlice.get(idx);
223
- result[idx] = keys ? [...keys] : [];
223
+ result[this._getPersistentSliceKey(slice, idx)] = keys ? [...keys] : [];
224
224
  });
225
225
  return result;
226
226
  }
227
227
  restoreFilters(filters) {
228
- this.activeKeysBySlice = new Map(Object.entries(filters).map(([idx, keys]) => [Number(idx), new Set(keys)]));
228
+ this.activeKeysBySlice = new Map();
229
+ this._cachedSlices.forEach((slice, index) => {
230
+ // Les préférences historiques utilisaient l'index numérique comme clé.
231
+ const keys = filters[this._getPersistentSliceKey(slice, index)] ?? filters[String(index)];
232
+ if (keys?.length)
233
+ this.activeKeysBySlice.set(index, new Set(keys));
234
+ });
229
235
  this._emitFilter();
230
236
  this._cdr.markForCheck();
231
237
  }
232
238
  addDynamicSlice(column) {
239
+ if (this._dynamicSlices.some(slice => slice.key === column.key))
240
+ return;
233
241
  const distinctValues = this._computeDistinctValues(column.key);
234
242
  const newSlice = {
235
243
  title: column.header,
@@ -295,6 +303,9 @@ export class SlicePanelComponent {
295
303
  const dynamicIndex = sliceIndex - this.staticSliceCount;
296
304
  return this._dynamicSlices[dynamicIndex]?.key ?? null;
297
305
  }
306
+ _getPersistentSliceKey(slice, index) {
307
+ return slice.columnKey ? `column:${slice.columnKey}` : `index:${index}`;
308
+ }
298
309
  _getSliceIdentity(slice, fallbackIndex) {
299
310
  if (slice.columnKey)
300
311
  return `column:${slice.columnKey}`;
@@ -449,4 +460,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
449
460
  type: HostBinding,
450
461
  args: ['class.collapsed']
451
462
  }] } });
452
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2UtcGFuZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25ldGVtZS9qcXVlcnktb3JnYW5pemVyL3NyYy9saWIvc2xpY2UtcGFuZWwvc2xpY2UtcGFuZWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25ldGVtZS9qcXVlcnktb3JnYW5pemVyL3NyYy9saWIvc2xpY2UtcGFuZWwvc2xpY2UtcGFuZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFpQixTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBR2pNLE1BQU0sa0JBQWtCLEdBQUcsV0FBVyxDQUFDO0FBQ3ZDLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDO0FBRXBDLE1BQU0sSUFBSSxHQUFHO0lBQ1gsaUJBQWlCLEVBQUUsbUJBQW1CO0lBQ3RDLG1CQUFtQixFQUFFLG1CQUFtQjtJQUN4QyxnQkFBZ0IsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRO0lBQ3JFLHVCQUF1QixFQUFFLFNBQVM7SUFDbEMsZ0JBQWdCLEVBQUUsZUFBZTtDQUNsQyxDQUFDO0FBVUYsTUFBTSxPQUFPLG1CQUFtQjtJQVJoQztRQVVXLGlCQUFZLEdBQXFCLEVBQUUsQ0FBQztRQUNwQyxZQUFPLEdBQXdCLEVBQUUsQ0FBQztRQUNs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QUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUksWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csc0JBQXNCO3NCQUEvQixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBRXNCLGlCQUFpQjtzQkFBN0MsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBUVMsYUFBYTtzQkFBaEQsV0FBVzt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU2xpY2VDb2x1bW5EZWYsIFNsaWNlQ29uZmlnIH0gZnJvbSAnLi9zbGljZS1wYW5lbC5tb2RlbCc7XG5cbmNvbnN0IEVNUFRZX0NBVEVHT1JZX0tFWSA9ICdfX2VtcHR5X18nO1xuY29uc3QgRU1QVFlfQ0FURUdPUllfTEFCRUwgPSAnVmlkZSc7XG5cbmNvbnN0IEkxOE4gPSB7XG4gIGV4cGFuZEZpbHRlclRpdGxlOiAnRMOpcGxpZXIgbGUgZmlsdHJlJyxcbiAgY29sbGFwc2VGaWx0ZXJUaXRsZTogJ1JlcGxpZXIgbGUgZmlsdHJlJyxcbiAgZmlsdGVyUGFuZWxUaXRsZTogKGNvdW50OiBudW1iZXIpID0+IGNvdW50ID4gMSA/ICdGaWx0cmVzJyA6ICdGaWx0cmUnLFxuICBmaWx0ZXJCbG9ja0RlZmF1bHRUaXRsZTogJ0ZpbHRyZXInLFxuICBmaWx0ZXJFbXB0eVN0YXRlOiAnQXVjdW5lIGRvbm7DqWUnLFxufTtcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnc2xpY2UtcGFuZWwnLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRJY29uTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3NsaWNlLXBhbmVsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2xpY2UtcGFuZWwuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNsaWNlUGFuZWxDb21wb25lbnQ8VCA9IGFueT4gaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCB7XG5cbiAgQElucHV0KCkgc2xpY2VDb25maWdzOiBTbGljZUNvbmZpZzxUPltdID0gW107XG4gIEBJbnB1dCgpIGNvbHVtbnM6IFNsaWNlQ29sdW1uRGVmPFQ+W10gPSBbXTtcbiAgQElucHV0KCkgZGF0YTogVFtdID0gW107XG4gIEBJbnB1dCgpIGxhenlEYXRhOiBNYXA8c3RyaW5nLCBNYXA8YW55LCBhbnk+PiA9IG5ldyBNYXAoKTtcbiAgQElucHV0KCkgbGF6eVN0YXR1czogTWFwPHN0cmluZywgJ2lkbGUnIHwgJ2xvYWRpbmcnIHwgJ2xvYWRlZCcgfCAnZXJyb3InPiA9IG5ldyBNYXAoKTtcbiAgQElucHV0KCkgc2hvd1RvZ2dsZSA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dDb3VudHMgPSB0cnVlO1xuICBASW5wdXQoKSBjb2xsYXBzZWRCeURlZmF1bHQgPSBmYWxzZTtcbiAgQElucHV0KCkgYWx3YXlzU2hvdyA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBmaWx0ZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPChyb3c6IFQpID0+IGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBhY3RpdmVLZXlzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmdbXVtdPigpO1xuICBAT3V0cHV0KCkgZHluYW1pY1NsaWNlS2V5c0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nW10+KCk7XG4gIEBPdXRwdXQoKSBjb2xsYXBzZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgQFZpZXdDaGlsZCgnc2xpY2VQYW5lbEJvZHknKSBzbGljZVBhbmVsQm9keVJlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIHByaXZhdGUgX2NkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgcmVhZG9ubHkgaTE4biA9IEkxOE47XG5cbiAgaXNDb2xsYXBzZWQgPSBmYWxzZTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmNvbGxhcHNlZCcpIGdldCBob3N0Q29sbGFwc2VkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5pc0NvbGxhcHNlZDsgfVxuICBhY3RpdmVLZXlzQnlTbGljZTogTWFwPG51bWJlciwgU2V0PHN0cmluZz4+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIF9leHBhbmRlZFNsaWNlcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBfZHluYW1pY1NsaWNlczogQXJyYXk8eyBrZXk6IHN0cmluZzsgc2xpY2U6IFNsaWNlQ29uZmlnPFQ+IH0+ID0gW107XG5cbiAgX2NhY2hlZFNsaWNlczogU2xpY2VDb25maWc8VD5bXSA9IFtdO1xuICBwcml2YXRlIF9jb3VudENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICByZWFkb25seSB0cmFja0J5U2xpY2VJbmRleCA9IChpbmRleDogbnVtYmVyLCBfOiBhbnkpOiBudW1iZXIgPT4gaW5kZXg7XG4gIHJlYWRvbmx5IHRyYWNrQnlDYXRlZ29yeUtleSA9IChfOiBudW1iZXIsIGNhdDogYW55KTogc3RyaW5nID0+IGNhdC5rZXk7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pc0NvbGxhcHNlZCA9IHRoaXMuY29sbGFwc2VkQnlEZWZhdWx0O1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydzbGljZUNvbmZpZ3MnXSB8fCBjaGFuZ2VzWydkYXRhJ10gfHwgY2hhbmdlc1snY29sdW1ucyddIHx8IGNoYW5nZXNbJ2xhenlEYXRhJ10gfHwgY2hhbmdlc1snbGF6eVN0YXR1cyddKSB7XG4gICAgICB0aGlzLl9yZWZyZXNoRHluYW1pY1NsaWNlcygpO1xuICAgICAgdGhpcy5fcmVidWlsZENhY2hlKCk7XG4gICAgICBjb25zdCBzaG91bGRSZWVtaXRGaWx0ZXIgPSAhIShjaGFuZ2VzWydkYXRhJ10gfHwgY2hhbmdlc1snY29sdW1ucyddIHx8IGNoYW5nZXNbJ2xhenlEYXRhJ10gfHwgY2hhbmdlc1snbGF6eVN0YXR1cyddKTtcbiAgICAgIGNvbnN0IGhhc0FjdGl2ZUZpbHRlcnMgPSBbLi4udGhpcy5hY3RpdmVLZXlzQnlTbGljZS52YWx1ZXMoKV0uc29tZShzID0+IHMuc2l6ZSA+IDApO1xuICAgICAgaWYgKGhhc0FjdGl2ZUZpbHRlcnMgJiYgc2hvdWxkUmVlbWl0RmlsdGVyKSB7XG4gICAgICAgIHRoaXMuX2VtaXRGaWx0ZXIoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBnZXQgc2hvd1BhbmVsKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGhhc0NmZyA9ICh0aGlzLnNsaWNlQ29uZmlncyB8fCBbXSkubGVuZ3RoID4gMCB8fCB0aGlzLl9keW5hbWljU2xpY2VzLmxlbmd0aCA+IDA7XG4gICAgaWYgKHRoaXMuYWx3YXlzU2hvdykgcmV0dXJuIGhhc0NmZztcbiAgICByZXR1cm4gaGFzQ2ZnICYmICh0aGlzLmRhdGE/Lmxlbmd0aCA/PyAwKSA+IDA7XG4gIH1cblxuICBnZXQgc2xpY2VzKCk6IFNsaWNlQ29uZmlnPFQ+W10ge1xuICAgIHJldHVybiB0aGlzLl9jYWNoZWRTbGljZXM7XG4gIH1cblxuICBnZXQgc3RhdGljU2xpY2VDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiAodGhpcy5zbGljZUNvbmZpZ3MgfHwgW10pLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBzdGF0aWNTbGljZXNGb3JNZW51KCk6IEFycmF5PHsga2V5OiBzdHJpbmc7IHRpdGxlOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiAodGhpcy5zbGljZUNvbmZpZ3MgfHwgW10pXG4gICAgICAuZmlsdGVyKChzKSA9PiAhIXMuY29sdW1uS2V5KVxuICAgICAgLm1hcCgocykgPT4gKHsga2V5OiBzLmNvbHVtbktleSEsIHRpdGxlOiBzLnRpdGxlIHx8IHMuY29sdW1uS2V5ISB9KSk7XG4gIH1cblxuICBnZXQgYWN0aXZlRHluYW1pY1NsaWNlQ29sdW1ucygpOiBTbGljZUNvbHVtbkRlZjxUPltdIHtcbiAgICByZXR1cm4gdGhpcy5fZHluYW1pY1NsaWNlc1xuICAgICAgLm1hcCgoZCkgPT4gKHRoaXMuY29sdW1ucyB8fCBbXSkuZmluZCgoYykgPT4gYy5rZXkgPT09IGQua2V5KSlcbiAgICAgIC5maWx0ZXIoKGMpOiBjIGlzIFNsaWNlQ29sdW1uRGVmPFQ+ID0+ICEhYyk7XG4gIH1cblxuICBnZXQgYXZhaWxhYmxlQ29sdW1uc0ZvckR5bmFtaWNTbGljZSgpOiBTbGljZUNvbHVtbkRlZjxUPltdIHtcbiAgICBjb25zdCBkeW5hbWljS2V5cyA9IG5ldyBTZXQodGhpcy5fZHluYW1pY1NsaWNlcy5tYXAoKGQpID0+IGQua2V5KSk7XG4gICAgY29uc3Qgc3RhdGljS2V5cyA9IG5ldyBTZXQoXG4gICAgICAodGhpcy5zbGljZUNvbmZpZ3MgfHwgW10pLm1hcCgocykgPT4gcy5jb2x1bW5LZXkpLmZpbHRlcigoayk6IGsgaXMgc3RyaW5nID0+ICEhaylcbiAgICApO1xuICAgIGNvbnN0IGV4aXN0aW5nS2V5cyA9IG5ldyBTZXQoWy4uLmR5bmFtaWNLZXlzLCAuLi5zdGF0aWNLZXlzXSk7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHJldHVybiAodGhpcy5jb2x1bW5zIHx8IFtdKS5maWx0ZXIoKGMpID0+IHtcbiAgICAgIGlmIChleGlzdGluZ0tleXMuaGFzKGMua2V5KSB8fCBzZWVuLmhhcyhjLmtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHNlZW4uYWRkKGMua2V5KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgaXNTbGljZUNvbGxhcHNlZChzbGljZUluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fY2FjaGVkU2xpY2VzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2V4cGFuZGVkU2xpY2VzLmhhcygtMSAtIHNsaWNlSW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gIXRoaXMuX2V4cGFuZGVkU2xpY2VzLmhhcyhzbGljZUluZGV4KTtcbiAgfVxuXG4gIHRvZ2dsZVNsaWNlQ29sbGFwc2Uoc2xpY2VJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2xpY2VzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgY2xvc2VkS2V5ID0gLTEgLSBzbGljZUluZGV4O1xuICAgICAgaWYgKHRoaXMuX2V4cGFuZGVkU2xpY2VzLmhhcyhjbG9zZWRLZXkpKSB7XG4gICAgICAgIHRoaXMuX2V4cGFuZGVkU2xpY2VzLmRlbGV0ZShjbG9zZWRLZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZXhwYW5kZWRTbGljZXMuYWRkKGNsb3NlZEtleSk7XG4gICAgICAgIHRoaXMuX3Njcm9sbFNsaWNlVGl0bGVJbnRvVmlldyhzbGljZUluZGV4KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuX2V4cGFuZGVkU2xpY2VzLmhhcyhzbGljZUluZGV4KSkge1xuICAgICAgICB0aGlzLl9leHBhbmRlZFNsaWNlcy5kZWxldGUoc2xpY2VJbmRleCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9leHBhbmRlZFNsaWNlcy5jbGVhcigpO1xuICAgICAgICB0aGlzLl9leHBhbmRlZFNsaWNlcy5hZGQoc2xpY2VJbmRleCk7XG4gICAgICAgIHRoaXMuX3Njcm9sbFNsaWNlVGl0bGVJbnRvVmlldyhzbGljZUluZGV4KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgdG9nZ2xlUGFuZWwoKTogdm9pZCB7XG4gICAgdGhpcy5pc0NvbGxhcHNlZCA9ICF0aGlzLmlzQ29sbGFwc2VkO1xuICAgIHRoaXMuY29sbGFwc2VkQ2hhbmdlLmVtaXQodGhpcy5pc0NvbGxhcHNlZCk7XG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgaXNTbGljZUR5bmFtaWMoc2xpY2VJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHNsaWNlSW5kZXggPj0gdGhpcy5zdGF0aWNTbGljZUNvdW50O1xuICB9XG5cbiAgaXNTbGljZUxvYWRpbmcoc2xpY2VJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc3RhdGljU2xpY2UgPSAodGhpcy5zbGljZUNvbmZpZ3MgfHwgW10pW3NsaWNlSW5kZXhdO1xuICAgIGlmIChzdGF0aWNTbGljZT8uY29sdW1uS2V5KSB7XG4gICAgICBjb25zdCBjb2xEZWYgPSAodGhpcy5jb2x1bW5zIHx8IFtdKS5maW5kKGMgPT4gYy5rZXkgPT09IHN0YXRpY1NsaWNlLmNvbHVtbktleSk7XG4gICAgICBpZiAoY29sRGVmPy5sYXp5KSB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMubGF6eVN0YXR1cy5nZXQoc3RhdGljU2xpY2UuY29sdW1uS2V5ISkgPz8gJ2lkbGUnO1xuICAgICAgICByZXR1cm4gc3RhdHVzID09PSAnbG9hZGluZycgfHwgc3RhdHVzID09PSAnaWRsZSc7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IHRoaXMuX2dldER5bmFtaWNTbGljZUNvbHVtbktleShzbGljZUluZGV4KTtcbiAgICBpZiAoIWtleSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGNvbERlZiA9ICh0aGlzLmNvbHVtbnMgfHwgW10pLmZpbmQoYyA9PiBjLmtleSA9PT0ga2V5KTtcbiAgICBpZiAoIWNvbERlZj8ubGF6eSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMubGF6eVN0YXR1cy5nZXQoa2V5KSA/PyAnaWRsZSc7XG4gICAgcmV0dXJuIHN0YXR1cyA9PT0gJ2xvYWRpbmcnIHx8IHN0YXR1cyA9PT0gJ2lkbGUnO1xuICB9XG5cbiAgaXNTdGF0aWNTbGljZVZpc2libGUoX2NvbHVtbktleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXRTbGljZUljb24oc2xpY2U6IFNsaWNlQ29uZmlnPFQ+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoc2xpY2UuaWNvbikgcmV0dXJuIHNsaWNlLmljb247XG4gICAgaWYgKHNsaWNlLmNvbHVtbktleSkge1xuICAgICAgcmV0dXJuICh0aGlzLmNvbHVtbnMgfHwgW10pLmZpbmQoYyA9PiBjLmtleSA9PT0gc2xpY2UuY29sdW1uS2V5KT8uaWNvbjtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlzU2xpY2VDYXRlZ29yeUFjdGl2ZShzbGljZUluZGV4OiBudW1iZXIsIGNhdGVnb3J5S2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVLZXlzQnlTbGljZS5nZXQoc2xpY2VJbmRleCk/LmhhcyhjYXRlZ29yeUtleSkgPz8gZmFsc2U7XG4gIH1cblxuICBpc1NsaWNlQWxsQWN0aXZlKHNsaWNlSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5hY3RpdmVLZXlzQnlTbGljZS5oYXMoc2xpY2VJbmRleCkgfHwgdGhpcy5hY3RpdmVLZXlzQnlTbGljZS5nZXQoc2xpY2VJbmRleCkhLnNpemUgPT09IDA7XG4gIH1cblxuICBzbGljZUNhdGVnb3J5Q291bnQoc2xpY2VJbmRleDogbnVtYmVyLCBjYXRlZ29yeUtleTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke3NsaWNlSW5kZXh9OiR7Y2F0ZWdvcnlLZXl9YDtcbiAgICBpZiAodGhpcy5fY291bnRDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY291bnRDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG4gICAgY29uc3Qgc2xpY2UgPSB0aGlzLl9jYWNoZWRTbGljZXNbc2xpY2VJbmRleF07XG4gICAgaWYgKCFzbGljZSkgcmV0dXJuIDA7XG4gICAgY29uc3QgY2F0ZWdvcnkgPSAoc2xpY2UuY2F0ZWdvcmllcyB8fCBbXSkuZmluZCgoYykgPT4gYy5rZXkgPT09IGNhdGVnb3J5S2V5KTtcbiAgICBjb25zdCBjb3VudCA9IGNhdGVnb3J5ID8gKHRoaXMuZGF0YSB8fCBbXSkuZmlsdGVyKChyb3cpID0+IGNhdGVnb3J5LmZpbHRlciA/IGNhdGVnb3J5LmZpbHRlcihyb3cpIDogdHJ1ZSkubGVuZ3RoIDogMDtcbiAgICB0aGlzLl9jb3VudENhY2hlLnNldChjYWNoZUtleSwgY291bnQpO1xuICAgIHJldHVybiBjb3VudDtcbiAgfVxuXG4gIGlzU2xpY2VFbXB0eShzbGljZUluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBzbGljZSA9IHRoaXMuX2NhY2hlZFNsaWNlc1tzbGljZUluZGV4XTtcbiAgICBpZiAoIXNsaWNlKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gKHNsaWNlLmNhdGVnb3JpZXMgfHwgW10pLmV2ZXJ5KGMgPT4gdGhpcy5zbGljZUNhdGVnb3J5Q291bnQoc2xpY2VJbmRleCwgYy5rZXkpID09PSAwKTtcbiAgfVxuXG4gIG9uU2xpY2VDYXRlZ29yeVNlbGVjdGVkKHNsaWNlSW5kZXg6IG51bWJlciwgY2F0ZWdvcnlLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHNsaWNlID0gdGhpcy5zbGljZXNbc2xpY2VJbmRleF07XG4gICAgaWYgKCFzbGljZSkgcmV0dXJuO1xuICAgIGlmICghdGhpcy5hY3RpdmVLZXlzQnlTbGljZS5oYXMoc2xpY2VJbmRleCkpIHtcbiAgICAgIHRoaXMuYWN0aXZlS2V5c0J5U2xpY2Uuc2V0KHNsaWNlSW5kZXgsIG5ldyBTZXQoKSk7XG4gICAgfVxuICAgIGNvbnN0IGFjdGl2ZUtleXMgPSB0aGlzLmFjdGl2ZUtleXNCeVNsaWNlLmdldChzbGljZUluZGV4KSE7XG4gICAgaWYgKHNsaWNlLm11bHRpU2VsZWN0ID09PSBmYWxzZSkge1xuICAgICAgaWYgKGFjdGl2ZUtleXMuaGFzKGNhdGVnb3J5S2V5KSkge1xuICAgICAgICBhY3RpdmVLZXlzLmNsZWFyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY3RpdmVLZXlzLmNsZWFyKCk7XG4gICAgICAgIGFjdGl2ZUtleXMuYWRkKGNhdGVnb3J5S2V5KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGFjdGl2ZUtleXMuaGFzKGNhdGVnb3J5S2V5KSkge1xuICAgICAgICBhY3RpdmVLZXlzLmRlbGV0ZShjYXRlZ29yeUtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY3RpdmVLZXlzLmFkZChjYXRlZ29yeUtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2VtaXRGaWx0ZXIoKTtcbiAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvblNsaWNlQWxsU2VsZWN0ZWQoc2xpY2VJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWN0aXZlS2V5c0J5U2xpY2UuaGFzKHNsaWNlSW5kZXgpKSB7XG4gICAgICB0aGlzLmFjdGl2ZUtleXNCeVNsaWNlLmdldChzbGljZUluZGV4KSEuY2xlYXIoKTtcbiAgICB9XG4gICAgdGhpcy5fZW1pdEZpbHRlcigpO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldEFjdGl2ZUZpbHRlcnMoKTogUmVjb3JkPG51bWJlciwgc3RyaW5nW10+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxudW1iZXIsIHN0cmluZ1tdPiA9IHt9O1xuICAgIHRoaXMuX2NhY2hlZFNsaWNlcy5mb3JFYWNoKChfLCBpZHgpID0+IHtcbiAgICAgIGNvbnN0IGtleXMgPSB0aGlzLmFjdGl2ZUtleXNCeVNsaWNlLmdldChpZHgpO1xuICAgICAgcmVzdWx0W2lkeF0gPSBrZXlzID8gWy4uLmtleXNdIDogW107XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHJlc3RvcmVGaWx0ZXJzKGZpbHRlcnM6IFJlY29yZDxudW1iZXIsIHN0cmluZ1tdPik6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlS2V5c0J5U2xpY2UgPSBuZXcgTWFwKFxuICAgICAgT2JqZWN0LmVudHJpZXMoZmlsdGVycykubWFwKChbaWR4LCBrZXlzXSkgPT4gW051bWJlcihpZHgpLCBuZXcgU2V0KGtleXMpXSlcbiAgICApO1xuICAgIHRoaXMuX2VtaXRGaWx0ZXIoKTtcbiAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBhZGREeW5hbWljU2xpY2UoY29sdW1uOiBTbGljZUNvbHVtbkRlZjxUPik6IHZvaWQge1xuICAgIGNvbnN0IGRpc3RpbmN0VmFsdWVzID0gdGhpcy5fY29tcHV0ZURpc3RpbmN0VmFsdWVzKGNvbHVtbi5rZXkpO1xuICAgIGNvbnN0IG5ld1NsaWNlOiBTbGljZUNvbmZpZzxUPiA9IHtcbiAgICAgIHRpdGxlOiBjb2x1bW4uaGVhZGVyLFxuICAgICAgY29sdW1uS2V5OiBjb2x1bW4ua2V5LFxuICAgICAgY2F0ZWdvcmllczogZGlzdGluY3RWYWx1ZXMubWFwKCh2KSA9PiB0aGlzLl9idWlsZENhdGVnb3J5RnJvbVZhbHVlKGNvbHVtbi5rZXksIHYpKSxcbiAgICB9O1xuICAgIHRoaXMuX2R5bmFtaWNTbGljZXMgPSBbLi4udGhpcy5fZHluYW1pY1NsaWNlcywgeyBrZXk6IGNvbHVtbi5rZXksIHNsaWNlOiBuZXdTbGljZSB9XTtcbiAgICB0aGlzLl9yZWJ1aWxkQ2FjaGUoKTtcbiAgICB0aGlzLmR5bmFtaWNTbGljZUtleXNDaGFuZ2UuZW1pdCh0aGlzLl9keW5hbWljU2xpY2VzLm1hcChkID0+IGQua2V5KSk7XG4gICAgdGhpcy5fZW1pdEZpbHRlcigpO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHJlbW92ZUR5bmFtaWNTbGljZShzbGljZUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBkeW5hbWljSW5kZXggPSBzbGljZUluZGV4IC0gdGhpcy5zdGF0aWNTbGljZUNvdW50O1xuICAgIGlmIChkeW5hbWljSW5kZXggPCAwKSByZXR1cm47XG4gICAgY29uc3QgbmV3QWN0aXZlS2V5cyA9IG5ldyBNYXA8bnVtYmVyLCBTZXQ8c3RyaW5nPj4oKTtcbiAgICB0aGlzLmFjdGl2ZUtleXNCeVNsaWNlLmZvckVhY2goKGtleXMsIGlkeCkgPT4ge1xuICAgICAgaWYgKGlkeCA8IHNsaWNlSW5kZXgpIG5ld0FjdGl2ZUtleXMuc2V0KGlkeCwga2V5cyk7XG4gICAgICBlbHNlIGlmIChpZHggPiBzbGljZUluZGV4KSBuZXdBY3RpdmVLZXlzLnNldChpZHggLSAxLCBrZXlzKTtcbiAgICB9KTtcbiAgICB0aGlzLmFjdGl2ZUtleXNCeVNsaWNlID0gbmV3QWN0aXZlS2V5cztcbiAgICB0aGlzLl9keW5hbWljU2xpY2VzID0gdGhpcy5fZHluYW1pY1NsaWNlcy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGR5bmFtaWNJbmRleCk7XG4gICAgdGhpcy5fcmVidWlsZENhY2hlKCk7XG4gICAgdGhpcy5keW5hbWljU2xpY2VLZXlzQ2hhbmdlLmVtaXQodGhpcy5fZHluYW1pY1NsaWNlcy5tYXAoZCA9PiBkLmtleSkpO1xuICAgIHRoaXMuX2VtaXRGaWx0ZXIoKTtcbiAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICByZW1vdmVEeW5hbWljU2xpY2VCeUtleShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGR5bmFtaWNJbmRleCA9IHRoaXMuX2R5bmFtaWNTbGljZXMuZmluZEluZGV4KChkKSA9PiBkLmtleSA9PT0ga2V5KTtcbiAgICBpZiAoZHluYW1pY0luZGV4IDwgMCkgcmV0dXJuO1xuICAgIGNvbnN0IHNsaWNlSW5kZXggPSB0aGlzLnN0YXRpY1NsaWNlQ291bnQgKyBkeW5hbWljSW5kZXg7XG4gICAgdGhpcy5yZW1vdmVEeW5hbWljU2xpY2Uoc2xpY2VJbmRleCk7XG4gIH1cblxuICBwcml2YXRlIF9lbWl0RmlsdGVyKCk6IHZvaWQge1xuICAgIGNvbnN0IHNsaWNlcyA9IHRoaXMuc2xpY2VzO1xuICAgIGNvbnN0IGFjdGl2ZUtleXNCeVNsaWNlID0gdGhpcy5hY3RpdmVLZXlzQnlTbGljZTtcblxuICAgIHRoaXMuYWN0aXZlS2V5c0NoYW5nZS5lbWl0KFxuICAgICAgc2xpY2VzLm1hcCgoXywgaSkgPT4ge1xuICAgICAgICBjb25zdCBrZXlzID0gYWN0aXZlS2V5c0J5U2xpY2UuZ2V0KGkpO1xuICAgICAgICByZXR1cm4ga2V5cyA/IFsuLi5rZXlzXSA6IFtdO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc3QgcHJlZCA9IChyb3c6IFQpOiBib29sZWFuID0+XG4gICAgICBzbGljZXMuZXZlcnkoKHNsaWNlLCBzbGljZUluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZUtleXMgPSBhY3RpdmVLZXlzQnlTbGljZS5nZXQoc2xpY2VJbmRleCk7XG4gICAgICAgIGlmICghYWN0aXZlS2V5cyB8fCBhY3RpdmVLZXlzLnNpemUgPT09IDApIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoIXNsaWNlLmNhdGVnb3JpZXMgfHwgc2xpY2UuY2F0ZWdvcmllcy5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gWy4uLmFjdGl2ZUtleXNdLnNvbWUoKGtleSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNhdGVnb3J5ID0gKHNsaWNlLmNhdGVnb3JpZXMgfHwgW10pLmZpbmQoKGMpID0+IGMua2V5ID09PSBrZXkpO1xuICAgICAgICAgIGlmICghY2F0ZWdvcnkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICBpZiAoIWNhdGVnb3J5Py5maWx0ZXIpIHJldHVybiB0cnVlO1xuICAgICAgICAgIHJldHVybiBjYXRlZ29yeS5maWx0ZXIocm93KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB0aGlzLmZpbHRlckNoYW5nZS5lbWl0KHByZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0RHluYW1pY1NsaWNlQ29sdW1uS2V5KHNsaWNlSW5kZXg6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGR5bmFtaWNJbmRleCA9IHNsaWNlSW5kZXggLSB0aGlzLnN0YXRpY1NsaWNlQ291bnQ7XG4gICAgcmV0dXJuIHRoaXMuX2R5bmFtaWNTbGljZXNbZHluYW1pY0luZGV4XT8ua2V5ID8/IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9nZXRTbGljZUlkZW50aXR5KHNsaWNlOiBTbGljZUNvbmZpZzxUPiwgZmFsbGJhY2tJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoc2xpY2UuY29sdW1uS2V5KSByZXR1cm4gYGNvbHVtbjoke3NsaWNlLmNvbHVtbktleX1gO1xuICAgIGlmIChzbGljZS50aXRsZSkgcmV0dXJuIGB0aXRsZToke3NsaWNlLnRpdGxlfWA7XG4gICAgY29uc3QgY2F0ZWdvcnlLZXlzID0gKHNsaWNlLmNhdGVnb3JpZXMgfHwgW10pLm1hcCgoYykgPT4gYy5rZXkpLmpvaW4oJ3wnKTtcbiAgICByZXR1cm4gYGluZGV4OiR7ZmFsbGJhY2tJbmRleH18Y2F0ZWdvcmllczoke2NhdGVnb3J5S2V5c31gO1xuICB9XG5cbiAgcHJpdmF0ZSBfbWF0ZXJpYWxpemVTbGljZShzbGljZTogU2xpY2VDb25maWc8VD4pOiBTbGljZUNvbmZpZzxUPiB7XG4gICAgaWYgKCFzbGljZS5jb2x1bW5LZXkgfHwgKHNsaWNlLmNhdGVnb3JpZXMgJiYgc2xpY2UuY2F0ZWdvcmllcy5sZW5ndGggPiAwKSkge1xuICAgICAgcmV0dXJuIHNsaWNlO1xuICAgIH1cbiAgICBjb25zdCBjb2wgPSAodGhpcy5jb2x1bW5zIHx8IFtdKS5maW5kKGMgPT4gYy5rZXkgPT09IHNsaWNlLmNvbHVtbktleSk7XG4gICAgY29uc3QgaXNMYXp5ID0gISFjb2w/Lmxhenk7XG4gICAgaWYgKGlzTGF6eSAmJiB0aGlzLmxhenlTdGF0dXMuZ2V0KHNsaWNlLmNvbHVtbktleSEpICE9PSAnbG9hZGVkJykge1xuICAgICAgcmV0dXJuIHsgLi4uc2xpY2UsIGNhdGVnb3JpZXM6IFtdIH07XG4gICAgfVxuICAgIGlmIChzbGljZS5idWNrZXQpIHtcbiAgICAgIGNvbnN0IGRpc3RpbmN0VmFsdWVzID0gWy4uLm5ldyBTZXQoKHRoaXMuZGF0YSB8fCBbXSkubWFwKHNsaWNlLmJ1Y2tldCkpXS5zb3J0KCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zbGljZSxcbiAgICAgICAgY2F0ZWdvcmllczogZGlzdGluY3RWYWx1ZXMubWFwKCh2KSA9PiAoe1xuICAgICAgICAgIGtleTogdiwgbGFiZWw6IHYsXG4gICAgICAgICAgZmlsdGVyOiAocm93OiBUKSA9PiBzbGljZS5idWNrZXQhKHJvdykgPT09IHYsXG4gICAgICAgIH0pKSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGRpc3RpbmN0VmFsdWVzID0gdGhpcy5fY29tcHV0ZURpc3RpbmN0VmFsdWVzKHNsaWNlLmNvbHVtbktleSEpO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zbGljZSxcbiAgICAgIGNhdGVnb3JpZXM6IGRpc3RpbmN0VmFsdWVzLm1hcCgodikgPT4gdGhpcy5fYnVpbGRDYXRlZ29yeUZyb21WYWx1ZShzbGljZS5jb2x1bW5LZXkhLCB2KSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2J1aWxkQ2F0ZWdvcnlGcm9tVmFsdWUoY29sdW1uS2V5OiBzdHJpbmcsIHY6IHN0cmluZyk6IHsga2V5OiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IGZpbHRlcjogKHJvdzogVCkgPT4gYm9vbGVhbiB9IHtcbiAgICBpZiAodiA9PT0gRU1QVFlfQ0FURUdPUllfS0VZKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBrZXk6IEVNUFRZX0NBVEVHT1JZX0tFWSxcbiAgICAgICAgbGFiZWw6IEVNUFRZX0NBVEVHT1JZX0xBQkVMLFxuICAgICAgICBmaWx0ZXI6IChyb3c6IFQpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLl9nZXRMYXp5QXdhcmVWYWx1ZShjb2x1bW5LZXksIHJvdyk7XG4gICAgICAgICAgcmV0dXJuIHZhbCA9PSBudWxsIHx8IHZhbCA9PT0gJyc7XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAga2V5OiB2LCBsYWJlbDogdixcbiAgICAgIGZpbHRlcjogKHJvdzogVCkgPT4gU3RyaW5nKHRoaXMuX2dldExhenlBd2FyZVZhbHVlKGNvbHVtbktleSwgcm93KSA/PyAnJykgPT09IHYsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbXB1dGVEaXN0aW5jdFZhbHVlcyhjb2x1bW5LZXk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByYXdWYWx1ZXMgPSAodGhpcy5kYXRhIHx8IFtdKS5tYXAoKHJvdykgPT4ge1xuICAgICAgY29uc3QgdmFsID0gdGhpcy5fZ2V0TGF6eUF3YXJlVmFsdWUoY29sdW1uS2V5LCByb3cpO1xuICAgICAgcmV0dXJuIHZhbCAhPSBudWxsICYmIHZhbCAhPT0gJycgPyBTdHJpbmcodmFsKSA6IG51bGw7XG4gICAgfSk7XG4gICAgY29uc3QgZGlzdGluY3QgPSBbLi4ubmV3IFNldChyYXdWYWx1ZXMuZmlsdGVyKCh2KTogdiBpcyBzdHJpbmcgPT4gdiAhPT0gbnVsbCkpXS5zb3J0KCk7XG4gICAgaWYgKHJhd1ZhbHVlcy5zb21lKHYgPT4gdiA9PT0gbnVsbCkpIGRpc3RpbmN0LnB1c2goRU1QVFlfQ0FURUdPUllfS0VZKTtcbiAgICByZXR1cm4gZGlzdGluY3Q7XG4gIH1cblxuICBwcml2YXRlIF9nZXRMYXp5QXdhcmVWYWx1ZShjb2x1bW5LZXk6IHN0cmluZywgcm93OiBUKTogYW55IHtcbiAgICBjb25zdCBjb2xEZWYgPSAodGhpcy5jb2x1bW5zIHx8IFtdKS5maW5kKGMgPT4gYy5rZXkgPT09IGNvbHVtbktleSk7XG4gICAgaWYgKGNvbERlZj8ubGF6eSkge1xuICAgICAgcmV0dXJuIHRoaXMubGF6eURhdGEuZ2V0KGNvbHVtbktleSk/LmdldChyb3cpID8/IG51bGw7XG4gICAgfVxuICAgIGlmIChjb2xEZWY/LnZhbHVlKSB7XG4gICAgICByZXR1cm4gKGNvbERlZi52YWx1ZSBhcyBhbnkpKHJvdywgMCk7XG4gICAgfVxuICAgIHJldHVybiAocm93IGFzIGFueSlbY29sdW1uS2V5XTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlYnVpbGRDYWNoZSgpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2aW91c1NsaWNlcyA9IHRoaXMuX2NhY2hlZFNsaWNlcztcbiAgICBjb25zdCBwcmV2aW91c0FjdGl2ZUtleXMgPSB0aGlzLmFjdGl2ZUtleXNCeVNsaWNlO1xuICAgIGNvbnN0IGFsbFNsaWNlcyA9IFsuLi4odGhpcy5zbGljZUNvbmZpZ3MgfHwgW10pLCAuLi50aGlzLl9keW5hbWljU2xpY2VzLm1hcCgoZCkgPT4gZC5zbGljZSldO1xuICAgIHRoaXMuX2NhY2hlZFNsaWNlcyA9IGFsbFNsaWNlcy5tYXAoKHNsaWNlKSA9PiB0aGlzLl9tYXRlcmlhbGl6ZVNsaWNlKHNsaWNlKSk7XG5cbiAgICBjb25zdCBwcmV2aW91c0tleXNCeUlkZW50aXR5ID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuICAgIHByZXZpb3VzU2xpY2VzLmZvckVhY2goKHNsaWNlLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgYWN0aXZlS2V5cyA9IHByZXZpb3VzQWN0aXZlS2V5cy5nZXQoaW5kZXgpO1xuICAgICAgaWYgKCFhY3RpdmVLZXlzIHx8IGFjdGl2ZUtleXMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuICAgICAgcHJldmlvdXNLZXlzQnlJZGVudGl0eS5zZXQodGhpcy5fZ2V0U2xpY2VJZGVudGl0eShzbGljZSwgaW5kZXgpLCBuZXcgU2V0KGFjdGl2ZUtleXMpKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IG5leHRBY3RpdmVLZXlzID0gbmV3IE1hcDxudW1iZXIsIFNldDxzdHJpbmc+PigpO1xuICAgIHRoaXMuX2NhY2hlZFNsaWNlcy5mb3JFYWNoKChzbGljZSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHByZXZpb3VzS2V5cyA9IHByZXZpb3VzS2V5c0J5SWRlbnRpdHkuZ2V0KHRoaXMuX2dldFNsaWNlSWRlbnRpdHkoc2xpY2UsIGluZGV4KSk7XG4gICAgICBpZiAoIXByZXZpb3VzS2V5cyB8fCBwcmV2aW91c0tleXMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuICAgICAgY29uc3QgYXZhaWxhYmxlS2V5cyA9IG5ldyBTZXQoKHNsaWNlLmNhdGVnb3JpZXMgfHwgW10pLm1hcCgoYykgPT4gYy5rZXkpKTtcbiAgICAgIGNvbnN0IG1hdGNoaW5nS2V5cyA9IFsuLi5wcmV2aW91c0tleXNdLmZpbHRlcigoa2V5KSA9PiBhdmFpbGFibGVLZXlzLmhhcyhrZXkpKTtcbiAgICAgIGlmIChtYXRjaGluZ0tleXMubGVuZ3RoID4gMCkgbmV4dEFjdGl2ZUtleXMuc2V0KGluZGV4LCBuZXcgU2V0KG1hdGNoaW5nS2V5cykpO1xuICAgIH0pO1xuICAgIHRoaXMuYWN0aXZlS2V5c0J5U2xpY2UgPSBuZXh0QWN0aXZlS2V5cztcbiAgICB0aGlzLl9jb3VudENhY2hlLmNsZWFyKCk7XG4gIH1cblxuICBwcml2YXRlIF9yZWZyZXNoRHluYW1pY1NsaWNlcygpOiB2b2lkIHtcbiAgICB0aGlzLl9keW5hbWljU2xpY2VzID0gdGhpcy5fZHluYW1pY1NsaWNlcy5tYXAoKHsga2V5LCBzbGljZSB9KSA9PiB7XG4gICAgICBjb25zdCBkaXN0aW5jdFZhbHVlcyA9IHRoaXMuX2NvbXB1dGVEaXN0aW5jdFZhbHVlcyhrZXkpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5LFxuICAgICAgICBzbGljZToge1xuICAgICAgICAgIC4uLnNsaWNlLFxuICAgICAgICAgIGNhdGVnb3JpZXM6IGRpc3RpbmN0VmFsdWVzLm1hcCgodikgPT4gdGhpcy5fYnVpbGRDYXRlZ29yeUZyb21WYWx1ZShrZXksIHYpKSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9zY3JvbGxTbGljZVRpdGxlSW50b1ZpZXcoc2xpY2VJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBib2R5ID0gdGhpcy5zbGljZVBhbmVsQm9keVJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICghYm9keSkgcmV0dXJuO1xuICAgICAgY29uc3QgZWwgPSBib2R5LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXNsaWNlLWluZGV4PVwiJHtzbGljZUluZGV4fVwiXWApIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgIGVsPy5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICduZWFyZXN0JyB9KTtcbiAgICB9LCA1MCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJzbGljZS1wYW5lbC13cmFwcGVyXCIgW2NsYXNzLmNvbGxhcHNlZF09XCJpc0NvbGxhcHNlZFwiPlxuICA8YXNpZGUgY2xhc3M9XCJzbGljZS1wYW5lbFwiIFtjbGFzcy5jb2xsYXBzZWRdPVwiaXNDb2xsYXBzZWRcIj5cbiAgICA8ZGl2IGNsYXNzPVwic2xpY2UtcGFuZWwtaGVhZGVyXCI+XG4gICAgICA8c3BhbiAqbmdJZj1cIiFpc0NvbGxhcHNlZFwiIGNsYXNzPVwic2xpY2UtcGFuZWwtdGl0bGVcIj5cbiAgICAgICAge3sgaTE4bi5maWx0ZXJQYW5lbFRpdGxlKHNsaWNlcy5sZW5ndGgpIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwic2hvd1RvZ2dsZVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cInNsaWNlLXRvZ2dsZVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiaXNDb2xsYXBzZWQgPyBpMThuLmV4cGFuZEZpbHRlclRpdGxlIDogaTE4bi5jb2xsYXBzZUZpbHRlclRpdGxlXCJcbiAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVBhbmVsKClcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJzbGljZS10b2dnbGUtbWF0LWljb25cIj57eyBpc0NvbGxhcHNlZCA/ICdmaWx0ZXJfbGlzdCcgOiAnZmlsdGVyX2xpc3Rfb2ZmJyB9fTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJzbGljZS1wYW5lbC1ib2R5XCIgKm5nSWY9XCIhaXNDb2xsYXBzZWRcIiAjc2xpY2VQYW5lbEJvZHk+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzbGljZSBvZiBzbGljZXM7IGxldCBzaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5U2xpY2VJbmRleFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2xpY2UtdGl0bGUtcm93XCIgW2F0dHIuZGF0YS1zbGljZS1pbmRleF09XCJzaVwiIChjbGljayk9XCJ0b2dnbGVTbGljZUNvbGxhcHNlKHNpKVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2xpY2UtdGl0bGUtY2hldnJvblwiIFtjbGFzcy5leHBhbmRlZF09XCIhaXNTbGljZUNvbGxhcHNlZChzaSlcIj7igLo8L3NwYW4+XG4gICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiZ2V0U2xpY2VJY29uKHNsaWNlKVwiIGNsYXNzPVwic2xpY2UtdGl0bGUtaWNvblwiPnt7IGdldFNsaWNlSWNvbihzbGljZSkgfX08L21hdC1pY29uPlxuICAgICAgICAgIDxwIGNsYXNzPVwic2xpY2UtdGl0bGVcIj57eyBzbGljZS50aXRsZSB8fCBpMThuLmZpbHRlckJsb2NrRGVmYXVsdFRpdGxlIH19PC9wPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiaXNTbGljZUR5bmFtaWMoc2kpXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJzbGljZS1yZW1vdmUtYnRuXCJcbiAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHJlbW92ZUR5bmFtaWNTbGljZShzaSlcIlxuICAgICAgICAgID7DlzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwic2xpY2Utc2VjdGlvbi1pdGVtc1wiICpuZ0lmPVwiIWlzU2xpY2VDb2xsYXBzZWQoc2kpXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzU2xpY2VMb2FkaW5nKHNpKTsgZWxzZSBzbGljZUNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbGljZS1sYXp5LWxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYXp5LXNrZWxldG9uXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhenktc2tlbGV0b25cIj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGF6eS1za2VsZXRvblwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2xpY2VDb250ZW50PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2F0ZWdvcnkgb2Ygc2xpY2UuY2F0ZWdvcmllczsgdHJhY2tCeTogdHJhY2tCeUNhdGVnb3J5S2V5XCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAqbmdJZj1cInNsaWNlQ2F0ZWdvcnlDb3VudChzaSwgY2F0ZWdvcnkua2V5KSA+IDBcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2xpY2UtaXRlbVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpc1NsaWNlQ2F0ZWdvcnlBY3RpdmUoc2ksIGNhdGVnb3J5LmtleSlcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtY2F0ZWdvcnkta2V5XT1cImNhdGVnb3J5LmtleVwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cImNhdGVnb3J5LmxhYmVsXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25TbGljZUNhdGVnb3J5U2VsZWN0ZWQoc2ksIGNhdGVnb3J5LmtleSlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgY2F0ZWdvcnkubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaG93Q291bnRzXCI+e3sgc2xpY2VDYXRlZ29yeUNvdW50KHNpLCBjYXRlZ29yeS5rZXkpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzU2xpY2VFbXB0eShzaSlcIiBjbGFzcz1cInNsaWNlLWVtcHR5LXN0YXRlXCI+e3sgaTE4bi5maWx0ZXJFbXB0eVN0YXRlIH19PC9kaXY+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGhyICpuZ0lmPVwic2kgPCBzbGljZXMubGVuZ3RoIC0gMVwiIGNsYXNzPVwic2xpY2UtZGl2aWRlclwiIC8+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9hc2lkZT5cbjwvZGl2PlxuIl19
463
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2UtcGFuZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25ldGVtZS9qcXVlcnktb3JnYW5pemVyL3NyYy9saWIvc2xpY2UtcGFuZWwvc2xpY2UtcGFuZWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25ldGVtZS9qcXVlcnktb3JnYW5pemVyL3NyYy9saWIvc2xpY2UtcGFuZWwvc2xpY2UtcGFuZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFpQixTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBR2pNLE1BQU0sa0JBQWtCLEdBQUcsV0FBVyxDQUFDO0FBQ3ZDLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDO0FBRXBDLE1BQU0sSUFBSSxHQUFHO0lBQ1gsaUJBQWlCLEVBQUUsbUJBQW1CO0lBQ3RDLG1CQUFtQixFQUFFLG1CQUFtQjtJQUN4QyxnQkFBZ0IsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRO0lBQ3JFLHVCQUF1QixFQUFFLFNBQVM7SUFDbEMsZ0JBQWdCLEVBQUUsZUFBZTtDQUNsQyxDQUFDO0FBWUYsTUFBTSxPQUFPLG1CQUFtQjtJQVJoQztRQVVXLGlCQUFZLEdBQXFCLEVBQUUsQ0FBQztRQUNwQyxZQUFPLEdBQXdCLEVBQUUsQ0FBQztRQUNs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QUFhLENBQUMsc0JBQXNCLFVBQVUsSUFBSSxDQUF1QixDQUFDO1lBQzFGLEVBQUUsRUFBRSxjQUFjLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNULENBQUM7K0dBOWFVLG1CQUFtQjttR0FBbkIsbUJBQW1CLCtxQkMxQmhDLGk3RkErREEsbXNMRDFDWSxZQUFZLCtQQUFFLGFBQWE7OzRGQUsxQixtQkFBbUI7a0JBUi9CLFNBQVM7aUNBQ0ksSUFBSSxZQUNOLGFBQWEsV0FDZCxDQUFDLFlBQVksRUFBRSxhQUFhLENBQUMsbUJBR3JCLHVCQUF1QixDQUFDLE1BQU07OEJBSXRDLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVJLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLHNCQUFzQjtzQkFBL0IsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUVzQixpQkFBaUI7c0JBQTdDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQVFTLGFBQWE7c0JBQWhELFdBQVc7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNsaWNlQ29sdW1uRGVmLCBTbGljZUNvbmZpZyB9IGZyb20gJy4vc2xpY2UtcGFuZWwubW9kZWwnO1xuXG5jb25zdCBFTVBUWV9DQVRFR09SWV9LRVkgPSAnX19lbXB0eV9fJztcbmNvbnN0IEVNUFRZX0NBVEVHT1JZX0xBQkVMID0gJ1ZpZGUnO1xuXG5jb25zdCBJMThOID0ge1xuICBleHBhbmRGaWx0ZXJUaXRsZTogJ0TDqXBsaWVyIGxlIGZpbHRyZScsXG4gIGNvbGxhcHNlRmlsdGVyVGl0bGU6ICdSZXBsaWVyIGxlIGZpbHRyZScsXG4gIGZpbHRlclBhbmVsVGl0bGU6IChjb3VudDogbnVtYmVyKSA9PiBjb3VudCA+IDEgPyAnRmlsdHJlcycgOiAnRmlsdHJlJyxcbiAgZmlsdGVyQmxvY2tEZWZhdWx0VGl0bGU6ICdGaWx0cmVyJyxcbiAgZmlsdGVyRW1wdHlTdGF0ZTogJ0F1Y3VuZSBkb25uw6llJyxcbn07XG5cbmV4cG9ydCB0eXBlIFNsaWNlUGFuZWxGaWx0ZXJzID0gUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdzbGljZS1wYW5lbCcsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE1hdEljb25Nb2R1bGVdLFxuICB0ZW1wbGF0ZVVybDogJy4vc2xpY2UtcGFuZWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zbGljZS1wYW5lbC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU2xpY2VQYW5lbENvbXBvbmVudDxUID0gYW55PiBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0IHtcblxuICBASW5wdXQoKSBzbGljZUNvbmZpZ3M6IFNsaWNlQ29uZmlnPFQ+W10gPSBbXTtcbiAgQElucHV0KCkgY29sdW1uczogU2xpY2VDb2x1bW5EZWY8VD5bXSA9IFtdO1xuICBASW5wdXQoKSBkYXRhOiBUW10gPSBbXTtcbiAgQElucHV0KCkgbGF6eURhdGE6IE1hcDxzdHJpbmcsIE1hcDxhbnksIGFueT4+ID0gbmV3IE1hcCgpO1xuICBASW5wdXQoKSBsYXp5U3RhdHVzOiBNYXA8c3RyaW5nLCAnaWRsZScgfCAnbG9hZGluZycgfCAnbG9hZGVkJyB8ICdlcnJvcic+ID0gbmV3IE1hcCgpO1xuICBASW5wdXQoKSBzaG93VG9nZ2xlID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd0NvdW50cyA9IHRydWU7XG4gIEBJbnB1dCgpIGNvbGxhcHNlZEJ5RGVmYXVsdCA9IGZhbHNlO1xuICBASW5wdXQoKSBhbHdheXNTaG93ID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIGZpbHRlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8KHJvdzogVCkgPT4gYm9vbGVhbj4oKTtcbiAgQE91dHB1dCgpIGFjdGl2ZUtleXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdW10+KCk7XG4gIEBPdXRwdXQoKSBkeW5hbWljU2xpY2VLZXlzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmdbXT4oKTtcbiAgQE91dHB1dCgpIGNvbGxhcHNlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBAVmlld0NoaWxkKCdzbGljZVBhbmVsQm9keScpIHNsaWNlUGFuZWxCb2R5UmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgcHJpdmF0ZSBfY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICByZWFkb25seSBpMThuID0gSTE4TjtcblxuICBpc0NvbGxhcHNlZCA9IGZhbHNlO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuY29sbGFwc2VkJykgZ2V0IGhvc3RDb2xsYXBzZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmlzQ29sbGFwc2VkOyB9XG4gIGFjdGl2ZUtleXNCeVNsaWNlOiBNYXA8bnVtYmVyLCBTZXQ8c3RyaW5nPj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX2V4cGFuZGVkU2xpY2VzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIF9keW5hbWljU2xpY2VzOiBBcnJheTx7IGtleTogc3RyaW5nOyBzbGljZTogU2xpY2VDb25maWc8VD4gfT4gPSBbXTtcblxuICBfY2FjaGVkU2xpY2VzOiBTbGljZUNvbmZpZzxUPltdID0gW107XG4gIHByaXZhdGUgX2NvdW50Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gIHJlYWRvbmx5IHRyYWNrQnlTbGljZUluZGV4ID0gKGluZGV4OiBudW1iZXIsIF86IGFueSk6IG51bWJlciA9PiBpbmRleDtcbiAgcmVhZG9ubHkgdHJhY2tCeUNhdGVnb3J5S2V5ID0gKF86IG51bWJlciwgY2F0OiBhbnkpOiBzdHJpbmcgPT4gY2F0LmtleTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzQ29sbGFwc2VkID0gdGhpcy5jb2xsYXBzZWRCeURlZmF1bHQ7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3NsaWNlQ29uZmlncyddIHx8IGNoYW5nZXNbJ2RhdGEnXSB8fCBjaGFuZ2VzWydjb2x1bW5zJ10gfHwgY2hhbmdlc1snbGF6eURhdGEnXSB8fCBjaGFuZ2VzWydsYXp5U3RhdHVzJ10pIHtcbiAgICAgIHRoaXMuX3JlZnJlc2hEeW5hbWljU2xpY2VzKCk7XG4gICAgICB0aGlzLl9yZWJ1aWxkQ2FjaGUoKTtcbiAgICAgIGNvbnN0IHNob3VsZFJlZW1pdEZpbHRlciA9ICEhKGNoYW5nZXNbJ2RhdGEnXSB8fCBjaGFuZ2VzWydjb2x1bW5zJ10gfHwgY2hhbmdlc1snbGF6eURhdGEnXSB8fCBjaGFuZ2VzWydsYXp5U3RhdHVzJ10pO1xuICAgICAgY29uc3QgaGFzQWN0aXZlRmlsdGVycyA9IFsuLi50aGlzLmFjdGl2ZUtleXNCeVNsaWNlLnZhbHVlcygpXS5zb21lKHMgPT4gcy5zaXplID4gMCk7XG4gICAgICBpZiAoaGFzQWN0aXZlRmlsdGVycyAmJiBzaG91bGRSZWVtaXRGaWx0ZXIpIHtcbiAgICAgICAgdGhpcy5fZW1pdEZpbHRlcigpO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBzaG93UGFuZWwoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaGFzQ2ZnID0gKHRoaXMuc2xpY2VDb25maWdzIHx8IFtdKS5sZW5ndGggPiAwIHx8IHRoaXMuX2R5bmFtaWNTbGljZXMubGVuZ3RoID4gMDtcbiAgICBpZiAodGhpcy5hbHdheXNTaG93KSByZXR1cm4gaGFzQ2ZnO1xuICAgIHJldHVybiBoYXNDZmcgJiYgKHRoaXMuZGF0YT8ubGVuZ3RoID8/IDApID4gMDtcbiAgfVxuXG4gIGdldCBzbGljZXMoKTogU2xpY2VDb25maWc8VD5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlZFNsaWNlcztcbiAgfVxuXG4gIGdldCBzdGF0aWNTbGljZUNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuICh0aGlzLnNsaWNlQ29uZmlncyB8fCBbXSkubGVuZ3RoO1xuICB9XG5cbiAgZ2V0IHN0YXRpY1NsaWNlc0Zvck1lbnUoKTogQXJyYXk8eyBrZXk6IHN0cmluZzsgdGl0bGU6IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuICh0aGlzLnNsaWNlQ29uZmlncyB8fCBbXSlcbiAgICAgIC5maWx0ZXIoKHMpID0+ICEhcy5jb2x1bW5LZXkpXG4gICAgICAubWFwKChzKSA9PiAoeyBrZXk6IHMuY29sdW1uS2V5ISwgdGl0bGU6IHMudGl0bGUgfHwgcy5jb2x1bW5LZXkhIH0pKTtcbiAgfVxuXG4gIGdldCBhY3RpdmVEeW5hbWljU2xpY2VDb2x1bW5zKCk6IFNsaWNlQ29sdW1uRGVmPFQ+W10ge1xuICAgIHJldHVybiB0aGlzLl9keW5hbWljU2xpY2VzXG4gICAgICAubWFwKChkKSA9PiAodGhpcy5jb2x1bW5zIHx8IFtdKS5maW5kKChjKSA9PiBjLmtleSA9PT0gZC5rZXkpKVxuICAgICAgLmZpbHRlcigoYyk6IGMgaXMgU2xpY2VDb2x1bW5EZWY8VD4gPT4gISFjKTtcbiAgfVxuXG4gIGdldCBhdmFpbGFibGVDb2x1bW5zRm9yRHluYW1pY1NsaWNlKCk6IFNsaWNlQ29sdW1uRGVmPFQ+W10ge1xuICAgIGNvbnN0IGR5bmFtaWNLZXlzID0gbmV3IFNldCh0aGlzLl9keW5hbWljU2xpY2VzLm1hcCgoZCkgPT4gZC5rZXkpKTtcbiAgICBjb25zdCBzdGF0aWNLZXlzID0gbmV3IFNldChcbiAgICAgICh0aGlzLnNsaWNlQ29uZmlncyB8fCBbXSkubWFwKChzKSA9PiBzLmNvbHVtbktleSkuZmlsdGVyKChrKTogayBpcyBzdHJpbmcgPT4gISFrKVxuICAgICk7XG4gICAgY29uc3QgZXhpc3RpbmdLZXlzID0gbmV3IFNldChbLi4uZHluYW1pY0tleXMsIC4uLnN0YXRpY0tleXNdKTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgcmV0dXJuICh0aGlzLmNvbHVtbnMgfHwgW10pLmZpbHRlcigoYykgPT4ge1xuICAgICAgaWYgKGV4aXN0aW5nS2V5cy5oYXMoYy5rZXkpIHx8IHNlZW4uaGFzKGMua2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgc2Vlbi5hZGQoYy5rZXkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cblxuICBpc1NsaWNlQ29sbGFwc2VkKHNsaWNlSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9jYWNoZWRTbGljZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZXhwYW5kZWRTbGljZXMuaGFzKC0xIC0gc2xpY2VJbmRleCk7XG4gICAgfVxuICAgIHJldHVybiAhdGhpcy5fZXhwYW5kZWRTbGljZXMuaGFzKHNsaWNlSW5kZXgpO1xuICB9XG5cbiAgdG9nZ2xlU2xpY2VDb2xsYXBzZShzbGljZUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zbGljZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBjbG9zZWRLZXkgPSAtMSAtIHNsaWNlSW5kZXg7XG4gICAgICBpZiAodGhpcy5fZXhwYW5kZWRTbGljZXMuaGFzKGNsb3NlZEtleSkpIHtcbiAgICAgICAgdGhpcy5fZXhwYW5kZWRTbGljZXMuZGVsZXRlKGNsb3NlZEtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9leHBhbmRlZFNsaWNlcy5hZGQoY2xvc2VkS2V5KTtcbiAgICAgICAgdGhpcy5fc2Nyb2xsU2xpY2VUaXRsZUludG9WaWV3KHNsaWNlSW5kZXgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5fZXhwYW5kZWRTbGljZXMuaGFzKHNsaWNlSW5kZXgpKSB7XG4gICAgICAgIHRoaXMuX2V4cGFuZGVkU2xpY2VzLmRlbGV0ZShzbGljZUluZGV4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2V4cGFuZGVkU2xpY2VzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuX2V4cGFuZGVkU2xpY2VzLmFkZChzbGljZUluZGV4KTtcbiAgICAgICAgdGhpcy5fc2Nyb2xsU2xpY2VUaXRsZUludG9WaWV3KHNsaWNlSW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICB0b2dnbGVQYW5lbCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzQ29sbGFwc2VkID0gIXRoaXMuaXNDb2xsYXBzZWQ7XG4gICAgdGhpcy5jb2xsYXBzZWRDaGFuZ2UuZW1pdCh0aGlzLmlzQ29sbGFwc2VkKTtcbiAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBpc1NsaWNlRHluYW1pYyhzbGljZUluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc2xpY2VJbmRleCA+PSB0aGlzLnN0YXRpY1NsaWNlQ291bnQ7XG4gIH1cblxuICBpc1NsaWNlTG9hZGluZyhzbGljZUluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBzdGF0aWNTbGljZSA9ICh0aGlzLnNsaWNlQ29uZmlncyB8fCBbXSlbc2xpY2VJbmRleF07XG4gICAgaWYgKHN0YXRpY1NsaWNlPy5jb2x1bW5LZXkpIHtcbiAgICAgIGNvbnN0IGNvbERlZiA9ICh0aGlzLmNvbHVtbnMgfHwgW10pLmZpbmQoYyA9PiBjLmtleSA9PT0gc3RhdGljU2xpY2UuY29sdW1uS2V5KTtcbiAgICAgIGlmIChjb2xEZWY/LmxhenkpIHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gdGhpcy5sYXp5U3RhdHVzLmdldChzdGF0aWNTbGljZS5jb2x1bW5LZXkhKSA/PyAnaWRsZSc7XG4gICAgICAgIHJldHVybiBzdGF0dXMgPT09ICdsb2FkaW5nJyB8fCBzdGF0dXMgPT09ICdpZGxlJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gdGhpcy5fZ2V0RHluYW1pY1NsaWNlQ29sdW1uS2V5KHNsaWNlSW5kZXgpO1xuICAgIGlmICgha2V5KSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgY29sRGVmID0gKHRoaXMuY29sdW1ucyB8fCBbXSkuZmluZChjID0+IGMua2V5ID09PSBrZXkpO1xuICAgIGlmICghY29sRGVmPy5sYXp5KSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3Qgc3RhdHVzID0gdGhpcy5sYXp5U3RhdHVzLmdldChrZXkpID8/ICdpZGxlJztcbiAgICByZXR1cm4gc3RhdHVzID09PSAnbG9hZGluZycgfHwgc3RhdHVzID09PSAnaWRsZSc7XG4gIH1cblxuICBpc1N0YXRpY1NsaWNlVmlzaWJsZShfY29sdW1uS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldFNsaWNlSWNvbihzbGljZTogU2xpY2VDb25maWc8VD4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmIChzbGljZS5pY29uKSByZXR1cm4gc2xpY2UuaWNvbjtcbiAgICBpZiAoc2xpY2UuY29sdW1uS2V5KSB7XG4gICAgICByZXR1cm4gKHRoaXMuY29sdW1ucyB8fCBbXSkuZmluZChjID0+IGMua2V5ID09PSBzbGljZS5jb2x1bW5LZXkpPy5pY29uO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaXNTbGljZUNhdGVnb3J5QWN0aXZlKHNsaWNlSW5kZXg6IG51bWJlciwgY2F0ZWdvcnlLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUtleXNCeVNsaWNlLmdldChzbGljZUluZGV4KT8uaGFzKGNhdGVnb3J5S2V5KSA/PyBmYWxzZTtcbiAgfVxuXG4gIGlzU2xpY2VBbGxBY3RpdmUoc2xpY2VJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmFjdGl2ZUtleXNCeVNsaWNlLmhhcyhzbGljZUluZGV4KSB8fCB0aGlzLmFjdGl2ZUtleXNCeVNsaWNlLmdldChzbGljZUluZGV4KSEuc2l6ZSA9PT0gMDtcbiAgfVxuXG4gIHNsaWNlQ2F0ZWdvcnlDb3VudChzbGljZUluZGV4OiBudW1iZXIsIGNhdGVnb3J5S2V5OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7c2xpY2VJbmRleH06JHtjYXRlZ29yeUtleX1gO1xuICAgIGlmICh0aGlzLl9jb3VudENhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jb3VudENhY2hlLmdldChjYWNoZUtleSkhO1xuICAgIH1cbiAgICBjb25zdCBzbGljZSA9IHRoaXMuX2NhY2hlZFNsaWNlc1tzbGljZUluZGV4XTtcbiAgICBpZiAoIXNsaWNlKSByZXR1cm4gMDtcbiAgICBjb25zdCBjYXRlZ29yeSA9IChzbGljZS5jYXRlZ29yaWVzIHx8IFtdKS5maW5kKChjKSA9PiBjLmtleSA9PT0gY2F0ZWdvcnlLZXkpO1xuICAgIGNvbnN0IGNvdW50ID0gY2F0ZWdvcnkgPyAodGhpcy5kYXRhIHx8IFtdKS5maWx0ZXIoKHJvdykgPT4gY2F0ZWdvcnkuZmlsdGVyID8gY2F0ZWdvcnkuZmlsdGVyKHJvdykgOiB0cnVlKS5sZW5ndGggOiAwO1xuICAgIHRoaXMuX2NvdW50Q2FjaGUuc2V0KGNhY2hlS2V5LCBjb3VudCk7XG4gICAgcmV0dXJuIGNvdW50O1xuICB9XG5cbiAgaXNTbGljZUVtcHR5KHNsaWNlSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNsaWNlID0gdGhpcy5fY2FjaGVkU2xpY2VzW3NsaWNlSW5kZXhdO1xuICAgIGlmICghc2xpY2UpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiAoc2xpY2UuY2F0ZWdvcmllcyB8fCBbXSkuZXZlcnkoYyA9PiB0aGlzLnNsaWNlQ2F0ZWdvcnlDb3VudChzbGljZUluZGV4LCBjLmtleSkgPT09IDApO1xuICB9XG5cbiAgb25TbGljZUNhdGVnb3J5U2VsZWN0ZWQoc2xpY2VJbmRleDogbnVtYmVyLCBjYXRlZ29yeUtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgc2xpY2UgPSB0aGlzLnNsaWNlc1tzbGljZUluZGV4XTtcbiAgICBpZiAoIXNsaWNlKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmFjdGl2ZUtleXNCeVNsaWNlLmhhcyhzbGljZUluZGV4KSkge1xuICAgICAgdGhpcy5hY3RpdmVLZXlzQnlTbGljZS5zZXQoc2xpY2VJbmRleCwgbmV3IFNldCgpKTtcbiAgICB9XG4gICAgY29uc3QgYWN0aXZlS2V5cyA9IHRoaXMuYWN0aXZlS2V5c0J5U2xpY2UuZ2V0KHNsaWNlSW5kZXgpITtcbiAgICBpZiAoc2xpY2UubXVsdGlTZWxlY3QgPT09IGZhbHNlKSB7XG4gICAgICBpZiAoYWN0aXZlS2V5cy5oYXMoY2F0ZWdvcnlLZXkpKSB7XG4gICAgICAgIGFjdGl2ZUtleXMuY2xlYXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGl2ZUtleXMuY2xlYXIoKTtcbiAgICAgICAgYWN0aXZlS2V5cy5hZGQoY2F0ZWdvcnlLZXkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYWN0aXZlS2V5cy5oYXMoY2F0ZWdvcnlLZXkpKSB7XG4gICAgICAgIGFjdGl2ZUtleXMuZGVsZXRlKGNhdGVnb3J5S2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGl2ZUtleXMuYWRkKGNhdGVnb3J5S2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fZW1pdEZpbHRlcigpO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uU2xpY2VBbGxTZWxlY3RlZChzbGljZUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hY3RpdmVLZXlzQnlTbGljZS5oYXMoc2xpY2VJbmRleCkpIHtcbiAgICAgIHRoaXMuYWN0aXZlS2V5c0J5U2xpY2UuZ2V0KHNsaWNlSW5kZXgpIS5jbGVhcigpO1xuICAgIH1cbiAgICB0aGlzLl9lbWl0RmlsdGVyKCk7XG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0QWN0aXZlRmlsdGVycygpOiBTbGljZVBhbmVsRmlsdGVycyB7XG4gICAgY29uc3QgcmVzdWx0OiBTbGljZVBhbmVsRmlsdGVycyA9IHt9O1xuICAgIHRoaXMuX2NhY2hlZFNsaWNlcy5mb3JFYWNoKChzbGljZSwgaWR4KSA9PiB7XG4gICAgICBjb25zdCBrZXlzID0gdGhpcy5hY3RpdmVLZXlzQnlTbGljZS5nZXQoaWR4KTtcbiAgICAgIHJlc3VsdFt0aGlzLl9nZXRQZXJzaXN0ZW50U2xpY2VLZXkoc2xpY2UsIGlkeCldID0ga2V5cyA/IFsuLi5rZXlzXSA6IFtdO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICByZXN0b3JlRmlsdGVycyhmaWx0ZXJzOiBTbGljZVBhbmVsRmlsdGVycyk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlS2V5c0J5U2xpY2UgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5fY2FjaGVkU2xpY2VzLmZvckVhY2goKHNsaWNlLCBpbmRleCkgPT4ge1xuICAgICAgLy8gTGVzIHByw6lmw6lyZW5jZXMgaGlzdG9yaXF1ZXMgdXRpbGlzYWllbnQgbCdpbmRleCBudW3DqXJpcXVlIGNvbW1lIGNsw6kuXG4gICAgICBjb25zdCBrZXlzID0gZmlsdGVyc1t0aGlzLl9nZXRQZXJzaXN0ZW50U2xpY2VLZXkoc2xpY2UsIGluZGV4KV0gPz8gZmlsdGVyc1tTdHJpbmcoaW5kZXgpXTtcbiAgICAgIGlmIChrZXlzPy5sZW5ndGgpIHRoaXMuYWN0aXZlS2V5c0J5U2xpY2Uuc2V0KGluZGV4LCBuZXcgU2V0KGtleXMpKTtcbiAgICB9KTtcbiAgICB0aGlzLl9lbWl0RmlsdGVyKCk7XG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgYWRkRHluYW1pY1NsaWNlKGNvbHVtbjogU2xpY2VDb2x1bW5EZWY8VD4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZHluYW1pY1NsaWNlcy5zb21lKHNsaWNlID0+IHNsaWNlLmtleSA9PT0gY29sdW1uLmtleSkpIHJldHVybjtcbiAgICBjb25zdCBkaXN0aW5jdFZhbHVlcyA9IHRoaXMuX2NvbXB1dGVEaXN0aW5jdFZhbHVlcyhjb2x1bW4ua2V5KTtcbiAgICBjb25zdCBuZXdTbGljZTogU2xpY2VDb25maWc8VD4gPSB7XG4gICAgICB0aXRsZTogY29sdW1uLmhlYWRlcixcbiAgICAgIGNvbHVtbktleTogY29sdW1uLmtleSxcbiAgICAgIGNhdGVnb3JpZXM6IGRpc3RpbmN0VmFsdWVzLm1hcCgodikgPT4gdGhpcy5fYnVpbGRDYXRlZ29yeUZyb21WYWx1ZShjb2x1bW4ua2V5LCB2KSksXG4gICAgfTtcbiAgICB0aGlzLl9keW5hbWljU2xpY2VzID0gWy4uLnRoaXMuX2R5bmFtaWNTbGljZXMsIHsga2V5OiBjb2x1bW4ua2V5LCBzbGljZTogbmV3U2xpY2UgfV07XG4gICAgdGhpcy5fcmVidWlsZENhY2hlKCk7XG4gICAgdGhpcy5keW5hbWljU2xpY2VLZXlzQ2hhbmdlLmVtaXQodGhpcy5fZHluYW1pY1NsaWNlcy5tYXAoZCA9PiBkLmtleSkpO1xuICAgIHRoaXMuX2VtaXRGaWx0ZXIoKTtcbiAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICByZW1vdmVEeW5hbWljU2xpY2Uoc2xpY2VJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZHluYW1pY0luZGV4ID0gc2xpY2VJbmRleCAtIHRoaXMuc3RhdGljU2xpY2VDb3VudDtcbiAgICBpZiAoZHluYW1pY0luZGV4IDwgMCkgcmV0dXJuO1xuICAgIGNvbnN0IG5ld0FjdGl2ZUtleXMgPSBuZXcgTWFwPG51bWJlciwgU2V0PHN0cmluZz4+KCk7XG4gICAgdGhpcy5hY3RpdmVLZXlzQnlTbGljZS5mb3JFYWNoKChrZXlzLCBpZHgpID0+IHtcbiAgICAgIGlmIChpZHggPCBzbGljZUluZGV4KSBuZXdBY3RpdmVLZXlzLnNldChpZHgsIGtleXMpO1xuICAgICAgZWxzZSBpZiAoaWR4ID4gc2xpY2VJbmRleCkgbmV3QWN0aXZlS2V5cy5zZXQoaWR4IC0gMSwga2V5cyk7XG4gICAgfSk7XG4gICAgdGhpcy5hY3RpdmVLZXlzQnlTbGljZSA9IG5ld0FjdGl2ZUtleXM7XG4gICAgdGhpcy5fZHluYW1pY1NsaWNlcyA9IHRoaXMuX2R5bmFtaWNTbGljZXMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBkeW5hbWljSW5kZXgpO1xuICAgIHRoaXMuX3JlYnVpbGRDYWNoZSgpO1xuICAgIHRoaXMuZHluYW1pY1NsaWNlS2V5c0NoYW5nZS5lbWl0KHRoaXMuX2R5bmFtaWNTbGljZXMubWFwKGQgPT4gZC5rZXkpKTtcbiAgICB0aGlzLl9lbWl0RmlsdGVyKCk7XG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcmVtb3ZlRHluYW1pY1NsaWNlQnlLZXkoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkeW5hbWljSW5kZXggPSB0aGlzLl9keW5hbWljU2xpY2VzLmZpbmRJbmRleCgoZCkgPT4gZC5rZXkgPT09IGtleSk7XG4gICAgaWYgKGR5bmFtaWNJbmRleCA8IDApIHJldHVybjtcbiAgICBjb25zdCBzbGljZUluZGV4ID0gdGhpcy5zdGF0aWNTbGljZUNvdW50ICsgZHluYW1pY0luZGV4O1xuICAgIHRoaXMucmVtb3ZlRHluYW1pY1NsaWNlKHNsaWNlSW5kZXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZW1pdEZpbHRlcigpOiB2b2lkIHtcbiAgICBjb25zdCBzbGljZXMgPSB0aGlzLnNsaWNlcztcbiAgICBjb25zdCBhY3RpdmVLZXlzQnlTbGljZSA9IHRoaXMuYWN0aXZlS2V5c0J5U2xpY2U7XG5cbiAgICB0aGlzLmFjdGl2ZUtleXNDaGFuZ2UuZW1pdChcbiAgICAgIHNsaWNlcy5tYXAoKF8sIGkpID0+IHtcbiAgICAgICAgY29uc3Qga2V5cyA9IGFjdGl2ZUtleXNCeVNsaWNlLmdldChpKTtcbiAgICAgICAgcmV0dXJuIGtleXMgPyBbLi4ua2V5c10gOiBbXTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IHByZWQgPSAocm93OiBUKTogYm9vbGVhbiA9PlxuICAgICAgc2xpY2VzLmV2ZXJ5KChzbGljZSwgc2xpY2VJbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBhY3RpdmVLZXlzID0gYWN0aXZlS2V5c0J5U2xpY2UuZ2V0KHNsaWNlSW5kZXgpO1xuICAgICAgICBpZiAoIWFjdGl2ZUtleXMgfHwgYWN0aXZlS2V5cy5zaXplID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKCFzbGljZS5jYXRlZ29yaWVzIHx8IHNsaWNlLmNhdGVnb3JpZXMubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIFsuLi5hY3RpdmVLZXlzXS5zb21lKChrZXkpID0+IHtcbiAgICAgICAgICBjb25zdCBjYXRlZ29yeSA9IChzbGljZS5jYXRlZ29yaWVzIHx8IFtdKS5maW5kKChjKSA9PiBjLmtleSA9PT0ga2V5KTtcbiAgICAgICAgICBpZiAoIWNhdGVnb3J5KSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgaWYgKCFjYXRlZ29yeT8uZmlsdGVyKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICByZXR1cm4gY2F0ZWdvcnkuZmlsdGVyKHJvdyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgdGhpcy5maWx0ZXJDaGFuZ2UuZW1pdChwcmVkKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldER5bmFtaWNTbGljZUNvbHVtbktleShzbGljZUluZGV4OiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBkeW5hbWljSW5kZXggPSBzbGljZUluZGV4IC0gdGhpcy5zdGF0aWNTbGljZUNvdW50O1xuICAgIHJldHVybiB0aGlzLl9keW5hbWljU2xpY2VzW2R5bmFtaWNJbmRleF0/LmtleSA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UGVyc2lzdGVudFNsaWNlS2V5KHNsaWNlOiBTbGljZUNvbmZpZzxUPiwgaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHNsaWNlLmNvbHVtbktleSA/IGBjb2x1bW46JHtzbGljZS5jb2x1bW5LZXl9YCA6IGBpbmRleDoke2luZGV4fWA7XG4gIH1cblxuICBwcml2YXRlIF9nZXRTbGljZUlkZW50aXR5KHNsaWNlOiBTbGljZUNvbmZpZzxUPiwgZmFsbGJhY2tJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoc2xpY2UuY29sdW1uS2V5KSByZXR1cm4gYGNvbHVtbjoke3NsaWNlLmNvbHVtbktleX1gO1xuICAgIGlmIChzbGljZS50aXRsZSkgcmV0dXJuIGB0aXRsZToke3NsaWNlLnRpdGxlfWA7XG4gICAgY29uc3QgY2F0ZWdvcnlLZXlzID0gKHNsaWNlLmNhdGVnb3JpZXMgfHwgW10pLm1hcCgoYykgPT4gYy5rZXkpLmpvaW4oJ3wnKTtcbiAgICByZXR1cm4gYGluZGV4OiR7ZmFsbGJhY2tJbmRleH18Y2F0ZWdvcmllczoke2NhdGVnb3J5S2V5c31gO1xuICB9XG5cbiAgcHJpdmF0ZSBfbWF0ZXJpYWxpemVTbGljZShzbGljZTogU2xpY2VDb25maWc8VD4pOiBTbGljZUNvbmZpZzxUPiB7XG4gICAgaWYgKCFzbGljZS5jb2x1bW5LZXkgfHwgKHNsaWNlLmNhdGVnb3JpZXMgJiYgc2xpY2UuY2F0ZWdvcmllcy5sZW5ndGggPiAwKSkge1xuICAgICAgcmV0dXJuIHNsaWNlO1xuICAgIH1cbiAgICBjb25zdCBjb2wgPSAodGhpcy5jb2x1bW5zIHx8IFtdKS5maW5kKGMgPT4gYy5rZXkgPT09IHNsaWNlLmNvbHVtbktleSk7XG4gICAgY29uc3QgaXNMYXp5ID0gISFjb2w/Lmxhenk7XG4gICAgaWYgKGlzTGF6eSAmJiB0aGlzLmxhenlTdGF0dXMuZ2V0KHNsaWNlLmNvbHVtbktleSEpICE9PSAnbG9hZGVkJykge1xuICAgICAgcmV0dXJuIHsgLi4uc2xpY2UsIGNhdGVnb3JpZXM6IFtdIH07XG4gICAgfVxuICAgIGlmIChzbGljZS5idWNrZXQpIHtcbiAgICAgIGNvbnN0IGRpc3RpbmN0VmFsdWVzID0gWy4uLm5ldyBTZXQoKHRoaXMuZGF0YSB8fCBbXSkubWFwKHNsaWNlLmJ1Y2tldCkpXS5zb3J0KCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zbGljZSxcbiAgICAgICAgY2F0ZWdvcmllczogZGlzdGluY3RWYWx1ZXMubWFwKCh2KSA9PiAoe1xuICAgICAgICAgIGtleTogdiwgbGFiZWw6IHYsXG4gICAgICAgICAgZmlsdGVyOiAocm93OiBUKSA9PiBzbGljZS5idWNrZXQhKHJvdykgPT09IHYsXG4gICAgICAgIH0pKSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGRpc3RpbmN0VmFsdWVzID0gdGhpcy5fY29tcHV0ZURpc3RpbmN0VmFsdWVzKHNsaWNlLmNvbHVtbktleSEpO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zbGljZSxcbiAgICAgIGNhdGVnb3JpZXM6IGRpc3RpbmN0VmFsdWVzLm1hcCgodikgPT4gdGhpcy5fYnVpbGRDYXRlZ29yeUZyb21WYWx1ZShzbGljZS5jb2x1bW5LZXkhLCB2KSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2J1aWxkQ2F0ZWdvcnlGcm9tVmFsdWUoY29sdW1uS2V5OiBzdHJpbmcsIHY6IHN0cmluZyk6IHsga2V5OiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IGZpbHRlcjogKHJvdzogVCkgPT4gYm9vbGVhbiB9IHtcbiAgICBpZiAodiA9PT0gRU1QVFlfQ0FURUdPUllfS0VZKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBrZXk6IEVNUFRZX0NBVEVHT1JZX0tFWSxcbiAgICAgICAgbGFiZWw6IEVNUFRZX0NBVEVHT1JZX0xBQkVMLFxuICAgICAgICBmaWx0ZXI6IChyb3c6IFQpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLl9nZXRMYXp5QXdhcmVWYWx1ZShjb2x1bW5LZXksIHJvdyk7XG4gICAgICAgICAgcmV0dXJuIHZhbCA9PSBudWxsIHx8IHZhbCA9PT0gJyc7XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAga2V5OiB2LCBsYWJlbDogdixcbiAgICAgIGZpbHRlcjogKHJvdzogVCkgPT4gU3RyaW5nKHRoaXMuX2dldExhenlBd2FyZVZhbHVlKGNvbHVtbktleSwgcm93KSA/PyAnJykgPT09IHYsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbXB1dGVEaXN0aW5jdFZhbHVlcyhjb2x1bW5LZXk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByYXdWYWx1ZXMgPSAodGhpcy5kYXRhIHx8IFtdKS5tYXAoKHJvdykgPT4ge1xuICAgICAgY29uc3QgdmFsID0gdGhpcy5fZ2V0TGF6eUF3YXJlVmFsdWUoY29sdW1uS2V5LCByb3cpO1xuICAgICAgcmV0dXJuIHZhbCAhPSBudWxsICYmIHZhbCAhPT0gJycgPyBTdHJpbmcodmFsKSA6IG51bGw7XG4gICAgfSk7XG4gICAgY29uc3QgZGlzdGluY3QgPSBbLi4ubmV3IFNldChyYXdWYWx1ZXMuZmlsdGVyKCh2KTogdiBpcyBzdHJpbmcgPT4gdiAhPT0gbnVsbCkpXS5zb3J0KCk7XG4gICAgaWYgKHJhd1ZhbHVlcy5zb21lKHYgPT4gdiA9PT0gbnVsbCkpIGRpc3RpbmN0LnB1c2goRU1QVFlfQ0FURUdPUllfS0VZKTtcbiAgICByZXR1cm4gZGlzdGluY3Q7XG4gIH1cblxuICBwcml2YXRlIF9nZXRMYXp5QXdhcmVWYWx1ZShjb2x1bW5LZXk6IHN0cmluZywgcm93OiBUKTogYW55IHtcbiAgICBjb25zdCBjb2xEZWYgPSAodGhpcy5jb2x1bW5zIHx8IFtdKS5maW5kKGMgPT4gYy5rZXkgPT09IGNvbHVtbktleSk7XG4gICAgaWYgKGNvbERlZj8ubGF6eSkge1xuICAgICAgcmV0dXJuIHRoaXMubGF6eURhdGEuZ2V0KGNvbHVtbktleSk/LmdldChyb3cpID8/IG51bGw7XG4gICAgfVxuICAgIGlmIChjb2xEZWY/LnZhbHVlKSB7XG4gICAgICByZXR1cm4gKGNvbERlZi52YWx1ZSBhcyBhbnkpKHJvdywgMCk7XG4gICAgfVxuICAgIHJldHVybiAocm93IGFzIGFueSlbY29sdW1uS2V5XTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlYnVpbGRDYWNoZSgpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2aW91c1NsaWNlcyA9IHRoaXMuX2NhY2hlZFNsaWNlcztcbiAgICBjb25zdCBwcmV2aW91c0FjdGl2ZUtleXMgPSB0aGlzLmFjdGl2ZUtleXNCeVNsaWNlO1xuICAgIGNvbnN0IGFsbFNsaWNlcyA9IFsuLi4odGhpcy5zbGljZUNvbmZpZ3MgfHwgW10pLCAuLi50aGlzLl9keW5hbWljU2xpY2VzLm1hcCgoZCkgPT4gZC5zbGljZSldO1xuICAgIHRoaXMuX2NhY2hlZFNsaWNlcyA9IGFsbFNsaWNlcy5tYXAoKHNsaWNlKSA9PiB0aGlzLl9tYXRlcmlhbGl6ZVNsaWNlKHNsaWNlKSk7XG5cbiAgICBjb25zdCBwcmV2aW91c0tleXNCeUlkZW50aXR5ID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuICAgIHByZXZpb3VzU2xpY2VzLmZvckVhY2goKHNsaWNlLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgYWN0aXZlS2V5cyA9IHByZXZpb3VzQWN0aXZlS2V5cy5nZXQoaW5kZXgpO1xuICAgICAgaWYgKCFhY3RpdmVLZXlzIHx8IGFjdGl2ZUtleXMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuICAgICAgcHJldmlvdXNLZXlzQnlJZGVudGl0eS5zZXQodGhpcy5fZ2V0U2xpY2VJZGVudGl0eShzbGljZSwgaW5kZXgpLCBuZXcgU2V0KGFjdGl2ZUtleXMpKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IG5leHRBY3RpdmVLZXlzID0gbmV3IE1hcDxudW1iZXIsIFNldDxzdHJpbmc+PigpO1xuICAgIHRoaXMuX2NhY2hlZFNsaWNlcy5mb3JFYWNoKChzbGljZSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHByZXZpb3VzS2V5cyA9IHByZXZpb3VzS2V5c0J5SWRlbnRpdHkuZ2V0KHRoaXMuX2dldFNsaWNlSWRlbnRpdHkoc2xpY2UsIGluZGV4KSk7XG4gICAgICBpZiAoIXByZXZpb3VzS2V5cyB8fCBwcmV2aW91c0tleXMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuICAgICAgY29uc3QgYXZhaWxhYmxlS2V5cyA9IG5ldyBTZXQoKHNsaWNlLmNhdGVnb3JpZXMgfHwgW10pLm1hcCgoYykgPT4gYy5rZXkpKTtcbiAgICAgIGNvbnN0IG1hdGNoaW5nS2V5cyA9IFsuLi5wcmV2aW91c0tleXNdLmZpbHRlcigoa2V5KSA9PiBhdmFpbGFibGVLZXlzLmhhcyhrZXkpKTtcbiAgICAgIGlmIChtYXRjaGluZ0tleXMubGVuZ3RoID4gMCkgbmV4dEFjdGl2ZUtleXMuc2V0KGluZGV4LCBuZXcgU2V0KG1hdGNoaW5nS2V5cykpO1xuICAgIH0pO1xuICAgIHRoaXMuYWN0aXZlS2V5c0J5U2xpY2UgPSBuZXh0QWN0aXZlS2V5cztcbiAgICB0aGlzLl9jb3VudENhY2hlLmNsZWFyKCk7XG4gIH1cblxuICBwcml2YXRlIF9yZWZyZXNoRHluYW1pY1NsaWNlcygpOiB2b2lkIHtcbiAgICB0aGlzLl9keW5hbWljU2xpY2VzID0gdGhpcy5fZHluYW1pY1NsaWNlcy5tYXAoKHsga2V5LCBzbGljZSB9KSA9PiB7XG4gICAgICBjb25zdCBkaXN0aW5jdFZhbHVlcyA9IHRoaXMuX2NvbXB1dGVEaXN0aW5jdFZhbHVlcyhrZXkpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5LFxuICAgICAgICBzbGljZToge1xuICAgICAgICAgIC4uLnNsaWNlLFxuICAgICAgICAgIGNhdGVnb3JpZXM6IGRpc3RpbmN0VmFsdWVzLm1hcCgodikgPT4gdGhpcy5fYnVpbGRDYXRlZ29yeUZyb21WYWx1ZShrZXksIHYpKSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9zY3JvbGxTbGljZVRpdGxlSW50b1ZpZXcoc2xpY2VJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBib2R5ID0gdGhpcy5zbGljZVBhbmVsQm9keVJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICghYm9keSkgcmV0dXJuO1xuICAgICAgY29uc3QgZWwgPSBib2R5LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXNsaWNlLWluZGV4PVwiJHtzbGljZUluZGV4fVwiXWApIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgIGVsPy5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICduZWFyZXN0JyB9KTtcbiAgICB9LCA1MCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJzbGljZS1wYW5lbC13cmFwcGVyXCIgW2NsYXNzLmNvbGxhcHNlZF09XCJpc0NvbGxhcHNlZFwiPlxuICA8YXNpZGUgY2xhc3M9XCJzbGljZS1wYW5lbFwiIFtjbGFzcy5jb2xsYXBzZWRdPVwiaXNDb2xsYXBzZWRcIj5cbiAgICA8ZGl2IGNsYXNzPVwic2xpY2UtcGFuZWwtaGVhZGVyXCI+XG4gICAgICA8c3BhbiAqbmdJZj1cIiFpc0NvbGxhcHNlZFwiIGNsYXNzPVwic2xpY2UtcGFuZWwtdGl0bGVcIj5cbiAgICAgICAge3sgaTE4bi5maWx0ZXJQYW5lbFRpdGxlKHNsaWNlcy5sZW5ndGgpIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwic2hvd1RvZ2dsZVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cInNsaWNlLXRvZ2dsZVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiaXNDb2xsYXBzZWQgPyBpMThuLmV4cGFuZEZpbHRlclRpdGxlIDogaTE4bi5jb2xsYXBzZUZpbHRlclRpdGxlXCJcbiAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVBhbmVsKClcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJzbGljZS10b2dnbGUtbWF0LWljb25cIj57eyBpc0NvbGxhcHNlZCA/ICdmaWx0ZXJfbGlzdCcgOiAnZmlsdGVyX2xpc3Rfb2ZmJyB9fTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJzbGljZS1wYW5lbC1ib2R5XCIgKm5nSWY9XCIhaXNDb2xsYXBzZWRcIiAjc2xpY2VQYW5lbEJvZHk+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzbGljZSBvZiBzbGljZXM7IGxldCBzaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5U2xpY2VJbmRleFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2xpY2UtdGl0bGUtcm93XCIgW2F0dHIuZGF0YS1zbGljZS1pbmRleF09XCJzaVwiIChjbGljayk9XCJ0b2dnbGVTbGljZUNvbGxhcHNlKHNpKVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2xpY2UtdGl0bGUtY2hldnJvblwiIFtjbGFzcy5leHBhbmRlZF09XCIhaXNTbGljZUNvbGxhcHNlZChzaSlcIj7igLo8L3NwYW4+XG4gICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiZ2V0U2xpY2VJY29uKHNsaWNlKVwiIGNsYXNzPVwic2xpY2UtdGl0bGUtaWNvblwiPnt7IGdldFNsaWNlSWNvbihzbGljZSkgfX08L21hdC1pY29uPlxuICAgICAgICAgIDxwIGNsYXNzPVwic2xpY2UtdGl0bGVcIj57eyBzbGljZS50aXRsZSB8fCBpMThuLmZpbHRlckJsb2NrRGVmYXVsdFRpdGxlIH19PC9wPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiaXNTbGljZUR5bmFtaWMoc2kpXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJzbGljZS1yZW1vdmUtYnRuXCJcbiAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHJlbW92ZUR5bmFtaWNTbGljZShzaSlcIlxuICAgICAgICAgID7DlzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwic2xpY2Utc2VjdGlvbi1pdGVtc1wiICpuZ0lmPVwiIWlzU2xpY2VDb2xsYXBzZWQoc2kpXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzU2xpY2VMb2FkaW5nKHNpKTsgZWxzZSBzbGljZUNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbGljZS1sYXp5LWxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYXp5LXNrZWxldG9uXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhenktc2tlbGV0b25cIj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGF6eS1za2VsZXRvblwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2xpY2VDb250ZW50PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2F0ZWdvcnkgb2Ygc2xpY2UuY2F0ZWdvcmllczsgdHJhY2tCeTogdHJhY2tCeUNhdGVnb3J5S2V5XCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAqbmdJZj1cInNsaWNlQ2F0ZWdvcnlDb3VudChzaSwgY2F0ZWdvcnkua2V5KSA+IDBcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2xpY2UtaXRlbVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpc1NsaWNlQ2F0ZWdvcnlBY3RpdmUoc2ksIGNhdGVnb3J5LmtleSlcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtY2F0ZWdvcnkta2V5XT1cImNhdGVnb3J5LmtleVwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cImNhdGVnb3J5LmxhYmVsXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25TbGljZUNhdGVnb3J5U2VsZWN0ZWQoc2ksIGNhdGVnb3J5LmtleSlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgY2F0ZWdvcnkubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaG93Q291bnRzXCI+e3sgc2xpY2VDYXRlZ29yeUNvdW50KHNpLCBjYXRlZ29yeS5rZXkpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzU2xpY2VFbXB0eShzaSlcIiBjbGFzcz1cInNsaWNlLWVtcHR5LXN0YXRlXCI+e3sgaTE4bi5maWx0ZXJFbXB0eVN0YXRlIH19PC9kaXY+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGhyICpuZ0lmPVwic2kgPCBzbGljZXMubGVuZ3RoIC0gMVwiIGNsYXNzPVwic2xpY2UtZGl2aWRlclwiIC8+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9hc2lkZT5cbjwvZGl2PlxuIl19
@@ -711,18 +711,26 @@ class SlicePanelComponent {
711
711
  }
712
712
  getActiveFilters() {
713
713
  const result = {};
714
- this._cachedSlices.forEach((_, idx) => {
714
+ this._cachedSlices.forEach((slice, idx) => {
715
715
  const keys = this.activeKeysBySlice.get(idx);
716
- result[idx] = keys ? [...keys] : [];
716
+ result[this._getPersistentSliceKey(slice, idx)] = keys ? [...keys] : [];
717
717
  });
718
718
  return result;
719
719
  }
720
720
  restoreFilters(filters) {
721
- this.activeKeysBySlice = new Map(Object.entries(filters).map(([idx, keys]) => [Number(idx), new Set(keys)]));
721
+ this.activeKeysBySlice = new Map();
722
+ this._cachedSlices.forEach((slice, index) => {
723
+ // Les préférences historiques utilisaient l'index numérique comme clé.
724
+ const keys = filters[this._getPersistentSliceKey(slice, index)] ?? filters[String(index)];
725
+ if (keys?.length)
726
+ this.activeKeysBySlice.set(index, new Set(keys));
727
+ });
722
728
  this._emitFilter();
723
729
  this._cdr.markForCheck();
724
730
  }
725
731
  addDynamicSlice(column) {
732
+ if (this._dynamicSlices.some(slice => slice.key === column.key))
733
+ return;
726
734
  const distinctValues = this._computeDistinctValues(column.key);
727
735
  const newSlice = {
728
736
  title: column.header,
@@ -788,6 +796,9 @@ class SlicePanelComponent {
788
796
  const dynamicIndex = sliceIndex - this.staticSliceCount;
789
797
  return this._dynamicSlices[dynamicIndex]?.key ?? null;
790
798
  }
799
+ _getPersistentSliceKey(slice, index) {
800
+ return slice.columnKey ? `column:${slice.columnKey}` : `index:${index}`;
801
+ }
791
802
  _getSliceIdentity(slice, fallbackIndex) {
792
803
  if (slice.columnKey)
793
804
  return `column:${slice.columnKey}`;
@@ -1 +1 @@
1
- {"version":3,"file":"oneteme-jquery-organizer.mjs","sources":["../../../../projects/oneteme/jquery-organizer/src/lib/models/organizer-utils.ts","../../../../projects/oneteme/jquery-organizer/src/lib/organizer-button/template-manager.utility.ts","../../../../projects/oneteme/jquery-organizer/src/lib/organizer-button/organizer-button.component.ts","../../../../projects/oneteme/jquery-organizer/src/lib/organizer-button/organizer-button.component.html","../../../../projects/oneteme/jquery-organizer/src/lib/slice-panel/slice-panel.component.ts","../../../../projects/oneteme/jquery-organizer/src/lib/slice-panel/slice-panel.component.html","../../../../projects/oneteme/jquery-organizer/src/lib/organizer-button/organizer-button.module.ts","../../../../projects/oneteme/jquery-organizer/src/lib/models/organizer-menu.model.ts","../../../../projects/oneteme/jquery-organizer/src/lib/models/organizer-chart-config.ts","../../../../projects/oneteme/jquery-organizer/src/lib/models/organizer-chart-adapter.ts","../../../../projects/oneteme/jquery-organizer/src/lib/organizer-facade/organizer-facade.ts","../../../../projects/oneteme/jquery-organizer/src/lib/group-by-manager/group-by-manager.ts","../../../../projects/oneteme/jquery-organizer/src/lib/lazy-field-manager/lazy-field-manager.ts","../../../../projects/oneteme/jquery-organizer/src/oneteme-jquery-organizer.ts"],"sourcesContent":["import { OrganizerConfig, OrganizerState, OrganizerTemplate, OrganizerYField } from './organizer-config.interface';\n\nexport interface OrganizerYIndicator {\n id: string;\n label: string;\n group?: string;\n}\n\nexport function buildYFields(indicators: OrganizerYIndicator[]): OrganizerYField[] {\n const ordered: string[] = [];\n const map = new Map<string, OrganizerYField>();\n\n for (const indicator of indicators) {\n const groupKey = indicator.group;\n if (groupKey) {\n if (!map.has(groupKey)) {\n ordered.push(groupKey);\n map.set(groupKey, { id: groupKey, label: groupKey, aggregates: [] });\n }\n const parent = map.get(groupKey);\n if (parent?.aggregates) {\n parent.aggregates.push({ id: indicator.id, label: indicator.label });\n }\n } else {\n ordered.push(indicator.id);\n map.set(indicator.id, { id: indicator.id, label: indicator.label });\n }\n }\n\n return ordered.map(k => map.get(k)).filter((f): f is OrganizerYField => !!f);\n}\n\nexport function resolveYKey(\n selectedY: string | undefined,\n selectedYAggregate: string | undefined\n): string | undefined {\n return selectedYAggregate ?? selectedY;\n}\n\nexport function normalizeOrganizerState(\n state: OrganizerState | undefined,\n config: Pick<OrganizerConfig, 'xFields' | 'yFields' | 'groups' | 'slices' | 'templates'>\n): OrganizerState {\n const base = state || {};\n const normalizedY = normalizeYSelection(base.selectedY, base.selectedYAggregate, config.yFields);\n const selectedX = hasOption(config.xFields, base.selectedX) ? base.selectedX : undefined;\n const selectedGroupBy = hasOption(config.groups, base.selectedGroupBy) ? base.selectedGroupBy : undefined;\n const selectedSlices = (base.selectedSlices || []).filter(sliceId => hasOption(config.slices, sliceId));\n\n const normalized: OrganizerState = {\n ...base,\n selectedX,\n selectedY: normalizedY.selectedY,\n selectedYAggregate: normalizedY.selectedYAggregate,\n selectedGroupBy,\n selectedSlices,\n };\n\n return {\n ...normalized,\n selectedTemplate: resolveMatchingTemplateId(config.templates, normalized, config)\n };\n}\n\nexport function normalizeTemplateToState(\n template: OrganizerTemplate,\n currentState: OrganizerState | undefined,\n config: Pick<OrganizerConfig, 'xFields' | 'yFields' | 'groups' | 'slices' | 'templates'>\n): OrganizerState {\n const base = normalizeOrganizerState(currentState, config);\n const normalizedY = normalizeYSelection(template.yField, template.yAggregate, config.yFields, base);\n\n const nextState: OrganizerState = {\n viewMode: base.viewMode,\n visibleFields: base.visibleFields,\n selectedX: hasOption(config.xFields, template.xField) ? template.xField : base.selectedX,\n selectedY: normalizedY.selectedY,\n selectedYAggregate: normalizedY.selectedYAggregate,\n selectedGroupBy: hasOption(config.groups, template.groupBy) ? template.groupBy : base.selectedGroupBy,\n selectedSlices: (template.selectedSlices || []).filter(sliceId => hasOption(config.slices, sliceId)),\n };\n\n const resolvedTemplateId = resolveMatchingTemplateId(config.templates, nextState, config);\n return {\n ...nextState,\n selectedTemplate: resolvedTemplateId ?? template.id\n };\n}\n\nexport function resolveMatchingTemplateId(\n templates: OrganizerTemplate[] | undefined,\n state: OrganizerState | undefined,\n config: Pick<OrganizerConfig, 'xFields' | 'yFields' | 'groups' | 'slices' | 'templates'>\n): string | undefined {\n if (!templates?.length) return undefined;\n\n const normalizedState = normalizeStateWithoutTemplate(state, config);\n return templates.find(template => {\n const templateState = normalizeStateWithoutTemplate(\n normalizeTemplateToComparableState(template, normalizedState, config),\n config\n );\n return sameOrganizerState(templateState, normalizedState);\n })?.id;\n}\n\nfunction normalizeStateCore(\n selectedX: string | undefined,\n selectedY: string | undefined,\n selectedYAggregate: string | undefined,\n selectedGroupBy: string | undefined,\n selectedSlices: string[] | undefined,\n config: Pick<OrganizerConfig, 'xFields' | 'yFields' | 'groups' | 'slices'>,\n originalState?: OrganizerState\n): OrganizerState {\n const normalizedY = normalizeYSelection(selectedY, selectedYAggregate, config.yFields, originalState);\n return {\n selectedX: hasOption(config.xFields, selectedX) ? selectedX : undefined,\n selectedY: normalizedY.selectedY,\n selectedYAggregate: normalizedY.selectedYAggregate,\n selectedGroupBy: hasOption(config.groups, selectedGroupBy) ? selectedGroupBy : undefined,\n selectedSlices: (selectedSlices || []).filter(sliceId => hasOption(config.slices, sliceId)),\n };\n}\n\nfunction normalizeTemplateToComparableState(\n template: OrganizerTemplate,\n baseState: OrganizerState,\n config: Pick<OrganizerConfig, 'xFields' | 'yFields' | 'groups' | 'slices' | 'templates'>\n): OrganizerState {\n return normalizeStateCore(\n template.xField,\n template.yField,\n template.yAggregate,\n template.groupBy,\n template.selectedSlices,\n config,\n baseState\n );\n}\n\nfunction normalizeStateWithoutTemplate(\n state: OrganizerState | undefined,\n config: Pick<OrganizerConfig, 'xFields' | 'yFields' | 'groups' | 'slices' | 'templates'>\n): OrganizerState {\n const base = state || {};\n return normalizeStateCore(\n base.selectedX,\n base.selectedY,\n base.selectedYAggregate,\n base.selectedGroupBy,\n base.selectedSlices,\n config,\n base\n );\n}\n\nfunction normalizeYSelection(\n selectedY: string | undefined,\n selectedYAggregate: string | undefined,\n yFields: OrganizerYField[] | undefined,\n fallbackState?: OrganizerState\n): Pick<OrganizerState, 'selectedY' | 'selectedYAggregate'> {\n if (!selectedY) {\n return {\n selectedY: fallbackState?.selectedY,\n selectedYAggregate: fallbackState?.selectedYAggregate,\n };\n }\n\n const directField = yFields?.find(field => field.id === selectedY);\n if (directField) {\n if (!directField.aggregates?.length) {\n return { selectedY: directField.id, selectedYAggregate: undefined };\n }\n\n const matchedAggregate = selectedYAggregate\n ? directField.aggregates.find(aggregate => aggregate.id === selectedYAggregate)\n : undefined;\n const fallbackAggregate = fallbackState?.selectedY === directField.id\n ? directField.aggregates.find(aggregate => aggregate.id === fallbackState.selectedYAggregate)\n : undefined;\n const resolvedAggregate = matchedAggregate ?? fallbackAggregate ?? directField.aggregates[0];\n\n return {\n selectedY: directField.id,\n selectedYAggregate: resolvedAggregate?.id,\n };\n }\n\n const aggregateParent = yFields?.find(field => field.aggregates?.some(aggregate => aggregate.id === selectedY));\n if (aggregateParent) {\n return {\n selectedY: aggregateParent.id,\n selectedYAggregate: selectedY,\n };\n }\n\n return {\n selectedY: fallbackState?.selectedY,\n selectedYAggregate: fallbackState?.selectedYAggregate,\n };\n}\n\nfunction sameOrganizerState(left: OrganizerState, right: OrganizerState): boolean {\n return left.selectedX === right.selectedX\n && left.selectedY === right.selectedY\n && left.selectedYAggregate === right.selectedYAggregate\n && left.selectedGroupBy === right.selectedGroupBy\n && sameSlices(left.selectedSlices || [], right.selectedSlices || []);\n}\n\nfunction sameSlices(left: string[], right: string[]): boolean {\n if (left.length !== right.length) return false;\n const sortedLeft = [...left].sort((a, b) => a.localeCompare(b));\n const sortedRight = [...right].sort((a, b) => a.localeCompare(b));\n return sortedLeft.every((value, index) => value === sortedRight[index]);\n}\n\nfunction hasOption(items: Array<{ id: string }> | undefined, id: string | undefined): boolean {\n return !!id && !!items?.some(item => item.id === id);\n}\n","import { OrganizerConfig, OrganizerTemplate, OrganizerState } from '../models';\nimport { normalizeTemplateToState } from '../models/organizer-utils';\n\nexport class TemplateManager {\n static applyTemplate(\n template: OrganizerTemplate,\n currentState: OrganizerState | undefined,\n config: Pick<OrganizerConfig, 'xFields' | 'yFields' | 'groups' | 'slices' | 'templates'>\n ): OrganizerState {\n return normalizeTemplateToState(template, currentState, config);\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, ChangeDetectionStrategy, ChangeDetectorRef, OnDestroy, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule, MatMenuTrigger } from '@angular/material/menu';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { Subject, isObservable } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\nimport { OrganizerConfig, OrganizerButtonEvent, OrganizerSliceState, OrganizerState } from '../models';\nimport { normalizeOrganizerState, resolveMatchingTemplateId } from '../models/organizer-utils';\nimport { TemplateManager } from './template-manager.utility';\n\n@Component({\n standalone: true,\n imports: [ CommonModule, MatButtonModule, MatIconModule, MatMenuModule, MatDividerModule ],\n selector: 'organizer-button',\n templateUrl: './organizer-button.component.html',\n styleUrls: ['./organizer-button.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class OrganizerButtonComponent implements OnInit, OnDestroy {\n @Input() config!: OrganizerConfig;\n @Input() state?: OrganizerState;\n @Input() hideMenuValues = false;\n @Output() viewChange = new EventEmitter<OrganizerButtonEvent>();\n @Output() sliceStateChange = new EventEmitter<OrganizerSliceState | null>();\n\n loadingFieldId?: string;\n\n private fieldDataCache = new Map<string, any[]>();\n private destroy$ = new Subject<void>();\n\n @ViewChild('mainMenuTrigger') mainMenuTrigger?: MatMenuTrigger;\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n ngOnInit(): void {\n console.debug('[OrganizerButton] Initialized', {\n configFields: this.config?.fields?.length ?? 0,\n hasState: !!this.state,\n hideMenuValues: this.hideMenuValues\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n isFieldVisible(fieldId: string): boolean {\n const visible = this.state?.visibleFields;\n if (!visible) {\n return this.config.fields?.find(f => f.id === fieldId)?.visible !== false;\n }\n return visible.includes(fieldId);\n }\n\n fieldsSummary(): string {\n const total = this.config.fields?.length ?? 0;\n const visible = this.state?.visibleFields?.length ?? total;\n return `${visible}/${total}`;\n }\n\n onFieldToggle(fieldId: string, visible: boolean): void {\n console.debug('[OrganizerButton] Field toggled', { fieldId, visible });\n const visibleFields = this.state?.visibleFields || [];\n const updated = visible\n ? [...visibleFields, fieldId]\n : visibleFields.filter(f => f !== fieldId);\n this.emitChange('fieldToggled', { visibleFields: updated });\n }\n\n onXFieldSelect(fieldId: string): void {\n console.debug('[OrganizerButton] X field selected', { fieldId, current: this.state?.selectedX });\n // Évite une requête inutile si le X est déjà sélectionné\n if (this.state?.selectedX === fieldId) {\n console.debug('[OrganizerButton] X field already selected, skipping emit');\n return;\n }\n this.emitChange('xSelected', { selectedX: fieldId });\n }\n\n onYFieldSelect(fieldId: string): void {\n console.debug('[OrganizerButton] Y field selected', { fieldId, current: this.state?.selectedY });\n // Évite une requête inutile si le Y est déjà sélectionné\n if (this.state?.selectedY === fieldId) {\n console.debug('[OrganizerButton] Y field already selected, skipping emit');\n return;\n }\n this.emitChange('ySelected', {\n selectedY: fieldId,\n selectedYAggregate: undefined\n });\n }\n\n onYAggregateSelect(yFieldId: string, aggregateId: string): void {\n console.debug('[OrganizerButton] Y aggregate selected', { yFieldId, aggregateId, current: this.state?.selectedYAggregate });\n // Évite une requête inutile si l'aggregate est déjà sélectionné\n if (this.state?.selectedYAggregate === aggregateId && this.state?.selectedY === yFieldId) {\n console.debug('[OrganizerButton] Y aggregate already selected, skipping emit');\n return;\n }\n this.emitChange('ySelected', {\n selectedY: yFieldId,\n selectedYAggregate: aggregateId\n });\n }\n\n onGroupBySelect(groupId: string): void {\n console.debug('[OrganizerButton] Group by selected', { groupId });\n const current = this.state.selectedGroupBy;\n this.emitChange('groupBySelected', { selectedGroupBy: current === groupId ? undefined : groupId });\n }\n\n onTemplateSelect(templateId: string): void {\n console.debug('[OrganizerButton] Template selected', { templateId });\n if (!this.config.templates?.length) return;\n\n const template = this.config.templates?.find(t => t.id === templateId);\n if (!template) return;\n\n const newState = TemplateManager.applyTemplate(template, this.state, this.config);\n this.emitChange('templateSelected', newState);\n this.syncSliceState(newState.selectedSlices);\n }\n\n onSliceClick(sliceId?: string): void {\n console.debug('[OrganizerButton] Slice clicked', { sliceId });\n if (this.config.onSliceClick) {\n this.config.onSliceClick();\n }\n\n const selectedSlices = this.state?.selectedSlices || [];\n let updated: string[];\n if (sliceId) {\n updated = selectedSlices.includes(sliceId)\n ? selectedSlices.filter(id => id !== sliceId)\n : [...selectedSlices, sliceId];\n } else {\n updated = selectedSlices;\n }\n\n if (updated.length === 0 || !sliceId || !this.config.onFetchSliceData) {\n this.sliceStateChange.emit(null);\n this.emitChange('sliceSelected', { selectedSlices: updated });\n return;\n }\n\n this.syncSliceState(updated, () => {\n this.emitChange('sliceSelected', { selectedSlices: updated });\n });\n }\n\n private syncSliceState(selectedSlices: string[] | undefined, onLoaded?: () => void): void {\n const sliceId = selectedSlices?.[0];\n if (!sliceId || !this.config.onFetchSliceData) {\n this.sliceStateChange.emit(null);\n onLoaded?.();\n return;\n }\n\n const slice = this.config.slices?.find(s => s.id === sliceId);\n if (!slice) {\n this.sliceStateChange.emit(null);\n onLoaded?.();\n return;\n }\n\n const result = this.config.onFetchSliceData(sliceId);\n const handleData = (tasks: any[]) => {\n this.sliceStateChange.emit({\n sliceConfigs: [{ title: slice.label ?? sliceId, columnKey: sliceId }],\n tasks,\n filterApplied: false // Panel vient d'être ouvert, pas de filtre sélectionné encore\n });\n onLoaded?.();\n };\n\n if (isObservable(result)) {\n result.pipe(takeUntil(this.destroy$)).subscribe({ next: handleData });\n } else {\n result.then(handleData);\n }\n }\n\n async loadFieldData(fieldId: string): Promise<void> {\n if (this.fieldDataCache.has(fieldId)) return;\n if (!this.config.onFetchFieldData) return;\n\n const field = this.config.fields?.find(f => f.id === fieldId);\n if (!field) return;\n\n this.loadingFieldId = fieldId;\n this.cdr.markForCheck();\n\n try {\n const data = await this.config.onFetchFieldData(fieldId);\n this.fieldDataCache.set(fieldId, data);\n } finally {\n this.loadingFieldId = undefined;\n this.cdr.markForCheck();\n }\n }\n\n onExport(): void {\n if (this.config.onExport) this.config.onExport();\n this.mainMenuTrigger?.closeMenu();\n }\n\n onExportVisual(): void {\n if (this.config.onExportVisual) this.config.onExportVisual();\n this.mainMenuTrigger?.closeMenu();\n }\n\n onExportData(): void {\n if (this.config.onExportData) this.config.onExportData();\n this.mainMenuTrigger?.closeMenu();\n }\n\n hasExportSubMenu(): boolean {\n return !!(this.config.onExportVisual || this.config.onExportData);\n }\n\n isCopyActionVisible(): boolean {\n return !!this.config.onCopyVisual && this.config.actions?.showCopy !== false;\n }\n\n isFullscreenActionVisible(): boolean {\n return !!this.config.onToggleFullscreen && this.config.actions?.showFullscreen !== false;\n }\n\n hasActions(): boolean {\n return this.config.showActions === true && (this.isCopyActionVisible() || this.isFullscreenActionVisible());\n }\n\n hasMenuItemsBeforeActions(): boolean {\n return this.hasChartFields()\n || this.hasTableFields()\n || (this.config.groups?.length ?? 0) > 0\n || (this.config.slices?.length ?? 0) > 0\n || (this.config.templates?.length ?? 0) > 0;\n }\n\n hasOtherMenuItems(): boolean {\n return this.hasMenuItemsBeforeActions()\n || !!this.config.showExport\n || !!this.config.showPreferences\n || this.hasSwitchView();\n }\n\n actionsLabel(): string {\n if (this.config.actions?.label) return this.config.actions.label;\n return this.isCopyActionVisible() && this.isFullscreenActionVisible() ? 'Actions' : 'Action';\n }\n\n onCopyVisual(): void {\n this.config.onCopyVisual?.();\n this.mainMenuTrigger?.closeMenu();\n }\n\n onToggleFullscreen(): void {\n this.config.onToggleFullscreen?.();\n this.mainMenuTrigger?.closeMenu();\n }\n\n hasSwitchView(): boolean {\n return !!this.config.switchView;\n }\n\n onSwitchView(): void {\n const sv = this.config.switchView;\n if (!sv) return;\n const newView: 'chart' | 'table' = sv.currentView === 'chart' ? 'table' : 'chart';\n sv.onSwitch(newView);\n this.emitChange('viewSwitched', { viewMode: newView });\n this.mainMenuTrigger?.closeMenu();\n }\n\n onPreferencesEdit(): void {\n if (this.config.onPreferencesEdit) this.config.onPreferencesEdit();\n this.mainMenuTrigger?.closeMenu();\n }\n\n onPreferencesSave(): void {\n if (this.config.onPreferencesSave) this.config.onPreferencesSave();\n this.mainMenuTrigger?.closeMenu();\n }\n\n onPreferencesClear(): void {\n if (this.config.onPreferencesClear) this.config.onPreferencesClear();\n this.mainMenuTrigger?.closeMenu();\n }\n\n onReset(): void {\n this.emitChange('reset', {\n visibleFields: [],\n selectedX: undefined,\n selectedY: undefined,\n selectedYAggregate: undefined,\n selectedGroupBy: undefined,\n selectedSlices: []\n });\n }\n\n activeXLabel(): string {\n const id = this.state?.selectedX;\n if (!id) return '';\n return this.config.xFields?.find(f => f.id === id)?.label ?? id;\n }\n\n activeYLabel(): string {\n const yId = this.state?.selectedY;\n if (!yId) return '';\n const yField = this.config.yFields?.find(f => f.id === yId);\n const base = yField?.label ?? yId;\n\n if (this.state?.selectedYAggregate) {\n const agg = yField?.aggregates?.find(a => a.id === this.state!.selectedYAggregate);\n return agg ? `${base} · ${agg.label}` : base;\n }\n return base;\n }\n\n activeGroupByLabel(): string {\n const id = this.state?.selectedGroupBy;\n if (!id) return '';\n return this.config.groups?.find(g => g.id === id)?.label ?? id;\n }\n\n activeSlicesLabel(): string {\n const ids = this.state?.selectedSlices;\n if (!ids?.length) return '';\n if (ids.length === 1) {\n return this.config.slices?.find(s => s.id === ids[0])?.label ?? ids[0];\n }\n return `${ids.length} sélectionnés`;\n }\n\n activeTemplateLabel(): string {\n const id = this.state?.selectedTemplate;\n if (!id) return '';\n return this.config.templates?.find(t => t.id === id)?.label ?? id;\n }\n\n hasChartFields(): boolean {\n return (this.config.xFields?.length ?? 0) > 0 || (this.config.yFields?.length ?? 0) > 0;\n }\n\n hasTableFields(): boolean {\n return (this.config.fields?.length ?? 0) > 0;\n }\n\n isYActive(yFieldId: string): boolean {\n return this.state?.selectedY === yFieldId;\n }\n\n isYAggregateActive(yFieldId: string, aggregateId: string): boolean {\n return this.state?.selectedY === yFieldId && this.state?.selectedYAggregate === aggregateId;\n }\n\n private emitChange(type: OrganizerButtonEvent['type'], stateUpdate: Partial<OrganizerState> | OrganizerState): void {\n const isFullState = 'selectedX' in stateUpdate && 'selectedTemplate' in stateUpdate;\n const rawState = isFullState ? (stateUpdate as OrganizerState) : { ...this.state, ...stateUpdate };\n const normalizedState = normalizeOrganizerState(rawState, this.config);\n const event: OrganizerButtonEvent = {\n type,\n state: {\n ...normalizedState,\n selectedTemplate: resolveMatchingTemplateId(this.config.templates, normalizedState, this.config)\n },\n source: 'user'\n };\n this.viewChange.emit(event);\n }\n}\n","<button type=\"button\" class=\"organizer-btn\" [matMenuTriggerFor]=\"viewMenu\" #mainMenuTrigger=\"matMenuTrigger\" [attr.aria-label]=\"'View'\">\n <mat-icon class=\"organizer-btn-icon\">{{ config.buttonIcon || 'settings' }}</mat-icon>\n</button>\n\n<mat-menu #viewMenu=\"matMenu\" panelClass=\"organizer-menu-panel\">\n\n <!-- Champs : mode chart (X + Y) -->\n <button *ngIf=\"hasChartFields()\" mat-menu-item [matMenuTriggerFor]=\"champsSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Champs</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && (activeXLabel() || activeYLabel())\">\n {{ activeXLabel() }}<ng-container *ngIf=\"activeXLabel() && activeYLabel()\"> / </ng-container>{{ activeYLabel() }}\n </span>\n </button>\n\n <!-- Champs : mode table (toggle colonnes) -->\n <button *ngIf=\"hasTableFields()\" mat-menu-item [matMenuTriggerFor]=\"fieldsSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Champs</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues\">{{ fieldsSummary() }}</span>\n </button>\n\n <!-- Grouper par -->\n <button *ngIf=\"config.groups?.length\" mat-menu-item [matMenuTriggerFor]=\"groupsSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Grouper par</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && activeGroupByLabel()\">{{ activeGroupByLabel() }}</span>\n </button>\n\n <!-- Filtrer par -->\n <button *ngIf=\"config.slices?.length\" mat-menu-item [matMenuTriggerFor]=\"slicesSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Filtrer par</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && activeSlicesLabel()\">{{ activeSlicesLabel() }}</span>\n </button>\n\n <!-- Template -->\n <button *ngIf=\"config.templates?.length\" mat-menu-item [matMenuTriggerFor]=\"templateSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Template</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && activeTemplateLabel()\">{{ activeTemplateLabel() }}</span>\n </button>\n\n <!-- Actions du visuel courant -->\n <mat-divider *ngIf=\"hasActions() && hasMenuItemsBeforeActions()\" class=\"organizer-divider\"></mat-divider>\n <button *ngIf=\"hasActions() && hasOtherMenuItems()\" mat-menu-item [matMenuTriggerFor]=\"actionsSubMenu\" class=\"organizer-menu-trigger\">\n <mat-icon *ngIf=\"config.actions?.icon\" class=\"organizer-menu-export-icon\">{{ config.actions?.icon }}</mat-icon>\n <span class=\"organizer-menu-label\">{{ actionsLabel() }}</span>\n </button>\n\n <!-- Actions directes lorsqu'il n'y a aucun autre item principal -->\n <ng-container *ngIf=\"hasActions() && !hasOtherMenuItems()\">\n <button *ngIf=\"isCopyActionVisible()\" mat-menu-item type=\"button\" (click)=\"onCopyVisual()\">\n <mat-icon class=\"organizer-menu-export-icon\">content_copy</mat-icon>\n <span class=\"organizer-menu-label\">Copier</span>\n </button>\n <button *ngIf=\"isFullscreenActionVisible()\" mat-menu-item type=\"button\" (click)=\"onToggleFullscreen()\">\n <mat-icon class=\"organizer-menu-export-icon\">{{ config.isFullscreen ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>\n <span class=\"organizer-menu-label\">{{ config.isFullscreen ? 'Quitter le plein écran' : 'Plein écran' }}</span>\n </button>\n </ng-container>\n\n <!-- Export direct (mode table) -->\n <mat-divider *ngIf=\"config.showExport\" class=\"organizer-divider\"></mat-divider>\n <button *ngIf=\"config.showExport && !hasExportSubMenu()\" mat-menu-item type=\"button\" class=\"organizer-menu-export\" (click)=\"onExport()\">\n <mat-icon class=\"organizer-menu-export-icon\">download</mat-icon>\n <span class=\"organizer-menu-label\">Exporter</span>\n </button>\n\n <!-- Export graphique (mode chart) — ouvre un sous-menu -->\n <button *ngIf=\"config.showExport && hasExportSubMenu()\" mat-menu-item [matMenuTriggerFor]=\"exportSubMenu\" class=\"organizer-menu-trigger organizer-menu-export\">\n <mat-icon class=\"organizer-menu-export-icon\">download</mat-icon>\n <span class=\"organizer-menu-label\">Exporter</span>\n </button>\n\n <!-- Préférences -->\n <mat-divider *ngIf=\"config.showPreferences\" class=\"organizer-divider\"></mat-divider>\n <button *ngIf=\"config.showPreferences\" mat-menu-item [matMenuTriggerFor]=\"preferencesSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Préférences</span>\n </button>\n\n <!-- Switch chart / table -->\n <mat-divider *ngIf=\"hasSwitchView()\" class=\"organizer-divider\"></mat-divider>\n <button *ngIf=\"hasSwitchView()\" mat-menu-item type=\"button\" class=\"organizer-menu-trigger\" (click)=\"onSwitchView()\">\n <mat-icon class=\"organizer-menu-export-icon\">{{ config.switchView?.currentView === 'chart' ? 'table_chart' : 'bar_chart' }}</mat-icon>\n <span class=\"organizer-menu-label\">{{ config.switchView?.currentView === 'chart' ? 'Tableau' : 'Graphique' }}</span>\n </button>\n\n</mat-menu>\n\n<!-- Sous-menu : actions du visuel -->\n<mat-menu #actionsSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button *ngIf=\"isCopyActionVisible()\" type=\"button\" class=\"organizer-submenu-item\"\n (mousedown)=\"onCopyVisual()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">content_copy</mat-icon>\n Copier\n </button>\n <button *ngIf=\"isFullscreenActionVisible()\" type=\"button\" class=\"organizer-submenu-item\"\n (mousedown)=\"onToggleFullscreen()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">{{ config.isFullscreen ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>\n {{ config.isFullscreen ? 'Quitter le plein écran' : 'Plein écran' }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Export graphique -->\n<mat-menu #exportSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button *ngIf=\"config.onExportVisual\" type=\"button\" class=\"organizer-submenu-item\"\n (mousedown)=\"onExportVisual()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">image</mat-icon>\n Visuel\n </button>\n <button *ngIf=\"config.onExportData\" type=\"button\" class=\"organizer-submenu-item\"\n (mousedown)=\"onExportData()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">table_chart</mat-icon>\n Données\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Champs chart (X + Y) -->\n<mat-menu #champsSubMenu=\"matMenu\" panelClass=\"organizer-champs-panel\">\n <div class=\"organizer-champs-wrapper\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n\n <!-- Bloc X -->\n <div class=\"organizer-champs-block\" *ngIf=\"config.xFields?.length\">\n <span class=\"organizer-champs-block-title\">Axe horizontal — X</span>\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let xField of config.xFields\"\n [class.active]=\"state?.selectedX === xField.id\"\n [disabled]=\"xField.disabled\"\n (mousedown)=\"onXFieldSelect(xField.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedX === xField.id ? '✓' : '' }}</span>\n {{ xField.label }}\n </button>\n </div>\n\n <mat-divider *ngIf=\"config.xFields?.length && config.yFields?.length\" class=\"organizer-champs-divider\"></mat-divider>\n\n <!-- Bloc Y -->\n <div class=\"organizer-champs-block\" *ngIf=\"config.yFields?.length\">\n <span class=\"organizer-champs-block-title\">Axe vertical — Y</span>\n <ng-container *ngFor=\"let yField of config.yFields\">\n\n <!-- Y simple (Count sans agrégat ni stack) -->\n <!-- Y simple (Count ou métrique directe) -->\n <button *ngIf=\"!yField.aggregates?.length\"\n type=\"button\" class=\"organizer-submenu-item\"\n [class.active]=\"isYActive(yField.id)\"\n [disabled]=\"yField.disabled\"\n (mousedown)=\"onYFieldSelect(yField.id)\">\n <span class=\"organizer-submenu-check\">{{ isYActive(yField.id) ? '✓' : '' }}</span>\n {{ yField.label }}\n </button>\n\n <!-- Y avec agrégats → sous-menu -->\n <button *ngIf=\"yField.aggregates?.length\"\n type=\"button\" class=\"organizer-submenu-item organizer-submenu-item--has-children\"\n [class.active]=\"isYActive(yField.id)\"\n [disabled]=\"yField.disabled\"\n [matMenuTriggerFor]=\"yAggSubMenu\"\n [matMenuTriggerData]=\"{ yField: yField }\"\n (mousedown)=\"$event.stopPropagation()\">\n <span class=\"organizer-submenu-check\">{{ isYActive(yField.id) ? '✓' : '' }}</span>\n {{ yField.label }}\n <mat-icon class=\"organizer-submenu-arrow\">chevron_right</mat-icon>\n </button>\n\n </ng-container>\n </div>\n\n </div>\n</mat-menu>\n\n<!-- Sous-menu dynamique : agrégats d'un champ Y -->\n<mat-menu #yAggSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <ng-template matMenuContent let-yField=\"yField\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let agg of yField.aggregates\"\n [class.active]=\"isYAggregateActive(yField.id, agg.id)\"\n (mousedown)=\"onYAggregateSelect(yField.id, agg.id)\">\n <span class=\"organizer-submenu-check\">{{ isYAggregateActive(yField.id, agg.id) ? '✓' : '' }}</span>\n {{ agg.label }}\n </button>\n </div>\n </ng-template>\n</mat-menu>\n\n<!-- Sous-menu : Champs table (toggle colonnes) -->\n<mat-menu #fieldsSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let field of config.fields\"\n [class.active]=\"isFieldVisible(field.id)\"\n (mousedown)=\"onFieldToggle(field.id, !isFieldVisible(field.id))\">\n <span class=\"organizer-submenu-check\">{{ isFieldVisible(field.id) ? '✓' : '' }}</span> <mat-icon *ngIf=\"field.icon\" class=\"organizer-submenu-icon\">{{ field.icon }}</mat-icon> {{ field.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Grouper par -->\n<mat-menu #groupsSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let group of config.groups\"\n [class.active]=\"state?.selectedGroupBy === group.id\"\n (mousedown)=\"onGroupBySelect(group.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedGroupBy === group.id ? '✓' : '' }}</span> <mat-icon *ngIf=\"group.icon\" class=\"organizer-submenu-icon\">{{ group.icon }}</mat-icon> {{ group.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Filtrer par -->\n<mat-menu #slicesSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let slice of config.slices\"\n [class.active]=\"state?.selectedSlices?.includes(slice.id)\"\n (mousedown)=\"onSliceClick(slice.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedSlices?.includes(slice.id) ? '✓' : '' }}</span> <mat-icon *ngIf=\"slice.icon\" class=\"organizer-submenu-icon\">{{ slice.icon }}</mat-icon> {{ slice.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Template -->\n<mat-menu #templateSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let tmpl of config.templates\"\n [class.active]=\"state?.selectedTemplate === tmpl.id\"\n [title]=\"tmpl.description || ''\"\n (mousedown)=\"onTemplateSelect(tmpl.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedTemplate === tmpl.id ? '✓' : '' }}</span>\n <mat-icon *ngIf=\"tmpl.icon\" class=\"organizer-submenu-icon\">{{ tmpl.icon }}</mat-icon>\n {{ tmpl.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Préférences -->\n<mat-menu #preferencesSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\" (mousedown)=\"onPreferencesEdit()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">edit</mat-icon>Éditer\n </button>\n <button type=\"button\" class=\"organizer-submenu-item\" (mousedown)=\"onPreferencesSave()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">save</mat-icon>Sauvegarder\n </button>\n <button type=\"button\" class=\"organizer-submenu-item\" [disabled]=\"!config.hasSavedPreferences\" (mousedown)=\"onPreferencesClear()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">delete_outline</mat-icon>Réinitialiser\n </button>\n </div>\n</mat-menu>\n\n","import { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, HostBinding, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild, inject } from '@angular/core';\nimport { SliceColumnDef, SliceConfig } from './slice-panel.model';\n\nconst EMPTY_CATEGORY_KEY = '__empty__';\nconst EMPTY_CATEGORY_LABEL = 'Vide';\n\nconst I18N = {\n expandFilterTitle: 'Déplier le filtre',\n collapseFilterTitle: 'Replier le filtre',\n filterPanelTitle: (count: number) => count > 1 ? 'Filtres' : 'Filtre',\n filterBlockDefaultTitle: 'Filtrer',\n filterEmptyState: 'Aucune donnée',\n};\n\n@Component({\n standalone: true,\n selector: 'slice-panel',\n imports: [CommonModule, MatIconModule],\n templateUrl: './slice-panel.component.html',\n styleUrls: ['./slice-panel.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SlicePanelComponent<T = any> implements OnChanges, OnInit {\n\n @Input() sliceConfigs: SliceConfig<T>[] = [];\n @Input() columns: SliceColumnDef<T>[] = [];\n @Input() data: T[] = [];\n @Input() lazyData: Map<string, Map<any, any>> = new Map();\n @Input() lazyStatus: Map<string, 'idle' | 'loading' | 'loaded' | 'error'> = new Map();\n @Input() showToggle = true;\n @Input() showCounts = true;\n @Input() collapsedByDefault = false;\n @Input() alwaysShow = false;\n\n @Output() filterChange = new EventEmitter<(row: T) => boolean>();\n @Output() activeKeysChange = new EventEmitter<string[][]>();\n @Output() dynamicSliceKeysChange = new EventEmitter<string[]>();\n @Output() collapsedChange = new EventEmitter<boolean>();\n\n @ViewChild('slicePanelBody') slicePanelBodyRef?: ElementRef<HTMLElement>;\n\n private _cdr = inject(ChangeDetectorRef);\n\n readonly i18n = I18N;\n\n isCollapsed = false;\n\n @HostBinding('class.collapsed') get hostCollapsed(): boolean { return this.isCollapsed; }\n activeKeysBySlice: Map<number, Set<string>> = new Map();\n private _expandedSlices = new Set<number>();\n _dynamicSlices: Array<{ key: string; slice: SliceConfig<T> }> = [];\n\n _cachedSlices: SliceConfig<T>[] = [];\n private _countCache = new Map<string, number>();\n\n readonly trackBySliceIndex = (index: number, _: any): number => index;\n readonly trackByCategoryKey = (_: number, cat: any): string => cat.key;\n\n ngOnInit(): void {\n this.isCollapsed = this.collapsedByDefault;\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['sliceConfigs'] || changes['data'] || changes['columns'] || changes['lazyData'] || changes['lazyStatus']) {\n this._refreshDynamicSlices();\n this._rebuildCache();\n const shouldReemitFilter = !!(changes['data'] || changes['columns'] || changes['lazyData'] || changes['lazyStatus']);\n const hasActiveFilters = [...this.activeKeysBySlice.values()].some(s => s.size > 0);\n if (hasActiveFilters && shouldReemitFilter) {\n this._emitFilter();\n }\n this._cdr.markForCheck();\n }\n }\n\n get showPanel(): boolean {\n const hasCfg = (this.sliceConfigs || []).length > 0 || this._dynamicSlices.length > 0;\n if (this.alwaysShow) return hasCfg;\n return hasCfg && (this.data?.length ?? 0) > 0;\n }\n\n get slices(): SliceConfig<T>[] {\n return this._cachedSlices;\n }\n\n get staticSliceCount(): number {\n return (this.sliceConfigs || []).length;\n }\n\n get staticSlicesForMenu(): Array<{ key: string; title: string }> {\n return (this.sliceConfigs || [])\n .filter((s) => !!s.columnKey)\n .map((s) => ({ key: s.columnKey!, title: s.title || s.columnKey! }));\n }\n\n get activeDynamicSliceColumns(): SliceColumnDef<T>[] {\n return this._dynamicSlices\n .map((d) => (this.columns || []).find((c) => c.key === d.key))\n .filter((c): c is SliceColumnDef<T> => !!c);\n }\n\n get availableColumnsForDynamicSlice(): SliceColumnDef<T>[] {\n const dynamicKeys = new Set(this._dynamicSlices.map((d) => d.key));\n const staticKeys = new Set(\n (this.sliceConfigs || []).map((s) => s.columnKey).filter((k): k is string => !!k)\n );\n const existingKeys = new Set([...dynamicKeys, ...staticKeys]);\n const seen = new Set<string>();\n return (this.columns || []).filter((c) => {\n if (existingKeys.has(c.key) || seen.has(c.key)) return false;\n seen.add(c.key);\n return true;\n });\n }\n\n isSliceCollapsed(sliceIndex: number): boolean {\n if (this._cachedSlices.length === 1) {\n return this._expandedSlices.has(-1 - sliceIndex);\n }\n return !this._expandedSlices.has(sliceIndex);\n }\n\n toggleSliceCollapse(sliceIndex: number): void {\n if (this.slices.length === 1) {\n const closedKey = -1 - sliceIndex;\n if (this._expandedSlices.has(closedKey)) {\n this._expandedSlices.delete(closedKey);\n } else {\n this._expandedSlices.add(closedKey);\n this._scrollSliceTitleIntoView(sliceIndex);\n }\n } else {\n if (this._expandedSlices.has(sliceIndex)) {\n this._expandedSlices.delete(sliceIndex);\n } else {\n this._expandedSlices.clear();\n this._expandedSlices.add(sliceIndex);\n this._scrollSliceTitleIntoView(sliceIndex);\n }\n }\n this._cdr.markForCheck();\n }\n\n togglePanel(): void {\n this.isCollapsed = !this.isCollapsed;\n this.collapsedChange.emit(this.isCollapsed);\n this._cdr.markForCheck();\n }\n\n isSliceDynamic(sliceIndex: number): boolean {\n return sliceIndex >= this.staticSliceCount;\n }\n\n isSliceLoading(sliceIndex: number): boolean {\n const staticSlice = (this.sliceConfigs || [])[sliceIndex];\n if (staticSlice?.columnKey) {\n const colDef = (this.columns || []).find(c => c.key === staticSlice.columnKey);\n if (colDef?.lazy) {\n const status = this.lazyStatus.get(staticSlice.columnKey!) ?? 'idle';\n return status === 'loading' || status === 'idle';\n }\n return false;\n }\n const key = this._getDynamicSliceColumnKey(sliceIndex);\n if (!key) return false;\n const colDef = (this.columns || []).find(c => c.key === key);\n if (!colDef?.lazy) return false;\n const status = this.lazyStatus.get(key) ?? 'idle';\n return status === 'loading' || status === 'idle';\n }\n\n isStaticSliceVisible(_columnKey: string): boolean {\n return true;\n }\n\n getSliceIcon(slice: SliceConfig<T>): string | undefined {\n if (slice.icon) return slice.icon;\n if (slice.columnKey) {\n return (this.columns || []).find(c => c.key === slice.columnKey)?.icon;\n }\n return undefined;\n }\n\n isSliceCategoryActive(sliceIndex: number, categoryKey: string): boolean {\n return this.activeKeysBySlice.get(sliceIndex)?.has(categoryKey) ?? false;\n }\n\n isSliceAllActive(sliceIndex: number): boolean {\n return !this.activeKeysBySlice.has(sliceIndex) || this.activeKeysBySlice.get(sliceIndex)!.size === 0;\n }\n\n sliceCategoryCount(sliceIndex: number, categoryKey: string): number {\n const cacheKey = `${sliceIndex}:${categoryKey}`;\n if (this._countCache.has(cacheKey)) {\n return this._countCache.get(cacheKey)!;\n }\n const slice = this._cachedSlices[sliceIndex];\n if (!slice) return 0;\n const category = (slice.categories || []).find((c) => c.key === categoryKey);\n const count = category ? (this.data || []).filter((row) => category.filter ? category.filter(row) : true).length : 0;\n this._countCache.set(cacheKey, count);\n return count;\n }\n\n isSliceEmpty(sliceIndex: number): boolean {\n const slice = this._cachedSlices[sliceIndex];\n if (!slice) return true;\n return (slice.categories || []).every(c => this.sliceCategoryCount(sliceIndex, c.key) === 0);\n }\n\n onSliceCategorySelected(sliceIndex: number, categoryKey: string): void {\n const slice = this.slices[sliceIndex];\n if (!slice) return;\n if (!this.activeKeysBySlice.has(sliceIndex)) {\n this.activeKeysBySlice.set(sliceIndex, new Set());\n }\n const activeKeys = this.activeKeysBySlice.get(sliceIndex)!;\n if (slice.multiSelect === false) {\n if (activeKeys.has(categoryKey)) {\n activeKeys.clear();\n } else {\n activeKeys.clear();\n activeKeys.add(categoryKey);\n }\n } else {\n if (activeKeys.has(categoryKey)) {\n activeKeys.delete(categoryKey);\n } else {\n activeKeys.add(categoryKey);\n }\n }\n this._emitFilter();\n this._cdr.markForCheck();\n }\n\n onSliceAllSelected(sliceIndex: number): void {\n if (this.activeKeysBySlice.has(sliceIndex)) {\n this.activeKeysBySlice.get(sliceIndex)!.clear();\n }\n this._emitFilter();\n this._cdr.markForCheck();\n }\n\n getActiveFilters(): Record<number, string[]> {\n const result: Record<number, string[]> = {};\n this._cachedSlices.forEach((_, idx) => {\n const keys = this.activeKeysBySlice.get(idx);\n result[idx] = keys ? [...keys] : [];\n });\n return result;\n }\n\n restoreFilters(filters: Record<number, string[]>): void {\n this.activeKeysBySlice = new Map(\n Object.entries(filters).map(([idx, keys]) => [Number(idx), new Set(keys)])\n );\n this._emitFilter();\n this._cdr.markForCheck();\n }\n\n addDynamicSlice(column: SliceColumnDef<T>): void {\n const distinctValues = this._computeDistinctValues(column.key);\n const newSlice: SliceConfig<T> = {\n title: column.header,\n columnKey: column.key,\n categories: distinctValues.map((v) => this._buildCategoryFromValue(column.key, v)),\n };\n this._dynamicSlices = [...this._dynamicSlices, { key: column.key, slice: newSlice }];\n this._rebuildCache();\n this.dynamicSliceKeysChange.emit(this._dynamicSlices.map(d => d.key));\n this._emitFilter();\n this._cdr.markForCheck();\n }\n\n removeDynamicSlice(sliceIndex: number): void {\n const dynamicIndex = sliceIndex - this.staticSliceCount;\n if (dynamicIndex < 0) return;\n const newActiveKeys = new Map<number, Set<string>>();\n this.activeKeysBySlice.forEach((keys, idx) => {\n if (idx < sliceIndex) newActiveKeys.set(idx, keys);\n else if (idx > sliceIndex) newActiveKeys.set(idx - 1, keys);\n });\n this.activeKeysBySlice = newActiveKeys;\n this._dynamicSlices = this._dynamicSlices.filter((_, i) => i !== dynamicIndex);\n this._rebuildCache();\n this.dynamicSliceKeysChange.emit(this._dynamicSlices.map(d => d.key));\n this._emitFilter();\n this._cdr.markForCheck();\n }\n\n removeDynamicSliceByKey(key: string): void {\n const dynamicIndex = this._dynamicSlices.findIndex((d) => d.key === key);\n if (dynamicIndex < 0) return;\n const sliceIndex = this.staticSliceCount + dynamicIndex;\n this.removeDynamicSlice(sliceIndex);\n }\n\n private _emitFilter(): void {\n const slices = this.slices;\n const activeKeysBySlice = this.activeKeysBySlice;\n\n this.activeKeysChange.emit(\n slices.map((_, i) => {\n const keys = activeKeysBySlice.get(i);\n return keys ? [...keys] : [];\n })\n );\n\n const pred = (row: T): boolean =>\n slices.every((slice, sliceIndex) => {\n const activeKeys = activeKeysBySlice.get(sliceIndex);\n if (!activeKeys || activeKeys.size === 0) return true;\n if (!slice.categories || slice.categories.length === 0) return true;\n return [...activeKeys].some((key) => {\n const category = (slice.categories || []).find((c) => c.key === key);\n if (!category) return false;\n if (!category?.filter) return true;\n return category.filter(row);\n });\n });\n this.filterChange.emit(pred);\n }\n\n private _getDynamicSliceColumnKey(sliceIndex: number): string | null {\n const dynamicIndex = sliceIndex - this.staticSliceCount;\n return this._dynamicSlices[dynamicIndex]?.key ?? null;\n }\n\n private _getSliceIdentity(slice: SliceConfig<T>, fallbackIndex: number): string {\n if (slice.columnKey) return `column:${slice.columnKey}`;\n if (slice.title) return `title:${slice.title}`;\n const categoryKeys = (slice.categories || []).map((c) => c.key).join('|');\n return `index:${fallbackIndex}|categories:${categoryKeys}`;\n }\n\n private _materializeSlice(slice: SliceConfig<T>): SliceConfig<T> {\n if (!slice.columnKey || (slice.categories && slice.categories.length > 0)) {\n return slice;\n }\n const col = (this.columns || []).find(c => c.key === slice.columnKey);\n const isLazy = !!col?.lazy;\n if (isLazy && this.lazyStatus.get(slice.columnKey!) !== 'loaded') {\n return { ...slice, categories: [] };\n }\n if (slice.bucket) {\n const distinctValues = [...new Set((this.data || []).map(slice.bucket))].sort();\n return {\n ...slice,\n categories: distinctValues.map((v) => ({\n key: v, label: v,\n filter: (row: T) => slice.bucket!(row) === v,\n })),\n };\n }\n const distinctValues = this._computeDistinctValues(slice.columnKey!);\n return {\n ...slice,\n categories: distinctValues.map((v) => this._buildCategoryFromValue(slice.columnKey!, v)),\n };\n }\n\n private _buildCategoryFromValue(columnKey: string, v: string): { key: string; label: string; filter: (row: T) => boolean } {\n if (v === EMPTY_CATEGORY_KEY) {\n return {\n key: EMPTY_CATEGORY_KEY,\n label: EMPTY_CATEGORY_LABEL,\n filter: (row: T) => {\n const val = this._getLazyAwareValue(columnKey, row);\n return val == null || val === '';\n },\n };\n }\n return {\n key: v, label: v,\n filter: (row: T) => String(this._getLazyAwareValue(columnKey, row) ?? '') === v,\n };\n }\n\n private _computeDistinctValues(columnKey: string): string[] {\n const rawValues = (this.data || []).map((row) => {\n const val = this._getLazyAwareValue(columnKey, row);\n return val != null && val !== '' ? String(val) : null;\n });\n const distinct = [...new Set(rawValues.filter((v): v is string => v !== null))].sort();\n if (rawValues.some(v => v === null)) distinct.push(EMPTY_CATEGORY_KEY);\n return distinct;\n }\n\n private _getLazyAwareValue(columnKey: string, row: T): any {\n const colDef = (this.columns || []).find(c => c.key === columnKey);\n if (colDef?.lazy) {\n return this.lazyData.get(columnKey)?.get(row) ?? null;\n }\n if (colDef?.value) {\n return (colDef.value as any)(row, 0);\n }\n return (row as any)[columnKey];\n }\n\n private _rebuildCache(): void {\n const previousSlices = this._cachedSlices;\n const previousActiveKeys = this.activeKeysBySlice;\n const allSlices = [...(this.sliceConfigs || []), ...this._dynamicSlices.map((d) => d.slice)];\n this._cachedSlices = allSlices.map((slice) => this._materializeSlice(slice));\n\n const previousKeysByIdentity = new Map<string, Set<string>>();\n previousSlices.forEach((slice, index) => {\n const activeKeys = previousActiveKeys.get(index);\n if (!activeKeys || activeKeys.size === 0) return;\n previousKeysByIdentity.set(this._getSliceIdentity(slice, index), new Set(activeKeys));\n });\n\n const nextActiveKeys = new Map<number, Set<string>>();\n this._cachedSlices.forEach((slice, index) => {\n const previousKeys = previousKeysByIdentity.get(this._getSliceIdentity(slice, index));\n if (!previousKeys || previousKeys.size === 0) return;\n const availableKeys = new Set((slice.categories || []).map((c) => c.key));\n const matchingKeys = [...previousKeys].filter((key) => availableKeys.has(key));\n if (matchingKeys.length > 0) nextActiveKeys.set(index, new Set(matchingKeys));\n });\n this.activeKeysBySlice = nextActiveKeys;\n this._countCache.clear();\n }\n\n private _refreshDynamicSlices(): void {\n this._dynamicSlices = this._dynamicSlices.map(({ key, slice }) => {\n const distinctValues = this._computeDistinctValues(key);\n return {\n key,\n slice: {\n ...slice,\n categories: distinctValues.map((v) => this._buildCategoryFromValue(key, v)),\n },\n };\n });\n }\n\n private _scrollSliceTitleIntoView(sliceIndex: number): void {\n setTimeout(() => {\n const body = this.slicePanelBodyRef?.nativeElement;\n if (!body) return;\n const el = body.querySelector(`[data-slice-index=\"${sliceIndex}\"]`) as HTMLElement | null;\n el?.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }, 50);\n }\n}\n","<div class=\"slice-panel-wrapper\" [class.collapsed]=\"isCollapsed\">\n <aside class=\"slice-panel\" [class.collapsed]=\"isCollapsed\">\n <div class=\"slice-panel-header\">\n <span *ngIf=\"!isCollapsed\" class=\"slice-panel-title\">\n {{ i18n.filterPanelTitle(slices.length) }}\n </span>\n <button\n *ngIf=\"showToggle\"\n type=\"button\"\n class=\"slice-toggle\"\n [attr.aria-label]=\"isCollapsed ? i18n.expandFilterTitle : i18n.collapseFilterTitle\"\n (click)=\"togglePanel()\"\n >\n <mat-icon class=\"slice-toggle-mat-icon\">{{ isCollapsed ? 'filter_list' : 'filter_list_off' }}</mat-icon>\n </button>\n </div>\n\n <div class=\"slice-panel-body\" *ngIf=\"!isCollapsed\" #slicePanelBody>\n <ng-container *ngFor=\"let slice of slices; let si = index; trackBy: trackBySliceIndex\">\n <div class=\"slice-title-row\" [attr.data-slice-index]=\"si\" (click)=\"toggleSliceCollapse(si)\">\n <span class=\"slice-title-chevron\" [class.expanded]=\"!isSliceCollapsed(si)\">›</span>\n <mat-icon *ngIf=\"getSliceIcon(slice)\" class=\"slice-title-icon\">{{ getSliceIcon(slice) }}</mat-icon>\n <p class=\"slice-title\">{{ slice.title || i18n.filterBlockDefaultTitle }}</p>\n <button\n *ngIf=\"isSliceDynamic(si)\"\n type=\"button\"\n class=\"slice-remove-btn\"\n (click)=\"$event.stopPropagation(); removeDynamicSlice(si)\"\n >×</button>\n </div>\n\n <div class=\"slice-section-items\" *ngIf=\"!isSliceCollapsed(si)\">\n <ng-container *ngIf=\"isSliceLoading(si); else sliceContent\">\n <div class=\"slice-lazy-loading\">\n <span class=\"lazy-skeleton\"></span>\n <span class=\"lazy-skeleton\"></span>\n <span class=\"lazy-skeleton\"></span>\n </div>\n </ng-container>\n <ng-template #sliceContent>\n <ng-container *ngFor=\"let category of slice.categories; trackBy: trackByCategoryKey\">\n <button\n *ngIf=\"sliceCategoryCount(si, category.key) > 0\"\n class=\"slice-item\"\n type=\"button\"\n [class.active]=\"isSliceCategoryActive(si, category.key)\"\n [attr.data-category-key]=\"category.key\"\n [title]=\"category.label\"\n (click)=\"onSliceCategorySelected(si, category.key)\"\n >\n <span>{{ category.label }}</span>\n <span *ngIf=\"showCounts\">{{ sliceCategoryCount(si, category.key) }}</span>\n </button>\n </ng-container>\n <div *ngIf=\"isSliceEmpty(si)\" class=\"slice-empty-state\">{{ i18n.filterEmptyState }}</div>\n </ng-template>\n </div>\n\n <hr *ngIf=\"si < slices.length - 1\" class=\"slice-divider\" />\n </ng-container>\n </div>\n </aside>\n</div>\n","import { NgModule } from '@angular/core';\nimport { OrganizerButtonComponent } from './organizer-button.component';\nimport { SlicePanelComponent } from '../slice-panel/slice-panel.component';\n\n@NgModule({\n imports: [OrganizerButtonComponent, SlicePanelComponent],\n exports: [OrganizerButtonComponent, SlicePanelComponent]\n})\nexport class OrganizerButtonModule {}\n","export type MenuSection = 'fields' | 'champs' | 'groups' | 'slices' | 'templates' | 'custom';\n\nexport const DEFAULT_MENU_LABELS: { [key in MenuSection]: string } = {\n 'fields': 'Champs',\n 'champs': 'Champs',\n 'groups': 'Grouper par',\n 'slices': 'Filtrer par',\n 'templates': 'Template',\n 'custom': 'Options'\n};\n\nexport const DEFAULT_MENU_ICONS: { [key in MenuSection]: string } = {\n 'fields': 'visibility',\n 'champs': 'bar_chart',\n 'groups': 'category',\n 'slices': 'filter_list',\n 'templates': 'dashboard_customize',\n 'custom': 'settings'\n};\n","import { OrganizerChartItem, OrganizerChartSection } from './organizer-chart-adapter';\n\nexport interface OrganizerChartConfig {\n groups?: OrganizerChartSection;\n indicators?: OrganizerChartSection;\n filters?: OrganizerChartSection;\n templates?: any[]; // TODO: typer correctement les templates\n}\n\nexport enum SyntheticItemKeys {\n EMPTY = '__empty__',\n SYNTHETIC_MARKER = '__synthetic__'\n}\n\nexport enum SlicePanelI18nKeys {\n EXPAND_FILTER = 'expandFilterTitle',\n COLLAPSE_FILTER = 'collapseFilterTitle',\n FILTER_PANEL_TITLE_SINGLE = 'filterPanelTitleSingle',\n FILTER_PANEL_TITLE_PLURAL = 'filterPanelTitlePlural',\n FILTER_BLOCK_DEFAULT_TITLE = 'filterBlockDefaultTitle',\n FILTER_EMPTY_STATE = 'filterEmptyState'\n}\n\nexport enum OrganizerButtonEventType {\n FIELD_TOGGLED = 'fieldToggled',\n X_SELECTED = 'xSelected',\n Y_SELECTED = 'ySelected',\n GROUP_BY_SELECTED = 'groupBySelected',\n TEMPLATE_SELECTED = 'templateSelected',\n SLICE_SELECTED = 'sliceSelected',\n VIEW_SWITCHED = 'viewSwitched'\n}\n\nexport function getGroupItems(config: OrganizerChartConfig | null | undefined): OrganizerChartItem[] {\n return config?.groups?.items ?? [];\n}\n\nexport function getIndicatorItems(config: OrganizerChartConfig | null | undefined): OrganizerChartItem[] {\n return config?.indicators?.items ?? [];\n}\n\nexport function getFilterItems(config: OrganizerChartConfig | null | undefined): OrganizerChartItem[] {\n return config?.filters?.items ?? [];\n}\n\nexport function getStackItems(indicator: OrganizerChartItem | undefined): OrganizerChartItem[] {\n return indicator?.extra?.stacks?.items ?? [];\n}\n","import { OrganizerButtonEvent, OrganizerConfig, OrganizerState, OrganizerUnifiedState, OrganizerViewSlice, OrganizerXField } from './organizer-config.interface';\nimport { buildYFields, normalizeOrganizerState, resolveMatchingTemplateId, resolveYKey } from './organizer-utils';\nimport { UnitConfig } from '@oneteme/jquery-core';\nimport { OrganizerChartConfig, getGroupItems, getIndicatorItems, getFilterItems, getStackItems } from './organizer-chart-config';\n\nexport { OrganizerChartConfig, getGroupItems, getIndicatorItems, getFilterItems, getStackItems } from './organizer-chart-config';\n\nexport interface OrganizerChartItem {\n key: string;\n selected: boolean;\n menu: { label: string };\n unit?: string | UnitConfig;\n jquery?: {\n value: (s?: string) => string;\n buildAlias: (s?: string) => string;\n buildName?: (item: any, value?: string) => string;\n buildColor?: (value?: string) => string;\n };\n group?: string;\n extra?: {\n stacks?: { optional: boolean; items: OrganizerChartItem[] };\n [key: string]: any;\n };\n}\n\nexport interface OrganizerChartSection {\n optional: boolean;\n items: OrganizerChartItem[];\n}\n\nexport interface OrganizerChartBridgeOptions {\n onFetchSliceData?: OrganizerConfig['onFetchSliceData'];\n onExportVisual?: () => void;\n onExportData?: () => void;\n switchView?: OrganizerConfig['switchView'];\n}\n\nexport interface OrganizerChartBinding {\n config: OrganizerConfig;\n state: OrganizerState;\n}\n\nexport interface OrganizerChartEventResult {\n binding: OrganizerChartBinding;\n shouldRefetch: boolean;\n}\n\nexport function chartConfigToOrganizer(\n chartConfig: OrganizerChartConfig | null | undefined,\n options: OrganizerChartBridgeOptions = {}\n): OrganizerConfig {\n if (!chartConfig) {\n console.debug('[OrganizerChartAdapter] Empty chart config, returning empty organizer config');\n return {};\n }\n\n console.debug('[OrganizerChartAdapter] Converting chart config to organizer', {\n hasGroups: !!chartConfig.groups,\n indicatorCount: chartConfig.indicators?.items?.length ?? 0,\n filterCount: chartConfig.filters?.items?.length ?? 0\n });\n\n const { onFetchSliceData, onExportVisual, onExportData, switchView } = options;\n const indicators = getIndicatorItems(chartConfig);\n const activeIndicator = indicators.find(i => i.selected);\n\n const baseXFields: OrganizerXField[] = getGroupItems(chartConfig)\n .filter(g => !_isSynthetic(g))\n .map(g => ({ id: g.key, label: g.menu.label || g.key }));\n\n const yFields = buildYFields(\n indicators.map(i => ({ id: i.key, label: i.menu.label || i.key, group: i.group }))\n );\n\n const stackFields = getStackItems(activeIndicator)\n .filter((s: OrganizerChartItem) => !_isSynthetic(s))\n .map((s: OrganizerChartItem) => ({ id: s.key, label: s.menu.label || s.key }));\n\n const seenKeys = new Set<string>();\n const mergedGroupFields = [...baseXFields, ...stackFields].filter(f => {\n if (seenKeys.has(f.id)) return false;\n seenKeys.add(f.id);\n return true;\n });\n\n return {\n xFields: mergedGroupFields,\n yFields,\n groups: mergedGroupFields,\n slices: getFilterItems(chartConfig).map(f => ({ id: f.key, label: f.menu.label || f.key }) as OrganizerViewSlice),\n templates: chartConfig.templates,\n showReset: false,\n onFetchSliceData,\n showExport: !!(onExportVisual || onExportData),\n onExportVisual,\n onExportData,\n switchView,\n };\n}\n\nexport function chartConfigToState(chartConfig: OrganizerChartConfig | null | undefined): OrganizerState {\n if (!chartConfig) {\n console.debug('[OrganizerChartAdapter] Empty chart config for state conversion');\n return {};\n }\n\n const indicators = getIndicatorItems(chartConfig);\n const activeIndicator = indicators.find(i => i.selected);\n const activeStack = getStackItems(activeIndicator).find((s: OrganizerChartItem) => s.selected);\n const activeGroup = getGroupItems(chartConfig).find(g => g.selected);\n const activeSlices = getFilterItems(chartConfig).filter(f => f.selected);\n const indicatorGroup = activeIndicator?.group;\n\n console.debug('[OrganizerChartAdapter] Current chart state', {\n activeGroup: activeGroup?.key,\n activeIndicator: activeIndicator?.key,\n activeStack: activeStack?.key,\n sliceCount: activeSlices.length\n });\n\n const state = {\n selectedX: activeGroup?.key,\n selectedY: indicatorGroup ?? activeIndicator?.key,\n selectedYAggregate: indicatorGroup ? activeIndicator?.key : undefined,\n selectedGroupBy: activeStack?.key,\n selectedSlices: activeSlices.map(f => f.key),\n };\n const organizerConfig = chartConfigToOrganizer(chartConfig);\n return normalizeOrganizerState(state, organizerConfig);\n}\n\nexport function buildOrganizerChartBinding(\n chartConfig: OrganizerChartConfig | null | undefined,\n options: OrganizerChartBridgeOptions = {}\n): OrganizerChartBinding {\n return {\n config: chartConfigToOrganizer(chartConfig, options),\n state: chartConfigToState(chartConfig)\n };\n}\n\nexport function chartConfigToUnifiedState(\n chartConfig: OrganizerChartConfig | null | undefined,\n viewMode: 'chart' | 'table' = 'chart'\n): OrganizerUnifiedState {\n const state = chartConfigToState(chartConfig);\n return {\n viewMode,\n dimension: state.selectedX,\n metric: resolveYKey(state.selectedY, state.selectedYAggregate),\n metricAggregate: state.selectedYAggregate,\n breakdown: state.selectedGroupBy,\n filters: state.selectedSlices,\n };\n}\n\nexport function applyOrganizerEventToChart(\n event: OrganizerButtonEvent,\n chartConfig: OrganizerChartConfig | null | undefined\n): void {\n if (!chartConfig) {\n console.debug('[OrganizerChartAdapter] Cannot apply event to empty chart config');\n return;\n }\n\n console.debug('[OrganizerChartAdapter] Applying organizer event', { eventType: event.type, state: event.state });\n\n const state = event.state;\n _cleanSynthetics(chartConfig);\n if (state.selectedX !== undefined) _applyXSelection(state.selectedX, chartConfig);\n if (state.selectedY !== undefined) _applyYSelection(state.selectedY, state.selectedYAggregate, chartConfig);\n const effectiveGroupBy = state.selectedGroupBy !== state.selectedX ? state.selectedGroupBy : undefined;\n _applyGroupBySelection(effectiveGroupBy, chartConfig);\n if (state.selectedSlices !== undefined) _applySliceSelection(state.selectedSlices, chartConfig);\n event.resolvedYUnit = resolveYUnit(chartConfig, event.state.selectedY, event.state.selectedYAggregate);\n}\n\nexport function handleOrganizerChartEvent(\n event: OrganizerButtonEvent,\n chartConfig: OrganizerChartConfig | null | undefined,\n currentBinding: OrganizerChartBinding | undefined,\n options: OrganizerChartBridgeOptions = {}\n): OrganizerChartEventResult {\n console.debug('[OrganizerChartAdapter] Handling organizer event', { eventType: event.type });\n\n if (event.type === 'viewSwitched') {\n return {\n binding: {\n config: chartConfigToOrganizer(chartConfig, options),\n state: { ...event.state }\n },\n shouldRefetch: false\n };\n }\n\n applyOrganizerEventToChart(event, chartConfig);\n\n if (event.type === 'ySelected' || event.type === 'templateSelected') {\n return {\n binding: buildOrganizerChartBinding(chartConfig, options),\n shouldRefetch: true\n };\n }\n\n return {\n binding: {\n config: currentBinding?.config ?? chartConfigToOrganizer(chartConfig, options),\n state: event.state\n },\n shouldRefetch: event.type !== 'sliceSelected'\n };\n}\n\nexport function resolveYUnit(\n chartConfig: OrganizerChartConfig | null | undefined,\n selectedY: string | undefined,\n selectedYAggregate: string | undefined\n): string | UnitConfig | undefined {\n if (!chartConfig || !selectedY) return undefined;\n const actualKey = resolveYKey(selectedY, selectedYAggregate);\n return getIndicatorItems(chartConfig).find(i => i.key === actualKey)?.unit;\n}\n\nconst _syntheticItems = new WeakSet<OrganizerChartItem>();\n\nfunction _makeSynthetic(item: OrganizerChartItem): OrganizerChartItem {\n _syntheticItems.add(item);\n return item;\n}\n\nfunction _isSynthetic(item: OrganizerChartItem): boolean {\n return _syntheticItems.has(item);\n}\n\nfunction _cleanSynthetics(chartConfig: OrganizerChartConfig): void {\n if (chartConfig.groups?.items) {\n chartConfig.groups.items = chartConfig.groups.items.filter(g => !_isSynthetic(g));\n }\n if (chartConfig.indicators?.items) {\n chartConfig.indicators.items.forEach(ind => {\n if (ind.extra?.stacks?.items) {\n ind.extra.stacks.items = ind.extra.stacks.items.filter((s: OrganizerChartItem) => !_isSynthetic(s));\n }\n });\n }\n}\n\nfunction _applyXSelection(selectedX: string, chartConfig: OrganizerChartConfig): void {\n const groupItems = getGroupItems(chartConfig);\n const isGroupItem = groupItems.some(g => g.key === selectedX);\n if (isGroupItem) {\n groupItems.forEach(g => { g.selected = g.key === selectedX; });\n return;\n }\n const indicators = getIndicatorItems(chartConfig);\n const allStacks: OrganizerChartItem[] = indicators.flatMap(i => getStackItems(i));\n const stackItem = allStacks.find(s => s.key === selectedX);\n if (stackItem) {\n groupItems.forEach(g => { g.selected = false; });\n groupItems.push(_makeSynthetic({\n key: stackItem.key,\n selected: true,\n menu: stackItem.menu,\n jquery: stackItem.jquery\n ? { value: () => stackItem.jquery!.value(), buildAlias: () => stackItem.jquery!.buildAlias() }\n : undefined,\n }));\n }\n}\n\nfunction _applyYSelection(selectedY: string, selectedYAggregate: string | undefined, chartConfig: OrganizerChartConfig): void {\n const actualKey = resolveYKey(selectedY, selectedYAggregate);\n const indicators = getIndicatorItems(chartConfig);\n indicators.forEach(i => { i.selected = i.key === actualKey; });\n indicators.forEach(i => {\n getStackItems(i).forEach((s: OrganizerChartItem) => { s.selected = false; });\n });\n}\n\nfunction _applyGroupBySelection(effectiveGroupBy: string | undefined, chartConfig: OrganizerChartConfig): void {\n const activeIndicator = getIndicatorItems(chartConfig).find(i => i.selected);\n const stackItems: OrganizerChartItem[] = getStackItems(activeIndicator);\n if (effectiveGroupBy === undefined) {\n stackItems.forEach(s => { s.selected = false; });\n return;\n }\n const isStackItem = stackItems.some(s => s.key === effectiveGroupBy);\n if (isStackItem) {\n stackItems.forEach(s => { s.selected = s.key === effectiveGroupBy; });\n return;\n }\n const groupItem = getGroupItems(chartConfig).find(g => g.key === effectiveGroupBy);\n if (groupItem && activeIndicator) {\n stackItems.forEach(s => { s.selected = false; });\n if (!activeIndicator.extra) {\n activeIndicator.extra = { stacks: { optional: true, items: [] } };\n } else if (!activeIndicator.extra.stacks) {\n activeIndicator.extra.stacks = { optional: true, items: [] };\n }\n activeIndicator.extra.stacks.items.push(_makeSynthetic({\n key: groupItem.key,\n selected: true,\n menu: groupItem.menu,\n jquery: groupItem.jquery ? {\n value: () => groupItem.jquery!.value(),\n buildAlias: () => groupItem.jquery!.buildAlias(),\n buildName: (_item: any, value: string) => String(value),\n } : undefined,\n }));\n } else {\n stackItems.forEach(s => { s.selected = false; });\n }\n}\n\nfunction _applySliceSelection(selectedSlices: string[], chartConfig: OrganizerChartConfig): void {\n getFilterItems(chartConfig).forEach(f => { f.selected = selectedSlices.includes(f.key); });\n}\n\n","import { Subject } from 'rxjs';\nimport { OrganizerEvent, OrganizerState } from '@oneteme/jquery-core';\nimport { OrganizerFieldDef, OrganizerFieldsState, OrganizerGroupByState, OrganizerPanelConfig, OrganizerSliceByState } from './organizer-facade.types';\n\nexport function humanizeKey(key: string): string {\n return key\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/[_-]+/g, ' ')\n .replace(/^./, (v) => v.toUpperCase());\n}\n\nexport class OrganizerFacade<TField extends OrganizerFieldDef = OrganizerFieldDef> {\n\n readonly fields: OrganizerFieldsState<TField> = {\n activeFields: [],\n userCustomized: false,\n };\n\n readonly groupBy: OrganizerGroupByState = {\n activeKey: null,\n userCustomized: false,\n };\n\n readonly sliceBy: OrganizerSliceByState<TField> = {\n activeDynamicFields: [],\n availableForDynamic: [],\n allDynamicFields: [],\n activeLabel: 'Aucun',\n };\n\n private _panelConfig: OrganizerPanelConfig<TField> = { fields: [], sliceConfigs: [] };\n private _hiddenStaticKeys = new Set<string>();\n\n private readonly _events$ = new Subject<OrganizerEvent>();\n readonly events$ = this._events$.asObservable();\n\n get enabled(): boolean {\n return this._panelConfig.config?.enabled === true;\n }\n\n get showFields(): boolean {\n return this.enabled;\n }\n\n get showGroupBySection(): boolean {\n return this.enabled && this.groupByFields.length > 0;\n }\n\n get showSliceBySection(): boolean {\n return this.enabled && (\n (this._panelConfig.sliceConfigs?.length ?? 0) > 0 ||\n this.sliceBy.allDynamicFields.length > 0\n );\n }\n\n get allowFieldRemoval(): boolean {\n return this._panelConfig.config?.enableFieldRemoval !== false;\n }\n\n get isFieldDragDropEnabled(): boolean {\n return this._panelConfig.config?.enableFieldDragDrop === true;\n }\n\n get menuBaseFields(): TField[] {\n return this._uniqueByKey((this._panelConfig.fields || []).filter(c => !c.optional));\n }\n\n get menuOptionalFields(): TField[] {\n return this._uniqueByKey((this._panelConfig.fields || []).filter(c => c.optional));\n }\n\n get totalFieldCount(): number {\n return new Set((this._panelConfig.fields || []).map(c => c.key)).size;\n }\n\n get groupByFields(): TField[] {\n const seen = new Set<string>();\n return (this._panelConfig.fields || []).filter(c => {\n if (c.groupable === false || seen.has(c.key)) return false;\n if (!c.header && c.groupable !== true) return false;\n seen.add(c.key);\n return true;\n });\n }\n\n get activeGroupByLabel(): string {\n if (!this.groupBy.activeKey) return this._panelConfig.noneLabel ?? 'Aucun';\n const field = this.groupByFields.find(c => c.key === this.groupBy.activeKey);\n return field?.header || this.groupBy.activeKey;\n }\n\n get staticSlicesForMenu(): Array<{ key: string; title: string; icon?: string }> {\n return (this._panelConfig.sliceConfigs ?? [])\n .filter(s => !!s.columnKey)\n .map(s => {\n const fieldIcon = (this._panelConfig.fields ?? []).find(c => c.key === s.columnKey)?.icon;\n return { key: s.columnKey!, title: s.title || humanizeKey(s.columnKey!), icon: s.icon ?? fieldIcon };\n });\n }\n\n fieldLabel(field: { key: string; header?: string }): string {\n return field.header || humanizeKey(field.key);\n }\n\n update(panelConfig: OrganizerPanelConfig<TField>): void {\n this._panelConfig = panelConfig;\n this._refreshDefaultFields();\n this._refreshDynamicSliceMeta();\n if (!this.groupBy.userCustomized) {\n this.groupBy.activeKey = panelConfig.defaultGroupBy ?? null;\n }\n }\n\n setActiveFields(fields: TField[]): void {\n this.fields.activeFields = fields;\n this.fields.userCustomized = true;\n }\n\n setUserCustomized(value: boolean): void {\n this.fields.userCustomized = value;\n }\n\n resetToDefaults(): void {\n this.fields.userCustomized = false;\n this.groupBy.userCustomized = false;\n this._refreshDefaultFields();\n this.groupBy.activeKey = this._panelConfig.defaultGroupBy ?? null;\n this.sliceBy.activeDynamicFields = [];\n this._refreshDynamicSliceMeta();\n }\n\n addField(field: TField): void {\n const configFields = this._panelConfig.fields ?? [];\n const configIndex = configFields.findIndex(c => c.key === field.key);\n if (configIndex === -1) {\n this.fields.activeFields = [...this.fields.activeFields, field];\n } else {\n const insertBefore = this.fields.activeFields.findIndex(c => {\n const ci = configFields.findIndex(cc => cc.key === c.key);\n return ci !== -1 && ci > configIndex;\n });\n if (insertBefore === -1) {\n this.fields.activeFields = [...this.fields.activeFields, field];\n } else {\n const copy = [...this.fields.activeFields];\n copy.splice(insertBefore, 0, field);\n this.fields.activeFields = copy;\n }\n }\n this.fields.userCustomized = true;\n this._events$.next({ type: 'fieldsChanged', fieldIds: this.fields.activeFields.map(c => c.key) });\n }\n\n removeField(fieldKey: string): boolean {\n const field = this.fields.activeFields.find(c => c.key === fieldKey);\n if (!field) return false;\n if (!field.optional && !this.allowFieldRemoval) return false;\n if (this.fields.activeFields.length <= 1) return false;\n this.fields.activeFields = this.fields.activeFields.filter(c => c.key !== fieldKey);\n this.fields.userCustomized = true;\n this._events$.next({ type: 'fieldsChanged', fieldIds: this.fields.activeFields.map(c => c.key) });\n return true;\n }\n\n toggleFieldVisibility(field: TField, visible: boolean): void {\n const isVisible = this.isFieldVisible(field.key);\n if (visible && !isVisible) {\n this.addField(field);\n } else if (!visible && isVisible) {\n this.removeField(field.key);\n }\n }\n\n reorderFields(fromKey: string, toKey: string): boolean {\n const prev = this.fields.activeFields.findIndex(c => c.key === fromKey);\n const curr = this.fields.activeFields.findIndex(c => c.key === toKey);\n if (prev === -1 || curr === -1 || prev === curr) return false;\n const reordered = [...this.fields.activeFields];\n const [moved] = reordered.splice(prev, 1);\n reordered.splice(curr, 0, moved);\n this.fields.activeFields = reordered;\n this.fields.userCustomized = true;\n this._events$.next({ type: 'fieldsChanged', fieldIds: this.fields.activeFields.map(c => c.key) });\n return true;\n }\n\n isFieldVisible(key: string): boolean {\n return this.fields.activeFields.some(c => c.key === key);\n }\n\n setGroupBy(key: string | null): void {\n this.groupBy.activeKey = key;\n this.groupBy.userCustomized = true;\n this._events$.next({ type: 'groupByChanged', key });\n }\n\n onDynamicSliceKeysChange(keys: string[]): void {\n const allFields = this._panelConfig.fields ?? [];\n const staticKeys = new Set(\n (this._panelConfig.sliceConfigs ?? []).map(s => s.columnKey).filter((k): k is string => !!k)\n );\n const dynamicKeySet = new Set(keys);\n const existingKeys = new Set([...staticKeys, ...dynamicKeySet]);\n\n this.sliceBy.activeDynamicFields = keys\n .map(k => allFields.find(c => c.key === k))\n .filter((c): c is TField => !!c);\n\n const seen = new Set<string>();\n this.sliceBy.availableForDynamic = allFields.filter(c => {\n if (c.sliceable === false || existingKeys.has(c.key) || seen.has(c.key)) return false;\n seen.add(c.key);\n return true;\n });\n\n this._computeSliceLabel();\n this._events$.next({ type: 'dynamicSlicesChanged', keys });\n }\n\n isDynamicSliceActive(key: string): boolean {\n return this.sliceBy.activeDynamicFields.some(c => c.key === key);\n }\n\n toOrganizerState(): OrganizerState {\n return {\n selectedFieldIds: this.fields.activeFields.map(c => c.key),\n groupByKey: this.groupBy.activeKey,\n dynamicSliceKeys: this.sliceBy.activeDynamicFields.map(c => c.key),\n };\n }\n destroy(): void { this._events$.complete() }\n\n updateHiddenStaticKeys(keys: Set<string>): void {\n this._hiddenStaticKeys = keys;\n this._computeSliceLabel();\n }\n\n private _refreshDefaultFields(): void {\n const defaultFields = (this._panelConfig.fields || []).filter(c => !c.optional);\n if (!this.fields.userCustomized || this.fields.activeFields.length === 0) {\n this.fields.activeFields = [...defaultFields];\n } else {\n const allowedKeys = new Set((this._panelConfig.fields || []).map(c => c.key));\n this.fields.activeFields = this.fields.activeFields.filter(c => allowedKeys.has(c.key));\n }\n }\n\n private _refreshDynamicSliceMeta(): void {\n const allFields = this._panelConfig.fields ?? [];\n const staticKeys = new Set(\n (this._panelConfig.sliceConfigs ?? []).map(s => s.columnKey).filter((k): k is string => !!k)\n );\n const activeDynKeys = new Set(this.sliceBy.activeDynamicFields.map(c => c.key));\n\n const seen1 = new Set<string>();\n this.sliceBy.availableForDynamic = allFields.filter(c => {\n if (c.sliceable === false || staticKeys.has(c.key) || activeDynKeys.has(c.key) || seen1.has(c.key)) return false;\n if (!c.header && c.sliceable !== true) return false;\n seen1.add(c.key);\n return true;\n });\n\n const seen2 = new Set<string>();\n this.sliceBy.allDynamicFields = allFields.filter(c => {\n if (c.sliceable === false || staticKeys.has(c.key) || seen2.has(c.key)) return false;\n if (!c.header && c.sliceable !== true) return false;\n seen2.add(c.key);\n return true;\n });\n this._computeSliceLabel();\n }\n\n private _computeSliceLabel(): void {\n const visibleStatics = (this._panelConfig.sliceConfigs ?? []).filter(\n s => !s.columnKey || !this._hiddenStaticKeys.has(s.columnKey)\n );\n const total = visibleStatics.length + this.sliceBy.activeDynamicFields.length;\n if (total === 0) { this.sliceBy.activeLabel = this._panelConfig.noneLabel ?? 'Aucun'; return; }\n if (total === 1) {\n if (visibleStatics.length === 1) {\n const first = visibleStatics[0];\n this.sliceBy.activeLabel = first?.title || first?.columnKey || '1';\n return;\n }\n this.sliceBy.activeLabel = this.sliceBy.activeDynamicFields[0]?.header || '1';\n return;\n }\n this.sliceBy.activeLabel = `${total} actifs`;\n }\n\n private _uniqueByKey(fields: TField[]): TField[] {\n const seen = new Set<string>();\n return fields.filter(c => {\n if (seen.has(c.key)) return false;\n seen.add(c.key);\n return true;\n });\n }\n}\n","export class GroupByManager {\n private readonly _collapsedGroups = new Set<string>();\n private readonly _groupPages = new Map<string, number>();\n\n groupPageSize = 5;\n groupSortOrder: 'asc' | 'desc' = 'asc';\n\n private _defaultGroupCollapsed = false;\n\n constructor(\n private readonly onNeedProjection: () => void,\n private readonly onNeedRender: () => void,\n ) {}\n\n setDefaultCollapsed(collapsed: boolean): void {\n this._defaultGroupCollapsed = collapsed;\n }\n\n reset(): void {\n this._collapsedGroups.clear();\n this._groupPages.clear();\n }\n\n isGroupCollapsed(groupKey: string): boolean {\n return this._defaultGroupCollapsed\n ? !this._collapsedGroups.has(groupKey)\n : this._collapsedGroups.has(groupKey);\n }\n\n toggleGroupCollapse(groupKey: string, scrollTo: (key: string) => void): void {\n if (this._collapsedGroups.has(groupKey)) {\n this._collapsedGroups.delete(groupKey);\n } else {\n this._collapsedGroups.clear();\n this._collapsedGroups.add(groupKey);\n scrollTo(groupKey);\n }\n this.onNeedProjection();\n }\n\n getSingleOpenGroup(): string | null {\n return this._defaultGroupCollapsed && this._collapsedGroups.size === 1\n ? [...this._collapsedGroups][0]\n : null;\n }\n\n getPage(groupKey: string): number {\n return this._groupPages.get(groupKey) ?? 0;\n }\n\n groupPageBack(groupKey: string): void {\n const current = this._groupPages.get(groupKey) ?? 0;\n if (current > 0) {\n this._groupPages.set(groupKey, current - 1);\n this.onNeedProjection();\n }\n }\n\n groupPageForward(groupKey: string, totalCount: number): void {\n const maxPage = Math.ceil(totalCount / this.groupPageSize) - 1;\n const current = this._groupPages.get(groupKey) ?? 0;\n if (current < maxPage) {\n this._groupPages.set(groupKey, current + 1);\n this.onNeedProjection();\n }\n }\n\n onGroupPageSizeChange(size: number): void {\n this.groupPageSize = size;\n this._groupPages.clear();\n this.onNeedRender();\n }\n\n onGroupSortToggle(dir: 'asc' | 'desc', scrollTo: (key: string) => void): void {\n if (this.groupSortOrder === dir) return;\n this.groupSortOrder = dir;\n this._groupPages.clear();\n this.onNeedRender();\n const openGroup = this.getSingleOpenGroup();\n if (openGroup) scrollTo(openGroup);\n }\n}\n","import { Observable, Subject, take, takeUntil } from 'rxjs';\n\nexport interface LazyFieldDef {\n key: string;\n lazy?: {\n fetchFn: () => Observable<any[]>;\n };\n}\nexport interface LazyFieldCallbacks {\n onRefresh(): void;\n onMarkForCheck(): void;\n}\n\nexport const LAZY_FIELD_LOADING_VALUE = '__lazy_loading__';\nexport const LAZY_FIELD_ERROR_VALUE = '__lazy_error__';\n\nexport class LazyFieldManager<TField extends LazyFieldDef = LazyFieldDef> {\n\n private _status = new Map<string, 'idle' | 'loading' | 'loaded' | 'error'>();\n private _data = new Map<string, Map<any, any>>();\n private _cancels = new Map<string, Subject<void>>();\n\n get status(): Map<string, 'idle' | 'loading' | 'loaded' | 'error'> {\n return this._status;\n }\n\n get data(): Map<string, Map<any, any>> {\n return this._data;\n }\n\n getStatus(key: string): 'idle' | 'loading' | 'loaded' | 'error' {\n return this._status.get(key) ?? 'idle';\n }\n\n getRenderType(rowValue: any): 'loading' | 'error' | 'value' {\n if (rowValue === LAZY_FIELD_LOADING_VALUE) return 'loading';\n if (rowValue === LAZY_FIELD_ERROR_VALUE) return 'error';\n return 'value';\n }\n\n cancelAll(): void {\n this._cancels.forEach(s => { s.next(); s.complete(); });\n this._cancels.clear();\n this._status = new Map();\n this._data = new Map();\n }\n\n retry<TRow>(field: TField, resolvedData: TRow[], callbacks: LazyFieldCallbacks): void {\n const k = field.key;\n const prev = this._cancels.get(k);\n if (prev) { prev.next(); prev.complete(); }\n this._cancels.delete(k);\n\n const newStatus = new Map(this._status);\n newStatus.delete(k);\n this._status = newStatus;\n\n const newData = new Map(this._data);\n newData.delete(k);\n this._data = newData;\n\n this.fetch(field, resolvedData, callbacks);\n }\n\n fetch<TRow>(field: TField, resolvedData: TRow[], callbacks: LazyFieldCallbacks): void {\n if (!field.lazy) return;\n const k = field.key;\n if (this._status.get(k) === 'loading') return;\n\n const prev = this._cancels.get(k);\n if (prev) { prev.next(); prev.complete(); }\n const cancel$ = new Subject<void>();\n this._cancels.set(k, cancel$);\n\n const newStatus = new Map(this._status);\n newStatus.set(k, 'loading');\n this._status = newStatus;\n callbacks.onRefresh();\n\n field.lazy.fetchFn().pipe(\n take(1),\n takeUntil(cancel$),\n ).subscribe({\n next: (values: any[]) => {\n const rowMap = new Map<any, any>();\n values.forEach((value, i) => {\n if (i < resolvedData.length) rowMap.set(resolvedData[i], value);\n });\n const newData = new Map(this._data);\n newData.set(k, rowMap);\n this._data = newData;\n\n const newStatus2 = new Map(this._status);\n newStatus2.set(k, 'loaded');\n this._status = newStatus2;\n\n callbacks.onRefresh();\n callbacks.onMarkForCheck();\n },\n error: () => {\n const newStatusErr = new Map(this._status);\n newStatusErr.set(k, 'error');\n this._status = newStatusErr;\n\n callbacks.onRefresh();\n callbacks.onMarkForCheck();\n },\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["takeUntil"],"mappings":"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"}
1
+ {"version":3,"file":"oneteme-jquery-organizer.mjs","sources":["../../../../projects/oneteme/jquery-organizer/src/lib/models/organizer-utils.ts","../../../../projects/oneteme/jquery-organizer/src/lib/organizer-button/template-manager.utility.ts","../../../../projects/oneteme/jquery-organizer/src/lib/organizer-button/organizer-button.component.ts","../../../../projects/oneteme/jquery-organizer/src/lib/organizer-button/organizer-button.component.html","../../../../projects/oneteme/jquery-organizer/src/lib/slice-panel/slice-panel.component.ts","../../../../projects/oneteme/jquery-organizer/src/lib/slice-panel/slice-panel.component.html","../../../../projects/oneteme/jquery-organizer/src/lib/organizer-button/organizer-button.module.ts","../../../../projects/oneteme/jquery-organizer/src/lib/models/organizer-menu.model.ts","../../../../projects/oneteme/jquery-organizer/src/lib/models/organizer-chart-config.ts","../../../../projects/oneteme/jquery-organizer/src/lib/models/organizer-chart-adapter.ts","../../../../projects/oneteme/jquery-organizer/src/lib/organizer-facade/organizer-facade.ts","../../../../projects/oneteme/jquery-organizer/src/lib/group-by-manager/group-by-manager.ts","../../../../projects/oneteme/jquery-organizer/src/lib/lazy-field-manager/lazy-field-manager.ts","../../../../projects/oneteme/jquery-organizer/src/oneteme-jquery-organizer.ts"],"sourcesContent":["import { OrganizerConfig, OrganizerState, OrganizerTemplate, OrganizerYField } from './organizer-config.interface';\n\nexport interface OrganizerYIndicator {\n id: string;\n label: string;\n group?: string;\n}\n\nexport function buildYFields(indicators: OrganizerYIndicator[]): OrganizerYField[] {\n const ordered: string[] = [];\n const map = new Map<string, OrganizerYField>();\n\n for (const indicator of indicators) {\n const groupKey = indicator.group;\n if (groupKey) {\n if (!map.has(groupKey)) {\n ordered.push(groupKey);\n map.set(groupKey, { id: groupKey, label: groupKey, aggregates: [] });\n }\n const parent = map.get(groupKey);\n if (parent?.aggregates) {\n parent.aggregates.push({ id: indicator.id, label: indicator.label });\n }\n } else {\n ordered.push(indicator.id);\n map.set(indicator.id, { id: indicator.id, label: indicator.label });\n }\n }\n\n return ordered.map(k => map.get(k)).filter((f): f is OrganizerYField => !!f);\n}\n\nexport function resolveYKey(\n selectedY: string | undefined,\n selectedYAggregate: string | undefined\n): string | undefined {\n return selectedYAggregate ?? selectedY;\n}\n\nexport function normalizeOrganizerState(\n state: OrganizerState | undefined,\n config: Pick<OrganizerConfig, 'xFields' | 'yFields' | 'groups' | 'slices' | 'templates'>\n): OrganizerState {\n const base = state || {};\n const normalizedY = normalizeYSelection(base.selectedY, base.selectedYAggregate, config.yFields);\n const selectedX = hasOption(config.xFields, base.selectedX) ? base.selectedX : undefined;\n const selectedGroupBy = hasOption(config.groups, base.selectedGroupBy) ? base.selectedGroupBy : undefined;\n const selectedSlices = (base.selectedSlices || []).filter(sliceId => hasOption(config.slices, sliceId));\n\n const normalized: OrganizerState = {\n ...base,\n selectedX,\n selectedY: normalizedY.selectedY,\n selectedYAggregate: normalizedY.selectedYAggregate,\n selectedGroupBy,\n selectedSlices,\n };\n\n return {\n ...normalized,\n selectedTemplate: resolveMatchingTemplateId(config.templates, normalized, config)\n };\n}\n\nexport function normalizeTemplateToState(\n template: OrganizerTemplate,\n currentState: OrganizerState | undefined,\n config: Pick<OrganizerConfig, 'xFields' | 'yFields' | 'groups' | 'slices' | 'templates'>\n): OrganizerState {\n const base = normalizeOrganizerState(currentState, config);\n const normalizedY = normalizeYSelection(template.yField, template.yAggregate, config.yFields, base);\n\n const nextState: OrganizerState = {\n viewMode: base.viewMode,\n visibleFields: base.visibleFields,\n selectedX: hasOption(config.xFields, template.xField) ? template.xField : base.selectedX,\n selectedY: normalizedY.selectedY,\n selectedYAggregate: normalizedY.selectedYAggregate,\n selectedGroupBy: hasOption(config.groups, template.groupBy) ? template.groupBy : base.selectedGroupBy,\n selectedSlices: (template.selectedSlices || []).filter(sliceId => hasOption(config.slices, sliceId)),\n };\n\n const resolvedTemplateId = resolveMatchingTemplateId(config.templates, nextState, config);\n return {\n ...nextState,\n selectedTemplate: resolvedTemplateId ?? template.id\n };\n}\n\nexport function resolveMatchingTemplateId(\n templates: OrganizerTemplate[] | undefined,\n state: OrganizerState | undefined,\n config: Pick<OrganizerConfig, 'xFields' | 'yFields' | 'groups' | 'slices' | 'templates'>\n): string | undefined {\n if (!templates?.length) return undefined;\n\n const normalizedState = normalizeStateWithoutTemplate(state, config);\n return templates.find(template => {\n const templateState = normalizeStateWithoutTemplate(\n normalizeTemplateToComparableState(template, normalizedState, config),\n config\n );\n return sameOrganizerState(templateState, normalizedState);\n })?.id;\n}\n\nfunction normalizeStateCore(\n selectedX: string | undefined,\n selectedY: string | undefined,\n selectedYAggregate: string | undefined,\n selectedGroupBy: string | undefined,\n selectedSlices: string[] | undefined,\n config: Pick<OrganizerConfig, 'xFields' | 'yFields' | 'groups' | 'slices'>,\n originalState?: OrganizerState\n): OrganizerState {\n const normalizedY = normalizeYSelection(selectedY, selectedYAggregate, config.yFields, originalState);\n return {\n selectedX: hasOption(config.xFields, selectedX) ? selectedX : undefined,\n selectedY: normalizedY.selectedY,\n selectedYAggregate: normalizedY.selectedYAggregate,\n selectedGroupBy: hasOption(config.groups, selectedGroupBy) ? selectedGroupBy : undefined,\n selectedSlices: (selectedSlices || []).filter(sliceId => hasOption(config.slices, sliceId)),\n };\n}\n\nfunction normalizeTemplateToComparableState(\n template: OrganizerTemplate,\n baseState: OrganizerState,\n config: Pick<OrganizerConfig, 'xFields' | 'yFields' | 'groups' | 'slices' | 'templates'>\n): OrganizerState {\n return normalizeStateCore(\n template.xField,\n template.yField,\n template.yAggregate,\n template.groupBy,\n template.selectedSlices,\n config,\n baseState\n );\n}\n\nfunction normalizeStateWithoutTemplate(\n state: OrganizerState | undefined,\n config: Pick<OrganizerConfig, 'xFields' | 'yFields' | 'groups' | 'slices' | 'templates'>\n): OrganizerState {\n const base = state || {};\n return normalizeStateCore(\n base.selectedX,\n base.selectedY,\n base.selectedYAggregate,\n base.selectedGroupBy,\n base.selectedSlices,\n config,\n base\n );\n}\n\nfunction normalizeYSelection(\n selectedY: string | undefined,\n selectedYAggregate: string | undefined,\n yFields: OrganizerYField[] | undefined,\n fallbackState?: OrganizerState\n): Pick<OrganizerState, 'selectedY' | 'selectedYAggregate'> {\n if (!selectedY) {\n return {\n selectedY: fallbackState?.selectedY,\n selectedYAggregate: fallbackState?.selectedYAggregate,\n };\n }\n\n const directField = yFields?.find(field => field.id === selectedY);\n if (directField) {\n if (!directField.aggregates?.length) {\n return { selectedY: directField.id, selectedYAggregate: undefined };\n }\n\n const matchedAggregate = selectedYAggregate\n ? directField.aggregates.find(aggregate => aggregate.id === selectedYAggregate)\n : undefined;\n const fallbackAggregate = fallbackState?.selectedY === directField.id\n ? directField.aggregates.find(aggregate => aggregate.id === fallbackState.selectedYAggregate)\n : undefined;\n const resolvedAggregate = matchedAggregate ?? fallbackAggregate ?? directField.aggregates[0];\n\n return {\n selectedY: directField.id,\n selectedYAggregate: resolvedAggregate?.id,\n };\n }\n\n const aggregateParent = yFields?.find(field => field.aggregates?.some(aggregate => aggregate.id === selectedY));\n if (aggregateParent) {\n return {\n selectedY: aggregateParent.id,\n selectedYAggregate: selectedY,\n };\n }\n\n return {\n selectedY: fallbackState?.selectedY,\n selectedYAggregate: fallbackState?.selectedYAggregate,\n };\n}\n\nfunction sameOrganizerState(left: OrganizerState, right: OrganizerState): boolean {\n return left.selectedX === right.selectedX\n && left.selectedY === right.selectedY\n && left.selectedYAggregate === right.selectedYAggregate\n && left.selectedGroupBy === right.selectedGroupBy\n && sameSlices(left.selectedSlices || [], right.selectedSlices || []);\n}\n\nfunction sameSlices(left: string[], right: string[]): boolean {\n if (left.length !== right.length) return false;\n const sortedLeft = [...left].sort((a, b) => a.localeCompare(b));\n const sortedRight = [...right].sort((a, b) => a.localeCompare(b));\n return sortedLeft.every((value, index) => value === sortedRight[index]);\n}\n\nfunction hasOption(items: Array<{ id: string }> | undefined, id: string | undefined): boolean {\n return !!id && !!items?.some(item => item.id === id);\n}\n","import { OrganizerConfig, OrganizerTemplate, OrganizerState } from '../models';\nimport { normalizeTemplateToState } from '../models/organizer-utils';\n\nexport class TemplateManager {\n static applyTemplate(\n template: OrganizerTemplate,\n currentState: OrganizerState | undefined,\n config: Pick<OrganizerConfig, 'xFields' | 'yFields' | 'groups' | 'slices' | 'templates'>\n ): OrganizerState {\n return normalizeTemplateToState(template, currentState, config);\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, ChangeDetectionStrategy, ChangeDetectorRef, OnDestroy, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule, MatMenuTrigger } from '@angular/material/menu';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { Subject, isObservable } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\nimport { OrganizerConfig, OrganizerButtonEvent, OrganizerSliceState, OrganizerState } from '../models';\nimport { normalizeOrganizerState, resolveMatchingTemplateId } from '../models/organizer-utils';\nimport { TemplateManager } from './template-manager.utility';\n\n@Component({\n standalone: true,\n imports: [ CommonModule, MatButtonModule, MatIconModule, MatMenuModule, MatDividerModule ],\n selector: 'organizer-button',\n templateUrl: './organizer-button.component.html',\n styleUrls: ['./organizer-button.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class OrganizerButtonComponent implements OnInit, OnDestroy {\n @Input() config!: OrganizerConfig;\n @Input() state?: OrganizerState;\n @Input() hideMenuValues = false;\n @Output() viewChange = new EventEmitter<OrganizerButtonEvent>();\n @Output() sliceStateChange = new EventEmitter<OrganizerSliceState | null>();\n\n loadingFieldId?: string;\n\n private fieldDataCache = new Map<string, any[]>();\n private destroy$ = new Subject<void>();\n\n @ViewChild('mainMenuTrigger') mainMenuTrigger?: MatMenuTrigger;\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n ngOnInit(): void {\n console.debug('[OrganizerButton] Initialized', {\n configFields: this.config?.fields?.length ?? 0,\n hasState: !!this.state,\n hideMenuValues: this.hideMenuValues\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n isFieldVisible(fieldId: string): boolean {\n const visible = this.state?.visibleFields;\n if (!visible) {\n return this.config.fields?.find(f => f.id === fieldId)?.visible !== false;\n }\n return visible.includes(fieldId);\n }\n\n fieldsSummary(): string {\n const total = this.config.fields?.length ?? 0;\n const visible = this.state?.visibleFields?.length ?? total;\n return `${visible}/${total}`;\n }\n\n onFieldToggle(fieldId: string, visible: boolean): void {\n console.debug('[OrganizerButton] Field toggled', { fieldId, visible });\n const visibleFields = this.state?.visibleFields || [];\n const updated = visible\n ? [...visibleFields, fieldId]\n : visibleFields.filter(f => f !== fieldId);\n this.emitChange('fieldToggled', { visibleFields: updated });\n }\n\n onXFieldSelect(fieldId: string): void {\n console.debug('[OrganizerButton] X field selected', { fieldId, current: this.state?.selectedX });\n // Évite une requête inutile si le X est déjà sélectionné\n if (this.state?.selectedX === fieldId) {\n console.debug('[OrganizerButton] X field already selected, skipping emit');\n return;\n }\n this.emitChange('xSelected', { selectedX: fieldId });\n }\n\n onYFieldSelect(fieldId: string): void {\n console.debug('[OrganizerButton] Y field selected', { fieldId, current: this.state?.selectedY });\n // Évite une requête inutile si le Y est déjà sélectionné\n if (this.state?.selectedY === fieldId) {\n console.debug('[OrganizerButton] Y field already selected, skipping emit');\n return;\n }\n this.emitChange('ySelected', {\n selectedY: fieldId,\n selectedYAggregate: undefined\n });\n }\n\n onYAggregateSelect(yFieldId: string, aggregateId: string): void {\n console.debug('[OrganizerButton] Y aggregate selected', { yFieldId, aggregateId, current: this.state?.selectedYAggregate });\n // Évite une requête inutile si l'aggregate est déjà sélectionné\n if (this.state?.selectedYAggregate === aggregateId && this.state?.selectedY === yFieldId) {\n console.debug('[OrganizerButton] Y aggregate already selected, skipping emit');\n return;\n }\n this.emitChange('ySelected', {\n selectedY: yFieldId,\n selectedYAggregate: aggregateId\n });\n }\n\n onGroupBySelect(groupId: string): void {\n console.debug('[OrganizerButton] Group by selected', { groupId });\n const current = this.state.selectedGroupBy;\n this.emitChange('groupBySelected', { selectedGroupBy: current === groupId ? undefined : groupId });\n }\n\n onTemplateSelect(templateId: string): void {\n console.debug('[OrganizerButton] Template selected', { templateId });\n if (!this.config.templates?.length) return;\n\n const template = this.config.templates?.find(t => t.id === templateId);\n if (!template) return;\n\n const newState = TemplateManager.applyTemplate(template, this.state, this.config);\n this.emitChange('templateSelected', newState);\n this.syncSliceState(newState.selectedSlices);\n }\n\n onSliceClick(sliceId?: string): void {\n console.debug('[OrganizerButton] Slice clicked', { sliceId });\n if (this.config.onSliceClick) {\n this.config.onSliceClick();\n }\n\n const selectedSlices = this.state?.selectedSlices || [];\n let updated: string[];\n if (sliceId) {\n updated = selectedSlices.includes(sliceId)\n ? selectedSlices.filter(id => id !== sliceId)\n : [...selectedSlices, sliceId];\n } else {\n updated = selectedSlices;\n }\n\n if (updated.length === 0 || !sliceId || !this.config.onFetchSliceData) {\n this.sliceStateChange.emit(null);\n this.emitChange('sliceSelected', { selectedSlices: updated });\n return;\n }\n\n this.syncSliceState(updated, () => {\n this.emitChange('sliceSelected', { selectedSlices: updated });\n });\n }\n\n private syncSliceState(selectedSlices: string[] | undefined, onLoaded?: () => void): void {\n const sliceId = selectedSlices?.[0];\n if (!sliceId || !this.config.onFetchSliceData) {\n this.sliceStateChange.emit(null);\n onLoaded?.();\n return;\n }\n\n const slice = this.config.slices?.find(s => s.id === sliceId);\n if (!slice) {\n this.sliceStateChange.emit(null);\n onLoaded?.();\n return;\n }\n\n const result = this.config.onFetchSliceData(sliceId);\n const handleData = (tasks: any[]) => {\n this.sliceStateChange.emit({\n sliceConfigs: [{ title: slice.label ?? sliceId, columnKey: sliceId }],\n tasks,\n filterApplied: false // Panel vient d'être ouvert, pas de filtre sélectionné encore\n });\n onLoaded?.();\n };\n\n if (isObservable(result)) {\n result.pipe(takeUntil(this.destroy$)).subscribe({ next: handleData });\n } else {\n result.then(handleData);\n }\n }\n\n async loadFieldData(fieldId: string): Promise<void> {\n if (this.fieldDataCache.has(fieldId)) return;\n if (!this.config.onFetchFieldData) return;\n\n const field = this.config.fields?.find(f => f.id === fieldId);\n if (!field) return;\n\n this.loadingFieldId = fieldId;\n this.cdr.markForCheck();\n\n try {\n const data = await this.config.onFetchFieldData(fieldId);\n this.fieldDataCache.set(fieldId, data);\n } finally {\n this.loadingFieldId = undefined;\n this.cdr.markForCheck();\n }\n }\n\n onExport(): void {\n if (this.config.onExport) this.config.onExport();\n this.mainMenuTrigger?.closeMenu();\n }\n\n onExportVisual(): void {\n if (this.config.onExportVisual) this.config.onExportVisual();\n this.mainMenuTrigger?.closeMenu();\n }\n\n onExportData(): void {\n if (this.config.onExportData) this.config.onExportData();\n this.mainMenuTrigger?.closeMenu();\n }\n\n hasExportSubMenu(): boolean {\n return !!(this.config.onExportVisual || this.config.onExportData);\n }\n\n isCopyActionVisible(): boolean {\n return !!this.config.onCopyVisual && this.config.actions?.showCopy !== false;\n }\n\n isFullscreenActionVisible(): boolean {\n return !!this.config.onToggleFullscreen && this.config.actions?.showFullscreen !== false;\n }\n\n hasActions(): boolean {\n return this.config.showActions === true && (this.isCopyActionVisible() || this.isFullscreenActionVisible());\n }\n\n hasMenuItemsBeforeActions(): boolean {\n return this.hasChartFields()\n || this.hasTableFields()\n || (this.config.groups?.length ?? 0) > 0\n || (this.config.slices?.length ?? 0) > 0\n || (this.config.templates?.length ?? 0) > 0;\n }\n\n hasOtherMenuItems(): boolean {\n return this.hasMenuItemsBeforeActions()\n || !!this.config.showExport\n || !!this.config.showPreferences\n || this.hasSwitchView();\n }\n\n actionsLabel(): string {\n if (this.config.actions?.label) return this.config.actions.label;\n return this.isCopyActionVisible() && this.isFullscreenActionVisible() ? 'Actions' : 'Action';\n }\n\n onCopyVisual(): void {\n this.config.onCopyVisual?.();\n this.mainMenuTrigger?.closeMenu();\n }\n\n onToggleFullscreen(): void {\n this.config.onToggleFullscreen?.();\n this.mainMenuTrigger?.closeMenu();\n }\n\n hasSwitchView(): boolean {\n return !!this.config.switchView;\n }\n\n onSwitchView(): void {\n const sv = this.config.switchView;\n if (!sv) return;\n const newView: 'chart' | 'table' = sv.currentView === 'chart' ? 'table' : 'chart';\n sv.onSwitch(newView);\n this.emitChange('viewSwitched', { viewMode: newView });\n this.mainMenuTrigger?.closeMenu();\n }\n\n onPreferencesEdit(): void {\n if (this.config.onPreferencesEdit) this.config.onPreferencesEdit();\n this.mainMenuTrigger?.closeMenu();\n }\n\n onPreferencesSave(): void {\n if (this.config.onPreferencesSave) this.config.onPreferencesSave();\n this.mainMenuTrigger?.closeMenu();\n }\n\n onPreferencesClear(): void {\n if (this.config.onPreferencesClear) this.config.onPreferencesClear();\n this.mainMenuTrigger?.closeMenu();\n }\n\n onReset(): void {\n this.emitChange('reset', {\n visibleFields: [],\n selectedX: undefined,\n selectedY: undefined,\n selectedYAggregate: undefined,\n selectedGroupBy: undefined,\n selectedSlices: []\n });\n }\n\n activeXLabel(): string {\n const id = this.state?.selectedX;\n if (!id) return '';\n return this.config.xFields?.find(f => f.id === id)?.label ?? id;\n }\n\n activeYLabel(): string {\n const yId = this.state?.selectedY;\n if (!yId) return '';\n const yField = this.config.yFields?.find(f => f.id === yId);\n const base = yField?.label ?? yId;\n\n if (this.state?.selectedYAggregate) {\n const agg = yField?.aggregates?.find(a => a.id === this.state!.selectedYAggregate);\n return agg ? `${base} · ${agg.label}` : base;\n }\n return base;\n }\n\n activeGroupByLabel(): string {\n const id = this.state?.selectedGroupBy;\n if (!id) return '';\n return this.config.groups?.find(g => g.id === id)?.label ?? id;\n }\n\n activeSlicesLabel(): string {\n const ids = this.state?.selectedSlices;\n if (!ids?.length) return '';\n if (ids.length === 1) {\n return this.config.slices?.find(s => s.id === ids[0])?.label ?? ids[0];\n }\n return `${ids.length} sélectionnés`;\n }\n\n activeTemplateLabel(): string {\n const id = this.state?.selectedTemplate;\n if (!id) return '';\n return this.config.templates?.find(t => t.id === id)?.label ?? id;\n }\n\n hasChartFields(): boolean {\n return (this.config.xFields?.length ?? 0) > 0 || (this.config.yFields?.length ?? 0) > 0;\n }\n\n hasTableFields(): boolean {\n return (this.config.fields?.length ?? 0) > 0;\n }\n\n isYActive(yFieldId: string): boolean {\n return this.state?.selectedY === yFieldId;\n }\n\n isYAggregateActive(yFieldId: string, aggregateId: string): boolean {\n return this.state?.selectedY === yFieldId && this.state?.selectedYAggregate === aggregateId;\n }\n\n private emitChange(type: OrganizerButtonEvent['type'], stateUpdate: Partial<OrganizerState> | OrganizerState): void {\n const isFullState = 'selectedX' in stateUpdate && 'selectedTemplate' in stateUpdate;\n const rawState = isFullState ? (stateUpdate as OrganizerState) : { ...this.state, ...stateUpdate };\n const normalizedState = normalizeOrganizerState(rawState, this.config);\n const event: OrganizerButtonEvent = {\n type,\n state: {\n ...normalizedState,\n selectedTemplate: resolveMatchingTemplateId(this.config.templates, normalizedState, this.config)\n },\n source: 'user'\n };\n this.viewChange.emit(event);\n }\n}\n","<button type=\"button\" class=\"organizer-btn\" [matMenuTriggerFor]=\"viewMenu\" #mainMenuTrigger=\"matMenuTrigger\" [attr.aria-label]=\"'View'\">\n <mat-icon class=\"organizer-btn-icon\">{{ config.buttonIcon || 'settings' }}</mat-icon>\n</button>\n\n<mat-menu #viewMenu=\"matMenu\" panelClass=\"organizer-menu-panel\">\n\n <!-- Champs : mode chart (X + Y) -->\n <button *ngIf=\"hasChartFields()\" mat-menu-item [matMenuTriggerFor]=\"champsSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Champs</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && (activeXLabel() || activeYLabel())\">\n {{ activeXLabel() }}<ng-container *ngIf=\"activeXLabel() && activeYLabel()\"> / </ng-container>{{ activeYLabel() }}\n </span>\n </button>\n\n <!-- Champs : mode table (toggle colonnes) -->\n <button *ngIf=\"hasTableFields()\" mat-menu-item [matMenuTriggerFor]=\"fieldsSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Champs</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues\">{{ fieldsSummary() }}</span>\n </button>\n\n <!-- Grouper par -->\n <button *ngIf=\"config.groups?.length\" mat-menu-item [matMenuTriggerFor]=\"groupsSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Grouper par</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && activeGroupByLabel()\">{{ activeGroupByLabel() }}</span>\n </button>\n\n <!-- Filtrer par -->\n <button *ngIf=\"config.slices?.length\" mat-menu-item [matMenuTriggerFor]=\"slicesSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Filtrer par</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && activeSlicesLabel()\">{{ activeSlicesLabel() }}</span>\n </button>\n\n <!-- Template -->\n <button *ngIf=\"config.templates?.length\" mat-menu-item [matMenuTriggerFor]=\"templateSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Template</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && activeTemplateLabel()\">{{ activeTemplateLabel() }}</span>\n </button>\n\n <!-- Actions du visuel courant -->\n <mat-divider *ngIf=\"hasActions() && hasMenuItemsBeforeActions()\" class=\"organizer-divider\"></mat-divider>\n <button *ngIf=\"hasActions() && hasOtherMenuItems()\" mat-menu-item [matMenuTriggerFor]=\"actionsSubMenu\" class=\"organizer-menu-trigger\">\n <mat-icon *ngIf=\"config.actions?.icon\" class=\"organizer-menu-export-icon\">{{ config.actions?.icon }}</mat-icon>\n <span class=\"organizer-menu-label\">{{ actionsLabel() }}</span>\n </button>\n\n <!-- Actions directes lorsqu'il n'y a aucun autre item principal -->\n <ng-container *ngIf=\"hasActions() && !hasOtherMenuItems()\">\n <button *ngIf=\"isCopyActionVisible()\" mat-menu-item type=\"button\" (click)=\"onCopyVisual()\">\n <mat-icon class=\"organizer-menu-export-icon\">content_copy</mat-icon>\n <span class=\"organizer-menu-label\">Copier</span>\n </button>\n <button *ngIf=\"isFullscreenActionVisible()\" mat-menu-item type=\"button\" (click)=\"onToggleFullscreen()\">\n <mat-icon class=\"organizer-menu-export-icon\">{{ config.isFullscreen ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>\n <span class=\"organizer-menu-label\">{{ config.isFullscreen ? 'Quitter le plein écran' : 'Plein écran' }}</span>\n </button>\n </ng-container>\n\n <!-- Export direct (mode table) -->\n <mat-divider *ngIf=\"config.showExport\" class=\"organizer-divider\"></mat-divider>\n <button *ngIf=\"config.showExport && !hasExportSubMenu()\" mat-menu-item type=\"button\" class=\"organizer-menu-export\" (click)=\"onExport()\">\n <mat-icon class=\"organizer-menu-export-icon\">download</mat-icon>\n <span class=\"organizer-menu-label\">Exporter</span>\n </button>\n\n <!-- Export graphique (mode chart) — ouvre un sous-menu -->\n <button *ngIf=\"config.showExport && hasExportSubMenu()\" mat-menu-item [matMenuTriggerFor]=\"exportSubMenu\" class=\"organizer-menu-trigger organizer-menu-export\">\n <mat-icon class=\"organizer-menu-export-icon\">download</mat-icon>\n <span class=\"organizer-menu-label\">Exporter</span>\n </button>\n\n <!-- Préférences -->\n <mat-divider *ngIf=\"config.showPreferences\" class=\"organizer-divider\"></mat-divider>\n <button *ngIf=\"config.showPreferences\" mat-menu-item [matMenuTriggerFor]=\"preferencesSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Préférences</span>\n </button>\n\n <!-- Switch chart / table -->\n <mat-divider *ngIf=\"hasSwitchView()\" class=\"organizer-divider\"></mat-divider>\n <button *ngIf=\"hasSwitchView()\" mat-menu-item type=\"button\" class=\"organizer-menu-trigger\" (click)=\"onSwitchView()\">\n <mat-icon class=\"organizer-menu-export-icon\">{{ config.switchView?.currentView === 'chart' ? 'table_chart' : 'bar_chart' }}</mat-icon>\n <span class=\"organizer-menu-label\">{{ config.switchView?.currentView === 'chart' ? 'Tableau' : 'Graphique' }}</span>\n </button>\n\n</mat-menu>\n\n<!-- Sous-menu : actions du visuel -->\n<mat-menu #actionsSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button *ngIf=\"isCopyActionVisible()\" type=\"button\" class=\"organizer-submenu-item\"\n (mousedown)=\"onCopyVisual()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">content_copy</mat-icon>\n Copier\n </button>\n <button *ngIf=\"isFullscreenActionVisible()\" type=\"button\" class=\"organizer-submenu-item\"\n (mousedown)=\"onToggleFullscreen()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">{{ config.isFullscreen ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>\n {{ config.isFullscreen ? 'Quitter le plein écran' : 'Plein écran' }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Export graphique -->\n<mat-menu #exportSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button *ngIf=\"config.onExportVisual\" type=\"button\" class=\"organizer-submenu-item\"\n (mousedown)=\"onExportVisual()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">image</mat-icon>\n Visuel\n </button>\n <button *ngIf=\"config.onExportData\" type=\"button\" class=\"organizer-submenu-item\"\n (mousedown)=\"onExportData()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">table_chart</mat-icon>\n Données\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Champs chart (X + Y) -->\n<mat-menu #champsSubMenu=\"matMenu\" panelClass=\"organizer-champs-panel\">\n <div class=\"organizer-champs-wrapper\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n\n <!-- Bloc X -->\n <div class=\"organizer-champs-block\" *ngIf=\"config.xFields?.length\">\n <span class=\"organizer-champs-block-title\">Axe horizontal — X</span>\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let xField of config.xFields\"\n [class.active]=\"state?.selectedX === xField.id\"\n [disabled]=\"xField.disabled\"\n (mousedown)=\"onXFieldSelect(xField.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedX === xField.id ? '✓' : '' }}</span>\n {{ xField.label }}\n </button>\n </div>\n\n <mat-divider *ngIf=\"config.xFields?.length && config.yFields?.length\" class=\"organizer-champs-divider\"></mat-divider>\n\n <!-- Bloc Y -->\n <div class=\"organizer-champs-block\" *ngIf=\"config.yFields?.length\">\n <span class=\"organizer-champs-block-title\">Axe vertical — Y</span>\n <ng-container *ngFor=\"let yField of config.yFields\">\n\n <!-- Y simple (Count sans agrégat ni stack) -->\n <!-- Y simple (Count ou métrique directe) -->\n <button *ngIf=\"!yField.aggregates?.length\"\n type=\"button\" class=\"organizer-submenu-item\"\n [class.active]=\"isYActive(yField.id)\"\n [disabled]=\"yField.disabled\"\n (mousedown)=\"onYFieldSelect(yField.id)\">\n <span class=\"organizer-submenu-check\">{{ isYActive(yField.id) ? '✓' : '' }}</span>\n {{ yField.label }}\n </button>\n\n <!-- Y avec agrégats → sous-menu -->\n <button *ngIf=\"yField.aggregates?.length\"\n type=\"button\" class=\"organizer-submenu-item organizer-submenu-item--has-children\"\n [class.active]=\"isYActive(yField.id)\"\n [disabled]=\"yField.disabled\"\n [matMenuTriggerFor]=\"yAggSubMenu\"\n [matMenuTriggerData]=\"{ yField: yField }\"\n (mousedown)=\"$event.stopPropagation()\">\n <span class=\"organizer-submenu-check\">{{ isYActive(yField.id) ? '✓' : '' }}</span>\n {{ yField.label }}\n <mat-icon class=\"organizer-submenu-arrow\">chevron_right</mat-icon>\n </button>\n\n </ng-container>\n </div>\n\n </div>\n</mat-menu>\n\n<!-- Sous-menu dynamique : agrégats d'un champ Y -->\n<mat-menu #yAggSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <ng-template matMenuContent let-yField=\"yField\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let agg of yField.aggregates\"\n [class.active]=\"isYAggregateActive(yField.id, agg.id)\"\n (mousedown)=\"onYAggregateSelect(yField.id, agg.id)\">\n <span class=\"organizer-submenu-check\">{{ isYAggregateActive(yField.id, agg.id) ? '✓' : '' }}</span>\n {{ agg.label }}\n </button>\n </div>\n </ng-template>\n</mat-menu>\n\n<!-- Sous-menu : Champs table (toggle colonnes) -->\n<mat-menu #fieldsSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let field of config.fields\"\n [class.active]=\"isFieldVisible(field.id)\"\n (mousedown)=\"onFieldToggle(field.id, !isFieldVisible(field.id))\">\n <span class=\"organizer-submenu-check\">{{ isFieldVisible(field.id) ? '✓' : '' }}</span> <mat-icon *ngIf=\"field.icon\" class=\"organizer-submenu-icon\">{{ field.icon }}</mat-icon> {{ field.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Grouper par -->\n<mat-menu #groupsSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let group of config.groups\"\n [class.active]=\"state?.selectedGroupBy === group.id\"\n (mousedown)=\"onGroupBySelect(group.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedGroupBy === group.id ? '✓' : '' }}</span> <mat-icon *ngIf=\"group.icon\" class=\"organizer-submenu-icon\">{{ group.icon }}</mat-icon> {{ group.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Filtrer par -->\n<mat-menu #slicesSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let slice of config.slices\"\n [class.active]=\"state?.selectedSlices?.includes(slice.id)\"\n (mousedown)=\"onSliceClick(slice.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedSlices?.includes(slice.id) ? '✓' : '' }}</span> <mat-icon *ngIf=\"slice.icon\" class=\"organizer-submenu-icon\">{{ slice.icon }}</mat-icon> {{ slice.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Template -->\n<mat-menu #templateSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let tmpl of config.templates\"\n [class.active]=\"state?.selectedTemplate === tmpl.id\"\n [title]=\"tmpl.description || ''\"\n (mousedown)=\"onTemplateSelect(tmpl.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedTemplate === tmpl.id ? '✓' : '' }}</span>\n <mat-icon *ngIf=\"tmpl.icon\" class=\"organizer-submenu-icon\">{{ tmpl.icon }}</mat-icon>\n {{ tmpl.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Préférences -->\n<mat-menu #preferencesSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\" (mousedown)=\"onPreferencesEdit()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">edit</mat-icon>Éditer\n </button>\n <button type=\"button\" class=\"organizer-submenu-item\" (mousedown)=\"onPreferencesSave()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">save</mat-icon>Sauvegarder\n </button>\n <button type=\"button\" class=\"organizer-submenu-item\" [disabled]=\"!config.hasSavedPreferences\" (mousedown)=\"onPreferencesClear()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">delete_outline</mat-icon>Réinitialiser\n </button>\n </div>\n</mat-menu>\n\n","import { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, HostBinding, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild, inject } from '@angular/core';\nimport { SliceColumnDef, SliceConfig } from './slice-panel.model';\n\nconst EMPTY_CATEGORY_KEY = '__empty__';\nconst EMPTY_CATEGORY_LABEL = 'Vide';\n\nconst I18N = {\n expandFilterTitle: 'Déplier le filtre',\n collapseFilterTitle: 'Replier le filtre',\n filterPanelTitle: (count: number) => count > 1 ? 'Filtres' : 'Filtre',\n filterBlockDefaultTitle: 'Filtrer',\n filterEmptyState: 'Aucune donnée',\n};\n\nexport type SlicePanelFilters = Record<string, string[]>;\n\n@Component({\n standalone: true,\n selector: 'slice-panel',\n imports: [CommonModule, MatIconModule],\n templateUrl: './slice-panel.component.html',\n styleUrls: ['./slice-panel.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SlicePanelComponent<T = any> implements OnChanges, OnInit {\n\n @Input() sliceConfigs: SliceConfig<T>[] = [];\n @Input() columns: SliceColumnDef<T>[] = [];\n @Input() data: T[] = [];\n @Input() lazyData: Map<string, Map<any, any>> = new Map();\n @Input() lazyStatus: Map<string, 'idle' | 'loading' | 'loaded' | 'error'> = new Map();\n @Input() showToggle = true;\n @Input() showCounts = true;\n @Input() collapsedByDefault = false;\n @Input() alwaysShow = false;\n\n @Output() filterChange = new EventEmitter<(row: T) => boolean>();\n @Output() activeKeysChange = new EventEmitter<string[][]>();\n @Output() dynamicSliceKeysChange = new EventEmitter<string[]>();\n @Output() collapsedChange = new EventEmitter<boolean>();\n\n @ViewChild('slicePanelBody') slicePanelBodyRef?: ElementRef<HTMLElement>;\n\n private _cdr = inject(ChangeDetectorRef);\n\n readonly i18n = I18N;\n\n isCollapsed = false;\n\n @HostBinding('class.collapsed') get hostCollapsed(): boolean { return this.isCollapsed; }\n activeKeysBySlice: Map<number, Set<string>> = new Map();\n private _expandedSlices = new Set<number>();\n _dynamicSlices: Array<{ key: string; slice: SliceConfig<T> }> = [];\n\n _cachedSlices: SliceConfig<T>[] = [];\n private _countCache = new Map<string, number>();\n\n readonly trackBySliceIndex = (index: number, _: any): number => index;\n readonly trackByCategoryKey = (_: number, cat: any): string => cat.key;\n\n ngOnInit(): void {\n this.isCollapsed = this.collapsedByDefault;\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['sliceConfigs'] || changes['data'] || changes['columns'] || changes['lazyData'] || changes['lazyStatus']) {\n this._refreshDynamicSlices();\n this._rebuildCache();\n const shouldReemitFilter = !!(changes['data'] || changes['columns'] || changes['lazyData'] || changes['lazyStatus']);\n const hasActiveFilters = [...this.activeKeysBySlice.values()].some(s => s.size > 0);\n if (hasActiveFilters && shouldReemitFilter) {\n this._emitFilter();\n }\n this._cdr.markForCheck();\n }\n }\n\n get showPanel(): boolean {\n const hasCfg = (this.sliceConfigs || []).length > 0 || this._dynamicSlices.length > 0;\n if (this.alwaysShow) return hasCfg;\n return hasCfg && (this.data?.length ?? 0) > 0;\n }\n\n get slices(): SliceConfig<T>[] {\n return this._cachedSlices;\n }\n\n get staticSliceCount(): number {\n return (this.sliceConfigs || []).length;\n }\n\n get staticSlicesForMenu(): Array<{ key: string; title: string }> {\n return (this.sliceConfigs || [])\n .filter((s) => !!s.columnKey)\n .map((s) => ({ key: s.columnKey!, title: s.title || s.columnKey! }));\n }\n\n get activeDynamicSliceColumns(): SliceColumnDef<T>[] {\n return this._dynamicSlices\n .map((d) => (this.columns || []).find((c) => c.key === d.key))\n .filter((c): c is SliceColumnDef<T> => !!c);\n }\n\n get availableColumnsForDynamicSlice(): SliceColumnDef<T>[] {\n const dynamicKeys = new Set(this._dynamicSlices.map((d) => d.key));\n const staticKeys = new Set(\n (this.sliceConfigs || []).map((s) => s.columnKey).filter((k): k is string => !!k)\n );\n const existingKeys = new Set([...dynamicKeys, ...staticKeys]);\n const seen = new Set<string>();\n return (this.columns || []).filter((c) => {\n if (existingKeys.has(c.key) || seen.has(c.key)) return false;\n seen.add(c.key);\n return true;\n });\n }\n\n isSliceCollapsed(sliceIndex: number): boolean {\n if (this._cachedSlices.length === 1) {\n return this._expandedSlices.has(-1 - sliceIndex);\n }\n return !this._expandedSlices.has(sliceIndex);\n }\n\n toggleSliceCollapse(sliceIndex: number): void {\n if (this.slices.length === 1) {\n const closedKey = -1 - sliceIndex;\n if (this._expandedSlices.has(closedKey)) {\n this._expandedSlices.delete(closedKey);\n } else {\n this._expandedSlices.add(closedKey);\n this._scrollSliceTitleIntoView(sliceIndex);\n }\n } else {\n if (this._expandedSlices.has(sliceIndex)) {\n this._expandedSlices.delete(sliceIndex);\n } else {\n this._expandedSlices.clear();\n this._expandedSlices.add(sliceIndex);\n this._scrollSliceTitleIntoView(sliceIndex);\n }\n }\n this._cdr.markForCheck();\n }\n\n togglePanel(): void {\n this.isCollapsed = !this.isCollapsed;\n this.collapsedChange.emit(this.isCollapsed);\n this._cdr.markForCheck();\n }\n\n isSliceDynamic(sliceIndex: number): boolean {\n return sliceIndex >= this.staticSliceCount;\n }\n\n isSliceLoading(sliceIndex: number): boolean {\n const staticSlice = (this.sliceConfigs || [])[sliceIndex];\n if (staticSlice?.columnKey) {\n const colDef = (this.columns || []).find(c => c.key === staticSlice.columnKey);\n if (colDef?.lazy) {\n const status = this.lazyStatus.get(staticSlice.columnKey!) ?? 'idle';\n return status === 'loading' || status === 'idle';\n }\n return false;\n }\n const key = this._getDynamicSliceColumnKey(sliceIndex);\n if (!key) return false;\n const colDef = (this.columns || []).find(c => c.key === key);\n if (!colDef?.lazy) return false;\n const status = this.lazyStatus.get(key) ?? 'idle';\n return status === 'loading' || status === 'idle';\n }\n\n isStaticSliceVisible(_columnKey: string): boolean {\n return true;\n }\n\n getSliceIcon(slice: SliceConfig<T>): string | undefined {\n if (slice.icon) return slice.icon;\n if (slice.columnKey) {\n return (this.columns || []).find(c => c.key === slice.columnKey)?.icon;\n }\n return undefined;\n }\n\n isSliceCategoryActive(sliceIndex: number, categoryKey: string): boolean {\n return this.activeKeysBySlice.get(sliceIndex)?.has(categoryKey) ?? false;\n }\n\n isSliceAllActive(sliceIndex: number): boolean {\n return !this.activeKeysBySlice.has(sliceIndex) || this.activeKeysBySlice.get(sliceIndex)!.size === 0;\n }\n\n sliceCategoryCount(sliceIndex: number, categoryKey: string): number {\n const cacheKey = `${sliceIndex}:${categoryKey}`;\n if (this._countCache.has(cacheKey)) {\n return this._countCache.get(cacheKey)!;\n }\n const slice = this._cachedSlices[sliceIndex];\n if (!slice) return 0;\n const category = (slice.categories || []).find((c) => c.key === categoryKey);\n const count = category ? (this.data || []).filter((row) => category.filter ? category.filter(row) : true).length : 0;\n this._countCache.set(cacheKey, count);\n return count;\n }\n\n isSliceEmpty(sliceIndex: number): boolean {\n const slice = this._cachedSlices[sliceIndex];\n if (!slice) return true;\n return (slice.categories || []).every(c => this.sliceCategoryCount(sliceIndex, c.key) === 0);\n }\n\n onSliceCategorySelected(sliceIndex: number, categoryKey: string): void {\n const slice = this.slices[sliceIndex];\n if (!slice) return;\n if (!this.activeKeysBySlice.has(sliceIndex)) {\n this.activeKeysBySlice.set(sliceIndex, new Set());\n }\n const activeKeys = this.activeKeysBySlice.get(sliceIndex)!;\n if (slice.multiSelect === false) {\n if (activeKeys.has(categoryKey)) {\n activeKeys.clear();\n } else {\n activeKeys.clear();\n activeKeys.add(categoryKey);\n }\n } else {\n if (activeKeys.has(categoryKey)) {\n activeKeys.delete(categoryKey);\n } else {\n activeKeys.add(categoryKey);\n }\n }\n this._emitFilter();\n this._cdr.markForCheck();\n }\n\n onSliceAllSelected(sliceIndex: number): void {\n if (this.activeKeysBySlice.has(sliceIndex)) {\n this.activeKeysBySlice.get(sliceIndex)!.clear();\n }\n this._emitFilter();\n this._cdr.markForCheck();\n }\n\n getActiveFilters(): SlicePanelFilters {\n const result: SlicePanelFilters = {};\n this._cachedSlices.forEach((slice, idx) => {\n const keys = this.activeKeysBySlice.get(idx);\n result[this._getPersistentSliceKey(slice, idx)] = keys ? [...keys] : [];\n });\n return result;\n }\n\n restoreFilters(filters: SlicePanelFilters): void {\n this.activeKeysBySlice = new Map();\n this._cachedSlices.forEach((slice, index) => {\n // Les préférences historiques utilisaient l'index numérique comme clé.\n const keys = filters[this._getPersistentSliceKey(slice, index)] ?? filters[String(index)];\n if (keys?.length) this.activeKeysBySlice.set(index, new Set(keys));\n });\n this._emitFilter();\n this._cdr.markForCheck();\n }\n\n addDynamicSlice(column: SliceColumnDef<T>): void {\n if (this._dynamicSlices.some(slice => slice.key === column.key)) return;\n const distinctValues = this._computeDistinctValues(column.key);\n const newSlice: SliceConfig<T> = {\n title: column.header,\n columnKey: column.key,\n categories: distinctValues.map((v) => this._buildCategoryFromValue(column.key, v)),\n };\n this._dynamicSlices = [...this._dynamicSlices, { key: column.key, slice: newSlice }];\n this._rebuildCache();\n this.dynamicSliceKeysChange.emit(this._dynamicSlices.map(d => d.key));\n this._emitFilter();\n this._cdr.markForCheck();\n }\n\n removeDynamicSlice(sliceIndex: number): void {\n const dynamicIndex = sliceIndex - this.staticSliceCount;\n if (dynamicIndex < 0) return;\n const newActiveKeys = new Map<number, Set<string>>();\n this.activeKeysBySlice.forEach((keys, idx) => {\n if (idx < sliceIndex) newActiveKeys.set(idx, keys);\n else if (idx > sliceIndex) newActiveKeys.set(idx - 1, keys);\n });\n this.activeKeysBySlice = newActiveKeys;\n this._dynamicSlices = this._dynamicSlices.filter((_, i) => i !== dynamicIndex);\n this._rebuildCache();\n this.dynamicSliceKeysChange.emit(this._dynamicSlices.map(d => d.key));\n this._emitFilter();\n this._cdr.markForCheck();\n }\n\n removeDynamicSliceByKey(key: string): void {\n const dynamicIndex = this._dynamicSlices.findIndex((d) => d.key === key);\n if (dynamicIndex < 0) return;\n const sliceIndex = this.staticSliceCount + dynamicIndex;\n this.removeDynamicSlice(sliceIndex);\n }\n\n private _emitFilter(): void {\n const slices = this.slices;\n const activeKeysBySlice = this.activeKeysBySlice;\n\n this.activeKeysChange.emit(\n slices.map((_, i) => {\n const keys = activeKeysBySlice.get(i);\n return keys ? [...keys] : [];\n })\n );\n\n const pred = (row: T): boolean =>\n slices.every((slice, sliceIndex) => {\n const activeKeys = activeKeysBySlice.get(sliceIndex);\n if (!activeKeys || activeKeys.size === 0) return true;\n if (!slice.categories || slice.categories.length === 0) return true;\n return [...activeKeys].some((key) => {\n const category = (slice.categories || []).find((c) => c.key === key);\n if (!category) return false;\n if (!category?.filter) return true;\n return category.filter(row);\n });\n });\n this.filterChange.emit(pred);\n }\n\n private _getDynamicSliceColumnKey(sliceIndex: number): string | null {\n const dynamicIndex = sliceIndex - this.staticSliceCount;\n return this._dynamicSlices[dynamicIndex]?.key ?? null;\n }\n\n private _getPersistentSliceKey(slice: SliceConfig<T>, index: number): string {\n return slice.columnKey ? `column:${slice.columnKey}` : `index:${index}`;\n }\n\n private _getSliceIdentity(slice: SliceConfig<T>, fallbackIndex: number): string {\n if (slice.columnKey) return `column:${slice.columnKey}`;\n if (slice.title) return `title:${slice.title}`;\n const categoryKeys = (slice.categories || []).map((c) => c.key).join('|');\n return `index:${fallbackIndex}|categories:${categoryKeys}`;\n }\n\n private _materializeSlice(slice: SliceConfig<T>): SliceConfig<T> {\n if (!slice.columnKey || (slice.categories && slice.categories.length > 0)) {\n return slice;\n }\n const col = (this.columns || []).find(c => c.key === slice.columnKey);\n const isLazy = !!col?.lazy;\n if (isLazy && this.lazyStatus.get(slice.columnKey!) !== 'loaded') {\n return { ...slice, categories: [] };\n }\n if (slice.bucket) {\n const distinctValues = [...new Set((this.data || []).map(slice.bucket))].sort();\n return {\n ...slice,\n categories: distinctValues.map((v) => ({\n key: v, label: v,\n filter: (row: T) => slice.bucket!(row) === v,\n })),\n };\n }\n const distinctValues = this._computeDistinctValues(slice.columnKey!);\n return {\n ...slice,\n categories: distinctValues.map((v) => this._buildCategoryFromValue(slice.columnKey!, v)),\n };\n }\n\n private _buildCategoryFromValue(columnKey: string, v: string): { key: string; label: string; filter: (row: T) => boolean } {\n if (v === EMPTY_CATEGORY_KEY) {\n return {\n key: EMPTY_CATEGORY_KEY,\n label: EMPTY_CATEGORY_LABEL,\n filter: (row: T) => {\n const val = this._getLazyAwareValue(columnKey, row);\n return val == null || val === '';\n },\n };\n }\n return {\n key: v, label: v,\n filter: (row: T) => String(this._getLazyAwareValue(columnKey, row) ?? '') === v,\n };\n }\n\n private _computeDistinctValues(columnKey: string): string[] {\n const rawValues = (this.data || []).map((row) => {\n const val = this._getLazyAwareValue(columnKey, row);\n return val != null && val !== '' ? String(val) : null;\n });\n const distinct = [...new Set(rawValues.filter((v): v is string => v !== null))].sort();\n if (rawValues.some(v => v === null)) distinct.push(EMPTY_CATEGORY_KEY);\n return distinct;\n }\n\n private _getLazyAwareValue(columnKey: string, row: T): any {\n const colDef = (this.columns || []).find(c => c.key === columnKey);\n if (colDef?.lazy) {\n return this.lazyData.get(columnKey)?.get(row) ?? null;\n }\n if (colDef?.value) {\n return (colDef.value as any)(row, 0);\n }\n return (row as any)[columnKey];\n }\n\n private _rebuildCache(): void {\n const previousSlices = this._cachedSlices;\n const previousActiveKeys = this.activeKeysBySlice;\n const allSlices = [...(this.sliceConfigs || []), ...this._dynamicSlices.map((d) => d.slice)];\n this._cachedSlices = allSlices.map((slice) => this._materializeSlice(slice));\n\n const previousKeysByIdentity = new Map<string, Set<string>>();\n previousSlices.forEach((slice, index) => {\n const activeKeys = previousActiveKeys.get(index);\n if (!activeKeys || activeKeys.size === 0) return;\n previousKeysByIdentity.set(this._getSliceIdentity(slice, index), new Set(activeKeys));\n });\n\n const nextActiveKeys = new Map<number, Set<string>>();\n this._cachedSlices.forEach((slice, index) => {\n const previousKeys = previousKeysByIdentity.get(this._getSliceIdentity(slice, index));\n if (!previousKeys || previousKeys.size === 0) return;\n const availableKeys = new Set((slice.categories || []).map((c) => c.key));\n const matchingKeys = [...previousKeys].filter((key) => availableKeys.has(key));\n if (matchingKeys.length > 0) nextActiveKeys.set(index, new Set(matchingKeys));\n });\n this.activeKeysBySlice = nextActiveKeys;\n this._countCache.clear();\n }\n\n private _refreshDynamicSlices(): void {\n this._dynamicSlices = this._dynamicSlices.map(({ key, slice }) => {\n const distinctValues = this._computeDistinctValues(key);\n return {\n key,\n slice: {\n ...slice,\n categories: distinctValues.map((v) => this._buildCategoryFromValue(key, v)),\n },\n };\n });\n }\n\n private _scrollSliceTitleIntoView(sliceIndex: number): void {\n setTimeout(() => {\n const body = this.slicePanelBodyRef?.nativeElement;\n if (!body) return;\n const el = body.querySelector(`[data-slice-index=\"${sliceIndex}\"]`) as HTMLElement | null;\n el?.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }, 50);\n }\n}\n","<div class=\"slice-panel-wrapper\" [class.collapsed]=\"isCollapsed\">\n <aside class=\"slice-panel\" [class.collapsed]=\"isCollapsed\">\n <div class=\"slice-panel-header\">\n <span *ngIf=\"!isCollapsed\" class=\"slice-panel-title\">\n {{ i18n.filterPanelTitle(slices.length) }}\n </span>\n <button\n *ngIf=\"showToggle\"\n type=\"button\"\n class=\"slice-toggle\"\n [attr.aria-label]=\"isCollapsed ? i18n.expandFilterTitle : i18n.collapseFilterTitle\"\n (click)=\"togglePanel()\"\n >\n <mat-icon class=\"slice-toggle-mat-icon\">{{ isCollapsed ? 'filter_list' : 'filter_list_off' }}</mat-icon>\n </button>\n </div>\n\n <div class=\"slice-panel-body\" *ngIf=\"!isCollapsed\" #slicePanelBody>\n <ng-container *ngFor=\"let slice of slices; let si = index; trackBy: trackBySliceIndex\">\n <div class=\"slice-title-row\" [attr.data-slice-index]=\"si\" (click)=\"toggleSliceCollapse(si)\">\n <span class=\"slice-title-chevron\" [class.expanded]=\"!isSliceCollapsed(si)\">›</span>\n <mat-icon *ngIf=\"getSliceIcon(slice)\" class=\"slice-title-icon\">{{ getSliceIcon(slice) }}</mat-icon>\n <p class=\"slice-title\">{{ slice.title || i18n.filterBlockDefaultTitle }}</p>\n <button\n *ngIf=\"isSliceDynamic(si)\"\n type=\"button\"\n class=\"slice-remove-btn\"\n (click)=\"$event.stopPropagation(); removeDynamicSlice(si)\"\n >×</button>\n </div>\n\n <div class=\"slice-section-items\" *ngIf=\"!isSliceCollapsed(si)\">\n <ng-container *ngIf=\"isSliceLoading(si); else sliceContent\">\n <div class=\"slice-lazy-loading\">\n <span class=\"lazy-skeleton\"></span>\n <span class=\"lazy-skeleton\"></span>\n <span class=\"lazy-skeleton\"></span>\n </div>\n </ng-container>\n <ng-template #sliceContent>\n <ng-container *ngFor=\"let category of slice.categories; trackBy: trackByCategoryKey\">\n <button\n *ngIf=\"sliceCategoryCount(si, category.key) > 0\"\n class=\"slice-item\"\n type=\"button\"\n [class.active]=\"isSliceCategoryActive(si, category.key)\"\n [attr.data-category-key]=\"category.key\"\n [title]=\"category.label\"\n (click)=\"onSliceCategorySelected(si, category.key)\"\n >\n <span>{{ category.label }}</span>\n <span *ngIf=\"showCounts\">{{ sliceCategoryCount(si, category.key) }}</span>\n </button>\n </ng-container>\n <div *ngIf=\"isSliceEmpty(si)\" class=\"slice-empty-state\">{{ i18n.filterEmptyState }}</div>\n </ng-template>\n </div>\n\n <hr *ngIf=\"si < slices.length - 1\" class=\"slice-divider\" />\n </ng-container>\n </div>\n </aside>\n</div>\n","import { NgModule } from '@angular/core';\nimport { OrganizerButtonComponent } from './organizer-button.component';\nimport { SlicePanelComponent } from '../slice-panel/slice-panel.component';\n\n@NgModule({\n imports: [OrganizerButtonComponent, SlicePanelComponent],\n exports: [OrganizerButtonComponent, SlicePanelComponent]\n})\nexport class OrganizerButtonModule {}\n","export type MenuSection = 'fields' | 'champs' | 'groups' | 'slices' | 'templates' | 'custom';\n\nexport const DEFAULT_MENU_LABELS: { [key in MenuSection]: string } = {\n 'fields': 'Champs',\n 'champs': 'Champs',\n 'groups': 'Grouper par',\n 'slices': 'Filtrer par',\n 'templates': 'Template',\n 'custom': 'Options'\n};\n\nexport const DEFAULT_MENU_ICONS: { [key in MenuSection]: string } = {\n 'fields': 'visibility',\n 'champs': 'bar_chart',\n 'groups': 'category',\n 'slices': 'filter_list',\n 'templates': 'dashboard_customize',\n 'custom': 'settings'\n};\n","import { OrganizerChartItem, OrganizerChartSection } from './organizer-chart-adapter';\n\nexport interface OrganizerChartConfig {\n groups?: OrganizerChartSection;\n indicators?: OrganizerChartSection;\n filters?: OrganizerChartSection;\n templates?: any[]; // TODO: typer correctement les templates\n}\n\nexport enum SyntheticItemKeys {\n EMPTY = '__empty__',\n SYNTHETIC_MARKER = '__synthetic__'\n}\n\nexport enum SlicePanelI18nKeys {\n EXPAND_FILTER = 'expandFilterTitle',\n COLLAPSE_FILTER = 'collapseFilterTitle',\n FILTER_PANEL_TITLE_SINGLE = 'filterPanelTitleSingle',\n FILTER_PANEL_TITLE_PLURAL = 'filterPanelTitlePlural',\n FILTER_BLOCK_DEFAULT_TITLE = 'filterBlockDefaultTitle',\n FILTER_EMPTY_STATE = 'filterEmptyState'\n}\n\nexport enum OrganizerButtonEventType {\n FIELD_TOGGLED = 'fieldToggled',\n X_SELECTED = 'xSelected',\n Y_SELECTED = 'ySelected',\n GROUP_BY_SELECTED = 'groupBySelected',\n TEMPLATE_SELECTED = 'templateSelected',\n SLICE_SELECTED = 'sliceSelected',\n VIEW_SWITCHED = 'viewSwitched'\n}\n\nexport function getGroupItems(config: OrganizerChartConfig | null | undefined): OrganizerChartItem[] {\n return config?.groups?.items ?? [];\n}\n\nexport function getIndicatorItems(config: OrganizerChartConfig | null | undefined): OrganizerChartItem[] {\n return config?.indicators?.items ?? [];\n}\n\nexport function getFilterItems(config: OrganizerChartConfig | null | undefined): OrganizerChartItem[] {\n return config?.filters?.items ?? [];\n}\n\nexport function getStackItems(indicator: OrganizerChartItem | undefined): OrganizerChartItem[] {\n return indicator?.extra?.stacks?.items ?? [];\n}\n","import { OrganizerButtonEvent, OrganizerConfig, OrganizerState, OrganizerUnifiedState, OrganizerViewSlice, OrganizerXField } from './organizer-config.interface';\nimport { buildYFields, normalizeOrganizerState, resolveMatchingTemplateId, resolveYKey } from './organizer-utils';\nimport { UnitConfig } from '@oneteme/jquery-core';\nimport { OrganizerChartConfig, getGroupItems, getIndicatorItems, getFilterItems, getStackItems } from './organizer-chart-config';\n\nexport { OrganizerChartConfig, getGroupItems, getIndicatorItems, getFilterItems, getStackItems } from './organizer-chart-config';\n\nexport interface OrganizerChartItem {\n key: string;\n selected: boolean;\n menu: { label: string };\n unit?: string | UnitConfig;\n jquery?: {\n value: (s?: string) => string;\n buildAlias: (s?: string) => string;\n buildName?: (item: any, value?: string) => string;\n buildColor?: (value?: string) => string;\n };\n group?: string;\n extra?: {\n stacks?: { optional: boolean; items: OrganizerChartItem[] };\n [key: string]: any;\n };\n}\n\nexport interface OrganizerChartSection {\n optional: boolean;\n items: OrganizerChartItem[];\n}\n\nexport interface OrganizerChartBridgeOptions {\n onFetchSliceData?: OrganizerConfig['onFetchSliceData'];\n onExportVisual?: () => void;\n onExportData?: () => void;\n switchView?: OrganizerConfig['switchView'];\n}\n\nexport interface OrganizerChartBinding {\n config: OrganizerConfig;\n state: OrganizerState;\n}\n\nexport interface OrganizerChartEventResult {\n binding: OrganizerChartBinding;\n shouldRefetch: boolean;\n}\n\nexport function chartConfigToOrganizer(\n chartConfig: OrganizerChartConfig | null | undefined,\n options: OrganizerChartBridgeOptions = {}\n): OrganizerConfig {\n if (!chartConfig) {\n console.debug('[OrganizerChartAdapter] Empty chart config, returning empty organizer config');\n return {};\n }\n\n console.debug('[OrganizerChartAdapter] Converting chart config to organizer', {\n hasGroups: !!chartConfig.groups,\n indicatorCount: chartConfig.indicators?.items?.length ?? 0,\n filterCount: chartConfig.filters?.items?.length ?? 0\n });\n\n const { onFetchSliceData, onExportVisual, onExportData, switchView } = options;\n const indicators = getIndicatorItems(chartConfig);\n const activeIndicator = indicators.find(i => i.selected);\n\n const baseXFields: OrganizerXField[] = getGroupItems(chartConfig)\n .filter(g => !_isSynthetic(g))\n .map(g => ({ id: g.key, label: g.menu.label || g.key }));\n\n const yFields = buildYFields(\n indicators.map(i => ({ id: i.key, label: i.menu.label || i.key, group: i.group }))\n );\n\n const stackFields = getStackItems(activeIndicator)\n .filter((s: OrganizerChartItem) => !_isSynthetic(s))\n .map((s: OrganizerChartItem) => ({ id: s.key, label: s.menu.label || s.key }));\n\n const seenKeys = new Set<string>();\n const mergedGroupFields = [...baseXFields, ...stackFields].filter(f => {\n if (seenKeys.has(f.id)) return false;\n seenKeys.add(f.id);\n return true;\n });\n\n return {\n xFields: mergedGroupFields,\n yFields,\n groups: mergedGroupFields,\n slices: getFilterItems(chartConfig).map(f => ({ id: f.key, label: f.menu.label || f.key }) as OrganizerViewSlice),\n templates: chartConfig.templates,\n showReset: false,\n onFetchSliceData,\n showExport: !!(onExportVisual || onExportData),\n onExportVisual,\n onExportData,\n switchView,\n };\n}\n\nexport function chartConfigToState(chartConfig: OrganizerChartConfig | null | undefined): OrganizerState {\n if (!chartConfig) {\n console.debug('[OrganizerChartAdapter] Empty chart config for state conversion');\n return {};\n }\n\n const indicators = getIndicatorItems(chartConfig);\n const activeIndicator = indicators.find(i => i.selected);\n const activeStack = getStackItems(activeIndicator).find((s: OrganizerChartItem) => s.selected);\n const activeGroup = getGroupItems(chartConfig).find(g => g.selected);\n const activeSlices = getFilterItems(chartConfig).filter(f => f.selected);\n const indicatorGroup = activeIndicator?.group;\n\n console.debug('[OrganizerChartAdapter] Current chart state', {\n activeGroup: activeGroup?.key,\n activeIndicator: activeIndicator?.key,\n activeStack: activeStack?.key,\n sliceCount: activeSlices.length\n });\n\n const state = {\n selectedX: activeGroup?.key,\n selectedY: indicatorGroup ?? activeIndicator?.key,\n selectedYAggregate: indicatorGroup ? activeIndicator?.key : undefined,\n selectedGroupBy: activeStack?.key,\n selectedSlices: activeSlices.map(f => f.key),\n };\n const organizerConfig = chartConfigToOrganizer(chartConfig);\n return normalizeOrganizerState(state, organizerConfig);\n}\n\nexport function buildOrganizerChartBinding(\n chartConfig: OrganizerChartConfig | null | undefined,\n options: OrganizerChartBridgeOptions = {}\n): OrganizerChartBinding {\n return {\n config: chartConfigToOrganizer(chartConfig, options),\n state: chartConfigToState(chartConfig)\n };\n}\n\nexport function chartConfigToUnifiedState(\n chartConfig: OrganizerChartConfig | null | undefined,\n viewMode: 'chart' | 'table' = 'chart'\n): OrganizerUnifiedState {\n const state = chartConfigToState(chartConfig);\n return {\n viewMode,\n dimension: state.selectedX,\n metric: resolveYKey(state.selectedY, state.selectedYAggregate),\n metricAggregate: state.selectedYAggregate,\n breakdown: state.selectedGroupBy,\n filters: state.selectedSlices,\n };\n}\n\nexport function applyOrganizerEventToChart(\n event: OrganizerButtonEvent,\n chartConfig: OrganizerChartConfig | null | undefined\n): void {\n if (!chartConfig) {\n console.debug('[OrganizerChartAdapter] Cannot apply event to empty chart config');\n return;\n }\n\n console.debug('[OrganizerChartAdapter] Applying organizer event', { eventType: event.type, state: event.state });\n\n const state = event.state;\n _cleanSynthetics(chartConfig);\n if (state.selectedX !== undefined) _applyXSelection(state.selectedX, chartConfig);\n if (state.selectedY !== undefined) _applyYSelection(state.selectedY, state.selectedYAggregate, chartConfig);\n const effectiveGroupBy = state.selectedGroupBy !== state.selectedX ? state.selectedGroupBy : undefined;\n _applyGroupBySelection(effectiveGroupBy, chartConfig);\n if (state.selectedSlices !== undefined) _applySliceSelection(state.selectedSlices, chartConfig);\n event.resolvedYUnit = resolveYUnit(chartConfig, event.state.selectedY, event.state.selectedYAggregate);\n}\n\nexport function handleOrganizerChartEvent(\n event: OrganizerButtonEvent,\n chartConfig: OrganizerChartConfig | null | undefined,\n currentBinding: OrganizerChartBinding | undefined,\n options: OrganizerChartBridgeOptions = {}\n): OrganizerChartEventResult {\n console.debug('[OrganizerChartAdapter] Handling organizer event', { eventType: event.type });\n\n if (event.type === 'viewSwitched') {\n return {\n binding: {\n config: chartConfigToOrganizer(chartConfig, options),\n state: { ...event.state }\n },\n shouldRefetch: false\n };\n }\n\n applyOrganizerEventToChart(event, chartConfig);\n\n if (event.type === 'ySelected' || event.type === 'templateSelected') {\n return {\n binding: buildOrganizerChartBinding(chartConfig, options),\n shouldRefetch: true\n };\n }\n\n return {\n binding: {\n config: currentBinding?.config ?? chartConfigToOrganizer(chartConfig, options),\n state: event.state\n },\n shouldRefetch: event.type !== 'sliceSelected'\n };\n}\n\nexport function resolveYUnit(\n chartConfig: OrganizerChartConfig | null | undefined,\n selectedY: string | undefined,\n selectedYAggregate: string | undefined\n): string | UnitConfig | undefined {\n if (!chartConfig || !selectedY) return undefined;\n const actualKey = resolveYKey(selectedY, selectedYAggregate);\n return getIndicatorItems(chartConfig).find(i => i.key === actualKey)?.unit;\n}\n\nconst _syntheticItems = new WeakSet<OrganizerChartItem>();\n\nfunction _makeSynthetic(item: OrganizerChartItem): OrganizerChartItem {\n _syntheticItems.add(item);\n return item;\n}\n\nfunction _isSynthetic(item: OrganizerChartItem): boolean {\n return _syntheticItems.has(item);\n}\n\nfunction _cleanSynthetics(chartConfig: OrganizerChartConfig): void {\n if (chartConfig.groups?.items) {\n chartConfig.groups.items = chartConfig.groups.items.filter(g => !_isSynthetic(g));\n }\n if (chartConfig.indicators?.items) {\n chartConfig.indicators.items.forEach(ind => {\n if (ind.extra?.stacks?.items) {\n ind.extra.stacks.items = ind.extra.stacks.items.filter((s: OrganizerChartItem) => !_isSynthetic(s));\n }\n });\n }\n}\n\nfunction _applyXSelection(selectedX: string, chartConfig: OrganizerChartConfig): void {\n const groupItems = getGroupItems(chartConfig);\n const isGroupItem = groupItems.some(g => g.key === selectedX);\n if (isGroupItem) {\n groupItems.forEach(g => { g.selected = g.key === selectedX; });\n return;\n }\n const indicators = getIndicatorItems(chartConfig);\n const allStacks: OrganizerChartItem[] = indicators.flatMap(i => getStackItems(i));\n const stackItem = allStacks.find(s => s.key === selectedX);\n if (stackItem) {\n groupItems.forEach(g => { g.selected = false; });\n groupItems.push(_makeSynthetic({\n key: stackItem.key,\n selected: true,\n menu: stackItem.menu,\n jquery: stackItem.jquery\n ? { value: () => stackItem.jquery!.value(), buildAlias: () => stackItem.jquery!.buildAlias() }\n : undefined,\n }));\n }\n}\n\nfunction _applyYSelection(selectedY: string, selectedYAggregate: string | undefined, chartConfig: OrganizerChartConfig): void {\n const actualKey = resolveYKey(selectedY, selectedYAggregate);\n const indicators = getIndicatorItems(chartConfig);\n indicators.forEach(i => { i.selected = i.key === actualKey; });\n indicators.forEach(i => {\n getStackItems(i).forEach((s: OrganizerChartItem) => { s.selected = false; });\n });\n}\n\nfunction _applyGroupBySelection(effectiveGroupBy: string | undefined, chartConfig: OrganizerChartConfig): void {\n const activeIndicator = getIndicatorItems(chartConfig).find(i => i.selected);\n const stackItems: OrganizerChartItem[] = getStackItems(activeIndicator);\n if (effectiveGroupBy === undefined) {\n stackItems.forEach(s => { s.selected = false; });\n return;\n }\n const isStackItem = stackItems.some(s => s.key === effectiveGroupBy);\n if (isStackItem) {\n stackItems.forEach(s => { s.selected = s.key === effectiveGroupBy; });\n return;\n }\n const groupItem = getGroupItems(chartConfig).find(g => g.key === effectiveGroupBy);\n if (groupItem && activeIndicator) {\n stackItems.forEach(s => { s.selected = false; });\n if (!activeIndicator.extra) {\n activeIndicator.extra = { stacks: { optional: true, items: [] } };\n } else if (!activeIndicator.extra.stacks) {\n activeIndicator.extra.stacks = { optional: true, items: [] };\n }\n activeIndicator.extra.stacks.items.push(_makeSynthetic({\n key: groupItem.key,\n selected: true,\n menu: groupItem.menu,\n jquery: groupItem.jquery ? {\n value: () => groupItem.jquery!.value(),\n buildAlias: () => groupItem.jquery!.buildAlias(),\n buildName: (_item: any, value: string) => String(value),\n } : undefined,\n }));\n } else {\n stackItems.forEach(s => { s.selected = false; });\n }\n}\n\nfunction _applySliceSelection(selectedSlices: string[], chartConfig: OrganizerChartConfig): void {\n getFilterItems(chartConfig).forEach(f => { f.selected = selectedSlices.includes(f.key); });\n}\n\n","import { Subject } from 'rxjs';\nimport { OrganizerEvent, OrganizerState } from '@oneteme/jquery-core';\nimport { OrganizerFieldDef, OrganizerFieldsState, OrganizerGroupByState, OrganizerPanelConfig, OrganizerSliceByState } from './organizer-facade.types';\n\nexport function humanizeKey(key: string): string {\n return key\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/[_-]+/g, ' ')\n .replace(/^./, (v) => v.toUpperCase());\n}\n\nexport class OrganizerFacade<TField extends OrganizerFieldDef = OrganizerFieldDef> {\n\n readonly fields: OrganizerFieldsState<TField> = {\n activeFields: [],\n userCustomized: false,\n };\n\n readonly groupBy: OrganizerGroupByState = {\n activeKey: null,\n userCustomized: false,\n };\n\n readonly sliceBy: OrganizerSliceByState<TField> = {\n activeDynamicFields: [],\n availableForDynamic: [],\n allDynamicFields: [],\n activeLabel: 'Aucun',\n };\n\n private _panelConfig: OrganizerPanelConfig<TField> = { fields: [], sliceConfigs: [] };\n private _hiddenStaticKeys = new Set<string>();\n\n private readonly _events$ = new Subject<OrganizerEvent>();\n readonly events$ = this._events$.asObservable();\n\n get enabled(): boolean {\n return this._panelConfig.config?.enabled === true;\n }\n\n get showFields(): boolean {\n return this.enabled;\n }\n\n get showGroupBySection(): boolean {\n return this.enabled && this.groupByFields.length > 0;\n }\n\n get showSliceBySection(): boolean {\n return this.enabled && (\n (this._panelConfig.sliceConfigs?.length ?? 0) > 0 ||\n this.sliceBy.allDynamicFields.length > 0\n );\n }\n\n get allowFieldRemoval(): boolean {\n return this._panelConfig.config?.enableFieldRemoval !== false;\n }\n\n get isFieldDragDropEnabled(): boolean {\n return this._panelConfig.config?.enableFieldDragDrop === true;\n }\n\n get menuBaseFields(): TField[] {\n return this._uniqueByKey((this._panelConfig.fields || []).filter(c => !c.optional));\n }\n\n get menuOptionalFields(): TField[] {\n return this._uniqueByKey((this._panelConfig.fields || []).filter(c => c.optional));\n }\n\n get totalFieldCount(): number {\n return new Set((this._panelConfig.fields || []).map(c => c.key)).size;\n }\n\n get groupByFields(): TField[] {\n const seen = new Set<string>();\n return (this._panelConfig.fields || []).filter(c => {\n if (c.groupable === false || seen.has(c.key)) return false;\n if (!c.header && c.groupable !== true) return false;\n seen.add(c.key);\n return true;\n });\n }\n\n get activeGroupByLabel(): string {\n if (!this.groupBy.activeKey) return this._panelConfig.noneLabel ?? 'Aucun';\n const field = this.groupByFields.find(c => c.key === this.groupBy.activeKey);\n return field?.header || this.groupBy.activeKey;\n }\n\n get staticSlicesForMenu(): Array<{ key: string; title: string; icon?: string }> {\n return (this._panelConfig.sliceConfigs ?? [])\n .filter(s => !!s.columnKey)\n .map(s => {\n const fieldIcon = (this._panelConfig.fields ?? []).find(c => c.key === s.columnKey)?.icon;\n return { key: s.columnKey!, title: s.title || humanizeKey(s.columnKey!), icon: s.icon ?? fieldIcon };\n });\n }\n\n fieldLabel(field: { key: string; header?: string }): string {\n return field.header || humanizeKey(field.key);\n }\n\n update(panelConfig: OrganizerPanelConfig<TField>): void {\n this._panelConfig = panelConfig;\n this._refreshDefaultFields();\n this._refreshDynamicSliceMeta();\n if (!this.groupBy.userCustomized) {\n this.groupBy.activeKey = panelConfig.defaultGroupBy ?? null;\n }\n }\n\n setActiveFields(fields: TField[]): void {\n this.fields.activeFields = fields;\n this.fields.userCustomized = true;\n }\n\n setUserCustomized(value: boolean): void {\n this.fields.userCustomized = value;\n }\n\n resetToDefaults(): void {\n this.fields.userCustomized = false;\n this.groupBy.userCustomized = false;\n this._refreshDefaultFields();\n this.groupBy.activeKey = this._panelConfig.defaultGroupBy ?? null;\n this.sliceBy.activeDynamicFields = [];\n this._refreshDynamicSliceMeta();\n }\n\n addField(field: TField): void {\n const configFields = this._panelConfig.fields ?? [];\n const configIndex = configFields.findIndex(c => c.key === field.key);\n if (configIndex === -1) {\n this.fields.activeFields = [...this.fields.activeFields, field];\n } else {\n const insertBefore = this.fields.activeFields.findIndex(c => {\n const ci = configFields.findIndex(cc => cc.key === c.key);\n return ci !== -1 && ci > configIndex;\n });\n if (insertBefore === -1) {\n this.fields.activeFields = [...this.fields.activeFields, field];\n } else {\n const copy = [...this.fields.activeFields];\n copy.splice(insertBefore, 0, field);\n this.fields.activeFields = copy;\n }\n }\n this.fields.userCustomized = true;\n this._events$.next({ type: 'fieldsChanged', fieldIds: this.fields.activeFields.map(c => c.key) });\n }\n\n removeField(fieldKey: string): boolean {\n const field = this.fields.activeFields.find(c => c.key === fieldKey);\n if (!field) return false;\n if (!field.optional && !this.allowFieldRemoval) return false;\n if (this.fields.activeFields.length <= 1) return false;\n this.fields.activeFields = this.fields.activeFields.filter(c => c.key !== fieldKey);\n this.fields.userCustomized = true;\n this._events$.next({ type: 'fieldsChanged', fieldIds: this.fields.activeFields.map(c => c.key) });\n return true;\n }\n\n toggleFieldVisibility(field: TField, visible: boolean): void {\n const isVisible = this.isFieldVisible(field.key);\n if (visible && !isVisible) {\n this.addField(field);\n } else if (!visible && isVisible) {\n this.removeField(field.key);\n }\n }\n\n reorderFields(fromKey: string, toKey: string): boolean {\n const prev = this.fields.activeFields.findIndex(c => c.key === fromKey);\n const curr = this.fields.activeFields.findIndex(c => c.key === toKey);\n if (prev === -1 || curr === -1 || prev === curr) return false;\n const reordered = [...this.fields.activeFields];\n const [moved] = reordered.splice(prev, 1);\n reordered.splice(curr, 0, moved);\n this.fields.activeFields = reordered;\n this.fields.userCustomized = true;\n this._events$.next({ type: 'fieldsChanged', fieldIds: this.fields.activeFields.map(c => c.key) });\n return true;\n }\n\n isFieldVisible(key: string): boolean {\n return this.fields.activeFields.some(c => c.key === key);\n }\n\n setGroupBy(key: string | null): void {\n this.groupBy.activeKey = key;\n this.groupBy.userCustomized = true;\n this._events$.next({ type: 'groupByChanged', key });\n }\n\n onDynamicSliceKeysChange(keys: string[]): void {\n const allFields = this._panelConfig.fields ?? [];\n const staticKeys = new Set(\n (this._panelConfig.sliceConfigs ?? []).map(s => s.columnKey).filter((k): k is string => !!k)\n );\n const dynamicKeySet = new Set(keys);\n const existingKeys = new Set([...staticKeys, ...dynamicKeySet]);\n\n this.sliceBy.activeDynamicFields = keys\n .map(k => allFields.find(c => c.key === k))\n .filter((c): c is TField => !!c);\n\n const seen = new Set<string>();\n this.sliceBy.availableForDynamic = allFields.filter(c => {\n if (c.sliceable === false || existingKeys.has(c.key) || seen.has(c.key)) return false;\n seen.add(c.key);\n return true;\n });\n\n this._computeSliceLabel();\n this._events$.next({ type: 'dynamicSlicesChanged', keys });\n }\n\n isDynamicSliceActive(key: string): boolean {\n return this.sliceBy.activeDynamicFields.some(c => c.key === key);\n }\n\n toOrganizerState(): OrganizerState {\n return {\n selectedFieldIds: this.fields.activeFields.map(c => c.key),\n groupByKey: this.groupBy.activeKey,\n dynamicSliceKeys: this.sliceBy.activeDynamicFields.map(c => c.key),\n };\n }\n destroy(): void { this._events$.complete() }\n\n updateHiddenStaticKeys(keys: Set<string>): void {\n this._hiddenStaticKeys = keys;\n this._computeSliceLabel();\n }\n\n private _refreshDefaultFields(): void {\n const defaultFields = (this._panelConfig.fields || []).filter(c => !c.optional);\n if (!this.fields.userCustomized || this.fields.activeFields.length === 0) {\n this.fields.activeFields = [...defaultFields];\n } else {\n const allowedKeys = new Set((this._panelConfig.fields || []).map(c => c.key));\n this.fields.activeFields = this.fields.activeFields.filter(c => allowedKeys.has(c.key));\n }\n }\n\n private _refreshDynamicSliceMeta(): void {\n const allFields = this._panelConfig.fields ?? [];\n const staticKeys = new Set(\n (this._panelConfig.sliceConfigs ?? []).map(s => s.columnKey).filter((k): k is string => !!k)\n );\n const activeDynKeys = new Set(this.sliceBy.activeDynamicFields.map(c => c.key));\n\n const seen1 = new Set<string>();\n this.sliceBy.availableForDynamic = allFields.filter(c => {\n if (c.sliceable === false || staticKeys.has(c.key) || activeDynKeys.has(c.key) || seen1.has(c.key)) return false;\n if (!c.header && c.sliceable !== true) return false;\n seen1.add(c.key);\n return true;\n });\n\n const seen2 = new Set<string>();\n this.sliceBy.allDynamicFields = allFields.filter(c => {\n if (c.sliceable === false || staticKeys.has(c.key) || seen2.has(c.key)) return false;\n if (!c.header && c.sliceable !== true) return false;\n seen2.add(c.key);\n return true;\n });\n this._computeSliceLabel();\n }\n\n private _computeSliceLabel(): void {\n const visibleStatics = (this._panelConfig.sliceConfigs ?? []).filter(\n s => !s.columnKey || !this._hiddenStaticKeys.has(s.columnKey)\n );\n const total = visibleStatics.length + this.sliceBy.activeDynamicFields.length;\n if (total === 0) { this.sliceBy.activeLabel = this._panelConfig.noneLabel ?? 'Aucun'; return; }\n if (total === 1) {\n if (visibleStatics.length === 1) {\n const first = visibleStatics[0];\n this.sliceBy.activeLabel = first?.title || first?.columnKey || '1';\n return;\n }\n this.sliceBy.activeLabel = this.sliceBy.activeDynamicFields[0]?.header || '1';\n return;\n }\n this.sliceBy.activeLabel = `${total} actifs`;\n }\n\n private _uniqueByKey(fields: TField[]): TField[] {\n const seen = new Set<string>();\n return fields.filter(c => {\n if (seen.has(c.key)) return false;\n seen.add(c.key);\n return true;\n });\n }\n}\n","export class GroupByManager {\n private readonly _collapsedGroups = new Set<string>();\n private readonly _groupPages = new Map<string, number>();\n\n groupPageSize = 5;\n groupSortOrder: 'asc' | 'desc' = 'asc';\n\n private _defaultGroupCollapsed = false;\n\n constructor(\n private readonly onNeedProjection: () => void,\n private readonly onNeedRender: () => void,\n ) {}\n\n setDefaultCollapsed(collapsed: boolean): void {\n this._defaultGroupCollapsed = collapsed;\n }\n\n reset(): void {\n this._collapsedGroups.clear();\n this._groupPages.clear();\n }\n\n isGroupCollapsed(groupKey: string): boolean {\n return this._defaultGroupCollapsed\n ? !this._collapsedGroups.has(groupKey)\n : this._collapsedGroups.has(groupKey);\n }\n\n toggleGroupCollapse(groupKey: string, scrollTo: (key: string) => void): void {\n if (this._collapsedGroups.has(groupKey)) {\n this._collapsedGroups.delete(groupKey);\n } else {\n this._collapsedGroups.clear();\n this._collapsedGroups.add(groupKey);\n scrollTo(groupKey);\n }\n this.onNeedProjection();\n }\n\n getSingleOpenGroup(): string | null {\n return this._defaultGroupCollapsed && this._collapsedGroups.size === 1\n ? [...this._collapsedGroups][0]\n : null;\n }\n\n getPage(groupKey: string): number {\n return this._groupPages.get(groupKey) ?? 0;\n }\n\n groupPageBack(groupKey: string): void {\n const current = this._groupPages.get(groupKey) ?? 0;\n if (current > 0) {\n this._groupPages.set(groupKey, current - 1);\n this.onNeedProjection();\n }\n }\n\n groupPageForward(groupKey: string, totalCount: number): void {\n const maxPage = Math.ceil(totalCount / this.groupPageSize) - 1;\n const current = this._groupPages.get(groupKey) ?? 0;\n if (current < maxPage) {\n this._groupPages.set(groupKey, current + 1);\n this.onNeedProjection();\n }\n }\n\n onGroupPageSizeChange(size: number): void {\n this.groupPageSize = size;\n this._groupPages.clear();\n this.onNeedRender();\n }\n\n onGroupSortToggle(dir: 'asc' | 'desc', scrollTo: (key: string) => void): void {\n if (this.groupSortOrder === dir) return;\n this.groupSortOrder = dir;\n this._groupPages.clear();\n this.onNeedRender();\n const openGroup = this.getSingleOpenGroup();\n if (openGroup) scrollTo(openGroup);\n }\n}\n","import { Observable, Subject, take, takeUntil } from 'rxjs';\n\nexport interface LazyFieldDef {\n key: string;\n lazy?: {\n fetchFn: () => Observable<any[]>;\n };\n}\nexport interface LazyFieldCallbacks {\n onRefresh(): void;\n onMarkForCheck(): void;\n}\n\nexport const LAZY_FIELD_LOADING_VALUE = '__lazy_loading__';\nexport const LAZY_FIELD_ERROR_VALUE = '__lazy_error__';\n\nexport class LazyFieldManager<TField extends LazyFieldDef = LazyFieldDef> {\n\n private _status = new Map<string, 'idle' | 'loading' | 'loaded' | 'error'>();\n private _data = new Map<string, Map<any, any>>();\n private _cancels = new Map<string, Subject<void>>();\n\n get status(): Map<string, 'idle' | 'loading' | 'loaded' | 'error'> {\n return this._status;\n }\n\n get data(): Map<string, Map<any, any>> {\n return this._data;\n }\n\n getStatus(key: string): 'idle' | 'loading' | 'loaded' | 'error' {\n return this._status.get(key) ?? 'idle';\n }\n\n getRenderType(rowValue: any): 'loading' | 'error' | 'value' {\n if (rowValue === LAZY_FIELD_LOADING_VALUE) return 'loading';\n if (rowValue === LAZY_FIELD_ERROR_VALUE) return 'error';\n return 'value';\n }\n\n cancelAll(): void {\n this._cancels.forEach(s => { s.next(); s.complete(); });\n this._cancels.clear();\n this._status = new Map();\n this._data = new Map();\n }\n\n retry<TRow>(field: TField, resolvedData: TRow[], callbacks: LazyFieldCallbacks): void {\n const k = field.key;\n const prev = this._cancels.get(k);\n if (prev) { prev.next(); prev.complete(); }\n this._cancels.delete(k);\n\n const newStatus = new Map(this._status);\n newStatus.delete(k);\n this._status = newStatus;\n\n const newData = new Map(this._data);\n newData.delete(k);\n this._data = newData;\n\n this.fetch(field, resolvedData, callbacks);\n }\n\n fetch<TRow>(field: TField, resolvedData: TRow[], callbacks: LazyFieldCallbacks): void {\n if (!field.lazy) return;\n const k = field.key;\n if (this._status.get(k) === 'loading') return;\n\n const prev = this._cancels.get(k);\n if (prev) { prev.next(); prev.complete(); }\n const cancel$ = new Subject<void>();\n this._cancels.set(k, cancel$);\n\n const newStatus = new Map(this._status);\n newStatus.set(k, 'loading');\n this._status = newStatus;\n callbacks.onRefresh();\n\n field.lazy.fetchFn().pipe(\n take(1),\n takeUntil(cancel$),\n ).subscribe({\n next: (values: any[]) => {\n const rowMap = new Map<any, any>();\n values.forEach((value, i) => {\n if (i < resolvedData.length) rowMap.set(resolvedData[i], value);\n });\n const newData = new Map(this._data);\n newData.set(k, rowMap);\n this._data = newData;\n\n const newStatus2 = new Map(this._status);\n newStatus2.set(k, 'loaded');\n this._status = newStatus2;\n\n callbacks.onRefresh();\n callbacks.onMarkForCheck();\n },\n error: () => {\n const newStatusErr = new Map(this._status);\n newStatusErr.set(k, 'error');\n this._status = newStatusErr;\n\n callbacks.onRefresh();\n callbacks.onMarkForCheck();\n },\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["takeUntil"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { ElementRef, EventEmitter, OnChanges, OnInit, SimpleChanges } from '@angular/core';
2
2
  import { SliceColumnDef, SliceConfig } from './slice-panel.model';
3
3
  import * as i0 from "@angular/core";
4
+ export type SlicePanelFilters = Record<string, string[]>;
4
5
  export declare class SlicePanelComponent<T = any> implements OnChanges, OnInit {
5
6
  sliceConfigs: SliceConfig<T>[];
6
7
  columns: SliceColumnDef<T>[];
@@ -60,13 +61,14 @@ export declare class SlicePanelComponent<T = any> implements OnChanges, OnInit {
60
61
  isSliceEmpty(sliceIndex: number): boolean;
61
62
  onSliceCategorySelected(sliceIndex: number, categoryKey: string): void;
62
63
  onSliceAllSelected(sliceIndex: number): void;
63
- getActiveFilters(): Record<number, string[]>;
64
- restoreFilters(filters: Record<number, string[]>): void;
64
+ getActiveFilters(): SlicePanelFilters;
65
+ restoreFilters(filters: SlicePanelFilters): void;
65
66
  addDynamicSlice(column: SliceColumnDef<T>): void;
66
67
  removeDynamicSlice(sliceIndex: number): void;
67
68
  removeDynamicSliceByKey(key: string): void;
68
69
  private _emitFilter;
69
70
  private _getDynamicSliceColumnKey;
71
+ private _getPersistentSliceKey;
70
72
  private _getSliceIdentity;
71
73
  private _materializeSlice;
72
74
  private _buildCategoryFromValue;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oneteme/jquery-organizer",
3
- "version": "0.0.4",
3
+ "version": "0.0.5",
4
4
  "description": "Independent Organizer Button component library - decentralized organizer management for charts, tables",
5
5
  "homepage": "https://github.com/oneteme/jquery-charts",
6
6
  "bugs": "https://github.com/oneteme/jquery-charts/issues",
@@ -13,7 +13,7 @@
13
13
  "@angular/core": ">=16.1.0",
14
14
  "@angular/material": "^16.1.0",
15
15
  "@angular/cdk": "^16.1.0",
16
- "@oneteme/jquery-core": "^0.0.35"
16
+ "@oneteme/jquery-core": "^0.0.36"
17
17
  },
18
18
  "dependencies": {
19
19
  "tslib": "^2.3.0"