@open-rlb/ng-bootstrap 2.4.9 → 2.4.11

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.
@@ -1,17 +1,17 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Component, booleanAttribute, Input, Host, Self, Optional, Directive, Injectable, EventEmitter, ContentChild, Output, ContentChildren, ViewChild, numberAttribute, Pipe, ChangeDetectionStrategy, DOCUMENT, Inject, HostBinding, HostListener, ViewContainerRef, InjectionToken, ElementRef, ViewChildren, NgModule } from '@angular/core';
2
+ import { Component, booleanAttribute, Input, Host, Self, Optional, Directive, Injectable, EventEmitter, ContentChild, Output, ContentChildren, ViewChild, numberAttribute, Pipe, ChangeDetectionStrategy, DOCUMENT, Inject, HostBinding, ViewContainerRef, InjectionToken, ElementRef, HostListener, ViewChildren, NgModule } from '@angular/core';
3
3
  import { Collapse, Carousel, Dropdown, Modal, Toast, Offcanvas, ScrollSpy, Tooltip, Popover } from 'bootstrap';
4
- import * as i1 from '@angular/common';
4
+ import * as i3 from '@angular/common';
5
5
  import { formatDate, CommonModule } from '@angular/common';
6
6
  import * as i2 from '@angular/router';
7
7
  import { RouterModule } from '@angular/router';
8
- import { Subject, of, take, filter, switchMap, map, startWith, takeUntil, Observable, lastValueFrom } from 'rxjs';
8
+ import { Subject, of, map, shareReplay, take, filter, switchMap, startWith, takeUntil, Subscription, Observable, lastValueFrom } from 'rxjs';
9
9
  import * as i2$1 from '@angular/cdk/layout';
10
10
  import * as i2$2 from '@angular/forms';
11
11
  import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
12
12
  import { DateTz } from '@open-rlb/date-tz';
13
13
  import { DateTz as DateTz$1 } from '@open-rlb/date-tz/date-tz';
14
- import * as i2$3 from '@angular/cdk/drag-drop';
14
+ import * as i1 from '@angular/cdk/drag-drop';
15
15
  import { CdkDrag, CdkDropListGroup, CdkDropList, CdkDragPlaceholder, CdkDragPreview } from '@angular/cdk/drag-drop';
16
16
  import * as i5 from '@ngx-translate/core';
17
17
  import { TranslateModule } from '@ngx-translate/core';
@@ -548,37 +548,39 @@ class AlertComponent {
548
548
  this.viewContainerRef.element.nativeElement.remove();
549
549
  }
550
550
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AlertComponent, deps: [{ token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component }); }
551
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "20.3.16", type: AlertComponent, isStandalone: false, selector: "rlb-alert", inputs: { color: "color", dismissible: ["dismissible", "dismissible", booleanAttribute], cssClass: ["class", "cssClass"] }, outputs: { dismissed: "dismissed" }, viewQueries: [{ propertyName: "template", first: true, predicate: ["template"], descendants: true, static: true }], ngImport: i0, template: ` <ng-template #template>
552
- <div class="alert alert-{{ color }} {{ cssClass }}" role="alert">
553
- <ng-content></ng-content>
554
- <button
555
- *ngIf="dismissible"
556
- type="button"
557
- class="btn-close"
558
- data-bs-dismiss="alert"
559
- aria-label="Close"
560
- (click)="dismissed.emit()"
561
- ></button>
562
- </div>
563
- </ng-template>`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
551
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: AlertComponent, isStandalone: false, selector: "rlb-alert", inputs: { color: "color", dismissible: ["dismissible", "dismissible", booleanAttribute], cssClass: ["class", "cssClass"] }, outputs: { dismissed: "dismissed" }, viewQueries: [{ propertyName: "template", first: true, predicate: ["template"], descendants: true, static: true }], ngImport: i0, template: ` <ng-template #template>
552
+ <div class="alert alert-{{ color }} {{ cssClass }}" role="alert">
553
+ <ng-content></ng-content>
554
+ @if (dismissible) {
555
+ <button
556
+ type="button"
557
+ class="btn-close"
558
+ data-bs-dismiss="alert"
559
+ aria-label="Close"
560
+ (click)="dismissed.emit()"
561
+ ></button>
562
+ }
563
+ </div>
564
+ </ng-template>`, isInline: true }); }
564
565
  }
565
566
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AlertComponent, decorators: [{
566
567
  type: Component,
567
568
  args: [{
568
569
  selector: 'rlb-alert',
569
570
  template: ` <ng-template #template>
570
- <div class="alert alert-{{ color }} {{ cssClass }}" role="alert">
571
- <ng-content></ng-content>
572
- <button
573
- *ngIf="dismissible"
574
- type="button"
575
- class="btn-close"
576
- data-bs-dismiss="alert"
577
- aria-label="Close"
578
- (click)="dismissed.emit()"
579
- ></button>
580
- </div>
581
- </ng-template>`,
571
+ <div class="alert alert-{{ color }} {{ cssClass }}" role="alert">
572
+ <ng-content></ng-content>
573
+ @if (dismissible) {
574
+ <button
575
+ type="button"
576
+ class="btn-close"
577
+ data-bs-dismiss="alert"
578
+ aria-label="Close"
579
+ (click)="dismissed.emit()"
580
+ ></button>
581
+ }
582
+ </div>
583
+ </ng-template>`,
582
584
  standalone: false
583
585
  }]
584
586
  }], ctorParameters: () => [{ type: i0.ViewContainerRef }], propDecorators: { color: [{
@@ -622,13 +624,15 @@ class BadgeComponent {
622
624
  this.viewContainerRef.element.nativeElement.remove();
623
625
  }
624
626
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: BadgeComponent, deps: [{ token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component }); }
625
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "20.3.16", type: BadgeComponent, isStandalone: false, selector: "span[rlb-badge], img[rlb-badge]", inputs: { pill: ["pill", "pill", booleanAttribute], color: "color", hiddenText: ["hidden-text", "hiddenText"], border: ["border", "border", booleanAttribute], cssClass: ["class", "cssClass"] }, viewQueries: [{ propertyName: "template", first: true, predicate: ["template"], descendants: true, static: true }], ngImport: i0, template: `
627
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: BadgeComponent, isStandalone: false, selector: "span[rlb-badge], img[rlb-badge]", inputs: { pill: ["pill", "pill", booleanAttribute], color: "color", hiddenText: ["hidden-text", "hiddenText"], border: ["border", "border", booleanAttribute], cssClass: ["class", "cssClass"] }, viewQueries: [{ propertyName: "template", first: true, predicate: ["template"], descendants: true, static: true }], ngImport: i0, template: `
626
628
  <ng-template #template>
627
629
  <span [class]="style">
628
630
  <ng-content></ng-content>
629
- <span *ngIf="hiddenText" class="visually-hidden">{{ hiddenText }}</span>
631
+ @if (hiddenText) {
632
+ <span class="visually-hidden">{{ hiddenText }}</span>
633
+ }
630
634
  </span>
631
- </ng-template>`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
635
+ </ng-template>`, isInline: true }); }
632
636
  }
633
637
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: BadgeComponent, decorators: [{
634
638
  type: Component,
@@ -638,7 +642,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
638
642
  <ng-template #template>
639
643
  <span [class]="style">
640
644
  <ng-content></ng-content>
641
- <span *ngIf="hiddenText" class="visually-hidden">{{ hiddenText }}</span>
645
+ @if (hiddenText) {
646
+ <span class="visually-hidden">{{ hiddenText }}</span>
647
+ }
642
648
  </span>
643
649
  </ng-template>`,
644
650
  standalone: false
@@ -811,37 +817,45 @@ class BreadcrumbComponent {
811
817
  this.cssClasses = '';
812
818
  }
813
819
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: BreadcrumbComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
814
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: BreadcrumbComponent, isStandalone: false, selector: "rlb-breadcrumb", inputs: { divider: "divider", items: "items", cssClasses: "cssClasses" }, ngImport: i0, template: ` <nav
815
- aria-label="breadcrumb"
816
- style="--bs-breadcrumb-divider: '{{ divider }}';"
817
- >
818
- <ol class="breadcrumb" [ngClass]="cssClasses">
819
- <ng-container *ngFor="let item of items; last as last">
820
- <li class="breadcrumb-item" [ngClass]="{ active: !last }">
821
- <a *ngIf="!last" [routerLink]="item.link">{{ item.label }}</a>
822
- <span *ngIf="last">{{ item.label }}</span>
823
- </li>
824
- </ng-container>
825
- </ol>
826
- </nav>`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] }); }
820
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: BreadcrumbComponent, isStandalone: false, selector: "rlb-breadcrumb", inputs: { divider: "divider", items: "items", cssClasses: "cssClasses" }, ngImport: i0, template: ` <nav
821
+ aria-label="breadcrumb"
822
+ style="--bs-breadcrumb-divider: '{{ divider }}';"
823
+ >
824
+ <ol class="breadcrumb" [ngClass]="cssClasses">
825
+ @for (item of items; track item; let last = $last) {
826
+ <li class="breadcrumb-item" [ngClass]="{ active: !last }">
827
+ @if (!last) {
828
+ <a [routerLink]="item.link">{{ item.label }}</a>
829
+ }
830
+ @if (last) {
831
+ <span>{{ item.label }}</span>
832
+ }
833
+ </li>
834
+ }
835
+ </ol>
836
+ </nav>`, isInline: true, dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] }); }
827
837
  }
828
838
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: BreadcrumbComponent, decorators: [{
829
839
  type: Component,
830
840
  args: [{
831
841
  selector: 'rlb-breadcrumb',
832
842
  template: ` <nav
833
- aria-label="breadcrumb"
834
- style="--bs-breadcrumb-divider: '{{ divider }}';"
835
- >
836
- <ol class="breadcrumb" [ngClass]="cssClasses">
837
- <ng-container *ngFor="let item of items; last as last">
838
- <li class="breadcrumb-item" [ngClass]="{ active: !last }">
839
- <a *ngIf="!last" [routerLink]="item.link">{{ item.label }}</a>
840
- <span *ngIf="last">{{ item.label }}</span>
841
- </li>
842
- </ng-container>
843
- </ol>
844
- </nav>`,
843
+ aria-label="breadcrumb"
844
+ style="--bs-breadcrumb-divider: '{{ divider }}';"
845
+ >
846
+ <ol class="breadcrumb" [ngClass]="cssClasses">
847
+ @for (item of items; track item; let last = $last) {
848
+ <li class="breadcrumb-item" [ngClass]="{ active: !last }">
849
+ @if (!last) {
850
+ <a [routerLink]="item.link">{{ item.label }}</a>
851
+ }
852
+ @if (last) {
853
+ <span>{{ item.label }}</span>
854
+ }
855
+ </li>
856
+ }
857
+ </ol>
858
+ </nav>`,
845
859
  standalone: false
846
860
  }]
847
861
  }], propDecorators: { divider: [{
@@ -1256,10 +1270,10 @@ class CarouselComponent {
1256
1270
  return undefined;
1257
1271
  }
1258
1272
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CarouselComponent, deps: [{ token: i0.ElementRef }, { token: UniqueIdService }], target: i0.ɵɵFactoryTarget.Component }); }
1259
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "20.3.16", type: CarouselComponent, isStandalone: false, selector: "rlb-carousel", inputs: { id: "id", hideIndicators: ["hide-indicators", "hideIndicators", booleanAttribute], hideControls: ["hide-controls", "hideControls", booleanAttribute], crossFade: ["cross-fade", "crossFade", booleanAttribute], autoplay: "autoplay", interval: "interval", pauseProp: ["pause", "pauseProp"], wrap: ["wrap", "wrap", booleanAttribute], noTouch: ["no-touch", "noTouch", booleanAttribute], keyboard: ["keyboard", "keyboard", booleanAttribute], currentSlide: ["current-slide", "currentSlide", numberAttribute] }, outputs: { slid: "slid", slide: "slide", currentSlideChange: "current-slideChange", slideCountChange: "slide-count" }, host: { properties: { "class.carousel-fade": "crossFade", "id": "id", "attr.data-bs-ride": "autoplay === \"auto\" ? \"carousel\" : autoplay === \"manual\" ? \"true\": undefined", "attr.data-bs-touch": "noTouch ? undefined : true", "attr.data-bs-interval": "interval", "attr.data-bs-keyboard": "!keyboard ? \"false\" : undefined", "attr.data-bs-wrap": "!wrap ? \"false\" : undefined", "attr.data-bs-pause": "pause === false ? \"false\" : undefined" }, classAttribute: "carousel slide" }, queries: [{ propertyName: "items", predicate: CarouselSlideComponent }], ngImport: i0, template: `
1260
- <ng-container *ngIf="!hideIndicators">
1273
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: CarouselComponent, isStandalone: false, selector: "rlb-carousel", inputs: { id: "id", hideIndicators: ["hide-indicators", "hideIndicators", booleanAttribute], hideControls: ["hide-controls", "hideControls", booleanAttribute], crossFade: ["cross-fade", "crossFade", booleanAttribute], autoplay: "autoplay", interval: "interval", pauseProp: ["pause", "pauseProp"], wrap: ["wrap", "wrap", booleanAttribute], noTouch: ["no-touch", "noTouch", booleanAttribute], keyboard: ["keyboard", "keyboard", booleanAttribute], currentSlide: ["current-slide", "currentSlide", numberAttribute] }, outputs: { slid: "slid", slide: "slide", currentSlideChange: "current-slideChange", slideCountChange: "slide-count" }, host: { properties: { "class.carousel-fade": "crossFade", "id": "id", "attr.data-bs-ride": "autoplay === \"auto\" ? \"carousel\" : autoplay === \"manual\" ? \"true\": undefined", "attr.data-bs-touch": "noTouch ? undefined : true", "attr.data-bs-interval": "interval", "attr.data-bs-keyboard": "!keyboard ? \"false\" : undefined", "attr.data-bs-wrap": "!wrap ? \"false\" : undefined", "attr.data-bs-pause": "pauseProp === false ? \"false\" : undefined" }, classAttribute: "carousel slide" }, queries: [{ propertyName: "items", predicate: CarouselSlideComponent }], ngImport: i0, template: `
1274
+ @if (!hideIndicators) {
1261
1275
  <div class="carousel-indicators">
1262
- <ng-container *ngFor="let item of items; let i = index">
1276
+ @for (item of items; track item; let i = $index) {
1263
1277
  <button
1264
1278
  type="button"
1265
1279
  [class.active]="item.active"
@@ -1267,42 +1281,44 @@ class CarouselComponent {
1267
1281
  [attr.data-bs-slide-to]="i"
1268
1282
  [attr.aria-label]="'Slide ' + (i + 1)"
1269
1283
  ></button>
1270
- </ng-container>
1284
+ }
1271
1285
  </div>
1272
- </ng-container>
1273
- <div class="carousel-inner">
1274
- <ng-content select="rlb-carousel-slide" />
1275
- </div>
1276
- <button
1277
- *ngIf="!hideControls"
1278
- class="carousel-control-prev"
1279
- type="button"
1280
- [attr.data-bs-target]="'#' + id"
1281
- data-bs-slide="prev"
1282
- >
1283
- <span class="carousel-control-prev-icon" aria-hidden="true"></span>
1284
- <span class="visually-hidden">Previous</span>
1285
- </button>
1286
- <button
1287
- *ngIf="!hideControls"
1288
- class="carousel-control-next"
1289
- type="button"
1290
- [attr.data-bs-target]="'#' + id"
1291
- data-bs-slide="next"
1292
- >
1293
- <span class="carousel-control-next-icon" aria-hidden="true"></span>
1294
- <span class="visually-hidden">Next</span>
1295
- </button>
1296
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
1286
+ }
1287
+ <div class="carousel-inner">
1288
+ <ng-content select="rlb-carousel-slide" />
1289
+ </div>
1290
+ @if (!hideControls) {
1291
+ <button
1292
+ class="carousel-control-prev"
1293
+ type="button"
1294
+ [attr.data-bs-target]="'#' + id"
1295
+ data-bs-slide="prev"
1296
+ >
1297
+ <span class="carousel-control-prev-icon" aria-hidden="true"></span>
1298
+ <span class="visually-hidden">Previous</span>
1299
+ </button>
1300
+ }
1301
+ @if (!hideControls) {
1302
+ <button
1303
+ class="carousel-control-next"
1304
+ type="button"
1305
+ [attr.data-bs-target]="'#' + id"
1306
+ data-bs-slide="next"
1307
+ >
1308
+ <span class="carousel-control-next-icon" aria-hidden="true"></span>
1309
+ <span class="visually-hidden">Next</span>
1310
+ </button>
1311
+ }
1312
+ `, isInline: true }); }
1297
1313
  }
1298
1314
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CarouselComponent, decorators: [{
1299
1315
  type: Component,
1300
1316
  args: [{
1301
1317
  selector: 'rlb-carousel',
1302
1318
  template: `
1303
- <ng-container *ngIf="!hideIndicators">
1319
+ @if (!hideIndicators) {
1304
1320
  <div class="carousel-indicators">
1305
- <ng-container *ngFor="let item of items; let i = index">
1321
+ @for (item of items; track item; let i = $index) {
1306
1322
  <button
1307
1323
  type="button"
1308
1324
  [class.active]="item.active"
@@ -1310,33 +1326,35 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
1310
1326
  [attr.data-bs-slide-to]="i"
1311
1327
  [attr.aria-label]="'Slide ' + (i + 1)"
1312
1328
  ></button>
1313
- </ng-container>
1329
+ }
1314
1330
  </div>
1315
- </ng-container>
1316
- <div class="carousel-inner">
1317
- <ng-content select="rlb-carousel-slide" />
1318
- </div>
1319
- <button
1320
- *ngIf="!hideControls"
1321
- class="carousel-control-prev"
1322
- type="button"
1323
- [attr.data-bs-target]="'#' + id"
1324
- data-bs-slide="prev"
1325
- >
1326
- <span class="carousel-control-prev-icon" aria-hidden="true"></span>
1327
- <span class="visually-hidden">Previous</span>
1328
- </button>
1329
- <button
1330
- *ngIf="!hideControls"
1331
- class="carousel-control-next"
1332
- type="button"
1333
- [attr.data-bs-target]="'#' + id"
1334
- data-bs-slide="next"
1335
- >
1336
- <span class="carousel-control-next-icon" aria-hidden="true"></span>
1337
- <span class="visually-hidden">Next</span>
1338
- </button>
1339
- `,
1331
+ }
1332
+ <div class="carousel-inner">
1333
+ <ng-content select="rlb-carousel-slide" />
1334
+ </div>
1335
+ @if (!hideControls) {
1336
+ <button
1337
+ class="carousel-control-prev"
1338
+ type="button"
1339
+ [attr.data-bs-target]="'#' + id"
1340
+ data-bs-slide="prev"
1341
+ >
1342
+ <span class="carousel-control-prev-icon" aria-hidden="true"></span>
1343
+ <span class="visually-hidden">Previous</span>
1344
+ </button>
1345
+ }
1346
+ @if (!hideControls) {
1347
+ <button
1348
+ class="carousel-control-next"
1349
+ type="button"
1350
+ [attr.data-bs-target]="'#' + id"
1351
+ data-bs-slide="next"
1352
+ >
1353
+ <span class="carousel-control-next-icon" aria-hidden="true"></span>
1354
+ <span class="visually-hidden">Next</span>
1355
+ </button>
1356
+ }
1357
+ `,
1340
1358
  host: {
1341
1359
  class: 'carousel slide',
1342
1360
  '[class.carousel-fade]': 'crossFade',
@@ -1346,7 +1364,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
1346
1364
  '[attr.data-bs-interval]': 'interval',
1347
1365
  '[attr.data-bs-keyboard]': '!keyboard ? "false" : undefined',
1348
1366
  '[attr.data-bs-wrap]': '!wrap ? "false" : undefined',
1349
- '[attr.data-bs-pause]': 'pause === false ? "false" : undefined',
1367
+ '[attr.data-bs-pause]': 'pauseProp === false ? "false" : undefined',
1350
1368
  },
1351
1369
  standalone: false
1352
1370
  }]
@@ -1465,15 +1483,23 @@ class DropdownContainerComponent {
1465
1483
  }
1466
1484
  }
1467
1485
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DropdownContainerComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
1468
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: DropdownContainerComponent, isStandalone: false, selector: "ul[rlb-dropdown-menu], rlb-dropdown-container", inputs: { placement: "placement", placementSm: ["placement-sm", "placementSm"], placementMd: ["placement-md", "placementMd"], placementLg: ["placement-lg", "placementLg"], placementXl: ["placement-xl", "placementXl"], placementXxl: ["placement-xxl", "placementXxl"] }, host: { properties: { "class.dropdown-menu-end": "placement === \"right\"", "class.dropdown-menu-start": "placement === \"left\"", "class.dropdown-menu-sm-end": "placementSm === \"right\"", "class.dropdown-menu-sm-start": "placementSm === \"left\"", "class.dropdown-menu-md-end": "placementMd === \"right\"", "class.dropdown-menu-md-start": "placementMd === \"left\"", "class.dropdown-menu-lg-end": "placementLg === \"right\"", "class.dropdown-menu-lg-start": "placementLg === \"left\"", "class.dropdown-menu-xl-end": "placementXl === \"right\"", "class.dropdown-menu-xl-start": "placementXl === \"left\"", "class.dropdown-menu-xxl-end": "placementXxl === \"right\"", "class.dropdown-menu-xxl-start": "placementXxl === \"left\"", "style.border": "isList ? null : \"none\"", "style.padding": "isList ? null : \"0px\"" }, classAttribute: "dropdown-menu" }, ngImport: i0, template: ` <ng-content *ngIf="isList" select="li[rlb-dropdown-item]" />
1469
- <ng-content *ngIf="!isList" />`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
1486
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DropdownContainerComponent, isStandalone: false, selector: "ul[rlb-dropdown-menu], rlb-dropdown-container", inputs: { placement: "placement", placementSm: ["placement-sm", "placementSm"], placementMd: ["placement-md", "placementMd"], placementLg: ["placement-lg", "placementLg"], placementXl: ["placement-xl", "placementXl"], placementXxl: ["placement-xxl", "placementXxl"] }, host: { properties: { "class.dropdown-menu-end": "placement === \"right\"", "class.dropdown-menu-start": "placement === \"left\"", "class.dropdown-menu-sm-end": "placementSm === \"right\"", "class.dropdown-menu-sm-start": "placementSm === \"left\"", "class.dropdown-menu-md-end": "placementMd === \"right\"", "class.dropdown-menu-md-start": "placementMd === \"left\"", "class.dropdown-menu-lg-end": "placementLg === \"right\"", "class.dropdown-menu-lg-start": "placementLg === \"left\"", "class.dropdown-menu-xl-end": "placementXl === \"right\"", "class.dropdown-menu-xl-start": "placementXl === \"left\"", "class.dropdown-menu-xxl-end": "placementXxl === \"right\"", "class.dropdown-menu-xxl-start": "placementXxl === \"left\"", "style.border": "isList ? null : \"none\"", "style.padding": "isList ? null : \"0px\"" }, classAttribute: "dropdown-menu" }, ngImport: i0, template: ` @if (isList) {
1487
+ <ng-content select="li[rlb-dropdown-item]" />
1488
+ }
1489
+ @if (!isList) {
1490
+ <ng-content />
1491
+ }`, isInline: true }); }
1470
1492
  }
1471
1493
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DropdownContainerComponent, decorators: [{
1472
1494
  type: Component,
1473
1495
  args: [{
1474
1496
  selector: 'ul[rlb-dropdown-menu], rlb-dropdown-container',
1475
- template: ` <ng-content *ngIf="isList" select="li[rlb-dropdown-item]" />
1476
- <ng-content *ngIf="!isList" />`,
1497
+ template: ` @if (isList) {
1498
+ <ng-content select="li[rlb-dropdown-item]" />
1499
+ }
1500
+ @if (!isList) {
1501
+ <ng-content />
1502
+ }`,
1477
1503
  host: {
1478
1504
  class: 'dropdown-menu',
1479
1505
  '[class.dropdown-menu-end]': 'placement === "right"',
@@ -1518,75 +1544,87 @@ class DropdownMenuItemComponent {
1518
1544
  this.link = '';
1519
1545
  }
1520
1546
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DropdownMenuItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1521
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "20.3.16", type: DropdownMenuItemComponent, isStandalone: false, selector: "li[rlb-dropdown-item]", inputs: { active: ["active", "active", booleanAttribute], disabled: ["disabled", "disabled", booleanAttribute], header: ["header", "header", booleanAttribute], divider: ["divider", "divider", booleanAttribute], link: "link", textWrap: ["text-wrap", "textWrap", booleanAttribute] }, ngImport: i0, template: `
1522
- <span
1523
- *ngIf="!link && !divider && !header"
1524
- class="dropdown-item "
1525
- role="button"
1526
- [class.active]="active"
1527
- [class.disabled]="disabled"
1528
- [class.text-wrap]="textWrap"
1529
- [class.text-break]="textWrap"
1530
- [attr.aria-current]="active"
1531
- [attr.aria-disabled]="disabled"
1532
- >
1533
- <ng-container *ngTemplateOutlet="content"></ng-container>
1534
- </span>
1535
- <a
1536
- *ngIf="link"
1537
- class="dropdown-item "
1538
- [routerLink]="link"
1539
- [class.active]="active"
1540
- [class.disabled]="disabled"
1541
- [class.text-wrap]="textWrap"
1542
- [class.text-break]="textWrap"
1543
- [attr.aria-current]="active"
1544
- [attr.aria-disabled]="disabled"
1545
- >
1546
- <ng-container *ngTemplateOutlet="content"></ng-container>
1547
- </a>
1548
- <h6 *ngIf="header" class="dropdown-header">
1549
- <ng-container *ngTemplateOutlet="content"></ng-container>
1550
- </h6>
1551
- <hr *ngIf="divider" class="dropdown-divider" />
1552
- <ng-template #content><ng-content /></ng-template>`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] }); }
1547
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DropdownMenuItemComponent, isStandalone: false, selector: "li[rlb-dropdown-item]", inputs: { active: ["active", "active", booleanAttribute], disabled: ["disabled", "disabled", booleanAttribute], header: ["header", "header", booleanAttribute], divider: ["divider", "divider", booleanAttribute], link: "link", textWrap: ["text-wrap", "textWrap", booleanAttribute] }, ngImport: i0, template: `
1548
+ @if (!link && !divider && !header) {
1549
+ <span
1550
+ class="dropdown-item "
1551
+ role="button"
1552
+ [class.active]="active"
1553
+ [class.disabled]="disabled"
1554
+ [class.text-wrap]="textWrap"
1555
+ [class.text-break]="textWrap"
1556
+ [attr.aria-current]="active"
1557
+ [attr.aria-disabled]="disabled"
1558
+ >
1559
+ <ng-container *ngTemplateOutlet="content"></ng-container>
1560
+ </span>
1561
+ }
1562
+ @if (link) {
1563
+ <a
1564
+ class="dropdown-item "
1565
+ [routerLink]="link"
1566
+ [class.active]="active"
1567
+ [class.disabled]="disabled"
1568
+ [class.text-wrap]="textWrap"
1569
+ [class.text-break]="textWrap"
1570
+ [attr.aria-current]="active"
1571
+ [attr.aria-disabled]="disabled"
1572
+ >
1573
+ <ng-container *ngTemplateOutlet="content"></ng-container>
1574
+ </a>
1575
+ }
1576
+ @if (header) {
1577
+ <h6 class="dropdown-header">
1578
+ <ng-container *ngTemplateOutlet="content"></ng-container>
1579
+ </h6>
1580
+ }
1581
+ @if (divider) {
1582
+ <hr class="dropdown-divider" />
1583
+ }
1584
+ <ng-template #content><ng-content /></ng-template>`, isInline: true, dependencies: [{ kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] }); }
1553
1585
  }
1554
1586
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DropdownMenuItemComponent, decorators: [{
1555
1587
  type: Component,
1556
1588
  args: [{
1557
1589
  selector: 'li[rlb-dropdown-item]',
1558
1590
  template: `
1559
- <span
1560
- *ngIf="!link && !divider && !header"
1561
- class="dropdown-item "
1562
- role="button"
1563
- [class.active]="active"
1564
- [class.disabled]="disabled"
1565
- [class.text-wrap]="textWrap"
1566
- [class.text-break]="textWrap"
1567
- [attr.aria-current]="active"
1568
- [attr.aria-disabled]="disabled"
1569
- >
1570
- <ng-container *ngTemplateOutlet="content"></ng-container>
1571
- </span>
1572
- <a
1573
- *ngIf="link"
1574
- class="dropdown-item "
1575
- [routerLink]="link"
1576
- [class.active]="active"
1577
- [class.disabled]="disabled"
1578
- [class.text-wrap]="textWrap"
1579
- [class.text-break]="textWrap"
1580
- [attr.aria-current]="active"
1581
- [attr.aria-disabled]="disabled"
1582
- >
1583
- <ng-container *ngTemplateOutlet="content"></ng-container>
1584
- </a>
1585
- <h6 *ngIf="header" class="dropdown-header">
1586
- <ng-container *ngTemplateOutlet="content"></ng-container>
1587
- </h6>
1588
- <hr *ngIf="divider" class="dropdown-divider" />
1589
- <ng-template #content><ng-content /></ng-template>`,
1591
+ @if (!link && !divider && !header) {
1592
+ <span
1593
+ class="dropdown-item "
1594
+ role="button"
1595
+ [class.active]="active"
1596
+ [class.disabled]="disabled"
1597
+ [class.text-wrap]="textWrap"
1598
+ [class.text-break]="textWrap"
1599
+ [attr.aria-current]="active"
1600
+ [attr.aria-disabled]="disabled"
1601
+ >
1602
+ <ng-container *ngTemplateOutlet="content"></ng-container>
1603
+ </span>
1604
+ }
1605
+ @if (link) {
1606
+ <a
1607
+ class="dropdown-item "
1608
+ [routerLink]="link"
1609
+ [class.active]="active"
1610
+ [class.disabled]="disabled"
1611
+ [class.text-wrap]="textWrap"
1612
+ [class.text-break]="textWrap"
1613
+ [attr.aria-current]="active"
1614
+ [attr.aria-disabled]="disabled"
1615
+ >
1616
+ <ng-container *ngTemplateOutlet="content"></ng-container>
1617
+ </a>
1618
+ }
1619
+ @if (header) {
1620
+ <h6 class="dropdown-header">
1621
+ <ng-container *ngTemplateOutlet="content"></ng-container>
1622
+ </h6>
1623
+ }
1624
+ @if (divider) {
1625
+ <hr class="dropdown-divider" />
1626
+ }
1627
+ <ng-template #content><ng-content /></ng-template>`,
1590
1628
  standalone: false
1591
1629
  }]
1592
1630
  }], propDecorators: { active: [{
@@ -1745,7 +1783,7 @@ class ProgressComponent {
1745
1783
  return ((this.value - this.min) / (this.max - this.min)) * 100;
1746
1784
  }
1747
1785
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ProgressComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1748
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "20.3.16", type: ProgressComponent, isStandalone: false, selector: "rlb-progress", inputs: { max: ["max", "max", numberAttribute], min: ["min", "min", numberAttribute], value: ["value", "value", numberAttribute], height: ["height", "height", numberAttribute], animated: ["animated", "animated", booleanAttribute], striped: ["striped", "striped", booleanAttribute], infinite: ["infinite", "infinite", booleanAttribute], ariaLabel: ["aria-label", "ariaLabel"], showValue: ["showValue", "showValue", booleanAttribute], color: "color", textColor: ["text-color", "textColor"] }, host: { attributes: { "attr.role": "progressbar", "aria-valuemin": "0" }, properties: { "attr.aria-valuenow": "getPercentValue()", "attr.aria-valuemax": "max", "attr.aria-valuemin": "min", "attr.aria-label": "ariaLabel", "style.height.px": "height" }, classAttribute: "progress" }, ngImport: i0, template: `
1786
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: ProgressComponent, isStandalone: false, selector: "rlb-progress", inputs: { max: ["max", "max", numberAttribute], min: ["min", "min", numberAttribute], value: ["value", "value", numberAttribute], height: ["height", "height", numberAttribute], animated: ["animated", "animated", booleanAttribute], striped: ["striped", "striped", booleanAttribute], infinite: ["infinite", "infinite", booleanAttribute], ariaLabel: ["aria-label", "ariaLabel"], showValue: ["showValue", "showValue", booleanAttribute], color: "color", textColor: ["text-color", "textColor"] }, host: { attributes: { "attr.role": "progressbar", "aria-valuemin": "0" }, properties: { "attr.aria-valuenow": "getPercentValue()", "attr.aria-valuemax": "max", "attr.aria-valuemin": "min", "attr.aria-label": "ariaLabel", "style.height.px": "height" }, classAttribute: "progress" }, ngImport: i0, template: `
1749
1787
  <div
1750
1788
  class="progress-bar {{ color && !infinite? 'bg-' + color : '' }} {{ textColor? 'text-' + textColor : '' }}"
1751
1789
  [class.progress-bar-animated]="animated"
@@ -1753,14 +1791,17 @@ class ProgressComponent {
1753
1791
  [class.infinite-progress]="infinite"
1754
1792
  [style.background-color]="infinite? 'unset' : null"
1755
1793
  [style.width.%]="infinite? max :getPercentValue()">
1756
- <div *ngIf="infinite" class="inner bg-{{color}}"></div>
1757
- <span *ngIf="showValue; else e">
1758
- {{ getPercentValue() }}
1759
- </span>
1760
- <ng-template #e>
1794
+ @if (infinite) {
1795
+ <div class="inner bg-{{color}}"></div>
1796
+ }
1797
+ @if (showValue) {
1798
+ <span>
1799
+ {{ getPercentValue() }}
1800
+ </span>
1801
+ } @else {
1761
1802
  <ng-content></ng-content>
1762
- </ng-template>
1763
- </div>`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
1803
+ }
1804
+ </div>`, isInline: true }); }
1764
1805
  }
1765
1806
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ProgressComponent, decorators: [{
1766
1807
  type: Component,
@@ -1774,13 +1815,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
1774
1815
  [class.infinite-progress]="infinite"
1775
1816
  [style.background-color]="infinite? 'unset' : null"
1776
1817
  [style.width.%]="infinite? max :getPercentValue()">
1777
- <div *ngIf="infinite" class="inner bg-{{color}}"></div>
1778
- <span *ngIf="showValue; else e">
1779
- {{ getPercentValue() }}
1780
- </span>
1781
- <ng-template #e>
1818
+ @if (infinite) {
1819
+ <div class="inner bg-{{color}}"></div>
1820
+ }
1821
+ @if (showValue) {
1822
+ <span>
1823
+ {{ getPercentValue() }}
1824
+ </span>
1825
+ } @else {
1782
1826
  <ng-content></ng-content>
1783
- </ng-template>
1827
+ }
1784
1828
  </div>`,
1785
1829
  host: {
1786
1830
  class: 'progress',
@@ -2064,11 +2108,39 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
2064
2108
  args: [ComponentHostDirective, { static: true }]
2065
2109
  }] } });
2066
2110
 
2111
+ class BreakpointService {
2112
+ constructor(breakpointObserver) {
2113
+ this.breakpointObserver = breakpointObserver;
2114
+ /**
2115
+ * Observable that emits true when the screen width is <= 992px.
2116
+ * This corresponds to the BS992 breakpoint used in the sidebar.
2117
+ */
2118
+ this.isMobile$ = this.breakpointObserver
2119
+ .observe(['(max-width: 992px)'])
2120
+ .pipe(map((state) => state.matches), shareReplay(1));
2121
+ }
2122
+ /**
2123
+ * Returns the current mobile state.
2124
+ */
2125
+ get isMobile() {
2126
+ return this.breakpointObserver.isMatched('(max-width: 992px)');
2127
+ }
2128
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: BreakpointService, deps: [{ token: i2$1.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Injectable }); }
2129
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: BreakpointService, providedIn: 'root' }); }
2130
+ }
2131
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: BreakpointService, decorators: [{
2132
+ type: Injectable,
2133
+ args: [{
2134
+ providedIn: 'root'
2135
+ }]
2136
+ }], ctorParameters: () => [{ type: i2$1.BreakpointObserver }] });
2137
+
2067
2138
  class ModalDirective {
2068
- constructor(el, renderer, innerModalService) {
2139
+ constructor(el, renderer, innerModalService, breakpointService) {
2069
2140
  this.el = el;
2070
2141
  this.renderer = renderer;
2071
2142
  this.innerModalService = innerModalService;
2143
+ this.breakpointService = breakpointService;
2072
2144
  this.triggerElement = null;
2073
2145
  this._openChange_f = (e) => {
2074
2146
  this.innerModalService.eventModal(e.type.replace('.bs.modal', ''), this._modalReason, this.id, this.instance?.result);
@@ -2128,6 +2200,10 @@ class ModalDirective {
2128
2200
  if (this.options?.size) {
2129
2201
  this.renderer.addClass(this.dialogElement, `modal-${this.options.size}`);
2130
2202
  }
2203
+ const isFullscreenUndefined = this.options?.fullscreen === undefined;
2204
+ if (isFullscreenUndefined && this.breakpointService.isMobile) {
2205
+ this.renderer.addClass(this.dialogElement, `modal-fullscreen`);
2206
+ }
2131
2207
  if (this.options?.fullscreen === true) {
2132
2208
  this.renderer.addClass(this.dialogElement, `modal-fullscreen`);
2133
2209
  }
@@ -2190,7 +2266,7 @@ class ModalDirective {
2190
2266
  });
2191
2267
  }
2192
2268
  }
2193
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ModalDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: InnerModalService }], target: i0.ɵɵFactoryTarget.Directive }); }
2269
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ModalDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: InnerModalService }, { token: BreakpointService }], target: i0.ɵɵFactoryTarget.Directive }); }
2194
2270
  static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.16", type: ModalDirective, isStandalone: true, selector: "[rlb-modal]", inputs: { id: "id", instance: ["data-instance", "instance"], options: ["data-options", "options"] }, ngImport: i0 }); }
2195
2271
  }
2196
2272
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ModalDirective, decorators: [{
@@ -2199,7 +2275,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
2199
2275
  selector: '[rlb-modal]',
2200
2276
  standalone: true,
2201
2277
  }]
2202
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: InnerModalService }], propDecorators: { id: [{
2278
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: InnerModalService }, { type: BreakpointService }], propDecorators: { id: [{
2203
2279
  type: Input,
2204
2280
  args: [{ alias: 'id' }]
2205
2281
  }], instance: [{
@@ -2466,22 +2542,23 @@ class AvatarComponent {
2466
2542
  this.viewContainerRef.element.nativeElement.remove();
2467
2543
  }
2468
2544
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AvatarComponent, deps: [{ token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component }); }
2469
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "20.3.16", type: AvatarComponent, isStandalone: false, selector: "rlb-avatar", inputs: { size: ["size", "size", numberAttribute], shape: "shape", src: "src", cssClass: ["class", "cssClass"] }, viewQueries: [{ propertyName: "template", first: true, predicate: ["template"], descendants: true, static: true }], ngImport: i0, template: `
2545
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: AvatarComponent, isStandalone: false, selector: "rlb-avatar", inputs: { size: ["size", "size", numberAttribute], shape: "shape", src: "src", cssClass: ["class", "cssClass"] }, viewQueries: [{ propertyName: "template", first: true, predicate: ["template"], descendants: true, static: true }], ngImport: i0, template: `
2470
2546
  <ng-template #template>
2471
- <img
2472
- *ngIf="src"
2473
- [src]="src"
2474
- alt="Avatar"
2475
- [class]="cssClass"
2476
- [style.vertical-align]="'middle'"
2477
- [style.width.px]="size"
2478
- [style.width.px]="size"
2479
- [style.height.px]="size"
2480
- [style.border]="'2px solid #cbcbcb'"
2481
- [style.border-radius]="_borderRadius"
2482
- />
2547
+ @if (src) {
2548
+ <img
2549
+ [src]="src"
2550
+ alt="Avatar"
2551
+ [class]="cssClass"
2552
+ [style.vertical-align]="'middle'"
2553
+ [style.width.px]="size"
2554
+ [style.width.px]="size"
2555
+ [style.height.px]="size"
2556
+ [style.border]="'2px solid #cbcbcb'"
2557
+ [style.border-radius]="_borderRadius"
2558
+ />
2559
+ }
2483
2560
  </ng-template>
2484
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
2561
+ `, isInline: true }); }
2485
2562
  }
