@stemy/ngx-utils 19.9.46 → 19.9.49

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.
@@ -8206,7 +8206,6 @@ class CalendarInputs {
8206
8206
  this.max = input(null);
8207
8207
  this.disabledDates = input([]);
8208
8208
  this.disabledDays = input([]);
8209
- this.disabled = model(false);
8210
8209
  this.strict = input(true);
8211
8210
  this.testId = input("calendar", {
8212
8211
  transform: value => String(value || "calendar")
@@ -8263,7 +8262,7 @@ class CalendarInputs {
8263
8262
  });
8264
8263
  }
8265
8264
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.22", ngImport: i0, type: CalendarInputs, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
8266
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.22", type: CalendarInputs, isStandalone: true, selector: "ng-component", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, disabledDates: { classPropertyName: "disabledDates", publicName: "disabledDates", isSignal: true, isRequired: false, transformFunction: null }, disabledDays: { classPropertyName: "disabledDays", publicName: "disabledDays", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, strict: { classPropertyName: "strict", publicName: "strict", isSignal: true, isRequired: false, transformFunction: null }, testId: { classPropertyName: "testId", publicName: "testId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", disabled: "disabledChange" }, ngImport: i0, template: ``, isInline: true }); }
8265
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.22", type: CalendarInputs, isStandalone: true, selector: "ng-component", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, disabledDates: { classPropertyName: "disabledDates", publicName: "disabledDates", isSignal: true, isRequired: false, transformFunction: null }, disabledDays: { classPropertyName: "disabledDays", publicName: "disabledDays", isSignal: true, isRequired: false, transformFunction: null }, strict: { classPropertyName: "strict", publicName: "strict", isSignal: true, isRequired: false, transformFunction: null }, testId: { classPropertyName: "testId", publicName: "testId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, ngImport: i0, template: ``, isInline: true }); }
8267
8266
  }
8268
8267
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.22", ngImport: i0, type: CalendarInputs, decorators: [{
8269
8268
  type: Component,
