@mintplayer/ng-bootstrap 21.13.0 → 21.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, TemplateRef, Input, Directive, contentChildren, model, computed, ChangeDetectionStrategy, Component, input, effect } from '@angular/core';
2
+ import { inject, TemplateRef, input, Directive, contentChildren, model, computed, signal, ChangeDetectionStrategy, Component, effect } from '@angular/core';
3
3
  import { NgTemplateOutlet } from '@angular/common';
4
4
  import { BsGridComponent, BsGridRowDirective, BsGridColumnDirective } from '@mintplayer/ng-bootstrap/grid';
5
5
  import { BsTableComponent } from '@mintplayer/ng-bootstrap/table';
@@ -44,24 +44,18 @@ class DatatableSettings {
44
44
  class BsDatatableColumnDirective {
45
45
  constructor() {
46
46
  this.templateRef = inject(TemplateRef);
47
- this.name = '';
48
- this.sortable = true;
47
+ this.name = input('', { ...(ngDevMode ? { debugName: "name" } : {}), alias: 'bsDatatableColumn' });
48
+ this.sortable = input(true, { ...(ngDevMode ? { debugName: "sortable" } : {}), alias: 'bsDatatableColumnSortable' });
49
49
  }
50
50
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: BsDatatableColumnDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
51
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.1.6", type: BsDatatableColumnDirective, isStandalone: true, selector: "[bsDatatableColumn]", inputs: { name: ["bsDatatableColumn", "name"], sortable: ["bsDatatableColumnSortable", "sortable"] }, ngImport: i0 }); }
51
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.6", type: BsDatatableColumnDirective, isStandalone: true, selector: "[bsDatatableColumn]", inputs: { name: { classPropertyName: "name", publicName: "bsDatatableColumn", isSignal: true, isRequired: false, transformFunction: null }, sortable: { classPropertyName: "sortable", publicName: "bsDatatableColumnSortable", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
52
52
  }
53
53
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: BsDatatableColumnDirective, decorators: [{
54
54
  type: Directive,
55
55
  args: [{
56
56
  selector: '[bsDatatableColumn]',
57
57
  }]
58
- }], propDecorators: { name: [{
59
- type: Input,
60
- args: ['bsDatatableColumn']
61
- }], sortable: [{
62
- type: Input,
63
- args: ['bsDatatableColumnSortable']
64
- }] } });
58
+ }], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "bsDatatableColumn", required: false }] }], sortable: [{ type: i0.Input, args: [{ isSignal: true, alias: "bsDatatableColumnSortable", required: false }] }] } });
65
59
 
66
60
  class DatatableSortBase {
67
61
  constructor() {
@@ -84,15 +78,16 @@ class DatatableSortBase {
84
78
  }
85
79
  }
86
80
  columnHeaderClicked(column, event) {
87
- if (!column.sortable)
81
+ if (!column.sortable())
88
82
  return;
83
+ const columnName = column.name();
89
84
  const currentSettings = this.settings();
90
85
  let sortColumns = currentSettings.sortColumns;
91
86
  if (event.shiftKey) {
92
87
  // Multi-column: add/toggle/remove
93
- const existingIndex = sortColumns.findIndex(c => c.property === column.name);
88
+ const existingIndex = sortColumns.findIndex(c => c.property === columnName);
94
89
  if (existingIndex === -1) {
95
- sortColumns = [...sortColumns, { property: column.name, direction: 'ascending' }];
90
+ sortColumns = [...sortColumns, { property: columnName, direction: 'ascending' }];
96
91
  }
97
92
  else if (sortColumns[existingIndex].direction === 'ascending') {
98
93
  sortColumns = sortColumns.map((c, i) => i === existingIndex ? { ...c, direction: 'descending' } : c);
@@ -103,9 +98,9 @@ class DatatableSortBase {
103
98
  }
104
99
  else {
105
100
  // Single-column: replace all
106
- const existingSingle = sortColumns.length === 1 && sortColumns[0].property === column.name;
101
+ const existingSingle = sortColumns.length === 1 && sortColumns[0].property === columnName;
107
102
  sortColumns = [{
108
- property: column.name,
103
+ property: columnName,
109
104
  direction: existingSingle && sortColumns[0].direction === 'ascending' ? 'descending' : 'ascending'
110
105
  }];
111
106
  }
@@ -123,6 +118,7 @@ class BsDatatableComponent extends DatatableSortBase {
123
118
  super(...arguments);
124
119
  this.numberOfColumns = computed(() => this.columns().length, ...(ngDevMode ? [{ debugName: "numberOfColumns" }] : []));
125
120
  this.data = model(undefined, ...(ngDevMode ? [{ debugName: "data" }] : []));
121
+ this.rowTemplate = signal(undefined, ...(ngDevMode ? [{ debugName: "rowTemplate" }] : []));
126
122
  }
127
123
  onPerPageChange(perPage) {
128
124
  const currentSettings = this.settings();
@@ -140,11 +136,11 @@ class BsDatatableComponent extends DatatableSortBase {
140
136
  }));
141
137
  }
142
138
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: BsDatatableComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
143
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.6", type: BsDatatableComponent, isStandalone: true, selector: "bs-datatable", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { data: "dataChange" }, usesInheritance: true, ngImport: i0, template: "<bs-table [isResponsive]=\"true\" [striped]=\"true\" [hover]=\"true\" class=\"mb-3\">\n <thead>\n <tr>\n @for (column of columnsArray; track column) {\n <th class=\"text-nowrap\"\n [class.sort]=\"column.sortable\"\n [class.sort-asc]=\"column.sortable && getSortDirection(column.name) === 'ascending'\"\n [class.sort-desc]=\"column.sortable && getSortDirection(column.name) === 'descending'\"\n (mousedown)=\"onHeaderMouseDown($event)\"\n (click)=\"columnHeaderClicked(column, $event)\">\n <ng-container *ngTemplateOutlet=\"column.templateRef\"></ng-container>\n @if (settings().sortColumns.length > 1 && getSortIndex(column.name) >= 0) {\n <span class=\"sort-priority\">{{ getSortIndex(column.name) + 1 }}</span>\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (!!data() && !!rowTemplate) {\n @for (item of data()!.data; track $index) {\n <ng-container *ngTemplateOutlet=\"rowTemplate; context: { $implicit: item }\"></ng-container>\n }\n }\n </tbody>\n <tfoot>\n <tr>\n <td [colSpan]=\"numberOfColumns()\">\n <bs-grid [stopFullWidthAt]=\"'never'\">\n <div bsRow>\n <div [md]=\"12\">\n <bs-pagination class=\"float-start\" [pageNumbers]=\"settings().perPage.values\"\n [selectedPageNumber]=\"settings().perPage.selected\" (selectedPageNumberChange)=\"onPerPageChange($event)\"\n [showArrows]=\"false\"></bs-pagination>\n <bs-pagination class=\"float-end\" [pageNumbers]=\"settings().page.values\"\n [selectedPageNumber]=\"settings().page.selected\" (selectedPageNumberChange)=\"onPageChange($event)\"\n [showArrows]=\"true\" [numberOfBoxes]=\"settings().pageNumberOfBoxes\"></bs-pagination>\n </div>\n </div>\n </bs-grid>\n </td>\n </tr>\n </tfoot>\n</bs-table>\n", styles: ["@charset \"UTF-8\";bs-table thead th.sort{position:relative;cursor:pointer;padding-right:2rem}bs-table thead th.sort:before,bs-table thead th.sort:after{position:absolute;display:block;opacity:.3;bottom:.5em}bs-table thead th.sort:before{content:\"\\2191\";right:1em}bs-table thead th.sort:after{content:\"\\2193\";right:.5em}bs-table thead th.sort.sort-asc:after{opacity:1}bs-table thead th.sort.sort-desc:before{opacity:1}bs-table thead th.sort .sort-priority{position:absolute;right:.1em;bottom:.3em;font-size:.65em;font-weight:700;opacity:.7}tfoot>tr>td{border-bottom:none}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: BsGridComponent, selector: "bs-grid", inputs: ["stopFullWidthAt"] }, { kind: "directive", type: BsGridRowDirective, selector: "[bsRow]" }, { kind: "directive", type: BsGridColumnDirective, selector: "[xxs],[xs],[sm],[md],[lg],[xl],[xxl]", inputs: ["xxs", "xs", "sm", "md", "lg", "xl", "xxl"] }, { kind: "component", type: BsTableComponent, selector: "bs-table", inputs: ["isResponsive", "striped", "hover", "border"] }, { kind: "component", type: BsPaginationComponent, selector: "bs-pagination", inputs: ["pageNumbers", "selectedPageNumber", "numberOfBoxes", "showArrows", "size"], outputs: ["selectedPageNumberChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
139
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.6", type: BsDatatableComponent, isStandalone: true, selector: "bs-datatable", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { data: "dataChange" }, usesInheritance: true, ngImport: i0, template: "<bs-table [isResponsive]=\"true\" [striped]=\"true\" [hover]=\"true\" class=\"mb-3\">\n <thead>\n <tr>\n @for (column of columnsArray; track column) {\n <th class=\"text-nowrap\"\n [class.sort]=\"column.sortable()\"\n [class.sort-asc]=\"column.sortable() && getSortDirection(column.name()) === 'ascending'\"\n [class.sort-desc]=\"column.sortable() && getSortDirection(column.name()) === 'descending'\"\n (mousedown)=\"onHeaderMouseDown($event)\"\n (click)=\"columnHeaderClicked(column, $event)\">\n <ng-container *ngTemplateOutlet=\"column.templateRef\"></ng-container>\n @if (settings().sortColumns.length > 1 && getSortIndex(column.name()) >= 0) {\n <span class=\"sort-priority\">{{ getSortIndex(column.name()) + 1 }}</span>\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (!!data() && !!rowTemplate()) {\n @for (item of data()!.data; track $index) {\n <ng-container *ngTemplateOutlet=\"rowTemplate()!; context: { $implicit: item }\"></ng-container>\n }\n }\n </tbody>\n <tfoot>\n <tr>\n <td [colSpan]=\"numberOfColumns()\">\n <bs-grid [stopFullWidthAt]=\"'never'\">\n <div bsRow>\n <div [md]=\"12\">\n <bs-pagination class=\"float-start\" [pageNumbers]=\"settings().perPage.values\"\n [selectedPageNumber]=\"settings().perPage.selected\" (selectedPageNumberChange)=\"onPerPageChange($event)\"\n [showArrows]=\"false\"></bs-pagination>\n <bs-pagination class=\"float-end\" [pageNumbers]=\"settings().page.values\"\n [selectedPageNumber]=\"settings().page.selected\" (selectedPageNumberChange)=\"onPageChange($event)\"\n [showArrows]=\"true\" [numberOfBoxes]=\"settings().pageNumberOfBoxes\"></bs-pagination>\n </div>\n </div>\n </bs-grid>\n </td>\n </tr>\n </tfoot>\n</bs-table>\n", styles: ["@charset \"UTF-8\";bs-table thead th.sort{position:relative;cursor:pointer;padding-right:2rem}bs-table thead th.sort:before,bs-table thead th.sort:after{position:absolute;display:block;opacity:.3;bottom:.5em}bs-table thead th.sort:before{content:\"\\2191\";right:1em}bs-table thead th.sort:after{content:\"\\2193\";right:.5em}bs-table thead th.sort.sort-asc:after{opacity:1}bs-table thead th.sort.sort-desc:before{opacity:1}bs-table thead th.sort .sort-priority{position:absolute;right:.1em;bottom:.3em;font-size:.65em;font-weight:700;opacity:.7}tfoot>tr>td{border-bottom:none}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: BsGridComponent, selector: "bs-grid", inputs: ["stopFullWidthAt"] }, { kind: "directive", type: BsGridRowDirective, selector: "[bsRow]" }, { kind: "directive", type: BsGridColumnDirective, selector: "[xxs],[xs],[sm],[md],[lg],[xl],[xxl]", inputs: ["xxs", "xs", "sm", "md", "lg", "xl", "xxl"] }, { kind: "component", type: BsTableComponent, selector: "bs-table", inputs: ["isResponsive", "striped", "hover", "border"] }, { kind: "component", type: BsPaginationComponent, selector: "bs-pagination", inputs: ["pageNumbers", "selectedPageNumber", "numberOfBoxes", "showArrows", "size"], outputs: ["selectedPageNumberChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
144
140
  }
145
141
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: BsDatatableComponent, decorators: [{
146
142
  type: Component,
147
- args: [{ selector: 'bs-datatable', imports: [NgTemplateOutlet, BsGridComponent, BsGridRowDirective, BsGridColumnDirective, BsTableComponent, BsPaginationComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<bs-table [isResponsive]=\"true\" [striped]=\"true\" [hover]=\"true\" class=\"mb-3\">\n <thead>\n <tr>\n @for (column of columnsArray; track column) {\n <th class=\"text-nowrap\"\n [class.sort]=\"column.sortable\"\n [class.sort-asc]=\"column.sortable && getSortDirection(column.name) === 'ascending'\"\n [class.sort-desc]=\"column.sortable && getSortDirection(column.name) === 'descending'\"\n (mousedown)=\"onHeaderMouseDown($event)\"\n (click)=\"columnHeaderClicked(column, $event)\">\n <ng-container *ngTemplateOutlet=\"column.templateRef\"></ng-container>\n @if (settings().sortColumns.length > 1 && getSortIndex(column.name) >= 0) {\n <span class=\"sort-priority\">{{ getSortIndex(column.name) + 1 }}</span>\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (!!data() && !!rowTemplate) {\n @for (item of data()!.data; track $index) {\n <ng-container *ngTemplateOutlet=\"rowTemplate; context: { $implicit: item }\"></ng-container>\n }\n }\n </tbody>\n <tfoot>\n <tr>\n <td [colSpan]=\"numberOfColumns()\">\n <bs-grid [stopFullWidthAt]=\"'never'\">\n <div bsRow>\n <div [md]=\"12\">\n <bs-pagination class=\"float-start\" [pageNumbers]=\"settings().perPage.values\"\n [selectedPageNumber]=\"settings().perPage.selected\" (selectedPageNumberChange)=\"onPerPageChange($event)\"\n [showArrows]=\"false\"></bs-pagination>\n <bs-pagination class=\"float-end\" [pageNumbers]=\"settings().page.values\"\n [selectedPageNumber]=\"settings().page.selected\" (selectedPageNumberChange)=\"onPageChange($event)\"\n [showArrows]=\"true\" [numberOfBoxes]=\"settings().pageNumberOfBoxes\"></bs-pagination>\n </div>\n </div>\n </bs-grid>\n </td>\n </tr>\n </tfoot>\n</bs-table>\n", styles: ["@charset \"UTF-8\";bs-table thead th.sort{position:relative;cursor:pointer;padding-right:2rem}bs-table thead th.sort:before,bs-table thead th.sort:after{position:absolute;display:block;opacity:.3;bottom:.5em}bs-table thead th.sort:before{content:\"\\2191\";right:1em}bs-table thead th.sort:after{content:\"\\2193\";right:.5em}bs-table thead th.sort.sort-asc:after{opacity:1}bs-table thead th.sort.sort-desc:before{opacity:1}bs-table thead th.sort .sort-priority{position:absolute;right:.1em;bottom:.3em;font-size:.65em;font-weight:700;opacity:.7}tfoot>tr>td{border-bottom:none}\n"] }]
143
+ args: [{ selector: 'bs-datatable', imports: [NgTemplateOutlet, BsGridComponent, BsGridRowDirective, BsGridColumnDirective, BsTableComponent, BsPaginationComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<bs-table [isResponsive]=\"true\" [striped]=\"true\" [hover]=\"true\" class=\"mb-3\">\n <thead>\n <tr>\n @for (column of columnsArray; track column) {\n <th class=\"text-nowrap\"\n [class.sort]=\"column.sortable()\"\n [class.sort-asc]=\"column.sortable() && getSortDirection(column.name()) === 'ascending'\"\n [class.sort-desc]=\"column.sortable() && getSortDirection(column.name()) === 'descending'\"\n (mousedown)=\"onHeaderMouseDown($event)\"\n (click)=\"columnHeaderClicked(column, $event)\">\n <ng-container *ngTemplateOutlet=\"column.templateRef\"></ng-container>\n @if (settings().sortColumns.length > 1 && getSortIndex(column.name()) >= 0) {\n <span class=\"sort-priority\">{{ getSortIndex(column.name()) + 1 }}</span>\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (!!data() && !!rowTemplate()) {\n @for (item of data()!.data; track $index) {\n <ng-container *ngTemplateOutlet=\"rowTemplate()!; context: { $implicit: item }\"></ng-container>\n }\n }\n </tbody>\n <tfoot>\n <tr>\n <td [colSpan]=\"numberOfColumns()\">\n <bs-grid [stopFullWidthAt]=\"'never'\">\n <div bsRow>\n <div [md]=\"12\">\n <bs-pagination class=\"float-start\" [pageNumbers]=\"settings().perPage.values\"\n [selectedPageNumber]=\"settings().perPage.selected\" (selectedPageNumberChange)=\"onPerPageChange($event)\"\n [showArrows]=\"false\"></bs-pagination>\n <bs-pagination class=\"float-end\" [pageNumbers]=\"settings().page.values\"\n [selectedPageNumber]=\"settings().page.selected\" (selectedPageNumberChange)=\"onPageChange($event)\"\n [showArrows]=\"true\" [numberOfBoxes]=\"settings().pageNumberOfBoxes\"></bs-pagination>\n </div>\n </div>\n </bs-grid>\n </td>\n </tr>\n </tfoot>\n</bs-table>\n", styles: ["@charset \"UTF-8\";bs-table thead th.sort{position:relative;cursor:pointer;padding-right:2rem}bs-table thead th.sort:before,bs-table thead th.sort:after{position:absolute;display:block;opacity:.3;bottom:.5em}bs-table thead th.sort:before{content:\"\\2191\";right:1em}bs-table thead th.sort:after{content:\"\\2193\";right:.5em}bs-table thead th.sort.sort-asc:after{opacity:1}bs-table thead th.sort.sort-desc:before{opacity:1}bs-table thead th.sort .sort-priority{position:absolute;right:.1em;bottom:.3em;font-size:.65em;font-weight:700;opacity:.7}tfoot>tr>td{border-bottom:none}\n"] }]
148
144
  }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }, { type: i0.Output, args: ["dataChange"] }] } });
149
145
 
150
146
  class BsRowTemplateDirective {
@@ -152,7 +148,7 @@ class BsRowTemplateDirective {
152
148
  this.datatableComponent = inject(BsDatatableComponent);
153
149
  this.templateRef = inject(TemplateRef);
154
150
  this.bsRowTemplateOf = input(undefined, ...(ngDevMode ? [{ debugName: "bsRowTemplateOf" }] : []));
155
- this.datatableComponent.rowTemplate = this.templateRef;
151
+ this.datatableComponent.rowTemplate.set(this.templateRef);
156
152
  effect(() => {
157
153
  const value = this.bsRowTemplateOf();
158
154
  this.datatableComponent.data.set(value);
@@ -1 +1 @@
1
- {"version":3,"file":"mintplayer-ng-bootstrap-datatable.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/datatable/src/datatable-settings.ts","../../../../libs/mintplayer-ng-bootstrap/datatable/src/datatable-column/datatable-column.directive.ts","../../../../libs/mintplayer-ng-bootstrap/datatable/src/datatable-sort-base.ts","../../../../libs/mintplayer-ng-bootstrap/datatable/src/datatable/datatable.component.ts","../../../../libs/mintplayer-ng-bootstrap/datatable/src/datatable/datatable.component.html","../../../../libs/mintplayer-ng-bootstrap/datatable/src/row-template/row-template.directive.ts","../../../../libs/mintplayer-ng-bootstrap/datatable/mintplayer-ng-bootstrap-datatable.ts"],"sourcesContent":["import { PaginationRequest, SortColumn } from \"@mintplayer/pagination\";\n\nexport class DatatableSettings {\n constructor(data?: Partial<DatatableSettings>) {\n Object.assign(this, data);\n\n if (data && data.perPage) {\n this.perPage = data.perPage;\n } else {\n // Set default value\n this.perPage = {\n values: [10, 20, 50],\n selected: 20\n };\n }\n\n if (data && data.page) {\n this.page = data.page;\n } else {\n // Set default value\n this.page = {\n values: [1],\n selected: 1\n };\n }\n }\n\n public sortColumns: SortColumn[] = [];\n public perPage: { values: number[], selected: number };\n public page: { values: number[], selected: number };\n public pageNumberOfBoxes: number = 11;\n\n public toPagination() {\n const res = <PaginationRequest>{\n sortColumns: this.sortColumns,\n perPage: this.perPage.selected,\n page: this.page.selected\n };\n return res;\n }\n}","import { Directive, inject, Input, TemplateRef } from '@angular/core';\n\n@Directive({\n selector: '[bsDatatableColumn]',\n})\nexport class BsDatatableColumnDirective {\n templateRef = inject(TemplateRef);\n @Input('bsDatatableColumn') public name = '';\n @Input('bsDatatableColumnSortable') public sortable = true;\n\n}","import { contentChildren, Directive, model } from '@angular/core';\nimport { DatatableSettings } from './datatable-settings';\nimport { BsDatatableColumnDirective } from './datatable-column/datatable-column.directive';\n\n@Directive()\nexport abstract class DatatableSortBase {\n\n readonly columns = contentChildren(BsDatatableColumnDirective);\n\n get columnsArray() {\n return this.columns();\n }\n\n settings = model<DatatableSettings>(new DatatableSettings());\n\n getSortIndex(columnName: string): number {\n return this.settings().sortColumns.findIndex(c => c.property === columnName);\n }\n\n getSortDirection(columnName: string): 'ascending' | 'descending' | null {\n const col = this.settings().sortColumns.find(c => c.property === columnName);\n return col?.direction ?? null;\n }\n\n onHeaderMouseDown(event: MouseEvent) {\n if (event.shiftKey) {\n event.preventDefault();\n }\n }\n\n columnHeaderClicked(column: BsDatatableColumnDirective, event: MouseEvent) {\n if (!column.sortable) return;\n\n const currentSettings = this.settings();\n let sortColumns = currentSettings.sortColumns;\n\n if (event.shiftKey) {\n // Multi-column: add/toggle/remove\n const existingIndex = sortColumns.findIndex(c => c.property === column.name);\n if (existingIndex === -1) {\n sortColumns = [...sortColumns, { property: column.name, direction: 'ascending' as const }];\n } else if (sortColumns[existingIndex].direction === 'ascending') {\n sortColumns = sortColumns.map((c, i) =>\n i === existingIndex ? { ...c, direction: 'descending' as const } : c\n );\n } else {\n sortColumns = sortColumns.filter((_, i) => i !== existingIndex);\n }\n } else {\n // Single-column: replace all\n const existingSingle = sortColumns.length === 1 && sortColumns[0].property === column.name;\n sortColumns = [{\n property: column.name,\n direction: existingSingle && sortColumns[0].direction === 'ascending' ? 'descending' as const : 'ascending' as const\n }];\n }\n\n this.settings.set(new DatatableSettings({ ...currentSettings, sortColumns }));\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, model, TemplateRef } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { PaginationResponse } from '@mintplayer/pagination';\nimport { BsGridComponent, BsGridRowDirective, BsGridColumnDirective } from '@mintplayer/ng-bootstrap/grid';\nimport { BsTableComponent } from '@mintplayer/ng-bootstrap/table';\nimport { BsPaginationComponent } from '@mintplayer/ng-bootstrap/pagination';\nimport { DatatableSettings } from '../datatable-settings';\nimport { DatatableSortBase } from '../datatable-sort-base';\nimport { BsRowTemplateContext } from '../row-template/row-template.directive';\n\n\n@Component({\n selector: 'bs-datatable',\n templateUrl: './datatable.component.html',\n styleUrls: ['./datatable.component.scss'],\n imports: [NgTemplateOutlet, BsGridComponent, BsGridRowDirective, BsGridColumnDirective, BsTableComponent, BsPaginationComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BsDatatableComponent<TData> extends DatatableSortBase {\n\n numberOfColumns = computed(() => this.columns().length);\n\n data = model<PaginationResponse<TData> | undefined>(undefined);\n\n rowTemplate?: TemplateRef<BsRowTemplateContext<TData>>;\n\n onPerPageChange(perPage: number) {\n const currentSettings = this.settings();\n this.settings.set(new DatatableSettings({\n ...currentSettings,\n perPage: { ...currentSettings.perPage, selected: perPage },\n page: { ...currentSettings.page, selected: 1 },\n }));\n }\n\n onPageChange(page: number) {\n const currentSettings = this.settings();\n this.settings.set(new DatatableSettings({\n ...currentSettings,\n page: { ...currentSettings.page, selected: page },\n }));\n }\n\n}\n","<bs-table [isResponsive]=\"true\" [striped]=\"true\" [hover]=\"true\" class=\"mb-3\">\n <thead>\n <tr>\n @for (column of columnsArray; track column) {\n <th class=\"text-nowrap\"\n [class.sort]=\"column.sortable\"\n [class.sort-asc]=\"column.sortable && getSortDirection(column.name) === 'ascending'\"\n [class.sort-desc]=\"column.sortable && getSortDirection(column.name) === 'descending'\"\n (mousedown)=\"onHeaderMouseDown($event)\"\n (click)=\"columnHeaderClicked(column, $event)\">\n <ng-container *ngTemplateOutlet=\"column.templateRef\"></ng-container>\n @if (settings().sortColumns.length > 1 && getSortIndex(column.name) >= 0) {\n <span class=\"sort-priority\">{{ getSortIndex(column.name) + 1 }}</span>\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (!!data() && !!rowTemplate) {\n @for (item of data()!.data; track $index) {\n <ng-container *ngTemplateOutlet=\"rowTemplate; context: { $implicit: item }\"></ng-container>\n }\n }\n </tbody>\n <tfoot>\n <tr>\n <td [colSpan]=\"numberOfColumns()\">\n <bs-grid [stopFullWidthAt]=\"'never'\">\n <div bsRow>\n <div [md]=\"12\">\n <bs-pagination class=\"float-start\" [pageNumbers]=\"settings().perPage.values\"\n [selectedPageNumber]=\"settings().perPage.selected\" (selectedPageNumberChange)=\"onPerPageChange($event)\"\n [showArrows]=\"false\"></bs-pagination>\n <bs-pagination class=\"float-end\" [pageNumbers]=\"settings().page.values\"\n [selectedPageNumber]=\"settings().page.selected\" (selectedPageNumberChange)=\"onPageChange($event)\"\n [showArrows]=\"true\" [numberOfBoxes]=\"settings().pageNumberOfBoxes\"></bs-pagination>\n </div>\n </div>\n </bs-grid>\n </td>\n </tr>\n </tfoot>\n</bs-table>\n","import { Directive, effect, inject, input, TemplateRef } from '@angular/core';\nimport { PaginationResponse } from '@mintplayer/pagination';\nimport { BsDatatableComponent } from '../datatable/datatable.component';\n\n@Directive({\n selector: '[bsRowTemplate]',\n})\nexport class BsRowTemplateDirective<TData> {\n\n private datatableComponent = inject<BsDatatableComponent<TData>>(BsDatatableComponent);\n private templateRef = inject<TemplateRef<BsRowTemplateContext<TData>>>(TemplateRef);\n\n constructor() {\n this.datatableComponent.rowTemplate = this.templateRef;\n\n effect(() => {\n const value = this.bsRowTemplateOf();\n this.datatableComponent.data.set(value);\n });\n }\n\n readonly bsRowTemplateOf = input<PaginationResponse<TData> | undefined>(undefined);\n\n public static ngTemplateContextGuard<TData>(\n dir: BsRowTemplateDirective<TData>,\n ctx: any\n ): ctx is BsRowTemplateContext<Exclude<TData, false | 0 | '' | null | undefined>> {\n return true;\n }\n}\n\nexport class BsRowTemplateContext<TData = unknown> {\n public $implicit: TData = null!;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mintplayer-ng-bootstrap-datatable.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/datatable/src/datatable-settings.ts","../../../../libs/mintplayer-ng-bootstrap/datatable/src/datatable-column/datatable-column.directive.ts","../../../../libs/mintplayer-ng-bootstrap/datatable/src/datatable-sort-base.ts","../../../../libs/mintplayer-ng-bootstrap/datatable/src/datatable/datatable.component.ts","../../../../libs/mintplayer-ng-bootstrap/datatable/src/datatable/datatable.component.html","../../../../libs/mintplayer-ng-bootstrap/datatable/src/row-template/row-template.directive.ts","../../../../libs/mintplayer-ng-bootstrap/datatable/mintplayer-ng-bootstrap-datatable.ts"],"sourcesContent":["import { PaginationRequest, SortColumn } from \"@mintplayer/pagination\";\n\nexport class DatatableSettings {\n constructor(data?: Partial<DatatableSettings>) {\n Object.assign(this, data);\n\n if (data && data.perPage) {\n this.perPage = data.perPage;\n } else {\n // Set default value\n this.perPage = {\n values: [10, 20, 50],\n selected: 20\n };\n }\n\n if (data && data.page) {\n this.page = data.page;\n } else {\n // Set default value\n this.page = {\n values: [1],\n selected: 1\n };\n }\n }\n\n public sortColumns: SortColumn[] = [];\n public perPage: { values: number[], selected: number };\n public page: { values: number[], selected: number };\n public pageNumberOfBoxes: number = 11;\n\n public toPagination() {\n const res = <PaginationRequest>{\n sortColumns: this.sortColumns,\n perPage: this.perPage.selected,\n page: this.page.selected\n };\n return res;\n }\n}","import { Directive, inject, input, TemplateRef } from '@angular/core';\n\n@Directive({\n selector: '[bsDatatableColumn]',\n})\nexport class BsDatatableColumnDirective {\n templateRef = inject(TemplateRef);\n readonly name = input('', { alias: 'bsDatatableColumn' });\n readonly sortable = input(true, { alias: 'bsDatatableColumnSortable' });\n\n}","import { contentChildren, Directive, model } from '@angular/core';\nimport { DatatableSettings } from './datatable-settings';\nimport { BsDatatableColumnDirective } from './datatable-column/datatable-column.directive';\n\n@Directive()\nexport abstract class DatatableSortBase {\n\n readonly columns = contentChildren(BsDatatableColumnDirective);\n\n get columnsArray() {\n return this.columns();\n }\n\n settings = model<DatatableSettings>(new DatatableSettings());\n\n getSortIndex(columnName: string): number {\n return this.settings().sortColumns.findIndex(c => c.property === columnName);\n }\n\n getSortDirection(columnName: string): 'ascending' | 'descending' | null {\n const col = this.settings().sortColumns.find(c => c.property === columnName);\n return col?.direction ?? null;\n }\n\n onHeaderMouseDown(event: MouseEvent) {\n if (event.shiftKey) {\n event.preventDefault();\n }\n }\n\n columnHeaderClicked(column: BsDatatableColumnDirective, event: MouseEvent) {\n if (!column.sortable()) return;\n\n const columnName = column.name();\n const currentSettings = this.settings();\n let sortColumns = currentSettings.sortColumns;\n\n if (event.shiftKey) {\n // Multi-column: add/toggle/remove\n const existingIndex = sortColumns.findIndex(c => c.property === columnName);\n if (existingIndex === -1) {\n sortColumns = [...sortColumns, { property: columnName, direction: 'ascending' as const }];\n } else if (sortColumns[existingIndex].direction === 'ascending') {\n sortColumns = sortColumns.map((c, i) =>\n i === existingIndex ? { ...c, direction: 'descending' as const } : c\n );\n } else {\n sortColumns = sortColumns.filter((_, i) => i !== existingIndex);\n }\n } else {\n // Single-column: replace all\n const existingSingle = sortColumns.length === 1 && sortColumns[0].property === columnName;\n sortColumns = [{\n property: columnName,\n direction: existingSingle && sortColumns[0].direction === 'ascending' ? 'descending' as const : 'ascending' as const\n }];\n }\n\n this.settings.set(new DatatableSettings({ ...currentSettings, sortColumns }));\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, model, signal, TemplateRef } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { PaginationResponse } from '@mintplayer/pagination';\nimport { BsGridComponent, BsGridRowDirective, BsGridColumnDirective } from '@mintplayer/ng-bootstrap/grid';\nimport { BsTableComponent } from '@mintplayer/ng-bootstrap/table';\nimport { BsPaginationComponent } from '@mintplayer/ng-bootstrap/pagination';\nimport { DatatableSettings } from '../datatable-settings';\nimport { DatatableSortBase } from '../datatable-sort-base';\nimport { BsRowTemplateContext } from '../row-template/row-template.directive';\n\n\n@Component({\n selector: 'bs-datatable',\n templateUrl: './datatable.component.html',\n styleUrls: ['./datatable.component.scss'],\n imports: [NgTemplateOutlet, BsGridComponent, BsGridRowDirective, BsGridColumnDirective, BsTableComponent, BsPaginationComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BsDatatableComponent<TData> extends DatatableSortBase {\n\n numberOfColumns = computed(() => this.columns().length);\n\n data = model<PaginationResponse<TData> | undefined>(undefined);\n\n readonly rowTemplate = signal<TemplateRef<BsRowTemplateContext<TData>> | undefined>(undefined);\n\n onPerPageChange(perPage: number) {\n const currentSettings = this.settings();\n this.settings.set(new DatatableSettings({\n ...currentSettings,\n perPage: { ...currentSettings.perPage, selected: perPage },\n page: { ...currentSettings.page, selected: 1 },\n }));\n }\n\n onPageChange(page: number) {\n const currentSettings = this.settings();\n this.settings.set(new DatatableSettings({\n ...currentSettings,\n page: { ...currentSettings.page, selected: page },\n }));\n }\n\n}\n","<bs-table [isResponsive]=\"true\" [striped]=\"true\" [hover]=\"true\" class=\"mb-3\">\n <thead>\n <tr>\n @for (column of columnsArray; track column) {\n <th class=\"text-nowrap\"\n [class.sort]=\"column.sortable()\"\n [class.sort-asc]=\"column.sortable() && getSortDirection(column.name()) === 'ascending'\"\n [class.sort-desc]=\"column.sortable() && getSortDirection(column.name()) === 'descending'\"\n (mousedown)=\"onHeaderMouseDown($event)\"\n (click)=\"columnHeaderClicked(column, $event)\">\n <ng-container *ngTemplateOutlet=\"column.templateRef\"></ng-container>\n @if (settings().sortColumns.length > 1 && getSortIndex(column.name()) >= 0) {\n <span class=\"sort-priority\">{{ getSortIndex(column.name()) + 1 }}</span>\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (!!data() && !!rowTemplate()) {\n @for (item of data()!.data; track $index) {\n <ng-container *ngTemplateOutlet=\"rowTemplate()!; context: { $implicit: item }\"></ng-container>\n }\n }\n </tbody>\n <tfoot>\n <tr>\n <td [colSpan]=\"numberOfColumns()\">\n <bs-grid [stopFullWidthAt]=\"'never'\">\n <div bsRow>\n <div [md]=\"12\">\n <bs-pagination class=\"float-start\" [pageNumbers]=\"settings().perPage.values\"\n [selectedPageNumber]=\"settings().perPage.selected\" (selectedPageNumberChange)=\"onPerPageChange($event)\"\n [showArrows]=\"false\"></bs-pagination>\n <bs-pagination class=\"float-end\" [pageNumbers]=\"settings().page.values\"\n [selectedPageNumber]=\"settings().page.selected\" (selectedPageNumberChange)=\"onPageChange($event)\"\n [showArrows]=\"true\" [numberOfBoxes]=\"settings().pageNumberOfBoxes\"></bs-pagination>\n </div>\n </div>\n </bs-grid>\n </td>\n </tr>\n </tfoot>\n</bs-table>\n","import { Directive, effect, inject, input, TemplateRef } from '@angular/core';\nimport { PaginationResponse } from '@mintplayer/pagination';\nimport { BsDatatableComponent } from '../datatable/datatable.component';\n\n@Directive({\n selector: '[bsRowTemplate]',\n})\nexport class BsRowTemplateDirective<TData> {\n\n private datatableComponent = inject<BsDatatableComponent<TData>>(BsDatatableComponent);\n private templateRef = inject<TemplateRef<BsRowTemplateContext<TData>>>(TemplateRef);\n\n constructor() {\n this.datatableComponent.rowTemplate.set(this.templateRef);\n\n effect(() => {\n const value = this.bsRowTemplateOf();\n this.datatableComponent.data.set(value);\n });\n }\n\n readonly bsRowTemplateOf = input<PaginationResponse<TData> | undefined>(undefined);\n\n public static ngTemplateContextGuard<TData>(\n dir: BsRowTemplateDirective<TData>,\n ctx: any\n ): ctx is BsRowTemplateContext<Exclude<TData, false | 0 | '' | null | undefined>> {\n return true;\n }\n}\n\nexport class BsRowTemplateContext<TData = unknown> {\n public $implicit: TData = null!;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -373,13 +373,10 @@ class BsNavbarDropdownComponent {
373
373
  ])
374
374
  });
375
375
  // Apply pending showInOverlay state if it was set before overlay was ready
376
- // Use setTimeout to avoid ExpressionChangedAfterItHasBeenCheckedError
377
376
  if (this.pendingShowInOverlay !== null) {
378
377
  const pending = this.pendingShowInOverlay;
379
378
  this.pendingShowInOverlay = null;
380
- setTimeout(() => {
381
- this.showInOverlay = pending;
382
- });
379
+ this.showInOverlay = pending;
383
380
  }
384
381
  });
