@mintplayer/ng-bootstrap 21.12.10 → 21.12.12

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.
@@ -8,6 +8,7 @@ import { BsPaginationComponent } from '@mintplayer/ng-bootstrap/pagination';
8
8
  class DatatableSettings {
9
9
  constructor(data) {
10
10
  this.sortColumns = [];
11
+ this.pageNumberOfBoxes = 11;
11
12
  Object.assign(this, data);
12
13
  if (data && data.perPage) {
13
14
  this.perPage = data.perPage;
@@ -139,11 +140,11 @@ class BsDatatableComponent extends DatatableSortBase {
139
140
  }));
140
141
  }
141
142
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: BsDatatableComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
142
- 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\"></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 }); }
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 }); }
143
144
  }
144
145
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: BsDatatableComponent, decorators: [{
145
146
  type: Component,
146
- 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\"></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"] }]
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"] }]
147
148
  }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }, { type: i0.Output, args: ["dataChange"] }] } });
148
149
 
149
150
  class BsRowTemplateDirective {
@@ -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\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\"></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 @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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"}
@@ -32,11 +32,11 @@ class BsMultiselectComponent {
32
32
  }
33
33
  }
34
34
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: BsMultiselectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
35
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.6", type: BsMultiselectComponent, isStandalone: true, selector: "bs-multiselect", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, selectedItems: { classPropertyName: "selectedItems", publicName: "selectedItems", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { items: "itemsChange", selectedItems: "selectedItemsChange" }, viewQueries: [{ propertyName: "defaultButtonTemplate", first: true, predicate: ["defaultButtonTemplate"], descendants: true, isSignal: true }, { propertyName: "defaultItemTemplate", first: true, predicate: ["defaultItemTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "<bs-has-overlay></bs-has-overlay>\n<div bsDropdown [hasBackdrop]=\"true\" [closeOnClickOutside]=\"true\">\n <button bsDropdownToggle [color]=\"colors.primary\">\n <ng-container *ngTemplateOutlet=\"resolvedButtonTemplate(); context: { $implicit: selectedItems().length }\"></ng-container>\n </button>\n <div *bsDropdownMenu class=\"bg-white mw-250px p-3 border rounded shadow\">\n <ng-container *ngTemplateOutlet=\"headerTemplate()\"></ng-container>\n @if (headerTemplate()) {\n <hr class=\"my-2\">\n }\n @for (item of items(); track item) {\n <bs-toggle-button [ngModel]=\"selectedItems().indexOf(item) > -1\" (ngModelChange)=\"itemChange(item, $event)\" class=\"d-block\"><ng-container *ngTemplateOutlet=\"resolvedItemTemplate(); context: { $implicit: item }\"></ng-container></bs-toggle-button>\n }\n @if (footerTemplate()) {\n <hr class=\"my-2\">\n }\n <ng-container *ngTemplateOutlet=\"footerTemplate()\"></ng-container>\n </div>\n</div>\n<ng-template #defaultButtonTemplate let-count>\n {{ count }} selected\n</ng-template>\n<ng-template #defaultItemTemplate let-item>{{ item }}</ng-template>\n", styles: [".mw-250px{min-width:250px}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: BsHasOverlayComponent, selector: "bs-has-overlay" }, { kind: "directive", type: BsDropdownDirective, selector: "[bsDropdown]", inputs: ["hasBackdrop", "sameWidth", "closeOnClickOutside", "sameDropdownWidth", "isOpen"], outputs: ["isOpenChange"] }, { kind: "directive", type: BsDropdownToggleDirective, selector: "[bsDropdownToggle]" }, { kind: "directive", type: BsDropdownMenuDirective, selector: "[bsDropdownMenu]" }, { kind: "component", type: BsToggleButtonComponent, selector: "bs-toggle-button", inputs: ["type", "isToggled", "name", "value", "group"], outputs: ["isToggledChange"] }, { kind: "directive", type: BsButtonTypeDirective, selector: "button[color],input[type=\"button\"][color],input[type=\"submit\"][color],a[color]", inputs: ["color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
35
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.6", type: BsMultiselectComponent, isStandalone: true, selector: "bs-multiselect", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, selectedItems: { classPropertyName: "selectedItems", publicName: "selectedItems", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { items: "itemsChange", selectedItems: "selectedItemsChange" }, viewQueries: [{ propertyName: "defaultButtonTemplate", first: true, predicate: ["defaultButtonTemplate"], descendants: true, isSignal: true }, { propertyName: "defaultItemTemplate", first: true, predicate: ["defaultItemTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "<bs-has-overlay></bs-has-overlay>\n<div bsDropdown [hasBackdrop]=\"true\" [closeOnClickOutside]=\"true\">\n <button type=\"button\" bsDropdownToggle [color]=\"colors.primary\">\n <ng-container *ngTemplateOutlet=\"resolvedButtonTemplate(); context: { $implicit: selectedItems().length }\"></ng-container>\n </button>\n <div *bsDropdownMenu class=\"bg-white mw-250px p-3 border rounded shadow\">\n <ng-container *ngTemplateOutlet=\"headerTemplate()\"></ng-container>\n @if (headerTemplate()) {\n <hr class=\"my-2\">\n }\n @for (item of items(); track item) {\n <bs-toggle-button [ngModel]=\"selectedItems().indexOf(item) > -1\" (ngModelChange)=\"itemChange(item, $event)\" class=\"d-block\"><ng-container *ngTemplateOutlet=\"resolvedItemTemplate(); context: { $implicit: item }\"></ng-container></bs-toggle-button>\n }\n @if (footerTemplate()) {\n <hr class=\"my-2\">\n }\n <ng-container *ngTemplateOutlet=\"footerTemplate()\"></ng-container>\n </div>\n</div>\n<ng-template #defaultButtonTemplate let-count>\n {{ count }} selected\n</ng-template>\n<ng-template #defaultItemTemplate let-item>{{ item }}</ng-template>\n", styles: [".mw-250px{min-width:250px}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: BsHasOverlayComponent, selector: "bs-has-overlay" }, { kind: "directive", type: BsDropdownDirective, selector: "[bsDropdown]", inputs: ["hasBackdrop", "sameWidth", "closeOnClickOutside", "sameDropdownWidth", "isOpen"], outputs: ["isOpenChange"] }, { kind: "directive", type: BsDropdownToggleDirective, selector: "[bsDropdownToggle]" }, { kind: "directive", type: BsDropdownMenuDirective, selector: "[bsDropdownMenu]" }, { kind: "component", type: BsToggleButtonComponent, selector: "bs-toggle-button", inputs: ["type", "isToggled", "name", "value", "group"], outputs: ["isToggledChange"] }, { kind: "directive", type: BsButtonTypeDirective, selector: "button[color],input[type=\"button\"][color],input[type=\"submit\"][color],a[color]", inputs: ["color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
36
36
  }
37
37
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: BsMultiselectComponent, decorators: [{
38
38
  type: Component,
39
- args: [{ selector: 'bs-multiselect', imports: [NgTemplateOutlet, FormsModule, BsHasOverlayComponent, BsDropdownDirective, BsDropdownToggleDirective, BsDropdownMenuDirective, BsToggleButtonComponent, BsButtonTypeDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "<bs-has-overlay></bs-has-overlay>\n<div bsDropdown [hasBackdrop]=\"true\" [closeOnClickOutside]=\"true\">\n <button bsDropdownToggle [color]=\"colors.primary\">\n <ng-container *ngTemplateOutlet=\"resolvedButtonTemplate(); context: { $implicit: selectedItems().length }\"></ng-container>\n </button>\n <div *bsDropdownMenu class=\"bg-white mw-250px p-3 border rounded shadow\">\n <ng-container *ngTemplateOutlet=\"headerTemplate()\"></ng-container>\n @if (headerTemplate()) {\n <hr class=\"my-2\">\n }\n @for (item of items(); track item) {\n <bs-toggle-button [ngModel]=\"selectedItems().indexOf(item) > -1\" (ngModelChange)=\"itemChange(item, $event)\" class=\"d-block\"><ng-container *ngTemplateOutlet=\"resolvedItemTemplate(); context: { $implicit: item }\"></ng-container></bs-toggle-button>\n }\n @if (footerTemplate()) {\n <hr class=\"my-2\">\n }\n <ng-container *ngTemplateOutlet=\"footerTemplate()\"></ng-container>\n </div>\n</div>\n<ng-template #defaultButtonTemplate let-count>\n {{ count }} selected\n</ng-template>\n<ng-template #defaultItemTemplate let-item>{{ item }}</ng-template>\n", styles: [".mw-250px{min-width:250px}\n"] }]
39
+ args: [{ selector: 'bs-multiselect', imports: [NgTemplateOutlet, FormsModule, BsHasOverlayComponent, BsDropdownDirective, BsDropdownToggleDirective, BsDropdownMenuDirective, BsToggleButtonComponent, BsButtonTypeDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "<bs-has-overlay></bs-has-overlay>\n<div bsDropdown [hasBackdrop]=\"true\" [closeOnClickOutside]=\"true\">\n <button type=\"button\" bsDropdownToggle [color]=\"colors.primary\">\n <ng-container *ngTemplateOutlet=\"resolvedButtonTemplate(); context: { $implicit: selectedItems().length }\"></ng-container>\n </button>\n <div *bsDropdownMenu class=\"bg-white mw-250px p-3 border rounded shadow\">\n <ng-container *ngTemplateOutlet=\"headerTemplate()\"></ng-container>\n @if (headerTemplate()) {\n <hr class=\"my-2\">\n }\n @for (item of items(); track item) {\n <bs-toggle-button [ngModel]=\"selectedItems().indexOf(item) > -1\" (ngModelChange)=\"itemChange(item, $event)\" class=\"d-block\"><ng-container *ngTemplateOutlet=\"resolvedItemTemplate(); context: { $implicit: item }\"></ng-container></bs-toggle-button>\n }\n @if (footerTemplate()) {\n <hr class=\"my-2\">\n }\n <ng-container *ngTemplateOutlet=\"footerTemplate()\"></ng-container>\n </div>\n</div>\n<ng-template #defaultButtonTemplate let-count>\n {{ count }} selected\n</ng-template>\n<ng-template #defaultItemTemplate let-item>{{ item }}</ng-template>\n", styles: [".mw-250px{min-width:250px}\n"] }]
40
40
  }], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }, { type: i0.Output, args: ["itemsChange"] }], selectedItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedItems", required: false }] }, { type: i0.Output, args: ["selectedItemsChange"] }], defaultButtonTemplate: [{ type: i0.ViewChild, args: ['defaultButtonTemplate', { isSignal: true }] }], defaultItemTemplate: [{ type: i0.ViewChild, args: ['defaultItemTemplate', { isSignal: true }] }] } });
41
41
 
42
42
  class BsHeaderTemplateDirective {
@@ -1 +1 @@
1
- {"version":3,"file":"mintplayer-ng-bootstrap-multiselect.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/multiselect/src/component/multiselect.component.ts","../../../../libs/mintplayer-ng-bootstrap/multiselect/src/component/multiselect.component.html","../../../../libs/mintplayer-ng-bootstrap/multiselect/src/directives/header-template/header-template.directive.ts","../../../../libs/mintplayer-ng-bootstrap/multiselect/src/directives/footer-template/footer-template.directive.ts","../../../../libs/mintplayer-ng-bootstrap/multiselect/src/directives/button-template/button-template.directive.ts","../../../../libs/mintplayer-ng-bootstrap/multiselect/src/directives/item-template/item-template.directive.ts","../../../../libs/mintplayer-ng-bootstrap/multiselect/mintplayer-ng-bootstrap-multiselect.ts"],"sourcesContent":["import { Component, computed, model, signal, TemplateRef, viewChild, ChangeDetectionStrategy } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { BsHasOverlayComponent } from '@mintplayer/ng-bootstrap/has-overlay';\nimport { BsDropdownDirective, BsDropdownToggleDirective, BsDropdownMenuDirective } from '@mintplayer/ng-bootstrap/dropdown';\nimport { BsToggleButtonComponent } from '@mintplayer/ng-bootstrap/toggle-button';\nimport { BsButtonTypeDirective } from '@mintplayer/ng-bootstrap/button-type';\nimport { Color } from '@mintplayer/ng-bootstrap';\n\n@Component({\n selector: 'bs-multiselect',\n templateUrl: './multiselect.component.html',\n styleUrls: ['./multiselect.component.scss'],\n imports: [NgTemplateOutlet, FormsModule, BsHasOverlayComponent, BsDropdownDirective, BsDropdownToggleDirective, BsDropdownMenuDirective, BsToggleButtonComponent, BsButtonTypeDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BsMultiselectComponent<T> {\n\n readonly headerTemplate = signal<TemplateRef<any> | undefined>(undefined);\n readonly footerTemplate = signal<TemplateRef<any> | undefined>(undefined);\n readonly buttonTemplate = signal<TemplateRef<any> | undefined>(undefined);\n readonly itemTemplate = signal<TemplateRef<any> | undefined>(undefined);\n readonly colors = Color;\n\n readonly items = model<T[]>([]);\n readonly selectedItems = model<T[]>([]);\n readonly defaultButtonTemplate = viewChild.required<TemplateRef<any>>('defaultButtonTemplate');\n readonly defaultItemTemplate = viewChild.required<TemplateRef<any>>('defaultItemTemplate');\n\n readonly resolvedButtonTemplate = computed(() => this.buttonTemplate() ?? this.defaultButtonTemplate());\n readonly resolvedItemTemplate = computed(() => this.itemTemplate() ?? this.defaultItemTemplate());\n\n itemChange(item: T, value: boolean | null) {\n if (value) {\n this.selectedItems.update(v => [...v, item]);\n } else {\n this.selectedItems.update(v => v.filter(i => i !== item));\n }\n }\n\n}\n","<bs-has-overlay></bs-has-overlay>\n<div bsDropdown [hasBackdrop]=\"true\" [closeOnClickOutside]=\"true\">\n <button bsDropdownToggle [color]=\"colors.primary\">\n <ng-container *ngTemplateOutlet=\"resolvedButtonTemplate(); context: { $implicit: selectedItems().length }\"></ng-container>\n </button>\n <div *bsDropdownMenu class=\"bg-white mw-250px p-3 border rounded shadow\">\n <ng-container *ngTemplateOutlet=\"headerTemplate()\"></ng-container>\n @if (headerTemplate()) {\n <hr class=\"my-2\">\n }\n @for (item of items(); track item) {\n <bs-toggle-button [ngModel]=\"selectedItems().indexOf(item) > -1\" (ngModelChange)=\"itemChange(item, $event)\" class=\"d-block\"><ng-container *ngTemplateOutlet=\"resolvedItemTemplate(); context: { $implicit: item }\"></ng-container></bs-toggle-button>\n }\n @if (footerTemplate()) {\n <hr class=\"my-2\">\n }\n <ng-container *ngTemplateOutlet=\"footerTemplate()\"></ng-container>\n </div>\n</div>\n<ng-template #defaultButtonTemplate let-count>\n {{ count }} selected\n</ng-template>\n<ng-template #defaultItemTemplate let-item>{{ item }}</ng-template>\n","import { Directive, inject, TemplateRef } from '@angular/core';\nimport { BsMultiselectComponent } from '../../component/multiselect.component';\n\n@Directive({\n selector: '[bsHeaderTemplate]',\n})\nexport class BsHeaderTemplateDirective<T> {\n\n constructor() {\n const template = inject(TemplateRef);\n const multiselect = inject<BsMultiselectComponent<T>>(BsMultiselectComponent);\n multiselect.headerTemplate.set(template);\n }\n\n}\n","import { Directive, inject, TemplateRef } from '@angular/core';\nimport { BsMultiselectComponent } from '../../component/multiselect.component';\n\n@Directive({\n selector: '[bsFooterTemplate]',\n})\nexport class BsFooterTemplateDirective<T> {\n\n constructor() {\n const template = inject(TemplateRef);\n const multiselect = inject<BsMultiselectComponent<T>>(BsMultiselectComponent);\n multiselect.footerTemplate.set(template);\n }\n\n}\n","import { Directive, inject, TemplateRef } from '@angular/core';\nimport { BsMultiselectComponent } from '../../component/multiselect.component';\n\n@Directive({\n selector: '[bsButtonTemplate]',\n})\nexport class BsButtonTemplateDirective<T> {\n\n constructor() {\n const template = inject(TemplateRef);\n const multiselect = inject<BsMultiselectComponent<T>>(BsMultiselectComponent);\n multiselect.buttonTemplate.set(template);\n }\n\n public static ngTemplateContextGuard<TData>(\n dir: BsButtonTemplateDirective<TData>,\n ctx: any\n ): ctx is BsRButtonTemplateContext {\n return true;\n }\n\n}\n\nexport class BsRButtonTemplateContext {\n public $implicit: number = null!;\n}\n","import { Directive, effect, inject, input, TemplateRef } from '@angular/core';\nimport { BsMultiselectComponent } from '../../component/multiselect.component';\n\n@Directive({\n selector: '[bsItemTemplate]',\n})\nexport class BsItemTemplateDirective<T> {\n private multiselect = inject<BsMultiselectComponent<T>>(BsMultiselectComponent);\n\n constructor() {\n const template = inject(TemplateRef);\n this.multiselect.itemTemplate.set(template);\n\n effect(() => {\n const value = this.bsItemTemplateOf();\n if (value) {\n this.multiselect.items.set(value);\n }\n });\n }\n\n public static ngTemplateContextGuard<TData>(\n dir: BsItemTemplateDirective<TData>,\n ctx: any\n ): ctx is BsItemTemplateContext<Exclude<TData, false | 0 | '' | null | undefined>> {\n return true;\n }\n\n /** Pass the items array — forwards to BsMultiselectComponent.items */\n readonly bsItemTemplateOf = input<T[] | undefined>(undefined);\n}\n\nexport class BsItemTemplateContext<T> {\n public $implicit: T = null!;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;MAgBa,sBAAsB,CAAA;AAPnC,IAAA,WAAA,GAAA;AASW,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAA+B,SAAS,0DAAC;AAChE,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAA+B,SAAS,0DAAC;AAChE,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAA+B,SAAS,0DAAC;AAChE,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAA+B,SAAS,wDAAC;QAC9D,IAAA,CAAA,MAAM,GAAG,KAAK;AAEd,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAM,EAAE,iDAAC;AACtB,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAM,EAAE,yDAAC;AAC9B,QAAA,IAAA,CAAA,qBAAqB,GAAG,SAAS,CAAC,QAAQ,CAAmB,uBAAuB,CAAC;AACrF,QAAA,IAAA,CAAA,mBAAmB,GAAG,SAAS,CAAC,QAAQ,CAAmB,qBAAqB,CAAC;AAEjF,QAAA,IAAA,CAAA,sBAAsB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,qBAAqB,EAAE,kEAAC;AAC9F,QAAA,IAAA,CAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,mBAAmB,EAAE,gEAAC;AAUlG,IAAA;IARC,UAAU,CAAC,IAAO,EAAE,KAAqB,EAAA;QACvC,IAAI,KAAK,EAAE;AACT,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QAC9C;aAAO;YACL,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAC3D;IACF;8GAtBW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,orBChBnC,4rCAuBA,EAAA,MAAA,EAAA,CAAA,8BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDVY,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,qBAAqB,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,gLAAE,yBAAyB,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,uBAAuB,EAAA,QAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,uBAAuB,oJAAE,qBAAqB,EAAA,QAAA,EAAA,oFAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAG5K,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAPlC,SAAS;+BACE,gBAAgB,EAAA,OAAA,EAGjB,CAAC,gBAAgB,EAAE,WAAW,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,qBAAqB,CAAC,EAAA,eAAA,EACvK,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,4rCAAA,EAAA,MAAA,EAAA,CAAA,8BAAA,CAAA,EAAA;AAYuB,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,CAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,uBAAuB,6EACzB,qBAAqB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MErB9E,yBAAyB,CAAA;AAEpC,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC;AACpC,QAAA,MAAM,WAAW,GAAG,MAAM,CAA4B,sBAAsB,CAAC;AAC7E,QAAA,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC1C;8GANW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAHrC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,oBAAoB;AAC/B,iBAAA;;;MCCY,yBAAyB,CAAA;AAEpC,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC;AACpC,QAAA,MAAM,WAAW,GAAG,MAAM,CAA4B,sBAAsB,CAAC;AAC7E,QAAA,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC1C;8GANW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAHrC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,oBAAoB;AAC/B,iBAAA;;;MCCY,yBAAyB,CAAA;AAEpC,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC;AACpC,QAAA,MAAM,WAAW,GAAG,MAAM,CAA4B,sBAAsB,CAAC;AAC7E,QAAA,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC1C;AAEO,IAAA,OAAO,sBAAsB,CAClC,GAAqC,EACrC,GAAQ,EAAA;AAER,QAAA,OAAO,IAAI;IACb;8GAbW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAHrC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,oBAAoB;AAC/B,iBAAA;;MAkBY,wBAAwB,CAAA;AAArC,IAAA,WAAA,GAAA;QACS,IAAA,CAAA,SAAS,GAAW,IAAK;IAClC;AAAC;;MCnBY,uBAAuB,CAAA;AAGlC,IAAA,WAAA,GAAA;AAFQ,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAA4B,sBAAsB,CAAC;;AAsBtE,QAAA,IAAA,CAAA,gBAAgB,GAAG,KAAK,CAAkB,SAAS,4DAAC;AAnB3D,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC;QAE3C,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE;YACrC,IAAI,KAAK,EAAE;gBACT,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;YACnC;AACF,QAAA,CAAC,CAAC;IACJ;AAEO,IAAA,OAAO,sBAAsB,CAClC,GAAmC,EACnC,GAAQ,EAAA;AAER,QAAA,OAAO,IAAI;IACb;8GApBW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAvB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAHnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kBAAkB;AAC7B,iBAAA;;MA2BY,qBAAqB,CAAA;AAAlC,IAAA,WAAA,GAAA;QACS,IAAA,CAAA,SAAS,GAAM,IAAK;IAC7B;AAAC;;AClCD;;AAEG;;;;"}
1
+ {"version":3,"file":"mintplayer-ng-bootstrap-multiselect.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/multiselect/src/component/multiselect.component.ts","../../../../libs/mintplayer-ng-bootstrap/multiselect/src/component/multiselect.component.html","../../../../libs/mintplayer-ng-bootstrap/multiselect/src/directives/header-template/header-template.directive.ts","../../../../libs/mintplayer-ng-bootstrap/multiselect/src/directives/footer-template/footer-template.directive.ts","../../../../libs/mintplayer-ng-bootstrap/multiselect/src/directives/button-template/button-template.directive.ts","../../../../libs/mintplayer-ng-bootstrap/multiselect/src/directives/item-template/item-template.directive.ts","../../../../libs/mintplayer-ng-bootstrap/multiselect/mintplayer-ng-bootstrap-multiselect.ts"],"sourcesContent":["import { Component, computed, model, signal, TemplateRef, viewChild, ChangeDetectionStrategy } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { BsHasOverlayComponent } from '@mintplayer/ng-bootstrap/has-overlay';\nimport { BsDropdownDirective, BsDropdownToggleDirective, BsDropdownMenuDirective } from '@mintplayer/ng-bootstrap/dropdown';\nimport { BsToggleButtonComponent } from '@mintplayer/ng-bootstrap/toggle-button';\nimport { BsButtonTypeDirective } from '@mintplayer/ng-bootstrap/button-type';\nimport { Color } from '@mintplayer/ng-bootstrap';\n\n@Component({\n selector: 'bs-multiselect',\n templateUrl: './multiselect.component.html',\n styleUrls: ['./multiselect.component.scss'],\n imports: [NgTemplateOutlet, FormsModule, BsHasOverlayComponent, BsDropdownDirective, BsDropdownToggleDirective, BsDropdownMenuDirective, BsToggleButtonComponent, BsButtonTypeDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BsMultiselectComponent<T> {\n\n readonly headerTemplate = signal<TemplateRef<any> | undefined>(undefined);\n readonly footerTemplate = signal<TemplateRef<any> | undefined>(undefined);\n readonly buttonTemplate = signal<TemplateRef<any> | undefined>(undefined);\n readonly itemTemplate = signal<TemplateRef<any> | undefined>(undefined);\n readonly colors = Color;\n\n readonly items = model<T[]>([]);\n readonly selectedItems = model<T[]>([]);\n readonly defaultButtonTemplate = viewChild.required<TemplateRef<any>>('defaultButtonTemplate');\n readonly defaultItemTemplate = viewChild.required<TemplateRef<any>>('defaultItemTemplate');\n\n readonly resolvedButtonTemplate = computed(() => this.buttonTemplate() ?? this.defaultButtonTemplate());\n readonly resolvedItemTemplate = computed(() => this.itemTemplate() ?? this.defaultItemTemplate());\n\n itemChange(item: T, value: boolean | null) {\n if (value) {\n this.selectedItems.update(v => [...v, item]);\n } else {\n this.selectedItems.update(v => v.filter(i => i !== item));\n }\n }\n\n}\n","<bs-has-overlay></bs-has-overlay>\n<div bsDropdown [hasBackdrop]=\"true\" [closeOnClickOutside]=\"true\">\n <button type=\"button\" bsDropdownToggle [color]=\"colors.primary\">\n <ng-container *ngTemplateOutlet=\"resolvedButtonTemplate(); context: { $implicit: selectedItems().length }\"></ng-container>\n </button>\n <div *bsDropdownMenu class=\"bg-white mw-250px p-3 border rounded shadow\">\n <ng-container *ngTemplateOutlet=\"headerTemplate()\"></ng-container>\n @if (headerTemplate()) {\n <hr class=\"my-2\">\n }\n @for (item of items(); track item) {\n <bs-toggle-button [ngModel]=\"selectedItems().indexOf(item) > -1\" (ngModelChange)=\"itemChange(item, $event)\" class=\"d-block\"><ng-container *ngTemplateOutlet=\"resolvedItemTemplate(); context: { $implicit: item }\"></ng-container></bs-toggle-button>\n }\n @if (footerTemplate()) {\n <hr class=\"my-2\">\n }\n <ng-container *ngTemplateOutlet=\"footerTemplate()\"></ng-container>\n </div>\n</div>\n<ng-template #defaultButtonTemplate let-count>\n {{ count }} selected\n</ng-template>\n<ng-template #defaultItemTemplate let-item>{{ item }}</ng-template>\n","import { Directive, inject, TemplateRef } from '@angular/core';\nimport { BsMultiselectComponent } from '../../component/multiselect.component';\n\n@Directive({\n selector: '[bsHeaderTemplate]',\n})\nexport class BsHeaderTemplateDirective<T> {\n\n constructor() {\n const template = inject(TemplateRef);\n const multiselect = inject<BsMultiselectComponent<T>>(BsMultiselectComponent);\n multiselect.headerTemplate.set(template);\n }\n\n}\n","import { Directive, inject, TemplateRef } from '@angular/core';\nimport { BsMultiselectComponent } from '../../component/multiselect.component';\n\n@Directive({\n selector: '[bsFooterTemplate]',\n})\nexport class BsFooterTemplateDirective<T> {\n\n constructor() {\n const template = inject(TemplateRef);\n const multiselect = inject<BsMultiselectComponent<T>>(BsMultiselectComponent);\n multiselect.footerTemplate.set(template);\n }\n\n}\n","import { Directive, inject, TemplateRef } from '@angular/core';\nimport { BsMultiselectComponent } from '../../component/multiselect.component';\n\n@Directive({\n selector: '[bsButtonTemplate]',\n})\nexport class BsButtonTemplateDirective<T> {\n\n constructor() {\n const template = inject(TemplateRef);\n const multiselect = inject<BsMultiselectComponent<T>>(BsMultiselectComponent);\n multiselect.buttonTemplate.set(template);\n }\n\n public static ngTemplateContextGuard<TData>(\n dir: BsButtonTemplateDirective<TData>,\n ctx: any\n ): ctx is BsRButtonTemplateContext {\n return true;\n }\n\n}\n\nexport class BsRButtonTemplateContext {\n public $implicit: number = null!;\n}\n","import { Directive, effect, inject, input, TemplateRef } from '@angular/core';\nimport { BsMultiselectComponent } from '../../component/multiselect.component';\n\n@Directive({\n selector: '[bsItemTemplate]',\n})\nexport class BsItemTemplateDirective<T> {\n private multiselect = inject<BsMultiselectComponent<T>>(BsMultiselectComponent);\n\n constructor() {\n const template = inject(TemplateRef);\n this.multiselect.itemTemplate.set(template);\n\n effect(() => {\n const value = this.bsItemTemplateOf();\n if (value) {\n this.multiselect.items.set(value);\n }\n });\n }\n\n public static ngTemplateContextGuard<TData>(\n dir: BsItemTemplateDirective<TData>,\n ctx: any\n ): ctx is BsItemTemplateContext<Exclude<TData, false | 0 | '' | null | undefined>> {\n return true;\n }\n\n /** Pass the items array — forwards to BsMultiselectComponent.items */\n readonly bsItemTemplateOf = input<T[] | undefined>(undefined);\n}\n\nexport class BsItemTemplateContext<T> {\n public $implicit: T = null!;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -31,47 +31,97 @@ class BsPaginationComponent {
31
31
  return Math.min(numberOfBoxes - 2, pageNumbers.length);
32
32
  }
33
33
  }, ...(ngDevMode ? [{ debugName: "visibleNumberOfNumberBoxes" }] : []));
34
- /** Indicates whether there are too many numbers to the left-hand side of the current page. */
35
- this.isLeftOverflow = computed(() => {
36
- const pageNumbers = this.pageNumbers();
37
- const selectedPageNumber = this.selectedPageNumber();
38
- const visibleNumberOfNumberBoxes = this.visibleNumberOfNumberBoxes();
39
- const index = pageNumbers.indexOf(selectedPageNumber);
40
- const middle = Math.floor(visibleNumberOfNumberBoxes / 2);
41
- return index > middle;
42
- }, ...(ngDevMode ? [{ debugName: "isLeftOverflow" }] : []));
43
- /** Indicates whether there are too many numbers to the right-hand side of the current page. */
44
- this.isRightOverflow = computed(() => {
45
- const pageNumbers = this.pageNumbers();
46
- const selectedPageNumber = this.selectedPageNumber();
47
- const visibleNumberOfNumberBoxes = this.visibleNumberOfNumberBoxes();
48
- const index = pageNumbers.indexOf(selectedPageNumber);
49
- const middle = Math.floor(visibleNumberOfNumberBoxes / 2);
50
- return (pageNumbers.length - index) < middle;
51
- }, ...(ngDevMode ? [{ debugName: "isRightOverflow" }] : []));
52
- /** Page numbers to be displayed to the user. */
34
+ /** Page numbers to be displayed to the user, with ellipsis entries where pages are omitted. */
53
35
  this.shownPageNumbers = computed(() => {
54
36
  const pageNumbers = this.pageNumbers();
55
37
  const selectedPageNumber = this.selectedPageNumber();
56
- const visibleNumberOfNumberBoxes = this.visibleNumberOfNumberBoxes();
57
- let startIndex = 0;
58
- const half = Math.round((visibleNumberOfNumberBoxes - 1) / 2);
59
- if (pageNumbers.indexOf(selectedPageNumber) < half) {
60
- startIndex = 0;
38
+ const budget = this.visibleNumberOfNumberBoxes();
39
+ // No truncation needed
40
+ if (budget <= 0 || budget >= pageNumbers.length) {
41
+ return pageNumbers.map((p) => ({
42
+ page: p,
43
+ selected: p === selectedPageNumber,
44
+ }));
61
45
  }
62
- else if (pageNumbers.indexOf(selectedPageNumber) >=
63
- pageNumbers.length - half) {
64
- startIndex = pageNumbers.length - visibleNumberOfNumberBoxes;
46
+ const selectedIndex = Math.max(0, Math.min(pageNumbers.indexOf(selectedPageNumber), pageNumbers.length - 1));
47
+ const lastIndex = pageNumbers.length - 1;
48
+ // Centers a window of the given size on selectedIndex, clamped to valid range
49
+ const calcWindow = (size) => {
50
+ const half = Math.floor((size - 1) / 2);
51
+ let ws = selectedIndex - half;
52
+ let we = ws + size - 1;
53
+ if (ws < 0) {
54
+ we = Math.min(lastIndex, we - ws);
55
+ ws = 0;
56
+ }
57
+ if (we > lastIndex) {
58
+ ws = Math.max(0, ws - (we - lastIndex));
59
+ we = lastIndex;
60
+ }
61
+ return [ws, we];
62
+ };
63
+ // For small budgets (< 5), just show a centered window — not enough room for anchors + ellipsis
64
+ if (budget < 5) {
65
+ const [ws, we] = calcWindow(budget);
66
+ return Array.from({ length: we - ws + 1 }, (_, i) => ({
67
+ page: pageNumbers[ws + i],
68
+ selected: pageNumbers[ws + i] === selectedPageNumber,
69
+ }));
65
70
  }
66
- else {
67
- startIndex = pageNumbers.indexOf(selectedPageNumber) - half;
71
+ // For budget >= 5: reserve slots for first/last anchors and ellipsis, then fill the inner window.
72
+ // Overhead per side: 0 (window reaches edge), 1 (window is 1 away from edge), or 2 (anchor + ellipsis/bridge).
73
+ // Iterate until stable — converges in 2–4 iterations.
74
+ let leftOverhead = 2;
75
+ let rightOverhead = 2;
76
+ let windowStart = 0;
77
+ let windowEnd = 0;
78
+ for (let iteration = 0; iteration < 4; iteration++) {
79
+ const innerBudget = Math.max(1, budget - leftOverhead - rightOverhead);
80
+ [windowStart, windowEnd] = calcWindow(innerBudget);
81
+ const newLeftOverhead = windowStart === 0 ? 0 : windowStart === 1 ? 1 : 2;
82
+ const newRightOverhead = windowEnd === lastIndex ? 0 : windowEnd === lastIndex - 1 ? 1 : 2;
83
+ if (newLeftOverhead === leftOverhead && newRightOverhead === rightOverhead)
84
+ break;
85
+ leftOverhead = newLeftOverhead;
86
+ rightOverhead = newRightOverhead;
87
+ }
88
+ // Build result
89
+ const result = [];
90
+ const pushPage = (index) => {
91
+ result.push({
92
+ page: pageNumbers[index],
93
+ selected: pageNumbers[index] === selectedPageNumber,
94
+ });
95
+ };
96
+ // Left anchor or bridge
97
+ if (windowStart >= 3) {
98
+ pushPage(0);
99
+ result.push({ page: '...', selected: false });
100
+ }
101
+ else if (windowStart === 2) {
102
+ pushPage(0);
103
+ pushPage(1);
68
104
  }
69
- return [...Array(visibleNumberOfNumberBoxes).keys()]
70
- .map((p) => p + startIndex)
71
- .map((p) => ({
72
- page: pageNumbers[p],
73
- selected: pageNumbers[p] === selectedPageNumber,
74
- }));
105
+ else if (windowStart === 1) {
106
+ pushPage(0);
107
+ }
108
+ // Inner window
109
+ for (let i = windowStart; i <= windowEnd; i++) {
110
+ pushPage(i);
111
+ }
112
+ // Right bridge or anchor
113
+ if (windowEnd <= lastIndex - 3) {
114
+ result.push({ page: '...', selected: false });
115
+ pushPage(lastIndex);
116
+ }
117
+ else if (windowEnd === lastIndex - 2) {
118
+ pushPage(lastIndex - 1);
119
+ pushPage(lastIndex);
120
+ }
121
+ else if (windowEnd === lastIndex - 1) {
122
+ pushPage(lastIndex);
123
+ }
124
+ return result;
75
125
  }, ...(ngDevMode ? [{ debugName: "shownPageNumbers" }] : []));
76
126
  /** Indicates if first value is selected. */
77
127
  this.isFirstPage = computed(() => {
@@ -87,7 +137,9 @@ class BsPaginationComponent {
87
137
  }, ...(ngDevMode ? [{ debugName: "isLastPage" }] : []));
88
138
  }
89
139
  onSelectPage(event, page) {
90
- this.selectedPageNumber.set(page);
140
+ if (typeof page === 'number') {
141
+ this.selectedPageNumber.set(page);
142
+ }
91
143
  return false;
92
144
  }
93
145
  onPrevious() {
@@ -119,11 +171,11 @@ class BsPaginationComponent {
119
171
  return false;
120
172
  }
121
173
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: BsPaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
122
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.6", type: BsPaginationComponent, isStandalone: true, selector: "bs-pagination", inputs: { pageNumbers: { classPropertyName: "pageNumbers", publicName: "pageNumbers", isSignal: true, isRequired: false, transformFunction: null }, selectedPageNumber: { classPropertyName: "selectedPageNumber", publicName: "selectedPageNumber", isSignal: true, isRequired: false, transformFunction: null }, numberOfBoxes: { classPropertyName: "numberOfBoxes", publicName: "numberOfBoxes", isSignal: true, isRequired: false, transformFunction: null }, showArrows: { classPropertyName: "showArrows", publicName: "showArrows", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedPageNumber: "selectedPageNumberChange" }, ngImport: i0, template: "<ul class=\"pagination\">\n @if (showArrows()) {\n <li class=\"page-item\">\n <a class=\"page-link\" href=\"\" (click)=\"onPrevious()\" [class.disabled]=\"isFirstPage()\" aria-label=\"Previous\">\n <span aria-hidden=\"true\">&laquo;</span>\n <span class=\"visually-hidden\">Previous</span>\n </a>\n </li>\n }\n @for (pageNumber of shownPageNumbers(); track pageNumber.page) {\n <li class=\"page-item\">\n @if (pageNumber.page != '...') {\n <a class=\"page-link\" href=\"\" (click)=\"onSelectPage($event, pageNumber.page)\" [class.active]=\"pageNumber.selected\">\n {{ pageNumber.page }}\n @if (pageNumber.selected) {\n <span class=\"visually-hidden\">(current)</span>\n }\n </a>\n }\n </li>\n }\n @if (showArrows()) {\n <li class=\"page-item\">\n <a class=\"page-link\" href=\"\" (click)=\"onNext()\" [class.disabled]=\"isLastPage()\" aria-label=\"Next\">\n <span aria-hidden=\"true\">&raquo;</span>\n <span class=\"visually-hidden\">Next</span>\n </a>\n </li>\n }\n</ul>\n", styles: [":host ::ng-deep .pagination{--bs-pagination-padding-x: .75rem;--bs-pagination-padding-y: .375rem;--bs-pagination-font-size: 1rem;--bs-pagination-color: var(--bs-link-color);--bs-pagination-bg: var(--bs-body-bg);--bs-pagination-border-width: var(--bs-border-width);--bs-pagination-border-color: var(--bs-border-color);--bs-pagination-border-radius: var(--bs-border-radius);--bs-pagination-hover-color: var(--bs-link-hover-color);--bs-pagination-hover-bg: var(--bs-tertiary-bg);--bs-pagination-hover-border-color: var(--bs-border-color);--bs-pagination-focus-color: var(--bs-link-hover-color);--bs-pagination-focus-bg: var(--bs-secondary-bg);--bs-pagination-focus-box-shadow: 0 0 0 .25rem rgba(13, 110, 253, .25);--bs-pagination-active-color: #fff;--bs-pagination-active-bg: #0d6efd;--bs-pagination-active-border-color: #0d6efd;--bs-pagination-disabled-color: var(--bs-secondary-color);--bs-pagination-disabled-bg: var(--bs-secondary-bg);--bs-pagination-disabled-border-color: var(--bs-border-color);display:flex;padding-left:0;list-style:none}:host ::ng-deep .page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){:host ::ng-deep .page-link{transition:none}}:host ::ng-deep .page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}:host ::ng-deep .page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}:host ::ng-deep .page-link.active,.active>:host ::ng-deep .page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}:host ::ng-deep .page-link.disabled,.disabled>:host ::ng-deep .page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}:host ::ng-deep .page-item:not(:first-child) .page-link{margin-left:calc(-1 * var(--bs-border-width))}:host ::ng-deep .page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}:host ::ng-deep .page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}:host ::ng-deep .pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: .75rem;--bs-pagination-font-size: 1.25rem;--bs-pagination-border-radius: var(--bs-border-radius-lg)}:host ::ng-deep .pagination-sm{--bs-pagination-padding-x: .5rem;--bs-pagination-padding-y: .25rem;--bs-pagination-font-size: .875rem;--bs-pagination-border-radius: var(--bs-border-radius-sm)}:host{display:inline-block}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
174
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.6", type: BsPaginationComponent, isStandalone: true, selector: "bs-pagination", inputs: { pageNumbers: { classPropertyName: "pageNumbers", publicName: "pageNumbers", isSignal: true, isRequired: false, transformFunction: null }, selectedPageNumber: { classPropertyName: "selectedPageNumber", publicName: "selectedPageNumber", isSignal: true, isRequired: false, transformFunction: null }, numberOfBoxes: { classPropertyName: "numberOfBoxes", publicName: "numberOfBoxes", isSignal: true, isRequired: false, transformFunction: null }, showArrows: { classPropertyName: "showArrows", publicName: "showArrows", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedPageNumber: "selectedPageNumberChange" }, ngImport: i0, template: "<ul class=\"pagination\">\n @if (showArrows()) {\n <li class=\"page-item\">\n <a class=\"page-link\" href=\"\" (click)=\"onPrevious()\" [class.disabled]=\"isFirstPage()\" aria-label=\"Previous\">\n <span aria-hidden=\"true\">&laquo;</span>\n <span class=\"visually-hidden\">Previous</span>\n </a>\n </li>\n }\n @for (pageNumber of shownPageNumbers(); track $index) {\n <li class=\"page-item\">\n @if (pageNumber.page === '...') {\n <a class=\"page-link disabled\" aria-disabled=\"true\">\n <span aria-hidden=\"true\">&hellip;</span>\n <span class=\"visually-hidden\">More pages</span>\n </a>\n } @else {\n <a class=\"page-link\" href=\"\" (click)=\"onSelectPage($event, pageNumber.page)\" [class.active]=\"pageNumber.selected\">\n {{ pageNumber.page }}\n @if (pageNumber.selected) {\n <span class=\"visually-hidden\">(current)</span>\n }\n </a>\n }\n </li>\n }\n @if (showArrows()) {\n <li class=\"page-item\">\n <a class=\"page-link\" href=\"\" (click)=\"onNext()\" [class.disabled]=\"isLastPage()\" aria-label=\"Next\">\n <span aria-hidden=\"true\">&raquo;</span>\n <span class=\"visually-hidden\">Next</span>\n </a>\n </li>\n }\n</ul>\n", styles: [":host ::ng-deep .pagination{--bs-pagination-padding-x: .75rem;--bs-pagination-padding-y: .375rem;--bs-pagination-font-size: 1rem;--bs-pagination-color: var(--bs-link-color);--bs-pagination-bg: var(--bs-body-bg);--bs-pagination-border-width: var(--bs-border-width);--bs-pagination-border-color: var(--bs-border-color);--bs-pagination-border-radius: var(--bs-border-radius);--bs-pagination-hover-color: var(--bs-link-hover-color);--bs-pagination-hover-bg: var(--bs-tertiary-bg);--bs-pagination-hover-border-color: var(--bs-border-color);--bs-pagination-focus-color: var(--bs-link-hover-color);--bs-pagination-focus-bg: var(--bs-secondary-bg);--bs-pagination-focus-box-shadow: 0 0 0 .25rem rgba(13, 110, 253, .25);--bs-pagination-active-color: #fff;--bs-pagination-active-bg: #0d6efd;--bs-pagination-active-border-color: #0d6efd;--bs-pagination-disabled-color: var(--bs-secondary-color);--bs-pagination-disabled-bg: var(--bs-secondary-bg);--bs-pagination-disabled-border-color: var(--bs-border-color);display:flex;padding-left:0;list-style:none}:host ::ng-deep .page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){:host ::ng-deep .page-link{transition:none}}:host ::ng-deep .page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}:host ::ng-deep .page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}:host ::ng-deep .page-link.active,.active>:host ::ng-deep .page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}:host ::ng-deep .page-link.disabled,.disabled>:host ::ng-deep .page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}:host ::ng-deep .page-item:not(:first-child) .page-link{margin-left:calc(-1 * var(--bs-border-width))}:host ::ng-deep .page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}:host ::ng-deep .page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}:host ::ng-deep .pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: .75rem;--bs-pagination-font-size: 1.25rem;--bs-pagination-border-radius: var(--bs-border-radius-lg)}:host ::ng-deep .pagination-sm{--bs-pagination-padding-x: .5rem;--bs-pagination-padding-y: .25rem;--bs-pagination-font-size: .875rem;--bs-pagination-border-radius: var(--bs-border-radius-sm)}:host{display:inline-block}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
123
175
  }
124
176
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: BsPaginationComponent, decorators: [{
125
177
  type: Component,
126
- args: [{ selector: 'bs-pagination', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ul class=\"pagination\">\n @if (showArrows()) {\n <li class=\"page-item\">\n <a class=\"page-link\" href=\"\" (click)=\"onPrevious()\" [class.disabled]=\"isFirstPage()\" aria-label=\"Previous\">\n <span aria-hidden=\"true\">&laquo;</span>\n <span class=\"visually-hidden\">Previous</span>\n </a>\n </li>\n }\n @for (pageNumber of shownPageNumbers(); track pageNumber.page) {\n <li class=\"page-item\">\n @if (pageNumber.page != '...') {\n <a class=\"page-link\" href=\"\" (click)=\"onSelectPage($event, pageNumber.page)\" [class.active]=\"pageNumber.selected\">\n {{ pageNumber.page }}\n @if (pageNumber.selected) {\n <span class=\"visually-hidden\">(current)</span>\n }\n </a>\n }\n </li>\n }\n @if (showArrows()) {\n <li class=\"page-item\">\n <a class=\"page-link\" href=\"\" (click)=\"onNext()\" [class.disabled]=\"isLastPage()\" aria-label=\"Next\">\n <span aria-hidden=\"true\">&raquo;</span>\n <span class=\"visually-hidden\">Next</span>\n </a>\n </li>\n }\n</ul>\n", styles: [":host ::ng-deep .pagination{--bs-pagination-padding-x: .75rem;--bs-pagination-padding-y: .375rem;--bs-pagination-font-size: 1rem;--bs-pagination-color: var(--bs-link-color);--bs-pagination-bg: var(--bs-body-bg);--bs-pagination-border-width: var(--bs-border-width);--bs-pagination-border-color: var(--bs-border-color);--bs-pagination-border-radius: var(--bs-border-radius);--bs-pagination-hover-color: var(--bs-link-hover-color);--bs-pagination-hover-bg: var(--bs-tertiary-bg);--bs-pagination-hover-border-color: var(--bs-border-color);--bs-pagination-focus-color: var(--bs-link-hover-color);--bs-pagination-focus-bg: var(--bs-secondary-bg);--bs-pagination-focus-box-shadow: 0 0 0 .25rem rgba(13, 110, 253, .25);--bs-pagination-active-color: #fff;--bs-pagination-active-bg: #0d6efd;--bs-pagination-active-border-color: #0d6efd;--bs-pagination-disabled-color: var(--bs-secondary-color);--bs-pagination-disabled-bg: var(--bs-secondary-bg);--bs-pagination-disabled-border-color: var(--bs-border-color);display:flex;padding-left:0;list-style:none}:host ::ng-deep .page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){:host ::ng-deep .page-link{transition:none}}:host ::ng-deep .page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}:host ::ng-deep .page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}:host ::ng-deep .page-link.active,.active>:host ::ng-deep .page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}:host ::ng-deep .page-link.disabled,.disabled>:host ::ng-deep .page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}:host ::ng-deep .page-item:not(:first-child) .page-link{margin-left:calc(-1 * var(--bs-border-width))}:host ::ng-deep .page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}:host ::ng-deep .page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}:host ::ng-deep .pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: .75rem;--bs-pagination-font-size: 1.25rem;--bs-pagination-border-radius: var(--bs-border-radius-lg)}:host ::ng-deep .pagination-sm{--bs-pagination-padding-x: .5rem;--bs-pagination-padding-y: .25rem;--bs-pagination-font-size: .875rem;--bs-pagination-border-radius: var(--bs-border-radius-sm)}:host{display:inline-block}\n"] }]
178
+ args: [{ selector: 'bs-pagination', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ul class=\"pagination\">\n @if (showArrows()) {\n <li class=\"page-item\">\n <a class=\"page-link\" href=\"\" (click)=\"onPrevious()\" [class.disabled]=\"isFirstPage()\" aria-label=\"Previous\">\n <span aria-hidden=\"true\">&laquo;</span>\n <span class=\"visually-hidden\">Previous</span>\n </a>\n </li>\n }\n @for (pageNumber of shownPageNumbers(); track $index) {\n <li class=\"page-item\">\n @if (pageNumber.page === '...') {\n <a class=\"page-link disabled\" aria-disabled=\"true\">\n <span aria-hidden=\"true\">&hellip;</span>\n <span class=\"visually-hidden\">More pages</span>\n </a>\n } @else {\n <a class=\"page-link\" href=\"\" (click)=\"onSelectPage($event, pageNumber.page)\" [class.active]=\"pageNumber.selected\">\n {{ pageNumber.page }}\n @if (pageNumber.selected) {\n <span class=\"visually-hidden\">(current)</span>\n }\n </a>\n }\n </li>\n }\n @if (showArrows()) {\n <li class=\"page-item\">\n <a class=\"page-link\" href=\"\" (click)=\"onNext()\" [class.disabled]=\"isLastPage()\" aria-label=\"Next\">\n <span aria-hidden=\"true\">&raquo;</span>\n <span class=\"visually-hidden\">Next</span>\n </a>\n </li>\n }\n</ul>\n", styles: [":host ::ng-deep .pagination{--bs-pagination-padding-x: .75rem;--bs-pagination-padding-y: .375rem;--bs-pagination-font-size: 1rem;--bs-pagination-color: var(--bs-link-color);--bs-pagination-bg: var(--bs-body-bg);--bs-pagination-border-width: var(--bs-border-width);--bs-pagination-border-color: var(--bs-border-color);--bs-pagination-border-radius: var(--bs-border-radius);--bs-pagination-hover-color: var(--bs-link-hover-color);--bs-pagination-hover-bg: var(--bs-tertiary-bg);--bs-pagination-hover-border-color: var(--bs-border-color);--bs-pagination-focus-color: var(--bs-link-hover-color);--bs-pagination-focus-bg: var(--bs-secondary-bg);--bs-pagination-focus-box-shadow: 0 0 0 .25rem rgba(13, 110, 253, .25);--bs-pagination-active-color: #fff;--bs-pagination-active-bg: #0d6efd;--bs-pagination-active-border-color: #0d6efd;--bs-pagination-disabled-color: var(--bs-secondary-color);--bs-pagination-disabled-bg: var(--bs-secondary-bg);--bs-pagination-disabled-border-color: var(--bs-border-color);display:flex;padding-left:0;list-style:none}:host ::ng-deep .page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){:host ::ng-deep .page-link{transition:none}}:host ::ng-deep .page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}:host ::ng-deep .page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}:host ::ng-deep .page-link.active,.active>:host ::ng-deep .page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}:host ::ng-deep .page-link.disabled,.disabled>:host ::ng-deep .page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}:host ::ng-deep .page-item:not(:first-child) .page-link{margin-left:calc(-1 * var(--bs-border-width))}:host ::ng-deep .page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}:host ::ng-deep .page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}:host ::ng-deep .pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: .75rem;--bs-pagination-font-size: 1.25rem;--bs-pagination-border-radius: var(--bs-border-radius-lg)}:host ::ng-deep .pagination-sm{--bs-pagination-padding-x: .5rem;--bs-pagination-padding-y: .25rem;--bs-pagination-font-size: .875rem;--bs-pagination-border-radius: var(--bs-border-radius-sm)}:host{display:inline-block}\n"] }]
127
179
  }], propDecorators: { pageNumbers: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageNumbers", required: false }] }], selectedPageNumber: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedPageNumber", required: false }] }, { type: i0.Output, args: ["selectedPageNumberChange"] }], numberOfBoxes: [{ type: i0.Input, args: [{ isSignal: true, alias: "numberOfBoxes", required: false }] }], showArrows: [{ type: i0.Input, args: [{ isSignal: true, alias: "showArrows", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }] } });
128
180
 
129
181
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"mintplayer-ng-bootstrap-pagination.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/pagination/src/component/pagination/pagination.component.ts","../../../../libs/mintplayer-ng-bootstrap/pagination/src/component/pagination/pagination.component.html","../../../../libs/mintplayer-ng-bootstrap/pagination/mintplayer-ng-bootstrap-pagination.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, input, model } from '@angular/core';\nimport { Size } from '@mintplayer/ng-bootstrap';\nimport { PageWithSelection } from '../../interfaces/page-with-selection';\n\n@Component({\n selector: 'bs-pagination',\n templateUrl: './pagination.component.html',\n styleUrls: ['./pagination.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BsPaginationComponent {\n /** All page numbers. */\n pageNumbers = input<number[]>([]);\n /** Selected number. */\n selectedPageNumber = model<number>(1);\n /** Number of boxes. */\n numberOfBoxes = input<number>(0);\n /** Display previous/next arrows. */\n showArrows = input<boolean>(true);\n /** Page number size. */\n size = input<Size>('medium');\n\n /** The number of boxes (excluding arrows) that's being shown on the pagination component. */\n visibleNumberOfNumberBoxes = computed(() => {\n const numberOfBoxes = this.numberOfBoxes();\n const pageNumbers = this.pageNumbers();\n const showArrows = this.showArrows();\n if (numberOfBoxes <= 0) {\n return pageNumbers.length;\n } else if (!showArrows) {\n return Math.min(numberOfBoxes, pageNumbers.length);\n } else if (numberOfBoxes <= 2) {\n return Math.min(1, pageNumbers.length);\n } else {\n return Math.min(numberOfBoxes - 2, pageNumbers.length);\n }\n });\n\n /** Indicates whether there are too many numbers to the left-hand side of the current page. */\n isLeftOverflow = computed(() => {\n const pageNumbers = this.pageNumbers();\n const selectedPageNumber = this.selectedPageNumber();\n const visibleNumberOfNumberBoxes = this.visibleNumberOfNumberBoxes();\n const index = pageNumbers.indexOf(selectedPageNumber);\n const middle = Math.floor(visibleNumberOfNumberBoxes / 2);\n return index > middle;\n });\n\n /** Indicates whether there are too many numbers to the right-hand side of the current page. */\n isRightOverflow = computed(() => {\n const pageNumbers = this.pageNumbers();\n const selectedPageNumber = this.selectedPageNumber();\n const visibleNumberOfNumberBoxes = this.visibleNumberOfNumberBoxes();\n const index = pageNumbers.indexOf(selectedPageNumber);\n const middle = Math.floor(visibleNumberOfNumberBoxes / 2);\n return (pageNumbers.length - index) < middle;\n });\n\n /** Page numbers to be displayed to the user. */\n shownPageNumbers = computed<PageWithSelection[]>(() => {\n const pageNumbers = this.pageNumbers();\n const selectedPageNumber = this.selectedPageNumber();\n const visibleNumberOfNumberBoxes = this.visibleNumberOfNumberBoxes();\n\n let startIndex = 0;\n const half = Math.round((visibleNumberOfNumberBoxes - 1) / 2);\n if (pageNumbers.indexOf(selectedPageNumber) < half) {\n startIndex = 0;\n } else if (\n pageNumbers.indexOf(selectedPageNumber) >=\n pageNumbers.length - half\n ) {\n startIndex = pageNumbers.length - visibleNumberOfNumberBoxes;\n } else {\n startIndex = pageNumbers.indexOf(selectedPageNumber) - half;\n }\n\n return [...Array(visibleNumberOfNumberBoxes).keys()]\n .map((p) => p + startIndex)\n .map((p) => <PageWithSelection>{\n page: pageNumbers[p],\n selected: pageNumbers[p] === selectedPageNumber,\n });\n });\n\n /** Indicates if first value is selected. */\n isFirstPage = computed(() => {\n const pageNumbers = this.pageNumbers();\n const selectedPageNumber = this.selectedPageNumber();\n return pageNumbers.indexOf(selectedPageNumber) === 0;\n });\n\n /** Indicates if last value is selected. */\n isLastPage = computed(() => {\n const pageNumbers = this.pageNumbers();\n const selectedPageNumber = this.selectedPageNumber();\n return pageNumbers.indexOf(selectedPageNumber) === pageNumbers.length - 1;\n });\n\n onSelectPage(event: MouseEvent, page: number) {\n this.selectedPageNumber.set(page);\n return false;\n }\n\n onPrevious() {\n const pageNumbers = this.pageNumbers();\n const selectedPageNumber = this.selectedPageNumber();\n const index = pageNumbers.indexOf(selectedPageNumber);\n if (index > 0) {\n const newValue = pageNumbers[index - 1];\n this.selectedPageNumber.set(newValue);\n } else {\n this.selectedPageNumber.set(pageNumbers[0]);\n }\n return false;\n }\n\n onNext() {\n const pageNumbers = this.pageNumbers();\n const selectedPageNumber = this.selectedPageNumber();\n const index = pageNumbers.indexOf(selectedPageNumber);\n if (index < 0) {\n this.selectedPageNumber.set(pageNumbers[pageNumbers.length - 1]);\n } else if (index < pageNumbers.length - 1) {\n this.selectedPageNumber.set(pageNumbers[index + 1]);\n } else {\n this.selectedPageNumber.set(pageNumbers[pageNumbers.length - 1]);\n }\n return false;\n }\n}\n","<ul class=\"pagination\">\n @if (showArrows()) {\n <li class=\"page-item\">\n <a class=\"page-link\" href=\"\" (click)=\"onPrevious()\" [class.disabled]=\"isFirstPage()\" aria-label=\"Previous\">\n <span aria-hidden=\"true\">&laquo;</span>\n <span class=\"visually-hidden\">Previous</span>\n </a>\n </li>\n }\n @for (pageNumber of shownPageNumbers(); track pageNumber.page) {\n <li class=\"page-item\">\n @if (pageNumber.page != '...') {\n <a class=\"page-link\" href=\"\" (click)=\"onSelectPage($event, pageNumber.page)\" [class.active]=\"pageNumber.selected\">\n {{ pageNumber.page }}\n @if (pageNumber.selected) {\n <span class=\"visually-hidden\">(current)</span>\n }\n </a>\n }\n </li>\n }\n @if (showArrows()) {\n <li class=\"page-item\">\n <a class=\"page-link\" href=\"\" (click)=\"onNext()\" [class.disabled]=\"isLastPage()\" aria-label=\"Next\">\n <span aria-hidden=\"true\">&raquo;</span>\n <span class=\"visually-hidden\">Next</span>\n </a>\n </li>\n }\n</ul>\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-pagination.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/pagination/src/component/pagination/pagination.component.ts","../../../../libs/mintplayer-ng-bootstrap/pagination/src/component/pagination/pagination.component.html","../../../../libs/mintplayer-ng-bootstrap/pagination/mintplayer-ng-bootstrap-pagination.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, input, model } from '@angular/core';\nimport { Size } from '@mintplayer/ng-bootstrap';\nimport { PageWithSelection } from '../../interfaces/page-with-selection';\nimport { PageNumberType } from '../../types/page-number.type';\n\n@Component({\n selector: 'bs-pagination',\n templateUrl: './pagination.component.html',\n styleUrls: ['./pagination.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BsPaginationComponent {\n /** All page numbers. */\n pageNumbers = input<number[]>([]);\n /** Selected number. */\n selectedPageNumber = model<number>(1);\n /** Number of boxes. */\n numberOfBoxes = input<number>(0);\n /** Display previous/next arrows. */\n showArrows = input<boolean>(true);\n /** Page number size. */\n size = input<Size>('medium');\n\n /** The number of boxes (excluding arrows) that's being shown on the pagination component. */\n visibleNumberOfNumberBoxes = computed(() => {\n const numberOfBoxes = this.numberOfBoxes();\n const pageNumbers = this.pageNumbers();\n const showArrows = this.showArrows();\n if (numberOfBoxes <= 0) {\n return pageNumbers.length;\n } else if (!showArrows) {\n return Math.min(numberOfBoxes, pageNumbers.length);\n } else if (numberOfBoxes <= 2) {\n return Math.min(1, pageNumbers.length);\n } else {\n return Math.min(numberOfBoxes - 2, pageNumbers.length);\n }\n });\n\n /** Page numbers to be displayed to the user, with ellipsis entries where pages are omitted. */\n shownPageNumbers = computed<PageWithSelection[]>(() => {\n const pageNumbers = this.pageNumbers();\n const selectedPageNumber = this.selectedPageNumber();\n const budget = this.visibleNumberOfNumberBoxes();\n\n // No truncation needed\n if (budget <= 0 || budget >= pageNumbers.length) {\n return pageNumbers.map((p) => <PageWithSelection>{\n page: p,\n selected: p === selectedPageNumber,\n });\n }\n\n const selectedIndex = Math.max(0, Math.min(\n pageNumbers.indexOf(selectedPageNumber),\n pageNumbers.length - 1\n ));\n const lastIndex = pageNumbers.length - 1;\n\n // Centers a window of the given size on selectedIndex, clamped to valid range\n const calcWindow = (size: number): [number, number] => {\n const half = Math.floor((size - 1) / 2);\n let ws = selectedIndex - half;\n let we = ws + size - 1;\n if (ws < 0) { we = Math.min(lastIndex, we - ws); ws = 0; }\n if (we > lastIndex) { ws = Math.max(0, ws - (we - lastIndex)); we = lastIndex; }\n return [ws, we];\n };\n\n // For small budgets (< 5), just show a centered window — not enough room for anchors + ellipsis\n if (budget < 5) {\n const [ws, we] = calcWindow(budget);\n return Array.from({ length: we - ws + 1 }, (_, i) => <PageWithSelection>{\n page: pageNumbers[ws + i],\n selected: pageNumbers[ws + i] === selectedPageNumber,\n });\n }\n\n // For budget >= 5: reserve slots for first/last anchors and ellipsis, then fill the inner window.\n // Overhead per side: 0 (window reaches edge), 1 (window is 1 away from edge), or 2 (anchor + ellipsis/bridge).\n // Iterate until stable — converges in 2–4 iterations.\n let leftOverhead = 2;\n let rightOverhead = 2;\n let windowStart = 0;\n let windowEnd = 0;\n\n for (let iteration = 0; iteration < 4; iteration++) {\n const innerBudget = Math.max(1, budget - leftOverhead - rightOverhead);\n [windowStart, windowEnd] = calcWindow(innerBudget);\n\n const newLeftOverhead = windowStart === 0 ? 0 : windowStart === 1 ? 1 : 2;\n const newRightOverhead = windowEnd === lastIndex ? 0 : windowEnd === lastIndex - 1 ? 1 : 2;\n\n if (newLeftOverhead === leftOverhead && newRightOverhead === rightOverhead) break;\n leftOverhead = newLeftOverhead;\n rightOverhead = newRightOverhead;\n }\n\n // Build result\n const result: PageWithSelection[] = [];\n const pushPage = (index: number) => {\n result.push(<PageWithSelection>{\n page: pageNumbers[index],\n selected: pageNumbers[index] === selectedPageNumber,\n });\n };\n\n // Left anchor or bridge\n if (windowStart >= 3) {\n pushPage(0);\n result.push({ page: '...', selected: false });\n } else if (windowStart === 2) {\n pushPage(0);\n pushPage(1);\n } else if (windowStart === 1) {\n pushPage(0);\n }\n\n // Inner window\n for (let i = windowStart; i <= windowEnd; i++) {\n pushPage(i);\n }\n\n // Right bridge or anchor\n if (windowEnd <= lastIndex - 3) {\n result.push({ page: '...', selected: false });\n pushPage(lastIndex);\n } else if (windowEnd === lastIndex - 2) {\n pushPage(lastIndex - 1);\n pushPage(lastIndex);\n } else if (windowEnd === lastIndex - 1) {\n pushPage(lastIndex);\n }\n\n return result;\n });\n\n /** Indicates if first value is selected. */\n isFirstPage = computed(() => {\n const pageNumbers = this.pageNumbers();\n const selectedPageNumber = this.selectedPageNumber();\n return pageNumbers.indexOf(selectedPageNumber) === 0;\n });\n\n /** Indicates if last value is selected. */\n isLastPage = computed(() => {\n const pageNumbers = this.pageNumbers();\n const selectedPageNumber = this.selectedPageNumber();\n return pageNumbers.indexOf(selectedPageNumber) === pageNumbers.length - 1;\n });\n\n onSelectPage(event: MouseEvent, page: PageNumberType) {\n if (typeof page === 'number') {\n this.selectedPageNumber.set(page);\n }\n return false;\n }\n\n onPrevious() {\n const pageNumbers = this.pageNumbers();\n const selectedPageNumber = this.selectedPageNumber();\n const index = pageNumbers.indexOf(selectedPageNumber);\n if (index > 0) {\n const newValue = pageNumbers[index - 1];\n this.selectedPageNumber.set(newValue);\n } else {\n this.selectedPageNumber.set(pageNumbers[0]);\n }\n return false;\n }\n\n onNext() {\n const pageNumbers = this.pageNumbers();\n const selectedPageNumber = this.selectedPageNumber();\n const index = pageNumbers.indexOf(selectedPageNumber);\n if (index < 0) {\n this.selectedPageNumber.set(pageNumbers[pageNumbers.length - 1]);\n } else if (index < pageNumbers.length - 1) {\n this.selectedPageNumber.set(pageNumbers[index + 1]);\n } else {\n this.selectedPageNumber.set(pageNumbers[pageNumbers.length - 1]);\n }\n return false;\n }\n}\n","<ul class=\"pagination\">\n @if (showArrows()) {\n <li class=\"page-item\">\n <a class=\"page-link\" href=\"\" (click)=\"onPrevious()\" [class.disabled]=\"isFirstPage()\" aria-label=\"Previous\">\n <span aria-hidden=\"true\">&laquo;</span>\n <span class=\"visually-hidden\">Previous</span>\n </a>\n </li>\n }\n @for (pageNumber of shownPageNumbers(); track $index) {\n <li class=\"page-item\">\n @if (pageNumber.page === '...') {\n <a class=\"page-link disabled\" aria-disabled=\"true\">\n <span aria-hidden=\"true\">&hellip;</span>\n <span class=\"visually-hidden\">More pages</span>\n </a>\n } @else {\n <a class=\"page-link\" href=\"\" (click)=\"onSelectPage($event, pageNumber.page)\" [class.active]=\"pageNumber.selected\">\n {{ pageNumber.page }}\n @if (pageNumber.selected) {\n <span class=\"visually-hidden\">(current)</span>\n }\n </a>\n }\n </li>\n }\n @if (showArrows()) {\n <li class=\"page-item\">\n <a class=\"page-link\" href=\"\" (click)=\"onNext()\" [class.disabled]=\"isLastPage()\" aria-label=\"Next\">\n <span aria-hidden=\"true\">&raquo;</span>\n <span class=\"visually-hidden\">Next</span>\n </a>\n </li>\n }\n</ul>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mintplayer/ng-bootstrap",
3
3
  "private": false,
4
- "version": "21.12.10",
4
+ "version": "21.12.12",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/MintPlayer/mintplayer-ng-bootstrap",
@@ -13,6 +13,7 @@ declare class DatatableSettings {
13
13
  values: number[];
14
14
  selected: number;
15
15
  };
16
+ pageNumberOfBoxes: number;
16
17
  toPagination(): PaginationRequest;
17
18
  }
18
19
 
@@ -21,17 +21,13 @@ declare class BsPaginationComponent {
21
21
  size: _angular_core.InputSignal<Size>;
22
22
  /** The number of boxes (excluding arrows) that's being shown on the pagination component. */
23
23
  visibleNumberOfNumberBoxes: _angular_core.Signal<number>;
24
- /** Indicates whether there are too many numbers to the left-hand side of the current page. */
25
- isLeftOverflow: _angular_core.Signal<boolean>;
26
- /** Indicates whether there are too many numbers to the right-hand side of the current page. */
27
- isRightOverflow: _angular_core.Signal<boolean>;
28
- /** Page numbers to be displayed to the user. */
24
+ /** Page numbers to be displayed to the user, with ellipsis entries where pages are omitted. */
29
25
  shownPageNumbers: _angular_core.Signal<PageWithSelection[]>;
30
26
  /** Indicates if first value is selected. */
31
27
  isFirstPage: _angular_core.Signal<boolean>;
32
28
  /** Indicates if last value is selected. */
33
29
  isLastPage: _angular_core.Signal<boolean>;
34
- onSelectPage(event: MouseEvent, page: number): boolean;
30
+ onSelectPage(event: MouseEvent, page: PageNumberType): boolean;
35
31
  onPrevious(): boolean;
36
32
  onNext(): boolean;
37
33
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsPaginationComponent, never>;