@mintplayer/ng-bootstrap 21.12.11 → 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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"}
@@ -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.11",
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>;