@@ -8456,23 +8455,43 @@ class CalendarComponent extends CalendarInputs {
8456
8455
  const val = this.validatedValue();
8457
8456
  untracked(() => {
8458
8457
  let referenceDate = null;
8459
- // 1. If a valid selection exists, use the latest date as the reference view anchor
8460
- if (Array.isArray(val) && val.length > 0) {
8461
- referenceDate = new Date(Math.max(...val.map(d => d.getTime())));
8462
- }
8463
- else if (val instanceof Date) {
8464
- referenceDate = val;
8458
+ const isMulti = this.isMultiSelect();
8459
+ if (isMulti) {
8460
+ // For multi-select, always initialize to the current month if not initialized yet.
8461
+ if (!this.isInitialized) {
8462
+ const today = new Date();
8463
+ const todayYear = today.getFullYear();
8464
+ const todayMonth = today.getMonth();
8465
+ // Check if today's month has at least one valid date, or if it is restricted.
8466
+ if (this.isMonthAvailable(todayYear, todayMonth)) {
8467
+ referenceDate = today;
8468
+ }
8469
+ else {
8470
+ const min = this.minDate();
8471
+ const max = this.maxDate();
8472
+ const disabledTimes = this.disabledTimestamps();
8473
+ const disabledDays = this.disabledDays();
8474
+ referenceDate = findClosestValidDate(today, min, max, disabledTimes, disabledDays);
8475
+ }
8476
+ }
8465
8477
  }
8466
- // 2. FALLBACK: If no selection exists, dynamically look up the first allowed calendar date
8467
- if (!referenceDate || isNaN(referenceDate.getTime())) {
8468
- const min = this.minDate();
8469
- const max = this.maxDate();
8470
- const disabledTimes = this.disabledTimestamps();
8471
- const disabledDays = this.disabledDays();
8472
- // Start searching from today
8473
- referenceDate = findClosestValidDate(new Date(), min, max, disabledTimes, disabledDays);
8478
+ else {
8479
+ // For single-select, align the view to the selected date or fall back to the closest valid date.
8480
+ if (val instanceof Date) {
8481
+ referenceDate = val;
8482
+ }
8483
+ else if (Array.isArray(val) && val.length > 0) {
8484
+ referenceDate = new Date(Math.max(...val.map(d => d.getTime())));
8485
+ }
8486
+ if (!referenceDate || isNaN(referenceDate.getTime())) {
8487
+ const min = this.minDate();
8488
+ const max = this.maxDate();
8489
+ const disabledTimes = this.disabledTimestamps();
8490
+ const disabledDays = this.disabledDays();
8491
+ referenceDate = findClosestValidDate(new Date(), min, max, disabledTimes, disabledDays);
8492
+ }
8474
8493
  }
8475
- // 3. Update the view tracking states cleanly
8494
+ // Update the view tracking states cleanly on initialization or when single-select value changes.
8476
8495
  if (referenceDate && !isNaN(referenceDate.getTime())) {
8477
8496
  this.currentMonth.set(referenceDate.getMonth());
8478
8497
  this.currentYear.set(referenceDate.getFullYear());
@@ -8625,6 +8644,13 @@ class CalendarComponent extends CalendarInputs {
8625
8644
  }
8626
8645
  this.value.set(Array.from(updatedSelectionMap.values()));
8627
8646
  }
8647
+ // Switch month/year if we chose a filler day
8648
+ const dragMonth = currentDrag.getMonth();
8649
+ const dragYear = currentDrag.getFullYear();
8650
+ if (dragMonth !== this.currentMonth() || dragYear !== this.currentYear()) {
8651
+ this.currentMonth.set(dragMonth);
8652
+ this.currentYear.set(dragYear);
8653
+ }
8628
8654
  }
8629
8655
  });
8630
8656
  this.isDragging.set(false);
@@ -8766,7 +8792,14 @@ class ChipsComponent {
8766
8792
  return true;
8767
8793
  }
8768
8794
  onBlur(ev) {
8769
- if (this.chipDropdown.isOpened)
8795
+ const relatedTarget = ev.relatedTarget;
8796
+ // If the focus is moving to an element inside the dropdown (like an option button),
8797
+ // we do not want to trigger the blur commit logic.
8798
+ const contentElement = this.chipDropdown?.contentElement;
8799
+ const insideDropdown = relatedTarget
8800
+ && contentElement instanceof HTMLElement
8801
+ && contentElement.contains(relatedTarget);
8802
+ if (insideDropdown)
8770
8803
  return;
8771
8804
  const input = ev.target;
8772
8805
  this.enterOption(input.value);
@@ -8856,13 +8889,13 @@ class ChipsComponent {
8856
8889
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.22", ngImport: i0, type: ChipsComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
8857
8890
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.22", type: ChipsComponent, isStandalone: false, selector: "chips", inputs: { testId: "testId", value: "value", multiple: "multiple", disabled: "disabled", type: "type", min: "min", max: "max", minLength: "minLength", maxLength: "maxLength", step: "step", placeholder: "placeholder", unique: "unique", strict: "strict", options: "options" }, outputs: { valueChange: "valueChange" }, providers: [
8858
8891
  { provide: NG_VALUE_ACCESSOR, useExisting: ChipsComponent, multi: true }
8859
- ], viewQueries: [{ propertyName: "chipDropdown", first: true, predicate: ["chipDropdown"], descendants: true }, { propertyName: "chipButtons", first: true, predicate: ["chipButtons"], descendants: true }, { propertyName: "chipInput", first: true, predicate: ["chipInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div dd\r\n attachTo=\"root\"\r\n [closeInside]=\"false\"\r\n [autoPlacement]=\"autoPlacement\"\r\n [ngClass]=\"{disabled: disabled}\" class=\"chips\" #chipDropdown=\"dropdown\">\r\n <input class=\"chips-input\"\r\n dropdownToggle\r\n [switch]=\"false\"\r\n [attr.data-testid]=\"testId + '-input'\"\r\n [type]=\"type == 'number' ? 'number': 'text'\"\r\n [min]=\"min\"\r\n [max]=\"max\"\r\n [step]=\"step\"\r\n [disabled]=\"disabled\"\r\n [placeholder]=\"valueOptions.length == 0 && placeholder | translate\"\r\n [ngStyle]=\"inputStyles\"\r\n (blur)=\"onBlur($event)\"\r\n (keyup)=\"onInput($event)\"\r\n #chipInput/>\r\n <div class=\"chips-buttons\" #chipButtons [ngClass]=\"{disabled: disabled}\" (resize)=\"onResize()\">\r\n <ng-container *ngFor=\"let item of valueOptions; let ix = index; trackBy:trackBy\">\r\n <a class=\"chips-button\" [ngClass]=\"'chips-' + statuses[ix]\" (dblclick)=\"removeItem($event, ix)\">\r\n @if (item.picture) {\r\n <img [src]=\"item.picture | safe:'url'\"\r\n class=\"chip-picture\"\r\n referrerpolicy=\"no-referrer\" [attr.alt]=\"item.label\">\r\n\r\n }\r\n <span class=\"chips-label\"\r\n [attr.data-testid]=\"testId + '-label-' + ix\">{{ item.label }} </span>\r\n <close-btn class=\"chips-remove\"\r\n [attr.data-testid]=\"testId + '-delete-' + ix\"\r\n (click)=\"removeItem($event, ix)\" *ngIf=\"!disabled\"></close-btn>\r\n </a>\r\n </ng-container>\r\n </div>\r\n @if (options) {\r\n <div class=\"chips-dropdown\" *dropdownContent>\r\n <button [ngClass]=\"option.classes\"\r\n [disabled]=\"option.disabled\"\r\n (click)=\"enterOption(option.value)\"\r\n *ngFor=\"let option of filteredOptions\">\r\n <div class=\"select-option\">\r\n @if (option?.picture) {\r\n <img [src]=\"option.picture | safe:'url'\"\r\n class=\"select-option-picture\"\r\n referrerpolicy=\"no-referrer\" [attr.alt]=\"option.label\">\r\n }\r\n <div class=\"select-option-label\">\r\n {{ option.label }}\r\n </div>\r\n </div>\r\n </button>\r\n </div>\r\n }\r\n</div>\r\n", styles: [".chips{--chips-border-size: var(--border-size, 1px);--chips-border-radius: var(--border-radius, 5px);--chips-top-border-radius: var(--chips-border-radius) var(--chips-border-radius) 0 0;--chips-bottom-border-radius: 0 0 var(--chips-border-radius) var(--chips-border-radius);--chips-bg-color: var(--bg-color, #ffffff);--chips-border-color: var(--border-color, #ced4da);--chips-highlight-color: var(--highlight-color, var(--primary-color, #888888));--chips-highlight-text-color: var(--highlight-text-color, #ffffff);--chips-text-color: var(--text-color, #151515);--chips-text-size: var(--text-size, 16px);--chips-padding-vertical: 6px;--chips-padding-horizontal: 12px;--chips-padding: var(--chips-padding-vertical) var(--chips-padding-horizontal);--chips-btn-padding: 12px;--chips-btn-gap: calc(var(--chips-btn-padding) / 2);--chips-btn-color: white;--chips-btn-valid-color: rgba(200, 255, 200, .7);--chips-btn-invalid-color: rgba(255, 200, 200, .7);position:relative;margin:5px 0;font-size:var(--chips-text-size);padding:var(--chips-padding);background:var(--chips-bg-color);color:var(--chips-text-color);border:var(--chips-border-size) solid var(--chips-border-color);border-radius:var(--chips-border-radius)}.chips *{box-sizing:border-box}.chips .chips-input{background:var(--chips-bg-color);padding:var(--chips-padding);font-size:var(--chips-text-size);outline:none;border:none;width:100%;-webkit-user-select:none;user-select:none;font-weight:400}.chips .chips-buttons{position:absolute;top:var(--chips-padding-vertical);left:var(--chips-padding-horizontal);max-width:calc(100% - var(--chips-padding-horizontal) * 2);display:flex;gap:5px;overflow:auto;border-radius:var(--chips-border-radius)}.chips .chips-button{background:var(--chipd-btn-color);color:var(--chips-text-color);border:var(--chips-border-size) solid rgba(0,0,0,.2);border-radius:var(--chips-border-radius);padding:var(--chips-padding-vertical) var(--chips-btn-gap) var(--chips-padding-vertical) var(--chips-btn-padding);-webkit-user-select:none;user-select:none;font-weight:400;outline:none;display:flex;gap:var(--chips-btn-gap);justify-content:center;align-items:center;line-height:1.2rem;text-decoration:none}.chips .chips-button.chips-valid{--chipd-btn-color: var(--chips-btn-valid-color) }.chips .chips-button.chips-invalid{--chipd-btn-color: var(--chips-btn-invalid-color) }.chips img.chip-picture{width:28px;height:28px;object-fit:cover}.chips .chips-label{max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chips.disabled{opacity:.75}.chips.disabled .chips-button{padding-right:var(--chips-btn-padding)}.chips-dropdown:not(:empty){position:relative;z-index:1;width:var(--toggle-width, 0);display:flex;flex-direction:column;margin:-3px 0;padding:0;list-style:none;border:var(--chips-border-size) solid var(--chips-border-color);background:var(--chips-bg-color);border-radius:var(--chips-bottom-border-radius);overflow:hidden}.chips-dropdown:not(:empty) *{box-sizing:border-box}.chips-dropdown:not(:empty) button{border:none;background:none;cursor:pointer;padding:6px 12px;-webkit-user-select:none;user-select:none;text-align:left}.chips-dropdown:not(:empty) button:hover,.chips-dropdown:not(:empty) button.active{background-color:var(--chips-highlight-color);color:var(--chips-highlight-text-color)}.chips-dropdown:not(:empty) button:hover a,.chips-dropdown:not(:empty) button.active a{color:var(--chips-highlight-text-color)}.chips-dropdown:not(:empty) .select-option{display:flex;gap:8px;align-items:center;justify-content:center}.chips-dropdown:not(:empty) .select-option .select-option-picture{width:32px;height:32px;object-fit:cover}.chips-dropdown:not(:empty) .select-option .select-option-label{flex:1}.dropdown-placement-top .chips-dropdown{border-radius:var(--chips-top-border-radius)}\n"], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: DropdownDirective, selector: "[dd],[drop-down]", inputs: ["closeInside", "attachTo", "boundary", "placement", "autoPlacement", "mobileViewUnder", "fixed", "keyboardHandler", "isDisabled"], outputs: ["onShown", "onHidden", "onKeyboard"], exportAs: ["dropdown"] }, { kind: "directive", type: DropdownContentDirective, selector: "[dropdownContent]", exportAs: ["dropdown-content"] }, { kind: "directive", type: DropdownToggleDirective, selector: "[dropdownToggle]", inputs: ["beforeOpen", "switch"], exportAs: ["dropdown-toggle"] }, { kind: "component", type: CloseBtnComponent, selector: "close-btn" }, { kind: "pipe", type: SafeHtmlPipe, name: "safe" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
8892
+ ], viewQueries: [{ propertyName: "chipDropdown", first: true, predicate: ["chipDropdown"], descendants: true }, { propertyName: "chipButtons", first: true, predicate: ["chipButtons"], descendants: true }, { propertyName: "chipInput", first: true, predicate: ["chipInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div dd attachTo=\"root\" [closeInside]=\"false\" [autoPlacement]=\"autoPlacement\" [ngClass]=\"{disabled: disabled}\"\r\n class=\"chips\" #chipDropdown=\"dropdown\">\r\n <input class=\"chips-input\" dropdownToggle [switch]=\"false\" [attr.data-testid]=\"testId + '-input'\"\r\n [type]=\"type == 'number' ? 'number': 'text'\" [min]=\"min\" [max]=\"max\" [step]=\"step\" [disabled]=\"disabled\"\r\n [placeholder]=\"valueOptions.length == 0 && placeholder | translate\" [ngStyle]=\"inputStyles\"\r\n (blur)=\"onBlur($event)\" (keyup)=\"onInput($event)\" #chipInput />\r\n <div class=\"chips-buttons\" #chipButtons [ngClass]=\"{disabled: disabled}\" (resize)=\"onResize()\">\r\n <ng-container *ngFor=\"let item of valueOptions; let ix = index; trackBy:trackBy\">\r\n <a class=\"chips-button\" [ngClass]=\"'chips-' + statuses[ix]\" (dblclick)=\"removeItem($event, ix)\">\r\n @if (item.picture) {\r\n <img [src]=\"item.picture | safe:'url'\" class=\"chip-picture\" referrerpolicy=\"no-referrer\"\r\n [attr.alt]=\"item.label\">\r\n\r\n }\r\n <span class=\"chips-label\" [attr.data-testid]=\"testId + '-label-' + ix\">{{ item.label }} </span>\r\n <close-btn class=\"chips-remove\" [attr.data-testid]=\"testId + '-delete-' + ix\"\r\n (click)=\"removeItem($event, ix)\" *ngIf=\"!disabled\"></close-btn>\r\n </a>\r\n </ng-container>\r\n </div>\r\n @if (options) {\r\n <div class=\"chips-dropdown\" *dropdownContent>\r\n <button [ngClass]=\"option.classes\" [disabled]=\"option.disabled\" (click)=\"enterOption(option.value)\"\r\n *ngFor=\"let option of filteredOptions\">\r\n <div class=\"select-option\">\r\n @if (option?.picture) {\r\n <img [src]=\"option.picture | safe:'url'\" class=\"select-option-picture\" referrerpolicy=\"no-referrer\"\r\n [attr.alt]=\"option.label\">\r\n }\r\n <div class=\"select-option-label\">\r\n {{ option.label }}\r\n </div>\r\n </div>\r\n </button>\r\n </div>\r\n }\r\n</div>", styles: [".chips{--chips-border-size: var(--border-size, 1px);--chips-border-radius: var(--border-radius, 5px);--chips-top-border-radius: var(--chips-border-radius) var(--chips-border-radius) 0 0;--chips-bottom-border-radius: 0 0 var(--chips-border-radius) var(--chips-border-radius);--chips-bg-color: var(--bg-color, #ffffff);--chips-border-color: var(--border-color, #ced4da);--chips-highlight-color: var(--highlight-color, var(--primary-color, #888888));--chips-highlight-text-color: var(--highlight-text-color, #ffffff);--chips-text-color: var(--text-color, #151515);--chips-text-size: var(--text-size, 16px);--chips-padding-vertical: 6px;--chips-padding-horizontal: 12px;--chips-padding: var(--chips-padding-vertical) var(--chips-padding-horizontal);--chips-btn-padding: 12px;--chips-btn-gap: calc(var(--chips-btn-padding) / 2);--chips-btn-color: white;--chips-btn-valid-color: rgba(200, 255, 200, .7);--chips-btn-invalid-color: rgba(255, 200, 200, .7);position:relative;margin:5px 0;font-size:var(--chips-text-size);padding:var(--chips-padding);background:var(--chips-bg-color);color:var(--chips-text-color);border:var(--chips-border-size) solid var(--chips-border-color);border-radius:var(--chips-border-radius)}.chips *{box-sizing:border-box}.chips .chips-input{background:var(--chips-bg-color);padding:var(--chips-padding);font-size:var(--chips-text-size);outline:none;border:none;width:100%;-webkit-user-select:none;user-select:none;font-weight:400}.chips .chips-buttons{position:absolute;top:var(--chips-padding-vertical);left:var(--chips-padding-horizontal);max-width:calc(100% - var(--chips-padding-horizontal) * 2);display:flex;gap:5px;overflow:auto;border-radius:var(--chips-border-radius)}.chips .chips-button{background:var(--chipd-btn-color);color:var(--chips-text-color);border:var(--chips-border-size) solid rgba(0,0,0,.2);border-radius:var(--chips-border-radius);padding:var(--chips-padding-vertical) var(--chips-btn-gap) var(--chips-padding-vertical) var(--chips-btn-padding);-webkit-user-select:none;user-select:none;font-weight:400;outline:none;display:flex;gap:var(--chips-btn-gap);justify-content:center;align-items:center;line-height:1.2rem;text-decoration:none}.chips .chips-button.chips-valid{--chipd-btn-color: var(--chips-btn-valid-color) }.chips .chips-button.chips-invalid{--chipd-btn-color: var(--chips-btn-invalid-color) }.chips img.chip-picture{width:28px;height:28px;object-fit:cover}.chips .chips-label{max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chips.disabled{opacity:.75}.chips.disabled .chips-button{padding-right:var(--chips-btn-padding)}.chips-dropdown:not(:empty){position:relative;z-index:1;width:var(--toggle-width, 0);display:flex;flex-direction:column;margin:-3px 0;padding:0;list-style:none;border:var(--chips-border-size) solid var(--chips-border-color);background:var(--chips-bg-color);border-radius:var(--chips-bottom-border-radius);overflow:hidden}.chips-dropdown:not(:empty) *{box-sizing:border-box}.chips-dropdown:not(:empty) button{border:none;background:none;cursor:pointer;padding:6px 12px;-webkit-user-select:none;user-select:none;text-align:left}.chips-dropdown:not(:empty) button:hover,.chips-dropdown:not(:empty) button.active{background-color:var(--chips-highlight-color);color:var(--chips-highlight-text-color)}.chips-dropdown:not(:empty) button:hover a,.chips-dropdown:not(:empty) button.active a{color:var(--chips-highlight-text-color)}.chips-dropdown:not(:empty) .select-option{display:flex;gap:8px;align-items:center;justify-content:center}.chips-dropdown:not(:empty) .select-option .select-option-picture{width:32px;height:32px;object-fit:cover}.chips-dropdown:not(:empty) .select-option .select-option-label{flex:1}.dropdown-placement-top .chips-dropdown{border-radius:var(--chips-top-border-radius)}\n"], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: DropdownDirective, selector: "[dd],[drop-down]", inputs: ["closeInside", "attachTo", "boundary", "placement", "autoPlacement", "mobileViewUnder", "fixed", "keyboardHandler", "isDisabled"], outputs: ["onShown", "onHidden", "onKeyboard"], exportAs: ["dropdown"] }, { kind: "directive", type: DropdownContentDirective, selector: "[dropdownContent]", exportAs: ["dropdown-content"] }, { kind: "directive", type: DropdownToggleDirective, selector: "[dropdownToggle]", inputs: ["beforeOpen", "switch"], exportAs: ["dropdown-toggle"] }, { kind: "component", type: CloseBtnComponent, selector: "close-btn" }, { kind: "pipe", type: SafeHtmlPipe, name: "safe" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
8860
8893
  }
8861
8894
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.22", ngImport: i0, type: ChipsComponent, decorators: [{
8862
8895
  type: Component,
8863
8896
  args: [{ standalone: false, encapsulation: ViewEncapsulation.None, selector: "chips", providers: [
8864
8897
  { provide: NG_VALUE_ACCESSOR, useExisting: ChipsComponent, multi: true }
8865
- ], template: "<div dd\r\n attachTo=\"root\"\r\n [closeInside]=\"false\"\r\n [autoPlacement]=\"autoPlacement\"\r\n [ngClass]=\"{disabled: disabled}\" class=\"chips\" #chipDropdown=\"dropdown\">\r\n <input class=\"chips-input\"\r\n dropdownToggle\r\n [switch]=\"false\"\r\n [attr.data-testid]=\"testId + '-input'\"\r\n [type]=\"type == 'number' ? 'number': 'text'\"\r\n [min]=\"min\"\r\n [max]=\"max\"\r\n [step]=\"step\"\r\n [disabled]=\"disabled\"\r\n [placeholder]=\"valueOptions.length == 0 && placeholder | translate\"\r\n [ngStyle]=\"inputStyles\"\r\n (blur)=\"onBlur($event)\"\r\n (keyup)=\"onInput($event)\"\r\n #chipInput/>\r\n <div class=\"chips-buttons\" #chipButtons [ngClass]=\"{disabled: disabled}\" (resize)=\"onResize()\">\r\n <ng-container *ngFor=\"let item of valueOptions; let ix = index; trackBy:trackBy\">\r\n <a class=\"chips-button\" [ngClass]=\"'chips-' + statuses[ix]\" (dblclick)=\"removeItem($event, ix)\">\r\n @if (item.picture) {\r\n <img [src]=\"item.picture | safe:'url'\"\r\n class=\"chip-picture\"\r\n referrerpolicy=\"no-referrer\" [attr.alt]=\"item.label\">\r\n\r\n }\r\n <span class=\"chips-label\"\r\n [attr.data-testid]=\"testId + '-label-' + ix\">{{ item.label }} </span>\r\n <close-btn class=\"chips-remove\"\r\n [attr.data-testid]=\"testId + '-delete-' + ix\"\r\n (click)=\"removeItem($event, ix)\" *ngIf=\"!disabled\"></close-btn>\r\n </a>\r\n </ng-container>\r\n </div>\r\n @if (options) {\r\n <div class=\"chips-dropdown\" *dropdownContent>\r\n <button [ngClass]=\"option.classes\"\r\n [disabled]=\"option.disabled\"\r\n (click)=\"enterOption(option.value)\"\r\n *ngFor=\"let option of filteredOptions\">\r\n <div class=\"select-option\">\r\n @if (option?.picture) {\r\n <img [src]=\"option.picture | safe:'url'\"\r\n class=\"select-option-picture\"\r\n referrerpolicy=\"no-referrer\" [attr.alt]=\"option.label\">\r\n }\r\n <div class=\"select-option-label\">\r\n {{ option.label }}\r\n </div>\r\n </div>\r\n </button>\r\n </div>\r\n }\r\n</div>\r\n", styles: [".chips{--chips-border-size: var(--border-size, 1px);--chips-border-radius: var(--border-radius, 5px);--chips-top-border-radius: var(--chips-border-radius) var(--chips-border-radius) 0 0;--chips-bottom-border-radius: 0 0 var(--chips-border-radius) var(--chips-border-radius);--chips-bg-color: var(--bg-color, #ffffff);--chips-border-color: var(--border-color, #ced4da);--chips-highlight-color: var(--highlight-color, var(--primary-color, #888888));--chips-highlight-text-color: var(--highlight-text-color, #ffffff);--chips-text-color: var(--text-color, #151515);--chips-text-size: var(--text-size, 16px);--chips-padding-vertical: 6px;--chips-padding-horizontal: 12px;--chips-padding: var(--chips-padding-vertical) var(--chips-padding-horizontal);--chips-btn-padding: 12px;--chips-btn-gap: calc(var(--chips-btn-padding) / 2);--chips-btn-color: white;--chips-btn-valid-color: rgba(200, 255, 200, .7);--chips-btn-invalid-color: rgba(255, 200, 200, .7);position:relative;margin:5px 0;font-size:var(--chips-text-size);padding:var(--chips-padding);background:var(--chips-bg-color);color:var(--chips-text-color);border:var(--chips-border-size) solid var(--chips-border-color);border-radius:var(--chips-border-radius)}.chips *{box-sizing:border-box}.chips .chips-input{background:var(--chips-bg-color);padding:var(--chips-padding);font-size:var(--chips-text-size);outline:none;border:none;width:100%;-webkit-user-select:none;user-select:none;font-weight:400}.chips .chips-buttons{position:absolute;top:var(--chips-padding-vertical);left:var(--chips-padding-horizontal);max-width:calc(100% - var(--chips-padding-horizontal) * 2);display:flex;gap:5px;overflow:auto;border-radius:var(--chips-border-radius)}.chips .chips-button{background:var(--chipd-btn-color);color:var(--chips-text-color);border:var(--chips-border-size) solid rgba(0,0,0,.2);border-radius:var(--chips-border-radius);padding:var(--chips-padding-vertical) var(--chips-btn-gap) var(--chips-padding-vertical) var(--chips-btn-padding);-webkit-user-select:none;user-select:none;font-weight:400;outline:none;display:flex;gap:var(--chips-btn-gap);justify-content:center;align-items:center;line-height:1.2rem;text-decoration:none}.chips .chips-button.chips-valid{--chipd-btn-color: var(--chips-btn-valid-color) }.chips .chips-button.chips-invalid{--chipd-btn-color: var(--chips-btn-invalid-color) }.chips img.chip-picture{width:28px;height:28px;object-fit:cover}.chips .chips-label{max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chips.disabled{opacity:.75}.chips.disabled .chips-button{padding-right:var(--chips-btn-padding)}.chips-dropdown:not(:empty){position:relative;z-index:1;width:var(--toggle-width, 0);display:flex;flex-direction:column;margin:-3px 0;padding:0;list-style:none;border:var(--chips-border-size) solid var(--chips-border-color);background:var(--chips-bg-color);border-radius:var(--chips-bottom-border-radius);overflow:hidden}.chips-dropdown:not(:empty) *{box-sizing:border-box}.chips-dropdown:not(:empty) button{border:none;background:none;cursor:pointer;padding:6px 12px;-webkit-user-select:none;user-select:none;text-align:left}.chips-dropdown:not(:empty) button:hover,.chips-dropdown:not(:empty) button.active{background-color:var(--chips-highlight-color);color:var(--chips-highlight-text-color)}.chips-dropdown:not(:empty) button:hover a,.chips-dropdown:not(:empty) button.active a{color:var(--chips-highlight-text-color)}.chips-dropdown:not(:empty) .select-option{display:flex;gap:8px;align-items:center;justify-content:center}.chips-dropdown:not(:empty) .select-option .select-option-picture{width:32px;height:32px;object-fit:cover}.chips-dropdown:not(:empty) .select-option .select-option-label{flex:1}.dropdown-placement-top .chips-dropdown{border-radius:var(--chips-top-border-radius)}\n"] }]
8898
+ ], template: "<div dd attachTo=\"root\" [closeInside]=\"false\" [autoPlacement]=\"autoPlacement\" [ngClass]=\"{disabled: disabled}\"\r\n class=\"chips\" #chipDropdown=\"dropdown\">\r\n <input class=\"chips-input\" dropdownToggle [switch]=\"false\" [attr.data-testid]=\"testId + '-input'\"\r\n [type]=\"type == 'number' ? 'number': 'text'\" [min]=\"min\" [max]=\"max\" [step]=\"step\" [disabled]=\"disabled\"\r\n [placeholder]=\"valueOptions.length == 0 && placeholder | translate\" [ngStyle]=\"inputStyles\"\r\n (blur)=\"onBlur($event)\" (keyup)=\"onInput($event)\" #chipInput />\r\n <div class=\"chips-buttons\" #chipButtons [ngClass]=\"{disabled: disabled}\" (resize)=\"onResize()\">\r\n <ng-container *ngFor=\"let item of valueOptions; let ix = index; trackBy:trackBy\">\r\n <a class=\"chips-button\" [ngClass]=\"'chips-' + statuses[ix]\" (dblclick)=\"removeItem($event, ix)\">\r\n @if (item.picture) {\r\n <img [src]=\"item.picture | safe:'url'\" class=\"chip-picture\" referrerpolicy=\"no-referrer\"\r\n [attr.alt]=\"item.label\">\r\n\r\n }\r\n <span class=\"chips-label\" [attr.data-testid]=\"testId + '-label-' + ix\">{{ item.label }} </span>\r\n <close-btn class=\"chips-remove\" [attr.data-testid]=\"testId + '-delete-' + ix\"\r\n (click)=\"removeItem($event, ix)\" *ngIf=\"!disabled\"></close-btn>\r\n </a>\r\n </ng-container>\r\n </div>\r\n @if (options) {\r\n <div class=\"chips-dropdown\" *dropdownContent>\r\n <button [ngClass]=\"option.classes\" [disabled]=\"option.disabled\" (click)=\"enterOption(option.value)\"\r\n *ngFor=\"let option of filteredOptions\">\r\n <div class=\"select-option\">\r\n @if (option?.picture) {\r\n <img [src]=\"option.picture | safe:'url'\" class=\"select-option-picture\" referrerpolicy=\"no-referrer\"\r\n [attr.alt]=\"option.label\">\r\n }\r\n <div class=\"select-option-label\">\r\n {{ option.label }}\r\n </div>\r\n </div>\r\n </button>\r\n </div>\r\n }\r\n</div>", styles: [".chips{--chips-border-size: var(--border-size, 1px);--chips-border-radius: var(--border-radius, 5px);--chips-top-border-radius: var(--chips-border-radius) var(--chips-border-radius) 0 0;--chips-bottom-border-radius: 0 0 var(--chips-border-radius) var(--chips-border-radius);--chips-bg-color: var(--bg-color, #ffffff);--chips-border-color: var(--border-color, #ced4da);--chips-highlight-color: var(--highlight-color, var(--primary-color, #888888));--chips-highlight-text-color: var(--highlight-text-color, #ffffff);--chips-text-color: var(--text-color, #151515);--chips-text-size: var(--text-size, 16px);--chips-padding-vertical: 6px;--chips-padding-horizontal: 12px;--chips-padding: var(--chips-padding-vertical) var(--chips-padding-horizontal);--chips-btn-padding: 12px;--chips-btn-gap: calc(var(--chips-btn-padding) / 2);--chips-btn-color: white;--chips-btn-valid-color: rgba(200, 255, 200, .7);--chips-btn-invalid-color: rgba(255, 200, 200, .7);position:relative;margin:5px 0;font-size:var(--chips-text-size);padding:var(--chips-padding);background:var(--chips-bg-color);color:var(--chips-text-color);border:var(--chips-border-size) solid var(--chips-border-color);border-radius:var(--chips-border-radius)}.chips *{box-sizing:border-box}.chips .chips-input{background:var(--chips-bg-color);padding:var(--chips-padding);font-size:var(--chips-text-size);outline:none;border:none;width:100%;-webkit-user-select:none;user-select:none;font-weight:400}.chips .chips-buttons{position:absolute;top:var(--chips-padding-vertical);left:var(--chips-padding-horizontal);max-width:calc(100% - var(--chips-padding-horizontal) * 2);display:flex;gap:5px;overflow:auto;border-radius:var(--chips-border-radius)}.chips .chips-button{background:var(--chipd-btn-color);color:var(--chips-text-color);border:var(--chips-border-size) solid rgba(0,0,0,.2);border-radius:var(--chips-border-radius);padding:var(--chips-padding-vertical) var(--chips-btn-gap) var(--chips-padding-vertical) var(--chips-btn-padding);-webkit-user-select:none;user-select:none;font-weight:400;outline:none;display:flex;gap:var(--chips-btn-gap);justify-content:center;align-items:center;line-height:1.2rem;text-decoration:none}.chips .chips-button.chips-valid{--chipd-btn-color: var(--chips-btn-valid-color) }.chips .chips-button.chips-invalid{--chipd-btn-color: var(--chips-btn-invalid-color) }.chips img.chip-picture{width:28px;height:28px;object-fit:cover}.chips .chips-label{max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chips.disabled{opacity:.75}.chips.disabled .chips-button{padding-right:var(--chips-btn-padding)}.chips-dropdown:not(:empty){position:relative;z-index:1;width:var(--toggle-width, 0);display:flex;flex-direction:column;margin:-3px 0;padding:0;list-style:none;border:var(--chips-border-size) solid var(--chips-border-color);background:var(--chips-bg-color);border-radius:var(--chips-bottom-border-radius);overflow:hidden}.chips-dropdown:not(:empty) *{box-sizing:border-box}.chips-dropdown:not(:empty) button{border:none;background:none;cursor:pointer;padding:6px 12px;-webkit-user-select:none;user-select:none;text-align:left}.chips-dropdown:not(:empty) button:hover,.chips-dropdown:not(:empty) button.active{background-color:var(--chips-highlight-color);color:var(--chips-highlight-text-color)}.chips-dropdown:not(:empty) button:hover a,.chips-dropdown:not(:empty) button.active a{color:var(--chips-highlight-text-color)}.chips-dropdown:not(:empty) .select-option{display:flex;gap:8px;align-items:center;justify-content:center}.chips-dropdown:not(:empty) .select-option .select-option-picture{width:32px;height:32px;object-fit:cover}.chips-dropdown:not(:empty) .select-option .select-option-label{flex:1}.dropdown-placement-top .chips-dropdown{border-radius:var(--chips-top-border-radius)}\n"] }]
8866
8899
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { testId: [{
8867
8900
  type: Input
8868
8901
  }], value: [{
@@ -8912,30 +8945,73 @@ class CodeEditorComponent {
8912
8945
  get rootNode() {
8913
8946
  return this.root;
8914
8947
  }
8915
- constructor(cdr, element) {
8916
- this.cdr = cdr;
8917
- this.element = element;
8918
- this.value = "";
8919
- this.lang = "json";
8920
- this.onChange = () => {
8921
- };
8922
- this.onTouched = () => {
8923
- };
8948
+ constructor() {
8949
+ this.value = model("");
8950
+ this.lang = input("json");
8951
+ this.disabled = model(false);
8952
+ this.onChange = () => { };
8953
+ this.onTouched = () => { };
8954
+ this.cdr = inject(ChangeDetectorRef);
8955
+ this.element = inject((ElementRef));
8924
8956
  this.extensions = {};
8957
+ this.editor = signal(null);
8958
+ this.editorElem = viewChild("editor");
8959
+ effect(() => {
8960
+ const editor = this.editor();
8961
+ if (!editor)
8962
+ return;
8963
+ const value = this.value() || "";
8964
+ const disabled = this.disabled();
8965
+ const expectedStr = !isString(value) ? JSON.stringify(value, null, 4) : value;
8966
+ const currentStr = editor.state.doc.toString();
8967
+ const langExtension = this.getLangExtension();
8968
+ const { EditorView } = CM["@codemirror/view"];
8969
+ const dispatchData = {
8970
+ effects: [
8971
+ this.langCompartment.reconfigure(langExtension),
8972
+ this.editableCompartment.reconfigure(EditorView.editable.of(!disabled))
8973
+ ]
8974
+ };
8975
+ if (currentStr !== expectedStr) {
8976
+ dispatchData.changes = {
8977
+ from: 0,
8978
+ to: editor.state.doc.length,
8979
+ insert: expectedStr
8980
+ };
8981
+ }
8982
+ editor.dispatch(dispatchData);
8983
+ });
8925
8984
  }
8926
8985
  getLangExtension() {
8927
- if (!this.extensions[this.lang]) {
8928
- const lang = CM[`@codemirror/lang-${this.lang || "json"}`];
8929
- const ext = lang[this.lang];
8930
- this.extensions[this.lang] = ext();
8986
+ const langVal = this.lang();
8987
+ if (!this.extensions[langVal]) {
8988
+ const lang = CM[`@codemirror/lang-${langVal || "json"}`];
8989
+ const ext = lang[langVal];
8990
+ this.extensions[langVal] = ext();
8931
8991
  }
8932
- return this.extensions[this.lang];
8992
+ return this.extensions[langVal];
8933
8993
  }
8934
8994
  ngAfterViewInit() {
8935
8995
  Promise.all([
8936
8996
  LoaderUtils.loadScript("https://codemirror.net/codemirror.js", true),
8937
8997
  LoaderUtils.loadScript("https://cdn.jsdelivr.net/npm/jsonlint", true),
8938
- ]).then(() => {
8998
+ ]).then(() => this.initEditor());
8999
+ }
9000
+ registerOnChange(fn) {
9001
+ this.onChange = fn;
9002
+ }
9003
+ registerOnTouched(fn) {
9004
+ this.onTouched = fn;
9005
+ }
9006
+ writeValue(value) {
9007
+ this.value.set(value);
9008
+ this.cdr.markForCheck();
9009
+ }
9010
+ setDisabledState(isDisabled) {
9011
+ this.disabled.set(isDisabled);
9012
+ }
9013
+ initEditor() {
9014
+ untracked(() => {
8939
9015
  const { basicSetup } = CM["codemirror"];
8940
9016
  const { Compartment } = CM["@codemirror/state"];
8941
9017
  const { EditorView } = CM["@codemirror/view"];
@@ -8944,7 +9020,7 @@ class CodeEditorComponent {
8944
9020
  const jsonLinter = linter((view) => {
8945
9021
  const diagnostics = [];
8946
9022
  const value = view.state.doc.toString();
8947
- if (!value.trim() || this.lang !== "json")
9023
+ if (!value.trim() || this.lang() !== "json")
8948
9024
  return diagnostics;
8949
9025
  try {
8950
9026
  jsonlint.parse(value);
@@ -8967,87 +9043,59 @@ class CodeEditorComponent {
8967
9043
  if (update.docChanged) {
8968
9044
  // Grab the full string payload of the document
8969
9045
  const value = update.state.doc.toString();
8970
- if (this.lang === "json") {
9046
+ const lang = untracked(() => this.lang());
9047
+ let parsedValue;
9048
+ if (lang === "json") {
8971
9049
  try {
8972
- this.value = JSON.parse(value);
9050
+ parsedValue = JSON.parse(value);
8973
9051
  }
8974
9052
  catch (e) {
8975
9053
  return null;
8976
9054
  }
8977
9055
  }
8978
9056
  else {
8979
- this.value = value;
9057
+ parsedValue = value;
8980
9058
  }
8981
- this.onChange(this.value);
8982
- this.onTouched(this.value);
9059
+ this.value.set(parsedValue);
9060
+ this.onChange(parsedValue);
9061
+ this.onTouched(parsedValue);
8983
9062
  }
8984
9063
  });
8985
9064
  // Initialize editor on an HTMLElement
8986
- const value = this.value || "";
9065
+ const value = this.value() || "";
9066
+ const disabled = this.disabled();
8987
9067
  this.langCompartment = new Compartment();
8988
- this.editor = new EditorView({
9068
+ this.editableCompartment = new Compartment();
9069
+ this.editor.set(new EditorView({
8989
9070
  doc: !isString(value) ? JSON.stringify(value, null, 4) : value,
8990
9071
  extensions: [
8991
9072
  basicSetup,
8992
9073
  this.langCompartment.of(langExtension),
9074
+ this.editableCompartment.of(EditorView.editable.of(!disabled)),
9075
+ EditorView.lineWrapping,
8993
9076
  jsonLinter,
8994
9077
  changeHandler
8995
9078
  ],
8996
- parent: this.editorElem.nativeElement
8997
- });
8998
- });
8999
- }
9000
- ngOnChanges() {
9001
- if (!this.editor)
9002
- return;
9003
- const value = this.value || "";
9004
- this.lang = EDITOR_TYPES.includes(this.lang) ? this.lang : "json";
9005
- this.editor.dispatch({
9006
- effects: this.langCompartment.reconfigure(this.getLangExtension()),
9007
- changes: {
9008
- from: 0,
9009
- to: this.editor.state.doc.length,
9010
- insert: !isString(value) ? JSON.stringify(value, null, 4) : value
9011
- }
9079
+ parent: this.editorElem()?.nativeElement
9080
+ }));
9012
9081
  });
9013
9082
  }
9014
- registerOnChange(fn) {
9015
- this.onChange = fn;
9016
- }
9017
- registerOnTouched(fn) {
9018
- this.onTouched = fn;
9019
- }
9020
- writeValue(value) {
9021
- this.value = value;
9022
- this.cdr.markForCheck();
9023
- this.ngOnChanges();
9024
- }
9025
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.22", ngImport: i0, type: CodeEditorComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
9026
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.22", type: CodeEditorComponent, isStandalone: false, selector: "code-editor", inputs: { value: "value", lang: "lang", disabled: "disabled" }, outputs: { valueChange: "valueChange" }, providers: [
9083
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.22", ngImport: i0, type: CodeEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9084
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "19.2.22", type: CodeEditorComponent, isStandalone: false, selector: "code-editor", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, lang: { classPropertyName: "lang", publicName: "lang", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", disabled: "disabledChange" }, providers: [
9027
9085
  { provide: NG_VALUE_ACCESSOR, useExisting: CodeEditorComponent, multi: true }
9028
- ], viewQueries: [{ propertyName: "editorElem", first: true, predicate: ["editor"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"code-editor\" [ngClass]=\"{disabled: disabled}\">\r\n <div #editor></div>\r\n</div>\r\n", styles: [".code-editor>div{margin:10px 0}.code-editor>div .cm-editor{outline:none}.code-editor>div .cm-scroller{min-height:150px;max-height:345px;background:#fefefe;border:1px solid #ddd}\n"], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], encapsulation: i0.ViewEncapsulation.None }); }
9086
+ ], viewQueries: [{ propertyName: "editorElem", first: true, predicate: ["editor"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"code-editor\" [ngClass]=\"{disabled: disabled()}\">\r\n <div #editor></div>\r\n</div>\r\n", styles: [".code-editor>div{margin:10px 0}.code-editor>div .cm-editor{outline:none}.code-editor>div .cm-scroller{min-height:150px;max-height:345px;background:#fefefe;border:1px solid #ddd}.code-editor.disabled .cm-content{pointer-events:none;-webkit-user-select:none;user-select:none}.code-editor.disabled .cm-content .cm-activeLine{background-color:transparent}\n"], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], encapsulation: i0.ViewEncapsulation.None }); }
9029
9087
  }
9030
9088
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.22", ngImport: i0, type: CodeEditorComponent, decorators: [{
9031
9089
  type: Component,
9032
9090
  args: [{ standalone: false, selector: "code-editor", encapsulation: ViewEncapsulation.None, providers: [
9033
9091
  { provide: NG_VALUE_ACCESSOR, useExisting: CodeEditorComponent, multi: true }
9034
- ], template: "<div class=\"code-editor\" [ngClass]=\"{disabled: disabled}\">\r\n <div #editor></div>\r\n</div>\r\n", styles: [".code-editor>div{margin:10px 0}.code-editor>div .cm-editor{outline:none}.code-editor>div .cm-scroller{min-height:150px;max-height:345px;background:#fefefe;border:1px solid #ddd}\n"] }]
9035
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }], propDecorators: { value: [{
9036
- type: Input
9037
- }], lang: [{
9038
- type: Input
9039
- }], disabled: [{
9040
- type: Input
9041
- }], valueChange: [{
9042
- type: Output
9043
- }], editorElem: [{
9044
- type: ViewChild,
9045
- args: ["editor"]
9046
- }] } });
9092
+ ], template: "<div class=\"code-editor\" [ngClass]=\"{disabled: disabled()}\">\r\n <div #editor></div>\r\n</div>\r\n", styles: [".code-editor>div{margin:10px 0}.code-editor>div .cm-editor{outline:none}.code-editor>div .cm-scroller{min-height:150px;max-height:345px;background:#fefefe;border:1px solid #ddd}.code-editor.disabled .cm-content{pointer-events:none;-webkit-user-select:none;user-select:none}.code-editor.disabled .cm-content .cm-activeLine{background-color:transparent}\n"] }]
9093
+ }], ctorParameters: () => [] });
9047
9094
 