385
382
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mintplayer-ng-bootstrap-navbar.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar/navbar.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar/navbar.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-brand/navbar-brand.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-brand/navbar-brand.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-nav/navbar-nav.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-nav/navbar-nav.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-item/navbar-item.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-item/navbar-item.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-dropdown/navbar-dropdown.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-dropdown/navbar-dropdown.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-content/navbar-content.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/expand-button/expand-button.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/dropdown-toggle/dropdown-toggle.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/nav-link/nav-link.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/mintplayer-ng-bootstrap-navbar.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, ElementRef, input, signal, TemplateRef, viewChild } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { BsContainerComponent } from '@mintplayer/ng-bootstrap/container';\nimport { BsUserAgentDirective } from '@mintplayer/ng-bootstrap/user-agent';\nimport { BsNoNoscriptDirective } from '@mintplayer/ng-bootstrap/no-noscript';\nimport { Breakpoint, Color } from '@mintplayer/ng-bootstrap';\n\n@Component({\n selector: 'bs-navbar',\n templateUrl: './navbar.component.html',\n styleUrls: ['./navbar.component.scss'],\n imports: [NgTemplateOutlet, BsContainerComponent, BsUserAgentDirective, BsNoNoscriptDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(window:resize)': 'onWindowResize()',\n },\n})\nexport class BsNavbarComponent {\n\n private resizeTimeout: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n this.onWindowResize();\n }\n\n onWindowResize() {\n this.isResizing.set(true);\n if (typeof window !== 'undefined') {\n this.windowWidth.set(window.innerWidth);\n }\n\n // Clear any existing timeout to debounce\n if (this.resizeTimeout) {\n clearTimeout(this.resizeTimeout);\n }\n\n // Reset isResizing after debounce period\n this.resizeTimeout = setTimeout(() => {\n this.isResizing.set(false);\n }, 300);\n }\n\n readonly nav = viewChild.required<ElementRef>('nav');\n autoclose = input(true);\n\n expandButtonTemplate = signal<TemplateRef<any> | null>(null);\n\n isExpanded = signal<boolean>(false);\n windowWidth = signal<number | null>(null);\n isResizing = signal<boolean>(false);\n\n color = input<Color | null>(null);\n breakpoint = input<Breakpoint | null>('md');\n\n expandAt = computed(() => {\n const breakpoint = this.breakpoint();\n switch (breakpoint) {\n case 'xxl': return 1400;\n case 'xl': return 1200;\n case 'lg': return 992;\n case 'md': return 768;\n case 'sm': return 576;\n case 'xs': return 0;\n default: return null;\n }\n });\n\n isSmallMode = computed(() => {\n const expandAt = this.expandAt();\n const windowWidth = this.windowWidth();\n if (windowWidth === null) {\n return true;\n } else if (!expandAt) {\n return true;\n } else if (windowWidth >= expandAt) {\n return false;\n } else {\n return true;\n }\n });\n\n expandClass = computed(() => {\n const breakpoint = this.breakpoint();\n if (breakpoint === null) {\n return null;\n } else {\n return `navbar-expand-${breakpoint}`;\n }\n });\n\n wAutoClass = computed(() => {\n const breakpoint = this.breakpoint();\n if (breakpoint === null) {\n return null;\n } else {\n return `w-${breakpoint}-auto`;\n }\n });\n\n dNoneClass = computed(() => {\n const breakpoint = this.breakpoint();\n if (breakpoint === null) {\n return null;\n } else {\n return `d-${breakpoint}-none`;\n }\n });\n\n backgroundColorClass = computed(() => {\n const color = this.color();\n switch (color) {\n case Color.light:\n case null:\n return ['navbar-light'];\n default:\n return ['navbar-dark', `bg-${Color[color]}`];\n }\n });\n\n navClassList = computed(() => {\n const expandClass = this.expandClass();\n const backgroundColorClass = this.backgroundColorClass();\n const result: string[] = [];\n return result.concat(expandClass ?? [], ...backgroundColorClass);\n });\n\n toggleExpanded() {\n this.isExpanded.update(v => !v);\n }\n}\n","<bs-container>\n <nav #nav class=\"navbar position-fixed\" [class]=\"navClassList()\" bsUserAgent bsNoNoscript aria-label=\"Main navigation\">\n <div class=\"container-fluid nav-wrapper\">\n <div class=\"d-flex w-100\" [class]=\"wAutoClass()\">\n <ng-content select=\"bs-navbar-brand\"></ng-content>\n <div class=\"flex-end d-flex tw\" [class]=\"dNoneClass()\">\n <button (click)=\"toggleExpanded()\"\n class=\"align-self-center\"\n [class.navbar-toggler]=\"!expandButtonTemplate()\"\n [class.bg-transparent]=\"expandButtonTemplate()\"\n [class.shadow-none]=\"expandButtonTemplate()\"\n [class.border-0]=\"expandButtonTemplate()\"\n type=\"button\"\n aria-label=\"Toggle navigation\"\n [attr.aria-expanded]=\"isExpanded()\"\n aria-controls=\"navbar-collapse\">\n <ng-container *ngTemplateOutlet=\"expandButtonTemplate() ?? defaultExpandButton; context: { $implicit: isExpanded() }\"></ng-container>\n </button>\n </div>\n </div>\n <ng-content></ng-content>\n </div>\n </nav>\n</bs-container>\n\n<ng-template #defaultExpandButton>\n <span class=\"navbar-toggler-icon\" aria-hidden=\"true\"></span>\n</ng-template>\n","import { AfterContentChecked, Component, ElementRef, inject, input, ChangeDetectionStrategy} from '@angular/core';\n\n@Component({\n selector: 'bs-navbar-brand',\n templateUrl: './navbar-brand.component.html',\n styleUrls: ['./navbar-brand.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class.mx-auto]': 'true',\n },\n})\nexport class BsNavbarBrandComponent implements AfterContentChecked {\n private element = inject(ElementRef);\n readonly routerLink = input<any[]>([]);\n\n ngAfterContentChecked() {\n const anchor = this.element.nativeElement.querySelector('a');\n if (anchor) {\n anchor.classList.add('nav-link');\n }\n }\n}\n","<span class=\"navbar-brand mx-auto mx-md-unset\">\n <ng-content></ng-content>\n</span>","import { ChangeDetectionStrategy, Component, computed, inject, input, signal } from '@angular/core';\nimport { SlideUpDownAnimation } from '@mintplayer/ng-animations';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\n\n@Component({\n selector: 'bs-navbar-nav',\n templateUrl: './navbar-nav.component.html',\n styleUrls: ['./navbar-nav.component.scss'],\n animations: [SlideUpDownAnimation],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(window:resize)': 'onWindowResize()',\n },\n})\nexport class BsNavbarNavComponent {\n\n bsNavbar = inject(BsNavbarComponent);\n\n windowWidth = signal<number | null>(null);\n isResizing = signal<boolean>(false);\n collapse = input<boolean>(true);\n\n private resizeTimeout: ReturnType<typeof setTimeout> | null = null;\n\n showNavs = computed(() => {\n const isExpanded = this.bsNavbar.isExpanded();\n const expandAt = this.bsNavbar.expandAt();\n const windowWidth = this.windowWidth();\n\n if (windowWidth === null) {\n return false;\n } else if (expandAt === null) {\n return isExpanded;\n } else if (windowWidth >= expandAt) {\n return true;\n } else {\n return isExpanded;\n }\n });\n\n constructor() {\n this.onWindowResize();\n }\n\n onWindowResize() {\n this.isResizing.set(true);\n if (typeof window !== 'undefined') {\n this.windowWidth.set(window.innerWidth);\n }\n\n // Clear any existing timeout to debounce\n if (this.resizeTimeout) {\n clearTimeout(this.resizeTimeout);\n }\n\n // Reset isResizing after debounce period\n this.resizeTimeout = setTimeout(() => {\n this.isResizing.set(false);\n }, 300);\n }\n}\n","<div class=\"navbar-collapse w-100 show\" [class.collapse]=\"collapse()\" [@slideUpDown]=\"showNavs()\" [@.disabled]=\"isResizing()\">\n <ul class=\"navbar-nav mr-auto\">\n <ng-content></ng-content>\n </ul>\n</div>\n","import { AfterContentChecked, AfterContentInit, ChangeDetectionStrategy, Component, contentChildren, DestroyRef, effect, ElementRef, forwardRef, inject, PLATFORM_ID } from '@angular/core';\nimport { isPlatformServer } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\nimport { BsNavbarDropdownComponent } from '../navbar-dropdown/navbar-dropdown.component';\n\n/** Duration of the navbar collapse animation in milliseconds */\nconst NAVBAR_ANIMATION_DURATION = 300;\n\n@Component({\n selector: 'bs-navbar-item',\n templateUrl: './navbar-item.component.html',\n styleUrls: ['./navbar-item.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BsNavbarItemComponent implements AfterContentInit, AfterContentChecked {\n\n private navbar = inject(BsNavbarComponent);\n element = inject(ElementRef);\n private destroy = inject(DestroyRef);\n private platformId = inject(PLATFORM_ID);\n private router = inject(Router);\n parentDropdown = inject(forwardRef(() => BsNavbarDropdownComponent), { optional: true });\n\n hasDropdown = false;\n anchorTag: HTMLAnchorElement | null = null;\n readonly dropdowns = contentChildren<BsNavbarDropdownComponent>(forwardRef(() => BsNavbarDropdownComponent));\n\n constructor() {\n // Effect handles future isSmallMode changes after content is initialized\n effect(() => {\n const isSmallMode = this.navbar.isSmallMode();\n this.dropdowns().forEach((dropdown) => {\n dropdown.showInOverlay = !isSmallMode;\n });\n });\n }\n\n ngAfterContentInit() {\n // Set initial showInOverlay state after content children are resolved\n // This is needed because the effect runs before @ContentChildren is populated\n const isSmallMode = this.navbar.isSmallMode();\n this.dropdowns().forEach((dropdown) => {\n dropdown.showInOverlay = !isSmallMode;\n });\n }\n\n ngAfterContentChecked() {\n this.anchorTag = this.element.nativeElement.querySelector('li a');\n this.hasDropdown = this.dropdowns().length > 0;\n\n // Add nav-link or dropdown-item class (previously done by NavLinkDirective)\n if (this.anchorTag && !this.anchorTag.getAttribute('nav-link-class-added')) {\n if (this.parentDropdown === null) {\n this.anchorTag.classList.add('nav-link');\n } else {\n this.anchorTag.classList.add('dropdown-item');\n }\n this.anchorTag.classList.add('cursor-pointer');\n this.anchorTag.setAttribute('nav-link-class-added', 'true');\n }\n\n if (this.hasDropdown) {\n if (this.anchorTag) {\n this.anchorTag.classList.add('dropdown-toggle');\n\n if (isPlatformServer(this.platformId)) {\n this.anchorTag.href = 'javascript:;';\n }\n\n if (!this.anchorTag.getAttribute('close-init-b')) {\n this.anchorTag.setAttribute('close-init-b', '1');\n this.anchorTag.addEventListener('click', (ev: MouseEvent) => {\n ev.preventDefault();\n this.dropdowns().forEach((dropdown) => {\n const newVisible = !dropdown.isVisible();\n dropdown.isVisible.set(newVisible);\n if (!newVisible) {\n dropdown.childDropdowns().forEach((child) => child.isVisible.set(false));\n }\n });\n return false;\n });\n }\n }\n } else {\n\n if ((this.dropdowns().length === 0) && this.anchorTag && !this.anchorTag.getAttribute('close-init-a')) {\n this.anchorTag.setAttribute('close-init-a', '1');\n this.anchorTag.addEventListener('click', (ev: MouseEvent) => {\n let d = this.parentDropdown;\n while (d && d.autoclose()) {\n d.isVisible.set(false);\n d = d.parentDropdown;\n }\n if (this.navbar.autoclose()) {\n // Get the fragment from the link's href\n const href = this.anchorTag?.getAttribute('href') ?? '';\n const fragmentMatch = href.match(/#(.+)$/);\n const fragment = fragmentMatch ? fragmentMatch[1] : null;\n\n // Always collapse the navbar\n this.navbar.isExpanded.set(false);\n\n // If in small mode with a fragment, prevent default navigation and\n // navigate after the collapse animation completes to avoid double scroll\n if (this.navbar.isSmallMode() && fragment) {\n ev.preventDefault();\n\n // After the collapse animation completes, navigate to the anchor\n // This ensures correct scroll position since navbar height is stable\n setTimeout(() => {\n this.router.navigateByUrl(href);\n }, NAVBAR_ANIMATION_DURATION);\n }\n }\n });\n }\n\n }\n }\n}\n","<li [class.nav-item]=\"parentDropdown === null\" [class.dropdown]=\"(dropdowns().length > 0) && (parentDropdown === null)\" [class.dropend]=\"(dropdowns().length > 0) && (parentDropdown !== null)\">\n <ng-content></ng-content>\n</li>","import { DOCUMENT, isPlatformServer } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, contentChildren, computed, DestroyRef, effect, ElementRef, forwardRef, inject, Injector, input, OnDestroy, PLATFORM_ID, signal, SkipSelf, viewChild } from '@angular/core';\nimport { ClickOutsideDirective } from '@mintplayer/ng-click-outside';\nimport { BsHasOverlayComponent } from '@mintplayer/ng-bootstrap/has-overlay';\nimport { BsNoNoscriptDirective } from '@mintplayer/ng-bootstrap/no-noscript';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\nimport { BsNavbarItemComponent } from '../navbar-item/navbar-item.component';\nimport { DomPortal } from '@angular/cdk/portal';\nimport { OverlayRef } from '@angular/cdk/overlay';\n\n@Component({\n selector: 'bs-navbar-dropdown',\n templateUrl: './navbar-dropdown.component.html',\n styleUrls: ['./navbar-dropdown.component.scss'],\n imports: [BsHasOverlayComponent, BsNoNoscriptDirective, ClickOutsideDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BsNavbarDropdownComponent implements OnDestroy {\n\n private navbar = inject(BsNavbarComponent);\n parentDropdown = inject(BsNavbarDropdownComponent, { skipSelf: true, optional: true });\n navbarItem = inject(forwardRef(() => BsNavbarItemComponent), { host: true });\n element = inject<ElementRef<HTMLElement>>(ElementRef);\n private injector = inject(Injector);\n private document = inject(DOCUMENT);\n private platformId = inject(PLATFORM_ID);\n\n private isAttached = false;\n private isDestroyed = false;\n private domPortal?: DomPortal;\n private overlay?: OverlayRef;\n private pendingShowInOverlay: boolean | null = null;\n\n autoclose = input(true);\n readonly dropdownElement = viewChild.required<ElementRef<HTMLDivElement>>('dd');\n isBrowser = !isPlatformServer(this.platformId);\n\n isVisible = signal<boolean>(false);\n topPos = signal<number | null>(null);\n\n maxHeight = computed(() => {\n const topPos = this.topPos();\n const w: Window | null = this.document.defaultView;\n if (!topPos) {\n return null;\n } else if (w && this.dropdownElement()) {\n const style = w.getComputedStyle(this.dropdownElement().nativeElement);\n return `calc(100vh - ${topPos}px - ${style.getPropertyValue('padding-top')} - ${style.getPropertyValue('padding-bottom')})`;\n } else {\n return null;\n }\n });\n\n maxHeightOrNull = computed(() => {\n const maxHeight = this.maxHeight();\n const isSmallMode = this.navbar.isSmallMode();\n if (isSmallMode) {\n return null;\n } else if (isPlatformServer(this.platformId)) {\n return this.parentDropdown ? null : maxHeight;\n } else {\n return maxHeight;\n }\n });\n\n constructor() {\n effect(() => {\n const isVisible = this.isVisible();\n if (isVisible) {\n setTimeout(() => {\n try { this.overlay?.updatePosition(); }\n catch (ex) { }\n }, 20);\n this.topPos.set(this.element.nativeElement.offsetTop);\n } else {\n this.topPos.set(null);\n }\n });\n\n if (!!this.parentDropdown && this.isBrowser) {\n import('@angular/cdk/overlay').then(({ Overlay }) => {\n // Guard against accessing injector after component is destroyed\n if (this.isDestroyed) {\n return;\n }\n const overlayService = this.injector.get(Overlay);\n this.domPortal = new DomPortal(this.element);\n this.overlay = overlayService.create({\n positionStrategy: overlayService.position()\n .flexibleConnectedTo(this.navbarItem.element)\n .withPositions([\n { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top', offsetX: -9, offsetY: -9 }\n ])\n });\n\n // Apply pending showInOverlay state if it was set before overlay was ready\n // Use setTimeout to avoid ExpressionChangedAfterItHasBeenCheckedError\n if (this.pendingShowInOverlay !== null) {\n const pending = this.pendingShowInOverlay;\n this.pendingShowInOverlay = null;\n setTimeout(() => {\n this.showInOverlay = pending;\n });\n }\n });\n }\n }\n\n ngOnDestroy() {\n this.isDestroyed = true;\n }\n\n public set showInOverlay(value: boolean) {\n if (this.overlay && this.domPortal) {\n if (value && !this.isAttached) {\n this.overlay.attach(this.domPortal);\n this.isAttached = true;\n }\n if (!value && this.isAttached) {\n this.overlay.detach();\n this.isAttached = false;\n }\n } else {\n // Store the value to apply once the overlay is ready\n this.pendingShowInOverlay = value;\n }\n }\n\n get elementsToExclude() {\n return [this.navbarItem.anchorTag].filter((a) => a).map((a) => <HTMLElement>a);\n }\n\n readonly childDropdowns = contentChildren<BsNavbarDropdownComponent>(forwardRef(() => BsNavbarDropdownComponent), { descendants: true });\n}\n","<bs-has-overlay></bs-has-overlay>\n<ul #dd class=\"dropdown-menu me-3\" [class.show]=\"isVisible()\" [class.submenu]=\"!!parentDropdown\" [class.overflow-y-auto]=\"isBrowser\" [style.max-height]=\"maxHeightOrNull()\" bsNoNoscript (clickOutside)=\"isVisible.set(false)\" [exclude]=\"elementsToExclude\" aria-labelledby=\"navbarDropdown\">\n <ng-content></ng-content>\n</ul>\n\n<!--\n - Working demo: https://codepen.io/agop/pen/VwwMGR\n - Location must be set through javascript\n - bsNoScript => If noscript, 2nd-level submenus must be shown inside the 1st-level submenu\n -->\n <!--\n - Another option: https://stackblitz.com/edit/web-platform-vmsr4l?file=index.html\n - But this doesn't seem to work here\n -->\n","import { isPlatformServer } from '@angular/common';\nimport { AfterViewInit, Directive, effect, ElementRef, inject, input, OnDestroy, PLATFORM_ID, signal } from '@angular/core';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\n\n@Directive({\n selector: '[bsNavbarContent]',\n})\nexport class BsNavbarContentDirective implements AfterViewInit, OnDestroy {\n\n private element = inject(ElementRef);\n private platformId = inject(PLATFORM_ID);\n\n navbar = input<BsNavbarComponent | undefined>(undefined, { alias: 'bsNavbarContent' });\n private viewInit = signal<boolean>(false);\n resizeObserver: ResizeObserver | null = null;\n initialPadding = 0;\n\n constructor() {\n effect(() => {\n const viewInit = this.viewInit();\n const navbar = this.navbar();\n\n if (viewInit && navbar) {\n if (isPlatformServer(this.platformId)) {\n this.element.nativeElement.style.paddingTop = (this.initialPadding + 58) + 'px';\n } else {\n this.resizeObserver = new ResizeObserver((entries) => {\n const height = navbar.nav().nativeElement.offsetHeight;\n this.element.nativeElement.style.paddingTop = (this.initialPadding + height) + 'px';\n });\n\n const px = getComputedStyle(this.element.nativeElement).getPropertyValue('padding-top');\n const pt = parseInt(px.replace(/px$/, ''));\n this.initialPadding = isNaN(pt) ? 0 : pt;\n if (this.resizeObserver && navbar) {\n this.resizeObserver.observe(navbar.nav().nativeElement);\n }\n }\n }\n });\n }\n\n ngAfterViewInit() {\n this.viewInit.set(true);\n }\n\n ngOnDestroy() {\n const navbar = this.navbar();\n if (navbar) {\n this.resizeObserver?.unobserve(navbar.nav().nativeElement);\n }\n }\n}\n","import { Directive, inject, TemplateRef } from '@angular/core';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\n\n@Directive({\n selector: '[bsExpandButton]',\n})\nexport class BsExpandButtonDirective {\n\n constructor() {\n const navbar = inject(BsNavbarComponent);\n const templateRef = inject(TemplateRef);\n navbar.expandButtonTemplate.set(templateRef);\n }\n \n public static ngTemplateContextGuard(\n dir: BsExpandButtonDirective,\n ctx: any\n ): ctx is BsExpandButtonContext {\n return true;\n }\n\n}\n\nexport class BsExpandButtonContext {\n public $implicit: boolean = null!;\n}","import { AfterContentInit, ContentChildren, Directive, ElementRef, forwardRef, inject, QueryList } from '@angular/core';\nimport { BsNavbarItemComponent } from '../navbar-item/navbar-item.component';\nimport { BsNavbarDropdownComponent } from '../navbar-dropdown/navbar-dropdown.component';\n\n@Directive({\n // selector: 'bs-navbar-item > a[routerLink]',\n selector: 'bs-navbar-item',\n queries: {\n childDropdowns: new ContentChildren(forwardRef(() => BsNavbarDropdownComponent))\n },\n})\nexport class DropdownToggleDirective implements AfterContentInit {\n\n private elementRef = inject<ElementRef<HTMLAnchorElement>>(ElementRef);\n private bsNavbarItem = inject<BsNavbarItemComponent>(forwardRef(() => BsNavbarItemComponent));\n\n childDropdowns!: QueryList<BsNavbarDropdownComponent>;\n\n ngAfterContentInit() {\n if (this.bsNavbarItem.dropdowns().length > 0) {\n this.bsNavbarItem.hasDropdown = true;\n }\n }\n}","import { Directive, ElementRef, forwardRef, inject } from '@angular/core';\nimport { BsNavbarDropdownComponent } from '../navbar-dropdown/navbar-dropdown.component';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\n\n@Directive({\n selector: 'bs-navbar-item > li > a',\n // Below selector doesn't work well either (does not select the github link)\n // selector: 'bs-navbar-item > a[routerLink]'\n // Below selector seems to target other a's that aren't even remotely inside a bs-navbar-item\n // selector: 'bs-navbar-item:first-child > a'\n host: {\n '[class.cursor-pointer]': 'cursorPointer',\n },\n})\nexport class NavLinkDirective {\n\n private elementRef = inject<ElementRef<HTMLAnchorElement>>(ElementRef);\n private parentNavbar = inject(BsNavbarComponent, { optional: true });\n private parentDropdown = inject<BsNavbarDropdownComponent>(forwardRef(() => BsNavbarDropdownComponent), { optional: true });\n\n cursorPointer: boolean;\n\n constructor() {\n if (this.parentNavbar) {\n if (this.parentDropdown == null) {\n this.elementRef.nativeElement.classList.add('nav-link');\n } else {\n this.elementRef.nativeElement.classList.add('dropdown-item');\n }\n }\n this.cursorPointer = !!this.parentNavbar;\n }\n\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mintplayer-ng-bootstrap-navbar.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar/navbar.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar/navbar.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-brand/navbar-brand.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-brand/navbar-brand.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-nav/navbar-nav.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-nav/navbar-nav.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-item/navbar-item.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-item/navbar-item.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-dropdown/navbar-dropdown.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-dropdown/navbar-dropdown.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-content/navbar-content.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/expand-button/expand-button.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/dropdown-toggle/dropdown-toggle.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/nav-link/nav-link.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/mintplayer-ng-bootstrap-navbar.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, ElementRef, input, signal, TemplateRef, viewChild } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { BsContainerComponent } from '@mintplayer/ng-bootstrap/container';\nimport { BsUserAgentDirective } from '@mintplayer/ng-bootstrap/user-agent';\nimport { BsNoNoscriptDirective } from '@mintplayer/ng-bootstrap/no-noscript';\nimport { Breakpoint, Color } from '@mintplayer/ng-bootstrap';\n\n@Component({\n selector: 'bs-navbar',\n templateUrl: './navbar.component.html',\n styleUrls: ['./navbar.component.scss'],\n imports: [NgTemplateOutlet, BsContainerComponent, BsUserAgentDirective, BsNoNoscriptDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(window:resize)': 'onWindowResize()',\n },\n})\nexport class BsNavbarComponent {\n\n private resizeTimeout: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n this.onWindowResize();\n }\n\n onWindowResize() {\n this.isResizing.set(true);\n if (typeof window !== 'undefined') {\n this.windowWidth.set(window.innerWidth);\n }\n\n // Clear any existing timeout to debounce\n if (this.resizeTimeout) {\n clearTimeout(this.resizeTimeout);\n }\n\n // Reset isResizing after debounce period\n this.resizeTimeout = setTimeout(() => {\n this.isResizing.set(false);\n }, 300);\n }\n\n readonly nav = viewChild.required<ElementRef>('nav');\n autoclose = input(true);\n\n expandButtonTemplate = signal<TemplateRef<any> | null>(null);\n\n isExpanded = signal<boolean>(false);\n windowWidth = signal<number | null>(null);\n isResizing = signal<boolean>(false);\n\n color = input<Color | null>(null);\n breakpoint = input<Breakpoint | null>('md');\n\n expandAt = computed(() => {\n const breakpoint = this.breakpoint();\n switch (breakpoint) {\n case 'xxl': return 1400;\n case 'xl': return 1200;\n case 'lg': return 992;\n case 'md': return 768;\n case 'sm': return 576;\n case 'xs': return 0;\n default: return null;\n }\n });\n\n isSmallMode = computed(() => {\n const expandAt = this.expandAt();\n const windowWidth = this.windowWidth();\n if (windowWidth === null) {\n return true;\n } else if (!expandAt) {\n return true;\n } else if (windowWidth >= expandAt) {\n return false;\n } else {\n return true;\n }\n });\n\n expandClass = computed(() => {\n const breakpoint = this.breakpoint();\n if (breakpoint === null) {\n return null;\n } else {\n return `navbar-expand-${breakpoint}`;\n }\n });\n\n wAutoClass = computed(() => {\n const breakpoint = this.breakpoint();\n if (breakpoint === null) {\n return null;\n } else {\n return `w-${breakpoint}-auto`;\n }\n });\n\n dNoneClass = computed(() => {\n const breakpoint = this.breakpoint();\n if (breakpoint === null) {\n return null;\n } else {\n return `d-${breakpoint}-none`;\n }\n });\n\n backgroundColorClass = computed(() => {\n const color = this.color();\n switch (color) {\n case Color.light:\n case null:\n return ['navbar-light'];\n default:\n return ['navbar-dark', `bg-${Color[color]}`];\n }\n });\n\n navClassList = computed(() => {\n const expandClass = this.expandClass();\n const backgroundColorClass = this.backgroundColorClass();\n const result: string[] = [];\n return result.concat(expandClass ?? [], ...backgroundColorClass);\n });\n\n toggleExpanded() {\n this.isExpanded.update(v => !v);\n }\n}\n","<bs-container>\n <nav #nav class=\"navbar position-fixed\" [class]=\"navClassList()\" bsUserAgent bsNoNoscript aria-label=\"Main navigation\">\n <div class=\"container-fluid nav-wrapper\">\n <div class=\"d-flex w-100\" [class]=\"wAutoClass()\">\n <ng-content select=\"bs-navbar-brand\"></ng-content>\n <div class=\"flex-end d-flex tw\" [class]=\"dNoneClass()\">\n <button (click)=\"toggleExpanded()\"\n class=\"align-self-center\"\n [class.navbar-toggler]=\"!expandButtonTemplate()\"\n [class.bg-transparent]=\"expandButtonTemplate()\"\n [class.shadow-none]=\"expandButtonTemplate()\"\n [class.border-0]=\"expandButtonTemplate()\"\n type=\"button\"\n aria-label=\"Toggle navigation\"\n [attr.aria-expanded]=\"isExpanded()\"\n aria-controls=\"navbar-collapse\">\n <ng-container *ngTemplateOutlet=\"expandButtonTemplate() ?? defaultExpandButton; context: { $implicit: isExpanded() }\"></ng-container>\n </button>\n </div>\n </div>\n <ng-content></ng-content>\n </div>\n </nav>\n</bs-container>\n\n<ng-template #defaultExpandButton>\n <span class=\"navbar-toggler-icon\" aria-hidden=\"true\"></span>\n</ng-template>\n","import { AfterContentChecked, Component, ElementRef, inject, input, ChangeDetectionStrategy} from '@angular/core';\n\n@Component({\n selector: 'bs-navbar-brand',\n templateUrl: './navbar-brand.component.html',\n styleUrls: ['./navbar-brand.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class.mx-auto]': 'true',\n },\n})\nexport class BsNavbarBrandComponent implements AfterContentChecked {\n private element = inject(ElementRef);\n readonly routerLink = input<any[]>([]);\n\n ngAfterContentChecked() {\n const anchor = this.element.nativeElement.querySelector('a');\n if (anchor) {\n anchor.classList.add('nav-link');\n }\n }\n}\n","<span class=\"navbar-brand mx-auto mx-md-unset\">\n <ng-content></ng-content>\n</span>","import { ChangeDetectionStrategy, Component, computed, inject, input, signal } from '@angular/core';\nimport { SlideUpDownAnimation } from '@mintplayer/ng-animations';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\n\n@Component({\n selector: 'bs-navbar-nav',\n templateUrl: './navbar-nav.component.html',\n styleUrls: ['./navbar-nav.component.scss'],\n animations: [SlideUpDownAnimation],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(window:resize)': 'onWindowResize()',\n },\n})\nexport class BsNavbarNavComponent {\n\n bsNavbar = inject(BsNavbarComponent);\n\n windowWidth = signal<number | null>(null);\n isResizing = signal<boolean>(false);\n collapse = input<boolean>(true);\n\n private resizeTimeout: ReturnType<typeof setTimeout> | null = null;\n\n showNavs = computed(() => {\n const isExpanded = this.bsNavbar.isExpanded();\n const expandAt = this.bsNavbar.expandAt();\n const windowWidth = this.windowWidth();\n\n if (windowWidth === null) {\n return false;\n } else if (expandAt === null) {\n return isExpanded;\n } else if (windowWidth >= expandAt) {\n return true;\n } else {\n return isExpanded;\n }\n });\n\n constructor() {\n this.onWindowResize();\n }\n\n onWindowResize() {\n this.isResizing.set(true);\n if (typeof window !== 'undefined') {\n this.windowWidth.set(window.innerWidth);\n }\n\n // Clear any existing timeout to debounce\n if (this.resizeTimeout) {\n clearTimeout(this.resizeTimeout);\n }\n\n // Reset isResizing after debounce period\n this.resizeTimeout = setTimeout(() => {\n this.isResizing.set(false);\n }, 300);\n }\n}\n","<div class=\"navbar-collapse w-100 show\" [class.collapse]=\"collapse()\" [@slideUpDown]=\"showNavs()\" [@.disabled]=\"isResizing()\">\n <ul class=\"navbar-nav mr-auto\">\n <ng-content></ng-content>\n </ul>\n</div>\n","import { AfterContentChecked, AfterContentInit, ChangeDetectionStrategy, Component, contentChildren, DestroyRef, effect, ElementRef, forwardRef, inject, PLATFORM_ID } from '@angular/core';\nimport { isPlatformServer } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\nimport { BsNavbarDropdownComponent } from '../navbar-dropdown/navbar-dropdown.component';\n\n/** Duration of the navbar collapse animation in milliseconds */\nconst NAVBAR_ANIMATION_DURATION = 300;\n\n@Component({\n selector: 'bs-navbar-item',\n templateUrl: './navbar-item.component.html',\n styleUrls: ['./navbar-item.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BsNavbarItemComponent implements AfterContentInit, AfterContentChecked {\n\n private navbar = inject(BsNavbarComponent);\n element = inject(ElementRef);\n private destroy = inject(DestroyRef);\n private platformId = inject(PLATFORM_ID);\n private router = inject(Router);\n parentDropdown = inject(forwardRef(() => BsNavbarDropdownComponent), { optional: true });\n\n hasDropdown = false;\n anchorTag: HTMLAnchorElement | null = null;\n readonly dropdowns = contentChildren<BsNavbarDropdownComponent>(forwardRef(() => BsNavbarDropdownComponent));\n\n constructor() {\n // Effect handles future isSmallMode changes after content is initialized\n effect(() => {\n const isSmallMode = this.navbar.isSmallMode();\n this.dropdowns().forEach((dropdown) => {\n dropdown.showInOverlay = !isSmallMode;\n });\n });\n }\n\n ngAfterContentInit() {\n // Set initial showInOverlay state after content children are resolved\n // This is needed because the effect runs before @ContentChildren is populated\n const isSmallMode = this.navbar.isSmallMode();\n this.dropdowns().forEach((dropdown) => {\n dropdown.showInOverlay = !isSmallMode;\n });\n }\n\n ngAfterContentChecked() {\n this.anchorTag = this.element.nativeElement.querySelector('li a');\n this.hasDropdown = this.dropdowns().length > 0;\n\n // Add nav-link or dropdown-item class (previously done by NavLinkDirective)\n if (this.anchorTag && !this.anchorTag.getAttribute('nav-link-class-added')) {\n if (this.parentDropdown === null) {\n this.anchorTag.classList.add('nav-link');\n } else {\n this.anchorTag.classList.add('dropdown-item');\n }\n this.anchorTag.classList.add('cursor-pointer');\n this.anchorTag.setAttribute('nav-link-class-added', 'true');\n }\n\n if (this.hasDropdown) {\n if (this.anchorTag) {\n this.anchorTag.classList.add('dropdown-toggle');\n\n if (isPlatformServer(this.platformId)) {\n this.anchorTag.href = 'javascript:;';\n }\n\n if (!this.anchorTag.getAttribute('close-init-b')) {\n this.anchorTag.setAttribute('close-init-b', '1');\n this.anchorTag.addEventListener('click', (ev: MouseEvent) => {\n ev.preventDefault();\n this.dropdowns().forEach((dropdown) => {\n const newVisible = !dropdown.isVisible();\n dropdown.isVisible.set(newVisible);\n if (!newVisible) {\n dropdown.childDropdowns().forEach((child) => child.isVisible.set(false));\n }\n });\n return false;\n });\n }\n }\n } else {\n\n if ((this.dropdowns().length === 0) && this.anchorTag && !this.anchorTag.getAttribute('close-init-a')) {\n this.anchorTag.setAttribute('close-init-a', '1');\n this.anchorTag.addEventListener('click', (ev: MouseEvent) => {\n let d = this.parentDropdown;\n while (d && d.autoclose()) {\n d.isVisible.set(false);\n d = d.parentDropdown;\n }\n if (this.navbar.autoclose()) {\n // Get the fragment from the link's href\n const href = this.anchorTag?.getAttribute('href') ?? '';\n const fragmentMatch = href.match(/#(.+)$/);\n const fragment = fragmentMatch ? fragmentMatch[1] : null;\n\n // Always collapse the navbar\n this.navbar.isExpanded.set(false);\n\n // If in small mode with a fragment, prevent default navigation and\n // navigate after the collapse animation completes to avoid double scroll\n if (this.navbar.isSmallMode() && fragment) {\n ev.preventDefault();\n\n // After the collapse animation completes, navigate to the anchor\n // This ensures correct scroll position since navbar height is stable\n setTimeout(() => {\n this.router.navigateByUrl(href);\n }, NAVBAR_ANIMATION_DURATION);\n }\n }\n });\n }\n\n }\n }\n}\n","<li [class.nav-item]=\"parentDropdown === null\" [class.dropdown]=\"(dropdowns().length > 0) && (parentDropdown === null)\" [class.dropend]=\"(dropdowns().length > 0) && (parentDropdown !== null)\">\n <ng-content></ng-content>\n</li>","import { DOCUMENT, isPlatformServer } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, contentChildren, computed, DestroyRef, effect, ElementRef, forwardRef, inject, Injector, input, OnDestroy, PLATFORM_ID, signal, SkipSelf, viewChild } from '@angular/core';\nimport { ClickOutsideDirective } from '@mintplayer/ng-click-outside';\nimport { BsHasOverlayComponent } from '@mintplayer/ng-bootstrap/has-overlay';\nimport { BsNoNoscriptDirective } from '@mintplayer/ng-bootstrap/no-noscript';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\nimport { BsNavbarItemComponent } from '../navbar-item/navbar-item.component';\nimport { DomPortal } from '@angular/cdk/portal';\nimport { OverlayRef } from '@angular/cdk/overlay';\n\n@Component({\n selector: 'bs-navbar-dropdown',\n templateUrl: './navbar-dropdown.component.html',\n styleUrls: ['./navbar-dropdown.component.scss'],\n imports: [BsHasOverlayComponent, BsNoNoscriptDirective, ClickOutsideDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BsNavbarDropdownComponent implements OnDestroy {\n\n private navbar = inject(BsNavbarComponent);\n parentDropdown = inject(BsNavbarDropdownComponent, { skipSelf: true, optional: true });\n navbarItem = inject(forwardRef(() => BsNavbarItemComponent), { host: true });\n element = inject<ElementRef<HTMLElement>>(ElementRef);\n private injector = inject(Injector);\n private document = inject(DOCUMENT);\n private platformId = inject(PLATFORM_ID);\n\n private isAttached = false;\n private isDestroyed = false;\n private domPortal?: DomPortal;\n private overlay?: OverlayRef;\n private pendingShowInOverlay: boolean | null = null;\n\n autoclose = input(true);\n readonly dropdownElement = viewChild.required<ElementRef<HTMLDivElement>>('dd');\n isBrowser = !isPlatformServer(this.platformId);\n\n isVisible = signal<boolean>(false);\n topPos = signal<number | null>(null);\n\n maxHeight = computed(() => {\n const topPos = this.topPos();\n const w: Window | null = this.document.defaultView;\n if (!topPos) {\n return null;\n } else if (w && this.dropdownElement()) {\n const style = w.getComputedStyle(this.dropdownElement().nativeElement);\n return `calc(100vh - ${topPos}px - ${style.getPropertyValue('padding-top')} - ${style.getPropertyValue('padding-bottom')})`;\n } else {\n return null;\n }\n });\n\n maxHeightOrNull = computed(() => {\n const maxHeight = this.maxHeight();\n const isSmallMode = this.navbar.isSmallMode();\n if (isSmallMode) {\n return null;\n } else if (isPlatformServer(this.platformId)) {\n return this.parentDropdown ? null : maxHeight;\n } else {\n return maxHeight;\n }\n });\n\n constructor() {\n effect(() => {\n const isVisible = this.isVisible();\n if (isVisible) {\n setTimeout(() => {\n try { this.overlay?.updatePosition(); }\n catch (ex) { }\n }, 20);\n this.topPos.set(this.element.nativeElement.offsetTop);\n } else {\n this.topPos.set(null);\n }\n });\n\n if (!!this.parentDropdown && this.isBrowser) {\n import('@angular/cdk/overlay').then(({ Overlay }) => {\n // Guard against accessing injector after component is destroyed\n if (this.isDestroyed) {\n return;\n }\n const overlayService = this.injector.get(Overlay);\n this.domPortal = new DomPortal(this.element);\n this.overlay = overlayService.create({\n positionStrategy: overlayService.position()\n .flexibleConnectedTo(this.navbarItem.element)\n .withPositions([\n { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top', offsetX: -9, offsetY: -9 }\n ])\n });\n\n // Apply pending showInOverlay state if it was set before overlay was ready\n if (this.pendingShowInOverlay !== null) {\n const pending = this.pendingShowInOverlay;\n this.pendingShowInOverlay = null;\n this.showInOverlay = pending;\n }\n });\n }\n }\n\n ngOnDestroy() {\n this.isDestroyed = true;\n }\n\n public set showInOverlay(value: boolean) {\n if (this.overlay && this.domPortal) {\n if (value && !this.isAttached) {\n this.overlay.attach(this.domPortal);\n this.isAttached = true;\n }\n if (!value && this.isAttached) {\n this.overlay.detach();\n this.isAttached = false;\n }\n } else {\n // Store the value to apply once the overlay is ready\n this.pendingShowInOverlay = value;\n }\n }\n\n get elementsToExclude() {\n return [this.navbarItem.anchorTag].filter((a) => a).map((a) => <HTMLElement>a);\n }\n\n readonly childDropdowns = contentChildren<BsNavbarDropdownComponent>(forwardRef(() => BsNavbarDropdownComponent), { descendants: true });\n}\n","<bs-has-overlay></bs-has-overlay>\n<ul #dd class=\"dropdown-menu me-3\" [class.show]=\"isVisible()\" [class.submenu]=\"!!parentDropdown\" [class.overflow-y-auto]=\"isBrowser\" [style.max-height]=\"maxHeightOrNull()\" bsNoNoscript (clickOutside)=\"isVisible.set(false)\" [exclude]=\"elementsToExclude\" aria-labelledby=\"navbarDropdown\">\n <ng-content></ng-content>\n</ul>\n\n<!--\n - Working demo: https://codepen.io/agop/pen/VwwMGR\n - Location must be set through javascript\n - bsNoScript => If noscript, 2nd-level submenus must be shown inside the 1st-level submenu\n -->\n <!--\n - Another option: https://stackblitz.com/edit/web-platform-vmsr4l?file=index.html\n - But this doesn't seem to work here\n -->\n","import { isPlatformServer } from '@angular/common';\nimport { AfterViewInit, Directive, effect, ElementRef, inject, input, OnDestroy, PLATFORM_ID, signal } from '@angular/core';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\n\n@Directive({\n selector: '[bsNavbarContent]',\n})\nexport class BsNavbarContentDirective implements AfterViewInit, OnDestroy {\n\n private element = inject(ElementRef);\n private platformId = inject(PLATFORM_ID);\n\n navbar = input<BsNavbarComponent | undefined>(undefined, { alias: 'bsNavbarContent' });\n private viewInit = signal<boolean>(false);\n resizeObserver: ResizeObserver | null = null;\n initialPadding = 0;\n\n constructor() {\n effect(() => {\n const viewInit = this.viewInit();\n const navbar = this.navbar();\n\n if (viewInit && navbar) {\n if (isPlatformServer(this.platformId)) {\n this.element.nativeElement.style.paddingTop = (this.initialPadding + 58) + 'px';\n } else {\n this.resizeObserver = new ResizeObserver((entries) => {\n const height = navbar.nav().nativeElement.offsetHeight;\n this.element.nativeElement.style.paddingTop = (this.initialPadding + height) + 'px';\n });\n\n const px = getComputedStyle(this.element.nativeElement).getPropertyValue('padding-top');\n const pt = parseInt(px.replace(/px$/, ''));\n this.initialPadding = isNaN(pt) ? 0 : pt;\n if (this.resizeObserver && navbar) {\n this.resizeObserver.observe(navbar.nav().nativeElement);\n }\n }\n }\n });\n }\n\n ngAfterViewInit() {\n this.viewInit.set(true);\n }\n\n ngOnDestroy() {\n const navbar = this.navbar();\n if (navbar) {\n this.resizeObserver?.unobserve(navbar.nav().nativeElement);\n }\n }\n}\n","import { Directive, inject, TemplateRef } from '@angular/core';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\n\n@Directive({\n selector: '[bsExpandButton]',\n})\nexport class BsExpandButtonDirective {\n\n constructor() {\n const navbar = inject(BsNavbarComponent);\n const templateRef = inject(TemplateRef);\n navbar.expandButtonTemplate.set(templateRef);\n }\n \n public static ngTemplateContextGuard(\n dir: BsExpandButtonDirective,\n ctx: any\n ): ctx is BsExpandButtonContext {\n return true;\n }\n\n}\n\nexport class BsExpandButtonContext {\n public $implicit: boolean = null!;\n}","import { AfterContentInit, ContentChildren, Directive, ElementRef, forwardRef, inject, QueryList } from '@angular/core';\nimport { BsNavbarItemComponent } from '../navbar-item/navbar-item.component';\nimport { BsNavbarDropdownComponent } from '../navbar-dropdown/navbar-dropdown.component';\n\n@Directive({\n // selector: 'bs-navbar-item > a[routerLink]',\n selector: 'bs-navbar-item',\n queries: {\n childDropdowns: new ContentChildren(forwardRef(() => BsNavbarDropdownComponent))\n },\n})\nexport class DropdownToggleDirective implements AfterContentInit {\n\n private elementRef = inject<ElementRef<HTMLAnchorElement>>(ElementRef);\n private bsNavbarItem = inject<BsNavbarItemComponent>(forwardRef(() => BsNavbarItemComponent));\n\n childDropdowns!: QueryList<BsNavbarDropdownComponent>;\n\n ngAfterContentInit() {\n if (this.bsNavbarItem.dropdowns().length > 0) {\n this.bsNavbarItem.hasDropdown = true;\n }\n }\n}","import { Directive, ElementRef, forwardRef, inject } from '@angular/core';\nimport { BsNavbarDropdownComponent } from '../navbar-dropdown/navbar-dropdown.component';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\n\n@Directive({\n selector: 'bs-navbar-item > li > a',\n // Below selector doesn't work well either (does not select the github link)\n // selector: 'bs-navbar-item > a[routerLink]'\n // Below selector seems to target other a's that aren't even remotely inside a bs-navbar-item\n // selector: 'bs-navbar-item:first-child > a'\n host: {\n '[class.cursor-pointer]': 'cursorPointer',\n },\n})\nexport class NavLinkDirective {\n\n private elementRef = inject<ElementRef<HTMLAnchorElement>>(ElementRef);\n private parentNavbar = inject(BsNavbarComponent, { optional: true });\n private parentDropdown = inject<BsNavbarDropdownComponent>(forwardRef(() => BsNavbarDropdownComponent), { optional: true });\n\n cursorPointer: boolean;\n\n constructor() {\n if (this.parentNavbar) {\n if (this.parentDropdown == null) {\n this.elementRef.nativeElement.classList.add('nav-link');\n } else {\n this.elementRef.nativeElement.classList.add('dropdown-item');\n }\n }\n this.cursorPointer = !!this.parentNavbar;\n }\n\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -20,7 +20,7 @@ class BsTimepickerComponent {
20
20
  this.clock = signal(undefined, ...(ngDevMode ? [{ debugName: "clock" }] : []));
21
21
  this.colors = Color;
22
22
  this.isOpen = model(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : []));
23
- this.presetTimestamps = [];
23
+ this.presetTimestamps = signal([], ...(ngDevMode ? [{ debugName: "presetTimestamps" }] : []));
24
24
  this.isFocused = signal(false, ...(ngDevMode ? [{ debugName: "isFocused" }] : []));
25
25
  this.selectedTime = model(new Date(), ...(ngDevMode ? [{ debugName: "selectedTime" }] : []));
26
26
  const today = new Date();
@@ -28,12 +28,12 @@ class BsTimepickerComponent {
28
28
  today.setMinutes(0);
29
29
  today.setSeconds(0);
30
30
  const interval = 900;
31
- this.presetTimestamps = Array.from(Array(24 * 60 * 60 / interval).keys())
31
+ this.presetTimestamps.set(Array.from(Array(24 * 60 * 60 / interval).keys())
32
32
  .map(i => {
33
33
  const clone = new Date(today);
34
34
  clone.setTime(clone.getTime() + i * interval * 1000);
35
35
  return clone;
36
- });
36
+ }));
37
37
  import('bootstrap-icons/icons/clock.svg').then((icon) => {
38
38
  this.clock.set(this.sanitizer.bypassSecurityTrustHtml(icon.default));
39
39
  });
