@natec/mef-dev-ui-kit 20.1.13 → 20.1.15

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.
@@ -4450,7 +4450,7 @@ class MDCard {
4450
4450
  this.appearance = config?.appearance || 'outlined';
4451
4451
  }
4452
4452
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.6", ngImport: i0, type: MDCard, deps: [], target: i0.ɵɵFactoryTarget.Component });
4453
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.6", type: MDCard, isStandalone: true, selector: "md-card", inputs: { appearance: "appearance" }, host: { properties: { "class.mdc-card-outlined": "appearance === \"outlined\"", "class.mdc-card--outlined": "appearance === \"outlined\"", "class.mdc-card-filled": "appearance === \"filled\"", "class.mdc-card--filled": "appearance === \"filled\"" }, classAttribute: "mdc-card mdc-card" }, exportAs: ["mdCard"], ngImport: i0, template: "<ng-content></ng-content>", styles: ["div.jqxInGridLink{cursor:pointer;color:#00f;margin:2px;text-decoration:underline}div.jqxInGridLink :hover{color:#8a2be2}.pink-text{color:pink!important}.red-text{color:red!important}.turquoise-text{color:#03a796!important}.blue-text{color:#00f!important}.mdc-card{display:flex;flex-direction:column;box-sizing:border-box;position:relative;border-style:solid;border-width:0;background-color:#fdf1f2;border-color:#fdf1f2;border-radius:5px;box-shadow:none;padding:20px;font-family:Montserrat}.mdc-card:after{position:absolute;top:0;left:0;width:100%;height:100%;border:solid 1px transparent;content:\"\";display:block;pointer-events:none;box-sizing:border-box;border-radius:5px}.mdc-card-outlined{background-color:#eaeaea;border-radius:5px;border-width:1px;border-color:#f3f3f3}.mdc-card-outlined:after{border:none}.mdc-card-filled{background-color:#e3e2e6;border-radius:5px;box-shadow:none}.mdc-card__media{position:relative;box-sizing:border-box;background-repeat:no-repeat;background-position:center;background-size:cover}.mdc-card__media:before{display:block;content:\"\"}.mdc-card__media:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.mdc-card__media:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.mdc-card-actions{display:flex;flex-direction:row;align-items:center;box-sizing:border-box;min-height:52px}.mdc-card-title{line-height:1.75rem;font-size:1.375rem;letter-spacing:0;font-weight:700}.mdc-card-subtitle{color:#201a1b;line-height:1.5rem;font-size:1rem;letter-spacing:.009rem;font-weight:500}.mdc-card-title,.mdc-card-subtitle{display:block;margin:0}.mdc-card-avatar~.mdc-card-header-text .mdc-card-title,.mdc-card-avatar~.mdc-card-header-text .mdc-card-subtitle{padding:16px 16px 0}.mdc-card-content{display:block}.mdc-card-title-group{display:flex;justify-content:space-between;width:100%}.mdc-card-avatar{height:40px;width:40px;border-radius:50%;flex-shrink:0;margin-bottom:16px;object-fit:cover}.mdc-card-avatar~.mdc-card-header-text .mdc-card-subtitle,.mdc-card-avatar~.mdc-card-header-text .mdc-card-title{line-height:normal}.mdc-card-sm-image{width:80px;height:80px}.mdc-card-md-image{width:112px;height:112px}.mdc-card-lg-image{width:152px;height:152px}.mdc-card-xl-image{width:240px;height:240px}.mdc-card-subtitle~.mdc-card-title,.mdc-card-title~.mdc-card-subtitle,.mdc-card-header .mdc-card-header-text .mdc-card-title,.mdc-card-header .mdc-card-header-text .mdc-card-subtitle,.mdc-card-title-group .mdc-card-title,.mdc-card-title-group .mdc-card-subtitle{padding-top:0}.mdc-card-content>:last-child:not(.mdc-card-footer){margin-bottom:0}.mdc-card-actions-align-end{justify-content:flex-end}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
4453
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.6", type: MDCard, isStandalone: true, selector: "md-card", inputs: { appearance: "appearance" }, host: { properties: { "class.mdc-card-outlined": "appearance === \"outlined\"", "class.mdc-card--outlined": "appearance === \"outlined\"", "class.mdc-card-filled": "appearance === \"filled\"", "class.mdc-card--filled": "appearance === \"filled\"" }, classAttribute: "mdc-card mdc-card" }, exportAs: ["mdCard"], ngImport: i0, template: "<ng-content></ng-content>", styles: ["div.jqxInGridLink{cursor:pointer;color:#00f;margin:2px;text-decoration:underline}div.jqxInGridLink :hover{color:#8a2be2}.pink-text{color:pink!important}.red-text{color:red!important}.turquoise-text{color:#03a796!important}.blue-text{color:#00f!important}.mdc-card{display:flex;flex-direction:column;box-sizing:border-box;position:relative;border-style:solid;border-width:0;background-color:#fdf1f2;border-color:#fdf1f2;border-radius:5px;box-shadow:none;padding:20px;font-family:Montserrat}.mdc-card:after{position:absolute;top:0;left:0;width:100%;height:100%;border:solid 1px transparent;content:\"\";display:block;pointer-events:none;box-sizing:border-box;border-radius:5px}.mdc-card-outlined{background-color:#f3f3f3;border-radius:5px}.mdc-card-outlined:after{border:none}.mdc-card-filled{background-color:#e3e2e6;border-radius:5px;box-shadow:none}.mdc-card__media{position:relative;box-sizing:border-box;background-repeat:no-repeat;background-position:center;background-size:cover}.mdc-card__media:before{display:block;content:\"\"}.mdc-card__media:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.mdc-card__media:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.mdc-card-actions{display:flex;flex-direction:row;align-items:center;box-sizing:border-box;min-height:52px}.mdc-card-title{line-height:1.75rem;font-size:1.375rem;letter-spacing:0;font-weight:700}.mdc-card-subtitle{color:#201a1b;line-height:1.5rem;font-size:1rem;letter-spacing:.009rem;font-weight:500}.mdc-card-title,.mdc-card-subtitle{display:block;margin:0}.mdc-card-avatar~.mdc-card-header-text .mdc-card-title,.mdc-card-avatar~.mdc-card-header-text .mdc-card-subtitle{padding:16px 16px 0}.mdc-card-content{display:block}.mdc-card-title-group{display:flex;justify-content:space-between;width:100%}.mdc-card-avatar{height:40px;width:40px;border-radius:50%;flex-shrink:0;margin-bottom:16px;object-fit:cover}.mdc-card-avatar~.mdc-card-header-text .mdc-card-subtitle,.mdc-card-avatar~.mdc-card-header-text .mdc-card-title{line-height:normal}.mdc-card-sm-image{width:80px;height:80px}.mdc-card-md-image{width:112px;height:112px}.mdc-card-lg-image{width:152px;height:152px}.mdc-card-xl-image{width:240px;height:240px}.mdc-card-subtitle~.mdc-card-title,.mdc-card-title~.mdc-card-subtitle,.mdc-card-header .mdc-card-header-text .mdc-card-title,.mdc-card-header .mdc-card-header-text .mdc-card-subtitle,.mdc-card-title-group .mdc-card-title,.mdc-card-title-group .mdc-card-subtitle{padding-top:0}.mdc-card-content>:last-child:not(.mdc-card-footer){margin-bottom:0}.mdc-card-actions-align-end{justify-content:flex-end}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
4454
4454
  }
4455
4455
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.6", ngImport: i0, type: MDCard, decorators: [{
4456
4456
  type: Component,
@@ -4460,7 +4460,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.6", ngImpor
4460
4460
  '[class.mdc-card--outlined]': 'appearance === "outlined"',
4461
4461
  '[class.mdc-card-filled]': 'appearance === "filled"',
4462
4462
  '[class.mdc-card--filled]': 'appearance === "filled"',
4463
- }, exportAs: 'mdCard', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content></ng-content>", styles: ["div.jqxInGridLink{cursor:pointer;color:#00f;margin:2px;text-decoration:underline}div.jqxInGridLink :hover{color:#8a2be2}.pink-text{color:pink!important}.red-text{color:red!important}.turquoise-text{color:#03a796!important}.blue-text{color:#00f!important}.mdc-card{display:flex;flex-direction:column;box-sizing:border-box;position:relative;border-style:solid;border-width:0;background-color:#fdf1f2;border-color:#fdf1f2;border-radius:5px;box-shadow:none;padding:20px;font-family:Montserrat}.mdc-card:after{position:absolute;top:0;left:0;width:100%;height:100%;border:solid 1px transparent;content:\"\";display:block;pointer-events:none;box-sizing:border-box;border-radius:5px}.mdc-card-outlined{background-color:#eaeaea;border-radius:5px;border-width:1px;border-color:#f3f3f3}.mdc-card-outlined:after{border:none}.mdc-card-filled{background-color:#e3e2e6;border-radius:5px;box-shadow:none}.mdc-card__media{position:relative;box-sizing:border-box;background-repeat:no-repeat;background-position:center;background-size:cover}.mdc-card__media:before{display:block;content:\"\"}.mdc-card__media:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.mdc-card__media:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.mdc-card-actions{display:flex;flex-direction:row;align-items:center;box-sizing:border-box;min-height:52px}.mdc-card-title{line-height:1.75rem;font-size:1.375rem;letter-spacing:0;font-weight:700}.mdc-card-subtitle{color:#201a1b;line-height:1.5rem;font-size:1rem;letter-spacing:.009rem;font-weight:500}.mdc-card-title,.mdc-card-subtitle{display:block;margin:0}.mdc-card-avatar~.mdc-card-header-text .mdc-card-title,.mdc-card-avatar~.mdc-card-header-text .mdc-card-subtitle{padding:16px 16px 0}.mdc-card-content{display:block}.mdc-card-title-group{display:flex;justify-content:space-between;width:100%}.mdc-card-avatar{height:40px;width:40px;border-radius:50%;flex-shrink:0;margin-bottom:16px;object-fit:cover}.mdc-card-avatar~.mdc-card-header-text .mdc-card-subtitle,.mdc-card-avatar~.mdc-card-header-text .mdc-card-title{line-height:normal}.mdc-card-sm-image{width:80px;height:80px}.mdc-card-md-image{width:112px;height:112px}.mdc-card-lg-image{width:152px;height:152px}.mdc-card-xl-image{width:240px;height:240px}.mdc-card-subtitle~.mdc-card-title,.mdc-card-title~.mdc-card-subtitle,.mdc-card-header .mdc-card-header-text .mdc-card-title,.mdc-card-header .mdc-card-header-text .mdc-card-subtitle,.mdc-card-title-group .mdc-card-title,.mdc-card-title-group .mdc-card-subtitle{padding-top:0}.mdc-card-content>:last-child:not(.mdc-card-footer){margin-bottom:0}.mdc-card-actions-align-end{justify-content:flex-end}\n"] }]
4463
+ }, exportAs: 'mdCard', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content></ng-content>", styles: ["div.jqxInGridLink{cursor:pointer;color:#00f;margin:2px;text-decoration:underline}div.jqxInGridLink :hover{color:#8a2be2}.pink-text{color:pink!important}.red-text{color:red!important}.turquoise-text{color:#03a796!important}.blue-text{color:#00f!important}.mdc-card{display:flex;flex-direction:column;box-sizing:border-box;position:relative;border-style:solid;border-width:0;background-color:#fdf1f2;border-color:#fdf1f2;border-radius:5px;box-shadow:none;padding:20px;font-family:Montserrat}.mdc-card:after{position:absolute;top:0;left:0;width:100%;height:100%;border:solid 1px transparent;content:\"\";display:block;pointer-events:none;box-sizing:border-box;border-radius:5px}.mdc-card-outlined{background-color:#f3f3f3;border-radius:5px}.mdc-card-outlined:after{border:none}.mdc-card-filled{background-color:#e3e2e6;border-radius:5px;box-shadow:none}.mdc-card__media{position:relative;box-sizing:border-box;background-repeat:no-repeat;background-position:center;background-size:cover}.mdc-card__media:before{display:block;content:\"\"}.mdc-card__media:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.mdc-card__media:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.mdc-card-actions{display:flex;flex-direction:row;align-items:center;box-sizing:border-box;min-height:52px}.mdc-card-title{line-height:1.75rem;font-size:1.375rem;letter-spacing:0;font-weight:700}.mdc-card-subtitle{color:#201a1b;line-height:1.5rem;font-size:1rem;letter-spacing:.009rem;font-weight:500}.mdc-card-title,.mdc-card-subtitle{display:block;margin:0}.mdc-card-avatar~.mdc-card-header-text .mdc-card-title,.mdc-card-avatar~.mdc-card-header-text .mdc-card-subtitle{padding:16px 16px 0}.mdc-card-content{display:block}.mdc-card-title-group{display:flex;justify-content:space-between;width:100%}.mdc-card-avatar{height:40px;width:40px;border-radius:50%;flex-shrink:0;margin-bottom:16px;object-fit:cover}.mdc-card-avatar~.mdc-card-header-text .mdc-card-subtitle,.mdc-card-avatar~.mdc-card-header-text .mdc-card-title{line-height:normal}.mdc-card-sm-image{width:80px;height:80px}.mdc-card-md-image{width:112px;height:112px}.mdc-card-lg-image{width:152px;height:152px}.mdc-card-xl-image{width:240px;height:240px}.mdc-card-subtitle~.mdc-card-title,.mdc-card-title~.mdc-card-subtitle,.mdc-card-header .mdc-card-header-text .mdc-card-title,.mdc-card-header .mdc-card-header-text .mdc-card-subtitle,.mdc-card-title-group .mdc-card-title,.mdc-card-title-group .mdc-card-subtitle{padding-top:0}.mdc-card-content>:last-child:not(.mdc-card-footer){margin-bottom:0}.mdc-card-actions-align-end{justify-content:flex-end}\n"] }]
4464
4464
  }], ctorParameters: () => [], propDecorators: { appearance: [{
4465
4465
  type: Input
4466
4466
  }] } });
@@ -14446,9 +14446,1040 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.6", ngImpor
14446
14446
  }]
14447
14447
  }] });
14448
14448
 