9048
9095
  class DatePickerComponent extends CalendarInputs {
9049
9096
  constructor() {
9050
9097
  super(...arguments);
9098
+ this.disabled = model(false);
9051
9099
  this.autoPlacement = {
9052
9100
  autoAlignment: true,
9053
9101
  allowedPlacements: ["top-end", "bottom-end"]
@@ -9117,15 +9165,15 @@ class DatePickerComponent extends CalendarInputs {
9117
9165
  this.onTouched();
9118
9166
  }
9119
9167
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.22", ngImport: i0, type: DatePickerComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
9120
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.22", type: DatePickerComponent, isStandalone: false, selector: "date-picker", providers: [
9168
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.22", type: DatePickerComponent, isStandalone: false, selector: "date-picker", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { disabled: "disabledChange" }, providers: [
9121
9169
  { provide: NG_VALUE_ACCESSOR, useExisting: DatePickerComponent, multi: true }
9122
- ], viewQueries: [{ propertyName: "pickerDropdown", first: true, predicate: ["pickerDropdown"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@let id = testId();\r\n<div class=\"date-picker\"\r\n drop-down\r\n [closeInside]=\"false\"\r\n [autoPlacement]=\"autoPlacement\"\r\n [ngClass]=\"{disabled: disabled()}\"\r\n #pickerDropdown=\"dropdown\">\r\n <input class=\"date-picker-input\"\r\n [attr.data-testid]=\"id\"\r\n [type]=\"strict() ? 'date' : 'text'\"\r\n [value]=\"inputValue()\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur($event)\"/>\r\n <div class=\"date-picker-buttons\">\r\n @if (value()) {\r\n <btn [attr.data-testid]=\"id + '-clear'\"\r\n type=\"transparent\"\r\n icon=\"close\" (click)=\"clear()\"></btn>\r\n }\r\n <btn [attr.data-testid]=\"id + '-open-picker'\"\r\n type=\"transparent\"\r\n icon=\"calendar-days\" dropdownToggle></btn>\r\n </div>\r\n <div *dropdownContent>\r\n <calendar [testId]=\"id + '-picker'\"\r\n [min]=\"min()\"\r\n [max]=\"max()\"\r\n [disabledDates]=\"disabledDates()\"\r\n [disabledDays]=\"disabledDays()\"\r\n [disabled]=\"disabled()\"\r\n [strict]=\"strict()\"\r\n [value]=\"value()\"\r\n (valueChange)=\"onPickerChange($event)\"></calendar>\r\n </div>\r\n</div>\r\n", styles: [".date-picker{--date-picker-border-size: var(--border-size, 1px);--date-picker-border-radius: var(--border-radius, 5px);--date-picker-bg-color: var(--bg-color, #ffffff);--date-picker-border-color: var(--border-color, #ced4da);--date-picker-highlight-color: var(--highlight-color, var(--primary-color, #888888));--date-picker-highlight-text-color: var(--highlight-text-color, #ffffff);--date-picker-text-color: var(--text-color, #151515);--date-picker-text-size: var(--text-size, 16px);--date-picker-padding-vertical: 6px;--date-picker-padding-horizontal: 12px;--date-picker-padding: var(--date-picker-padding-vertical) var(--date-picker-padding-horizontal);--date-picker-btn-padding: 12px;--date-picker-btn-gap: calc(var(--date-picker-btn-padding) / 2);--date-picker-btn-color: white;--date-picker-btn-valid-color: rgba(200, 255, 200, .7);--date-picker-btn-invalid-color: rgba(255, 200, 200, .7);position:relative;margin:5px 0;font-size:var(--date-picker-text-size);padding:var(--date-picker-padding);background:var(--date-picker-bg-color);color:var(--date-picker-text-color);border:var(--date-picker-border-size) solid var(--date-picker-border-color);border-radius:var(--date-picker-border-radius)}.date-picker *{box-sizing:border-box}.date-picker .date-picker-input{background:var(--date-picker-bg-color);font-size:var(--date-picker-text-size);outline:none;border:none;width:100%;-webkit-user-select:none;user-select:none;font-weight:400}.date-picker .date-picker-input::-webkit-calendar-picker-indicator{display:none!important;-webkit-appearance:none!important}.date-picker .date-picker-input::-webkit-clear-button{display:none!important;-webkit-appearance:none!important}.date-picker .date-picker-input::-webkit-inner-spin-button{display:none!important;-webkit-appearance:none!important}.date-picker .date-picker-buttons{display:flex;justify-content:flex-end;position:absolute;aspect-ratio:2/1;top:0;bottom:0;right:0;overflow:hidden}.date-picker .date-picker-buttons>btn{max-width:50%}.date-picker.disabled{opacity:.75}.date-picker.disabled .chips-button{padding-right:var(--date-picker-btn-padding)}\n"], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: DropdownDirective, selector: "[dd],[drop-down]", inputs: ["closeInside", "attachTo", "boundary", "placement", "autoPlacement", "mobileViewUnder", "fixed", "keyboardHandler", "isDisabled"], outputs: ["onShown", "onHidden", "onKeyboard"], exportAs: ["dropdown"] }, { kind: "directive", type: DropdownContentDirective, selector: "[dropdownContent]", exportAs: ["dropdown-content"] }, { kind: "directive", type: DropdownToggleDirective, selector: "[dropdownToggle]", inputs: ["beforeOpen", "switch"], exportAs: ["dropdown-toggle"] }, { kind: "component", type: BtnComponent, selector: "btn", inputs: ["label", "tooltip", "icon", "disabled", "path", "type", "size"] }, { kind: "component", type: CalendarComponent, selector: "calendar" }], encapsulation: i0.ViewEncapsulation.None }); }
9170
+ ], viewQueries: [{ propertyName: "pickerDropdown", first: true, predicate: ["pickerDropdown"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@let id = testId();\r\n@let isDisabled = disabled();\r\n<div class=\"date-picker\"\r\n drop-down\r\n [closeInside]=\"false\"\r\n [autoPlacement]=\"autoPlacement\"\r\n [ngClass]=\"{disabled: isDisabled}\"\r\n #pickerDropdown=\"dropdown\">\r\n <input class=\"date-picker-input\"\r\n [attr.data-testid]=\"id\"\r\n [disabled]=\"isDisabled\"\r\n [type]=\"strict() ? 'date' : 'text'\"\r\n [value]=\"inputValue()\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur($event)\"/>\r\n @if (!isDisabled) {\r\n <div class=\"date-picker-buttons\">\r\n @if (value()) {\r\n <btn [attr.data-testid]=\"id + '-clear'\"\r\n type=\"transparent\"\r\n icon=\"close\" (click)=\"clear()\"></btn>\r\n }\r\n <btn [attr.data-testid]=\"id + '-open-picker'\"\r\n type=\"transparent\"\r\n icon=\"calendar-days\" dropdownToggle></btn>\r\n </div>\r\n }\r\n <div *dropdownContent>\r\n <calendar [testId]=\"id + '-picker'\"\r\n [min]=\"min()\"\r\n [max]=\"max()\"\r\n [disabledDates]=\"disabledDates()\"\r\n [disabledDays]=\"disabledDays()\"\r\n [disabled]=\"disabled()\"\r\n [strict]=\"strict()\"\r\n [value]=\"value()\"\r\n (valueChange)=\"onPickerChange($event)\"></calendar>\r\n </div>\r\n</div>\r\n", styles: [".date-picker{--date-picker-border-size: var(--border-size, 1px);--date-picker-border-radius: var(--border-radius, 5px);--date-picker-bg-color: var(--bg-color, #ffffff);--date-picker-border-color: var(--border-color, #ced4da);--date-picker-highlight-color: var(--highlight-color, var(--primary-color, #888888));--date-picker-highlight-text-color: var(--highlight-text-color, #ffffff);--date-picker-text-color: var(--text-color, #151515);--date-picker-text-size: var(--text-size, 16px);--date-picker-padding-vertical: 6px;--date-picker-padding-horizontal: 12px;--date-picker-padding: var(--date-picker-padding-vertical) var(--date-picker-padding-horizontal);--date-picker-btn-padding: 12px;--date-picker-btn-gap: calc(var(--date-picker-btn-padding) / 2);--date-picker-btn-color: white;--date-picker-btn-valid-color: rgba(200, 255, 200, .7);--date-picker-btn-invalid-color: rgba(255, 200, 200, .7);position:relative;margin:5px 0;font-size:var(--date-picker-text-size);padding:var(--date-picker-padding);background:var(--date-picker-bg-color);color:var(--date-picker-text-color);border:var(--date-picker-border-size) solid var(--date-picker-border-color);border-radius:var(--date-picker-border-radius)}.date-picker *{box-sizing:border-box}.date-picker .date-picker-input{background:var(--date-picker-bg-color);font-size:var(--date-picker-text-size);outline:none;border:none;width:100%;-webkit-user-select:none;user-select:none;font-weight:400}.date-picker .date-picker-input::-webkit-calendar-picker-indicator{display:none!important;-webkit-appearance:none!important}.date-picker .date-picker-input::-webkit-clear-button{display:none!important;-webkit-appearance:none!important}.date-picker .date-picker-input::-webkit-inner-spin-button{display:none!important;-webkit-appearance:none!important}.date-picker .date-picker-buttons{display:flex;justify-content:flex-end;position:absolute;aspect-ratio:2/1;top:0;bottom:0;right:0;overflow:hidden}.date-picker .date-picker-buttons>btn{max-width:50%}.date-picker.disabled{opacity:.75}\n"], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: DropdownDirective, selector: "[dd],[drop-down]", inputs: ["closeInside", "attachTo", "boundary", "placement", "autoPlacement", "mobileViewUnder", "fixed", "keyboardHandler", "isDisabled"], outputs: ["onShown", "onHidden", "onKeyboard"], exportAs: ["dropdown"] }, { kind: "directive", type: DropdownContentDirective, selector: "[dropdownContent]", exportAs: ["dropdown-content"] }, { kind: "directive", type: DropdownToggleDirective, selector: "[dropdownToggle]", inputs: ["beforeOpen", "switch"], exportAs: ["dropdown-toggle"] }, { kind: "component", type: BtnComponent, selector: "btn", inputs: ["label", "tooltip", "icon", "disabled", "path", "type", "size"] }, { kind: "component", type: CalendarComponent, selector: "calendar" }], encapsulation: i0.ViewEncapsulation.None }); }
9123
9171
  }