@@ -89,11 +89,11 @@ class BsTimepickerComponent {
89
89
  return (time1.getHours() === time2.getHours()) && (time1.getMinutes() === time2.getMinutes());
90
90
  }
91
91
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: BsTimepickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
92
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.6", type: BsTimepickerComponent, isStandalone: true, selector: "bs-timepicker", inputs: { isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: true, isRequired: false, transformFunction: null }, selectedTime: { classPropertyName: "selectedTime", publicName: "selectedTime", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { isOpen: "isOpenChange", selectedTime: "selectedTimeChange" }, ngImport: i0, template: "<!-- <bs-dropdown [(isOpen)]=\"isOpen\" [sameDropdownWidth]=\"true\"></bs-dropdown> -->\n<div bsDropdown [(isOpen)]=\"isOpen\" [sameDropdownWidth]=\"true\">\n <bs-form>\n <bs-input-group>\n <span class=\"form-control d-flex\" [class.focus]=\"isFocused()\">\n <div class=\"flex-grow-1\">\n <input type=\"number\" [min]=\"0\" [max]=\"23\" (input)=\"setNumber($event, 23, minuteBox)\" bsEnhancedPaste [ngModel]=\"hours | number: '2.0'\" (ngModelChange)=\"hours = $event\" (focus)=\"selectAll(hourBox)\" (blur)=\"isFocused.set(false)\" #hourBox class=\"w-100 border-0 bg-transparent text-end no-form-control\">\n </div>\n <span class=\"px-1\">:</span>\n <div class=\"flex-grow-1\">\n <input type=\"number\" [min]=\"0\" [max]=\"59\" (input)=\"setNumber($event, 59, null)\" bsEnhancedPaste [ngModel]=\"minutes | number: '2.0'\" (ngModelChange)=\"minutes = $event\" (focus)=\"selectAll(minuteBox)\" (blur)=\"isFocused.set(false)\" #minuteBox class=\"w-100 border-0 bg-transparent no-form-control\">\n </div>\n </span>\n <button [color]=\"colors.secondary\" (click)=\"isOpen.set(!isOpen())\">\n <span [innerHTML]=\"clock()\"></span>\n </button>\n </bs-input-group>\n </bs-form>\n <bs-has-overlay></bs-has-overlay>\n <bs-dropdown-menu class=\"overflow-auto\" *bsDropdownMenu>\n @for (timestamp of presetTimestamps; track timestamp) {\n <bs-dropdown-item [isSelected]=\"timesEqual(selectedTime(), timestamp)\" (click)=\"setTime(timestamp)\">\n {{ timestamp | date: 'HH:mm' }}\n </bs-dropdown-item>\n }\n </bs-dropdown-menu>\n</div>", styles: [":host{display:inline-block}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield;outline:0px!important}.form-control{transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control.focus{color:#495057;background-color:#fff;border-color:#80bdff!important;outline:0;box-shadow:0 0 0 .2rem #007bff40}bs-dropdown-menu{max-height:250px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: EnhancedPasteDirective, selector: "input[type=\"number\"][bsEnhancedPaste]", outputs: ["numberOverflow"] }, { kind: "component", type: BsFormComponent, selector: "bs-form", inputs: ["action", "method"], outputs: ["submitted"] }, { kind: "directive", type: BsDropdownDirective, selector: "[bsDropdown]", inputs: ["hasBackdrop", "sameWidth", "closeOnClickOutside", "sameDropdownWidth", "isOpen"], outputs: ["isOpenChange"] }, { kind: "directive", type: BsDropdownMenuDirective, selector: "[bsDropdownMenu]" }, { kind: "component", type: BsDropdownMenuComponent, selector: "bs-dropdown-menu", inputs: ["maxHeight"] }, { kind: "component", type: BsDropdownItemComponent, selector: "bs-dropdown-item", inputs: ["isSelected", "disabled"] }, { kind: "component", type: BsInputGroupComponent, selector: "bs-input-group" }, { kind: "directive", type: BsButtonTypeDirective, selector: "button[color],input[type=\"button\"][color],input[type=\"submit\"][color],a[color]", inputs: ["color"] }, { kind: "component", type: BsHasOverlayComponent, selector: "bs-has-overlay" }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: DecimalPipe, name: "number" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
92
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.6", type: BsTimepickerComponent, isStandalone: true, selector: "bs-timepicker", inputs: { isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: true, isRequired: false, transformFunction: null }, selectedTime: { classPropertyName: "selectedTime", publicName: "selectedTime", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { isOpen: "isOpenChange", selectedTime: "selectedTimeChange" }, ngImport: i0, template: "<!-- <bs-dropdown [(isOpen)]=\"isOpen\" [sameDropdownWidth]=\"true\"></bs-dropdown> -->\n<div bsDropdown [(isOpen)]=\"isOpen\" [sameDropdownWidth]=\"true\">\n <bs-form>\n <bs-input-group>\n <span class=\"form-control d-flex\" [class.focus]=\"isFocused()\">\n <div class=\"flex-grow-1\">\n <input type=\"number\" [min]=\"0\" [max]=\"23\" (input)=\"setNumber($event, 23, minuteBox)\" bsEnhancedPaste [ngModel]=\"hours | number: '2.0'\" (ngModelChange)=\"hours = $event\" (focus)=\"selectAll(hourBox)\" (blur)=\"isFocused.set(false)\" #hourBox class=\"w-100 border-0 bg-transparent text-end no-form-control\">\n </div>\n <span class=\"px-1\">:</span>\n <div class=\"flex-grow-1\">\n <input type=\"number\" [min]=\"0\" [max]=\"59\" (input)=\"setNumber($event, 59, null)\" bsEnhancedPaste [ngModel]=\"minutes | number: '2.0'\" (ngModelChange)=\"minutes = $event\" (focus)=\"selectAll(minuteBox)\" (blur)=\"isFocused.set(false)\" #minuteBox class=\"w-100 border-0 bg-transparent no-form-control\">\n </div>\n </span>\n <button [color]=\"colors.secondary\" (click)=\"isOpen.set(!isOpen())\">\n <span [innerHTML]=\"clock()\"></span>\n </button>\n </bs-input-group>\n </bs-form>\n <bs-has-overlay></bs-has-overlay>\n <bs-dropdown-menu class=\"overflow-auto\" *bsDropdownMenu>\n @for (timestamp of presetTimestamps(); track timestamp) {\n <bs-dropdown-item [isSelected]=\"timesEqual(selectedTime(), timestamp)\" (click)=\"setTime(timestamp)\">\n {{ timestamp | date: 'HH:mm' }}\n </bs-dropdown-item>\n }\n </bs-dropdown-menu>\n</div>", styles: [":host{display:inline-block}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield;outline:0px!important}.form-control{transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control.focus{color:#495057;background-color:#fff;border-color:#80bdff!important;outline:0;box-shadow:0 0 0 .2rem #007bff40}bs-dropdown-menu{max-height:250px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: EnhancedPasteDirective, selector: "input[type=\"number\"][bsEnhancedPaste]", outputs: ["numberOverflow"] }, { kind: "component", type: BsFormComponent, selector: "bs-form", inputs: ["action", "method"], outputs: ["submitted"] }, { kind: "directive", type: BsDropdownDirective, selector: "[bsDropdown]", inputs: ["hasBackdrop", "sameWidth", "closeOnClickOutside", "sameDropdownWidth", "isOpen"], outputs: ["isOpenChange"] }, { kind: "directive", type: BsDropdownMenuDirective, selector: "[bsDropdownMenu]" }, { kind: "component", type: BsDropdownMenuComponent, selector: "bs-dropdown-menu", inputs: ["maxHeight"] }, { kind: "component", type: BsDropdownItemComponent, selector: "bs-dropdown-item", inputs: ["isSelected", "disabled"] }, { kind: "component", type: BsInputGroupComponent, selector: "bs-input-group" }, { kind: "directive", type: BsButtonTypeDirective, selector: "button[color],input[type=\"button\"][color],input[type=\"submit\"][color],a[color]", inputs: ["color"] }, { kind: "component", type: BsHasOverlayComponent, selector: "bs-has-overlay" }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: DecimalPipe, name: "number" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
93
93
  }
94
94
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: BsTimepickerComponent, decorators: [{
95
95
  type: Component,
96
- args: [{ selector: 'bs-timepicker', imports: [DatePipe, DecimalPipe, FormsModule, EnhancedPasteDirective, BsFormComponent, BsDropdownDirective, BsDropdownMenuDirective, BsDropdownMenuComponent, BsDropdownItemComponent, BsInputGroupComponent, BsButtonTypeDirective, BsHasOverlayComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- <bs-dropdown [(isOpen)]=\"isOpen\" [sameDropdownWidth]=\"true\"></bs-dropdown> -->\n<div bsDropdown [(isOpen)]=\"isOpen\" [sameDropdownWidth]=\"true\">\n <bs-form>\n <bs-input-group>\n <span class=\"form-control d-flex\" [class.focus]=\"isFocused()\">\n <div class=\"flex-grow-1\">\n <input type=\"number\" [min]=\"0\" [max]=\"23\" (input)=\"setNumber($event, 23, minuteBox)\" bsEnhancedPaste [ngModel]=\"hours | number: '2.0'\" (ngModelChange)=\"hours = $event\" (focus)=\"selectAll(hourBox)\" (blur)=\"isFocused.set(false)\" #hourBox class=\"w-100 border-0 bg-transparent text-end no-form-control\">\n </div>\n <span class=\"px-1\">:</span>\n <div class=\"flex-grow-1\">\n <input type=\"number\" [min]=\"0\" [max]=\"59\" (input)=\"setNumber($event, 59, null)\" bsEnhancedPaste [ngModel]=\"minutes | number: '2.0'\" (ngModelChange)=\"minutes = $event\" (focus)=\"selectAll(minuteBox)\" (blur)=\"isFocused.set(false)\" #minuteBox class=\"w-100 border-0 bg-transparent no-form-control\">\n </div>\n </span>\n <button [color]=\"colors.secondary\" (click)=\"isOpen.set(!isOpen())\">\n <span [innerHTML]=\"clock()\"></span>\n </button>\n </bs-input-group>\n </bs-form>\n <bs-has-overlay></bs-has-overlay>\n <bs-dropdown-menu class=\"overflow-auto\" *bsDropdownMenu>\n @for (timestamp of presetTimestamps; track timestamp) {\n <bs-dropdown-item [isSelected]=\"timesEqual(selectedTime(), timestamp)\" (click)=\"setTime(timestamp)\">\n {{ timestamp | date: 'HH:mm' }}\n </bs-dropdown-item>\n }\n </bs-dropdown-menu>\n</div>", styles: [":host{display:inline-block}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield;outline:0px!important}.form-control{transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control.focus{color:#495057;background-color:#fff;border-color:#80bdff!important;outline:0;box-shadow:0 0 0 .2rem #007bff40}bs-dropdown-menu{max-height:250px}\n"] }]
96
+ args: [{ selector: 'bs-timepicker', imports: [DatePipe, DecimalPipe, FormsModule, EnhancedPasteDirective, BsFormComponent, BsDropdownDirective, BsDropdownMenuDirective, BsDropdownMenuComponent, BsDropdownItemComponent, BsInputGroupComponent, BsButtonTypeDirective, BsHasOverlayComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- <bs-dropdown [(isOpen)]=\"isOpen\" [sameDropdownWidth]=\"true\"></bs-dropdown> -->\n<div bsDropdown [(isOpen)]=\"isOpen\" [sameDropdownWidth]=\"true\">\n <bs-form>\n <bs-input-group>\n <span class=\"form-control d-flex\" [class.focus]=\"isFocused()\">\n <div class=\"flex-grow-1\">\n <input type=\"number\" [min]=\"0\" [max]=\"23\" (input)=\"setNumber($event, 23, minuteBox)\" bsEnhancedPaste [ngModel]=\"hours | number: '2.0'\" (ngModelChange)=\"hours = $event\" (focus)=\"selectAll(hourBox)\" (blur)=\"isFocused.set(false)\" #hourBox class=\"w-100 border-0 bg-transparent text-end no-form-control\">\n </div>\n <span class=\"px-1\">:</span>\n <div class=\"flex-grow-1\">\n <input type=\"number\" [min]=\"0\" [max]=\"59\" (input)=\"setNumber($event, 59, null)\" bsEnhancedPaste [ngModel]=\"minutes | number: '2.0'\" (ngModelChange)=\"minutes = $event\" (focus)=\"selectAll(minuteBox)\" (blur)=\"isFocused.set(false)\" #minuteBox class=\"w-100 border-0 bg-transparent no-form-control\">\n </div>\n </span>\n <button [color]=\"colors.secondary\" (click)=\"isOpen.set(!isOpen())\">\n <span [innerHTML]=\"clock()\"></span>\n </button>\n </bs-input-group>\n </bs-form>\n <bs-has-overlay></bs-has-overlay>\n <bs-dropdown-menu class=\"overflow-auto\" *bsDropdownMenu>\n @for (timestamp of presetTimestamps(); track timestamp) {\n <bs-dropdown-item [isSelected]=\"timesEqual(selectedTime(), timestamp)\" (click)=\"setTime(timestamp)\">\n {{ timestamp | date: 'HH:mm' }}\n </bs-dropdown-item>\n }\n </bs-dropdown-menu>\n</div>", styles: [":host{display:inline-block}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield;outline:0px!important}.form-control{transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control.focus{color:#495057;background-color:#fff;border-color:#80bdff!important;outline:0;box-shadow:0 0 0 .2rem #007bff40}bs-dropdown-menu{max-height:250px}\n"] }]
97
97
  }], ctorParameters: () => [], propDecorators: { isOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "isOpen", required: false }] }, { type: i0.Output, args: ["isOpenChange"] }], selectedTime: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedTime", required: false }] }, { type: i0.Output, args: ["selectedTimeChange"] }] } });
