intelica-library-ui 0.1.69 → 0.1.71
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.
|
@@ -1507,6 +1507,7 @@ class TableComponent {
|
|
|
1507
1507
|
GlobalTermService = inject(GlobalTermService);
|
|
1508
1508
|
ComponentId = "";
|
|
1509
1509
|
ListData = [];
|
|
1510
|
+
ShowRowPerPage = true;
|
|
1510
1511
|
ShowSearch = false;
|
|
1511
1512
|
ListSearchOptions = [];
|
|
1512
1513
|
ShowPagination = false;
|
|
@@ -1527,6 +1528,7 @@ class TableComponent {
|
|
|
1527
1528
|
RowResumenGroups;
|
|
1528
1529
|
AdditionalTemplate;
|
|
1529
1530
|
AdditionalCentralTemplate;
|
|
1531
|
+
AllowedPageSizes = [10, 25, 50, 100];
|
|
1530
1532
|
ColumnList = [];
|
|
1531
1533
|
ColumnGroupList = [];
|
|
1532
1534
|
RowResumenList = [];
|
|
@@ -1668,16 +1670,23 @@ class TableComponent {
|
|
|
1668
1670
|
this.EmitSearchEvent.emit(this.SearchInput);
|
|
1669
1671
|
this.EmitSortEvent.emit([{ sortOrder: this.SortOrder, sortField: this.SortField?.toString() ?? "" }]);
|
|
1670
1672
|
}
|
|
1673
|
+
OnRowsPerPageChange(event) {
|
|
1674
|
+
// this.RowsPerPage = Number(event.target.value);
|
|
1675
|
+
this.RowsPerPage = Number(event.target.value);
|
|
1676
|
+
this.ResetTable();
|
|
1677
|
+
}
|
|
1671
1678
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1672
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.1", type: TableComponent, isStandalone: true, selector: "intelica-table", inputs: { ComponentId: "ComponentId", ListData: "ListData", ShowSearch: "ShowSearch", ListSearchOptions: "ListSearchOptions", ShowPagination: "ShowPagination", RowsPerPage: "RowsPerPage", ShowCheckbox: "ShowCheckbox", ShowIndex: "ShowIndex", ListDataSelected: "ListDataSelected", SelectedIdentifier: "SelectedIdentifier", ClassName: "ClassName" }, outputs: { EmitSelectedItem: "EmitSelectedItem", EmitListDataFilter: "EmitListDataFilter", EmitSearchEvent: "EmitSearchEvent", EmitSortEvent: "EmitSortEvent" }, queries: [{ propertyName: "AdditionalTemplate", first: true, predicate: ["additionalTemplate"], descendants: true }, { propertyName: "AdditionalCentralTemplate", first: true, predicate: ["additionalCentralTemplate"], descendants: true }, { propertyName: "Columns", predicate: ColumnComponent }, { propertyName: "ColumnGroups", predicate: ColumnGroupComponent }, { propertyName: "RowResumenGroups", predicate: RowResumenComponent }], viewQueries: [{ propertyName: "PaginatorTable", first: true, predicate: ["paginatorTable"], descendants: true }, { propertyName: "SearchTable", first: true, predicate: ["searchTable"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"prTable\">\r\n\t<div class=\"prTableTools\">\r\n\t\t<div class=\"prTableTools__additional\">\r\n\t\t\t@if (AdditionalTemplate) {\r\n\t\t\t<ng-container *ngTemplateOutlet=\"AdditionalTemplate\"></ng-container>\r\n\t\t\t}\r\n\t\t</div>\r\n\t\t@if (ShowSearch) {\r\n\t\t<intelica-search\r\n\t\t\t#searchTable\r\n\t\t\t[ComponentId]=\"ComponentId + 'Search'\"\r\n\t\t\t(OnSearch)=\"ExecuteSearch($event)\"\r\n\t\t\t[SearchFieldOptions]=\"ListSearchOptionsSimple\"\r\n\t\t\t[SearchOnKeyup]=\"false\"\r\n\t\t\t[SimpleSearchInput]=\"false\"\r\n\t\t></intelica-search>\r\n\t\t} @if (AdditionalCentralTemplate) {\r\n\t\t<div>\r\n\t\t\t<ng-container *ngTemplateOutlet=\"AdditionalCentralTemplate\"></ng-container>\r\n\t\t</div>\r\n\t\t} @if (ShowPagination) {\r\n\t\t<intelica-paginator #paginatorTable [TotalItems]=\"ListDataFilter.length\" [ItemsPerPage]=\"RowsPerPage\" (PageChange)=\"OnPageChange($event)\"></intelica-paginator>\r\n\t\t}\r\n\t</div>\r\n\t<p-table\r\n\t\tclass=\"prTableBasic\"\r\n\t\t[ngClass]=\"ClassName\"\r\n\t\t[value]=\"ListDataTable\"\r\n\t\tresponsiveLayout=\"scroll\"\r\n\t\t[(selection)]=\"ListDataSelectedFilter\"\r\n\t\t(onHeaderCheckboxToggle)=\"SelectAll($event)\"\r\n\t\t(onRowSelect)=\"OnRowSelect($event)\"\r\n\t\t(onRowUnselect)=\"OnRowUnselect($event)\"\r\n\t>\r\n\t\t<!-- Encabezados -->\r\n\t\t<ng-template pTemplate=\"header\">\r\n\t\t\t<tr>\r\n\t\t\t\t@for (col of ColumnGroupList; track $index) {\r\n\t\t\t\t<th [attr.colspan]=\"col.colspan\" [attr.rowspan]=\"col.rowspan\" [pSortableColumn]=\"col.sortable ? col.field : ''\" [style.min-width]=\"col.minWidth\" (click)=\"OnSort(col.field)\">\r\n\t\t\t\t\t<div>\r\n\t\t\t\t\t\t<span pTooltip=\"{{ col.header }}\">{{ col.header }}</span>\r\n\t\t\t\t\t\t<p-sortIcon *ngIf=\"col.sortable\" [field]=\"col.field\"></p-sortIcon>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</th>\r\n\t\t\t\t} @if (ShowCheckbox && ColumnGroupList.length != 0) {\r\n\t\t\t\t<th class=\"text-center\" style=\"width: 4%\" rowspan=\"2\">\r\n\t\t\t\t\t<p-tableHeaderCheckbox class=\"prCheckbox\" [ngClass]=\"{ 'prCheckbox--indeterminate': ListDataSelectedTemp.length > 0 && ListDataSelectedTemp.length < ListDataFilter.length }\" />\r\n\t\t\t\t</th>\r\n\t\t\t\t}\r\n\t\t\t</tr>\r\n\t\t\t<tr>\r\n\t\t\t\t@for (col of ColumnList; track $index) { @if(col.showHeader ){\r\n\t\t\t\t<th [class]=\"col.className\" [pSortableColumn]=\"col.sortable ? col.field : ''\" [style.width]=\"col.width\" [style.min-width]=\"col.minWidth\" (click)=\"OnSort(col.field)\">\r\n\t\t\t\t\t<div>\r\n\t\t\t\t\t\t<span pTooltip=\"{{ col.headerTooltip }}\" tooltipPosition=\"{{ col.headerTooltipPosition }}\">{{ col.header }}</span>\r\n\t\t\t\t\t\t<p-sortIcon *ngIf=\"col.sortable\" [field]=\"col.field\"></p-sortIcon>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</th>\r\n\t\t\t\t} } @if(ShowCheckbox && ColumnGroupList.length == 0 ){\r\n\t\t\t\t<th class=\"text-center\" style=\"width: 4%\">\r\n\t\t\t\t\t<p-tableHeaderCheckbox class=\"prCheckbox\" [ngClass]=\"{ 'prCheckbox--indeterminate': ListDataSelectedTemp.length > 0 && ListDataSelectedTemp.length < ListDataFilter.length }\" />\r\n\t\t\t\t</th>\r\n\t\t\t\t}\r\n\t\t\t</tr>\r\n\t\t\t@if (ListDataFilter.length > 0) {\r\n\t\t\t<tr class=\"fixedRow\">\r\n\t\t\t\t@for (col of RowResumenList; track $index) {\r\n\t\t\t\t<td [ngClass]=\"col.className\" [attr.colspan]=\"col.colspan\" [attr.rowspan]=\"col.rowspan\">\r\n\t\t\t\t\t@if (col.templateRef) {\r\n\t\t\t\t\t<span>\r\n\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"col.templateRef\"></ng-container>\r\n\t\t\t\t\t</span>\r\n\t\t\t\t\t} @else {\r\n\t\t\t\t\t<ng-template #defaultContent></ng-template>\r\n\t\t\t\t\t}\r\n\t\t\t\t</td>\r\n\t\t\t\t}\r\n\t\t\t</tr>\r\n\t\t\t}\r\n\t\t</ng-template>\r\n\t\t<!-- Cuerpo de la tabla -->\r\n\t\t<ng-template pTemplate=\"body\" let-rowData let-rowIndex=\"rowIndex\">\r\n\t\t\t<tr>\r\n\t\t\t\t@for (col of ColumnList; track $index) {\r\n\t\t\t\t<td [ngClass]=\"col.className\">\r\n\t\t\t\t\t@if (col.showIndex) {\r\n\t\t\t\t\t{{ rowIndex + 1 + (CurrentPage - 1) * RowsPerPage }}\r\n\t\t\t\t\t} @else { @if (col.templateRef) {\r\n\t\t\t\t\t<ng-container *ngTemplateOutlet=\"col.templateRef; context: { $implicit: rowData }\"></ng-container>\r\n\t\t\t\t\t} @else {\r\n\t\t\t\t\t<span class=\"text-breakWord\" pTooltip=\"{{ col.tooltip }}\" tooltipPosition=\"{{ col.tooltipPosition }}\">\r\n\t\t\t\t\t\t{{ rowData[col.field] }}\r\n\t\t\t\t\t</span>\r\n\t\t\t\t\t} }\r\n\t\t\t\t</td>\r\n\t\t\t\t} @if (ShowCheckbox) {\r\n\t\t\t\t<td class=\"text-center\">\r\n\t\t\t\t\t<p-tableCheckbox [value]=\"rowData\" class=\"prCheckbox\" />\r\n\t\t\t\t</td>\r\n\t\t\t\t}\r\n\t\t\t</tr>\r\n\t\t</ng-template>\r\n\t\t<ng-template #emptymessage>\r\n\t\t\t<tr>\r\n\t\t\t\t<td [attr.colspan]=\"ColumnList.length + (ShowCheckbox ? 1 : 0)\" class=\"text-center\">\r\n\t\t\t\t\t{{ \"Nodata\" | term : GlobalTermService.languageCode }}\r\n\t\t\t\t</td>\r\n\t\t\t</tr>\r\n\t\t</ng-template>\r\n\t</p-table>\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SearchComponent, selector: "intelica-search", inputs: ["ComponentId", "SearchFieldOptions", "SearchOnKeyup", "SimpleSearchInput", "Placeholder"], outputs: ["OnSearch"] }, { kind: "component", type: PaginatorComponent, selector: "intelica-paginator", inputs: ["TotalItems", "CurrentPage", "ItemsPerPage"], outputs: ["PageChange"] }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i2$1.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "size", "showGridlines", "stripedRows", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "virtualRowHeight", "selectAll"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i3$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i2$1.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "component", type: i2$1.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i2$1.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i2$1.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "ngmodule", type: BadgeModule }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i4.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "pipe", type: TermPipe, name: "term" }] });
|
|
1679
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.1", type: TableComponent, isStandalone: true, selector: "intelica-table", inputs: { ComponentId: "ComponentId", ListData: "ListData", ShowRowPerPage: "ShowRowPerPage", ShowSearch: "ShowSearch", ListSearchOptions: "ListSearchOptions", ShowPagination: "ShowPagination", RowsPerPage: "RowsPerPage", ShowCheckbox: "ShowCheckbox", ShowIndex: "ShowIndex", ListDataSelected: "ListDataSelected", SelectedIdentifier: "SelectedIdentifier", ClassName: "ClassName" }, outputs: { EmitSelectedItem: "EmitSelectedItem", EmitListDataFilter: "EmitListDataFilter", EmitSearchEvent: "EmitSearchEvent", EmitSortEvent: "EmitSortEvent" }, queries: [{ propertyName: "AdditionalTemplate", first: true, predicate: ["additionalTemplate"], descendants: true }, { propertyName: "AdditionalCentralTemplate", first: true, predicate: ["additionalCentralTemplate"], descendants: true }, { propertyName: "Columns", predicate: ColumnComponent }, { propertyName: "ColumnGroups", predicate: ColumnGroupComponent }, { propertyName: "RowResumenGroups", predicate: RowResumenComponent }], viewQueries: [{ propertyName: "PaginatorTable", first: true, predicate: ["paginatorTable"], descendants: true }, { propertyName: "SearchTable", first: true, predicate: ["searchTable"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"prTable\">\r\n\t<div class=\"prTableTools\">\r\n\t\t<div class=\"prTableTools__additional\">\r\n\t\t\t@if (AdditionalTemplate) {\r\n\t\t\t<ng-container *ngTemplateOutlet=\"AdditionalTemplate\"></ng-container>\r\n\t\t\t}\r\n\t\t</div>\r\n\t\t@if (ShowSearch) {\r\n\t\t<intelica-search\r\n\t\t\t#searchTable\r\n\t\t\t[ComponentId]=\"ComponentId + 'Search'\"\r\n\t\t\t(OnSearch)=\"ExecuteSearch($event)\"\r\n\t\t\t[SearchFieldOptions]=\"ListSearchOptionsSimple\"\r\n\t\t\t[SearchOnKeyup]=\"false\"\r\n\t\t\t[SimpleSearchInput]=\"false\"\r\n\t\t></intelica-search>\r\n\t\t} @if (AdditionalCentralTemplate) {\r\n\t\t<div>\r\n\t\t\t<ng-container *ngTemplateOutlet=\"AdditionalCentralTemplate\"></ng-container>\r\n\t\t</div>\r\n\t\t}\r\n\t\t<!-- @if (ShowPagination) {\r\n\t\t<intelica-paginator #paginatorTable [TotalItems]=\"ListDataFilter.length\" [ItemsPerPage]=\"RowsPerPage\" (PageChange)=\"OnPageChange($event)\"></intelica-paginator>\r\n\t\t} -->\r\n\t</div>\r\n\t<p-table\r\n\t\tclass=\"prTableBasic\"\r\n\t\t[ngClass]=\"ClassName\"\r\n\t\t[value]=\"ListDataTable\"\r\n\t\tresponsiveLayout=\"scroll\"\r\n\t\t[(selection)]=\"ListDataSelectedFilter\"\r\n\t\t(onHeaderCheckboxToggle)=\"SelectAll($event)\"\r\n\t\t(onRowSelect)=\"OnRowSelect($event)\"\r\n\t\t(onRowUnselect)=\"OnRowUnselect($event)\"\r\n\t>\r\n\t\t<!-- Encabezados -->\r\n\t\t<ng-template pTemplate=\"header\">\r\n\t\t\t<tr>\r\n\t\t\t\t@for (col of ColumnGroupList; track $index) {\r\n\t\t\t\t<th [attr.colspan]=\"col.colspan\" [attr.rowspan]=\"col.rowspan\" [pSortableColumn]=\"col.sortable ? col.field : ''\" [style.min-width]=\"col.minWidth\" (click)=\"OnSort(col.field)\">\r\n\t\t\t\t\t<div>\r\n\t\t\t\t\t\t<span pTooltip=\"{{ col.header }}\">{{ col.header }}</span>\r\n\t\t\t\t\t\t<p-sortIcon *ngIf=\"col.sortable\" [field]=\"col.field\"></p-sortIcon>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</th>\r\n\t\t\t\t} @if (ShowCheckbox && ColumnGroupList.length != 0) {\r\n\t\t\t\t<th class=\"text-center\" style=\"width: 4%\" rowspan=\"2\">\r\n\t\t\t\t\t<p-tableHeaderCheckbox class=\"prCheckbox\" [ngClass]=\"{ 'prCheckbox--indeterminate': ListDataSelectedTemp.length > 0 && ListDataSelectedTemp.length < ListDataFilter.length }\" />\r\n\t\t\t\t</th>\r\n\t\t\t\t}\r\n\t\t\t</tr>\r\n\t\t\t<tr>\r\n\t\t\t\t@for (col of ColumnList; track $index) { @if(col.showHeader ){\r\n\t\t\t\t<th [class]=\"col.className\" [pSortableColumn]=\"col.sortable ? col.field : ''\" [style.width]=\"col.width\" [style.min-width]=\"col.minWidth\" (click)=\"OnSort(col.field)\">\r\n\t\t\t\t\t<div>\r\n\t\t\t\t\t\t<span pTooltip=\"{{ col.headerTooltip }}\" tooltipPosition=\"{{ col.headerTooltipPosition }}\">{{ col.header }}</span>\r\n\t\t\t\t\t\t<p-sortIcon *ngIf=\"col.sortable\" [field]=\"col.field\"></p-sortIcon>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</th>\r\n\t\t\t\t} } @if(ShowCheckbox && ColumnGroupList.length == 0 ){\r\n\t\t\t\t<th class=\"text-center\" style=\"width: 4%\">\r\n\t\t\t\t\t<p-tableHeaderCheckbox class=\"prCheckbox\" [ngClass]=\"{ 'prCheckbox--indeterminate': ListDataSelectedTemp.length > 0 && ListDataSelectedTemp.length < ListDataFilter.length }\" />\r\n\t\t\t\t</th>\r\n\t\t\t\t}\r\n\t\t\t</tr>\r\n\t\t\t@if (ListDataFilter.length > 0) {\r\n\t\t\t<tr class=\"fixedRow\">\r\n\t\t\t\t@for (col of RowResumenList; track $index) {\r\n\t\t\t\t<td [ngClass]=\"col.className\" [attr.colspan]=\"col.colspan\" [attr.rowspan]=\"col.rowspan\">\r\n\t\t\t\t\t@if (col.templateRef) {\r\n\t\t\t\t\t<span>\r\n\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"col.templateRef\"></ng-container>\r\n\t\t\t\t\t</span>\r\n\t\t\t\t\t} @else {\r\n\t\t\t\t\t<ng-template #defaultContent></ng-template>\r\n\t\t\t\t\t}\r\n\t\t\t\t</td>\r\n\t\t\t\t}\r\n\t\t\t</tr>\r\n\t\t\t}\r\n\t\t</ng-template>\r\n\t\t<!-- Cuerpo de la tabla -->\r\n\t\t<ng-template pTemplate=\"body\" let-rowData let-rowIndex=\"rowIndex\">\r\n\t\t\t<tr>\r\n\t\t\t\t@for (col of ColumnList; track $index) {\r\n\t\t\t\t<td [ngClass]=\"col.className\">\r\n\t\t\t\t\t@if (col.showIndex) {\r\n\t\t\t\t\t{{ rowIndex + 1 + (CurrentPage - 1) * RowsPerPage }}\r\n\t\t\t\t\t} @else { @if (col.templateRef) {\r\n\t\t\t\t\t<ng-container *ngTemplateOutlet=\"col.templateRef; context: { $implicit: rowData }\"></ng-container>\r\n\t\t\t\t\t} @else {\r\n\t\t\t\t\t<span class=\"text-breakWord\" pTooltip=\"{{ col.tooltip }}\" tooltipPosition=\"{{ col.tooltipPosition }}\">\r\n\t\t\t\t\t\t{{ rowData[col.field] }}\r\n\t\t\t\t\t</span>\r\n\t\t\t\t\t} }\r\n\t\t\t\t</td>\r\n\t\t\t\t} @if (ShowCheckbox) {\r\n\t\t\t\t<td class=\"text-center\">\r\n\t\t\t\t\t<p-tableCheckbox [value]=\"rowData\" class=\"prCheckbox\" />\r\n\t\t\t\t</td>\r\n\t\t\t\t}\r\n\t\t\t</tr>\r\n\t\t</ng-template>\r\n\t\t<ng-template #emptymessage>\r\n\t\t\t<tr>\r\n\t\t\t\t<td [attr.colspan]=\"ColumnList.length + (ShowCheckbox ? 1 : 0)\" class=\"text-center\">\r\n\t\t\t\t\t{{ \"Nodata\" | term : GlobalTermService.languageCode }}\r\n\t\t\t\t</td>\r\n\t\t\t</tr>\r\n\t\t</ng-template>\r\n\t</p-table>\r\n\t<!-- Record per page and paginator area begins -->\r\n\t<div class=\"prTableToolsBottom\">\r\n\t\t@if(ShowRowPerPage){\r\n\t\t<div class=\"prTableToolsBottom__itemPerPage\">\r\n\t\t\t{{ \"ItemPerPage\" | term : GlobalTermService.languageCode }}\r\n\t\t\t<select name=\"pageSize\" [value]=\"RowsPerPage\" (change)=\"OnRowsPerPageChange($event)\">\r\n\t\t\t\t<option *ngFor=\"let size of AllowedPageSizes\" [value]=\"size\">{{ size }}</option>\r\n\t\t\t</select>\r\n\t\t\t<label for=\"pageSize\" class=\"control-label\">{{ \"RecordPerPage\" | term : GlobalTermService.languageCode }}</label>\r\n\t\t</div>\r\n\t\t} @if (ShowPagination) {\r\n\t\t<intelica-paginator #paginatorTable [TotalItems]=\"ListDataFilter.length\" [ItemsPerPage]=\"RowsPerPage\" (PageChange)=\"OnPageChange($event)\"></intelica-paginator>\r\n\t\t}\r\n\t</div>\r\n\t<!-- Record per page and paginator area ends -->\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SearchComponent, selector: "intelica-search", inputs: ["ComponentId", "SearchFieldOptions", "SearchOnKeyup", "SimpleSearchInput", "Placeholder"], outputs: ["OnSearch"] }, { kind: "component", type: PaginatorComponent, selector: "intelica-paginator", inputs: ["TotalItems", "CurrentPage", "ItemsPerPage"], outputs: ["PageChange"] }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i2$1.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "size", "showGridlines", "stripedRows", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "virtualRowHeight", "selectAll"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i3$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i2$1.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "component", type: i2$1.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i2$1.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i2$1.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "ngmodule", type: BadgeModule }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i4.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "pipe", type: TermPipe, name: "term" }] });
|
|
1673
1680
|
}
|
|
1674
1681
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: TableComponent, decorators: [{
|
|
1675
1682
|
type: Component,
|
|
1676
|
-
args: [{ selector: "intelica-table", standalone: true, imports: [CommonModule, SearchComponent, PaginatorComponent, TableModule, BadgeModule, TooltipModule, TermPipe], template: "<div class=\"prTable\">\r\n\t<div class=\"prTableTools\">\r\n\t\t<div class=\"prTableTools__additional\">\r\n\t\t\t@if (AdditionalTemplate) {\r\n\t\t\t<ng-container *ngTemplateOutlet=\"AdditionalTemplate\"></ng-container>\r\n\t\t\t}\r\n\t\t</div>\r\n\t\t@if (ShowSearch) {\r\n\t\t<intelica-search\r\n\t\t\t#searchTable\r\n\t\t\t[ComponentId]=\"ComponentId + 'Search'\"\r\n\t\t\t(OnSearch)=\"ExecuteSearch($event)\"\r\n\t\t\t[SearchFieldOptions]=\"ListSearchOptionsSimple\"\r\n\t\t\t[SearchOnKeyup]=\"false\"\r\n\t\t\t[SimpleSearchInput]=\"false\"\r\n\t\t></intelica-search>\r\n\t\t} @if (AdditionalCentralTemplate) {\r\n\t\t<div>\r\n\t\t\t<ng-container *ngTemplateOutlet=\"AdditionalCentralTemplate\"></ng-container>\r\n\t\t</div>\r\n\t\t} @if (ShowPagination) {\r\n\t\t<intelica-paginator #paginatorTable [TotalItems]=\"ListDataFilter.length\" [ItemsPerPage]=\"RowsPerPage\" (PageChange)=\"OnPageChange($event)\"></intelica-paginator>\r\n\t\t}
|
|
1683
|
+
args: [{ selector: "intelica-table", standalone: true, imports: [CommonModule, SearchComponent, PaginatorComponent, TableModule, BadgeModule, TooltipModule, TermPipe], template: "<div class=\"prTable\">\r\n\t<div class=\"prTableTools\">\r\n\t\t<div class=\"prTableTools__additional\">\r\n\t\t\t@if (AdditionalTemplate) {\r\n\t\t\t<ng-container *ngTemplateOutlet=\"AdditionalTemplate\"></ng-container>\r\n\t\t\t}\r\n\t\t</div>\r\n\t\t@if (ShowSearch) {\r\n\t\t<intelica-search\r\n\t\t\t#searchTable\r\n\t\t\t[ComponentId]=\"ComponentId + 'Search'\"\r\n\t\t\t(OnSearch)=\"ExecuteSearch($event)\"\r\n\t\t\t[SearchFieldOptions]=\"ListSearchOptionsSimple\"\r\n\t\t\t[SearchOnKeyup]=\"false\"\r\n\t\t\t[SimpleSearchInput]=\"false\"\r\n\t\t></intelica-search>\r\n\t\t} @if (AdditionalCentralTemplate) {\r\n\t\t<div>\r\n\t\t\t<ng-container *ngTemplateOutlet=\"AdditionalCentralTemplate\"></ng-container>\r\n\t\t</div>\r\n\t\t}\r\n\t\t<!-- @if (ShowPagination) {\r\n\t\t<intelica-paginator #paginatorTable [TotalItems]=\"ListDataFilter.length\" [ItemsPerPage]=\"RowsPerPage\" (PageChange)=\"OnPageChange($event)\"></intelica-paginator>\r\n\t\t} -->\r\n\t</div>\r\n\t<p-table\r\n\t\tclass=\"prTableBasic\"\r\n\t\t[ngClass]=\"ClassName\"\r\n\t\t[value]=\"ListDataTable\"\r\n\t\tresponsiveLayout=\"scroll\"\r\n\t\t[(selection)]=\"ListDataSelectedFilter\"\r\n\t\t(onHeaderCheckboxToggle)=\"SelectAll($event)\"\r\n\t\t(onRowSelect)=\"OnRowSelect($event)\"\r\n\t\t(onRowUnselect)=\"OnRowUnselect($event)\"\r\n\t>\r\n\t\t<!-- Encabezados -->\r\n\t\t<ng-template pTemplate=\"header\">\r\n\t\t\t<tr>\r\n\t\t\t\t@for (col of ColumnGroupList; track $index) {\r\n\t\t\t\t<th [attr.colspan]=\"col.colspan\" [attr.rowspan]=\"col.rowspan\" [pSortableColumn]=\"col.sortable ? col.field : ''\" [style.min-width]=\"col.minWidth\" (click)=\"OnSort(col.field)\">\r\n\t\t\t\t\t<div>\r\n\t\t\t\t\t\t<span pTooltip=\"{{ col.header }}\">{{ col.header }}</span>\r\n\t\t\t\t\t\t<p-sortIcon *ngIf=\"col.sortable\" [field]=\"col.field\"></p-sortIcon>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</th>\r\n\t\t\t\t} @if (ShowCheckbox && ColumnGroupList.length != 0) {\r\n\t\t\t\t<th class=\"text-center\" style=\"width: 4%\" rowspan=\"2\">\r\n\t\t\t\t\t<p-tableHeaderCheckbox class=\"prCheckbox\" [ngClass]=\"{ 'prCheckbox--indeterminate': ListDataSelectedTemp.length > 0 && ListDataSelectedTemp.length < ListDataFilter.length }\" />\r\n\t\t\t\t</th>\r\n\t\t\t\t}\r\n\t\t\t</tr>\r\n\t\t\t<tr>\r\n\t\t\t\t@for (col of ColumnList; track $index) { @if(col.showHeader ){\r\n\t\t\t\t<th [class]=\"col.className\" [pSortableColumn]=\"col.sortable ? col.field : ''\" [style.width]=\"col.width\" [style.min-width]=\"col.minWidth\" (click)=\"OnSort(col.field)\">\r\n\t\t\t\t\t<div>\r\n\t\t\t\t\t\t<span pTooltip=\"{{ col.headerTooltip }}\" tooltipPosition=\"{{ col.headerTooltipPosition }}\">{{ col.header }}</span>\r\n\t\t\t\t\t\t<p-sortIcon *ngIf=\"col.sortable\" [field]=\"col.field\"></p-sortIcon>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</th>\r\n\t\t\t\t} } @if(ShowCheckbox && ColumnGroupList.length == 0 ){\r\n\t\t\t\t<th class=\"text-center\" style=\"width: 4%\">\r\n\t\t\t\t\t<p-tableHeaderCheckbox class=\"prCheckbox\" [ngClass]=\"{ 'prCheckbox--indeterminate': ListDataSelectedTemp.length > 0 && ListDataSelectedTemp.length < ListDataFilter.length }\" />\r\n\t\t\t\t</th>\r\n\t\t\t\t}\r\n\t\t\t</tr>\r\n\t\t\t@if (ListDataFilter.length > 0) {\r\n\t\t\t<tr class=\"fixedRow\">\r\n\t\t\t\t@for (col of RowResumenList; track $index) {\r\n\t\t\t\t<td [ngClass]=\"col.className\" [attr.colspan]=\"col.colspan\" [attr.rowspan]=\"col.rowspan\">\r\n\t\t\t\t\t@if (col.templateRef) {\r\n\t\t\t\t\t<span>\r\n\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"col.templateRef\"></ng-container>\r\n\t\t\t\t\t</span>\r\n\t\t\t\t\t} @else {\r\n\t\t\t\t\t<ng-template #defaultContent></ng-template>\r\n\t\t\t\t\t}\r\n\t\t\t\t</td>\r\n\t\t\t\t}\r\n\t\t\t</tr>\r\n\t\t\t}\r\n\t\t</ng-template>\r\n\t\t<!-- Cuerpo de la tabla -->\r\n\t\t<ng-template pTemplate=\"body\" let-rowData let-rowIndex=\"rowIndex\">\r\n\t\t\t<tr>\r\n\t\t\t\t@for (col of ColumnList; track $index) {\r\n\t\t\t\t<td [ngClass]=\"col.className\">\r\n\t\t\t\t\t@if (col.showIndex) {\r\n\t\t\t\t\t{{ rowIndex + 1 + (CurrentPage - 1) * RowsPerPage }}\r\n\t\t\t\t\t} @else { @if (col.templateRef) {\r\n\t\t\t\t\t<ng-container *ngTemplateOutlet=\"col.templateRef; context: { $implicit: rowData }\"></ng-container>\r\n\t\t\t\t\t} @else {\r\n\t\t\t\t\t<span class=\"text-breakWord\" pTooltip=\"{{ col.tooltip }}\" tooltipPosition=\"{{ col.tooltipPosition }}\">\r\n\t\t\t\t\t\t{{ rowData[col.field] }}\r\n\t\t\t\t\t</span>\r\n\t\t\t\t\t} }\r\n\t\t\t\t</td>\r\n\t\t\t\t} @if (ShowCheckbox) {\r\n\t\t\t\t<td class=\"text-center\">\r\n\t\t\t\t\t<p-tableCheckbox [value]=\"rowData\" class=\"prCheckbox\" />\r\n\t\t\t\t</td>\r\n\t\t\t\t}\r\n\t\t\t</tr>\r\n\t\t</ng-template>\r\n\t\t<ng-template #emptymessage>\r\n\t\t\t<tr>\r\n\t\t\t\t<td [attr.colspan]=\"ColumnList.length + (ShowCheckbox ? 1 : 0)\" class=\"text-center\">\r\n\t\t\t\t\t{{ \"Nodata\" | term : GlobalTermService.languageCode }}\r\n\t\t\t\t</td>\r\n\t\t\t</tr>\r\n\t\t</ng-template>\r\n\t</p-table>\r\n\t<!-- Record per page and paginator area begins -->\r\n\t<div class=\"prTableToolsBottom\">\r\n\t\t@if(ShowRowPerPage){\r\n\t\t<div class=\"prTableToolsBottom__itemPerPage\">\r\n\t\t\t{{ \"ItemPerPage\" | term : GlobalTermService.languageCode }}\r\n\t\t\t<select name=\"pageSize\" [value]=\"RowsPerPage\" (change)=\"OnRowsPerPageChange($event)\">\r\n\t\t\t\t<option *ngFor=\"let size of AllowedPageSizes\" [value]=\"size\">{{ size }}</option>\r\n\t\t\t</select>\r\n\t\t\t<label for=\"pageSize\" class=\"control-label\">{{ \"RecordPerPage\" | term : GlobalTermService.languageCode }}</label>\r\n\t\t</div>\r\n\t\t} @if (ShowPagination) {\r\n\t\t<intelica-paginator #paginatorTable [TotalItems]=\"ListDataFilter.length\" [ItemsPerPage]=\"RowsPerPage\" (PageChange)=\"OnPageChange($event)\"></intelica-paginator>\r\n\t\t}\r\n\t</div>\r\n\t<!-- Record per page and paginator area ends -->\r\n</div>\r\n" }]
|
|
1677
1684
|
}], ctorParameters: () => [], propDecorators: { ComponentId: [{
|
|
1678
1685
|
type: Input
|
|
1679
1686
|
}], ListData: [{
|
|
1680
1687
|
type: Input
|
|
1688
|
+
}], ShowRowPerPage: [{
|
|
1689
|
+
type: Input
|
|
1681
1690
|
}], ShowSearch: [{
|
|
1682
1691
|
type: Input
|
|
1683
1692
|
}], ListSearchOptions: [{
|
|
@@ -2508,28 +2517,28 @@ class HtmlToExcelService {
|
|
|
2508
2517
|
let Table = document.getElementById(idTabla);
|
|
2509
2518
|
if (Table == null)
|
|
2510
2519
|
return;
|
|
2511
|
-
Table.innerHTML =
|
|
2520
|
+
Table.innerHTML = '';
|
|
2512
2521
|
Table.innerHTML += html;
|
|
2513
2522
|
const ws = XLSX.utils.table_to_sheet(Table, { raw: false });
|
|
2514
2523
|
const wb = XLSX.utils.book_new();
|
|
2515
2524
|
XLSX.utils.book_append_sheet(wb, ws, tabname);
|
|
2516
|
-
XLSX.writeFile(wb, filename +
|
|
2525
|
+
XLSX.writeFile(wb, filename + '.' + extension);
|
|
2517
2526
|
}
|
|
2518
|
-
Logo = "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";
|
|
2527
|
+
Logo = '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';
|
|
2519
2528
|
ColumnAligment = {
|
|
2520
|
-
vertical:
|
|
2521
|
-
horizontal:
|
|
2529
|
+
vertical: 'middle',
|
|
2530
|
+
horizontal: 'center',
|
|
2522
2531
|
wrapText: true,
|
|
2523
2532
|
};
|
|
2524
|
-
async ExportToExcel(excelName, reportTitle, filterTitle, rowsSerializate, columns, filters, subtitles = [], showTotalRow = false) {
|
|
2533
|
+
async ExportToExcel(excelName, reportTitle, filterTitle, rowsSerializate, columns, filters, subtitles = [], showTotalRow = false, headerGroups = []) {
|
|
2525
2534
|
const workbook = new Workbook();
|
|
2526
2535
|
const worksheet = workbook.addWorksheet(reportTitle);
|
|
2527
2536
|
worksheet.views = [{ showGridLines: false }];
|
|
2528
2537
|
const imageId = workbook.addImage({
|
|
2529
2538
|
base64: this.Logo,
|
|
2530
|
-
extension:
|
|
2539
|
+
extension: 'png',
|
|
2531
2540
|
});
|
|
2532
|
-
this.SetReportPage(rowsSerializate, worksheet, columns, imageId, subtitles, showTotalRow);
|
|
2541
|
+
this.SetReportPage(rowsSerializate, worksheet, columns, imageId, subtitles, showTotalRow, headerGroups);
|
|
2533
2542
|
this.SetTitle(worksheet, reportTitle);
|
|
2534
2543
|
if (filters.length > 0) {
|
|
2535
2544
|
const worksheetFilter = workbook.addWorksheet(filterTitle);
|
|
@@ -2540,123 +2549,187 @@ class HtmlToExcelService {
|
|
|
2540
2549
|
saveAs(new Blob([buffer]), excelName);
|
|
2541
2550
|
}
|
|
2542
2551
|
SetTitle(worksheet, reportTitle) {
|
|
2543
|
-
worksheet.mergeCells(
|
|
2544
|
-
const titleCell = worksheet.getCell(
|
|
2552
|
+
worksheet.mergeCells('D1:I5');
|
|
2553
|
+
const titleCell = worksheet.getCell('D1');
|
|
2545
2554
|
titleCell.value = reportTitle;
|
|
2546
2555
|
titleCell.font = {
|
|
2547
|
-
name:
|
|
2556
|
+
name: 'Arial',
|
|
2548
2557
|
bold: true,
|
|
2549
2558
|
size: 20,
|
|
2550
|
-
color: { argb:
|
|
2559
|
+
color: { argb: '203764' },
|
|
2551
2560
|
};
|
|
2552
|
-
titleCell.alignment =
|
|
2561
|
+
titleCell.alignment = this.ColumnAligment;
|
|
2553
2562
|
}
|
|
2554
|
-
SetReportPage(rowsSerializate, worksheet, columns, imageId, subtitles = [], showTotalRow = false) {
|
|
2563
|
+
SetReportPage(rowsSerializate, worksheet, columns, imageId, subtitles = [], showTotalRow = false, headerGroups = []) {
|
|
2555
2564
|
let columnsCell = [];
|
|
2556
2565
|
let cells = [];
|
|
2557
2566
|
let rows = JSON.parse(rowsSerializate);
|
|
2558
|
-
//Inserción de filas para imagen
|
|
2559
2567
|
const imageRows = 5;
|
|
2560
2568
|
const numberRows = rows.length;
|
|
2561
2569
|
for (let i = 0; i < subtitles.length + imageRows; i++) {
|
|
2562
|
-
worksheet.addRow([
|
|
2570
|
+
worksheet.addRow(['']);
|
|
2563
2571
|
}
|
|
2564
|
-
//Inserción de nombre de columnas
|
|
2565
|
-
let columnsNames = [];
|
|
2566
2572
|
let startRow = imageRows + 1 + subtitles.length;
|
|
2573
|
+
const groupedIndices = new Set();
|
|
2574
|
+
if (headerGroups.length > 0) {
|
|
2575
|
+
for (const group of headerGroups) {
|
|
2576
|
+
const startChar = this.getExcelColumnLetter(group.startColumn);
|
|
2577
|
+
const endChar = this.getExcelColumnLetter(group.endColumn);
|
|
2578
|
+
const range = `${startChar}${startRow}:${endChar}${startRow}`;
|
|
2579
|
+
worksheet.mergeCells(range);
|
|
2580
|
+
const cellGroup = `${startChar}${startRow}`;
|
|
2581
|
+
const cell = worksheet.getCell(cellGroup);
|
|
2582
|
+
cell.value = group.name;
|
|
2583
|
+
cell.font = {
|
|
2584
|
+
name: 'Arial',
|
|
2585
|
+
bold: true,
|
|
2586
|
+
size: 10,
|
|
2587
|
+
color: { argb: 'FFFFFF' },
|
|
2588
|
+
};
|
|
2589
|
+
cell.fill = {
|
|
2590
|
+
type: 'pattern',
|
|
2591
|
+
pattern: 'solid',
|
|
2592
|
+
fgColor: { argb: '17375e' },
|
|
2593
|
+
};
|
|
2594
|
+
cell.alignment = {
|
|
2595
|
+
vertical: 'middle',
|
|
2596
|
+
horizontal: 'center',
|
|
2597
|
+
wrapText: true,
|
|
2598
|
+
};
|
|
2599
|
+
for (let i = group.startColumn; i <= group.endColumn; i++) {
|
|
2600
|
+
groupedIndices.add(i);
|
|
2601
|
+
}
|
|
2602
|
+
}
|
|
2603
|
+
}
|
|
2567
2604
|
for (let i = 0; i < columns.length; i++) {
|
|
2568
|
-
|
|
2569
|
-
|
|
2570
|
-
|
|
2605
|
+
const colLetter = this.getExcelColumnLetter(i);
|
|
2606
|
+
const topCell = `${colLetter}${startRow}`;
|
|
2607
|
+
const bottomCell = `${colLetter}${startRow + 1}`;
|
|
2608
|
+
if (groupedIndices.has(i)) {
|
|
2609
|
+
columnsCell.push(bottomCell);
|
|
2610
|
+
worksheet.getCell(bottomCell).value = columns[i].displayColumnName;
|
|
2611
|
+
worksheet.getCell(bottomCell).alignment = {
|
|
2612
|
+
vertical: 'middle',
|
|
2613
|
+
horizontal: 'center',
|
|
2614
|
+
wrapText: true,
|
|
2615
|
+
};
|
|
2616
|
+
}
|
|
2617
|
+
else {
|
|
2618
|
+
worksheet.mergeCells(`${topCell}:${bottomCell}`);
|
|
2619
|
+
const cell = worksheet.getCell(topCell);
|
|
2620
|
+
cell.value = columns[i].displayColumnName;
|
|
2621
|
+
cell.font = {
|
|
2622
|
+
name: 'Arial',
|
|
2623
|
+
bold: true,
|
|
2624
|
+
size: 10,
|
|
2625
|
+
color: { argb: 'FFFFFF' },
|
|
2626
|
+
};
|
|
2627
|
+
cell.alignment = this.ColumnAligment;
|
|
2628
|
+
cell.fill = {
|
|
2629
|
+
type: 'pattern',
|
|
2630
|
+
pattern: 'solid',
|
|
2631
|
+
fgColor: { argb: '17375e' },
|
|
2632
|
+
};
|
|
2633
|
+
}
|
|
2571
2634
|
}
|
|
2572
|
-
|
|
2573
|
-
//Inserción y formato de sumatorias
|
|
2635
|
+
startRow += 2;
|
|
2574
2636
|
if (showTotalRow) {
|
|
2575
|
-
const sums = columns.map(col => {
|
|
2637
|
+
const sums = columns.map((col) => {
|
|
2638
|
+
if (col.columnName === '')
|
|
2639
|
+
return 'Total';
|
|
2576
2640
|
if (!col.totalRowValue)
|
|
2577
2641
|
return null;
|
|
2578
|
-
return
|
|
2579
|
-
|
|
2580
|
-
|
|
2581
|
-
}, 0);
|
|
2642
|
+
return col.totalRowValue
|
|
2643
|
+
? { formula: `"${col.totalRowValue}"`, result: col.totalRowValue }
|
|
2644
|
+
: null;
|
|
2582
2645
|
});
|
|
2583
|
-
const
|
|
2584
|
-
|
|
2585
|
-
|
|
2586
|
-
|
|
2587
|
-
|
|
2588
|
-
|
|
2589
|
-
|
|
2590
|
-
|
|
2591
|
-
}
|
|
2646
|
+
const insertedRow = worksheet.insertRow(startRow, sums);
|
|
2647
|
+
insertedRow.eachCell((cell, colNumber) => {
|
|
2648
|
+
const column = columns[colNumber - 1];
|
|
2649
|
+
cell.font = {
|
|
2650
|
+
name: 'Arial',
|
|
2651
|
+
bold: true,
|
|
2652
|
+
size: 10,
|
|
2653
|
+
color: { argb: 'FF7F00' },
|
|
2654
|
+
};
|
|
2655
|
+
cell.alignment = {
|
|
2656
|
+
vertical: 'middle',
|
|
2657
|
+
horizontal: column?.alignHorizontal ?? 'left',
|
|
2658
|
+
};
|
|
2659
|
+
cell.border = { bottom: { style: 'thin', color: { argb: 'FF7F00' } } };
|
|
2660
|
+
if (typeof cell.value === 'number') {
|
|
2661
|
+
cell.numFmt = '0.00';
|
|
2662
|
+
}
|
|
2592
2663
|
});
|
|
2593
|
-
startRow = startRow + 1;
|
|
2594
|
-
worksheet.insertRow(startRow, sumRow);
|
|
2595
2664
|
columns.forEach((col, index) => {
|
|
2596
|
-
const cellAddress = `${
|
|
2665
|
+
const cellAddress = `${this.getExcelColumnLetter(index)}${startRow}`;
|
|
2597
2666
|
const cell = worksheet.getCell(cellAddress);
|
|
2598
2667
|
cell.font = {
|
|
2599
|
-
name:
|
|
2668
|
+
name: 'Arial',
|
|
2600
2669
|
bold: true,
|
|
2601
2670
|
size: 10,
|
|
2602
|
-
color: { argb:
|
|
2671
|
+
color: { argb: 'FF7F00' },
|
|
2603
2672
|
};
|
|
2604
2673
|
cell.alignment = {
|
|
2605
|
-
vertical:
|
|
2606
|
-
horizontal: col.
|
|
2674
|
+
vertical: 'middle',
|
|
2675
|
+
horizontal: col.alignHorizontal ?? 'left',
|
|
2607
2676
|
};
|
|
2608
|
-
cell.border = { bottom: { style:
|
|
2677
|
+
cell.border = { bottom: { style: 'thin', color: { argb: 'FF7F00' } } };
|
|
2609
2678
|
});
|
|
2679
|
+
startRow++;
|
|
2610
2680
|
}
|
|
2611
2681
|
//Inserción de filas
|
|
2612
2682
|
for (let rowIndex = 0; rowIndex < numberRows; rowIndex++) {
|
|
2613
|
-
|
|
2614
|
-
let
|
|
2615
|
-
|
|
2616
|
-
|
|
2617
|
-
|
|
2618
|
-
rowCells.push(cell);
|
|
2619
|
-
if (columIndex == 0) {
|
|
2620
|
-
rowValues.push(`${rowIndex + 1}`);
|
|
2621
|
-
continue;
|
|
2622
|
-
}
|
|
2623
|
-
rowValues.push(rows[rowIndex][columns[columIndex].columnName]);
|
|
2683
|
+
const rowValues = [];
|
|
2684
|
+
for (let colIndex = 0; colIndex < columns.length; colIndex++) {
|
|
2685
|
+
rowValues.push(colIndex === 0
|
|
2686
|
+
? `${rowIndex + 1}`
|
|
2687
|
+
: rows[rowIndex][columns[colIndex].columnName]);
|
|
2624
2688
|
}
|
|
2625
|
-
worksheet.addRow(rowValues);
|
|
2626
|
-
|
|
2689
|
+
const insertedRow = worksheet.addRow(rowValues);
|
|
2690
|
+
insertedRow.eachCell((cell, colNumber) => {
|
|
2691
|
+
const col = columns[colNumber - 1];
|
|
2692
|
+
cell.alignment = {
|
|
2693
|
+
vertical: 'middle',
|
|
2694
|
+
horizontal: col.alignHorizontal ?? 'left',
|
|
2695
|
+
wrapText: true,
|
|
2696
|
+
};
|
|
2697
|
+
});
|
|
2627
2698
|
}
|
|
2628
2699
|
//Formato nombre de columnas
|
|
2629
|
-
columnsCell.
|
|
2630
|
-
worksheet.getCell(
|
|
2631
|
-
|
|
2632
|
-
|
|
2633
|
-
|
|
2634
|
-
|
|
2700
|
+
columnsCell.forEach((cellRef) => {
|
|
2701
|
+
const cell = worksheet.getCell(cellRef);
|
|
2702
|
+
cell.fill = {
|
|
2703
|
+
type: 'pattern',
|
|
2704
|
+
pattern: 'solid',
|
|
2705
|
+
fgColor: { argb: '17375e' },
|
|
2635
2706
|
};
|
|
2636
|
-
|
|
2637
|
-
name:
|
|
2707
|
+
cell.font = {
|
|
2708
|
+
name: 'Arial',
|
|
2638
2709
|
bold: true,
|
|
2639
2710
|
size: 10,
|
|
2640
|
-
color: { argb:
|
|
2711
|
+
color: { argb: 'FFFFFF' },
|
|
2641
2712
|
};
|
|
2642
|
-
|
|
2713
|
+
cell.alignment = this.ColumnAligment;
|
|
2643
2714
|
});
|
|
2644
2715
|
//Formato de filas
|
|
2645
|
-
|
|
2646
|
-
|
|
2647
|
-
|
|
2648
|
-
|
|
2649
|
-
|
|
2650
|
-
|
|
2651
|
-
|
|
2652
|
-
|
|
2716
|
+
const firstDataRow = startRow;
|
|
2717
|
+
worksheet.eachRow((row, rowIndex) => {
|
|
2718
|
+
if (rowIndex < firstDataRow)
|
|
2719
|
+
return;
|
|
2720
|
+
const isEven = (rowIndex - firstDataRow) % 2 === 0;
|
|
2721
|
+
row.eachCell((cell) => {
|
|
2722
|
+
if (isEven) {
|
|
2723
|
+
cell.fill = {
|
|
2724
|
+
type: 'pattern',
|
|
2725
|
+
pattern: 'solid',
|
|
2726
|
+
fgColor: { argb: 'D9D9D9' },
|
|
2653
2727
|
};
|
|
2654
2728
|
}
|
|
2655
|
-
|
|
2656
|
-
name:
|
|
2657
|
-
bold: false,
|
|
2729
|
+
cell.font = {
|
|
2730
|
+
name: 'Arial',
|
|
2658
2731
|
size: 10,
|
|
2659
|
-
color: { argb:
|
|
2732
|
+
color: { argb: '203764' },
|
|
2660
2733
|
};
|
|
2661
2734
|
});
|
|
2662
2735
|
});
|
|
@@ -2664,64 +2737,67 @@ class HtmlToExcelService {
|
|
|
2664
2737
|
worksheet.addImage(imageId, {
|
|
2665
2738
|
tl: { col: 0.5, row: 1.5 },
|
|
2666
2739
|
ext: { width: 218, height: 58 },
|
|
2667
|
-
editAs:
|
|
2740
|
+
editAs: 'absolute',
|
|
2668
2741
|
});
|
|
2669
|
-
this.AdjustColumnWidth(worksheet, columns);
|
|
2670
2742
|
//Subtitulos: Se inserta al final para evitar altere el autoajuste de las columnas
|
|
2671
2743
|
for (let i = 0; i < subtitles.length; i++) {
|
|
2672
|
-
const range =
|
|
2744
|
+
const range = `A${6 + i}:${this.getExcelColumnLetter(columns.length - 1)}${6 + i}`;
|
|
2673
2745
|
worksheet.mergeCells(range);
|
|
2674
|
-
const cell = worksheet.getCell(
|
|
2675
|
-
|
|
2676
|
-
cell.value = subtitle;
|
|
2746
|
+
const cell = worksheet.getCell(`A${6 + i}`);
|
|
2747
|
+
cell.value = subtitles[i];
|
|
2677
2748
|
cell.font = {
|
|
2678
|
-
name:
|
|
2749
|
+
name: 'Arial',
|
|
2679
2750
|
bold: true,
|
|
2680
2751
|
italic: true,
|
|
2681
2752
|
size: 10,
|
|
2682
|
-
color: { argb:
|
|
2753
|
+
color: { argb: '203764' },
|
|
2754
|
+
};
|
|
2755
|
+
cell.alignment = {
|
|
2756
|
+
vertical: 'middle',
|
|
2757
|
+
horizontal: 'left',
|
|
2758
|
+
wrapText: true,
|
|
2683
2759
|
};
|
|
2684
|
-
cell.alignment = { vertical: "middle", horizontal: "left", wrapText: true };
|
|
2685
2760
|
}
|
|
2761
|
+
this.AdjustColumnWidth(worksheet, columns);
|
|
2686
2762
|
}
|
|
2687
2763
|
SetFilterPage(filterTitle, worksheetFilter, filters) {
|
|
2688
2764
|
let widtFilter = 30;
|
|
2689
2765
|
worksheetFilter.addRow([filterTitle]);
|
|
2690
|
-
worksheetFilter.mergeCells([
|
|
2691
|
-
worksheetFilter.columns.forEach(column => {
|
|
2766
|
+
worksheetFilter.mergeCells(['A1', 'B2']);
|
|
2767
|
+
worksheetFilter.columns.forEach((column) => {
|
|
2692
2768
|
column.width = widtFilter;
|
|
2693
2769
|
column.alignment = this.ColumnAligment;
|
|
2694
2770
|
widtFilter *= 3;
|
|
2695
2771
|
});
|
|
2696
|
-
[
|
|
2772
|
+
['A1', 'B1'].map((key) => {
|
|
2697
2773
|
worksheetFilter.getCell(key).fill = {
|
|
2698
|
-
type:
|
|
2699
|
-
pattern:
|
|
2700
|
-
fgColor: { argb:
|
|
2701
|
-
bgColor: { argb:
|
|
2774
|
+
type: 'pattern',
|
|
2775
|
+
pattern: 'solid',
|
|
2776
|
+
fgColor: { argb: 'FF7F00' },
|
|
2777
|
+
bgColor: { argb: 'FF7F00' },
|
|
2702
2778
|
};
|
|
2703
2779
|
worksheetFilter.getCell(key).font = {
|
|
2704
|
-
name:
|
|
2780
|
+
name: 'Arial',
|
|
2705
2781
|
bold: true,
|
|
2706
2782
|
size: 12,
|
|
2707
|
-
color: { argb:
|
|
2783
|
+
color: { argb: 'FFFFFF' },
|
|
2708
2784
|
};
|
|
2709
2785
|
});
|
|
2710
2786
|
filters.forEach((element, index) => {
|
|
2711
2787
|
let row = worksheetFilter.addRow([element.key, element.value]);
|
|
2712
|
-
let color = index % 2 === 1 ?
|
|
2713
|
-
row.eachCell(cell => {
|
|
2788
|
+
let color = index % 2 === 1 ? 'D9D9D9' : 'FFFFFF';
|
|
2789
|
+
row.eachCell((cell) => {
|
|
2714
2790
|
cell.fill = {
|
|
2715
|
-
type:
|
|
2716
|
-
pattern:
|
|
2791
|
+
type: 'pattern',
|
|
2792
|
+
pattern: 'solid',
|
|
2717
2793
|
fgColor: { argb: color },
|
|
2718
2794
|
bgColor: { argb: color },
|
|
2719
2795
|
};
|
|
2720
2796
|
cell.font = {
|
|
2721
|
-
name:
|
|
2797
|
+
name: 'Arial',
|
|
2722
2798
|
bold: false,
|
|
2723
2799
|
size: 10,
|
|
2724
|
-
color: { argb:
|
|
2800
|
+
color: { argb: '203764' },
|
|
2725
2801
|
};
|
|
2726
2802
|
});
|
|
2727
2803
|
});
|
|
@@ -2732,9 +2808,11 @@ class HtmlToExcelService {
|
|
|
2732
2808
|
return;
|
|
2733
2809
|
if (columns[index] == undefined)
|
|
2734
2810
|
return;
|
|
2735
|
-
let columnWidth = columns[index].width ??
|
|
2811
|
+
let columnWidth = columns[index].width ??
|
|
2812
|
+
Math.max(...column.values
|
|
2813
|
+
.map((v) => (v ? v.toString().length : 0))
|
|
2814
|
+
.filter((v) => typeof v === 'number'), columns[index].displayColumnName.length) * 1.2;
|
|
2736
2815
|
column.width = Math.min(Math.max(columnWidth, 5), 100);
|
|
2737
|
-
column.alignment = columns[index].isNumber ? { vertical: "middle", horizontal: "right", wrapText: true } : { vertical: "middle", horizontal: "left", wrapText: true };
|
|
2738
2816
|
});
|
|
2739
2817
|
worksheet.eachRow((row, rowIndex) => {
|
|
2740
2818
|
if (rowIndex === 1)
|
|
@@ -2742,7 +2820,7 @@ class HtmlToExcelService {
|
|
|
2742
2820
|
let maxLines = 1;
|
|
2743
2821
|
row.eachCell((cell, colNumber) => {
|
|
2744
2822
|
if (cell.value) {
|
|
2745
|
-
let text = typeof cell.value ===
|
|
2823
|
+
let text = typeof cell.value === 'object' ? cell.text : cell.value.toString();
|
|
2746
2824
|
let columnWidth = worksheet.getColumn(colNumber).width ?? 10;
|
|
2747
2825
|
let charsPerLine = columnWidth * 1.2;
|
|
2748
2826
|
let estimatedLines = Math.ceil(text.length / charsPerLine);
|
|
@@ -2752,27 +2830,29 @@ class HtmlToExcelService {
|
|
|
2752
2830
|
row.height = Math.min(Math.max(15 * maxLines, 15), 30);
|
|
2753
2831
|
});
|
|
2754
2832
|
}
|
|
2755
|
-
async ExportToExcelRawData({ excelName, reportTitle, filterTitle, rowsSerializate, columns, filters, orderColumn = false }) {
|
|
2833
|
+
async ExportToExcelRawData({ excelName, reportTitle, filterTitle, rowsSerializate, columns, filters, orderColumn = false, }) {
|
|
2756
2834
|
const workbook = new Workbook();
|
|
2757
2835
|
const worksheet = workbook.addWorksheet(reportTitle);
|
|
2758
2836
|
const rows = JSON.parse(rowsSerializate);
|
|
2759
2837
|
worksheet.views = [{ showGridLines: false }];
|
|
2760
|
-
const allColumns = orderColumn
|
|
2838
|
+
const allColumns = orderColumn
|
|
2839
|
+
? [{ displayColumnName: 'N°' }, ...columns]
|
|
2840
|
+
: columns;
|
|
2761
2841
|
allColumns.forEach((col, index) => {
|
|
2762
2842
|
const columnLetter = this.getExcelColumnLetter(index);
|
|
2763
2843
|
const headerCell = worksheet.getCell(`${columnLetter}1`);
|
|
2764
2844
|
headerCell.value = col.displayColumnName;
|
|
2765
|
-
headerCell.alignment = { horizontal:
|
|
2766
|
-
headerCell.font = { name:
|
|
2845
|
+
headerCell.alignment = { horizontal: 'center', vertical: 'middle' };
|
|
2846
|
+
headerCell.font = { name: 'Arial', bold: true, size: 10 };
|
|
2767
2847
|
});
|
|
2768
|
-
const maxLengths = allColumns.map(col => col.displayColumnName.length);
|
|
2848
|
+
const maxLengths = allColumns.map((col) => col.displayColumnName.length);
|
|
2769
2849
|
rows.forEach((rowData, rowIndex) => {
|
|
2770
2850
|
const rowValues = allColumns.map((col, colIndex) => {
|
|
2771
2851
|
if (orderColumn && colIndex === 0) {
|
|
2772
2852
|
return (rowIndex + 1).toString();
|
|
2773
2853
|
}
|
|
2774
2854
|
const originalColIndex = orderColumn ? colIndex - 1 : colIndex;
|
|
2775
|
-
return rowData[columns[originalColIndex].columnName]?.toString() ||
|
|
2855
|
+
return rowData[columns[originalColIndex].columnName]?.toString() || '';
|
|
2776
2856
|
});
|
|
2777
2857
|
rowValues.forEach((value, i) => {
|
|
2778
2858
|
const length = value.length;
|
|
@@ -2794,7 +2874,7 @@ class HtmlToExcelService {
|
|
|
2794
2874
|
saveAs(new Blob([buffer]), excelName);
|
|
2795
2875
|
}
|
|
2796
2876
|
getExcelColumnLetter(columnNumber) {
|
|
2797
|
-
let letter =
|
|
2877
|
+
let letter = '';
|
|
2798
2878
|
while (columnNumber >= 0) {
|
|
2799
2879
|
letter = String.fromCharCode(65 + (columnNumber % 26)) + letter;
|
|
2800
2880
|
columnNumber = Math.floor(columnNumber / 26) - 1;
|
|
@@ -2802,12 +2882,12 @@ class HtmlToExcelService {
|
|
|
2802
2882
|
return letter;
|
|
2803
2883
|
}
|
|
2804
2884
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: HtmlToExcelService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
2805
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: HtmlToExcelService, providedIn:
|
|
2885
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: HtmlToExcelService, providedIn: 'root' });
|
|
2806
2886
|
}
|
|
2807
2887
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: HtmlToExcelService, decorators: [{
|
|
2808
2888
|
type: Injectable,
|
|
2809
2889
|
args: [{
|
|
2810
|
-
providedIn:
|
|
2890
|
+
providedIn: 'root',
|
|
2811
2891
|
}]
|
|
2812
2892
|
}] });
|
|
2813
2893
|
|