ngx-kit 6.1.0 → 6.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/angle-selector/README.md +34 -34
- package/box-shadow/README.md +33 -33
- package/color-picker/README.md +49 -49
- package/data-table/README.md +113 -113
- package/date-picker/README.md +69 -69
- package/dialog/README.md +92 -92
- package/drawer-menu/README.md +110 -62
- package/dropzone/README.md +422 -422
- package/fesm2022/ngx-kit-angle-selector.mjs +2 -2
- package/fesm2022/ngx-kit-angle-selector.mjs.map +1 -1
- package/fesm2022/ngx-kit-box-shadow.mjs +2 -2
- package/fesm2022/ngx-kit-box-shadow.mjs.map +1 -1
- package/fesm2022/ngx-kit-color-picker.mjs +4 -4
- package/fesm2022/ngx-kit-color-picker.mjs.map +1 -1
- package/fesm2022/ngx-kit-data-table.mjs +2 -2
- package/fesm2022/ngx-kit-data-table.mjs.map +1 -1
- package/fesm2022/ngx-kit-date-picker.mjs +1324 -200
- package/fesm2022/ngx-kit-date-picker.mjs.map +1 -1
- package/fesm2022/ngx-kit-dialog.mjs +2 -2
- package/fesm2022/ngx-kit-dialog.mjs.map +1 -1
- package/fesm2022/ngx-kit-drawer-menu.mjs +302 -140
- package/fesm2022/ngx-kit-drawer-menu.mjs.map +1 -1
- package/fesm2022/ngx-kit-dropzone.mjs +2 -2
- package/fesm2022/ngx-kit-dropzone.mjs.map +1 -1
- package/fesm2022/ngx-kit-form-field.mjs.map +1 -1
- package/fesm2022/ngx-kit-gallery.mjs +2 -2
- package/fesm2022/ngx-kit-gallery.mjs.map +1 -1
- package/fesm2022/ngx-kit-gradient-picker.mjs.map +1 -1
- package/fesm2022/ngx-kit-image-editor.mjs +75 -11
- package/fesm2022/ngx-kit-image-editor.mjs.map +1 -1
- package/fesm2022/ngx-kit-menu.mjs +8 -8
- package/fesm2022/ngx-kit-menu.mjs.map +1 -1
- package/fesm2022/ngx-kit-message.mjs +2 -2
- package/fesm2022/ngx-kit-message.mjs.map +1 -1
- package/fesm2022/ngx-kit-notify.mjs.map +1 -1
- package/fesm2022/ngx-kit-shared.mjs +2 -2
- package/fesm2022/ngx-kit-shared.mjs.map +1 -1
- package/fesm2022/ngx-kit-time-picker.mjs +2 -2
- package/fesm2022/ngx-kit-time-picker.mjs.map +1 -1
- package/gallery/README.md +71 -71
- package/gradient-picker/README.md +41 -41
- package/menu/README.md +85 -85
- package/message/README.md +70 -70
- package/notify/README.md +58 -58
- package/package.json +1 -1
- package/shared/README.md +117 -117
- package/time-picker/README.md +95 -95
- package/types/ngx-kit-date-picker.d.ts +303 -36
- package/types/ngx-kit-drawer-menu.d.ts +97 -86
- package/types/ngx-kit-dropzone.d.ts +5 -5
- package/types/ngx-kit-image-editor.d.ts +29 -4
|
@@ -646,13 +646,13 @@ class NgxTable {
|
|
|
646
646
|
return inputs;
|
|
647
647
|
}
|
|
648
648
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxTable, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
649
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxTable, isStandalone: true, selector: "ngx-table", inputs: { fields: { classPropertyName: "fields", publicName: "fields", isSignal: true, isRequired: true, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, totalRecords: { classPropertyName: "totalRecords", publicName: "totalRecords", isSignal: true, isRequired: true, transformFunction: null }, showRecordNumber: { classPropertyName: "showRecordNumber", publicName: "showRecordNumber", isSignal: true, isRequired: false, transformFunction: null }, operations: { classPropertyName: "operations", publicName: "operations", isSignal: true, isRequired: false, transformFunction: null }, operationWidth: { classPropertyName: "operationWidth", publicName: "operationWidth", isSignal: true, isRequired: false, transformFunction: null }, numWidth: { classPropertyName: "numWidth", publicName: "numWidth", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, page: { classPropertyName: "page", publicName: "page", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, multiSort: { classPropertyName: "multiSort", publicName: "multiSort", isSignal: true, isRequired: false, transformFunction: null }, lazy: { classPropertyName: "lazy", publicName: "lazy", isSignal: true, isRequired: false, transformFunction: null }, resizable: { classPropertyName: "resizable", publicName: "resizable", isSignal: true, isRequired: false, transformFunction: null }, trackBy: { classPropertyName: "trackBy", publicName: "trackBy", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pageChange: "pageChange", lazyLoad: "lazyLoad", sortChange: "sortChange", columnResize: "columnResize" }, host: { classAttribute: "ngx-table-host" }, queries: [{ propertyName: "cellTemplates", predicate: TableCell }], ngImport: i0, template: "<div class=\"ngx-table-wrapper\" [class.ngx-table--loading]=\"loading()\">\n <div class=\"ngx-table-scroll\">\n <div\n class=\"ngx-table\"\n [class.ngx-table--striped]=\"config.stripedRows\"\n [class.ngx-table--hover]=\"config.hoverable\"\n role=\"table\">\n <div class=\"thead-mrs\" [class.thead-mrs--sticky]=\"config.stickyHeader\" role=\"rowgroup\">\n <div class=\"tr-mrs\" role=\"row\">\n @if (operations()) {\n <div\n class=\"th-mrs operations\"\n role=\"columnheader\"\n [style.flex]=\"'0 0 ' + operationWidth() + 'px'\">\n {{ config.labels.operation }}\n </div>\n }\n @if (showRecordNumber()) {\n <div\n class=\"th-mrs operations\"\n role=\"columnheader\"\n [style.flex]=\"'0 0 ' + numWidth() + 'px'\">\n #\n </div>\n }\n\n @for (f of fields(); track f.column) {\n <div\n class=\"th-mrs\"\n role=\"columnheader\"\n [class.th-mrs--sortable]=\"f.sortable\"\n [style.flex]=\"columnFlex(f)\"\n [attr.aria-sort]=\"\n sortDirectionFor(f.column) === 'asc'\n ? 'ascending'\n : sortDirectionFor(f.column) === 'desc'\n ? 'descending'\n : null\n \"\n (click)=\"onHeaderClick(f, $event)\">\n <span class=\"th-mrs__title\">{{ f.title }}</span>\n\n @if (f.sortable) {\n <span class=\"sort-icon\" [class.active]=\"sortDirectionFor(f.column) !== null\">\n @if (sortDirectionFor(f.column) === 'asc') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\n <path\n fill=\"currentColor\"\n d=\"M182.6 41.4c-12.5-12.5-32.8-12.5-45.3 0l-128 128c-9.2 9.2-11.9 22.9-6.9 34.9s16.6 19.8 29.6 19.8H96V448c0 17.7 14.3 32 32 32s32-14.3 32-32V224h64c12.9 0 24.6-7.8 29.6-19.8s2.2-25.7-6.9-34.9l-128-128z\" />\n </svg>\n } @else if (sortDirectionFor(f.column) === 'desc') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\n <path\n fill=\"currentColor\"\n d=\"M137.4 470.6c12.5 12.5 32.8 12.5 45.3 0l128-128c9.2-9.2 11.9-22.9 6.9-34.9s-16.6-19.8-29.6-19.8H224V64c0-17.7-14.3-32-32-32s-32 14.3-32 32V288H96c-12.9 0-24.6 7.8-29.6 19.8s-2.2 25.7 6.9 34.9l128 128z\" />\n </svg>\n } @else {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\n <path\n fill=\"currentColor\"\n d=\"M137.4 41.4c12.5-12.5 32.8-12.5 45.3 0l96 96c9.2 9.2 11.9 22.9 6.9 34.9s-16.6 19.8-29.6 19.8H224v96c0 17.7-14.3 32-32 32s-32-14.3-32-32V192H96c-12.9 0-24.6-7.8-29.6-19.8s-2.3-25.7 6.9-34.9l96-96zM32 400c0-17.7 14.3-32 32-32H256c17.7 0 32 14.3 32 32s-14.3 32-32 32H64c-17.7 0-32-14.3-32-32z\"\n opacity=\".35\" />\n </svg>\n }\n </span>\n }\n\n @if (isResizable(f)) {\n <span\n ngxColumnResize\n [ngxColumnResizeWidth]=\"columnWidth(f.column)\"\n [ngxColumnResizeMin]=\"columnMin(f)\"\n [ngxColumnResizeMax]=\"columnMax(f)\"\n [ngxColumnResizeDir]=\"resolvedDirection()\"\n (resizing)=\"onColumnResizing(f.column, $event)\"\n (resizeEnd)=\"onColumnResizeEnd(f.column, $event)\"\n (click)=\"$event.stopPropagation()\"></span>\n }\n </div>\n }\n </div>\n </div>\n\n <div class=\"tbody-mrs\" role=\"rowgroup\">\n @if (!loading() && pagedData().length === 0) {\n <div class=\"no-data\">{{ config.labels.noData }}</div>\n }\n\n @for (row of pagedData(); track trackBy()($index, row); let rowIndex = $index) {\n <div class=\"tr-mrs\" role=\"row\">\n @if (operations()) {\n <div\n class=\"td-mrs operations\"\n role=\"cell\"\n [style.flex]=\"'0 0 ' + operationWidth() + 'px'\">\n <div class=\"cel\">\n <span class=\"cell-title\">{{ config.labels.operation }}:</span>\n <ng-container\n [ngTemplateOutlet]=\"operations()!\"\n [ngTemplateOutletContext]=\"{ $implicit: row }\"></ng-container>\n </div>\n </div>\n }\n\n @if (showRecordNumber()) {\n <div class=\"td-mrs operations\" role=\"cell\" [style.flex]=\"'0 0 ' + numWidth() + 'px'\">\n <div class=\"cel\">{{ recordNumber(rowIndex) }}</div>\n </div>\n }\n\n @for (f of fields(); track f.column) {\n @let template = getTemplate(f.column);\n @let renderer = getRenderer(f);\n\n <div class=\"td-mrs\" role=\"cell\" [style.flex]=\"columnFlex(f)\">\n <div class=\"cel\" [class.wrap]=\"f.wrap\">\n <span class=\"cell-title\">{{ f.title }}</span>\n\n @if (template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n row: row,\n value: getCellValue(row, f),\n rowIndex: rowIndex,\n field: f,\n }\"></ng-container>\n } @else if (renderer) {\n <ng-container\n *ngComponentOutlet=\"\n renderer;\n inputs: getRendererInputs(row, f)\n \"></ng-container>\n } @else {\n {{ formatCellValue(row, f) }}\n }\n\n @if (f.prefix) {\n <span>{{ f.prefix }}</span>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n @if (loading()) {\n <div class=\"loading-container\">\n <div class=\"loading\">{{ config.labels.loading }}</div>\n </div>\n }\n </div>\n</div>\n\n<ngx-pagination\n [page]=\"page()\"\n [pageSize]=\"pageSizeS()\"\n [total]=\"totalCount()\"\n (paginate)=\"onPaginate($event)\"></ngx-pagination>\n", styles: [":host{--ngx-table-accent: light-dark(#4f46e5, #818cf8);--ngx-table-border: light-dark(#e5e7eb, #27272a);--ngx-table-header-bg: light-dark(#f8fafc, #18181b);--ngx-table-header-fg: light-dark(#334155, #d4d4d8);--ngx-table-row-bg: light-dark(#ffffff, #111114);--ngx-table-row-alt-bg: light-dark(#f9fafb, #17171b);--ngx-table-row-hover-bg: light-dark(#eef2ff, #1e1b4b);--ngx-table-text: light-dark(#1e293b, #e4e4e7);--ngx-table-radius: 12px;display:block;color:var(--ngx-table-text)}.ngx-table-wrapper{position:relative;border:1px solid var(--ngx-table-border);border-radius:var(--ngx-table-radius);overflow:hidden;background:var(--ngx-table-row-bg)}.ngx-table-scroll{overflow:auto;max-height:75vh}.ngx-table-scroll::-webkit-scrollbar{height:10px;width:10px}.ngx-table-scroll::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--ngx-table-border) 60%,gray);border-radius:8px}.ngx-table{display:flex;flex-direction:column;min-width:100%;width:max-content}.thead-mrs{display:flex;flex-direction:column;z-index:2}.thead-mrs--sticky{position:sticky;top:0}.tr-mrs{display:flex;align-items:stretch}.th-mrs,.td-mrs{position:relative;box-sizing:border-box;overflow:hidden;min-inline-size:0;border-bottom:1px solid var(--ngx-table-border);border-inline-end:1px solid var(--ngx-table-border)}.th-mrs:last-child,.td-mrs:last-child{border-inline-end:none}.th-mrs{display:flex;align-items:center;gap:.375rem;background:var(--ngx-table-header-bg);color:var(--ngx-table-header-fg);font-weight:600;font-size:.8125rem;letter-spacing:.02em;padding:.75rem 1rem;-webkit-user-select:none;user-select:none;white-space:nowrap;text-overflow:ellipsis}.th-mrs--sortable{cursor:pointer}.th-mrs--sortable:hover{color:var(--ngx-table-accent)}.th-mrs.operations{justify-content:center}.th-mrs__title{overflow:hidden;text-overflow:ellipsis}.sort-icon{width:.75rem;height:.75rem;flex:none;opacity:.4;display:inline-flex}.sort-icon svg{width:100%;height:100%}.sort-icon.active{opacity:1}.ngx-table__resize-handle,[ngxColumnResize]{position:absolute;top:0;bottom:0;inset-inline-end:-3px;width:6px;cursor:col-resize;touch-action:none;z-index:3}.ngx-table__resize-handle:hover,.ngx-table__resize-handle:active,[ngxColumnResize]:hover,[ngxColumnResize]:active{background:var(--ngx-table-accent);opacity:.5}.td-mrs{display:flex;align-items:center;padding:.75rem 1rem;font-size:.875rem}.td-mrs.operations{justify-content:center}.cel{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:.25rem}.cel.wrap{white-space:normal}.cell-title{display:none;font-weight:600;color:var(--ngx-table-header-fg)}.ngx-table--striped .tbody-mrs .tr-mrs:nth-child(2n){background:var(--ngx-table-row-alt-bg)}.ngx-table--hover .tbody-mrs .tr-mrs:hover{background:var(--ngx-table-row-hover-bg)}.tr-mrs{transition:background-color .15s ease}.no-data{padding:2.5rem 1rem;text-align:center;color:#94a3b8;font-size:.875rem}.loading-container{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--ngx-table-row-bg) 75%,transparent);-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px)}.loading{font-size:.875rem;color:var(--ngx-table-accent)}@media(max-width:768px){.ngx-table-scroll{overflow:visible;max-height:none}.ngx-table{width:100%}.thead-mrs{display:none}.tbody-mrs{display:flex;flex-direction:column;gap:.75rem;padding:.75rem}.tr-mrs{flex-direction:column;border:1px solid var(--ngx-table-border);border-radius:10px;overflow:hidden}.td-mrs{flex:1 1 auto!important;width:100%;border-inline-end:none;justify-content:space-between}.cel{justify-content:flex-end;white-space:normal;text-align:end}.cell-title{display:inline}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgxPagination, selector: "ngx-pagination", inputs: ["total", "page", "pageSize", "pageSizeOptions", "labels", "siblingCount", "boundaryCount"], outputs: ["pageChange", "pageSizeChange", "paginate"] }, { kind: "directive", type: ColumnResize, selector: "[ngxColumnResize]", inputs: ["ngxColumnResizeWidth", "ngxColumnResizeMin", "ngxColumnResizeMax", "ngxColumnResizeDir"], outputs: ["resizing", "resizeEnd"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
649
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxTable, isStandalone: true, selector: "ngx-table", inputs: { fields: { classPropertyName: "fields", publicName: "fields", isSignal: true, isRequired: true, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, totalRecords: { classPropertyName: "totalRecords", publicName: "totalRecords", isSignal: true, isRequired: true, transformFunction: null }, showRecordNumber: { classPropertyName: "showRecordNumber", publicName: "showRecordNumber", isSignal: true, isRequired: false, transformFunction: null }, operations: { classPropertyName: "operations", publicName: "operations", isSignal: true, isRequired: false, transformFunction: null }, operationWidth: { classPropertyName: "operationWidth", publicName: "operationWidth", isSignal: true, isRequired: false, transformFunction: null }, numWidth: { classPropertyName: "numWidth", publicName: "numWidth", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, page: { classPropertyName: "page", publicName: "page", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, multiSort: { classPropertyName: "multiSort", publicName: "multiSort", isSignal: true, isRequired: false, transformFunction: null }, lazy: { classPropertyName: "lazy", publicName: "lazy", isSignal: true, isRequired: false, transformFunction: null }, resizable: { classPropertyName: "resizable", publicName: "resizable", isSignal: true, isRequired: false, transformFunction: null }, trackBy: { classPropertyName: "trackBy", publicName: "trackBy", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pageChange: "pageChange", lazyLoad: "lazyLoad", sortChange: "sortChange", columnResize: "columnResize" }, host: { classAttribute: "ngx-table-host" }, queries: [{ propertyName: "cellTemplates", predicate: TableCell }], ngImport: i0, template: "<div class=\"ngx-table-wrapper\" [class.ngx-table--loading]=\"loading()\">\r\n <div class=\"ngx-table-scroll\">\r\n <div\r\n class=\"ngx-table\"\r\n [class.ngx-table--striped]=\"config.stripedRows\"\r\n [class.ngx-table--hover]=\"config.hoverable\"\r\n role=\"table\">\r\n <div class=\"thead-mrs\" [class.thead-mrs--sticky]=\"config.stickyHeader\" role=\"rowgroup\">\r\n <div class=\"tr-mrs\" role=\"row\">\r\n @if (operations()) {\r\n <div\r\n class=\"th-mrs operations\"\r\n role=\"columnheader\"\r\n [style.flex]=\"'0 0 ' + operationWidth() + 'px'\">\r\n {{ config.labels.operation }}\r\n </div>\r\n }\r\n @if (showRecordNumber()) {\r\n <div\r\n class=\"th-mrs operations\"\r\n role=\"columnheader\"\r\n [style.flex]=\"'0 0 ' + numWidth() + 'px'\">\r\n #\r\n </div>\r\n }\r\n\r\n @for (f of fields(); track f.column) {\r\n <div\r\n class=\"th-mrs\"\r\n role=\"columnheader\"\r\n [class.th-mrs--sortable]=\"f.sortable\"\r\n [style.flex]=\"columnFlex(f)\"\r\n [attr.aria-sort]=\"\r\n sortDirectionFor(f.column) === 'asc'\r\n ? 'ascending'\r\n : sortDirectionFor(f.column) === 'desc'\r\n ? 'descending'\r\n : null\r\n \"\r\n (click)=\"onHeaderClick(f, $event)\">\r\n <span class=\"th-mrs__title\">{{ f.title }}</span>\r\n\r\n @if (f.sortable) {\r\n <span class=\"sort-icon\" [class.active]=\"sortDirectionFor(f.column) !== null\">\r\n @if (sortDirectionFor(f.column) === 'asc') {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M182.6 41.4c-12.5-12.5-32.8-12.5-45.3 0l-128 128c-9.2 9.2-11.9 22.9-6.9 34.9s16.6 19.8 29.6 19.8H96V448c0 17.7 14.3 32 32 32s32-14.3 32-32V224h64c12.9 0 24.6-7.8 29.6-19.8s2.2-25.7-6.9-34.9l-128-128z\" />\r\n </svg>\r\n } @else if (sortDirectionFor(f.column) === 'desc') {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M137.4 470.6c12.5 12.5 32.8 12.5 45.3 0l128-128c9.2-9.2 11.9-22.9 6.9-34.9s-16.6-19.8-29.6-19.8H224V64c0-17.7-14.3-32-32-32s-32 14.3-32 32V288H96c-12.9 0-24.6 7.8-29.6 19.8s-2.2 25.7 6.9 34.9l128 128z\" />\r\n </svg>\r\n } @else {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M137.4 41.4c12.5-12.5 32.8-12.5 45.3 0l96 96c9.2 9.2 11.9 22.9 6.9 34.9s-16.6 19.8-29.6 19.8H224v96c0 17.7-14.3 32-32 32s-32-14.3-32-32V192H96c-12.9 0-24.6-7.8-29.6-19.8s-2.3-25.7 6.9-34.9l96-96zM32 400c0-17.7 14.3-32 32-32H256c17.7 0 32 14.3 32 32s-14.3 32-32 32H64c-17.7 0-32-14.3-32-32z\"\r\n opacity=\".35\" />\r\n </svg>\r\n }\r\n </span>\r\n }\r\n\r\n @if (isResizable(f)) {\r\n <span\r\n ngxColumnResize\r\n [ngxColumnResizeWidth]=\"columnWidth(f.column)\"\r\n [ngxColumnResizeMin]=\"columnMin(f)\"\r\n [ngxColumnResizeMax]=\"columnMax(f)\"\r\n [ngxColumnResizeDir]=\"resolvedDirection()\"\r\n (resizing)=\"onColumnResizing(f.column, $event)\"\r\n (resizeEnd)=\"onColumnResizeEnd(f.column, $event)\"\r\n (click)=\"$event.stopPropagation()\"></span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div class=\"tbody-mrs\" role=\"rowgroup\">\r\n @if (!loading() && pagedData().length === 0) {\r\n <div class=\"no-data\">{{ config.labels.noData }}</div>\r\n }\r\n\r\n @for (row of pagedData(); track trackBy()($index, row); let rowIndex = $index) {\r\n <div class=\"tr-mrs\" role=\"row\">\r\n @if (operations()) {\r\n <div\r\n class=\"td-mrs operations\"\r\n role=\"cell\"\r\n [style.flex]=\"'0 0 ' + operationWidth() + 'px'\">\r\n <div class=\"cel\">\r\n <span class=\"cell-title\">{{ config.labels.operation }}:</span>\r\n <ng-container\r\n [ngTemplateOutlet]=\"operations()!\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row }\"></ng-container>\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (showRecordNumber()) {\r\n <div class=\"td-mrs operations\" role=\"cell\" [style.flex]=\"'0 0 ' + numWidth() + 'px'\">\r\n <div class=\"cel\">{{ recordNumber(rowIndex) }}</div>\r\n </div>\r\n }\r\n\r\n @for (f of fields(); track f.column) {\r\n @let template = getTemplate(f.column);\r\n @let renderer = getRenderer(f);\r\n\r\n <div class=\"td-mrs\" role=\"cell\" [style.flex]=\"columnFlex(f)\">\r\n <div class=\"cel\" [class.wrap]=\"f.wrap\">\r\n <span class=\"cell-title\">{{ f.title }}</span>\r\n\r\n @if (template) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: row,\r\n row: row,\r\n value: getCellValue(row, f),\r\n rowIndex: rowIndex,\r\n field: f,\r\n }\"></ng-container>\r\n } @else if (renderer) {\r\n <ng-container\r\n *ngComponentOutlet=\"\r\n renderer;\r\n inputs: getRendererInputs(row, f)\r\n \"></ng-container>\r\n } @else {\r\n {{ formatCellValue(row, f) }}\r\n }\r\n\r\n @if (f.prefix) {\r\n <span>{{ f.prefix }}</span>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (loading()) {\r\n <div class=\"loading-container\">\r\n <div class=\"loading\">{{ config.labels.loading }}</div>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n\r\n<ngx-pagination\r\n [page]=\"page()\"\r\n [pageSize]=\"pageSizeS()\"\r\n [total]=\"totalCount()\"\r\n (paginate)=\"onPaginate($event)\"></ngx-pagination>\r\n", styles: [":host{--ngx-table-accent: light-dark(#4f46e5, #818cf8);--ngx-table-border: light-dark(#e5e7eb, #27272a);--ngx-table-header-bg: light-dark(#f8fafc, #18181b);--ngx-table-header-fg: light-dark(#334155, #d4d4d8);--ngx-table-row-bg: light-dark(#ffffff, #111114);--ngx-table-row-alt-bg: light-dark(#f9fafb, #17171b);--ngx-table-row-hover-bg: light-dark(#eef2ff, #1e1b4b);--ngx-table-text: light-dark(#1e293b, #e4e4e7);--ngx-table-radius: 12px;display:block;color:var(--ngx-table-text)}.ngx-table-wrapper{position:relative;border:1px solid var(--ngx-table-border);border-radius:var(--ngx-table-radius);overflow:hidden;background:var(--ngx-table-row-bg)}.ngx-table-scroll{overflow:auto;max-height:75vh}.ngx-table-scroll::-webkit-scrollbar{height:10px;width:10px}.ngx-table-scroll::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--ngx-table-border) 60%,gray);border-radius:8px}.ngx-table{display:flex;flex-direction:column;min-width:100%;width:max-content}.thead-mrs{display:flex;flex-direction:column;z-index:2}.thead-mrs--sticky{position:sticky;top:0}.tr-mrs{display:flex;align-items:stretch}.th-mrs,.td-mrs{position:relative;box-sizing:border-box;overflow:hidden;min-inline-size:0;border-bottom:1px solid var(--ngx-table-border);border-inline-end:1px solid var(--ngx-table-border)}.th-mrs:last-child,.td-mrs:last-child{border-inline-end:none}.th-mrs{display:flex;align-items:center;gap:.375rem;background:var(--ngx-table-header-bg);color:var(--ngx-table-header-fg);font-weight:600;font-size:.8125rem;letter-spacing:.02em;padding:.75rem 1rem;-webkit-user-select:none;user-select:none;white-space:nowrap;text-overflow:ellipsis}.th-mrs--sortable{cursor:pointer}.th-mrs--sortable:hover{color:var(--ngx-table-accent)}.th-mrs.operations{justify-content:center}.th-mrs__title{overflow:hidden;text-overflow:ellipsis}.sort-icon{width:.75rem;height:.75rem;flex:none;opacity:.4;display:inline-flex}.sort-icon svg{width:100%;height:100%}.sort-icon.active{opacity:1}.ngx-table__resize-handle,[ngxColumnResize]{position:absolute;top:0;bottom:0;inset-inline-end:-3px;width:6px;cursor:col-resize;touch-action:none;z-index:3}.ngx-table__resize-handle:hover,.ngx-table__resize-handle:active,[ngxColumnResize]:hover,[ngxColumnResize]:active{background:var(--ngx-table-accent);opacity:.5}.td-mrs{display:flex;align-items:center;padding:.75rem 1rem;font-size:.875rem}.td-mrs.operations{justify-content:center}.cel{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:.25rem}.cel.wrap{white-space:normal}.cell-title{display:none;font-weight:600;color:var(--ngx-table-header-fg)}.ngx-table--striped .tbody-mrs .tr-mrs:nth-child(2n){background:var(--ngx-table-row-alt-bg)}.ngx-table--hover .tbody-mrs .tr-mrs:hover{background:var(--ngx-table-row-hover-bg)}.tr-mrs{transition:background-color .15s ease}.no-data{padding:2.5rem 1rem;text-align:center;color:#94a3b8;font-size:.875rem}.loading-container{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--ngx-table-row-bg) 75%,transparent);-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px)}.loading{font-size:.875rem;color:var(--ngx-table-accent)}@media(max-width:768px){.ngx-table-scroll{overflow:visible;max-height:none}.ngx-table{width:100%}.thead-mrs{display:none}.tbody-mrs{display:flex;flex-direction:column;gap:.75rem;padding:.75rem}.tr-mrs{flex-direction:column;border:1px solid var(--ngx-table-border);border-radius:10px;overflow:hidden}.td-mrs{flex:1 1 auto!important;width:100%;border-inline-end:none;justify-content:space-between}.cel{justify-content:flex-end;white-space:normal;text-align:end}.cell-title{display:inline}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgxPagination, selector: "ngx-pagination", inputs: ["total", "page", "pageSize", "pageSizeOptions", "labels", "siblingCount", "boundaryCount"], outputs: ["pageChange", "pageSizeChange", "paginate"] }, { kind: "directive", type: ColumnResize, selector: "[ngxColumnResize]", inputs: ["ngxColumnResizeWidth", "ngxColumnResizeMin", "ngxColumnResizeMax", "ngxColumnResizeDir"], outputs: ["resizing", "resizeEnd"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
650
650
|
}
|
|
651
651
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxTable, decorators: [{
|
|
652
652
|
type: Component,
|
|
653
653
|
args: [{ selector: 'ngx-table', standalone: true, imports: [CommonModule, NgxPagination, ColumnResize], changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
654
654
|
class: 'ngx-table-host',
|
|
655
|
-
}, template: "<div class=\"ngx-table-wrapper\" [class.ngx-table--loading]=\"loading()\">\n <div class=\"ngx-table-scroll\">\n <div\n class=\"ngx-table\"\n [class.ngx-table--striped]=\"config.stripedRows\"\n [class.ngx-table--hover]=\"config.hoverable\"\n role=\"table\">\n <div class=\"thead-mrs\" [class.thead-mrs--sticky]=\"config.stickyHeader\" role=\"rowgroup\">\n <div class=\"tr-mrs\" role=\"row\">\n @if (operations()) {\n <div\n class=\"th-mrs operations\"\n role=\"columnheader\"\n [style.flex]=\"'0 0 ' + operationWidth() + 'px'\">\n {{ config.labels.operation }}\n </div>\n }\n @if (showRecordNumber()) {\n <div\n class=\"th-mrs operations\"\n role=\"columnheader\"\n [style.flex]=\"'0 0 ' + numWidth() + 'px'\">\n #\n </div>\n }\n\n @for (f of fields(); track f.column) {\n <div\n class=\"th-mrs\"\n role=\"columnheader\"\n [class.th-mrs--sortable]=\"f.sortable\"\n [style.flex]=\"columnFlex(f)\"\n [attr.aria-sort]=\"\n sortDirectionFor(f.column) === 'asc'\n ? 'ascending'\n : sortDirectionFor(f.column) === 'desc'\n ? 'descending'\n : null\n \"\n (click)=\"onHeaderClick(f, $event)\">\n <span class=\"th-mrs__title\">{{ f.title }}</span>\n\n @if (f.sortable) {\n <span class=\"sort-icon\" [class.active]=\"sortDirectionFor(f.column) !== null\">\n @if (sortDirectionFor(f.column) === 'asc') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\n <path\n fill=\"currentColor\"\n d=\"M182.6 41.4c-12.5-12.5-32.8-12.5-45.3 0l-128 128c-9.2 9.2-11.9 22.9-6.9 34.9s16.6 19.8 29.6 19.8H96V448c0 17.7 14.3 32 32 32s32-14.3 32-32V224h64c12.9 0 24.6-7.8 29.6-19.8s2.2-25.7-6.9-34.9l-128-128z\" />\n </svg>\n } @else if (sortDirectionFor(f.column) === 'desc') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\n <path\n fill=\"currentColor\"\n d=\"M137.4 470.6c12.5 12.5 32.8 12.5 45.3 0l128-128c9.2-9.2 11.9-22.9 6.9-34.9s-16.6-19.8-29.6-19.8H224V64c0-17.7-14.3-32-32-32s-32 14.3-32 32V288H96c-12.9 0-24.6 7.8-29.6 19.8s-2.2 25.7 6.9 34.9l128 128z\" />\n </svg>\n } @else {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\n <path\n fill=\"currentColor\"\n d=\"M137.4 41.4c12.5-12.5 32.8-12.5 45.3 0l96 96c9.2 9.2 11.9 22.9 6.9 34.9s-16.6 19.8-29.6 19.8H224v96c0 17.7-14.3 32-32 32s-32-14.3-32-32V192H96c-12.9 0-24.6-7.8-29.6-19.8s-2.3-25.7 6.9-34.9l96-96zM32 400c0-17.7 14.3-32 32-32H256c17.7 0 32 14.3 32 32s-14.3 32-32 32H64c-17.7 0-32-14.3-32-32z\"\n opacity=\".35\" />\n </svg>\n }\n </span>\n }\n\n @if (isResizable(f)) {\n <span\n ngxColumnResize\n [ngxColumnResizeWidth]=\"columnWidth(f.column)\"\n [ngxColumnResizeMin]=\"columnMin(f)\"\n [ngxColumnResizeMax]=\"columnMax(f)\"\n [ngxColumnResizeDir]=\"resolvedDirection()\"\n (resizing)=\"onColumnResizing(f.column, $event)\"\n (resizeEnd)=\"onColumnResizeEnd(f.column, $event)\"\n (click)=\"$event.stopPropagation()\"></span>\n }\n </div>\n }\n </div>\n </div>\n\n <div class=\"tbody-mrs\" role=\"rowgroup\">\n @if (!loading() && pagedData().length === 0) {\n <div class=\"no-data\">{{ config.labels.noData }}</div>\n }\n\n @for (row of pagedData(); track trackBy()($index, row); let rowIndex = $index) {\n <div class=\"tr-mrs\" role=\"row\">\n @if (operations()) {\n <div\n class=\"td-mrs operations\"\n role=\"cell\"\n [style.flex]=\"'0 0 ' + operationWidth() + 'px'\">\n <div class=\"cel\">\n <span class=\"cell-title\">{{ config.labels.operation }}:</span>\n <ng-container\n [ngTemplateOutlet]=\"operations()!\"\n [ngTemplateOutletContext]=\"{ $implicit: row }\"></ng-container>\n </div>\n </div>\n }\n\n @if (showRecordNumber()) {\n <div class=\"td-mrs operations\" role=\"cell\" [style.flex]=\"'0 0 ' + numWidth() + 'px'\">\n <div class=\"cel\">{{ recordNumber(rowIndex) }}</div>\n </div>\n }\n\n @for (f of fields(); track f.column) {\n @let template = getTemplate(f.column);\n @let renderer = getRenderer(f);\n\n <div class=\"td-mrs\" role=\"cell\" [style.flex]=\"columnFlex(f)\">\n <div class=\"cel\" [class.wrap]=\"f.wrap\">\n <span class=\"cell-title\">{{ f.title }}</span>\n\n @if (template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n row: row,\n value: getCellValue(row, f),\n rowIndex: rowIndex,\n field: f,\n }\"></ng-container>\n } @else if (renderer) {\n <ng-container\n *ngComponentOutlet=\"\n renderer;\n inputs: getRendererInputs(row, f)\n \"></ng-container>\n } @else {\n {{ formatCellValue(row, f) }}\n }\n\n @if (f.prefix) {\n <span>{{ f.prefix }}</span>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n @if (loading()) {\n <div class=\"loading-container\">\n <div class=\"loading\">{{ config.labels.loading }}</div>\n </div>\n }\n </div>\n</div>\n\n<ngx-pagination\n [page]=\"page()\"\n [pageSize]=\"pageSizeS()\"\n [total]=\"totalCount()\"\n (paginate)=\"onPaginate($event)\"></ngx-pagination>\n", styles: [":host{--ngx-table-accent: light-dark(#4f46e5, #818cf8);--ngx-table-border: light-dark(#e5e7eb, #27272a);--ngx-table-header-bg: light-dark(#f8fafc, #18181b);--ngx-table-header-fg: light-dark(#334155, #d4d4d8);--ngx-table-row-bg: light-dark(#ffffff, #111114);--ngx-table-row-alt-bg: light-dark(#f9fafb, #17171b);--ngx-table-row-hover-bg: light-dark(#eef2ff, #1e1b4b);--ngx-table-text: light-dark(#1e293b, #e4e4e7);--ngx-table-radius: 12px;display:block;color:var(--ngx-table-text)}.ngx-table-wrapper{position:relative;border:1px solid var(--ngx-table-border);border-radius:var(--ngx-table-radius);overflow:hidden;background:var(--ngx-table-row-bg)}.ngx-table-scroll{overflow:auto;max-height:75vh}.ngx-table-scroll::-webkit-scrollbar{height:10px;width:10px}.ngx-table-scroll::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--ngx-table-border) 60%,gray);border-radius:8px}.ngx-table{display:flex;flex-direction:column;min-width:100%;width:max-content}.thead-mrs{display:flex;flex-direction:column;z-index:2}.thead-mrs--sticky{position:sticky;top:0}.tr-mrs{display:flex;align-items:stretch}.th-mrs,.td-mrs{position:relative;box-sizing:border-box;overflow:hidden;min-inline-size:0;border-bottom:1px solid var(--ngx-table-border);border-inline-end:1px solid var(--ngx-table-border)}.th-mrs:last-child,.td-mrs:last-child{border-inline-end:none}.th-mrs{display:flex;align-items:center;gap:.375rem;background:var(--ngx-table-header-bg);color:var(--ngx-table-header-fg);font-weight:600;font-size:.8125rem;letter-spacing:.02em;padding:.75rem 1rem;-webkit-user-select:none;user-select:none;white-space:nowrap;text-overflow:ellipsis}.th-mrs--sortable{cursor:pointer}.th-mrs--sortable:hover{color:var(--ngx-table-accent)}.th-mrs.operations{justify-content:center}.th-mrs__title{overflow:hidden;text-overflow:ellipsis}.sort-icon{width:.75rem;height:.75rem;flex:none;opacity:.4;display:inline-flex}.sort-icon svg{width:100%;height:100%}.sort-icon.active{opacity:1}.ngx-table__resize-handle,[ngxColumnResize]{position:absolute;top:0;bottom:0;inset-inline-end:-3px;width:6px;cursor:col-resize;touch-action:none;z-index:3}.ngx-table__resize-handle:hover,.ngx-table__resize-handle:active,[ngxColumnResize]:hover,[ngxColumnResize]:active{background:var(--ngx-table-accent);opacity:.5}.td-mrs{display:flex;align-items:center;padding:.75rem 1rem;font-size:.875rem}.td-mrs.operations{justify-content:center}.cel{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:.25rem}.cel.wrap{white-space:normal}.cell-title{display:none;font-weight:600;color:var(--ngx-table-header-fg)}.ngx-table--striped .tbody-mrs .tr-mrs:nth-child(2n){background:var(--ngx-table-row-alt-bg)}.ngx-table--hover .tbody-mrs .tr-mrs:hover{background:var(--ngx-table-row-hover-bg)}.tr-mrs{transition:background-color .15s ease}.no-data{padding:2.5rem 1rem;text-align:center;color:#94a3b8;font-size:.875rem}.loading-container{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--ngx-table-row-bg) 75%,transparent);-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px)}.loading{font-size:.875rem;color:var(--ngx-table-accent)}@media(max-width:768px){.ngx-table-scroll{overflow:visible;max-height:none}.ngx-table{width:100%}.thead-mrs{display:none}.tbody-mrs{display:flex;flex-direction:column;gap:.75rem;padding:.75rem}.tr-mrs{flex-direction:column;border:1px solid var(--ngx-table-border);border-radius:10px;overflow:hidden}.td-mrs{flex:1 1 auto!important;width:100%;border-inline-end:none;justify-content:space-between}.cel{justify-content:flex-end;white-space:normal;text-align:end}.cell-title{display:inline}}\n"] }]
|
|
655
|
+
}, template: "<div class=\"ngx-table-wrapper\" [class.ngx-table--loading]=\"loading()\">\r\n <div class=\"ngx-table-scroll\">\r\n <div\r\n class=\"ngx-table\"\r\n [class.ngx-table--striped]=\"config.stripedRows\"\r\n [class.ngx-table--hover]=\"config.hoverable\"\r\n role=\"table\">\r\n <div class=\"thead-mrs\" [class.thead-mrs--sticky]=\"config.stickyHeader\" role=\"rowgroup\">\r\n <div class=\"tr-mrs\" role=\"row\">\r\n @if (operations()) {\r\n <div\r\n class=\"th-mrs operations\"\r\n role=\"columnheader\"\r\n [style.flex]=\"'0 0 ' + operationWidth() + 'px'\">\r\n {{ config.labels.operation }}\r\n </div>\r\n }\r\n @if (showRecordNumber()) {\r\n <div\r\n class=\"th-mrs operations\"\r\n role=\"columnheader\"\r\n [style.flex]=\"'0 0 ' + numWidth() + 'px'\">\r\n #\r\n </div>\r\n }\r\n\r\n @for (f of fields(); track f.column) {\r\n <div\r\n class=\"th-mrs\"\r\n role=\"columnheader\"\r\n [class.th-mrs--sortable]=\"f.sortable\"\r\n [style.flex]=\"columnFlex(f)\"\r\n [attr.aria-sort]=\"\r\n sortDirectionFor(f.column) === 'asc'\r\n ? 'ascending'\r\n : sortDirectionFor(f.column) === 'desc'\r\n ? 'descending'\r\n : null\r\n \"\r\n (click)=\"onHeaderClick(f, $event)\">\r\n <span class=\"th-mrs__title\">{{ f.title }}</span>\r\n\r\n @if (f.sortable) {\r\n <span class=\"sort-icon\" [class.active]=\"sortDirectionFor(f.column) !== null\">\r\n @if (sortDirectionFor(f.column) === 'asc') {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M182.6 41.4c-12.5-12.5-32.8-12.5-45.3 0l-128 128c-9.2 9.2-11.9 22.9-6.9 34.9s16.6 19.8 29.6 19.8H96V448c0 17.7 14.3 32 32 32s32-14.3 32-32V224h64c12.9 0 24.6-7.8 29.6-19.8s2.2-25.7-6.9-34.9l-128-128z\" />\r\n </svg>\r\n } @else if (sortDirectionFor(f.column) === 'desc') {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M137.4 470.6c12.5 12.5 32.8 12.5 45.3 0l128-128c9.2-9.2 11.9-22.9 6.9-34.9s-16.6-19.8-29.6-19.8H224V64c0-17.7-14.3-32-32-32s-32 14.3-32 32V288H96c-12.9 0-24.6 7.8-29.6 19.8s-2.2 25.7 6.9 34.9l128 128z\" />\r\n </svg>\r\n } @else {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M137.4 41.4c12.5-12.5 32.8-12.5 45.3 0l96 96c9.2 9.2 11.9 22.9 6.9 34.9s-16.6 19.8-29.6 19.8H224v96c0 17.7-14.3 32-32 32s-32-14.3-32-32V192H96c-12.9 0-24.6-7.8-29.6-19.8s-2.3-25.7 6.9-34.9l96-96zM32 400c0-17.7 14.3-32 32-32H256c17.7 0 32 14.3 32 32s-14.3 32-32 32H64c-17.7 0-32-14.3-32-32z\"\r\n opacity=\".35\" />\r\n </svg>\r\n }\r\n </span>\r\n }\r\n\r\n @if (isResizable(f)) {\r\n <span\r\n ngxColumnResize\r\n [ngxColumnResizeWidth]=\"columnWidth(f.column)\"\r\n [ngxColumnResizeMin]=\"columnMin(f)\"\r\n [ngxColumnResizeMax]=\"columnMax(f)\"\r\n [ngxColumnResizeDir]=\"resolvedDirection()\"\r\n (resizing)=\"onColumnResizing(f.column, $event)\"\r\n (resizeEnd)=\"onColumnResizeEnd(f.column, $event)\"\r\n (click)=\"$event.stopPropagation()\"></span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div class=\"tbody-mrs\" role=\"rowgroup\">\r\n @if (!loading() && pagedData().length === 0) {\r\n <div class=\"no-data\">{{ config.labels.noData }}</div>\r\n }\r\n\r\n @for (row of pagedData(); track trackBy()($index, row); let rowIndex = $index) {\r\n <div class=\"tr-mrs\" role=\"row\">\r\n @if (operations()) {\r\n <div\r\n class=\"td-mrs operations\"\r\n role=\"cell\"\r\n [style.flex]=\"'0 0 ' + operationWidth() + 'px'\">\r\n <div class=\"cel\">\r\n <span class=\"cell-title\">{{ config.labels.operation }}:</span>\r\n <ng-container\r\n [ngTemplateOutlet]=\"operations()!\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row }\"></ng-container>\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (showRecordNumber()) {\r\n <div class=\"td-mrs operations\" role=\"cell\" [style.flex]=\"'0 0 ' + numWidth() + 'px'\">\r\n <div class=\"cel\">{{ recordNumber(rowIndex) }}</div>\r\n </div>\r\n }\r\n\r\n @for (f of fields(); track f.column) {\r\n @let template = getTemplate(f.column);\r\n @let renderer = getRenderer(f);\r\n\r\n <div class=\"td-mrs\" role=\"cell\" [style.flex]=\"columnFlex(f)\">\r\n <div class=\"cel\" [class.wrap]=\"f.wrap\">\r\n <span class=\"cell-title\">{{ f.title }}</span>\r\n\r\n @if (template) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: row,\r\n row: row,\r\n value: getCellValue(row, f),\r\n rowIndex: rowIndex,\r\n field: f,\r\n }\"></ng-container>\r\n } @else if (renderer) {\r\n <ng-container\r\n *ngComponentOutlet=\"\r\n renderer;\r\n inputs: getRendererInputs(row, f)\r\n \"></ng-container>\r\n } @else {\r\n {{ formatCellValue(row, f) }}\r\n }\r\n\r\n @if (f.prefix) {\r\n <span>{{ f.prefix }}</span>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (loading()) {\r\n <div class=\"loading-container\">\r\n <div class=\"loading\">{{ config.labels.loading }}</div>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n\r\n<ngx-pagination\r\n [page]=\"page()\"\r\n [pageSize]=\"pageSizeS()\"\r\n [total]=\"totalCount()\"\r\n (paginate)=\"onPaginate($event)\"></ngx-pagination>\r\n", styles: [":host{--ngx-table-accent: light-dark(#4f46e5, #818cf8);--ngx-table-border: light-dark(#e5e7eb, #27272a);--ngx-table-header-bg: light-dark(#f8fafc, #18181b);--ngx-table-header-fg: light-dark(#334155, #d4d4d8);--ngx-table-row-bg: light-dark(#ffffff, #111114);--ngx-table-row-alt-bg: light-dark(#f9fafb, #17171b);--ngx-table-row-hover-bg: light-dark(#eef2ff, #1e1b4b);--ngx-table-text: light-dark(#1e293b, #e4e4e7);--ngx-table-radius: 12px;display:block;color:var(--ngx-table-text)}.ngx-table-wrapper{position:relative;border:1px solid var(--ngx-table-border);border-radius:var(--ngx-table-radius);overflow:hidden;background:var(--ngx-table-row-bg)}.ngx-table-scroll{overflow:auto;max-height:75vh}.ngx-table-scroll::-webkit-scrollbar{height:10px;width:10px}.ngx-table-scroll::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--ngx-table-border) 60%,gray);border-radius:8px}.ngx-table{display:flex;flex-direction:column;min-width:100%;width:max-content}.thead-mrs{display:flex;flex-direction:column;z-index:2}.thead-mrs--sticky{position:sticky;top:0}.tr-mrs{display:flex;align-items:stretch}.th-mrs,.td-mrs{position:relative;box-sizing:border-box;overflow:hidden;min-inline-size:0;border-bottom:1px solid var(--ngx-table-border);border-inline-end:1px solid var(--ngx-table-border)}.th-mrs:last-child,.td-mrs:last-child{border-inline-end:none}.th-mrs{display:flex;align-items:center;gap:.375rem;background:var(--ngx-table-header-bg);color:var(--ngx-table-header-fg);font-weight:600;font-size:.8125rem;letter-spacing:.02em;padding:.75rem 1rem;-webkit-user-select:none;user-select:none;white-space:nowrap;text-overflow:ellipsis}.th-mrs--sortable{cursor:pointer}.th-mrs--sortable:hover{color:var(--ngx-table-accent)}.th-mrs.operations{justify-content:center}.th-mrs__title{overflow:hidden;text-overflow:ellipsis}.sort-icon{width:.75rem;height:.75rem;flex:none;opacity:.4;display:inline-flex}.sort-icon svg{width:100%;height:100%}.sort-icon.active{opacity:1}.ngx-table__resize-handle,[ngxColumnResize]{position:absolute;top:0;bottom:0;inset-inline-end:-3px;width:6px;cursor:col-resize;touch-action:none;z-index:3}.ngx-table__resize-handle:hover,.ngx-table__resize-handle:active,[ngxColumnResize]:hover,[ngxColumnResize]:active{background:var(--ngx-table-accent);opacity:.5}.td-mrs{display:flex;align-items:center;padding:.75rem 1rem;font-size:.875rem}.td-mrs.operations{justify-content:center}.cel{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:.25rem}.cel.wrap{white-space:normal}.cell-title{display:none;font-weight:600;color:var(--ngx-table-header-fg)}.ngx-table--striped .tbody-mrs .tr-mrs:nth-child(2n){background:var(--ngx-table-row-alt-bg)}.ngx-table--hover .tbody-mrs .tr-mrs:hover{background:var(--ngx-table-row-hover-bg)}.tr-mrs{transition:background-color .15s ease}.no-data{padding:2.5rem 1rem;text-align:center;color:#94a3b8;font-size:.875rem}.loading-container{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--ngx-table-row-bg) 75%,transparent);-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px)}.loading{font-size:.875rem;color:var(--ngx-table-accent)}@media(max-width:768px){.ngx-table-scroll{overflow:visible;max-height:none}.ngx-table{width:100%}.thead-mrs{display:none}.tbody-mrs{display:flex;flex-direction:column;gap:.75rem;padding:.75rem}.tr-mrs{flex-direction:column;border:1px solid var(--ngx-table-border);border-radius:10px;overflow:hidden}.td-mrs{flex:1 1 auto!important;width:100%;border-inline-end:none;justify-content:space-between}.cel{justify-content:flex-end;white-space:normal;text-align:end}.cell-title{display:inline}}\n"] }]
|
|
656
656
|
}], ctorParameters: () => [], propDecorators: { fields: [{ type: i0.Input, args: [{ isSignal: true, alias: "fields", required: true }] }], data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: true }] }], totalRecords: [{ type: i0.Input, args: [{ isSignal: true, alias: "totalRecords", required: true }] }], showRecordNumber: [{ type: i0.Input, args: [{ isSignal: true, alias: "showRecordNumber", required: false }] }], operations: [{ type: i0.Input, args: [{ isSignal: true, alias: "operations", required: false }] }], operationWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "operationWidth", required: false }] }], numWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "numWidth", required: false }] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }], page: [{ type: i0.Input, args: [{ isSignal: true, alias: "page", required: false }] }], pageChange: [{ type: i0.Output, args: ["pageChange"] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], multiSort: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiSort", required: false }] }], lazy: [{ type: i0.Input, args: [{ isSignal: true, alias: "lazy", required: false }] }], resizable: [{ type: i0.Input, args: [{ isSignal: true, alias: "resizable", required: false }] }], trackBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "trackBy", required: false }] }], lazyLoad: [{ type: i0.Output, args: ["lazyLoad"] }], sortChange: [{ type: i0.Output, args: ["sortChange"] }], columnResize: [{ type: i0.Output, args: ["columnResize"] }], cellTemplates: [{
|
|
657
657
|
type: ContentChildren,
|
|
658
658
|
args: [TableCell]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-kit-data-table.mjs","sources":["../../../projects/libs/data-table/types/table-field.types.ts","../../../projects/libs/data-table/tokens/table-config.token.ts","../../../projects/libs/data-table/tokens/pagination-config.token.ts","../../../projects/libs/data-table/providers/provide-table.ts","../../../projects/libs/data-table/providers/provide-pagination.ts","../../../projects/libs/data-table/directives/table-cell.directive.ts","../../../projects/libs/data-table/directives/column-resize.directive.ts","../../../projects/libs/data-table/components/pagination/pagination.ts","../../../projects/libs/data-table/components/pagination/pagination.html","../../../projects/libs/data-table/components/table/table.ts","../../../projects/libs/data-table/components/table/table.html","../../../projects/libs/data-table/public-api.ts","../../../projects/libs/data-table/ngx-kit-data-table.ts"],"sourcesContent":["import { InputSignal, TemplateRef, Type } from '@angular/core';\n\n// ----------------------------------------------------------------------------\n// قرارداد پایهای که هر کامپوننت رندرر باید پیادهسازی کند.\n// value/row/field همیشه توسط جدول پر میشوند؛ هر ورودی دیگری که renderer\n// اضافه کند (مثل nameField در AvatarCellRenderer) بهصورت خودکار استخراج و\n// در rendererInputs همان ستون در دسترس/چک میشود.\n// ----------------------------------------------------------------------------\nexport interface CellRendererComponent<TValue = unknown, TRow extends object = object> {\n value: InputSignal<TValue>;\n row: InputSignal<TRow>;\n field: InputSignal<TableFieldBase<TRow>>;\n}\n\nexport type RendererRegistry = Readonly<Record<string, Type<CellRendererComponent<any, any>>>>;\n\n/**\n * Identity helper: یک رجیستری رندرر را با inference کامل تعریف میکند.\n * همین آبجکت باید هم در provideTable({ renderers }) و هم در defineFields(renderers, ...)\n * استفاده شود تا کلیدها (و ورودیهای اضافهی هر رندرر) در کل پروژه type-check شوند.\n */\nexport function defineRenderers<R extends RendererRegistry>(registry: R): R {\n return registry;\n}\n\n// ----------------------------------------------------------------------------\n// استخراج ورودیهای اضافهی هر رندرر مستقیماً از روی خودِ کلاس کامپوننت، بدون\n// اینکه کاربر مجبور باشد آنها را جای دیگری دوباره تایپ کند.\n// نکته: فقط اعضای «public» و «قابل فراخوانی بدون آرگومان» (شکل InputSignal/Signal)\n// در نظر گرفته میشوند؛ اعضای protected/private بهطور خودکار (توسط خودِ\n// TypeScript) از keyof حذف میشوند. توصیه: هر computed/derived داخلی در\n// کامپوننتهای رندرر را protected تعریف کنید تا اشتباهاً بهعنوان ورودی قابل\n// تنظیم دیده نشود. متدهای عمومی بدون آرگومان (نادر) هم میتوانند اشتباهاً در\n// این استخراج ظاهر شوند؛ چنین متدهایی را protected/private کنید.\n// ----------------------------------------------------------------------------\ntype InstanceOf<C> = C extends Type<infer I> ? I : never;\ntype UnwrapSignal<S> = S extends () => infer V ? V : never;\n\nexport type RendererExtraInputs<C extends Type<any>> = {\n [\n K in keyof InstanceOf<C> as K extends 'value' | 'row' | 'field'\n ? never\n : InstanceOf<C>[K] extends () => any\n ? K\n : never\n ]?: UnwrapSignal<InstanceOf<C>[K]>;\n};\n\n// ----------------------------------------------------------------------------\n// تعریف ستونها\n// ----------------------------------------------------------------------------\nexport type ColumnAlign = 'start' | 'center' | 'end';\n\nexport type TableCellFormatter<T extends object = object> = (\n value: any,\n row: T,\n field: TableFieldBase<T>,\n) => any;\n\nexport interface CellTemplateContext<T extends object> {\n $implicit: T;\n row: T;\n value: unknown;\n rowIndex: number;\n field: TableFieldBase<T>;\n}\n\n/** شکل پایهای مشترک بین همهی ستونها، صرفنظر از اینکه renderer دارند یا نه. */\nexport interface TableFieldBase<T extends object> {\n column: Extract<keyof T, string>;\n title: string;\n /**\n * عرضِ این ستون. عدد یعنی پیکسل (`160` = `160px`)؛ رشته یعنی هر مقدار\n * معتبرِ CSS length برای flex-basis (`'20%'`, `'12rem'`, ...). اگه اصلاً\n * ندید، این ستون flex میشه (`flex: 1 1 0`) و فضای باقیموندهی جدول رو پر\n * میکنه — دقیقاً برخلافِ ستونهایی که width دارن (که `flex: 0 0 <width>`\n * میگیرن و ثابت میمونن).\n */\n width?: number | string;\n minWidth?: number;\n maxWidth?: number;\n resizable?: boolean;\n sortable?: boolean;\n wrap?: boolean;\n align?: ColumnAlign;\n prefix?: string;\n formatter?: string | TableCellFormatter<T>;\n}\n\n/** ستون بدون renderer (متن ساده / formatter / cellTemplate دستی). */\nexport interface PlainTableField<T extends object> extends TableFieldBase<T> {\n renderer?: undefined;\n rendererInputs?: undefined;\n cellTemplate?: TemplateRef<CellTemplateContext<T>>;\n}\n\n/** ستونی که یک renderer از رجیستری R انتخاب کرده؛ rendererInputs دقیقاً همان\n * ورودیهای اضافهی همان renderer است — نه یک Record<string, unknown> آزاد. */\nexport type RenderedTableField<T extends object, R extends RendererRegistry> = {\n [K in keyof R]: TableFieldBase<T> & {\n renderer: K;\n rendererInputs?: RendererExtraInputs<R[K]>;\n cellTemplate?: undefined;\n };\n}[keyof R];\n\nexport type TableField<T extends object, R extends RendererRegistry = {}> =\n PlainTableField<T> | RenderedTableField<T, R>;\n\n/**\n * Identity helper برای تعریف ستونهای یک جدول با inference و type-check کامل\n * نسبت به هم مدل داده (T) و هم رجیستری رندررها (R).\n *\n * @example\n * const renderers = defineRenderers({ avatar: AvatarCellRenderer, boolean: BooleanCellRenderer });\n *\n * const fields = defineFields<Tenant, typeof renderers>(renderers, [\n * { column: 'avatarUrl', title: 'کاربر', renderer: 'avatar', rendererInputs: { showName: true } }, // ✅\n * { column: 'avatarUrl', title: 'کاربر', renderer: 'avatar', rendererInputs: { showName: 'x' } }, // ❌ باید boolean باشد\n * { column: 'isActive', title: 'فعال', renderer: 'bool' }, // ❌ کلید رجیستری نیست\n * { column: 'ageXYZ', title: '...' }, // ❌ فیلد Tenant نیست\n * ]);\n */\nexport function defineFields<T extends object, R extends RendererRegistry = {}>(\n _renderers: R,\n fields: TableField<T, R>[],\n): TableField<T, R>[] {\n return fields;\n}\n","import { InjectionToken } from '@angular/core';\nimport { ResolvedTableOptions } from '../types/table-options.types';\n\nexport const NGX_TABLE_CONFIG_DEFAULT: ResolvedTableOptions = {\n showRecordNumber: false,\n hoverable: true,\n multiSort: true,\n resizable: true,\n stickyHeader: true,\n stripedRows: true,\n column: { minWidth: 60, maxWidth: 600, defaultWidth: 150 },\n labels: {\n noData: 'There is no data to display!',\n loading: 'Loading...',\n operation: 'Operation',\n },\n renderers: {},\n formatters: {},\n lazy: false,\n};\n\n/** به هر نمونهی ngx-table تزریق میشود. با provideTable() مقداردهی کنید. */\nexport const NGX_TABLE_CONFIG = new InjectionToken<ResolvedTableOptions>('ngx-table-config', {\n factory: () => NGX_TABLE_CONFIG_DEFAULT,\n});\n","import { InjectionToken } from '@angular/core';\nimport { NgxPaginationOptions } from '../types/pagination.types';\n\nexport const NGX_PAGINATION_CONFIG_DEFAULT: NgxPaginationOptions = {\n defaultPageSize: 10,\n pageSizeOptions: [5, 10, 20, 30, 50, 100],\n labels: {\n first: 'First',\n last: 'Last',\n next: 'Next',\n previous: 'Previous',\n showing: 'Showing',\n to: 'to',\n of: 'of',\n results: 'results',\n pageSize: 'Page Size',\n },\n};\n\nexport const NGX_PAGINATION_CONFIG = new InjectionToken<NgxPaginationOptions>(\n 'ngx-pagination-config',\n {\n factory: () => NGX_PAGINATION_CONFIG_DEFAULT,\n },\n);\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { NGX_TABLE_CONFIG, NGX_TABLE_CONFIG_DEFAULT } from '../tokens/table-config.token';\nimport { NgxTableOptions, ResolvedTableOptions } from '../types/table-options.types';\n\nfunction mergeTableConfig(\n base: ResolvedTableOptions,\n override?: NgxTableOptions,\n): ResolvedTableOptions {\n if (!override) return base;\n return {\n ...base,\n ...override,\n column: { ...base.column, ...override.column },\n labels: { ...base.labels, ...override.labels },\n renderers: { ...base.renderers, ...override.renderers },\n formatters: { ...base.formatters, ...override.formatters },\n };\n}\n\n/**\n * کانفیگ سراسری <ngx-table>: جهت پیشفرض، حداقل/حداکثر عرض ستون، فعال بودن\n * پیشفرض سورت چندستونه، و از همه مهمتر رجیستری رندررها.\n *\n * @example\n * provideTable({\n * renderers: defineRenderers({ avatar: AvatarCellRenderer, boolean: BooleanCellRenderer }),\n * column: { minWidth: 80, maxWidth: 480, defaultWidth: 160 },\n * })\n */\nexport function provideTable(options?: NgxTableOptions): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: NGX_TABLE_CONFIG, useValue: mergeTableConfig(NGX_TABLE_CONFIG_DEFAULT, options) },\n ]);\n}\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport {\n NGX_PAGINATION_CONFIG,\n NGX_PAGINATION_CONFIG_DEFAULT,\n} from '../tokens/pagination-config.token';\nimport { NgxPaginationOptions } from '../types/pagination.types';\n\nfunction mergePaginationConfig(\n base: NgxPaginationOptions,\n override?: Partial<NgxPaginationOptions>,\n): NgxPaginationOptions {\n if (!override) return base;\n return {\n ...base,\n ...override,\n labels: { ...base.labels, ...override.labels },\n };\n}\n\nexport function providePagination(options?: Partial<NgxPaginationOptions>): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: NGX_PAGINATION_CONFIG,\n useValue: mergePaginationConfig(NGX_PAGINATION_CONFIG_DEFAULT, options),\n },\n ]);\n}\n","import { Directive, inject, input, TemplateRef } from '@angular/core';\nimport { CellTemplateContext } from '../types/table-field.types';\n\n/**\n * برای projection قالب سفارشی یک ستون بدون اینکه مجبور باشید cellTemplate را\n * از طریق ViewChild به آبجکت ستون وصل کنید:\n *\n * <ngx-table [fields]=\"fields\" [data]=\"rows()\">\n * <ng-template ngxTableCell=\"userName\" let-row let-value=\"value\">\n * <strong>{{ value }}</strong>\n * </ng-template>\n * </ngx-table>\n *\n * مهم: چون این دایرکتیو در تمپلیت *کامپوننت مصرفکننده* (نه ngx-table) استفاده\n * میشود، باید آن را در آرایهی imports همان کامپوننت (standalone) وارد کنید:\n * imports: [NgxTable, TableCell]\n *\n * محدودیت شناختهشده: context این تمپلیت (row/value) از نوع T دقیق نیست\n * (چون TemplateRef اینجا بهصورت پویا از ContentChildren جمعآوری میشود و\n * اطلاعات جنریک T در آن نقطه از بین میرود). برای type-safety کامل روی\n * row/value، از field.cellTemplate به همراه @ViewChild استفاده کنید (به README\n * بخش «Cell Template کاملاً Type-Safe» مراجعه کنید).\n */\n@Directive({\n selector: 'ng-template[ngxTableCell]',\n standalone: true,\n})\nexport class TableCell<T extends object = object> {\n readonly column = input.required<string>({ alias: 'ngxTableCell' });\n readonly templateRef = inject(TemplateRef<CellTemplateContext<T>>);\n}\n","import { Directive, ElementRef, HostListener, inject, input, output } from '@angular/core';\n\n/**\n * دستگیرهی درگ برای ریسایز ستون. روی لبهی «انتهای منطقی» (inline-end) قرار\n * میگیرد، یعنی خودش زیر [dir=\"rtl\"] جابهجا میشود؛ فقط جهت محاسبهی دلتا هم\n * برعکس میشود تا حس درگ همیشه طبیعی باشد.\n *\n * مقدار نهایی توسط جدول در یک Map از عرضها ذخیره میشود (نه در استایل مستقیم\n * ستون)، به همراه علامتگذاری «دستی ریسایز شده» — یعنی بعد از این، هیچ\n * re-render یا تغییر دادهای این عرض را از بین نمیبرد.\n */\n@Directive({\n selector: '[ngxColumnResize]',\n standalone: true,\n host: {\n class: 'ngx-table__resize-handle',\n role: 'separator',\n 'aria-orientation': 'vertical',\n },\n})\nexport class ColumnResize {\n readonly startWidth = input.required<number>({ alias: 'ngxColumnResizeWidth' });\n readonly minWidth = input<number>(40, { alias: 'ngxColumnResizeMin' });\n readonly maxWidth = input<number>(1000, { alias: 'ngxColumnResizeMax' });\n readonly direction = input<'ltr' | 'rtl'>('ltr', { alias: 'ngxColumnResizeDir' });\n\n readonly resizing = output<number>();\n readonly resizeEnd = output<number>();\n\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n\n private dragging = false;\n private startX = 0;\n private baseWidth = 0;\n\n @HostListener('pointerdown', ['$event'])\n onPointerDown(event: PointerEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.dragging = true;\n this.startX = event.clientX;\n // اندازهی واقعیِ رندرشدهی ستون رو میگیریم، نه فقط input ورودی — چون\n // ستونهایی که width صریح ندارن (flex:1 1 0، فضای باقیمونده رو پر\n // میکنن) هیچ عرض عددیِ ازپیششناختهشدهای ندارن؛ تنها منبع درستِ\n // «عرض فعلی» برای شروع محاسبهی درگ، خودِ DOM هست.\n const measured = this.elementRef.nativeElement.parentElement?.getBoundingClientRect().width;\n this.baseWidth = measured && measured > 0 ? measured : this.startWidth();\n (event.target as HTMLElement).setPointerCapture(event.pointerId);\n }\n\n @HostListener('pointermove', ['$event'])\n onPointerMove(event: PointerEvent): void {\n if (!this.dragging) return;\n this.resizing.emit(this.computeWidth(event.clientX));\n }\n\n @HostListener('pointerup', ['$event'])\n @HostListener('pointercancel', ['$event'])\n onPointerUp(event: PointerEvent): void {\n if (!this.dragging) return;\n this.dragging = false;\n this.resizeEnd.emit(this.computeWidth(event.clientX));\n }\n\n private computeWidth(clientX: number): number {\n const delta = clientX - this.startX;\n const signedDelta = this.direction() === 'rtl' ? -delta : delta;\n const raw = this.baseWidth + signedDelta;\n return Math.min(this.maxWidth(), Math.max(this.minWidth(), raw));\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { NGX_PAGINATION_CONFIG } from '../../tokens/pagination-config.token';\nimport { PageEvent } from '../../types/page.types';\n\n@Component({\n selector: 'ngx-pagination',\n standalone: true,\n templateUrl: './pagination.html',\n styleUrl: './pagination.scss',\n imports: [FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgxPagination {\n protected readonly config = inject(NGX_PAGINATION_CONFIG);\n\n readonly total = input.required<number>();\n\n readonly page = model(1);\n readonly pageSize = model(this.config.defaultPageSize);\n\n readonly pageSizeOptions = input(this.config.pageSizeOptions);\n readonly labels = input(this.config.labels);\n readonly siblingCount = input(1);\n readonly boundaryCount = input(1);\n\n readonly paginate = output<PageEvent>();\n\n protected readonly totalPages = computed(() =>\n Math.max(1, Math.ceil(this.total() / this.pageSize())),\n );\n\n protected readonly firstItem = computed(() =>\n this.total() === 0 ? 0 : (this.page() - 1) * this.pageSize() + 1,\n );\n\n protected readonly lastItem = computed(() =>\n Math.min(this.firstItem() + this.pageSize() - 1, this.total()),\n );\n\n protected readonly pages = computed(() =>\n this.buildPages(this.page(), this.totalPages(), this.siblingCount(), this.boundaryCount()),\n );\n\n constructor() {\n // هر تغییری در page/pageSize را برای مصرفکننده امیت کن.\n effect(() => {\n this.paginate.emit({ page: this.page(), pageSize: this.pageSize() });\n });\n\n // اگر بعد از کوچکشدن total، صفحهی جاری خارج از بازه افتاد، اصلاحش کن.\n effect(() => {\n const max = this.totalPages();\n if (this.page() > max) this.page.set(max);\n });\n }\n\n private buildPages(\n current: number,\n total: number,\n sibling = 1,\n boundary = 1,\n ): (number | string)[] {\n const range = (start: number, end: number) =>\n Array.from({ length: end - start + 1 }, (_, i) => start + i);\n\n const totalNumbers = sibling * 2 + boundary * 2 + 3;\n if (total <= totalNumbers) return range(1, total);\n\n const leftSibling = Math.max(current - sibling, boundary + 2);\n const rightSibling = Math.min(current + sibling, total - boundary - 1);\n const showLeftDots = leftSibling > boundary + 2;\n const showRightDots = rightSibling < total - boundary - 1;\n\n const pages: (number | string)[] = [];\n pages.push(...range(1, boundary));\n if (showLeftDots) pages.push('...');\n else pages.push(...range(boundary + 1, leftSibling - 1));\n pages.push(...range(leftSibling, rightSibling));\n if (showRightDots) pages.push('...');\n else pages.push(...range(rightSibling + 1, total - boundary));\n pages.push(...range(total - boundary + 1, total));\n return pages;\n }\n\n protected next(): void {\n this.page.update((p) => Math.min(p + 1, this.totalPages()));\n }\n protected previous(): void {\n this.page.update((p) => Math.max(1, p - 1));\n }\n protected first(): void {\n this.page.set(1);\n }\n protected last(): void {\n this.page.set(this.totalPages());\n }\n protected goto(page: number): void {\n if (typeof page !== 'number' || Number.isNaN(page)) return;\n this.page.set(page);\n }\n protected onPageSizeChange(value: number): void {\n this.pageSize.set(Number(value));\n this.page.set(1);\n }\n}\n","<nav class=\"ngx-pagination\">\n <div class=\"ngx-pagination__summary\">\n {{ labels().showing }}\n <span class=\"fw-semibold\">{{ firstItem() }}</span>\n {{ labels().to }}\n <span class=\"fw-semibold\">{{ lastItem() }}</span>\n {{ labels().of }}\n <span class=\"fw-semibold\">{{ total() }}</span>\n {{ labels().results }}\n </div>\n\n <div class=\"ngx-pagination__controls\">\n <ul class=\"ngx-pagination__list\">\n <li [class.disabled]=\"page() === 1\" [title]=\"labels().first\">\n <a (click)=\"first()\" class=\"icon\">«</a>\n </li>\n <li [class.disabled]=\"page() === 1\" [title]=\"labels().previous\">\n <a (click)=\"previous()\" class=\"icon\">‹</a>\n </li>\n\n @for (item of pages(); track $index) {\n <li class=\"ngx-pagination__page-num\" [class.active]=\"item === page()\">\n @if (item !== page() && item !== '...') {\n <a (click)=\"goto(+item)\">{{ item }}</a>\n }\n @if (item === page() || item === '...') {\n <span>{{ item }}</span>\n }\n </li>\n }\n\n <li [class.disabled]=\"page() === totalPages()\" [title]=\"labels().next\">\n <a (click)=\"next()\" class=\"icon\">›</a>\n </li>\n <li [class.disabled]=\"page() === totalPages()\" [title]=\"labels().last\">\n <a (click)=\"last()\" class=\"icon\">»</a>\n </li>\n </ul>\n\n <div class=\"ngx-pagination__page-size\">\n <span>{{ labels().pageSize }}:</span>\n <select [ngModel]=\"pageSize()\" (ngModelChange)=\"onPageSizeChange($event)\">\n @for (opt of pageSizeOptions(); track opt) {\n <option [value]=\"opt\" [selected]=\"opt === pageSize()\">{{ opt }}</option>\n }\n </select>\n </div>\n </div>\n</nav>\n","import { CommonModule } from '@angular/common';\nimport {\n AfterContentInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n ContentChildren,\n DestroyRef,\n DOCUMENT,\n effect,\n inject,\n input,\n OnInit,\n output,\n QueryList,\n signal,\n TemplateRef,\n Type,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { TableCell } from '../../directives/table-cell.directive';\nimport { ColumnResize } from '../../directives/column-resize.directive';\nimport { NGX_TABLE_CONFIG } from '../../tokens/table-config.token';\nimport { NGX_PAGINATION_CONFIG } from '../../tokens/pagination-config.token';\nimport { PageEvent, LazyLoadEvent } from '../../types/page.types';\nimport { SortDirection, SortMeta } from '../../types/sort.types';\nimport {\n CellRendererComponent,\n CellTemplateContext,\n TableField,\n} from '../../types/table-field.types';\nimport { NgxPagination } from '../pagination/pagination';\nimport { DirectionService } from 'ngx-kit/shared';\n\n/**\n * جدول دادهی جنریک و Type-Safe.\n *\n * `T` از روی چیزی که به [data] بایند میکنید استنتاج میشود؛ `field.column` در\n * `TableField<T, R>` محدود به `keyof T` است، و اگر از defineFields(renderers, ...)\n * استفاده کنید، `field.renderer` محدود به کلیدهای رجیستری و `rendererInputs`\n * دقیقاً همان ورودیهای اضافهی همان renderer است.\n *\n * دو حالت:\n * - کلاینتساید (پیشفرض): [data] کل آرایه است؛ سورت/صفحهبندی داخلی و روی\n * یک computed خالص انجام میشود (بدون mutation روی آبجکتهای شما).\n * - lazy: [lazy]=\"true\" + [totalRecords]؛ [data] فقط صفحهی جاری است؛ به\n * (lazyLoad) گوش بدهید.\n */\n@Component({\n selector: 'ngx-table',\n standalone: true,\n templateUrl: './table.html',\n styleUrl: './table.scss',\n imports: [CommonModule, NgxPagination, ColumnResize],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ngx-table-host',\n },\n})\nexport class NgxTable<T extends object> implements OnInit, AfterContentInit {\n protected readonly config = inject(NGX_TABLE_CONFIG);\n protected readonly paginationConfig = inject(NGX_PAGINATION_CONFIG);\n\n // ---------------------------------------------------------------- inputs\n readonly fields = input.required<TableField<T, any>[]>();\n readonly data = input.required<readonly T[]>();\n readonly totalRecords = input.required<number>();\n readonly showRecordNumber = input(this.config.showRecordNumber);\n readonly operations = input<TemplateRef<{ $implicit: T }>>();\n readonly operationWidth = input(80);\n readonly numWidth = input(80);\n readonly pageSize = input(this.paginationConfig.defaultPageSize);\n readonly page = input(1);\n readonly pageChange = output<number>();\n readonly loading = input(false);\n readonly multiSort = input<boolean | undefined>(undefined);\n readonly lazy = input(this.config.lazy);\n readonly resizable = input(this.config.resizable);\n /** پیشفرض بر اساس ایندکس؛ برای جلوگیری از گمشدن state سطرها هنگام سورت،\n * یک شناسهی یکتا بدهید: [trackBy]=\"(i, row) => row.id\" */\n readonly trackBy = input<(index: number, row: T) => unknown>((index) => index);\n\n // --------------------------------------------------------------- outputs\n readonly lazyLoad = output<LazyLoadEvent<T>>();\n readonly sortChange = output<SortMeta<T>[]>();\n readonly columnResize = output<{ field: string; width: number }>();\n\n // ------------------------------------------------------------ int. state\n protected readonly pageIndex = signal(1);\n protected readonly pageSizeS = signal(this.paginationConfig.defaultPageSize);\n protected readonly sorts = signal<SortMeta<T>[]>([]);\n protected readonly widths = signal<Record<string, number>>({});\n private readonly manuallyResized = new Set<string>();\n private readonly rendererInputsCache = new Map<\n TableField<T, any>,\n WeakMap<T, Record<string, unknown>>\n >();\n\n @ContentChildren(TableCell) private cellTemplates!: QueryList<TableCell<T>>;\n private templateMap = new Map<string, TemplateRef<CellTemplateContext<T>>>();\n\n protected readonly resolvedMultiSort = computed(() => this.multiSort() ?? this.config.multiSort);\n private readonly directionService = inject(DirectionService);\n private readonly destroyRef = inject(DestroyRef);\n protected readonly resolvedDirection = computed(() => this.directionService.direction());\n constructor() {\n effect(() => {\n const ps = this.pageSize();\n this.pageSizeS.set(ps);\n const pi = this.page();\n this.pageIndex.set(pi);\n });\n\n // برای هر ستونِ تازهدیدهشده که width عددیِ صریح دارد، یک عرض seed کن؛\n // ستونهایی که کاربر دستی ریسایز کرده دیگر هیچوقت دوباره نوشته نمیشوند.\n // مهم: ستونهایی که اصلاً width ندارند (یا width رشتهای مثل '20%' دارند)\n // عمداً اینجا seed نمیشوند — قبلاً همهی ستونها با یک defaultWidth ثابت\n // seed میشدند که باعث میشد جدول با flex:0 0 روی هر ستون هیچوقت واقعاً\n // 100% عرض رو پر نکنه، حتی وقتی کاربر عمداً یک ستون رو بدون width گذاشته\n // بود تا فضای باقیمونده رو خودش پر کنه.\n effect(() => {\n const cols = this.fields();\n const current = this.widths();\n let changed = false;\n const next = { ...current };\n for (const f of cols) {\n if (this.manuallyResized.has(f.column)) continue;\n if (f.column in next) continue;\n if (typeof f.width === 'number') {\n next[f.column] = f.width;\n changed = true;\n }\n }\n if (changed) this.widths.set(next);\n });\n }\n\n ngOnInit(): void {\n // نیاز به این نیست در لود خود صفحه بندی paginate را صدا میزند\n // if (this.lazy()) {\n // this.lazyLoad.emit({ first: 0, pageIndex: 1, pageSize: this.pageSizeS(), sorts: [] });\n // }\n }\n\n ngAfterContentInit(): void {\n this.syncTemplateMap();\n // این Observable خودش کامل نمیشه (EventEmitter سادهست، نه یه stream که\n // روی destroy کامپوننت تموم بشه)؛ بدون takeUntilDestroyed، این subscribe\n // برای همیشه فعال میموند و رفرنس کامپوننت رو زنده نگه میداشت.\n this.cellTemplates.changes\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.syncTemplateMap());\n }\n\n private syncTemplateMap(): void {\n this.templateMap.clear();\n this.cellTemplates.forEach((cell) => {\n // نکتهی مهم: cell.column() باید فراخوانی شود (سیگنال است)، نه cell.column.name.\n this.templateMap.set(cell.column(), cell.templateRef);\n });\n }\n\n // ------------------------------------------------------------- دادهها\n protected readonly sortedData = computed<readonly T[]>(() => {\n if (this.lazy()) return this.data();\n const sorts = this.sorts();\n if (sorts.length === 0) return this.data();\n const copy = [...this.data()];\n copy.sort((a, b) => {\n for (const s of sorts) {\n const cmp = this.compare(a[s.field], b[s.field]);\n if (cmp !== 0) return s.direction === 'asc' ? cmp : -cmp;\n }\n return 0;\n });\n return copy;\n });\n\n protected readonly totalCount = computed(() =>\n this.lazy() ? this.totalRecords() : this.data().length,\n );\n\n protected readonly pagedData = computed<readonly T[]>(() => {\n if (this.lazy()) return this.sortedData();\n const start = (this.pageIndex() - 1) * this.pageSizeS();\n return this.sortedData().slice(start, start + this.pageSizeS());\n });\n\n private compare(a: unknown, b: unknown): number {\n if (a == null && b == null) return 0;\n if (a == null) return -1;\n if (b == null) return 1;\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n if (typeof a === 'boolean' && typeof b === 'boolean') return a === b ? 0 : a ? 1 : -1;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n return String(a).localeCompare(String(b));\n }\n\n /** بدون mutation روی دادهی ورودی: شمارهی ردیف صرفاً از روی page/pageSize/rowIndex محاسبه میشود. */\n protected recordNumber(rowIndex: number): number {\n return (this.pageIndex() - 1) * this.pageSizeS() + rowIndex + 1;\n }\n\n // -------------------------------------------------------------- سورت\n protected sortDirectionFor(column: string): SortDirection | null {\n return this.sorts().find((s) => s.field === column)?.direction ?? null;\n }\n\n protected onHeaderClick(field: TableField<T, any>, event: MouseEvent): void {\n if (!field.sortable) return;\n const column = field.column;\n const current = this.sorts();\n const existingIndex = current.findIndex((s) => s.field === column);\n const isMultiGesture =\n this.resolvedMultiSort() && (event.shiftKey || event.ctrlKey || event.metaKey);\n\n let next: SortMeta<T>[];\n if (isMultiGesture) {\n next = [...current];\n if (existingIndex === -1) {\n next.push({ field: column, direction: 'asc' });\n } else if (next[existingIndex].direction === 'asc') {\n next[existingIndex] = { field: column, direction: 'desc' };\n } else {\n next.splice(existingIndex, 1);\n }\n } else if (existingIndex === -1 || current.length > 1) {\n next = [{ field: column, direction: 'asc' }];\n } else if (current[0].direction === 'asc') {\n next = [{ field: column, direction: 'desc' }];\n } else {\n next = [];\n }\n\n this.sorts.set(next);\n this.pageIndex.set(1);\n this.pageChange.emit(this.pageIndex());\n this.sortChange.emit(next);\n this.emitLazyIfNeeded();\n }\n\n // ------------------------------------------------------------ صفحهبندی\n protected onPaginate(event: PageEvent): void {\n this.pageIndex.set(event.page);\n this.pageSizeS.set(event.pageSize);\n this.pageChange.emit(this.pageIndex());\n this.emitLazyIfNeeded();\n }\n\n private emitLazyIfNeeded(): void {\n if (!this.lazy()) return;\n const pageIndex = this.pageIndex();\n const pageSize = this.pageSizeS();\n this.lazyLoad.emit({\n pageIndex,\n pageSize,\n first: (pageIndex - 1) * pageSize,\n sorts: this.sorts(),\n sorting: this.sorts()\n ?.map((s) => `${s.field} ${s.direction}`)\n .join(','),\n });\n }\n\n // -------------------------------------------------------------- ریسایز\n protected columnWidth(column: string): number {\n return this.widths()[column] ?? this.config.column.defaultWidth;\n }\n /**\n * مقدار CSS `flex` واقعیِ این ستون:\n * - اگه دستی ریسایز شده یا width عددی داره → `0 0 <px>` (ثابت، بدون رشد/کوچکشدن)\n * - اگه width رشتهای داره (مثلاً '20%') → `0 0 <رشته>` (ثابت، هر واحد CSS معتبری)\n * - اگه اصلاً width نداره → `1 1 0` (رشد میکنه تا فضای باقیموندهی جدول رو پر کنه)\n */\n protected columnFlex(field: TableField<T, any>): string {\n const resized = this.widths()[field.column];\n if (resized != null) return `0 0 ${resized}px`;\n if (typeof field.width === 'string') return `0 0 ${field.width}`;\n return '1 1 0';\n }\n protected columnMin(field: TableField<T, any>): number {\n return field.minWidth ?? this.config.column.minWidth;\n }\n protected columnMax(field: TableField<T, any>): number {\n return field.maxWidth ?? this.config.column.maxWidth;\n }\n protected isResizable(field: TableField<T, any>): boolean {\n return (field.resizable ?? this.resizable()) !== false;\n }\n protected onColumnResizing(column: string, width: number): void {\n this.widths.update((w) => ({ ...w, [column]: width }));\n }\n protected onColumnResizeEnd(column: string, width: number): void {\n this.manuallyResized.add(column);\n this.widths.update((w) => ({ ...w, [column]: width }));\n this.columnResize.emit({ field: column, width });\n }\n\n // --------------------------------------------------------------- سلولها\n protected getTemplate(column: string): TemplateRef<CellTemplateContext<T>> | null {\n const fromDirective = this.templateMap.get(column);\n if (fromDirective) return fromDirective;\n\n const fromFieldConfig = this.fields().find((f) => f.column === column)?.cellTemplate;\n return fromFieldConfig ?? null;\n }\n\n protected getRenderer(field: TableField<T, any>): Type<CellRendererComponent> | null {\n if (!field.renderer) return null;\n // نکته: نوع دقیق field.renderer (که به کلیدهای رجیستری محدود است) در\n // defineFields() چک میشود؛ اینجا فقط یک lookup رانتایم ساده لازم است.\n return this.config.renderers[field.renderer as string] ?? null;\n }\n\n protected getCellValue(row: T, field: TableField<T, any>): unknown {\n return row[field.column];\n }\n\n protected formatCellValue(row: T, field: TableField<T, any>): string {\n const value = this.getCellValue(row, field);\n\n if (typeof field.formatter === 'function') {\n return this.stringify(field.formatter(value, row, field));\n }\n if (typeof field.formatter === 'string') {\n const formatter = this.config.formatters[field.formatter];\n if (formatter) return this.stringify(formatter(value, row, field));\n }\n return this.stringify(value);\n }\n\n private stringify(value: unknown): string {\n return value == null ? '' : String(value);\n }\n\n /** ورودیهای renderer را بهازای هر (field, row) کش میکند تا هر Change\n * Detection یک آبجکت جدید ساخته نشود؛ با WeakMap، وقتی row از حافظه خارج\n * شود (مثلاً بعد از عوضشدن صفحه)، entry آن هم خودکار پاک میشود. */\n protected getRendererInputs(row: T, field: TableField<T, any>): Record<string, unknown> {\n let fieldCache = this.rendererInputsCache.get(field);\n if (!fieldCache) {\n fieldCache = new WeakMap();\n this.rendererInputsCache.set(field, fieldCache);\n }\n let inputs = fieldCache.get(row);\n if (!inputs) {\n inputs = {\n value: this.getCellValue(row, field),\n row,\n field,\n ...(field.renderer ? field.rendererInputs : undefined),\n };\n fieldCache.set(row, inputs);\n }\n return inputs;\n }\n}\n","<div class=\"ngx-table-wrapper\" [class.ngx-table--loading]=\"loading()\">\n <div class=\"ngx-table-scroll\">\n <div\n class=\"ngx-table\"\n [class.ngx-table--striped]=\"config.stripedRows\"\n [class.ngx-table--hover]=\"config.hoverable\"\n role=\"table\">\n <div class=\"thead-mrs\" [class.thead-mrs--sticky]=\"config.stickyHeader\" role=\"rowgroup\">\n <div class=\"tr-mrs\" role=\"row\">\n @if (operations()) {\n <div\n class=\"th-mrs operations\"\n role=\"columnheader\"\n [style.flex]=\"'0 0 ' + operationWidth() + 'px'\">\n {{ config.labels.operation }}\n </div>\n }\n @if (showRecordNumber()) {\n <div\n class=\"th-mrs operations\"\n role=\"columnheader\"\n [style.flex]=\"'0 0 ' + numWidth() + 'px'\">\n #\n </div>\n }\n\n @for (f of fields(); track f.column) {\n <div\n class=\"th-mrs\"\n role=\"columnheader\"\n [class.th-mrs--sortable]=\"f.sortable\"\n [style.flex]=\"columnFlex(f)\"\n [attr.aria-sort]=\"\n sortDirectionFor(f.column) === 'asc'\n ? 'ascending'\n : sortDirectionFor(f.column) === 'desc'\n ? 'descending'\n : null\n \"\n (click)=\"onHeaderClick(f, $event)\">\n <span class=\"th-mrs__title\">{{ f.title }}</span>\n\n @if (f.sortable) {\n <span class=\"sort-icon\" [class.active]=\"sortDirectionFor(f.column) !== null\">\n @if (sortDirectionFor(f.column) === 'asc') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\n <path\n fill=\"currentColor\"\n d=\"M182.6 41.4c-12.5-12.5-32.8-12.5-45.3 0l-128 128c-9.2 9.2-11.9 22.9-6.9 34.9s16.6 19.8 29.6 19.8H96V448c0 17.7 14.3 32 32 32s32-14.3 32-32V224h64c12.9 0 24.6-7.8 29.6-19.8s2.2-25.7-6.9-34.9l-128-128z\" />\n </svg>\n } @else if (sortDirectionFor(f.column) === 'desc') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\n <path\n fill=\"currentColor\"\n d=\"M137.4 470.6c12.5 12.5 32.8 12.5 45.3 0l128-128c9.2-9.2 11.9-22.9 6.9-34.9s-16.6-19.8-29.6-19.8H224V64c0-17.7-14.3-32-32-32s-32 14.3-32 32V288H96c-12.9 0-24.6 7.8-29.6 19.8s-2.2 25.7 6.9 34.9l128 128z\" />\n </svg>\n } @else {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\n <path\n fill=\"currentColor\"\n d=\"M137.4 41.4c12.5-12.5 32.8-12.5 45.3 0l96 96c9.2 9.2 11.9 22.9 6.9 34.9s-16.6 19.8-29.6 19.8H224v96c0 17.7-14.3 32-32 32s-32-14.3-32-32V192H96c-12.9 0-24.6-7.8-29.6-19.8s-2.3-25.7 6.9-34.9l96-96zM32 400c0-17.7 14.3-32 32-32H256c17.7 0 32 14.3 32 32s-14.3 32-32 32H64c-17.7 0-32-14.3-32-32z\"\n opacity=\".35\" />\n </svg>\n }\n </span>\n }\n\n @if (isResizable(f)) {\n <span\n ngxColumnResize\n [ngxColumnResizeWidth]=\"columnWidth(f.column)\"\n [ngxColumnResizeMin]=\"columnMin(f)\"\n [ngxColumnResizeMax]=\"columnMax(f)\"\n [ngxColumnResizeDir]=\"resolvedDirection()\"\n (resizing)=\"onColumnResizing(f.column, $event)\"\n (resizeEnd)=\"onColumnResizeEnd(f.column, $event)\"\n (click)=\"$event.stopPropagation()\"></span>\n }\n </div>\n }\n </div>\n </div>\n\n <div class=\"tbody-mrs\" role=\"rowgroup\">\n @if (!loading() && pagedData().length === 0) {\n <div class=\"no-data\">{{ config.labels.noData }}</div>\n }\n\n @for (row of pagedData(); track trackBy()($index, row); let rowIndex = $index) {\n <div class=\"tr-mrs\" role=\"row\">\n @if (operations()) {\n <div\n class=\"td-mrs operations\"\n role=\"cell\"\n [style.flex]=\"'0 0 ' + operationWidth() + 'px'\">\n <div class=\"cel\">\n <span class=\"cell-title\">{{ config.labels.operation }}:</span>\n <ng-container\n [ngTemplateOutlet]=\"operations()!\"\n [ngTemplateOutletContext]=\"{ $implicit: row }\"></ng-container>\n </div>\n </div>\n }\n\n @if (showRecordNumber()) {\n <div class=\"td-mrs operations\" role=\"cell\" [style.flex]=\"'0 0 ' + numWidth() + 'px'\">\n <div class=\"cel\">{{ recordNumber(rowIndex) }}</div>\n </div>\n }\n\n @for (f of fields(); track f.column) {\n @let template = getTemplate(f.column);\n @let renderer = getRenderer(f);\n\n <div class=\"td-mrs\" role=\"cell\" [style.flex]=\"columnFlex(f)\">\n <div class=\"cel\" [class.wrap]=\"f.wrap\">\n <span class=\"cell-title\">{{ f.title }}</span>\n\n @if (template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n row: row,\n value: getCellValue(row, f),\n rowIndex: rowIndex,\n field: f,\n }\"></ng-container>\n } @else if (renderer) {\n <ng-container\n *ngComponentOutlet=\"\n renderer;\n inputs: getRendererInputs(row, f)\n \"></ng-container>\n } @else {\n {{ formatCellValue(row, f) }}\n }\n\n @if (f.prefix) {\n <span>{{ f.prefix }}</span>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n @if (loading()) {\n <div class=\"loading-container\">\n <div class=\"loading\">{{ config.labels.loading }}</div>\n </div>\n }\n </div>\n</div>\n\n<ngx-pagination\n [page]=\"page()\"\n [pageSize]=\"pageSizeS()\"\n [total]=\"totalCount()\"\n (paginate)=\"onPaginate($event)\"></ngx-pagination>\n","// types\nexport * from './types/sort.types';\nexport * from './types/page.types';\nexport * from './types/pagination.types';\nexport * from './types/table-field.types';\nexport * from './types/table-options.types';\n\n// tokens\nexport * from './tokens/table-config.token';\nexport * from './tokens/pagination-config.token';\n\n// providers\nexport * from './providers/provide-table';\nexport * from './providers/provide-pagination';\n\n// directives\nexport * from './directives/table-cell.directive';\nexport * from './directives/column-resize.directive';\n\n// components\nexport * from './components/table/table';\nexport * from './components/pagination/pagination';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngx-kit-data-table.mjs","sources":["../../../projects/libs/data-table/types/table-field.types.ts","../../../projects/libs/data-table/tokens/table-config.token.ts","../../../projects/libs/data-table/tokens/pagination-config.token.ts","../../../projects/libs/data-table/providers/provide-table.ts","../../../projects/libs/data-table/providers/provide-pagination.ts","../../../projects/libs/data-table/directives/table-cell.directive.ts","../../../projects/libs/data-table/directives/column-resize.directive.ts","../../../projects/libs/data-table/components/pagination/pagination.ts","../../../projects/libs/data-table/components/pagination/pagination.html","../../../projects/libs/data-table/components/table/table.ts","../../../projects/libs/data-table/components/table/table.html","../../../projects/libs/data-table/public-api.ts","../../../projects/libs/data-table/ngx-kit-data-table.ts"],"sourcesContent":["import { InputSignal, TemplateRef, Type } from '@angular/core';\r\n\r\n// ----------------------------------------------------------------------------\r\n// قرارداد پایهای که هر کامپوننت رندرر باید پیادهسازی کند.\r\n// value/row/field همیشه توسط جدول پر میشوند؛ هر ورودی دیگری که renderer\r\n// اضافه کند (مثل nameField در AvatarCellRenderer) بهصورت خودکار استخراج و\r\n// در rendererInputs همان ستون در دسترس/چک میشود.\r\n// ----------------------------------------------------------------------------\r\nexport interface CellRendererComponent<TValue = unknown, TRow extends object = object> {\r\n value: InputSignal<TValue>;\r\n row: InputSignal<TRow>;\r\n field: InputSignal<TableFieldBase<TRow>>;\r\n}\r\n\r\nexport type RendererRegistry = Readonly<Record<string, Type<CellRendererComponent<any, any>>>>;\r\n\r\n/**\r\n * Identity helper: یک رجیستری رندرر را با inference کامل تعریف میکند.\r\n * همین آبجکت باید هم در provideTable({ renderers }) و هم در defineFields(renderers, ...)\r\n * استفاده شود تا کلیدها (و ورودیهای اضافهی هر رندرر) در کل پروژه type-check شوند.\r\n */\r\nexport function defineRenderers<R extends RendererRegistry>(registry: R): R {\r\n return registry;\r\n}\r\n\r\n// ----------------------------------------------------------------------------\r\n// استخراج ورودیهای اضافهی هر رندرر مستقیماً از روی خودِ کلاس کامپوننت، بدون\r\n// اینکه کاربر مجبور باشد آنها را جای دیگری دوباره تایپ کند.\r\n// نکته: فقط اعضای «public» و «قابل فراخوانی بدون آرگومان» (شکل InputSignal/Signal)\r\n// در نظر گرفته میشوند؛ اعضای protected/private بهطور خودکار (توسط خودِ\r\n// TypeScript) از keyof حذف میشوند. توصیه: هر computed/derived داخلی در\r\n// کامپوننتهای رندرر را protected تعریف کنید تا اشتباهاً بهعنوان ورودی قابل\r\n// تنظیم دیده نشود. متدهای عمومی بدون آرگومان (نادر) هم میتوانند اشتباهاً در\r\n// این استخراج ظاهر شوند؛ چنین متدهایی را protected/private کنید.\r\n// ----------------------------------------------------------------------------\r\ntype InstanceOf<C> = C extends Type<infer I> ? I : never;\r\ntype UnwrapSignal<S> = S extends () => infer V ? V : never;\r\n\r\nexport type RendererExtraInputs<C extends Type<any>> = {\r\n [\r\n K in keyof InstanceOf<C> as K extends 'value' | 'row' | 'field'\r\n ? never\r\n : InstanceOf<C>[K] extends () => any\r\n ? K\r\n : never\r\n ]?: UnwrapSignal<InstanceOf<C>[K]>;\r\n};\r\n\r\n// ----------------------------------------------------------------------------\r\n// تعریف ستونها\r\n// ----------------------------------------------------------------------------\r\nexport type ColumnAlign = 'start' | 'center' | 'end';\r\n\r\nexport type TableCellFormatter<T extends object = object> = (\r\n value: any,\r\n row: T,\r\n field: TableFieldBase<T>,\r\n) => any;\r\n\r\nexport interface CellTemplateContext<T extends object> {\r\n $implicit: T;\r\n row: T;\r\n value: unknown;\r\n rowIndex: number;\r\n field: TableFieldBase<T>;\r\n}\r\n\r\n/** شکل پایهای مشترک بین همهی ستونها، صرفنظر از اینکه renderer دارند یا نه. */\r\nexport interface TableFieldBase<T extends object> {\r\n column: Extract<keyof T, string>;\r\n title: string;\r\n /**\r\n * عرضِ این ستون. عدد یعنی پیکسل (`160` = `160px`)؛ رشته یعنی هر مقدار\r\n * معتبرِ CSS length برای flex-basis (`'20%'`, `'12rem'`, ...). اگه اصلاً\r\n * ندید، این ستون flex میشه (`flex: 1 1 0`) و فضای باقیموندهی جدول رو پر\r\n * میکنه — دقیقاً برخلافِ ستونهایی که width دارن (که `flex: 0 0 <width>`\r\n * میگیرن و ثابت میمونن).\r\n */\r\n width?: number | string;\r\n minWidth?: number;\r\n maxWidth?: number;\r\n resizable?: boolean;\r\n sortable?: boolean;\r\n wrap?: boolean;\r\n align?: ColumnAlign;\r\n prefix?: string;\r\n formatter?: string | TableCellFormatter<T>;\r\n}\r\n\r\n/** ستون بدون renderer (متن ساده / formatter / cellTemplate دستی). */\r\nexport interface PlainTableField<T extends object> extends TableFieldBase<T> {\r\n renderer?: undefined;\r\n rendererInputs?: undefined;\r\n cellTemplate?: TemplateRef<CellTemplateContext<T>>;\r\n}\r\n\r\n/** ستونی که یک renderer از رجیستری R انتخاب کرده؛ rendererInputs دقیقاً همان\r\n * ورودیهای اضافهی همان renderer است — نه یک Record<string, unknown> آزاد. */\r\nexport type RenderedTableField<T extends object, R extends RendererRegistry> = {\r\n [K in keyof R]: TableFieldBase<T> & {\r\n renderer: K;\r\n rendererInputs?: RendererExtraInputs<R[K]>;\r\n cellTemplate?: undefined;\r\n };\r\n}[keyof R];\r\n\r\nexport type TableField<T extends object, R extends RendererRegistry = {}> =\r\n PlainTableField<T> | RenderedTableField<T, R>;\r\n\r\n/**\r\n * Identity helper برای تعریف ستونهای یک جدول با inference و type-check کامل\r\n * نسبت به هم مدل داده (T) و هم رجیستری رندررها (R).\r\n *\r\n * @example\r\n * const renderers = defineRenderers({ avatar: AvatarCellRenderer, boolean: BooleanCellRenderer });\r\n *\r\n * const fields = defineFields<Tenant, typeof renderers>(renderers, [\r\n * { column: 'avatarUrl', title: 'کاربر', renderer: 'avatar', rendererInputs: { showName: true } }, // ✅\r\n * { column: 'avatarUrl', title: 'کاربر', renderer: 'avatar', rendererInputs: { showName: 'x' } }, // ❌ باید boolean باشد\r\n * { column: 'isActive', title: 'فعال', renderer: 'bool' }, // ❌ کلید رجیستری نیست\r\n * { column: 'ageXYZ', title: '...' }, // ❌ فیلد Tenant نیست\r\n * ]);\r\n */\r\nexport function defineFields<T extends object, R extends RendererRegistry = {}>(\r\n _renderers: R,\r\n fields: TableField<T, R>[],\r\n): TableField<T, R>[] {\r\n return fields;\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { ResolvedTableOptions } from '../types/table-options.types';\r\n\r\nexport const NGX_TABLE_CONFIG_DEFAULT: ResolvedTableOptions = {\r\n showRecordNumber: false,\r\n hoverable: true,\r\n multiSort: true,\r\n resizable: true,\r\n stickyHeader: true,\r\n stripedRows: true,\r\n column: { minWidth: 60, maxWidth: 600, defaultWidth: 150 },\r\n labels: {\r\n noData: 'There is no data to display!',\r\n loading: 'Loading...',\r\n operation: 'Operation',\r\n },\r\n renderers: {},\r\n formatters: {},\r\n lazy: false,\r\n};\r\n\r\n/** به هر نمونهی ngx-table تزریق میشود. با provideTable() مقداردهی کنید. */\r\nexport const NGX_TABLE_CONFIG = new InjectionToken<ResolvedTableOptions>('ngx-table-config', {\r\n factory: () => NGX_TABLE_CONFIG_DEFAULT,\r\n});\r\n","import { InjectionToken } from '@angular/core';\nimport { NgxPaginationOptions } from '../types/pagination.types';\n\nexport const NGX_PAGINATION_CONFIG_DEFAULT: NgxPaginationOptions = {\n defaultPageSize: 10,\n pageSizeOptions: [5, 10, 20, 30, 50, 100],\n labels: {\n first: 'First',\n last: 'Last',\n next: 'Next',\n previous: 'Previous',\n showing: 'Showing',\n to: 'to',\n of: 'of',\n results: 'results',\n pageSize: 'Page Size',\n },\n};\n\nexport const NGX_PAGINATION_CONFIG = new InjectionToken<NgxPaginationOptions>(\n 'ngx-pagination-config',\n {\n factory: () => NGX_PAGINATION_CONFIG_DEFAULT,\n },\n);\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { NGX_TABLE_CONFIG, NGX_TABLE_CONFIG_DEFAULT } from '../tokens/table-config.token';\nimport { NgxTableOptions, ResolvedTableOptions } from '../types/table-options.types';\n\nfunction mergeTableConfig(\n base: ResolvedTableOptions,\n override?: NgxTableOptions,\n): ResolvedTableOptions {\n if (!override) return base;\n return {\n ...base,\n ...override,\n column: { ...base.column, ...override.column },\n labels: { ...base.labels, ...override.labels },\n renderers: { ...base.renderers, ...override.renderers },\n formatters: { ...base.formatters, ...override.formatters },\n };\n}\n\n/**\n * کانفیگ سراسری <ngx-table>: جهت پیشفرض، حداقل/حداکثر عرض ستون، فعال بودن\n * پیشفرض سورت چندستونه، و از همه مهمتر رجیستری رندررها.\n *\n * @example\n * provideTable({\n * renderers: defineRenderers({ avatar: AvatarCellRenderer, boolean: BooleanCellRenderer }),\n * column: { minWidth: 80, maxWidth: 480, defaultWidth: 160 },\n * })\n */\nexport function provideTable(options?: NgxTableOptions): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: NGX_TABLE_CONFIG, useValue: mergeTableConfig(NGX_TABLE_CONFIG_DEFAULT, options) },\n ]);\n}\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport {\n NGX_PAGINATION_CONFIG,\n NGX_PAGINATION_CONFIG_DEFAULT,\n} from '../tokens/pagination-config.token';\nimport { NgxPaginationOptions } from '../types/pagination.types';\n\nfunction mergePaginationConfig(\n base: NgxPaginationOptions,\n override?: Partial<NgxPaginationOptions>,\n): NgxPaginationOptions {\n if (!override) return base;\n return {\n ...base,\n ...override,\n labels: { ...base.labels, ...override.labels },\n };\n}\n\nexport function providePagination(options?: Partial<NgxPaginationOptions>): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: NGX_PAGINATION_CONFIG,\n useValue: mergePaginationConfig(NGX_PAGINATION_CONFIG_DEFAULT, options),\n },\n ]);\n}\n","import { Directive, inject, input, TemplateRef } from '@angular/core';\nimport { CellTemplateContext } from '../types/table-field.types';\n\n/**\n * برای projection قالب سفارشی یک ستون بدون اینکه مجبور باشید cellTemplate را\n * از طریق ViewChild به آبجکت ستون وصل کنید:\n *\n * <ngx-table [fields]=\"fields\" [data]=\"rows()\">\n * <ng-template ngxTableCell=\"userName\" let-row let-value=\"value\">\n * <strong>{{ value }}</strong>\n * </ng-template>\n * </ngx-table>\n *\n * مهم: چون این دایرکتیو در تمپلیت *کامپوننت مصرفکننده* (نه ngx-table) استفاده\n * میشود، باید آن را در آرایهی imports همان کامپوننت (standalone) وارد کنید:\n * imports: [NgxTable, TableCell]\n *\n * محدودیت شناختهشده: context این تمپلیت (row/value) از نوع T دقیق نیست\n * (چون TemplateRef اینجا بهصورت پویا از ContentChildren جمعآوری میشود و\n * اطلاعات جنریک T در آن نقطه از بین میرود). برای type-safety کامل روی\n * row/value، از field.cellTemplate به همراه @ViewChild استفاده کنید (به README\n * بخش «Cell Template کاملاً Type-Safe» مراجعه کنید).\n */\n@Directive({\n selector: 'ng-template[ngxTableCell]',\n standalone: true,\n})\nexport class TableCell<T extends object = object> {\n readonly column = input.required<string>({ alias: 'ngxTableCell' });\n readonly templateRef = inject(TemplateRef<CellTemplateContext<T>>);\n}\n","import { Directive, ElementRef, HostListener, inject, input, output } from '@angular/core';\r\n\r\n/**\r\n * دستگیرهی درگ برای ریسایز ستون. روی لبهی «انتهای منطقی» (inline-end) قرار\r\n * میگیرد، یعنی خودش زیر [dir=\"rtl\"] جابهجا میشود؛ فقط جهت محاسبهی دلتا هم\r\n * برعکس میشود تا حس درگ همیشه طبیعی باشد.\r\n *\r\n * مقدار نهایی توسط جدول در یک Map از عرضها ذخیره میشود (نه در استایل مستقیم\r\n * ستون)، به همراه علامتگذاری «دستی ریسایز شده» — یعنی بعد از این، هیچ\r\n * re-render یا تغییر دادهای این عرض را از بین نمیبرد.\r\n */\r\n@Directive({\r\n selector: '[ngxColumnResize]',\r\n standalone: true,\r\n host: {\r\n class: 'ngx-table__resize-handle',\r\n role: 'separator',\r\n 'aria-orientation': 'vertical',\r\n },\r\n})\r\nexport class ColumnResize {\r\n readonly startWidth = input.required<number>({ alias: 'ngxColumnResizeWidth' });\r\n readonly minWidth = input<number>(40, { alias: 'ngxColumnResizeMin' });\r\n readonly maxWidth = input<number>(1000, { alias: 'ngxColumnResizeMax' });\r\n readonly direction = input<'ltr' | 'rtl'>('ltr', { alias: 'ngxColumnResizeDir' });\r\n\r\n readonly resizing = output<number>();\r\n readonly resizeEnd = output<number>();\r\n\r\n private readonly elementRef = inject(ElementRef<HTMLElement>);\r\n\r\n private dragging = false;\r\n private startX = 0;\r\n private baseWidth = 0;\r\n\r\n @HostListener('pointerdown', ['$event'])\r\n onPointerDown(event: PointerEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.dragging = true;\r\n this.startX = event.clientX;\r\n // اندازهی واقعیِ رندرشدهی ستون رو میگیریم، نه فقط input ورودی — چون\r\n // ستونهایی که width صریح ندارن (flex:1 1 0، فضای باقیمونده رو پر\r\n // میکنن) هیچ عرض عددیِ ازپیششناختهشدهای ندارن؛ تنها منبع درستِ\r\n // «عرض فعلی» برای شروع محاسبهی درگ، خودِ DOM هست.\r\n const measured = this.elementRef.nativeElement.parentElement?.getBoundingClientRect().width;\r\n this.baseWidth = measured && measured > 0 ? measured : this.startWidth();\r\n (event.target as HTMLElement).setPointerCapture(event.pointerId);\r\n }\r\n\r\n @HostListener('pointermove', ['$event'])\r\n onPointerMove(event: PointerEvent): void {\r\n if (!this.dragging) return;\r\n this.resizing.emit(this.computeWidth(event.clientX));\r\n }\r\n\r\n @HostListener('pointerup', ['$event'])\r\n @HostListener('pointercancel', ['$event'])\r\n onPointerUp(event: PointerEvent): void {\r\n if (!this.dragging) return;\r\n this.dragging = false;\r\n this.resizeEnd.emit(this.computeWidth(event.clientX));\r\n }\r\n\r\n private computeWidth(clientX: number): number {\r\n const delta = clientX - this.startX;\r\n const signedDelta = this.direction() === 'rtl' ? -delta : delta;\r\n const raw = this.baseWidth + signedDelta;\r\n return Math.min(this.maxWidth(), Math.max(this.minWidth(), raw));\r\n }\r\n}\r\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { NGX_PAGINATION_CONFIG } from '../../tokens/pagination-config.token';\nimport { PageEvent } from '../../types/page.types';\n\n@Component({\n selector: 'ngx-pagination',\n standalone: true,\n templateUrl: './pagination.html',\n styleUrl: './pagination.scss',\n imports: [FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgxPagination {\n protected readonly config = inject(NGX_PAGINATION_CONFIG);\n\n readonly total = input.required<number>();\n\n readonly page = model(1);\n readonly pageSize = model(this.config.defaultPageSize);\n\n readonly pageSizeOptions = input(this.config.pageSizeOptions);\n readonly labels = input(this.config.labels);\n readonly siblingCount = input(1);\n readonly boundaryCount = input(1);\n\n readonly paginate = output<PageEvent>();\n\n protected readonly totalPages = computed(() =>\n Math.max(1, Math.ceil(this.total() / this.pageSize())),\n );\n\n protected readonly firstItem = computed(() =>\n this.total() === 0 ? 0 : (this.page() - 1) * this.pageSize() + 1,\n );\n\n protected readonly lastItem = computed(() =>\n Math.min(this.firstItem() + this.pageSize() - 1, this.total()),\n );\n\n protected readonly pages = computed(() =>\n this.buildPages(this.page(), this.totalPages(), this.siblingCount(), this.boundaryCount()),\n );\n\n constructor() {\n // هر تغییری در page/pageSize را برای مصرفکننده امیت کن.\n effect(() => {\n this.paginate.emit({ page: this.page(), pageSize: this.pageSize() });\n });\n\n // اگر بعد از کوچکشدن total، صفحهی جاری خارج از بازه افتاد، اصلاحش کن.\n effect(() => {\n const max = this.totalPages();\n if (this.page() > max) this.page.set(max);\n });\n }\n\n private buildPages(\n current: number,\n total: number,\n sibling = 1,\n boundary = 1,\n ): (number | string)[] {\n const range = (start: number, end: number) =>\n Array.from({ length: end - start + 1 }, (_, i) => start + i);\n\n const totalNumbers = sibling * 2 + boundary * 2 + 3;\n if (total <= totalNumbers) return range(1, total);\n\n const leftSibling = Math.max(current - sibling, boundary + 2);\n const rightSibling = Math.min(current + sibling, total - boundary - 1);\n const showLeftDots = leftSibling > boundary + 2;\n const showRightDots = rightSibling < total - boundary - 1;\n\n const pages: (number | string)[] = [];\n pages.push(...range(1, boundary));\n if (showLeftDots) pages.push('...');\n else pages.push(...range(boundary + 1, leftSibling - 1));\n pages.push(...range(leftSibling, rightSibling));\n if (showRightDots) pages.push('...');\n else pages.push(...range(rightSibling + 1, total - boundary));\n pages.push(...range(total - boundary + 1, total));\n return pages;\n }\n\n protected next(): void {\n this.page.update((p) => Math.min(p + 1, this.totalPages()));\n }\n protected previous(): void {\n this.page.update((p) => Math.max(1, p - 1));\n }\n protected first(): void {\n this.page.set(1);\n }\n protected last(): void {\n this.page.set(this.totalPages());\n }\n protected goto(page: number): void {\n if (typeof page !== 'number' || Number.isNaN(page)) return;\n this.page.set(page);\n }\n protected onPageSizeChange(value: number): void {\n this.pageSize.set(Number(value));\n this.page.set(1);\n }\n}\n","<nav class=\"ngx-pagination\">\n <div class=\"ngx-pagination__summary\">\n {{ labels().showing }}\n <span class=\"fw-semibold\">{{ firstItem() }}</span>\n {{ labels().to }}\n <span class=\"fw-semibold\">{{ lastItem() }}</span>\n {{ labels().of }}\n <span class=\"fw-semibold\">{{ total() }}</span>\n {{ labels().results }}\n </div>\n\n <div class=\"ngx-pagination__controls\">\n <ul class=\"ngx-pagination__list\">\n <li [class.disabled]=\"page() === 1\" [title]=\"labels().first\">\n <a (click)=\"first()\" class=\"icon\">«</a>\n </li>\n <li [class.disabled]=\"page() === 1\" [title]=\"labels().previous\">\n <a (click)=\"previous()\" class=\"icon\">‹</a>\n </li>\n\n @for (item of pages(); track $index) {\n <li class=\"ngx-pagination__page-num\" [class.active]=\"item === page()\">\n @if (item !== page() && item !== '...') {\n <a (click)=\"goto(+item)\">{{ item }}</a>\n }\n @if (item === page() || item === '...') {\n <span>{{ item }}</span>\n }\n </li>\n }\n\n <li [class.disabled]=\"page() === totalPages()\" [title]=\"labels().next\">\n <a (click)=\"next()\" class=\"icon\">›</a>\n </li>\n <li [class.disabled]=\"page() === totalPages()\" [title]=\"labels().last\">\n <a (click)=\"last()\" class=\"icon\">»</a>\n </li>\n </ul>\n\n <div class=\"ngx-pagination__page-size\">\n <span>{{ labels().pageSize }}:</span>\n <select [ngModel]=\"pageSize()\" (ngModelChange)=\"onPageSizeChange($event)\">\n @for (opt of pageSizeOptions(); track opt) {\n <option [value]=\"opt\" [selected]=\"opt === pageSize()\">{{ opt }}</option>\n }\n </select>\n </div>\n </div>\n</nav>\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n AfterContentInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n ContentChildren,\r\n DestroyRef,\r\n DOCUMENT,\r\n effect,\r\n inject,\r\n input,\r\n OnInit,\r\n output,\r\n QueryList,\r\n signal,\r\n TemplateRef,\r\n Type,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { TableCell } from '../../directives/table-cell.directive';\r\nimport { ColumnResize } from '../../directives/column-resize.directive';\r\nimport { NGX_TABLE_CONFIG } from '../../tokens/table-config.token';\r\nimport { NGX_PAGINATION_CONFIG } from '../../tokens/pagination-config.token';\r\nimport { PageEvent, LazyLoadEvent } from '../../types/page.types';\r\nimport { SortDirection, SortMeta } from '../../types/sort.types';\r\nimport {\r\n CellRendererComponent,\r\n CellTemplateContext,\r\n TableField,\r\n} from '../../types/table-field.types';\r\nimport { NgxPagination } from '../pagination/pagination';\r\nimport { DirectionService } from 'ngx-kit/shared';\r\n\r\n/**\r\n * جدول دادهی جنریک و Type-Safe.\r\n *\r\n * `T` از روی چیزی که به [data] بایند میکنید استنتاج میشود؛ `field.column` در\r\n * `TableField<T, R>` محدود به `keyof T` است، و اگر از defineFields(renderers, ...)\r\n * استفاده کنید، `field.renderer` محدود به کلیدهای رجیستری و `rendererInputs`\r\n * دقیقاً همان ورودیهای اضافهی همان renderer است.\r\n *\r\n * دو حالت:\r\n * - کلاینتساید (پیشفرض): [data] کل آرایه است؛ سورت/صفحهبندی داخلی و روی\r\n * یک computed خالص انجام میشود (بدون mutation روی آبجکتهای شما).\r\n * - lazy: [lazy]=\"true\" + [totalRecords]؛ [data] فقط صفحهی جاری است؛ به\r\n * (lazyLoad) گوش بدهید.\r\n */\r\n@Component({\r\n selector: 'ngx-table',\r\n standalone: true,\r\n templateUrl: './table.html',\r\n styleUrl: './table.scss',\r\n imports: [CommonModule, NgxPagination, ColumnResize],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'ngx-table-host',\r\n },\r\n})\r\nexport class NgxTable<T extends object> implements OnInit, AfterContentInit {\r\n protected readonly config = inject(NGX_TABLE_CONFIG);\r\n protected readonly paginationConfig = inject(NGX_PAGINATION_CONFIG);\r\n\r\n // ---------------------------------------------------------------- inputs\r\n readonly fields = input.required<TableField<T, any>[]>();\r\n readonly data = input.required<readonly T[]>();\r\n readonly totalRecords = input.required<number>();\r\n readonly showRecordNumber = input(this.config.showRecordNumber);\r\n readonly operations = input<TemplateRef<{ $implicit: T }>>();\r\n readonly operationWidth = input(80);\r\n readonly numWidth = input(80);\r\n readonly pageSize = input(this.paginationConfig.defaultPageSize);\r\n readonly page = input(1);\r\n readonly pageChange = output<number>();\r\n readonly loading = input(false);\r\n readonly multiSort = input<boolean | undefined>(undefined);\r\n readonly lazy = input(this.config.lazy);\r\n readonly resizable = input(this.config.resizable);\r\n /** پیشفرض بر اساس ایندکس؛ برای جلوگیری از گمشدن state سطرها هنگام سورت،\r\n * یک شناسهی یکتا بدهید: [trackBy]=\"(i, row) => row.id\" */\r\n readonly trackBy = input<(index: number, row: T) => unknown>((index) => index);\r\n\r\n // --------------------------------------------------------------- outputs\r\n readonly lazyLoad = output<LazyLoadEvent<T>>();\r\n readonly sortChange = output<SortMeta<T>[]>();\r\n readonly columnResize = output<{ field: string; width: number }>();\r\n\r\n // ------------------------------------------------------------ int. state\r\n protected readonly pageIndex = signal(1);\r\n protected readonly pageSizeS = signal(this.paginationConfig.defaultPageSize);\r\n protected readonly sorts = signal<SortMeta<T>[]>([]);\r\n protected readonly widths = signal<Record<string, number>>({});\r\n private readonly manuallyResized = new Set<string>();\r\n private readonly rendererInputsCache = new Map<\r\n TableField<T, any>,\r\n WeakMap<T, Record<string, unknown>>\r\n >();\r\n\r\n @ContentChildren(TableCell) private cellTemplates!: QueryList<TableCell<T>>;\r\n private templateMap = new Map<string, TemplateRef<CellTemplateContext<T>>>();\r\n\r\n protected readonly resolvedMultiSort = computed(() => this.multiSort() ?? this.config.multiSort);\r\n private readonly directionService = inject(DirectionService);\r\n private readonly destroyRef = inject(DestroyRef);\r\n protected readonly resolvedDirection = computed(() => this.directionService.direction());\r\n constructor() {\r\n effect(() => {\r\n const ps = this.pageSize();\r\n this.pageSizeS.set(ps);\r\n const pi = this.page();\r\n this.pageIndex.set(pi);\r\n });\r\n\r\n // برای هر ستونِ تازهدیدهشده که width عددیِ صریح دارد، یک عرض seed کن؛\r\n // ستونهایی که کاربر دستی ریسایز کرده دیگر هیچوقت دوباره نوشته نمیشوند.\r\n // مهم: ستونهایی که اصلاً width ندارند (یا width رشتهای مثل '20%' دارند)\r\n // عمداً اینجا seed نمیشوند — قبلاً همهی ستونها با یک defaultWidth ثابت\r\n // seed میشدند که باعث میشد جدول با flex:0 0 روی هر ستون هیچوقت واقعاً\r\n // 100% عرض رو پر نکنه، حتی وقتی کاربر عمداً یک ستون رو بدون width گذاشته\r\n // بود تا فضای باقیمونده رو خودش پر کنه.\r\n effect(() => {\r\n const cols = this.fields();\r\n const current = this.widths();\r\n let changed = false;\r\n const next = { ...current };\r\n for (const f of cols) {\r\n if (this.manuallyResized.has(f.column)) continue;\r\n if (f.column in next) continue;\r\n if (typeof f.width === 'number') {\r\n next[f.column] = f.width;\r\n changed = true;\r\n }\r\n }\r\n if (changed) this.widths.set(next);\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n // نیاز به این نیست در لود خود صفحه بندی paginate را صدا میزند\r\n // if (this.lazy()) {\r\n // this.lazyLoad.emit({ first: 0, pageIndex: 1, pageSize: this.pageSizeS(), sorts: [] });\r\n // }\r\n }\r\n\r\n ngAfterContentInit(): void {\r\n this.syncTemplateMap();\r\n // این Observable خودش کامل نمیشه (EventEmitter سادهست، نه یه stream که\r\n // روی destroy کامپوننت تموم بشه)؛ بدون takeUntilDestroyed، این subscribe\r\n // برای همیشه فعال میموند و رفرنس کامپوننت رو زنده نگه میداشت.\r\n this.cellTemplates.changes\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => this.syncTemplateMap());\r\n }\r\n\r\n private syncTemplateMap(): void {\r\n this.templateMap.clear();\r\n this.cellTemplates.forEach((cell) => {\r\n // نکتهی مهم: cell.column() باید فراخوانی شود (سیگنال است)، نه cell.column.name.\r\n this.templateMap.set(cell.column(), cell.templateRef);\r\n });\r\n }\r\n\r\n // ------------------------------------------------------------- دادهها\r\n protected readonly sortedData = computed<readonly T[]>(() => {\r\n if (this.lazy()) return this.data();\r\n const sorts = this.sorts();\r\n if (sorts.length === 0) return this.data();\r\n const copy = [...this.data()];\r\n copy.sort((a, b) => {\r\n for (const s of sorts) {\r\n const cmp = this.compare(a[s.field], b[s.field]);\r\n if (cmp !== 0) return s.direction === 'asc' ? cmp : -cmp;\r\n }\r\n return 0;\r\n });\r\n return copy;\r\n });\r\n\r\n protected readonly totalCount = computed(() =>\r\n this.lazy() ? this.totalRecords() : this.data().length,\r\n );\r\n\r\n protected readonly pagedData = computed<readonly T[]>(() => {\r\n if (this.lazy()) return this.sortedData();\r\n const start = (this.pageIndex() - 1) * this.pageSizeS();\r\n return this.sortedData().slice(start, start + this.pageSizeS());\r\n });\r\n\r\n private compare(a: unknown, b: unknown): number {\r\n if (a == null && b == null) return 0;\r\n if (a == null) return -1;\r\n if (b == null) return 1;\r\n if (typeof a === 'number' && typeof b === 'number') return a - b;\r\n if (typeof a === 'boolean' && typeof b === 'boolean') return a === b ? 0 : a ? 1 : -1;\r\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\r\n return String(a).localeCompare(String(b));\r\n }\r\n\r\n /** بدون mutation روی دادهی ورودی: شمارهی ردیف صرفاً از روی page/pageSize/rowIndex محاسبه میشود. */\r\n protected recordNumber(rowIndex: number): number {\r\n return (this.pageIndex() - 1) * this.pageSizeS() + rowIndex + 1;\r\n }\r\n\r\n // -------------------------------------------------------------- سورت\r\n protected sortDirectionFor(column: string): SortDirection | null {\r\n return this.sorts().find((s) => s.field === column)?.direction ?? null;\r\n }\r\n\r\n protected onHeaderClick(field: TableField<T, any>, event: MouseEvent): void {\r\n if (!field.sortable) return;\r\n const column = field.column;\r\n const current = this.sorts();\r\n const existingIndex = current.findIndex((s) => s.field === column);\r\n const isMultiGesture =\r\n this.resolvedMultiSort() && (event.shiftKey || event.ctrlKey || event.metaKey);\r\n\r\n let next: SortMeta<T>[];\r\n if (isMultiGesture) {\r\n next = [...current];\r\n if (existingIndex === -1) {\r\n next.push({ field: column, direction: 'asc' });\r\n } else if (next[existingIndex].direction === 'asc') {\r\n next[existingIndex] = { field: column, direction: 'desc' };\r\n } else {\r\n next.splice(existingIndex, 1);\r\n }\r\n } else if (existingIndex === -1 || current.length > 1) {\r\n next = [{ field: column, direction: 'asc' }];\r\n } else if (current[0].direction === 'asc') {\r\n next = [{ field: column, direction: 'desc' }];\r\n } else {\r\n next = [];\r\n }\r\n\r\n this.sorts.set(next);\r\n this.pageIndex.set(1);\r\n this.pageChange.emit(this.pageIndex());\r\n this.sortChange.emit(next);\r\n this.emitLazyIfNeeded();\r\n }\r\n\r\n // ------------------------------------------------------------ صفحهبندی\r\n protected onPaginate(event: PageEvent): void {\r\n this.pageIndex.set(event.page);\r\n this.pageSizeS.set(event.pageSize);\r\n this.pageChange.emit(this.pageIndex());\r\n this.emitLazyIfNeeded();\r\n }\r\n\r\n private emitLazyIfNeeded(): void {\r\n if (!this.lazy()) return;\r\n const pageIndex = this.pageIndex();\r\n const pageSize = this.pageSizeS();\r\n this.lazyLoad.emit({\r\n pageIndex,\r\n pageSize,\r\n first: (pageIndex - 1) * pageSize,\r\n sorts: this.sorts(),\r\n sorting: this.sorts()\r\n ?.map((s) => `${s.field} ${s.direction}`)\r\n .join(','),\r\n });\r\n }\r\n\r\n // -------------------------------------------------------------- ریسایز\r\n protected columnWidth(column: string): number {\r\n return this.widths()[column] ?? this.config.column.defaultWidth;\r\n }\r\n /**\r\n * مقدار CSS `flex` واقعیِ این ستون:\r\n * - اگه دستی ریسایز شده یا width عددی داره → `0 0 <px>` (ثابت، بدون رشد/کوچکشدن)\r\n * - اگه width رشتهای داره (مثلاً '20%') → `0 0 <رشته>` (ثابت، هر واحد CSS معتبری)\r\n * - اگه اصلاً width نداره → `1 1 0` (رشد میکنه تا فضای باقیموندهی جدول رو پر کنه)\r\n */\r\n protected columnFlex(field: TableField<T, any>): string {\r\n const resized = this.widths()[field.column];\r\n if (resized != null) return `0 0 ${resized}px`;\r\n if (typeof field.width === 'string') return `0 0 ${field.width}`;\r\n return '1 1 0';\r\n }\r\n protected columnMin(field: TableField<T, any>): number {\r\n return field.minWidth ?? this.config.column.minWidth;\r\n }\r\n protected columnMax(field: TableField<T, any>): number {\r\n return field.maxWidth ?? this.config.column.maxWidth;\r\n }\r\n protected isResizable(field: TableField<T, any>): boolean {\r\n return (field.resizable ?? this.resizable()) !== false;\r\n }\r\n protected onColumnResizing(column: string, width: number): void {\r\n this.widths.update((w) => ({ ...w, [column]: width }));\r\n }\r\n protected onColumnResizeEnd(column: string, width: number): void {\r\n this.manuallyResized.add(column);\r\n this.widths.update((w) => ({ ...w, [column]: width }));\r\n this.columnResize.emit({ field: column, width });\r\n }\r\n\r\n // --------------------------------------------------------------- سلولها\r\n protected getTemplate(column: string): TemplateRef<CellTemplateContext<T>> | null {\r\n const fromDirective = this.templateMap.get(column);\r\n if (fromDirective) return fromDirective;\r\n\r\n const fromFieldConfig = this.fields().find((f) => f.column === column)?.cellTemplate;\r\n return fromFieldConfig ?? null;\r\n }\r\n\r\n protected getRenderer(field: TableField<T, any>): Type<CellRendererComponent> | null {\r\n if (!field.renderer) return null;\r\n // نکته: نوع دقیق field.renderer (که به کلیدهای رجیستری محدود است) در\r\n // defineFields() چک میشود؛ اینجا فقط یک lookup رانتایم ساده لازم است.\r\n return this.config.renderers[field.renderer as string] ?? null;\r\n }\r\n\r\n protected getCellValue(row: T, field: TableField<T, any>): unknown {\r\n return row[field.column];\r\n }\r\n\r\n protected formatCellValue(row: T, field: TableField<T, any>): string {\r\n const value = this.getCellValue(row, field);\r\n\r\n if (typeof field.formatter === 'function') {\r\n return this.stringify(field.formatter(value, row, field));\r\n }\r\n if (typeof field.formatter === 'string') {\r\n const formatter = this.config.formatters[field.formatter];\r\n if (formatter) return this.stringify(formatter(value, row, field));\r\n }\r\n return this.stringify(value);\r\n }\r\n\r\n private stringify(value: unknown): string {\r\n return value == null ? '' : String(value);\r\n }\r\n\r\n /** ورودیهای renderer را بهازای هر (field, row) کش میکند تا هر Change\r\n * Detection یک آبجکت جدید ساخته نشود؛ با WeakMap، وقتی row از حافظه خارج\r\n * شود (مثلاً بعد از عوضشدن صفحه)، entry آن هم خودکار پاک میشود. */\r\n protected getRendererInputs(row: T, field: TableField<T, any>): Record<string, unknown> {\r\n let fieldCache = this.rendererInputsCache.get(field);\r\n if (!fieldCache) {\r\n fieldCache = new WeakMap();\r\n this.rendererInputsCache.set(field, fieldCache);\r\n }\r\n let inputs = fieldCache.get(row);\r\n if (!inputs) {\r\n inputs = {\r\n value: this.getCellValue(row, field),\r\n row,\r\n field,\r\n ...(field.renderer ? field.rendererInputs : undefined),\r\n };\r\n fieldCache.set(row, inputs);\r\n }\r\n return inputs;\r\n }\r\n}\r\n","<div class=\"ngx-table-wrapper\" [class.ngx-table--loading]=\"loading()\">\r\n <div class=\"ngx-table-scroll\">\r\n <div\r\n class=\"ngx-table\"\r\n [class.ngx-table--striped]=\"config.stripedRows\"\r\n [class.ngx-table--hover]=\"config.hoverable\"\r\n role=\"table\">\r\n <div class=\"thead-mrs\" [class.thead-mrs--sticky]=\"config.stickyHeader\" role=\"rowgroup\">\r\n <div class=\"tr-mrs\" role=\"row\">\r\n @if (operations()) {\r\n <div\r\n class=\"th-mrs operations\"\r\n role=\"columnheader\"\r\n [style.flex]=\"'0 0 ' + operationWidth() + 'px'\">\r\n {{ config.labels.operation }}\r\n </div>\r\n }\r\n @if (showRecordNumber()) {\r\n <div\r\n class=\"th-mrs operations\"\r\n role=\"columnheader\"\r\n [style.flex]=\"'0 0 ' + numWidth() + 'px'\">\r\n #\r\n </div>\r\n }\r\n\r\n @for (f of fields(); track f.column) {\r\n <div\r\n class=\"th-mrs\"\r\n role=\"columnheader\"\r\n [class.th-mrs--sortable]=\"f.sortable\"\r\n [style.flex]=\"columnFlex(f)\"\r\n [attr.aria-sort]=\"\r\n sortDirectionFor(f.column) === 'asc'\r\n ? 'ascending'\r\n : sortDirectionFor(f.column) === 'desc'\r\n ? 'descending'\r\n : null\r\n \"\r\n (click)=\"onHeaderClick(f, $event)\">\r\n <span class=\"th-mrs__title\">{{ f.title }}</span>\r\n\r\n @if (f.sortable) {\r\n <span class=\"sort-icon\" [class.active]=\"sortDirectionFor(f.column) !== null\">\r\n @if (sortDirectionFor(f.column) === 'asc') {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M182.6 41.4c-12.5-12.5-32.8-12.5-45.3 0l-128 128c-9.2 9.2-11.9 22.9-6.9 34.9s16.6 19.8 29.6 19.8H96V448c0 17.7 14.3 32 32 32s32-14.3 32-32V224h64c12.9 0 24.6-7.8 29.6-19.8s2.2-25.7-6.9-34.9l-128-128z\" />\r\n </svg>\r\n } @else if (sortDirectionFor(f.column) === 'desc') {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M137.4 470.6c12.5 12.5 32.8 12.5 45.3 0l128-128c9.2-9.2 11.9-22.9 6.9-34.9s-16.6-19.8-29.6-19.8H224V64c0-17.7-14.3-32-32-32s-32 14.3-32 32V288H96c-12.9 0-24.6 7.8-29.6 19.8s-2.2 25.7 6.9 34.9l128 128z\" />\r\n </svg>\r\n } @else {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M137.4 41.4c12.5-12.5 32.8-12.5 45.3 0l96 96c9.2 9.2 11.9 22.9 6.9 34.9s-16.6 19.8-29.6 19.8H224v96c0 17.7-14.3 32-32 32s-32-14.3-32-32V192H96c-12.9 0-24.6-7.8-29.6-19.8s-2.3-25.7 6.9-34.9l96-96zM32 400c0-17.7 14.3-32 32-32H256c17.7 0 32 14.3 32 32s-14.3 32-32 32H64c-17.7 0-32-14.3-32-32z\"\r\n opacity=\".35\" />\r\n </svg>\r\n }\r\n </span>\r\n }\r\n\r\n @if (isResizable(f)) {\r\n <span\r\n ngxColumnResize\r\n [ngxColumnResizeWidth]=\"columnWidth(f.column)\"\r\n [ngxColumnResizeMin]=\"columnMin(f)\"\r\n [ngxColumnResizeMax]=\"columnMax(f)\"\r\n [ngxColumnResizeDir]=\"resolvedDirection()\"\r\n (resizing)=\"onColumnResizing(f.column, $event)\"\r\n (resizeEnd)=\"onColumnResizeEnd(f.column, $event)\"\r\n (click)=\"$event.stopPropagation()\"></span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div class=\"tbody-mrs\" role=\"rowgroup\">\r\n @if (!loading() && pagedData().length === 0) {\r\n <div class=\"no-data\">{{ config.labels.noData }}</div>\r\n }\r\n\r\n @for (row of pagedData(); track trackBy()($index, row); let rowIndex = $index) {\r\n <div class=\"tr-mrs\" role=\"row\">\r\n @if (operations()) {\r\n <div\r\n class=\"td-mrs operations\"\r\n role=\"cell\"\r\n [style.flex]=\"'0 0 ' + operationWidth() + 'px'\">\r\n <div class=\"cel\">\r\n <span class=\"cell-title\">{{ config.labels.operation }}:</span>\r\n <ng-container\r\n [ngTemplateOutlet]=\"operations()!\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row }\"></ng-container>\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (showRecordNumber()) {\r\n <div class=\"td-mrs operations\" role=\"cell\" [style.flex]=\"'0 0 ' + numWidth() + 'px'\">\r\n <div class=\"cel\">{{ recordNumber(rowIndex) }}</div>\r\n </div>\r\n }\r\n\r\n @for (f of fields(); track f.column) {\r\n @let template = getTemplate(f.column);\r\n @let renderer = getRenderer(f);\r\n\r\n <div class=\"td-mrs\" role=\"cell\" [style.flex]=\"columnFlex(f)\">\r\n <div class=\"cel\" [class.wrap]=\"f.wrap\">\r\n <span class=\"cell-title\">{{ f.title }}</span>\r\n\r\n @if (template) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: row,\r\n row: row,\r\n value: getCellValue(row, f),\r\n rowIndex: rowIndex,\r\n field: f,\r\n }\"></ng-container>\r\n } @else if (renderer) {\r\n <ng-container\r\n *ngComponentOutlet=\"\r\n renderer;\r\n inputs: getRendererInputs(row, f)\r\n \"></ng-container>\r\n } @else {\r\n {{ formatCellValue(row, f) }}\r\n }\r\n\r\n @if (f.prefix) {\r\n <span>{{ f.prefix }}</span>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (loading()) {\r\n <div class=\"loading-container\">\r\n <div class=\"loading\">{{ config.labels.loading }}</div>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n\r\n<ngx-pagination\r\n [page]=\"page()\"\r\n [pageSize]=\"pageSizeS()\"\r\n [total]=\"totalCount()\"\r\n (paginate)=\"onPaginate($event)\"></ngx-pagination>\r\n","// types\nexport * from './types/sort.types';\nexport * from './types/page.types';\nexport * from './types/pagination.types';\nexport * from './types/table-field.types';\nexport * from './types/table-options.types';\n\n// tokens\nexport * from './tokens/table-config.token';\nexport * from './tokens/pagination-config.token';\n\n// providers\nexport * from './providers/provide-table';\nexport * from './providers/provide-pagination';\n\n// directives\nexport * from './directives/table-cell.directive';\nexport * from './directives/column-resize.directive';\n\n// components\nexport * from './components/table/table';\nexport * from './components/pagination/pagination';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
|