@porscheinformatik/clr-addons 18.1.9 → 18.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/clr-addons.module.d.ts +2 -1
  2. package/datagrid/datagrid-state-persistence/datagrid-state-persistence-model.interface.d.ts +1 -0
  3. package/datagrid/datagrid-state-persistence/state-persistence-key.directive.d.ts +12 -2
  4. package/datagrid/datagrid-state-persistence/state-persistence-options.interface.d.ts +1 -0
  5. package/esm2022/clr-addons.module.mjs +7 -3
  6. package/esm2022/datagrid/datagrid-state-persistence/datagrid-state-persistence-model.interface.mjs +1 -1
  7. package/esm2022/datagrid/datagrid-state-persistence/state-persistence-key.directive.mjs +67 -8
  8. package/esm2022/datagrid/datagrid-state-persistence/state-persistence-options.interface.mjs +1 -1
  9. package/esm2022/index.mjs +2 -1
  10. package/esm2022/numericfield/numeric-field.mjs +6 -98
  11. package/esm2022/readonly/index.mjs +8 -0
  12. package/esm2022/readonly/readonly.directive.mjs +149 -0
  13. package/esm2022/readonly/readonly.module.mjs +16 -0
  14. package/esm2022/util/index.mjs +2 -1
  15. package/esm2022/util/numeric.format.util.mjs +99 -0
  16. package/fesm2022/clr-addons.mjs +360 -128
  17. package/fesm2022/clr-addons.mjs.map +1 -1
  18. package/index.d.ts +1 -0
  19. package/numericfield/numeric-field.d.ts +0 -3
  20. package/package.json +1 -1
  21. package/readonly/index.d.ts +2 -0
  22. package/readonly/readonly.directive.d.ts +31 -0
  23. package/readonly/readonly.module.d.ts +7 -0
  24. package/styles/clr-addons-phs.css +14 -0
  25. package/styles/clr-addons-phs.css.map +1 -1
  26. package/styles/clr-addons-phs.min.css +1 -1
  27. package/styles/clr-addons-phs.min.css.map +1 -1
  28. package/util/index.d.ts +1 -0
  29. package/util/numeric.format.util.d.ts +2 -0
@@ -4,9 +4,9 @@ import * as i1 from '@angular/common';
4
4
  import { CommonModule, DOCUMENT, getLocaleDateFormat, FormatWidth } from '@angular/common';
5
5
  import { ClarityIcons, arrowIcon, angleIcon, timesIcon, trashIcon, plusCircleIcon, exclamationCircleIcon, searchIcon, ellipsisVerticalIcon, pencilIcon, historyIcon, treeViewIcon, organizationIcon, calendarIcon, checkCircleIcon, windowCloseIcon, exclamationTriangleIcon } from '@cds/core/icon';
6
6
  import * as i2 from '@clr/angular';
7
- import { ClarityModule, ClrFormsModule, ClrDropdown, ClrForm, ClrAlert, ClrAxis, ClrSide, ClrAlignment, ClrPopoverToggleService, ClrPopoverEventsService, ClrPopoverPositionService, ClrIconModule, ClrDropdownModule, ClrDatagridSortOrder, DatagridPropertyComparator, ClrDatagridPagination, ClrDatagridFilter, ClrDateContainer, ClrLabel, ClrControlHelper, ClrControlError, ClrControlSuccess, ClrDatepickerModule } from '@clr/angular';
7
+ import { ClarityModule, ClrFormsModule, ClrDropdown, ClrForm, ClrAlert, ClrAxis, ClrSide, ClrAlignment, ClrPopoverToggleService, ClrPopoverEventsService, ClrPopoverPositionService, ClrIconModule, ClrDropdownModule, ClrDatagridSortOrder, DatagridPropertyComparator, ClrDatagridPagination, ClrDatagridFilter, ClrDatagridColumn, ClrDateContainer, ClrLabel, ClrControlHelper, ClrControlError, ClrControlSuccess, ClrDatepickerModule } from '@clr/angular';
8
8
  import * as i3$1 from '@angular/forms';
9
- import { FormsModule, NG_VALIDATORS, NgControl, NG_VALUE_ACCESSOR, FormControl, ReactiveFormsModule } from '@angular/forms';
9
+ import { FormsModule, NG_VALIDATORS, NgControl, NG_VALUE_ACCESSOR, FormControl, ReactiveFormsModule, NgModel } from '@angular/forms';
10
10
  import { Subject, BehaviorSubject, timer, asyncScheduler, interval, takeUntil as takeUntil$1, of, ReplaySubject, delay } from 'rxjs';
11
11
  import { takeUntil, take, observeOn } from 'rxjs/operators';
12
12
  import * as i3 from '@angular/router';
@@ -2294,7 +2294,132 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImpor
2294
2294
  */
2295
2295
 