14449
+ /**
14450
+ * Directive for cell template in view mode.
14451
+ *
14452
+ * @example
14453
+ * ```html
14454
+ * <ng-template mdCardsGridCellTemplate let-value="value" let-row="row">
14455
+ * <span>{{value}}</span>
14456
+ * </ng-template>
14457
+ * ```
14458
+ */
14459
+ class MDCardsGridCellTemplateDirective {
14460
+ static ngTemplateContextGuard(dir, ctx) {
14461
+ return true;
14462
+ }
14463
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.6", ngImport: i0, type: MDCardsGridCellTemplateDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
14464
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.6", type: MDCardsGridCellTemplateDirective, isStandalone: true, selector: "[mdCardsGridCellTemplate]", ngImport: i0 });
14465
+ }
14466
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.6", ngImport: i0, type: MDCardsGridCellTemplateDirective, decorators: [{
14467
+ type: Directive,
14468
+ args: [{
14469
+ selector: '[mdCardsGridCellTemplate]',
14470
+ standalone: true,
14471
+ }]
14472
+ }] });
14473
+ /**
14474
+ * Directive for header template.
14475
+ *
14476
+ * @example
14477
+ * ```html
14478
+ * <ng-template mdCardsGridHeaderTemplate let-column="column" let-sortFn="sortFn">
14479
+ * <span (click)="sortFn()">{{column.name}}</span>
14480
+ * </ng-template>
14481
+ * ```
14482
+ */
14483
+ class MDCardsGridHeaderTemplateDirective {
14484
+ static ngTemplateContextGuard(dir, ctx) {
14485
+ return true;
14486
+ }
14487
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.6", ngImport: i0, type: MDCardsGridHeaderTemplateDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
14488
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.6", type: MDCardsGridHeaderTemplateDirective, isStandalone: true, selector: "[mdCardsGridHeaderTemplate]", ngImport: i0 });
14489
+ }
14490
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.6", ngImport: i0, type: MDCardsGridHeaderTemplateDirective, decorators: [{
14491
+ type: Directive,
14492
+ args: [{
14493
+ selector: '[mdCardsGridHeaderTemplate]',
14494
+ standalone: true,
14495
+ }]
14496
+ }] });
14497
+ /**
14498
+ * Directive for edit mode template.
14499
+ *
14500
+ * @example
14501
+ * ```html
14502
+ * <ng-template mdCardsGridEditTemplate let-row="row" let-saveFn="saveFn" let-cancelFn="cancelFn">
14503
+ * <input [(ngModel)]="row.name" />
14504
+ * </ng-template>
14505
+ * ```
14506
+ */
14507
+ class MDCardsGridEditTemplateDirective {
14508
+ static ngTemplateContextGuard(dir, ctx) {
14509
+ return true;
14510
+ }
14511
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.6", ngImport: i0, type: MDCardsGridEditTemplateDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
14512
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.6", type: MDCardsGridEditTemplateDirective, isStandalone: true, selector: "[mdCardsGridEditTemplate]", ngImport: i0 });
14513
+ }
14514
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.6", ngImport: i0, type: MDCardsGridEditTemplateDirective, decorators: [{
14515
+ type: Directive,
14516
+ args: [{
14517
+ selector: '[mdCardsGridEditTemplate]',
14518
+ standalone: true,
14519
+ }]
14520
+ }] });
14521
+ /**
14522
+ * Column definition directive for md-cards-grid.
14523
+ *
14524
+ * @example
14525
+ * ```html
14526
+ * <md-cards-grid-column name="Name" prop="name" [sortable]="true" [width]="200">
14527
+ * <ng-template mdCardsGridCellTemplate let-value="value">
14528
+ * <span>{{value}}</span>
14529
+ * </ng-template>
14530
+ * <ng-template mdCardsGridEditTemplate let-row="row">
14531
+ * <input [(ngModel)]="row.name" />
14532
+ * </ng-template>
14533
+ * </md-cards-grid-column>
14534
+ * ```
14535
+ */
14536
+ class MDCardsGridColumnDirective {
14537
+ /** Display name for the header */
14538
+ name;
14539
+ /** Property path to get value from row */
14540
+ prop;
14541
+ /** Column width in pixels */
14542
+ width;
14543
+ /** Minimum column width */
14544
+ minWidth;
14545
+ /** Maximum column width */
14546
+ maxWidth;
14547
+ /** Flex grow factor */
14548
+ flexGrow;
14549
+ /** Whether column is sortable */
14550
+ sortable;
14551
+ /** Whether column is resizeable (can be dragged to change width) */
14552
+ resizeable;
14553
+ /** Custom sort comparator */
14554
+ comparator;
14555
+ /** Pipe to transform value */
14556
+ pipe;
14557
+ /** CSS class for header */
14558
+ headerClass;
14559
+ /** CSS class for cell */
14560
+ cellClass;
14561
+ // Cell template via input
14562
+ _cellTemplateInput;
14563
+ // Cell template via content child
14564
+ _cellTemplateQuery;
14565
+ get cellTemplate() {
14566
+ return this._cellTemplateInput || this._cellTemplateQuery;
14567
+ }
14568
+ // Header template via input
14569
+ _headerTemplateInput;
14570
+ // Header template via content child
14571
+ _headerTemplateQuery;
14572
+ get headerTemplate() {
14573
+ return this._headerTemplateInput || this._headerTemplateQuery;
14574
+ }
14575
+ // Edit template via input
14576
+ _editTemplateInput;
14577
+ // Edit template via content child
14578
+ _editTemplateQuery;
14579
+ get editTemplate() {
14580
+ return this._editTemplateInput || this._editTemplateQuery;
14581
+ }
14582
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.6", ngImport: i0, type: MDCardsGridColumnDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
14583
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "20.3.6", type: MDCardsGridColumnDirective, isStandalone: true, selector: "md-cards-grid-column", inputs: { name: "name", prop: "prop", width: ["width", "width", numberAttribute], minWidth: ["minWidth", "minWidth", numberAttribute], maxWidth: ["maxWidth", "maxWidth", numberAttribute], flexGrow: ["flexGrow", "flexGrow", numberAttribute], sortable: ["sortable", "sortable", booleanAttribute], resizeable: ["resizeable", "resizeable", booleanAttribute], comparator: "comparator", pipe: "pipe", headerClass: "headerClass", cellClass: "cellClass", _cellTemplateInput: ["cellTemplate", "_cellTemplateInput"], _headerTemplateInput: ["headerTemplate", "_headerTemplateInput"], _editTemplateInput: ["editTemplate", "_editTemplateInput"] }, queries: [{ propertyName: "_cellTemplateQuery", first: true, predicate: MDCardsGridCellTemplateDirective, descendants: true, read: TemplateRef, static: true }, { propertyName: "_headerTemplateQuery", first: true, predicate: MDCardsGridHeaderTemplateDirective, descendants: true, read: TemplateRef, static: true }, { propertyName: "_editTemplateQuery", first: true, predicate: MDCardsGridEditTemplateDirective, descendants: true, read: TemplateRef, static: true }], ngImport: i0 });
14584
+ }
14585
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.6", ngImport: i0, type: MDCardsGridColumnDirective, decorators: [{
14586
+ type: Directive,
14587
+ args: [{
14588
+ selector: 'md-cards-grid-column',
14589
+ standalone: true,
14590
+ }]
14591
+ }], propDecorators: { name: [{
14592
+ type: Input
14593
+ }], prop: [{
14594
+ type: Input
14595
+ }], width: [{
14596
+ type: Input,
14597
+ args: [{ transform: numberAttribute }]
14598
+ }], minWidth: [{
14599
+ type: Input,
14600
+ args: [{ transform: numberAttribute }]
14601
+ }], maxWidth: [{
14602
+ type: Input,
14603
+ args: [{ transform: numberAttribute }]
14604
+ }], flexGrow: [{
14605
+ type: Input,
14606
+ args: [{ transform: numberAttribute }]
14607
+ }], sortable: [{
14608
+ type: Input,
14609
+ args: [{ transform: booleanAttribute }]
14610
+ }], resizeable: [{
14611
+ type: Input,
14612
+ args: [{ transform: booleanAttribute }]
14613
+ }], comparator: [{
14614
+ type: Input
14615
+ }], pipe: [{
14616
+ type: Input
14617
+ }], headerClass: [{
14618
+ type: Input
14619
+ }], cellClass: [{
14620
+ type: Input
14621
+ }], _cellTemplateInput: [{
14622
+ type: Input,
14623
+ args: ['cellTemplate']
14624
+ }], _cellTemplateQuery: [{
14625
+ type: ContentChild,
14626
+ args: [MDCardsGridCellTemplateDirective, { read: TemplateRef, static: true }]
14627
+ }], _headerTemplateInput: [{
14628
+ type: Input,
14629
+ args: ['headerTemplate']
14630
+ }], _headerTemplateQuery: [{
14631
+ type: ContentChild,
14632
+ args: [MDCardsGridHeaderTemplateDirective, { read: TemplateRef, static: true }]
14633
+ }], _editTemplateInput: [{
14634
+ type: Input,
14635
+ args: ['editTemplate']
14636
+ }], _editTemplateQuery: [{
14637
+ type: ContentChild,
14638
+ args: [MDCardsGridEditTemplateDirective, { read: TemplateRef, static: true }]
14639
+ }] } });
14640
+
14641
+ /**
14642
+ * Sort direction enum
14643
+ */
14644
+ var SortDirection;
14645
+ (function (SortDirection) {
14646
+ SortDirection["asc"] = "asc";
14647
+ SortDirection["desc"] = "desc";
14648
+ })(SortDirection || (SortDirection = {}));
14649
+ /**
14650
+ * Sort type - single or multi column sorting
14651
+ */
14652
+ var SortType;
14653
+ (function (SortType) {
14654
+ SortType["single"] = "single";
14655
+ SortType["multi"] = "multi";
14656
+ })(SortType || (SortType = {}));
14657
+ /**
14658
+ * Overflow mode for the grid when columns exceed container width
14659
+ * - 'scroll': Enable horizontal scrolling (default)
14660
+ * - 'shrink': Shrink columns to fit, respecting minWidth constraints
14661
+ */
14662
+ var OverflowMode;
14663
+ (function (OverflowMode) {
14664
+ OverflowMode["scroll"] = "scroll";
14665
+ OverflowMode["shrink"] = "shrink";
14666
+ })(OverflowMode || (OverflowMode = {}));
14667
+
14668
+ let columnIdCounter = 0;
14669
+ /**
14670
+ * Generate unique column ID
14671
+ */
14672
+ function generateColumnId() {
14673
+ return `cards-grid-col-${columnIdCounter++}`;
14674
+ }
14675
+ /**
14676
+ * Get value from object by property path (supports nested paths like 'user.name')
14677
+ */
14678
+ function getValueByPath(obj, path) {
14679
+ if (!path)
14680
+ return obj;
14681
+ const parts = path.split('.');
14682
+ let value = obj;
14683
+ for (const part of parts) {
14684
+ if (value == null)
14685
+ return undefined;
14686
+ value = value[part];
14687
+ }
14688
+ return value;
14689
+ }
14690
+ /**
14691
+ * Create value getter function for column
14692
+ */
14693
+ function createValueGetter(prop) {
14694
+ if (!prop) {
14695
+ return () => undefined;
14696
+ }
14697
+ return (row) => getValueByPath(row, prop);
14698
+ }
14699
+ /**
14700
+ * Convert column definition to internal format with defaults
14701
+ */
14702
+ function toInternalColumn(column, defaultWidth = 150) {
14703
+ const name = column.name || (column.prop ? formatPropAsName(column.prop) : '');
14704
+ return {
14705
+ ...column,
14706
+ $$id: column.$$id || generateColumnId(),
14707
+ name,
14708
+ width: column.width ?? defaultWidth,
14709
+ $$valueGetter: createValueGetter(column.prop),
14710
+ };
14711
+ }
14712
+ /**
14713
+ * Format property name as display name
14714
+ * e.g., 'firstName' -> 'First Name', 'user_name' -> 'User Name'
14715
+ */
14716
+ function formatPropAsName(prop) {
14717
+ // Handle nested paths - use last part
14718
+ const parts = prop.split('.');
14719
+ const lastPart = parts[parts.length - 1];
14720
+ // Convert camelCase or snake_case to Title Case
14721
+ return lastPart
14722
+ .replace(/_/g, ' ')
14723
+ .replace(/([a-z])([A-Z])/g, '$1 $2')
14724
+ .replace(/\b\w/g, char => char.toUpperCase());
14725
+ }
14726
+ /**
14727
+ * Group rows by a property
14728
+ */
14729
+ function groupRowsByProperty(rows, groupBy) {
14730
+ const groups = new Map();
14731
+ for (const row of rows) {
14732
+ const key = typeof groupBy === 'function'
14733
+ ? groupBy(row)
14734
+ : row[groupBy];
14735
+ if (!groups.has(key)) {
14736
+ groups.set(key, []);
14737
+ }
14738
+ groups.get(key).push(row);
14739
+ }
14740
+ return Array.from(groups.entries()).map(([key, value]) => ({ key, value }));
14741
+ }
14742
+ /**
14743
+ * Sort rows by sort configuration
14744
+ */
14745
+ function sortRows(rows, sorts, columns) {
14746
+ if (!sorts || sorts.length === 0) {
14747
+ return rows;
14748
+ }
14749
+ const sorted = [...rows];
14750
+ sorted.sort((a, b) => {
14751
+ for (const sort of sorts) {
14752
+ const column = columns.find(c => c.prop === sort.prop);
14753
+ if (!column)
14754
+ continue;
14755
+ const valueA = column.$$valueGetter(a);
14756
+ const valueB = column.$$valueGetter(b);
14757
+ let result;
14758
+ if (column.comparator) {
14759
+ result = column.comparator(valueA, valueB, a, b, sort.dir);
14760
+ }
14761
+ else {
14762
+ result = defaultComparator(valueA, valueB);
14763
+ }
14764
+ if (result !== 0) {
14765
+ return sort.dir === SortDirection.desc ? -result : result;
14766
+ }
14767
+ }
14768
+ return 0;
14769
+ });
14770
+ return sorted;
14771
+ }
14772
+ /**
14773
+ * Default comparator for sorting
14774
+ */
14775
+ function defaultComparator(valueA, valueB) {
14776
+ if (valueA == null && valueB == null)
14777
+ return 0;
14778
+ if (valueA == null)
14779
+ return -1;
14780
+ if (valueB == null)
14781
+ return 1;
14782
+ if (typeof valueA === 'string' && typeof valueB === 'string') {
14783
+ return valueA.localeCompare(valueB);
14784
+ }
14785
+ if (valueA < valueB)
14786
+ return -1;
14787
+ if (valueA > valueB)
14788
+ return 1;
14789
+ return 0;
14790
+ }
14791
+ /**
14792
+ * Get next sort direction
14793
+ */
14794
+ function nextSortDirection(currentDir, enableClearing = false) {
14795
+ if (!currentDir) {
14796
+ return SortDirection.asc;
14797
+ }
14798
+ if (currentDir === SortDirection.asc) {
14799
+ return SortDirection.desc;
14800
+ }
14801
+ if (enableClearing) {
14802
+ return undefined;
14803
+ }
14804
+ return SortDirection.asc;
14805
+ }
14806
+ /**
14807
+ * Deep clone an object
14808
+ */
14809
+ function deepClone(obj) {
14810
+ if (obj === null || typeof obj !== 'object') {
14811
+ return obj;
14812
+ }
14813
+ if (Array.isArray(obj)) {
14814
+ return obj.map(item => deepClone(item));
14815
+ }
14816
+ const cloned = {};
14817
+ for (const key in obj) {
14818
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
14819
+ cloned[key] = deepClone(obj[key]);
14820
+ }
14821
+ }
14822
+ return cloned;
14823
+ }
14824
+ /**
14825
+ * Calculate column widths based on container width and column definitions
14826
+ */
14827
+ function calculateColumnWidths(columns, containerWidth) {
14828
+ const totalFixedWidth = columns
14829
+ .filter(c => c.width && !c.flexGrow)
14830
+ .reduce((sum, c) => sum + c.width, 0);
14831
+ const flexColumns = columns.filter(c => c.flexGrow);
14832
+ const totalFlexGrow = flexColumns.reduce((sum, c) => sum + (c.flexGrow || 0), 0);
14833
+ const remainingWidth = Math.max(0, containerWidth - totalFixedWidth);
14834
+ return columns.map(column => {
14835
+ if (column.flexGrow && totalFlexGrow > 0) {
14836
+ const flexWidth = (column.flexGrow / totalFlexGrow) * remainingWidth;
14837
+ let width = Math.floor(flexWidth);
14838
+ if (column.minWidth && width < column.minWidth) {
14839
+ width = column.minWidth;
14840
+ }
14841
+ if (column.maxWidth && width > column.maxWidth) {
14842
+ width = column.maxWidth;
14843
+ }
14844
+ return { ...column, width };
14845
+ }
14846
+ return column;
14847
+ });
14848
+ }
14849
+
14850
+ /**
14851
+ * MD Cards Grid Component
14852
+ *
14853
+ * A horizontal cards grid with table-like header and edit mode support.
14854
+ * Similar API to ngx-datatable but displays data as cards/tiles.
14855
+ *
14856
+ * @example
14857
+ * ```html
14858
+ * <md-cards-grid
14859
+ * [rows]="data"
14860
+ * [groupRowsBy]="'category'"
14861
+ * [(editingRow)]="currentEditingRow"
14862
+ * [sorts]="sorts"
14863
+ * (sort)="onSort($event)"
14864
+ * (rowEditSave)="onSave($event)">
14865
+ *
14866
+ * <md-cards-grid-column name="Name" prop="name" [sortable]="true">
14867
+ * <ng-template mdCardsGridCellTemplate let-value="value">
14868
+ * <span>{{value}}</span>
14869
+ * </ng-template>
14870
+ * <ng-template mdCardsGridEditTemplate let-row="row">
14871
+ * <input [(ngModel)]="row.name" />
14872
+ * </ng-template>
14873
+ * </md-cards-grid-column>
14874
+ *
14875
+ * </md-cards-grid>
14876
+ * ```
14877
+ */
14878
+ class MDCardsGridComponent {
14879
+ _cdr = inject(ChangeDetectorRef);
14880
+ _columnsSubscription;
14881
+ /** Host binding for shrink mode class */
14882
+ get isShrinkMode() {
14883
+ return this.overflowMode === OverflowMode.shrink;
14884
+ }
14885
+ // ═══════════════════════════════════════════════════════════════════════════
14886
+ // DATA INPUTS
14887
+ // ═══════════════════════════════════════════════════════════════════════════
14888
+ /** Data rows to display */
14889
+ rows = [];
14890
+ /** Columns definition (alternative to content projection) */
14891
+ columns = [];
14892
+ /** Property to group rows by */
14893
+ groupRowsBy;
14894
+ /** Custom template for group header */
14895
+ groupHeaderTemplate;
14896
+ /** Custom template for row actions (edit/save/cancel buttons) */
14897
+ rowActionsTemplate;
14898
+ // ═══════════════════════════════════════════════════════════════════════════
14899
+ // DISPLAY OPTIONS
14900
+ // ═══════════════════════════════════════════════════════════════════════════
14901
+ /** Height of the header in pixels (0 = no header) */
14902
+ headerHeight = 46;
14903
+ /** Height of each card/row */
14904
+ cardHeight = 'auto';
14905
+ /** Gap between cards in pixels */
14906
+ gap = 5;
14907
+ /** Default column width */
14908
+ defaultColumnWidth = 150;
14909
+ /** Show row actions column */
14910
+ showRowActions = true;
14911
+ /**
14912
+ * Overflow mode when columns exceed container width:
14913
+ * - 'scroll': Enable horizontal scrolling (default)
14914
+ * - 'shrink': Shrink columns to fit, respecting minWidth constraints
14915
+ */
14916
+ overflowMode = OverflowMode.scroll;
14917
+ // ═══════════════════════════════════════════════════════════════════════════
14918
+ // COLUMN RESIZE
14919
+ // ═══════════════════════════════════════════════════════════════════════════
14920
+ /** Enable column resize by dragging header borders */
14921
+ enableColumnResize = false;
14922
+ /** Default minimum column width when resizing */
14923
+ defaultMinColumnWidth = 50;
14924
+ /** Default maximum column width when resizing */
14925
+ defaultMaxColumnWidth = 500;
14926
+ /** Column resize event */
14927
+ columnResize = new EventEmitter();
14928
+ // ═══════════════════════════════════════════════════════════════════════════
14929
+ // SORTING
14930
+ // ═══════════════════════════════════════════════════════════════════════════
14931
+ /** Current sort configuration */
14932
+ sorts = [];
14933
+ /** Sort type: single or multi */
14934
+ sortType = SortType.single;
14935
+ /** Enable external sorting (don't sort internally) */
14936
+ externalSorting = false;
14937
+ /** Enable clearing sort state (asc -> desc -> none) */
14938
+ enableClearingSortState = false;
14939
+ /** Icon class for ascending sort */
14940
+ sortAscendingIcon;
14941
+ /** Icon class for descending sort */
14942
+ sortDescendingIcon;
14943
+ /** Icon class for unsorted state */
14944
+ sortUnsetIcon;
14945
+ /** Sort event */
14946
+ sort = new EventEmitter();
14947
+ // ═══════════════════════════════════════════════════════════════════════════
14948
+ // PAGINATION
14949
+ // ═══════════════════════════════════════════════════════════════════════════
14950
+ /** Page size (items per page) */
14951
+ limit = 10;
14952
+ /** Current page offset (0-indexed) */
14953
+ offset = 0;
14954
+ /** Total count for external paging */
14955
+ count;
14956
+ /** Enable external paging */
14957
+ externalPaging = false;
14958
+ /** Show footer with pagination */
14959
+ showFooter = true;
14960
+ /** Footer height in pixels */
14961
+ footerHeight = 40;
14962
+ /** Page event */
14963
+ page = new EventEmitter();
14964
+ // ═══════════════════════════════════════════════════════════════════════════
14965
+ // EDIT MODE
14966
+ // ═══════════════════════════════════════════════════════════════════════════
14967
+ /** Currently editing row (two-way binding) */
14968
+ editingRow = null;
14969
+ editingRowChange = new EventEmitter();
14970
+ /** Event when row edit starts */
14971
+ rowEditStart = new EventEmitter();
14972
+ /** Event when row edit is saved */
14973
+ rowEditSave = new EventEmitter();
14974
+ /** Event when row edit is cancelled */
14975
+ rowEditCancel = new EventEmitter();
14976
+ // ═══════════════════════════════════════════════════════════════════════════
14977
+ // INTERNAL STATE
14978
+ // ═══════════════════════════════════════════════════════════════════════════
14979
+ /** Columns from ContentChildren */
14980
+ _columnDirectives;
14981
+ /** Internal columns with defaults applied */
14982
+ _internalColumns = [];
14983
+ /** Processed rows (sorted, paginated) */
14984
+ _displayRows = [];
14985
+ /** Grouped rows (if grouping enabled) */
14986
+ _groupedRows = null;
14987
+ /** Original row data before editing (for cancel) */
14988
+ _originalEditRow = null;
14989
+ /** Editing row copy (mutable) */
14990
+ _editingRowCopy = null;
14991
+ /** Map of editing row index */
14992
+ _editingRowIndex = -1;
14993
+ /** Currently resizing column */
14994
+ _resizingColumn = null;
14995
+ /** Start X position for resize */
14996
+ _resizeStartX = 0;
14997
+ /** Start width for resize */
14998
+ _resizeStartWidth = 0;
14999
+ // ═══════════════════════════════════════════════════════════════════════════
15000
+ // LIFECYCLE
15001
+ // ═══════════════════════════════════════════════════════════════════════════
15002
+ ngAfterContentInit() {
15003
+ this._updateColumns();
15004
+ this._columnsSubscription = this._columnDirectives.changes.subscribe(() => {
15005
+ this._updateColumns();
15006
+ this._cdr.markForCheck();
15007
+ });
15008
+ }
15009
+ ngOnChanges(changes) {
15010
+ if (changes['rows'] || changes['sorts'] || changes['limit'] || changes['offset']) {
15011
+ this._processRows();
15012
+ }
15013
+ if (changes['columns']) {
15014
+ this._updateColumnsFromInput();
15015
+ }
15016
+ if (changes['editingRow']) {
15017
+ this._handleEditingRowChange();
15018
+ }
15019
+ if (changes['groupRowsBy']) {
15020
+ this._processRows();
15021
+ }
15022
+ }
15023
+ ngOnDestroy() {
15024
+ this._columnsSubscription?.unsubscribe();
15025
+ }
15026
+ editRow(rowOrIndex) {
15027
+ const index = typeof rowOrIndex === 'number' ? rowOrIndex : this._displayRows.indexOf(rowOrIndex);
15028
+ const row = typeof rowOrIndex === 'number' ? this._displayRows[rowOrIndex] : rowOrIndex;
15029
+ if (index < 0 || !row)
15030
+ return;
15031
+ // Cancel any current edit
15032
+ if (this._editingRowCopy) {
15033
+ this.cancelEdit();
15034
+ }
15035
+ this._originalEditRow = row;
15036
+ this._editingRowCopy = deepClone(row);
15037
+ this._editingRowIndex = index;
15038
+ this.editingRow = row;
15039
+ this.editingRowChange.emit(row);
15040
+ this.rowEditStart.emit({ row, rowIndex: index });
15041
+ this._cdr.markForCheck();
15042
+ }
15043
+ saveRow(row) {
15044
+ if (!this._editingRowCopy || this._editingRowIndex < 0)
15045
+ return;
15046
+ const savedRow = row || this._editingRowCopy;
15047
+ const originalRow = this._originalEditRow;
15048
+ const rowIndex = this._editingRowIndex;
15049
+ // Update the original row in the rows array
15050
+ const rowsIndex = this.rows.indexOf(originalRow);
15051
+ if (rowsIndex >= 0) {
15052
+ Object.assign(this.rows[rowsIndex], savedRow);
15053
+ }
15054
+ this.rowEditSave.emit({
15055
+ row: savedRow,
15056
+ rowIndex,
15057
+ originalRow,
15058
+ });
15059
+ this._clearEditState();
15060
+ this._processRows();
15061
+ this._cdr.markForCheck();
15062
+ }
15063
+ cancelEdit(row) {
15064
+ if (!this._editingRowCopy)
15065
+ return;
15066
+ this.rowEditCancel.emit({
15067
+ row: this._originalEditRow,
15068
+ rowIndex: this._editingRowIndex,
15069
+ });
15070
+ this._clearEditState();
15071
+ this._cdr.markForCheck();
15072
+ }
15073
+ /**
15074
+ * Check if a row is currently being edited
15075
+ */
15076
+ isEditing(row) {
15077
+ return this._originalEditRow === row;
15078
+ }
15079
+ /**
15080
+ * Get the editing copy of the row (for template use)
15081
+ */
15082
+ getEditingCopy(row) {
15083
+ if (this._originalEditRow === row) {
15084
+ return this._editingRowCopy;
15085
+ }
15086
+ return null;
15087
+ }
15088
+ // ═══════════════════════════════════════════════════════════════════════════
15089
+ // SORTING METHODS
15090
+ // ═══════════════════════════════════════════════════════════════════════════
15091
+ /**
15092
+ * Handle column sort click
15093
+ */
15094
+ onColumnSort(column) {
15095
+ if (!column.sortable)
15096
+ return;
15097
+ const currentSort = this.sorts.find(s => s.prop === column.prop);
15098
+ const currentDir = currentSort?.dir;
15099
+ const newDir = nextSortDirection(currentDir, this.enableClearingSortState);
15100
+ let newSorts;
15101
+ if (this.sortType === SortType.single) {
15102
+ newSorts = newDir ? [{ prop: column.prop, dir: newDir }] : [];
15103
+ }
15104
+ else {
15105
+ newSorts = this.sorts.filter(s => s.prop !== column.prop);
15106
+ if (newDir) {
15107
+ newSorts.push({ prop: column.prop, dir: newDir });
15108
+ }
15109
+ }
15110
+ this.sort.emit({
15111
+ sorts: newSorts,
15112
+ column,
15113
+ prevValue: currentDir,
15114
+ newValue: newDir,
15115
+ });
15116
+ if (!this.externalSorting) {
15117
+ this.sorts = newSorts;
15118
+ this._processRows();
15119
+ }
15120
+ }
15121
+ /**
15122
+ * Get current sort direction for a column
15123
+ */
15124
+ getSortDir(column) {
15125
+ return this.sorts.find(s => s.prop === column.prop)?.dir;
15126
+ }
15127
+ /**
15128
+ * Get sort icon class for a column
15129
+ */
15130
+ getSortClass(column) {
15131
+ if (!column.sortable)
15132
+ return '';
15133
+ const dir = this.getSortDir(column);
15134
+ if (dir === SortDirection.asc) {
15135
+ return this.sortAscendingIcon || 'md-cards-grid-sort-asc';
15136
+ }
15137
+ if (dir === SortDirection.desc) {
15138
+ return this.sortDescendingIcon || 'md-cards-grid-sort-desc';
15139
+ }
15140
+ return ``;
15141
+ }
15142
+ // ═══════════════════════════════════════════════════════════════════════════
15143
+ // COLUMN RESIZE METHODS
15144
+ // ═══════════════════════════════════════════════════════════════════════════
15145
+ /**
15146
+ * Check if a column can be resized
15147
+ */
15148
+ isColumnResizeable(column) {
15149
+ if (!this.enableColumnResize)
15150
+ return false;
15151
+ // If column.resizeable is explicitly set, use that; otherwise default to true when enableColumnResize is on
15152
+ return column.resizeable !== false;
15153
+ }
15154
+ /**
15155
+ * Start column resize on mousedown
15156
+ */
15157
+ onResizeStart(event, column) {
15158
+ if (!this.isColumnResizeable(column))
15159
+ return;
15160
+ event.preventDefault();
15161
+ event.stopPropagation();
15162
+ this._resizingColumn = column;
15163
+ this._resizeStartX = event.clientX;
15164
+ this._resizeStartWidth = column.width;
15165
+ // Add document listeners
15166
+ document.addEventListener('mousemove', this._onResizeMove);
15167
+ document.addEventListener('mouseup', this._onResizeEnd);
15168
+ // Add resizing class to body to prevent text selection
15169
+ document.body.classList.add('md-cards-grid-resizing');
15170
+ }
15171
+ /**
15172
+ * Handle mouse move during resize
15173
+ */
15174
+ _onResizeMove = (event) => {
15175
+ if (!this._resizingColumn)
15176
+ return;
15177
+ const deltaX = event.clientX - this._resizeStartX;
15178
+ let newWidth = this._resizeStartWidth + deltaX;
15179
+ // Apply min/max constraints
15180
+ const minWidth = this._resizingColumn.minWidth ?? this.defaultMinColumnWidth;
15181
+ const maxWidth = this._resizingColumn.maxWidth ?? this.defaultMaxColumnWidth;
15182
+ newWidth = Math.max(minWidth, Math.min(maxWidth, newWidth));
15183
+ // Update column width
15184
+ this._resizingColumn.width = newWidth;
15185
+ this._cdr.markForCheck();
15186
+ };
15187
+ /**
15188
+ * End column resize on mouseup
15189
+ */
15190
+ _onResizeEnd = (event) => {
15191
+ if (!this._resizingColumn)
15192
+ return;
15193
+ // Remove document listeners
15194
+ document.removeEventListener('mousemove', this._onResizeMove);
15195
+ document.removeEventListener('mouseup', this._onResizeEnd);
15196
+ // Remove resizing class
15197
+ document.body.classList.remove('md-cards-grid-resizing');
15198
+ // Emit resize event
15199
+ const prevWidth = this._resizeStartWidth;
15200
+ const newWidth = this._resizingColumn.width;
15201
+ if (prevWidth !== newWidth) {
15202
+ this.columnResize.emit({
15203
+ column: this._resizingColumn,
15204
+ prevWidth,
15205
+ newWidth,
15206
+ });
15207
+ }
15208
+ this._resizingColumn = null;
15209
+ this._cdr.markForCheck();
15210
+ };
15211
+ // ═══════════════════════════════════════════════════════════════════════════
15212
+ // PAGINATION METHODS
15213
+ // ═══════════════════════════════════════════════════════════════════════════
15214
+ /**
15215
+ * Navigate to a page
15216
+ */
15217
+ setPage(offset) {
15218
+ const totalCount = this.count ?? this.rows.length;
15219
+ const maxOffset = Math.max(0, Math.ceil(totalCount / this.limit) - 1);
15220
+ const newOffset = Math.max(0, Math.min(offset, maxOffset));
15221
+ if (newOffset !== this.offset) {
15222
+ this.offset = newOffset;
15223
+ this.page.emit({
15224
+ offset: newOffset,
15225
+ limit: this.limit,
15226
+ count: totalCount,
15227
+ pageSize: this.limit,
15228
+ });
15229
+ if (!this.externalPaging) {
15230
+ this._processRows();
15231
+ }
15232
+ }
15233
+ }
15234
+ /**
15235
+ * Get total pages count
15236
+ */
15237
+ get totalPages() {
15238
+ const totalCount = this.count ?? this.rows.length;
15239
+ return Math.ceil(totalCount / this.limit);
15240
+ }
15241
+ /**
15242
+ * Get current page (1-indexed for display)
15243
+ */
15244
+ get currentPage() {
15245
+ return this.offset + 1;
15246
+ }
15247
+ // ═══════════════════════════════════════════════════════════════════════════
15248
+ // TEMPLATE HELPERS
15249
+ // ═══════════════════════════════════════════════════════════════════════════
15250
+ /**
15251
+ * Get cell value for display
15252
+ */
15253
+ getCellValue(row, column) {
15254
+ const value = column.$$valueGetter(row);
15255
+ if (column.pipe) {
15256
+ return column.pipe.transform(value);
15257
+ }
15258
+ return value;
15259
+ }
15260
+ /**
15261
+ * Get row to use in template (editing copy if editing, otherwise original)
15262
+ */
15263
+ getTemplateRow(row) {
15264
+ if (this._originalEditRow === row && this._editingRowCopy) {
15265
+ return this._editingRowCopy;
15266
+ }
15267
+ return row;
15268
+ }
15269
+ /**
15270
+ * Track by function for rows
15271
+ */
15272
+ trackByRow = (index, row) => {
15273
+ return row;
15274
+ };
15275
+ /**
15276
+ * Track by function for columns
15277
+ */
15278
+ trackByColumn = (index, column) => {
15279
+ return column.$$id;
15280
+ };
15281
+ /**
15282
+ * Track by function for groups
15283
+ */
15284
+ trackByGroup = (index, group) => {
15285
+ return group.key;
15286
+ };
15287
+ // ═══════════════════════════════════════════════════════════════════════════
15288
+ // PRIVATE METHODS
15289
+ // ═══════════════════════════════════════════════════════════════════════════
15290
+ _updateColumns() {
15291
+ if (this._columnDirectives && this._columnDirectives.length > 0) {
15292
+ this._internalColumns = this._columnDirectives.map(col => toInternalColumn(col, this.defaultColumnWidth));
15293
+ }
15294
+ else if (this.columns.length > 0) {
15295
+ this._updateColumnsFromInput();
15296
+ }
15297
+ this._cdr.markForCheck();
15298
+ }
15299
+ _updateColumnsFromInput() {
15300
+ this._internalColumns = this.columns.map(col => toInternalColumn(col, this.defaultColumnWidth));
15301
+ }
15302
+ _processRows() {
15303
+ let processed = [...this.rows];
15304
+ // Sort (if internal sorting)
15305
+ if (!this.externalSorting && this.sorts.length > 0) {
15306
+ processed = sortRows(processed, this.sorts, this._internalColumns);
15307
+ }
15308
+ // Paginate (if internal paging)
15309
+ if (!this.externalPaging) {
15310
+ const start = this.offset * this.limit;
15311
+ const end = start + this.limit;
15312
+ processed = processed.slice(start, end);
15313
+ }
15314
+ this._displayRows = processed;
15315
+ // Group if needed
15316
+ if (this.groupRowsBy) {
15317
+ this._groupedRows = groupRowsByProperty(this._displayRows, this.groupRowsBy);
15318
+ }
15319
+ else {
15320
+ this._groupedRows = null;
15321
+ }
15322
+ this._cdr.markForCheck();
15323
+ }
15324
+ _handleEditingRowChange() {
15325
+ if (this.editingRow && this._originalEditRow !== this.editingRow) {
15326
+ // External change - start editing this row
15327
+ const index = this._displayRows.indexOf(this.editingRow);
15328
+ if (index >= 0) {
15329
+ this._originalEditRow = this.editingRow;
15330
+ this._editingRowCopy = deepClone(this.editingRow);
15331
+ this._editingRowIndex = index;
15332
+ }
15333
+ }
15334
+ else if (!this.editingRow && this._originalEditRow) {
15335
+ // External clear
15336
+ this._clearEditState();
15337
+ }
15338
+ }
15339
+ _clearEditState() {
15340
+ this._originalEditRow = null;
15341
+ this._editingRowCopy = null;
15342
+ this._editingRowIndex = -1;
15343
+ this.editingRow = null;
15344
+ this.editingRowChange.emit(null);
15345
+ }
15346
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.6", ngImport: i0, type: MDCardsGridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
15347
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.6", type: MDCardsGridComponent, isStandalone: true, selector: "md-cards-grid", inputs: { rows: "rows", columns: "columns", groupRowsBy: "groupRowsBy", groupHeaderTemplate: "groupHeaderTemplate", rowActionsTemplate: "rowActionsTemplate", headerHeight: ["headerHeight", "headerHeight", numberAttribute], cardHeight: "cardHeight", gap: ["gap", "gap", numberAttribute], defaultColumnWidth: ["defaultColumnWidth", "defaultColumnWidth", numberAttribute], showRowActions: ["showRowActions", "showRowActions", booleanAttribute], overflowMode: "overflowMode", enableColumnResize: ["enableColumnResize", "enableColumnResize", booleanAttribute], defaultMinColumnWidth: ["defaultMinColumnWidth", "defaultMinColumnWidth", numberAttribute], defaultMaxColumnWidth: ["defaultMaxColumnWidth", "defaultMaxColumnWidth", numberAttribute], sorts: "sorts", sortType: "sortType", externalSorting: ["externalSorting", "externalSorting", booleanAttribute], enableClearingSortState: ["enableClearingSortState", "enableClearingSortState", booleanAttribute], sortAscendingIcon: "sortAscendingIcon", sortDescendingIcon: "sortDescendingIcon", sortUnsetIcon: "sortUnsetIcon", limit: ["limit", "limit", numberAttribute], offset: ["offset", "offset", numberAttribute], count: ["count", "count", numberAttribute], externalPaging: ["externalPaging", "externalPaging", booleanAttribute], showFooter: ["showFooter", "showFooter", booleanAttribute], footerHeight: ["footerHeight", "footerHeight", numberAttribute], editingRow: "editingRow" }, outputs: { columnResize: "columnResize", sort: "sort", page: "page", editingRowChange: "editingRowChange", rowEditStart: "rowEditStart", rowEditSave: "rowEditSave", rowEditCancel: "rowEditCancel" }, host: { properties: { "class.md-cards-grid-shrink-mode": "this.isShrinkMode" }, classAttribute: "md-cards-grid" }, queries: [{ propertyName: "_columnDirectives", predicate: MDCardsGridColumnDirective }], exportAs: ["mdCardsGrid"], usesOnChanges: true, ngImport: i0, template: "<!-- Scrollable container for header and body -->\r\n<div class=\"md-cards-grid-scroll-container\">\r\n<!-- Header -->\r\n@if (headerHeight > 0) {\r\n<div\r\n class=\"md-cards-grid-header\"\r\n role=\"row\"\r\n [style.height.px]=\"headerHeight\"\r\n>\r\n <div class=\"md-cards-grid-header-inner\">\r\n @for (column of _internalColumns; track trackByColumn($index, column)) {\r\n <div\r\n class=\"md-cards-grid-header-cell\"\r\n role=\"columnheader\"\r\n [class.sortable]=\"column.sortable\"\r\n [class.resizeable]=\"isColumnResizeable(column)\"\r\n [class.sort-active]=\"getSortDir(column)\"\r\n [class.sort-asc]=\"getSortDir(column) === 'asc'\"\r\n [class.sort-desc]=\"getSortDir(column) === 'desc'\"\r\n [style.width.px]=\"column.width\"\r\n [style.min-width.px]=\"column.minWidth\"\r\n [style.max-width.px]=\"column.maxWidth\"\r\n [style.flex-grow]=\"column.flexGrow\"\r\n [attr.title]=\"column.name\"\r\n (click)=\"onColumnSort(column)\"\r\n (keydown.enter)=\"onColumnSort(column)\"\r\n [attr.tabindex]=\"column.sortable ? 0 : -1\"\r\n >\r\n <!-- Custom header template -->\r\n @if (column.headerTemplate) {\r\n <ng-template\r\n [ngTemplateOutlet]=\"column.headerTemplate\"\r\n [ngTemplateOutletContext]=\"{\r\n column: column,\r\n sortDir: getSortDir(column),\r\n sortFn: onColumnSort.bind(this, column)\r\n }\"\r\n />\r\n } @else {\r\n <!-- Default header -->\r\n <span class=\"md-cards-grid-header-cell-label\">{{ column.name }}</span>\r\n @if (column.sortable) {\r\n <span class=\"md-cards-grid-sort-icon\" [ngClass]=\"getSortClass(column)\"></span>\r\n }\r\n }\r\n\r\n <!-- Resize handle -->\r\n @if (isColumnResizeable(column)) {\r\n <span\r\n class=\"md-cards-grid-resize-handle\"\r\n (mousedown)=\"onResizeStart($event, column)\"\r\n ></span>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Actions header cell -->\r\n @if (showRowActions) {\r\n <div class=\"md-cards-grid-header-cell md-cards-grid-actions-cell\">\r\n <span class=\"md-cards-grid-header-cell-label\"></span>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n}\r\n\r\n<!-- Body -->\r\n<div class=\"md-cards-grid-body\" [style.gap.px]=\"gap\">\r\n <!-- Grouped rows -->\r\n @if (_groupedRows) {\r\n @for (group of _groupedRows; track trackByGroup($index, group)) {\r\n <div class=\"md-cards-grid-group\">\r\n <!-- Group header -->\r\n <div class=\"md-cards-grid-group-header\">\r\n @if (groupHeaderTemplate) {\r\n <ng-template\r\n [ngTemplateOutlet]=\"groupHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"{ group: group }\"\r\n />\r\n } @else {\r\n <span class=\"md-cards-grid-group-title\">{{ group.key }}</span>\r\n }\r\n </div>\r\n\r\n <!-- Group rows -->\r\n <div class=\"md-cards-grid-group-rows\" [style.gap.px]=\"gap\">\r\n @for (row of group.value; track trackByRow($index, row); let rowIndex = $index) {\r\n <ng-container\r\n *ngTemplateOutlet=\"rowTemplate; context: { row: row, rowIndex: rowIndex, group: group.key }\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n }\r\n } @else {\r\n <!-- Non-grouped rows -->\r\n @for (row of _displayRows; track trackByRow($index, row); let rowIndex = $index) {\r\n <ng-container\r\n *ngTemplateOutlet=\"rowTemplate; context: { row: row, rowIndex: rowIndex, group: null }\"\r\n />\r\n }\r\n }\r\n</div>\r\n</div><!-- End scroll container -->\r\n\r\n<!-- Row template -->\r\n<ng-template #rowTemplate let-row=\"row\" let-rowIndex=\"rowIndex\" let-group=\"group\">\r\n <div\r\n class=\"md-cards-grid-card\"\r\n [class.md-cards-grid-card-editing]=\"isEditing(row)\"\r\n [class.md-cards-grid-card-fixed-height]=\"cardHeight !== 'auto'\"\r\n [style.height]=\"cardHeight === 'auto' ? null : cardHeight + 'px'\"\r\n role=\"row\"\r\n >\r\n @for (column of _internalColumns; track trackByColumn($index, column)) {\r\n <div\r\n class=\"md-cards-grid-cell\"\r\n [style.width.px]=\"column.width\"\r\n [style.min-width.px]=\"column.minWidth\"\r\n [style.max-width.px]=\"column.maxWidth\"\r\n [style.flex-grow]=\"column.flexGrow\"\r\n role=\"cell\"\r\n >\r\n <!-- Edit mode -->\r\n @if (isEditing(row) && column.editTemplate) {\r\n <ng-template\r\n [ngTemplateOutlet]=\"column.editTemplate\"\r\n [ngTemplateOutletContext]=\"{\r\n row: getTemplateRow(row),\r\n originalRow: row,\r\n value: getCellValue(getTemplateRow(row), column),\r\n column: column,\r\n rowIndex: rowIndex,\r\n saveFn: saveRow.bind(this),\r\n cancelFn: cancelEdit.bind(this)\r\n }\"\r\n />\r\n }\r\n <!-- View mode with custom template -->\r\n @else if (column.cellTemplate) {\r\n <ng-template\r\n [ngTemplateOutlet]=\"column.cellTemplate\"\r\n [ngTemplateOutletContext]=\"{\r\n row: row,\r\n value: getCellValue(row, column),\r\n column: column,\r\n rowIndex: rowIndex,\r\n isEditing: isEditing(row),\r\n group: group\r\n }\"\r\n />\r\n }\r\n <!-- Default view mode -->\r\n @else {\r\n <span class=\"md-cards-grid-cell-value\">{{ getCellValue(row, column) }}</span>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Row actions -->\r\n @if (showRowActions) {\r\n <div class=\"md-cards-grid-cell md-cards-grid-actions-cell\">\r\n @if (rowActionsTemplate) {\r\n <ng-template\r\n [ngTemplateOutlet]=\"rowActionsTemplate\"\r\n [ngTemplateOutletContext]=\"{\r\n row: row,\r\n rowIndex: rowIndex,\r\n isEditing: isEditing(row),\r\n editFn: editRow.bind(this, row),\r\n saveFn: saveRow.bind(this),\r\n cancelFn: cancelEdit.bind(this)\r\n }\"\r\n />\r\n } @else {\r\n <!-- Default actions -->\r\n @if (isEditing(row)) {\r\n <button\r\n type=\"button\"\r\n class=\"md-cards-grid-action-btn md-cards-grid-action-save\"\r\n (click)=\"saveRow()\"\r\n title=\"Save\"\r\n >\r\n <span class=\"md-cards-grid-icon-save\"></span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"md-cards-grid-action-btn md-cards-grid-action-cancel\"\r\n (click)=\"cancelEdit()\"\r\n title=\"Cancel\"\r\n >\r\n <span class=\"md-cards-grid-icon-cancel\"></span>\r\n </button>\r\n } @else {\r\n <button\r\n type=\"button\"\r\n class=\"md-cards-grid-action-btn md-cards-grid-action-edit\"\r\n (click)=\"editRow(row)\"\r\n title=\"Edit\"\r\n >\r\n <span class=\"md-cards-grid-icon-edit\"></span>\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Footer / Pagination -->\r\n@if (showFooter && totalPages > 1) {\r\n<div\r\n class=\"md-cards-grid-footer\"\r\n [style.height.px]=\"footerHeight\"\r\n>\r\n <div class=\"md-cards-grid-pager\">\r\n <button\r\n type=\"button\"\r\n class=\"md-cards-grid-pager-btn\"\r\n [disabled]=\"offset === 0\"\r\n (click)=\"setPage(0)\"\r\n title=\"First page\"\r\n >\r\n <span class=\"md-cards-grid-icon-first\"></span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"md-cards-grid-pager-btn\"\r\n [disabled]=\"offset === 0\"\r\n (click)=\"setPage(offset - 1)\"\r\n title=\"Previous page\"\r\n >\r\n <span class=\"md-cards-grid-icon-prev\"></span>\r\n </button>\r\n\r\n <span class=\"md-cards-grid-pager-info\">\r\n {{ currentPage }} / {{ totalPages }}\r\n </span>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"md-cards-grid-pager-btn\"\r\n [disabled]=\"offset >= totalPages - 1\"\r\n (click)=\"setPage(offset + 1)\"\r\n title=\"Next page\"\r\n >\r\n <span class=\"md-cards-grid-icon-next\"></span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"md-cards-grid-pager-btn\"\r\n [disabled]=\"offset >= totalPages - 1\"\r\n (click)=\"setPage(totalPages - 1)\"\r\n title=\"Last page\"\r\n >\r\n <span class=\"md-cards-grid-icon-last\"></span>\r\n </button>\r\n </div>\r\n</div>\r\n}\r\n", styles: ["div.jqxInGridLink{cursor:pointer;color:#00f;margin:2px;text-decoration:underline}div.jqxInGridLink :hover{color:#8a2be2}.pink-text{color:pink!important}.red-text{color:red!important}.turquoise-text{color:#03a796!important}.blue-text{color:#00f!important}.md-cards-grid{display:block;width:100%;font-family:Open Sans,Arial,sans-serif;font-size:13px;background:transparent;border:0;border-radius:0}.md-cards-grid *,.md-cards-grid *:before,.md-cards-grid *:after{box-sizing:border-box}.md-cards-grid-scroll-container{width:100%;overflow-x:auto;overflow-y:hidden}.md-cards-grid-scroll-container::-webkit-scrollbar{height:6px}.md-cards-grid-scroll-container::-webkit-scrollbar-track{background:#f3f3f3;border-radius:3px}.md-cards-grid-scroll-container::-webkit-scrollbar-thumb{background:#929292;border-radius:3px}.md-cards-grid-scroll-container::-webkit-scrollbar-thumb:hover{background:#4d4d4d}.md-cards-grid-shrink-mode .md-cards-grid-scroll-container{overflow-x:hidden}.md-cards-grid-shrink-mode .md-cards-grid-header-inner,.md-cards-grid-shrink-mode .md-cards-grid-card{min-width:0}.md-cards-grid-shrink-mode .md-cards-grid-header-cell,.md-cards-grid-shrink-mode .md-cards-grid-cell{flex-shrink:1}.md-cards-grid-header{display:block;background:transparent;margin:0;padding:0;border:0}.md-cards-grid-header-inner{display:flex;align-items:center;height:100%;min-width:fit-content}.md-cards-grid-header-cell{display:flex;align-items:center;flex-shrink:0;height:100%;padding:14px 16px;background:#fff;font-family:Montserrat,Arial,sans-serif;font-size:14px;font-weight:300;color:#4d4d4d;text-transform:uppercase;letter-spacing:.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-user-select:none;user-select:none}.md-cards-grid-header-cell:not(:first-child){border-left:2px solid #EAEAEA}.md-cards-grid-header-cell.sortable{cursor:pointer;transition:background-color .2s ease}.md-cards-grid-header-cell.sortable:hover{background:#f3f3f3}.md-cards-grid-header-cell.sortable:focus{outline:0;outline-offset:0}.md-cards-grid-header-cell.sort-active{color:#0185cf}.md-cards-grid-header-cell.resizeable{position:relative}.md-cards-grid-header-cell-label{flex:1;overflow:hidden;text-overflow:ellipsis}.md-cards-grid-sort-icon{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;margin-left:2px;color:#929292;transition:color .2s ease}.md-cards-grid-sort-icon:before{font-family:datatable;font-size:12px}.md-cards-grid-sort-icon.md-cards-grid-sort-asc,.md-cards-grid-sort-icon.md-cards-grid-sort-desc{color:#6d5cae}.md-cards-grid-sort-icon.md-cards-grid-sort-asc:after,.md-cards-grid-sort-icon.md-cards-grid-sort-desc:after{content:\"\";display:block;width:0;height:0;border-left:4px solid transparent;border-right:4px solid transparent}.md-cards-grid-sort-icon.md-cards-grid-sort-asc:after{border-bottom:5px solid currentColor}.md-cards-grid-sort-icon.md-cards-grid-sort-desc:after{border-top:5px solid currentColor}.md-cards-grid-resize-handle{position:absolute;top:0;right:-8px;bottom:0;width:10px;cursor:col-resize;z-index:1}.md-cards-grid-resize-handle:after{content:\"\";position:absolute;top:25%;right:2px;bottom:25%;width:3px;background:transparent;border-radius:1px;transition:background-color .2s ease}.md-cards-grid-resize-handle:hover:after{background:#6d5cae}.md-cards-grid-header-cell:last-of-type:not(.md-cards-grid-actions-cell) .md-cards-grid-resize-handle{right:0}.md-cards-grid-header-cell:has(+.md-cards-grid-actions-cell) .md-cards-grid-resize-handle{right:0}body.md-cards-grid-resizing{cursor:col-resize!important;-webkit-user-select:none!important;user-select:none!important}body.md-cards-grid-resizing *{cursor:col-resize!important}.md-cards-grid-body{display:flex;flex-direction:column;padding:12px 0 0;width:fit-content;min-width:fit-content;background:transparent}.md-cards-grid-group{margin-bottom:12px}.md-cards-grid-group:last-child{margin-bottom:0}.md-cards-grid-group-header{display:flex;align-items:center;padding:10px 14px;margin-bottom:12px;background:#eaeaea;border-radius:0;font-size:13px;font-weight:600;color:#000}.md-cards-grid-group-title{flex:1}.md-cards-grid-group-rows{display:flex;flex-direction:column;width:fit-content;gap:5px}.md-cards-grid-card{display:inline-flex;align-items:stretch;width:fit-content;min-width:fit-content;background:#fff;border:0;border-radius:0;box-shadow:none;transition:all .2s ease}.md-cards-grid-card:hover{background:#fbfbfb;box-shadow:0 2px 8px #0000001f;transform:translateY(-1px)}.md-cards-grid-card.md-cards-grid-card-editing{background:#cf01061a;border:0;box-shadow:none}.md-cards-grid-card.md-cards-grid-card-fixed-height,.md-cards-grid-card.md-cards-grid-card-fixed-height .md-cards-grid-cell{overflow:hidden}.md-cards-grid-card.md-cards-grid-card-fixed-height .md-cards-grid-cell-value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.md-cards-grid-cell{display:flex;align-items:center;flex-shrink:0;padding:14px 16px;font-size:14px;color:#000;border:0;overflow:hidden;min-width:0}.md-cards-grid-cell:last-child{border-right:none}.md-cards-grid-cell-value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;line-height:1.4}.md-cards-grid-actions-cell{display:flex;align-items:center;justify-content:flex-end;gap:6px;min-width:90px;width:auto!important;flex-grow:0!important;flex-shrink:0!important;padding:inherit;border:0}.md-cards-grid-header-cell.md-cards-grid-actions-cell{border-left:none;border-right:none}.md-cards-grid-action-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:none;border-radius:4px;background:transparent;color:#4d4d4d;cursor:pointer;transition:all .2s ease}.md-cards-grid-action-btn:hover{transform:scale(1.1)}.md-cards-grid-action-btn:focus{outline:2px solid #6d5cae;outline-offset:1px}.md-cards-grid-action-btn:active{transform:scale(.95)}.md-cards-grid-action-edit{color:#6d5cae}.md-cards-grid-action-edit:hover{background:#e9e7f3;color:#564790}.md-cards-grid-action-save{color:#28b446}.md-cards-grid-action-save:hover{background:#dff4e3;color:#1f8a36}.md-cards-grid-action-cancel{color:#cf0106}.md-cards-grid-action-cancel:hover{background:#f8d9da;color:#9c0105}.md-cards-grid-icon-edit,.md-cards-grid-icon-save,.md-cards-grid-icon-cancel{display:inline-block;width:18px;height:18px;position:relative}.md-cards-grid-icon-edit:before,.md-cards-grid-icon-edit:after{content:\"\";position:absolute}.md-cards-grid-icon-edit:before{width:10px;height:10px;border:2px solid currentColor;border-radius:1px;transform:rotate(45deg);top:1px;left:1px}.md-cards-grid-icon-edit:after{width:0;height:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:5px solid currentColor;bottom:0;left:0;transform:rotate(-45deg)}.md-cards-grid-icon-save:before{content:\"\";position:absolute;width:6px;height:10px;border-right:2px solid currentColor;border-bottom:2px solid currentColor;transform:rotate(45deg);top:1px;left:5px}.md-cards-grid-icon-cancel:before,.md-cards-grid-icon-cancel:after{content:\"\";position:absolute;width:14px;height:2px;background:currentColor;top:50%;left:50%}.md-cards-grid-icon-cancel:before{transform:translate(-50%,-50%) rotate(45deg)}.md-cards-grid-icon-cancel:after{transform:translate(-50%,-50%) rotate(-45deg)}.md-cards-grid-footer{display:flex;align-items:center;justify-content:flex-end;padding:12px 0 0;background:transparent;border-top:0;font-size:12px;color:#4d4d4d}.md-cards-grid-pager{display:flex;align-items:center;gap:4px}.md-cards-grid-pager-btn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:1px solid #EAEAEA;border-radius:4px;background:#fff;color:#4d4d4d;cursor:pointer;transition:background-color .15s ease,border-color .15s ease}.md-cards-grid-pager-btn:hover:not(:disabled){background:#f3f3f3;border-color:#929292}.md-cards-grid-pager-btn:disabled{opacity:.4;cursor:not-allowed}.md-cards-grid-pager-btn:focus{outline:2px solid #6d5cae;outline-offset:1px}.md-cards-grid-pager-info{padding:0 12px;font-weight:500}.md-cards-grid-icon-first,.md-cards-grid-icon-prev,.md-cards-grid-icon-next,.md-cards-grid-icon-last{display:inline-block;width:12px;height:12px;position:relative}.md-cards-grid-icon-first:before,.md-cards-grid-icon-prev:before,.md-cards-grid-icon-next:before,.md-cards-grid-icon-last:before{content:\"\";position:absolute;width:6px;height:6px;border-right:2px solid currentColor;border-bottom:2px solid currentColor;top:50%;left:50%}.md-cards-grid-icon-prev:before{transform:translate(-25%,-50%) rotate(135deg)}.md-cards-grid-icon-next:before{transform:translate(-75%,-50%) rotate(-45deg)}.md-cards-grid-icon-first:before{transform:translate(-10%,-50%) rotate(135deg)}.md-cards-grid-icon-first:after{content:\"\";position:absolute;width:2px;height:10px;background:currentColor;top:50%;left:2px;transform:translateY(-50%)}.md-cards-grid-icon-last:before{transform:translate(-90%,-50%) rotate(-45deg)}.md-cards-grid-icon-last:after{content:\"\";position:absolute;width:2px;height:10px;background:currentColor;top:50%;right:2px;transform:translateY(-50%)}@media (max-width: 767px){.md-cards-grid{font-size:12px}.md-cards-grid-header{display:none}.md-cards-grid-body{padding:8px}.md-cards-grid-card{flex-direction:column}.md-cards-grid-cell{padding:10px 12px;border-right:none;border-bottom:1px solid #EAEAEA}.md-cards-grid-cell:last-child{border-bottom:none}.md-cards-grid-actions-cell{border-left:none;border-top:1px solid #EAEAEA;justify-content:center;background:#f3f3f3}.md-cards-grid-footer{flex-direction:column;gap:10px;padding:12px}}.md-cards-grid.grey .md-cards-grid-header-cell,.md-cards-grid.grey .md-cards-grid-card{background:#f3f3f3}.md-cards-grid.grey .md-cards-grid-card:hover{background:#efefef}.md-cards-grid.grey .md-cards-grid-card.md-cards-grid-card-editing{background:#cf01061a}.md-cards-grid.zebra .md-cards-grid-card:nth-child(odd){background:#fff}.md-cards-grid.zebra .md-cards-grid-card:nth-child(2n){background:#f3f3f3}.md-cards-grid.zebra .md-cards-grid-card:hover{background:#e4e4e4}.md-cards-grid.zebra .md-cards-grid-card.md-cards-grid-card-editing{background:#cf01061a}.md-cards-grid.zebra .md-cards-grid-group-rows .md-cards-grid-card:nth-child(odd){background:#fff}.md-cards-grid.zebra .md-cards-grid-group-rows .md-cards-grid-card:nth-child(2n){background:#f3f3f3}.md-cards-grid.zebra .md-cards-grid-group-rows .md-cards-grid-card:hover{background:#e4e4e4}.md-cards-grid.zebra .md-cards-grid-group-rows .md-cards-grid-card.md-cards-grid-card-editing{background:#cf01061a}.md-cards-grid.zebra.grey .md-cards-grid-card:nth-child(odd){background:#f3f3f3}.md-cards-grid.zebra.grey .md-cards-grid-card:nth-child(2n){background:#efefef}.md-cards-grid.zebra.grey .md-cards-grid-card:hover{background:#d6d6d6}.md-cards-grid.zebra.grey .md-cards-grid-card.md-cards-grid-card-editing{background:#cf01061a}.md-cards-grid.zebra.grey .md-cards-grid-group-rows .md-cards-grid-card:nth-child(odd){background:#f3f3f3}.md-cards-grid.zebra.grey .md-cards-grid-group-rows .md-cards-grid-card:nth-child(2n){background:#efefef}.md-cards-grid.zebra.grey .md-cards-grid-group-rows .md-cards-grid-card:hover{background:#d6d6d6}.md-cards-grid.zebra.grey .md-cards-grid-group-rows .md-cards-grid-card.md-cards-grid-card-editing{background:#cf01061a}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
15348
+ }
15349
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.6", ngImport: i0, type: MDCardsGridComponent, decorators: [{
15350
+ type: Component,
15351
+ args: [{ selector: 'md-cards-grid', host: {
15352
+ class: 'md-cards-grid',
15353
+ }, exportAs: 'mdCardsGrid', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule], template: "<!-- Scrollable container for header and body -->\r\n<div class=\"md-cards-grid-scroll-container\">\r\n<!-- Header -->\r\n@if (headerHeight > 0) {\r\n<div\r\n class=\"md-cards-grid-header\"\r\n role=\"row\"\r\n [style.height.px]=\"headerHeight\"\r\n>\r\n <div class=\"md-cards-grid-header-inner\">\r\n @for (column of _internalColumns; track trackByColumn($index, column)) {\r\n <div\r\n class=\"md-cards-grid-header-cell\"\r\n role=\"columnheader\"\r\n [class.sortable]=\"column.sortable\"\r\n [class.resizeable]=\"isColumnResizeable(column)\"\r\n [class.sort-active]=\"getSortDir(column)\"\r\n [class.sort-asc]=\"getSortDir(column) === 'asc'\"\r\n [class.sort-desc]=\"getSortDir(column) === 'desc'\"\r\n [style.width.px]=\"column.width\"\r\n [style.min-width.px]=\"column.minWidth\"\r\n [style.max-width.px]=\"column.maxWidth\"\r\n [style.flex-grow]=\"column.flexGrow\"\r\n [attr.title]=\"column.name\"\r\n (click)=\"onColumnSort(column)\"\r\n (keydown.enter)=\"onColumnSort(column)\"\r\n [attr.tabindex]=\"column.sortable ? 0 : -1\"\r\n >\r\n <!-- Custom header template -->\r\n @if (column.headerTemplate) {\r\n <ng-template\r\n [ngTemplateOutlet]=\"column.headerTemplate\"\r\n [ngTemplateOutletContext]=\"{\r\n column: column,\r\n sortDir: getSortDir(column),\r\n sortFn: onColumnSort.bind(this, column)\r\n }\"\r\n />\r\n } @else {\r\n <!-- Default header -->\r\n <span class=\"md-cards-grid-header-cell-label\">{{ column.name }}</span>\r\n @if (column.sortable) {\r\n <span class=\"md-cards-grid-sort-icon\" [ngClass]=\"getSortClass(column)\"></span>\r\n }\r\n }\r\n\r\n <!-- Resize handle -->\r\n @if (isColumnResizeable(column)) {\r\n <span\r\n class=\"md-cards-grid-resize-handle\"\r\n (mousedown)=\"onResizeStart($event, column)\"\r\n ></span>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Actions header cell -->\r\n @if (showRowActions) {\r\n <div class=\"md-cards-grid-header-cell md-cards-grid-actions-cell\">\r\n <span class=\"md-cards-grid-header-cell-label\"></span>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n}\r\n\r\n<!-- Body -->\r\n<div class=\"md-cards-grid-body\" [style.gap.px]=\"gap\">\r\n <!-- Grouped rows -->\r\n @if (_groupedRows) {\r\n @for (group of _groupedRows; track trackByGroup($index, group)) {\r\n <div class=\"md-cards-grid-group\">\r\n <!-- Group header -->\r\n <div class=\"md-cards-grid-group-header\">\r\n @if (groupHeaderTemplate) {\r\n <ng-template\r\n [ngTemplateOutlet]=\"groupHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"{ group: group }\"\r\n />\r\n } @else {\r\n <span class=\"md-cards-grid-group-title\">{{ group.key }}</span>\r\n }\r\n </div>\r\n\r\n <!-- Group rows -->\r\n <div class=\"md-cards-grid-group-rows\" [style.gap.px]=\"gap\">\r\n @for (row of group.value; track trackByRow($index, row); let rowIndex = $index) {\r\n <ng-container\r\n *ngTemplateOutlet=\"rowTemplate; context: { row: row, rowIndex: rowIndex, group: group.key }\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n }\r\n } @else {\r\n <!-- Non-grouped rows -->\r\n @for (row of _displayRows; track trackByRow($index, row); let rowIndex = $index) {\r\n <ng-container\r\n *ngTemplateOutlet=\"rowTemplate; context: { row: row, rowIndex: rowIndex, group: null }\"\r\n />\r\n }\r\n }\r\n</div>\r\n</div><!-- End scroll container -->\r\n\r\n<!-- Row template -->\r\n<ng-template #rowTemplate let-row=\"row\" let-rowIndex=\"rowIndex\" let-group=\"group\">\r\n <div\r\n class=\"md-cards-grid-card\"\r\n [class.md-cards-grid-card-editing]=\"isEditing(row)\"\r\n [class.md-cards-grid-card-fixed-height]=\"cardHeight !== 'auto'\"\r\n [style.height]=\"cardHeight === 'auto' ? null : cardHeight + 'px'\"\r\n role=\"row\"\r\n >\r\n @for (column of _internalColumns; track trackByColumn($index, column)) {\r\n <div\r\n class=\"md-cards-grid-cell\"\r\n [style.width.px]=\"column.width\"\r\n [style.min-width.px]=\"column.minWidth\"\r\n [style.max-width.px]=\"column.maxWidth\"\r\n [style.flex-grow]=\"column.flexGrow\"\r\n role=\"cell\"\r\n >\r\n <!-- Edit mode -->\r\n @if (isEditing(row) && column.editTemplate) {\r\n <ng-template\r\n [ngTemplateOutlet]=\"column.editTemplate\"\r\n [ngTemplateOutletContext]=\"{\r\n row: getTemplateRow(row),\r\n originalRow: row,\r\n value: getCellValue(getTemplateRow(row), column),\r\n column: column,\r\n rowIndex: rowIndex,\r\n saveFn: saveRow.bind(this),\r\n cancelFn: cancelEdit.bind(this)\r\n }\"\r\n />\r\n }\r\n <!-- View mode with custom template -->\r\n @else if (column.cellTemplate) {\r\n <ng-template\r\n [ngTemplateOutlet]=\"column.cellTemplate\"\r\n [ngTemplateOutletContext]=\"{\r\n row: row,\r\n value: getCellValue(row, column),\r\n column: column,\r\n rowIndex: rowIndex,\r\n isEditing: isEditing(row),\r\n group: group\r\n }\"\r\n />\r\n }\r\n <!-- Default view mode -->\r\n @else {\r\n <span class=\"md-cards-grid-cell-value\">{{ getCellValue(row, column) }}</span>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Row actions -->\r\n @if (showRowActions) {\r\n <div class=\"md-cards-grid-cell md-cards-grid-actions-cell\">\r\n @if (rowActionsTemplate) {\r\n <ng-template\r\n [ngTemplateOutlet]=\"rowActionsTemplate\"\r\n [ngTemplateOutletContext]=\"{\r\n row: row,\r\n rowIndex: rowIndex,\r\n isEditing: isEditing(row),\r\n editFn: editRow.bind(this, row),\r\n saveFn: saveRow.bind(this),\r\n cancelFn: cancelEdit.bind(this)\r\n }\"\r\n />\r\n } @else {\r\n <!-- Default actions -->\r\n @if (isEditing(row)) {\r\n <button\r\n type=\"button\"\r\n class=\"md-cards-grid-action-btn md-cards-grid-action-save\"\r\n (click)=\"saveRow()\"\r\n title=\"Save\"\r\n >\r\n <span class=\"md-cards-grid-icon-save\"></span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"md-cards-grid-action-btn md-cards-grid-action-cancel\"\r\n (click)=\"cancelEdit()\"\r\n title=\"Cancel\"\r\n >\r\n <span class=\"md-cards-grid-icon-cancel\"></span>\r\n </button>\r\n } @else {\r\n <button\r\n type=\"button\"\r\n class=\"md-cards-grid-action-btn md-cards-grid-action-edit\"\r\n (click)=\"editRow(row)\"\r\n title=\"Edit\"\r\n >\r\n <span class=\"md-cards-grid-icon-edit\"></span>\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Footer / Pagination -->\r\n@if (showFooter && totalPages > 1) {\r\n<div\r\n class=\"md-cards-grid-footer\"\r\n [style.height.px]=\"footerHeight\"\r\n>\r\n <div class=\"md-cards-grid-pager\">\r\n <button\r\n type=\"button\"\r\n class=\"md-cards-grid-pager-btn\"\r\n [disabled]=\"offset === 0\"\r\n (click)=\"setPage(0)\"\r\n title=\"First page\"\r\n >\r\n <span class=\"md-cards-grid-icon-first\"></span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"md-cards-grid-pager-btn\"\r\n [disabled]=\"offset === 0\"\r\n (click)=\"setPage(offset - 1)\"\r\n title=\"Previous page\"\r\n >\r\n <span class=\"md-cards-grid-icon-prev\"></span>\r\n </button>\r\n\r\n <span class=\"md-cards-grid-pager-info\">\r\n {{ currentPage }} / {{ totalPages }}\r\n </span>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"md-cards-grid-pager-btn\"\r\n [disabled]=\"offset >= totalPages - 1\"\r\n (click)=\"setPage(offset + 1)\"\r\n title=\"Next page\"\r\n >\r\n <span class=\"md-cards-grid-icon-next\"></span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"md-cards-grid-pager-btn\"\r\n [disabled]=\"offset >= totalPages - 1\"\r\n (click)=\"setPage(totalPages - 1)\"\r\n title=\"Last page\"\r\n >\r\n <span class=\"md-cards-grid-icon-last\"></span>\r\n </button>\r\n </div>\r\n</div>\r\n}\r\n", styles: ["div.jqxInGridLink{cursor:pointer;color:#00f;margin:2px;text-decoration:underline}div.jqxInGridLink :hover{color:#8a2be2}.pink-text{color:pink!important}.red-text{color:red!important}.turquoise-text{color:#03a796!important}.blue-text{color:#00f!important}.md-cards-grid{display:block;width:100%;font-family:Open Sans,Arial,sans-serif;font-size:13px;background:transparent;border:0;border-radius:0}.md-cards-grid *,.md-cards-grid *:before,.md-cards-grid *:after{box-sizing:border-box}.md-cards-grid-scroll-container{width:100%;overflow-x:auto;overflow-y:hidden}.md-cards-grid-scroll-container::-webkit-scrollbar{height:6px}.md-cards-grid-scroll-container::-webkit-scrollbar-track{background:#f3f3f3;border-radius:3px}.md-cards-grid-scroll-container::-webkit-scrollbar-thumb{background:#929292;border-radius:3px}.md-cards-grid-scroll-container::-webkit-scrollbar-thumb:hover{background:#4d4d4d}.md-cards-grid-shrink-mode .md-cards-grid-scroll-container{overflow-x:hidden}.md-cards-grid-shrink-mode .md-cards-grid-header-inner,.md-cards-grid-shrink-mode .md-cards-grid-card{min-width:0}.md-cards-grid-shrink-mode .md-cards-grid-header-cell,.md-cards-grid-shrink-mode .md-cards-grid-cell{flex-shrink:1}.md-cards-grid-header{display:block;background:transparent;margin:0;padding:0;border:0}.md-cards-grid-header-inner{display:flex;align-items:center;height:100%;min-width:fit-content}.md-cards-grid-header-cell{display:flex;align-items:center;flex-shrink:0;height:100%;padding:14px 16px;background:#fff;font-family:Montserrat,Arial,sans-serif;font-size:14px;font-weight:300;color:#4d4d4d;text-transform:uppercase;letter-spacing:.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-user-select:none;user-select:none}.md-cards-grid-header-cell:not(:first-child){border-left:2px solid #EAEAEA}.md-cards-grid-header-cell.sortable{cursor:pointer;transition:background-color .2s ease}.md-cards-grid-header-cell.sortable:hover{background:#f3f3f3}.md-cards-grid-header-cell.sortable:focus{outline:0;outline-offset:0}.md-cards-grid-header-cell.sort-active{color:#0185cf}.md-cards-grid-header-cell.resizeable{position:relative}.md-cards-grid-header-cell-label{flex:1;overflow:hidden;text-overflow:ellipsis}.md-cards-grid-sort-icon{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;margin-left:2px;color:#929292;transition:color .2s ease}.md-cards-grid-sort-icon:before{font-family:datatable;font-size:12px}.md-cards-grid-sort-icon.md-cards-grid-sort-asc,.md-cards-grid-sort-icon.md-cards-grid-sort-desc{color:#6d5cae}.md-cards-grid-sort-icon.md-cards-grid-sort-asc:after,.md-cards-grid-sort-icon.md-cards-grid-sort-desc:after{content:\"\";display:block;width:0;height:0;border-left:4px solid transparent;border-right:4px solid transparent}.md-cards-grid-sort-icon.md-cards-grid-sort-asc:after{border-bottom:5px solid currentColor}.md-cards-grid-sort-icon.md-cards-grid-sort-desc:after{border-top:5px solid currentColor}.md-cards-grid-resize-handle{position:absolute;top:0;right:-8px;bottom:0;width:10px;cursor:col-resize;z-index:1}.md-cards-grid-resize-handle:after{content:\"\";position:absolute;top:25%;right:2px;bottom:25%;width:3px;background:transparent;border-radius:1px;transition:background-color .2s ease}.md-cards-grid-resize-handle:hover:after{background:#6d5cae}.md-cards-grid-header-cell:last-of-type:not(.md-cards-grid-actions-cell) .md-cards-grid-resize-handle{right:0}.md-cards-grid-header-cell:has(+.md-cards-grid-actions-cell) .md-cards-grid-resize-handle{right:0}body.md-cards-grid-resizing{cursor:col-resize!important;-webkit-user-select:none!important;user-select:none!important}body.md-cards-grid-resizing *{cursor:col-resize!important}.md-cards-grid-body{display:flex;flex-direction:column;padding:12px 0 0;width:fit-content;min-width:fit-content;background:transparent}.md-cards-grid-group{margin-bottom:12px}.md-cards-grid-group:last-child{margin-bottom:0}.md-cards-grid-group-header{display:flex;align-items:center;padding:10px 14px;margin-bottom:12px;background:#eaeaea;border-radius:0;font-size:13px;font-weight:600;color:#000}.md-cards-grid-group-title{flex:1}.md-cards-grid-group-rows{display:flex;flex-direction:column;width:fit-content;gap:5px}.md-cards-grid-card{display:inline-flex;align-items:stretch;width:fit-content;min-width:fit-content;background:#fff;border:0;border-radius:0;box-shadow:none;transition:all .2s ease}.md-cards-grid-card:hover{background:#fbfbfb;box-shadow:0 2px 8px #0000001f;transform:translateY(-1px)}.md-cards-grid-card.md-cards-grid-card-editing{background:#cf01061a;border:0;box-shadow:none}.md-cards-grid-card.md-cards-grid-card-fixed-height,.md-cards-grid-card.md-cards-grid-card-fixed-height .md-cards-grid-cell{overflow:hidden}.md-cards-grid-card.md-cards-grid-card-fixed-height .md-cards-grid-cell-value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.md-cards-grid-cell{display:flex;align-items:center;flex-shrink:0;padding:14px 16px;font-size:14px;color:#000;border:0;overflow:hidden;min-width:0}.md-cards-grid-cell:last-child{border-right:none}.md-cards-grid-cell-value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;line-height:1.4}.md-cards-grid-actions-cell{display:flex;align-items:center;justify-content:flex-end;gap:6px;min-width:90px;width:auto!important;flex-grow:0!important;flex-shrink:0!important;padding:inherit;border:0}.md-cards-grid-header-cell.md-cards-grid-actions-cell{border-left:none;border-right:none}.md-cards-grid-action-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:none;border-radius:4px;background:transparent;color:#4d4d4d;cursor:pointer;transition:all .2s ease}.md-cards-grid-action-btn:hover{transform:scale(1.1)}.md-cards-grid-action-btn:focus{outline:2px solid #6d5cae;outline-offset:1px}.md-cards-grid-action-btn:active{transform:scale(.95)}.md-cards-grid-action-edit{color:#6d5cae}.md-cards-grid-action-edit:hover{background:#e9e7f3;color:#564790}.md-cards-grid-action-save{color:#28b446}.md-cards-grid-action-save:hover{background:#dff4e3;color:#1f8a36}.md-cards-grid-action-cancel{color:#cf0106}.md-cards-grid-action-cancel:hover{background:#f8d9da;color:#9c0105}.md-cards-grid-icon-edit,.md-cards-grid-icon-save,.md-cards-grid-icon-cancel{display:inline-block;width:18px;height:18px;position:relative}.md-cards-grid-icon-edit:before,.md-cards-grid-icon-edit:after{content:\"\";position:absolute}.md-cards-grid-icon-edit:before{width:10px;height:10px;border:2px solid currentColor;border-radius:1px;transform:rotate(45deg);top:1px;left:1px}.md-cards-grid-icon-edit:after{width:0;height:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:5px solid currentColor;bottom:0;left:0;transform:rotate(-45deg)}.md-cards-grid-icon-save:before{content:\"\";position:absolute;width:6px;height:10px;border-right:2px solid currentColor;border-bottom:2px solid currentColor;transform:rotate(45deg);top:1px;left:5px}.md-cards-grid-icon-cancel:before,.md-cards-grid-icon-cancel:after{content:\"\";position:absolute;width:14px;height:2px;background:currentColor;top:50%;left:50%}.md-cards-grid-icon-cancel:before{transform:translate(-50%,-50%) rotate(45deg)}.md-cards-grid-icon-cancel:after{transform:translate(-50%,-50%) rotate(-45deg)}.md-cards-grid-footer{display:flex;align-items:center;justify-content:flex-end;padding:12px 0 0;background:transparent;border-top:0;font-size:12px;color:#4d4d4d}.md-cards-grid-pager{display:flex;align-items:center;gap:4px}.md-cards-grid-pager-btn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:1px solid #EAEAEA;border-radius:4px;background:#fff;color:#4d4d4d;cursor:pointer;transition:background-color .15s ease,border-color .15s ease}.md-cards-grid-pager-btn:hover:not(:disabled){background:#f3f3f3;border-color:#929292}.md-cards-grid-pager-btn:disabled{opacity:.4;cursor:not-allowed}.md-cards-grid-pager-btn:focus{outline:2px solid #6d5cae;outline-offset:1px}.md-cards-grid-pager-info{padding:0 12px;font-weight:500}.md-cards-grid-icon-first,.md-cards-grid-icon-prev,.md-cards-grid-icon-next,.md-cards-grid-icon-last{display:inline-block;width:12px;height:12px;position:relative}.md-cards-grid-icon-first:before,.md-cards-grid-icon-prev:before,.md-cards-grid-icon-next:before,.md-cards-grid-icon-last:before{content:\"\";position:absolute;width:6px;height:6px;border-right:2px solid currentColor;border-bottom:2px solid currentColor;top:50%;left:50%}.md-cards-grid-icon-prev:before{transform:translate(-25%,-50%) rotate(135deg)}.md-cards-grid-icon-next:before{transform:translate(-75%,-50%) rotate(-45deg)}.md-cards-grid-icon-first:before{transform:translate(-10%,-50%) rotate(135deg)}.md-cards-grid-icon-first:after{content:\"\";position:absolute;width:2px;height:10px;background:currentColor;top:50%;left:2px;transform:translateY(-50%)}.md-cards-grid-icon-last:before{transform:translate(-90%,-50%) rotate(-45deg)}.md-cards-grid-icon-last:after{content:\"\";position:absolute;width:2px;height:10px;background:currentColor;top:50%;right:2px;transform:translateY(-50%)}@media (max-width: 767px){.md-cards-grid{font-size:12px}.md-cards-grid-header{display:none}.md-cards-grid-body{padding:8px}.md-cards-grid-card{flex-direction:column}.md-cards-grid-cell{padding:10px 12px;border-right:none;border-bottom:1px solid #EAEAEA}.md-cards-grid-cell:last-child{border-bottom:none}.md-cards-grid-actions-cell{border-left:none;border-top:1px solid #EAEAEA;justify-content:center;background:#f3f3f3}.md-cards-grid-footer{flex-direction:column;gap:10px;padding:12px}}.md-cards-grid.grey .md-cards-grid-header-cell,.md-cards-grid.grey .md-cards-grid-card{background:#f3f3f3}.md-cards-grid.grey .md-cards-grid-card:hover{background:#efefef}.md-cards-grid.grey .md-cards-grid-card.md-cards-grid-card-editing{background:#cf01061a}.md-cards-grid.zebra .md-cards-grid-card:nth-child(odd){background:#fff}.md-cards-grid.zebra .md-cards-grid-card:nth-child(2n){background:#f3f3f3}.md-cards-grid.zebra .md-cards-grid-card:hover{background:#e4e4e4}.md-cards-grid.zebra .md-cards-grid-card.md-cards-grid-card-editing{background:#cf01061a}.md-cards-grid.zebra .md-cards-grid-group-rows .md-cards-grid-card:nth-child(odd){background:#fff}.md-cards-grid.zebra .md-cards-grid-group-rows .md-cards-grid-card:nth-child(2n){background:#f3f3f3}.md-cards-grid.zebra .md-cards-grid-group-rows .md-cards-grid-card:hover{background:#e4e4e4}.md-cards-grid.zebra .md-cards-grid-group-rows .md-cards-grid-card.md-cards-grid-card-editing{background:#cf01061a}.md-cards-grid.zebra.grey .md-cards-grid-card:nth-child(odd){background:#f3f3f3}.md-cards-grid.zebra.grey .md-cards-grid-card:nth-child(2n){background:#efefef}.md-cards-grid.zebra.grey .md-cards-grid-card:hover{background:#d6d6d6}.md-cards-grid.zebra.grey .md-cards-grid-card.md-cards-grid-card-editing{background:#cf01061a}.md-cards-grid.zebra.grey .md-cards-grid-group-rows .md-cards-grid-card:nth-child(odd){background:#f3f3f3}.md-cards-grid.zebra.grey .md-cards-grid-group-rows .md-cards-grid-card:nth-child(2n){background:#efefef}.md-cards-grid.zebra.grey .md-cards-grid-group-rows .md-cards-grid-card:hover{background:#d6d6d6}.md-cards-grid.zebra.grey .md-cards-grid-group-rows .md-cards-grid-card.md-cards-grid-card-editing{background:#cf01061a}\n"] }]
15354
+ }], propDecorators: { isShrinkMode: [{
15355
+ type: HostBinding,
15356
+ args: ['class.md-cards-grid-shrink-mode']
15357
+ }], rows: [{
15358
+ type: Input
15359
+ }], columns: [{
15360
+ type: Input
15361
+ }], groupRowsBy: [{
15362
+ type: Input
15363
+ }], groupHeaderTemplate: [{
15364
+ type: Input
15365
+ }], rowActionsTemplate: [{
15366
+ type: Input
15367
+ }], headerHeight: [{
15368
+ type: Input,
15369
+ args: [{ transform: numberAttribute }]
15370
+ }], cardHeight: [{
15371
+ type: Input
15372
+ }], gap: [{
15373
+ type: Input,
15374
+ args: [{ transform: numberAttribute }]
15375
+ }], defaultColumnWidth: [{
15376
+ type: Input,
15377
+ args: [{ transform: numberAttribute }]
15378
+ }], showRowActions: [{
15379
+ type: Input,
15380
+ args: [{ transform: booleanAttribute }]
15381
+ }], overflowMode: [{
15382
+ type: Input
15383
+ }], enableColumnResize: [{
15384
+ type: Input,
15385
+ args: [{ transform: booleanAttribute }]
15386
+ }], defaultMinColumnWidth: [{
15387
+ type: Input,
15388
+ args: [{ transform: numberAttribute }]
15389
+ }], defaultMaxColumnWidth: [{
15390
+ type: Input,
15391
+ args: [{ transform: numberAttribute }]
15392
+ }], columnResize: [{
15393
+ type: Output
15394
+ }], sorts: [{
15395
+ type: Input
15396
+ }], sortType: [{
15397
+ type: Input
15398
+ }], externalSorting: [{
15399
+ type: Input,
15400
+ args: [{ transform: booleanAttribute }]
15401
+ }], enableClearingSortState: [{
15402
+ type: Input,
15403
+ args: [{ transform: booleanAttribute }]
15404
+ }], sortAscendingIcon: [{
15405
+ type: Input
15406
+ }], sortDescendingIcon: [{
15407
+ type: Input
15408
+ }], sortUnsetIcon: [{
15409
+ type: Input
15410
+ }], sort: [{
15411
+ type: Output
15412
+ }], limit: [{
15413
+ type: Input,
15414
+ args: [{ transform: numberAttribute }]
15415
+ }], offset: [{
15416
+ type: Input,
15417
+ args: [{ transform: numberAttribute }]
15418
+ }], count: [{
15419
+ type: Input,
15420
+ args: [{ transform: numberAttribute }]
15421
+ }], externalPaging: [{
15422
+ type: Input,
15423
+ args: [{ transform: booleanAttribute }]
15424
+ }], showFooter: [{
15425
+ type: Input,
15426
+ args: [{ transform: booleanAttribute }]
15427
+ }], footerHeight: [{
15428
+ type: Input,
15429
+ args: [{ transform: numberAttribute }]
15430
+ }], page: [{
15431
+ type: Output
15432
+ }], editingRow: [{
15433
+ type: Input
15434
+ }], editingRowChange: [{
15435
+ type: Output
15436
+ }], rowEditStart: [{
15437
+ type: Output
15438
+ }], rowEditSave: [{
15439
+ type: Output
15440
+ }], rowEditCancel: [{
15441
+ type: Output
15442
+ }], _columnDirectives: [{
15443
+ type: ContentChildren,
15444
+ args: [MDCardsGridColumnDirective]
15445
+ }] } });
15446
+
15447
+ const DECLARATIONS = [
15448
+ MDCardsGridComponent,
15449
+ MDCardsGridColumnDirective,
15450
+ MDCardsGridCellTemplateDirective,
15451
+ MDCardsGridHeaderTemplateDirective,
15452
+ MDCardsGridEditTemplateDirective,
15453
+ ];
15454
+ class MDCardsGridModule {
15455
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.6", ngImport: i0, type: MDCardsGridModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
15456
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.6", ngImport: i0, type: MDCardsGridModule, imports: [CommonModule, MDCardsGridComponent,
15457
+ MDCardsGridColumnDirective,
15458
+ MDCardsGridCellTemplateDirective,
15459
+ MDCardsGridHeaderTemplateDirective,
15460
+ MDCardsGridEditTemplateDirective], exports: [MDCardsGridComponent,
15461
+ MDCardsGridColumnDirective,
15462
+ MDCardsGridCellTemplateDirective,
15463
+ MDCardsGridHeaderTemplateDirective,
15464
+ MDCardsGridEditTemplateDirective] });
15465
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.6", ngImport: i0, type: MDCardsGridModule, imports: [CommonModule, MDCardsGridComponent] });
15466
+ }
15467
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.6", ngImport: i0, type: MDCardsGridModule, decorators: [{
15468
+ type: NgModule,
15469
+ args: [{
15470
+ imports: [
15471
+ CommonModule,
15472
+ ...DECLARATIONS,
15473
+ ],
15474
+ exports: DECLARATIONS,
15475
+ }]
15476
+ }] });
15477
+
15478
+ // Components
15479
+
14449
15480
  /**
14450
15481
  * Generated bundle index. Do not edit.
14451
15482
  */