9124
9172
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.22", ngImport: i0, type: DatePickerComponent, decorators: [{
9125
9173
  type: Component,
9126
9174
  args: [{ standalone: false, encapsulation: ViewEncapsulation.None, selector: "date-picker", providers: [
9127
9175
  { provide: NG_VALUE_ACCESSOR, useExisting: DatePickerComponent, multi: true }
9128
- ], template: "@let id = testId();\r\n<div class=\"date-picker\"\r\n drop-down\r\n [closeInside]=\"false\"\r\n [autoPlacement]=\"autoPlacement\"\r\n [ngClass]=\"{disabled: disabled()}\"\r\n #pickerDropdown=\"dropdown\">\r\n <input class=\"date-picker-input\"\r\n [attr.data-testid]=\"id\"\r\n [type]=\"strict() ? 'date' : 'text'\"\r\n [value]=\"inputValue()\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur($event)\"/>\r\n <div class=\"date-picker-buttons\">\r\n @if (value()) {\r\n <btn [attr.data-testid]=\"id + '-clear'\"\r\n type=\"transparent\"\r\n icon=\"close\" (click)=\"clear()\"></btn>\r\n }\r\n <btn [attr.data-testid]=\"id + '-open-picker'\"\r\n type=\"transparent\"\r\n icon=\"calendar-days\" dropdownToggle></btn>\r\n </div>\r\n <div *dropdownContent>\r\n <calendar [testId]=\"id + '-picker'\"\r\n [min]=\"min()\"\r\n [max]=\"max()\"\r\n [disabledDates]=\"disabledDates()\"\r\n [disabledDays]=\"disabledDays()\"\r\n [disabled]=\"disabled()\"\r\n [strict]=\"strict()\"\r\n [value]=\"value()\"\r\n (valueChange)=\"onPickerChange($event)\"></calendar>\r\n </div>\r\n</div>\r\n", styles: [".date-picker{--date-picker-border-size: var(--border-size, 1px);--date-picker-border-radius: var(--border-radius, 5px);--date-picker-bg-color: var(--bg-color, #ffffff);--date-picker-border-color: var(--border-color, #ced4da);--date-picker-highlight-color: var(--highlight-color, var(--primary-color, #888888));--date-picker-highlight-text-color: var(--highlight-text-color, #ffffff);--date-picker-text-color: var(--text-color, #151515);--date-picker-text-size: var(--text-size, 16px);--date-picker-padding-vertical: 6px;--date-picker-padding-horizontal: 12px;--date-picker-padding: var(--date-picker-padding-vertical) var(--date-picker-padding-horizontal);--date-picker-btn-padding: 12px;--date-picker-btn-gap: calc(var(--date-picker-btn-padding) / 2);--date-picker-btn-color: white;--date-picker-btn-valid-color: rgba(200, 255, 200, .7);--date-picker-btn-invalid-color: rgba(255, 200, 200, .7);position:relative;margin:5px 0;font-size:var(--date-picker-text-size);padding:var(--date-picker-padding);background:var(--date-picker-bg-color);color:var(--date-picker-text-color);border:var(--date-picker-border-size) solid var(--date-picker-border-color);border-radius:var(--date-picker-border-radius)}.date-picker *{box-sizing:border-box}.date-picker .date-picker-input{background:var(--date-picker-bg-color);font-size:var(--date-picker-text-size);outline:none;border:none;width:100%;-webkit-user-select:none;user-select:none;font-weight:400}.date-picker .date-picker-input::-webkit-calendar-picker-indicator{display:none!important;-webkit-appearance:none!important}.date-picker .date-picker-input::-webkit-clear-button{display:none!important;-webkit-appearance:none!important}.date-picker .date-picker-input::-webkit-inner-spin-button{display:none!important;-webkit-appearance:none!important}.date-picker .date-picker-buttons{display:flex;justify-content:flex-end;position:absolute;aspect-ratio:2/1;top:0;bottom:0;right:0;overflow:hidden}.date-picker .date-picker-buttons>btn{max-width:50%}.date-picker.disabled{opacity:.75}.date-picker.disabled .chips-button{padding-right:var(--date-picker-btn-padding)}\n"] }]
9176
+ ], template: "@let id = testId();\r\n@let isDisabled = disabled();\r\n<div class=\"date-picker\"\r\n drop-down\r\n [closeInside]=\"false\"\r\n [autoPlacement]=\"autoPlacement\"\r\n [ngClass]=\"{disabled: isDisabled}\"\r\n #pickerDropdown=\"dropdown\">\r\n <input class=\"date-picker-input\"\r\n [attr.data-testid]=\"id\"\r\n [disabled]=\"isDisabled\"\r\n [type]=\"strict() ? 'date' : 'text'\"\r\n [value]=\"inputValue()\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur($event)\"/>\r\n @if (!isDisabled) {\r\n <div class=\"date-picker-buttons\">\r\n @if (value()) {\r\n <btn [attr.data-testid]=\"id + '-clear'\"\r\n type=\"transparent\"\r\n icon=\"close\" (click)=\"clear()\"></btn>\r\n }\r\n <btn [attr.data-testid]=\"id + '-open-picker'\"\r\n type=\"transparent\"\r\n icon=\"calendar-days\" dropdownToggle></btn>\r\n </div>\r\n }\r\n <div *dropdownContent>\r\n <calendar [testId]=\"id + '-picker'\"\r\n [min]=\"min()\"\r\n [max]=\"max()\"\r\n [disabledDates]=\"disabledDates()\"\r\n [disabledDays]=\"disabledDays()\"\r\n [disabled]=\"disabled()\"\r\n [strict]=\"strict()\"\r\n [value]=\"value()\"\r\n (valueChange)=\"onPickerChange($event)\"></calendar>\r\n </div>\r\n</div>\r\n", styles: [".date-picker{--date-picker-border-size: var(--border-size, 1px);--date-picker-border-radius: var(--border-radius, 5px);--date-picker-bg-color: var(--bg-color, #ffffff);--date-picker-border-color: var(--border-color, #ced4da);--date-picker-highlight-color: var(--highlight-color, var(--primary-color, #888888));--date-picker-highlight-text-color: var(--highlight-text-color, #ffffff);--date-picker-text-color: var(--text-color, #151515);--date-picker-text-size: var(--text-size, 16px);--date-picker-padding-vertical: 6px;--date-picker-padding-horizontal: 12px;--date-picker-padding: var(--date-picker-padding-vertical) var(--date-picker-padding-horizontal);--date-picker-btn-padding: 12px;--date-picker-btn-gap: calc(var(--date-picker-btn-padding) / 2);--date-picker-btn-color: white;--date-picker-btn-valid-color: rgba(200, 255, 200, .7);--date-picker-btn-invalid-color: rgba(255, 200, 200, .7);position:relative;margin:5px 0;font-size:var(--date-picker-text-size);padding:var(--date-picker-padding);background:var(--date-picker-bg-color);color:var(--date-picker-text-color);border:var(--date-picker-border-size) solid var(--date-picker-border-color);border-radius:var(--date-picker-border-radius)}.date-picker *{box-sizing:border-box}.date-picker .date-picker-input{background:var(--date-picker-bg-color);font-size:var(--date-picker-text-size);outline:none;border:none;width:100%;-webkit-user-select:none;user-select:none;font-weight:400}.date-picker .date-picker-input::-webkit-calendar-picker-indicator{display:none!important;-webkit-appearance:none!important}.date-picker .date-picker-input::-webkit-clear-button{display:none!important;-webkit-appearance:none!important}.date-picker .date-picker-input::-webkit-inner-spin-button{display:none!important;-webkit-appearance:none!important}.date-picker .date-picker-buttons{display:flex;justify-content:flex-end;position:absolute;aspect-ratio:2/1;top:0;bottom:0;right:0;overflow:hidden}.date-picker .date-picker-buttons>btn{max-width:50%}.date-picker.disabled{opacity:.75}\n"] }]
9129
9177
  }] });
9130
9178
 
9131
9179
  class DropListComponent {