2486
2563
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AvatarComponent, decorators: [{
2487
2564
  type: Component,
@@ -2489,20 +2566,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
2489
2566
  selector: 'rlb-avatar',
2490
2567
  template: `
2491
2568
  <ng-template #template>
2492
- <img
2493
- *ngIf="src"
2494
- [src]="src"
2495
- alt="Avatar"
2496
- [class]="cssClass"
2497
- [style.vertical-align]="'middle'"
2498
- [style.width.px]="size"
2499
- [style.width.px]="size"
2500
- [style.height.px]="size"
2501
- [style.border]="'2px solid #cbcbcb'"
2502
- [style.border-radius]="_borderRadius"
2503
- />
2569
+ @if (src) {
2570
+ <img
2571
+ [src]="src"
2572
+ alt="Avatar"
2573
+ [class]="cssClass"
2574
+ [style.vertical-align]="'middle'"
2575
+ [style.width.px]="size"
2576
+ [style.width.px]="size"
2577
+ [style.height.px]="size"
2578
+ [style.border]="'2px solid #cbcbcb'"
2579
+ [style.border-radius]="_borderRadius"
2580
+ />
2581
+ }
2504
2582
  </ng-template>
2505
- `,
2583
+ `,
2506
2584
  standalone: false
2507
2585
  }]
2508
2586
  }], ctorParameters: () => [{ type: i0.ViewContainerRef }], propDecorators: { size: [{
@@ -2559,7 +2637,7 @@ class RlbFabComponent {
2559
2637
  }
2560
2638
  }
2561
2639
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: RlbFabComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2562
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "20.3.16", type: RlbFabComponent, isStandalone: false, selector: "rlb-fab", inputs: { color: "color", size: "size", disabled: ["disabled", "disabled", booleanAttribute], outline: ["outline", "outline", booleanAttribute], position: "position" }, ngImport: i0, template: "<button\n rlb-button\n [color]=\"color\"\n [disabled]=\"disabled\"\n [outline]=\"outline\"\n class=\"fab-button d-flex align-items-center justify-content-center\"\n [ngClass]=\"[sizeClass, positionClass]\"\n>\n <ng-content></ng-content>\n</button>\n", styles: [".fab-button{border-radius:50%;box-shadow:0 4px 12px #00000040;z-index:1050;transition:transform .2s ease,box-shadow .2s ease;padding:0}.fab-button:hover{transform:scale(1.08);box-shadow:0 6px 18px #00000059}.fab-button:active{transform:scale(.95)}:host{width:fit-content;display:block}.fab-xs{width:32px;height:32px;font-size:1rem}.fab-sm{width:44px;height:44px;font-size:1.2rem}.fab-md{width:56px;height:56px;font-size:1.4rem}.fab-lg{width:68px;height:68px;font-size:1.7rem}.fab-bottom-right{bottom:24px;right:24px}.fab-bottom-left{bottom:24px;left:24px}.fab-top-right{top:24px;right:24px}.fab-top-left{top:24px;left:24px}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }] }); }
2640
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "20.3.16", type: RlbFabComponent, isStandalone: false, selector: "rlb-fab", inputs: { color: "color", size: "size", disabled: ["disabled", "disabled", booleanAttribute], outline: ["outline", "outline", booleanAttribute], position: "position" }, ngImport: i0, template: "<button\n rlb-button\n [color]=\"color\"\n [disabled]=\"disabled\"\n [outline]=\"outline\"\n class=\"fab-button d-flex align-items-center justify-content-center\"\n [ngClass]=\"[sizeClass, positionClass]\"\n>\n <ng-content></ng-content>\n</button>\n", styles: [".fab-button{border-radius:50%;box-shadow:0 4px 12px #00000040;z-index:1050;transition:transform .2s ease,box-shadow .2s ease;padding:0}.fab-button:hover{transform:scale(1.08);box-shadow:0 6px 18px #00000059}.fab-button:active{transform:scale(.95)}:host{width:fit-content;display:block}.fab-xs{width:32px;height:32px;font-size:1rem}.fab-sm{width:44px;height:44px;font-size:1.2rem}.fab-md{width:56px;height:56px;font-size:1.4rem}.fab-lg{width:68px;height:68px;font-size:1.7rem}.fab-bottom-right{bottom:24px;right:24px}.fab-bottom-left{bottom:24px;left:24px}.fab-top-right{top:24px;right:24px}.fab-top-left{top:24px;left:24px}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }] }); }
2563
2641
  }
2564
2642
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: RlbFabComponent, decorators: [{
2565
2643
  type: Component,
@@ -2578,6 +2656,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
2578
2656
  type: Input
2579
2657
  }] } });
2580
2658
 
2659
+ const DEFAULT_CALENDAR_LAYOUT = {
2660
+ rowHeight: 110,
2661
+ maxBodyHeight: 30,
2662
+ minHeaderHeight: 3.5
2663
+ };
2664
+
2581
2665
  function isSameDay(a, b) {
2582
2666
  return a.yearUTC === b.yearUTC &&
2583
2667
  a.monthUTC === b.monthUTC &&
@@ -2895,6 +2979,10 @@ class CalendarHeaderComponent {
2895
2979
  .add(1, 'month');
2896
2980
  this.dateChange.emit(new DateTz(nextMonth));
2897
2981
  break;
2982
+ case 'day':
2983
+ const nextDay = addDays(this.currentDate, 1);
2984
+ this.dateChange.emit(new DateTz(nextDay));
2985
+ break;
2898
2986
  default:
2899
2987
  break;
2900
2988
  }
@@ -2911,6 +2999,10 @@ class CalendarHeaderComponent {
2911
2999
  .add(-1, 'month');
2912
3000
  this.dateChange.emit(new DateTz(pastMonth));
2913
3001
  break;
3002
+ case 'day':
3003
+ const nextDay = addDays(this.currentDate, -1);
3004
+ this.dateChange.emit(new DateTz(nextDay));
3005
+ break;
2914
3006
  default:
2915
3007
  break;
2916
3008
  }
@@ -2925,7 +3017,7 @@ class CalendarHeaderComponent {
2925
3017
  }
2926
3018
  }
2927
3019
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CalendarHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2928
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: CalendarHeaderComponent, isStandalone: false, selector: "rlb-calendar-header", inputs: { view: "view", currentDate: "currentDate" }, outputs: { dateChange: "dateChange", viewChange: "viewChange" }, ngImport: i0, template: "<div class=\"d-flex justify-content-between align-items-center mb-3\">\n\t<div class=\"d-flex gap-1\">\n\t\t<button rlb-button outline (click)=\"prev()\">\n\t\t\t<i class=\"bi bi-chevron-left\"></i>\n\t\t</button>\n\t\t<button rlb-button outline (click)=\"today()\">Today</button>\n\t\t<button rlb-button outline (click)=\"next()\">\n\t\t\t<i class=\"bi-chevron-right\"></i>\n\t\t</button>\n\t</div>\n\n <h5 class=\"mb-0\">{{ currentDate | dtz:'DD MM yyyy' | monthFormatter }} {{ currentDate.timezone }}</h5>\n\n\t<rlb-dropdown>\n\t\t<button rlb-button outline rlb-dropdown>{{ view | titlecase }}</button>\n\t\t<ul rlb-dropdown-menu [placement]=\"'right'\">\n\t\t\t<li rlb-dropdown-item (click)=\"viewChange.emit('day')\" >Day</li>\n\t\t\t<li rlb-dropdown-item (click)=\"viewChange.emit('week')\">Week</li>\n\t\t\t<li rlb-dropdown-item (click)=\"viewChange.emit('month')\">Month</li>\n\t\t</ul>\n\t</rlb-dropdown>\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "component", type: DropdownComponent, selector: "rlb-dropdown", inputs: ["direction"] }, { kind: "component", type: DropdownContainerComponent, selector: "ul[rlb-dropdown-menu], rlb-dropdown-container", inputs: ["placement", "placement-sm", "placement-md", "placement-lg", "placement-xl", "placement-xxl"] }, { kind: "component", type: DropdownMenuItemComponent, selector: "li[rlb-dropdown-item]", inputs: ["active", "disabled", "header", "divider", "link", "text-wrap"] }, { kind: "directive", type: DropdownDirective, selector: "a[rlb-dropdown], button[rlb-dropdown], span[rlb-badge][rlb-dropdown]", inputs: ["offset", "auto-close"], outputs: ["status-changed"] }, { kind: "pipe", type: i1.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: DateTzPipe, name: "dtz" }, { kind: "pipe", type: MonthFormatterPipe, name: "monthFormatter" }] }); }
3020
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: CalendarHeaderComponent, isStandalone: false, selector: "rlb-calendar-header", inputs: { view: "view", currentDate: "currentDate" }, outputs: { dateChange: "dateChange", viewChange: "viewChange" }, ngImport: i0, template: "<div class=\"d-flex justify-content-between align-items-center mb-3\">\n\t<div class=\"d-flex gap-1\">\n\t\t<button rlb-button outline (click)=\"prev()\">\n\t\t\t<i class=\"bi bi-chevron-left\"></i>\n\t\t</button>\n\t\t<button rlb-button outline (click)=\"today()\">Today</button>\n\t\t<button rlb-button outline (click)=\"next()\">\n\t\t\t<i class=\"bi-chevron-right\"></i>\n\t\t</button>\n\t</div>\n\n <h5 class=\"mb-0\">{{ currentDate | dtz:'DD MM yyyy' | monthFormatter }} {{ currentDate.timezone }}</h5>\n\n\t<rlb-dropdown>\n\t\t<button rlb-button outline rlb-dropdown>{{ view | titlecase }}</button>\n\t\t<ul rlb-dropdown-menu [placement]=\"'right'\">\n\t\t\t<li rlb-dropdown-item (click)=\"viewChange.emit('day')\" >Day</li>\n\t\t\t<li rlb-dropdown-item (click)=\"viewChange.emit('week')\">Week</li>\n\t\t\t<li rlb-dropdown-item (click)=\"viewChange.emit('month')\">Month</li>\n\t\t</ul>\n\t</rlb-dropdown>\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "component", type: DropdownComponent, selector: "rlb-dropdown", inputs: ["direction"] }, { kind: "component", type: DropdownContainerComponent, selector: "ul[rlb-dropdown-menu], rlb-dropdown-container", inputs: ["placement", "placement-sm", "placement-md", "placement-lg", "placement-xl", "placement-xxl"] }, { kind: "component", type: DropdownMenuItemComponent, selector: "li[rlb-dropdown-item]", inputs: ["active", "disabled", "header", "divider", "link", "text-wrap"] }, { kind: "directive", type: DropdownDirective, selector: "a[rlb-dropdown], button[rlb-dropdown], span[rlb-badge][rlb-dropdown]", inputs: ["offset", "auto-close"], outputs: ["status-changed"] }, { kind: "pipe", type: i3.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: DateTzPipe, name: "dtz" }, { kind: "pipe", type: MonthFormatterPipe, name: "monthFormatter" }] }); }
2929
3021
  }
2930
3022
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CalendarHeaderComponent, decorators: [{
2931
3023
  type: Component,
@@ -2988,11 +3080,11 @@ class CalendarEventComponent {
2988
3080
  }
2989
3081
  }
2990
3082
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CalendarEventComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2991
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: CalendarEventComponent, isStandalone: false, selector: "rlb-calendar-event", inputs: { event: "event", view: "view" }, outputs: { eventClick: "eventClick", eventContainerClick: "eventContainerClick" }, ngImport: i0, template: "<div [ngClass]=\"classes\"\n (click)=\"onClick($event)\">\n\n <ng-container *ngIf=\"!event.isOverflowIndicator\">\n <strong>{{ event.title }}</strong>\n <div class=\"small opacity-75\">\n {{ event.start | dtz:'HH:mm' }} - {{ event.end | dtz:'HH:mm' }}\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"event.isOverflowIndicator\">\n +{{ event.overlapCount }} more\n </ng-container>\n</div>\n", styles: [":host{display:block;height:100%;overflow:hidden;border-radius:var(--bs-border-radius-sm);padding:0 1px;box-sizing:border-box;transition:box-shadow .2s}:host:hover{z-index:50;box-shadow:0 .5rem 1rem #00000026!important}.calendar-event{height:100%;width:100%;padding:2px 4px;font-size:.75rem;line-height:1.2;border-radius:var(--bs-border-radius-sm);cursor:pointer}.calendar-event.overflow-indicator{display:flex;align-items:center;justify-content:center;font-weight:600;border-style:dashed!important}.calendar-event.mode-week{height:100%;padding:2px 4px;font-size:.75rem;line-height:1.2}.calendar-event.mode-month{height:20px!important;padding:0 4px;line-height:20px;font-size:.75rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.calendar-event.mode-month.rounded-bottom-0{border-bottom-right-radius:0;border-bottom-left-radius:0}.calendar-event.mode-month.rounded-top-0{border-top-right-radius:0;border-top-left-radius:0}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: DateTzPipe, name: "dtz" }] }); }
3083
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: CalendarEventComponent, isStandalone: false, selector: "rlb-calendar-event", inputs: { event: "event", view: "view" }, outputs: { eventClick: "eventClick", eventContainerClick: "eventContainerClick" }, ngImport: i0, template: "<div [ngClass]=\"classes\"\n (click)=\"onClick($event)\">\n\n @if (!event.isOverflowIndicator) {\n <strong>{{ event.title }}</strong>\n <div class=\"small opacity-75\">\n {{ event.start | dtz:'HH:mm' }} - {{ event.end | dtz:'HH:mm' }}\n </div>\n }\n\n @if (event.isOverflowIndicator) {\n +{{ event.overlapCount }} more\n }\n</div>\n", styles: [":host{display:block;height:100%;overflow:hidden;border-radius:var(--bs-border-radius-sm);padding:0 1px;box-sizing:border-box;transition:box-shadow .2s}:host:hover{z-index:50;box-shadow:0 .5rem 1rem #00000026!important}.calendar-event{height:100%;width:100%;padding:2px 4px;font-size:.75rem;line-height:1.2;border-radius:var(--bs-border-radius-sm);cursor:pointer}.calendar-event.overflow-indicator{display:flex;align-items:center;justify-content:center;font-weight:600;border-style:dashed!important}.calendar-event.mode-week{height:100%;padding:2px 4px;font-size:.75rem;line-height:1.2}.calendar-event.mode-month{height:20px!important;padding:0 4px;line-height:20px;font-size:.75rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.calendar-event.mode-month.rounded-bottom-0{border-bottom-right-radius:0;border-bottom-left-radius:0}.calendar-event.mode-month.rounded-top-0{border-top-right-radius:0;border-top-left-radius:0}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: DateTzPipe, name: "dtz" }] }); }
2992
3084
  }
2993
3085
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CalendarEventComponent, decorators: [{
2994
3086
  type: Component,
2995
- args: [{ selector: 'rlb-calendar-event', standalone: false, template: "<div [ngClass]=\"classes\"\n (click)=\"onClick($event)\">\n\n <ng-container *ngIf=\"!event.isOverflowIndicator\">\n <strong>{{ event.title }}</strong>\n <div class=\"small opacity-75\">\n {{ event.start | dtz:'HH:mm' }} - {{ event.end | dtz:'HH:mm' }}\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"event.isOverflowIndicator\">\n +{{ event.overlapCount }} more\n </ng-container>\n</div>\n", styles: [":host{display:block;height:100%;overflow:hidden;border-radius:var(--bs-border-radius-sm);padding:0 1px;box-sizing:border-box;transition:box-shadow .2s}:host:hover{z-index:50;box-shadow:0 .5rem 1rem #00000026!important}.calendar-event{height:100%;width:100%;padding:2px 4px;font-size:.75rem;line-height:1.2;border-radius:var(--bs-border-radius-sm);cursor:pointer}.calendar-event.overflow-indicator{display:flex;align-items:center;justify-content:center;font-weight:600;border-style:dashed!important}.calendar-event.mode-week{height:100%;padding:2px 4px;font-size:.75rem;line-height:1.2}.calendar-event.mode-month{height:20px!important;padding:0 4px;line-height:20px;font-size:.75rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.calendar-event.mode-month.rounded-bottom-0{border-bottom-right-radius:0;border-bottom-left-radius:0}.calendar-event.mode-month.rounded-top-0{border-top-right-radius:0;border-top-left-radius:0}\n"] }]
3087
+ args: [{ selector: 'rlb-calendar-event', standalone: false, template: "<div [ngClass]=\"classes\"\n (click)=\"onClick($event)\">\n\n @if (!event.isOverflowIndicator) {\n <strong>{{ event.title }}</strong>\n <div class=\"small opacity-75\">\n {{ event.start | dtz:'HH:mm' }} - {{ event.end | dtz:'HH:mm' }}\n </div>\n }\n\n @if (event.isOverflowIndicator) {\n +{{ event.overlapCount }} more\n }\n</div>\n", styles: [":host{display:block;height:100%;overflow:hidden;border-radius:var(--bs-border-radius-sm);padding:0 1px;box-sizing:border-box;transition:box-shadow .2s}:host:hover{z-index:50;box-shadow:0 .5rem 1rem #00000026!important}.calendar-event{height:100%;width:100%;padding:2px 4px;font-size:.75rem;line-height:1.2;border-radius:var(--bs-border-radius-sm);cursor:pointer}.calendar-event.overflow-indicator{display:flex;align-items:center;justify-content:center;font-weight:600;border-style:dashed!important}.calendar-event.mode-week{height:100%;padding:2px 4px;font-size:.75rem;line-height:1.2}.calendar-event.mode-month{height:20px!important;padding:0 4px;line-height:20px;font-size:.75rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.calendar-event.mode-month.rounded-bottom-0{border-bottom-right-radius:0;border-bottom-left-radius:0}.calendar-event.mode-month.rounded-top-0{border-top-right-radius:0;border-top-left-radius:0}\n"] }]
2996
3088
  }], propDecorators: { event: [{
2997
3089
  type: Input,
2998
3090
  args: [{ required: true }]
@@ -3050,10 +3142,7 @@ class CalendarWeekGridComponent {
3050
3142
  this.timeSlots = [];
3051
3143
  this.processedEvents = new Map();
3052
3144
  this.scrollbarWidth = 0;
3053
- // CONFIG CONSTANTS
3054
- this.ROW_HEIGHT = 110; // px for a full hour slot
3055
- this.MAX_BODY_HEIGHT = 30; // rem
3056
- this.MIN_HEADER_HEIGHT = 3.5; // rem
3145
+ // CONFIG CONSTANTS (Replaced by Layout Input)
3057
3146
  this.MAX_VISIBLE_COLUMNS = 4;
3058
3147
  this.SNAP_MINUTES = 15;
3059
3148
  // arrow function to keep "this" context
@@ -3103,7 +3192,7 @@ class CalendarWeekGridComponent {
3103
3192
  const originalTopPx = this.calculateEventTop(movedEvent);
3104
3193
  const dragDistancePx = event.distance.y;
3105
3194
  const newTopPx = originalTopPx + dragDistancePx;
3106
- const rawMinutesFromStart = (newTopPx / this.ROW_HEIGHT) * 60;
3195
+ const rawMinutesFromStart = (newTopPx / this.layout.rowHeight) * 60;
3107
3196
  const snappedMinutes = Math.round(rawMinutesFromStart / this.SNAP_MINUTES) * this.SNAP_MINUTES;
3108
3197
  const validMinutes = Math.max(0, snappedMinutes);
3109
3198
  const newStart = new DateTz$1(newDay)
@@ -3130,17 +3219,17 @@ class CalendarWeekGridComponent {
3130
3219
  const startOfDay = new DateTz$1(event.start).set(0, 'hour').set(0, 'minute').stripSecMillis();
3131
3220
  const diffMs = event.start.timestamp - startOfDay.timestamp;
3132
3221
  const diffMinutes = diffMs / (1000 * 60);
3133
- return (diffMinutes / 60) * this.ROW_HEIGHT;
3222
+ return (diffMinutes / 60) * this.layout.rowHeight;
3134
3223
  }
3135
3224
  calculateEventHeight(event) {
3136
3225
  const durationMs = event.end.timestamp - event.start.timestamp;
3137
3226
  const durationMinutes = durationMs / (1000 * 60);
3138
- return (durationMinutes / 60) * this.ROW_HEIGHT;
3227
+ return (durationMinutes / 60) * this.layout.rowHeight;
3139
3228
  }
3140
3229
  getNowTop() {
3141
3230
  const hours = this.now.hour;
3142
3231
  const minutes = this.now.minute;
3143
- return ((hours * 60) + minutes) / 60 * this.ROW_HEIGHT;
3232
+ return ((hours * 60) + minutes) / 60 * this.layout.rowHeight;
3144
3233
  }
3145
3234
  isToday(date) {
3146
3235
  return isToday(date);
@@ -3329,8 +3418,276 @@ class CalendarWeekGridComponent {
3329
3418
  overflowEvents: hiddenEvents,
3330
3419
  overlapCount: hiddenEvents.length
3331
3420
  });
3332
- }
3333
- }
3421
+ }
3422
+ }
3423
+ return resultEvents;
3424
+ }
3425
+ sortEventsStable(events) {
3426
+ return [...events].sort((a, b) => {
3427
+ const diff = a.start.timestamp - b.start.timestamp;
3428
+ if (diff !== 0)
3429
+ return diff;
3430
+ const durA = a.end.timestamp - a.start.timestamp;
3431
+ const durB = b.end.timestamp - b.start.timestamp;
3432
+ if (durB !== durA)
3433
+ return durB - durA;
3434
+ const idA = a.id ? a.id.toString() : a.title;
3435
+ const idB = b.id ? b.id.toString() : b.title;
3436
+ return idA.localeCompare(idB);
3437
+ });
3438
+ }
3439
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CalendarWeekGridComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
3440
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: CalendarWeekGridComponent, isStandalone: false, selector: "rlb-calendar-week-grid", inputs: { view: "view", currentDate: "currentDate", events: "events", layout: "layout" }, outputs: { eventClick: "eventClick", eventContainerClick: "eventContainerClick", eventChange: "eventChange" }, viewQueries: [{ propertyName: "scrollBodyRef", first: true, predicate: ["scrollBody"], descendants: true }, { propertyName: "headerRowRef", first: true, predicate: ["headerRow"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"calendar-wrapper d-flex flex-column\">\n\n <!-- HEADER WRAPPER -->\n <div #headerRow class=\"header-container overflow-hidden flex-shrink-0 border-bottom bg-body-tertiary\"\n [style.padding-right.px]=\"scrollbarWidth\">\n\n <div class=\"header-row d-flex\" [style.min-height.rem]=\"layout.minHeaderHeight\">\n\n <div class=\"time-gutter border-end flex-shrink-0\"></div>\n\n <div class=\"days-header d-flex flex-grow-1\">\n @for (day of days; track day) {\n <div class=\"day-cell text-center p-2 border-end\" [class.text-primary]=\"isToday(day)\"\n [class.fw-bold]=\"isToday(day)\" [class.bg-primary]=\"isToday(day)\">\n <div class=\"small text-uppercase text-body-secondary\">{{ day | dayOfWeek: 'short' }}</div>\n <div class=\"h5 m-0\">{{ day | dtz:'DD' }}</div>\n </div>\n }\n </div>\n </div>\n </div>\n\n <!-- BODY WRAPPER -->\n <div #scrollBody class=\"calendar-body flex-grow-1 overflow-auto bg-body position-relative\"\n (scroll)=\"onBodyScroll($event)\" [style.max-height.rem]=\"layout.maxBodyHeight\">\n\n <div class=\"body-row d-flex position-relative\">\n\n <!-- SIDEBAR (Sticky Left) -->\n <div class=\"time-sidebar sticky-start flex-shrink-0 border-end\">\n @for (time of timeSlots; track time; let i = $index) {\n <div\n class=\"time-slot-label small text-body-secondary d-flex align-items-start justify-content-center\"\n [style.height.px]=\"layout.rowHeight\">\n @if (i !== 0) {\n <span style=\"transform: translateY(-50%)\">\n {{ time }}\n </span>\n }\n </div>\n }\n </div>\n\n <!-- GRID AND EVENTS -->\n <div class=\"grid-layer flex-grow-1 position-relative\">\n\n <!-- LAYER 1: Grid -->\n <div class=\"background-grid position-absolute w-100 h-100 top-0 start-0 z-0\">\n @for (time of timeSlots; track time) {\n <div class=\"grid-row border-bottom\" [style.height.px]=\"layout.rowHeight\">\n </div>\n }\n </div>\n\n <!-- Layer 2: Events -->\n <div class=\"events-container d-flex h-100 w-100 position-relative z-1\" cdkDropListGroup>\n @for (day of days; track day) {\n <div class=\"day-column position-relative border-end h-100\" cdkDropList\n [cdkDropListSortingDisabled]=\"true\" [cdkDropListData]=\"day\" (cdkDropListDropped)=\"onEventDrop($event)\"\n (click)=\"eventClick.emit()\">\n @for (event of getEventsForDay(day); track trackByEventId($index, event)) {\n <rlb-calendar-event [view]=\"view\"\n [event]=\"event\" [style.top.px]=\"calculateEventTop(event)\" [style.height.px]=\"calculateEventHeight(event)\"\n [style.left.%]=\"event.left\" [style.width.%]=\"event.width\" (eventClick)=\"eventClick.emit($event)\"\n (eventContainerClick)=\"eventContainerClick.emit($event)\" cdkDrag [cdkDragData]=\"event\"\n [cdkDragDisabled]=\"event.isOverflowIndicator\" class=\"position-absolute\">\n <div *cdkDragPlaceholder style=\"opacity: 0\"></div>\n </rlb-calendar-event>\n }\n @if (isToday(day)) {\n <div class=\"now-line\" [style.top.px]=\"getNowTop()\">\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n</div>", styles: [":host{display:block;height:100%}.calendar-wrapper{background-color:var(--bs-body-bg);border:1px solid var(--bs-border-color);border-radius:var(--bs-border-radius);overflow:hidden;height:100%}.header-container{background-color:var(--bs-body-bg);z-index:102;box-shadow:0 4px 6px -4px #0000001a}.header-row{width:fit-content;min-width:100%}.time-gutter{width:60px;border-color:var(--bs-border-color)!important}.day-cell{border-color:var(--bs-border-color)!important;flex:1 1 0px;width:0;min-width:120px;overflow:hidden}.day-cell:last-child{border-right:none!important}.calendar-body{scroll-behavior:auto}.body-row{width:fit-content;min-width:100%}.sticky-start{position:sticky;left:0;z-index:50;background-color:var(--bs-body-bg)}.time-sidebar{width:60px;border-color:var(--bs-border-color)!important}.grid-row{border-color:var(--bs-border-color)!important;box-sizing:border-box}.grid-row:after{content:\"\";position:absolute;width:100%;border-bottom:1px dotted currentColor;opacity:.15;top:50%;left:0;pointer-events:none}.day-column{border-color:var(--bs-border-color)!important;flex:1 1 0px;width:0;min-width:120px}.day-column:last-child{border-right:none!important}.now-line{position:absolute;left:0;right:0;height:2px;background-color:var(--bs-danger);z-index:10;pointer-events:none}.now-line:before{content:\"\";position:absolute;left:-5px;top:-4px;width:10px;height:10px;background-color:var(--bs-danger);border-radius:50%}.z-0{z-index:0}.z-1{z-index:1}\n"], dependencies: [{ kind: "directive", type: i1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i1.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i1.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i1.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "component", type: CalendarEventComponent, selector: "rlb-calendar-event", inputs: ["event", "view"], outputs: ["eventClick", "eventContainerClick"] }, { kind: "pipe", type: DateTzPipe, name: "dtz" }, { kind: "pipe", type: DayOfWeekPipe, name: "dayOfWeek" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3441
+ }
3442
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CalendarWeekGridComponent, decorators: [{
3443
+ type: Component,
3444
+ args: [{ selector: 'rlb-calendar-week-grid', standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"calendar-wrapper d-flex flex-column\">\n\n <!-- HEADER WRAPPER -->\n <div #headerRow class=\"header-container overflow-hidden flex-shrink-0 border-bottom bg-body-tertiary\"\n [style.padding-right.px]=\"scrollbarWidth\">\n\n <div class=\"header-row d-flex\" [style.min-height.rem]=\"layout.minHeaderHeight\">\n\n <div class=\"time-gutter border-end flex-shrink-0\"></div>\n\n <div class=\"days-header d-flex flex-grow-1\">\n @for (day of days; track day) {\n <div class=\"day-cell text-center p-2 border-end\" [class.text-primary]=\"isToday(day)\"\n [class.fw-bold]=\"isToday(day)\" [class.bg-primary]=\"isToday(day)\">\n <div class=\"small text-uppercase text-body-secondary\">{{ day | dayOfWeek: 'short' }}</div>\n <div class=\"h5 m-0\">{{ day | dtz:'DD' }}</div>\n </div>\n }\n </div>\n </div>\n </div>\n\n <!-- BODY WRAPPER -->\n <div #scrollBody class=\"calendar-body flex-grow-1 overflow-auto bg-body position-relative\"\n (scroll)=\"onBodyScroll($event)\" [style.max-height.rem]=\"layout.maxBodyHeight\">\n\n <div class=\"body-row d-flex position-relative\">\n\n <!-- SIDEBAR (Sticky Left) -->\n <div class=\"time-sidebar sticky-start flex-shrink-0 border-end\">\n @for (time of timeSlots; track time; let i = $index) {\n <div\n class=\"time-slot-label small text-body-secondary d-flex align-items-start justify-content-center\"\n [style.height.px]=\"layout.rowHeight\">\n @if (i !== 0) {\n <span style=\"transform: translateY(-50%)\">\n {{ time }}\n </span>\n }\n </div>\n }\n </div>\n\n <!-- GRID AND EVENTS -->\n <div class=\"grid-layer flex-grow-1 position-relative\">\n\n <!-- LAYER 1: Grid -->\n <div class=\"background-grid position-absolute w-100 h-100 top-0 start-0 z-0\">\n @for (time of timeSlots; track time) {\n <div class=\"grid-row border-bottom\" [style.height.px]=\"layout.rowHeight\">\n </div>\n }\n </div>\n\n <!-- Layer 2: Events -->\n <div class=\"events-container d-flex h-100 w-100 position-relative z-1\" cdkDropListGroup>\n @for (day of days; track day) {\n <div class=\"day-column position-relative border-end h-100\" cdkDropList\n [cdkDropListSortingDisabled]=\"true\" [cdkDropListData]=\"day\" (cdkDropListDropped)=\"onEventDrop($event)\"\n (click)=\"eventClick.emit()\">\n @for (event of getEventsForDay(day); track trackByEventId($index, event)) {\n <rlb-calendar-event [view]=\"view\"\n [event]=\"event\" [style.top.px]=\"calculateEventTop(event)\" [style.height.px]=\"calculateEventHeight(event)\"\n [style.left.%]=\"event.left\" [style.width.%]=\"event.width\" (eventClick)=\"eventClick.emit($event)\"\n (eventContainerClick)=\"eventContainerClick.emit($event)\" cdkDrag [cdkDragData]=\"event\"\n [cdkDragDisabled]=\"event.isOverflowIndicator\" class=\"position-absolute\">\n <div *cdkDragPlaceholder style=\"opacity: 0\"></div>\n </rlb-calendar-event>\n }\n @if (isToday(day)) {\n <div class=\"now-line\" [style.top.px]=\"getNowTop()\">\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n</div>", styles: [":host{display:block;height:100%}.calendar-wrapper{background-color:var(--bs-body-bg);border:1px solid var(--bs-border-color);border-radius:var(--bs-border-radius);overflow:hidden;height:100%}.header-container{background-color:var(--bs-body-bg);z-index:102;box-shadow:0 4px 6px -4px #0000001a}.header-row{width:fit-content;min-width:100%}.time-gutter{width:60px;border-color:var(--bs-border-color)!important}.day-cell{border-color:var(--bs-border-color)!important;flex:1 1 0px;width:0;min-width:120px;overflow:hidden}.day-cell:last-child{border-right:none!important}.calendar-body{scroll-behavior:auto}.body-row{width:fit-content;min-width:100%}.sticky-start{position:sticky;left:0;z-index:50;background-color:var(--bs-body-bg)}.time-sidebar{width:60px;border-color:var(--bs-border-color)!important}.grid-row{border-color:var(--bs-border-color)!important;box-sizing:border-box}.grid-row:after{content:\"\";position:absolute;width:100%;border-bottom:1px dotted currentColor;opacity:.15;top:50%;left:0;pointer-events:none}.day-column{border-color:var(--bs-border-color)!important;flex:1 1 0px;width:0;min-width:120px}.day-column:last-child{border-right:none!important}.now-line{position:absolute;left:0;right:0;height:2px;background-color:var(--bs-danger);z-index:10;pointer-events:none}.now-line:before{content:\"\";position:absolute;left:-5px;top:-4px;width:10px;height:10px;background-color:var(--bs-danger);border-radius:50%}.z-0{z-index:0}.z-1{z-index:1}\n"] }]
3445
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { view: [{
3446
+ type: Input
3447
+ }], currentDate: [{
3448
+ type: Input
3449
+ }], events: [{
3450
+ type: Input
3451
+ }], layout: [{
3452
+ type: Input
3453
+ }], eventClick: [{
3454
+ type: Output
3455
+ }], eventContainerClick: [{
3456
+ type: Output
3457
+ }], eventChange: [{
3458
+ type: Output
3459
+ }], scrollBodyRef: [{
3460
+ type: ViewChild,
3461
+ args: ['scrollBody', { static: false }]
3462
+ }], headerRowRef: [{
3463
+ type: ViewChild,
3464
+ args: ['headerRow', { static: false }]
3465
+ }] } });
3466
+
3467
+ class CalendarDayGridComponent {
3468
+ constructor(cd) {
3469
+ this.cd = cd;
3470
+ this.events = [];
3471
+ this.eventClick = new EventEmitter();
3472
+ this.eventContainerClick = new EventEmitter();
3473
+ this.eventChange = new EventEmitter();
3474
+ this.timeSlots = [];
3475
+ this.processedEvents = [];
3476
+ // CONFIG CONSTANTS (Replaced by Layout Input)
3477
+ this.MAX_VISIBLE_COLUMNS = 10; // More columns allow in day view
3478
+ this.SNAP_MINUTES = 15;
3479
+ this.now = getToday();
3480
+ }
3481
+ ngOnChanges(changes) {
3482
+ if (changes['view'] || changes['currentDate']) {
3483
+ if (this.view === 'day') {
3484
+ this.buildDayGrid(this.currentDate);
3485
+ this.buildTimeSlots();
3486
+ }
3487
+ }
3488
+ if (changes['events']) {
3489
+ this.events = changes['events'].currentValue;
3490
+ }
3491
+ if (changes['events'] || changes['currentDate']) {
3492
+ this.processAllEvents();
3493
+ }
3494
+ }
3495
+ ngAfterViewInit() {
3496
+ this.cd.detectChanges();
3497
+ }
3498
+ ngOnDestroy() {
3499
+ this.stopNowTimer();
3500
+ }
3501
+ trackByEventId(index, item) {
3502
+ return item.id;
3503
+ }
3504
+ onEventDrop(event) {
3505
+ const movedEvent = event.item.data;
3506
+ // For day view, the container data is the single day we are viewing
3507
+ const newDay = this.day;
3508
+ const originalTopPx = this.calculateEventTop(movedEvent);
3509
+ const dragDistancePx = event.distance.y;
3510
+ const newTopPx = originalTopPx + dragDistancePx;
3511
+ const rawMinutesFromStart = (newTopPx / this.layout.rowHeight) * 60;
3512
+ const snappedMinutes = Math.round(rawMinutesFromStart / this.SNAP_MINUTES) * this.SNAP_MINUTES;
3513
+ const validMinutes = Math.max(0, snappedMinutes);
3514
+ const newStart = new DateTz$1(newDay)
3515
+ .set(0, 'hour')
3516
+ .set(0, 'minute')
3517
+ .add(validMinutes, 'minute')
3518
+ .stripSecMillis();
3519
+ const durationMs = movedEvent.end.timestamp - movedEvent.start.timestamp;
3520
+ const newEnd = new DateTz$1(newStart.timestamp + durationMs).stripSecMillis();
3521
+ if (newStart.timestamp !== movedEvent.start.timestamp) {
3522
+ const updatedEvent = {
3523
+ ...movedEvent,
3524
+ start: newStart,
3525
+ end: newEnd,
3526
+ };
3527
+ this.eventChange.emit(updatedEvent);
3528
+ }
3529
+ }
3530
+ calculateEventTop(event) {
3531
+ const startOfDay = new DateTz$1(this.day).set(0, 'hour').set(0, 'minute').stripSecMillis();
3532
+ // Use event.start directly, but ensure we are calculating relative to THIS day
3533
+ // If event starts on previous day, we should clamp?
3534
+ // Logic from week grid handles "chunks", here we assume processAllEvents has given us the chunk for this day.
3535
+ let eventStart = event.start;
3536
+ if (eventStart.timestamp < startOfDay.timestamp) {
3537
+ eventStart = startOfDay;
3538
+ }
3539
+ const diffMs = eventStart.timestamp - startOfDay.timestamp;
3540
+ const diffMinutes = diffMs / (1000 * 60);
3541
+ return (diffMinutes / 60) * this.layout.rowHeight;
3542
+ }
3543
+ calculateEventHeight(event) {
3544
+ // If event continues to next day, visual end is midnight.
3545
+ // Logic from week grid's 'processAllEvents' handled chunking, so here specific event chunk should be correct.
3546
+ const durationMs = event.end.timestamp - event.start.timestamp;
3547
+ const durationMinutes = durationMs / (1000 * 60);
3548
+ return (durationMinutes / 60) * this.layout.rowHeight;
3549
+ }
3550
+ getNowTop() {
3551
+ const hours = this.now.hour;
3552
+ const minutes = this.now.minute;
3553
+ return ((hours * 60) + minutes) / 60 * this.layout.rowHeight;
3554
+ }
3555
+ isToday(date) {
3556
+ return isToday(date);
3557
+ }
3558
+ startNowTimer() {
3559
+ this.stopNowTimer(); // clear existing if any
3560
+ this.nowInterval = setInterval(() => {
3561
+ this.now = getToday();
3562
+ this.cd.detectChanges();
3563
+ }, 60 * 1000); // every minute
3564
+ }
3565
+ stopNowTimer() {
3566
+ if (this.nowInterval) {
3567
+ clearInterval(this.nowInterval);
3568
+ }
3569
+ }
3570
+ buildDayGrid(currentDate) {
3571
+ this.day = new DateTz$1(currentDate.timestamp, 'UTC');
3572
+ this.startNowTimer();
3573
+ }
3574
+ buildTimeSlots() {
3575
+ const slots = [];
3576
+ for (let h = 0; h < 24; h++) {
3577
+ slots.push(`${h.toString().padStart(2, '0')}:00`);
3578
+ }
3579
+ this.timeSlots = slots;
3580
+ }
3581
+ isOverlapping(eventA, eventB) {
3582
+ const startA = eventA.start.timestamp;
3583
+ const endA = eventA.end.timestamp;
3584
+ const startB = eventB.start.timestamp;
3585
+ const endB = eventB.end.timestamp;
3586
+ return startA < endB && startB < endA;
3587
+ }
3588
+ processAllEvents() {
3589
+ if (!this.day)
3590
+ return;
3591
+ // Filter events for this day
3592
+ const dayStart = new DateTz$1(this.day).set(0, 'hour').set(0, 'minute').stripSecMillis();
3593
+ const dayEnd = new DateTz$1(this.day).set(0, 'hour').set(0, 'minute').add(1, 'day').stripSecMillis();
3594
+ const dayEvents = [];
3595
+ for (const event of this.events) {
3596
+ // Check overlap with the day
3597
+ if (event.end.timestamp > dayStart.timestamp && event.start.timestamp < dayEnd.timestamp) {
3598
+ let visualStart = event.start;
3599
+ let visualEnd = event.end;
3600
+ let isContinuedBefore = false;
3601
+ let isContinuedAfter = false;
3602
+ if (visualStart.timestamp < dayStart.timestamp) {
3603
+ visualStart = dayStart;
3604
+ isContinuedBefore = true;
3605
+ }
3606
+ if (visualEnd.timestamp > dayEnd.timestamp) {
3607
+ visualEnd = dayEnd;
3608
+ isContinuedAfter = true;
3609
+ }
3610
+ dayEvents.push({
3611
+ ...event,
3612
+ start: visualStart,
3613
+ end: visualEnd,
3614
+ isContinuedBefore,
3615
+ isContinuedAfter,
3616
+ left: 0,
3617
+ width: 0
3618
+ });
3619
+ }
3620
+ }
3621
+ const sortedDayEvents = this.sortEventsStable(dayEvents);
3622
+ const groups = this.groupEventsByConflicts(sortedDayEvents);
3623
+ const eventsWithLayout = [];
3624
+ for (const group of groups) {
3625
+ const groupLayouts = this.resolveConflictGroupLayout(group);
3626
+ eventsWithLayout.push(...groupLayouts);
3627
+ }
3628
+ this.processedEvents = eventsWithLayout;
3629
+ this.cd.markForCheck();
3630
+ }
3631
+ groupEventsByConflicts(dayEvents) {
3632
+ if (dayEvents.length === 0)
3633
+ return [];
3634
+ const groups = [];
3635
+ const visited = new Map();
3636
+ for (const event of dayEvents) {
3637
+ if (visited.get(event))
3638
+ continue;
3639
+ const currentGroup = [];
3640
+ const queue = [event];
3641
+ visited.set(event, true);
3642
+ while (queue.length > 0) {
3643
+ const current = queue.shift();
3644
+ currentGroup.push(current);
3645
+ for (const other of dayEvents) {
3646
+ if (!visited.get(other) && this.isOverlapping(current, other)) {
3647
+ visited.set(other, true);
3648
+ queue.push(other);
3649
+ }
3650
+ }
3651
+ }
3652
+ groups.push(currentGroup);
3653
+ }
3654
+ return groups;
3655
+ }
3656
+ resolveConflictGroupLayout(groupEvents) {
3657
+ if (!groupEvents || groupEvents.length === 0)
3658
+ return [];
3659
+ const columns = [];
3660
+ const columnLastEndTimes = [];
3661
+ for (const event of groupEvents) {
3662
+ let assignedCol = -1;
3663
+ for (let i = 0; i < columnLastEndTimes.length; i++) {
3664
+ if (columnLastEndTimes[i] <= event.start.timestamp) {
3665
+ assignedCol = i;
3666
+ break;
3667
+ }
3668
+ }
3669
+ if (assignedCol === -1) {
3670
+ assignedCol = columns.length;
3671
+ columns.push([]);
3672
+ columnLastEndTimes.push(0);
3673
+ }
3674
+ columns[assignedCol].push(event);
3675
+ columnLastEndTimes[assignedCol] = event.end.timestamp;
3676
+ }
3677
+ const totalColumns = columns.length;
3678
+ const resultEvents = [];
3679
+ // All events share the width equally
3680
+ // If needed we can expand visible max columns, but day view usually has space
3681
+ const colWidth = 100 / Math.max(1, totalColumns);
3682
+ columns.forEach((colEvents, colIndex) => {
3683
+ colEvents.forEach(event => {
3684
+ resultEvents.push({
3685
+ ...event,
3686
+ left: colIndex * colWidth,
3687
+ width: colWidth
3688
+ });
3689
+ });
3690
+ });
3334
3691
  return resultEvents;
3335
3692
  }
3336
3693
  sortEventsStable(events) {
@@ -3347,18 +3704,20 @@ class CalendarWeekGridComponent {
3347
3704
  return idA.localeCompare(idB);
3348
3705
  });
3349
3706
  }
3350
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CalendarWeekGridComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
3351
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: CalendarWeekGridComponent, isStandalone: false, selector: "rlb-calendar-week-grid", inputs: { view: "view", currentDate: "currentDate", events: "events" }, outputs: { eventClick: "eventClick", eventContainerClick: "eventContainerClick", eventChange: "eventChange" }, viewQueries: [{ propertyName: "scrollBodyRef", first: true, predicate: ["scrollBody"], descendants: true }, { propertyName: "headerRowRef", first: true, predicate: ["headerRow"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"calendar-wrapper d-flex flex-column\">\n\n <!-- HEADER WRAPPER -->\n <div #headerRow\n class=\"header-container overflow-hidden flex-shrink-0 border-bottom bg-body-tertiary\"\n [style.padding-right.px]=\"scrollbarWidth\">\n\n <div class=\"header-row d-flex\" [style.min-height.rem]=\"MIN_HEADER_HEIGHT\">\n\n <div class=\"time-gutter border-end flex-shrink-0\"></div>\n\n <div class=\"days-header d-flex flex-grow-1\">\n <div *ngFor=\"let day of days\"\n class=\"day-cell text-center p-2 border-end\"\n [class.text-primary]=\"isToday(day)\"\n [class.fw-bold]=\"isToday(day)\"\n [class.bg-primary]=\"isToday(day)\"\n >\n <div class=\"small text-uppercase text-body-secondary\">{{ day | dayOfWeek: 'short' }}</div>\n <div class=\"h5 m-0\">{{ day | dtz:'DD' }}</div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- BODY WRAPPER -->\n <div #scrollBody\n class=\"calendar-body flex-grow-1 overflow-auto bg-body position-relative\"\n (scroll)=\"onBodyScroll($event)\" [style.max-height.rem]=\"MAX_BODY_HEIGHT\">\n\n <div class=\"body-row d-flex position-relative\">\n\n <!-- SIDEBAR (Sticky Left) -->\n <div class=\"time-sidebar sticky-start flex-shrink-0 border-end\">\n <div *ngFor=\"let time of timeSlots; let i = index\"\n class=\"time-slot-label small text-body-secondary d-flex align-items-start justify-content-center\"\n [style.height.px]=\"ROW_HEIGHT\">\n <span *ngIf=\"i !== 0\" style=\"transform: translateY(-50%)\">\n {{ time }}\n </span>\n </div>\n </div>\n\n <!-- GRID AND EVENTS -->\n <div class=\"grid-layer flex-grow-1 position-relative\">\n\n <!-- LAYER 1: Grid -->\n <div class=\"background-grid position-absolute w-100 h-100 top-0 start-0 z-0\">\n <div *ngFor=\"let time of timeSlots\"\n class=\"grid-row border-bottom\"\n [style.height.px]=\"ROW_HEIGHT\">\n </div>\n </div>\n\n <!-- Layer 2: Events -->\n <div class=\"events-container d-flex h-100 w-100 position-relative z-1\" cdkDropListGroup>\n <div *ngFor=\"let day of days\"\n class=\"day-column position-relative border-end h-100\"\n cdkDropList\n [cdkDropListSortingDisabled]=\"true\"\n [cdkDropListData]=\"day\"\n (cdkDropListDropped)=\"onEventDrop($event)\"\n (click)=\"eventClick.emit()\"\n >\n\n <rlb-calendar-event\n *ngFor=\"let event of getEventsForDay(day); trackBy: trackByEventId\"\n [view]=\"view\"\n [event]=\"event\"\n [style.top.px]=\"calculateEventTop(event)\"\n [style.height.px]=\"calculateEventHeight(event)\"\n [style.left.%]=\"event.left\"\n [style.width.%]=\"event.width\"\n (eventClick)=\"eventClick.emit($event)\"\n (eventContainerClick)=\"eventContainerClick.emit($event)\"\n cdkDrag\n [cdkDragData]=\"event\"\n [cdkDragDisabled]=\"event.isOverflowIndicator\"\n class=\"position-absolute\"\n >\n <div *cdkDragPlaceholder style=\"opacity: 0\"></div>\n </rlb-calendar-event>\n\n <div *ngIf=\"isToday(day)\"\n class=\"now-line\"\n [style.top.px]=\"getNowTop()\">\n </div>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;height:100%}.calendar-wrapper{background-color:var(--bs-body-bg);border:1px solid var(--bs-border-color);border-radius:var(--bs-border-radius);overflow:hidden;height:100%}.header-container{background-color:var(--bs-body-bg);z-index:102;box-shadow:0 4px 6px -4px #0000001a}.header-row{width:fit-content;min-width:100%}.time-gutter{width:60px;border-color:var(--bs-border-color)!important}.day-cell{border-color:var(--bs-border-color)!important;flex:1 1 0px;width:0;min-width:120px;overflow:hidden}.day-cell:last-child{border-right:none!important}.calendar-body{scroll-behavior:auto}.body-row{width:fit-content;min-width:100%}.sticky-start{position:sticky;left:0;z-index:50;background-color:var(--bs-body-bg)}.time-sidebar{width:60px;border-color:var(--bs-border-color)!important}.grid-row{border-color:var(--bs-border-color)!important;box-sizing:border-box}.grid-row:after{content:\"\";position:absolute;width:100%;border-bottom:1px dotted currentColor;opacity:.15;top:50%;left:0;pointer-events:none}.day-column{border-color:var(--bs-border-color)!important;flex:1 1 0px;width:0;min-width:120px}.day-column:last-child{border-right:none!important}.now-line{position:absolute;left:0;right:0;height:2px;background-color:var(--bs-danger);z-index:10;pointer-events:none}.now-line:before{content:\"\";position:absolute;left:-5px;top:-4px;width:10px;height:10px;background-color:var(--bs-danger);border-radius:50%}.z-0{z-index:0}.z-1{z-index:1}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$3.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2$3.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i2$3.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2$3.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "component", type: CalendarEventComponent, selector: "rlb-calendar-event", inputs: ["event", "view"], outputs: ["eventClick", "eventContainerClick"] }, { kind: "pipe", type: DateTzPipe, name: "dtz" }, { kind: "pipe", type: DayOfWeekPipe, name: "dayOfWeek" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3707
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CalendarDayGridComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
3708
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: CalendarDayGridComponent, isStandalone: false, selector: "rlb-calendar-day-grid", inputs: { view: "view", currentDate: "currentDate", events: "events", layout: "layout" }, outputs: { eventClick: "eventClick", eventContainerClick: "eventContainerClick", eventChange: "eventChange" }, viewQueries: [{ propertyName: "scrollBodyRef", first: true, predicate: ["scrollBody"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (day) {\n <div class=\"calendar-wrapper d-flex flex-column\">\n <!-- HEADER WRAPPER -->\n <!-- For day view, we just show the date at top? Or maybe just keep it simple with body since main header has date -->\n <!-- Mimicking structure of Week View but single column -->\n <div class=\"header-container overflow-hidden flex-shrink-0 border-bottom bg-body-tertiary\">\n <div class=\"header-row d-flex\" [style.min-height.rem]=\"layout.minHeaderHeight\">\n <div class=\"time-gutter border-end flex-shrink-0\"></div>\n <div class=\"day-cell p-2 flex-grow-1\" [class.text-primary]=\"isToday(day)\"\n [class.fw-bold]=\"isToday(day)\" [class.bg-primary]=\"isToday(day)\">\n <div class=\"small text-uppercase text-body-secondary h-100 d-flex align-items-center justify-content-center\">{{ day | dayOfWeek: 'long' }}</div>\n </div>\n </div>\n </div>\n <!-- BODY WRAPPER -->\n <div #scrollBody class=\"calendar-body flex-grow-1 overflow-auto bg-body position-relative\"\n [style.max-height.rem]=\"layout.maxBodyHeight\">\n <div class=\"body-row d-flex position-relative\">\n <!-- SIDEBAR (Sticky Left) -->\n <div class=\"time-sidebar sticky-start flex-shrink-0 border-end\">\n @for (time of timeSlots; track time; let i = $index) {\n <div\n class=\"time-slot-label small text-body-secondary d-flex align-items-start justify-content-center\"\n [style.height.px]=\"layout.rowHeight\">\n @if (i !== 0) {\n <span style=\"transform: translateY(-50%)\">\n {{ time }}\n </span>\n }\n </div>\n }\n </div>\n <!-- GRID AND EVENTS -->\n <div class=\"grid-layer flex-grow-1 position-relative\">\n <!-- LAYER 1: Grid -->\n <div class=\"background-grid position-absolute w-100 h-100 top-0 start-0 z-0\">\n @for (time of timeSlots; track time) {\n <div class=\"grid-row border-bottom\" [style.height.px]=\"layout.rowHeight\">\n </div>\n }\n </div>\n <!-- Layer 2: Events -->\n <div class=\"events-container d-flex h-100 w-100 position-relative z-1\" cdkDropListGroup>\n <div class=\"day-column position-relative h-100 w-100\" cdkDropList [cdkDropListSortingDisabled]=\"true\"\n [cdkDropListData]=\"day\" (cdkDropListDropped)=\"onEventDrop($event)\" (click)=\"eventClick.emit()\">\n @for (event of processedEvents; track trackByEventId($index, event)) {\n <rlb-calendar-event [view]=\"view\"\n [event]=\"event\" [style.top.px]=\"calculateEventTop(event)\" [style.height.px]=\"calculateEventHeight(event)\"\n [style.left.%]=\"event.left\" [style.width.%]=\"event.width\" (eventClick)=\"eventClick.emit($event)\"\n (eventContainerClick)=\"eventContainerClick.emit($event)\" cdkDrag [cdkDragData]=\"event\"\n class=\"position-absolute\">\n <div *cdkDragPlaceholder style=\"opacity: 0\"></div>\n </rlb-calendar-event>\n }\n @if (isToday(day)) {\n <div class=\"now-line\" [style.top.px]=\"getNowTop()\">\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n}\n", styles: [":host{display:block;height:100%}.calendar-wrapper{background-color:var(--bs-body-bg);border:1px solid var(--bs-border-color);border-radius:var(--bs-border-radius);overflow:hidden;height:100%}.header-container{background-color:var(--bs-body-bg);z-index:102}.header-row{width:100%}.time-gutter{width:60px;border-color:var(--bs-border-color)!important}.day-cell{border-color:var(--bs-border-color)!important}.calendar-body{scroll-behavior:auto}.body-row{width:100%}.sticky-start{position:sticky;left:0;z-index:50;background-color:var(--bs-body-bg)}.time-sidebar{width:60px;border-color:var(--bs-border-color)!important}.grid-row{border-color:var(--bs-border-color)!important;box-sizing:border-box}.grid-row:after{content:\"\";position:absolute;width:100%;border-bottom:1px dotted currentColor;opacity:.15;top:50%;left:0;pointer-events:none}.now-line{position:absolute;left:0;right:0;height:2px;background-color:var(--bs-danger);z-index:10;pointer-events:none}.now-line:before{content:\"\";position:absolute;left:-5px;top:-4px;width:10px;height:10px;background-color:var(--bs-danger);border-radius:50%}.z-0{z-index:0}.z-1{z-index:1}\n"], dependencies: [{ kind: "directive", type: i1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i1.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i1.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i1.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "component", type: CalendarEventComponent, selector: "rlb-calendar-event", inputs: ["event", "view"], outputs: ["eventClick", "eventContainerClick"] }, { kind: "pipe", type: DayOfWeekPipe, name: "dayOfWeek" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3352
3709
  }
3353
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CalendarWeekGridComponent, decorators: [{
3710
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CalendarDayGridComponent, decorators: [{
3354
3711
  type: Component,
3355
- args: [{ selector: 'rlb-calendar-week-grid', standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"calendar-wrapper d-flex flex-column\">\n\n <!-- HEADER WRAPPER -->\n <div #headerRow\n class=\"header-container overflow-hidden flex-shrink-0 border-bottom bg-body-tertiary\"\n [style.padding-right.px]=\"scrollbarWidth\">\n\n <div class=\"header-row d-flex\" [style.min-height.rem]=\"MIN_HEADER_HEIGHT\">\n\n <div class=\"time-gutter border-end flex-shrink-0\"></div>\n\n <div class=\"days-header d-flex flex-grow-1\">\n <div *ngFor=\"let day of days\"\n class=\"day-cell text-center p-2 border-end\"\n [class.text-primary]=\"isToday(day)\"\n [class.fw-bold]=\"isToday(day)\"\n [class.bg-primary]=\"isToday(day)\"\n >\n <div class=\"small text-uppercase text-body-secondary\">{{ day | dayOfWeek: 'short' }}</div>\n <div class=\"h5 m-0\">{{ day | dtz:'DD' }}</div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- BODY WRAPPER -->\n <div #scrollBody\n class=\"calendar-body flex-grow-1 overflow-auto bg-body position-relative\"\n (scroll)=\"onBodyScroll($event)\" [style.max-height.rem]=\"MAX_BODY_HEIGHT\">\n\n <div class=\"body-row d-flex position-relative\">\n\n <!-- SIDEBAR (Sticky Left) -->\n <div class=\"time-sidebar sticky-start flex-shrink-0 border-end\">\n <div *ngFor=\"let time of timeSlots; let i = index\"\n class=\"time-slot-label small text-body-secondary d-flex align-items-start justify-content-center\"\n [style.height.px]=\"ROW_HEIGHT\">\n <span *ngIf=\"i !== 0\" style=\"transform: translateY(-50%)\">\n {{ time }}\n </span>\n </div>\n </div>\n\n <!-- GRID AND EVENTS -->\n <div class=\"grid-layer flex-grow-1 position-relative\">\n\n <!-- LAYER 1: Grid -->\n <div class=\"background-grid position-absolute w-100 h-100 top-0 start-0 z-0\">\n <div *ngFor=\"let time of timeSlots\"\n class=\"grid-row border-bottom\"\n [style.height.px]=\"ROW_HEIGHT\">\n </div>\n </div>\n\n <!-- Layer 2: Events -->\n <div class=\"events-container d-flex h-100 w-100 position-relative z-1\" cdkDropListGroup>\n <div *ngFor=\"let day of days\"\n class=\"day-column position-relative border-end h-100\"\n cdkDropList\n [cdkDropListSortingDisabled]=\"true\"\n [cdkDropListData]=\"day\"\n (cdkDropListDropped)=\"onEventDrop($event)\"\n (click)=\"eventClick.emit()\"\n >\n\n <rlb-calendar-event\n *ngFor=\"let event of getEventsForDay(day); trackBy: trackByEventId\"\n [view]=\"view\"\n [event]=\"event\"\n [style.top.px]=\"calculateEventTop(event)\"\n [style.height.px]=\"calculateEventHeight(event)\"\n [style.left.%]=\"event.left\"\n [style.width.%]=\"event.width\"\n (eventClick)=\"eventClick.emit($event)\"\n (eventContainerClick)=\"eventContainerClick.emit($event)\"\n cdkDrag\n [cdkDragData]=\"event\"\n [cdkDragDisabled]=\"event.isOverflowIndicator\"\n class=\"position-absolute\"\n >\n <div *cdkDragPlaceholder style=\"opacity: 0\"></div>\n </rlb-calendar-event>\n\n <div *ngIf=\"isToday(day)\"\n class=\"now-line\"\n [style.top.px]=\"getNowTop()\">\n </div>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;height:100%}.calendar-wrapper{background-color:var(--bs-body-bg);border:1px solid var(--bs-border-color);border-radius:var(--bs-border-radius);overflow:hidden;height:100%}.header-container{background-color:var(--bs-body-bg);z-index:102;box-shadow:0 4px 6px -4px #0000001a}.header-row{width:fit-content;min-width:100%}.time-gutter{width:60px;border-color:var(--bs-border-color)!important}.day-cell{border-color:var(--bs-border-color)!important;flex:1 1 0px;width:0;min-width:120px;overflow:hidden}.day-cell:last-child{border-right:none!important}.calendar-body{scroll-behavior:auto}.body-row{width:fit-content;min-width:100%}.sticky-start{position:sticky;left:0;z-index:50;background-color:var(--bs-body-bg)}.time-sidebar{width:60px;border-color:var(--bs-border-color)!important}.grid-row{border-color:var(--bs-border-color)!important;box-sizing:border-box}.grid-row:after{content:\"\";position:absolute;width:100%;border-bottom:1px dotted currentColor;opacity:.15;top:50%;left:0;pointer-events:none}.day-column{border-color:var(--bs-border-color)!important;flex:1 1 0px;width:0;min-width:120px}.day-column:last-child{border-right:none!important}.now-line{position:absolute;left:0;right:0;height:2px;background-color:var(--bs-danger);z-index:10;pointer-events:none}.now-line:before{content:\"\";position:absolute;left:-5px;top:-4px;width:10px;height:10px;background-color:var(--bs-danger);border-radius:50%}.z-0{z-index:0}.z-1{z-index:1}\n"] }]
3712
+ args: [{ selector: 'rlb-calendar-day-grid', standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (day) {\n <div class=\"calendar-wrapper d-flex flex-column\">\n <!-- HEADER WRAPPER -->\n <!-- For day view, we just show the date at top? Or maybe just keep it simple with body since main header has date -->\n <!-- Mimicking structure of Week View but single column -->\n <div class=\"header-container overflow-hidden flex-shrink-0 border-bottom bg-body-tertiary\">\n <div class=\"header-row d-flex\" [style.min-height.rem]=\"layout.minHeaderHeight\">\n <div class=\"time-gutter border-end flex-shrink-0\"></div>\n <div class=\"day-cell p-2 flex-grow-1\" [class.text-primary]=\"isToday(day)\"\n [class.fw-bold]=\"isToday(day)\" [class.bg-primary]=\"isToday(day)\">\n <div class=\"small text-uppercase text-body-secondary h-100 d-flex align-items-center justify-content-center\">{{ day | dayOfWeek: 'long' }}</div>\n </div>\n </div>\n </div>\n <!-- BODY WRAPPER -->\n <div #scrollBody class=\"calendar-body flex-grow-1 overflow-auto bg-body position-relative\"\n [style.max-height.rem]=\"layout.maxBodyHeight\">\n <div class=\"body-row d-flex position-relative\">\n <!-- SIDEBAR (Sticky Left) -->\n <div class=\"time-sidebar sticky-start flex-shrink-0 border-end\">\n @for (time of timeSlots; track time; let i = $index) {\n <div\n class=\"time-slot-label small text-body-secondary d-flex align-items-start justify-content-center\"\n [style.height.px]=\"layout.rowHeight\">\n @if (i !== 0) {\n <span style=\"transform: translateY(-50%)\">\n {{ time }}\n </span>\n }\n </div>\n }\n </div>\n <!-- GRID AND EVENTS -->\n <div class=\"grid-layer flex-grow-1 position-relative\">\n <!-- LAYER 1: Grid -->\n <div class=\"background-grid position-absolute w-100 h-100 top-0 start-0 z-0\">\n @for (time of timeSlots; track time) {\n <div class=\"grid-row border-bottom\" [style.height.px]=\"layout.rowHeight\">\n </div>\n }\n </div>\n <!-- Layer 2: Events -->\n <div class=\"events-container d-flex h-100 w-100 position-relative z-1\" cdkDropListGroup>\n <div class=\"day-column position-relative h-100 w-100\" cdkDropList [cdkDropListSortingDisabled]=\"true\"\n [cdkDropListData]=\"day\" (cdkDropListDropped)=\"onEventDrop($event)\" (click)=\"eventClick.emit()\">\n @for (event of processedEvents; track trackByEventId($index, event)) {\n <rlb-calendar-event [view]=\"view\"\n [event]=\"event\" [style.top.px]=\"calculateEventTop(event)\" [style.height.px]=\"calculateEventHeight(event)\"\n [style.left.%]=\"event.left\" [style.width.%]=\"event.width\" (eventClick)=\"eventClick.emit($event)\"\n (eventContainerClick)=\"eventContainerClick.emit($event)\" cdkDrag [cdkDragData]=\"event\"\n class=\"position-absolute\">\n <div *cdkDragPlaceholder style=\"opacity: 0\"></div>\n </rlb-calendar-event>\n }\n @if (isToday(day)) {\n <div class=\"now-line\" [style.top.px]=\"getNowTop()\">\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n}\n", styles: [":host{display:block;height:100%}.calendar-wrapper{background-color:var(--bs-body-bg);border:1px solid var(--bs-border-color);border-radius:var(--bs-border-radius);overflow:hidden;height:100%}.header-container{background-color:var(--bs-body-bg);z-index:102}.header-row{width:100%}.time-gutter{width:60px;border-color:var(--bs-border-color)!important}.day-cell{border-color:var(--bs-border-color)!important}.calendar-body{scroll-behavior:auto}.body-row{width:100%}.sticky-start{position:sticky;left:0;z-index:50;background-color:var(--bs-body-bg)}.time-sidebar{width:60px;border-color:var(--bs-border-color)!important}.grid-row{border-color:var(--bs-border-color)!important;box-sizing:border-box}.grid-row:after{content:\"\";position:absolute;width:100%;border-bottom:1px dotted currentColor;opacity:.15;top:50%;left:0;pointer-events:none}.now-line{position:absolute;left:0;right:0;height:2px;background-color:var(--bs-danger);z-index:10;pointer-events:none}.now-line:before{content:\"\";position:absolute;left:-5px;top:-4px;width:10px;height:10px;background-color:var(--bs-danger);border-radius:50%}.z-0{z-index:0}.z-1{z-index:1}\n"] }]
3356
3713
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { view: [{
3357
3714
  type: Input
3358
3715
  }], currentDate: [{
3359
3716
  type: Input
3360
3717
  }], events: [{
3361
3718
  type: Input
3719
+ }], layout: [{
3720
+ type: Input
3362
3721
  }], eventClick: [{
3363
3722
  type: Output
3364
3723
  }], eventContainerClick: [{
@@ -3368,9 +3727,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
3368
3727
  }], scrollBodyRef: [{
3369
3728
  type: ViewChild,
3370
3729
  args: ['scrollBody', { static: false }]
3371
- }], headerRowRef: [{
3372
- type: ViewChild,
3373
- args: ['headerRow', { static: false }]
3374
3730
  }] } });
3375
3731
 
3376
3732
  const MAX_EVENTS_PER_CELL = 3;
@@ -3384,9 +3740,6 @@ class CalendarMonthGridComponent {
3384
3740
  this.scrollbarWidth = 0;
3385
3741
  this.weeks = [];
3386
3742
  this.weekDaysHeader = [];
3387
- this.MAX_BODY_HEIGHT = 30; // rem
3388
- this.MIN_ROW_HEIGHT = 110; // px for a full hour slot
3389
- this.MIN_HEADER_HEIGHT = 3.5; // rem
3390
3743
  this.onResize = () => {
3391
3744
  this.updateScrollbarWidth();
3392
3745
  };
@@ -3488,6 +3841,10 @@ class CalendarMonthGridComponent {
3488
3841
  });
3489
3842
  this.weeks.push(row);
3490
3843
  }
3844
+ // Defer scrollbar calculation to after the view updates
3845
+ setTimeout(() => {
3846
+ this.updateScrollbarWidth();
3847
+ });
3491
3848
  }
3492
3849
  /**
3493
3850
  * "Tetris" Algorithm:
@@ -3614,17 +3971,19 @@ class CalendarMonthGridComponent {
3614
3971
  this.eventChange.emit(updatedEvent);
3615
3972
  }
3616
3973
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CalendarMonthGridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3617
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: CalendarMonthGridComponent, isStandalone: false, selector: "rlb-calendar-month-grid", inputs: { view: "view", currentDate: "currentDate", events: "events" }, outputs: { eventClick: "eventClick", eventContainerClick: "eventContainerClick", eventChange: "eventChange" }, viewQueries: [{ propertyName: "scrollBodyRef", first: true, predicate: ["scrollBody"], descendants: true }, { propertyName: "headerRowRef", first: true, predicate: ["headerRow"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"d-flex flex-column w-100 bg-body user-select-none month-view-root\" [style.max-height.rem]=\"MAX_BODY_HEIGHT\">\n\n <!-- SCROLL CONTAINER -->\n <div class=\"calendar-scroller flex-grow-1 overflow-auto bg-body position-relative\">\n\n <!-- 1. Header Row (Fixed) -->\n <div class=\"d-flex flex-shrink-0 border-bottom bg-body-tertiary sticky-top\"\n [style.min-height.rem]=\"MIN_HEADER_HEIGHT\">\n <div *ngFor=\"let day of weekDaysHeader\"\n class=\"flex-fill text-center py-2 border-end fw-bold text-secondary text-uppercase w-0 my-auto h6\"\n >\n {{ day | dayOfWeek:'short' }}\n </div>\n </div>\n\n <!-- 2. Grid Body (Scrollable) -->\n <div class=\"d-flex flex-column flex-grow-1 border-start overflow-y-auto min-height-0\">\n\n <div class=\"d-flex flex-column\" cdkDropListGroup>\n <div *ngFor=\"let week of weeks;\"\n class=\"d-flex border-bottom min-h-row\"\n style=\"flex: 1 0 auto;\"\n [style.min-height.px]=\"MIN_ROW_HEIGHT\"\n >\n\n <div *ngFor=\"let slot of week;\"\n class=\"flex-fill border-end p-1 d-flex flex-column position-relative\"\n style=\"width: 0\"\n [class.bg-light]=\"!isCurrentMonth(slot.date)\"\n cdkDropList\n [cdkDropListData]=\"slot.date\"\n (cdkDropListDropped)=\"onEventDrop($event)\"\n (click)=\"eventClick.emit()\"\n >\n <!-- Date Number -->\n <div class=\"d-flex justify-content-center mb-1\">\n <span class=\"day-number d-flex align-items-center justify-content-center\"\n [class.today]=\"isToday(slot.date)\">\n {{ slot.date | dtz:'DD' }}\n </span>\n </div>\n\n <!-- Events Stack -->\n <div class=\"d-flex flex-column gap-1 w-100\">\n <ng-container *ngFor=\"let event of slot.events; trackBy: trackByEvent\">\n\n <!-- Spacer -->\n <div *ngIf=\"event.isSpacer\" class=\"event-spacer\"></div>\n\n <!-- Event -->\n <rlb-calendar-event\n *ngIf=\"!event.isSpacer\"\n [event]=\"event\"\n class=\"w-100\"\n cdkDrag\n [cdkDragData]=\"event\"\n (eventClick)=\"eventClick.emit($event)\"\n [view]=\"view\"\n >\n <!-- Drag Preview (Optional but nice) -->\n <div *cdkDragPlaceholder style=\"opacity: 0\"></div>\n <ng-template cdkDragPreview matchSize class=\"rlb-calendar-drag-preview\">\n <rlb-calendar-event\n [event]=\"event\"\n [view]=\"view\"\n style=\"box-sizing: border-box;\"\n >\n </rlb-calendar-event>\n </ng-template>\n </rlb-calendar-event>\n\n </ng-container>\n </div>\n\n <!-- Overflow (+N more) -->\n <div *ngIf=\"slot.hasOverflow\"\n class=\"mt-1 small text-secondary text-center cursor-pointer p-1 rounded hover-bg\"\n (click)=\"$event.stopPropagation(); eventContainerClick.emit(slot.overflowEvents)\">\n +{{ slot.overflowCount }} more\n </div>\n </div>\n\n </div>\n </div>\n </div>\n\n </div>\n</div>\n", styles: [":host{display:block;height:100%}.min-height-0{min-height:0!important}.border-end:last-child{border-right:0!important}.day-number{width:24px;height:24px;border-radius:50%;font-size:.85rem;font-weight:500;transition:background-color .2s}.day-number.today{background-color:var(--bs-primary);color:#fff}.event-spacer{height:20px;width:100%;pointer-events:none}.hover-bg:hover{background-color:var(--bs-secondary-bg-subtle)}.cursor-pointer{cursor:pointer}.cdk-drag-preview{box-shadow:0 .5rem 1rem #0000004d;border-radius:var(--bs-border-radius-sm)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$3.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2$3.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i2$3.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2$3.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "directive", type: i2$3.CdkDragPreview, selector: "ng-template[cdkDragPreview]", inputs: ["data", "matchSize"] }, { kind: "component", type: CalendarEventComponent, selector: "rlb-calendar-event", inputs: ["event", "view"], outputs: ["eventClick", "eventContainerClick"] }, { kind: "pipe", type: DateTzPipe, name: "dtz" }, { kind: "pipe", type: DayOfWeekPipe, name: "dayOfWeek" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3974
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: CalendarMonthGridComponent, isStandalone: false, selector: "rlb-calendar-month-grid", inputs: { view: "view", currentDate: "currentDate", events: "events", layout: "layout" }, outputs: { eventClick: "eventClick", eventContainerClick: "eventContainerClick", eventChange: "eventChange" }, viewQueries: [{ propertyName: "scrollBodyRef", first: true, predicate: ["scrollBody"], descendants: true }, { propertyName: "headerRowRef", first: true, predicate: ["headerRow"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"d-flex flex-column w-100 bg-body user-select-none month-view-root\">\n <!-- 1. Header Row (Fixed) -->\n <div #headerRow class=\"d-flex flex-shrink-0 border-bottom bg-body-tertiary overflow-hidden\"\n [style.min-height.rem]=\"layout.minHeaderHeight\" [style.padding-right.px]=\"scrollbarWidth\">\n @for (day of weekDaysHeader; track day) {\n <div\n class=\"flex-fill text-center py-2 border-end fw-bold text-secondary text-uppercase w-0 my-auto h6\">\n {{ day | dayOfWeek:'short' }}\n </div>\n }\n </div>\n\n <!-- SCROLL CONTAINER -->\n <div #scrollBody class=\"calendar-scroller flex-grow-1 overflow-auto bg-body position-relative\"\n [style.max-height.rem]=\"layout.maxBodyHeight\"\n (scroll)=\"onBodyScroll($event)\">\n\n <!-- 2. Grid Body (Scrollable) -->\n <div class=\"d-flex flex-column flex-grow-1 border-start min-height-0\">\n\n <div class=\"d-flex flex-column\" cdkDropListGroup>\n @for (week of weeks; track week) {\n <div class=\"d-flex border-bottom min-h-row\" style=\"flex: 1 0 auto;\"\n [style.min-height.px]=\"layout.rowHeight\">\n @for (slot of week; track slot) {\n <div class=\"flex-fill border-end p-1 d-flex flex-column position-relative\"\n style=\"width: 0\" [class.bg-light]=\"!isCurrentMonth(slot.date)\" cdkDropList [cdkDropListData]=\"slot.date\"\n (cdkDropListDropped)=\"onEventDrop($event)\" (click)=\"eventClick.emit()\">\n <!-- Date Number -->\n <div class=\"d-flex justify-content-center mb-1\">\n <span class=\"day-number d-flex align-items-center justify-content-center\"\n [class.today]=\"isToday(slot.date)\">\n {{ slot.date | dtz:'DD' }}\n </span>\n </div>\n <!-- Events Stack -->\n <div class=\"d-flex flex-column gap-1 w-100\">\n @for (event of slot.events; track trackByEvent($index, event)) {\n <!-- Spacer -->\n @if (event.isSpacer) {\n <div class=\"event-spacer\"></div>\n }\n <!-- Event -->\n @if (!event.isSpacer) {\n <rlb-calendar-event [event]=\"event\" class=\"w-100\" cdkDrag [cdkDragData]=\"event\"\n (eventClick)=\"eventClick.emit($event)\" [view]=\"view\">\n <!-- Drag Preview (Optional but nice) -->\n <div *cdkDragPlaceholder style=\"opacity: 0\"></div>\n <ng-template cdkDragPreview matchSize class=\"rlb-calendar-drag-preview\">\n <rlb-calendar-event [event]=\"event\" [view]=\"view\" style=\"box-sizing: border-box;\">\n </rlb-calendar-event>\n </ng-template>\n </rlb-calendar-event>\n }\n }\n </div>\n <!-- Overflow (+N more) -->\n @if (slot.hasOverflow) {\n <div\n class=\"mt-1 small text-secondary text-center cursor-pointer p-1 rounded hover-bg\"\n (click)=\"$event.stopPropagation(); eventContainerClick.emit(slot.overflowEvents)\">\n +{{ slot.overflowCount }} more\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n </div>\n</div>\n", styles: [":host{display:block;height:100%}.min-height-0{min-height:0!important}.border-end:last-child{border-right:0!important}.day-number{width:24px;height:24px;border-radius:50%;font-size:.85rem;font-weight:500;transition:background-color .2s}.day-number.today{background-color:var(--bs-primary);color:#fff}.event-spacer{height:20px;width:100%;pointer-events:none}.hover-bg:hover{background-color:var(--bs-secondary-bg-subtle)}.cursor-pointer{cursor:pointer}.cdk-drag-preview{box-shadow:0 .5rem 1rem #0000004d;border-radius:var(--bs-border-radius-sm)}\n"], dependencies: [{ kind: "directive", type: i1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i1.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i1.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i1.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "directive", type: i1.CdkDragPreview, selector: "ng-template[cdkDragPreview]", inputs: ["data", "matchSize"] }, { kind: "component", type: CalendarEventComponent, selector: "rlb-calendar-event", inputs: ["event", "view"], outputs: ["eventClick", "eventContainerClick"] }, { kind: "pipe", type: DateTzPipe, name: "dtz" }, { kind: "pipe", type: DayOfWeekPipe, name: "dayOfWeek" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3618
3975
  }
3619
3976
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CalendarMonthGridComponent, decorators: [{
3620
3977
  type: Component,
3621
- args: [{ selector: 'rlb-calendar-month-grid', standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"d-flex flex-column w-100 bg-body user-select-none month-view-root\" [style.max-height.rem]=\"MAX_BODY_HEIGHT\">\n\n <!-- SCROLL CONTAINER -->\n <div class=\"calendar-scroller flex-grow-1 overflow-auto bg-body position-relative\">\n\n <!-- 1. Header Row (Fixed) -->\n <div class=\"d-flex flex-shrink-0 border-bottom bg-body-tertiary sticky-top\"\n [style.min-height.rem]=\"MIN_HEADER_HEIGHT\">\n <div *ngFor=\"let day of weekDaysHeader\"\n class=\"flex-fill text-center py-2 border-end fw-bold text-secondary text-uppercase w-0 my-auto h6\"\n >\n {{ day | dayOfWeek:'short' }}\n </div>\n </div>\n\n <!-- 2. Grid Body (Scrollable) -->\n <div class=\"d-flex flex-column flex-grow-1 border-start overflow-y-auto min-height-0\">\n\n <div class=\"d-flex flex-column\" cdkDropListGroup>\n <div *ngFor=\"let week of weeks;\"\n class=\"d-flex border-bottom min-h-row\"\n style=\"flex: 1 0 auto;\"\n [style.min-height.px]=\"MIN_ROW_HEIGHT\"\n >\n\n <div *ngFor=\"let slot of week;\"\n class=\"flex-fill border-end p-1 d-flex flex-column position-relative\"\n style=\"width: 0\"\n [class.bg-light]=\"!isCurrentMonth(slot.date)\"\n cdkDropList\n [cdkDropListData]=\"slot.date\"\n (cdkDropListDropped)=\"onEventDrop($event)\"\n (click)=\"eventClick.emit()\"\n >\n <!-- Date Number -->\n <div class=\"d-flex justify-content-center mb-1\">\n <span class=\"day-number d-flex align-items-center justify-content-center\"\n [class.today]=\"isToday(slot.date)\">\n {{ slot.date | dtz:'DD' }}\n </span>\n </div>\n\n <!-- Events Stack -->\n <div class=\"d-flex flex-column gap-1 w-100\">\n <ng-container *ngFor=\"let event of slot.events; trackBy: trackByEvent\">\n\n <!-- Spacer -->\n <div *ngIf=\"event.isSpacer\" class=\"event-spacer\"></div>\n\n <!-- Event -->\n <rlb-calendar-event\n *ngIf=\"!event.isSpacer\"\n [event]=\"event\"\n class=\"w-100\"\n cdkDrag\n [cdkDragData]=\"event\"\n (eventClick)=\"eventClick.emit($event)\"\n [view]=\"view\"\n >\n <!-- Drag Preview (Optional but nice) -->\n <div *cdkDragPlaceholder style=\"opacity: 0\"></div>\n <ng-template cdkDragPreview matchSize class=\"rlb-calendar-drag-preview\">\n <rlb-calendar-event\n [event]=\"event\"\n [view]=\"view\"\n style=\"box-sizing: border-box;\"\n >\n </rlb-calendar-event>\n </ng-template>\n </rlb-calendar-event>\n\n </ng-container>\n </div>\n\n <!-- Overflow (+N more) -->\n <div *ngIf=\"slot.hasOverflow\"\n class=\"mt-1 small text-secondary text-center cursor-pointer p-1 rounded hover-bg\"\n (click)=\"$event.stopPropagation(); eventContainerClick.emit(slot.overflowEvents)\">\n +{{ slot.overflowCount }} more\n </div>\n </div>\n\n </div>\n </div>\n </div>\n\n </div>\n</div>\n", styles: [":host{display:block;height:100%}.min-height-0{min-height:0!important}.border-end:last-child{border-right:0!important}.day-number{width:24px;height:24px;border-radius:50%;font-size:.85rem;font-weight:500;transition:background-color .2s}.day-number.today{background-color:var(--bs-primary);color:#fff}.event-spacer{height:20px;width:100%;pointer-events:none}.hover-bg:hover{background-color:var(--bs-secondary-bg-subtle)}.cursor-pointer{cursor:pointer}.cdk-drag-preview{box-shadow:0 .5rem 1rem #0000004d;border-radius:var(--bs-border-radius-sm)}\n"] }]
3978
+ args: [{ selector: 'rlb-calendar-month-grid', standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"d-flex flex-column w-100 bg-body user-select-none month-view-root\">\n <!-- 1. Header Row (Fixed) -->\n <div #headerRow class=\"d-flex flex-shrink-0 border-bottom bg-body-tertiary overflow-hidden\"\n [style.min-height.rem]=\"layout.minHeaderHeight\" [style.padding-right.px]=\"scrollbarWidth\">\n @for (day of weekDaysHeader; track day) {\n <div\n class=\"flex-fill text-center py-2 border-end fw-bold text-secondary text-uppercase w-0 my-auto h6\">\n {{ day | dayOfWeek:'short' }}\n </div>\n }\n </div>\n\n <!-- SCROLL CONTAINER -->\n <div #scrollBody class=\"calendar-scroller flex-grow-1 overflow-auto bg-body position-relative\"\n [style.max-height.rem]=\"layout.maxBodyHeight\"\n (scroll)=\"onBodyScroll($event)\">\n\n <!-- 2. Grid Body (Scrollable) -->\n <div class=\"d-flex flex-column flex-grow-1 border-start min-height-0\">\n\n <div class=\"d-flex flex-column\" cdkDropListGroup>\n @for (week of weeks; track week) {\n <div class=\"d-flex border-bottom min-h-row\" style=\"flex: 1 0 auto;\"\n [style.min-height.px]=\"layout.rowHeight\">\n @for (slot of week; track slot) {\n <div class=\"flex-fill border-end p-1 d-flex flex-column position-relative\"\n style=\"width: 0\" [class.bg-light]=\"!isCurrentMonth(slot.date)\" cdkDropList [cdkDropListData]=\"slot.date\"\n (cdkDropListDropped)=\"onEventDrop($event)\" (click)=\"eventClick.emit()\">\n <!-- Date Number -->\n <div class=\"d-flex justify-content-center mb-1\">\n <span class=\"day-number d-flex align-items-center justify-content-center\"\n [class.today]=\"isToday(slot.date)\">\n {{ slot.date | dtz:'DD' }}\n </span>\n </div>\n <!-- Events Stack -->\n <div class=\"d-flex flex-column gap-1 w-100\">\n @for (event of slot.events; track trackByEvent($index, event)) {\n <!-- Spacer -->\n @if (event.isSpacer) {\n <div class=\"event-spacer\"></div>\n }\n <!-- Event -->\n @if (!event.isSpacer) {\n <rlb-calendar-event [event]=\"event\" class=\"w-100\" cdkDrag [cdkDragData]=\"event\"\n (eventClick)=\"eventClick.emit($event)\" [view]=\"view\">\n <!-- Drag Preview (Optional but nice) -->\n <div *cdkDragPlaceholder style=\"opacity: 0\"></div>\n <ng-template cdkDragPreview matchSize class=\"rlb-calendar-drag-preview\">\n <rlb-calendar-event [event]=\"event\" [view]=\"view\" style=\"box-sizing: border-box;\">\n </rlb-calendar-event>\n </ng-template>\n </rlb-calendar-event>\n }\n }\n </div>\n <!-- Overflow (+N more) -->\n @if (slot.hasOverflow) {\n <div\n class=\"mt-1 small text-secondary text-center cursor-pointer p-1 rounded hover-bg\"\n (click)=\"$event.stopPropagation(); eventContainerClick.emit(slot.overflowEvents)\">\n +{{ slot.overflowCount }} more\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n </div>\n</div>\n", styles: [":host{display:block;height:100%}.min-height-0{min-height:0!important}.border-end:last-child{border-right:0!important}.day-number{width:24px;height:24px;border-radius:50%;font-size:.85rem;font-weight:500;transition:background-color .2s}.day-number.today{background-color:var(--bs-primary);color:#fff}.event-spacer{height:20px;width:100%;pointer-events:none}.hover-bg:hover{background-color:var(--bs-secondary-bg-subtle)}.cursor-pointer{cursor:pointer}.cdk-drag-preview{box-shadow:0 .5rem 1rem #0000004d;border-radius:var(--bs-border-radius-sm)}\n"] }]
3622
3979
  }], ctorParameters: () => [], propDecorators: { view: [{
3623
3980
  type: Input
3624
3981
  }], currentDate: [{
3625
3982
  type: Input
3626
3983
  }], events: [{
3627
3984
  type: Input
3985
+ }], layout: [{
3986
+ type: Input
3628
3987
  }], eventClick: [{
3629
3988
  type: Output
3630
3989
  }], eventContainerClick: [{
@@ -3651,17 +4010,19 @@ class CalendarGrid {
3651
4010
  ngOnDestroy() {
3652
4011
  }
3653
4012
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CalendarGrid, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3654
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: CalendarGrid, isStandalone: false, selector: "rlb-calendar-grid", inputs: { view: "view", currentDate: "currentDate", events: "events" }, outputs: { eventClick: "eventClick", eventContainerClick: "eventContainerClick", eventChange: "eventChange" }, usesOnChanges: true, ngImport: i0, template: "<ng-container [ngSwitch]=\"view\">\n\t<ng-container *ngSwitchCase=\"'week'\">\n <rlb-calendar-week-grid\n [view]=\"view\"\n [currentDate]=\"currentDate\"\n [events]=\"events\"\n (eventClick)=\"eventClick.emit($event)\"\n (eventContainerClick)=\"eventContainerClick.emit($event)\"\n (eventChange)=\"eventChange.emit($event)\"\n />\n\t</ng-container>\n <ng-container *ngSwitchCase=\"'month'\">\n <rlb-calendar-month-grid\n [view]=\"view\"\n [currentDate]=\"currentDate\"\n [events]=\"events\"\n (eventClick)=\"eventClick.emit($event)\"\n (eventContainerClick)=\"eventContainerClick.emit($event)\"\n (eventChange)=\"eventChange.emit($event)\"\n />\n </ng-container>\n\t<ng-container *ngSwitchDefault>\n\t\tnot implemented yet\n\t</ng-container>\n</ng-container>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: CalendarWeekGridComponent, selector: "rlb-calendar-week-grid", inputs: ["view", "currentDate", "events"], outputs: ["eventClick", "eventContainerClick", "eventChange"] }, { kind: "component", type: CalendarMonthGridComponent, selector: "rlb-calendar-month-grid", inputs: ["view", "currentDate", "events"], outputs: ["eventClick", "eventContainerClick", "eventChange"] }] }); }
4013
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: CalendarGrid, isStandalone: false, selector: "rlb-calendar-grid", inputs: { view: "view", currentDate: "currentDate", events: "events", layout: "layout" }, outputs: { eventClick: "eventClick", eventContainerClick: "eventContainerClick", eventChange: "eventChange" }, usesOnChanges: true, ngImport: i0, template: "\n@switch (view) {\n @case ('week') {\n <rlb-calendar-week-grid [view]=\"view\" [currentDate]=\"currentDate\" [events]=\"events\" [layout]=\"layout\"\n (eventClick)=\"eventClick.emit($event)\" (eventContainerClick)=\"eventContainerClick.emit($event)\"\n (eventChange)=\"eventChange.emit($event)\" />\n }\n @case ('month') {\n <rlb-calendar-month-grid [view]=\"view\" [currentDate]=\"currentDate\" [events]=\"events\" [layout]=\"layout\"\n (eventClick)=\"eventClick.emit($event)\" (eventContainerClick)=\"eventContainerClick.emit($event)\"\n (eventChange)=\"eventChange.emit($event)\" />\n }\n @case ('day') {\n <rlb-calendar-day-grid [view]=\"view\" [currentDate]=\"currentDate\" [events]=\"events\" [layout]=\"layout\"\n (eventClick)=\"eventClick.emit($event)\" (eventContainerClick)=\"eventContainerClick.emit($event)\"\n (eventChange)=\"eventChange.emit($event)\" />\n }\n @default {\n not implemented yet\n }\n }\n", styles: [""], dependencies: [{ kind: "component", type: CalendarWeekGridComponent, selector: "rlb-calendar-week-grid", inputs: ["view", "currentDate", "events", "layout"], outputs: ["eventClick", "eventContainerClick", "eventChange"] }, { kind: "component", type: CalendarDayGridComponent, selector: "rlb-calendar-day-grid", inputs: ["view", "currentDate", "events", "layout"], outputs: ["eventClick", "eventContainerClick", "eventChange"] }, { kind: "component", type: CalendarMonthGridComponent, selector: "rlb-calendar-month-grid", inputs: ["view", "currentDate", "events", "layout"], outputs: ["eventClick", "eventContainerClick", "eventChange"] }] }); }
3655
4014
  }
3656
4015
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CalendarGrid, decorators: [{
3657
4016
  type: Component,
3658
- args: [{ selector: 'rlb-calendar-grid', standalone: false, template: "<ng-container [ngSwitch]=\"view\">\n\t<ng-container *ngSwitchCase=\"'week'\">\n <rlb-calendar-week-grid\n [view]=\"view\"\n [currentDate]=\"currentDate\"\n [events]=\"events\"\n (eventClick)=\"eventClick.emit($event)\"\n (eventContainerClick)=\"eventContainerClick.emit($event)\"\n (eventChange)=\"eventChange.emit($event)\"\n />\n\t</ng-container>\n <ng-container *ngSwitchCase=\"'month'\">\n <rlb-calendar-month-grid\n [view]=\"view\"\n [currentDate]=\"currentDate\"\n [events]=\"events\"\n (eventClick)=\"eventClick.emit($event)\"\n (eventContainerClick)=\"eventContainerClick.emit($event)\"\n (eventChange)=\"eventChange.emit($event)\"\n />\n </ng-container>\n\t<ng-container *ngSwitchDefault>\n\t\tnot implemented yet\n\t</ng-container>\n</ng-container>\n" }]
4017
+ args: [{ selector: 'rlb-calendar-grid', standalone: false, template: "\n@switch (view) {\n @case ('week') {\n <rlb-calendar-week-grid [view]=\"view\" [currentDate]=\"currentDate\" [events]=\"events\" [layout]=\"layout\"\n (eventClick)=\"eventClick.emit($event)\" (eventContainerClick)=\"eventContainerClick.emit($event)\"\n (eventChange)=\"eventChange.emit($event)\" />\n }\n @case ('month') {\n <rlb-calendar-month-grid [view]=\"view\" [currentDate]=\"currentDate\" [events]=\"events\" [layout]=\"layout\"\n (eventClick)=\"eventClick.emit($event)\" (eventContainerClick)=\"eventContainerClick.emit($event)\"\n (eventChange)=\"eventChange.emit($event)\" />\n }\n @case ('day') {\n <rlb-calendar-day-grid [view]=\"view\" [currentDate]=\"currentDate\" [events]=\"events\" [layout]=\"layout\"\n (eventClick)=\"eventClick.emit($event)\" (eventContainerClick)=\"eventContainerClick.emit($event)\"\n (eventChange)=\"eventChange.emit($event)\" />\n }\n @default {\n not implemented yet\n }\n }\n" }]
3659
4018
  }], ctorParameters: () => [], propDecorators: { view: [{
3660
4019
  type: Input
3661
4020
  }], currentDate: [{
3662
4021
  type: Input
3663
4022
  }], events: [{
3664
4023
  type: Input
4024
+ }], layout: [{
4025
+ type: Input
3665
4026
  }], eventClick: [{
3666
4027
  type: Output
3667
4028
  }], eventContainerClick: [{
@@ -3679,6 +4040,8 @@ class CalendarComponent {
3679
4040
  this.events = [];
3680
4041
  this.loading = false;
3681
4042
  this.showToolbar = true;
4043
+ this.layout = {};
4044
+ this.mergedLayout = DEFAULT_CALENDAR_LAYOUT;
3682
4045
  this.dateChange = new EventEmitter();
3683
4046
  this.viewChange = new EventEmitter();
3684
4047
  this.eventClick = new EventEmitter();
@@ -3694,6 +4057,9 @@ class CalendarComponent {
3694
4057
  if (changes['events']) {
3695
4058
  this.events = changes['events'].currentValue;
3696
4059
  }
4060
+ if (changes['layout']) {
4061
+ this.mergedLayout = { ...DEFAULT_CALENDAR_LAYOUT, ...this.layout };
4062
+ }
3697
4063
  }
3698
4064
  // DnD event
3699
4065
  onEventChange(eventToEdit) {
@@ -3944,11 +4310,11 @@ class CalendarComponent {
3944
4310
  }).pipe(take(1));
3945
4311
  }
3946
4312
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CalendarComponent, deps: [{ token: ModalService }, { token: UniqueIdService }, { token: ToastService }], target: i0.ɵɵFactoryTarget.Component }); }
3947
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "20.3.16", type: CalendarComponent, isStandalone: false, selector: "rlb-calendar", inputs: { view: "view", events: "events", currentDate: ["current-date", "currentDate"], loading: ["loading", "loading", booleanAttribute], showToolbar: ["show-toolbar", "showToolbar", booleanAttribute] }, outputs: { dateChange: "date-change", viewChange: "view-change", eventClick: "event-click" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"rlb-calendar\">\n\t<div class=\"my-3 d-flex align-items-center justify-content-between\">\n <button class=\"ms-auto\" rlb-button outline (click)=\"generateTestEvents()\">Generate events</button>\n\t</div>\n\t<rlb-calendar-header\n\t\t*ngIf=\"showToolbar\"\n\t\t[view]=\"view\"\n\t\t[currentDate]=\"currentDate\"\n\t\t(viewChange)=\"setView($event)\"\n\t\t(dateChange)=\"setDate($event)\">\n\t</rlb-calendar-header>\n\n\t<rlb-calendar-grid\n\t\t[events]=\"events\"\n\t\t[view]=\"view\"\n\t\t[currentDate]=\"currentDate\"\n (eventClick)=\"onEventClick($event)\"\n (eventContainerClick)=\"onEventContainerClick($event)\"\n (eventChange)=\"onEventChange($event)\"\n >\n\t</rlb-calendar-grid>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "component", type: CalendarHeaderComponent, selector: "rlb-calendar-header", inputs: ["view", "currentDate"], outputs: ["dateChange", "viewChange"] }, { kind: "component", type: CalendarGrid, selector: "rlb-calendar-grid", inputs: ["view", "currentDate", "events"], outputs: ["eventClick", "eventContainerClick", "eventChange"] }] }); }
4313
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: CalendarComponent, isStandalone: false, selector: "rlb-calendar", inputs: { view: "view", events: "events", currentDate: ["current-date", "currentDate", (d) => new DateTz(d)], loading: ["loading", "loading", booleanAttribute], showToolbar: ["show-toolbar", "showToolbar", booleanAttribute], layout: "layout" }, outputs: { dateChange: "date-change", viewChange: "view-change", eventClick: "event-click" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"rlb-calendar\">\n <div class=\"my-3 d-flex align-items-center justify-content-between\">\n <button class=\"ms-auto\" rlb-button outline (click)=\"generateTestEvents()\">Generate events</button>\n </div>\n @if (showToolbar) {\n <rlb-calendar-header\n [view]=\"view\"\n [currentDate]=\"currentDate\"\n (viewChange)=\"setView($event)\"\n (dateChange)=\"setDate($event)\">\n </rlb-calendar-header>\n }\n\n <rlb-calendar-grid\n [events]=\"events\"\n [view]=\"view\"\n [currentDate]=\"currentDate\"\n [layout]=\"mergedLayout\"\n (eventClick)=\"onEventClick($event)\"\n (eventContainerClick)=\"onEventContainerClick($event)\"\n (eventChange)=\"onEventChange($event)\"\n >\n </rlb-calendar-grid>\n\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "component", type: CalendarHeaderComponent, selector: "rlb-calendar-header", inputs: ["view", "currentDate"], outputs: ["dateChange", "viewChange"] }, { kind: "component", type: CalendarGrid, selector: "rlb-calendar-grid", inputs: ["view", "currentDate", "events", "layout"], outputs: ["eventClick", "eventContainerClick", "eventChange"] }] }); }
3948
4314
  }
3949
4315
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CalendarComponent, decorators: [{
3950
4316
  type: Component,
3951
- args: [{ selector: "rlb-calendar", standalone: false, template: "<div class=\"rlb-calendar\">\n\t<div class=\"my-3 d-flex align-items-center justify-content-between\">\n <button class=\"ms-auto\" rlb-button outline (click)=\"generateTestEvents()\">Generate events</button>\n\t</div>\n\t<rlb-calendar-header\n\t\t*ngIf=\"showToolbar\"\n\t\t[view]=\"view\"\n\t\t[currentDate]=\"currentDate\"\n\t\t(viewChange)=\"setView($event)\"\n\t\t(dateChange)=\"setDate($event)\">\n\t</rlb-calendar-header>\n\n\t<rlb-calendar-grid\n\t\t[events]=\"events\"\n\t\t[view]=\"view\"\n\t\t[currentDate]=\"currentDate\"\n (eventClick)=\"onEventClick($event)\"\n (eventContainerClick)=\"onEventContainerClick($event)\"\n (eventChange)=\"onEventChange($event)\"\n >\n\t</rlb-calendar-grid>\n</div>\n" }]
4317
+ args: [{ selector: "rlb-calendar", standalone: false, template: "<div class=\"rlb-calendar\">\n <div class=\"my-3 d-flex align-items-center justify-content-between\">\n <button class=\"ms-auto\" rlb-button outline (click)=\"generateTestEvents()\">Generate events</button>\n </div>\n @if (showToolbar) {\n <rlb-calendar-header\n [view]=\"view\"\n [currentDate]=\"currentDate\"\n (viewChange)=\"setView($event)\"\n (dateChange)=\"setDate($event)\">\n </rlb-calendar-header>\n }\n\n <rlb-calendar-grid\n [events]=\"events\"\n [view]=\"view\"\n [currentDate]=\"currentDate\"\n [layout]=\"mergedLayout\"\n (eventClick)=\"onEventClick($event)\"\n (eventContainerClick)=\"onEventContainerClick($event)\"\n (eventChange)=\"onEventChange($event)\"\n >\n </rlb-calendar-grid>\n\n</div>\n" }]
3952
4318
  }], ctorParameters: () => [{ type: ModalService }, { type: UniqueIdService }, { type: ToastService }], propDecorators: { view: [{
3953
4319
  type: Input,
3954
4320
  args: [{ alias: 'view' }]
@@ -3957,13 +4323,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
3957
4323
  args: [{ alias: 'events' }]
3958
4324
  }], currentDate: [{
3959
4325
  type: Input,
3960
- args: [{ alias: 'current-date' }]
4326
+ args: [{ alias: 'current-date', transform: (d) => new DateTz(d) }]
3961
4327
  }], loading: [{
3962
4328
  type: Input,
3963
4329
  args: [{ alias: 'loading', transform: booleanAttribute }]
3964
4330
  }], showToolbar: [{
3965
4331
  type: Input,
3966
4332
  args: [{ alias: 'show-toolbar', transform: booleanAttribute }]
4333
+ }], layout: [{
4334
+ type: Input,
4335
+ args: [{ alias: 'layout' }]
3967
4336
  }], dateChange: [{
3968
4337
  type: Output,
3969
4338
  args: ['date-change']
@@ -3980,6 +4349,7 @@ const CALENDAR_COMPONENTS = [
3980
4349
  CalendarHeaderComponent,
3981
4350
  CalendarGrid,
3982
4351
  CalendarWeekGridComponent,
4352
+ CalendarDayGridComponent,
3983
4353
  CalendarMonthGridComponent,
3984
4354
  CalendarEventComponent
3985
4355
  ];
@@ -4016,45 +4386,59 @@ class ChatItemComponent {
4016
4386
  this.reply.emit(this.replayId);
4017
4387
  }
4018
4388
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ChatItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4019
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: ChatItemComponent, isStandalone: false, selector: "rlb-chat-item", inputs: { id: "id", avatar: "avatar", text: "text", dateTime: ["date-time", "dateTime"], replayText: ["replay-text", "replayText"], replaySubject: ["replay-subject", "replaySubject"], replayId: ["replay-id", "replayId"], position: "position", reaction: "reaction", canReply: ["can-reply", "canReply"] }, outputs: { reply: "reply", reactionClick: "reaction-click", reactionSelector: "reaction-selector" }, host: { properties: { "class.ms-auto": "position === \"right\"" } }, ngImport: i0, template: `
4389
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: ChatItemComponent, isStandalone: false, selector: "rlb-chat-item", inputs: { id: "id", avatar: "avatar", text: "text", dateTime: ["date-time", "dateTime"], replayText: ["replay-text", "replayText"], replaySubject: ["replay-subject", "replaySubject"], replayId: ["replay-id", "replayId"], position: "position", reaction: "reaction", canReply: ["can-reply", "canReply"] }, outputs: { reply: "reply", reactionClick: "reaction-click", reactionSelector: "reaction-selector" }, host: { properties: { "class.ms-auto": "position === \"right\"" } }, ngImport: i0, template: `
4020
4390
  <div [id]="id" class="chat-bubble-item" [class.left]="position==='left'" [class.right]="position==='right'">
4021
- <button *ngIf="canReply && position === 'right'" class="reply-button" (click)="replyClick($event)">
4022
- <i class="bi bi-reply-fill"></i>
4023
- </button>
4024
- <div class="avatar small" *ngIf="position === 'left'">
4025
- <img [src]="avatar" alt="avatar">
4026
- </div>
4027
- <div class="text">
4028
- <div class="replied-message" *ngIf="replayText">
4029
- <span class="name">{{replaySubject}}</span>
4030
- <p>{{replayText}}</p>
4391
+ @if (canReply && position === 'right') {
4392
+ <button class="reply-button" (click)="replyClick($event)">
4393
+ <i class="bi bi-reply-fill"></i>
4394
+ </button>
4395
+ }
4396
+ @if (position === 'left') {
4397
+ <div class="avatar small">
4398
+ <img [src]="avatar" alt="avatar">
4031
4399
  </div>
4400
+ }
4401
+ <div class="text">
4402
+ @if (replayText) {
4403
+ <div class="replied-message">
4404
+ <span class="name">{{replaySubject}}</span>
4405
+ <p>{{replayText}}</p>
4406
+ </div>
4407
+ }
4032
4408
  <div>
4033
4409
  <ng-content/>
4034
4410
  </div>
4035
4411
  <i class="bi bi-check-all float-end"></i>
4036
4412
  <span class="time float-end">{{ dateTime | date:'dd/MM HH:mm:ss' }}</span>
4037
4413
  <rlb-dropdown direction="up" class="reaction">
4038
- <a rlb-button rlb-dropdown *ngIf="!reaction"
4414
+ @if (!reaction) {
4415
+ <a rlb-button rlb-dropdown
4039
4416
  autoClose="manual" class="reaction add p-1"
4040
4417
  [class.right]="position==='right'" [class.left]="position==='left'"
4041
4418
  (status-changed)="this.reactionSelector.emit($event)">
4042
- <i class="bi bi-plus m-0 p-0"></i>
4043
- </a>
4419
+ <i class="bi bi-plus m-0 p-0"></i>
4420
+ </a>
4421
+ }
4044
4422
  <rlb-dropdown-container>
4045
4423
  <ng-content select="[reaction-picker]" />
4046
4424
  </rlb-dropdown-container>
4047
4425
  </rlb-dropdown>
4048
- <span class="reaction" *ngIf="reaction" [class.right]="position==='right'" [class.left]="position==='left'" (click)="reactionClick.emit('remove')">{{reaction}}</span>
4049
- </div>
4050
- <div class="avatar small" *ngIf="position === 'right'">
4051
- <img [src]="avatar" alt="avatar">
4426
+ @if (reaction) {
4427
+ <span class="reaction" [class.right]="position==='right'" [class.left]="position==='left'" (click)="reactionClick.emit('remove')">{{reaction}}</span>
4428
+ }
4052
4429
  </div>
4053
- <button *ngIf="canReply && position === 'left'" class="reply-button" (click)="replyClick($event)">
4054
- <i class="bi bi-reply-fill"></i>
4055
- </button>
4430
+ @if (position === 'right') {
4431
+ <div class="avatar small">
4432
+ <img [src]="avatar" alt="avatar">
4433
+ </div>
4434
+ }
4435
+ @if (canReply && position === 'left') {
4436
+ <button class="reply-button" (click)="replyClick($event)">
4437
+ <i class="bi bi-reply-fill"></i>
4438
+ </button>
4439
+ }
4056
4440
  </div>
4057
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "component", type: DropdownComponent, selector: "rlb-dropdown", inputs: ["direction"] }, { kind: "component", type: DropdownContainerComponent, selector: "ul[rlb-dropdown-menu], rlb-dropdown-container", inputs: ["placement", "placement-sm", "placement-md", "placement-lg", "placement-xl", "placement-xxl"] }, { kind: "directive", type: DropdownDirective, selector: "a[rlb-dropdown], button[rlb-dropdown], span[rlb-badge][rlb-dropdown]", inputs: ["offset", "auto-close"], outputs: ["status-changed"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }] }); }
4441
+ `, isInline: true, dependencies: [{ kind: "component", type: ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "component", type: DropdownComponent, selector: "rlb-dropdown", inputs: ["direction"] }, { kind: "component", type: DropdownContainerComponent, selector: "ul[rlb-dropdown-menu], rlb-dropdown-container", inputs: ["placement", "placement-sm", "placement-md", "placement-lg", "placement-xl", "placement-xxl"] }, { kind: "directive", type: DropdownDirective, selector: "a[rlb-dropdown], button[rlb-dropdown], span[rlb-badge][rlb-dropdown]", inputs: ["offset", "auto-close"], outputs: ["status-changed"] }, { kind: "pipe", type: i3.DatePipe, name: "date" }] }); }
4058
4442
  }