98
98
 
99
99
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"mintplayer-ng-bootstrap-timepicker.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/timepicker/src/timepicker.component.ts","../../../../libs/mintplayer-ng-bootstrap/timepicker/src/timepicker.component.html","../../../../libs/mintplayer-ng-bootstrap/timepicker/mintplayer-ng-bootstrap-timepicker.ts"],"sourcesContent":["/// <reference types=\"./types\" />\n\nimport { DatePipe, DecimalPipe } from '@angular/common';\nimport { Component, inject, model, signal, ChangeDetectionStrategy} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { Color } from '@mintplayer/ng-bootstrap';\nimport { BsButtonTypeDirective } from '@mintplayer/ng-bootstrap/button-type';\nimport { BsDropdownDirective, BsDropdownMenuDirective } from '@mintplayer/ng-bootstrap/dropdown';\nimport { BsDropdownMenuComponent, BsDropdownItemComponent } from '@mintplayer/ng-bootstrap/dropdown-menu';\nimport { EnhancedPasteDirective } from '@mintplayer/ng-bootstrap/enhanced-paste';\nimport { BsFormComponent } from '@mintplayer/ng-bootstrap/form';\nimport { BsHasOverlayComponent } from '@mintplayer/ng-bootstrap/has-overlay';\nimport { BsInputGroupComponent } from '@mintplayer/ng-bootstrap/input-group';\n\n@Component({\n selector: 'bs-timepicker',\n templateUrl: './timepicker.component.html',\n styleUrls: ['./timepicker.component.scss'],\n imports: [DatePipe, DecimalPipe, FormsModule, EnhancedPasteDirective, BsFormComponent, BsDropdownDirective, BsDropdownMenuDirective, BsDropdownMenuComponent, BsDropdownItemComponent, BsInputGroupComponent, BsButtonTypeDirective, BsHasOverlayComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BsTimepickerComponent {\n private sanitizer = inject(DomSanitizer);\n\n constructor() {\n const today = new Date();\n today.setHours(0); today.setMinutes(0); today.setSeconds(0);\n\n const interval = 900;\n this.presetTimestamps = Array.from(Array(24 * 60 * 60 / interval).keys())\n .map(i => {\n const clone = new Date(today);\n clone.setTime(clone.getTime() + i * interval * 1000);\n return clone;\n });\n\n\n import('bootstrap-icons/icons/clock.svg').then((icon) => {\n this.clock.set(this.sanitizer.bypassSecurityTrustHtml(icon.default));\n });\n }\n\n clock = signal<SafeHtml | undefined>(undefined);\n colors = Color;\n isOpen = model(false);\n presetTimestamps: Date[] = [];\n isFocused = signal(false);\n\n selectAll(box: HTMLInputElement) {\n box.select();\n // box.setSelectionRange(0, box.value.length);\n this.isFocused.set(true);\n }\n\n setNumber(event: Event, max: number, nextInput: HTMLInputElement | null) {\n event.preventDefault();\n const input = <HTMLInputElement>event.target;\n const val = parseInt(input.value);\n if (isNaN(val)) {\n input.value = '00';\n } else {\n const result = Math.min(max, Math.abs(val));\n input.value = result.toString().padStart(2, '0');\n\n if (nextInput) {\n // const maxAllowedNumberOfDigits = input.max.length;\n if (result * 10 > parseInt(input.max)) {\n nextInput.focus();\n }\n }\n }\n }\n\n setTime(time: Date) {\n this.selectedTime.set(time);\n this.isOpen.set(false);\n }\n\n selectedTime = model<Date>(new Date());\n\n //#region Hours\n get hours() {\n return this.selectedTime().getHours();\n }\n set hours(value: number) {\n const clone = new Date(this.selectedTime());\n clone.setHours(value);\n this.selectedTime.set(clone);\n }\n //#endregion\n\n //#region Minutes\n get minutes() {\n return this.selectedTime().getMinutes();\n }\n set minutes(value: number) {\n const clone = new Date(this.selectedTime());\n clone.setMinutes(value);\n this.selectedTime.set(clone);\n }\n //#endregion\n\n timesEqual(time1: Date, time2: Date) {\n return (time1.getHours() === time2.getHours()) && (time1.getMinutes() === time2.getMinutes());\n }\n\n}\n","<!-- <bs-dropdown [(isOpen)]=\"isOpen\" [sameDropdownWidth]=\"true\"></bs-dropdown> -->\n<div bsDropdown [(isOpen)]=\"isOpen\" [sameDropdownWidth]=\"true\">\n <bs-form>\n <bs-input-group>\n <span class=\"form-control d-flex\" [class.focus]=\"isFocused()\">\n <div class=\"flex-grow-1\">\n <input type=\"number\" [min]=\"0\" [max]=\"23\" (input)=\"setNumber($event, 23, minuteBox)\" bsEnhancedPaste [ngModel]=\"hours | number: '2.0'\" (ngModelChange)=\"hours = $event\" (focus)=\"selectAll(hourBox)\" (blur)=\"isFocused.set(false)\" #hourBox class=\"w-100 border-0 bg-transparent text-end no-form-control\">\n </div>\n <span class=\"px-1\">:</span>\n <div class=\"flex-grow-1\">\n <input type=\"number\" [min]=\"0\" [max]=\"59\" (input)=\"setNumber($event, 59, null)\" bsEnhancedPaste [ngModel]=\"minutes | number: '2.0'\" (ngModelChange)=\"minutes = $event\" (focus)=\"selectAll(minuteBox)\" (blur)=\"isFocused.set(false)\" #minuteBox class=\"w-100 border-0 bg-transparent no-form-control\">\n </div>\n </span>\n <button [color]=\"colors.secondary\" (click)=\"isOpen.set(!isOpen())\">\n <span [innerHTML]=\"clock()\"></span>\n </button>\n </bs-input-group>\n </bs-form>\n <bs-has-overlay></bs-has-overlay>\n <bs-dropdown-menu class=\"overflow-auto\" *bsDropdownMenu>\n @for (timestamp of presetTimestamps; track timestamp) {\n <bs-dropdown-item [isSelected]=\"timesEqual(selectedTime(), timestamp)\" (click)=\"setTime(timestamp)\">\n {{ timestamp | date: 'HH:mm' }}\n </bs-dropdown-item>\n }\n </bs-dropdown-menu>\n</div>","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mintplayer-ng-bootstrap-timepicker.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/timepicker/src/timepicker.component.ts","../../../../libs/mintplayer-ng-bootstrap/timepicker/src/timepicker.component.html","../../../../libs/mintplayer-ng-bootstrap/timepicker/mintplayer-ng-bootstrap-timepicker.ts"],"sourcesContent":["/// <reference types=\"./types\" />\n\nimport { DatePipe, DecimalPipe } from '@angular/common';\nimport { Component, inject, model, signal, ChangeDetectionStrategy} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { Color } from '@mintplayer/ng-bootstrap';\nimport { BsButtonTypeDirective } from '@mintplayer/ng-bootstrap/button-type';\nimport { BsDropdownDirective, BsDropdownMenuDirective } from '@mintplayer/ng-bootstrap/dropdown';\nimport { BsDropdownMenuComponent, BsDropdownItemComponent } from '@mintplayer/ng-bootstrap/dropdown-menu';\nimport { EnhancedPasteDirective } from '@mintplayer/ng-bootstrap/enhanced-paste';\nimport { BsFormComponent } from '@mintplayer/ng-bootstrap/form';\nimport { BsHasOverlayComponent } from '@mintplayer/ng-bootstrap/has-overlay';\nimport { BsInputGroupComponent } from '@mintplayer/ng-bootstrap/input-group';\n\n@Component({\n selector: 'bs-timepicker',\n templateUrl: './timepicker.component.html',\n styleUrls: ['./timepicker.component.scss'],\n imports: [DatePipe, DecimalPipe, FormsModule, EnhancedPasteDirective, BsFormComponent, BsDropdownDirective, BsDropdownMenuDirective, BsDropdownMenuComponent, BsDropdownItemComponent, BsInputGroupComponent, BsButtonTypeDirective, BsHasOverlayComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BsTimepickerComponent {\n private sanitizer = inject(DomSanitizer);\n\n constructor() {\n const today = new Date();\n today.setHours(0); today.setMinutes(0); today.setSeconds(0);\n\n const interval = 900;\n this.presetTimestamps.set(\n Array.from(Array(24 * 60 * 60 / interval).keys())\n .map(i => {\n const clone = new Date(today);\n clone.setTime(clone.getTime() + i * interval * 1000);\n return clone;\n })\n );\n\n\n import('bootstrap-icons/icons/clock.svg').then((icon) => {\n this.clock.set(this.sanitizer.bypassSecurityTrustHtml(icon.default));\n });\n }\n\n clock = signal<SafeHtml | undefined>(undefined);\n colors = Color;\n isOpen = model(false);\n readonly presetTimestamps = signal<Date[]>([]);\n isFocused = signal(false);\n\n selectAll(box: HTMLInputElement) {\n box.select();\n // box.setSelectionRange(0, box.value.length);\n this.isFocused.set(true);\n }\n\n setNumber(event: Event, max: number, nextInput: HTMLInputElement | null) {\n event.preventDefault();\n const input = <HTMLInputElement>event.target;\n const val = parseInt(input.value);\n if (isNaN(val)) {\n input.value = '00';\n } else {\n const result = Math.min(max, Math.abs(val));\n input.value = result.toString().padStart(2, '0');\n\n if (nextInput) {\n // const maxAllowedNumberOfDigits = input.max.length;\n if (result * 10 > parseInt(input.max)) {\n nextInput.focus();\n }\n }\n }\n }\n\n setTime(time: Date) {\n this.selectedTime.set(time);\n this.isOpen.set(false);\n }\n\n selectedTime = model<Date>(new Date());\n\n //#region Hours\n get hours() {\n return this.selectedTime().getHours();\n }\n set hours(value: number) {\n const clone = new Date(this.selectedTime());\n clone.setHours(value);\n this.selectedTime.set(clone);\n }\n //#endregion\n\n //#region Minutes\n get minutes() {\n return this.selectedTime().getMinutes();\n }\n set minutes(value: number) {\n const clone = new Date(this.selectedTime());\n clone.setMinutes(value);\n this.selectedTime.set(clone);\n }\n //#endregion\n\n timesEqual(time1: Date, time2: Date) {\n return (time1.getHours() === time2.getHours()) && (time1.getMinutes() === time2.getMinutes());\n }\n\n}\n","<!-- <bs-dropdown [(isOpen)]=\"isOpen\" [sameDropdownWidth]=\"true\"></bs-dropdown> -->\n<div bsDropdown [(isOpen)]=\"isOpen\" [sameDropdownWidth]=\"true\">\n <bs-form>\n <bs-input-group>\n <span class=\"form-control d-flex\" [class.focus]=\"isFocused()\">\n <div class=\"flex-grow-1\">\n <input type=\"number\" [min]=\"0\" [max]=\"23\" (input)=\"setNumber($event, 23, minuteBox)\" bsEnhancedPaste [ngModel]=\"hours | number: '2.0'\" (ngModelChange)=\"hours = $event\" (focus)=\"selectAll(hourBox)\" (blur)=\"isFocused.set(false)\" #hourBox class=\"w-100 border-0 bg-transparent text-end no-form-control\">\n </div>\n <span class=\"px-1\">:</span>\n <div class=\"flex-grow-1\">\n <input type=\"number\" [min]=\"0\" [max]=\"59\" (input)=\"setNumber($event, 59, null)\" bsEnhancedPaste [ngModel]=\"minutes | number: '2.0'\" (ngModelChange)=\"minutes = $event\" (focus)=\"selectAll(minuteBox)\" (blur)=\"isFocused.set(false)\" #minuteBox class=\"w-100 border-0 bg-transparent no-form-control\">\n </div>\n </span>\n <button [color]=\"colors.secondary\" (click)=\"isOpen.set(!isOpen())\">\n <span [innerHTML]=\"clock()\"></span>\n </button>\n </bs-input-group>\n </bs-form>\n <bs-has-overlay></bs-has-overlay>\n <bs-dropdown-menu class=\"overflow-auto\" *bsDropdownMenu>\n @for (timestamp of presetTimestamps(); track timestamp) {\n <bs-dropdown-item [isSelected]=\"timesEqual(selectedTime(), timestamp)\" (click)=\"setTime(timestamp)\">\n {{ timestamp | date: 'HH:mm' }}\n </bs-dropdown-item>\n }\n </bs-dropdown-menu>\n</div>","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, ElementRef, NgZone, input, ChangeDetectionStrategy, Component, TemplateRef, Directive } from '@angular/core';
2
+ import { inject, ElementRef, input, signal, ChangeDetectionStrategy, Component, TemplateRef, Directive } from '@angular/core';
3
3
  import { NgTemplateOutlet } from '@angular/common';
4
4
  import * as i1 from '@angular/cdk/scrolling';
5
5
  import { ScrollingModule } from '@angular/cdk/scrolling';
@@ -13,11 +13,11 @@ class BsVirtualDatatableComponent extends DatatableSortBase {
13
13
  constructor() {
14
14
  super(...arguments);
15
15
  this.elementRef = inject(ElementRef);
16
- this.ngZone = inject(NgZone);
17
16
  this.cleanup = [];
18
17
  this.dataSource = input.required(...(ngDevMode ? [{ debugName: "dataSource" }] : []));
19
18
  this.isResponsive = input(false, ...(ngDevMode ? [{ debugName: "isResponsive" }] : []));
20
19
  this.itemSize = input(48, ...(ngDevMode ? [{ debugName: "itemSize" }] : []));
20
+ this.rowTemplate = signal(undefined, ...(ngDevMode ? [{ debugName: "rowTemplate" }] : []));
21
21
  }
22
22
  ngAfterViewInit() {
23
23
  this.setupScrollSync();
@@ -47,10 +47,8 @@ class BsVirtualDatatableComponent extends DatatableSortBase {
47
47
  headerScrollContainer.scrollLeft = viewport.scrollLeft;
48
48
  syncing = false;
49
49
  };
50
- this.ngZone.runOutsideAngular(() => {
51
- headerScrollContainer.addEventListener('scroll', onHeaderScroll, { passive: true });
52
- viewport.addEventListener('scroll', onViewportScroll, { passive: true });
53
- });
50
+ headerScrollContainer.addEventListener('scroll', onHeaderScroll, { passive: true });
51
+ viewport.addEventListener('scroll', onViewportScroll, { passive: true });
54
52
  this.cleanup.push(() => {
55
53
  headerScrollContainer.removeEventListener('scroll', onHeaderScroll);
56
54
  viewport.removeEventListener('scroll', onViewportScroll);
@@ -140,24 +138,20 @@ class BsVirtualDatatableComponent extends DatatableSortBase {
140
138
  viewport.scrollLeft = savedViewportScroll;
141
139
  };
142
140
  // Sync after first render
143
- this.ngZone.runOutsideAngular(() => {
144
- requestAnimationFrame(() => syncWidths());
145
- });
141
+ requestAnimationFrame(() => syncWidths());
146
142
  // Re-sync when body rows change (virtual scroll swaps rows)
147
143
  const observer = new MutationObserver(() => {
148
144
  requestAnimationFrame(() => syncWidths());
149
145
  });
150
- this.ngZone.runOutsideAngular(() => {
151
- observer.observe(bodyTableBody, { childList: true, subtree: true });
152
- });
146
+ observer.observe(bodyTableBody, { childList: true, subtree: true });
153
147
  this.cleanup.push(() => observer.disconnect());
154
148
  }
155
149
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: BsVirtualDatatableComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
156
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.6", type: BsVirtualDatatableComponent, isStandalone: true, selector: "bs-virtual-datatable", inputs: { dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: true, transformFunction: null }, isResponsive: { classPropertyName: "isResponsive", publicName: "isResponsive", isSignal: true, isRequired: false, transformFunction: null }, itemSize: { classPropertyName: "itemSize", publicName: "itemSize", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "<div class=\"virtual-datatable-container\">\n <bs-table [isResponsive]=\"isResponsive()\" [striped]=\"true\" [hover]=\"true\">\n <thead>\n <tr>\n @for (column of columnsArray; track column) {\n <th class=\"text-nowrap\"\n [class.sort]=\"column.sortable\"\n [class.sort-asc]=\"column.sortable && getSortDirection(column.name) === 'ascending'\"\n [class.sort-desc]=\"column.sortable && getSortDirection(column.name) === 'descending'\"\n (mousedown)=\"onHeaderMouseDown($event)\"\n (click)=\"columnHeaderClicked(column, $event)\">\n <ng-container *ngTemplateOutlet=\"column.templateRef\"></ng-container>\n @if (settings().sortColumns.length > 1 && getSortIndex(column.name) >= 0) {\n <span class=\"sort-priority\">{{ getSortIndex(column.name) + 1 }}</span>\n }\n </th>\n }\n </tr>\n </thead>\n </bs-table>\n\n <bs-table-styles>\n <cdk-virtual-scroll-viewport [itemSize]=\"itemSize()\" class=\"virtual-scroll-viewport\">\n <table class=\"table table-striped table-hover\" [class.nowrap]=\"isResponsive()\">\n <tbody>\n <tr *cdkVirtualFor=\"let item of dataSource()\" class=\"virtual-row\">\n @if (item && rowTemplate) {\n <ng-container *ngTemplateOutlet=\"rowTemplate; context: { $implicit: item }\"></ng-container>\n } @else {\n @for (column of columnsArray; track column) {\n <td>&nbsp;</td>\n }\n }\n </tr>\n </tbody>\n </table>\n </cdk-virtual-scroll-viewport>\n </bs-table-styles>\n</div>\n", styles: ["@charset \"UTF-8\";bs-table thead th.sort{position:relative;cursor:pointer;padding-right:2rem}bs-table thead th.sort:before,bs-table thead th.sort:after{position:absolute;display:block;opacity:.3;bottom:.5em}bs-table thead th.sort:before{content:\"\\2191\";right:1em}bs-table thead th.sort:after{content:\"\\2193\";right:.5em}bs-table thead th.sort.sort-asc:after{opacity:1}bs-table thead th.sort.sort-desc:before{opacity:1}bs-table thead th.sort .sort-priority{position:absolute;right:.1em;bottom:.3em;font-size:.65em;font-weight:700;opacity:.7}:host{display:block;height:100%}.virtual-datatable-container{display:flex;flex-direction:column;height:100%}.virtual-datatable-container bs-table{flex-shrink:0}bs-table ::ng-deep table,.virtual-scroll-viewport table{table-layout:auto;width:max-content}.virtual-scroll-viewport .nowrap td{white-space:nowrap}bs-table ::ng-deep .table-responsive{overflow-x:hidden;scrollbar-gutter:stable}.virtual-scroll-viewport{flex:1 1 auto;min-height:0;scrollbar-gutter:stable}.virtual-scroll-viewport table{margin-bottom:0}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i1.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i1.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i1.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: BsTableComponent, selector: "bs-table", inputs: ["isResponsive", "striped", "hover", "border"] }, { kind: "component", type: BsTableStylesComponent, selector: "bs-table-styles" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
150
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.6", type: BsVirtualDatatableComponent, isStandalone: true, selector: "bs-virtual-datatable", inputs: { dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: true, transformFunction: null }, isResponsive: { classPropertyName: "isResponsive", publicName: "isResponsive", isSignal: true, isRequired: false, transformFunction: null }, itemSize: { classPropertyName: "itemSize", publicName: "itemSize", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "<div class=\"virtual-datatable-container\">\n <bs-table [isResponsive]=\"isResponsive()\" [striped]=\"true\" [hover]=\"true\">\n <thead>\n <tr>\n @for (column of columnsArray; track column) {\n <th class=\"text-nowrap\"\n [class.sort]=\"column.sortable()\"\n [class.sort-asc]=\"column.sortable() && getSortDirection(column.name()) === 'ascending'\"\n [class.sort-desc]=\"column.sortable() && getSortDirection(column.name()) === 'descending'\"\n (mousedown)=\"onHeaderMouseDown($event)\"\n (click)=\"columnHeaderClicked(column, $event)\">\n <ng-container *ngTemplateOutlet=\"column.templateRef\"></ng-container>\n @if (settings().sortColumns.length > 1 && getSortIndex(column.name()) >= 0) {\n <span class=\"sort-priority\">{{ getSortIndex(column.name()) + 1 }}</span>\n }\n </th>\n }\n </tr>\n </thead>\n </bs-table>\n\n <bs-table-styles>\n <cdk-virtual-scroll-viewport [itemSize]=\"itemSize()\" class=\"virtual-scroll-viewport\">\n <table class=\"table table-striped table-hover\" [class.nowrap]=\"isResponsive()\">\n <tbody>\n <tr *cdkVirtualFor=\"let item of dataSource()\" class=\"virtual-row\">\n @if (item && rowTemplate()) {\n <ng-container *ngTemplateOutlet=\"rowTemplate()!; context: { $implicit: item }\"></ng-container>\n } @else {\n @for (column of columnsArray; track column) {\n <td>&nbsp;</td>\n }\n }\n </tr>\n </tbody>\n </table>\n </cdk-virtual-scroll-viewport>\n </bs-table-styles>\n</div>\n", styles: ["@charset \"UTF-8\";bs-table thead th.sort{position:relative;cursor:pointer;padding-right:2rem}bs-table thead th.sort:before,bs-table thead th.sort:after{position:absolute;display:block;opacity:.3;bottom:.5em}bs-table thead th.sort:before{content:\"\\2191\";right:1em}bs-table thead th.sort:after{content:\"\\2193\";right:.5em}bs-table thead th.sort.sort-asc:after{opacity:1}bs-table thead th.sort.sort-desc:before{opacity:1}bs-table thead th.sort .sort-priority{position:absolute;right:.1em;bottom:.3em;font-size:.65em;font-weight:700;opacity:.7}:host{display:block;height:100%}.virtual-datatable-container{display:flex;flex-direction:column;height:100%}.virtual-datatable-container bs-table{flex-shrink:0}bs-table ::ng-deep table,.virtual-scroll-viewport table{table-layout:auto;width:max-content}.virtual-scroll-viewport .nowrap td{white-space:nowrap}bs-table ::ng-deep .table-responsive{overflow-x:hidden;scrollbar-gutter:stable}.virtual-scroll-viewport{flex:1 1 auto;min-height:0;scrollbar-gutter:stable}.virtual-scroll-viewport table{margin-bottom:0}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i1.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i1.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i1.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: BsTableComponent, selector: "bs-table", inputs: ["isResponsive", "striped", "hover", "border"] }, { kind: "component", type: BsTableStylesComponent, selector: "bs-table-styles" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
157
151
  }
158
152
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: BsVirtualDatatableComponent, decorators: [{
159
153
  type: Component,
160
- args: [{ selector: 'bs-virtual-datatable', imports: [NgTemplateOutlet, ScrollingModule, BsTableComponent, BsTableStylesComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"virtual-datatable-container\">\n <bs-table [isResponsive]=\"isResponsive()\" [striped]=\"true\" [hover]=\"true\">\n <thead>\n <tr>\n @for (column of columnsArray; track column) {\n <th class=\"text-nowrap\"\n [class.sort]=\"column.sortable\"\n [class.sort-asc]=\"column.sortable && getSortDirection(column.name) === 'ascending'\"\n [class.sort-desc]=\"column.sortable && getSortDirection(column.name) === 'descending'\"\n (mousedown)=\"onHeaderMouseDown($event)\"\n (click)=\"columnHeaderClicked(column, $event)\">\n <ng-container *ngTemplateOutlet=\"column.templateRef\"></ng-container>\n @if (settings().sortColumns.length > 1 && getSortIndex(column.name) >= 0) {\n <span class=\"sort-priority\">{{ getSortIndex(column.name) + 1 }}</span>\n }\n </th>\n }\n </tr>\n </thead>\n </bs-table>\n\n <bs-table-styles>\n <cdk-virtual-scroll-viewport [itemSize]=\"itemSize()\" class=\"virtual-scroll-viewport\">\n <table class=\"table table-striped table-hover\" [class.nowrap]=\"isResponsive()\">\n <tbody>\n <tr *cdkVirtualFor=\"let item of dataSource()\" class=\"virtual-row\">\n @if (item && rowTemplate) {\n <ng-container *ngTemplateOutlet=\"rowTemplate; context: { $implicit: item }\"></ng-container>\n } @else {\n @for (column of columnsArray; track column) {\n <td>&nbsp;</td>\n }\n }\n </tr>\n </tbody>\n </table>\n </cdk-virtual-scroll-viewport>\n </bs-table-styles>\n</div>\n", styles: ["@charset \"UTF-8\";bs-table thead th.sort{position:relative;cursor:pointer;padding-right:2rem}bs-table thead th.sort:before,bs-table thead th.sort:after{position:absolute;display:block;opacity:.3;bottom:.5em}bs-table thead th.sort:before{content:\"\\2191\";right:1em}bs-table thead th.sort:after{content:\"\\2193\";right:.5em}bs-table thead th.sort.sort-asc:after{opacity:1}bs-table thead th.sort.sort-desc:before{opacity:1}bs-table thead th.sort .sort-priority{position:absolute;right:.1em;bottom:.3em;font-size:.65em;font-weight:700;opacity:.7}:host{display:block;height:100%}.virtual-datatable-container{display:flex;flex-direction:column;height:100%}.virtual-datatable-container bs-table{flex-shrink:0}bs-table ::ng-deep table,.virtual-scroll-viewport table{table-layout:auto;width:max-content}.virtual-scroll-viewport .nowrap td{white-space:nowrap}bs-table ::ng-deep .table-responsive{overflow-x:hidden;scrollbar-gutter:stable}.virtual-scroll-viewport{flex:1 1 auto;min-height:0;scrollbar-gutter:stable}.virtual-scroll-viewport table{margin-bottom:0}\n"] }]
154
+ args: [{ selector: 'bs-virtual-datatable', imports: [NgTemplateOutlet, ScrollingModule, BsTableComponent, BsTableStylesComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"virtual-datatable-container\">\n <bs-table [isResponsive]=\"isResponsive()\" [striped]=\"true\" [hover]=\"true\">\n <thead>\n <tr>\n @for (column of columnsArray; track column) {\n <th class=\"text-nowrap\"\n [class.sort]=\"column.sortable()\"\n [class.sort-asc]=\"column.sortable() && getSortDirection(column.name()) === 'ascending'\"\n [class.sort-desc]=\"column.sortable() && getSortDirection(column.name()) === 'descending'\"\n (mousedown)=\"onHeaderMouseDown($event)\"\n (click)=\"columnHeaderClicked(column, $event)\">\n <ng-container *ngTemplateOutlet=\"column.templateRef\"></ng-container>\n @if (settings().sortColumns.length > 1 && getSortIndex(column.name()) >= 0) {\n <span class=\"sort-priority\">{{ getSortIndex(column.name()) + 1 }}</span>\n }\n </th>\n }\n </tr>\n </thead>\n </bs-table>\n\n <bs-table-styles>\n <cdk-virtual-scroll-viewport [itemSize]=\"itemSize()\" class=\"virtual-scroll-viewport\">\n <table class=\"table table-striped table-hover\" [class.nowrap]=\"isResponsive()\">\n <tbody>\n <tr *cdkVirtualFor=\"let item of dataSource()\" class=\"virtual-row\">\n @if (item && rowTemplate()) {\n <ng-container *ngTemplateOutlet=\"rowTemplate()!; context: { $implicit: item }\"></ng-container>\n } @else {\n @for (column of columnsArray; track column) {\n <td>&nbsp;</td>\n }\n }\n </tr>\n </tbody>\n </table>\n </cdk-virtual-scroll-viewport>\n </bs-table-styles>\n</div>\n", styles: ["@charset \"UTF-8\";bs-table thead th.sort{position:relative;cursor:pointer;padding-right:2rem}bs-table thead th.sort:before,bs-table thead th.sort:after{position:absolute;display:block;opacity:.3;bottom:.5em}bs-table thead th.sort:before{content:\"\\2191\";right:1em}bs-table thead th.sort:after{content:\"\\2193\";right:.5em}bs-table thead th.sort.sort-asc:after{opacity:1}bs-table thead th.sort.sort-desc:before{opacity:1}bs-table thead th.sort .sort-priority{position:absolute;right:.1em;bottom:.3em;font-size:.65em;font-weight:700;opacity:.7}:host{display:block;height:100%}.virtual-datatable-container{display:flex;flex-direction:column;height:100%}.virtual-datatable-container bs-table{flex-shrink:0}bs-table ::ng-deep table,.virtual-scroll-viewport table{table-layout:auto;width:max-content}.virtual-scroll-viewport .nowrap td{white-space:nowrap}bs-table ::ng-deep .table-responsive{overflow-x:hidden;scrollbar-gutter:stable}.virtual-scroll-viewport{flex:1 1 auto;min-height:0;scrollbar-gutter:stable}.virtual-scroll-viewport table{margin-bottom:0}\n"] }]
161
155
  }], propDecorators: { dataSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataSource", required: true }] }], isResponsive: [{ type: i0.Input, args: [{ isSignal: true, alias: "isResponsive", required: false }] }], itemSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemSize", required: false }] }] } });
162
156
 
163
157
  class VirtualDatatableDataSource extends DataSource {
@@ -238,7 +232,7 @@ class BsVirtualRowTemplateDirective {
238
232
  constructor() {
239
233
  this.datatableComponent = inject(BsVirtualDatatableComponent);
240
234
  this.templateRef = inject(TemplateRef);
241
- this.datatableComponent.rowTemplate = this.templateRef;
235
+ this.datatableComponent.rowTemplate.set(this.templateRef);
242
236
  }
243
237
  static ngTemplateContextGuard(dir, ctx) {
244
238
  return true;
@@ -1 +1 @@
1
- {"version":3,"file":"mintplayer-ng-bootstrap-virtual-datatable.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/virtual-datatable/src/virtual-datatable/virtual-datatable.component.ts","../../../../libs/mintplayer-ng-bootstrap/virtual-datatable/src/virtual-datatable/virtual-datatable.component.html","../../../../libs/mintplayer-ng-bootstrap/virtual-datatable/src/virtual-datatable-data-source.ts","../../../../libs/mintplayer-ng-bootstrap/virtual-datatable/src/virtual-row-template/virtual-row-template.directive.ts","../../../../libs/mintplayer-ng-bootstrap/virtual-datatable/mintplayer-ng-bootstrap-virtual-datatable.ts"],"sourcesContent":["import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, inject, input, NgZone, OnDestroy, TemplateRef } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\nimport { BsTableComponent, BsTableStylesComponent } from '@mintplayer/ng-bootstrap/table';\nimport { DatatableSortBase } from '@mintplayer/ng-bootstrap/datatable';\nimport { VirtualDatatableDataSource } from '../virtual-datatable-data-source';\nimport { BsVirtualRowTemplateContext } from '../virtual-row-template/virtual-row-template.directive';\n\n@Component({\n selector: 'bs-virtual-datatable',\n templateUrl: './virtual-datatable.component.html',\n styleUrls: ['./virtual-datatable.component.scss'],\n imports: [NgTemplateOutlet, ScrollingModule, BsTableComponent, BsTableStylesComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BsVirtualDatatableComponent<TData> extends DatatableSortBase implements AfterViewInit, OnDestroy {\n\n private readonly elementRef = inject(ElementRef);\n private readonly ngZone = inject(NgZone);\n private cleanup: (() => void)[] = [];\n\n dataSource = input.required<VirtualDatatableDataSource<TData>>();\n isResponsive = input(false);\n itemSize = input(48);\n\n rowTemplate?: TemplateRef<BsVirtualRowTemplateContext<TData>>;\n\n ngAfterViewInit() {\n this.setupScrollSync();\n this.setupColumnWidthSync();\n }\n\n ngOnDestroy() {\n this.cleanup.forEach(fn => fn());\n }\n\n private setupScrollSync() {\n const el = this.elementRef.nativeElement as HTMLElement;\n const headerScrollContainer = el.querySelector('.table-responsive') as HTMLElement;\n const viewport = el.querySelector('cdk-virtual-scroll-viewport') as HTMLElement;\n\n if (!headerScrollContainer || !viewport) return;\n\n let syncing = false;\n\n const onHeaderScroll = () => {\n if (syncing) return;\n syncing = true;\n viewport.scrollLeft = headerScrollContainer.scrollLeft;\n syncing = false;\n };\n\n const onViewportScroll = () => {\n if (syncing) return;\n syncing = true;\n headerScrollContainer.scrollLeft = viewport.scrollLeft;\n syncing = false;\n };\n\n this.ngZone.runOutsideAngular(() => {\n headerScrollContainer.addEventListener('scroll', onHeaderScroll, { passive: true });\n viewport.addEventListener('scroll', onViewportScroll, { passive: true });\n });\n\n this.cleanup.push(() => {\n headerScrollContainer.removeEventListener('scroll', onHeaderScroll);\n viewport.removeEventListener('scroll', onViewportScroll);\n });\n }\n\n private setupColumnWidthSync() {\n const el = this.elementRef.nativeElement as HTMLElement;\n const bodyTableBody = el.querySelector('cdk-virtual-scroll-viewport tbody') as HTMLElement;\n\n if (!bodyTableBody) return;\n\n // Track the max width seen for each column so columns only grow, never\n // shrink (prevents layout jumps as rows scroll in/out of view).\n const maxWidths: number[] = [];\n\n const syncWidths = () => {\n const headerCells = el.querySelectorAll<HTMLElement>('bs-table thead th');\n const allBodyRows = Array.from(bodyTableBody.querySelectorAll<HTMLTableRowElement>('tr'));\n const firstBodyRow = allBodyRows[0];\n const bodyCells = firstBodyRow?.cells;\n\n if (!headerCells.length || !bodyCells?.length) return;\n\n const columnCount = Math.min(headerCells.length, bodyCells.length);\n\n // Save scroll positions before measurement (clearing min-width can shrink\n // the table and cause the browser to clamp scrollLeft to 0).\n const headerScrollContainer = el.querySelector('.table-responsive') as HTMLElement;\n const viewport = el.querySelector('cdk-virtual-scroll-viewport') as HTMLElement;\n const savedHeaderScroll = headerScrollContainer?.scrollLeft ?? 0;\n const savedViewportScroll = viewport?.scrollLeft ?? 0;\n\n // Clear inline min-widths on ALL body rows. CDK virtual scroll recycles\n // <tr> DOM elements, so rows that were previously the \"first row\" retain\n // stale min-width styles. With table-layout: auto the column width is\n // determined by the widest cell across all visible rows, so stale\n // min-widths on any row prevent columns from ever shrinking.\n for (const row of allBodyRows) {\n const tds = row.cells;\n for (let i = 0; i < Math.min(tds.length, columnCount); i++) {\n tds[i].style.minWidth = '';\n }\n }\n for (let i = 0; i < columnCount; i++) {\n headerCells[i].style.minWidth = '';\n }\n\n // Temporarily force both tables to size to content only, overriding\n // Bootstrap's width:100% which causes table-layout:auto to redistribute\n // extra space across columns. Without this, measured widths include\n // redistributed space that varies with each data slice.\n const headerTable = el.querySelector<HTMLElement>('bs-table table');\n const bodyTable = el.querySelector<HTMLElement>('cdk-virtual-scroll-viewport table');\n headerTable?.style.setProperty('width', 'max-content', 'important');\n bodyTable?.style.setProperty('width', 'max-content', 'important');\n\n // Measure natural content widths across all visible rows\n for (let i = 0; i < columnCount; i++) {\n let colWidth = headerCells[i].offsetWidth;\n for (const row of allBodyRows) {\n const tds = row.cells;\n if (i < tds.length) {\n const w = tds[i].offsetWidth;\n if (w > colWidth) colWidth = w;\n }\n }\n // Update tracked maximum so columns only grow, never shrink\n if (!maxWidths[i] || colWidth > maxWidths[i]) {\n maxWidths[i] = colWidth;\n }\n }\n\n // Remove temporary width override so tables render normally\n headerTable?.style.removeProperty('width');\n bodyTable?.style.removeProperty('width');\n\n // Apply max widths to header and ALL body rows to keep them in sync.\n // Setting min-width on every row prevents table-layout:auto from\n // redistributing extra space differently across the two tables when\n // some rows contain placeholder content.\n for (let i = 0; i < columnCount; i++) {\n const w = `${maxWidths[i]}px`;\n headerCells[i].style.minWidth = w;\n for (const row of allBodyRows) {\n const tds = row.cells;\n if (i < tds.length) {\n tds[i].style.minWidth = w;\n }\n }\n }\n\n // Restore scroll positions after min-widths are re-applied\n if (headerScrollContainer) headerScrollContainer.scrollLeft = savedHeaderScroll;\n if (viewport) viewport.scrollLeft = savedViewportScroll;\n };\n\n // Sync after first render\n this.ngZone.runOutsideAngular(() => {\n requestAnimationFrame(() => syncWidths());\n });\n\n // Re-sync when body rows change (virtual scroll swaps rows)\n const observer = new MutationObserver(() => {\n requestAnimationFrame(() => syncWidths());\n });\n\n this.ngZone.runOutsideAngular(() => {\n observer.observe(bodyTableBody, { childList: true, subtree: true });\n });\n\n this.cleanup.push(() => observer.disconnect());\n }\n}\n","<div class=\"virtual-datatable-container\">\n <bs-table [isResponsive]=\"isResponsive()\" [striped]=\"true\" [hover]=\"true\">\n <thead>\n <tr>\n @for (column of columnsArray; track column) {\n <th class=\"text-nowrap\"\n [class.sort]=\"column.sortable\"\n [class.sort-asc]=\"column.sortable && getSortDirection(column.name) === 'ascending'\"\n [class.sort-desc]=\"column.sortable && getSortDirection(column.name) === 'descending'\"\n (mousedown)=\"onHeaderMouseDown($event)\"\n (click)=\"columnHeaderClicked(column, $event)\">\n <ng-container *ngTemplateOutlet=\"column.templateRef\"></ng-container>\n @if (settings().sortColumns.length > 1 && getSortIndex(column.name) >= 0) {\n <span class=\"sort-priority\">{{ getSortIndex(column.name) + 1 }}</span>\n }\n </th>\n }\n </tr>\n </thead>\n </bs-table>\n\n <bs-table-styles>\n <cdk-virtual-scroll-viewport [itemSize]=\"itemSize()\" class=\"virtual-scroll-viewport\">\n <table class=\"table table-striped table-hover\" [class.nowrap]=\"isResponsive()\">\n <tbody>\n <tr *cdkVirtualFor=\"let item of dataSource()\" class=\"virtual-row\">\n @if (item && rowTemplate) {\n <ng-container *ngTemplateOutlet=\"rowTemplate; context: { $implicit: item }\"></ng-container>\n } @else {\n @for (column of columnsArray; track column) {\n <td>&nbsp;</td>\n }\n }\n </tr>\n </tbody>\n </table>\n </cdk-virtual-scroll-viewport>\n </bs-table-styles>\n</div>\n","import { CollectionViewer, DataSource } from '@angular/cdk/collections';\nimport { BehaviorSubject, Observable, Subject, Subscription, from, merge, of } from 'rxjs';\nimport { catchError, distinctUntilChanged, filter, map, startWith, switchMap } from 'rxjs/operators';\n\nexport class VirtualDatatableDataSource<T> extends DataSource<T> {\n private readonly fetchFn: (skip: number, take: number) => Promise<{ data: T[]; totalRecords: number }>;\n private readonly pageSize: number;\n private readonly cachedPages = new Map<number, T[]>();\n private totalRecords = 0;\n private dataStream = new BehaviorSubject<T[]>([]);\n private subscription?: Subscription;\n private resetSubject = new Subject<void>();\n private resetVersion = 0;\n\n constructor(\n fetchFn: (skip: number, take: number) => Promise<{ data: T[]; totalRecords: number }>,\n pageSize = 50\n ) {\n super();\n this.fetchFn = fetchFn;\n this.pageSize = pageSize;\n }\n\n connect(collectionViewer: CollectionViewer): Observable<T[]> {\n // Support reconnection after disconnect (which completes the previous dataStream)\n this.dataStream = new BehaviorSubject<T[]>([]);\n this.cachedPages.clear();\n this.totalRecords = 0;\n\n // Track the last viewport range so reset() can re-trigger a fetch.\n // resetVersion is incremented on reset() to bypass distinctUntilChanged.\n let lastRange = { start: 0, end: this.pageSize };\n this.subscription = merge(\n collectionViewer.viewChange.pipe(startWith(lastRange)),\n this.resetSubject.pipe(map(() => lastRange))\n ).pipe(\n filter(range => range.end > range.start),\n map(range => { lastRange = range; return { pages: this.getPageIndices(range), version: this.resetVersion }; }),\n distinctUntilChanged((a, b) => a.version === b.version && a.pages.join() === b.pages.join()),\n switchMap(({ pages }) => from(this.fetchPages(pages)).pipe(\n catchError(() => of(this.dataStream.value))\n ))\n ).subscribe(data => this.dataStream.next(data));\n\n return this.dataStream;\n }\n\n disconnect(): void {\n this.subscription?.unsubscribe();\n this.dataStream.complete();\n }\n\n get length(): number {\n return this.totalRecords;\n }\n\n reset(): void {\n this.cachedPages.clear();\n this.resetVersion++;\n this.resetSubject.next();\n }\n\n private getPageIndices(range: { start: number; end: number }): number[] {\n const startPage = Math.floor(range.start / this.pageSize);\n const endPage = Math.floor((range.end - 1) / this.pageSize);\n const pages: number[] = [];\n for (let i = startPage; i <= endPage; i++) {\n pages.push(i);\n }\n return pages;\n }\n\n private async fetchPages(pageIndices: number[]): Promise<T[]> {\n const uncachedPages = pageIndices.filter(p => !this.cachedPages.has(p));\n\n const results = await Promise.all(\n uncachedPages.map(async pageIndex => {\n const skip = pageIndex * this.pageSize;\n const result = await this.fetchFn(skip, this.pageSize);\n return { pageIndex, result };\n })\n );\n\n for (const { pageIndex, result } of results) {\n this.cachedPages.set(pageIndex, result.data);\n }\n if (results.length > 0) {\n this.totalRecords = results[0].result.totalRecords;\n }\n\n // Build the full data array with placeholders for unloaded pages\n const totalPages = Math.ceil(this.totalRecords / this.pageSize);\n const data: T[] = [];\n for (let i = 0; i < totalPages; i++) {\n const page = this.cachedPages.get(i);\n if (page) {\n data.push(...page);\n } else {\n // Fill with empty slots to maintain correct virtual scroll positioning\n const remaining = Math.min(this.pageSize, this.totalRecords - i * this.pageSize);\n data.push(...new Array<T>(remaining));\n }\n }\n return data;\n }\n}\n","import { Directive, inject, TemplateRef } from '@angular/core';\nimport { BsVirtualDatatableComponent } from '../virtual-datatable/virtual-datatable.component';\n\n@Directive({\n selector: '[bsVirtualRowTemplate]',\n})\nexport class BsVirtualRowTemplateDirective<TData> {\n\n private datatableComponent = inject<BsVirtualDatatableComponent<TData>>(BsVirtualDatatableComponent);\n private templateRef = inject<TemplateRef<BsVirtualRowTemplateContext<TData>>>(TemplateRef);\n\n constructor() {\n this.datatableComponent.rowTemplate = this.templateRef;\n }\n\n public static ngTemplateContextGuard<TData>(\n dir: BsVirtualRowTemplateDirective<TData>,\n ctx: any\n ): ctx is BsVirtualRowTemplateContext<Exclude<TData, false | 0 | '' | null | undefined>> {\n return true;\n }\n}\n\nexport class BsVirtualRowTemplateContext<TData = unknown> {\n public $implicit: TData = null!;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mintplayer-ng-bootstrap-virtual-datatable.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/virtual-datatable/src/virtual-datatable/virtual-datatable.component.ts","../../../../libs/mintplayer-ng-bootstrap/virtual-datatable/src/virtual-datatable/virtual-datatable.component.html","../../../../libs/mintplayer-ng-bootstrap/virtual-datatable/src/virtual-datatable-data-source.ts","../../../../libs/mintplayer-ng-bootstrap/virtual-datatable/src/virtual-row-template/virtual-row-template.directive.ts","../../../../libs/mintplayer-ng-bootstrap/virtual-datatable/mintplayer-ng-bootstrap-virtual-datatable.ts"],"sourcesContent":["import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, inject, input, OnDestroy, signal, TemplateRef } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\nimport { BsTableComponent, BsTableStylesComponent } from '@mintplayer/ng-bootstrap/table';\nimport { DatatableSortBase } from '@mintplayer/ng-bootstrap/datatable';\nimport { VirtualDatatableDataSource } from '../virtual-datatable-data-source';\nimport { BsVirtualRowTemplateContext } from '../virtual-row-template/virtual-row-template.directive';\n\n@Component({\n selector: 'bs-virtual-datatable',\n templateUrl: './virtual-datatable.component.html',\n styleUrls: ['./virtual-datatable.component.scss'],\n imports: [NgTemplateOutlet, ScrollingModule, BsTableComponent, BsTableStylesComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BsVirtualDatatableComponent<TData> extends DatatableSortBase implements AfterViewInit, OnDestroy {\n\n private readonly elementRef = inject(ElementRef);\n private cleanup: (() => void)[] = [];\n\n dataSource = input.required<VirtualDatatableDataSource<TData>>();\n isResponsive = input(false);\n itemSize = input(48);\n\n readonly rowTemplate = signal<TemplateRef<BsVirtualRowTemplateContext<TData>> | undefined>(undefined);\n\n ngAfterViewInit() {\n this.setupScrollSync();\n this.setupColumnWidthSync();\n }\n\n ngOnDestroy() {\n this.cleanup.forEach(fn => fn());\n }\n\n private setupScrollSync() {\n const el = this.elementRef.nativeElement as HTMLElement;\n const headerScrollContainer = el.querySelector('.table-responsive') as HTMLElement;\n const viewport = el.querySelector('cdk-virtual-scroll-viewport') as HTMLElement;\n\n if (!headerScrollContainer || !viewport) return;\n\n let syncing = false;\n\n const onHeaderScroll = () => {\n if (syncing) return;\n syncing = true;\n viewport.scrollLeft = headerScrollContainer.scrollLeft;\n syncing = false;\n };\n\n const onViewportScroll = () => {\n if (syncing) return;\n syncing = true;\n headerScrollContainer.scrollLeft = viewport.scrollLeft;\n syncing = false;\n };\n\n headerScrollContainer.addEventListener('scroll', onHeaderScroll, { passive: true });\n viewport.addEventListener('scroll', onViewportScroll, { passive: true });\n\n this.cleanup.push(() => {\n headerScrollContainer.removeEventListener('scroll', onHeaderScroll);\n viewport.removeEventListener('scroll', onViewportScroll);\n });\n }\n\n private setupColumnWidthSync() {\n const el = this.elementRef.nativeElement as HTMLElement;\n const bodyTableBody = el.querySelector('cdk-virtual-scroll-viewport tbody') as HTMLElement;\n\n if (!bodyTableBody) return;\n\n // Track the max width seen for each column so columns only grow, never\n // shrink (prevents layout jumps as rows scroll in/out of view).\n const maxWidths: number[] = [];\n\n const syncWidths = () => {\n const headerCells = el.querySelectorAll<HTMLElement>('bs-table thead th');\n const allBodyRows = Array.from(bodyTableBody.querySelectorAll<HTMLTableRowElement>('tr'));\n const firstBodyRow = allBodyRows[0];\n const bodyCells = firstBodyRow?.cells;\n\n if (!headerCells.length || !bodyCells?.length) return;\n\n const columnCount = Math.min(headerCells.length, bodyCells.length);\n\n // Save scroll positions before measurement (clearing min-width can shrink\n // the table and cause the browser to clamp scrollLeft to 0).\n const headerScrollContainer = el.querySelector('.table-responsive') as HTMLElement;\n const viewport = el.querySelector('cdk-virtual-scroll-viewport') as HTMLElement;\n const savedHeaderScroll = headerScrollContainer?.scrollLeft ?? 0;\n const savedViewportScroll = viewport?.scrollLeft ?? 0;\n\n // Clear inline min-widths on ALL body rows. CDK virtual scroll recycles\n // <tr> DOM elements, so rows that were previously the \"first row\" retain\n // stale min-width styles. With table-layout: auto the column width is\n // determined by the widest cell across all visible rows, so stale\n // min-widths on any row prevent columns from ever shrinking.\n for (const row of allBodyRows) {\n const tds = row.cells;\n for (let i = 0; i < Math.min(tds.length, columnCount); i++) {\n tds[i].style.minWidth = '';\n }\n }\n for (let i = 0; i < columnCount; i++) {\n headerCells[i].style.minWidth = '';\n }\n\n // Temporarily force both tables to size to content only, overriding\n // Bootstrap's width:100% which causes table-layout:auto to redistribute\n // extra space across columns. Without this, measured widths include\n // redistributed space that varies with each data slice.\n const headerTable = el.querySelector<HTMLElement>('bs-table table');\n const bodyTable = el.querySelector<HTMLElement>('cdk-virtual-scroll-viewport table');\n headerTable?.style.setProperty('width', 'max-content', 'important');\n bodyTable?.style.setProperty('width', 'max-content', 'important');\n\n // Measure natural content widths across all visible rows\n for (let i = 0; i < columnCount; i++) {\n let colWidth = headerCells[i].offsetWidth;\n for (const row of allBodyRows) {\n const tds = row.cells;\n if (i < tds.length) {\n const w = tds[i].offsetWidth;\n if (w > colWidth) colWidth = w;\n }\n }\n // Update tracked maximum so columns only grow, never shrink\n if (!maxWidths[i] || colWidth > maxWidths[i]) {\n maxWidths[i] = colWidth;\n }\n }\n\n // Remove temporary width override so tables render normally\n headerTable?.style.removeProperty('width');\n bodyTable?.style.removeProperty('width');\n\n // Apply max widths to header and ALL body rows to keep them in sync.\n // Setting min-width on every row prevents table-layout:auto from\n // redistributing extra space differently across the two tables when\n // some rows contain placeholder content.\n for (let i = 0; i < columnCount; i++) {\n const w = `${maxWidths[i]}px`;\n headerCells[i].style.minWidth = w;\n for (const row of allBodyRows) {\n const tds = row.cells;\n if (i < tds.length) {\n tds[i].style.minWidth = w;\n }\n }\n }\n\n // Restore scroll positions after min-widths are re-applied\n if (headerScrollContainer) headerScrollContainer.scrollLeft = savedHeaderScroll;\n if (viewport) viewport.scrollLeft = savedViewportScroll;\n };\n\n // Sync after first render\n requestAnimationFrame(() => syncWidths());\n\n // Re-sync when body rows change (virtual scroll swaps rows)\n const observer = new MutationObserver(() => {\n requestAnimationFrame(() => syncWidths());\n });\n\n observer.observe(bodyTableBody, { childList: true, subtree: true });\n\n this.cleanup.push(() => observer.disconnect());\n }\n}\n","<div class=\"virtual-datatable-container\">\n <bs-table [isResponsive]=\"isResponsive()\" [striped]=\"true\" [hover]=\"true\">\n <thead>\n <tr>\n @for (column of columnsArray; track column) {\n <th class=\"text-nowrap\"\n [class.sort]=\"column.sortable()\"\n [class.sort-asc]=\"column.sortable() && getSortDirection(column.name()) === 'ascending'\"\n [class.sort-desc]=\"column.sortable() && getSortDirection(column.name()) === 'descending'\"\n (mousedown)=\"onHeaderMouseDown($event)\"\n (click)=\"columnHeaderClicked(column, $event)\">\n <ng-container *ngTemplateOutlet=\"column.templateRef\"></ng-container>\n @if (settings().sortColumns.length > 1 && getSortIndex(column.name()) >= 0) {\n <span class=\"sort-priority\">{{ getSortIndex(column.name()) + 1 }}</span>\n }\n </th>\n }\n </tr>\n </thead>\n </bs-table>\n\n <bs-table-styles>\n <cdk-virtual-scroll-viewport [itemSize]=\"itemSize()\" class=\"virtual-scroll-viewport\">\n <table class=\"table table-striped table-hover\" [class.nowrap]=\"isResponsive()\">\n <tbody>\n <tr *cdkVirtualFor=\"let item of dataSource()\" class=\"virtual-row\">\n @if (item && rowTemplate()) {\n <ng-container *ngTemplateOutlet=\"rowTemplate()!; context: { $implicit: item }\"></ng-container>\n } @else {\n @for (column of columnsArray; track column) {\n <td>&nbsp;</td>\n }\n }\n </tr>\n </tbody>\n </table>\n </cdk-virtual-scroll-viewport>\n </bs-table-styles>\n</div>\n","import { CollectionViewer, DataSource } from '@angular/cdk/collections';\nimport { BehaviorSubject, Observable, Subject, Subscription, from, merge, of } from 'rxjs';\nimport { catchError, distinctUntilChanged, filter, map, startWith, switchMap } from 'rxjs/operators';\n\nexport class VirtualDatatableDataSource<T> extends DataSource<T> {\n private readonly fetchFn: (skip: number, take: number) => Promise<{ data: T[]; totalRecords: number }>;\n private readonly pageSize: number;\n private readonly cachedPages = new Map<number, T[]>();\n private totalRecords = 0;\n private dataStream = new BehaviorSubject<T[]>([]);\n private subscription?: Subscription;\n private resetSubject = new Subject<void>();\n private resetVersion = 0;\n\n constructor(\n fetchFn: (skip: number, take: number) => Promise<{ data: T[]; totalRecords: number }>,\n pageSize = 50\n ) {\n super();\n this.fetchFn = fetchFn;\n this.pageSize = pageSize;\n }\n\n connect(collectionViewer: CollectionViewer): Observable<T[]> {\n // Support reconnection after disconnect (which completes the previous dataStream)\n this.dataStream = new BehaviorSubject<T[]>([]);\n this.cachedPages.clear();\n this.totalRecords = 0;\n\n // Track the last viewport range so reset() can re-trigger a fetch.\n // resetVersion is incremented on reset() to bypass distinctUntilChanged.\n let lastRange = { start: 0, end: this.pageSize };\n this.subscription = merge(\n collectionViewer.viewChange.pipe(startWith(lastRange)),\n this.resetSubject.pipe(map(() => lastRange))\n ).pipe(\n filter(range => range.end > range.start),\n map(range => { lastRange = range; return { pages: this.getPageIndices(range), version: this.resetVersion }; }),\n distinctUntilChanged((a, b) => a.version === b.version && a.pages.join() === b.pages.join()),\n switchMap(({ pages }) => from(this.fetchPages(pages)).pipe(\n catchError(() => of(this.dataStream.value))\n ))\n ).subscribe(data => this.dataStream.next(data));\n\n return this.dataStream;\n }\n\n disconnect(): void {\n this.subscription?.unsubscribe();\n this.dataStream.complete();\n }\n\n get length(): number {\n return this.totalRecords;\n }\n\n reset(): void {\n this.cachedPages.clear();\n this.resetVersion++;\n this.resetSubject.next();\n }\n\n private getPageIndices(range: { start: number; end: number }): number[] {\n const startPage = Math.floor(range.start / this.pageSize);\n const endPage = Math.floor((range.end - 1) / this.pageSize);\n const pages: number[] = [];\n for (let i = startPage; i <= endPage; i++) {\n pages.push(i);\n }\n return pages;\n }\n\n private async fetchPages(pageIndices: number[]): Promise<T[]> {\n const uncachedPages = pageIndices.filter(p => !this.cachedPages.has(p));\n\n const results = await Promise.all(\n uncachedPages.map(async pageIndex => {\n const skip = pageIndex * this.pageSize;\n const result = await this.fetchFn(skip, this.pageSize);\n return { pageIndex, result };\n })\n );\n\n for (const { pageIndex, result } of results) {\n this.cachedPages.set(pageIndex, result.data);\n }\n if (results.length > 0) {\n this.totalRecords = results[0].result.totalRecords;\n }\n\n // Build the full data array with placeholders for unloaded pages\n const totalPages = Math.ceil(this.totalRecords / this.pageSize);\n const data: T[] = [];\n for (let i = 0; i < totalPages; i++) {\n const page = this.cachedPages.get(i);\n if (page) {\n data.push(...page);\n } else {\n // Fill with empty slots to maintain correct virtual scroll positioning\n const remaining = Math.min(this.pageSize, this.totalRecords - i * this.pageSize);\n data.push(...new Array<T>(remaining));\n }\n }\n return data;\n }\n}\n","import { Directive, inject, TemplateRef } from '@angular/core';\nimport { BsVirtualDatatableComponent } from '../virtual-datatable/virtual-datatable.component';\n\n@Directive({\n selector: '[bsVirtualRowTemplate]',\n})\nexport class BsVirtualRowTemplateDirective<TData> {\n\n private datatableComponent = inject<BsVirtualDatatableComponent<TData>>(BsVirtualDatatableComponent);\n private templateRef = inject<TemplateRef<BsVirtualRowTemplateContext<TData>>>(TemplateRef);\n\n constructor() {\n this.datatableComponent.rowTemplate.set(this.templateRef);\n }\n\n public static ngTemplateContextGuard<TData>(\n dir: BsVirtualRowTemplateDirective<TData>,\n ctx: any\n ): ctx is BsVirtualRowTemplateContext<Exclude<TData, false | 0 | '' | null | undefined>> {\n return true;\n }\n}\n\nexport class BsVirtualRowTemplateContext<TData = unknown> {\n public $implicit: TData = null!;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;AAeM,MAAO,2BAAmC,SAAQ,iBAAiB,CAAA;AAPzE,IAAA,WAAA,GAAA;;AASmB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACxC,IAAA,CAAA,OAAO,GAAmB,EAAE;AAEpC,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,QAAQ,qDAAqC;AAChE,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAC,KAAK,wDAAC;AAC3B,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,EAAE,oDAAC;AAEX,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAA8D,SAAS,uDAAC;AAkJtG,IAAA;IAhJC,eAAe,GAAA;QACb,IAAI,CAAC,eAAe,EAAE;QACtB,IAAI,CAAC,oBAAoB,EAAE;IAC7B;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;IAClC;IAEQ,eAAe,GAAA;AACrB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,aAA4B;QACvD,MAAM,qBAAqB,GAAG,EAAE,CAAC,aAAa,CAAC,mBAAmB,CAAgB;QAClF,MAAM,QAAQ,GAAG,EAAE,CAAC,aAAa,CAAC,6BAA6B,CAAgB;AAE/E,QAAA,IAAI,CAAC,qBAAqB,IAAI,CAAC,QAAQ;YAAE;QAEzC,IAAI,OAAO,GAAG,KAAK;QAEnB,MAAM,cAAc,GAAG,MAAK;AAC1B,YAAA,IAAI,OAAO;gBAAE;YACb,OAAO,GAAG,IAAI;AACd,YAAA,QAAQ,CAAC,UAAU,GAAG,qBAAqB,CAAC,UAAU;YACtD,OAAO,GAAG,KAAK;AACjB,QAAA,CAAC;QAED,MAAM,gBAAgB,GAAG,MAAK;AAC5B,YAAA,IAAI,OAAO;gBAAE;YACb,OAAO,GAAG,IAAI;AACd,YAAA,qBAAqB,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU;YACtD,OAAO,GAAG,KAAK;AACjB,QAAA,CAAC;AAED,QAAA,qBAAqB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACnF,QAAA,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAExE,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAK;AACrB,YAAA,qBAAqB,CAAC,mBAAmB,CAAC,QAAQ,EAAE,cAAc,CAAC;AACnE,YAAA,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,EAAE,gBAAgB,CAAC;AAC1D,QAAA,CAAC,CAAC;IACJ;IAEQ,oBAAoB,GAAA;AAC1B,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,aAA4B;QACvD,MAAM,aAAa,GAAG,EAAE,CAAC,aAAa,CAAC,mCAAmC,CAAgB;AAE1F,QAAA,IAAI,CAAC,aAAa;YAAE;;;QAIpB,MAAM,SAAS,GAAa,EAAE;QAE9B,MAAM,UAAU,GAAG,MAAK;YACtB,MAAM,WAAW,GAAG,EAAE,CAAC,gBAAgB,CAAc,mBAAmB,CAAC;AACzE,YAAA,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAsB,IAAI,CAAC,CAAC;AACzF,YAAA,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC;AACnC,YAAA,MAAM,SAAS,GAAG,YAAY,EAAE,KAAK;YAErC,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,MAAM;gBAAE;AAE/C,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC;;;YAIlE,MAAM,qBAAqB,GAAG,EAAE,CAAC,aAAa,CAAC,mBAAmB,CAAgB;YAClF,MAAM,QAAQ,GAAG,EAAE,CAAC,aAAa,CAAC,6BAA6B,CAAgB;AAC/E,YAAA,MAAM,iBAAiB,GAAG,qBAAqB,EAAE,UAAU,IAAI,CAAC;AAChE,YAAA,MAAM,mBAAmB,GAAG,QAAQ,EAAE,UAAU,IAAI,CAAC;;;;;;AAOrD,YAAA,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE;AAC7B,gBAAA,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK;gBACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE;oBAC1D,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE;gBAC5B;YACF;AACA,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;gBACpC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE;YACpC;;;;;YAMA,MAAM,WAAW,GAAG,EAAE,CAAC,aAAa,CAAc,gBAAgB,CAAC;YACnE,MAAM,SAAS,GAAG,EAAE,CAAC,aAAa,CAAc,mCAAmC,CAAC;YACpF,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,WAAW,CAAC;YACnE,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,WAAW,CAAC;;AAGjE,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;gBACpC,IAAI,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW;AACzC,gBAAA,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE;AAC7B,oBAAA,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK;AACrB,oBAAA,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE;wBAClB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW;wBAC5B,IAAI,CAAC,GAAG,QAAQ;4BAAE,QAAQ,GAAG,CAAC;oBAChC;gBACF;;AAEA,gBAAA,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE;AAC5C,oBAAA,SAAS,CAAC,CAAC,CAAC,GAAG,QAAQ;gBACzB;YACF;;AAGA,YAAA,WAAW,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC;AAC1C,YAAA,SAAS,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC;;;;;AAMxC,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;gBACpC,MAAM,CAAC,GAAG,CAAA,EAAG,SAAS,CAAC,CAAC,CAAC,IAAI;gBAC7B,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC;AACjC,gBAAA,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE;AAC7B,oBAAA,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK;AACrB,oBAAA,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE;wBAClB,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC;oBAC3B;gBACF;YACF;;AAGA,YAAA,IAAI,qBAAqB;AAAE,gBAAA,qBAAqB,CAAC,UAAU,GAAG,iBAAiB;AAC/E,YAAA,IAAI,QAAQ;AAAE,gBAAA,QAAQ,CAAC,UAAU,GAAG,mBAAmB;AACzD,QAAA,CAAC;;AAGD,QAAA,qBAAqB,CAAC,MAAM,UAAU,EAAE,CAAC;;AAGzC,QAAA,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,MAAK;AACzC,YAAA,qBAAqB,CAAC,MAAM,UAAU,EAAE,CAAC;AAC3C,QAAA,CAAC,CAAC;AAEF,QAAA,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAEnE,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;IAChD;8GA1JW,2BAA2B,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA3B,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECfxC,w+DAuCA,EAAA,MAAA,EAAA,CAAA,miCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED3BY,gBAAgB,mJAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,uCAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,kCAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,gCAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,SAAA,EAAA,OAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAG1E,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAPvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EAAA,OAAA,EAGvB,CAAC,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,EAAE,sBAAsB,CAAC,EAAA,eAAA,EACrE,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,w+DAAA,EAAA,MAAA,EAAA,CAAA,miCAAA,CAAA,EAAA;;;AET3C,MAAO,0BAA8B,SAAQ,UAAa,CAAA;AAU9D,IAAA,WAAA,CACE,OAAqF,EACrF,QAAQ,GAAG,EAAE,EAAA;AAEb,QAAA,KAAK,EAAE;AAXQ,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,GAAG,EAAe;QAC7C,IAAA,CAAA,YAAY,GAAG,CAAC;AAChB,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,eAAe,CAAM,EAAE,CAAC;AAEzC,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,OAAO,EAAQ;QAClC,IAAA,CAAA,YAAY,GAAG,CAAC;AAOtB,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;IAC1B;AAEA,IAAA,OAAO,CAAC,gBAAkC,EAAA;;QAExC,IAAI,CAAC,UAAU,GAAG,IAAI,eAAe,CAAM,EAAE,CAAC;AAC9C,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;AACxB,QAAA,IAAI,CAAC,YAAY,GAAG,CAAC;;;AAIrB,QAAA,IAAI,SAAS,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE;AAChD,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK,CACvB,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EACtD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,SAAS,CAAC,CAAC,CAC7C,CAAC,IAAI,CACJ,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,EACxC,GAAG,CAAC,KAAK,IAAG,EAAG,SAAS,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,EAC9G,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAC5F,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CACxD,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAC5C,CAAC,CACH,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE/C,OAAO,IAAI,CAAC,UAAU;IACxB;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE;AAChC,QAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE;IAC5B;AAEA,IAAA,IAAI,MAAM,GAAA;QACR,OAAO,IAAI,CAAC,YAAY;IAC1B;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;QACxB,IAAI,CAAC,YAAY,EAAE;AACnB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;IAC1B;AAEQ,IAAA,cAAc,CAAC,KAAqC,EAAA;AAC1D,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;AACzD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC;QAC3D,MAAM,KAAK,GAAa,EAAE;AAC1B,QAAA,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC,EAAE,EAAE;AACzC,YAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACf;AACA,QAAA,OAAO,KAAK;IACd;IAEQ,MAAM,UAAU,CAAC,WAAqB,EAAA;QAC5C,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAEvE,QAAA,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,aAAa,CAAC,GAAG,CAAC,OAAM,SAAS,KAAG;AAClC,YAAA,MAAM,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC,QAAQ;AACtC,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC;AACtD,YAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE;QAC9B,CAAC,CAAC,CACH;QAED,KAAK,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE;YAC3C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC;QAC9C;AACA,QAAA,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YACtB,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY;QACpD;;AAGA,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/D,MAAM,IAAI,GAAQ,EAAE;AACpB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;YACnC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;YACpC,IAAI,IAAI,EAAE;AACR,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;YACpB;iBAAO;;gBAEL,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;gBAChF,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,CAAI,SAAS,CAAC,CAAC;YACvC;QACF;AACA,QAAA,OAAO,IAAI;IACb;AACD;;MCnGY,6BAA6B,CAAA;AAKxC,IAAA,WAAA,GAAA;AAHQ,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAqC,2BAA2B,CAAC;AAC5F,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAkD,WAAW,CAAC;QAGxF,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;IAC3D;AAEO,IAAA,OAAO,sBAAsB,CAClC,GAAyC,EACzC,GAAQ,EAAA;AAER,QAAA,OAAO,IAAI;IACb;8GAdW,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA7B,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAA7B,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAHzC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,wBAAwB;AACnC,iBAAA;;MAkBY,2BAA2B,CAAA;AAAxC,IAAA,WAAA,GAAA;QACS,IAAA,CAAA,SAAS,GAAU,IAAK;IACjC;AAAC;;ACzBD;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mintplayer/ng-bootstrap",
3
3
  "private": false,
4
- "version": "21.13.0",
4
+ "version": "21.14.0",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/MintPlayer/mintplayer-ng-bootstrap",
@@ -24,10 +24,6 @@
24
24
  "types": "./types/mintplayer-ng-bootstrap-alert.d.ts",
25
25
  "default": "./fesm2022/mintplayer-ng-bootstrap-alert.mjs"
26
26
  },
27
- "./async-host-binding": {
28
- "types": "./types/mintplayer-ng-bootstrap-async-host-binding.d.ts",
29
- "default": "./fesm2022/mintplayer-ng-bootstrap-async-host-binding.mjs"
30
- },
31
27
  "./badge": {
32
28
  "types": "./types/mintplayer-ng-bootstrap-badge.d.ts",
33
29
  "default": "./fesm2022/mintplayer-ng-bootstrap-badge.mjs"
@@ -1,4 +1,4 @@
1
- import * as i0 from '@angular/core';
1
+ import * as _angular_core from '@angular/core';
2
2
  import { TemplateRef } from '@angular/core';
3
3
  import { SortColumn, PaginationRequest, PaginationResponse } from '@mintplayer/pagination';
4
4
 
@@ -19,45 +19,45 @@ declare class DatatableSettings {
19
19
 
20
20
  declare class BsDatatableColumnDirective {
21
21
  templateRef: TemplateRef<any>;
22
- name: string;
23
- sortable: boolean;
24
- static ɵfac: i0.ɵɵFactoryDeclaration<BsDatatableColumnDirective, never>;
25
- static ɵdir: i0.ɵɵDirectiveDeclaration<BsDatatableColumnDirective, "[bsDatatableColumn]", never, { "name": { "alias": "bsDatatableColumn"; "required": false; }; "sortable": { "alias": "bsDatatableColumnSortable"; "required": false; }; }, {}, never, never, true, never>;
22
+ readonly name: _angular_core.InputSignal<string>;
23
+ readonly sortable: _angular_core.InputSignal<boolean>;
24
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsDatatableColumnDirective, never>;
25
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BsDatatableColumnDirective, "[bsDatatableColumn]", never, { "name": { "alias": "bsDatatableColumn"; "required": false; "isSignal": true; }; "sortable": { "alias": "bsDatatableColumnSortable"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
26
26
  }
27
27
 
28
28
  declare abstract class DatatableSortBase {
29
- readonly columns: i0.Signal<readonly BsDatatableColumnDirective[]>;
29
+ readonly columns: _angular_core.Signal<readonly BsDatatableColumnDirective[]>;
30
30
  get columnsArray(): readonly BsDatatableColumnDirective[];
31
- settings: i0.ModelSignal<DatatableSettings>;
31
+ settings: _angular_core.ModelSignal<DatatableSettings>;
32
32
  getSortIndex(columnName: string): number;
33
33
  getSortDirection(columnName: string): 'ascending' | 'descending' | null;
34
34
  onHeaderMouseDown(event: MouseEvent): void;
35
35
  columnHeaderClicked(column: BsDatatableColumnDirective, event: MouseEvent): void;
36
- static ɵfac: i0.ɵɵFactoryDeclaration<DatatableSortBase, never>;
37
- static ɵdir: i0.ɵɵDirectiveDeclaration<DatatableSortBase, never, never, { "settings": { "alias": "settings"; "required": false; "isSignal": true; }; }, { "settings": "settingsChange"; }, ["columns"], never, true, never>;
36
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DatatableSortBase, never>;
37
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DatatableSortBase, never, never, { "settings": { "alias": "settings"; "required": false; "isSignal": true; }; }, { "settings": "settingsChange"; }, ["columns"], never, true, never>;
38
38
  }
39
39
 
40
40
  declare class BsRowTemplateDirective<TData> {
41
41
  private datatableComponent;
42
42
  private templateRef;
43
43
  constructor();
44
- readonly bsRowTemplateOf: i0.InputSignal<PaginationResponse<TData> | undefined>;
44
+ readonly bsRowTemplateOf: _angular_core.InputSignal<PaginationResponse<TData> | undefined>;
45
45
  static ngTemplateContextGuard<TData>(dir: BsRowTemplateDirective<TData>, ctx: any): ctx is BsRowTemplateContext<Exclude<TData, false | 0 | '' | null | undefined>>;
46
- static ɵfac: i0.ɵɵFactoryDeclaration<BsRowTemplateDirective<any>, never>;
47
- static ɵdir: i0.ɵɵDirectiveDeclaration<BsRowTemplateDirective<any>, "[bsRowTemplate]", never, { "bsRowTemplateOf": { "alias": "bsRowTemplateOf"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
46
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsRowTemplateDirective<any>, never>;
47
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BsRowTemplateDirective<any>, "[bsRowTemplate]", never, { "bsRowTemplateOf": { "alias": "bsRowTemplateOf"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
48
48
  }
49
49
  declare class BsRowTemplateContext<TData = unknown> {
50
50
  $implicit: TData;
51
51
  }
52
52
 
53
53
  declare class BsDatatableComponent<TData> extends DatatableSortBase {
54
- numberOfColumns: i0.Signal<number>;
55
- data: i0.ModelSignal<PaginationResponse<TData> | undefined>;
56
- rowTemplate?: TemplateRef<BsRowTemplateContext<TData>>;
54
+ numberOfColumns: _angular_core.Signal<number>;
55
+ data: _angular_core.ModelSignal<PaginationResponse<TData> | undefined>;
56
+ readonly rowTemplate: _angular_core.WritableSignal<TemplateRef<BsRowTemplateContext<TData>> | undefined>;
57
57
  onPerPageChange(perPage: number): void;
58
58
  onPageChange(page: number): void;
59
- static ɵfac: i0.ɵɵFactoryDeclaration<BsDatatableComponent<any>, never>;
60
- static ɵcmp: i0.ɵɵComponentDeclaration<BsDatatableComponent<any>, "bs-datatable", never, { "data": { "alias": "data"; "required": false; "isSignal": true; }; }, { "data": "dataChange"; }, never, never, true, never>;
59
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsDatatableComponent<any>, never>;
60
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsDatatableComponent<any>, "bs-datatable", never, { "data": { "alias": "data"; "required": false; "isSignal": true; }; }, { "data": "dataChange"; }, never, never, true, never>;
61
61
  }
62
62
 
63
63
  export { BsDatatableColumnDirective, BsDatatableComponent, BsRowTemplateContext, BsRowTemplateDirective, DatatableSettings, DatatableSortBase };
@@ -8,7 +8,7 @@ declare class BsTimepickerComponent {
8
8
  clock: _angular_core.WritableSignal<SafeHtml | undefined>;
9
9
  colors: typeof Color;
10
10
  isOpen: _angular_core.ModelSignal<boolean>;
11
- presetTimestamps: Date[];
11
+ readonly presetTimestamps: _angular_core.WritableSignal<Date[]>;
12
12
  isFocused: _angular_core.WritableSignal<boolean>;
13
13
  selectAll(box: HTMLInputElement): void;
14
14
  setNumber(event: Event, max: number, nextInput: HTMLInputElement | null): void;
@@ -1,4 +1,4 @@
1
- import * as i0 from '@angular/core';
1
+ import * as _angular_core from '@angular/core';
2
2
  import { AfterViewInit, OnDestroy, TemplateRef } from '@angular/core';
3
3
  import { DatatableSortBase } from '@mintplayer/ng-bootstrap/datatable';
4
4
  import { DataSource, CollectionViewer } from '@angular/cdk/collections';
@@ -30,8 +30,8 @@ declare class BsVirtualRowTemplateDirective<TData> {
30
30
  private templateRef;
31
31
  constructor();
32
32
  static ngTemplateContextGuard<TData>(dir: BsVirtualRowTemplateDirective<TData>, ctx: any): ctx is BsVirtualRowTemplateContext<Exclude<TData, false | 0 | '' | null | undefined>>;
33
- static ɵfac: i0.ɵɵFactoryDeclaration<BsVirtualRowTemplateDirective<any>, never>;
34
- static ɵdir: i0.ɵɵDirectiveDeclaration<BsVirtualRowTemplateDirective<any>, "[bsVirtualRowTemplate]", never, {}, {}, never, never, true, never>;
33
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsVirtualRowTemplateDirective<any>, never>;
34
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BsVirtualRowTemplateDirective<any>, "[bsVirtualRowTemplate]", never, {}, {}, never, never, true, never>;
35
35
  }
36
36
  declare class BsVirtualRowTemplateContext<TData = unknown> {
37
37
  $implicit: TData;
@@ -39,18 +39,17 @@ declare class BsVirtualRowTemplateContext<TData = unknown> {
39
39
 
40
40
  declare class BsVirtualDatatableComponent<TData> extends DatatableSortBase implements AfterViewInit, OnDestroy {
41
41
  private readonly elementRef;
42
- private readonly ngZone;
43
42
  private cleanup;
44
- dataSource: i0.InputSignal<VirtualDatatableDataSource<TData>>;
45
- isResponsive: i0.InputSignal<boolean>;
46
- itemSize: i0.InputSignal<number>;
47
- rowTemplate?: TemplateRef<BsVirtualRowTemplateContext<TData>>;
43
+ dataSource: _angular_core.InputSignal<VirtualDatatableDataSource<TData>>;
44
+ isResponsive: _angular_core.InputSignal<boolean>;
45
+ itemSize: _angular_core.InputSignal<number>;
46
+ readonly rowTemplate: _angular_core.WritableSignal<TemplateRef<BsVirtualRowTemplateContext<TData>> | undefined>;
48
47
  ngAfterViewInit(): void;
49
48
  ngOnDestroy(): void;
50
49
  private setupScrollSync;
51
50
  private setupColumnWidthSync;
52
- static ɵfac: i0.ɵɵFactoryDeclaration<BsVirtualDatatableComponent<any>, never>;
53
- static ɵcmp: i0.ɵɵComponentDeclaration<BsVirtualDatatableComponent<any>, "bs-virtual-datatable", never, { "dataSource": { "alias": "dataSource"; "required": true; "isSignal": true; }; "isResponsive": { "alias": "isResponsive"; "required": false; "isSignal": true; }; "itemSize": { "alias": "itemSize"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
51
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsVirtualDatatableComponent<any>, never>;
52
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsVirtualDatatableComponent<any>, "bs-virtual-datatable", never, { "dataSource": { "alias": "dataSource"; "required": true; "isSignal": true; }; "isResponsive": { "alias": "isResponsive"; "required": false; "isSignal": true; }; "itemSize": { "alias": "itemSize"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
54
53
  }
55
54
 
56
55
  export { BsVirtualDatatableComponent, BsVirtualRowTemplateContext, BsVirtualRowTemplateDirective, VirtualDatatableDataSource };
@@ -1,47 +0,0 @@
1
- import { EVENT_MANAGER_PLUGINS } from '@angular/platform-browser';
2
- import { EMPTY } from 'rxjs';
3
- import { take, switchMap } from 'rxjs/operators';
4
-
5
- class BsBindEventPlugin {
6
- supports(event) {
7
- return event.startsWith('$.');
8
- }
9
- addEventListener(element, event) {
10
- const el = element;
11
- el[event] = EMPTY;
12
- const method = this.getMethod(element, event);
13
- const sub = this.manager.getZone()
14
- .onStable.pipe(take(1), switchMap(() => el[event]))
15
- .subscribe((value) => method(value));
16
- return () => sub.unsubscribe();
17
- }
18
- getMethod(element, event) {
19
- const el = element;
20
- const [, key, value, unit = ''] = event.split('.');
21
- if (event.endsWith('.attr')) {
22
- return (v) => element.setAttribute(key, String(v));
23
- }
24
- if (key === 'class') {
25
- return (v) => element.classList.toggle(value, !!v);
26
- }
27
- if (key === 'style') {
28
- return (v) => element.style.setProperty(value, `${v}${unit}`);
29
- }
30
- return (v) => (el[key] = v);
31
- }
32
- }
33
-
34
- function provideAsyncHostBindings() {
35
- return [{
36
- provide: EVENT_MANAGER_PLUGINS,
37
- useClass: BsBindEventPlugin,
38
- multi: true,
39
- }];
40
- }
41
-
42
- /**
43
- * Generated bundle index. Do not edit.
44
- */
45
-
46
- export { BsBindEventPlugin, provideAsyncHostBindings };
47
- //# sourceMappingURL=mintplayer-ng-bootstrap-async-host-binding.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mintplayer-ng-bootstrap-async-host-binding.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/async-host-binding/src/bind-event.plugin.ts","../../../../libs/mintplayer-ng-bootstrap/async-host-binding/src/provide-async-host-bindings.ts","../../../../libs/mintplayer-ng-bootstrap/async-host-binding/mintplayer-ng-bootstrap-async-host-binding.ts"],"sourcesContent":["import { EventManager } from '@angular/platform-browser';\nimport { EMPTY } from 'rxjs';\nimport { switchMap, take } from 'rxjs/operators';\n\nexport class BsBindEventPlugin {\n manager!: EventManager;\n\n supports(event: string) {\n return event.startsWith('$.');\n }\n\n addEventListener(element: HTMLElement, event: string) {\n const el = <any>element;\n el[event] = EMPTY;\n\n const method = this.getMethod(element, event);\n const sub = this.manager.getZone()\n .onStable.pipe(take(1), switchMap(() => el[event]))\n .subscribe((value) => method(value));\n\n return () => sub.unsubscribe();\n }\n\n private getMethod(element: HTMLElement, event: string) {\n const el = <any>element;\n const [, key, value, unit = ''] = event.split('.');\n\n if (event.endsWith('.attr')) {\n return (v: unknown) => element.setAttribute(key, String(v));\n }\n\n if (key === 'class') {\n return (v: unknown) => element.classList.toggle(value, !!v);\n }\n\n if (key === 'style') {\n return (v: unknown) => element.style.setProperty(value, `${v}${unit}`);\n }\n\n return (v: unknown) => (el[key] = v);\n }\n}","import { Provider } from '@angular/core';\nimport { EVENT_MANAGER_PLUGINS } from '@angular/platform-browser';\nimport { BsBindEventPlugin } from './bind-event.plugin';\n\nexport function provideAsyncHostBindings(): Provider[] {\n return [{\n provide: EVENT_MANAGER_PLUGINS,\n useClass: BsBindEventPlugin,\n multi: true,\n }];\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;MAIa,iBAAiB,CAAA;AAG5B,IAAA,QAAQ,CAAC,KAAa,EAAA;AACpB,QAAA,OAAO,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;IAC/B;IAEA,gBAAgB,CAAC,OAAoB,EAAE,KAAa,EAAA;QAClD,MAAM,EAAE,GAAQ,OAAO;AACvB,QAAA,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK;QAEjB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC;AAC7C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO;AAC7B,aAAA,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;aACjD,SAAS,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC;AAEtC,QAAA,OAAO,MAAM,GAAG,CAAC,WAAW,EAAE;IAChC;IAEQ,SAAS,CAAC,OAAoB,EAAE,KAAa,EAAA;QACnD,MAAM,EAAE,GAAQ,OAAO;AACvB,QAAA,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;AAElD,QAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AAC3B,YAAA,OAAO,CAAC,CAAU,KAAK,OAAO,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7D;AAEA,QAAA,IAAI,GAAG,KAAK,OAAO,EAAE;AACnB,YAAA,OAAO,CAAC,CAAU,KAAK,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7D;AAEA,QAAA,IAAI,GAAG,KAAK,OAAO,EAAE;AACnB,YAAA,OAAO,CAAC,CAAU,KAAK,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,CAAA,EAAG,CAAC,GAAG,IAAI,CAAA,CAAE,CAAC;QACxE;AAEA,QAAA,OAAO,CAAC,CAAU,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtC;AACD;;SCrCe,wBAAwB,GAAA;AACtC,IAAA,OAAO,CAAC;AACN,YAAA,OAAO,EAAE,qBAAqB;AAC9B,YAAA,QAAQ,EAAE,iBAAiB;AAC3B,YAAA,KAAK,EAAE,IAAI;AACZ,SAAA,CAAC;AACJ;;ACVA;;AAEG;;;;"}
@@ -1,13 +0,0 @@
1
- import { Provider } from '@angular/core';
2
- import { EventManager } from '@angular/platform-browser';
3
-
4
- declare function provideAsyncHostBindings(): Provider[];
5
-
6
- declare class BsBindEventPlugin {
7
- manager: EventManager;
8
- supports(event: string): boolean;
9
- addEventListener(element: HTMLElement, event: string): () => void;
10
- private getMethod;
11
- }
12
-
13
- export { BsBindEventPlugin, provideAsyncHostBindings };