2296
2296
  /*
2297
- * Copyright (c) 2018-2022 Porsche Informatik. All Rights Reserved.
2297
+ * Copyright (c) 2018 Porsche Informatik. All Rights Reserved.
2298
+ * This software is released under MIT license.
2299
+ * The full license information can be found in LICENSE in the root directory of this project.
2300
+ */
2301
+ const entityMap = new Map([
2302
+ ['&', '&'],
2303
+ ['<', '&lt;'],
2304
+ ['>', '&gt;'],
2305
+ ['"', '&quot;'],
2306
+ ["'", '&#39;'],
2307
+ ['/', '&#x2F;'],
2308
+ ]);
2309
+ function escapeHtml(source) {
2310
+ return source.replace(/[&<>"'/]/g, s => entityMap.get(s));
2311
+ }
2312
+ function escapeRegex(s) {
2313
+ return String(s).replace(/[\\^$*+?.()|[\]{}]/g, '\\$&');
2314
+ }
2315
+
2316
+ const NEGATIVE$1 = '-';
2317
+ const NUMBERS$1 = new Set(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']);
2318
+ function formatNumber(value, finalFormatting, decimalSeparator, groupingSeparator, decimalPlaces, autofillDecimals) {
2319
+ let result = strip(value, finalFormatting, decimalSeparator, groupingSeparator, decimalPlaces);
2320
+ /* add grouping separator */
2321
+ const decimalIndex = result.indexOf(decimalSeparator);
2322
+ const isNegative = result[0] === NEGATIVE$1;
2323
+ let i = decimalIndex > -1 ? decimalIndex : result.length;
2324
+ while (i > (isNegative ? 4 : 3)) {
2325
+ i -= 3;
2326
+ result = result.substring(0, i) + groupingSeparator + result.substring(i, result.length);
2327
+ }
2328
+ if (finalFormatting) {
2329
+ if (decimalPlaces > 0 && !!result) {
2330
+ /* autofill decimal places */
2331
+ let actualDecimalIndex = result.indexOf(decimalSeparator);
2332
+ if (autofillDecimals) {
2333
+ if (actualDecimalIndex === -1) {
2334
+ actualDecimalIndex = result.length;
2335
+ result += decimalSeparator;
2336
+ }
2337
+ result = addMissingLeadingZero(result, actualDecimalIndex);
2338
+ actualDecimalIndex = result.indexOf(decimalSeparator);
2339
+ const actualDecimalPlaces = result.length - actualDecimalIndex - 1;
2340
+ for (let j = 0; j < decimalPlaces - actualDecimalPlaces; j++) {
2341
+ result += '0';
2342
+ }
2343
+ }
2344
+ else {
2345
+ result = addMissingLeadingZero(result, actualDecimalIndex);
2346
+ }
2347
+ }
2348
+ }
2349
+ return result;
2350
+ }
2351
+ function addMissingLeadingZero(result, actualDecimalIndex) {
2352
+ const isNegative = result[0] === NEGATIVE$1;
2353
+ /* autoadd a zero before decimal separator, when it's missing */
2354
+ if (actualDecimalIndex === 0) {
2355
+ result = '0' + result;
2356
+ }
2357
+ /* autoadd a zero before decimal separator, when it's missing, for negative values */
2358
+ if (actualDecimalIndex === 1 && isNegative) {
2359
+ result = result[0] + '0' + result.substring(1, result.length);
2360
+ }
2361
+ return result;
2362
+ }
2363
+ function strip(value, removeLeadingZeros = false, decimalSeparator, groupingSeparator, decimalPlaces) {
2364
+ const allowedKeys = new Set(NUMBERS$1);
2365
+ allowedKeys.add(NEGATIVE$1);
2366
+ allowedKeys.add(decimalSeparator);
2367
+ let result = '';
2368
+ let indexDecimalSep = -1;
2369
+ let j = -1;
2370
+ let ignoredChars = 0;
2371
+ for (const char of value) {
2372
+ j++;
2373
+ if (allowedKeys.has(char)) {
2374
+ if (char === decimalSeparator) {
2375
+ if (decimalPlaces === 0) {
2376
+ /* dismiss content after a decimal separator, when no places allowed */
2377
+ break;
2378
+ }
2379
+ else if (indexDecimalSep > -1) {
2380
+ /* ignore subsequent decimal separators */
2381
+ continue;
2382
+ }
2383
+ indexDecimalSep = j;
2384
+ }
2385
+ if (char === '0' && removeLeadingZeros) {
2386
+ /* remove leading zero only if it's not the only zero in the 'value' string */
2387
+ if ((result.length === 0 && j + 1 !== value.length) || result === NEGATIVE$1) {
2388
+ ignoredChars++;
2389
+ continue;
2390
+ }
2391
+ }
2392
+ if (char === NEGATIVE$1 && j > 0) {
2393
+ /* dismiss content after a negative sign not on first position */
2394
+ break;
2395
+ }
2396
+ if (indexDecimalSep > -1 && result.length + ignoredChars > indexDecimalSep + decimalPlaces) {
2397
+ /* dismiss content after maximum decimal places reached */
2398
+ break;
2399
+ }
2400
+ result += char;
2401
+ }
2402
+ else if (char === groupingSeparator) {
2403
+ if (indexDecimalSep === -1) {
2404
+ ignoredChars++;
2405
+ }
2406
+ }
2407
+ else {
2408
+ /* dismiss content after a invalid character */
2409
+ break;
2410
+ }
2411
+ }
2412
+ return result;
2413
+ }
2414
+
2415
+ /*
2416
+ * Copyright (c) 2018 Porsche Informatik. All Rights Reserved.
2417
+ * This software is released under MIT license.
2418
+ * The full license information can be found in LICENSE in the root directory of this project.
2419
+ */
2420
+
2421
+ /*
2422
+ * Copyright (c) 2018-2024 Porsche Informatik. All Rights Reserved.
2298
2423
  * This software is released under MIT license.
2299
2424
  * The full license information can be found in LICENSE in the root directory of this project.
2300
2425
  */
@@ -2429,114 +2554,21 @@ class ClrNumericField {
2429
2554
  this.injectUnitSymbol();
2430
2555
  }
2431
2556
  handleInputChanged() {
2432
- this.updateInput(this.formatNumber(this._numericValue.toString().replace(new RegExp('[.]', 'g'), this.decimalSeparator), true), true);
2557
+ this.updateInput(formatNumber(this._numericValue.toString().replace(new RegExp('[.]', 'g'), this.decimalSeparator), true, this.decimalSeparator, this.groupingSeparator, this.decimalPlaces, this.autofillDecimals), true);
2433
2558
  }
2434
2559
  formatInput(element, finalFormatting) {
2435
2560
  const cursorPos = element.selectionStart;
2436
2561
  const length = element.value.length;
2437
2562
  const setCursor = this.displayValue !== element.value;
2438
- this.updateInput(this.formatNumber(element.value, finalFormatting), false);
2563
+ this.updateInput(formatNumber(element.value, finalFormatting, this.decimalSeparator, this.groupingSeparator, this.decimalPlaces, this.autofillDecimals), false);
2439
2564
  if (setCursor) {
2440
2565
  element.selectionStart = element.selectionEnd = Math.max(cursorPos + element.value.length - length, 0);
2441
2566
  }
2442
2567
  }
2443
- formatNumber(value, finalFormatting) {
2444
- let result = this.strip(value, finalFormatting);
2445
- /* add grouping separator */
2446
- const decimalIndex = result.indexOf(this.decimalSeparator);
2447
- const isNegative = result[0] === NEGATIVE;
2448
- let i = decimalIndex > -1 ? decimalIndex : result.length;
2449
- while (i > (isNegative ? 4 : 3)) {
2450
- i -= 3;
2451
- result = result.substring(0, i) + this.groupingSeparator + result.substring(i, result.length);
2452
- }
2453
- if (finalFormatting) {
2454
- if (this.decimalPlaces > 0 && !!result) {
2455
- /* autofill decimal places */
2456
- let actualDecimalIndex = result.indexOf(this.decimalSeparator);
2457
- if (this.autofillDecimals) {
2458
- if (actualDecimalIndex === -1) {
2459
- actualDecimalIndex = result.length;
2460
- result += this.decimalSeparator;
2461
- }
2462
- result = this.addMissingLeadingZero(result, actualDecimalIndex);
2463
- actualDecimalIndex = result.indexOf(this.decimalSeparator);
2464
- const actualDecimalPlaces = result.length - actualDecimalIndex - 1;
2465
- for (let j = 0; j < this.decimalPlaces - actualDecimalPlaces; j++) {
2466
- result += '0';
2467
- }
2468
- }
2469
- else {
2470
- result = this.addMissingLeadingZero(result, actualDecimalIndex);
2471
- }
2472
- }
2473
- }
2474
- return result;
2475
- }
2476
- addMissingLeadingZero(result, actualDecimalIndex) {
2477
- const isNegative = result[0] === NEGATIVE;
2478
- /* autoadd a zero before decimal separator, when it's missing */
2479
- if (actualDecimalIndex === 0) {
2480
- result = '0' + result;
2481
- }
2482
- /* autoadd a zero before decimal separator, when it's missing, for negative values */
2483
- if (actualDecimalIndex === 1 && isNegative) {
2484
- result = result[0] + '0' + result.substring(1, result.length);
2485
- }
2486
- return result;
2487
- }
2488
- strip(value, removeLeadingZeros = false) {
2489
- let result = '';
2490
- let indexDecimalSep = -1;
2491
- let j = -1;
2492
- let ignoredChars = 0;
2493
- for (const char of value) {
2494
- j++;
2495
- if (this.allowedKeys.has(char)) {
2496
- if (char === this.decimalSeparator) {
2497
- if (this.decimalPlaces === 0) {
2498
- /* dismiss content after a decimal separator, when no places allowed */
2499
- break;
2500
- }
2501
- else if (indexDecimalSep > -1) {
2502
- /* ignore subsequent decimal separators */
2503
- continue;
2504
- }
2505
- indexDecimalSep = j;
2506
- }
2507
- if (char === '0' && removeLeadingZeros) {
2508
- /* remove leading zero only if it's not the only zero in the 'value' string */
2509
- if ((result.length === 0 && j + 1 !== value.length) || result === NEGATIVE) {
2510
- ignoredChars++;
2511
- continue;
2512
- }
2513
- }
2514
- if (char === NEGATIVE && j > 0) {
2515
- /* dismiss content after a negative sign not on first position */
2516
- break;
2517
- }
2518
- if (indexDecimalSep > -1 && result.length + ignoredChars > indexDecimalSep + this.decimalPlaces) {
2519
- /* dismiss content after maximum decimal places reached */
2520
- break;
2521
- }
2522
- result += char;
2523
- }
2524
- else if (char === this.groupingSeparator) {
2525
- if (indexDecimalSep === -1) {
2526
- ignoredChars++;
2527
- }
2528
- }
2529
- else {
2530
- /* dismiss content after a invalid character */
2531
- break;
2532
- }
2533
- }
2534
- return result;
2535
- }
2536
2568
  updateInput(value, updateAsync) {
2537
2569
  this.displayValue = value;
2538
2570
  this.inputEl.nativeElement.value = value;
2539
- this._numericValue = parseFloat(this.strip(value).replace(this.decimalSeparator, '.'));
2571
+ this._numericValue = parseFloat(strip(value, false, this.decimalSeparator, this.groupingSeparator, this.decimalPlaces).replace(this.decimalSeparator, '.'));
2540
2572
  if (this._numericValue !== this.roundOrTruncate(this.originalValue)) {
2541
2573
  this.originalValue = this._numericValue;
2542
2574
  if (updateAsync) {
@@ -5932,6 +5964,10 @@ class StatePersistenceKeyDirective {
5932
5964
  this.initFilter(volatileDataState);
5933
5965
  this.initSorting(localStorageState);
5934
5966
  this.initDatagridPersister();
5967
+ const columnWidthPersistenceEnabled = this.options.persistColumnWidths ?? false;
5968
+ if (columnWidthPersistenceEnabled) {
5969
+ this.initColumnWidths(localStorageState);
5970
+ }
5935
5971
  const paginationPersistenceEnabled = this.options.persistPagination ?? true;
5936
5972
  if (this.pagination?.page && paginationPersistenceEnabled) {
5937
5973
  this.initPageSizePersister(localStorageState);
@@ -5954,7 +5990,7 @@ class StatePersistenceKeyDirective {
5954
5990
  this.pagination.page.sizeChange.pipe(takeUntil(this.destroy$)).subscribe(pageSize => {
5955
5991
  const state = this.getLocalStorageState();
5956
5992
  state.pageSize = pageSize;
5957
- localStorage.setItem(this.options.key, JSON.stringify(state));
5993
+ this.saveLocalStorageState(state);
5958
5994
  });
5959
5995
  /* init page size of datagrid if already persisted in local storage */
5960
5996
  if (savedState.pageSize) {
@@ -6000,6 +6036,20 @@ class StatePersistenceKeyDirective {
6000
6036
  });
6001
6037
  }
6002
6038
  }
6039
+ initColumnWidths(savedState) {
6040
+ const columnWidthsByField = savedState?.columns
6041
+ ? Object.fromEntries(Object.entries(savedState.columns).map(([key, value]) => [key, value.width]))
6042
+ : undefined;
6043
+ if (this.gridColumns && this.gridColumnRefs && columnWidthsByField !== undefined) {
6044
+ for (let i = 0; i < this.gridColumns.length; i++) {
6045
+ const col = this.gridColumns.get(i);
6046
+ const el = this.gridColumnRefs.get(i)?.nativeElement;
6047
+ if ((col?.field && columnWidthsByField[col.field]) || el) {
6048
+ el.style.width = columnWidthsByField[col.field];
6049
+ }
6050
+ }
6051
+ }
6052
+ }
6003
6053
  initDatagridPersister() {
6004
6054
  // delay is needed, as onDestroy the filters emit empty values.
6005
6055
  // So delay it to the end of the current cycle, so the directive is also destroyed before it gets the next values
@@ -6015,6 +6065,9 @@ class StatePersistenceKeyDirective {
6015
6065
  persistFiltersAndCurrentPage(dgState) {
6016
6066
  const filterPersistenceEnabled = this.options.persistFilters ?? true;
6017
6067
  const paginationPersistenceEnabled = this.options.persistPagination ?? true;
6068
+ if (!filterPersistenceEnabled && !paginationPersistenceEnabled) {
6069
+ return;
6070
+ }
6018
6071
  const state = this.getVolatileDataState();
6019
6072
  state.columns = state.columns || {};
6020
6073
  if (paginationPersistenceEnabled) {
@@ -6030,7 +6083,7 @@ class StatePersistenceKeyDirective {
6030
6083
  }
6031
6084
  });
6032
6085
  }
6033
- (this.useLocalStoreOnly ? localStorage : sessionStorage).setItem(this.options.key, JSON.stringify(state));
6086
+ this.saveVolatileDataState(state);
6034
6087
  }
6035
6088
  persistSorting(dgState) {
6036
6089
  const sortPersistenceEnabled = this.options.persistSort ?? true;
@@ -6038,7 +6091,23 @@ class StatePersistenceKeyDirective {
6038
6091
  const state = this.getLocalStorageState();
6039
6092
  state.sortBy = this.getSortProperty(dgState.sort?.by);
6040
6093
  state.sortReverse = dgState.sort?.reverse;
6041
- localStorage.setItem(this.options.key, JSON.stringify(state));
6094
+ this.saveLocalStorageState(state);
6095
+ }
6096
+ }
6097
+ persistColumnWidths() {
6098
+ const columnWidthPersistenceEnabled = this.options?.persistColumnWidths ?? false;
6099
+ if (columnWidthPersistenceEnabled) {
6100
+ const state = this.getLocalStorageState();
6101
+ state.columns = state.columns || {};
6102
+ for (let i = 0; i < this.gridColumns.length; i++) {
6103
+ const col = this.gridColumns.get(i);
6104
+ const el = this.gridColumnRefs.get(i)?.nativeElement;
6105
+ if (el?.style?.width && el.style.width !== '0px' && col?.field) {
6106
+ state.columns[col.field] ||= {};
6107
+ state.columns[col.field].width = el.style.width;
6108
+ }
6109
+ }
6110
+ this.saveLocalStorageState(state);
6042
6111
  }
6043
6112
  }
6044
6113
  /**
@@ -6068,11 +6137,23 @@ class StatePersistenceKeyDirective {
6068
6137
  * Gets the state of volatile data. This can be influenced by clrUseLocalStoreOnly.
6069
6138
  */
6070
6139
  getVolatileDataState() {
6071
- return JSON.parse((this.useLocalStoreOnly ? localStorage : sessionStorage).getItem(this.options.key)) || {};
6140
+ return JSON.parse(this.getStorageBasedOnInputFlag().getItem(this.options.key)) || {};
6072
6141
  }
6073
6142
  getLocalStorageState() {
6074
6143
  return JSON.parse(localStorage.getItem(this.options.key)) || {};
6075
6144
  }
6145
+ /**
6146
+ * Save the state of volatile data. This can be influenced by clrUseLocalStoreOnly.
6147
+ */
6148
+ saveVolatileDataState(state) {
6149
+ this.getStorageBasedOnInputFlag().setItem(this.options.key, JSON.stringify(state));
6150
+ }
6151
+ saveLocalStorageState(state) {
6152
+ localStorage.setItem(this.options.key, JSON.stringify(state));
6153
+ }
6154
+ getStorageBasedOnInputFlag() {
6155
+ return this.useLocalStoreOnly ? localStorage : sessionStorage;
6156
+ }
6076
6157
  /**
6077
6158
  * As a date is serialized as string, but not deserialized as date
6078
6159
  * we need to add some meta information to do that manually later
@@ -6118,11 +6199,12 @@ class StatePersistenceKeyDirective {
6118
6199
  return undefined;
6119
6200
  }
6120
6201
  ngOnDestroy() {
6202
+ this.persistColumnWidths();
6121
6203
  this.destroy$.next();
6122
6204
  this.destroy$.complete();
6123
6205
  }
6124
6206
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: StatePersistenceKeyDirective, deps: [{ token: i2.ClrDatagrid }], target: i0.ɵɵFactoryTarget.Directive }); }
6125
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.5", type: StatePersistenceKeyDirective, selector: "[clrStatePersistenceKey]", inputs: { options: ["clrStatePersistenceKey", "options"], useLocalStoreOnly: ["clrUseLocalStoreOnly", "useLocalStoreOnly"], paginationDescription: ["clrPaginationDescription", "paginationDescription"] }, queries: [{ propertyName: "pagination", first: true, predicate: ClrDatagridPagination, descendants: true }, { propertyName: "paginationElem", first: true, predicate: ClrDatagridPagination, descendants: true, read: ElementRef }, { propertyName: "customFilters", predicate: ClrDatagridFilter, descendants: true }], ngImport: i0 }); }
6207
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.5", type: StatePersistenceKeyDirective, selector: "[clrStatePersistenceKey]", inputs: { options: ["clrStatePersistenceKey", "options"], useLocalStoreOnly: ["clrUseLocalStoreOnly", "useLocalStoreOnly"], paginationDescription: ["clrPaginationDescription", "paginationDescription"] }, host: { listeners: { "window:beforeunload": "persistColumnWidths()" } }, queries: [{ propertyName: "pagination", first: true, predicate: ClrDatagridPagination, descendants: true }, { propertyName: "paginationElem", first: true, predicate: ClrDatagridPagination, descendants: true, read: ElementRef }, { propertyName: "customFilters", predicate: ClrDatagridFilter, descendants: true }, { propertyName: "gridColumnRefs", predicate: ClrDatagridColumn, read: ElementRef }, { propertyName: "gridColumns", predicate: ClrDatagridColumn }], ngImport: i0 }); }
6126
6208
  }
6127
6209
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: StatePersistenceKeyDirective, decorators: [{
6128
6210
  type: Directive,
@@ -6147,6 +6229,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImpor
6147
6229
  }], customFilters: [{
6148
6230
  type: ContentChildren,
6149
6231
  args: [ClrDatagridFilter, { descendants: true }]
6232
+ }], gridColumnRefs: [{
6233
+ type: ContentChildren,
6234
+ args: [ClrDatagridColumn, { read: ElementRef }]
6235
+ }], gridColumns: [{
6236
+ type: ContentChildren,
6237
+ args: [ClrDatagridColumn]
6238
+ }], persistColumnWidths: [{
6239
+ type: HostListener,
6240
+ args: ['window:beforeunload']
6150
6241
  }] } });
6151
6242
 
6152
6243
  class ColumnHiddenStatePersistenceDirective {
@@ -8841,6 +8932,164 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImpor
8841
8932
  }]
8842
8933
  }] });
8843
8934
 
8935
+ class ClrReadonlyDirective {
8936
+ constructor(elementRef, renderer, injector) {
8937
+ this.elementRef = elementRef;
8938
+ this.renderer = renderer;
8939
+ this.injector = injector;
8940
+ this.isMultiSelect = false;
8941
+ this.unitPosition = 'right';
8942
+ this.property = null;
8943
+ this.clrReadOnly = true;
8944
+ this.unit = '';
8945
+ this.decimalPlaces = 2;
8946
+ this.roundValue = false;
8947
+ this.autofillDecimals = false;
8948
+ this.decimalSeparator = ',';
8949
+ this.groupingSeparator = '.';
8950
+ this.isInitialized = false;
8951
+ }
8952
+ ngOnInit() {
8953
+ const ngControl = this.injector.get(NgControl, null);
8954
+ if (this.clrReadOnly) {
8955
+ this.renderAsSpan(ngControl);
8956
+ }
8957
+ }
8958
+ ngOnChanges() {
8959
+ if (this.isInitialized) {
8960
+ const ngControl = this.injector.get(NgControl, null);
8961
+ if (this.clrReadOnly) {
8962
+ this.renderAsSpan(ngControl);
8963
+ }
8964
+ else {
8965
+ this.resetReadonly();
8966
+ }
8967
+ }
8968
+ }
8969
+ ngAfterViewInit() {
8970
+ this.isInitialized = true;
8971
+ }
8972
+ resetReadonly() {
8973
+ const parentElement = this.elementRef.nativeElement.parentElement;
8974
+ this.renderer.removeClass(parentElement, 'clr-readonly-parent');
8975
+ const spanElement = this.elementRef.nativeElement.parentElement.querySelector('span.clr-readonly');
8976
+ if (spanElement != null) {
8977
+ this.renderer.removeChild(parentElement, spanElement);
8978
+ }
8979
+ }
8980
+ renderAsSpan(ngControl) {
8981
+ const parentElement = this.elementRef.nativeElement.parentElement;
8982
+ if (!parentElement) {
8983
+ return;
8984
+ }
8985
+ // Create a new span element to display the readonly value.
8986
+ const span = this.renderer.createElement('span');
8987
+ const formattedValue = this.formatControlValue(ngControl);
8988
+ const textNode = this.renderer.createText(formattedValue);
8989
+ // Add text and classes to the span element.
8990
+ this.renderer.appendChild(span, textNode);
8991
+ this.renderer.setAttribute(span, 'class', 'clr-readonly');
8992
+ this.renderer.addClass(parentElement, 'clr-readonly-parent');
8993
+ this.renderer.appendChild(parentElement, span);
8994
+ }
8995
+ determineControlType() {
8996
+ if (this.elementRef.nativeElement.attributes['clrnumeric']) {
8997
+ return 'numeric';
8998
+ }
8999
+ else if (this.elementRef.nativeElement.tagName.toLowerCase() === 'select') {
9000
+ return 'select';
9001
+ }
9002
+ else {
9003
+ return '';
9004
+ }
9005
+ }
9006
+ formatControlValue(ngControl) {
9007
+ const controlType = this.determineControlType();
9008
+ const controlValue = ngControl instanceof NgModel ? ngControl.model : ngControl.control?.value;
9009
+ if (controlValue == null || controlValue === '') {
9010
+ return '';
9011
+ }
9012
+ if (controlType === 'numeric') {
9013
+ return this.formatNumericValue(controlValue);
9014
+ }
9015
+ else if (this.isMultiSelect) {
9016
+ return this.formatMultiSelectValue(controlValue);
9017
+ }
9018
+ else if (controlType === 'select') {
9019
+ return this.formatListValue(controlValue);
9020
+ }
9021
+ return controlValue ?? '';
9022
+ }
9023
+ formatNumericValue(controlValue) {
9024
+ const result = formatNumber(controlValue + '', true, this.decimalSeparator, this.groupingSeparator, this.decimalPlaces, this.autofillDecimals);
9025
+ return this.unitPosition === 'left' ? `${this.unit} ${result}` : `${result} ${this.unit}`;
9026
+ }
9027
+ formatMultiSelectValue(controlValue) {
9028
+ return controlValue.map((item) => item[this.property]).join(', ');
9029
+ }
9030
+ formatListValue(controlValue) {
9031
+ const options = this.elementRef.nativeElement.querySelectorAll('option');
9032
+ const matchingOption = Array.from(options).find(option => option.value === controlValue);
9033
+ if (matchingOption) {
9034
+ return matchingOption.innerHTML;
9035
+ }
9036
+ else {
9037
+ return '';
9038
+ }
9039
+ }
9040
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: ClrReadonlyDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Directive }); }
9041
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.5", type: ClrReadonlyDirective, selector: "[clrReadonly]", inputs: { isMultiSelect: ["clrMulti", "isMultiSelect"], unitPosition: ["clrUnitPosition", "unitPosition"], property: ["clrReadOnlyProperty", "property"], clrReadOnly: ["clrReadonly", "clrReadOnly"], unit: ["clrUnit", "unit"], decimalPlaces: ["clrDecimalPlaces", "decimalPlaces"], roundValue: ["clrRoundDisplayValue", "roundValue"], autofillDecimals: ["clrAutofillDecimals", "autofillDecimals"], decimalSeparator: ["clrDecimalSep", "decimalSeparator"], groupingSeparator: ["clrGroupingSep", "groupingSeparator"] }, usesOnChanges: true, ngImport: i0 }); }
9042
+ }
9043
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: ClrReadonlyDirective, decorators: [{
9044
+ type: Directive,
9045
+ args: [{
9046
+ selector: '[clrReadonly]',
9047
+ }]
9048
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.Injector }], propDecorators: { isMultiSelect: [{
9049
+ type: Input,
9050
+ args: ['clrMulti']
9051
+ }], unitPosition: [{
9052
+ type: Input,
9053
+ args: ['clrUnitPosition']
9054
+ }], property: [{
9055
+ type: Input,
9056
+ args: ['clrReadOnlyProperty']
9057
+ }], clrReadOnly: [{
9058
+ type: Input,
9059
+ args: ['clrReadonly']
9060
+ }], unit: [{
9061
+ type: Input,
9062
+ args: ['clrUnit']
9063
+ }], decimalPlaces: [{
9064
+ type: Input,
9065
+ args: ['clrDecimalPlaces']
9066
+ }], roundValue: [{
9067
+ type: Input,
9068
+ args: ['clrRoundDisplayValue']
9069
+ }], autofillDecimals: [{
9070
+ type: Input,
9071
+ args: ['clrAutofillDecimals']
9072
+ }], decimalSeparator: [{
9073
+ type: Input,
9074
+ args: ['clrDecimalSep']
9075
+ }], groupingSeparator: [{
9076
+ type: Input,
9077
+ args: ['clrGroupingSep']
9078
+ }] } });
9079
+
9080
+ class ClrReadonlyDirectiveModule {
9081
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: ClrReadonlyDirectiveModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
9082
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.5", ngImport: i0, type: ClrReadonlyDirectiveModule, declarations: [ClrReadonlyDirective], exports: [ClrReadonlyDirective] }); }
9083
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: ClrReadonlyDirectiveModule }); }
9084
+ }
9085
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: ClrReadonlyDirectiveModule, decorators: [{
9086
+ type: NgModule,
9087
+ args: [{
9088
+ declarations: [ClrReadonlyDirective],
9089
+ exports: [ClrReadonlyDirective],
9090
+ }]
9091
+ }] });
9092
+
8844
9093
  /*
8845
9094
  * Copyright (c) 2018-2024 Porsche Informatik. All Rights Reserved.
8846
9095
  * This software is released under MIT license.
@@ -8880,7 +9129,8 @@ class ClrAddonsModule {
8880
9129
  ClrDateFilterModule,
8881
9130
  ClrDaterangepickerModule,
8882
9131
  ClrIfWarningModule,
8883
- ClrActionPanelModule] }); }
9132
+ ClrActionPanelModule,
9133
+ ClrReadonlyDirectiveModule] }); }
8884
9134
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: ClrAddonsModule, imports: [ClrViewEditSectionModule,
8885
9135
  ClrPagerModule,
8886
9136
  ClrDotPagerModule,
@@ -8913,7 +9163,8 @@ class ClrAddonsModule {
8913
9163
  ClrDateFilterModule,
8914
9164
  ClrDaterangepickerModule,
8915
9165
  ClrIfWarningModule,
8916
- ClrActionPanelModule] }); }
9166
+ ClrActionPanelModule,
9167
+ ClrReadonlyDirectiveModule] }); }
8917
9168
  }
8918
9169
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: ClrAddonsModule, decorators: [{
8919
9170
  type: NgModule,
@@ -8952,32 +9203,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImpor
8952
9203
  ClrDaterangepickerModule,
8953
9204
  ClrIfWarningModule,
8954
9205
  ClrActionPanelModule,
9206
+ ClrReadonlyDirectiveModule,
8955
9207
  ],
8956
9208
  }]
8957
9209
  }] });
8958
9210
 
8959
9211
  /*
8960
- * Copyright (c) 2018 Porsche Informatik. All Rights Reserved.
8961
- * This software is released under MIT license.
8962
- * The full license information can be found in LICENSE in the root directory of this project.
8963
- */
8964
- const entityMap = new Map([
8965
- ['&', '&amp;'],
8966
- ['<', '&lt;'],
8967
- ['>', '&gt;'],
8968
- ['"', '&quot;'],
8969
- ["'", '&#39;'],
8970
- ['/', '&#x2F;'],
8971
- ]);
8972
- function escapeHtml(source) {
8973
- return source.replace(/[&<>"'/]/g, s => entityMap.get(s));
8974
- }
8975
- function escapeRegex(s) {
8976
- return String(s).replace(/[\\^$*+?.()|[\]{}]/g, '\\$&');
8977
- }
8978
-
8979
- /*
8980
- * Copyright (c) 2018 Porsche Informatik. All Rights Reserved.
9212
+ * Copyright (c) 2018-2024 Porsche Informatik. All Rights Reserved.
8981
9213
  * This software is released under MIT license.
8982
9214
  * The full license information can be found in LICENSE in the root directory of this project.
8983
9215
  */
@@ -8992,5 +9224,5 @@ function escapeRegex(s) {
8992
9224
  * Generated bundle index. Do not edit.
8993
9225
  */
8994
9226
 
8995
- export { ACShape, AcceptanceDateShape, AcceptedBrands, AccessoriesShape, AccessoryPartsShape, AudiBrandShape, AwardWinnerPremiumShape, BIG_ENDIAN, BlocksGroupForwardShape, BrochureShape, BundleForwardShape, BusinessCustomersCommercialShape, BusinessCustomersPrivateShape, BusinessPartnerWithCar, CLR_BLANK_OPTION, CONTENT_PROVIDER, CalculatorForwardShape, CaliforniaServiceShape, CaliforniaSpecialistShape, CampaignOutdatedShape, CampaignShape, CarOffSite, CarOnSite, CarPickupServiceShape, CarWashShape, CertifiedRepairShape, CertifiedRetailerShape, ClrActionPanel, ClrActionPanelContainer, ClrActionPanelContainerContent, ClrActionPanelContainerFooter, ClrActionPanelModule, ClrActiveNotification, ClrAddonsIconShapes, ClrAddonsLabel, ClrAddonsModule, ClrAutocompleteOff, ClrAutocompleteOffModule, ClrBackButton, ClrBackButtonModule, ClrBrandAvatar, ClrBrandAvatarModule, ClrBreadcrumb, ClrBreadcrumbModule, ClrBreadcrumbService, ClrCollapseExpandSection, ClrCollapseExpandSectionModule, ClrContentPanel, ClrContentPanelContainer, ClrContentPanelContainerContent, ClrContentPanelContainerFooter, ClrContentPanelModule, ClrContentRef, ClrDataListPredefinedValidatorDirective, ClrDataListValidatorModule, ClrDataListValidators, ClrDatagridStatePersistenceModule, ClrDateFilterComponent, ClrDateFilterModule, ClrDateTimeContainer, ClrDateTimeModule, ClrDaterangeMaxValidator, ClrDaterangeMinValidator, ClrDaterangeOrderValidator, ClrDaterangeRequiredValidator, ClrDaterangepickerContainerComponent, ClrDaterangepickerDirective, ClrDaterangepickerModule, ClrDotPager, ClrDotPagerModule, ClrDropdownOverflowDirective, ClrDropdownOverflowModule, ClrEnumFilterComponent, ClrEnumFilterModule, ClrFlowBar, ClrFlowBarModule, ClrFormModule, ClrGenericQuickList, ClrGenericQuickListModule, ClrHistory, ClrHistoryModule, ClrHistoryPinned, ClrHistoryService, ClrIfDaterangeErrorDirective, ClrIfWarning, ClrIfWarningModule, ClrLetterAvatar, ClrLetterAvatarModule, ClrLocationBarModule, ClrMainNavGroup, ClrMainNavGroupItem, ClrMainNavGroupModule, ClrMaxNumeric, ClrMinNumeric, ClrMultilingualInput, ClrMultilingualInputValidators, ClrMultilingualModule, ClrMultilingualSelector, ClrMultilingualTextarea, ClrNotification, ClrNotificationModule, ClrNotificationRef, ClrNotificationService, ClrNumericField, ClrNumericFieldModule, ClrNumericFieldValidators, ClrPagedSearchResultList, ClrPagedSearchResultListModule, ClrPager, ClrPagerModule, ClrProgressSpinnerComponent, ClrProgressSpinnerModule, ClrQuickList, ClrQuickListModule, ClrRequiredAllMultilang, ClrRequiredOneMultilang, ClrSearchField, ClrSearchFieldModule, ClrTimeInput, ClrTreetable, ClrTreetableActionOverflow, ClrTreetableCell, ClrTreetableColumn, ClrTreetableModule, ClrTreetablePlaceholder, ClrTreetableRow, ClrViewEditSection, ClrViewEditSectionModule, ColumnHiddenStatePersistenceDirective, CompletedByDateShape, ConfiguratorCommercialShape, ConfiguratorPrivateShape, ConsumptionShape, ContactDealerShape, CupraBrandShape, CustomersCenterShape, DATE, DELIMITER_REGEX, DWABrandShape, DatagridFieldDirective, DayModel, DieselShape, DollarBillForwardShape, DollarBillPartialShape, DriversAssistanceShape, EfficiencyShape, ElectricCarsServiceShape, ElectricCarsShape, ElectricityShape, EmissionShape, EnergyShape, EngineShape, ExpressServiceShape, ExteriorShape, ExternalPartForwardShape, FindACarShape, FleetServiceCommercialShape, FleetServicePrivateShape, GasCarsServiceShape, GasShape, HISTORY_NOTIFICATION_URL_PROVIDER, HISTORY_PROVIDER, HistoryProvider, HybridShape, InternalPartForwardShape, InvoiceReadyShape, InvoiceShape, ItemsForwardShape, ItemsReceiveShape, LITTLE_ENDIAN, LITTLE_ENDIAN_REGEX, LoadingVolumeShape, LocateShape, LocationBarComponent, LocationBarContentProvider, LocationBarNode, MIDDLE_ENDIAN, MIDDLE_ENDIAN_REGEX, MONTH, NewCarCommercialShape, NewCarPrivateShape, NewCarUtilityVehicleShape, NightServiceShape, NodeId, OffersShape, OnCallDutyShape, OpenSatShape, PaintMaterialForwardShape, PaintMaterialShape, PaintShopShape, ParkingLocation, PartNonStockForwardShape, PartsForwardShape, PartsNonStockShape, PartsShape, PayloadShape, PerformanceShape, PetrolShape, PlusServiceShape, PopoverPositions, PorscheBrandShape, PowerShape, PowerTrainShape, PriceTypeSwitchShape, QualifiedWorkshopShape, RepeatRepairShape, ReturnDateShape, RoadsideAssistanceShape, RouteShape, SEPARATOR_TEXT_DEFAULT, SeatAirShape, SeatBrandShape, SeatShape, ServiceBellShape, ServiceShape, SizeShape, SkodaBrandShape, StatePersistenceKeyDirective, StockLocatorCommercialShape, StockLocatorPrivateShape, TRANSLATIONS, TaskAndAppointment, TaxiDealerShape, TextForward, TimeModel, TopcardShape, TouaregServiceShape, TransmissionAutomaticShape, TransmissionManualShape, TreetableCellRenderer, TreetableHeaderRenderer, TreetableMainRenderer, TreetableRowRenderer, USER_INPUT_REGEX, UsedCarCommercialShape, UsedCarPrivateShape, VWBrandShape, VWNBrandShape, VWShape, VehicleConversionShape, View360Shape, VinShape, VirtualRealityShape, VsfSearchShape, WCPShape, WheelToWheelShape, WindscreenWashShape, WrenchForward, YEAR, acceptanceDateIcon, accessoriesIcon, accessoryPartsIcon, airConditionerIcon, allIcons, audiBrandIcon, awardWinnerPremiumIcon, blocksGroupForwardIcon, brochureIcon, bundleForwardIcon, businessCustomersCommercialIcon, businessCustomersPrivateIcon, businessPartnerWithCarIcon, calculatorForwardIcon, californiaServiceIcon, californiaSpecialistIcon, campaignIcon, campaignOutdatedIcon, carOffSite, carOnSite, carPickupServiceIcon, carWashIcon, certifiedRepairIcon, certifiedRetailerIcon, clrIconSVG, completedByDateIcon, configuratorCommercialIcon, configuratorPrivateIcon, consumptionIcon, contactDealerIcon, cupraBrandIcon, customersCenterIcon, dieselIcon, dollarBillForwardIcon, dollarBillPartialIcon, driversAssistanceIcon, dwaBrandIcon, efficiencyIcon, electricCarsIcon, electricCarsServiceIcon, electricityIcon, emissionIcon, energyIcon, engineIcon, escapeHtml, escapeRegex, expressServiceIcon, exteriorIcon, externalPartForwardIcon, findACarIcon, fleetServiceCommercialIcon, fleetServicePrivateIcon, gasCarsServiceIcon, gasIcon, hybridIcon, internalPartForwardIcon, invoiceIcon, invoiceReadyIcon, itemsForwardIcon, itemsRecieveIcon, loadingVolumeIcon, locateIcon, newCarCommercialIcon, newCarPrivateIcon, newCarUtilityVehicleIcon, nightServiceIcon, offersIcon, onCallDutyIcon, openSatIcon, paintMaterialForwardIcon, paintMaterialIcon, paintShopIcon, parkingLocationIcon, partsForwardIcon, partsIcon, partsNonStockForwardIcon, partsNonStockIcon, payloadIcon, performanceIcon, petrolIcon, plusServiceIcon, porscheBrandIcon, powerIcon, powerTrainIcon, priceTypeSwitchIcon, qualifiedWorkshopIcon, repeatRepairIcon, returnDateIcon, roadsideAssistanceIcon, routeIcon, seatAirIcon, seatBrandIcon, seatIcon, serviceBellIcon, serviceIcon, sizeIcon, skodaBrandIcon, stockLocatorCommercialIcon, stockLocatorPrivateIcon, taskAndAppointmentIcon, taxiDealerIcon, textForwardIcon, topcardIcon, touaregServiceIcon, transmissionAutomaticIcon, transmissionManualIcon, usedCarCommercialIcon, usedCarPrivateIcon, vehicleConversionIcon, view360Icon, vinIcon, virtualRealityIcon, volkswagenIcon, vsfSearchIcon, vwBrandIcon, vwnBrandIcon, wcpIcon, wheelToWheelIcon, windscreenWashIcon, wrenchForwardIcon };
9227
+ export { ACShape, AcceptanceDateShape, AcceptedBrands, AccessoriesShape, AccessoryPartsShape, AudiBrandShape, AwardWinnerPremiumShape, BIG_ENDIAN, BlocksGroupForwardShape, BrochureShape, BundleForwardShape, BusinessCustomersCommercialShape, BusinessCustomersPrivateShape, BusinessPartnerWithCar, CLR_BLANK_OPTION, CONTENT_PROVIDER, CalculatorForwardShape, CaliforniaServiceShape, CaliforniaSpecialistShape, CampaignOutdatedShape, CampaignShape, CarOffSite, CarOnSite, CarPickupServiceShape, CarWashShape, CertifiedRepairShape, CertifiedRetailerShape, ClrActionPanel, ClrActionPanelContainer, ClrActionPanelContainerContent, ClrActionPanelContainerFooter, ClrActionPanelModule, ClrActiveNotification, ClrAddonsIconShapes, ClrAddonsLabel, ClrAddonsModule, ClrAutocompleteOff, ClrAutocompleteOffModule, ClrBackButton, ClrBackButtonModule, ClrBrandAvatar, ClrBrandAvatarModule, ClrBreadcrumb, ClrBreadcrumbModule, ClrBreadcrumbService, ClrCollapseExpandSection, ClrCollapseExpandSectionModule, ClrContentPanel, ClrContentPanelContainer, ClrContentPanelContainerContent, ClrContentPanelContainerFooter, ClrContentPanelModule, ClrContentRef, ClrDataListPredefinedValidatorDirective, ClrDataListValidatorModule, ClrDataListValidators, ClrDatagridStatePersistenceModule, ClrDateFilterComponent, ClrDateFilterModule, ClrDateTimeContainer, ClrDateTimeModule, ClrDaterangeMaxValidator, ClrDaterangeMinValidator, ClrDaterangeOrderValidator, ClrDaterangeRequiredValidator, ClrDaterangepickerContainerComponent, ClrDaterangepickerDirective, ClrDaterangepickerModule, ClrDotPager, ClrDotPagerModule, ClrDropdownOverflowDirective, ClrDropdownOverflowModule, ClrEnumFilterComponent, ClrEnumFilterModule, ClrFlowBar, ClrFlowBarModule, ClrFormModule, ClrGenericQuickList, ClrGenericQuickListModule, ClrHistory, ClrHistoryModule, ClrHistoryPinned, ClrHistoryService, ClrIfDaterangeErrorDirective, ClrIfWarning, ClrIfWarningModule, ClrLetterAvatar, ClrLetterAvatarModule, ClrLocationBarModule, ClrMainNavGroup, ClrMainNavGroupItem, ClrMainNavGroupModule, ClrMaxNumeric, ClrMinNumeric, ClrMultilingualInput, ClrMultilingualInputValidators, ClrMultilingualModule, ClrMultilingualSelector, ClrMultilingualTextarea, ClrNotification, ClrNotificationModule, ClrNotificationRef, ClrNotificationService, ClrNumericField, ClrNumericFieldModule, ClrNumericFieldValidators, ClrPagedSearchResultList, ClrPagedSearchResultListModule, ClrPager, ClrPagerModule, ClrProgressSpinnerComponent, ClrProgressSpinnerModule, ClrQuickList, ClrQuickListModule, ClrReadonlyDirective, ClrReadonlyDirectiveModule, ClrRequiredAllMultilang, ClrRequiredOneMultilang, ClrSearchField, ClrSearchFieldModule, ClrTimeInput, ClrTreetable, ClrTreetableActionOverflow, ClrTreetableCell, ClrTreetableColumn, ClrTreetableModule, ClrTreetablePlaceholder, ClrTreetableRow, ClrViewEditSection, ClrViewEditSectionModule, ColumnHiddenStatePersistenceDirective, CompletedByDateShape, ConfiguratorCommercialShape, ConfiguratorPrivateShape, ConsumptionShape, ContactDealerShape, CupraBrandShape, CustomersCenterShape, DATE, DELIMITER_REGEX, DWABrandShape, DatagridFieldDirective, DayModel, DieselShape, DollarBillForwardShape, DollarBillPartialShape, DriversAssistanceShape, EfficiencyShape, ElectricCarsServiceShape, ElectricCarsShape, ElectricityShape, EmissionShape, EnergyShape, EngineShape, ExpressServiceShape, ExteriorShape, ExternalPartForwardShape, FindACarShape, FleetServiceCommercialShape, FleetServicePrivateShape, GasCarsServiceShape, GasShape, HISTORY_NOTIFICATION_URL_PROVIDER, HISTORY_PROVIDER, HistoryProvider, HybridShape, InternalPartForwardShape, InvoiceReadyShape, InvoiceShape, ItemsForwardShape, ItemsReceiveShape, LITTLE_ENDIAN, LITTLE_ENDIAN_REGEX, LoadingVolumeShape, LocateShape, LocationBarComponent, LocationBarContentProvider, LocationBarNode, MIDDLE_ENDIAN, MIDDLE_ENDIAN_REGEX, MONTH, NewCarCommercialShape, NewCarPrivateShape, NewCarUtilityVehicleShape, NightServiceShape, NodeId, OffersShape, OnCallDutyShape, OpenSatShape, PaintMaterialForwardShape, PaintMaterialShape, PaintShopShape, ParkingLocation, PartNonStockForwardShape, PartsForwardShape, PartsNonStockShape, PartsShape, PayloadShape, PerformanceShape, PetrolShape, PlusServiceShape, PopoverPositions, PorscheBrandShape, PowerShape, PowerTrainShape, PriceTypeSwitchShape, QualifiedWorkshopShape, RepeatRepairShape, ReturnDateShape, RoadsideAssistanceShape, RouteShape, SEPARATOR_TEXT_DEFAULT, SeatAirShape, SeatBrandShape, SeatShape, ServiceBellShape, ServiceShape, SizeShape, SkodaBrandShape, StatePersistenceKeyDirective, StockLocatorCommercialShape, StockLocatorPrivateShape, TRANSLATIONS, TaskAndAppointment, TaxiDealerShape, TextForward, TimeModel, TopcardShape, TouaregServiceShape, TransmissionAutomaticShape, TransmissionManualShape, TreetableCellRenderer, TreetableHeaderRenderer, TreetableMainRenderer, TreetableRowRenderer, USER_INPUT_REGEX, UsedCarCommercialShape, UsedCarPrivateShape, VWBrandShape, VWNBrandShape, VWShape, VehicleConversionShape, View360Shape, VinShape, VirtualRealityShape, VsfSearchShape, WCPShape, WheelToWheelShape, WindscreenWashShape, WrenchForward, YEAR, acceptanceDateIcon, accessoriesIcon, accessoryPartsIcon, airConditionerIcon, allIcons, audiBrandIcon, awardWinnerPremiumIcon, blocksGroupForwardIcon, brochureIcon, bundleForwardIcon, businessCustomersCommercialIcon, businessCustomersPrivateIcon, businessPartnerWithCarIcon, calculatorForwardIcon, californiaServiceIcon, californiaSpecialistIcon, campaignIcon, campaignOutdatedIcon, carOffSite, carOnSite, carPickupServiceIcon, carWashIcon, certifiedRepairIcon, certifiedRetailerIcon, clrIconSVG, completedByDateIcon, configuratorCommercialIcon, configuratorPrivateIcon, consumptionIcon, contactDealerIcon, cupraBrandIcon, customersCenterIcon, dieselIcon, dollarBillForwardIcon, dollarBillPartialIcon, driversAssistanceIcon, dwaBrandIcon, efficiencyIcon, electricCarsIcon, electricCarsServiceIcon, electricityIcon, emissionIcon, energyIcon, engineIcon, escapeHtml, escapeRegex, expressServiceIcon, exteriorIcon, externalPartForwardIcon, findACarIcon, fleetServiceCommercialIcon, fleetServicePrivateIcon, formatNumber, gasCarsServiceIcon, gasIcon, hybridIcon, internalPartForwardIcon, invoiceIcon, invoiceReadyIcon, itemsForwardIcon, itemsRecieveIcon, loadingVolumeIcon, locateIcon, newCarCommercialIcon, newCarPrivateIcon, newCarUtilityVehicleIcon, nightServiceIcon, offersIcon, onCallDutyIcon, openSatIcon, paintMaterialForwardIcon, paintMaterialIcon, paintShopIcon, parkingLocationIcon, partsForwardIcon, partsIcon, partsNonStockForwardIcon, partsNonStockIcon, payloadIcon, performanceIcon, petrolIcon, plusServiceIcon, porscheBrandIcon, powerIcon, powerTrainIcon, priceTypeSwitchIcon, qualifiedWorkshopIcon, repeatRepairIcon, returnDateIcon, roadsideAssistanceIcon, routeIcon, seatAirIcon, seatBrandIcon, seatIcon, serviceBellIcon, serviceIcon, sizeIcon, skodaBrandIcon, stockLocatorCommercialIcon, stockLocatorPrivateIcon, strip, taskAndAppointmentIcon, taxiDealerIcon, textForwardIcon, topcardIcon, touaregServiceIcon, transmissionAutomaticIcon, transmissionManualIcon, usedCarCommercialIcon, usedCarPrivateIcon, vehicleConversionIcon, view360Icon, vinIcon, virtualRealityIcon, volkswagenIcon, vsfSearchIcon, vwBrandIcon, vwnBrandIcon, wcpIcon, wheelToWheelIcon, windscreenWashIcon, wrenchForwardIcon };
8996
9228
  //# sourceMappingURL=clr-addons.mjs.map