4059
4443
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ChatItemComponent, decorators: [{
4060
4444
  type: Component,
@@ -4062,41 +4446,55 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
4062
4446
  selector: 'rlb-chat-item',
4063
4447
  template: `
4064
4448
  <div [id]="id" class="chat-bubble-item" [class.left]="position==='left'" [class.right]="position==='right'">
4065
- <button *ngIf="canReply && position === 'right'" class="reply-button" (click)="replyClick($event)">
4066
- <i class="bi bi-reply-fill"></i>
4067
- </button>
4068
- <div class="avatar small" *ngIf="position === 'left'">
4069
- <img [src]="avatar" alt="avatar">
4070
- </div>
4071
- <div class="text">
4072
- <div class="replied-message" *ngIf="replayText">
4073
- <span class="name">{{replaySubject}}</span>
4074
- <p>{{replayText}}</p>
4449
+ @if (canReply && position === 'right') {
4450
+ <button class="reply-button" (click)="replyClick($event)">
4451
+ <i class="bi bi-reply-fill"></i>
4452
+ </button>
4453
+ }
4454
+ @if (position === 'left') {
4455
+ <div class="avatar small">
4456
+ <img [src]="avatar" alt="avatar">
4075
4457
  </div>
4458
+ }
4459
+ <div class="text">
4460
+ @if (replayText) {
4461
+ <div class="replied-message">
4462
+ <span class="name">{{replaySubject}}</span>
4463
+ <p>{{replayText}}</p>
4464
+ </div>
4465
+ }
4076
4466
  <div>
4077
4467
  <ng-content/>
4078
4468
  </div>
4079
4469
  <i class="bi bi-check-all float-end"></i>
4080
4470
  <span class="time float-end">{{ dateTime | date:'dd/MM HH:mm:ss' }}</span>
4081
4471
  <rlb-dropdown direction="up" class="reaction">
4082
- <a rlb-button rlb-dropdown *ngIf="!reaction"
4472
+ @if (!reaction) {
4473
+ <a rlb-button rlb-dropdown
4083
4474
  autoClose="manual" class="reaction add p-1"
4084
4475
  [class.right]="position==='right'" [class.left]="position==='left'"
4085
4476
  (status-changed)="this.reactionSelector.emit($event)">
4086
- <i class="bi bi-plus m-0 p-0"></i>
4087
- </a>
4477
+ <i class="bi bi-plus m-0 p-0"></i>
4478
+ </a>
4479
+ }
4088
4480
  <rlb-dropdown-container>
4089
4481
  <ng-content select="[reaction-picker]" />
4090
4482
  </rlb-dropdown-container>
4091
4483
  </rlb-dropdown>
4092
- <span class="reaction" *ngIf="reaction" [class.right]="position==='right'" [class.left]="position==='left'" (click)="reactionClick.emit('remove')">{{reaction}}</span>
4484
+ @if (reaction) {
4485
+ <span class="reaction" [class.right]="position==='right'" [class.left]="position==='left'" (click)="reactionClick.emit('remove')">{{reaction}}</span>
4486
+ }
4093
4487
  </div>
4094
- <div class="avatar small" *ngIf="position === 'right'">
4095
- <img [src]="avatar" alt="avatar">
4096
- </div>
4097
- <button *ngIf="canReply && position === 'left'" class="reply-button" (click)="replyClick($event)">
4098
- <i class="bi bi-reply-fill"></i>
4099
- </button>
4488
+ @if (position === 'right') {
4489
+ <div class="avatar small">
4490
+ <img [src]="avatar" alt="avatar">
4491
+ </div>
4492
+ }
4493
+ @if (canReply && position === 'left') {
4494
+ <button class="reply-button" (click)="replyClick($event)">
4495
+ <i class="bi bi-reply-fill"></i>
4496
+ </button>
4497
+ }
4100
4498
  </div>
4101
4499
  `,
4102
4500
  host: { '[class.ms-auto]': 'position === "right"' },
@@ -4162,7 +4560,7 @@ class ListItemImageComponent {
4162
4560
  <span *ngIf="!counterEmpty"rlb-badge [pill]="counterPill" [color]="counterColor" [border]="counterBorder">{{ counter }}</span>
4163
4561
  </div>
4164
4562
  </div>
4165
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: BadgeComponent, selector: "span[rlb-badge], img[rlb-badge]", inputs: ["pill", "color", "hidden-text", "border", "class"] }, { kind: "component", type: AvatarComponent, selector: "rlb-avatar", inputs: ["size", "shape", "src", "class"] }] }); }
4563
+ `, isInline: true, dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: BadgeComponent, selector: "span[rlb-badge], img[rlb-badge]", inputs: ["pill", "color", "hidden-text", "border", "class"] }, { kind: "component", type: AvatarComponent, selector: "rlb-avatar", inputs: ["size", "shape", "src", "class"] }] }); }
4166
4564
  }
4167
4565
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ListItemImageComponent, decorators: [{
4168
4566
  type: Component,
@@ -4900,19 +5298,23 @@ class PaginationItemComponent {
4900
5298
  this.viewContainerRef.element.nativeElement.remove();
4901
5299
  }
4902
5300
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: PaginationItemComponent, deps: [{ token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component }); }
4903
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "20.3.16", type: PaginationItemComponent, isStandalone: false, selector: "rlb-pagination-item", inputs: { isIcon: ["isIcon", "isIcon", booleanAttribute], disabled: ["disabled", "disabled", booleanAttribute], active: ["active", "active", booleanAttribute], cssClass: ["class", "cssClass"] }, viewQueries: [{ propertyName: "template", first: true, predicate: ["template"], descendants: true, static: true }], ngImport: i0, template: `
5301
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: PaginationItemComponent, isStandalone: false, selector: "rlb-pagination-item", inputs: { isIcon: ["isIcon", "isIcon", booleanAttribute], disabled: ["disabled", "disabled", booleanAttribute], active: ["active", "active", booleanAttribute], cssClass: ["class", "cssClass"] }, viewQueries: [{ propertyName: "template", first: true, predicate: ["template"], descendants: true, static: true }], ngImport: i0, template: `
4904
5302
  <ng-template #template>
4905
5303
  <li class="page-item {{ cssClass }}" [class.disabled]="disabled" [class.active]="active">
4906
- <a class="page-link d-block" *ngIf="isIcon; else e" [attr.disabled]="disabled">
5304
+ @if (isIcon) {
5305
+ <a class="page-link d-block" [attr.disabled]="disabled">
5306
+ <ng-container *ngTemplateOutlet="content"></ng-container>
5307
+ </a>
5308
+ } @else {
4907
5309
  <ng-container *ngTemplateOutlet="content"></ng-container>
4908
- </a>
5310
+ }
4909
5311
  <ng-template #e>
4910
5312
  <ng-container *ngTemplateOutlet="content"></ng-container>
4911
5313
  </ng-template>
4912
5314
  </li>
4913
5315
  </ng-template>
4914
5316
  <ng-template #content><ng-content /></ng-template>
4915
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
5317
+ `, isInline: true, dependencies: [{ kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
4916
5318
  }
4917
5319
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: PaginationItemComponent, decorators: [{
4918
5320
  type: Component,
@@ -4921,16 +5323,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
4921
5323
  template: `
4922
5324
  <ng-template #template>
4923
5325
  <li class="page-item {{ cssClass }}" [class.disabled]="disabled" [class.active]="active">
4924
- <a class="page-link d-block" *ngIf="isIcon; else e" [attr.disabled]="disabled">
5326
+ @if (isIcon) {
5327
+ <a class="page-link d-block" [attr.disabled]="disabled">
5328
+ <ng-container *ngTemplateOutlet="content"></ng-container>
5329
+ </a>
5330
+ } @else {
4925
5331
  <ng-container *ngTemplateOutlet="content"></ng-container>
4926
- </a>
5332
+ }
4927
5333
  <ng-template #e>
4928
5334
  <ng-container *ngTemplateOutlet="content"></ng-container>
4929
5335
  </ng-template>
4930
5336
  </li>
4931
5337
  </ng-template>
4932
5338
  <ng-template #content><ng-content /></ng-template>
4933
- `,
5339
+ `,
4934
5340
  standalone: false
4935
5341
  }]
4936
5342
  }], ctorParameters: () => [{ type: i0.ViewContainerRef }], propDecorators: { template: [{
@@ -5086,7 +5492,7 @@ class RlbPlaceholderComponent {
5086
5492
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: RlbPlaceholderComponent, isStandalone: false, selector: "rlb-placeholder", inputs: { animation: "animation" }, ngImport: i0, template: `
5087
5493
  <div [ngClass]="containerClass">
5088
5494
  <ng-content/>
5089
- </div>`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
5495
+ </div>`, isInline: true, dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
5090
5496
  }
5091
5497
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: RlbPlaceholderComponent, decorators: [{
5092
5498
  type: Component,
@@ -5118,18 +5524,19 @@ class RlbPlaceholderTextComponent {
5118
5524
  return Array.from({ length: this.lines }).map(() => this.width);
5119
5525
  }
5120
5526
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: RlbPlaceholderTextComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5121
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: RlbPlaceholderTextComponent, isStandalone: false, selector: "rlb-placeholder-text", inputs: { lines: "lines", size: "size", color: "color", animation: "animation", width: "width", height: "height", rounded: "rounded" }, ngImport: i0, template: `
5527
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: RlbPlaceholderTextComponent, isStandalone: false, selector: "rlb-placeholder-text", inputs: { lines: "lines", size: "size", color: "color", animation: "animation", width: "width", height: "height", rounded: "rounded" }, ngImport: i0, template: `
5122
5528
  <rlb-placeholder [animation]="animation">
5123
- <rlb-placeholder-line
5124
- *ngFor="let w of computedWidths"
5125
- [size]="size"
5126
- [color]="color"
5127
- [width]="w"
5128
- [rounded]="rounded"
5129
- [height]="height"
5130
- ></rlb-placeholder-line>
5529
+ @for (w of computedWidths; track w) {
5530
+ <rlb-placeholder-line
5531
+ [size]="size"
5532
+ [color]="color"
5533
+ [width]="w"
5534
+ [rounded]="rounded"
5535
+ [height]="height"
5536
+ ></rlb-placeholder-line>
5537
+ }
5131
5538
  </rlb-placeholder>
5132
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: RlbPlaceholderComponent, selector: "rlb-placeholder", inputs: ["animation"] }, { kind: "component", type: RlbPlaceholderLineComponent, selector: "rlb-placeholder-line", inputs: ["size", "color", "width", "height", "rounded"] }] }); }
5539
+ `, isInline: true, dependencies: [{ kind: "component", type: RlbPlaceholderComponent, selector: "rlb-placeholder", inputs: ["animation"] }, { kind: "component", type: RlbPlaceholderLineComponent, selector: "rlb-placeholder-line", inputs: ["size", "color", "width", "height", "rounded"] }] }); }
5133
5540
  }
5134
5541
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: RlbPlaceholderTextComponent, decorators: [{
5135
5542
  type: Component,
@@ -5138,16 +5545,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
5138
5545
  standalone: false,
5139
5546
  template: `