14452
15483
 
14453
- export { ACCORDION, CARD_CONFIG, CardSimpleComponent, CentralPageComponent, CentralPageRowComponent, CollapseComponent, CollapseSetComponent, DIALOG_DATA, DIALOG_DEFAULT_OPTIONS, DIALOG_SCROLL_STRATEGY, DialogState, EXPANSION_PANEL_DEFAULT_OPTIONS, ErrorStateMatcher, ExpansionPanelActionRow, ExpansionPanelDescription, ExpansionPanelTitle, FillComponent, FilteredFieldContainerComponent, FilteredFieldItemComponent, FilteredFieldService, FiltredItemModel, INK_BAR_POSITIONER, INK_BAR_POSITIONER_FACTORY, InkBar, MDAccordion, MDAutocomplete, MDAutocompleteModule, MDAutocompleteOrigin, MDAutocompleteSelectedEvent, MDAutocompleteTrigger, MDCard, MDCardActions, MDCardAvatar, MDCardContent, MDCardFooter, MDCardHeader, MDCardImage, MDCardLgImage, MDCardMdImage, MDCardModule, MDCardSmImage, MDCardSubtitle, MDCardTitle, MDCardTitleGroup, MDCardXlImage, MDCheckBox, MDCheckBoxModule, MDCheckboxChange, MDChip, MDChipAvatar, MDChipEdit, MDChipEditInput, MDChipGrid, MDChipGridChange, MDChipInput, MDChipListbox, MDChipListboxChange, MDChipOption, MDChipRemove, MDChipRow, MDChipSelectionChange, MDChipSet, MDChipTrailingIcon, MDChipsModule, MDCollapseModule, MDContextMenuTrigger, MDDialog, MDDialogActions, MDDialogClose, MDDialogContainer, MDDialogContent, MDDialogTitle, MDExpansionPanel, MDExpansionPanelContent, MDExpansionPanelHeader, MDHeaderCardComponent, MDHeaderCardModule, MDHeaderCardSetComponent, MDMenu, MDMenuContent, MDMenuItem, MDMenuModule, MDMenuTrigger, MDModalModule, MDOption, MDOptionGroup, MDOptionModule, MDOptionSelectionChange, MDPseudoCheckboxModule, MDRadioButton, MDRadioGroup, MDRadioModule, MDSelect, MDSelectModule, MDSelectTrigger, MDStep, MDStepContent, MDStepExecutorModule, MDStepFooter, MDStepHeader, MDStepLabel, MDStepper, MDStepperIcon, MDStepperNext, MDStepperPrevious, MDSwitch, MDSwitchModule, MDTab, MDTabBody, MDTabChangeEvent, MDTabContent, MDTabGroup, MDTabHeader, MDTabLabel, MDTabLabelWrapper, MDTabsModule, MD_AUTOCOMPLETE_DEFAULT_OPTIONS, MD_AUTOCOMPLETE_SCROLL_STRATEGY, MD_AUTOCOMPLETE_VALUE_ACCESSOR, MD_CHIP, MD_CHIPS_DEFAULT_OPTIONS, MD_CHIP_AVATAR, MD_CHIP_EDIT, MD_CHIP_LISTBOX_CONTROL_VALUE_ACCESSOR, MD_CHIP_REMOVE, MD_CHIP_TRAILING_ICON, MD_EXPANSION_PANEL, MD_MENU_CONTENT, MD_MENU_DEFAULT_OPTIONS, MD_MENU_PANEL, MD_MENU_SCROLL_STRATEGY, MD_OPTION_PARENT_COMPONENT, MD_RADIO_GROUP, MD_SELECT_TRIGGER, MD_TAB, MD_TAB_LABEL, MENU_PANEL_TOP_PADDING, ManagePageComponent, MefDevCardModule, MefDevCollapseModule, MefDevDialogConfig, MefDevDialogRef, MefDevDropDownMenuModule, MefDevFilteredFieldModule, MefDevModalModule, MefDevOptionComponent, MefDevPageLayoutsModule, MefDevProgressComponent, MefDevProgressModule, MefDevSelectComponent, MefDevSelectModule, MefDevStepExecutorModule, MefDevSwitchComponent, MefDevSwitchModule, MefDevTabBodyComponent, MefDevTabComponent, MefDevTabLabelDirective, MefDevTabSetComponent, MefDevTabsInkBarDirective, MefDevTabsModule, MefDevTabsNavComponent, MefdevDropdownMenuComponent, MefdevExecutorPageComponent, OptionPipe, PaginatedTabHeader, ProgressConfig, PseudoCheckbox, RADIO_GROUP_CONTROL_VALUE_ACCESSOR, RadioChange, RightFilterComponent, STEPPER_INTL_PROVIDER, STEPPER_INTL_PROVIDER_FACTORY, SelectChange, ShowOnDirtyErrorStateMatcher, SlideRightComponent, SlideUpComponent, StageComponent, StepExecutorComponent, StepperErrorStateMatcher, StepperIntl, TABS_CONFIG, TAB_CONTENT, TAB_GROUP, TabBodyPortal, TabChangeEvent, TablePageComponent, TransitionCheckState, _ErrorStateTracker, _closeDialogVia, _countGroupLabelsBeforeOption, _getOptionScrollPosition, components, getMDAutocompleteMissingPanelError, getMDSelectDynamicMultipleError, getMDSelectNonArrayValueError, getMDSelectNonFunctionValueError, mefDevCardComponents, mefDevCollapseModuleComponents };
15484
+ export { ACCORDION, CARD_CONFIG, CardSimpleComponent, CentralPageComponent, CentralPageRowComponent, CollapseComponent, CollapseSetComponent, DIALOG_DATA, DIALOG_DEFAULT_OPTIONS, DIALOG_SCROLL_STRATEGY, DialogState, EXPANSION_PANEL_DEFAULT_OPTIONS, ErrorStateMatcher, ExpansionPanelActionRow, ExpansionPanelDescription, ExpansionPanelTitle, FillComponent, FilteredFieldContainerComponent, FilteredFieldItemComponent, FilteredFieldService, FiltredItemModel, INK_BAR_POSITIONER, INK_BAR_POSITIONER_FACTORY, InkBar, MDAccordion, MDAutocomplete, MDAutocompleteModule, MDAutocompleteOrigin, MDAutocompleteSelectedEvent, MDAutocompleteTrigger, MDCard, MDCardActions, MDCardAvatar, MDCardContent, MDCardFooter, MDCardHeader, MDCardImage, MDCardLgImage, MDCardMdImage, MDCardModule, MDCardSmImage, MDCardSubtitle, MDCardTitle, MDCardTitleGroup, MDCardXlImage, MDCardsGridCellTemplateDirective, MDCardsGridColumnDirective, MDCardsGridComponent, MDCardsGridEditTemplateDirective, MDCardsGridHeaderTemplateDirective, MDCardsGridModule, MDCheckBox, MDCheckBoxModule, MDCheckboxChange, MDChip, MDChipAvatar, MDChipEdit, MDChipEditInput, MDChipGrid, MDChipGridChange, MDChipInput, MDChipListbox, MDChipListboxChange, MDChipOption, MDChipRemove, MDChipRow, MDChipSelectionChange, MDChipSet, MDChipTrailingIcon, MDChipsModule, MDCollapseModule, MDContextMenuTrigger, MDDialog, MDDialogActions, MDDialogClose, MDDialogContainer, MDDialogContent, MDDialogTitle, MDExpansionPanel, MDExpansionPanelContent, MDExpansionPanelHeader, MDHeaderCardComponent, MDHeaderCardModule, MDHeaderCardSetComponent, MDMenu, MDMenuContent, MDMenuItem, MDMenuModule, MDMenuTrigger, MDModalModule, MDOption, MDOptionGroup, MDOptionModule, MDOptionSelectionChange, MDPseudoCheckboxModule, MDRadioButton, MDRadioGroup, MDRadioModule, MDSelect, MDSelectModule, MDSelectTrigger, MDStep, MDStepContent, MDStepExecutorModule, MDStepFooter, MDStepHeader, MDStepLabel, MDStepper, MDStepperIcon, MDStepperNext, MDStepperPrevious, MDSwitch, MDSwitchModule, MDTab, MDTabBody, MDTabChangeEvent, MDTabContent, MDTabGroup, MDTabHeader, MDTabLabel, MDTabLabelWrapper, MDTabsModule, MD_AUTOCOMPLETE_DEFAULT_OPTIONS, MD_AUTOCOMPLETE_SCROLL_STRATEGY, MD_AUTOCOMPLETE_VALUE_ACCESSOR, MD_CHIP, MD_CHIPS_DEFAULT_OPTIONS, MD_CHIP_AVATAR, MD_CHIP_EDIT, MD_CHIP_LISTBOX_CONTROL_VALUE_ACCESSOR, MD_CHIP_REMOVE, MD_CHIP_TRAILING_ICON, MD_EXPANSION_PANEL, MD_MENU_CONTENT, MD_MENU_DEFAULT_OPTIONS, MD_MENU_PANEL, MD_MENU_SCROLL_STRATEGY, MD_OPTION_PARENT_COMPONENT, MD_RADIO_GROUP, MD_SELECT_TRIGGER, MD_TAB, MD_TAB_LABEL, MENU_PANEL_TOP_PADDING, ManagePageComponent, MefDevCardModule, MefDevCollapseModule, MefDevDialogConfig, MefDevDialogRef, MefDevDropDownMenuModule, MefDevFilteredFieldModule, MefDevModalModule, MefDevOptionComponent, MefDevPageLayoutsModule, MefDevProgressComponent, MefDevProgressModule, MefDevSelectComponent, MefDevSelectModule, MefDevStepExecutorModule, MefDevSwitchComponent, MefDevSwitchModule, MefDevTabBodyComponent, MefDevTabComponent, MefDevTabLabelDirective, MefDevTabSetComponent, MefDevTabsInkBarDirective, MefDevTabsModule, MefDevTabsNavComponent, MefdevDropdownMenuComponent, MefdevExecutorPageComponent, OptionPipe, OverflowMode, PaginatedTabHeader, ProgressConfig, PseudoCheckbox, RADIO_GROUP_CONTROL_VALUE_ACCESSOR, RadioChange, RightFilterComponent, STEPPER_INTL_PROVIDER, STEPPER_INTL_PROVIDER_FACTORY, SelectChange, ShowOnDirtyErrorStateMatcher, SlideRightComponent, SlideUpComponent, SortDirection, SortType, StageComponent, StepExecutorComponent, StepperErrorStateMatcher, StepperIntl, TABS_CONFIG, TAB_CONTENT, TAB_GROUP, TabBodyPortal, TabChangeEvent, TablePageComponent, TransitionCheckState, _ErrorStateTracker, _closeDialogVia, _countGroupLabelsBeforeOption, _getOptionScrollPosition, components, deepClone, getMDAutocompleteMissingPanelError, getMDSelectDynamicMultipleError, getMDSelectNonArrayValueError, getMDSelectNonFunctionValueError, groupRowsByProperty, mefDevCardComponents, mefDevCollapseModuleComponents, sortRows };
14454
15485
  //# sourceMappingURL=natec-mef-dev-ui-kit.mjs.map