5140
5547
  <rlb-placeholder [animation]="animation">
5141
- <rlb-placeholder-line
5142
- *ngFor="let w of computedWidths"
5143
- [size]="size"
5144
- [color]="color"
5145
- [width]="w"
5146
- [rounded]="rounded"
5147
- [height]="height"
5148
- ></rlb-placeholder-line>
5548
+ @for (w of computedWidths; track w) {
5549
+ <rlb-placeholder-line
5550
+ [size]="size"
5551
+ [color]="color"
5552
+ [width]="w"
5553
+ [rounded]="rounded"
5554
+ [height]="height"
5555
+ ></rlb-placeholder-line>
5556
+ }
5149
5557
  </rlb-placeholder>
5150
- `,
5558
+ `,
5151
5559
  }]
5152
5560
  }], propDecorators: { lines: [{
5153
5561
  type: Input
@@ -5271,11 +5679,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
5271
5679
  args: ['scroll-change']
5272
5680
  }] } });
5273
5681
 
5682
+ class SidebarService {
5683
+ constructor() {
5684
+ this.itemClickedSource = new Subject();
5685
+ this.itemClicked$ = this.itemClickedSource.asObservable();
5686
+ }
5687
+ notifyItemClicked() {
5688
+ this.itemClickedSource.next();
5689
+ }
5690
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SidebarService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
5691
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SidebarService, providedIn: 'root' }); }
5692
+ }
5693
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SidebarService, decorators: [{
5694
+ type: Injectable,
5695
+ args: [{
5696
+ providedIn: 'root'
5697
+ }]
5698
+ }] });
5699
+
5274
5700
  class SidebarItemComponent {
5275
- constructor(viewContainerRef, uniqueIdService, router) {
5701
+ constructor(viewContainerRef, uniqueIdService, router, sidebarService) {
5276
5702
  this.viewContainerRef = viewContainerRef;
5277
5703
  this.uniqueIdService = uniqueIdService;
5278
5704
  this.router = router;
5705
+ this.sidebarService = sidebarService;
5279
5706
  this.click = new EventEmitter();
5280
5707
  this._id = '';
5281
5708
  }
@@ -5288,40 +5715,54 @@ class SidebarItemComponent {
5288
5715
  onItemClick(event) {
5289
5716
  event.stopPropagation();
5290
5717
  this.click.emit(event);
5718
+ if (!this.title && (!this.children || this.children.length === 0)) {
5719
+ this.sidebarService.notifyItemClicked();
5720
+ }
5291
5721
  }
5292
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SidebarItemComponent, deps: [{ token: i0.ViewContainerRef }, { token: UniqueIdService }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Component }); }
5293
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: SidebarItemComponent, isStandalone: false, selector: "rlb-sidebar-item", inputs: { title: "title", icon: "icon", label: "label", link: "link", badgeCounter: "badgeCounter" }, outputs: { click: "click" }, queries: [{ propertyName: "children", predicate: SidebarItemComponent }], viewQueries: [{ propertyName: "template", first: true, predicate: ["template"], descendants: true, static: true }, { propertyName: "collapseComponent", first: true, predicate: CollapseComponent, descendants: true }], ngImport: i0, template: `
5722
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SidebarItemComponent, deps: [{ token: i0.ViewContainerRef }, { token: UniqueIdService }, { token: i2.Router }, { token: SidebarService }], target: i0.ɵɵFactoryTarget.Component }); }
5723
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: SidebarItemComponent, isStandalone: false, selector: "rlb-sidebar-item", inputs: { title: "title", icon: "icon", label: "label", link: "link", badgeCounter: "badgeCounter" }, outputs: { click: "click" }, queries: [{ propertyName: "children", predicate: SidebarItemComponent }], viewQueries: [{ propertyName: "template", first: true, predicate: ["template"], descendants: true, static: true }, { propertyName: "collapseComponent", first: true, predicate: CollapseComponent, descendants: true }], ngImport: i0, template: `
5294
5724
  <ng-template #template>
5295
- <li *ngIf="title" (click)="onItemClick($event)" class="menu-title">{{ title }}</li>
5296
- <li *ngIf="!title" (click)="onItemClick($event)">
5297
- <a
5298
- [badge]="badgeCounter && badgeCounter > 0 ? badgeCounter.toString() : undefined"
5299
- *ngIf="children?.length" href="javascript:void(0);"
5300
- class="is-parent has-arrow"
5301
- toggle="collapse"
5302
- [toggle-target]="'side-item' + _id"
5303
- >
5304
- <i *ngIf="icon" [class]="icon"></i>
5305
- <span>{{ label }}</span>
5306
- </a>
5307
- <rlb-collapse [id]="'side-item' + _id">
5308
- <ul class="sub-menu" aria-expanded="false">
5309
- <ng-content select="rlb-sidebar-item"></ng-content>
5310
- </ul>
5311
- </rlb-collapse>
5312
- <a
5313
- *ngIf="!children?.length"
5314
- [routerLink]="link"
5315
- [badge]="badgeCounter && badgeCounter > 0 ? badgeCounter : undefined"
5316
- class="side-nav-link-ref"
5317
- routerLinkActive="active"
5318
- >
5319
- <i *ngIf="icon" [class]="icon"></i>
5320
- <ng-content></ng-content>
5321
- </a>
5322
- </li>
5725
+ @if (title) {
5726
+ <li (click)="onItemClick($event)" class="menu-title">{{ title }}</li>
5727
+ }
5728
+ @if (!title) {
5729
+ <li (click)="onItemClick($event)">
5730
+ @if (children?.length) {
5731
+ <a
5732
+ [badge]="badgeCounter && badgeCounter > 0 ? badgeCounter.toString() : undefined"
5733
+ href="javascript:void(0);"
5734
+ class="is-parent has-arrow"
5735
+ toggle="collapse"
5736
+ [toggle-target]="'side-item' + _id"
5737
+ >
5738
+ @if (icon) {
5739
+ <i [class]="icon"></i>
5740
+ }
5741
+ <span>{{ label }}</span>
5742
+ </a>
5743
+ }
5744
+ <rlb-collapse [id]="'side-item' + _id">
5745
+ <ul class="sub-menu" aria-expanded="false">
5746
+ <ng-content select="rlb-sidebar-item"></ng-content>
5747
+ </ul>
5748
+ </rlb-collapse>
5749
+ @if (!children?.length) {
5750
+ <a
5751
+ [routerLink]="link"
5752
+ [badge]="badgeCounter && badgeCounter > 0 ? badgeCounter : undefined"
5753
+ class="side-nav-link-ref"
5754
+ routerLinkActive="active"
5755
+ >
5756
+ @if (icon) {
5757
+ <i [class]="icon"></i>
5758
+ }
5759
+ <ng-content></ng-content>
5760
+ </a>
5761
+ }
5762
+ </li>
5763
+ }
5323
5764
  </ng-template>
5324
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i2.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: BadgeDirective, selector: "[badge]", inputs: ["badge", "badge-pill", "badge-border", "badge-top", "badge-start", "badge-color", "hidden-text"] }, { kind: "component", type: CollapseComponent, selector: "rlb-collapse", inputs: ["id", "orientation", "status"], outputs: ["statusChange"] }, { kind: "directive", type: ToggleDirective, selector: "\n button[toggle],\n a[toggle],\n rlb-navbar-item[toggle],\n rlb-button-toolbar[toggle]", inputs: ["toggle", "toggle-target", "collapsed", "auto-close"] }] }); }
5765
+ `, isInline: true, dependencies: [{ kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i2.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: BadgeDirective, selector: "[badge]", inputs: ["badge", "badge-pill", "badge-border", "badge-top", "badge-start", "badge-color", "hidden-text"] }, { kind: "component", type: CollapseComponent, selector: "rlb-collapse", inputs: ["id", "orientation", "status"], outputs: ["statusChange"] }, { kind: "directive", type: ToggleDirective, selector: "\n button[toggle],\n a[toggle],\n rlb-navbar-item[toggle],\n rlb-button-toolbar[toggle]", inputs: ["toggle", "toggle-target", "collapsed", "auto-close"] }] }); }
5325
5766
  }
5326
5767
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SidebarItemComponent, decorators: [{
5327
5768
  type: Component,
@@ -5329,39 +5770,50 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
5329
5770
  selector: 'rlb-sidebar-item',
5330
5771
  template: `
5331
5772
  <ng-template #template>
5332
- <li *ngIf="title" (click)="onItemClick($event)" class="menu-title">{{ title }}</li>
5333
- <li *ngIf="!title" (click)="onItemClick($event)">
5334
- <a
5335
- [badge]="badgeCounter && badgeCounter > 0 ? badgeCounter.toString() : undefined"
5336
- *ngIf="children?.length" href="javascript:void(0);"
5337
- class="is-parent has-arrow"
5338
- toggle="collapse"
5339
- [toggle-target]="'side-item' + _id"
5340
- >
5341
- <i *ngIf="icon" [class]="icon"></i>
5342
- <span>{{ label }}</span>
5343
- </a>
5344
- <rlb-collapse [id]="'side-item' + _id">
5345
- <ul class="sub-menu" aria-expanded="false">
5346
- <ng-content select="rlb-sidebar-item"></ng-content>
5347
- </ul>
5348
- </rlb-collapse>
5349
- <a
5350
- *ngIf="!children?.length"
5351
- [routerLink]="link"
5352
- [badge]="badgeCounter && badgeCounter > 0 ? badgeCounter : undefined"
5353
- class="side-nav-link-ref"
5354
- routerLinkActive="active"
5355
- >
5356
- <i *ngIf="icon" [class]="icon"></i>
5357
- <ng-content></ng-content>
5358
- </a>
5359
- </li>
5773
+ @if (title) {
5774
+ <li (click)="onItemClick($event)" class="menu-title">{{ title }}</li>
5775
+ }
5776
+ @if (!title) {
5777
+ <li (click)="onItemClick($event)">
5778
+ @if (children?.length) {
5779
+ <a
5780
+ [badge]="badgeCounter && badgeCounter > 0 ? badgeCounter.toString() : undefined"
5781
+ href="javascript:void(0);"
5782
+ class="is-parent has-arrow"
5783
+ toggle="collapse"
5784
+ [toggle-target]="'side-item' + _id"
5785
+ >
5786
+ @if (icon) {
5787
+ <i [class]="icon"></i>
5788
+ }
5789
+ <span>{{ label }}</span>
5790
+ </a>
5791
+ }
5792
+ <rlb-collapse [id]="'side-item' + _id">
5793
+ <ul class="sub-menu" aria-expanded="false">
5794
+ <ng-content select="rlb-sidebar-item"></ng-content>
5795
+ </ul>
5796
+ </rlb-collapse>
5797
+ @if (!children?.length) {
5798
+ <a
5799
+ [routerLink]="link"
5800
+ [badge]="badgeCounter && badgeCounter > 0 ? badgeCounter : undefined"
5801
+ class="side-nav-link-ref"
5802
+ routerLinkActive="active"
5803
+ >
5804
+ @if (icon) {
5805
+ <i [class]="icon"></i>
5806
+ }
5807
+ <ng-content></ng-content>
5808
+ </a>
5809
+ }
5810
+ </li>
5811
+ }
5360
5812
  </ng-template>
5361
- `,
5813
+ `,
5362
5814
  standalone: false
5363
5815
  }]
5364
- }], ctorParameters: () => [{ type: i0.ViewContainerRef }, { type: UniqueIdService }, { type: i2.Router }], propDecorators: { title: [{
5816
+ }], ctorParameters: () => [{ type: i0.ViewContainerRef }, { type: UniqueIdService }, { type: i2.Router }, { type: SidebarService }], propDecorators: { title: [{
5365
5817
  type: Input
5366
5818
  }], icon: [{
5367
5819
  type: Input
@@ -5467,15 +5919,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
5467
5919
  * Sidebar component
5468
5920
  */
5469
5921
  class SidebarComponent {
5470
- onResize() {
5471
- this.checkBreakpoint();
5472
- }
5473
- constructor() {
5922
+ constructor(sidebarService, breakpointService) {
5923
+ this.sidebarService = sidebarService;
5924
+ this.breakpointService = breakpointService;
5474
5925
  this.isCollapsed = false;
5926
+ this.subscription = new Subscription();
5475
5927
  this.rounded = false;
5476
5928
  }
5477
5929
  ngOnInit() {
5478
- this.checkBreakpoint();
5930
+ this.subscription.add(this.breakpointService.isMobile$.subscribe((isMobile) => {
5931
+ this.setCollapsed(isMobile);
5932
+ }));
5933
+ this.subscription.add(this.sidebarService.itemClicked$.subscribe(() => {
5934
+ if (this.breakpointService.isMobile) {
5935
+ this.setCollapsed(true);
5936
+ }
5937
+ }));
5938
+ }
5939
+ ngOnDestroy() {
5940
+ this.subscription.unsubscribe();
5479
5941
  }
5480
5942
  toggleSidebar() {
5481
5943
  this.setCollapsed(!this.isCollapsed);
@@ -5487,12 +5949,8 @@ class SidebarComponent {
5487
5949
  content?.classList.toggle('expanded', collapsed);
5488
5950
  sidebar?.classList.toggle('collapsed', collapsed);
5489
5951
  }
5490
- checkBreakpoint() {
5491
- const shouldCollapse = window.innerWidth <= 992;
5492
- this.setCollapsed(shouldCollapse);
5493
- }
5494
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SidebarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5495
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: SidebarComponent, isStandalone: false, selector: "rlb-sidebar", inputs: { rounded: "rounded" }, host: { listeners: { "window:resize": "onResize($event)" } }, viewQueries: [{ propertyName: "sideMenu", first: true, predicate: ["sideMenu"], descendants: true }], ngImport: i0, template: `
5952
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SidebarComponent, deps: [{ token: SidebarService }, { token: BreakpointService }], target: i0.ɵɵFactoryTarget.Component }); }
5953
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: SidebarComponent, isStandalone: false, selector: "rlb-sidebar", inputs: { rounded: "rounded" }, viewQueries: [{ propertyName: "sideMenu", first: true, predicate: ["sideMenu"], descendants: true }], ngImport: i0, template: `
5496
5954
  <div class="vertical-menu" [class.rounded-2]="rounded">
5497
5955
  <div id="sidebar-menu" class="w-100 h-100 overflow-y-auto">
5498
5956
  <ul class="metismenu list-unstyled" id="side-menu" #sideMenu>
@@ -5535,15 +5993,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
5535
5993
  `,
5536
5994
  standalone: false
5537
5995
  }]
5538
- }], ctorParameters: () => [], propDecorators: { sideMenu: [{
5996
+ }], ctorParameters: () => [{ type: SidebarService }, { type: BreakpointService }], propDecorators: { sideMenu: [{
5539
5997
  type: ViewChild,
5540
5998
  args: ['sideMenu']
5541
5999
  }], rounded: [{
5542
6000
  type: Input,
5543
6001
  args: [{ alias: 'rounded', required: false }]
5544
- }], onResize: [{
5545
- type: HostListener,
5546
- args: ['window:resize', ['$event']]
5547
6002
  }] } });
5548
6003
 
5549
6004
  class TabContentComponent {
@@ -6157,15 +6612,17 @@ class DataTableRowComponent {
6157
6612
  }
6158
6613
  }
6159
6614
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DataTableRowComponent, deps: [{ token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component }); }
6160
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: DataTableRowComponent, isStandalone: false, selector: "rlb-dt-row", inputs: { cssClass: ["class", "cssClass"], cssStyle: ["style", "cssStyle"] }, outputs: { rowClick: "rowClick" }, queries: [{ propertyName: "actionsBlock", predicate: DataTableActionsComponent }], viewQueries: [{ propertyName: "template", first: true, predicate: ["template"], descendants: true, static: true }, { propertyName: "_projectedActions", first: true, predicate: ["projectedActions"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: `
6615
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DataTableRowComponent, isStandalone: false, selector: "rlb-dt-row", inputs: { cssClass: ["class", "cssClass"], cssStyle: ["style", "cssStyle"] }, outputs: { rowClick: "rowClick" }, queries: [{ propertyName: "actionsBlock", predicate: DataTableActionsComponent }], viewQueries: [{ propertyName: "template", first: true, predicate: ["template"], descendants: true, static: true }, { propertyName: "_projectedActions", first: true, predicate: ["projectedActions"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: `
6161
6616
  <ng-template #template>
6162
6617
  <tr [class]="cssClass" [style]="cssStyle" (click)="rowClick.emit($event)">
6163
6618
  <ng-content select="rlb-dt-cell"></ng-content>
6164
- <rlb-dt-cell *ngIf="hasActions">
6165
- <ng-container #projectedActions></ng-container>
6166
- </rlb-dt-cell>
6619
+ @if (hasActions) {
6620
+ <rlb-dt-cell>
6621
+ <ng-container #projectedActions></ng-container>
6622
+ </rlb-dt-cell>
6623
+ }
6167
6624
  </tr>
6168
- </ng-template>`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: DataTableCellComponent, selector: "rlb-dt-cell", inputs: ["col-span", "class", "style"] }] }); }
6625
+ </ng-template>`, isInline: true, dependencies: [{ kind: "component", type: DataTableCellComponent, selector: "rlb-dt-cell", inputs: ["col-span", "class", "style"] }] }); }
6169
6626
  }
6170
6627
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DataTableRowComponent, decorators: [{
6171
6628
  type: Component,
@@ -6175,9 +6632,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
6175
6632
  <ng-template #template>
6176
6633
  <tr [class]="cssClass" [style]="cssStyle" (click)="rowClick.emit($event)">
6177
6634
  <ng-content select="rlb-dt-cell"></ng-content>
6178
- <rlb-dt-cell *ngIf="hasActions">
6179
- <ng-container #projectedActions></ng-container>
6180
- </rlb-dt-cell>
6635
+ @if (hasActions) {
6636
+ <rlb-dt-cell>
6637
+ <ng-container #projectedActions></ng-container>
6638
+ </rlb-dt-cell>
6639
+ }
6181
6640
  </tr>
6182
6641
  </ng-template>`,
6183
6642
  standalone: false
@@ -6332,13 +6791,15 @@ class InputValidationComponent {
6332
6791
  return `${i18nKey}: ${JSON.stringify(errorValue)}`;
6333
6792
  }
6334
6793
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: InputValidationComponent, deps: [{ token: RLB_TRANSLATION_SERVICE, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
6335
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: InputValidationComponent, isStandalone: false, selector: "rlb-input-validation", inputs: { errors: "errors" }, host: { classAttribute: "invalid-feedback" }, ngImport: i0, template: `
6336
- <ng-container *ngIf="errors">
6337
- <span *ngFor="let errorKey of getErrorKeys(errors)">
6338
- {{ getTranslatedError(errorKey, errors[errorKey]) }}
6339
- </span>
6340
- </ng-container>
6341
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
6794
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: InputValidationComponent, isStandalone: false, selector: "rlb-input-validation", inputs: { errors: "errors" }, host: { classAttribute: "invalid-feedback" }, ngImport: i0, template: `
6795
+ @if (errors) {
6796
+ @for (errorKey of getErrorKeys(errors); track errorKey) {
6797
+ <span>
6798
+ {{ getTranslatedError(errorKey, errors[errorKey]) }}
6799
+ </span>
6800
+ }
6801
+ }
6802
+ `, isInline: true }); }
6342
6803
  }
6343
6804
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: InputValidationComponent, decorators: [{
6344
6805
  type: Component,
@@ -6346,12 +6807,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
6346
6807
  selector: 'rlb-input-validation',
6347
6808
  host: { class: 'invalid-feedback' },
6348
6809
  template: `
6349
- <ng-container *ngIf="errors">
6350
- <span *ngFor="let errorKey of getErrorKeys(errors)">
6351
- {{ getTranslatedError(errorKey, errors[errorKey]) }}
6352
- </span>
6353
- </ng-container>
6354
- `,
6810
+ @if (errors) {
6811
+ @for (errorKey of getErrorKeys(errors); track errorKey) {
6812
+ <span>
6813
+ {{ getTranslatedError(errorKey, errors[errorKey]) }}
6814
+ </span>
6815
+ }
6816
+ }
6817
+ `,
6355
6818
  standalone: false
6356
6819
  }]
6357
6820
  }], ctorParameters: () => [{ type: undefined, decorators: [{
@@ -6421,7 +6884,7 @@ class SelectComponent extends AbstractComponent {
6421
6884
  }
6422
6885
  }
6423
6886
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SelectComponent, deps: [{ token: UniqueIdService }, { token: i2$2.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); }
6424
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "20.3.16", type: SelectComponent, isStandalone: false, selector: "rlb-select", inputs: { placeholder: "placeholder", size: "size", disabled: ["disabled", "disabled", booleanAttribute], readonly: ["readonly", "readonly", booleanAttribute], multiple: ["multiple", "multiple", booleanAttribute], display: ["display", "display", numberAttribute], userDefinedId: ["id", "userDefinedId", (v) => v || ''], enableValidation: ["enable-validation", "enableValidation", booleanAttribute] }, queries: [{ propertyName: "options", predicate: OptionComponent }], viewQueries: [{ propertyName: "el", first: true, predicate: ["select"], descendants: true }, { propertyName: "_projectedDisplayOptions", first: true, predicate: ["projectedDisplayOptions"], descendants: true, read: ViewContainerRef }], usesInheritance: true, ngImport: i0, template: `
6887
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: SelectComponent, isStandalone: false, selector: "rlb-select", inputs: { placeholder: "placeholder", size: "size", disabled: ["disabled", "disabled", booleanAttribute], readonly: ["readonly", "readonly", booleanAttribute], multiple: ["multiple", "multiple", booleanAttribute], display: ["display", "display", numberAttribute], userDefinedId: ["id", "userDefinedId", (v) => v || ''], enableValidation: ["enable-validation", "enableValidation", booleanAttribute] }, queries: [{ propertyName: "options", predicate: OptionComponent }], viewQueries: [{ propertyName: "el", first: true, predicate: ["select"], descendants: true }, { propertyName: "_projectedDisplayOptions", first: true, predicate: ["projectedDisplayOptions"], descendants: true, read: ViewContainerRef }], usesInheritance: true, ngImport: i0, template: `
6425
6888
  <ng-content select="[before]"></ng-content>
6426
6889
  <div class="input-group has-validation">
6427
6890
  <select
@@ -6441,13 +6904,17 @@ class SelectComponent extends AbstractComponent {
6441
6904
  'is-valid': control?.touched && control?.valid && enableValidation
6442
6905
  }"
6443
6906
  (change)="update($event.target)"
6444
- >
6445
- <option *ngIf="placeholder" selected disabled>{{ placeholder }}</option>
6907
+ >
6908
+ @if (placeholder) {
6909
+ <option selected disabled>{{ placeholder }}</option>
6910
+ }
6446
6911
  <ng-container #projectedDisplayOptions></ng-container>
6447
6912
  </select>
6448
- <rlb-input-validation *ngIf="errors && showError" [errors]="errors"/>
6449
- </div>
6450
- <ng-content select="[after]"></ng-content>`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2$2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "component", type: InputValidationComponent, selector: "rlb-input-validation", inputs: ["errors"] }] }); }
6913
+ @if (errors && showError) {
6914
+ <rlb-input-validation [errors]="errors"/>
6915
+ }
6916
+ </div>
6917
+ <ng-content select="[after]"></ng-content>`, isInline: true, dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2$2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2$2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "component", type: InputValidationComponent, selector: "rlb-input-validation", inputs: ["errors"] }] }); }
6451
6918
  }
6452
6919
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SelectComponent, decorators: [{
6453
6920
  type: Component,
@@ -6473,12 +6940,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
6473
6940
  'is-valid': control?.touched && control?.valid && enableValidation
6474
6941
  }"
6475
6942
  (change)="update($event.target)"
6476
- >
6477
- <option *ngIf="placeholder" selected disabled>{{ placeholder }}</option>
6943
+ >
6944
+ @if (placeholder) {
6945
+ <option selected disabled>{{ placeholder }}</option>
6946
+ }
6478
6947
  <ng-container #projectedDisplayOptions></ng-container>
6479
6948
  </select>
6480
- <rlb-input-validation *ngIf="errors && showError" [errors]="errors"/>
6481
- </div>
6949
+ @if (errors && showError) {
6950
+ <rlb-input-validation [errors]="errors"/>
6951
+ }
6952
+ </div>
6482
6953
  <ng-content select="[after]"></ng-content>`,
6483
6954
  standalone: false
6484
6955
  }]
@@ -6524,6 +6995,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
6524
6995
  class DataTableComponent {
6525
6996
  constructor() {
6526
6997
  this.creationStrategy = 'none';
6998
+ this.items = [];
6527
6999
  this.paginationMode = 'none';
6528
7000
  this.tableStriped = true; // default true to keep main table styling
6529
7001
  this.showActions = 'row';
@@ -6660,11 +7132,11 @@ class DataTableComponent {
6660
7132
  // c?.scrollBy({ left: ev.deltaY < 0 ? -15 : 15 });
6661
7133
  }
6662
7134
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DataTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6663
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "20.3.16", type: DataTableComponent, isStandalone: false, selector: "rlb-dt-table", inputs: { title: "title", creationStrategy: ["creation-strategy", "creationStrategy"], creationUrl: ["creation-url", "creationUrl"], items: "items", paginationMode: ["pagination-mode", "paginationMode"], loading: ["loading", "loading", booleanAttribute], tableHover: ["table-hover", "tableHover", booleanAttribute], tableStriped: ["table-striped", "tableStriped", booleanAttribute], tableStripedColumns: ["table-striped-columns", "tableStripedColumns", booleanAttribute], tableBordered: ["table-bordered", "tableBordered", booleanAttribute], tableBorderless: ["table-borderless", "tableBorderless", booleanAttribute], tableSmall: ["table-small", "tableSmall", booleanAttribute], showRefresh: ["show-refresh", "showRefresh", booleanAttribute], totalItems: ["total-items", "totalItems", numberAttribute], currentPage: ["current-page", "currentPage", numberAttribute], pageSize: ["page-size", "pageSize", numberAttribute], showActions: "showActions", loadMoreLabel: "loadMoreLabel" }, outputs: { createItem: "create-item", refreshItem: "refresh-item", loadMore: "load-more", currentPageChange: "current-pageChange", pageSizeChange: "page-sizeChange", pagination: "pagination" }, queries: [{ propertyName: "rows", predicate: DataTableRowComponent }, { propertyName: "columns", predicate: DataTableHeaderComponent }], viewQueries: [{ propertyName: "_projectedDisplayColumns", first: true, predicate: ["projectedDisplayColumns"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<div class=\"row\" *ngIf=\"creationStrategy !== 'none' || title || showRefresh\">\n <div class=\"col\">\n <h3 *ngIf=\"title\" class=\"float-start\">{{ title }}</h3>\n <ng-container *ngIf=\"showRefresh\">\n <button type=\"button\" class=\"btn btn-outline-primary float-end mb-2 me-3\" (click)=\"refreshItem.emit()\"\n [disabled]=\"loading\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n </button>\n </ng-container>\n <ng-container *ngIf=\"creationStrategy === 'page'\">\n <button type=\"button\" class=\"btn btn-outline-primary float-end mb-2 me-3\" [routerLink]=\"creationUrl\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n </ng-container>\n <ng-container *ngIf=\"creationStrategy === 'modal'\">\n <button type=\"button\" class=\"btn btn-outline-primary float-end mb-2 me-3\" (click)=\"createItem.emit()\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n </ng-container>\n </div>\n</div>\n<div class=\"table-responsive\">\n <table [ngClass]=\"getTableClasses()\">\n\t\t<thead>\n\t\t<tr>\n\t\t\t<ng-container #projectedDisplayColumns></ng-container>\n\t\t\t<th *ngIf=\"hasActions\">\n <span class=\"float-end pe-2\">\n Actions\n </span>\n\t\t\t</th>\n\t\t</tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t<ng-content *ngIf=\"!loading\" select=\"rlb-dt-row\"/>\n\t\t<rlb-dt-row *ngIf=\"!loading && items?.length === 0\" class=\"text-center\">\n\t\t\t<rlb-dt-cell [col-span]=\"cols\" style=\"border: 0\">\n\t\t\t\t<ng-content select=\"rlb-dt-noitems\"/>\n\t\t\t</rlb-dt-cell>\n\t\t</rlb-dt-row>\n\t\t<rlb-dt-row *ngIf=\"loading\" class=\"text-center\">\n\t\t\t<rlb-dt-cell [col-span]=\"cols\" style=\"border: 0\">\n\t\t\t\t<ng-content select=\"rlb-dt-loading\"/>\n\t\t\t</rlb-dt-cell>\n\t\t</rlb-dt-row>\n\t\t</tbody>\n\t\t<tfoot *ngIf=\"pagination && paginationMode !== 'none'\">\n\t\t<rlb-dt-row>\n\t\t\t<rlb-dt-cell [col-span]=\"hasActions ? cols+1: cols\" style=\"border: 0\">\n\t\t\t\t<button *ngIf=\"paginationMode === 'load-more'\" type=\"button\" class=\"btn btn-primary float-end btn-sm mt-2\"\n\t\t\t\t\t\t\t\t[disabled]=\"loading\" (click)=\"loadMore.emit()\">\n\t\t\t\t\t{{ loadMoreLabel }}\n\t\t\t\t</button>\n\t\t\t\t<ng-container *ngIf=\"paginationMode === 'pages'\">\n\t\t\t\t\t<nav aria-label=\"Page navigation example\">\n <ul class=\"pagination float-end pagination-sm\">\n <li class=\"page-item\">\n <a class=\"page-link d-block\" [class.disabled]=\"currentPage === 1\" href=\"#\" aria-label=\"Previous\"\n (click)=\"prev($event)\">\n <span aria-hidden=\"true\">&laquo;</span>\n </a>\n </li>\n\n <ng-container *ngFor=\"let page of visiblePages\">\n <li class=\"page-item\"\n [class.active]=\"currentPage === page\"\n [class.disabled]=\"page === '...'\">\n <a class=\"page-link d-block\"\n href=\"#\"\n (click)=\"selectPage($event, page)\">\n {{ page }}\n </a>\n </li>\n </ng-container>\n\n <li class=\"page-item\">\n <a class=\"page-link d-block\" [class.disabled]=\"currentPage === pages\" href=\"#\" aria-label=\"Next\"\n (click)=\"next($event)\">\n <span aria-hidden=\"true\">&raquo;</span>\n </a>\n </li>\n </ul>\n\t\t\t\t\t\t<ul class=\"ps-0 float-end me-3\">\n\t\t\t\t\t\t\t<rlb-select size=\"small\" [(ngModel)]=\"pageSize\" (ngModelChange)=\"selectSize()\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t[disabled]=\"items.length === 0\">\n\t\t\t\t\t\t\t\t<rlb-option [value]=\"10\">10</rlb-option>\n\t\t\t\t\t\t\t\t<rlb-option [value]=\"20\">20</rlb-option>\n\t\t\t\t\t\t\t\t<rlb-option [value]=\"50\">50</rlb-option>\n\t\t\t\t\t\t\t\t<rlb-option [value]=\"100\">100</rlb-option>\n\t\t\t\t\t\t\t</rlb-select>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</nav>\n\t\t\t\t</ng-container>\n\t\t\t</rlb-dt-cell>\n\t\t</rlb-dt-row>\n\t\t</tfoot>\n\t</table>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: DataTableCellComponent, selector: "rlb-dt-cell", inputs: ["col-span", "class", "style"] }, { kind: "component", type: DataTableRowComponent, selector: "rlb-dt-row", inputs: ["class", "style"], outputs: ["rowClick"] }, { kind: "component", type: SelectComponent, selector: "rlb-select", inputs: ["placeholder", "size", "disabled", "readonly", "multiple", "display", "id", "enable-validation"] }, { kind: "component", type: OptionComponent, selector: "rlb-option", inputs: ["disabled", "value", "class"] }] }); }
7135
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DataTableComponent, isStandalone: false, selector: "rlb-dt-table", inputs: { title: "title", creationStrategy: ["creation-strategy", "creationStrategy"], creationUrl: ["creation-url", "creationUrl"], items: "items", paginationMode: ["pagination-mode", "paginationMode"], loading: ["loading", "loading", booleanAttribute], tableHover: ["table-hover", "tableHover", booleanAttribute], tableStriped: ["table-striped", "tableStriped", booleanAttribute], tableStripedColumns: ["table-striped-columns", "tableStripedColumns", booleanAttribute], tableBordered: ["table-bordered", "tableBordered", booleanAttribute], tableBorderless: ["table-borderless", "tableBorderless", booleanAttribute], tableSmall: ["table-small", "tableSmall", booleanAttribute], showRefresh: ["show-refresh", "showRefresh", booleanAttribute], totalItems: ["total-items", "totalItems", numberAttribute], currentPage: ["current-page", "currentPage", numberAttribute], pageSize: ["page-size", "pageSize", numberAttribute], showActions: "showActions", loadMoreLabel: "loadMoreLabel" }, outputs: { createItem: "create-item", refreshItem: "refresh-item", loadMore: "load-more", currentPageChange: "current-pageChange", pageSizeChange: "page-sizeChange", pagination: "pagination" }, queries: [{ propertyName: "rows", predicate: DataTableRowComponent }, { propertyName: "columns", predicate: DataTableHeaderComponent }], viewQueries: [{ propertyName: "_projectedDisplayColumns", first: true, predicate: ["projectedDisplayColumns"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "@if (creationStrategy !== 'none' || title || showRefresh) {\n <div class=\"row\">\n <div class=\"col\">\n @if (title) {\n <h3 class=\"float-start\">{{ title }}</h3>\n }\n @if (showRefresh) {\n <button type=\"button\" class=\"btn btn-outline-primary float-end mb-2 me-3\" (click)=\"refreshItem.emit()\"\n [disabled]=\"loading\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n </button>\n }\n @if (creationStrategy === 'page') {\n <button type=\"button\" class=\"btn btn-outline-primary float-end mb-2 me-3\" [routerLink]=\"creationUrl\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n @if (creationStrategy === 'modal') {\n <button type=\"button\" class=\"btn btn-outline-primary float-end mb-2 me-3\" (click)=\"createItem.emit()\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n </div>\n </div>\n}\n<div class=\"table-responsive\">\n <table [ngClass]=\"getTableClasses()\">\n <thead>\n <tr>\n <ng-container #projectedDisplayColumns></ng-container>\n @if (hasActions) {\n <th>\n <span class=\"float-end pe-2\">\n Actions\n </span>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (!loading) {\n <ng-content select=\"rlb-dt-row\"/>\n }\n @if (!loading && items.length === 0) {\n <rlb-dt-row class=\"text-center\">\n <rlb-dt-cell [col-span]=\"cols\" style=\"border: 0\">\n <ng-content select=\"rlb-dt-noitems\"/>\n </rlb-dt-cell>\n </rlb-dt-row>\n }\n @if (loading) {\n <rlb-dt-row class=\"text-center\">\n <rlb-dt-cell [col-span]=\"cols\" style=\"border: 0\">\n <ng-content select=\"rlb-dt-loading\"/>\n </rlb-dt-cell>\n </rlb-dt-row>\n }\n </tbody>\n @if (pagination && paginationMode !== 'none') {\n <tfoot>\n <rlb-dt-row>\n <rlb-dt-cell [col-span]=\"hasActions ? cols+1: cols\" style=\"border: 0\">\n @if (paginationMode === 'load-more') {\n <button type=\"button\" class=\"btn btn-primary float-end btn-sm mt-2\"\n [disabled]=\"loading\" (click)=\"loadMore.emit()\">\n {{ loadMoreLabel }}\n </button>\n }\n @if (paginationMode === 'pages') {\n <nav aria-label=\"Page navigation example\">\n <ul class=\"pagination float-end pagination-sm\">\n <li class=\"page-item\">\n <a class=\"page-link d-block\" [class.disabled]=\"currentPage === 1\" href=\"#\" aria-label=\"Previous\"\n (click)=\"prev($event)\">\n <span aria-hidden=\"true\">&laquo;</span>\n </a>\n </li>\n @for (page of visiblePages; track page) {\n <li class=\"page-item\"\n [class.active]=\"currentPage === page\"\n [class.disabled]=\"page === '...'\">\n <a class=\"page-link d-block\"\n href=\"#\"\n (click)=\"selectPage($event, page)\">\n {{ page }}\n </a>\n </li>\n }\n <li class=\"page-item\">\n <a class=\"page-link d-block\" [class.disabled]=\"currentPage === pages\" href=\"#\" aria-label=\"Next\"\n (click)=\"next($event)\">\n <span aria-hidden=\"true\">&raquo;</span>\n </a>\n </li>\n </ul>\n <ul class=\"ps-0 float-end me-3\">\n <rlb-select size=\"small\" [(ngModel)]=\"pageSize\" (ngModelChange)=\"selectSize()\"\n [disabled]=\"items.length === 0\">\n <rlb-option [value]=\"10\">10</rlb-option>\n <rlb-option [value]=\"20\">20</rlb-option>\n <rlb-option [value]=\"50\">50</rlb-option>\n <rlb-option [value]=\"100\">100</rlb-option>\n </rlb-select>\n </ul>\n </nav>\n }\n </rlb-dt-cell>\n </rlb-dt-row>\n </tfoot>\n }\n </table>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: DataTableCellComponent, selector: "rlb-dt-cell", inputs: ["col-span", "class", "style"] }, { kind: "component", type: DataTableRowComponent, selector: "rlb-dt-row", inputs: ["class", "style"], outputs: ["rowClick"] }, { kind: "component", type: SelectComponent, selector: "rlb-select", inputs: ["placeholder", "size", "disabled", "readonly", "multiple", "display", "id", "enable-validation"] }, { kind: "component", type: OptionComponent, selector: "rlb-option", inputs: ["disabled", "value", "class"] }] }); }
6664
7136
  }
6665
7137
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DataTableComponent, decorators: [{
6666
7138
  type: Component,
6667
- args: [{ selector: 'rlb-dt-table', standalone: false, template: "<div class=\"row\" *ngIf=\"creationStrategy !== 'none' || title || showRefresh\">\n <div class=\"col\">\n <h3 *ngIf=\"title\" class=\"float-start\">{{ title }}</h3>\n <ng-container *ngIf=\"showRefresh\">\n <button type=\"button\" class=\"btn btn-outline-primary float-end mb-2 me-3\" (click)=\"refreshItem.emit()\"\n [disabled]=\"loading\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n </button>\n </ng-container>\n <ng-container *ngIf=\"creationStrategy === 'page'\">\n <button type=\"button\" class=\"btn btn-outline-primary float-end mb-2 me-3\" [routerLink]=\"creationUrl\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n </ng-container>\n <ng-container *ngIf=\"creationStrategy === 'modal'\">\n <button type=\"button\" class=\"btn btn-outline-primary float-end mb-2 me-3\" (click)=\"createItem.emit()\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n </ng-container>\n </div>\n</div>\n<div class=\"table-responsive\">\n <table [ngClass]=\"getTableClasses()\">\n\t\t<thead>\n\t\t<tr>\n\t\t\t<ng-container #projectedDisplayColumns></ng-container>\n\t\t\t<th *ngIf=\"hasActions\">\n <span class=\"float-end pe-2\">\n Actions\n </span>\n\t\t\t</th>\n\t\t</tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t<ng-content *ngIf=\"!loading\" select=\"rlb-dt-row\"/>\n\t\t<rlb-dt-row *ngIf=\"!loading && items?.length === 0\" class=\"text-center\">\n\t\t\t<rlb-dt-cell [col-span]=\"cols\" style=\"border: 0\">\n\t\t\t\t<ng-content select=\"rlb-dt-noitems\"/>\n\t\t\t</rlb-dt-cell>\n\t\t</rlb-dt-row>\n\t\t<rlb-dt-row *ngIf=\"loading\" class=\"text-center\">\n\t\t\t<rlb-dt-cell [col-span]=\"cols\" style=\"border: 0\">\n\t\t\t\t<ng-content select=\"rlb-dt-loading\"/>\n\t\t\t</rlb-dt-cell>\n\t\t</rlb-dt-row>\n\t\t</tbody>\n\t\t<tfoot *ngIf=\"pagination && paginationMode !== 'none'\">\n\t\t<rlb-dt-row>\n\t\t\t<rlb-dt-cell [col-span]=\"hasActions ? cols+1: cols\" style=\"border: 0\">\n\t\t\t\t<button *ngIf=\"paginationMode === 'load-more'\" type=\"button\" class=\"btn btn-primary float-end btn-sm mt-2\"\n\t\t\t\t\t\t\t\t[disabled]=\"loading\" (click)=\"loadMore.emit()\">\n\t\t\t\t\t{{ loadMoreLabel }}\n\t\t\t\t</button>\n\t\t\t\t<ng-container *ngIf=\"paginationMode === 'pages'\">\n\t\t\t\t\t<nav aria-label=\"Page navigation example\">\n <ul class=\"pagination float-end pagination-sm\">\n <li class=\"page-item\">\n <a class=\"page-link d-block\" [class.disabled]=\"currentPage === 1\" href=\"#\" aria-label=\"Previous\"\n (click)=\"prev($event)\">\n <span aria-hidden=\"true\">&laquo;</span>\n </a>\n </li>\n\n <ng-container *ngFor=\"let page of visiblePages\">\n <li class=\"page-item\"\n [class.active]=\"currentPage === page\"\n [class.disabled]=\"page === '...'\">\n <a class=\"page-link d-block\"\n href=\"#\"\n (click)=\"selectPage($event, page)\">\n {{ page }}\n </a>\n </li>\n </ng-container>\n\n <li class=\"page-item\">\n <a class=\"page-link d-block\" [class.disabled]=\"currentPage === pages\" href=\"#\" aria-label=\"Next\"\n (click)=\"next($event)\">\n <span aria-hidden=\"true\">&raquo;</span>\n </a>\n </li>\n </ul>\n\t\t\t\t\t\t<ul class=\"ps-0 float-end me-3\">\n\t\t\t\t\t\t\t<rlb-select size=\"small\" [(ngModel)]=\"pageSize\" (ngModelChange)=\"selectSize()\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t[disabled]=\"items.length === 0\">\n\t\t\t\t\t\t\t\t<rlb-option [value]=\"10\">10</rlb-option>\n\t\t\t\t\t\t\t\t<rlb-option [value]=\"20\">20</rlb-option>\n\t\t\t\t\t\t\t\t<rlb-option [value]=\"50\">50</rlb-option>\n\t\t\t\t\t\t\t\t<rlb-option [value]=\"100\">100</rlb-option>\n\t\t\t\t\t\t\t</rlb-select>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</nav>\n\t\t\t\t</ng-container>\n\t\t\t</rlb-dt-cell>\n\t\t</rlb-dt-row>\n\t\t</tfoot>\n\t</table>\n</div>\n" }]
7139
+ args: [{ selector: 'rlb-dt-table', standalone: false, template: "@if (creationStrategy !== 'none' || title || showRefresh) {\n <div class=\"row\">\n <div class=\"col\">\n @if (title) {\n <h3 class=\"float-start\">{{ title }}</h3>\n }\n @if (showRefresh) {\n <button type=\"button\" class=\"btn btn-outline-primary float-end mb-2 me-3\" (click)=\"refreshItem.emit()\"\n [disabled]=\"loading\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n </button>\n }\n @if (creationStrategy === 'page') {\n <button type=\"button\" class=\"btn btn-outline-primary float-end mb-2 me-3\" [routerLink]=\"creationUrl\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n @if (creationStrategy === 'modal') {\n <button type=\"button\" class=\"btn btn-outline-primary float-end mb-2 me-3\" (click)=\"createItem.emit()\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n </div>\n </div>\n}\n<div class=\"table-responsive\">\n <table [ngClass]=\"getTableClasses()\">\n <thead>\n <tr>\n <ng-container #projectedDisplayColumns></ng-container>\n @if (hasActions) {\n <th>\n <span class=\"float-end pe-2\">\n Actions\n </span>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (!loading) {\n <ng-content select=\"rlb-dt-row\"/>\n }\n @if (!loading && items.length === 0) {\n <rlb-dt-row class=\"text-center\">\n <rlb-dt-cell [col-span]=\"cols\" style=\"border: 0\">\n <ng-content select=\"rlb-dt-noitems\"/>\n </rlb-dt-cell>\n </rlb-dt-row>\n }\n @if (loading) {\n <rlb-dt-row class=\"text-center\">\n <rlb-dt-cell [col-span]=\"cols\" style=\"border: 0\">\n <ng-content select=\"rlb-dt-loading\"/>\n </rlb-dt-cell>\n </rlb-dt-row>\n }\n </tbody>\n @if (pagination && paginationMode !== 'none') {\n <tfoot>\n <rlb-dt-row>\n <rlb-dt-cell [col-span]=\"hasActions ? cols+1: cols\" style=\"border: 0\">\n @if (paginationMode === 'load-more') {\n <button type=\"button\" class=\"btn btn-primary float-end btn-sm mt-2\"\n [disabled]=\"loading\" (click)=\"loadMore.emit()\">\n {{ loadMoreLabel }}\n </button>\n }\n @if (paginationMode === 'pages') {\n <nav aria-label=\"Page navigation example\">\n <ul class=\"pagination float-end pagination-sm\">\n <li class=\"page-item\">\n <a class=\"page-link d-block\" [class.disabled]=\"currentPage === 1\" href=\"#\" aria-label=\"Previous\"\n (click)=\"prev($event)\">\n <span aria-hidden=\"true\">&laquo;</span>\n </a>\n </li>\n @for (page of visiblePages; track page) {\n <li class=\"page-item\"\n [class.active]=\"currentPage === page\"\n [class.disabled]=\"page === '...'\">\n <a class=\"page-link d-block\"\n href=\"#\"\n (click)=\"selectPage($event, page)\">\n {{ page }}\n </a>\n </li>\n }\n <li class=\"page-item\">\n <a class=\"page-link d-block\" [class.disabled]=\"currentPage === pages\" href=\"#\" aria-label=\"Next\"\n (click)=\"next($event)\">\n <span aria-hidden=\"true\">&raquo;</span>\n </a>\n </li>\n </ul>\n <ul class=\"ps-0 float-end me-3\">\n <rlb-select size=\"small\" [(ngModel)]=\"pageSize\" (ngModelChange)=\"selectSize()\"\n [disabled]=\"items.length === 0\">\n <rlb-option [value]=\"10\">10</rlb-option>\n <rlb-option [value]=\"20\">20</rlb-option>\n <rlb-option [value]=\"50\">50</rlb-option>\n <rlb-option [value]=\"100\">100</rlb-option>\n </rlb-select>\n </ul>\n </nav>\n }\n </rlb-dt-cell>\n </rlb-dt-row>\n </tfoot>\n }\n </table>\n</div>\n" }]
6668
7140
  }], propDecorators: { title: [{
6669
7141
  type: Input,
6670
7142
  args: [{ alias: 'title' }]
@@ -8355,7 +8827,7 @@ class AutocompleteCountryDialCodeComponent extends AbstractAutocompleteComponent
8355
8827
  }
8356
8828
  }
8357
8829
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AutocompleteCountryDialCodeComponent, deps: [{ token: UniqueIdService }, { token: i0.Renderer2 }, { token: i2$2.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); }
8358
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "20.3.16", type: AutocompleteCountryDialCodeComponent, isStandalone: false, selector: "rlb-autocomplete-country-dial-code", inputs: { enableFlagIcons: ["enable-flag-icons", "enableFlagIcons", booleanAttribute] }, usesInheritance: true, ngImport: i0, template: `
8830
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: AutocompleteCountryDialCodeComponent, isStandalone: false, selector: "rlb-autocomplete-country-dial-code", inputs: { enableFlagIcons: ["enable-flag-icons", "enableFlagIcons", booleanAttribute] }, usesInheritance: true, ngImport: i0, template: `
8359
8831
  <ng-content select="[before]"></ng-content>
8360
8832
  <div class="input-group has-validation">
8361
8833
  <input
@@ -8363,8 +8835,8 @@ class AutocompleteCountryDialCodeComponent extends AbstractAutocompleteComponent
8363
8835
  [id]="id"
8364
8836
  class="form-control"
8365
8837
  type="text"
8366
- [attr.autocomplete]="'off'"
8367
- [attr.disabled]="disabled ? true : undefined"
8838
+ [attr.autocomplete]="'off'"
8839
+ [attr.disabled]="disabled ? true : undefined"
8368
8840
  [attr.readonly]="readonly ? true : undefined"
8369
8841
  [attr.placeholder]="placeholder"
8370
8842
  [class.form-control-lg]="size === 'large'"
@@ -8375,25 +8847,28 @@ class AutocompleteCountryDialCodeComponent extends AbstractAutocompleteComponent
8375
8847
  'is-valid': control?.touched && control?.valid
8376
8848
  }"
8377
8849
  (input)="update($event.target)"
8378
- />
8379
- <rlb-input-validation *ngIf="errors && showError" [errors]="errors"/>
8380
- </div>
8381
- <rlb-progress
8382
- *ngIf="loading || acLoading"
8383
- [height]="2"
8384
- [infinite]="loading || acLoading"
8385
- color="primary"
8386
- class="w-100"
8387
- />
8388
- <ng-content select="[after]"></ng-content>
8389
- <div
8390
- #autocomplete
8391
- [id]="id+'-ac'"
8392
- class="dropdown-menu overflow-y-auto w-100 position-relative"
8393
- aria-labelledby="dropdownMenu"
8394
- [style.max-height.px]="maxHeight">
8395
- </div>
8396
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: InputValidationComponent, selector: "rlb-input-validation", inputs: ["errors"] }, { kind: "component", type: ProgressComponent, selector: "rlb-progress", inputs: ["max", "min", "value", "height", "animated", "striped", "infinite", "aria-label", "showValue", "color", "text-color"] }] }); }
8850
+ />
8851
+ @if (errors && showError) {
8852
+ <rlb-input-validation [errors]="errors"/>
8853
+ }
8854
+ </div>
8855
+ @if (loading || acLoading) {
8856
+ <rlb-progress
8857
+ [height]="2"
8858
+ [infinite]="loading || acLoading"
8859
+ color="primary"
8860
+ class="w-100"
8861
+ />
8862
+ }
8863
+ <ng-content select="[after]"></ng-content>
8864
+ <div
8865
+ #autocomplete
8866
+ [id]="id+'-ac'"
8867
+ class="dropdown-menu overflow-y-auto w-100 position-relative"
8868
+ aria-labelledby="dropdownMenu"
8869
+ [style.max-height.px]="maxHeight">
8870
+ </div>
8871
+ `, isInline: true, dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: InputValidationComponent, selector: "rlb-input-validation", inputs: ["errors"] }, { kind: "component", type: ProgressComponent, selector: "rlb-progress", inputs: ["max", "min", "value", "height", "animated", "striped", "infinite", "aria-label", "showValue", "color", "text-color"] }] }); }
8397
8872
  }
8398
8873
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AutocompleteCountryDialCodeComponent, decorators: [{
8399
8874
  type: Component,
@@ -8407,8 +8882,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
8407
8882
  [id]="id"
8408
8883
  class="form-control"
8409
8884
  type="text"
8410
- [attr.autocomplete]="'off'"
8411
- [attr.disabled]="disabled ? true : undefined"
8885
+ [attr.autocomplete]="'off'"
8886
+ [attr.disabled]="disabled ? true : undefined"
8412
8887
  [attr.readonly]="readonly ? true : undefined"
8413
8888
  [attr.placeholder]="placeholder"
8414
8889
  [class.form-control-lg]="size === 'large'"
@@ -8419,25 +8894,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
8419
8894
  'is-valid': control?.touched && control?.valid
8420
8895
  }"
8421
8896
  (input)="update($event.target)"
8422
- />
8423
- <rlb-input-validation *ngIf="errors && showError" [errors]="errors"/>
8424
- </div>
8425
- <rlb-progress
8426
- *ngIf="loading || acLoading"
8427
- [height]="2"
8428
- [infinite]="loading || acLoading"
8429
- color="primary"
8430
- class="w-100"
8431
- />
8432
- <ng-content select="[after]"></ng-content>
8433
- <div
8434
- #autocomplete
8435
- [id]="id+'-ac'"
8436
- class="dropdown-menu overflow-y-auto w-100 position-relative"
8437
- aria-labelledby="dropdownMenu"
8438
- [style.max-height.px]="maxHeight">
8439
- </div>
8440
- `,
8897
+ />
8898
+ @if (errors && showError) {
8899
+ <rlb-input-validation [errors]="errors"/>
8900
+ }
8901
+ </div>
8902
+ @if (loading || acLoading) {
8903
+ <rlb-progress
8904
+ [height]="2"
8905
+ [infinite]="loading || acLoading"
8906
+ color="primary"
8907
+ class="w-100"
8908
+ />
8909
+ }
8910
+ <ng-content select="[after]"></ng-content>
8911
+ <div
8912
+ #autocomplete
8913
+ [id]="id+'-ac'"
8914
+ class="dropdown-menu overflow-y-auto w-100 position-relative"
8915
+ aria-labelledby="dropdownMenu"
8916
+ [style.max-height.px]="maxHeight">
8917
+ </div>
8918
+ `,
8441
8919
  standalone: false
8442
8920
  }]
8443
8921
  }], ctorParameters: () => [{ type: UniqueIdService }, { type: i0.Renderer2 }, { type: i2$2.NgControl, decorators: [{
@@ -8695,7 +9173,7 @@ class AutocompleteCountryComponent extends AbstractAutocompleteComponent {
8695
9173
  }
8696
9174
  }
8697
9175
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AutocompleteCountryComponent, deps: [{ token: UniqueIdService }, { token: i0.Renderer2 }, { token: i2$2.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); }
8698
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "20.3.16", type: AutocompleteCountryComponent, isStandalone: false, selector: "rlb-autocomplete-country", inputs: { enableFlagIcons: ["enable-flag-icons", "enableFlagIcons", booleanAttribute], enableValidation: ["enable-validation", "enableValidation", booleanAttribute] }, usesInheritance: true, ngImport: i0, template: `
9176
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: AutocompleteCountryComponent, isStandalone: false, selector: "rlb-autocomplete-country", inputs: { enableFlagIcons: ["enable-flag-icons", "enableFlagIcons", booleanAttribute], enableValidation: ["enable-validation", "enableValidation", booleanAttribute] }, usesInheritance: true, ngImport: i0, template: `
8699
9177
  <ng-content select="[before]"></ng-content>
8700
9178
  <div class="input-group has-validation">
8701
9179
  <input
@@ -8703,8 +9181,8 @@ class AutocompleteCountryComponent extends AbstractAutocompleteComponent {
8703
9181
  [id]="id"
8704
9182
  class="form-control"
8705
9183
  type="text"
8706
- [attr.autocomplete]="'off'"
8707
- [attr.disabled]="disabled ? true : undefined"
9184
+ [attr.autocomplete]="'off'"
9185
+ [attr.disabled]="disabled ? true : undefined"
8708
9186
  [attr.readonly]="readonly ? true : undefined"
8709
9187
  [attr.placeholder]="placeholder"
8710
9188
  [class.form-control-lg]="size === 'large'"
@@ -8715,25 +9193,28 @@ class AutocompleteCountryComponent extends AbstractAutocompleteComponent {
8715
9193
  'is-valid': control?.touched && control?.valid && enableValidation
8716
9194
  }"
8717
9195
  (input)="update($event.target)"
8718
- />
8719
- <rlb-input-validation *ngIf="errors && showError" [errors]="errors"/>
8720
- </div>
8721
- <rlb-progress
8722
- *ngIf="loading || acLoading"
8723
- [height]="2"
8724
- [infinite]="loading || acLoading"
8725
- color="primary"
8726
- class="w-100"
8727
- />
8728
- <ng-content select="[after]"></ng-content>
8729
- <div
8730
- #autocomplete
8731
- [id]="id+'-ac'"
8732
- class="dropdown-menu overflow-y-auto w-100 position-relative"
8733
- aria-labelledby="dropdownMenu"
8734
- [style.max-height.px]="maxHeight">
8735
- </div>
8736
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: InputValidationComponent, selector: "rlb-input-validation", inputs: ["errors"] }, { kind: "component", type: ProgressComponent, selector: "rlb-progress", inputs: ["max", "min", "value", "height", "animated", "striped", "infinite", "aria-label", "showValue", "color", "text-color"] }] }); }
9196
+ />
9197
+ @if (errors && showError) {
9198
+ <rlb-input-validation [errors]="errors"/>
9199
+ }
9200
+ </div>
9201
+ @if (loading || acLoading) {
9202
+ <rlb-progress
9203
+ [height]="2"
9204
+ [infinite]="loading || acLoading"
9205
+ color="primary"
9206
+ class="w-100"
9207
+ />
9208
+ }
9209
+ <ng-content select="[after]"></ng-content>
9210
+ <div
9211
+ #autocomplete
9212
+ [id]="id+'-ac'"
9213
+ class="dropdown-menu overflow-y-auto w-100 position-relative"
9214
+ aria-labelledby="dropdownMenu"
9215
+ [style.max-height.px]="maxHeight">
9216
+ </div>
9217
+ `, isInline: true, dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: InputValidationComponent, selector: "rlb-input-validation", inputs: ["errors"] }, { kind: "component", type: ProgressComponent, selector: "rlb-progress", inputs: ["max", "min", "value", "height", "animated", "striped", "infinite", "aria-label", "showValue", "color", "text-color"] }] }); }
8737
9218
  }
8738
9219
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AutocompleteCountryComponent, decorators: [{
8739
9220
  type: Component,
@@ -8747,8 +9228,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
8747
9228
  [id]="id"
8748
9229
  class="form-control"
8749
9230
  type="text"
8750
- [attr.autocomplete]="'off'"
8751
- [attr.disabled]="disabled ? true : undefined"
9231
+ [attr.autocomplete]="'off'"
9232
+ [attr.disabled]="disabled ? true : undefined"
8752
9233
  [attr.readonly]="readonly ? true : undefined"
8753
9234
  [attr.placeholder]="placeholder"
8754
9235
  [class.form-control-lg]="size === 'large'"
@@ -8759,25 +9240,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
8759
9240
  'is-valid': control?.touched && control?.valid && enableValidation
8760
9241
  }"
8761
9242
  (input)="update($event.target)"
8762
- />
8763
- <rlb-input-validation *ngIf="errors && showError" [errors]="errors"/>
8764
- </div>
8765
- <rlb-progress
8766
- *ngIf="loading || acLoading"
8767
- [height]="2"
8768
- [infinite]="loading || acLoading"
8769
- color="primary"
8770
- class="w-100"
8771
- />
8772
- <ng-content select="[after]"></ng-content>
8773
- <div
8774
- #autocomplete
8775
- [id]="id+'-ac'"
8776
- class="dropdown-menu overflow-y-auto w-100 position-relative"
8777
- aria-labelledby="dropdownMenu"
8778
- [style.max-height.px]="maxHeight">
8779
- </div>
8780
- `,
9243
+ />
9244
+ @if (errors && showError) {
9245
+ <rlb-input-validation [errors]="errors"/>
9246
+ }
9247
+ </div>
9248
+ @if (loading || acLoading) {
9249
+ <rlb-progress
9250
+ [height]="2"
9251
+ [infinite]="loading || acLoading"
9252
+ color="primary"
9253
+ class="w-100"
9254
+ />
9255
+ }
9256
+ <ng-content select="[after]"></ng-content>
9257
+ <div
9258
+ #autocomplete
9259
+ [id]="id+'-ac'"
9260
+ class="dropdown-menu overflow-y-auto w-100 position-relative"
9261
+ aria-labelledby="dropdownMenu"
9262
+ [style.max-height.px]="maxHeight">
9263
+ </div>
9264
+ `,
8781
9265
  standalone: false
8782
9266
  }]
8783
9267
  }], ctorParameters: () => [{ type: UniqueIdService }, { type: i0.Renderer2 }, { type: i2$2.NgControl, decorators: [{
@@ -8823,7 +9307,7 @@ class AutocompleteTimezonesComponent extends AbstractAutocompleteComponent {
8823
9307
  return '';
8824
9308
  }
8825
9309
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AutocompleteTimezonesComponent, deps: [{ token: UniqueIdService }, { token: i0.Renderer2 }, { token: i2$2.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); }
8826
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "20.3.16", type: AutocompleteTimezonesComponent, isStandalone: false, selector: "rlb-autocomplete-timezones", inputs: { enableFlagIcons: ["enable-flag-icons", "enableFlagIcons", booleanAttribute] }, usesInheritance: true, ngImport: i0, template: `
9310
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: AutocompleteTimezonesComponent, isStandalone: false, selector: "rlb-autocomplete-timezones", inputs: { enableFlagIcons: ["enable-flag-icons", "enableFlagIcons", booleanAttribute] }, usesInheritance: true, ngImport: i0, template: `
8827
9311
  <ng-content select="[before]"></ng-content>
8828
9312
  <div class="input-group has-validation">
8829
9313
  <input
@@ -8834,8 +9318,8 @@ class AutocompleteTimezonesComponent extends AbstractAutocompleteComponent {
8834
9318
  [attr.disabled]="disabled ? true : undefined"
8835
9319
  [attr.readonly]="readonly ? true : undefined"
8836
9320
  [attr.placeholder]="placeholder"
8837
- [attr.autocomplete]="'off'"
8838
- [class.form-control-lg]="size === 'large'"
9321
+ [attr.autocomplete]="'off'"
9322
+ [class.form-control-lg]="size === 'large'"
8839
9323
  [class.form-control-sm]="size === 'small'"
8840
9324
  (blur)="touch()"
8841
9325
  [ngClass]="{
@@ -8843,25 +9327,28 @@ class AutocompleteTimezonesComponent extends AbstractAutocompleteComponent {
8843
9327
  'is-valid': control?.touched && control?.valid
8844
9328
  }"
8845
9329
  (input)="update($event.target)"
8846
- />
8847
- <rlb-input-validation *ngIf="errors && showError" [errors]="errors"/>
8848
- </div>
8849
- <rlb-progress
8850
- *ngIf="loading || acLoading"
8851
- [height]="2"
8852
- [infinite]="loading || acLoading"
8853
- color="primary"
8854
- class="w-100"
8855
- />
8856
- <ng-content select="[after]"></ng-content>
8857
- <div
8858
- #autocomplete
8859
- [id]="id+'-ac'"
8860
- class="dropdown-menu overflow-y-auto w-100 position-relative"
8861
- aria-labelledby="dropdownMenu"
8862
- [style.max-height.px]="maxHeight">
8863
- </div>
8864
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: InputValidationComponent, selector: "rlb-input-validation", inputs: ["errors"] }, { kind: "component", type: ProgressComponent, selector: "rlb-progress", inputs: ["max", "min", "value", "height", "animated", "striped", "infinite", "aria-label", "showValue", "color", "text-color"] }] }); }
9330
+ />
9331
+ @if (errors && showError) {
9332
+ <rlb-input-validation [errors]="errors"/>
9333
+ }
9334
+ </div>
9335
+ @if (loading || acLoading) {
9336
+ <rlb-progress
9337
+ [height]="2"
9338
+ [infinite]="loading || acLoading"
9339
+ color="primary"
9340
+ class="w-100"
9341
+ />
9342
+ }
9343
+ <ng-content select="[after]"></ng-content>
9344
+ <div
9345
+ #autocomplete
9346
+ [id]="id+'-ac'"
9347
+ class="dropdown-menu overflow-y-auto w-100 position-relative"
9348
+ aria-labelledby="dropdownMenu"
9349
+ [style.max-height.px]="maxHeight">
9350
+ </div>
9351
+ `, isInline: true, dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: InputValidationComponent, selector: "rlb-input-validation", inputs: ["errors"] }, { kind: "component", type: ProgressComponent, selector: "rlb-progress", inputs: ["max", "min", "value", "height", "animated", "striped", "infinite", "aria-label", "showValue", "color", "text-color"] }] }); }
8865
9352
  }
8866
9353
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AutocompleteTimezonesComponent, decorators: [{
8867
9354
  type: Component,
@@ -8878,8 +9365,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
8878
9365
  [attr.disabled]="disabled ? true : undefined"
8879
9366
  [attr.readonly]="readonly ? true : undefined"
8880
9367
  [attr.placeholder]="placeholder"
8881
- [attr.autocomplete]="'off'"
8882
- [class.form-control-lg]="size === 'large'"
9368
+ [attr.autocomplete]="'off'"
9369
+ [class.form-control-lg]="size === 'large'"
8883
9370
  [class.form-control-sm]="size === 'small'"
8884
9371
  (blur)="touch()"
8885
9372
  [ngClass]="{
@@ -8887,25 +9374,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
8887
9374
  'is-valid': control?.touched && control?.valid
8888
9375
  }"
8889
9376
  (input)="update($event.target)"
8890
- />
8891
- <rlb-input-validation *ngIf="errors && showError" [errors]="errors"/>
8892
- </div>
8893
- <rlb-progress
8894
- *ngIf="loading || acLoading"
8895
- [height]="2"
8896
- [infinite]="loading || acLoading"
8897
- color="primary"
8898
- class="w-100"
8899
- />
8900
- <ng-content select="[after]"></ng-content>
8901
- <div
8902
- #autocomplete
8903
- [id]="id+'-ac'"
8904
- class="dropdown-menu overflow-y-auto w-100 position-relative"
8905
- aria-labelledby="dropdownMenu"
8906
- [style.max-height.px]="maxHeight">
8907
- </div>
8908
- `,
9377
+ />
9378
+ @if (errors && showError) {
9379
+ <rlb-input-validation [errors]="errors"/>
9380
+ }
9381
+ </div>
9382
+ @if (loading || acLoading) {
9383
+ <rlb-progress
9384
+ [height]="2"
9385
+ [infinite]="loading || acLoading"
9386
+ color="primary"
9387
+ class="w-100"
9388
+ />
9389
+ }
9390
+ <ng-content select="[after]"></ng-content>
9391
+ <div
9392
+ #autocomplete
9393
+ [id]="id+'-ac'"
9394
+ class="dropdown-menu overflow-y-auto w-100 position-relative"
9395
+ aria-labelledby="dropdownMenu"
9396
+ [style.max-height.px]="maxHeight">
9397
+ </div>
9398
+ `,
8909
9399
  standalone: false
8910
9400
  }]
8911
9401
  }], ctorParameters: () => [{ type: UniqueIdService }, { type: i0.Renderer2 }, { type: i2$2.NgControl, decorators: [{
@@ -9080,7 +9570,7 @@ class AutocompleteComponent extends AbstractComponent {
9080
9570
  }
9081
9571
  }
9082
9572
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AutocompleteComponent, deps: [{ token: UniqueIdService }, { token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i2$2.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); }
9083
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "20.3.16", type: AutocompleteComponent, isStandalone: false, selector: "rlb-autocomplete", inputs: { disabled: ["disabled", "disabled", booleanAttribute], readonly: ["readonly", "readonly", booleanAttribute], loading: ["loading", "loading", booleanAttribute], maxHeight: ["max-height", "maxHeight", numberAttribute], placeholder: "placeholder", autocomplete: "autocomplete", type: "type", size: "size", charsToSearch: ["chars-to-search", "charsToSearch", numberAttribute], menuMaxWidth: ["menu-max-width", "menuMaxWidth", numberAttribute], userDefinedId: ["id", "userDefinedId", (v) => v || ''], enableValidation: ["enable-validation", "enableValidation", booleanAttribute], inputAutocomplete: "inputAutocomplete" }, outputs: { selected: "selected" }, host: { listeners: { "document:pointerdown": "onDocumentPointerDown($event)", "document:keydown.escape": "onEscape($event)" }, styleAttribute: "position: relative;" }, viewQueries: [{ propertyName: "el", first: true, predicate: ["field"], descendants: true }, { propertyName: "dropdown", first: true, predicate: ["autocomplete"], descendants: true }], usesInheritance: true, ngImport: i0, template: `
9573
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: AutocompleteComponent, isStandalone: false, selector: "rlb-autocomplete", inputs: { disabled: ["disabled", "disabled", booleanAttribute], readonly: ["readonly", "readonly", booleanAttribute], loading: ["loading", "loading", booleanAttribute], maxHeight: ["max-height", "maxHeight", numberAttribute], placeholder: "placeholder", autocomplete: "autocomplete", type: "type", size: "size", charsToSearch: ["chars-to-search", "charsToSearch", numberAttribute], menuMaxWidth: ["menu-max-width", "menuMaxWidth", numberAttribute], userDefinedId: ["id", "userDefinedId", (v) => v || ''], enableValidation: ["enable-validation", "enableValidation", booleanAttribute], inputAutocomplete: "inputAutocomplete" }, outputs: { selected: "selected" }, host: { listeners: { "document:pointerdown": "onDocumentPointerDown($event)", "document:keydown.escape": "onEscape($event)" }, styleAttribute: "position: relative;" }, viewQueries: [{ propertyName: "el", first: true, predicate: ["field"], descendants: true }, { propertyName: "dropdown", first: true, predicate: ["autocomplete"], descendants: true }], usesInheritance: true, ngImport: i0, template: `
9084
9574
  <ng-content select="[before]"></ng-content>
9085
9575
  <div class="input-group has-validation">
9086
9576
  <input
@@ -9102,26 +9592,29 @@ class AutocompleteComponent extends AbstractComponent {
9102
9592
  }"
9103
9593
  (input)="update($event.target)"
9104
9594
  (keyup.enter)="onEnter($event.target)"
9105
- />
9106
- <rlb-input-validation *ngIf="errors && showError && enableValidation" [errors]="errors"/>
9107
- </div>
9108
- <rlb-progress
9109
- *ngIf="loading || acLoading"
9110
- [height]="2"
9111
- [infinite]="loading || acLoading"
9112
- color="primary"
9113
- class="w-100"
9114
- />
9115
- <ng-content select="[after]"></ng-content>
9116
- <div
9117
- #autocomplete
9118
- [id]="id+'-ac'"
9119
- class="dropdown-menu overflow-y-auto w-100 position-absolute"
9120
- aria-labelledby="dropdownMenu"
9121
- [style.max-height.px]="maxHeight"
9122
- [style.width]="'fit-content !important'"
9595
+ />
9596
+ @if (errors && showError && enableValidation) {
9597
+ <rlb-input-validation [errors]="errors"/>
9598
+ }
9599
+ </div>
9600
+ @if (loading || acLoading) {
9601
+ <rlb-progress
9602
+ [height]="2"
9603
+ [infinite]="loading || acLoading"
9604
+ color="primary"
9605
+ class="w-100"
9606
+ />
9607
+ }
9608
+ <ng-content select="[after]"></ng-content>
9609
+ <div
9610
+ #autocomplete
9611
+ [id]="id+'-ac'"
9612
+ class="dropdown-menu overflow-y-auto w-100 position-absolute"
9613
+ aria-labelledby="dropdownMenu"
9614
+ [style.max-height.px]="maxHeight"
9615
+ [style.width]="'fit-content !important'"
9123
9616
  [style.max-width.px]="menuMaxWidth"></div>
9124
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: InputValidationComponent, selector: "rlb-input-validation", inputs: ["errors"] }, { kind: "component", type: ProgressComponent, selector: "rlb-progress", inputs: ["max", "min", "value", "height", "animated", "striped", "infinite", "aria-label", "showValue", "color", "text-color"] }] }); }
9617
+ `, isInline: true, dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: InputValidationComponent, selector: "rlb-input-validation", inputs: ["errors"] }, { kind: "component", type: ProgressComponent, selector: "rlb-progress", inputs: ["max", "min", "value", "height", "animated", "striped", "infinite", "aria-label", "showValue", "color", "text-color"] }] }); }
9125
9618
  }
9126
9619
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AutocompleteComponent, decorators: [{
9127
9620
  type: Component,
@@ -9149,26 +9642,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
9149
9642
  }"
9150
9643
  (input)="update($event.target)"
9151
9644
  (keyup.enter)="onEnter($event.target)"
9152
- />
9153
- <rlb-input-validation *ngIf="errors && showError && enableValidation" [errors]="errors"/>
9154
- </div>
9155
- <rlb-progress
9156
- *ngIf="loading || acLoading"
9157
- [height]="2"
9158
- [infinite]="loading || acLoading"
9159
- color="primary"
9160
- class="w-100"
9161
- />
9162
- <ng-content select="[after]"></ng-content>
9163
- <div
9164
- #autocomplete
9165
- [id]="id+'-ac'"
9166
- class="dropdown-menu overflow-y-auto w-100 position-absolute"
9167
- aria-labelledby="dropdownMenu"
9168
- [style.max-height.px]="maxHeight"
9169
- [style.width]="'fit-content !important'"
9645
+ />
9646
+ @if (errors && showError && enableValidation) {
9647
+ <rlb-input-validation [errors]="errors"/>
9648
+ }
9649
+ </div>
9650
+ @if (loading || acLoading) {
9651
+ <rlb-progress
9652
+ [height]="2"
9653
+ [infinite]="loading || acLoading"
9654
+ color="primary"
9655
+ class="w-100"
9656
+ />
9657
+ }
9658
+ <ng-content select="[after]"></ng-content>
9659
+ <div
9660
+ #autocomplete
9661
+ [id]="id+'-ac'"
9662
+ class="dropdown-menu overflow-y-auto w-100 position-absolute"
9663
+ aria-labelledby="dropdownMenu"
9664
+ [style.max-height.px]="maxHeight"
9665
+ [style.width]="'fit-content !important'"
9170
9666
  [style.max-width.px]="menuMaxWidth"></div>
9171
- `,
9667
+ `,
9172
9668
  standalone: false,
9173
9669
  host: {
9174
9670
  style: 'position: relative;',
@@ -9297,7 +9793,7 @@ class CheckboxComponent extends AbstractComponent {
9297
9793
  {{ errors | json }}
9298
9794
  </div>
9299
9795
  <ng-content select="[after]"></ng-content>
9300
- </div>`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i1.JsonPipe, name: "json" }] }); }
9796
+ </div>`, isInline: true, dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i3.JsonPipe, name: "json" }] }); }
9301
9797
  }
9302
9798
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CheckboxComponent, decorators: [{
9303
9799
  type: Component,
@@ -9385,7 +9881,7 @@ class ColorComponent extends AbstractComponent {
9385
9881
  {{ errors | json }}
9386
9882
  </div>
9387
9883
  </div>
9388
- <ng-content select="[after]"></ng-content>`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i1.JsonPipe, name: "json" }] }); }
9884
+ <ng-content select="[after]"></ng-content>`, isInline: true, dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i3.JsonPipe, name: "json" }] }); }
9389
9885
  }
9390
9886
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ColorComponent, decorators: [{
9391
9887
  type: Component,
@@ -9482,7 +9978,7 @@ class DatalistComponent extends AbstractComponent {
9482
9978
  {{ errors | json }}
9483
9979
  </div>
9484
9980
  </div>
9485
- <ng-content select="[after]"></ng-content>`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i1.JsonPipe, name: "json" }] }); }
9981
+ <ng-content select="[after]"></ng-content>`, isInline: true, dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i3.JsonPipe, name: "json" }] }); }
9486
9982
  }
9487
9983
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DatalistComponent, decorators: [{
9488
9984
  type: Component,
@@ -9650,7 +10146,7 @@ class FileDndComponent {
9650
10146
  return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + " " + sizes[i];
9651
10147
  }
9652
10148
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: FileDndComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9653
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "20.3.16", type: FileDndComponent, isStandalone: false, selector: "rlb-file-dnd", inputs: { multiple: ["multiple", "multiple", booleanAttribute], data: "data", userDefinedId: ["id", "userDefinedId", (v) => v || ''] }, outputs: { filesChange: "files" }, viewQueries: [{ propertyName: "fileDropEl", first: true, predicate: ["fileDropRef"], descendants: true }], ngImport: i0, template: `
10149
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: FileDndComponent, isStandalone: false, selector: "rlb-file-dnd", inputs: { multiple: ["multiple", "multiple", booleanAttribute], data: "data", userDefinedId: ["id", "userDefinedId", (v) => v || ''] }, outputs: { filesChange: "files" }, viewQueries: [{ propertyName: "fileDropEl", first: true, predicate: ["fileDropRef"], descendants: true }], ngImport: i0, template: `
9654
10150
  <div class="rlb-file-dnd" rlb-dnd [multiple]="multiple" (fileDropped)="onFileDropped($event)">
9655
10151
  <input type="file" #fileDropRef id="fileDropRef" [attr.multiple]="multiple?'':undefined" (change)="fileBrowseHandler($event)" />
9656
10152
  <i class="bi bi-upload"></i>
@@ -9659,18 +10155,20 @@ class FileDndComponent {
9659
10155
  <label class="btn btn-primary" for="fileDropRef">{{ data.content?.button }}</label>
9660
10156
  </div>
9661
10157
  <div class="rlb-file-dnd-list">
9662
- <div class="single-file" *ngFor="let file of files; let i = index">
9663
- <i class="bi bi-file-earmark-image" style="font-size: 36px;"></i>
9664
- <div class="info">
9665
- <span class="d-block name"> {{ file.name }} </span>
9666
- <span class="d-block size">{{ formatBytes(file.size) }}</span>
9667
- <rlb-progress [height]="3" [value]="10" animated ></rlb-progress>
10158
+ @for (file of files; track file; let i = $index) {
10159
+ <div class="single-file">
10160
+ <i class="bi bi-file-earmark-image" style="font-size: 36px;"></i>
10161
+ <div class="info">
10162
+ <span class="d-block name"> {{ file.name }} </span>
10163
+ <span class="d-block size">{{ formatBytes(file.size) }}</span>
10164
+ <rlb-progress [height]="3" [value]="10" animated ></rlb-progress>
10165
+ </div>
10166
+ <button rlb-button outline class="p-0 mb-auto border-0">
10167
+ <i class="bi bi-trash" (click)="deleteFile(file)"></i>
10168
+ </button>
9668
10169
  </div>
9669
- <button rlb-button outline class="p-0 mb-auto border-0">
9670
- <i class="bi bi-trash" (click)="deleteFile(file)"></i>
9671
- </button>
9672
- </div>
9673
- </div>`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: DndDirective, selector: "[rlb-dnd]", inputs: ["multiple"], outputs: ["fileDropped"] }, { kind: "component", type: ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "component", type: ProgressComponent, selector: "rlb-progress", inputs: ["max", "min", "value", "height", "animated", "striped", "infinite", "aria-label", "showValue", "color", "text-color"] }] }); }
10170
+ }
10171
+ </div>`, isInline: true, dependencies: [{ kind: "directive", type: DndDirective, selector: "[rlb-dnd]", inputs: ["multiple"], outputs: ["fileDropped"] }, { kind: "component", type: ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "component", type: ProgressComponent, selector: "rlb-progress", inputs: ["max", "min", "value", "height", "animated", "striped", "infinite", "aria-label", "showValue", "color", "text-color"] }] }); }
9674
10172
  }
9675
10173
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: FileDndComponent, decorators: [{
9676
10174
  type: Component,
@@ -9685,17 +10183,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
9685
10183
  <label class="btn btn-primary" for="fileDropRef">{{ data.content?.button }}</label>
9686
10184
  </div>
9687
10185
  <div class="rlb-file-dnd-list">
9688
- <div class="single-file" *ngFor="let file of files; let i = index">
9689
- <i class="bi bi-file-earmark-image" style="font-size: 36px;"></i>
9690
- <div class="info">
9691
- <span class="d-block name"> {{ file.name }} </span>
9692
- <span class="d-block size">{{ formatBytes(file.size) }}</span>
9693
- <rlb-progress [height]="3" [value]="10" animated ></rlb-progress>
10186
+ @for (file of files; track file; let i = $index) {
10187
+ <div class="single-file">
10188
+ <i class="bi bi-file-earmark-image" style="font-size: 36px;"></i>
10189
+ <div class="info">
10190
+ <span class="d-block name"> {{ file.name }} </span>
10191
+ <span class="d-block size">{{ formatBytes(file.size) }}</span>
10192
+ <rlb-progress [height]="3" [value]="10" animated ></rlb-progress>
10193
+ </div>
10194
+ <button rlb-button outline class="p-0 mb-auto border-0">
10195
+ <i class="bi bi-trash" (click)="deleteFile(file)"></i>
10196
+ </button>
9694
10197
  </div>
9695
- <button rlb-button outline class="p-0 mb-auto border-0">
9696
- <i class="bi bi-trash" (click)="deleteFile(file)"></i>
9697
- </button>
9698
- </div>
10198
+ }
9699
10199
  </div>`,
9700
10200
  standalone: false
9701
10201
  }]
@@ -9762,7 +10262,7 @@ class FileComponent extends AbstractComponent {
9762
10262
  {{ errors | json }}
9763
10263
  </div>
9764
10264
  </div>
9765
- <ng-content select="[after]"></ng-content>`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i1.JsonPipe, name: "json" }] }); }
10265
+ <ng-content select="[after]"></ng-content>`, isInline: true, dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i3.JsonPipe, name: "json" }] }); }
9766
10266
  }
9767
10267
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: FileComponent, decorators: [{
9768
10268
  type: Component,
@@ -9989,34 +10489,36 @@ class InputComponent extends AbstractComponent {
9989
10489
  return result;
9990
10490
  }
9991
10491
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: InputComponent, deps: [{ token: i0.ViewContainerRef }, { token: UniqueIdService }, { token: i2$2.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); }
9992
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "20.3.16", type: InputComponent, isStandalone: false, selector: "rlb-input", inputs: { disabled: ["disabled", "disabled", booleanAttribute], readonly: ["readonly", "readonly", booleanAttribute], beforeText: ["before-text", "beforeText", booleanAttribute], placeholder: "placeholder", type: "type", size: "size", name: "name", max: ["max", "max", numberAttribute], min: ["min", "min", numberAttribute], step: ["step", "step", numberAttribute], dateType: ["date-type", "dateType"], timezone: "timezone", userDefinedId: ["id", "userDefinedId", (v) => v || ''], extValidation: ["extValidation", "extValidation", booleanAttribute], enableValidation: ["enable-validation", "enableValidation", booleanAttribute] }, viewQueries: [{ propertyName: "el", first: true, predicate: ["field"], descendants: true }, { propertyName: "template", first: true, predicate: ["template"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
10492
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: InputComponent, isStandalone: false, selector: "rlb-input", inputs: { disabled: ["disabled", "disabled", booleanAttribute], readonly: ["readonly", "readonly", booleanAttribute], beforeText: ["before-text", "beforeText", booleanAttribute], placeholder: "placeholder", type: "type", size: "size", name: "name", max: ["max", "max", numberAttribute], min: ["min", "min", numberAttribute], step: ["step", "step", numberAttribute], dateType: ["date-type", "dateType"], timezone: "timezone", userDefinedId: ["id", "userDefinedId", (v) => v || ''], extValidation: ["extValidation", "extValidation", booleanAttribute], enableValidation: ["enable-validation", "enableValidation", booleanAttribute] }, viewQueries: [{ propertyName: "el", first: true, predicate: ["field"], descendants: true }, { propertyName: "template", first: true, predicate: ["template"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
9993
10493
  <ng-template #template>
9994
10494
  <ng-content select="[before]"></ng-content>
9995
- <input
9996
- #field
9997
- [id]="id"
9998
- class="form-control"
9999
- [type]="_type"
10000
- [name]="name"
10001
- [attr.max]="type === 'number' && max !== null && max !== undefined ? max : undefined"
10002
- [attr.min]="type === 'number' && min !== null && min !== undefined ? min : undefined"
10003
- [attr.step]="type === 'number' && step !== null && step !== undefined ? step : undefined"
10004
- [attr.disabled]="disabled ? true : undefined"
10005
- [attr.readonly]="readonly ? true : undefined"
10006
- [attr.placeholder]="placeholder"
10007
- [class.form-control-lg]="size === 'large'"
10008
- [class.form-control-sm]="size === 'small'"
10009
- [value]="value || ''"
10010
- (blur)="touch()"
10495
+ <input
10496
+ #field
10497
+ [id]="id"
10498
+ class="form-control"
10499
+ [type]="_type"
10500
+ [name]="name"
10501
+ [attr.max]="type === 'number' && max !== null && max !== undefined ? max : undefined"
10502
+ [attr.min]="type === 'number' && min !== null && min !== undefined ? min : undefined"
10503
+ [attr.step]="type === 'number' && step !== null && step !== undefined ? step : undefined"
10504
+ [attr.disabled]="disabled ? true : undefined"
10505
+ [attr.readonly]="readonly ? true : undefined"
10506
+ [attr.placeholder]="placeholder"
10507
+ [class.form-control-lg]="size === 'large'"
10508
+ [class.form-control-sm]="size === 'small'"
10509
+ [value]="value || ''"
10510
+ (blur)="touch()"
10011
10511
  [ngClass]="{
10012
10512
  'is-invalid': control?.touched && control?.invalid && enableValidation,
10013
10513
  'is-valid': control?.touched && control?.valid && enableValidation
10014
10514
  }"
10015
- (input)="update($event.target)"
10515
+ (input)="update($event.target)"
10016
10516
  />
10017
- <rlb-input-validation *ngIf="!extValidation && showError" [errors]="errors"/>
10018
- <ng-content select="[after]"></ng-content>
10019
- </ng-template>`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: InputValidationComponent, selector: "rlb-input-validation", inputs: ["errors"] }] }); }
10517
+ @if (!extValidation && showError) {
10518
+ <rlb-input-validation [errors]="errors"/>
10519
+ }
10520
+ <ng-content select="[after]"></ng-content>
10521
+ </ng-template>`, isInline: true, dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: InputValidationComponent, selector: "rlb-input-validation", inputs: ["errors"] }] }); }
10020
10522
  }
10021
10523
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: InputComponent, decorators: [{
10022
10524
  type: Component,
@@ -10025,31 +10527,33 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
10025
10527
  template: `
10026
10528
  <ng-template #template>
10027
10529
  <ng-content select="[before]"></ng-content>
10028
- <input
10029
- #field
10030
- [id]="id"
10031
- class="form-control"
10032
- [type]="_type"
10033
- [name]="name"
10034
- [attr.max]="type === 'number' && max !== null && max !== undefined ? max : undefined"
10035
- [attr.min]="type === 'number' && min !== null && min !== undefined ? min : undefined"
10036
- [attr.step]="type === 'number' && step !== null && step !== undefined ? step : undefined"
10037
- [attr.disabled]="disabled ? true : undefined"
10038
- [attr.readonly]="readonly ? true : undefined"
10039
- [attr.placeholder]="placeholder"
10040
- [class.form-control-lg]="size === 'large'"
10041
- [class.form-control-sm]="size === 'small'"
10042
- [value]="value || ''"
10043
- (blur)="touch()"
10530
+ <input
10531
+ #field
10532
+ [id]="id"
10533
+ class="form-control"
10534
+ [type]="_type"
10535
+ [name]="name"
10536
+ [attr.max]="type === 'number' && max !== null && max !== undefined ? max : undefined"
10537
+ [attr.min]="type === 'number' && min !== null && min !== undefined ? min : undefined"
10538
+ [attr.step]="type === 'number' && step !== null && step !== undefined ? step : undefined"
10539
+ [attr.disabled]="disabled ? true : undefined"
10540
+ [attr.readonly]="readonly ? true : undefined"
10541
+ [attr.placeholder]="placeholder"
10542
+ [class.form-control-lg]="size === 'large'"
10543
+ [class.form-control-sm]="size === 'small'"
10544
+ [value]="value || ''"
10545
+ (blur)="touch()"
10044
10546
  [ngClass]="{
10045
10547
  'is-invalid': control?.touched && control?.invalid && enableValidation,
10046
10548
  'is-valid': control?.touched && control?.valid && enableValidation
10047
10549
  }"
10048
- (input)="update($event.target)"
10550
+ (input)="update($event.target)"
10049
10551
  />
10050
- <rlb-input-validation *ngIf="!extValidation && showError" [errors]="errors"/>
10051
- <ng-content select="[after]"></ng-content>
10052
- </ng-template>`,
10552
+ @if (!extValidation && showError) {
10553
+ <rlb-input-validation [errors]="errors"/>
10554
+ }
10555
+ <ng-content select="[after]"></ng-content>
10556
+ </ng-template>`,
10053
10557
  standalone: false
10054
10558
  }]
10055
10559
  }], ctorParameters: () => [{ type: i0.ViewContainerRef }, { type: UniqueIdService }, { type: i2$2.NgControl, decorators: [{
@@ -10188,10 +10692,10 @@ class RadioComponent extends AbstractComponent {
10188
10692
  }
10189
10693
  }
10190
10694
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: RadioComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
10191
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "20.3.16", type: RadioComponent, isStandalone: false, selector: "rlb-radio", inputs: { disabled: ["disabled", "disabled", booleanAttribute], readonly: ["readonly", "readonly", booleanAttribute], userDefinedId: ["id", "userDefinedId", (v) => v || ''] }, queries: [{ propertyName: "options", predicate: OptionComponent }], viewQueries: [{ propertyName: "el", first: true, predicate: ["field"], descendants: true }, { propertyName: "contents", predicate: ["content"], descendants: true, read: ViewContainerRef }], usesInheritance: true, ngImport: i0, template: `
10695
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: RadioComponent, isStandalone: false, selector: "rlb-radio", inputs: { disabled: ["disabled", "disabled", booleanAttribute], readonly: ["readonly", "readonly", booleanAttribute], userDefinedId: ["id", "userDefinedId", (v) => v || ''] }, queries: [{ propertyName: "options", predicate: OptionComponent }], viewQueries: [{ propertyName: "el", first: true, predicate: ["field"], descendants: true }, { propertyName: "contents", predicate: ["content"], descendants: true, read: ViewContainerRef }], usesInheritance: true, ngImport: i0, template: `
10192
10696
  <div class="input-group has-validation">
10193
10697
  <ng-content select="[before]"></ng-content>
10194
- <ng-container *ngFor="let option of options; index as i">
10698
+ @for (option of options; track option; let i = $index) {
10195
10699
  <div class="form-check">
10196
10700
  <input
10197
10701
  #field
@@ -10206,15 +10710,15 @@ class RadioComponent extends AbstractComponent {
10206
10710
  (blur)="touch()"
10207
10711
  [ngClass]="{ 'is-invalid': control?.touched && control?.invalid }"
10208
10712
  (change)="update($event.target)"
10209
- />
10210
- <span #content></span>
10713
+ />
10714
+ <span #content></span>
10715
+ </div>
10716
+ }
10717
+ <ng-content select="[after]"></ng-content>
10718
+ <div class="invalid-feedback">
10719
+ {{ errors | json }}
10211
10720
  </div>
10212
- </ng-container>
10213
- <ng-content select="[after]"></ng-content>
10214
- <div class="invalid-feedback">
10215
- {{ errors | json }}
10216
- </div>
10217
- </div>`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "pipe", type: i1.JsonPipe, name: "json" }] }); }
10721
+ </div>`, isInline: true, dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i3.JsonPipe, name: "json" }] }); }
10218
10722
  }
10219
10723
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: RadioComponent, decorators: [{
10220
10724
  type: Component,
@@ -10223,7 +10727,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
10223
10727
  template: `
10224
10728
  <div class="input-group has-validation">
10225
10729
  <ng-content select="[before]"></ng-content>
10226
- <ng-container *ngFor="let option of options; index as i">
10730
+ @for (option of options; track option; let i = $index) {
10227
10731
  <div class="form-check">
10228
10732
  <input
10229
10733
  #field
@@ -10238,15 +10742,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
10238
10742
  (blur)="touch()"
10239
10743
  [ngClass]="{ 'is-invalid': control?.touched && control?.invalid }"
10240
10744
  (change)="update($event.target)"
10241
- />
10242
- <span #content></span>
10745
+ />
10746
+ <span #content></span>
10747
+ </div>
10748
+ }
10749
+ <ng-content select="[after]"></ng-content>
10750
+ <div class="invalid-feedback">
10751
+ {{ errors | json }}
10243
10752
  </div>
10244
- </ng-container>
10245
- <ng-content select="[after]"></ng-content>
10246
- <div class="invalid-feedback">
10247
- {{ errors | json }}
10248
- </div>
10249
- </div>`,
10753
+ </div>`,
10250
10754
  standalone: false
10251
10755
  }]
10252
10756
  }], propDecorators: { disabled: [{
@@ -10313,7 +10817,7 @@ class RangeComponent extends AbstractComponent {
10313
10817
  {{ errors | json }}
10314
10818
  </div>
10315
10819
  </div>
10316
- <ng-content select="[after]"></ng-content>`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i1.JsonPipe, name: "json" }] }); }
10820
+ <ng-content select="[after]"></ng-content>`, isInline: true, dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i3.JsonPipe, name: "json" }] }); }
10317
10821
  }
10318
10822
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: RangeComponent, decorators: [{
10319
10823
  type: Component,
@@ -10425,7 +10929,7 @@ class SwitchComponent extends AbstractComponent {
10425
10929
 
10426
10930
  <ng-content select="[after]"></ng-content>
10427
10931
  </div>
10428
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
10932
+ `, isInline: true, dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
10429
10933
  }
10430
10934
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SwitchComponent, decorators: [{
10431
10935
  type: Component,
@@ -10518,7 +11022,7 @@ class TextAreaComponent extends AbstractComponent {
10518
11022
  {{ errors | json }}
10519
11023
  </div>
10520
11024
  </div>
10521
- <ng-content select="[after]"></ng-content>`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i1.JsonPipe, name: "json" }] }); }
11025
+ <ng-content select="[after]"></ng-content>`, isInline: true, dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i3.JsonPipe, name: "json" }] }); }
10522
11026
  }
10523
11027
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: TextAreaComponent, decorators: [{
10524
11028
  type: Component,
@@ -10652,11 +11156,11 @@ class FormFieldsComponent {
10652
11156
  this.form.onSubmit({});
10653
11157
  }
10654
11158
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: FormFieldsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10655
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "20.3.16", type: FormFieldsComponent, isStandalone: false, selector: "rlb-form-fields", inputs: { title: "title", subTitle: ["sub-title", "subTitle"], noSubmit: ["no-submit", "noSubmit", booleanAttribute], noCard: ["no-card", "noCard", booleanAttribute], fields: "fields" }, outputs: { submit: "submit" }, viewQueries: [{ propertyName: "form", first: true, predicate: ["ngForm"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"noCard; else card\">\n <ng-container [ngTemplateOutlet]=\"form\"></ng-container>\n</ng-container>\n\n<ng-template #card>\n <div class=\"card mb-3\">\n <div class=\"card-body\">\n <h5 class=\"card-title\" *ngIf=\"title\">{{ title | translate }}</h5>\n <p class=\"card-text\" *ngIf=\"subTitle\">{{ subTitle | translate }}</p>\n <ng-container [ngTemplateOutlet]=\"form\"></ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #form>\n <form\n *ngIf=\"filterForm\"\n [formGroup]=\"filterForm\"\n [class.was-validated]=\"ngForm.submitted\"\n class=\"needs-validation\"\n #ngForm=\"ngForm\"\n (ngSubmit)=\"onFilterSubmit()\"\n >\n <div class=\"row\">\n <div\n class=\"col\"\n [ngClass]=\"input.cols\"\n *ngFor=\"let input of _fields; trackBy: identify\"\n >\n <div class=\"mb-3\">\n <ng-container *ngIf=\"isText(input.type)\">\n <rlb-input\n [formControlName]=\"input.property\"\n [type]=\"input.type\"\n [placeholder]=\"input.name | translate\"\n >\n <ng-container *ngIf=\"input.label\" before>\n <span #after [innerHTML]=\"\">\n {{ input.label | translate }}\n </span>\n </ng-container>\n </rlb-input>\n </ng-container>\n <ng-container *ngIf=\"isSwitch(input.type)\">\n <rlb-switch\n [formControlName]=\"input.property\"\n />\n </ng-container>\n </div>\n </div>\n </div>\n <ng-container *ngIf=\"!noSubmit\">\n <div class=\"row\">\n <div class=\"col\">\n <button\n class=\"btn btn-primary float-end\"\n [disabled]=\"!filterForm.valid\"\n >\n {{ \"common.filter\" | translate }}\n </button>\n </div>\n </div>\n </ng-container>\n </form>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: InputComponent, selector: "rlb-input", inputs: ["disabled", "readonly", "before-text", "placeholder", "type", "size", "name", "max", "min", "step", "date-type", "timezone", "id", "extValidation", "enable-validation"] }, { kind: "component", type: SwitchComponent, selector: "rlb-switch", inputs: ["disabled", "readonly", "size", "id"] }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }] }); }
11159
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: FormFieldsComponent, isStandalone: false, selector: "rlb-form-fields", inputs: { title: "title", subTitle: ["sub-title", "subTitle"], noSubmit: ["no-submit", "noSubmit", booleanAttribute], noCard: ["no-card", "noCard", booleanAttribute], fields: "fields" }, outputs: { submit: "submit" }, viewQueries: [{ propertyName: "form", first: true, predicate: ["ngForm"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (noCard) {\n <ng-container [ngTemplateOutlet]=\"form\"></ng-container>\n} @else {\n <div class=\"card mb-3\">\n <div class=\"card-body\">\n @if (title) {\n <h5 class=\"card-title\">{{ title | translate }}</h5>\n }\n @if (subTitle) {\n <p class=\"card-text\">{{ subTitle | translate }}</p>\n }\n <ng-container [ngTemplateOutlet]=\"form\"></ng-container>\n </div>\n </div>\n}\n\n\n<ng-template #form>\n @if (filterForm) {\n <form\n [formGroup]=\"filterForm\"\n [class.was-validated]=\"ngForm.submitted\"\n class=\"needs-validation\"\n #ngForm=\"ngForm\"\n (ngSubmit)=\"onFilterSubmit()\"\n >\n <div class=\"row\">\n @for (input of _fields; track identify($index, input)) {\n <div\n class=\"col\"\n [ngClass]=\"input.cols\"\n >\n <div class=\"mb-3\">\n @if (isText(input.type)) {\n <rlb-input\n [formControlName]=\"input.property\"\n [type]=\"input.type\"\n [placeholder]=\"input.name | translate\"\n >\n @if (input.label) {\n <ng-container before>\n <span #after>\n {{ input.label | translate }}\n </span>\n </ng-container>\n }\n </rlb-input>\n }\n @if (isSwitch(input.type)) {\n <rlb-switch\n [formControlName]=\"input.property\"\n />\n }\n </div>\n </div>\n }\n </div>\n @if (!noSubmit) {\n <div class=\"row\">\n <div class=\"col\">\n <button\n class=\"btn btn-primary float-end\"\n [disabled]=\"!filterForm.valid\"\n >\n {{ \"common.filter\" | translate }}\n </button>\n </div>\n </div>\n }\n </form>\n }\n </ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: InputComponent, selector: "rlb-input", inputs: ["disabled", "readonly", "before-text", "placeholder", "type", "size", "name", "max", "min", "step", "date-type", "timezone", "id", "extValidation", "enable-validation"] }, { kind: "component", type: SwitchComponent, selector: "rlb-switch", inputs: ["disabled", "readonly", "size", "id"] }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }] }); }
10656
11160
  }
10657
11161
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: FormFieldsComponent, decorators: [{
10658
11162
  type: Component,
10659
- args: [{ selector: 'rlb-form-fields', standalone: false, template: "<ng-container *ngIf=\"noCard; else card\">\n <ng-container [ngTemplateOutlet]=\"form\"></ng-container>\n</ng-container>\n\n<ng-template #card>\n <div class=\"card mb-3\">\n <div class=\"card-body\">\n <h5 class=\"card-title\" *ngIf=\"title\">{{ title | translate }}</h5>\n <p class=\"card-text\" *ngIf=\"subTitle\">{{ subTitle | translate }}</p>\n <ng-container [ngTemplateOutlet]=\"form\"></ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #form>\n <form\n *ngIf=\"filterForm\"\n [formGroup]=\"filterForm\"\n [class.was-validated]=\"ngForm.submitted\"\n class=\"needs-validation\"\n #ngForm=\"ngForm\"\n (ngSubmit)=\"onFilterSubmit()\"\n >\n <div class=\"row\">\n <div\n class=\"col\"\n [ngClass]=\"input.cols\"\n *ngFor=\"let input of _fields; trackBy: identify\"\n >\n <div class=\"mb-3\">\n <ng-container *ngIf=\"isText(input.type)\">\n <rlb-input\n [formControlName]=\"input.property\"\n [type]=\"input.type\"\n [placeholder]=\"input.name | translate\"\n >\n <ng-container *ngIf=\"input.label\" before>\n <span #after [innerHTML]=\"\">\n {{ input.label | translate }}\n </span>\n </ng-container>\n </rlb-input>\n </ng-container>\n <ng-container *ngIf=\"isSwitch(input.type)\">\n <rlb-switch\n [formControlName]=\"input.property\"\n />\n </ng-container>\n </div>\n </div>\n </div>\n <ng-container *ngIf=\"!noSubmit\">\n <div class=\"row\">\n <div class=\"col\">\n <button\n class=\"btn btn-primary float-end\"\n [disabled]=\"!filterForm.valid\"\n >\n {{ \"common.filter\" | translate }}\n </button>\n </div>\n </div>\n </ng-container>\n </form>\n</ng-template>\n" }]
11163
+ args: [{ selector: 'rlb-form-fields', standalone: false, template: "@if (noCard) {\n <ng-container [ngTemplateOutlet]=\"form\"></ng-container>\n} @else {\n <div class=\"card mb-3\">\n <div class=\"card-body\">\n @if (title) {\n <h5 class=\"card-title\">{{ title | translate }}</h5>\n }\n @if (subTitle) {\n <p class=\"card-text\">{{ subTitle | translate }}</p>\n }\n <ng-container [ngTemplateOutlet]=\"form\"></ng-container>\n </div>\n </div>\n}\n\n\n<ng-template #form>\n @if (filterForm) {\n <form\n [formGroup]=\"filterForm\"\n [class.was-validated]=\"ngForm.submitted\"\n class=\"needs-validation\"\n #ngForm=\"ngForm\"\n (ngSubmit)=\"onFilterSubmit()\"\n >\n <div class=\"row\">\n @for (input of _fields; track identify($index, input)) {\n <div\n class=\"col\"\n [ngClass]=\"input.cols\"\n >\n <div class=\"mb-3\">\n @if (isText(input.type)) {\n <rlb-input\n [formControlName]=\"input.property\"\n [type]=\"input.type\"\n [placeholder]=\"input.name | translate\"\n >\n @if (input.label) {\n <ng-container before>\n <span #after>\n {{ input.label | translate }}\n </span>\n </ng-container>\n }\n </rlb-input>\n }\n @if (isSwitch(input.type)) {\n <rlb-switch\n [formControlName]=\"input.property\"\n />\n }\n </div>\n </div>\n }\n </div>\n @if (!noSubmit) {\n <div class=\"row\">\n <div class=\"col\">\n <button\n class=\"btn btn-primary float-end\"\n [disabled]=\"!filterForm.valid\"\n >\n {{ \"common.filter\" | translate }}\n </button>\n </div>\n </div>\n }\n </form>\n }\n </ng-template>\n" }]
10660
11164
  }], propDecorators: { title: [{
10661
11165
  type: Input,
10662
11166
  args: [{ alias: 'title' }]
@@ -10695,7 +11199,7 @@ const COMPONENT_BUILDER = [ComponentHostDirective];
10695
11199
 
10696
11200
  class RlbBootstrapModule {
10697
11201
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: RlbBootstrapModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
10698
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.16", ngImport: i0, type: RlbBootstrapModule, declarations: [DataTableActionComponent, DataTableActionsComponent, DataTableCellComponent, DataTableHeaderComponent, DataTableRowComponent, DataTableComponent, DataTableLoadingComponent, DataTableNoItemsComponent, AutocompleteComponent, CheckboxComponent, InputComponent, SwitchComponent, TextAreaComponent, ColorComponent, DatalistComponent, RangeComponent, SelectComponent, RadioComponent, OptionComponent, FileComponent, InputGroupComponent, HelpText, DndDirective, FileDndComponent, InputValidationComponent, AutocompleteCountryComponent, AutocompleteTimezonesComponent, AutocompleteCountryDialCodeComponent, AlertComponent, BreadcrumbComponent, AccordionComponent, AccordionItemComponent, AccordionHeaderComponent, AccordionBodyComponent, ButtonComponent, ButtonCloseComponent, ButtonGroupComponent, ButtonToolbarComponent, RlbFabComponent, BadgeDirective, BadgeComponent, CardBodyComponent, CardFooterComponent, CardGroupComponent, CardHeaderComponent, CardImageComponent, CardLinkComponent, CardSubtitleComponent, CardTextComponent, CardTitleComponent, CardComponent, SpinnerComponent, ProgressComponent, TooltipDirective, PopoverDirective, PlaceholderDirective, CollapseComponent, DropdownComponent, DropdownContainerComponent, DropdownMenuItemComponent, DropdownDirective, NavbarBrandDirective, NavbarComponent, NavbarFormComponent, NavbarTextComponent, NavbarItemsComponent, NavbarDropdownItemComponent, NavbarItemComponent, NavbarSeparatorComponent, OffcanvasComponent, OffcanvasHeaderComponent, OffcanvasTitleComponent, OffcanvasBodyComponent, ToggleDirective, SidebarComponent, SidebarItemComponent, NavComponent, NavItemComponent, TabsComponent, TabComponent, TabContentComponent, TabPaneComponent, PaginationItemComponent, PaginationComponent, ScrollspyDirective, CarouselComponent, CarouselCaptionComponent, CarouselSlideComponent, ListComponent, ListItemComponent, ListItemImageComponent, AvatarComponent, ChatContainerComponent, ChatItemComponent, RlbPlaceholderComponent, RlbPlaceholderLineComponent, RlbPlaceholderTextComponent, ModalContainerComponent, ToastContainerComponent, CalendarComponent, CalendarHeaderComponent, CalendarGrid, CalendarWeekGridComponent, CalendarMonthGridComponent, CalendarEventComponent, ComponentHostDirective, DateTzPipe, MonthFormatterPipe, DayOfWeekPipe, FormFieldsComponent], imports: [CommonModule,
11202
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.16", ngImport: i0, type: RlbBootstrapModule, declarations: [DataTableActionComponent, DataTableActionsComponent, DataTableCellComponent, DataTableHeaderComponent, DataTableRowComponent, DataTableComponent, DataTableLoadingComponent, DataTableNoItemsComponent, AutocompleteComponent, CheckboxComponent, InputComponent, SwitchComponent, TextAreaComponent, ColorComponent, DatalistComponent, RangeComponent, SelectComponent, RadioComponent, OptionComponent, FileComponent, InputGroupComponent, HelpText, DndDirective, FileDndComponent, InputValidationComponent, AutocompleteCountryComponent, AutocompleteTimezonesComponent, AutocompleteCountryDialCodeComponent, AlertComponent, BreadcrumbComponent, AccordionComponent, AccordionItemComponent, AccordionHeaderComponent, AccordionBodyComponent, ButtonComponent, ButtonCloseComponent, ButtonGroupComponent, ButtonToolbarComponent, RlbFabComponent, BadgeDirective, BadgeComponent, CardBodyComponent, CardFooterComponent, CardGroupComponent, CardHeaderComponent, CardImageComponent, CardLinkComponent, CardSubtitleComponent, CardTextComponent, CardTitleComponent, CardComponent, SpinnerComponent, ProgressComponent, TooltipDirective, PopoverDirective, PlaceholderDirective, CollapseComponent, DropdownComponent, DropdownContainerComponent, DropdownMenuItemComponent, DropdownDirective, NavbarBrandDirective, NavbarComponent, NavbarFormComponent, NavbarTextComponent, NavbarItemsComponent, NavbarDropdownItemComponent, NavbarItemComponent, NavbarSeparatorComponent, OffcanvasComponent, OffcanvasHeaderComponent, OffcanvasTitleComponent, OffcanvasBodyComponent, ToggleDirective, SidebarComponent, SidebarItemComponent, NavComponent, NavItemComponent, TabsComponent, TabComponent, TabContentComponent, TabPaneComponent, PaginationItemComponent, PaginationComponent, ScrollspyDirective, CarouselComponent, CarouselCaptionComponent, CarouselSlideComponent, ListComponent, ListItemComponent, ListItemImageComponent, AvatarComponent, ChatContainerComponent, ChatItemComponent, RlbPlaceholderComponent, RlbPlaceholderLineComponent, RlbPlaceholderTextComponent, ModalContainerComponent, ToastContainerComponent, CalendarComponent, CalendarHeaderComponent, CalendarGrid, CalendarWeekGridComponent, CalendarDayGridComponent, CalendarMonthGridComponent, CalendarEventComponent, ComponentHostDirective, DateTzPipe, MonthFormatterPipe, DayOfWeekPipe, FormFieldsComponent], imports: [CommonModule,
10699
11203
  FormsModule,
10700
11204
  ReactiveFormsModule,
10701
11205
  TranslateModule,
@@ -10704,7 +11208,7 @@ class RlbBootstrapModule {
10704
11208
  CdkDropListGroup,
10705
11209
  CdkDropList,
10706
11210
  CdkDragPlaceholder,
10707
- CdkDragPreview], exports: [DataTableActionComponent, DataTableActionsComponent, DataTableCellComponent, DataTableHeaderComponent, DataTableRowComponent, DataTableComponent, DataTableLoadingComponent, DataTableNoItemsComponent, AutocompleteComponent, CheckboxComponent, InputComponent, SwitchComponent, TextAreaComponent, ColorComponent, DatalistComponent, RangeComponent, SelectComponent, RadioComponent, OptionComponent, FileComponent, InputGroupComponent, HelpText, DndDirective, FileDndComponent, InputValidationComponent, AutocompleteCountryComponent, AutocompleteTimezonesComponent, AutocompleteCountryDialCodeComponent, AlertComponent, BreadcrumbComponent, AccordionComponent, AccordionItemComponent, AccordionHeaderComponent, AccordionBodyComponent, ButtonComponent, ButtonCloseComponent, ButtonGroupComponent, ButtonToolbarComponent, RlbFabComponent, BadgeDirective, BadgeComponent, CardBodyComponent, CardFooterComponent, CardGroupComponent, CardHeaderComponent, CardImageComponent, CardLinkComponent, CardSubtitleComponent, CardTextComponent, CardTitleComponent, CardComponent, SpinnerComponent, ProgressComponent, TooltipDirective, PopoverDirective, PlaceholderDirective, CollapseComponent, DropdownComponent, DropdownContainerComponent, DropdownMenuItemComponent, DropdownDirective, NavbarBrandDirective, NavbarComponent, NavbarFormComponent, NavbarTextComponent, NavbarItemsComponent, NavbarDropdownItemComponent, NavbarItemComponent, NavbarSeparatorComponent, OffcanvasComponent, OffcanvasHeaderComponent, OffcanvasTitleComponent, OffcanvasBodyComponent, ToggleDirective, SidebarComponent, SidebarItemComponent, NavComponent, NavItemComponent, TabsComponent, TabComponent, TabContentComponent, TabPaneComponent, PaginationItemComponent, PaginationComponent, ScrollspyDirective, CarouselComponent, CarouselCaptionComponent, CarouselSlideComponent, ListComponent, ListItemComponent, ListItemImageComponent, AvatarComponent, ChatContainerComponent, ChatItemComponent, RlbPlaceholderComponent, RlbPlaceholderLineComponent, RlbPlaceholderTextComponent, ModalContainerComponent, ToastContainerComponent, CalendarComponent, CalendarHeaderComponent, CalendarGrid, CalendarWeekGridComponent, CalendarMonthGridComponent, CalendarEventComponent, DateTzPipe, MonthFormatterPipe, DayOfWeekPipe, FormFieldsComponent] }); }
11211
+ CdkDragPreview], exports: [DataTableActionComponent, DataTableActionsComponent, DataTableCellComponent, DataTableHeaderComponent, DataTableRowComponent, DataTableComponent, DataTableLoadingComponent, DataTableNoItemsComponent, AutocompleteComponent, CheckboxComponent, InputComponent, SwitchComponent, TextAreaComponent, ColorComponent, DatalistComponent, RangeComponent, SelectComponent, RadioComponent, OptionComponent, FileComponent, InputGroupComponent, HelpText, DndDirective, FileDndComponent, InputValidationComponent, AutocompleteCountryComponent, AutocompleteTimezonesComponent, AutocompleteCountryDialCodeComponent, AlertComponent, BreadcrumbComponent, AccordionComponent, AccordionItemComponent, AccordionHeaderComponent, AccordionBodyComponent, ButtonComponent, ButtonCloseComponent, ButtonGroupComponent, ButtonToolbarComponent, RlbFabComponent, BadgeDirective, BadgeComponent, CardBodyComponent, CardFooterComponent, CardGroupComponent, CardHeaderComponent, CardImageComponent, CardLinkComponent, CardSubtitleComponent, CardTextComponent, CardTitleComponent, CardComponent, SpinnerComponent, ProgressComponent, TooltipDirective, PopoverDirective, PlaceholderDirective, CollapseComponent, DropdownComponent, DropdownContainerComponent, DropdownMenuItemComponent, DropdownDirective, NavbarBrandDirective, NavbarComponent, NavbarFormComponent, NavbarTextComponent, NavbarItemsComponent, NavbarDropdownItemComponent, NavbarItemComponent, NavbarSeparatorComponent, OffcanvasComponent, OffcanvasHeaderComponent, OffcanvasTitleComponent, OffcanvasBodyComponent, ToggleDirective, SidebarComponent, SidebarItemComponent, NavComponent, NavItemComponent, TabsComponent, TabComponent, TabContentComponent, TabPaneComponent, PaginationItemComponent, PaginationComponent, ScrollspyDirective, CarouselComponent, CarouselCaptionComponent, CarouselSlideComponent, ListComponent, ListItemComponent, ListItemImageComponent, AvatarComponent, ChatContainerComponent, ChatItemComponent, RlbPlaceholderComponent, RlbPlaceholderLineComponent, RlbPlaceholderTextComponent, ModalContainerComponent, ToastContainerComponent, CalendarComponent, CalendarHeaderComponent, CalendarGrid, CalendarWeekGridComponent, CalendarDayGridComponent, CalendarMonthGridComponent, CalendarEventComponent, DateTzPipe, MonthFormatterPipe, DayOfWeekPipe, FormFieldsComponent] }); }
10708
11212
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: RlbBootstrapModule, imports: [CommonModule,
10709
11213
  FormsModule,
10710
11214
  ReactiveFormsModule,
@@ -10783,12 +11287,12 @@ class SearchModalComponent {
10783
11287
  <i class="bi bi-search"></i>
10784
11288
  </button>
10785
11289
  </rlb-input>
10786
- </div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: RlbBootstrapModule }, { kind: "component", type: InputComponent, selector: "rlb-input", inputs: ["disabled", "readonly", "before-text", "placeholder", "type", "size", "name", "max", "min", "step", "date-type", "timezone", "id", "extValidation", "enable-validation"] }, { kind: "component", type: ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }] }); }
11290
+ </div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: RlbBootstrapModule }, { kind: "component", type: InputComponent, selector: "rlb-input", inputs: ["disabled", "readonly", "before-text", "placeholder", "type", "size", "name", "max", "min", "step", "date-type", "timezone", "id", "extValidation", "enable-validation"] }, { kind: "component", type: ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
10787
11291
  }
10788
11292
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SearchModalComponent, decorators: [{
10789
11293
  type: Component,
10790
11294
  args: [{
10791
- imports: [RlbBootstrapModule, FormsModule, CommonModule],
11295
+ imports: [RlbBootstrapModule, FormsModule],
10792
11296
  standalone: true,
10793
11297
  template: ` <div class="modal-header">
10794
11298
  <h5 class="modal-title">{{ data.title }}</h5>
@@ -10841,51 +11345,59 @@ class CommonModalComponent {
10841
11345
  onEnter() { }
10842
11346
  ngOnInit() { }
10843
11347
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CommonModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10844
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: CommonModalComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "btn", first: true, predicate: ["btn"], descendants: true }], hostDirectives: [{ directive: ModalDirective, inputs: ["id", "id", "data-instance", "data-instance", "data-options", "data-options"] }], ngImport: i0, template: `
11348
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: CommonModalComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "btn", first: true, predicate: ["btn"], descendants: true }], hostDirectives: [{ directive: ModalDirective, inputs: ["id", "id", "data-instance", "data-instance", "data-options", "data-options"] }], ngImport: i0, template: `
10845
11349
  <div [class]="'modal-header' + headerColor">
10846
11350
  <h5 class="modal-title">{{ data.title }}</h5>
10847
11351
  <button type="button" class="btn-close" aria-label="Close" data-modal-reason="close"></button>
10848
11352
  </div>
10849
11353
  <div class="modal-body">
10850
- <h6 *ngIf="data.content?.header">
10851
- {{ data.content.header }}
10852
- </h6>
11354
+ @if (data.content.header) {
11355
+ <h6>
11356
+ {{ data.content.header }}
11357
+ </h6>
11358
+ }
10853
11359
  <span>
10854
- {{ data.content.body }}
11360
+ {{ data.content.body }}
10855
11361
  </span>
10856
11362
  </div>
10857
11363
  <div class="modal-footer">
10858
- <button *ngIf="data.cancel" class="me-2" rlb-button outline data-modal-reason="cancel">
10859
- {{ data.cancel }}
10860
- </button>
11364
+ @if (data.cancel) {
11365
+ <button class="me-2" rlb-button outline data-modal-reason="cancel">
11366
+ {{ data.cancel }}
11367
+ </button>
11368
+ }
10861
11369
  <button rlb-button data-modal-reason="ok" [disabled]="!valid">
10862
11370
  {{ data.ok }}
10863
11371
  </button>
10864
11372
  </div>
10865
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: RlbBootstrapModule }, { kind: "component", type: ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
11373
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: RlbBootstrapModule }, { kind: "component", type: ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "ngmodule", type: FormsModule }] }); }
10866
11374
  }
10867
11375
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CommonModalComponent, decorators: [{
10868
11376
  type: Component,
10869
11377
  args: [{
10870
11378
  standalone: true,
10871
- imports: [RlbBootstrapModule, FormsModule, CommonModule],
11379
+ imports: [RlbBootstrapModule, FormsModule],
10872
11380
  template: `
10873
11381
  <div [class]="'modal-header' + headerColor">
10874
11382
  <h5 class="modal-title">{{ data.title }}</h5>
10875
11383
  <button type="button" class="btn-close" aria-label="Close" data-modal-reason="close"></button>
10876
11384
  </div>
10877
11385
  <div class="modal-body">
10878
- <h6 *ngIf="data.content?.header">
10879
- {{ data.content.header }}
10880
- </h6>
11386
+ @if (data.content.header) {
11387
+ <h6>
11388
+ {{ data.content.header }}
11389
+ </h6>
11390
+ }
10881
11391
  <span>
10882
- {{ data.content.body }}
11392
+ {{ data.content.body }}
10883
11393
  </span>
10884
11394
  </div>
10885
11395
  <div class="modal-footer">
10886
- <button *ngIf="data.cancel" class="me-2" rlb-button outline data-modal-reason="cancel">
10887
- {{ data.cancel }}
10888
- </button>
11396
+ @if (data.cancel) {
11397
+ <button class="me-2" rlb-button outline data-modal-reason="cancel">
11398
+ {{ data.cancel }}
11399
+ </button>
11400
+ }
10889
11401
  <button rlb-button data-modal-reason="ok" [disabled]="!valid">
10890
11402
  {{ data.ok }}
10891
11403
  </button>
@@ -10996,44 +11508,44 @@ class EventCreateEditComponent {
10996
11508
  return "";
10997
11509
  }
10998
11510
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: EventCreateEditComponent, deps: [{ token: i2$2.FormBuilder }, { token: UniqueIdService }], target: i0.ɵɵFactoryTarget.Component }); }
10999
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: EventCreateEditComponent, isStandalone: true, selector: "ng-component", hostDirectives: [{ directive: ModalDirective, inputs: ["id", "id", "data-instance", "data-instance", "data-options", "data-options"] }], ngImport: i0, template: `
11511
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: EventCreateEditComponent, isStandalone: true, selector: "ng-component", hostDirectives: [{ directive: ModalDirective, inputs: ["id", "id", "data-instance", "data-instance", "data-options", "data-options"] }], ngImport: i0, template: `
11000
11512
  <div [class]="'modal-header' + headerColor">
11001
- <h5 class="modal-title">{{ data.title }}</h5>
11002
- <button type="button" class="btn-close" aria-label="Close" data-modal-reason="close"></button>
11513
+ <h5 class="modal-title">{{ data.title }}</h5>
11514
+ <button type="button" class="btn-close" aria-label="Close" data-modal-reason="close"></button>
11515
+ </div>
11516
+ <div class="modal-body" [formGroup]="form">
11517
+ <rlb-input enable-validation formControlName="title">
11518
+ <label before>Event title</label>
11519
+ </rlb-input>
11520
+ <rlb-input enable-validation type="datetime-local" date-type="date-tz" formControlName="start">
11521
+ <label before class="mt-3">Event start</label>
11522
+ </rlb-input>
11523
+ <rlb-input enable-validation type="datetime-local" date-type="date-tz" formControlName="end">
11524
+ <label before class="mt-3">Event end</label>
11525
+ </rlb-input>
11526
+ <rlb-select enable-validation [placeholder]="'Choose event color'" formControlName="color">
11527
+ <label before class="mt-3">Event color</label>
11528
+ @for (color of colors; track color) {
11529
+ <rlb-option [value]="color">
11530
+ {{ color }}
11531
+ </rlb-option>
11532
+ }
11533
+ </rlb-select>
11003
11534
  </div>
11004
- <div class="modal-body" [formGroup]="form">
11005
- <rlb-input enable-validation formControlName="title">
11006
- <label before>Event title</label>
11007
- </rlb-input>
11008
- <rlb-input enable-validation type="datetime-local" date-type="date-tz" formControlName="start">
11009
- <label before class="mt-3">Event start</label>
11010
- </rlb-input>
11011
- <rlb-input enable-validation type="datetime-local" date-type="date-tz" formControlName="end">
11012
- <label before class="mt-3">Event end</label>
11013
- </rlb-input>
11014
- <rlb-select enable-validation [placeholder]="'Choose event color'" formControlName="color">
11015
- <label before class="mt-3">Event color</label>
11016
- <ng-container *ngFor="let color of colors">
11017
- <rlb-option [value]="color">
11018
- {{ color }}
11019
- </rlb-option>
11020
- </ng-container>
11021
- </rlb-select>
11022
- </div>
11023
11535
  <div class="modal-footer">
11024
- <button
11025
- type="button"
11026
- class="btn "
11027
- data-modal-reason="cancel"
11028
- [ngClass]="{ 'btn-secondary': !eventToEdit, 'btn-danger': eventToEdit }"
11029
- >
11030
- {{ eventToEdit ? 'Delete event' : 'Close' }}
11031
- </button>
11032
- <button type="button" [disabled]="!valid" class="btn btn-primary" data-modal-reason="ok">
11033
- Save changes
11034
- </button>
11536
+ <button
11537
+ type="button"
11538
+ class="btn "
11539
+ data-modal-reason="cancel"
11540
+ [ngClass]="{ 'btn-secondary': !eventToEdit, 'btn-danger': eventToEdit }"
11541
+ >
11542
+ {{ eventToEdit ? 'Delete event' : 'Close' }}
11543
+ </button>
11544
+ <button type="button" [disabled]="!valid" class="btn btn-primary" data-modal-reason="ok">
11545
+ Save changes
11546
+ </button>
11035
11547
  </div>
11036
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: RlbBootstrapModule }, { kind: "component", type: InputComponent, selector: "rlb-input", inputs: ["disabled", "readonly", "before-text", "placeholder", "type", "size", "name", "max", "min", "step", "date-type", "timezone", "id", "extValidation", "enable-validation"] }, { kind: "component", type: SelectComponent, selector: "rlb-select", inputs: ["placeholder", "size", "disabled", "readonly", "multiple", "display", "id", "enable-validation"] }, { kind: "component", type: OptionComponent, selector: "rlb-option", inputs: ["disabled", "value", "class"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] }); }
11548
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: RlbBootstrapModule }, { kind: "component", type: InputComponent, selector: "rlb-input", inputs: ["disabled", "readonly", "before-text", "placeholder", "type", "size", "name", "max", "min", "step", "date-type", "timezone", "id", "extValidation", "enable-validation"] }, { kind: "component", type: SelectComponent, selector: "rlb-select", inputs: ["placeholder", "size", "disabled", "readonly", "multiple", "display", "id", "enable-validation"] }, { kind: "component", type: OptionComponent, selector: "rlb-option", inputs: ["disabled", "value", "class"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] }); }
11037
11549
  }
11038
11550
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: EventCreateEditComponent, decorators: [{
11039
11551
  type: Component,
@@ -11041,42 +11553,42 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
11041
11553
  standalone: true,
11042
11554
  template: `
11043
11555
  <div [class]="'modal-header' + headerColor">
11044
- <h5 class="modal-title">{{ data.title }}</h5>
11045
- <button type="button" class="btn-close" aria-label="Close" data-modal-reason="close"></button>
11556
+ <h5 class="modal-title">{{ data.title }}</h5>
11557
+ <button type="button" class="btn-close" aria-label="Close" data-modal-reason="close"></button>
11558
+ </div>
11559
+ <div class="modal-body" [formGroup]="form">
11560
+ <rlb-input enable-validation formControlName="title">
11561
+ <label before>Event title</label>
11562
+ </rlb-input>
11563
+ <rlb-input enable-validation type="datetime-local" date-type="date-tz" formControlName="start">
11564
+ <label before class="mt-3">Event start</label>
11565
+ </rlb-input>
11566
+ <rlb-input enable-validation type="datetime-local" date-type="date-tz" formControlName="end">
11567
+ <label before class="mt-3">Event end</label>
11568
+ </rlb-input>
11569
+ <rlb-select enable-validation [placeholder]="'Choose event color'" formControlName="color">
11570
+ <label before class="mt-3">Event color</label>
11571
+ @for (color of colors; track color) {
11572
+ <rlb-option [value]="color">
11573
+ {{ color }}
11574
+ </rlb-option>
11575
+ }
11576
+ </rlb-select>
11046
11577
  </div>
11047
- <div class="modal-body" [formGroup]="form">
11048
- <rlb-input enable-validation formControlName="title">
11049
- <label before>Event title</label>
11050
- </rlb-input>
11051
- <rlb-input enable-validation type="datetime-local" date-type="date-tz" formControlName="start">
11052
- <label before class="mt-3">Event start</label>
11053
- </rlb-input>
11054
- <rlb-input enable-validation type="datetime-local" date-type="date-tz" formControlName="end">
11055
- <label before class="mt-3">Event end</label>
11056
- </rlb-input>
11057
- <rlb-select enable-validation [placeholder]="'Choose event color'" formControlName="color">
11058
- <label before class="mt-3">Event color</label>
11059
- <ng-container *ngFor="let color of colors">
11060
- <rlb-option [value]="color">
11061
- {{ color }}
11062
- </rlb-option>
11063
- </ng-container>
11064
- </rlb-select>
11065
- </div>
11066
11578
  <div class="modal-footer">
11067
- <button
11068
- type="button"
11069
- class="btn "
11070
- data-modal-reason="cancel"
11071
- [ngClass]="{ 'btn-secondary': !eventToEdit, 'btn-danger': eventToEdit }"
11072
- >
11073
- {{ eventToEdit ? 'Delete event' : 'Close' }}
11074
- </button>
11075
- <button type="button" [disabled]="!valid" class="btn btn-primary" data-modal-reason="ok">
11076
- Save changes
11077
- </button>
11579
+ <button
11580
+ type="button"
11581
+ class="btn "
11582
+ data-modal-reason="cancel"
11583
+ [ngClass]="{ 'btn-secondary': !eventToEdit, 'btn-danger': eventToEdit }"
11584
+ >
11585
+ {{ eventToEdit ? 'Delete event' : 'Close' }}
11586
+ </button>
11587
+ <button type="button" [disabled]="!valid" class="btn btn-primary" data-modal-reason="ok">
11588
+ Save changes
11589
+ </button>
11078
11590
  </div>
11079
- `,
11591
+ `,
11080
11592
  hostDirectives: [
11081
11593
  {
11082
11594
  directive: ModalDirective,
@@ -11107,56 +11619,58 @@ class CalendarOverflowEventsContainerComponent {
11107
11619
  this.result = { event, action };
11108
11620
  }
11109
11621
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CalendarOverflowEventsContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
11110
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: CalendarOverflowEventsContainerComponent, isStandalone: true, selector: "ng-component", hostDirectives: [{ directive: ModalDirective, inputs: ["id", "id", "data-instance", "data-instance", "data-options", "data-options"] }], ngImport: i0, template: `
11622
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: CalendarOverflowEventsContainerComponent, isStandalone: true, selector: "ng-component", hostDirectives: [{ directive: ModalDirective, inputs: ["id", "id", "data-instance", "data-instance", "data-options", "data-options"] }], ngImport: i0, template: `
11111
11623
  <div [class]="'modal-header' + headerColor">
11112
- <h5 class="modal-title">{{ data.title }}</h5>
11113
- <button type="button" class="btn-close" aria-label="Close" data-modal-reason="close"></button>
11624
+ <h5 class="modal-title">{{ data.title }}</h5>
11625
+ <button type="button" class="btn-close" aria-label="Close" data-modal-reason="close"></button>
11626
+ </div>
11627
+ <div class="modal-body">
11628
+ <div class="d-flex flex-column gap-1 overflow-y-auto p-3" [style.height.rem]="containerHeightRem">
11629
+ @for (event of data.content; track event) {
11630
+ <rlb-card class="mb-0 shadow-lg rounded" [border]="event.color">
11631
+ <rlb-card-body class="d-flex align-items-center justify-content-between">
11632
+ <div>
11633
+ <span rlb-badge pill [color]="event.color">&nbsp;</span>
11634
+ <span>
11635
+ {{ event.title }}
11636
+ </span>
11637
+ </div>
11638
+ <div class="d-flex align-items-center gap-2">
11639
+ <rlb-fab
11640
+ (click)="closeDialog(event, 'edit')"
11641
+ data-modal-reason="ok"
11642
+ class="align-self-end"
11643
+ size="xs"
11644
+ outline
11645
+ >
11646
+ <i class="bi bi-pencil"></i>
11647
+ </rlb-fab>
11648
+ <rlb-fab
11649
+ (click)="closeDialog(event, 'delete')"
11650
+ data-modal-reason="ok"
11651
+ class="align-self-end"
11652
+ size="xs"
11653
+ color="danger"
11654
+ outline
11655
+ >
11656
+ <i class="bi bi-trash"></i>
11657
+ </rlb-fab>
11658
+ </div>
11659
+ </rlb-card-body>
11660
+ </rlb-card>
11661
+ }
11662
+ </div>
11114
11663
  </div>
11115
- <div class="modal-body">
11116
- <div class="d-flex flex-column gap-1 overflow-y-auto p-3" [style.height.rem]="containerHeightRem">
11117
- <rlb-card class="mb-0 shadow-lg rounded" [border]="event.color" *ngFor="let event of data.content">
11118
- <rlb-card-body class="d-flex align-items-center justify-content-between">
11119
- <div>
11120
- <span rlb-badge pill [color]="event.color">&nbsp;</span>
11121
- <span>
11122
- {{ event.title }}
11123
- </span>
11124
- </div>
11125
- <div class="d-flex align-items-center gap-2">
11126
- <rlb-fab
11127
- (click)="closeDialog(event, 'edit')"
11128
- data-modal-reason="ok"
11129
- class="align-self-end"
11130
- size="xs"
11131
- outline
11132
- >
11133
- <i class="bi bi-pencil"></i>
11134
- </rlb-fab>
11135
- <rlb-fab
11136
- (click)="closeDialog(event, 'delete')"
11137
- data-modal-reason="ok"
11138
- class="align-self-end"
11139
- size="xs"
11140
- color="danger"
11141
- outline
11142
- >
11143
- <i class="bi bi-trash"></i>
11144
- </rlb-fab>
11145
- </div>
11146
- </rlb-card-body>
11147
- </rlb-card>
11148
- </div>
11149
- </div>
11150
11664
  <div class="modal-footer">
11151
- <button
11152
- rlb-button
11153
- color="secondary"
11154
- data-modal-reason="cancel"
11155
- >
11156
- {{ 'Close' }}
11157
- </button>
11665
+ <button
11666
+ rlb-button
11667
+ color="secondary"
11668
+ data-modal-reason="cancel"
11669
+ >
11670
+ {{ 'Close' }}
11671
+ </button>
11158
11672
  </div>
11159
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: RlbBootstrapModule }, { kind: "component", type: ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "component", type: RlbFabComponent, selector: "rlb-fab", inputs: ["color", "size", "disabled", "outline", "position"] }, { kind: "component", type: BadgeComponent, selector: "span[rlb-badge], img[rlb-badge]", inputs: ["pill", "color", "hidden-text", "border", "class"] }, { kind: "component", type: CardBodyComponent, selector: "rlb-card-body" }, { kind: "component", type: CardComponent, selector: "rlb-card", inputs: ["align", "overlay", "background", "border"] }] }); }
11673
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: RlbBootstrapModule }, { kind: "component", type: ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "component", type: RlbFabComponent, selector: "rlb-fab", inputs: ["color", "size", "disabled", "outline", "position"] }, { kind: "component", type: BadgeComponent, selector: "span[rlb-badge], img[rlb-badge]", inputs: ["pill", "color", "hidden-text", "border", "class"] }, { kind: "component", type: CardBodyComponent, selector: "rlb-card-body" }, { kind: "component", type: CardComponent, selector: "rlb-card", inputs: ["align", "overlay", "background", "border"] }] }); }
11160
11674
  }
11161
11675
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CalendarOverflowEventsContainerComponent, decorators: [{
11162
11676
  type: Component,
@@ -11164,61 +11678,63 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
11164
11678
  standalone: true,
11165
11679
  template: `
11166
11680
  <div [class]="'modal-header' + headerColor">
11167
- <h5 class="modal-title">{{ data.title }}</h5>
11168
- <button type="button" class="btn-close" aria-label="Close" data-modal-reason="close"></button>
11681
+ <h5 class="modal-title">{{ data.title }}</h5>
11682
+ <button type="button" class="btn-close" aria-label="Close" data-modal-reason="close"></button>
11683
+ </div>
11684
+ <div class="modal-body">
11685
+ <div class="d-flex flex-column gap-1 overflow-y-auto p-3" [style.height.rem]="containerHeightRem">
11686
+ @for (event of data.content; track event) {
11687
+ <rlb-card class="mb-0 shadow-lg rounded" [border]="event.color">
11688
+ <rlb-card-body class="d-flex align-items-center justify-content-between">
11689
+ <div>
11690
+ <span rlb-badge pill [color]="event.color">&nbsp;</span>
11691
+ <span>
11692
+ {{ event.title }}
11693
+ </span>
11694
+ </div>
11695
+ <div class="d-flex align-items-center gap-2">
11696
+ <rlb-fab
11697
+ (click)="closeDialog(event, 'edit')"
11698
+ data-modal-reason="ok"
11699
+ class="align-self-end"
11700
+ size="xs"
11701
+ outline
11702
+ >
11703
+ <i class="bi bi-pencil"></i>
11704
+ </rlb-fab>
11705
+ <rlb-fab
11706
+ (click)="closeDialog(event, 'delete')"
11707
+ data-modal-reason="ok"
11708
+ class="align-self-end"
11709
+ size="xs"
11710
+ color="danger"
11711
+ outline
11712
+ >
11713
+ <i class="bi bi-trash"></i>
11714
+ </rlb-fab>
11715
+ </div>
11716
+ </rlb-card-body>
11717
+ </rlb-card>
11718
+ }
11719
+ </div>
11169
11720
  </div>
11170
- <div class="modal-body">
11171
- <div class="d-flex flex-column gap-1 overflow-y-auto p-3" [style.height.rem]="containerHeightRem">
11172
- <rlb-card class="mb-0 shadow-lg rounded" [border]="event.color" *ngFor="let event of data.content">
11173
- <rlb-card-body class="d-flex align-items-center justify-content-between">
11174
- <div>
11175
- <span rlb-badge pill [color]="event.color">&nbsp;</span>
11176
- <span>
11177
- {{ event.title }}
11178
- </span>
11179
- </div>
11180
- <div class="d-flex align-items-center gap-2">
11181
- <rlb-fab
11182
- (click)="closeDialog(event, 'edit')"
11183
- data-modal-reason="ok"
11184
- class="align-self-end"
11185
- size="xs"
11186
- outline
11187
- >
11188
- <i class="bi bi-pencil"></i>
11189
- </rlb-fab>
11190
- <rlb-fab
11191
- (click)="closeDialog(event, 'delete')"
11192
- data-modal-reason="ok"
11193
- class="align-self-end"
11194
- size="xs"
11195
- color="danger"
11196
- outline
11197
- >
11198
- <i class="bi bi-trash"></i>
11199
- </rlb-fab>
11200
- </div>
11201
- </rlb-card-body>
11202
- </rlb-card>
11203
- </div>
11204
- </div>
11205
11721
  <div class="modal-footer">
11206
- <button
11207
- rlb-button
11208
- color="secondary"
11209
- data-modal-reason="cancel"
11210
- >
11211
- {{ 'Close' }}
11212
- </button>
11722
+ <button
11723
+ rlb-button
11724
+ color="secondary"
11725
+ data-modal-reason="cancel"
11726
+ >
11727
+ {{ 'Close' }}
11728
+ </button>
11213
11729
  </div>
11214
- `,
11730
+ `,
11215
11731
  hostDirectives: [
11216
11732
  {
11217
11733
  directive: ModalDirective,
11218
11734
  inputs: ['id', 'data-instance', 'data-options'],
11219
11735
  },
11220
11736
  ],
11221
- imports: [CommonModule, RlbBootstrapModule]
11737
+ imports: [RlbBootstrapModule]
11222
11738
  }]
11223
11739
  }] });
11224
11740
 
@@ -11227,14 +11743,16 @@ class CalendarToastComponent {
11227
11743
  this.valid = true;
11228
11744
  }
11229
11745
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CalendarToastComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
11230
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: CalendarToastComponent, isStandalone: true, selector: "ng-component", hostDirectives: [{ directive: ToastDirective, inputs: ["id", "id", "data-instance", "data-instance", "data-options", "data-options"] }], ngImport: i0, template: `
11746
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: CalendarToastComponent, isStandalone: true, selector: "ng-component", hostDirectives: [{ directive: ToastDirective, inputs: ["id", "id", "data-instance", "data-instance", "data-options", "data-options"] }], ngImport: i0, template: `
11231
11747
  <div class="toast-header">
11232
11748
  <strong class="me-auto">{{data.title}}</strong>
11233
- <small *ngIf="data.subtitle"> {{data.subtitle }}</small>
11749
+ @if (data.subtitle) {
11750
+ <small> {{data.subtitle }}</small>
11751
+ }
11234
11752
  <button type="button" class="btn-close" data-bs-dismiss="toast" aria-label="Close"></button>
11235
11753
  </div>
11236
11754
  <div class="toast-body">{{data.content}}</div>
11237
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: RlbBootstrapModule }] }); }
11755
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: RlbBootstrapModule }] }); }
11238
11756
  }
11239
11757
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CalendarToastComponent, decorators: [{
11240
11758
  type: Component,
@@ -11242,11 +11760,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
11242
11760
  template: `
11243
11761
  <div class="toast-header">
11244
11762
  <strong class="me-auto">{{data.title}}</strong>
11245
- <small *ngIf="data.subtitle"> {{data.subtitle }}</small>
11763
+ @if (data.subtitle) {
11764
+ <small> {{data.subtitle }}</small>
11765
+ }
11246
11766
  <button type="button" class="btn-close" data-bs-dismiss="toast" aria-label="Close"></button>
11247
11767
  </div>
11248
11768
  <div class="toast-body">{{data.content}}</div>
11249
- `,
11769
+ `,
11250
11770
  hostDirectives: [
11251
11771
  {
11252
11772
  directive: ToastDirective,
@@ -11254,7 +11774,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
11254
11774
  },
11255
11775
  ],
11256
11776
  standalone: true,
11257
- imports: [CommonModule, RlbBootstrapModule]
11777
+ imports: [RlbBootstrapModule]
11258
11778
  }]
11259
11779
  }] });
11260
11780
 
@@ -11290,5 +11810,5 @@ function provideRlbBootstrap() {
11290
11810
  * Generated bundle index. Do not edit.
11291
11811
  */
11292
11812
 
11293
- export { AbstractAutocompleteComponent, AbstractComponent, AccordionBodyComponent, AccordionComponent, AccordionHeaderComponent, AccordionItemComponent, AlertComponent, AutocompleteComponent, AutocompleteCountryComponent, AutocompleteCountryDialCodeComponent, AutocompleteTimezonesComponent, AvatarComponent, BadgeComponent, BadgeDirective, BreadcrumbComponent, ButtonCloseComponent, ButtonComponent, ButtonGroupComponent, ButtonToolbarComponent, CALENDAR_COMPONENTS, COMPONENTS, CalendarComponent, CalendarEventComponent, CalendarGrid, CalendarHeaderComponent, CalendarMonthGridComponent, CalendarOverflowEventsContainerComponent, CalendarToastComponent, CalendarWeekGridComponent, CardBodyComponent, CardComponent, CardFooterComponent, CardGroupComponent, CardHeaderComponent, CardImageComponent, CardLinkComponent, CardSubtitleComponent, CardTextComponent, CardTitleComponent, CarouselCaptionComponent, CarouselComponent, CarouselSlideComponent, ChatContainerComponent, ChatItemComponent, CheckboxComponent, CollapseComponent, ColorComponent, CommonModalComponent, DataTableActionComponent, DataTableActionsComponent, DataTableCellComponent, DataTableComponent, DataTableHeaderComponent, DataTableLoadingComponent, DataTableNoItemsComponent, DataTableRowComponent, DatalistComponent, DateTzPipe, DayOfWeekPipe, DndDirective, DropdownComponent, DropdownContainerComponent, DropdownDirective, DropdownMenuItemComponent, EventCreateEditComponent, FileComponent, FileDndComponent, FormFieldsComponent, HelpText, INPUTS, InputComponent, InputGroupComponent, InputValidationComponent, ListComponent, ListItemComponent, ListItemImageComponent, MODALS, ModalContainerComponent, ModalDirective, ModalRegistryOptions, ModalService, MonthFormatterPipe, NavComponent, NavItemComponent, NavbarBrandDirective, NavbarComponent, NavbarDropdownItemComponent, NavbarFormComponent, NavbarItemComponent, NavbarItemsComponent, NavbarSeparatorComponent, NavbarTextComponent, OffcanvasBodyComponent, OffcanvasComponent, OffcanvasHeaderComponent, OffcanvasTitleComponent, OptionComponent, PIPES, PaginationComponent, PaginationItemComponent, PlaceholderDirective, PopoverDirective, ProgressComponent, RLB_TRANSLATION_SERVICE, RadioComponent, RangeComponent, RlbBootstrapModule, RlbFabComponent, RlbPlaceholderComponent, RlbPlaceholderLineComponent, RlbPlaceholderTextComponent, ScrollspyDirective, SearchModalComponent, SelectComponent, SidebarComponent, SidebarItemComponent, SpinnerComponent, SwitchComponent, TABLE, TOASTS, TabComponent, TabContentComponent, TabPaneComponent, TabsComponent, TextAreaComponent, ToastContainerComponent, ToastDirective, ToastRegistryOptions, ToastService, ToggleDirective, TooltipDirective, UniqueIdService, createArrayProxy, provideRlbBootstrap, requiredAutocompleteValue };
11813
+ export { AbstractAutocompleteComponent, AbstractComponent, AccordionBodyComponent, AccordionComponent, AccordionHeaderComponent, AccordionItemComponent, AlertComponent, AutocompleteComponent, AutocompleteCountryComponent, AutocompleteCountryDialCodeComponent, AutocompleteTimezonesComponent, AvatarComponent, BadgeComponent, BadgeDirective, BreadcrumbComponent, ButtonCloseComponent, ButtonComponent, ButtonGroupComponent, ButtonToolbarComponent, CALENDAR_COMPONENTS, COMPONENTS, CalendarComponent, CalendarDayGridComponent, CalendarEventComponent, CalendarGrid, CalendarHeaderComponent, CalendarMonthGridComponent, CalendarOverflowEventsContainerComponent, CalendarToastComponent, CalendarWeekGridComponent, CardBodyComponent, CardComponent, CardFooterComponent, CardGroupComponent, CardHeaderComponent, CardImageComponent, CardLinkComponent, CardSubtitleComponent, CardTextComponent, CardTitleComponent, CarouselCaptionComponent, CarouselComponent, CarouselSlideComponent, ChatContainerComponent, ChatItemComponent, CheckboxComponent, CollapseComponent, ColorComponent, CommonModalComponent, DataTableActionComponent, DataTableActionsComponent, DataTableCellComponent, DataTableComponent, DataTableHeaderComponent, DataTableLoadingComponent, DataTableNoItemsComponent, DataTableRowComponent, DatalistComponent, DateTzPipe, DayOfWeekPipe, DndDirective, DropdownComponent, DropdownContainerComponent, DropdownDirective, DropdownMenuItemComponent, EventCreateEditComponent, FileComponent, FileDndComponent, FormFieldsComponent, HelpText, INPUTS, InputComponent, InputGroupComponent, InputValidationComponent, ListComponent, ListItemComponent, ListItemImageComponent, MODALS, ModalContainerComponent, ModalDirective, ModalRegistryOptions, ModalService, MonthFormatterPipe, NavComponent, NavItemComponent, NavbarBrandDirective, NavbarComponent, NavbarDropdownItemComponent, NavbarFormComponent, NavbarItemComponent, NavbarItemsComponent, NavbarSeparatorComponent, NavbarTextComponent, OffcanvasBodyComponent, OffcanvasComponent, OffcanvasHeaderComponent, OffcanvasTitleComponent, OptionComponent, PIPES, PaginationComponent, PaginationItemComponent, PlaceholderDirective, PopoverDirective, ProgressComponent, RLB_TRANSLATION_SERVICE, RadioComponent, RangeComponent, RlbBootstrapModule, RlbFabComponent, RlbPlaceholderComponent, RlbPlaceholderLineComponent, RlbPlaceholderTextComponent, ScrollspyDirective, SearchModalComponent, SelectComponent, SidebarComponent, SidebarItemComponent, SpinnerComponent, SwitchComponent, TABLE, TOASTS, TabComponent, TabContentComponent, TabPaneComponent, TabsComponent, TextAreaComponent, ToastContainerComponent, ToastDirective, ToastRegistryOptions, ToastService, ToggleDirective, TooltipDirective, UniqueIdService, createArrayProxy, provideRlbBootstrap, requiredAutocompleteValue };
11294
11814
  //# sourceMappingURL=open-rlb-ng-bootstrap.mjs.map