@eternalcodestudio/primeng-table 20.0.16 → 21.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eternalcodestudio-primeng-table.mjs","sources":["../../../projects/ecs-primeng-table/src/lib/enums/cell-overflow-behaviour.enum.ts","../../../projects/ecs-primeng-table/src/lib/enums/data-align-horizontal.enum.ts","../../../projects/ecs-primeng-table/src/lib/enums/data-align-vertical.enum.ts","../../../projects/ecs-primeng-table/src/lib/enums/data-type.enum.enum.ts","../../../projects/ecs-primeng-table/src/lib/enums/frozen-column-align.enum.ts","../../../projects/ecs-primeng-table/src/lib/enums/table-view-save-mode.enum.ts","../../../projects/ecs-primeng-table/src/lib/interfaces/table-options.interface.ts","../../../projects/ecs-primeng-table/src/lib/utils/create-table-options.ts","../../../projects/ecs-primeng-table/src/lib/services/http.service.ts","../../../projects/ecs-primeng-table/src/lib/services/notification.service.ts","../../../projects/ecs-primeng-table/src/lib/utils/data-align-horizontal-as-text.ts","../../../projects/ecs-primeng-table/src/lib/utils/data-align-vertical-as-text.ts","../../../projects/ecs-primeng-table/src/lib/utils/data-type-as-text.ts","../../../projects/ecs-primeng-table/src/lib/utils/frozen-column-align-as-text.ts","../../../projects/ecs-primeng-table/src/lib/utils/highlight-text.ts","../../../projects/ecs-primeng-table/src/lib/components/ecs-primeng-table/ecs-primeng-table.service.ts","../../../projects/ecs-primeng-table/src/lib/components/table-predefined-filters/table-predefined-filters.ts","../../../projects/ecs-primeng-table/src/lib/components/table-predefined-filters/table-predefined-filters.html","../../../projects/ecs-primeng-table/src/lib/components/table-cell/table-cell.ts","../../../projects/ecs-primeng-table/src/lib/components/table-cell/table-cell.html","../../../projects/ecs-primeng-table/src/lib/components/table-button/table-button.ts","../../../projects/ecs-primeng-table/src/lib/components/table-button/table-button.html","../../../projects/ecs-primeng-table/src/lib/components/column-selector/column-selector.ts","../../../projects/ecs-primeng-table/src/lib/components/column-selector/column-selector.html","../../../projects/ecs-primeng-table/src/lib/components/export-excel/export-excel.service.ts","../../../projects/ecs-primeng-table/src/lib/components/export-excel/export-excel.ts","../../../projects/ecs-primeng-table/src/lib/components/export-excel/export-excel.html","../../../projects/ecs-primeng-table/src/lib/components/views-management/views-management.ts","../../../projects/ecs-primeng-table/src/lib/components/views-management/views-management.html","../../../projects/ecs-primeng-table/src/lib/components/ecs-primeng-table/ecs-primeng-table.ts","../../../projects/ecs-primeng-table/src/lib/components/ecs-primeng-table/ecs-primeng-table.html","../../../projects/ecs-primeng-table/src/public-api.ts","../../../projects/ecs-primeng-table/src/eternalcodestudio-primeng-table.ts"],"sourcesContent":["/**\r\n * Defines how content that overflows a table cell is displayed.\r\n *\r\n * @remarks\r\n * This enumeration specifies the visual behavior of cell content when it exceeds the cell’s width.\r\n */\r\nexport enum CellOverflowBehaviour {\r\n /** The overflowing content is clipped and not visible. */\r\n Hidden,\r\n\r\n /** The content wraps onto multiple lines to fit within the cell. */\r\n Wrap\r\n}","/**\r\n * Defines the horizontal alignment of content within a table cell.\r\n *\r\n * @remarks\r\n * Specifies how the content inside a cell is positioned horizontally relative to the cell's width.\r\n */\r\nexport enum DataAlignHorizontal {\r\n /** Content is aligned to the left side of the cell. */\r\n Left,\r\n\r\n /** Content is aligned to the center of the cell. */\r\n Center,\r\n\r\n /** Content is aligned to the right side of the cell. */\r\n Right\r\n}","/**\r\n * Enum representing the vertical alignment of content within a table cell.\r\n * \r\n * @remarks\r\n * Determines how the content inside a cell is positioned vertically relative to the cell's height.\r\n */\r\nexport enum DataAlignVertical {\r\n /** Align content to the top of the cell. */\r\n Top,\r\n\r\n /** Align content to the vertical middle of the cell. */\r\n Middle,\r\n\r\n /** Align content to the bottom of the cell. */\r\n Bottom\r\n}","/**\r\n * Enum representing the different types of data a table column can hold.\r\n * \r\n * @remarks\r\n * This is used to determine how values should be rendered, formatted, and \r\n * filtered in the table component.\r\n */\r\nexport enum DataType {\r\n /** Plain text string values. */\r\n Text,\r\n\r\n /** Numeric values, e.g., integers or decimals. */\r\n Numeric,\r\n\r\n /** Boolean values (true/false). */\r\n Boolean,\r\n\r\n /** Date or datetime values. */\r\n Date,\r\n\r\n /** List of values, stored as a string separated by a delimiter (\";\"). */\r\n List\r\n}","/**\r\n * Enum representing the alignment of frozen columns in a table.\r\n * \r\n * @remarks\r\n * Used to determine if a column should be frozen, and if so, on which side\r\n * of the table it should appear.\r\n */\r\nexport enum FrozenColumnAlign {\r\n /** The column is not frozen. */\r\n Noone,\r\n\r\n /** The column is frozen on the left side of the table. */\r\n Left,\r\n\r\n /** The column is frozen on the right side of the table. */\r\n Right\r\n}","/**\r\n * Enum representing the mode used to save the state or configuration of a table view.\r\n * \r\n * @remarks\r\n * Determines where and how the table's view settings (e.g., column order, filters, \r\n * sorting) are persisted.\r\n */\r\nexport enum TableViewSaveMode {\r\n /** Views are disabled. */\r\n None,\r\n\r\n /** Save the table view state in the browser's sessionStorage (cleared on tab close). */\r\n SessionStorage,\r\n\r\n /** Save the table view state in the browser's localStorage (persists across sessions). */\r\n LocalStorage,\r\n\r\n /** Save the table view state in a backend database (requires server support). */\r\n DatabaseStorage\r\n}","import { TableViewSaveMode } from \"../enums\";\r\nimport { IColumnMetadata, IPredefinedFilter, ITableButton } from \"../interfaces\";\r\n\r\n/** Configuration options for ECS Primeng table */\r\nexport interface ITableOptions {\r\n\r\n /**\r\n * Controls whether the table is active.\r\n * \r\n * - When `true`, the table will fetch configuration, columns, and data on init.\r\n * - When `false`, the table will **not** automatically fetch or update data, even after initialization.\r\n * Use this if you want to apply filters, column changes, or other manipulations \r\n * without triggering automatic updates.\r\n * \r\n * @default true\r\n */\r\n isActive?: boolean;\r\n\r\n /**\r\n * Endpoint URL to fetch the table configuration.\r\n * \r\n * The configuration is fetched **once** when the table is initialized and is expected to return\r\n * an `ITableConfiguration` object from the API. This includes data such as column definitions, \r\n * the timezone to use, and other settings.\r\n * \r\n * If set to `undefined` or if `isActive` is `false`, the table will **not** fetch configuration automatically.\r\n * \r\n * @default undefined\r\n */\r\n urlTableConfiguration?: string;\r\n\r\n /**\r\n * Endpoint URL to fetch the table data.\r\n * \r\n * This endpoint is called **whenever the user filters, changes pages, or sorts** the table.\r\n * It is expected to return an `ITablePagedResponse` object containing the paginated data.\r\n * \r\n * If set to `undefined` or if `isActive` is `false`, the table will **not** fetch or update data automatically.\r\n * \r\n * @default undefined\r\n */\r\n urlTableData?: string;\r\n\r\n /**\r\n * The array of data to be displayed in the table.\r\n * \r\n * Each item should represent a row and match the table's column structure.\r\n * \r\n * @default []\r\n */\r\n data?: any[];\r\n\r\n /**\r\n * Configuration options for the table description section.\r\n */\r\n description?: {\r\n /**\r\n * Icon displayed alongside the table description.\r\n * You can use any PrimeIcons class or icons from third-party libraries\r\n * such as Material Icons or Font Awesome.\r\n *\r\n * @default \"pi pi-info-circle\"\r\n */\r\n icon?: string;\r\n\r\n /**\r\n * Determines how the description text is displayed.\r\n * - `true`, the `text` content is shown as a tooltip when hovering\r\n * over the description icon.\r\n * - `false`, the `text` is displayed inline to the right of the icon.\r\n *\r\n * @default true\r\n */\r\n tooltip?: boolean;\r\n\r\n /**\r\n * The description content to display.\r\n * If left undefined or string empty, the table description will not be rendered.\r\n * Supports basic HTML for rich text formatting.\r\n *\r\n * @default undefined\r\n */\r\n text?: string;\r\n }\r\n\r\n /**\r\n * Configuration options for the table legend.\r\n */\r\n legend?: {\r\n /**\r\n * The content to be displayed in the popover of the legend. Can be HTML rich.\r\n *\r\n * @default undefined\r\n */\r\n content?: string;\r\n\r\n /**\r\n * Configuration options for the button that displays the popover of the table legend.\r\n */\r\n button?: {\r\n /**\r\n * Icon displayed alongside the button of the table legend.\r\n * You can use any PrimeIcons class or icons from third-party libraries\r\n * such as Material Icons or Font Awesome.\r\n *\r\n * @default \"pi pi-bars\"\r\n */\r\n icon?: string;\r\n\r\n /**\r\n * The text shown in the legend button.\r\n *\r\n * @default \"Legend\"\r\n */\r\n text?: string;\r\n }\r\n }\r\n\r\n /**\r\n * Configurations related to options that are at the header of the table.\r\n */\r\n header?: {\r\n /**\r\n * A collection of `ITableButton` to be shown in the table header.\r\n * \r\n * @default []\r\n */\r\n buttons?: ITableButton[];\r\n\r\n /**\r\n * When set to `false`, the **clear sorts** button will be hidden.\r\n * \r\n * @default true\r\n */\r\n clearSortsEnabled?: boolean;\r\n\r\n /**\r\n * Allows customization of the **clear sorts** button icon. You may use any other icons from PrimeNG or third-party providers such as Material Icons or Font Awesome.\r\n * \r\n * @default \"pi pi-sort-alt-slash\"\r\n */\r\n clearSortsIcon?: string;\r\n\r\n /**\r\n * When set to `false`, the **clear filters** button will be hidden.\r\n * \r\n * @default true\r\n */\r\n clearFiltersEnabled?: boolean;\r\n\r\n /**\r\n * Allows customization of the **clear filters** button icon. Other icons from PrimeNG or third-party libraries (e.g., Material Icons, Font Awesome) may also be used.\r\n * \r\n * @default \"pi pi-filter-slash\"\r\n */\r\n clearFiltersIcon?: string;\r\n };\r\n\r\n /**\r\n * Configurations related to the columns of the table.\r\n */\r\n columns?: {\r\n /**\r\n * Enables or disables the column selector feature.\r\n * \r\n * When `true`, a button is displayed in the top-left corner of the table.\r\n * Clicking this button opens a modal that allows users to:\r\n * - Show or hide columns.\r\n * - Adjust the cell overflow behavior for each column.\r\n * - Change the horizontal and vertical alignment of cells per column.\r\n * \r\n * When `false`, the button to open the column's selector modal will not be available.\r\n * \r\n * @default true\r\n */\r\n selectorEnabled?: boolean;\r\n\r\n /**\r\n * Can be used to specifiy a different icon to be used by the column selector. \r\n * You can replace it with any icon from PrimeNG or other libraries such as Font Awesome or Material Icons.\r\n * \r\n * @default \"pi pi-pen-to-square\"\r\n */\r\n selectorIcon?: string;\r\n\r\n /**\r\n * When `true`, columns in the selector are displayed alphabetically (A–Z). \r\n * When `false`, columns keep the order provided by the backend.\r\n * \r\n * @default true\r\n */\r\n selectorOrderByColumnName?: boolean;\r\n\r\n /**\r\n * The combination of non-selectable columns and user-selected columns \r\n * that must be displayed in the table.\r\n * \r\n * @default []\r\n */\r\n shown?: IColumnMetadata[];\r\n };\r\n\r\n /**\r\n * Configurations related to the rows of the table.\r\n */\r\n rows?: {\r\n /**\r\n * Function to dynamically assign CSS classes to a row.\r\n * \r\n * Receives the `rowData` object for the current row and returns:\r\n * - A string with a single CSS class name\r\n * - An array of class names\r\n * - A Set of class names\r\n * - An object with class keys and truthy/falsy values\r\n * \r\n * The returned classes are applied to the row in addition to any global or default styles.\r\n * Useful for changing appearance of a row based on column values.\r\n * \r\n * Example:\r\n * ```ts\r\n * class: (rowData) => {\r\n * const classes = [];\r\n * if (rowData.status === \"Unemployed\") classes.push(\"unemployedRow\");\r\n * return classes;\r\n * }\r\n * ```\r\n */\r\n class?: (rowData: any) => string | string[] | Set<string> | { [klass: string]: any };\r\n\r\n /**\r\n * Function to dynamically assign inline styles to a row.\r\n * \r\n * Receives the `rowData` object for the current row and returns an object\r\n * with CSS properties to apply inline. This allows dynamic styling based\r\n * on the row's content or values.\r\n * \r\n * If not provided, no dynamic styles are applied.\r\n * \r\n * Example:\r\n * ```ts\r\n * style: (rowData) => {\r\n * if (rowData.status === \"Full-time\") {\r\n * return { fontWeight: \"bold\", fontStyle: \"italic\" };\r\n * }\r\n * return {};\r\n * }\r\n * ```\r\n */\r\n style?: (rowData: any) => { [klass: string]: any };\r\n\r\n /**\r\n * Configurations related to the action column for the rows.\r\n */\r\n action?: {\r\n /**\r\n * A collection of `ITableButton` to be shown by this column to perform actions over rows. At least one button needs to be enable the row actions column.\r\n * \r\n * @default []\r\n */\r\n buttons?: ITableButton[];\r\n\r\n /**\r\n * The header label for the row actions column.\r\n * \r\n * @default \"Actions\"\r\n */\r\n header?: string;\r\n\r\n /**\r\n * If `true`, the column will appear on the right side of the table. Otherwise, it will appear on the left.\r\n * \r\n * @default true\r\n */\r\n alignmentRight?: boolean;\r\n\r\n /**\r\n * The fixed column width in pixels.\r\n * \r\n * @default 150\r\n */\r\n width?: number;\r\n\r\n /**\r\n * If `true`, the column remains visible when horizontally scrolling the table.\r\n * \r\n * @default true\r\n */\r\n frozen?: boolean;\r\n\r\n /**\r\n * If `true`, users can resize the column.\r\n * \r\n * @default false\r\n */\r\n resizable?: boolean;\r\n };\r\n\r\n /**\r\n * Configurations related to the row checkbox selector.\r\n */\r\n checkboxSelector?: {\r\n /**\r\n * If `true`, a new column with checkboxes will be displayed. Users can select or unselect rows using these checkboxes. Additionally an option to filter by this column will be enabled.\r\n * \r\n * @default false\r\n */\r\n enabled?: boolean;\r\n\r\n /**\r\n * The header label for the checkbox selection column.\r\n * \r\n * @default \"Selected\"\r\n */\r\n header?: string;\r\n\r\n /**\r\n * If `true`, the column will appear on the right side of the table. Otherwise, it will appear on the left.\r\n * \r\n * @default false\r\n */\r\n alignmentRight?: boolean;\r\n\r\n /**\r\n * The fixed column width in pixels.\r\n * \r\n * @default 150\r\n */\r\n width?: number;\r\n\r\n /**\r\n * If `true`, the column remains visible when horizontally scrolling the table.\r\n * \r\n * @default true\r\n */\r\n frozen?: boolean;\r\n\r\n /**\r\n * If `true`, users can resize the column.\r\n * \r\n * @default false\r\n */\r\n resizable?: boolean;\r\n\r\n /**\r\n * Function that determines whether the checkbox should be enabled or not.\r\n * @param rowData The row data object.\r\n * @returns True if the checkbox should be enabled; false otherwise.\r\n * \r\n * @default undefined\r\n */\r\n enabledCondition?: (rowData: any) => boolean;\r\n };\r\n\r\n /**\r\n * Configurations related to the single row selector.\r\n */\r\n singleSelector?: {\r\n /**\r\n * If set to `true`, users can click a row to select it. You can then subscribe to selection events to execute custom actions.\r\n * \r\n * @default false\r\n */\r\n enabled?: boolean;\r\n\r\n /**\r\n * When `true`, users must hold **CTRL** and click on a selected row to unselect it. When `false`, users can unselect a row simply by clicking it again.\r\n * \r\n * On mobile devices (phones or tablets), the **CTRL** key configuration is ignored. Users can unselect a previously selected row by simply clicking it, as mobile devices do not have a **CTRL** key.\r\n * \r\n * @default true\r\n */\r\n metakey?: boolean;\r\n };\r\n };\r\n\r\n /** Configurations related to the vertical scroll of the table. */\r\n verticalScroll?: {\r\n /**\r\n * Automatically adjust the table's height to fit its container.\r\n * \r\n * When set to `true`, the table will calculate the maximum height dynamically \r\n * so that it exactly fits its container. This takes precedence over the `height` property.\r\n * \r\n * Ignored if a `cssFormula` has been provided.\r\n * \r\n * @default true\r\n */\r\n fitToContainer?: boolean;\r\n\r\n /**\r\n * Fixed vertical height for the table when `fitToContainer` is `false`.\r\n * \r\n * - If a `cssFormula` has been provided, this property is ignored.\r\n * - If `fitToContainer` from `verticalScroll` is `true`, this property is ignored.\r\n * - If set to a value `<= 0`, this is ignored.\r\n * \r\n * Use this property to enable vertical scrolling with a fixed height when you do not want \r\n * the table to dynamically fit its container.\r\n * \r\n * @default 0\r\n */\r\n height?: number;\r\n\r\n /**\r\n * A CSS string used to define the table's vertical height.\r\n * \r\n * Can be a fixed value (e.g., `\"500px\"`) or a CSS formula (e.g., `\"calc(100vh - 200px)\"`).\r\n * When provided, this value **overrides** both `fitToContainer` and `height`.\r\n * \r\n * @default undefined\r\n */\r\n cssFormula?: string;\r\n };\r\n\r\n /** Configurations related to the global filter functionality of the table. */\r\n globalFilter?: {\r\n /**\r\n * Enables or disables the global filter input.\r\n * \r\n * When set to `true`, users can search across all table columns using the global search bar.\r\n * When `false`, the global search input will not be rendered.\r\n * \r\n * @default true\r\n */\r\n enabled?: boolean;\r\n\r\n /**\r\n * Maximum number of characters allowed in the global filter input.\r\n * \r\n * Use this to limit the length of search queries and prevent excessively long input.\r\n * \r\n * @default 20\r\n */\r\n maxLength?: number;\r\n };\r\n\r\n /**\r\n * Predefined filters for table columns.\r\n * \r\n * Restricts filter options to a known set of values for a column.\r\n * Suitable for columns with a limited number of distinct values.\r\n * Supports plain text, tags, icons, and images. Works with `list` data types.\r\n * \r\n * @default {}\r\n */\r\n predefinedFilters?: { [key: string]: IPredefinedFilter[] }\r\n\r\n /**\r\n * Configurations related to saved table views.\r\n */\r\n views?: {\r\n /**\r\n * Determines how the table views are saved.\r\n * \r\n * - `TableViewSaveMode.None`: Do not save any views.\r\n * - `TableViewSaveMode.SessionStorage`: Save views in the browser session storage (cleared when the tab/window closes).\r\n * - `TableViewSaveMode.LocalStorage`: Save views in the browser local storage (persistent across sessions).\r\n * - `TableViewSaveMode.DatabaseStorage`: Save views directly in the database via the backend API. If you are using this method you will need to specify also the `urlGet`and `urlSave`\r\n * \r\n * This allows users to keep their custom column orders, filters, sorting, and other table settings\r\n * according to the selected storage option.\r\n * \r\n * @default TableViewSaveMode.None\r\n */\r\n saveMode?: TableViewSaveMode;\r\n \r\n /**\r\n * Key used to identify the table when saving and retrieving its views.\r\n * \r\n * Each table should have a unique `saveKey` so that its saved views (filters, column order, sorting, etc.)\r\n * do not conflict with other tables.\r\n * \r\n * If set to `undefined`, the table will not save or load any views.\r\n * \r\n * @default undefined\r\n */\r\n saveKey?: string;\r\n\r\n /**\r\n * Endpoint URL to fetch saved views from the database.\r\n * \r\n * Only used if `saveMode` is `TableViewSaveMode.databaseStorage`.\r\n * The `saveKey` is sent to identify the correct table views.\r\n * \r\n * @default undefined\r\n */\r\n urlGet?: string;\r\n\r\n /**\r\n * Endpoint URL to save table views to the database.\r\n * \r\n * Only used if `saveMode` is `TableViewSaveMode.databaseStorage`.\r\n * The `saveKey` is sent to identify the correct table views.\r\n * \r\n * @default undefined\r\n */\r\n urlSave?: string;\r\n };\r\n\r\n /**\r\n * Configurations related to the reset table view button.\r\n */\r\n resetTableView?:{\r\n /**\r\n * If the reset table view button should be enabled.\r\n * \r\n * @default true\r\n */\r\n enabled?: boolean;\r\n\r\n /**\r\n * Can be used to specifiy a different icon to be used by the reset table view button.\r\n * You can replace it with any icon from PrimeNG or other libraries such as Font Awesome or Material Icons.\r\n * \r\n * @default \"pi pi-eraser\"\r\n */\r\n icon?: string;\r\n }\r\n\r\n /**\r\n * Configurations for exporting the table data to Excel.\r\n */\r\n excelReport?: {\r\n /**\r\n * Endpoint URL of the API to perform the Excel export.\r\n * \r\n * When set, the table will send a request to this endpoint including the properties\r\n * specified by the user, such as selected columns, filters, and sort order, to generate\r\n * the export.\r\n * \r\n * If set to `undefined`, Excel export functionality will be disabled.\r\n * \r\n * @default undefined\r\n */\r\n url?: string;\r\n\r\n /**\r\n * Default title shown in the Excel export modal when preparing the export.\r\n * \r\n * If the string is empty (after trimming) **and** `titleAllowUserEdit` is `false`, \r\n * the export button will be disabled.\r\n * \r\n * @default \"Report\"\r\n */\r\n defaultTitle?: string;\r\n\r\n /**\r\n * Determines whether the user can edit the title of the Excel file in the export modal.\r\n * \r\n * - If `true`, the user can modify the title before exporting.\r\n * - If `false`, the title is fixed to `defaultTitle`.\r\n * \r\n * @default true\r\n */\r\n titleAllowUserEdit?: boolean;\r\n }\r\n\r\n /**\r\n * Defines the number of seconds the user must hold the mouse button on a cell before its content is copied to the clipboard. Set to a value <= 0 to turn off this feature entirely\r\n * \r\n * @default 0.5\r\n */\r\n copyToClipboardTime?: number;\r\n}\r\n\r\n/** Default configuration options for ECS Primeng table */\r\nexport const DEFAULT_TABLE_OPTIONS: ITableOptions = {\r\n isActive: true,\r\n urlTableConfiguration: undefined,\r\n urlTableData: undefined,\r\n data: [],\r\n description: {\r\n icon: \"pi pi-info-circle\",\r\n tooltip: true,\r\n text: undefined\r\n },\r\n legend: {\r\n content: undefined,\r\n button: {\r\n icon: \"pi pi-bars\",\r\n text: \"Legend\"\r\n }\r\n },\r\n header: {\r\n buttons: [],\r\n clearSortsEnabled: true,\r\n clearSortsIcon: \"pi pi-sort-alt-slash\",\r\n clearFiltersEnabled: true,\r\n clearFiltersIcon: \"pi pi-filter-slash\"\r\n },\r\n columns: {\r\n selectorEnabled: true,\r\n selectorIcon: \"pi pi-pen-to-square\",\r\n selectorOrderByColumnName: true,\r\n shown: []\r\n },\r\n rows: {\r\n style: () => ({}),\r\n class: () => ({}),\r\n action: {\r\n buttons: [],\r\n header: \"Actions\",\r\n alignmentRight: true,\r\n width: 150,\r\n frozen: true,\r\n resizable: false\r\n },\r\n checkboxSelector: {\r\n enabled: false,\r\n header: \"Selected\",\r\n alignmentRight: false,\r\n width: 150,\r\n frozen: true,\r\n resizable: false,\r\n enabledCondition: undefined\r\n },\r\n singleSelector: {\r\n enabled: false,\r\n metakey: true\r\n }\r\n },\r\n verticalScroll: {\r\n fitToContainer: true,\r\n height: 0,\r\n cssFormula: undefined\r\n },\r\n globalFilter: {\r\n enabled: true,\r\n maxLength: 20\r\n },\r\n predefinedFilters: {},\r\n views: {\r\n saveMode: TableViewSaveMode.None,\r\n saveKey: undefined,\r\n urlGet: undefined,\r\n urlSave: undefined\r\n },\r\n resetTableView: {\r\n enabled: true,\r\n icon: \"pi pi-eraser\"\r\n },\r\n excelReport: {\r\n url: undefined,\r\n defaultTitle: \"Report\",\r\n titleAllowUserEdit: true\r\n },\r\n copyToClipboardTime: 0.5\r\n};","import { DEFAULT_TABLE_OPTIONS, ITableOptions } from '../interfaces';\r\n\r\n/**\r\n * Deep merge two objects.\r\n * Recursively copies properties from `source` into `target`,\r\n * but ignores `undefined` values to preserve defaults.\r\n */\r\nfunction deepMerge<T>(target: T, source: Partial<T>): T {\r\n for (const key in source) {\r\n const value = source[key];\r\n\r\n if (value === undefined) { // skip undefined values to keep defaults\r\n continue;\r\n }\r\n\r\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\r\n if (!target[key]) (target as any)[key] = {};\r\n deepMerge((target as any)[key], value);\r\n } else {\r\n (target as any)[key] = value;\r\n }\r\n }\r\n return target;\r\n}\r\n\r\n/**\r\n * Create table options based on defaults, with optional overrides.\r\n */\r\nexport function createTableOptions(overrides: Partial<ITableOptions> = {}): ITableOptions {\r\n const defaultsCopy = JSON.parse(JSON.stringify(DEFAULT_TABLE_OPTIONS)); // clone only data\r\n const merged = deepMerge(defaultsCopy as any, overrides);\r\n\r\n // Reasign function if they exist in override\r\n if (overrides.rows?.style) merged.rows.style = overrides.rows.style;\r\n if (overrides.rows?.class) merged.rows.class = overrides.rows.class;\r\n\r\n return merged as ITableOptions;\r\n}","import { Injectable } from '@angular/core';\r\nimport { HttpHeaders, HttpResponse } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\n\r\n/**\r\n * Abstract service for handling HTTP requests for **ECS Primeng table**.\r\n * \r\n * Provides a consistent interface for making GET and POST requests to the backend.\r\n * Implementations must define how requests are executed, including error handling,\r\n * headers, and response processing.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport abstract class ECSPrimengTableHttpService {\r\n\r\n /**\r\n * Performs a GET request to the specified service endpoint.\r\n * \r\n * @template T The expected response type.\r\n * @param servicePoint The endpoint URL or path for the GET request.\r\n * @param responseType Optional. The type of response expected, either `'json'` (default) or `'blob'`.\r\n * @returns An Observable of `HttpResponse<T>`, containing the full HTTP response.\r\n */\r\n abstract handleHttpGetRequest<T>(\r\n servicePoint: string,\r\n responseType?: 'json' | 'blob'\r\n ): Observable<HttpResponse<T>>;\r\n\r\n /**\r\n * Performs a POST request to the specified service endpoint.\r\n * \r\n * @template T The expected response type.\r\n * @param servicePoint The endpoint URL or path for the POST request.\r\n * @param data The payload to send in the POST request body.\r\n * @param httpOptions Optional HTTP headers to include in the request.\r\n * @param responseType Optional. The type of response expected, either `'json'` (default) or `'blob'`.\r\n * @returns An Observable of `HttpResponse<T>`, containing the full HTTP response.\r\n */\r\n abstract handleHttpPostRequest<T>(\r\n servicePoint: string,\r\n data: any,\r\n httpOptions?: HttpHeaders | null,\r\n responseType?: 'json' | 'blob'\r\n ): Observable<HttpResponse<T>>;\r\n}","import { Injectable } from '@angular/core';\r\n\r\n/**\r\n * Abstract service for handling notifications in **ECS Primeng table**.\r\n * \r\n * Provides a consistent interface for displaying and clearing toast notifications.\r\n * Implementations must define how the notifications are managed.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport abstract class ECSPrimengTableNotificationService {\r\n\r\n /**\r\n * Displays a toast notification.\r\n * \r\n * @param severity The severity level of the notification (e.g., 'success', 'info', 'warn', 'error').\r\n * @param title The title of the toast message.\r\n * @param message The detailed message of the toast.\r\n */\r\n abstract showToast(\r\n severity: string,\r\n title: string,\r\n message: string\r\n ): void;\r\n \r\n /**\r\n * Clears all currently displayed toast notifications.\r\n */\r\n abstract clearToasts(): void;\r\n}","import { DataAlignHorizontal } from \"../enums\";\r\n\r\n/**\r\n * Converts a `DataAlignHorizontal` enum value to its corresponding CSS text alignment string.\r\n *\r\n * @param dataAlignHorizontal - The horizontal alignment enum value.\r\n * @returns The CSS text alignment string ('left', 'center', or 'right').\r\n *\r\n * @remarks\r\n * If an unknown value is provided, the function defaults to 'center'.\r\n */\r\nexport function dataAlignHorizontalAsText(dataAlignHorizontal: DataAlignHorizontal): string {\r\n switch (dataAlignHorizontal) {\r\n case DataAlignHorizontal.Left:\r\n return 'left';\r\n case DataAlignHorizontal.Center:\r\n return 'center';\r\n case DataAlignHorizontal.Right:\r\n return 'right';\r\n default:\r\n return 'center';\r\n }\r\n}","import { DataAlignVertical } from \"../enums\";\r\n\r\n/**\r\n * Converts a `DataAlignVertical` enum value to its corresponding CSS vertical alignment string.\r\n *\r\n * @param dataAlignVertical - The vertical alignment enum value.\r\n * @returns The CSS vertical alignment string ('top', 'middle', or 'bottom').\r\n *\r\n * @remarks\r\n * If an unknown value is provided, the function defaults to 'middle'.\r\n */\r\nexport function dataAlignVerticalAsText(dataAlignVertical: DataAlignVertical): string {\r\n switch (dataAlignVertical) {\r\n case DataAlignVertical.Top:\r\n return 'top';\r\n case DataAlignVertical.Middle:\r\n return 'middle';\r\n case DataAlignVertical.Bottom:\r\n return 'bottom';\r\n default:\r\n return 'middle';\r\n }\r\n}","import { DataType } from \"../enums\";\r\n\r\n/**\r\n * Converts a `DataType` enum value to its corresponding string representation.\r\n *\r\n * @param dataType - The data type enum value.\r\n * @returns The string representation of the data type ('text', 'numeric', 'boolean', or 'date').\r\n *\r\n * @remarks\r\n * If an unknown value is provided, the function defaults to 'text'.\r\n */\r\nexport function dataTypeAsText(dataType: DataType): string {\r\n switch (dataType) {\r\n case DataType.Text:\r\n return 'text';\r\n case DataType.Numeric:\r\n return 'numeric';\r\n case DataType.Boolean:\r\n return 'boolean';\r\n case DataType.Date:\r\n return 'date';\r\n default:\r\n return 'text';\r\n }\r\n}","import { FrozenColumnAlign } from \"../enums\";\r\n\r\n/**\r\n * Converts a `FrozenColumnAlign` enum value to its corresponding CSS alignment string.\r\n *\r\n * @param frozenColumnAlign - The frozen column alignment enum value.\r\n * @returns The CSS alignment string ('left' or 'right').\r\n *\r\n * @remarks\r\n * If an unknown value is provided, the function defaults to 'left'.\r\n */\r\nexport function frozenColumnAlignAsText(frozenColumnAlign: FrozenColumnAlign): string {\r\n switch (frozenColumnAlign) {\r\n case FrozenColumnAlign.Left:\r\n return 'left';\r\n case FrozenColumnAlign.Right:\r\n return 'right';\r\n default:\r\n return 'left';\r\n }\r\n}","import { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { IColumnMetadata } from \"../interfaces\";\r\nimport { DataType } from \"../enums\";\r\n\r\n/**\r\n * Generates sanitized HTML (`SafeHtml`) with highlighted text based on a global search term.\r\n *\r\n * @remarks\r\n * This utility safely creates HTML content where occurrences of the provided global search text\r\n * within the cell value are wrapped in a `<span class=\"highlighted-text\">` tag for visual emphasis.\r\n * If the cell does not match the search text or is of type `Boolean`, the original value is returned as safe HTML.\r\n *\r\n * @param {any} cellValue - The cell's value that may contain the text to highlight.\r\n * @param {IColumnMetadata} colMetadata - Metadata configuration of the column that defines its data type and filtering behavior.\r\n * @param {string | null} globalSearchText - The search text to highlight if found within the cell's content.\r\n * @param {DomSanitizer} sanitizer - Angular's sanitizer used to safely produce trusted HTML content.\r\n * @returns {SafeHtml} A `SafeHtml` instance containing highlighted HTML when a match is found, or the original sanitized text otherwise.\r\n */\r\nexport function highlightText(cellValue: any, colMetadata: IColumnMetadata, globalSearchText: string | null, sanitizer: DomSanitizer): SafeHtml {\r\n if (colMetadata.dataType !== DataType.Boolean && globalSearchText !== null) { // Check if the column data type is not boolean and global search text is not null\r\n const valueToUse = String(cellValue); // Convert cell value to string\r\n if (colMetadata.canBeGlobalFiltered) { // Check if the column can be globally filtered\r\n const searchLowerCase = globalSearchText.toUpperCase(); // Convert global search text to uppercase for case-insensitive comparison\r\n const cellValueLowerCase = valueToUse.toUpperCase(); // Convert cell value to uppercase for case-insensitive comparison\r\n if (cellValueLowerCase.includes(searchLowerCase)) { // Check if the cell value contains the search text\r\n // Determine the start and end indices of the search text within the cell value\r\n const startIndex = cellValueLowerCase.indexOf(searchLowerCase);\r\n const endIndex = startIndex + globalSearchText.length;\r\n // Extract the prefix, highlight, and suffix of the cell value\r\n const prefix = valueToUse.substring(0, startIndex);\r\n const highlight = valueToUse.substring(startIndex, endIndex);\r\n const suffix = valueToUse.substring(endIndex);\r\n return sanitizer.bypassSecurityTrustHtml(`${prefix}<span class=\"highlighted-text\">${highlight}</span>${suffix}`); // Construct SafeHtml with highlighted text using the <mark> element\r\n }\r\n }\r\n }\r\n return sanitizer.bypassSecurityTrustHtml(String(cellValue)); // Return the original cell value if it doesn't meet the highlighting conditions\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { HttpHeaders, HttpResponse } from '@angular/common/http';\r\nimport { ECSPrimengTableHttpService, ECSPrimengTableNotificationService } from '../../services';\r\nimport { IColumnMetadata, IExcelExportRequest, IPredefinedFilter, ITableConfiguration, ITablePagedResponse, ITableView, ITableViewData } from '../../interfaces';\r\nimport { CellOverflowBehaviour, FrozenColumnAlign, TableViewSaveMode } from '../../enums';\r\nimport { ITableQueryRequest } from '../../interfaces/table-query-request.interface';\r\nimport { MenuItem } from 'primeng/api';\r\nimport { Table } from 'primeng/table';\r\nimport { DomHandler } from 'primeng/dom';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ECSPrimengTableService {\r\n constructor(\r\n private http: ECSPrimengTableHttpService,\r\n private notification: ECSPrimengTableNotificationService\r\n ) {}\r\n \r\n fetchTableConfiguration(url: string): Observable<HttpResponse<ITableConfiguration>>{\r\n return this.http.handleHttpGetRequest<ITableConfiguration>(url);\r\n }\r\n fetchTableData(url: string, postData: ITableQueryRequest): Observable<HttpResponse<ITablePagedResponse>>{\r\n return this.http.handleHttpPostRequest<ITablePagedResponse>(url, postData);\r\n }\r\n fetchExcelReport(url: string, postData: IExcelExportRequest): Observable<HttpResponse<Blob>>{\r\n let httpOptions = new HttpHeaders({\r\n 'accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n 'Content-Type': 'application/json'\r\n });\r\n return this.http.handleHttpPostRequest<Blob>(url, postData, httpOptions, \"blob\");\r\n }\r\n getIconBlob(url: string): Observable<HttpResponse<Blob>> {\r\n return this.http.handleHttpGetRequest<Blob>(url,\"blob\");\r\n }\r\n\r\n downloadFile(data: Blob, fileName: string, contentType: string) {\r\n const blob = new Blob([data], { type: contentType });\r\n const url = window.URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = fileName;\r\n link.click();\r\n window.URL.revokeObjectURL(url);\r\n }\r\n handleTableError(\r\n error: any,\r\n customTitle: string = 'Data Loading Error'\r\n ): void {\r\n const message = error.message || 'Unknown error occurred';\r\n this.notification.showToast('error', customTitle, message);\r\n }\r\n\r\n orderColumnsWithFrozens(colsToOrder: IColumnMetadata[]): IColumnMetadata[]{\r\n const frozenLeftColumns = colsToOrder.filter(col => col.frozenColumnAlign === FrozenColumnAlign.Left);\r\n const frozenRightColumns = colsToOrder.filter(col => col.frozenColumnAlign === FrozenColumnAlign.Right);\r\n const nonFrozenColumns = colsToOrder.filter(col => col.frozenColumnAlign === FrozenColumnAlign.Noone);\r\n return [...frozenLeftColumns, ...nonFrozenColumns, ...frozenRightColumns];\r\n }\r\n\r\n /**\r\n * Handles click events on action buttons in a row of data.\r\n * \r\n * @param {function} action - The action function to be executed when the button is clicked. It should accept one parameter, which is the row data.\r\n * @param {any} [rowData=null] - The data of the row corresponding to the clicked button. Defaults to null.\r\n * \r\n * @returns {void}\r\n * \r\n * @example\r\n * // Define an action for a button\r\n * const deleteAction = (rowData) => {\r\n * console.log(`Delete row with id: ${rowData.rowID}`);\r\n * };\r\n * \r\n * // Use handleButtonsClick with row data\r\n * handleButtonsClick(deleteAction, { rowID: 1, name: 'John Doe' });\r\n */\r\n handleButtonsClick(action: (rowData: any) => void, rowData: any = null): void {\r\n if (action) { // If the button has an assigned action\r\n action(rowData); // Perform the action\r\n }\r\n }\r\n\r\n handlePredefinedFilterClick(action: (rowData: any, option: IPredefinedFilter) => void, rowData: any = null, option: IPredefinedFilter): void {\r\n if (action) { // If the button has an assigned action\r\n action(rowData, option); // Perform the action\r\n }\r\n }\r\n\r\n getColumnStyle(col: any, headerCols: boolean = false): Record<string, string> {\r\n let styles: Record<string, string> = {};\r\n if (!headerCols) {\r\n switch (col.cellOverflowBehaviour) {\r\n case CellOverflowBehaviour.Wrap:\r\n styles['white-space'] = 'normal';\r\n styles['word-wrap'] = 'break-word';\r\n styles['word-break'] = 'break-all';\r\n styles['overflow'] = 'hidden';\r\n break;\r\n\r\n /*case CellOverflowBehaviour.Ellipsis:\r\n styles['white-space'] = 'nowrap';\r\n styles['overflow'] = 'hidden';\r\n styles['text-overflow'] = 'ellipsis';\r\n styles['width'] = '100%';\r\n styles['min-width'] = '100%';\r\n styles['max-width'] = '100%';\r\n break;*/\r\n /*\r\n display: block;\r\n width: 100%; \r\n text-align: center;\r\n */\r\n\r\n case CellOverflowBehaviour.Hidden:\r\n default:\r\n styles['white-space'] = 'nowrap';\r\n break;\r\n }\r\n }\r\n\r\n if (col.initialWidth > 0) {\r\n const width = `${col.initialWidth}px`;\r\n styles['width'] = width;\r\n styles['min-width'] = width;\r\n styles['max-width'] = width;\r\n }\r\n\r\n return styles;\r\n\r\n /*let styles: Record<string, string> = {};\r\n if(!headerCols){\r\n styles = {\r\n 'white-space': col.cellOverflowBehaviour === CellOverflowBehaviour.Wrap ? 'normal' : 'nowrap',\r\n 'word-wrap': col.cellOverflowBehaviour === CellOverflowBehaviour.Wrap ? 'break-word' : 'normal',\r\n 'word-break': col.cellOverflowBehaviour === CellOverflowBehaviour.Wrap ? 'break-all' : 'normal'\r\n };\r\n }\r\n if (col.initialWidth > 0) {\r\n styles['max-width'] = col.initialWidth + 'px';\r\n styles['min-width'] = col.initialWidth + 'px';\r\n styles['width'] = col.initialWidth + 'px';\r\n }\r\n return styles;*/\r\n }\r\n\r\n fetchTableViews(tableViewSaveAs: TableViewSaveMode, recoverListEndpoint: string, tableViewSaveKey: string): ITableView[] | Observable<HttpResponse<ITableView[]>>{\r\n let tableViewList: ITableView[] = [];\r\n let tableViewNotParsed: string | null = null;\r\n if(tableViewSaveKey !== \"\" && tableViewSaveKey !== ''){\r\n switch(tableViewSaveAs){\r\n case TableViewSaveMode.None:\r\n tableViewNotParsed = null;\r\n break;\r\n case TableViewSaveMode.SessionStorage:\r\n tableViewNotParsed = sessionStorage.getItem(tableViewSaveKey);\r\n break;\r\n case TableViewSaveMode.LocalStorage:\r\n tableViewNotParsed = localStorage.getItem(tableViewSaveKey);\r\n break;\r\n case TableViewSaveMode.DatabaseStorage:\r\n const postData: any = {\r\n tableViewSaveKey: tableViewSaveKey\r\n };\r\n return this.http.handleHttpPostRequest<ITableView[]>(recoverListEndpoint,postData);\r\n default:\r\n this.notification.showToast(\"error\",\"SAVE VIEW TYPE DOES NOT EXIST\", \"This type of save view does not exist.\");\r\n }\r\n }\r\n tableViewList = tableViewNotParsed ? JSON.parse(tableViewNotParsed) : [];\r\n this.sortViews(tableViewList);\r\n return tableViewList;\r\n }\r\n sortViews(tableSaveViewList: ITableView[]): void{\r\n tableSaveViewList.sort((a, b) => \r\n a.viewAlias.toLowerCase().localeCompare(b.viewAlias.toLowerCase())\r\n );\r\n }\r\n updateViewsMenuItems(tableSaveViewList: ITableView[]): MenuItem[]{\r\n return tableSaveViewList.map(item => ({\r\n label: item.viewAlias,\r\n lastActive: item.lastActive\r\n }));\r\n }\r\n viewsSaveToDatabase(tableSaveViewList: ITableView[], setListEndpoint: string, tableViewSaveKey: string): Observable<HttpResponse<any>>{\r\n const serializedSaveViews = tableSaveViewList.map(view => ({\r\n viewAlias: view.viewAlias,\r\n viewData: JSON.stringify(view.viewData),\r\n lastActive: view.lastActive\r\n }));\r\n const postData: any = {\r\n tableViewSaveKey: tableViewSaveKey,\r\n views: serializedSaveViews\r\n };\r\n return this.http.handleHttpPostRequest<any>(setListEndpoint,postData);\r\n }\r\n viewGenerateData(dt: Table, globalSearchText: string | null, currentPage: number, currentRowsPerPage: number, modifyFiltersFn: (filters: any) => any): ITableViewData{\r\n let colsWidth = this.computeColumnWidths(dt);\r\n let tableWidth = this.computeTableWidth(dt);\r\n const filtersWithoutGlobalAndSelectedRows = {...modifyFiltersFn(JSON.parse(JSON.stringify(dt.filters)))};\r\n if (filtersWithoutGlobalAndSelectedRows['rowID']) {\r\n filtersWithoutGlobalAndSelectedRows['rowID'][0].value = null;\r\n }\r\n if (filtersWithoutGlobalAndSelectedRows['selector']) {\r\n filtersWithoutGlobalAndSelectedRows['selector'][0].value = null;\r\n }\r\n const tableView: ITableViewData = {\r\n columnsShown: [...dt.columns!],\r\n multiSortMeta: dt.multiSortMeta,\r\n filters: {...filtersWithoutGlobalAndSelectedRows},\r\n globalSearchText: globalSearchText,\r\n currentPage: currentPage,\r\n currentRowsPerPage: currentRowsPerPage,\r\n tableWidth: tableWidth,\r\n columnsWidth: colsWidth\r\n }\r\n return tableView;\r\n }\r\n\r\n computeColumnWidths(dt: Table): any {\r\n let widths: number[] = [];\r\n const headers = dt.el.nativeElement.querySelectorAll('.p-datatable-thead > tr > th');\r\n headers.forEach((header: HTMLElement) => widths.push(DomHandler.getOuterWidth(header)));\r\n return widths.join(',');\r\n }\r\n\r\n computeTableWidth(dt: Table): any {\r\n let tableWidth = 0;\r\n if (dt.columnResizeMode === 'expand') {\r\n tableWidth = DomHandler.getOuterWidth(dt.tableViewChild?.nativeElement);\r\n }\r\n return tableWidth;\r\n }\r\n}","import { Component, Input } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml, SafeUrl } from '@angular/platform-browser';\r\nimport { SkeletonModule } from 'primeng/skeleton';\r\nimport { TagModule } from 'primeng/tag';\r\nimport { ECSPrimengTableService } from '../ecs-primeng-table/ecs-primeng-table.service';\r\nimport { highlightText } from '../../utils';\r\nimport { IColumnMetadata } from '../../interfaces';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'ecs-table-predefined-filters',\r\n imports: [\r\n SkeletonModule,\r\n TagModule,\r\n CommonModule\r\n ],\r\n standalone: true,\r\n templateUrl: './table-predefined-filters.html'\r\n})\r\nexport class TablePredefinedFilters {\r\n constructor(\r\n private sanitizer: DomSanitizer,\r\n private tableService: ECSPrimengTableService\r\n ) {}\r\n @Input() option: any;\r\n @Input() col: any;\r\n @Input() selectable: boolean = false;\r\n @Input() rowData: any;\r\n @Input() globalSearchText?: any;\r\n /**\r\n * Converts a blob from the database to a safe URL that can be used to display an image.\r\n *\r\n * This function takes a `Blob` object, converts it to a base64 encoded string, and returns a `SafeUrl` \r\n * that can be used in an HTML template to display the image securely. The `SafeUrl` ensures that \r\n * Angular's security mechanisms are bypassed correctly, preventing potential security risks.\r\n *\r\n * @param {Blob} blob - The blob object representing the image data from the database.\r\n * @returns {SafeUrl} A safe URL that can be used to display the image in an HTML template.\r\n * \r\n * @example\r\n * // Example usage in a component\r\n * const imageBlob = new Blob([binaryData], { type: 'image/jpeg' });\r\n * const imageUrl = this.getBlobIconAsUrl(imageBlob);\r\n * \r\n * // In your HTML template\r\n * <img [src]=\"imageUrl\" alt=\"Image\">\r\n */\r\n getBlobIconAsUrl(blob: Blob): SafeUrl {\r\n let objectURL = `data:image/jpeg;base64,${blob}`; // Create a base64 encoded string from the blob data\r\n return this.sanitizer.bypassSecurityTrustUrl(objectURL); // Bypass Angular's security mechanisms to create a SafeUrl\r\n }\r\n\r\n handleClick() {\r\n if (this.option.action) {\r\n this.tableService.handlePredefinedFilterClick(this.option.action, this.rowData, this.option);\r\n }\r\n }\r\n\r\n getTagStyle(option: any) {\r\n return {\r\n ...option.tagStyle,\r\n 'vertical-align': 'middle',\r\n 'gap': 0\r\n };\r\n }\r\n\r\n getImageSkeletonStyle(width?: number, height?: number, isSkeleton: boolean = false): Record<string, string> {\r\n const finalHeight = height && height > 0 ? `${height}px` : '22px'; // Compute final height; use default if invalid\r\n let finalWidth: string | undefined;\r\n if (width && width > 0) { // If width is valid, use it\r\n finalWidth = `${width}px`;\r\n } else if (isSkeleton) { // If it's a skeleton and width is not provided, mirror the height\r\n finalWidth = finalHeight;\r\n }\r\n const style: Record<string, string> = {\r\n 'vertical-align': 'middle',\r\n 'height': finalHeight\r\n };\r\n if (finalWidth) { // Add width if available\r\n style['width'] = finalWidth;\r\n }\r\n return style;\r\n }\r\n\r\n highlightText(cellValue: any, colMetadata: IColumnMetadata, globalSearchText: string | null | undefined ): SafeHtml {\r\n return highlightText(cellValue, colMetadata, globalSearchText ?? null, this.sanitizer);\r\n }\r\n}","<div style=\"display: flex; align-items: center; gap: 0.5rem;\"\r\n [style.cursor]=\"(selectable && option?.action) ? 'pointer' : 'default'\"\r\n [attr.role]=\"selectable && option?.action ? 'button' : null\"\r\n (click)=\"handleClick(); $event.stopPropagation();\">\r\n @if (option?.icon) {\r\n <i [class]=\"option.icon\" [style]=\"'vertical-align: middle; color: '+(option.iconColor || '') +';' +(option.iconStyle || '')\"></i>\r\n }\r\n @if (!option?.imageBlob && option?.imageBlobSourceEndpoint) { <!-- If a blob image needs to be loaded from endpoint, while it's still loading, show skeleton -->\r\n <p-skeleton [style]=\"getImageSkeletonStyle(option.imageWidth, option.imageHeight, true)\"/>\r\n }\r\n @if (option?.imageBlob) {\r\n <img alt=\"image\" [src]=\"getBlobIconAsUrl(option.imageBlob)\" [style]=\"getImageSkeletonStyle(option.imageWidth, option.imageHeight)\"/>\r\n }\r\n @if (option?.imageURL) {\r\n <img alt=\"iconFromURL\" [src]=\"option.imageURL\" [style]=\"getImageSkeletonStyle(option.imageWidth, option.imageHeight)\"/>\r\n }\r\n @if (option?.displayTag === true) {\r\n <p-tag [innerHtml]=\"highlightText(option.name, col, globalSearchText)\" [style]=\"getTagStyle(option)\" [value]=\"option.name\"/>\r\n }\r\n @if (option?.displayName === true) {\r\n <span style=\"gap: 0;\" [innerHtml]=\"highlightText(option.name, col, globalSearchText)\" [ngStyle]=\"option.nameStyle || {}\">{{ option.name }}</span>\r\n }\r\n</div>","import { Component, Input } from '@angular/core';\r\nimport { DataAlignHorizontal, DataAlignVertical, DataType } from '../../enums';\r\nimport { CommonModule, DatePipe } from '@angular/common';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { dataAlignHorizontalAsText, dataAlignVerticalAsText, highlightText } from '../../utils';\r\nimport { IColumnMetadata, IPredefinedFilter } from '../../interfaces';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { TablePredefinedFilters } from \"../table-predefined-filters/table-predefined-filters\";\r\n@Component({\r\n selector: 'ecs-table-cell',\r\n imports: [\r\n CommonModule,\r\n TooltipModule,\r\n TablePredefinedFilters\r\n],\r\n standalone: true,\r\n templateUrl: './table-cell.html'\r\n})\r\nexport class TableCell {\r\n constructor(\r\n private datePipe: DatePipe,\r\n private sanitizer: DomSanitizer\r\n ) {}\r\n @Input() col: any;\r\n @Input() rowData: any;\r\n @Input() globalSearchText: string | null = null;\r\n @Input() predefinedFiltersCollection?: { [key: string]: IPredefinedFilter[] } = {}; // Contains a collection of the values that need to be shown for predefined column filters\r\n @Input() dateFormat: string = \"dd-MMM-yyyy HH:mm:ss zzzz\";\r\n @Input() dateTimezone: string = \"+00:00\";\r\n @Input() dateCulture: string = \"en-US\";\r\n\r\n DataType = DataType;\r\n\r\n get value() {\r\n return this.rowData[this.col.field];\r\n }\r\n\r\n get tooltipText() {\r\n if (this.col.dataTooltipCustomColumnSource && this.col.dataTooltipCustomColumnSource.length > 0) {\r\n return this.rowData[this.col.dataTooltipCustomColumnSource];\r\n }\r\n return this.value;\r\n }\r\n\r\n getListValues(col: any, rowData: any): string[] {\r\n const value = rowData[col.field];\r\n return value ? value.split(';').map((v: any) => v.trim()) : [];\r\n }\r\n\r\n getDataAlignHorizontalAsText(dataAlignHorizontal: DataAlignHorizontal){\r\n dataAlignHorizontalAsText(dataAlignHorizontal);\r\n }\r\n getDataAlignVerticalAsText(dataAlignVertical: DataAlignVertical){\r\n dataAlignVerticalAsText(dataAlignVertical);\r\n }\r\n \r\n\r\n /**\r\n * Formats a date value using either column-level overrides or global settings.\r\n * The incoming value is assumed to represent a UTC date.\r\n *\r\n * @param {any} value - The date value to be formatted.\r\n * @param {string | null} dateFormat - Optional column-level override for the date format.\r\n * @param {string | null} dateTimezone - Optional column-level override for the timezone used in formatting.\r\n * @param {string | null} dateCulture - Optional column-level override for the culture used in formatting.\r\n *\r\n * @returns {string} - The formatted date string using the effective (column or global) settings,\r\n * or an empty string if the value is invalid or undefined.\r\n *\r\n * @example\r\n * // Example using only global settings:\r\n * const result = formatDate(dateValue, null, null, null);\r\n *\r\n * @example\r\n * // Example using column-level overrides:\r\n * const result = formatDate(dateValue, 'dd/MM/yyyy', 'UTC', 'en-GB');\r\n */\r\n formatDate(value: any, dateFormat: string | null, dateTimezone : string | null, dateCulture : string | null): string{\r\n if(!value){ // If no value, return empty\r\n return '';\r\n }\r\n let formattedDate = undefined; // By default, formattedDate will be undefined\r\n const effectiveFormat = dateFormat ?? this.dateFormat;\r\n const effectiveTimezone = dateTimezone ?? this.dateTimezone;\r\n const effectiveCulture = dateCulture ?? this.dateCulture;\r\n if(value){ // If value is not undefined\r\n const dateUtc = new Date(value + 'Z'); // Make sure the date is treated as UTC\r\n formattedDate = this.datePipe.transform(dateUtc, effectiveFormat, effectiveTimezone, effectiveCulture); // Perform the date masking\r\n }\r\n return formattedDate ?? ''; // Returns the date formatted, or as empty string if an issue was found (or value was undefined).\r\n }\r\n\r\n getPredefinedFilterTooltip(colMetadata: IColumnMetadata, value: any): any {\r\n if(colMetadata.dataType == DataType.List){\r\n return value;\r\n }\r\n if(colMetadata.filterPredefinedValuesName && colMetadata.filterPredefinedValuesName.length > 0){\r\n const options = this.getPredefinedFilterValues(colMetadata.filterPredefinedValuesName);\r\n return options.find(x => x.value == value)?.name\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Checks if the provided column metadata matches a specific style of the predefined filters \r\n * that need to be applied to an item on a row.\r\n *\r\n * @param {IprimengColumnsMetadata} colMetadata - The metadata of the column being checked.\r\n * @param {any} value - The value to be matched against the predefined filter values.\r\n * @returns {any} The matching predefined filter value if found, otherwise null.\r\n */\r\n getPredfinedFilterMatch(colMetadata: IColumnMetadata, value: any): any {\r\n if (colMetadata.filterPredefinedValuesName && colMetadata.filterPredefinedValuesName.length > 0) { // Check if the column uses predefined filter values\r\n const options = this.getPredefinedFilterValues(colMetadata.filterPredefinedValuesName); // Get the predefined filter values based on the name\r\n return options.find(option => option.value === value); // Return the matching option if found\r\n }\r\n return null; // Return null if the column does not use predefined filter values\r\n }\r\n getPredefinedFilterValues(columnKeyName: string): IPredefinedFilter[] {\r\n return this.predefinedFiltersCollection?.[columnKeyName] || []; // Return the predefined filter values or an empty array if the option name does not exist\r\n }\r\n\r\n highlightText(cellValue: any, colMetadata: IColumnMetadata, globalSearchText: string | null): SafeHtml {\r\n return highlightText(cellValue, colMetadata, globalSearchText, this.sanitizer);\r\n }\r\n}","@if (value !== null && value !== undefined) {\r\n @if (col.filterPredefinedValuesName && col.filterPredefinedValuesName.length > 0) {\r\n <div [ngStyle]=\"{\r\n 'justify-content': getDataAlignHorizontalAsText(col.dataAlignHorizontal),\r\n 'align-items': getDataAlignVerticalAsText(col.dataAlignVertical)\r\n }\">\r\n @if (col.dataType === DataType.List){\r\n @for (item of getListValues(col, rowData); track item) {\r\n @if (getPredfinedFilterMatch(col, item); as option) {\r\n <div style=\"display: inline-block; margin-right: 0.5rem;\"\r\n [pTooltip]=\"col.dataTooltipCustomColumnSource && col.dataTooltipCustomColumnSource.length > 0 \r\n ? rowData[col.dataTooltipCustomColumnSource] \r\n : item\"\r\n [tooltipDisabled]=\"!col.dataTooltipShow\"\r\n [showDelay]=\"700\"\r\n tooltipPosition=\"top\">\r\n <ecs-table-predefined-filters [option]=\"option\" [col]=\"col\" [selectable]=\"true\" [rowData]=\"rowData\" [globalSearchText]=\"globalSearchText\"/>\r\n </div>\r\n }\r\n }\r\n } @else {\r\n @if (getPredfinedFilterMatch(col, value); as option) {\r\n <div style=\"display: inline-block;\"\r\n [pTooltip]=\"col.dataTooltipCustomColumnSource && col.dataTooltipCustomColumnSource.length > 0 \r\n ? rowData[col.dataTooltipCustomColumnSource] \r\n : value\"\r\n [tooltipDisabled]=\"!col.dataTooltipShow\"\r\n [showDelay]=\"700\"\r\n tooltipPosition=\"top\">\r\n <ecs-table-predefined-filters [option]=\"option\" [col]=\"col\" [selectable]=\"true\" [rowData]=\"rowData\" [globalSearchText]=\"globalSearchText\"/>\r\n </div>\r\n }\r\n }\r\n </div>\r\n } @else {\r\n @switch (col.dataType) {\r\n @case (DataType.Boolean) {\r\n <i class=\"pi\"\r\n [pTooltip]=\"col.dataTooltipCustomColumnSource && col.dataTooltipCustomColumnSource.length > 0 \r\n ? rowData[col.dataTooltipCustomColumnSource] \r\n : value\"\r\n [tooltipDisabled]=\"!col.dataTooltipShow || !col.dataTooltipCustomColumnSource || col.dataTooltipCustomColumnSource.length === 0\"\r\n [showDelay]=\"700\"\r\n tooltipPosition=\"top\"\r\n [style.color]=\"value ? 'green' : 'red'\"\r\n [ngClass]=\"{ 'pi-check-circle': value, 'pi-times-circle': !value }\">\r\n </i>\r\n }\r\n @case (DataType.Date) {\r\n <div \r\n [innerHtml]=\"highlightText(formatDate(value, col.dateFormat, col.dateTimezone, col.dateCulture), col, globalSearchText)\"\r\n [pTooltip]=\"col.dataTooltipCustomColumnSource && col.dataTooltipCustomColumnSource.length > 0 \r\n ? rowData[col.dataTooltipCustomColumnSource] \r\n : formatDate(value, col.dateFormat, col.dateTimezone, col.dateCulture)\"\r\n [tooltipDisabled]=\"!col.dataTooltipShow\"\r\n [showDelay]=\"700\"\r\n tooltipPosition=\"top\">\r\n {{ formatDate(value, col.dateFormat, col.dateTimezone, col.dateCulture) }}\r\n </div>\r\n }\r\n @default {\r\n <div\r\n [innerHtml]=\"highlightText(value, col, globalSearchText)\"\r\n [pTooltip]=\"col.dataTooltipCustomColumnSource && col.dataTooltipCustomColumnSource.length > 0 \r\n ? rowData[col.dataTooltipCustomColumnSource] \r\n : value\"\r\n [tooltipDisabled]=\"!col.dataTooltipShow\"\r\n [showDelay]=\"700\"\r\n tooltipPosition=\"top\">\r\n {{ value }}\r\n </div>\r\n }\r\n }\r\n }\r\n}","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { ECSPrimengTableService } from '../ecs-primeng-table/ecs-primeng-table.service';\r\n\r\n@Component({\r\n selector: 'ecs-table-button',\r\n imports: [\r\n CommonModule,\r\n ButtonModule,\r\n TooltipModule\r\n ],\r\n standalone: true,\r\n templateUrl: './table-button.html',\r\n styleUrl: './table-button.scss'\r\n})\r\nexport class TableButton {\r\n constructor(\r\n private tableService: ECSPrimengTableService\r\n ) {}\r\n @Input() button: any;\r\n @Input() rowData: any;\r\n @Input() isActionButton: boolean = false;\r\n @Input() isLastActionButton: boolean = false;\r\n\r\n handleClick() {\r\n if (this.button.action) {\r\n this.tableService.handleButtonsClick(this.button.action, this.rowData);\r\n }\r\n }\r\n}\r\n","@if(button.visibleCondition?.(rowData) ?? true){ <!--If 'visibleCondition' is true or not defined-->\r\n @if((button.enabledCondition?.(rowData) ?? true) || !button.conditionFailHide){ <!--Render button if 'enabledCondition' is true or undefined, OR if 'conditionFailHide' is false-->\r\n <p-button\r\n [disabled]=\"!(button.enabledCondition?.(rowData) ?? true)\"\r\n [rounded]=\"button.rounded || false\"\r\n [iconPos]=\"button.iconPos || 'left'\"\r\n [raised]=\"button.raised || false\"\r\n [variant]=\"button.variant || null\"\r\n [pTooltip]=\"button.tooltip || ''\"\r\n [tooltipDisabled]=\"!button.tooltip || button.tooltip.length === 0\"\r\n [showDelay]=\"700\"\r\n tooltipPosition=\"top\"\r\n [styleClass]=\"(button.color || 'p-button-outlined') + (isActionButton ? ' custom-small-btn' : '') + (button.style || '')\"\r\n [icon]=\"button.icon || ''\"\r\n [label]=\"button.label || ''\"\r\n [size]=\"isActionButton ? 'small': undefined\"\r\n [ngStyle]=\"isActionButton && !isLastActionButton ? {'margin-right':'10px'} : {}\"\r\n (onClick)=\"handleClick()\"/>\r\n }\r\n}","import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { DialogModule } from 'primeng/dialog';\r\nimport { Table, TableModule } from 'primeng/table';\r\nimport { CheckboxModule } from 'primeng/checkbox';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { SelectButtonModule } from 'primeng/selectbutton';\r\nimport { CellOverflowBehaviour, DataAlignHorizontal, DataAlignVertical } from '../../enums';\r\nimport { InputIconModule } from 'primeng/inputicon';\r\nimport { IconFieldModule } from 'primeng/iconfield';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { IColumnMetadata } from '../../interfaces';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\n\r\n\r\n@Component({\r\n selector: 'ecs-column-selector',\r\n imports: [\r\n DialogModule,\r\n TableModule,\r\n CheckboxModule,\r\n ButtonModule,\r\n SelectButtonModule,\r\n CommonModule,\r\n FormsModule,\r\n InputIconModule,\r\n IconFieldModule,\r\n InputTextModule,\r\n TooltipModule\r\n ],\r\n standalone: true,\r\n templateUrl: './column-selector.html'\r\n})\r\nexport class ColumnSelector {\r\n @ViewChild('dt_columnDialog') dt_columnDialog!: Table;\r\n \r\n @Input() visible: boolean = false;\r\n @Input() columnModalData: any[] = [];\r\n @Input() filteredColumnData: any[] = [];\r\n\r\n @Output() visibleChange = new EventEmitter<boolean>();\r\n @Output() applyChanges = new EventEmitter<IColumnMetadata[]>(); \r\n\r\n cellOverflowBehaviourOptions = [\r\n {icon: 'pi pi-minus', val: CellOverflowBehaviour.Hidden, name: \"Hidden\"},\r\n {icon: 'pi pi-equals', val: CellOverflowBehaviour.Wrap, name: \"Wrap\"}/*,\r\n {icon: 'pi pi-ellipsis-h', val: CellOverflowBehaviour.Ellipsis, name: \"Ellipsis\"}*/\r\n ];\r\n dataAlignHorizontalOptions = [\r\n {icon: 'pi pi-align-left', val: DataAlignHorizontal.Left, name: \"Left\"},\r\n {icon: 'pi pi-align-center', val: DataAlignHorizontal.Center, name: \"Center\"},\r\n {icon: 'pi pi-align-right', val: DataAlignHorizontal.Right, name: \"Right\"}\r\n ];\r\n dataAlignVerticalOptions = [\r\n {icon: 'pi pi-angle-up', val: DataAlignVertical.Top, name: \"Top\"},\r\n {icon: 'pi pi-align-justify', val: DataAlignVertical.Middle, name: \"Middle\"},\r\n {icon: 'pi pi-angle-down', val: DataAlignVertical.Bottom, name: \"Bottom\"}\r\n ];\r\n\r\n globalSearchText: string | null = null; // The text used by the global search\r\n globalSearchMaxLength: number = 50;\r\n onColumnModalFilter(event: any) {\r\n const filterValue = event.filters && event.filters.global \r\n ? event.filters.global.value.toLowerCase() \r\n : ''; \r\n this.filteredColumnData = this.columnModalData.filter(column => \r\n column.header.toLowerCase().includes(filterValue)\r\n );\r\n }\r\n\r\n allColumnsCheckboxActive(): boolean{\r\n return this.columnModalData.every(column => column.selected);\r\n }\r\n\r\n allColumnsCheckboxClick(event: any): void{\r\n if(event.checked){\r\n this.columnModalData.forEach(column => {column.selected = true;});\r\n } else {\r\n this.columnModalData.forEach(column => {\r\n if (!column.selectDisabled) {\r\n column.selected = false;\r\n }\r\n });\r\n }\r\n }\r\n\r\n filterColumnModal(event: any) {\r\n let filterValue = event.target.value;\r\n this.dt_columnDialog.filterGlobal(filterValue, 'contains');\r\n }\r\n\r\n applyColumnModalChanges(){\r\n const selected = this.columnModalData.filter(c => c.selected && !c.selectDisabled);\r\n this.applyChanges.emit(selected);\r\n this.closeModal();\r\n }\r\n clearGlobalFilter(dt: Table){\r\n this.globalSearchText=null;\r\n dt.filterGlobal('','');\r\n }\r\n closeModal(){\r\n this.globalSearchText=null;\r\n this.visibleChange.emit(false);\r\n }\r\n}\r\n","<!--COLUMN MODAL DIALOG-->\r\n<p-dialog [(visible)]=\"visible\" [modal]=\"true\" [draggable]=\"false\" [resizable]=\"false\" [closeOnEscape]=\"false\" [closable]=\"false\" [maximizable]=\"false\" [style]=\"{'min-width': '65vw', 'max-width': '65vw'}\">\r\n <ng-template pTemplate=\"header\">\r\n <span class=\"white-space-nowrap\"><b>MODIFY COLUMNS</b></span>\r\n </ng-template>\r\n <div style=\"padding: 10px;\">\r\n <p-table #dt_columnDialog [value]=\"columnModalData\" [scrollable]=\"true\" size=\"small\" showGridlines stripedRows \r\n [globalFilterFields]=\"['header']\" scrollHeight=\"calc(80vh - 220px)\" (onFilter)=\"onColumnModalFilter($event)\">\r\n <ng-template #caption>\r\n <div style=\"display: flex; justify-content: space-between; align-items: center;\">\r\n <div style=\"display: flex; align-items: center; gap: 10px\">\r\n <p-checkbox inputId=\"selectAll\" [binary]=\"true\" [ngModel]=\"allColumnsCheckboxActive()\" (onChange)=\"allColumnsCheckboxClick($event)\"></p-checkbox>\r\n <label for=\"selectAll\">Select all columns</label>\r\n </div>\r\n <div style=\"display: flex; align-items: center;\">\r\n <p-iconField iconPosition=\"left\" [ngClass]=\"{'p-input-icon-right': globalSearchText}\">\r\n <p-inputIcon>\r\n <i class=\"pi pi-search\"></i>\r\n </p-inputIcon>\r\n <input pInputText type=\"text\" \r\n (input)=\"filterColumnModal($event)\" autocomplete=\"off\" \r\n [maxlength]=\"globalSearchMaxLength\" placeholder=\"Search column name\" [(ngModel)]=\"globalSearchText\"\r\n style=\"width: 220px;\"/>\r\n <!-- Right icon (only if there is text) -->\r\n @if (globalSearchText) {\r\n <p-inputIcon position=\"right\">\r\n <i class=\"pi pi-times\" style=\"cursor: pointer;\" (click)=\"clearGlobalFilter(dt_columnDialog); $event.stopPropagation()\"></i>\r\n </p-inputIcon>\r\n }\r\n </p-iconField>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template #header>\r\n <tr>\r\n <th pFrozenColumn style=\"max-width: 100px; min-width: 100px; width: 100px; text-align: center;\">Show column</th>\r\n <th pFrozenColumn style=\"max-width: 250px; min-width: 250px; width: 250px; text-align: center;\">Column name</th>\r\n <th style=\"max-width: 150px; min-width: 150px; width: 150px; text-align: center;\">Cell overflow behaviour</th>\r\n <th style=\"max-width: 160px; min-width: 160px; width: 160px; text-align: center;\">Horizontal aligment</th>\r\n <th style=\"max-width: 150px; min-width: 150px; width: 150px; text-align: center;\">Vertical aligment</th>\r\n </tr>\r\n </ng-template>\r\n <ng-template #body let-rowData>\r\n <tr>\r\n <td pFrozenColumn style=\"max-width: 100px; min-width: 100px; width: 100px; text-align: center;\">\r\n <p-checkbox \r\n [(ngModel)]=\"rowData.selected\" \r\n [binary]=\"true\"\r\n [disabled]=\"rowData.selectDisabled\"/>\r\n </td>\r\n <td pFrozenColumn style=\"max-width: 250px; min-width: 250px; width: 250px;\">{{rowData.header}}</td>\r\n <td style=\"max-width: 150px; min-width: 150px; width: 150px; text-align: center;\">\r\n <p-selectButton [(ngModel)]=\"rowData.cellOverflowBehaviour\" [options]=\"cellOverflowBehaviourOptions\" optionValue=\"val\" optionLabel=\"icon\" [disabled]=\"rowData.cellOverflowBehaviourDisabled\" allowEmpty=\"false\">\r\n <ng-template #item let-item>\r\n <i [class]=\"item.icon\" style=\"margin: -20px;\" [pTooltip]=\"item.name\" [showDelay]=\"400\" tooltipPosition=\"top\"></i>\r\n </ng-template>\r\n </p-selectButton>\r\n </td>\r\n <td style=\"max-width: 160px; min-width: 160px; width: 160px; text-align: center;\">\r\n <p-selectButton [(ngModel)]=\"rowData.dataAlignHorizontal\" [options]=\"dataAlignHorizontalOptions\" optionValue=\"val\" optionLabel=\"icon\" [disabled]=\"rowData.dataAlignHorizontalDisabled\" allowEmpty=\"false\">\r\n <ng-template #item let-item>\r\n <i [class]=\"item.icon\" style=\"margin: -20px;\" [pTooltip]=\"item.name\" [showDelay]=\"400\" tooltipPosition=\"top\"></i>\r\n </ng-template>\r\n </p-selectButton>\r\n </td>\r\n <td style=\"max-width: 150px; min-width: 150px; width: 150px; text-align: center;\">\r\n <p-selectButton [(ngModel)]=\"rowData.dataAlignVertical\" [options]=\"dataAlignVerticalOptions\" optionValue=\"val\" optionLabel=\"icon\" [disabled]=\"rowData.dataAlignVerticalDisabled\" allowEmpty=\"false\">\r\n <ng-template #item let-item>\r\n <i [class]=\"item.icon\" style=\"margin: -20px;\" [pTooltip]=\"item.name\" [showDelay]=\"400\" tooltipPosition=\"top\"></i>\r\n </ng-template>\r\n </p-selectButton>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template #emptymessage>\r\n <tr>\r\n <td colspan=\"999\">There are no columns</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div style=\"display: flex; flex-direction: row; justify-content: space-between; align-items: center; margin-top: 10px;\">\r\n Showing {{filteredColumnData ? filteredColumnData.length : 0}} columns of {{columnModalData ? columnModalData.length : 0}} available columns\r\n </div>\r\n </div>\r\n <ng-template pTemplate=\"footer\" style=\"display: flex; justify-content: space-between; align-items: center;\">\r\n <p-button (click)=\"closeModal()\" label=\"Cancel changes\" outlined=\"true\" [style]=\"{'margin-top': '10px'}\"></p-button>\r\n <p-button (click)=\"applyColumnModalChanges()\" label=\"Save changes\" [style]=\"{'margin-top': '10px'}\"></p-button>\r\n </ng-template>\r\n</p-dialog>","import { Injectable } from \"@angular/core\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ExportExcelService {\r\n getCurrentTimeString(): string {\r\n const now = new Date();\r\n const year = now.getUTCFullYear();\r\n const month = String(now.getUTCMonth() + 1).padStart(2, '0');\r\n const day = String(now.getUTCDate()).padStart(2, '0');\r\n const hours = String(now.getUTCHours()).padStart(2, '0');\r\n const minutes = String(now.getUTCMinutes()).padStart(2, '0');\r\n const seconds = String(now.getUTCSeconds()).padStart(2, '0');\r\n return `_${year}${month}${day}_${hours}${minutes}${seconds}_UTC`;\r\n }\r\n}","import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { DialogModule } from 'primeng/dialog';\r\nimport { SelectButton, SelectButtonChangeEvent } from 'primeng/selectbutton';\r\nimport { ECSPrimengTableNotificationService } from '../../services';\r\nimport { ExportExcelService } from './export-excel.service';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { CheckboxModule } from 'primeng/checkbox';\r\n\r\n@Component({\r\n selector: 'ecs-export-excel',\r\n imports: [\r\n DialogModule,\r\n FormsModule,\r\n ButtonModule,\r\n SelectButton,\r\n InputTextModule,\r\n TooltipModule,\r\n CheckboxModule\r\n ],\r\n standalone: true,\r\n templateUrl: './export-excel.html'\r\n})\r\nexport class ExportExcel implements OnChanges {\r\n @Input() visible: boolean = false;\r\n @Input() rowCheckboxSelectorActive: boolean = false;\r\n @Input() excelReportTitle: string = \"\";\r\n includeTimeInTitle: boolean = true;\r\n exportUseIconsInBools: boolean = false;\r\n @Input() allowTitleUserEdit: boolean = false;\r\n @Output() exportToExcel = new EventEmitter<{\r\n allColumns: boolean,\r\n applyFilters: boolean,\r\n applySorts: boolean,\r\n selectedRows: number,\r\n filename: string,\r\n useIconInBools: boolean\r\n }>();\r\n @Output() visibleChange = new EventEmitter<boolean>();\r\n\r\n constructor(\r\n private notificationSerivce: ECSPrimengTableNotificationService,\r\n private exportExcelService: ExportExcelService\r\n ) {}\r\n\r\n option_exportColumns_selected: boolean = false;\r\n option_exportColumns: any[] = [\r\n { label: 'Only visible', value: false },\r\n { label: 'All columns', value: true }\r\n ];\r\n\r\n option_applyCurrentFilters_selected: boolean = false;\r\n option_applyCurrentFilters: any[] = [\r\n { label: 'No filters', value: false },\r\n { label: 'Apply current filters', value: true }\r\n ];\r\n\r\n option_applyCurrentSorts_selected: boolean = false;\r\n option_applyCurrentSorts: any[] = [\r\n { label: 'No sorts', value: false },\r\n { label: 'Apply current sorts', value: true }\r\n ];\r\n\r\n option_selectedRowsExport_selected: number = 0;\r\n option_selectedRowsExport: any[] = [\r\n { label: 'All rows', value: 0 },\r\n { label: 'Selected rows', value: 1 },\r\n { label: 'Not selected rows', value: 2 }\r\n ];\r\n \r\n ngOnChanges(changes: SimpleChanges) {\r\n // If visible changes from false to true, reset values\r\n if (changes['visible'] && changes['visible'].currentValue === true && changes['visible'].previousValue === false) {\r\n this.resetValues();\r\n }\r\n }\r\n\r\n private resetValues() {\r\n this.includeTimeInTitle = true;\r\n this.exportUseIconsInBools = false;\r\n this.option_exportColumns_selected = false;\r\n this.option_applyCurrentFilters_selected = false;\r\n this.option_applyCurrentSorts_selected = false;\r\n this.option_selectedRowsExport_selected = 0;\r\n }\r\n \r\n getExcelReport(){\r\n let excelReportFinalTitle: string = \"\";\r\n this.excelReportTitle=this.excelReportTitle?.trim();\r\n if (!this.excelReportTitle || this.excelReportTitle.length <= 0) {\r\n this.notificationSerivce.clearToasts();\r\n this.notificationSerivce.showToast(\"error\", \"REPORT NAME NOT VALID\", \"The report name is not valid\");\r\n return; \r\n }\r\n const allowedPattern = /^[A-Za-z0-9 _-]*$/;\r\n if (!allowedPattern.test(this.excelReportTitle)) {\r\n this.notificationSerivce.clearToasts();\r\n this.notificationSerivce.showToast(\"error\", \"INVALID CHARACTERS IN REPORT NAME\", \"The report name contains invalid characters.\");\r\n return;\r\n }\r\n if(this.includeTimeInTitle){\r\n excelReportFinalTitle = this.excelReportTitle + this.exportExcelService.getCurrentTimeString() + \".xlsx\";\r\n } else {\r\n excelReportFinalTitle = this.excelReportTitle + \".xlsx\";\r\n }\r\n this.exportToExcel.emit({\r\n allColumns: this.option_exportColumns_selected,\r\n applyFilters: this.option_applyCurrentFilters_selected,\r\n applySorts: this.option_applyCurrentSorts_selected,\r\n selectedRows: this.option_selectedRowsExport_selected,\r\n filename: excelReportFinalTitle,\r\n useIconInBools: this.exportUseIconsInBools\r\n });\r\n }\r\n\r\n filterSelectorDisabled(): boolean{\r\n return this.option_selectedRowsExport_selected >= 1;\r\n }\r\n\r\n onChangeExportRows(event: SelectButtonChangeEvent): void{\r\n if(event.value>=1){\r\n this.option_applyCurrentFilters_selected=true;\r\n }\r\n }\r\n\r\n closeModal(){\r\n this.visibleChange.emit(false);\r\n }\r\n}","<p-dialog [(visible)]=\"visible\" [modal]=\"true\" [draggable]=\"false\" [resizable]=\"false\"\r\n [closable]=\"false\" [closeOnEscape]=\"false\" [maximizable]=\"false\" [style]=\"{'min-width': '70vw', 'max-width': '70vw'}\">\r\n <ng-template pTemplate=\"header\">\r\n <div>\r\n <span class=\"p-dialog-title\">Export data to Excel</span>\r\n </div>\r\n </ng-template>\r\n <div style=\"display: grid; grid-template-columns: 4fr 8fr; gap: 1rem; align-items: center; margin-top: 10px;\">\r\n <div style=\"justify-self: end;\">\r\n Report filename\r\n </div>\r\n <div style=\"justify-self: stretch; width: 100%;\">\r\n <input pInputText id=\"reportTitle\" [(ngModel)]=\"excelReportTitle\" autocomplete=\"off\" style=\"width: 100%;\" [disabled]=\"!allowTitleUserEdit\" maxlength=\"100\"/>\r\n </div>\r\n\r\n <div style=\"justify-self: end;\">\r\n <i pTooltip=\"Activating this option will add the current <b>'_{year}{month}{day}_{hours}{minutes}{seconds}_UTC'</b> at the end of your filename.\" \r\n tooltipPosition=\"top\" \r\n [escape]=\"false\"\r\n class=\"pi pi-info-circle\">\r\n </i>\r\n Include time in report filename?\r\n </div>\r\n <div style=\"justify-self: stretch; width: 100%;\">\r\n <p-checkbox [binary]=\"true\" [(ngModel)]=\"includeTimeInTitle\"/>\r\n </div>\r\n\r\n <div style=\"justify-self: end;\">\r\n <i pTooltip=\"Activating this option will make boolean values be shown as icons in the Excel report:<br>True → <span class='bool-icon bool-true'>✔</span><br>False → <span class='bool-icon bool-false'>✘</span>\" \r\n tooltipPosition=\"top\" \r\n tooltipStyleClass=\"excel-export-tooltip\"\r\n [escape]=\"false\"\r\n class=\"pi pi-info-circle\">\r\n </i>\r\n Use icons in boolean fields?\r\n </div>\r\n <div style=\"justify-self: stretch; width: 100%;\">\r\n <p-checkbox [binary]=\"true\" [(ngModel)]=\"exportUseIconsInBools\"/>\r\n </div>\r\n \r\n <div style=\"justify-self: end;\">\r\n Export columns\r\n </div>\r\n <div style=\"justify-self: start;\">\r\n <p-selectButton [(ngModel)]=\"option_exportColumns_selected\" [options]=\"option_exportColumns\" optionLabel=\"label\" optionValue=\"value\" allowEmpty=\"false\"/>\r\n </div>\r\n\r\n <div style=\"justify-self: end;\">\r\n @if(filterSelectorDisabled()){\r\n <i pTooltip=\"Sorts are active because you want to export selected rows following a filter criteria\" tooltipPosition=\"top\" class=\"pi pi-info-circle\"></i>\r\n }\r\n Filters to apply\r\n </div>\r\n <div style=\"justify-self: start;\">\r\n <p-selectButton [(ngModel)]=\"option_applyCurrentFilters_selected\" [options]=\"option_applyCurrentFilters\" optionLabel=\"label\" optionValue=\"value\" allowEmpty=\"false\" [disabled]=\"filterSelectorDisabled()\"/>\r\n </div>\r\n\r\n <div style=\"justify-self: end;\">\r\n Sorts to apply\r\n </div>\r\n <div style=\"justify-self: start;\">\r\n <p-selectButton [(ngModel)]=\"option_applyCurrentSorts_selected\" [options]=\"option_applyCurrentSorts\" optionLabel=\"label\" optionValue=\"value\" allowEmpty=\"false\"/>\r\n </div>\r\n\r\n @if(rowCheckboxSelectorActive){\r\n <div style=\"justify-self: end;\">\r\n Selected rows\r\n </div>\r\n <div style=\"justify-self: start;\">\r\n <p-selectButton [(ngModel)]=\"option_selectedRowsExport_selected\" [options]=\"option_selectedRowsExport\" optionLabel=\"label\" optionValue=\"value\" allowEmpty=\"false\" (onChange)=\"onChangeExportRows($event)\"/>\r\n </div>\r\n }\r\n </div>\r\n <ng-template pTemplate=\"footer\" style=\"display: flex; justify-content: space-between; align-items: center;\">\r\n <p-button (click)=\"closeModal()\" label=\"Cancel export\" outlined=\"true\" [style]=\"{'margin-top': '20px'}\"/>\r\n <p-button (click)=\"getExcelReport()\" label=\"Export\" [style]=\"{'margin-top': '20px'}\"/>\r\n </ng-template>\r\n</p-dialog>","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { DialogModule } from 'primeng/dialog';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { TableModule } from 'primeng/table';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { ECSPrimengTableNotificationService } from '../../services';\r\nimport { CheckboxModule } from 'primeng/checkbox';\r\n@Component({\r\n selector: 'ecs-views-management',\r\n imports: [\r\n DialogModule,\r\n TableModule,\r\n ButtonModule,\r\n CommonModule,\r\n FormsModule,\r\n TooltipModule,\r\n InputTextModule,\r\n CheckboxModule\r\n ],\r\n standalone: true,\r\n templateUrl: './views-management.html'\r\n})\r\nexport class ViewsManagement {\r\n constructor(\r\n private notification: ECSPrimengTableNotificationService\r\n ) {}\r\n @Input() visible: boolean = false;\r\n @Input() tableViews_menuItems: any[] = [];\r\n @Output() onViewSelect = new EventEmitter<string>();\r\n @Output() onViewDelete = new EventEmitter<string>();\r\n @Output() onViewUpdateData = new EventEmitter<string>();\r\n @Output() onViewUpdateActiveStartup = new EventEmitter<string>();\r\n @Output() onViewEditAlias = new EventEmitter<{ viewAliasOld: string; viewAliasNew: string }>();\r\n @Output() onViewCreate = new EventEmitter<string>();\r\n @Output() visibleChange = new EventEmitter<boolean>();\r\n viewEditorShow: boolean = false;\r\n editingViewAlias: string = '';\r\n newViewAlias: string = '';\r\n loadView(viewAlias: string) {\r\n this.onViewSelect.emit(viewAlias);\r\n }\r\n deleteView(viewAlias: string){\r\n this.onViewDelete.emit(viewAlias);\r\n }\r\n updateView(viewAlias: string){\r\n this.onViewUpdateData.emit(viewAlias);\r\n }\r\n updateViewActiveStartup(viewAlias: string){\r\n this.onViewUpdateActiveStartup.emit(viewAlias);\r\n }\r\n createView(viewAlias: string){\r\n const exists = this.tableViews_menuItems.some(item => item.label === viewAlias);\r\n if (exists) {\r\n this.notification.showToast(\"error\",\"DUPLICATE VIEW NAME\",`A view with alias \"${viewAlias}\" already exists`);\r\n return;\r\n }\r\n this.onViewCreate.emit(viewAlias);\r\n }\r\n editViewAlias(viewAliasOld: string, viewAliasNew: string) {\r\n this.onViewEditAlias.emit({\r\n viewAliasOld: viewAliasOld,\r\n viewAliasNew: viewAliasNew\r\n });\r\n }\r\n \r\n showViewEditor(editingViewAlias: string = ''){\r\n this.editingViewAlias = editingViewAlias;\r\n this.newViewAlias = this.editingViewAlias;\r\n this.viewEditorShow=true;\r\n }\r\n\r\n closeModal(){\r\n this.visibleChange.emit(false);\r\n }\r\n\r\n createOrUpdateTableView(){\r\n this.viewEditorShow=false;\r\n if(this.editingViewAlias !== ''){\r\n this.editViewAlias(this.editingViewAlias, this.newViewAlias);\r\n } else {\r\n this.createView(this.newViewAlias);\r\n }\r\n }\r\n}","<p-dialog [(visible)]=\"visible\" [modal]=\"true\" [draggable]=\"false\" [resizable]=\"false\"\r\n [closable]=\"true\" [closeOnEscape]=\"false\" [maximizable]=\"false\" [style]=\"{'min-width': '70vw', 'max-width': '70vw'}\" (onHide)=\"closeModal()\">\r\n <ng-template pTemplate=\"header\">\r\n <div>\r\n <span class=\"p-dialog-title\">Table views</span>\r\n </div>\r\n </ng-template>\r\n <div class=\"p-4 pt-0\">\r\n <p-table #dt_viewsDialog [value]=\"tableViews_menuItems\" [scrollable]=\"true\" size=\"small\" showGridlines stripedRows scrollHeight=\"400px\" [tableStyle]=\"{'min-width': '25rem'}\">\r\n <ng-template #caption>\r\n <div style=\"display: flex; justify-content: flex-end; align-items: center; width: 100%;\">\r\n <p-button icon=\"pi pi-plus\" label=\"New view\" (click)=\"showViewEditor()\" pTooltip=\"New view\" tooltipPosition=\"top\" [showDelay]=\"700\"/>\r\n </div>\r\n </ng-template>\r\n <ng-template #header>\r\n <tr>\r\n <th style=\"text-align: center;\">View name</th>\r\n <th style=\"text-align: center; max-width: 220px; min-width: 220px; width: 220px;\">Load on startup</th>\r\n <th style=\"text-align: center; max-width: 220px; min-width: 220px; width: 220px;\">Actions</th>\r\n </tr>\r\n </ng-template>\r\n <ng-template #body let-rowData>\r\n <tr>\r\n <td>\r\n {{rowData.label}}\r\n </td>\r\n <td style=\"text-align: center; max-width: 220px; min-width: 220px; width: 220px;\">\r\n <p-checkbox [(ngModel)]=\"rowData.lastActive\" [binary]=\"true\" (onChange)=\"updateViewActiveStartup(rowData.label)\"/>\r\n </td>\r\n <td style=\"max-width: 220px; min-width: 220px; width: 220px; display: flex; justify-content: center; align-items: center; height: 100%;\">\r\n <button pButton icon=\"pi pi-upload\" (click)=\"loadView(rowData.label);\" [showDelay]=\"700\" pTooltip=\"Restore\" tooltipPosition=\"top\" size=\"small\" class=\"p-button-sm\" style=\"height: 28px; margin-right: 10px;\"></button>\r\n <button pButton icon=\"pi pi-save\" (click)=\"updateView(rowData.label);\" [showDelay]=\"700\" pTooltip=\"Save\" tooltipPosition=\"top\" size=\"small\" class=\"p-button-sm\" style=\"height: 28px; margin-right: 10px;\"></button>\r\n <button pButton icon=\"pi pi-pencil\" (click)=\"showViewEditor(rowData.label);\" [showDelay]=\"700\" pTooltip=\"Edit\" tooltipPosition=\"top\" size=\"small\" class=\"p-button-sm\" style=\"height: 28px; margin-right: 10px;\"></button>\r\n <button pButton icon=\"pi pi-trash\" (click)=\"deleteView(rowData.label);\" [showDelay]=\"700\" pTooltip=\"Delete\" tooltipPosition=\"top\" size=\"small\" class=\"p-button-sm\" style=\"height: 28px;\"></button>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template #emptymessage>\r\n <tr>\r\n <td colspan=\"999\">There are no views</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div style=\"display: flex; flex-direction: row; justify-content: space-between; align-items: center; margin-top: 10px;\">\r\n Showing {{tableViews_menuItems ? tableViews_menuItems.length : 0}} views\r\n </div>\r\n </div>\r\n</p-dialog>\r\n\r\n<!--TABLE VIEW SAVE-->\r\n<p-dialog [(visible)]=\"viewEditorShow\" [modal]=\"true\" [draggable]=\"false\" [resizable]=\"false\" [closeOnEscape]=\"false\" [closable]=\"false\" [maximizable]=\"false\" [style]=\"{'max-width': '60vw'}\">\r\n <ng-template pTemplate=\"header\">\r\n <div class=\"inline-flex align-items-center justify-content-center gap-2\">\r\n <span class=\"white-space-nowrap\"><b>{{ editingViewAlias !== '' ? 'UPDATE VIEW' : 'CREATE NEW VIEW' }}</b></span>\r\n </div>\r\n </ng-template>\r\n <div style=\"display: flex; flex-direction: column; gap: 8px;\">\r\n <label for=\"newtableviewname\"><strong>View alias<span style=\"color: red;\">*</span></strong></label>\r\n <input \r\n pInputText \r\n id=\"newtableviewname\" \r\n aria-describedby=\"newtableviewname-help\" \r\n style=\"width: 400px;\"\r\n maxlength=\"30\"\r\n [(ngModel)]=\"newViewAlias\"/>\r\n </div>\r\n <ng-template pTemplate=\"footer\" style=\"display: flex; justify-content: space-between; align-items: center;\">\r\n <p-button (click)=\"viewEditorShow = false\" label=\"Cancel\" outlined=\"true\" [style]=\"{'margin-top': '20px'}\"></p-button>\r\n <p-button (click)=\"createOrUpdateTableView()\" [label]=\"editingViewAlias !== '' ? 'Update' : 'Create'\" [style]=\"{'margin-top': '20px'}\"></p-button>\r\n </ng-template>\r\n</p-dialog>","import { AfterViewInit, Component, ElementRef, EventEmitter, HostListener, Input, OnInit, Output, ViewChild, ViewEncapsulation } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { HttpResponse } from '@angular/common/http';\r\n\r\n// PrimeNG imports\r\nimport { Table, TableLazyLoadEvent, TableModule, TablePageEvent, TableRowSelectEvent, TableRowUnSelectEvent } from 'primeng/table';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { IconFieldModule } from 'primeng/iconfield';\r\nimport { InputIconModule } from 'primeng/inputicon';\r\nimport { MultiSelectModule } from 'primeng/multiselect';\r\nimport { CheckboxModule } from 'primeng/checkbox';\r\nimport { PaginatorModule } from 'primeng/paginator';\r\nimport { FilterMetadata } from 'primeng/api';\r\nimport { ButtonGroupModule } from 'primeng/buttongroup';\r\nimport { PopoverModule } from 'primeng/popover';\r\n\r\nimport { ECSPrimengTableService } from './ecs-primeng-table.service';\r\nimport { CellOverflowBehaviour, DataAlignHorizontal, DataAlignVertical, DataType, FrozenColumnAlign, TableViewSaveMode } from '../../enums';\r\nimport { IColumnMetadata, IPredefinedFilter, ITableConfiguration, ITablePagedResponse, ITableQueryRequest, IExcelExportRequest, ITableView, ITableViewData, ITableOptions, DEFAULT_TABLE_OPTIONS } from '../../interfaces';\r\nimport { dataAlignHorizontalAsText, dataAlignVerticalAsText, dataTypeAsText, frozenColumnAlignAsText } from '../../utils';\r\nimport { ECSPrimengTableNotificationService } from '../../services';\r\nimport { TableCell } from '../table-cell/table-cell';\r\nimport { TablePredefinedFilters } from '../table-predefined-filters/table-predefined-filters';\r\nimport { TableButton } from '../table-button/table-button';\r\nimport { ColumnSelector } from \"../column-selector/column-selector\";\r\nimport { ExportExcel } from '../export-excel/export-excel';\r\nimport { finalize, Observable } from 'rxjs';\r\nimport { ViewsManagement } from \"../views-management/views-management\";\r\n\r\n@Component({\r\n selector: 'ecs-primeng-table',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n TableModule,\r\n ButtonModule,\r\n TooltipModule,\r\n InputTextModule,\r\n IconFieldModule,\r\n InputIconModule,\r\n MultiSelectModule,\r\n CheckboxModule,\r\n PaginatorModule,\r\n TableCell,\r\n TablePredefinedFilters,\r\n TableButton,\r\n ColumnSelector,\r\n ExportExcel,\r\n ButtonGroupModule,\r\n ViewsManagement,\r\n PopoverModule\r\n ],\r\n standalone: true,\r\n templateUrl: './ecs-primeng-table.html',\r\n styleUrl: './ecs-primeng-table.scss',\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class ECSPrimengTable implements OnInit, AfterViewInit {\r\n constructor(\r\n private tableService: ECSPrimengTableService,\r\n private notification: ECSPrimengTableNotificationService\r\n ) {}\r\n @Input() tableOptions: ITableOptions = DEFAULT_TABLE_OPTIONS;\r\n @Output() onRowCheckboxChange = new EventEmitter<{\r\n rowID: any,\r\n selected: boolean\r\n }>(); // Emitter that returns the column selected and if it was selected or unselected\r\n @Output() onRowSelect = new EventEmitter<{\r\n rowID: any,\r\n rowData: any\r\n }>\r\n @Output() onRowUnselect = new EventEmitter<{\r\n rowID: any,\r\n rowData: any\r\n }>\r\n @Output() onDataEndUpdate = new EventEmitter<void>();\r\n viewsModalShow:boolean = false;\r\n tableViewCurrentSelectedAlias: string | null = null;\r\n tableViewsFirstFetchDone: boolean = false;\r\n excelReportTitle: string = \"\";\r\n showExportModal: boolean = false;\r\n showColumnSelector: boolean = false;\r\n selectedRowsCheckbox: any[] = []; // An array to keep all the selected rows\r\n @ViewChild('dt') dt!: Table; // Get the reference to the object table\r\n \r\n globalSearchText: string | null = null; // The text used by the global search\r\n tableViewsList: ITableView[] = [];\r\n tableViews_menuItems: any[] = [];\r\n\r\n DataType = DataType;\r\n CellOverflowBehaviour = CellOverflowBehaviour;\r\n DataAlignHorizontal = DataAlignHorizontal;\r\n DataAlignVertical = DataAlignVertical;\r\n FrozenColumnAlign = FrozenColumnAlign;\r\n TableViewSaveMode = TableViewSaveMode;\r\n\r\n rowSelection: any;\r\n currentPage: number = 0; // The current page we are at\r\n currentRowsPerPage: number = 0; // The current rows per page selected\r\n allowedRowsPerPage: number[] = []; // The different values of rows per page allowed\r\n totalRecords: number = 0; // The number of total records that are available (taking into account the filters)\r\n totalRecordsNotFiltered: number = 0; // The total number of records available if no filters were applied\r\n\r\n dateFormat: string = \"dd-MMM-yyyy HH:mm:ss zzzz\";\r\n dateTimezone: string = \"+00:00\";\r\n dateCulture: string = \"en-US\";\r\n\r\n columns: IColumnMetadata[] = [];\r\n columnsCantBeHidden: IColumnMetadata[] = [];\r\n columnsSelected: IColumnMetadata[] = [];\r\n columnModalData: any[] = []; \r\n filteredColumnData: any[] = []; \r\n private initialColumnWidths: any;\r\n private initialTableWidth: any;\r\n predefinedFiltersSelectedValuesCollection: { [key: string]: any[] } = {}; // Contains a collection of the predefined column filters selection (possible values come from 'predefinedFiltersCollection')\r\n private copyCellDataTimer: any; // A timer that handles the amount of time left to copy the cell data to the clipboard\r\n tableLazyLoadEventInformation: TableLazyLoadEvent = {}; // Data of the last lazy load event of the table\r\n private initialConfigurationFetched: boolean = false;\r\n private maxViews = 0;\r\n ngOnInit(): void {\r\n this.fetchTableConfiguration();\r\n }\r\n @ViewChild('tableContainer', { static: false }) tableContainer!: ElementRef;\r\n @ViewChild('headerContainer', { static: false }) headerContainer!: ElementRef;\r\n @ViewChild('paginatorContainer', { static: false }) paginatorContainer!: ElementRef;\r\n ngAfterViewInit() {\r\n this.calculateScrollHeight();\r\n }\r\n\r\n @HostListener('window:resize')\r\n onResize() {\r\n this.calculateScrollHeight();\r\n }\r\n \r\n private calculateScrollHeight(){\r\n if (this.tableOptions.verticalScroll?.cssFormula) {\r\n return;\r\n }\r\n if (this.tableOptions.verticalScroll?.fitToContainer && this.tableContainer && this.paginatorContainer && this.headerContainer) {\r\n const containerRect = this.tableContainer.nativeElement.getBoundingClientRect();\r\n const paginatorHeight = this.paginatorContainer.nativeElement.offsetHeight;\r\n const headerHeight = this.headerContainer.nativeElement.offsetHeight;\r\n const viewportHeight = window.innerHeight;\r\n const topOffset = containerRect.top + window.scrollY;\r\n this.tableOptions.verticalScroll.height = (viewportHeight - topOffset - paginatorHeight - headerHeight)-60;\r\n }\r\n }\r\n get scrollHeightValue(): string {\r\n if (this.tableOptions.verticalScroll?.cssFormula) {\r\n return this.tableOptions.verticalScroll.cssFormula;\r\n }\r\n const height = this.tableOptions.verticalScroll?.height;\r\n return height && height > 0 ? `${height}px` : '';\r\n }\r\n\r\n /**\r\n * Updates the table data and, if needed, retrieves the initial table configuration from an external source.\r\n * \r\n * Also allows resetting the table to its original state before any user manipulations.\r\n *\r\n * @param {boolean} [resetTableView=false] Optional.\r\n * - `true`: resets the table state before loading data.\r\n * - `false`: refreshes data using the current configuration (and retrieves initial configuration if necessary).\r\n *\r\n * **_Behavior_**\r\n * - The table is automatically set to `isActive = true`.\r\n * - If the initial configuration has not been fetched, it will fetch it and then update the data.\r\n * - If the initial configuration is already fetched, it will just update the data.\r\n * - If `resetTableView` is true and the configuration is already initialized, the table will be reset to its original state before updating the data.\r\n */\r\n updateData(resetTableView: boolean = false): void {\r\n this.tableOptions.isActive = true; // Enable table actions: the table is now active and can perform updates\r\n if (!this.initialConfigurationFetched || resetTableView) { // If initial configuration hasn't been fetched yet or a reset is explicitly requested\r\n if(this.initialConfigurationFetched && resetTableView) { // Reset the table only if it was already initialized and a reset is explicitly requested\r\n this.resetTableView(); // Reset table state (filters, pagination, sorting, etc.) and then refresh data\r\n } else { // We only need to get the table configuration without reseting the view\r\n this.fetchTableConfiguration(); // Fetch the initial table configuration before updating data\r\n }\r\n } else { // Table is already initialized and no reset requested, just refresh the data\r\n this.fetchTableData(this.tableLazyLoadEventInformation); // Update table rows using the last lazy load event\r\n }\r\n }\r\n\r\n private canFetchData(): boolean {\r\n return !!this.tableOptions.isActive\r\n && !!this.tableOptions.urlTableConfiguration?.trim()\r\n && !!this.tableOptions.urlTableData?.trim();\r\n }\r\n\r\n private fetchTableConfiguration(resetTableView: boolean = false): void {\r\n if(!this.canFetchData()){\r\n return;\r\n }\r\n this.tableService.fetchTableConfiguration(this.tableOptions.urlTableConfiguration!).subscribe({\r\n next: (response: HttpResponse<ITableConfiguration>) => {\r\n this.handleTableConfigurationResponse(response.body!, resetTableView);\r\n },\r\n error: (err) => this.tableService.handleTableError(err, 'Columns Error')\r\n });\r\n }\r\n\r\n private handleTableConfigurationResponse(body: ITableConfiguration, resetTableView: boolean = false): void {\r\n this.allowedRowsPerPage = body.allowedItemsPerPage; // Update the number of rows allowed per page\r\n this.currentRowsPerPage = Math.min(...this.allowedRowsPerPage); // Update the current rows per page to use the minimum value of allowed rows per page by default\r\n this.columns = body.columnsInfo; // Update columns with fetched data\r\n this.columnsCantBeHidden = this.columns.filter((col: any) => !col.canBeHidden); // Filter columns that cannot be hidden\r\n this.columnsSelected = this.columns.filter((col: any) => !col.startHidden && col.canBeHidden); // Selected columns that are not hidden by default\r\n this.tableOptions.columns!.shown = this.tableService.orderColumnsWithFrozens(this.columnsCantBeHidden.concat(this.columnsSelected));\r\n this.dateFormat = body.dateFormat;\r\n this.dateTimezone = body.dateTimezone;\r\n this.dateCulture = body.dateCulture;\r\n this.currentPage = 0;\r\n this.initialConfigurationFetched = true;\r\n this.maxViews = body.maxViews;\r\n if(resetTableView){\r\n this.tableOptions.isActive = false\r\n this.clearFilters(this.dt, true);\r\n this.clearSorts(this.dt, true);\r\n this.dt.tableWidthState = this.initialTableWidth;\r\n this.dt.columnWidthsState = this.initialColumnWidths;\r\n this.dt.restoreColumnWidths()\r\n this.tableLazyLoadEventInformation.multiSortMeta=[];\r\n this.tableOptions.isActive = true;\r\n } else {\r\n setTimeout(() => {\r\n this.initialColumnWidths = this.tableService.computeColumnWidths(this.dt);\r\n this.initialTableWidth = this.tableService.computeTableWidth(this.dt);\r\n }, 0);\r\n this.fetchTableViews();\r\n }\r\n }\r\n\r\n refreshData(event: any){\r\n this.fetchTableData(this.tableLazyLoadEventInformation);\r\n }\r\n\r\n tableViewsEnabled(): boolean {\r\n const views = this.tableOptions.views;\r\n if (views?.saveMode === TableViewSaveMode.None) { // saveMode must be different from noone\r\n return false;\r\n }\r\n if (!views?.saveKey?.trim()) { // saveKey must exist and must not be empty after trim\r\n return false;\r\n }\r\n if (this.maxViews <= 0) { // maxViews must be greater than 0\r\n return false;\r\n }\r\n if (views?.saveMode === TableViewSaveMode.DatabaseStorage) { // If saveMode is database, urlGet and urlSave must exist and must not be empty after trim\r\n if (!views?.urlGet?.trim() || !views?.urlSave?.trim()) {\r\n return false;\r\n }\r\n }\r\n return true; // All checks passed, views are enabled\r\n }\r\n\r\n private fetchTableViews(): void {\r\n if(!this.tableViewsEnabled()){\r\n this.fetchTableData(this.tableLazyLoadEventInformation);\r\n return;\r\n }\r\n const tableViews = this.tableService.fetchTableViews(this.tableOptions.views!.saveMode!, this.tableOptions.views!.urlGet!, this.tableOptions.views!.saveKey!);\r\n if (tableViews instanceof Observable) {\r\n tableViews.subscribe({\r\n next: (response: HttpResponse<ITableView[]>) => {\r\n let parsedResult = response.body!.map((item: any) => ({\r\n viewAlias: item.viewAlias,\r\n viewData: JSON.parse(item.viewData),\r\n lastActive: item.lastActive\r\n }));\r\n this.tableViewListProcess(parsedResult);\r\n },\r\n error: (err) => this.tableService.handleTableError(err, 'Views get error')\r\n });\r\n } else {\r\n this.tableViewListProcess(tableViews);\r\n }\r\n }\r\n\r\n private tableViewListProcess(tableViews: ITableView[]){\r\n this.tableViewsList = [...tableViews];\r\n if(this.tableViewsList.length > 0){\r\n this.tableService.sortViews(this.tableViewsList);\r\n }\r\n this.tableViews_menuItems=[...this.tableService.updateViewsMenuItems(this.tableViewsList)];\r\n const viewToStartup: ITableView | undefined = this.tableViewsList.find(v => v.lastActive);\r\n if (viewToStartup) { // If there is a view that needs to be loaded on startup\r\n this.viewLoad(viewToStartup.viewAlias);\r\n } else {\r\n this.fetchTableData(this.tableLazyLoadEventInformation);\r\n }\r\n }\r\n\r\n viewLoad(tableViewAlias: string): void {\r\n const viewToLoad: ITableView | undefined = this.tableViewsList.find(v => v.viewAlias === tableViewAlias);\r\n if(!viewToLoad){\r\n this.notification.showToast(\"error\",\"VIEW TO LOAD DOESN'T EXIST\",\"The view to load doesn't exist\");\r\n return;\r\n }\r\n let viewData: ITableViewData = viewToLoad.viewData;\r\n this.columnsSelected = viewData.columnsShown\r\n .map(data => this.columns.find((col: any) => col.field === data.field))\r\n .filter((col): col is IColumnMetadata => col !== undefined)\r\n .filter(col => !this.columnsCantBeHidden.includes(col));\r\n this.tableOptions.columns!.shown = this.tableService.orderColumnsWithFrozens(this.columnsCantBeHidden.concat(this.columnsSelected));\r\n this.currentPage = viewData.currentPage;\r\n this.currentRowsPerPage = viewData.currentRowsPerPage;\r\n this.globalSearchText = viewData.globalSearchText;\r\n this.tableLazyLoadEventInformation.multiSortMeta = [...(viewData.multiSortMeta ?? [])];\r\n this.dt.multiSortMeta = [...(viewData.multiSortMeta ?? [])];\r\n this.tableOptions.isActive = false;\r\n this.dt.sortMultiple();\r\n this.tableOptions.isActive = true;\r\n this.tableLazyLoadEventInformation.filters = structuredClone(viewData.filters);\r\n this.dt.filters = structuredClone(viewData.filters);\r\n this.predefinedFiltersSelectedValuesCollection = {}; // Empty predefined filters checkbox selection\r\n for (const [filterKey, filterDataArrayRaw] of Object.entries(viewData.filters)) { // Iterate over each saved filter\r\n const filterDataArray = filterDataArrayRaw as Array<{ value: any; matchMode?: string; operator?: string }>; // Cast expected structure\r\n const filterData = filterDataArray?.[0];\r\n if (!filterData || !filterData.value) { \r\n continue;\r\n }\r\n const column = this.columns?.find((c: any) => c.field === filterKey); // Find the column that owns this filterKey\r\n if (!column || !column.filterPredefinedValuesName){\r\n continue;\r\n }\r\n const predefinedKey = column.filterPredefinedValuesName;\r\n const predefinedOptions = this.tableOptions.predefinedFilters?.[predefinedKey] ?? []; // Get predefined options for this column\r\n const selectedItems = predefinedOptions.filter(opt =>\r\n Array.isArray(filterData.value)\r\n ? filterData.value.includes(opt.value)\r\n : filterData.value === opt.value\r\n ); // Match selected values with their full predefined definitions\r\n this.predefinedFiltersSelectedValuesCollection[predefinedKey] = selectedItems; // Store the result\r\n }\r\n this.dt.tableWidthState = viewData.tableWidth;\r\n this.dt.columnWidthsState = viewData.columnsWidth;\r\n this.tableViewCurrentSelectedAlias = tableViewAlias;\r\n this.notification.showToast(\"info\",\"TABLE VIEW RESTORED\",`The table view '${this.tableViewCurrentSelectedAlias}' has been restored.`);\r\n this.viewsModalShow = false;\r\n this.fetchTableData(this.tableLazyLoadEventInformation);\r\n }\r\n\r\n viewCreate(viewAlias: string){\r\n if(this.tableViewsList.length >= this.maxViews){\r\n this.notification.showToast(\"error\",\"NO MORE VIEWS ALLOWED\",\"You have created the maximum number of allowed views for this table\");\r\n return;\r\n }\r\n let viewData: ITableViewData = this.tableService.viewGenerateData(this.dt, this.globalSearchText, this.currentPage, this.currentRowsPerPage, this.modifyFiltersWithoutGlobalAndSelectedRows.bind(this))\r\n let newView: ITableView = {\r\n lastActive: false,\r\n viewAlias: viewAlias,\r\n viewData: viewData\r\n }\r\n this.tableViewsList.push(newView);\r\n this.tableService.sortViews(this.tableViewsList);\r\n this.tableViews_menuItems=[...this.tableService.updateViewsMenuItems(this.tableViewsList)];\r\n this.tableViewCurrentSelectedAlias = viewAlias;\r\n this.viewsSave(0);\r\n }\r\n\r\n viewDelete(viewAlias: string){\r\n const index = this.tableViewsList.findIndex(v => v.viewAlias === viewAlias);\r\n if (index === -1) {\r\n this.notification.showToast(\"error\",\"Table view delete failed\", `The table view could not be deleted since it was not found.`);\r\n return;\r\n }\r\n this.tableViewsList.splice(index, 1);\r\n this.tableViews_menuItems=[...this.tableService.updateViewsMenuItems(this.tableViewsList)];\r\n if(this.tableViewCurrentSelectedAlias === viewAlias){\r\n this.tableViewCurrentSelectedAlias = null;\r\n }\r\n this.viewsSave(3);\r\n }\r\n\r\n viewEditAlias(event: { viewAliasOld: string; viewAliasNew: string }){\r\n const index = this.tableViewsList.findIndex(v => v.viewAlias === event.viewAliasOld);\r\n if (index === -1) {\r\n this.notification.showToast(\"error\",\"Table view alias change failed\", `The table view alias could not be changed since it was not found.`);\r\n return;\r\n }\r\n this.tableViewsList[index].viewAlias = event.viewAliasNew;\r\n this.tableService.sortViews(this.tableViewsList);\r\n this.tableViews_menuItems=[...this.tableService.updateViewsMenuItems(this.tableViewsList)];\r\n if(this.tableViewCurrentSelectedAlias === event.viewAliasOld){\r\n this.tableViewCurrentSelectedAlias = event.viewAliasNew;\r\n }\r\n this.viewsSave(2);\r\n }\r\n\r\n viewUpdateData(viewAlias: string){\r\n const index = this.tableViewsList.findIndex(v => v.viewAlias === viewAlias);\r\n if (index === -1) {\r\n this.notification.showToast(\"error\",\"Table view not found\", `The table view to update data from was not found.`);\r\n return;\r\n }\r\n let viewData: ITableViewData = this.tableService.viewGenerateData(this.dt, this.globalSearchText, this.currentPage, this.currentRowsPerPage, this.modifyFiltersWithoutGlobalAndSelectedRows.bind(this))\r\n this.tableViewsList[index].viewData = viewData;\r\n this.viewsSave(1);\r\n }\r\n\r\n viewUpdateActiveStartup(viewAlias: string){\r\n const index = this.tableViewsList.findIndex(v => v.viewAlias === viewAlias);\r\n if (index === -1) {\r\n this.notification.showToast(\"error\",\"Table view not found\", `The table view to update data from was not found.`);\r\n return;\r\n }\r\n let newStatus: boolean = !this.tableViewsList[index].lastActive;\r\n this.tableViewsList.forEach(v => v.lastActive = false);\r\n this.tableViewsList[index].lastActive = newStatus;\r\n this.tableViews_menuItems=[...this.tableService.updateViewsMenuItems(this.tableViewsList)];\r\n this.viewsSave(4);\r\n }\r\n\r\n viewsSave(endMessage: number): void{\r\n let tableView: string = JSON.stringify(this.tableViewsList);\r\n switch(this.tableOptions.views!.saveMode){\r\n case TableViewSaveMode.SessionStorage:\r\n sessionStorage.setItem(this.tableOptions.views!.saveKey!, tableView);\r\n break;\r\n case TableViewSaveMode.LocalStorage:\r\n localStorage.setItem(this.tableOptions.views!.saveKey!, tableView);\r\n break;\r\n case TableViewSaveMode.DatabaseStorage:\r\n const saveObsv = this.tableService.viewsSaveToDatabase(this.tableViewsList, this.tableOptions.views!.urlSave!, this.tableOptions.views!.saveKey!);\r\n saveObsv.subscribe({\r\n next: (response: HttpResponse<any>) => {\r\n this.viewsSaveEnd(endMessage);\r\n },\r\n error: (err) => this.tableService.handleTableError(err, 'Views save error')\r\n });\r\n return;\r\n default:\r\n this.notification.showToast(\"error\",\"NOT IMPLEMENTED\", \"This type os save view has not been implemented yet.\");\r\n return;\r\n }\r\n this.viewsSaveEnd(endMessage);\r\n }\r\n viewsSaveEnd(endMessage: number){\r\n switch(endMessage){\r\n case 0: // NEW VIEW\r\n this.notification.showToast(\"info\",\"Table view created\", `New table view has been created.`);\r\n this.viewsModalShow = false;\r\n break;\r\n case 1: // UPDATE VIEW\r\n this.notification.showToast(\"info\",\"Table view data updated\", `The table view data was updated.`);\r\n break;\r\n case 2: // UPDATE ALIAS\r\n this.notification.showToast(\"info\",\"Table view name updated\", `The table view alias was updated.`);\r\n break;\r\n case 3: // DELETE VIEW\r\n this.notification.showToast(\"info\",\"Table view delete\", `The table view was deleted.`);\r\n break;\r\n case 4: // DELETE VIEW\r\n this.notification.showToast(\"info\",\"Table view active on startup\", `Changed the view that will be active on startup.`);\r\n break;\r\n }\r\n }\r\n\r\n fetchTableData(event: TableLazyLoadEvent): void {\r\n if(!this.canFetchData()){\r\n return;\r\n }\r\n if (!this.initialConfigurationFetched) {\r\n return;\r\n }\r\n this.tableLazyLoadEventInformation = event; // Store the event information for later use\r\n if (event.rows != null && event.rows !== undefined) {\r\n this.currentRowsPerPage = event.rows;\r\n }\r\n if (event.first != null && event.first !== undefined && event.rows != null && event.rows !== undefined) {\r\n this.currentPage = event.first / event.rows;\r\n }\r\n let filtersWithoutGlobalAndSelectedRows = this.modifyFiltersWithoutGlobalAndSelectedRows(this.tableLazyLoadEventInformation.filters); // Create filters excluding the global filter\r\n filtersWithoutGlobalAndSelectedRows=this.revertDateTimeZoneFilters(filtersWithoutGlobalAndSelectedRows);\r\n const requestData: ITableQueryRequest = {\r\n page: this.currentPage, // Set the current page number\r\n pageSize: this.currentRowsPerPage, // Set the number of rows per page\r\n sort: this.tableLazyLoadEventInformation.multiSortMeta, // Set the sorting information\r\n filter: filtersWithoutGlobalAndSelectedRows, // Set the filters excluding the global filter\r\n globalFilter: this.globalSearchText, // Set the global filter text\r\n columns: this.tableOptions.columns!.shown!.map(col => col.field), // Set the columns to show\r\n dateFormat: this.dateFormat,\r\n dateTimezone: this.dateTimezone,\r\n dateCulture: this.dateCulture\r\n };\r\n this.tableService.fetchTableData(this.tableOptions.urlTableData!, requestData)\r\n .pipe(\r\n finalize(() => {\r\n this.onDataEndUpdate.emit(); // This is always executed after data update.\r\n })\r\n )\r\n .subscribe({\r\n next: (response: HttpResponse<ITablePagedResponse>) => this.handleTableDataResponse(response.body!),\r\n error: (err) => this.tableService.handleTableError(err, 'Columns Error')\r\n });\r\n }\r\n\r\n private modifyFiltersWithoutGlobalAndSelectedRows(filters: any, overrideOption: number = -1): any {\r\n if (this.globalSearchText === \"\") { // If the global search text is an empty string\r\n this.globalSearchText = null; // Set it to null\r\n }\r\n let filtersWithoutGlobalAndSelectedRows = { ...filters }; // Create a copy of filters to delete the global.\r\n if (filtersWithoutGlobalAndSelectedRows.hasOwnProperty('global')) { // If there is an entry with the global filter\r\n delete filtersWithoutGlobalAndSelectedRows['global']; // Remove the global filter\r\n }\r\n this.selectorRowFilterBuilder(filtersWithoutGlobalAndSelectedRows, overrideOption);\r\n return filtersWithoutGlobalAndSelectedRows; // Return the filters without global array\r\n }\r\n\r\n resetTableView(): void {\r\n this.tableViewCurrentSelectedAlias = '';\r\n this.fetchTableConfiguration(true);\r\n }\r\n\r\n private selectorRowFilterBuilder(filtersWithoutGlobalAndSelectedRows: any, overrideOption: number = -1): void {\r\n if (filtersWithoutGlobalAndSelectedRows.hasOwnProperty('selector')) {\r\n const selectorFilter = filtersWithoutGlobalAndSelectedRows['selector'][0];\r\n let filterType: boolean | null = null;\r\n if(overrideOption<0 || overrideOption>2){\r\n filterType = selectorFilter.value;\r\n } else {\r\n switch (overrideOption){\r\n case 0: // All\r\n filterType = null;\r\n break;\r\n case 1: // Only selected rows\r\n filterType = true;\r\n break;\r\n case 2: // Only NOT selected\r\n filterType = false;\r\n break;\r\n }\r\n }\r\n if (!filtersWithoutGlobalAndSelectedRows.hasOwnProperty('rowID')) {\r\n filtersWithoutGlobalAndSelectedRows['rowID'] = [\r\n {\r\n \"value\": null,\r\n \"matchMode\": \"in\",\r\n \"operator\": \"or\"\r\n }\r\n ];\r\n }\r\n const idFilter = filtersWithoutGlobalAndSelectedRows['rowID'][0];\r\n if (filterType === true) {\r\n idFilter.matchMode = \"in\";\r\n idFilter.value = this.selectedRowsCheckbox;\r\n } else if (filterType === false) {\r\n idFilter.operator = \"and\"\r\n idFilter.matchMode = \"notIn\";\r\n idFilter.value = this.selectedRowsCheckbox;\r\n } else if (filterType === null) {\r\n idFilter.value = null;\r\n idFilter.matchMode = \"in\";\r\n }\r\n }\r\n }\r\n\r\n revertDateTimeZoneFilters(inputFilter: any){\r\n this.tableOptions.columns!.shown!.forEach((column) => {\r\n if (column.dataType === DataType.Date) { // If its date type\r\n if (inputFilter.hasOwnProperty(column.field)) {\r\n const originalDate = inputFilter[column.field][0].value;\r\n if(originalDate !== null && originalDate instanceof Date){\r\n const utcDate = new Date(Date.UTC(originalDate.getFullYear(), originalDate.getMonth(), originalDate.getDate()))\r\n inputFilter[column.field][0].value=utcDate;\r\n }\r\n }\r\n }\r\n });\r\n return inputFilter;\r\n }\r\n\r\n handleTableDataResponse(body: ITablePagedResponse): void{\r\n this.tableOptions.data = body.data; // Update the table data\r\n this.totalRecords = body.totalRecords; // Update the total number of records\r\n this.totalRecordsNotFiltered = body.totalRecordsNotFiltered; // Update the total records not filtered\r\n this.currentPage = body.page; // Update the current page\r\n }\r\n\r\n clearFilters(dt: Table, force: boolean = false, onlyGlobalFilter: boolean = false): void{\r\n let hasToClear = this.hasToClearFilters(dt, this.globalSearchText, force);\r\n if(hasToClear){\r\n if(!onlyGlobalFilter){\r\n this.predefinedFiltersSelectedValuesCollection = {};\r\n for (const key in dt.filters) {\r\n if (dt.filters.hasOwnProperty(key)) {\r\n const filters = dt.filters[key];\r\n if (Array.isArray(filters)) {\r\n filters.forEach(filter => {\r\n filter.value = null; // Set value to null\r\n });\r\n } else {\r\n filters.value = null; // Set value to null\r\n }\r\n }\r\n }\r\n let filters = {...this.dt.filters};\r\n dt.columns?.forEach(\r\n element => {\r\n dt.filter(null, element.field, element.matchMode)\r\n }\r\n );\r\n this.dt.filters = filters;\r\n }\r\n this.globalSearchText = null;\r\n dt.filterGlobal('','');\r\n }\r\n }\r\n\r\n clearSorts(dt: Table, force: boolean = false): void{\r\n let hasToClear = this.hasToClearSorts(dt, force);\r\n if(hasToClear){\r\n dt.multiSortMeta = [];\r\n dt.sortMultiple();\r\n }\r\n }\r\n hasToClearSorts(dt: Table, force: boolean = false): boolean{\r\n let hasToClear: boolean = false;\r\n const hasSorts = (dt.multiSortMeta && dt.multiSortMeta.length > 0);\r\n if(force || hasSorts){\r\n hasToClear = true;\r\n }\r\n return hasToClear;\r\n }\r\n hasToClearFilters(dt: Table, globalSearchText: string|null, force:boolean = false): boolean{\r\n let hasToClear: boolean = false;\r\n const filtersWithoutGlobalAndSelectedRows = this.modifyFiltersWithoutGlobalAndSelectedRows(dt.filters)\r\n const hasFilters = this.hasFilters(filtersWithoutGlobalAndSelectedRows);\r\n const hasGlobalFilter = (globalSearchText && globalSearchText.trim() !== \"\");\r\n if(force || hasFilters || hasGlobalFilter){\r\n hasToClear = true;\r\n }\r\n return hasToClear;\r\n }\r\n\r\n /**\r\n * Determines whether there are active filters based on the provided filter rules.\r\n *\r\n * @param {any} filterRules An object representing filter rules for each column.\r\n * The keys are column names, and the values are arrays of filter rules.\r\n * Each filter rule has the following properties:\r\n * - `field`: The field or property name of the column.\r\n * - `value`: The filter value entered by the user.\r\n * - Other properties depending on the type of filter (e.g., `matchMode` for string filters).\r\n * @returns {boolean} `true` if at least one active filter is found, otherwise `false`.\r\n */\r\n private hasFilters(filterRules: any): boolean {\r\n for (const columnName of Object.keys(filterRules)) { // Iterate over each column name in the filter rules\r\n const columnFilters = filterRules[columnName]; // Get the filter rules for the current column\r\n for (const filterRule of columnFilters) { // Iterate over each filter rule for the current column\r\n if (filterRule.value !== null && filterRule.value !== \"\") { // Check if the filter value is not null or an empty string\r\n return true; // At least one active filter found\r\n }\r\n }\r\n }\r\n return false; // No active filters found\r\n }\r\n\r\n getColumnStyle(col: any, headerCols: boolean = false): Record<string, string> {\r\n return this.tableService.getColumnStyle(col, headerCols);\r\n }\r\n\r\n getPredefinedFilterValues(columnKeyName: string): IPredefinedFilter[] {\r\n return this.tableOptions.predefinedFilters?.[columnKeyName] || []; // Return the predefined filter values or an empty array if the option name does not exist\r\n }\r\n\r\n getFrozenColumnAlignAsText(frozenColumnAlign: FrozenColumnAlign): string {\r\n return frozenColumnAlignAsText(frozenColumnAlign);\r\n }\r\n\r\n getDataTypeAsText(dataType: DataType): string {\r\n return dataTypeAsText(dataType);\r\n }\r\n\r\n /**\r\n * Updates the filters of a PrimeNG data table based on predefined filter changes.\r\n *\r\n * @param {string} filterName - The name of the filter to be updated.\r\n * @param {IPrimengPredefinedFilter[]} selectedValues - An array of selected predefined filter values.\r\n */\r\n onPredefinedFilterChange(filterName: string, selectedValues: IPredefinedFilter[]): void {\r\n const filters = { ...this.dt.filters }; // Create a shallow copy of the current filters to avoid mutating the original filters directly\r\n if (Array.isArray(filters[filterName])) { // Check if the filter for the given filterName is an array\r\n (filters[filterName] as FilterMetadata[]).forEach(criteria => { // If it is an array, iterate over each filter criteria\r\n criteria.value = selectedValues.map(value => value.value); // Update the value of each criteria with the values from selectedValues\r\n });\r\n } else if (filters[filterName]) { // Check if the filter for the given filterName exists and is not an array\r\n const criteria = filters[filterName] as FilterMetadata; // Cast the filter criteria to FilterMetadata\r\n criteria.value = selectedValues.map(value => value.value); // Update the value of the criteria with the values from selectedValues\r\n }\r\n this.dt.filters = filters; // Update the data table's filters with the modified filters object\r\n this.dt._filter(); // Trigger the filtering operation on the data table to apply the new filters\r\n }\r\n\r\n /**\r\n * Checks if the provided column metadata matches a specific style of the predefined filters \r\n * that need to be applied to an item on a row.\r\n *\r\n * @param {IprimengColumnsMetadata} colMetadata - The metadata of the column being checked.\r\n * @param {any} value - The value to be matched against the predefined filter values.\r\n * @returns {any} The matching predefined filter value if found, otherwise null.\r\n */\r\n getPredfinedFilterMatch(colMetadata: IColumnMetadata, value: any): any {\r\n if (colMetadata.filterPredefinedValuesName && colMetadata.filterPredefinedValuesName.length > 0) { // Check if the column uses predefined filter values\r\n const options = this.getPredefinedFilterValues(colMetadata.filterPredefinedValuesName); // Get the predefined filter values based on the name\r\n return options.find(option => option.value === value); // Return the matching option if found\r\n }\r\n return null; // Return null if the column does not use predefined filter values\r\n }\r\n\r\n copyToClipboardStart(event: MouseEvent) {\r\n if((this.tableOptions.copyToClipboardTime ?? 0) > 0) {\r\n const cellContent = (event.target as HTMLElement).innerText;\r\n this.copyCellDataTimer = setTimeout(() => {\r\n navigator.clipboard.writeText(cellContent).then(() => {\r\n this.notification.clearToasts();\r\n this.notification.showToast(\"info\", \"CELL CONTENT COPIED\", \"The cell content has been copied to your clipboard.\");\r\n }).catch(err => {\r\n this.notification.clearToasts();\r\n this.notification.showToast(\"error\", \"CELL CONTENT COPIED\", `The cell content failed to copy to your clipboard with error: ${err}`);\r\n });\r\n }, (this.tableOptions.copyToClipboardTime ?? 0) * 1000 );\r\n }\r\n }\r\n\r\n copyToClipboardCancel(){\r\n if((this.tableOptions.copyToClipboardTime ?? 0) > 0) {\r\n clearTimeout(this.copyCellDataTimer);\r\n }\r\n }\r\n\r\n getDataAlignHorizontalAsText(dataAlignHorizontal: DataAlignHorizontal){\r\n return dataAlignHorizontalAsText(dataAlignHorizontal);\r\n }\r\n getDataAlignVerticalAsText(dataAlignVertical: DataAlignVertical){\r\n return dataAlignVerticalAsText(dataAlignVertical);\r\n }\r\n\r\n isRowCheckboxSelected(rowID: any): boolean {\r\n return this.selectedRowsCheckbox.includes(rowID);\r\n }\r\n\r\n onRowChekboxChange(event: any, rowID: any): void {\r\n if (event.checked) { // Add the selected item\r\n this.selectedRowsCheckbox.push(rowID);\r\n } else { // Remove the selected item\r\n this.selectedRowsCheckbox = this.selectedRowsCheckbox.filter(selectedId => selectedId !== rowID);\r\n }\r\n this.onRowCheckboxChange.emit({\r\n rowID: rowID,\r\n selected: event.checked\r\n });\r\n }\r\n rowSelect(event: TableRowSelectEvent<any>): void{\r\n this.onRowSelect.emit({\r\n rowID: event.data.rowID,\r\n rowData: event.data\r\n });\r\n }\r\n rowUnselect(event: TableRowUnSelectEvent<any>): void{\r\n this.onRowUnselect.emit({\r\n rowID: event.data.rowID,\r\n rowData: event.data\r\n });\r\n }\r\n pageChange(event: TablePageEvent): void {\r\n this.currentPage = event.rows ? event.first / event.rows : 0;\r\n this.currentRowsPerPage = event.rows ? event.rows : 0;\r\n }\r\n\r\n columnSelectorShow(){\r\n this.tableOptions.columns?.selectorOrderByColumnName\r\n let tempData = this.columns.map(column => {\r\n const isSelected = this.columnsSelected.some(selectedColumn => selectedColumn.field === column.field) || this.columnsCantBeHidden.some(selectedColumn => selectedColumn.field === column.field);\r\n const isSelectDisabled = this.columnsCantBeHidden.some(selectedColumn => selectedColumn.field === column.field);\r\n return {\r\n field: column.field,\r\n header: column.header,\r\n selected: isSelected,\r\n selectDisabled: isSelectDisabled,\r\n cellOverflowBehaviour: column.cellOverflowBehaviour,\r\n cellOverflowBehaviourDisabled: !column.cellOverflowBehaviourAllowUserEdit,\r\n dataAlignHorizontal: column.dataAlignHorizontal,\r\n dataAlignHorizontalDisabled: !column.dataAlignHorizontalAllowUserEdit,\r\n dataAlignVertical: column.dataAlignVertical,\r\n dataAlignVerticalDisabled: !column.dataAlignVerticalAllowUserEdit\r\n };\r\n });\r\n if (this.tableOptions.columns?.selectorOrderByColumnName === true) { // Sort columns by header only if order by column name is true\r\n tempData = tempData.slice().sort((a, b) => {\r\n return a.header.toUpperCase().localeCompare(b.header.toUpperCase()); // Sort by header text (A-Z)\r\n });\r\n }\r\n this.columnModalData = [...tempData];\r\n this.filteredColumnData = this.columnModalData;\r\n this.showColumnSelector=true;\r\n }\r\n\r\n applyColumnModalChanges(selectedColumns: IColumnMetadata[]) {\r\n const existingColumns = this.dt.columns!;\r\n const columnsToKeep = new Set<string>();\r\n\r\n this.columnsCantBeHidden.forEach(col => columnsToKeep.add(col.field));\r\n selectedColumns.forEach(col => columnsToKeep.add(col.field));\r\n\r\n const finalColumns: IColumnMetadata[] = [];\r\n existingColumns.forEach(col => {\r\n if (columnsToKeep.has(col.field)) {\r\n finalColumns.push(col);\r\n }\r\n });\r\n\r\n selectedColumns.forEach(col => {\r\n const matchingColumn = this.columns.find(c => c.field === col.field);\r\n if (matchingColumn && !finalColumns.find(c => c.field === matchingColumn.field)) {\r\n finalColumns.push(matchingColumn);\r\n }\r\n });\r\n\r\n let prevColsToShow = this.tableOptions.columns!.shown;\r\n this.tableOptions.columns!.shown = this.tableService.orderColumnsWithFrozens(finalColumns);\r\n\r\n let sameColumnsAsBefore =\r\n prevColsToShow!.length === this.tableOptions.columns!.shown.length &&\r\n prevColsToShow!.every((prevCol, index) => prevCol.field === this.tableOptions.columns!.shown![index].field);\r\n\r\n this.columnsSelected = this.tableOptions.columns!.shown.filter(\r\n column => !this.columnsCantBeHidden.some(nonSelectable => nonSelectable.field === column.field)\r\n );\r\n\r\n this.updateColumnsSpecialProperties(this.columnModalData);\r\n\r\n if (!sameColumnsAsBefore) {\r\n this.tableOptions.isActive = false;\r\n this.clearSorts(this.dt, true);\r\n setTimeout(() => {\r\n this.tableOptions.isActive = true;\r\n this.clearSorts(this.dt, true);\r\n }, 1);\r\n }\r\n }\r\n\r\n private updateColumnsSpecialProperties(columnsSource: any[]){\r\n const allColumns = [this.columns, this.tableOptions.columns!.shown!, this.columnsSelected, this.columnsCantBeHidden];\r\n const columnModalDataMap = new Map(columnsSource.map((item: any) => [item.field, { \r\n cellOverflowBehaviour: item.cellOverflowBehaviour, \r\n dataAlignHorizontal: item.dataAlignHorizontal,\r\n dataAlignVertical: item.dataAlignVertical,\r\n width: item.width\r\n }]));\r\n const updatedFields = new Set(); // To track updated fields\r\n allColumns.forEach((columnList) => {\r\n columnList.forEach((col: any) => {\r\n if (columnModalDataMap.has(col.field) && !updatedFields.has(col.field)) {\r\n const columnData = columnModalDataMap.get(col.field);\r\n if (columnData) {\r\n col.cellOverflowBehaviour = columnData.cellOverflowBehaviour;\r\n col.dataAlignHorizontal = columnData.dataAlignHorizontal;\r\n col.dataAlignVertical = columnData.dataAlignVertical;\r\n col.width = columnData.width;\r\n updatedFields.add(col.field);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n openExcelExport(){\r\n const defaultTitle = this.tableOptions.excelReport?.defaultTitle?.trim();\r\n const allowEdit = this.tableOptions.excelReport?.titleAllowUserEdit === true;\r\n this.excelReportTitle = (!defaultTitle && !allowEdit) ? 'Report' : defaultTitle!;\r\n this.showExportModal=true;\r\n }\r\n generateExcelReport(event: any){\r\n if(!this.tableOptions.excelReport?.url?.trim()){\r\n return;\r\n }\r\n let filtersWithoutGlobalAndSelectedRows = this.modifyFiltersWithoutGlobalAndSelectedRows(this.tableLazyLoadEventInformation.filters, event.selectedRows); // Create filters excluding the global filter\r\n filtersWithoutGlobalAndSelectedRows=this.revertDateTimeZoneFilters(filtersWithoutGlobalAndSelectedRows);\r\n const filtersMustBeApplied: boolean = (event.selectedRows === 1 || event.selectedRows === 2) \r\n ? true \r\n : event.applyFilters;\r\n const requestData: IExcelExportRequest = {\r\n page: this.currentPage, // Set the current page number\r\n pageSize: this.currentRowsPerPage, // Set the number of rows per page\r\n sort: this.tableLazyLoadEventInformation.multiSortMeta, // Set the sorting information\r\n filter: filtersWithoutGlobalAndSelectedRows, // Set the filters excluding the global filter\r\n globalFilter: this.globalSearchText, // Set the global filter text\r\n columns: this.tableOptions.columns!.shown!.map(col => col.field), // Set the columns to show\r\n dateFormat: this.dateFormat,\r\n dateTimezone: this.dateTimezone,\r\n dateCulture: this.dateCulture,\r\n allColumns: event.allColumns,\r\n applyFilters: filtersMustBeApplied,\r\n applySorts: event.applySorts,\r\n filename: event.filename,\r\n useIconInBools: event.useIconInBools\r\n };\r\n this.tableService.fetchExcelReport(this.tableOptions.excelReport.url, requestData).subscribe({\r\n next: (response: HttpResponse<Blob>) => {\r\n this.tableService.downloadFile(response.body!, event.filename, 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');\r\n this.showExportModal=false;\r\n },\r\n error: (err) => this.tableService.handleTableError(err, 'Excel export error')\r\n });\r\n }\r\n\r\n updateIconBlobsForCollections(): void {\r\n Object.keys(this.tableOptions.predefinedFilters ?? {}).forEach(key => {\r\n const filters = this.tableOptions.predefinedFilters?.[key];\r\n if (Array.isArray(filters) && filters.length > 0) {\r\n filters.forEach(filter => {\r\n if (filter.imageBlobSourceEndpoint && !filter.imageBlob) {\r\n filter.imageBlob = undefined;\r\n filter.imageBlobFetchError = false;\r\n this.tableService.getIconBlob(filter.imageBlobSourceEndpoint).subscribe({\r\n next: (response: HttpResponse<Blob>) => {\r\n filter.imageBlob = response.body!;\r\n this.showExportModal=false;\r\n },\r\n error: () => { // Handle error response\r\n filter.imageBlobFetchError = true;\r\n }\r\n });\r\n }\r\n });\r\n }else {\r\n console.warn(`Filters for key ${key} is not an array:`, filters);\r\n }\r\n });\r\n }\r\n}","<div #tableContainer>\r\n <p-table #dt\r\n size=\"small\" showGridlines stripedRows \r\n sortMode=\"multiple\"\r\n [resizableColumns]=\"true\" columnResizeMode=\"expand\"\r\n [reorderableColumns]=\"true\"\r\n [scrollable]=\"true\" [scrollHeight]=\"scrollHeightValue\"\r\n [columns]=\"tableOptions.columns?.shown ?? []\" [value]=\"tableOptions.data ?? []\" dataKey=\"rowID\" \r\n [paginator]=\"true\" paginatorDropdownAppendTo=\"body\" [first]=\"currentPage * currentRowsPerPage\" [rows]=\"currentRowsPerPage\" [totalRecords]=\"totalRecords\"\r\n [rowsPerPageOptions]=\"allowedRowsPerPage\" [showCurrentPageReport]=\"false\" (onPage)=\"pageChange($event)\"\r\n [metaKeySelection]=\"true\" [selectionMode]=\"tableOptions.rows?.singleSelector?.enabled ? 'single' : null\" [metaKeySelection]=\"tableOptions.rows?.singleSelector?.metakey\" [(selection)]=\"rowSelection\" (onRowSelect)=\"rowSelect($event)\" (onRowUnselect)=\"rowUnselect($event)\"\r\n [lazy]=\"true\" (onLazyLoad)=\"fetchTableData($event)\">\r\n\r\n <!--TEMPLATE FOR THE ACTIONS HEADER COLUMN-->\r\n <ng-template #actionColumnHeaderTemplate>\r\n @if ((tableOptions.rows?.action?.buttons?.length ?? 0) > 0) {\r\n <th [ngStyle]=\"{'max-width': (tableOptions.rows?.action?.width ?? 150) + 'px','min-width': (tableOptions.rows?.action?.width ?? 150) + 'px','width': (tableOptions.rows?.action?.width ?? 150) + 'px'}\"\r\n pResizableColumn [pResizableColumnDisabled]=\"!tableOptions.rows?.action?.resizable\" pFrozenColumn [frozen]=\"tableOptions.rows?.action?.frozen ?? false\"\r\n [alignFrozen]=\"getFrozenColumnAlignAsText(tableOptions.rows?.action?.alignmentRight ? FrozenColumnAlign.Right : FrozenColumnAlign.Left)\" id=\"actions-header\"\r\n [attr.scope]=\"'col'\" style=\"text-align: center;\">\r\n {{ tableOptions.rows?.action?.header ?? ''}}\r\n </th>\r\n }\r\n </ng-template>\r\n\r\n <!--TEMPLATE FOR THE ACTIONS ROW COLUMN-->\r\n <ng-template #actionColumnTemplate let-rowData=\"rowData\">\r\n @if ((tableOptions.rows?.action?.buttons?.length ?? 0) > 0) {\r\n <td \r\n [ngStyle]=\"{'max-width': (tableOptions.rows?.action?.width ?? 150) + 'px','min-width': (tableOptions.rows?.action?.width ?? 150) + 'px','width': (tableOptions.rows?.action?.width ?? 150) + 'px'}\"\r\n style=\"text-align: center; vertical-align: middle;\" pFrozenColumn [frozen]=\"tableOptions.rows?.action?.frozen ?? false\"\r\n [alignFrozen]=\"getFrozenColumnAlignAsText(tableOptions.rows?.action?.alignmentRight ? FrozenColumnAlign.Right : FrozenColumnAlign.Left)\">\r\n @for (button of tableOptions.rows?.action?.buttons; track button; let last = $last) {\r\n <ecs-table-button [button]=\"button\" [rowData]=\"rowData\" [isActionButton]=\"true\" [isLastActionButton]=\"last\"/>\r\n }\r\n </td>\r\n }\r\n </ng-template>\r\n\r\n <!-- TEMPLATE FOR THE ROW CHECKBOX SELECTOR HEADER COLUMN -->\r\n <ng-template #rowSelectorColumnHeaderTemplate>\r\n <th \r\n [ngStyle]=\"{'max-width': (tableOptions.rows?.checkboxSelector?.width ?? 150) + 'px','min-width': (tableOptions.rows?.checkboxSelector?.width ?? 150) + 'px','width': (tableOptions.rows?.checkboxSelector?.width ?? 150) + 'px'}\"\r\n id=\"rowSelector-header\" [attr.scope]=\"'col'\" pResizableColumn [pResizableColumnDisabled]=\"!tableOptions.rows?.checkboxSelector?.resizable\" pFrozenColumn \r\n [frozen]=\"tableOptions.rows?.checkboxSelector?.frozen ?? false\" [alignFrozen]=\"getFrozenColumnAlignAsText(tableOptions.rows?.checkboxSelector?.alignmentRight ? FrozenColumnAlign.Right : FrozenColumnAlign.Left)\"\r\n style=\"text-align: center; vertical-align: middle;\">\r\n <div style=\"display: flex; justify-content: space-between; align-items: center;\">\r\n {{ tableOptions.rows?.checkboxSelector?.header ?? '' }}\r\n <p-columnFilter type=\"boolean\" field=\"selector\" display=\"menu\" [showButtons]=\"false\"/>\r\n </div>\r\n </th>\r\n </ng-template>\r\n\r\n <!--TEMPLATE FOR THE ROW CHECKBOX SELECTOR COLUMN-->\r\n <ng-template #rowSelectorColumnTemplate let-rowData=\"rowData\">\r\n <td \r\n [ngStyle]=\"{'max-width': (tableOptions.rows?.checkboxSelector?.width ?? 150) + 'px', 'min-width': (tableOptions.rows?.checkboxSelector?.width ?? 150) + 'px', 'width': (tableOptions.rows?.checkboxSelector?.width ?? 150) + 'px'}\"\r\n style=\"text-align: center; vertical-align: middle;\" pFrozenColumn [frozen]=\"tableOptions.rows?.checkboxSelector?.frozen ?? false\" \r\n [alignFrozen]=\"getFrozenColumnAlignAsText(tableOptions.rows?.checkboxSelector?.alignmentRight ? FrozenColumnAlign.Right : FrozenColumnAlign.Left)\">\r\n <p-checkbox \r\n [disabled]=\"!(tableOptions.rows?.checkboxSelector?.enabledCondition?.(rowData) ?? true)\"\r\n [binary]=\"true\"\r\n [ngModel]=\"isRowCheckboxSelected(rowData.rowID)\"\r\n (onChange)=\"onRowChekboxChange($event, rowData.rowID)\"/>\r\n </td>\r\n </ng-template>\r\n\r\n\r\n <!-- LOGIC FOR DRAWING TABLE ACTIONS ABOVE THE HEADER -->\r\n <ng-template #caption>\r\n <div #headerContainer style=\"display: flex; justify-content: space-between; align-items: center;\">\r\n <div style=\"display: flex; align-items: center; gap: 10px;\">\r\n <!--CHOOSE COLUMNS TO SHOW-->\r\n @if (tableOptions.columns?.selectorEnabled) {\r\n <p-button [icon]=\"tableOptions.columns?.selectorIcon ?? 'pi pi-pen-to-square'\" (onClick)=\"columnSelectorShow()\" pTooltip=\"Modify columns\"\r\n [showDelay]=\"700\" tooltipPosition=\"top\" styleClass=\"p-button-icon-only\"/>\r\n }\r\n <!--CLEAR SORTS AND FILTERS-->\r\n @if (tableOptions.header?.clearSortsEnabled) {\r\n <p-button [icon]=\"tableOptions.header?.clearSortsIcon ?? 'pi pi-sort-alt-slash'\" (onClick)=\"clearSorts(dt)\" [disabled]=\"!hasToClearSorts(dt)\"\r\n pTooltip=\"Clear sorts\" [showDelay]=\"700\" tooltipPosition=\"top\" styleClass=\"p-button-icon-only\"/>\r\n }\r\n @if (tableOptions.header?.clearFiltersEnabled) {\r\n <p-button\r\n [icon]=\"tableOptions.header?.clearFiltersIcon ?? 'pi pi-filter-slash'\" (onClick)=\"clearFilters(dt)\" [disabled]=\"!hasToClearFilters(dt, globalSearchText)\"\r\n pTooltip=\"Clear filters\" [showDelay]=\"700\" tooltipPosition=\"top\" styleClass=\"p-button-icon-only\"/>\r\n }\r\n\r\n <!--TABLE DESCRIPTION-->\r\n @if(tableOptions.description?.text){ <!-- If a table description text is provided -->\r\n @if(!tableOptions.description!.tooltip){ <!-- The table description must be shown as text next to the icon -->\r\n <i [class]=\"tableOptions.description!.icon\"></i>\r\n <span [innerHTML]=\"tableOptions.description!.text\"></span>\r\n } @else {\r\n <i [escape]=\"false\" [pTooltip]=\"tableOptions.description!.text\" tooltipPosition=\"right\" [class]=\"tableOptions.description!.icon\"></i>\r\n }\r\n }\r\n </div>\r\n\r\n <!--TABLE VIEWS-->\r\n @if(tableViewsEnabled()){\r\n <div style=\"display: flex; align-items: center; gap: 10px;\">\r\n <p-buttongroup>\r\n <p-button (click)=\"viewsModalShow=true;\" [label]=\"tableViewCurrentSelectedAlias ? tableViewCurrentSelectedAlias : '--- Select a view ---'\" class=\"viewButton\"/>\r\n <p-button icon=\"pi pi-refresh\" (click)=\"viewLoad(tableViewCurrentSelectedAlias!)\" [disabled]=\"!tableViewCurrentSelectedAlias\" pTooltip=\"Apply view again\" [showDelay]=\"700\" tooltipPosition=\"top\"/>\r\n </p-buttongroup>\r\n </div>\r\n }\r\n\r\n <div style=\"display: flex; align-items: center; gap: 10px;\">\r\n <!--GLOBAL FILTER-->\r\n @if (tableOptions.globalFilter?.enabled) {\r\n <p-iconField iconPosition=\"left\" class=\"ml-auto\" [ngClass]=\"{'p-input-icon-right': globalSearchText}\">\r\n <p-inputIcon>\r\n <i class=\"pi pi-search\"></i>\r\n </p-inputIcon>\r\n <input pInputText type=\"text\" \r\n (input)=\"dt.filterGlobal($any($event.target).value, 'contains')\" autocomplete=\"off\" \r\n [maxlength]=\"tableOptions.globalFilter?.maxLength ?? null\" placeholder='Search keyword' [(ngModel)]=\"globalSearchText\"\r\n style=\"width: 220px;\"/>\r\n <!-- Right icon (only if there is text) -->\r\n @if (globalSearchText) {\r\n <p-inputIcon position=\"right\">\r\n <i class=\"pi pi-times\" style=\"cursor: pointer;\" (click)=\"clearFilters(dt, true, true); $event.stopPropagation()\"></i>\r\n </p-inputIcon>\r\n }\r\n </p-iconField>\r\n }\r\n\r\n <!--EXPORT DATA-->\r\n @if (tableOptions.excelReport?.url?.trim()) {\r\n <p-button icon=\"pi pi-file-excel\" (onClick)=\"openExcelExport()\"\r\n pTooltip=\"Export to Excel\" [showDelay]=\"700\" tooltipPosition=\"top\" styleClass=\"p-button-icon-only\"/>\r\n }\r\n\r\n <!--RESET TABLE VIEW-->\r\n @if(tableOptions.resetTableView?.enabled){\r\n <p-button [icon]=\"tableOptions.resetTableView?.icon ?? 'pi pi-eraser'\" (click)=\"resetTableView()\" pTooltip=\"Reset table view\" [showDelay]=\"700\"\r\n tooltipPosition=\"top\" styleClass=\"p-button-icon-only\"/>\r\n }\r\n\r\n <!--REFRESH DATA-->\r\n <p-button icon=\"pi pi-refresh\" (onClick)=\"refreshData($event)\" pTooltip=\"Refresh data\" [showDelay]=\"700\"\r\n tooltipPosition=\"top\" styleClass=\"p-button-icon-only\"/>\r\n \r\n <!-- HEADER ACTION BUTTONS -->\r\n @if ((tableOptions.header?.buttons?.length ?? 0) > 0) {\r\n <td style=\"display: flex; justify-content: center; align-items: center; gap: 10px;\">\r\n @for (button of tableOptions.header?.buttons; track $index) {\r\n <ecs-table-button [button]=\"button\" [rowData]=\"null\"/>\r\n }\r\n </td>\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- LOGIC FOR DRAWING TABLE HEADERS -->\r\n <ng-template #header let-columns>\r\n <tr>\r\n @if (!tableOptions.rows?.action?.alignmentRight) {\r\n <ng-container *ngTemplateOutlet=\"actionColumnHeaderTemplate\"></ng-container>\r\n }\r\n @if (tableOptions.rows?.checkboxSelector?.enabled && !tableOptions.rows?.checkboxSelector?.alignmentRight) {\r\n <ng-container [ngTemplateOutlet]=\"rowSelectorColumnHeaderTemplate\"></ng-container>\r\n }\r\n @for (col of columns; track col.header) {\r\n <th [ngStyle]=\"getColumnStyle(col, true)\"\r\n pResizableColumn [pResizableColumnDisabled]=\"!col.canBeResized ? true : false\"\r\n pReorderableColumn [pReorderableColumnDisabled]=\"!col.canBeReordered ? true : false\"\r\n pFrozenColumn [frozen]=\"col.frozenColumnAlign === FrozenColumnAlign.Left || col.frozenColumnAlign === FrozenColumnAlign.Right\" [alignFrozen]=\"getFrozenColumnAlignAsText(col.frozenColumnAlign)\"\r\n [pSortableColumn]=\"col.field\" [pSortableColumnDisabled]=\"!col.canBeSorted ? true : false\"\r\n style=\"text-align: center;\"\r\n [id]=\"col.field + '-header'\" [attr.scope]=\"'col'\">\r\n <div style=\"display: flex; justify-content: space-between; align-items: center; width: 100%;\">\r\n <div style=\"margin-right: 15px;\">\r\n <span>{{ col.header }}</span>\r\n </div>\r\n <div style=\"display: flex; align-items: center; gap: 5px;\">\r\n @if (col.canBeSorted) {\r\n <p-sortIcon [field]=\"col.field\"></p-sortIcon>\r\n }\r\n @if(col.canBeFiltered){\r\n @if (!col.filterPredefinedValuesName || col.filterPredefinedValuesName.length === 0) {\r\n <p-columnFilter [type]=\"getDataTypeAsText(col.dataType)\" [field]=\"col.field\" display=\"menu\" [showButtons]=\"false\"/>\r\n } @else {\r\n <p-columnFilter\r\n type=\"{{getDataTypeAsText(col.dataType)}}\" field=\"{{col.field}}\" display=\"menu\"\r\n [showButtons]=\"false\" matchMode=\"in\" operator=\"or\" [showMatchModes]=\"false\"\r\n [showOperator]=\"false\" [showAddButton]=\"false\" [showClearButton]=\"false\" [showApplyButton]=\"false\">\r\n <ng-template #filter>\r\n <p-multiSelect\r\n [style]=\"{ minWidth: '400px' }\" [(ngModel)]=\"predefinedFiltersSelectedValuesCollection[col.filterPredefinedValuesName]\"\r\n [options]=\"getPredefinedFilterValues(col.filterPredefinedValuesName)\" placeholder=\"Any value\"\r\n (onChange)=\"onPredefinedFilterChange(col.field, $event.value)\" optionLabel=\"name\">\r\n <ng-template #item let-option >\r\n <div style=\"display: inline-block; vertical-align: middle;\">\r\n <ecs-table-predefined-filters [option]=\"option\" [col]=\"col\" [selectable]=\"false\" [rowData]=\"null\"/>\r\n </div>\r\n </ng-template>\r\n </p-multiSelect>\r\n </ng-template>\r\n </p-columnFilter>\r\n }\r\n }\r\n @if (col.columnDescription && col.columnDescription.length > 0) {\r\n <i [pTooltip]=\"col.columnDescription\" tooltipPosition=\"top\" class=\"pi pi-info-circle\"></i>\r\n }\r\n </div>\r\n </div>\r\n </th>\r\n }\r\n @if (tableOptions.rows?.checkboxSelector?.enabled && tableOptions.rows?.checkboxSelector?.alignmentRight) {\r\n <ng-container [ngTemplateOutlet]=\"rowSelectorColumnHeaderTemplate\"></ng-container>\r\n }\r\n @if (tableOptions.rows?.action?.alignmentRight) {\r\n <ng-container *ngTemplateOutlet=\"actionColumnHeaderTemplate\"></ng-container>\r\n }\r\n </tr>\r\n </ng-template>\r\n\r\n <!-- LOGIC FOR DRAWING TABLE DATA WHEN THERE IS CONTENTS -->\r\n <ng-template #body let-rowData let-columns=\"columns\"> \r\n <tr [pSelectableRow]=\"rowData\" [ngClass]=\"tableOptions.rows?.class?.(rowData)\" [ngStyle]=\"tableOptions.rows?.style?.(rowData)\">\r\n @if (!tableOptions.rows?.action?.alignmentRight) {\r\n <ng-container *ngTemplateOutlet=\"actionColumnTemplate; context: { rowData: rowData }\"></ng-container>\r\n }\r\n @if (tableOptions.rows?.checkboxSelector?.enabled && !tableOptions.rows?.checkboxSelector?.alignmentRight) {\r\n <ng-container [ngTemplateOutlet]=\"rowSelectorColumnTemplate\" [ngTemplateOutletContext]=\"{ rowData: rowData }\"></ng-container>\r\n }\r\n @for (col of columns; track col.field) {\r\n <td (mousedown)=\"col.dataType !== DataType.Boolean && copyToClipboardStart($event)\" (mouseup)=\"copyToClipboardCancel()\"\r\n [ngStyle]=\"getColumnStyle(col)\" pFrozenColumn [frozen]=\"col.frozenColumnAlign === FrozenColumnAlign.Left || col.frozenColumnAlign === FrozenColumnAlign.Right\" \r\n [alignFrozen]=\"getFrozenColumnAlignAsText(col.frozenColumnAlign)\" [style.text-align]=\"getDataAlignHorizontalAsText(col.dataAlignHorizontal)\" [style.vertical-align]=\"getDataAlignVerticalAsText(col.dataAlignVertical)\">\r\n <ecs-table-cell [col]=\"col\" [rowData]=\"rowData\" [globalSearchText]=\"globalSearchText\" \r\n [dateFormat]=\"dateFormat\" [dateTimezone]=\"dateTimezone\" [dateCulture]=\"dateCulture\"\r\n [predefinedFiltersCollection]=\"tableOptions.predefinedFilters\"/>\r\n </td>\r\n }\r\n @if (tableOptions.rows?.checkboxSelector?.enabled && tableOptions.rows?.checkboxSelector?.alignmentRight) {\r\n <ng-container [ngTemplateOutlet]=\"rowSelectorColumnTemplate\" [ngTemplateOutletContext]=\"{ rowData: rowData }\"></ng-container>\r\n }\r\n @if (tableOptions.rows?.action?.alignmentRight) {\r\n <ng-container *ngTemplateOutlet=\"actionColumnTemplate; context: { rowData: rowData }\"></ng-container>\r\n }\r\n </tr>\r\n </ng-template>\r\n\r\n <!-- LOGIC FOR DRAWING TABLE DATA WHEN THERE IS NO CONTENTS -->\r\n <ng-template #emptymessage>\r\n <tr>\r\n <td colspan=\"999\">No data found for the current filter criteria.</td>\r\n </tr>\r\n </ng-template>\r\n\r\n <!-- SHOW CUSTOM RECORDS REPORT -->\r\n <ng-template #paginatorleft>\r\n <div #paginatorContainer>\r\n <div style=\"display: flex; align-items: center; gap: 10px;\">\r\n @if(tableOptions.legend?.content){\r\n <p-button (click)=\"op.toggle($event)\" [icon]=\"tableOptions.legend?.button?.icon || 'pi pi-bars'\" [label]=\"tableOptions.legend?.button?.text || 'Legend'\" />\r\n <p-popover #op>\r\n <div [innerHTML]=\"tableOptions.legend?.content\"></div>\r\n </p-popover>\r\n }\r\n <span>Showing {{totalRecords}} records of {{totalRecordsNotFiltered}} available records</span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </p-table>\r\n</div>\r\n<ecs-column-selector [visible]=\"showColumnSelector\" [columnModalData]=\"columnModalData\" [filteredColumnData]=\"filteredColumnData\" (visibleChange)=\"showColumnSelector=false\" (applyChanges)=\"applyColumnModalChanges($event)\"/>\r\n<ecs-export-excel [visible]=\"showExportModal\" [rowCheckboxSelectorActive]=\"tableOptions.rows?.checkboxSelector?.enabled ?? false\" [excelReportTitle]=\"excelReportTitle\" [allowTitleUserEdit]=\"tableOptions.excelReport?.titleAllowUserEdit ?? false\" (visibleChange)=\"showExportModal=false\" (exportToExcel)=\"generateExcelReport($event)\"/>\r\n<ecs-views-management [visible]=\"viewsModalShow\" [tableViews_menuItems]=\"tableViews_menuItems\" \r\n (onViewSelect)=\"viewLoad($event)\" (onViewCreate)=\"viewCreate($event)\" (onViewDelete)=\"viewDelete($event)\" (onViewEditAlias)=\"viewEditAlias($event)\" (onViewUpdateData)=\"viewUpdateData($event)\" (onViewUpdateActiveStartup)=\"viewUpdateActiveStartup($event)\"\r\n (visibleChange)=\"viewsModalShow=false\"/>","/*\r\n * Public API Surface of ecs-primeng-table\r\n */\r\n// ENUMS\r\nexport * from './lib/enums';\r\n\r\n// INTERFACES\r\nexport * from './lib/interfaces/columns-metadata.interface';\r\nexport * from './lib/interfaces/predefined-filter.interface';\r\nexport * from './lib/interfaces/table-button.interface';\r\nexport * from './lib/interfaces/table-options.interface';\r\n\r\n// UTILS\r\nexport * from \"./lib/utils/create-table-options\";\r\n\r\n// SERVICES\r\nexport * from './lib/services';\r\n\r\n// COMPONENTS AND DEPENDENCIES\r\nexport * from './lib/components/ecs-primeng-table/ecs-primeng-table';\r\nexport * from './lib/components/ecs-primeng-table/ecs-primeng-table.service';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ECSPrimengTableHttpService","i1.ECSPrimengTableNotificationService","i2.ECSPrimengTableService","i5","i1","i2","i1.ECSPrimengTableService","i4","i3","i7","i11","i12","i2.ExportExcelService","i6","i2.ECSPrimengTableNotificationService","i8","i10"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"eternalcodestudio-primeng-table.mjs","sources":["../../../projects/ecs-primeng-table/src/lib/enums/cell-overflow-behaviour.enum.ts","../../../projects/ecs-primeng-table/src/lib/enums/data-align-horizontal.enum.ts","../../../projects/ecs-primeng-table/src/lib/enums/data-align-vertical.enum.ts","../../../projects/ecs-primeng-table/src/lib/enums/data-type.enum.enum.ts","../../../projects/ecs-primeng-table/src/lib/enums/frozen-column-align.enum.ts","../../../projects/ecs-primeng-table/src/lib/enums/table-view-save-mode.enum.ts","../../../projects/ecs-primeng-table/src/lib/interfaces/table-options.interface.ts","../../../projects/ecs-primeng-table/src/lib/utils/create-table-options.ts","../../../projects/ecs-primeng-table/src/lib/services/http.service.ts","../../../projects/ecs-primeng-table/src/lib/services/notification.service.ts","../../../projects/ecs-primeng-table/src/lib/utils/data-align-horizontal-as-text.ts","../../../projects/ecs-primeng-table/src/lib/utils/data-align-vertical-as-text.ts","../../../projects/ecs-primeng-table/src/lib/utils/data-type-as-text.ts","../../../projects/ecs-primeng-table/src/lib/utils/frozen-column-align-as-text.ts","../../../projects/ecs-primeng-table/src/lib/utils/highlight-text.ts","../../../projects/ecs-primeng-table/src/lib/components/ecs-primeng-table/ecs-primeng-table.service.ts","../../../projects/ecs-primeng-table/src/lib/components/table-predefined-filters/table-predefined-filters.ts","../../../projects/ecs-primeng-table/src/lib/components/table-predefined-filters/table-predefined-filters.html","../../../projects/ecs-primeng-table/src/lib/components/table-cell/table-cell.ts","../../../projects/ecs-primeng-table/src/lib/components/table-cell/table-cell.html","../../../projects/ecs-primeng-table/src/lib/components/table-button/table-button.ts","../../../projects/ecs-primeng-table/src/lib/components/table-button/table-button.html","../../../projects/ecs-primeng-table/src/lib/components/column-selector/column-selector.ts","../../../projects/ecs-primeng-table/src/lib/components/column-selector/column-selector.html","../../../projects/ecs-primeng-table/src/lib/components/export-excel/export-excel.service.ts","../../../projects/ecs-primeng-table/src/lib/components/export-excel/export-excel.ts","../../../projects/ecs-primeng-table/src/lib/components/export-excel/export-excel.html","../../../projects/ecs-primeng-table/src/lib/components/views-management/views-management.ts","../../../projects/ecs-primeng-table/src/lib/components/views-management/views-management.html","../../../projects/ecs-primeng-table/src/lib/components/ecs-primeng-table/ecs-primeng-table.ts","../../../projects/ecs-primeng-table/src/lib/components/ecs-primeng-table/ecs-primeng-table.html","../../../projects/ecs-primeng-table/src/public-api.ts","../../../projects/ecs-primeng-table/src/eternalcodestudio-primeng-table.ts"],"sourcesContent":["/**\r\n * Defines how content that overflows a table cell is displayed.\r\n *\r\n * @remarks\r\n * This enumeration specifies the visual behavior of cell content when it exceeds the cell’s width.\r\n */\r\nexport enum CellOverflowBehaviour {\r\n /** The overflowing content is clipped and not visible. */\r\n Hidden,\r\n\r\n /** The content wraps onto multiple lines to fit within the cell. */\r\n Wrap\r\n}","/**\r\n * Defines the horizontal alignment of content within a table cell.\r\n *\r\n * @remarks\r\n * Specifies how the content inside a cell is positioned horizontally relative to the cell's width.\r\n */\r\nexport enum DataAlignHorizontal {\r\n /** Content is aligned to the left side of the cell. */\r\n Left,\r\n\r\n /** Content is aligned to the center of the cell. */\r\n Center,\r\n\r\n /** Content is aligned to the right side of the cell. */\r\n Right\r\n}","/**\r\n * Enum representing the vertical alignment of content within a table cell.\r\n * \r\n * @remarks\r\n * Determines how the content inside a cell is positioned vertically relative to the cell's height.\r\n */\r\nexport enum DataAlignVertical {\r\n /** Align content to the top of the cell. */\r\n Top,\r\n\r\n /** Align content to the vertical middle of the cell. */\r\n Middle,\r\n\r\n /** Align content to the bottom of the cell. */\r\n Bottom\r\n}","/**\r\n * Enum representing the different types of data a table column can hold.\r\n * \r\n * @remarks\r\n * This is used to determine how values should be rendered, formatted, and \r\n * filtered in the table component.\r\n */\r\nexport enum DataType {\r\n /** Plain text string values. */\r\n Text,\r\n\r\n /** Numeric values, e.g., integers or decimals. */\r\n Numeric,\r\n\r\n /** Boolean values (true/false). */\r\n Boolean,\r\n\r\n /** Date or datetime values. */\r\n Date,\r\n\r\n /** List of values, stored as a string separated by a delimiter (\";\"). */\r\n List\r\n}","/**\r\n * Enum representing the alignment of frozen columns in a table.\r\n * \r\n * @remarks\r\n * Used to determine if a column should be frozen, and if so, on which side\r\n * of the table it should appear.\r\n */\r\nexport enum FrozenColumnAlign {\r\n /** The column is not frozen. */\r\n Noone,\r\n\r\n /** The column is frozen on the left side of the table. */\r\n Left,\r\n\r\n /** The column is frozen on the right side of the table. */\r\n Right\r\n}","/**\r\n * Enum representing the mode used to save the state or configuration of a table view.\r\n * \r\n * @remarks\r\n * Determines where and how the table's view settings (e.g., column order, filters, \r\n * sorting) are persisted.\r\n */\r\nexport enum TableViewSaveMode {\r\n /** Views are disabled. */\r\n None,\r\n\r\n /** Save the table view state in the browser's sessionStorage (cleared on tab close). */\r\n SessionStorage,\r\n\r\n /** Save the table view state in the browser's localStorage (persists across sessions). */\r\n LocalStorage,\r\n\r\n /** Save the table view state in a backend database (requires server support). */\r\n DatabaseStorage\r\n}","import { TableViewSaveMode } from \"../enums\";\r\nimport { IColumnMetadata, IPredefinedFilter, ITableButton } from \"../interfaces\";\r\n\r\n/** Configuration options for ECS Primeng table */\r\nexport interface ITableOptions {\r\n\r\n /**\r\n * Controls whether the table is active.\r\n * \r\n * - When `true`, the table will fetch configuration, columns, and data on init.\r\n * - When `false`, the table will **not** automatically fetch or update data, even after initialization.\r\n * Use this if you want to apply filters, column changes, or other manipulations \r\n * without triggering automatic updates.\r\n * \r\n * @default true\r\n */\r\n isActive?: boolean;\r\n\r\n /**\r\n * Endpoint URL to fetch the table configuration.\r\n * \r\n * The configuration is fetched **once** when the table is initialized and is expected to return\r\n * an `ITableConfiguration` object from the API. This includes data such as column definitions, \r\n * the timezone to use, and other settings.\r\n * \r\n * If set to `undefined` or if `isActive` is `false`, the table will **not** fetch configuration automatically.\r\n * \r\n * @default undefined\r\n */\r\n urlTableConfiguration?: string;\r\n\r\n /**\r\n * Endpoint URL to fetch the table data.\r\n * \r\n * This endpoint is called **whenever the user filters, changes pages, or sorts** the table.\r\n * It is expected to return an `ITablePagedResponse` object containing the paginated data.\r\n * \r\n * If set to `undefined` or if `isActive` is `false`, the table will **not** fetch or update data automatically.\r\n * \r\n * @default undefined\r\n */\r\n urlTableData?: string;\r\n\r\n /**\r\n * The array of data to be displayed in the table.\r\n * \r\n * Each item should represent a row and match the table's column structure.\r\n * \r\n * @default []\r\n */\r\n data?: any[];\r\n\r\n /**\r\n * Configuration options for the table description section.\r\n */\r\n description?: {\r\n /**\r\n * Icon displayed alongside the table description.\r\n * You can use any PrimeIcons class or icons from third-party libraries\r\n * such as Material Icons or Font Awesome.\r\n *\r\n * @default \"pi pi-info-circle\"\r\n */\r\n icon?: string;\r\n\r\n /**\r\n * Determines how the description text is displayed.\r\n * - `true`, the `text` content is shown as a tooltip when hovering\r\n * over the description icon.\r\n * - `false`, the `text` is displayed inline to the right of the icon.\r\n *\r\n * @default true\r\n */\r\n tooltip?: boolean;\r\n\r\n /**\r\n * The description content to display.\r\n * If left undefined or string empty, the table description will not be rendered.\r\n * Supports basic HTML for rich text formatting.\r\n *\r\n * @default undefined\r\n */\r\n text?: string;\r\n }\r\n\r\n /**\r\n * Configuration options for the table legend.\r\n */\r\n legend?: {\r\n /**\r\n * The content to be displayed in the popover of the legend. Can be HTML rich.\r\n *\r\n * @default undefined\r\n */\r\n content?: string;\r\n\r\n /**\r\n * Configuration options for the button that displays the popover of the table legend.\r\n */\r\n button?: {\r\n /**\r\n * Icon displayed alongside the button of the table legend.\r\n * You can use any PrimeIcons class or icons from third-party libraries\r\n * such as Material Icons or Font Awesome.\r\n *\r\n * @default \"pi pi-bars\"\r\n */\r\n icon?: string;\r\n\r\n /**\r\n * The text shown in the legend button.\r\n *\r\n * @default \"Legend\"\r\n */\r\n text?: string;\r\n }\r\n }\r\n\r\n /**\r\n * Configurations related to options that are at the header of the table.\r\n */\r\n header?: {\r\n /**\r\n * A collection of `ITableButton` to be shown in the table header.\r\n * \r\n * @default []\r\n */\r\n buttons?: ITableButton[];\r\n\r\n /**\r\n * When set to `false`, the **clear sorts** button will be hidden.\r\n * \r\n * @default true\r\n */\r\n clearSortsEnabled?: boolean;\r\n\r\n /**\r\n * Allows customization of the **clear sorts** button icon. You may use any other icons from PrimeNG or third-party providers such as Material Icons or Font Awesome.\r\n * \r\n * @default \"pi pi-sort-alt-slash\"\r\n */\r\n clearSortsIcon?: string;\r\n\r\n /**\r\n * When set to `false`, the **clear filters** button will be hidden.\r\n * \r\n * @default true\r\n */\r\n clearFiltersEnabled?: boolean;\r\n\r\n /**\r\n * Allows customization of the **clear filters** button icon. Other icons from PrimeNG or third-party libraries (e.g., Material Icons, Font Awesome) may also be used.\r\n * \r\n * @default \"pi pi-filter-slash\"\r\n */\r\n clearFiltersIcon?: string;\r\n };\r\n\r\n /**\r\n * Configurations related to the columns of the table.\r\n */\r\n columns?: {\r\n /**\r\n * Enables or disables the column selector feature.\r\n * \r\n * When `true`, a button is displayed in the top-left corner of the table.\r\n * Clicking this button opens a modal that allows users to:\r\n * - Show or hide columns.\r\n * - Adjust the cell overflow behavior for each column.\r\n * - Change the horizontal and vertical alignment of cells per column.\r\n * \r\n * When `false`, the button to open the column's selector modal will not be available.\r\n * \r\n * @default true\r\n */\r\n selectorEnabled?: boolean;\r\n\r\n /**\r\n * Can be used to specifiy a different icon to be used by the column selector. \r\n * You can replace it with any icon from PrimeNG or other libraries such as Font Awesome or Material Icons.\r\n * \r\n * @default \"pi pi-pen-to-square\"\r\n */\r\n selectorIcon?: string;\r\n\r\n /**\r\n * When `true`, columns in the selector are displayed alphabetically (A–Z). \r\n * When `false`, columns keep the order provided by the backend.\r\n * \r\n * @default true\r\n */\r\n selectorOrderByColumnName?: boolean;\r\n\r\n /**\r\n * The combination of non-selectable columns and user-selected columns \r\n * that must be displayed in the table.\r\n * \r\n * @default []\r\n */\r\n shown?: IColumnMetadata[];\r\n };\r\n\r\n /**\r\n * Configurations related to the rows of the table.\r\n */\r\n rows?: {\r\n /**\r\n * Function to dynamically assign CSS classes to a row.\r\n * \r\n * Receives the `rowData` object for the current row and returns:\r\n * - A string with a single CSS class name\r\n * - An array of class names\r\n * - A Set of class names\r\n * - An object with class keys and truthy/falsy values\r\n * \r\n * The returned classes are applied to the row in addition to any global or default styles.\r\n * Useful for changing appearance of a row based on column values.\r\n * \r\n * Example:\r\n * ```ts\r\n * class: (rowData) => {\r\n * const classes = [];\r\n * if (rowData.status === \"Unemployed\") classes.push(\"unemployedRow\");\r\n * return classes;\r\n * }\r\n * ```\r\n */\r\n class?: (rowData: any) => string | string[] | Set<string> | { [klass: string]: any };\r\n\r\n /**\r\n * Function to dynamically assign inline styles to a row.\r\n * \r\n * Receives the `rowData` object for the current row and returns an object\r\n * with CSS properties to apply inline. This allows dynamic styling based\r\n * on the row's content or values.\r\n * \r\n * If not provided, no dynamic styles are applied.\r\n * \r\n * Example:\r\n * ```ts\r\n * style: (rowData) => {\r\n * if (rowData.status === \"Full-time\") {\r\n * return { fontWeight: \"bold\", fontStyle: \"italic\" };\r\n * }\r\n * return {};\r\n * }\r\n * ```\r\n */\r\n style?: (rowData: any) => { [klass: string]: any };\r\n\r\n /**\r\n * Configurations related to the action column for the rows.\r\n */\r\n action?: {\r\n /**\r\n * A collection of `ITableButton` to be shown by this column to perform actions over rows. At least one button needs to be enable the row actions column.\r\n * \r\n * @default []\r\n */\r\n buttons?: ITableButton[];\r\n\r\n /**\r\n * The header label for the row actions column.\r\n * \r\n * @default \"Actions\"\r\n */\r\n header?: string;\r\n\r\n /**\r\n * If `true`, the column will appear on the right side of the table. Otherwise, it will appear on the left.\r\n * \r\n * @default true\r\n */\r\n alignmentRight?: boolean;\r\n\r\n /**\r\n * The fixed column width in pixels.\r\n * \r\n * @default 150\r\n */\r\n width?: number;\r\n\r\n /**\r\n * If `true`, the column remains visible when horizontally scrolling the table.\r\n * \r\n * @default true\r\n */\r\n frozen?: boolean;\r\n\r\n /**\r\n * If `true`, users can resize the column.\r\n * \r\n * @default false\r\n */\r\n resizable?: boolean;\r\n };\r\n\r\n /**\r\n * Configurations related to the row checkbox selector.\r\n */\r\n checkboxSelector?: {\r\n /**\r\n * If `true`, a new column with checkboxes will be displayed. Users can select or unselect rows using these checkboxes. Additionally an option to filter by this column will be enabled.\r\n * \r\n * @default false\r\n */\r\n enabled?: boolean;\r\n\r\n /**\r\n * The header label for the checkbox selection column.\r\n * \r\n * @default \"Selected\"\r\n */\r\n header?: string;\r\n\r\n /**\r\n * If `true`, the column will appear on the right side of the table. Otherwise, it will appear on the left.\r\n * \r\n * @default false\r\n */\r\n alignmentRight?: boolean;\r\n\r\n /**\r\n * The fixed column width in pixels.\r\n * \r\n * @default 150\r\n */\r\n width?: number;\r\n\r\n /**\r\n * If `true`, the column remains visible when horizontally scrolling the table.\r\n * \r\n * @default true\r\n */\r\n frozen?: boolean;\r\n\r\n /**\r\n * If `true`, users can resize the column.\r\n * \r\n * @default false\r\n */\r\n resizable?: boolean;\r\n\r\n /**\r\n * Function that determines whether the checkbox should be enabled or not.\r\n * @param rowData The row data object.\r\n * @returns True if the checkbox should be enabled; false otherwise.\r\n * \r\n * @default undefined\r\n */\r\n enabledCondition?: (rowData: any) => boolean;\r\n };\r\n\r\n /**\r\n * Configurations related to the single row selector.\r\n */\r\n singleSelector?: {\r\n /**\r\n * If set to `true`, users can click a row to select it. You can then subscribe to selection events to execute custom actions.\r\n * \r\n * @default false\r\n */\r\n enabled?: boolean;\r\n\r\n /**\r\n * When `true`, users must hold **CTRL** and click on a selected row to unselect it. When `false`, users can unselect a row simply by clicking it again.\r\n * \r\n * On mobile devices (phones or tablets), the **CTRL** key configuration is ignored. Users can unselect a previously selected row by simply clicking it, as mobile devices do not have a **CTRL** key.\r\n * \r\n * @default true\r\n */\r\n metakey?: boolean;\r\n };\r\n };\r\n\r\n /** Configurations related to the vertical scroll of the table. */\r\n verticalScroll?: {\r\n /**\r\n * Automatically adjust the table's height to fit its container.\r\n * \r\n * When set to `true`, the table will calculate the maximum height dynamically \r\n * so that it exactly fits its container. This takes precedence over the `height` property.\r\n * \r\n * Ignored if a `cssFormula` has been provided.\r\n * \r\n * @default true\r\n */\r\n fitToContainer?: boolean;\r\n\r\n /**\r\n * Fixed vertical height for the table when `fitToContainer` is `false`.\r\n * \r\n * - If a `cssFormula` has been provided, this property is ignored.\r\n * - If `fitToContainer` from `verticalScroll` is `true`, this property is ignored.\r\n * - If set to a value `<= 0`, this is ignored.\r\n * \r\n * Use this property to enable vertical scrolling with a fixed height when you do not want \r\n * the table to dynamically fit its container.\r\n * \r\n * @default 0\r\n */\r\n height?: number;\r\n\r\n /**\r\n * A CSS string used to define the table's vertical height.\r\n * \r\n * Can be a fixed value (e.g., `\"500px\"`) or a CSS formula (e.g., `\"calc(100vh - 200px)\"`).\r\n * When provided, this value **overrides** both `fitToContainer` and `height`.\r\n * \r\n * @default undefined\r\n */\r\n cssFormula?: string;\r\n };\r\n\r\n /** Configurations related to the global filter functionality of the table. */\r\n globalFilter?: {\r\n /**\r\n * Enables or disables the global filter input.\r\n * \r\n * When set to `true`, users can search across all table columns using the global search bar.\r\n * When `false`, the global search input will not be rendered.\r\n * \r\n * @default true\r\n */\r\n enabled?: boolean;\r\n\r\n /**\r\n * Maximum number of characters allowed in the global filter input.\r\n * \r\n * Use this to limit the length of search queries and prevent excessively long input.\r\n * \r\n * @default 20\r\n */\r\n maxLength?: number;\r\n };\r\n\r\n /**\r\n * Predefined filters for table columns.\r\n * \r\n * Restricts filter options to a known set of values for a column.\r\n * Suitable for columns with a limited number of distinct values.\r\n * Supports plain text, tags, icons, and images. Works with `list` data types.\r\n * \r\n * @default {}\r\n */\r\n predefinedFilters?: { [key: string]: IPredefinedFilter[] }\r\n\r\n /**\r\n * Configurations related to saved table views.\r\n */\r\n views?: {\r\n /**\r\n * Determines how the table views are saved.\r\n * \r\n * - `TableViewSaveMode.None`: Do not save any views.\r\n * - `TableViewSaveMode.SessionStorage`: Save views in the browser session storage (cleared when the tab/window closes).\r\n * - `TableViewSaveMode.LocalStorage`: Save views in the browser local storage (persistent across sessions).\r\n * - `TableViewSaveMode.DatabaseStorage`: Save views directly in the database via the backend API. If you are using this method you will need to specify also the `urlGet`and `urlSave`\r\n * \r\n * This allows users to keep their custom column orders, filters, sorting, and other table settings\r\n * according to the selected storage option.\r\n * \r\n * @default TableViewSaveMode.None\r\n */\r\n saveMode?: TableViewSaveMode;\r\n \r\n /**\r\n * Key used to identify the table when saving and retrieving its views.\r\n * \r\n * Each table should have a unique `saveKey` so that its saved views (filters, column order, sorting, etc.)\r\n * do not conflict with other tables.\r\n * \r\n * If set to `undefined`, the table will not save or load any views.\r\n * \r\n * @default undefined\r\n */\r\n saveKey?: string;\r\n\r\n /**\r\n * Endpoint URL to fetch saved views from the database.\r\n * \r\n * Only used if `saveMode` is `TableViewSaveMode.databaseStorage`.\r\n * The `saveKey` is sent to identify the correct table views.\r\n * \r\n * @default undefined\r\n */\r\n urlGet?: string;\r\n\r\n /**\r\n * Endpoint URL to save table views to the database.\r\n * \r\n * Only used if `saveMode` is `TableViewSaveMode.databaseStorage`.\r\n * The `saveKey` is sent to identify the correct table views.\r\n * \r\n * @default undefined\r\n */\r\n urlSave?: string;\r\n };\r\n\r\n /**\r\n * Configurations related to the reset table view button.\r\n */\r\n resetTableView?:{\r\n /**\r\n * If the reset table view button should be enabled.\r\n * \r\n * @default true\r\n */\r\n enabled?: boolean;\r\n\r\n /**\r\n * Can be used to specifiy a different icon to be used by the reset table view button.\r\n * You can replace it with any icon from PrimeNG or other libraries such as Font Awesome or Material Icons.\r\n * \r\n * @default \"pi pi-eraser\"\r\n */\r\n icon?: string;\r\n }\r\n\r\n /**\r\n * Configurations for exporting the table data to Excel.\r\n */\r\n excelReport?: {\r\n /**\r\n * Endpoint URL of the API to perform the Excel export.\r\n * \r\n * When set, the table will send a request to this endpoint including the properties\r\n * specified by the user, such as selected columns, filters, and sort order, to generate\r\n * the export.\r\n * \r\n * If set to `undefined`, Excel export functionality will be disabled.\r\n * \r\n * @default undefined\r\n */\r\n url?: string;\r\n\r\n /**\r\n * Default title shown in the Excel export modal when preparing the export.\r\n * \r\n * If the string is empty (after trimming) **and** `titleAllowUserEdit` is `false`, \r\n * the export button will be disabled.\r\n * \r\n * @default \"Report\"\r\n */\r\n defaultTitle?: string;\r\n\r\n /**\r\n * Determines whether the user can edit the title of the Excel file in the export modal.\r\n * \r\n * - If `true`, the user can modify the title before exporting.\r\n * - If `false`, the title is fixed to `defaultTitle`.\r\n * \r\n * @default true\r\n */\r\n titleAllowUserEdit?: boolean;\r\n }\r\n\r\n /**\r\n * Defines the number of seconds the user must hold the mouse button on a cell before its content is copied to the clipboard. Set to a value <= 0 to turn off this feature entirely\r\n * \r\n * @default 0.5\r\n */\r\n copyToClipboardTime?: number;\r\n}\r\n\r\n/** Default configuration options for ECS Primeng table */\r\nexport const DEFAULT_TABLE_OPTIONS: ITableOptions = {\r\n isActive: true,\r\n urlTableConfiguration: undefined,\r\n urlTableData: undefined,\r\n data: [],\r\n description: {\r\n icon: \"pi pi-info-circle\",\r\n tooltip: true,\r\n text: undefined\r\n },\r\n legend: {\r\n content: undefined,\r\n button: {\r\n icon: \"pi pi-bars\",\r\n text: \"Legend\"\r\n }\r\n },\r\n header: {\r\n buttons: [],\r\n clearSortsEnabled: true,\r\n clearSortsIcon: \"pi pi-sort-alt-slash\",\r\n clearFiltersEnabled: true,\r\n clearFiltersIcon: \"pi pi-filter-slash\"\r\n },\r\n columns: {\r\n selectorEnabled: true,\r\n selectorIcon: \"pi pi-pen-to-square\",\r\n selectorOrderByColumnName: true,\r\n shown: []\r\n },\r\n rows: {\r\n style: () => ({}),\r\n class: () => ({}),\r\n action: {\r\n buttons: [],\r\n header: \"Actions\",\r\n alignmentRight: true,\r\n width: 150,\r\n frozen: true,\r\n resizable: false\r\n },\r\n checkboxSelector: {\r\n enabled: false,\r\n header: \"Selected\",\r\n alignmentRight: false,\r\n width: 150,\r\n frozen: true,\r\n resizable: false,\r\n enabledCondition: undefined\r\n },\r\n singleSelector: {\r\n enabled: false,\r\n metakey: true\r\n }\r\n },\r\n verticalScroll: {\r\n fitToContainer: true,\r\n height: 0,\r\n cssFormula: undefined\r\n },\r\n globalFilter: {\r\n enabled: true,\r\n maxLength: 20\r\n },\r\n predefinedFilters: {},\r\n views: {\r\n saveMode: TableViewSaveMode.None,\r\n saveKey: undefined,\r\n urlGet: undefined,\r\n urlSave: undefined\r\n },\r\n resetTableView: {\r\n enabled: true,\r\n icon: \"pi pi-eraser\"\r\n },\r\n excelReport: {\r\n url: undefined,\r\n defaultTitle: \"Report\",\r\n titleAllowUserEdit: true\r\n },\r\n copyToClipboardTime: 0.5\r\n};","import { DEFAULT_TABLE_OPTIONS, ITableOptions } from '../interfaces';\r\n\r\n/**\r\n * Deep merge two objects.\r\n * Recursively copies properties from `source` into `target`,\r\n * but ignores `undefined` values to preserve defaults.\r\n */\r\nfunction deepMerge<T>(target: T, source: Partial<T>): T {\r\n for (const key in source) {\r\n const value = source[key];\r\n\r\n if (value === undefined) { // skip undefined values to keep defaults\r\n continue;\r\n }\r\n\r\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\r\n if (!target[key]) (target as any)[key] = {};\r\n deepMerge((target as any)[key], value);\r\n } else {\r\n (target as any)[key] = value;\r\n }\r\n }\r\n return target;\r\n}\r\n\r\n/**\r\n * Create table options based on defaults, with optional overrides.\r\n */\r\nexport function createTableOptions(overrides: Partial<ITableOptions> = {}): ITableOptions {\r\n const defaultsCopy = JSON.parse(JSON.stringify(DEFAULT_TABLE_OPTIONS)); // clone only data\r\n const merged = deepMerge(defaultsCopy as any, overrides);\r\n\r\n // Reasign function if they exist in override\r\n if (overrides.rows?.style) merged.rows.style = overrides.rows.style;\r\n if (overrides.rows?.class) merged.rows.class = overrides.rows.class;\r\n\r\n return merged as ITableOptions;\r\n}","import { Injectable } from '@angular/core';\r\nimport { HttpHeaders, HttpResponse } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\n\r\n/**\r\n * Abstract service for handling HTTP requests for **ECS Primeng table**.\r\n * \r\n * Provides a consistent interface for making GET and POST requests to the backend.\r\n * Implementations must define how requests are executed, including error handling,\r\n * headers, and response processing.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport abstract class ECSPrimengTableHttpService {\r\n\r\n /**\r\n * Performs a GET request to the specified service endpoint.\r\n * \r\n * @template T The expected response type.\r\n * @param servicePoint The endpoint URL or path for the GET request.\r\n * @param responseType Optional. The type of response expected, either `'json'` (default) or `'blob'`.\r\n * @returns An Observable of `HttpResponse<T>`, containing the full HTTP response.\r\n */\r\n abstract handleHttpGetRequest<T>(\r\n servicePoint: string,\r\n responseType?: 'json' | 'blob'\r\n ): Observable<HttpResponse<T>>;\r\n\r\n /**\r\n * Performs a POST request to the specified service endpoint.\r\n * \r\n * @template T The expected response type.\r\n * @param servicePoint The endpoint URL or path for the POST request.\r\n * @param data The payload to send in the POST request body.\r\n * @param httpOptions Optional HTTP headers to include in the request.\r\n * @param responseType Optional. The type of response expected, either `'json'` (default) or `'blob'`.\r\n * @returns An Observable of `HttpResponse<T>`, containing the full HTTP response.\r\n */\r\n abstract handleHttpPostRequest<T>(\r\n servicePoint: string,\r\n data: any,\r\n httpOptions?: HttpHeaders | null,\r\n responseType?: 'json' | 'blob'\r\n ): Observable<HttpResponse<T>>;\r\n}","import { Injectable } from '@angular/core';\r\n\r\n/**\r\n * Abstract service for handling notifications in **ECS Primeng table**.\r\n * \r\n * Provides a consistent interface for displaying and clearing toast notifications.\r\n * Implementations must define how the notifications are managed.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport abstract class ECSPrimengTableNotificationService {\r\n\r\n /**\r\n * Displays a toast notification.\r\n * \r\n * @param severity The severity level of the notification (e.g., 'success', 'info', 'warn', 'error').\r\n * @param title The title of the toast message.\r\n * @param message The detailed message of the toast.\r\n */\r\n abstract showToast(\r\n severity: string,\r\n title: string,\r\n message: string\r\n ): void;\r\n \r\n /**\r\n * Clears all currently displayed toast notifications.\r\n */\r\n abstract clearToasts(): void;\r\n}","import { DataAlignHorizontal } from \"../enums\";\r\n\r\n/**\r\n * Converts a `DataAlignHorizontal` enum value to its corresponding CSS text alignment string.\r\n *\r\n * @param dataAlignHorizontal - The horizontal alignment enum value.\r\n * @returns The CSS text alignment string ('left', 'center', or 'right').\r\n *\r\n * @remarks\r\n * If an unknown value is provided, the function defaults to 'center'.\r\n */\r\nexport function dataAlignHorizontalAsText(dataAlignHorizontal: DataAlignHorizontal): string {\r\n switch (dataAlignHorizontal) {\r\n case DataAlignHorizontal.Left:\r\n return 'left';\r\n case DataAlignHorizontal.Center:\r\n return 'center';\r\n case DataAlignHorizontal.Right:\r\n return 'right';\r\n default:\r\n return 'center';\r\n }\r\n}","import { DataAlignVertical } from \"../enums\";\r\n\r\n/**\r\n * Converts a `DataAlignVertical` enum value to its corresponding CSS vertical alignment string.\r\n *\r\n * @param dataAlignVertical - The vertical alignment enum value.\r\n * @returns The CSS vertical alignment string ('top', 'middle', or 'bottom').\r\n *\r\n * @remarks\r\n * If an unknown value is provided, the function defaults to 'middle'.\r\n */\r\nexport function dataAlignVerticalAsText(dataAlignVertical: DataAlignVertical): string {\r\n switch (dataAlignVertical) {\r\n case DataAlignVertical.Top:\r\n return 'top';\r\n case DataAlignVertical.Middle:\r\n return 'middle';\r\n case DataAlignVertical.Bottom:\r\n return 'bottom';\r\n default:\r\n return 'middle';\r\n }\r\n}","import { DataType } from \"../enums\";\r\n\r\n/**\r\n * Converts a `DataType` enum value to its corresponding string representation.\r\n *\r\n * @param dataType - The data type enum value.\r\n * @returns The string representation of the data type ('text', 'numeric', 'boolean', or 'date').\r\n *\r\n * @remarks\r\n * If an unknown value is provided, the function defaults to 'text'.\r\n */\r\nexport function dataTypeAsText(dataType: DataType): string {\r\n switch (dataType) {\r\n case DataType.Text:\r\n return 'text';\r\n case DataType.Numeric:\r\n return 'numeric';\r\n case DataType.Boolean:\r\n return 'boolean';\r\n case DataType.Date:\r\n return 'date';\r\n default:\r\n return 'text';\r\n }\r\n}","import { FrozenColumnAlign } from \"../enums\";\r\n\r\n/**\r\n * Converts a `FrozenColumnAlign` enum value to its corresponding CSS alignment string.\r\n *\r\n * @param frozenColumnAlign - The frozen column alignment enum value.\r\n * @returns The CSS alignment string ('left' or 'right').\r\n *\r\n * @remarks\r\n * If an unknown value is provided, the function defaults to 'left'.\r\n */\r\nexport function frozenColumnAlignAsText(frozenColumnAlign: FrozenColumnAlign): string {\r\n switch (frozenColumnAlign) {\r\n case FrozenColumnAlign.Left:\r\n return 'left';\r\n case FrozenColumnAlign.Right:\r\n return 'right';\r\n default:\r\n return 'left';\r\n }\r\n}","import { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { IColumnMetadata } from \"../interfaces\";\r\nimport { DataType } from \"../enums\";\r\n\r\n/**\r\n * Generates sanitized HTML (`SafeHtml`) with highlighted text based on a global search term.\r\n *\r\n * @remarks\r\n * This utility safely creates HTML content where occurrences of the provided global search text\r\n * within the cell value are wrapped in a `<span class=\"highlighted-text\">` tag for visual emphasis.\r\n * If the cell does not match the search text or is of type `Boolean`, the original value is returned as safe HTML.\r\n *\r\n * @param {any} cellValue - The cell's value that may contain the text to highlight.\r\n * @param {IColumnMetadata} colMetadata - Metadata configuration of the column that defines its data type and filtering behavior.\r\n * @param {string | null} globalSearchText - The search text to highlight if found within the cell's content.\r\n * @param {DomSanitizer} sanitizer - Angular's sanitizer used to safely produce trusted HTML content.\r\n * @returns {SafeHtml} A `SafeHtml` instance containing highlighted HTML when a match is found, or the original sanitized text otherwise.\r\n */\r\nexport function highlightText(cellValue: any, colMetadata: IColumnMetadata, globalSearchText: string | null, sanitizer: DomSanitizer): SafeHtml {\r\n if (colMetadata.dataType !== DataType.Boolean && globalSearchText !== null) { // Check if the column data type is not boolean and global search text is not null\r\n const valueToUse = String(cellValue); // Convert cell value to string\r\n if (colMetadata.canBeGlobalFiltered) { // Check if the column can be globally filtered\r\n const searchLowerCase = globalSearchText.toUpperCase(); // Convert global search text to uppercase for case-insensitive comparison\r\n const cellValueLowerCase = valueToUse.toUpperCase(); // Convert cell value to uppercase for case-insensitive comparison\r\n if (cellValueLowerCase.includes(searchLowerCase)) { // Check if the cell value contains the search text\r\n // Determine the start and end indices of the search text within the cell value\r\n const startIndex = cellValueLowerCase.indexOf(searchLowerCase);\r\n const endIndex = startIndex + globalSearchText.length;\r\n // Extract the prefix, highlight, and suffix of the cell value\r\n const prefix = valueToUse.substring(0, startIndex);\r\n const highlight = valueToUse.substring(startIndex, endIndex);\r\n const suffix = valueToUse.substring(endIndex);\r\n return sanitizer.bypassSecurityTrustHtml(`${prefix}<span class=\"highlighted-text\">${highlight}</span>${suffix}`); // Construct SafeHtml with highlighted text using the <mark> element\r\n }\r\n }\r\n }\r\n return sanitizer.bypassSecurityTrustHtml(String(cellValue)); // Return the original cell value if it doesn't meet the highlighting conditions\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { HttpHeaders, HttpResponse } from '@angular/common/http';\r\nimport { ECSPrimengTableHttpService, ECSPrimengTableNotificationService } from '../../services';\r\nimport { IColumnMetadata, IExcelExportRequest, IPredefinedFilter, ITableConfiguration, ITablePagedResponse, ITableView, ITableViewData } from '../../interfaces';\r\nimport { CellOverflowBehaviour, FrozenColumnAlign, TableViewSaveMode } from '../../enums';\r\nimport { ITableQueryRequest } from '../../interfaces/table-query-request.interface';\r\nimport { MenuItem } from 'primeng/api';\r\nimport { Table } from 'primeng/table';\r\nimport { DomHandler } from 'primeng/dom';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ECSPrimengTableService {\r\n constructor(\r\n private http: ECSPrimengTableHttpService,\r\n private notification: ECSPrimengTableNotificationService\r\n ) {}\r\n \r\n fetchTableConfiguration(url: string): Observable<HttpResponse<ITableConfiguration>>{\r\n return this.http.handleHttpGetRequest<ITableConfiguration>(url);\r\n }\r\n fetchTableData(url: string, postData: ITableQueryRequest): Observable<HttpResponse<ITablePagedResponse>>{\r\n return this.http.handleHttpPostRequest<ITablePagedResponse>(url, postData);\r\n }\r\n fetchExcelReport(url: string, postData: IExcelExportRequest): Observable<HttpResponse<Blob>>{\r\n let httpOptions = new HttpHeaders({\r\n 'accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n 'Content-Type': 'application/json'\r\n });\r\n return this.http.handleHttpPostRequest<Blob>(url, postData, httpOptions, \"blob\");\r\n }\r\n getIconBlob(url: string): Observable<HttpResponse<Blob>> {\r\n return this.http.handleHttpGetRequest<Blob>(url,\"blob\");\r\n }\r\n\r\n downloadFile(data: Blob, fileName: string, contentType: string) {\r\n const blob = new Blob([data], { type: contentType });\r\n const url = window.URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = fileName;\r\n link.click();\r\n window.URL.revokeObjectURL(url);\r\n }\r\n handleTableError(\r\n error: any,\r\n customTitle: string = 'Data Loading Error'\r\n ): void {\r\n const message = error.message || 'Unknown error occurred';\r\n this.notification.showToast('error', customTitle, message);\r\n }\r\n\r\n orderColumnsWithFrozens(colsToOrder: IColumnMetadata[]): IColumnMetadata[]{\r\n const frozenLeftColumns = colsToOrder.filter(col => col.frozenColumnAlign === FrozenColumnAlign.Left);\r\n const frozenRightColumns = colsToOrder.filter(col => col.frozenColumnAlign === FrozenColumnAlign.Right);\r\n const nonFrozenColumns = colsToOrder.filter(col => col.frozenColumnAlign === FrozenColumnAlign.Noone);\r\n return [...frozenLeftColumns, ...nonFrozenColumns, ...frozenRightColumns];\r\n }\r\n\r\n /**\r\n * Handles click events on action buttons in a row of data.\r\n * \r\n * @param {function} action - The action function to be executed when the button is clicked. It should accept one parameter, which is the row data.\r\n * @param {any} [rowData=null] - The data of the row corresponding to the clicked button. Defaults to null.\r\n * \r\n * @returns {void}\r\n * \r\n * @example\r\n * // Define an action for a button\r\n * const deleteAction = (rowData) => {\r\n * console.log(`Delete row with id: ${rowData.rowID}`);\r\n * };\r\n * \r\n * // Use handleButtonsClick with row data\r\n * handleButtonsClick(deleteAction, { rowID: 1, name: 'John Doe' });\r\n */\r\n handleButtonsClick(action: (rowData: any) => void, rowData: any = null): void {\r\n if (action) { // If the button has an assigned action\r\n action(rowData); // Perform the action\r\n }\r\n }\r\n\r\n handlePredefinedFilterClick(action: (rowData: any, option: IPredefinedFilter) => void, rowData: any = null, option: IPredefinedFilter): void {\r\n if (action) { // If the button has an assigned action\r\n action(rowData, option); // Perform the action\r\n }\r\n }\r\n\r\n getColumnStyle(col: any, headerCols: boolean = false): Record<string, string> {\r\n let styles: Record<string, string> = {};\r\n if (!headerCols) {\r\n switch (col.cellOverflowBehaviour) {\r\n case CellOverflowBehaviour.Wrap:\r\n styles['white-space'] = 'normal';\r\n styles['word-wrap'] = 'break-word';\r\n styles['word-break'] = 'break-all';\r\n styles['overflow'] = 'hidden';\r\n break;\r\n\r\n /*case CellOverflowBehaviour.Ellipsis:\r\n styles['white-space'] = 'nowrap';\r\n styles['overflow'] = 'hidden';\r\n styles['text-overflow'] = 'ellipsis';\r\n styles['width'] = '100%';\r\n styles['min-width'] = '100%';\r\n styles['max-width'] = '100%';\r\n break;*/\r\n /*\r\n display: block;\r\n width: 100%; \r\n text-align: center;\r\n */\r\n\r\n case CellOverflowBehaviour.Hidden:\r\n default:\r\n styles['white-space'] = 'nowrap';\r\n break;\r\n }\r\n }\r\n\r\n if (col.initialWidth > 0) {\r\n const width = `${col.initialWidth}px`;\r\n styles['width'] = width;\r\n styles['min-width'] = width;\r\n styles['max-width'] = width;\r\n }\r\n\r\n return styles;\r\n\r\n /*let styles: Record<string, string> = {};\r\n if(!headerCols){\r\n styles = {\r\n 'white-space': col.cellOverflowBehaviour === CellOverflowBehaviour.Wrap ? 'normal' : 'nowrap',\r\n 'word-wrap': col.cellOverflowBehaviour === CellOverflowBehaviour.Wrap ? 'break-word' : 'normal',\r\n 'word-break': col.cellOverflowBehaviour === CellOverflowBehaviour.Wrap ? 'break-all' : 'normal'\r\n };\r\n }\r\n if (col.initialWidth > 0) {\r\n styles['max-width'] = col.initialWidth + 'px';\r\n styles['min-width'] = col.initialWidth + 'px';\r\n styles['width'] = col.initialWidth + 'px';\r\n }\r\n return styles;*/\r\n }\r\n\r\n fetchTableViews(tableViewSaveAs: TableViewSaveMode, recoverListEndpoint: string, tableViewSaveKey: string): ITableView[] | Observable<HttpResponse<ITableView[]>>{\r\n let tableViewList: ITableView[] = [];\r\n let tableViewNotParsed: string | null = null;\r\n if(tableViewSaveKey !== \"\" && tableViewSaveKey !== ''){\r\n switch(tableViewSaveAs){\r\n case TableViewSaveMode.None:\r\n tableViewNotParsed = null;\r\n break;\r\n case TableViewSaveMode.SessionStorage:\r\n tableViewNotParsed = sessionStorage.getItem(tableViewSaveKey);\r\n break;\r\n case TableViewSaveMode.LocalStorage:\r\n tableViewNotParsed = localStorage.getItem(tableViewSaveKey);\r\n break;\r\n case TableViewSaveMode.DatabaseStorage:\r\n const postData: any = {\r\n tableViewSaveKey: tableViewSaveKey\r\n };\r\n return this.http.handleHttpPostRequest<ITableView[]>(recoverListEndpoint,postData);\r\n default:\r\n this.notification.showToast(\"error\",\"SAVE VIEW TYPE DOES NOT EXIST\", \"This type of save view does not exist.\");\r\n }\r\n }\r\n tableViewList = tableViewNotParsed ? JSON.parse(tableViewNotParsed) : [];\r\n this.sortViews(tableViewList);\r\n return tableViewList;\r\n }\r\n sortViews(tableSaveViewList: ITableView[]): void{\r\n tableSaveViewList.sort((a, b) => \r\n a.viewAlias.toLowerCase().localeCompare(b.viewAlias.toLowerCase())\r\n );\r\n }\r\n updateViewsMenuItems(tableSaveViewList: ITableView[]): MenuItem[]{\r\n return tableSaveViewList.map(item => ({\r\n label: item.viewAlias,\r\n lastActive: item.lastActive\r\n }));\r\n }\r\n viewsSaveToDatabase(tableSaveViewList: ITableView[], setListEndpoint: string, tableViewSaveKey: string): Observable<HttpResponse<any>>{\r\n const serializedSaveViews = tableSaveViewList.map(view => ({\r\n viewAlias: view.viewAlias,\r\n viewData: JSON.stringify(view.viewData),\r\n lastActive: view.lastActive\r\n }));\r\n const postData: any = {\r\n tableViewSaveKey: tableViewSaveKey,\r\n views: serializedSaveViews\r\n };\r\n return this.http.handleHttpPostRequest<any>(setListEndpoint,postData);\r\n }\r\n viewGenerateData(dt: Table, globalSearchText: string | null, currentPage: number, currentRowsPerPage: number, modifyFiltersFn: (filters: any) => any): ITableViewData{\r\n let colsWidth = this.computeColumnWidths(dt);\r\n let tableWidth = this.computeTableWidth(dt);\r\n const filtersWithoutGlobalAndSelectedRows = {...modifyFiltersFn(JSON.parse(JSON.stringify(dt.filters)))};\r\n if (filtersWithoutGlobalAndSelectedRows['rowID']) {\r\n filtersWithoutGlobalAndSelectedRows['rowID'][0].value = null;\r\n }\r\n if (filtersWithoutGlobalAndSelectedRows['selector']) {\r\n filtersWithoutGlobalAndSelectedRows['selector'][0].value = null;\r\n }\r\n const tableView: ITableViewData = {\r\n columnsShown: [...dt.columns!],\r\n multiSortMeta: dt.multiSortMeta,\r\n filters: {...filtersWithoutGlobalAndSelectedRows},\r\n globalSearchText: globalSearchText,\r\n currentPage: currentPage,\r\n currentRowsPerPage: currentRowsPerPage,\r\n tableWidth: tableWidth,\r\n columnsWidth: colsWidth\r\n }\r\n return tableView;\r\n }\r\n\r\n computeColumnWidths(dt: Table): any {\r\n let widths: number[] = [];\r\n const headers = dt.el.nativeElement.querySelectorAll('.p-datatable-thead > tr > th');\r\n headers.forEach((header: HTMLElement) => widths.push(DomHandler.getOuterWidth(header)));\r\n return widths.join(',');\r\n }\r\n\r\n computeTableWidth(dt: Table): any {\r\n let tableWidth = 0;\r\n if (dt.columnResizeMode === 'expand') {\r\n tableWidth = DomHandler.getOuterWidth(dt.tableViewChild?.nativeElement);\r\n }\r\n return tableWidth;\r\n }\r\n}","import { Component, Input } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml, SafeUrl } from '@angular/platform-browser';\r\nimport { SkeletonModule } from 'primeng/skeleton';\r\nimport { TagModule } from 'primeng/tag';\r\nimport { ECSPrimengTableService } from '../ecs-primeng-table/ecs-primeng-table.service';\r\nimport { highlightText } from '../../utils';\r\nimport { IColumnMetadata } from '../../interfaces';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'ecs-table-predefined-filters',\r\n imports: [\r\n SkeletonModule,\r\n TagModule,\r\n CommonModule\r\n ],\r\n standalone: true,\r\n templateUrl: './table-predefined-filters.html'\r\n})\r\nexport class TablePredefinedFilters {\r\n constructor(\r\n private sanitizer: DomSanitizer,\r\n private tableService: ECSPrimengTableService\r\n ) {}\r\n @Input() option: any;\r\n @Input() col: any;\r\n @Input() selectable: boolean = false;\r\n @Input() rowData: any;\r\n @Input() globalSearchText?: any;\r\n /**\r\n * Converts a blob from the database to a safe URL that can be used to display an image.\r\n *\r\n * This function takes a `Blob` object, converts it to a base64 encoded string, and returns a `SafeUrl` \r\n * that can be used in an HTML template to display the image securely. The `SafeUrl` ensures that \r\n * Angular's security mechanisms are bypassed correctly, preventing potential security risks.\r\n *\r\n * @param {Blob} blob - The blob object representing the image data from the database.\r\n * @returns {SafeUrl} A safe URL that can be used to display the image in an HTML template.\r\n * \r\n * @example\r\n * // Example usage in a component\r\n * const imageBlob = new Blob([binaryData], { type: 'image/jpeg' });\r\n * const imageUrl = this.getBlobIconAsUrl(imageBlob);\r\n * \r\n * // In your HTML template\r\n * <img [src]=\"imageUrl\" alt=\"Image\">\r\n */\r\n getBlobIconAsUrl(blob: Blob): SafeUrl {\r\n let objectURL = `data:image/jpeg;base64,${blob}`; // Create a base64 encoded string from the blob data\r\n return this.sanitizer.bypassSecurityTrustUrl(objectURL); // Bypass Angular's security mechanisms to create a SafeUrl\r\n }\r\n\r\n handleClick() {\r\n if (this.option.action) {\r\n this.tableService.handlePredefinedFilterClick(this.option.action, this.rowData, this.option);\r\n }\r\n }\r\n\r\n getTagStyle(option: any) {\r\n return {\r\n ...option.tagStyle,\r\n 'vertical-align': 'middle',\r\n 'gap': 0\r\n };\r\n }\r\n\r\n getImageSkeletonStyle(width?: number, height?: number, isSkeleton: boolean = false): Record<string, string> {\r\n const finalHeight = height && height > 0 ? `${height}px` : '22px'; // Compute final height; use default if invalid\r\n let finalWidth: string | undefined;\r\n if (width && width > 0) { // If width is valid, use it\r\n finalWidth = `${width}px`;\r\n } else if (isSkeleton) { // If it's a skeleton and width is not provided, mirror the height\r\n finalWidth = finalHeight;\r\n }\r\n const style: Record<string, string> = {\r\n 'vertical-align': 'middle',\r\n 'height': finalHeight\r\n };\r\n if (finalWidth) { // Add width if available\r\n style['width'] = finalWidth;\r\n }\r\n return style;\r\n }\r\n\r\n highlightText(cellValue: any, colMetadata: IColumnMetadata, globalSearchText: string | null | undefined ): SafeHtml {\r\n return highlightText(cellValue, colMetadata, globalSearchText ?? null, this.sanitizer);\r\n }\r\n}","<div style=\"display: flex; align-items: center; gap: 0.5rem;\"\r\n [style.cursor]=\"(selectable && option?.action) ? 'pointer' : 'default'\"\r\n [attr.role]=\"selectable && option?.action ? 'button' : null\"\r\n (click)=\"handleClick(); $event.stopPropagation();\">\r\n @if (option?.icon) {\r\n <i [class]=\"option.icon\" [style]=\"'vertical-align: middle; color: '+(option.iconColor || '') +';' +(option.iconStyle || '')\"></i>\r\n }\r\n @if (!option?.imageBlob && option?.imageBlobSourceEndpoint) { <!-- If a blob image needs to be loaded from endpoint, while it's still loading, show skeleton -->\r\n <p-skeleton [style]=\"getImageSkeletonStyle(option.imageWidth, option.imageHeight, true)\"/>\r\n }\r\n @if (option?.imageBlob) {\r\n <img alt=\"image\" [src]=\"getBlobIconAsUrl(option.imageBlob)\" [style]=\"getImageSkeletonStyle(option.imageWidth, option.imageHeight)\"/>\r\n }\r\n @if (option?.imageURL) {\r\n <img alt=\"iconFromURL\" [src]=\"option.imageURL\" [style]=\"getImageSkeletonStyle(option.imageWidth, option.imageHeight)\"/>\r\n }\r\n @if (option?.displayTag === true) {\r\n <p-tag [innerHtml]=\"highlightText(option.name, col, globalSearchText)\" [style]=\"getTagStyle(option)\" [value]=\"option.name\"/>\r\n }\r\n @if (option?.displayName === true) {\r\n <span style=\"gap: 0;\" [innerHtml]=\"highlightText(option.name, col, globalSearchText)\" [ngStyle]=\"option.nameStyle || {}\">{{ option.name }}</span>\r\n }\r\n</div>","import { Component, Input } from '@angular/core';\r\nimport { DataAlignHorizontal, DataAlignVertical, DataType } from '../../enums';\r\nimport { CommonModule, DatePipe } from '@angular/common';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { dataAlignHorizontalAsText, dataAlignVerticalAsText, highlightText } from '../../utils';\r\nimport { IColumnMetadata, IPredefinedFilter } from '../../interfaces';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { TablePredefinedFilters } from \"../table-predefined-filters/table-predefined-filters\";\r\n@Component({\r\n selector: 'ecs-table-cell',\r\n imports: [\r\n CommonModule,\r\n TooltipModule,\r\n TablePredefinedFilters\r\n],\r\n standalone: true,\r\n templateUrl: './table-cell.html'\r\n})\r\nexport class TableCell {\r\n constructor(\r\n private datePipe: DatePipe,\r\n private sanitizer: DomSanitizer\r\n ) {}\r\n @Input() col: any;\r\n @Input() rowData: any;\r\n @Input() globalSearchText: string | null = null;\r\n @Input() predefinedFiltersCollection?: { [key: string]: IPredefinedFilter[] } = {}; // Contains a collection of the values that need to be shown for predefined column filters\r\n @Input() dateFormat: string = \"dd-MMM-yyyy HH:mm:ss zzzz\";\r\n @Input() dateTimezone: string = \"+00:00\";\r\n @Input() dateCulture: string = \"en-US\";\r\n\r\n DataType = DataType;\r\n\r\n get value() {\r\n return this.rowData[this.col.field];\r\n }\r\n\r\n get tooltipText() {\r\n if (this.col.dataTooltipCustomColumnSource && this.col.dataTooltipCustomColumnSource.length > 0) {\r\n return this.rowData[this.col.dataTooltipCustomColumnSource];\r\n }\r\n return this.value;\r\n }\r\n\r\n getListValues(col: any, rowData: any): string[] {\r\n const value = rowData[col.field];\r\n return value ? value.split(';').map((v: any) => v.trim()) : [];\r\n }\r\n\r\n getDataAlignHorizontalAsText(dataAlignHorizontal: DataAlignHorizontal){\r\n dataAlignHorizontalAsText(dataAlignHorizontal);\r\n }\r\n getDataAlignVerticalAsText(dataAlignVertical: DataAlignVertical){\r\n dataAlignVerticalAsText(dataAlignVertical);\r\n }\r\n \r\n\r\n /**\r\n * Formats a date value using either column-level overrides or global settings.\r\n * The incoming value is assumed to represent a UTC date.\r\n *\r\n * @param {any} value - The date value to be formatted.\r\n * @param {string | null} dateFormat - Optional column-level override for the date format.\r\n * @param {string | null} dateTimezone - Optional column-level override for the timezone used in formatting.\r\n * @param {string | null} dateCulture - Optional column-level override for the culture used in formatting.\r\n *\r\n * @returns {string} - The formatted date string using the effective (column or global) settings,\r\n * or an empty string if the value is invalid or undefined.\r\n *\r\n * @example\r\n * // Example using only global settings:\r\n * const result = formatDate(dateValue, null, null, null);\r\n *\r\n * @example\r\n * // Example using column-level overrides:\r\n * const result = formatDate(dateValue, 'dd/MM/yyyy', 'UTC', 'en-GB');\r\n */\r\n formatDate(value: any, dateFormat: string | null, dateTimezone : string | null, dateCulture : string | null): string{\r\n if(!value){ // If no value, return empty\r\n return '';\r\n }\r\n let formattedDate = undefined; // By default, formattedDate will be undefined\r\n const effectiveFormat = dateFormat ?? this.dateFormat;\r\n const effectiveTimezone = dateTimezone ?? this.dateTimezone;\r\n const effectiveCulture = dateCulture ?? this.dateCulture;\r\n if(value){ // If value is not undefined\r\n const dateUtc = new Date(value + 'Z'); // Make sure the date is treated as UTC\r\n formattedDate = this.datePipe.transform(dateUtc, effectiveFormat, effectiveTimezone, effectiveCulture); // Perform the date masking\r\n }\r\n return formattedDate ?? ''; // Returns the date formatted, or as empty string if an issue was found (or value was undefined).\r\n }\r\n\r\n getPredefinedFilterTooltip(colMetadata: IColumnMetadata, value: any): any {\r\n if(colMetadata.dataType == DataType.List){\r\n return value;\r\n }\r\n if(colMetadata.filterPredefinedValuesName && colMetadata.filterPredefinedValuesName.length > 0){\r\n const options = this.getPredefinedFilterValues(colMetadata.filterPredefinedValuesName);\r\n return options.find(x => x.value == value)?.name\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Checks if the provided column metadata matches a specific style of the predefined filters \r\n * that need to be applied to an item on a row.\r\n *\r\n * @param {IprimengColumnsMetadata} colMetadata - The metadata of the column being checked.\r\n * @param {any} value - The value to be matched against the predefined filter values.\r\n * @returns {any} The matching predefined filter value if found, otherwise null.\r\n */\r\n getPredfinedFilterMatch(colMetadata: IColumnMetadata, value: any): any {\r\n if (colMetadata.filterPredefinedValuesName && colMetadata.filterPredefinedValuesName.length > 0) { // Check if the column uses predefined filter values\r\n const options = this.getPredefinedFilterValues(colMetadata.filterPredefinedValuesName); // Get the predefined filter values based on the name\r\n return options.find(option => option.value === value); // Return the matching option if found\r\n }\r\n return null; // Return null if the column does not use predefined filter values\r\n }\r\n getPredefinedFilterValues(columnKeyName: string): IPredefinedFilter[] {\r\n return this.predefinedFiltersCollection?.[columnKeyName] || []; // Return the predefined filter values or an empty array if the option name does not exist\r\n }\r\n\r\n highlightText(cellValue: any, colMetadata: IColumnMetadata, globalSearchText: string | null): SafeHtml {\r\n return highlightText(cellValue, colMetadata, globalSearchText, this.sanitizer);\r\n }\r\n}","@if (value !== null && value !== undefined) {\r\n @if (col.filterPredefinedValuesName && col.filterPredefinedValuesName.length > 0) {\r\n <div [ngStyle]=\"{\r\n 'justify-content': getDataAlignHorizontalAsText(col.dataAlignHorizontal),\r\n 'align-items': getDataAlignVerticalAsText(col.dataAlignVertical)\r\n }\">\r\n @if (col.dataType === DataType.List){\r\n @for (item of getListValues(col, rowData); track item) {\r\n @if (getPredfinedFilterMatch(col, item); as option) {\r\n <div style=\"display: inline-block; margin-right: 0.5rem;\"\r\n [pTooltip]=\"col.dataTooltipCustomColumnSource && col.dataTooltipCustomColumnSource.length > 0 \r\n ? rowData[col.dataTooltipCustomColumnSource] \r\n : item\"\r\n [tooltipDisabled]=\"!col.dataTooltipShow\"\r\n [showDelay]=\"700\"\r\n tooltipPosition=\"top\">\r\n <ecs-table-predefined-filters [option]=\"option\" [col]=\"col\" [selectable]=\"true\" [rowData]=\"rowData\" [globalSearchText]=\"globalSearchText\"/>\r\n </div>\r\n }\r\n }\r\n } @else {\r\n @if (getPredfinedFilterMatch(col, value); as option) {\r\n <div style=\"display: inline-block;\"\r\n [pTooltip]=\"col.dataTooltipCustomColumnSource && col.dataTooltipCustomColumnSource.length > 0 \r\n ? rowData[col.dataTooltipCustomColumnSource] \r\n : value\"\r\n [tooltipDisabled]=\"!col.dataTooltipShow\"\r\n [showDelay]=\"700\"\r\n tooltipPosition=\"top\">\r\n <ecs-table-predefined-filters [option]=\"option\" [col]=\"col\" [selectable]=\"true\" [rowData]=\"rowData\" [globalSearchText]=\"globalSearchText\"/>\r\n </div>\r\n }\r\n }\r\n </div>\r\n } @else {\r\n @switch (col.dataType) {\r\n @case (DataType.Boolean) {\r\n <i class=\"pi\"\r\n [pTooltip]=\"col.dataTooltipCustomColumnSource && col.dataTooltipCustomColumnSource.length > 0 \r\n ? rowData[col.dataTooltipCustomColumnSource] \r\n : value\"\r\n [tooltipDisabled]=\"!col.dataTooltipShow || !col.dataTooltipCustomColumnSource || col.dataTooltipCustomColumnSource.length === 0\"\r\n [showDelay]=\"700\"\r\n tooltipPosition=\"top\"\r\n [style.color]=\"value ? 'green' : 'red'\"\r\n [ngClass]=\"{ 'pi-check-circle': value, 'pi-times-circle': !value }\">\r\n </i>\r\n }\r\n @case (DataType.Date) {\r\n <div \r\n [innerHtml]=\"highlightText(formatDate(value, col.dateFormat, col.dateTimezone, col.dateCulture), col, globalSearchText)\"\r\n [pTooltip]=\"col.dataTooltipCustomColumnSource && col.dataTooltipCustomColumnSource.length > 0 \r\n ? rowData[col.dataTooltipCustomColumnSource] \r\n : formatDate(value, col.dateFormat, col.dateTimezone, col.dateCulture)\"\r\n [tooltipDisabled]=\"!col.dataTooltipShow\"\r\n [showDelay]=\"700\"\r\n tooltipPosition=\"top\">\r\n {{ formatDate(value, col.dateFormat, col.dateTimezone, col.dateCulture) }}\r\n </div>\r\n }\r\n @default {\r\n <div\r\n [innerHtml]=\"highlightText(value, col, globalSearchText)\"\r\n [pTooltip]=\"col.dataTooltipCustomColumnSource && col.dataTooltipCustomColumnSource.length > 0 \r\n ? rowData[col.dataTooltipCustomColumnSource] \r\n : value\"\r\n [tooltipDisabled]=\"!col.dataTooltipShow\"\r\n [showDelay]=\"700\"\r\n tooltipPosition=\"top\">\r\n {{ value }}\r\n </div>\r\n }\r\n }\r\n }\r\n}","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { ECSPrimengTableService } from '../ecs-primeng-table/ecs-primeng-table.service';\r\n\r\n@Component({\r\n selector: 'ecs-table-button',\r\n imports: [\r\n CommonModule,\r\n ButtonModule,\r\n TooltipModule\r\n ],\r\n standalone: true,\r\n templateUrl: './table-button.html',\r\n styleUrl: './table-button.scss'\r\n})\r\nexport class TableButton {\r\n constructor(\r\n private tableService: ECSPrimengTableService\r\n ) {}\r\n @Input() button: any;\r\n @Input() rowData: any;\r\n @Input() isActionButton: boolean = false;\r\n @Input() isLastActionButton: boolean = false;\r\n\r\n handleClick() {\r\n if (this.button.action) {\r\n this.tableService.handleButtonsClick(this.button.action, this.rowData);\r\n }\r\n }\r\n}\r\n","@if(button.visibleCondition?.(rowData) ?? true){ <!--If 'visibleCondition' is true or not defined-->\r\n @if((button.enabledCondition?.(rowData) ?? true) || !button.conditionFailHide){ <!--Render button if 'enabledCondition' is true or undefined, OR if 'conditionFailHide' is false-->\r\n <p-button\r\n [disabled]=\"!(button.enabledCondition?.(rowData) ?? true)\"\r\n [rounded]=\"button.rounded || false\"\r\n [iconPos]=\"button.iconPos || 'left'\"\r\n [raised]=\"button.raised || false\"\r\n [variant]=\"button.variant || null\"\r\n [pTooltip]=\"button.tooltip || ''\"\r\n [tooltipDisabled]=\"!button.tooltip || button.tooltip.length === 0\"\r\n [showDelay]=\"700\"\r\n tooltipPosition=\"top\"\r\n [styleClass]=\"(button.color || 'p-button-outlined') + (isActionButton ? ' custom-small-btn' : '') + (button.style || '')\"\r\n [icon]=\"button.icon || ''\"\r\n [label]=\"button.label || ''\"\r\n [size]=\"isActionButton ? 'small': undefined\"\r\n [ngStyle]=\"isActionButton && !isLastActionButton ? {'margin-right':'10px'} : {}\"\r\n (onClick)=\"handleClick()\"/>\r\n }\r\n}","import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { DialogModule } from 'primeng/dialog';\r\nimport { Table, TableModule } from 'primeng/table';\r\nimport { CheckboxModule } from 'primeng/checkbox';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { SelectButtonModule } from 'primeng/selectbutton';\r\nimport { CellOverflowBehaviour, DataAlignHorizontal, DataAlignVertical } from '../../enums';\r\nimport { InputIconModule } from 'primeng/inputicon';\r\nimport { IconFieldModule } from 'primeng/iconfield';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { IColumnMetadata } from '../../interfaces';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\n\r\n\r\n@Component({\r\n selector: 'ecs-column-selector',\r\n imports: [\r\n DialogModule,\r\n TableModule,\r\n CheckboxModule,\r\n ButtonModule,\r\n SelectButtonModule,\r\n CommonModule,\r\n FormsModule,\r\n InputIconModule,\r\n IconFieldModule,\r\n InputTextModule,\r\n TooltipModule\r\n ],\r\n standalone: true,\r\n templateUrl: './column-selector.html'\r\n})\r\nexport class ColumnSelector {\r\n @ViewChild('dt_columnDialog') dt_columnDialog!: Table;\r\n \r\n @Input() visible: boolean = false;\r\n @Input() columnModalData: any[] = [];\r\n @Input() filteredColumnData: any[] = [];\r\n\r\n @Output() visibleChange = new EventEmitter<boolean>();\r\n @Output() applyChanges = new EventEmitter<IColumnMetadata[]>(); \r\n\r\n cellOverflowBehaviourOptions = [\r\n {icon: 'pi pi-minus', val: CellOverflowBehaviour.Hidden, name: \"Hidden\"},\r\n {icon: 'pi pi-equals', val: CellOverflowBehaviour.Wrap, name: \"Wrap\"}/*,\r\n {icon: 'pi pi-ellipsis-h', val: CellOverflowBehaviour.Ellipsis, name: \"Ellipsis\"}*/\r\n ];\r\n dataAlignHorizontalOptions = [\r\n {icon: 'pi pi-align-left', val: DataAlignHorizontal.Left, name: \"Left\"},\r\n {icon: 'pi pi-align-center', val: DataAlignHorizontal.Center, name: \"Center\"},\r\n {icon: 'pi pi-align-right', val: DataAlignHorizontal.Right, name: \"Right\"}\r\n ];\r\n dataAlignVerticalOptions = [\r\n {icon: 'pi pi-angle-up', val: DataAlignVertical.Top, name: \"Top\"},\r\n {icon: 'pi pi-align-justify', val: DataAlignVertical.Middle, name: \"Middle\"},\r\n {icon: 'pi pi-angle-down', val: DataAlignVertical.Bottom, name: \"Bottom\"}\r\n ];\r\n\r\n globalSearchText: string | null = null; // The text used by the global search\r\n globalSearchMaxLength: number = 50;\r\n onColumnModalFilter(event: any) {\r\n const filterValue = event.filters && event.filters.global \r\n ? event.filters.global.value.toLowerCase() \r\n : ''; \r\n this.filteredColumnData = this.columnModalData.filter(column => \r\n column.header.toLowerCase().includes(filterValue)\r\n );\r\n }\r\n\r\n allColumnsCheckboxActive(): boolean{\r\n return this.columnModalData.every(column => column.selected);\r\n }\r\n\r\n allColumnsCheckboxClick(event: any): void{\r\n if(event.checked){\r\n this.columnModalData.forEach(column => {column.selected = true;});\r\n } else {\r\n this.columnModalData.forEach(column => {\r\n if (!column.selectDisabled) {\r\n column.selected = false;\r\n }\r\n });\r\n }\r\n }\r\n\r\n filterColumnModal(event: any) {\r\n let filterValue = event.target.value;\r\n this.dt_columnDialog.filterGlobal(filterValue, 'contains');\r\n }\r\n\r\n applyColumnModalChanges(){\r\n const selected = this.columnModalData.filter(c => c.selected && !c.selectDisabled);\r\n this.applyChanges.emit(selected);\r\n this.closeModal();\r\n }\r\n clearGlobalFilter(dt: Table){\r\n this.globalSearchText=null;\r\n dt.filterGlobal('','');\r\n }\r\n closeModal(){\r\n this.globalSearchText=null;\r\n this.visibleChange.emit(false);\r\n }\r\n}\r\n","<!--COLUMN MODAL DIALOG-->\r\n<p-dialog [(visible)]=\"visible\" [modal]=\"true\" [draggable]=\"false\" [resizable]=\"false\" [closeOnEscape]=\"false\" [closable]=\"false\" [maximizable]=\"false\" [style]=\"{'min-width': '65vw', 'max-width': '65vw'}\">\r\n <ng-template pTemplate=\"header\">\r\n <span class=\"white-space-nowrap\"><b>MODIFY COLUMNS</b></span>\r\n </ng-template>\r\n <div style=\"padding: 10px;\">\r\n <p-table #dt_columnDialog [value]=\"columnModalData\" [scrollable]=\"true\" size=\"small\" showGridlines stripedRows \r\n [globalFilterFields]=\"['header']\" scrollHeight=\"calc(80vh - 220px)\" (onFilter)=\"onColumnModalFilter($event)\">\r\n <ng-template #caption>\r\n <div style=\"display: flex; justify-content: space-between; align-items: center;\">\r\n <div style=\"display: flex; align-items: center; gap: 10px\">\r\n <p-checkbox inputId=\"selectAll\" [binary]=\"true\" [ngModel]=\"allColumnsCheckboxActive()\" (onChange)=\"allColumnsCheckboxClick($event)\"></p-checkbox>\r\n <label for=\"selectAll\">Select all columns</label>\r\n </div>\r\n <div style=\"display: flex; align-items: center;\">\r\n <p-iconField iconPosition=\"left\" [ngClass]=\"{'p-input-icon-right': globalSearchText}\">\r\n <p-inputIcon>\r\n <i class=\"pi pi-search\"></i>\r\n </p-inputIcon>\r\n <input pInputText type=\"text\" \r\n (input)=\"filterColumnModal($event)\" autocomplete=\"off\" \r\n [maxlength]=\"globalSearchMaxLength\" placeholder=\"Search column name\" [(ngModel)]=\"globalSearchText\"\r\n style=\"width: 220px;\"/>\r\n <!-- Right icon (only if there is text) -->\r\n @if (globalSearchText) {\r\n <p-inputIcon position=\"right\">\r\n <i class=\"pi pi-times\" style=\"cursor: pointer;\" (click)=\"clearGlobalFilter(dt_columnDialog); $event.stopPropagation()\"></i>\r\n </p-inputIcon>\r\n }\r\n </p-iconField>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template #header>\r\n <tr>\r\n <th pFrozenColumn style=\"max-width: 100px; min-width: 100px; width: 100px; text-align: center;\">Show column</th>\r\n <th pFrozenColumn style=\"max-width: 250px; min-width: 250px; width: 250px; text-align: center;\">Column name</th>\r\n <th style=\"max-width: 150px; min-width: 150px; width: 150px; text-align: center;\">Cell overflow behaviour</th>\r\n <th style=\"max-width: 160px; min-width: 160px; width: 160px; text-align: center;\">Horizontal aligment</th>\r\n <th style=\"max-width: 150px; min-width: 150px; width: 150px; text-align: center;\">Vertical aligment</th>\r\n </tr>\r\n </ng-template>\r\n <ng-template #body let-rowData>\r\n <tr>\r\n <td pFrozenColumn style=\"max-width: 100px; min-width: 100px; width: 100px; text-align: center;\">\r\n <p-checkbox \r\n [(ngModel)]=\"rowData.selected\" \r\n [binary]=\"true\"\r\n [disabled]=\"rowData.selectDisabled\"/>\r\n </td>\r\n <td pFrozenColumn style=\"max-width: 250px; min-width: 250px; width: 250px;\">{{rowData.header}}</td>\r\n <td style=\"max-width: 150px; min-width: 150px; width: 150px; text-align: center;\">\r\n <p-selectButton [(ngModel)]=\"rowData.cellOverflowBehaviour\" [options]=\"cellOverflowBehaviourOptions\" optionValue=\"val\" optionLabel=\"icon\" [disabled]=\"rowData.cellOverflowBehaviourDisabled\" allowEmpty=\"false\">\r\n <ng-template #item let-item>\r\n <i [class]=\"item.icon\" style=\"margin: -20px;\" [pTooltip]=\"item.name\" [showDelay]=\"400\" tooltipPosition=\"top\"></i>\r\n </ng-template>\r\n </p-selectButton>\r\n </td>\r\n <td style=\"max-width: 160px; min-width: 160px; width: 160px; text-align: center;\">\r\n <p-selectButton [(ngModel)]=\"rowData.dataAlignHorizontal\" [options]=\"dataAlignHorizontalOptions\" optionValue=\"val\" optionLabel=\"icon\" [disabled]=\"rowData.dataAlignHorizontalDisabled\" allowEmpty=\"false\">\r\n <ng-template #item let-item>\r\n <i [class]=\"item.icon\" style=\"margin: -20px;\" [pTooltip]=\"item.name\" [showDelay]=\"400\" tooltipPosition=\"top\"></i>\r\n </ng-template>\r\n </p-selectButton>\r\n </td>\r\n <td style=\"max-width: 150px; min-width: 150px; width: 150px; text-align: center;\">\r\n <p-selectButton [(ngModel)]=\"rowData.dataAlignVertical\" [options]=\"dataAlignVerticalOptions\" optionValue=\"val\" optionLabel=\"icon\" [disabled]=\"rowData.dataAlignVerticalDisabled\" allowEmpty=\"false\">\r\n <ng-template #item let-item>\r\n <i [class]=\"item.icon\" style=\"margin: -20px;\" [pTooltip]=\"item.name\" [showDelay]=\"400\" tooltipPosition=\"top\"></i>\r\n </ng-template>\r\n </p-selectButton>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template #emptymessage>\r\n <tr>\r\n <td colspan=\"999\">There are no columns</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div style=\"display: flex; flex-direction: row; justify-content: space-between; align-items: center; margin-top: 10px;\">\r\n Showing {{filteredColumnData ? filteredColumnData.length : 0}} columns of {{columnModalData ? columnModalData.length : 0}} available columns\r\n </div>\r\n </div>\r\n <ng-template pTemplate=\"footer\" style=\"display: flex; justify-content: space-between; align-items: center;\">\r\n <p-button (click)=\"closeModal()\" label=\"Cancel changes\" outlined=\"true\" [style]=\"{'margin-top': '10px'}\"></p-button>\r\n <p-button (click)=\"applyColumnModalChanges()\" label=\"Save changes\" [style]=\"{'margin-top': '10px'}\"></p-button>\r\n </ng-template>\r\n</p-dialog>","import { Injectable } from \"@angular/core\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ExportExcelService {\r\n getCurrentTimeString(): string {\r\n const now = new Date();\r\n const year = now.getUTCFullYear();\r\n const month = String(now.getUTCMonth() + 1).padStart(2, '0');\r\n const day = String(now.getUTCDate()).padStart(2, '0');\r\n const hours = String(now.getUTCHours()).padStart(2, '0');\r\n const minutes = String(now.getUTCMinutes()).padStart(2, '0');\r\n const seconds = String(now.getUTCSeconds()).padStart(2, '0');\r\n return `_${year}${month}${day}_${hours}${minutes}${seconds}_UTC`;\r\n }\r\n}","import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { DialogModule } from 'primeng/dialog';\r\nimport { SelectButton, SelectButtonChangeEvent } from 'primeng/selectbutton';\r\nimport { ECSPrimengTableNotificationService } from '../../services';\r\nimport { ExportExcelService } from './export-excel.service';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { CheckboxModule } from 'primeng/checkbox';\r\n\r\n@Component({\r\n selector: 'ecs-export-excel',\r\n imports: [\r\n DialogModule,\r\n FormsModule,\r\n ButtonModule,\r\n SelectButton,\r\n InputTextModule,\r\n TooltipModule,\r\n CheckboxModule\r\n ],\r\n standalone: true,\r\n templateUrl: './export-excel.html'\r\n})\r\nexport class ExportExcel implements OnChanges {\r\n @Input() visible: boolean = false;\r\n @Input() rowCheckboxSelectorActive: boolean = false;\r\n @Input() excelReportTitle: string = \"\";\r\n includeTimeInTitle: boolean = true;\r\n exportUseIconsInBools: boolean = false;\r\n @Input() allowTitleUserEdit: boolean = false;\r\n @Output() exportToExcel = new EventEmitter<{\r\n allColumns: boolean,\r\n applyFilters: boolean,\r\n applySorts: boolean,\r\n selectedRows: number,\r\n filename: string,\r\n useIconInBools: boolean\r\n }>();\r\n @Output() visibleChange = new EventEmitter<boolean>();\r\n\r\n constructor(\r\n private notificationSerivce: ECSPrimengTableNotificationService,\r\n private exportExcelService: ExportExcelService\r\n ) {}\r\n\r\n option_exportColumns_selected: boolean = false;\r\n option_exportColumns: any[] = [\r\n { label: 'Only visible', value: false },\r\n { label: 'All columns', value: true }\r\n ];\r\n\r\n option_applyCurrentFilters_selected: boolean = false;\r\n option_applyCurrentFilters: any[] = [\r\n { label: 'No filters', value: false },\r\n { label: 'Apply current filters', value: true }\r\n ];\r\n\r\n option_applyCurrentSorts_selected: boolean = false;\r\n option_applyCurrentSorts: any[] = [\r\n { label: 'No sorts', value: false },\r\n { label: 'Apply current sorts', value: true }\r\n ];\r\n\r\n option_selectedRowsExport_selected: number = 0;\r\n option_selectedRowsExport: any[] = [\r\n { label: 'All rows', value: 0 },\r\n { label: 'Selected rows', value: 1 },\r\n { label: 'Not selected rows', value: 2 }\r\n ];\r\n \r\n ngOnChanges(changes: SimpleChanges) {\r\n // If visible changes from false to true, reset values\r\n if (changes['visible'] && changes['visible'].currentValue === true && changes['visible'].previousValue === false) {\r\n this.resetValues();\r\n }\r\n }\r\n\r\n private resetValues() {\r\n this.includeTimeInTitle = true;\r\n this.exportUseIconsInBools = false;\r\n this.option_exportColumns_selected = false;\r\n this.option_applyCurrentFilters_selected = false;\r\n this.option_applyCurrentSorts_selected = false;\r\n this.option_selectedRowsExport_selected = 0;\r\n }\r\n \r\n getExcelReport(){\r\n let excelReportFinalTitle: string = \"\";\r\n this.excelReportTitle=this.excelReportTitle?.trim();\r\n if (!this.excelReportTitle || this.excelReportTitle.length <= 0) {\r\n this.notificationSerivce.clearToasts();\r\n this.notificationSerivce.showToast(\"error\", \"REPORT NAME NOT VALID\", \"The report name is not valid\");\r\n return; \r\n }\r\n const allowedPattern = /^[A-Za-z0-9 _-]*$/;\r\n if (!allowedPattern.test(this.excelReportTitle)) {\r\n this.notificationSerivce.clearToasts();\r\n this.notificationSerivce.showToast(\"error\", \"INVALID CHARACTERS IN REPORT NAME\", \"The report name contains invalid characters.\");\r\n return;\r\n }\r\n if(this.includeTimeInTitle){\r\n excelReportFinalTitle = this.excelReportTitle + this.exportExcelService.getCurrentTimeString() + \".xlsx\";\r\n } else {\r\n excelReportFinalTitle = this.excelReportTitle + \".xlsx\";\r\n }\r\n this.exportToExcel.emit({\r\n allColumns: this.option_exportColumns_selected,\r\n applyFilters: this.option_applyCurrentFilters_selected,\r\n applySorts: this.option_applyCurrentSorts_selected,\r\n selectedRows: this.option_selectedRowsExport_selected,\r\n filename: excelReportFinalTitle,\r\n useIconInBools: this.exportUseIconsInBools\r\n });\r\n }\r\n\r\n filterSelectorDisabled(): boolean{\r\n return this.option_selectedRowsExport_selected >= 1;\r\n }\r\n\r\n onChangeExportRows(event: SelectButtonChangeEvent): void{\r\n if(event.value>=1){\r\n this.option_applyCurrentFilters_selected=true;\r\n }\r\n }\r\n\r\n closeModal(){\r\n this.visibleChange.emit(false);\r\n }\r\n}","<p-dialog [(visible)]=\"visible\" [modal]=\"true\" [draggable]=\"false\" [resizable]=\"false\"\r\n [closable]=\"false\" [closeOnEscape]=\"false\" [maximizable]=\"false\" [style]=\"{'min-width': '70vw', 'max-width': '70vw'}\">\r\n <ng-template pTemplate=\"header\">\r\n <div>\r\n <span class=\"p-dialog-title\">Export data to Excel</span>\r\n </div>\r\n </ng-template>\r\n <div style=\"display: grid; grid-template-columns: 4fr 8fr; gap: 1rem; align-items: center; margin-top: 10px;\">\r\n <div style=\"justify-self: end;\">\r\n Report filename\r\n </div>\r\n <div style=\"justify-self: stretch; width: 100%;\">\r\n <input pInputText id=\"reportTitle\" [(ngModel)]=\"excelReportTitle\" autocomplete=\"off\" style=\"width: 100%;\" [disabled]=\"!allowTitleUserEdit\" maxlength=\"100\"/>\r\n </div>\r\n\r\n <div style=\"justify-self: end;\">\r\n <i pTooltip=\"Activating this option will add the current <b>'_{year}{month}{day}_{hours}{minutes}{seconds}_UTC'</b> at the end of your filename.\" \r\n tooltipPosition=\"top\" \r\n [escape]=\"false\"\r\n class=\"pi pi-info-circle\">\r\n </i>\r\n Include time in report filename?\r\n </div>\r\n <div style=\"justify-self: stretch; width: 100%;\">\r\n <p-checkbox [binary]=\"true\" [(ngModel)]=\"includeTimeInTitle\"/>\r\n </div>\r\n\r\n <div style=\"justify-self: end;\">\r\n <i pTooltip=\"Activating this option will make boolean values be shown as icons in the Excel report:<br>True → <span class='bool-icon bool-true'>✔</span><br>False → <span class='bool-icon bool-false'>✘</span>\" \r\n tooltipPosition=\"top\" \r\n tooltipStyleClass=\"excel-export-tooltip\"\r\n [escape]=\"false\"\r\n class=\"pi pi-info-circle\">\r\n </i>\r\n Use icons in boolean fields?\r\n </div>\r\n <div style=\"justify-self: stretch; width: 100%;\">\r\n <p-checkbox [binary]=\"true\" [(ngModel)]=\"exportUseIconsInBools\"/>\r\n </div>\r\n \r\n <div style=\"justify-self: end;\">\r\n Export columns\r\n </div>\r\n <div style=\"justify-self: start;\">\r\n <p-selectButton [(ngModel)]=\"option_exportColumns_selected\" [options]=\"option_exportColumns\" optionLabel=\"label\" optionValue=\"value\" allowEmpty=\"false\"/>\r\n </div>\r\n\r\n <div style=\"justify-self: end;\">\r\n @if(filterSelectorDisabled()){\r\n <i pTooltip=\"Sorts are active because you want to export selected rows following a filter criteria\" tooltipPosition=\"top\" class=\"pi pi-info-circle\"></i>\r\n }\r\n Filters to apply\r\n </div>\r\n <div style=\"justify-self: start;\">\r\n <p-selectButton [(ngModel)]=\"option_applyCurrentFilters_selected\" [options]=\"option_applyCurrentFilters\" optionLabel=\"label\" optionValue=\"value\" allowEmpty=\"false\" [disabled]=\"filterSelectorDisabled()\"/>\r\n </div>\r\n\r\n <div style=\"justify-self: end;\">\r\n Sorts to apply\r\n </div>\r\n <div style=\"justify-self: start;\">\r\n <p-selectButton [(ngModel)]=\"option_applyCurrentSorts_selected\" [options]=\"option_applyCurrentSorts\" optionLabel=\"label\" optionValue=\"value\" allowEmpty=\"false\"/>\r\n </div>\r\n\r\n @if(rowCheckboxSelectorActive){\r\n <div style=\"justify-self: end;\">\r\n Selected rows\r\n </div>\r\n <div style=\"justify-self: start;\">\r\n <p-selectButton [(ngModel)]=\"option_selectedRowsExport_selected\" [options]=\"option_selectedRowsExport\" optionLabel=\"label\" optionValue=\"value\" allowEmpty=\"false\" (onChange)=\"onChangeExportRows($event)\"/>\r\n </div>\r\n }\r\n </div>\r\n <ng-template pTemplate=\"footer\" style=\"display: flex; justify-content: space-between; align-items: center;\">\r\n <p-button (click)=\"closeModal()\" label=\"Cancel export\" outlined=\"true\" [style]=\"{'margin-top': '20px'}\"/>\r\n <p-button (click)=\"getExcelReport()\" label=\"Export\" [style]=\"{'margin-top': '20px'}\"/>\r\n </ng-template>\r\n</p-dialog>","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { DialogModule } from 'primeng/dialog';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { TableModule } from 'primeng/table';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { ECSPrimengTableNotificationService } from '../../services';\r\nimport { CheckboxModule } from 'primeng/checkbox';\r\n@Component({\r\n selector: 'ecs-views-management',\r\n imports: [\r\n DialogModule,\r\n TableModule,\r\n ButtonModule,\r\n CommonModule,\r\n FormsModule,\r\n TooltipModule,\r\n InputTextModule,\r\n CheckboxModule\r\n ],\r\n standalone: true,\r\n templateUrl: './views-management.html'\r\n})\r\nexport class ViewsManagement {\r\n constructor(\r\n private notification: ECSPrimengTableNotificationService\r\n ) {}\r\n @Input() visible: boolean = false;\r\n @Input() tableViews_menuItems: any[] = [];\r\n @Output() onViewSelect = new EventEmitter<string>();\r\n @Output() onViewDelete = new EventEmitter<string>();\r\n @Output() onViewUpdateData = new EventEmitter<string>();\r\n @Output() onViewUpdateActiveStartup = new EventEmitter<string>();\r\n @Output() onViewEditAlias = new EventEmitter<{ viewAliasOld: string; viewAliasNew: string }>();\r\n @Output() onViewCreate = new EventEmitter<string>();\r\n @Output() visibleChange = new EventEmitter<boolean>();\r\n viewEditorShow: boolean = false;\r\n editingViewAlias: string = '';\r\n newViewAlias: string = '';\r\n loadView(viewAlias: string) {\r\n this.onViewSelect.emit(viewAlias);\r\n }\r\n deleteView(viewAlias: string){\r\n this.onViewDelete.emit(viewAlias);\r\n }\r\n updateView(viewAlias: string){\r\n this.onViewUpdateData.emit(viewAlias);\r\n }\r\n updateViewActiveStartup(viewAlias: string){\r\n this.onViewUpdateActiveStartup.emit(viewAlias);\r\n }\r\n createView(viewAlias: string){\r\n const exists = this.tableViews_menuItems.some(item => item.label === viewAlias);\r\n if (exists) {\r\n this.notification.showToast(\"error\",\"DUPLICATE VIEW NAME\",`A view with alias \"${viewAlias}\" already exists`);\r\n return;\r\n }\r\n this.onViewCreate.emit(viewAlias);\r\n }\r\n editViewAlias(viewAliasOld: string, viewAliasNew: string) {\r\n this.onViewEditAlias.emit({\r\n viewAliasOld: viewAliasOld,\r\n viewAliasNew: viewAliasNew\r\n });\r\n }\r\n \r\n showViewEditor(editingViewAlias: string = ''){\r\n this.editingViewAlias = editingViewAlias;\r\n this.newViewAlias = this.editingViewAlias;\r\n this.viewEditorShow=true;\r\n }\r\n\r\n closeModal(){\r\n this.visibleChange.emit(false);\r\n }\r\n\r\n createOrUpdateTableView(){\r\n this.viewEditorShow=false;\r\n if(this.editingViewAlias !== ''){\r\n this.editViewAlias(this.editingViewAlias, this.newViewAlias);\r\n } else {\r\n this.createView(this.newViewAlias);\r\n }\r\n }\r\n}","<p-dialog [(visible)]=\"visible\" [modal]=\"true\" [draggable]=\"false\" [resizable]=\"false\"\r\n [closable]=\"true\" [closeOnEscape]=\"false\" [maximizable]=\"false\" [style]=\"{'min-width': '70vw', 'max-width': '70vw'}\" (onHide)=\"closeModal()\">\r\n <ng-template pTemplate=\"header\">\r\n <div>\r\n <span class=\"p-dialog-title\">Table views</span>\r\n </div>\r\n </ng-template>\r\n <div class=\"p-4 pt-0\">\r\n <p-table #dt_viewsDialog [value]=\"tableViews_menuItems\" [scrollable]=\"true\" size=\"small\" showGridlines stripedRows scrollHeight=\"400px\" [tableStyle]=\"{'min-width': '25rem'}\">\r\n <ng-template #caption>\r\n <div style=\"display: flex; justify-content: flex-end; align-items: center; width: 100%;\">\r\n <p-button icon=\"pi pi-plus\" label=\"New view\" (click)=\"showViewEditor()\" pTooltip=\"New view\" tooltipPosition=\"top\" [showDelay]=\"700\"/>\r\n </div>\r\n </ng-template>\r\n <ng-template #header>\r\n <tr>\r\n <th style=\"text-align: center;\">View name</th>\r\n <th style=\"text-align: center; max-width: 220px; min-width: 220px; width: 220px;\">Load on startup</th>\r\n <th style=\"text-align: center; max-width: 220px; min-width: 220px; width: 220px;\">Actions</th>\r\n </tr>\r\n </ng-template>\r\n <ng-template #body let-rowData>\r\n <tr>\r\n <td>\r\n {{rowData.label}}\r\n </td>\r\n <td style=\"text-align: center; max-width: 220px; min-width: 220px; width: 220px;\">\r\n <p-checkbox [(ngModel)]=\"rowData.lastActive\" [binary]=\"true\" (onChange)=\"updateViewActiveStartup(rowData.label)\"/>\r\n </td>\r\n <td style=\"max-width: 220px; min-width: 220px; width: 220px; display: flex; justify-content: center; align-items: center; height: 100%;\">\r\n <button pButton icon=\"pi pi-upload\" (click)=\"loadView(rowData.label);\" [showDelay]=\"700\" pTooltip=\"Restore\" tooltipPosition=\"top\" size=\"small\" class=\"p-button-sm\" style=\"height: 28px; margin-right: 10px;\"></button>\r\n <button pButton icon=\"pi pi-save\" (click)=\"updateView(rowData.label);\" [showDelay]=\"700\" pTooltip=\"Save\" tooltipPosition=\"top\" size=\"small\" class=\"p-button-sm\" style=\"height: 28px; margin-right: 10px;\"></button>\r\n <button pButton icon=\"pi pi-pencil\" (click)=\"showViewEditor(rowData.label);\" [showDelay]=\"700\" pTooltip=\"Edit\" tooltipPosition=\"top\" size=\"small\" class=\"p-button-sm\" style=\"height: 28px; margin-right: 10px;\"></button>\r\n <button pButton icon=\"pi pi-trash\" (click)=\"deleteView(rowData.label);\" [showDelay]=\"700\" pTooltip=\"Delete\" tooltipPosition=\"top\" size=\"small\" class=\"p-button-sm\" style=\"height: 28px;\"></button>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template #emptymessage>\r\n <tr>\r\n <td colspan=\"999\">There are no views</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div style=\"display: flex; flex-direction: row; justify-content: space-between; align-items: center; margin-top: 10px;\">\r\n Showing {{tableViews_menuItems ? tableViews_menuItems.length : 0}} views\r\n </div>\r\n </div>\r\n</p-dialog>\r\n\r\n<!--TABLE VIEW SAVE-->\r\n<p-dialog [(visible)]=\"viewEditorShow\" [modal]=\"true\" [draggable]=\"false\" [resizable]=\"false\" [closeOnEscape]=\"false\" [closable]=\"false\" [maximizable]=\"false\" [style]=\"{'max-width': '60vw'}\">\r\n <ng-template pTemplate=\"header\">\r\n <div class=\"inline-flex align-items-center justify-content-center gap-2\">\r\n <span class=\"white-space-nowrap\"><b>{{ editingViewAlias !== '' ? 'UPDATE VIEW' : 'CREATE NEW VIEW' }}</b></span>\r\n </div>\r\n </ng-template>\r\n <div style=\"display: flex; flex-direction: column; gap: 8px;\">\r\n <label for=\"newtableviewname\"><strong>View alias<span style=\"color: red;\">*</span></strong></label>\r\n <input \r\n pInputText \r\n id=\"newtableviewname\" \r\n aria-describedby=\"newtableviewname-help\" \r\n style=\"width: 400px;\"\r\n maxlength=\"30\"\r\n [(ngModel)]=\"newViewAlias\"/>\r\n </div>\r\n <ng-template pTemplate=\"footer\" style=\"display: flex; justify-content: space-between; align-items: center;\">\r\n <p-button (click)=\"viewEditorShow = false\" label=\"Cancel\" outlined=\"true\" [style]=\"{'margin-top': '20px'}\"></p-button>\r\n <p-button (click)=\"createOrUpdateTableView()\" [label]=\"editingViewAlias !== '' ? 'Update' : 'Create'\" [style]=\"{'margin-top': '20px'}\"></p-button>\r\n </ng-template>\r\n</p-dialog>","import { AfterViewInit, Component, ElementRef, EventEmitter, HostListener, Input, OnInit, Output, ViewChild, ViewEncapsulation } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { HttpResponse } from '@angular/common/http';\r\n\r\n// PrimeNG imports\r\nimport { Table, TableLazyLoadEvent, TableModule, TablePageEvent, TableRowSelectEvent, TableRowUnSelectEvent } from 'primeng/table';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { IconFieldModule } from 'primeng/iconfield';\r\nimport { InputIconModule } from 'primeng/inputicon';\r\nimport { MultiSelectModule } from 'primeng/multiselect';\r\nimport { CheckboxModule } from 'primeng/checkbox';\r\nimport { PaginatorModule } from 'primeng/paginator';\r\nimport { FilterMetadata } from 'primeng/api';\r\nimport { ButtonGroupModule } from 'primeng/buttongroup';\r\nimport { PopoverModule } from 'primeng/popover';\r\n\r\nimport { ECSPrimengTableService } from './ecs-primeng-table.service';\r\nimport { CellOverflowBehaviour, DataAlignHorizontal, DataAlignVertical, DataType, FrozenColumnAlign, TableViewSaveMode } from '../../enums';\r\nimport { IColumnMetadata, IPredefinedFilter, ITableConfiguration, ITablePagedResponse, ITableQueryRequest, IExcelExportRequest, ITableView, ITableViewData, ITableOptions, DEFAULT_TABLE_OPTIONS } from '../../interfaces';\r\nimport { dataAlignHorizontalAsText, dataAlignVerticalAsText, dataTypeAsText, frozenColumnAlignAsText } from '../../utils';\r\nimport { ECSPrimengTableNotificationService } from '../../services';\r\nimport { TableCell } from '../table-cell/table-cell';\r\nimport { TablePredefinedFilters } from '../table-predefined-filters/table-predefined-filters';\r\nimport { TableButton } from '../table-button/table-button';\r\nimport { ColumnSelector } from \"../column-selector/column-selector\";\r\nimport { ExportExcel } from '../export-excel/export-excel';\r\nimport { finalize, Observable } from 'rxjs';\r\nimport { ViewsManagement } from \"../views-management/views-management\";\r\n\r\n@Component({\r\n selector: 'ecs-primeng-table',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n TableModule,\r\n ButtonModule,\r\n TooltipModule,\r\n InputTextModule,\r\n IconFieldModule,\r\n InputIconModule,\r\n MultiSelectModule,\r\n CheckboxModule,\r\n PaginatorModule,\r\n TableCell,\r\n TablePredefinedFilters,\r\n TableButton,\r\n ColumnSelector,\r\n ExportExcel,\r\n ButtonGroupModule,\r\n ViewsManagement,\r\n PopoverModule\r\n ],\r\n standalone: true,\r\n templateUrl: './ecs-primeng-table.html',\r\n styleUrl: './ecs-primeng-table.scss',\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class ECSPrimengTable implements OnInit, AfterViewInit {\r\n constructor(\r\n private tableService: ECSPrimengTableService,\r\n private notification: ECSPrimengTableNotificationService\r\n ) {}\r\n @Input() tableOptions: ITableOptions = DEFAULT_TABLE_OPTIONS;\r\n @Output() onRowCheckboxChange = new EventEmitter<{\r\n rowID: any,\r\n selected: boolean\r\n }>(); // Emitter that returns the column selected and if it was selected or unselected\r\n @Output() onRowSelect = new EventEmitter<{\r\n rowID: any,\r\n rowData: any\r\n }>\r\n @Output() onRowUnselect = new EventEmitter<{\r\n rowID: any,\r\n rowData: any\r\n }>\r\n @Output() onDataEndUpdate = new EventEmitter<void>();\r\n viewsModalShow:boolean = false;\r\n tableViewCurrentSelectedAlias: string | null = null;\r\n tableViewsFirstFetchDone: boolean = false;\r\n excelReportTitle: string = \"\";\r\n showExportModal: boolean = false;\r\n showColumnSelector: boolean = false;\r\n selectedRowsCheckbox: any[] = []; // An array to keep all the selected rows\r\n @ViewChild('dt') dt!: Table; // Get the reference to the object table\r\n \r\n globalSearchText: string | null = null; // The text used by the global search\r\n tableViewsList: ITableView[] = [];\r\n tableViews_menuItems: any[] = [];\r\n\r\n DataType = DataType;\r\n CellOverflowBehaviour = CellOverflowBehaviour;\r\n DataAlignHorizontal = DataAlignHorizontal;\r\n DataAlignVertical = DataAlignVertical;\r\n FrozenColumnAlign = FrozenColumnAlign;\r\n TableViewSaveMode = TableViewSaveMode;\r\n\r\n rowSelection: any;\r\n currentPage: number = 0; // The current page we are at\r\n currentRowsPerPage: number = 0; // The current rows per page selected\r\n allowedRowsPerPage: number[] = []; // The different values of rows per page allowed\r\n totalRecords: number = 0; // The number of total records that are available (taking into account the filters)\r\n totalRecordsNotFiltered: number = 0; // The total number of records available if no filters were applied\r\n\r\n dateFormat: string = \"dd-MMM-yyyy HH:mm:ss zzzz\";\r\n dateTimezone: string = \"+00:00\";\r\n dateCulture: string = \"en-US\";\r\n\r\n columns: IColumnMetadata[] = [];\r\n columnsCantBeHidden: IColumnMetadata[] = [];\r\n columnsSelected: IColumnMetadata[] = [];\r\n columnModalData: any[] = []; \r\n filteredColumnData: any[] = []; \r\n private initialColumnWidths: any;\r\n private initialTableWidth: any;\r\n predefinedFiltersSelectedValuesCollection: { [key: string]: any[] } = {}; // Contains a collection of the predefined column filters selection (possible values come from 'predefinedFiltersCollection')\r\n private copyCellDataTimer: any; // A timer that handles the amount of time left to copy the cell data to the clipboard\r\n tableLazyLoadEventInformation: TableLazyLoadEvent = {}; // Data of the last lazy load event of the table\r\n private initialConfigurationFetched: boolean = false;\r\n private maxViews = 0;\r\n ngOnInit(): void {\r\n this.fetchTableConfiguration();\r\n }\r\n @ViewChild('tableContainer', { static: false }) tableContainer!: ElementRef;\r\n @ViewChild('headerContainer', { static: false }) headerContainer!: ElementRef;\r\n @ViewChild('paginatorContainer', { static: false }) paginatorContainer!: ElementRef;\r\n ngAfterViewInit() {\r\n this.calculateScrollHeight();\r\n }\r\n\r\n @HostListener('window:resize')\r\n onResize() {\r\n this.calculateScrollHeight();\r\n }\r\n \r\n private calculateScrollHeight(){\r\n if (this.tableOptions.verticalScroll?.cssFormula) {\r\n return;\r\n }\r\n if (this.tableOptions.verticalScroll?.fitToContainer && this.tableContainer && this.paginatorContainer && this.headerContainer) {\r\n const containerRect = this.tableContainer.nativeElement.getBoundingClientRect();\r\n const paginatorHeight = this.paginatorContainer.nativeElement.offsetHeight;\r\n const headerHeight = this.headerContainer.nativeElement.offsetHeight;\r\n const viewportHeight = window.innerHeight;\r\n const topOffset = containerRect.top + window.scrollY;\r\n this.tableOptions.verticalScroll.height = (viewportHeight - topOffset - paginatorHeight - headerHeight)-60;\r\n }\r\n }\r\n get scrollHeightValue(): string {\r\n if (this.tableOptions.verticalScroll?.cssFormula) {\r\n return this.tableOptions.verticalScroll.cssFormula;\r\n }\r\n const height = this.tableOptions.verticalScroll?.height;\r\n return height && height > 0 ? `${height}px` : '';\r\n }\r\n\r\n /**\r\n * Updates the table data and, if needed, retrieves the initial table configuration from an external source.\r\n * \r\n * Also allows resetting the table to its original state before any user manipulations.\r\n *\r\n * @param {boolean} [resetTableView=false] Optional.\r\n * - `true`: resets the table state before loading data.\r\n * - `false`: refreshes data using the current configuration (and retrieves initial configuration if necessary).\r\n *\r\n * **_Behavior_**\r\n * - The table is automatically set to `isActive = true`.\r\n * - If the initial configuration has not been fetched, it will fetch it and then update the data.\r\n * - If the initial configuration is already fetched, it will just update the data.\r\n * - If `resetTableView` is true and the configuration is already initialized, the table will be reset to its original state before updating the data.\r\n */\r\n updateData(resetTableView: boolean = false): void {\r\n this.tableOptions.isActive = true; // Enable table actions: the table is now active and can perform updates\r\n if (!this.initialConfigurationFetched || resetTableView) { // If initial configuration hasn't been fetched yet or a reset is explicitly requested\r\n if(this.initialConfigurationFetched && resetTableView) { // Reset the table only if it was already initialized and a reset is explicitly requested\r\n this.resetTableView(); // Reset table state (filters, pagination, sorting, etc.) and then refresh data\r\n } else { // We only need to get the table configuration without reseting the view\r\n this.fetchTableConfiguration(); // Fetch the initial table configuration before updating data\r\n }\r\n } else { // Table is already initialized and no reset requested, just refresh the data\r\n this.fetchTableData(this.tableLazyLoadEventInformation); // Update table rows using the last lazy load event\r\n }\r\n }\r\n\r\n private canFetchData(): boolean {\r\n return !!this.tableOptions.isActive\r\n && !!this.tableOptions.urlTableConfiguration?.trim()\r\n && !!this.tableOptions.urlTableData?.trim();\r\n }\r\n\r\n private fetchTableConfiguration(resetTableView: boolean = false): void {\r\n if(!this.canFetchData()){\r\n return;\r\n }\r\n this.tableService.fetchTableConfiguration(this.tableOptions.urlTableConfiguration!).subscribe({\r\n next: (response: HttpResponse<ITableConfiguration>) => {\r\n this.handleTableConfigurationResponse(response.body!, resetTableView);\r\n },\r\n error: (err) => this.tableService.handleTableError(err, 'Columns Error')\r\n });\r\n }\r\n\r\n private handleTableConfigurationResponse(body: ITableConfiguration, resetTableView: boolean = false): void {\r\n this.allowedRowsPerPage = body.allowedItemsPerPage; // Update the number of rows allowed per page\r\n this.currentRowsPerPage = Math.min(...this.allowedRowsPerPage); // Update the current rows per page to use the minimum value of allowed rows per page by default\r\n this.columns = body.columnsInfo; // Update columns with fetched data\r\n this.columnsCantBeHidden = this.columns.filter((col: any) => !col.canBeHidden); // Filter columns that cannot be hidden\r\n this.columnsSelected = this.columns.filter((col: any) => !col.startHidden && col.canBeHidden); // Selected columns that are not hidden by default\r\n this.tableOptions.columns!.shown = this.tableService.orderColumnsWithFrozens(this.columnsCantBeHidden.concat(this.columnsSelected));\r\n this.dateFormat = body.dateFormat;\r\n this.dateTimezone = body.dateTimezone;\r\n this.dateCulture = body.dateCulture;\r\n this.currentPage = 0;\r\n this.initialConfigurationFetched = true;\r\n this.maxViews = body.maxViews;\r\n if(resetTableView){\r\n this.tableOptions.isActive = false\r\n this.clearFilters(this.dt, true);\r\n this.clearSorts(this.dt, true);\r\n this.dt.tableWidthState = this.initialTableWidth;\r\n this.dt.columnWidthsState = this.initialColumnWidths;\r\n this.dt.restoreColumnWidths()\r\n this.tableLazyLoadEventInformation.multiSortMeta=[];\r\n this.tableOptions.isActive = true;\r\n } else {\r\n setTimeout(() => {\r\n this.initialColumnWidths = this.tableService.computeColumnWidths(this.dt);\r\n this.initialTableWidth = this.tableService.computeTableWidth(this.dt);\r\n }, 0);\r\n this.fetchTableViews();\r\n }\r\n }\r\n\r\n refreshData(event: any){\r\n this.fetchTableData(this.tableLazyLoadEventInformation);\r\n }\r\n\r\n tableViewsEnabled(): boolean {\r\n const views = this.tableOptions.views;\r\n if (views?.saveMode === TableViewSaveMode.None) { // saveMode must be different from noone\r\n return false;\r\n }\r\n if (!views?.saveKey?.trim()) { // saveKey must exist and must not be empty after trim\r\n return false;\r\n }\r\n if (this.maxViews <= 0) { // maxViews must be greater than 0\r\n return false;\r\n }\r\n if (views?.saveMode === TableViewSaveMode.DatabaseStorage) { // If saveMode is database, urlGet and urlSave must exist and must not be empty after trim\r\n if (!views?.urlGet?.trim() || !views?.urlSave?.trim()) {\r\n return false;\r\n }\r\n }\r\n return true; // All checks passed, views are enabled\r\n }\r\n\r\n private fetchTableViews(): void {\r\n if(!this.tableViewsEnabled()){\r\n this.fetchTableData(this.tableLazyLoadEventInformation);\r\n return;\r\n }\r\n const tableViews = this.tableService.fetchTableViews(this.tableOptions.views!.saveMode!, this.tableOptions.views!.urlGet!, this.tableOptions.views!.saveKey!);\r\n if (tableViews instanceof Observable) {\r\n tableViews.subscribe({\r\n next: (response: HttpResponse<ITableView[]>) => {\r\n let parsedResult = response.body!.map((item: any) => ({\r\n viewAlias: item.viewAlias,\r\n viewData: JSON.parse(item.viewData),\r\n lastActive: item.lastActive\r\n }));\r\n this.tableViewListProcess(parsedResult);\r\n },\r\n error: (err) => this.tableService.handleTableError(err, 'Views get error')\r\n });\r\n } else {\r\n this.tableViewListProcess(tableViews);\r\n }\r\n }\r\n\r\n private tableViewListProcess(tableViews: ITableView[]){\r\n this.tableViewsList = [...tableViews];\r\n if(this.tableViewsList.length > 0){\r\n this.tableService.sortViews(this.tableViewsList);\r\n }\r\n this.tableViews_menuItems=[...this.tableService.updateViewsMenuItems(this.tableViewsList)];\r\n const viewToStartup: ITableView | undefined = this.tableViewsList.find(v => v.lastActive);\r\n if (viewToStartup) { // If there is a view that needs to be loaded on startup\r\n this.viewLoad(viewToStartup.viewAlias);\r\n } else {\r\n this.fetchTableData(this.tableLazyLoadEventInformation);\r\n }\r\n }\r\n\r\n viewLoad(tableViewAlias: string): void {\r\n const viewToLoad: ITableView | undefined = this.tableViewsList.find(v => v.viewAlias === tableViewAlias);\r\n if(!viewToLoad){\r\n this.notification.showToast(\"error\",\"VIEW TO LOAD DOESN'T EXIST\",\"The view to load doesn't exist\");\r\n return;\r\n }\r\n let viewData: ITableViewData = viewToLoad.viewData;\r\n this.columnsSelected = viewData.columnsShown\r\n .map(data => this.columns.find((col: any) => col.field === data.field))\r\n .filter((col): col is IColumnMetadata => col !== undefined)\r\n .filter(col => !this.columnsCantBeHidden.includes(col));\r\n this.tableOptions.columns!.shown = this.tableService.orderColumnsWithFrozens(this.columnsCantBeHidden.concat(this.columnsSelected));\r\n this.currentPage = viewData.currentPage;\r\n this.currentRowsPerPage = viewData.currentRowsPerPage;\r\n this.globalSearchText = viewData.globalSearchText;\r\n this.tableLazyLoadEventInformation.multiSortMeta = [...(viewData.multiSortMeta ?? [])];\r\n this.dt.multiSortMeta = [...(viewData.multiSortMeta ?? [])];\r\n this.tableOptions.isActive = false;\r\n this.dt.sortMultiple();\r\n this.tableOptions.isActive = true;\r\n this.tableLazyLoadEventInformation.filters = structuredClone(viewData.filters);\r\n this.dt.filters = structuredClone(viewData.filters);\r\n this.predefinedFiltersSelectedValuesCollection = {}; // Empty predefined filters checkbox selection\r\n for (const [filterKey, filterDataArrayRaw] of Object.entries(viewData.filters)) { // Iterate over each saved filter\r\n const filterDataArray = filterDataArrayRaw as Array<{ value: any; matchMode?: string; operator?: string }>; // Cast expected structure\r\n const filterData = filterDataArray?.[0];\r\n if (!filterData || !filterData.value) { \r\n continue;\r\n }\r\n const column = this.columns?.find((c: any) => c.field === filterKey); // Find the column that owns this filterKey\r\n if (!column || !column.filterPredefinedValuesName){\r\n continue;\r\n }\r\n const predefinedKey = column.filterPredefinedValuesName;\r\n const predefinedOptions = this.tableOptions.predefinedFilters?.[predefinedKey] ?? []; // Get predefined options for this column\r\n const selectedItems = predefinedOptions.filter(opt =>\r\n Array.isArray(filterData.value)\r\n ? filterData.value.includes(opt.value)\r\n : filterData.value === opt.value\r\n ); // Match selected values with their full predefined definitions\r\n this.predefinedFiltersSelectedValuesCollection[predefinedKey] = selectedItems; // Store the result\r\n }\r\n this.dt.tableWidthState = viewData.tableWidth;\r\n this.dt.columnWidthsState = viewData.columnsWidth;\r\n this.tableViewCurrentSelectedAlias = tableViewAlias;\r\n this.notification.showToast(\"info\",\"TABLE VIEW RESTORED\",`The table view '${this.tableViewCurrentSelectedAlias}' has been restored.`);\r\n this.viewsModalShow = false;\r\n this.fetchTableData(this.tableLazyLoadEventInformation);\r\n }\r\n\r\n viewCreate(viewAlias: string){\r\n if(this.tableViewsList.length >= this.maxViews){\r\n this.notification.showToast(\"error\",\"NO MORE VIEWS ALLOWED\",\"You have created the maximum number of allowed views for this table\");\r\n return;\r\n }\r\n let viewData: ITableViewData = this.tableService.viewGenerateData(this.dt, this.globalSearchText, this.currentPage, this.currentRowsPerPage, this.modifyFiltersWithoutGlobalAndSelectedRows.bind(this))\r\n let newView: ITableView = {\r\n lastActive: false,\r\n viewAlias: viewAlias,\r\n viewData: viewData\r\n }\r\n this.tableViewsList.push(newView);\r\n this.tableService.sortViews(this.tableViewsList);\r\n this.tableViews_menuItems=[...this.tableService.updateViewsMenuItems(this.tableViewsList)];\r\n this.tableViewCurrentSelectedAlias = viewAlias;\r\n this.viewsSave(0);\r\n }\r\n\r\n viewDelete(viewAlias: string){\r\n const index = this.tableViewsList.findIndex(v => v.viewAlias === viewAlias);\r\n if (index === -1) {\r\n this.notification.showToast(\"error\",\"Table view delete failed\", `The table view could not be deleted since it was not found.`);\r\n return;\r\n }\r\n this.tableViewsList.splice(index, 1);\r\n this.tableViews_menuItems=[...this.tableService.updateViewsMenuItems(this.tableViewsList)];\r\n if(this.tableViewCurrentSelectedAlias === viewAlias){\r\n this.tableViewCurrentSelectedAlias = null;\r\n }\r\n this.viewsSave(3);\r\n }\r\n\r\n viewEditAlias(event: { viewAliasOld: string; viewAliasNew: string }){\r\n const index = this.tableViewsList.findIndex(v => v.viewAlias === event.viewAliasOld);\r\n if (index === -1) {\r\n this.notification.showToast(\"error\",\"Table view alias change failed\", `The table view alias could not be changed since it was not found.`);\r\n return;\r\n }\r\n this.tableViewsList[index].viewAlias = event.viewAliasNew;\r\n this.tableService.sortViews(this.tableViewsList);\r\n this.tableViews_menuItems=[...this.tableService.updateViewsMenuItems(this.tableViewsList)];\r\n if(this.tableViewCurrentSelectedAlias === event.viewAliasOld){\r\n this.tableViewCurrentSelectedAlias = event.viewAliasNew;\r\n }\r\n this.viewsSave(2);\r\n }\r\n\r\n viewUpdateData(viewAlias: string){\r\n const index = this.tableViewsList.findIndex(v => v.viewAlias === viewAlias);\r\n if (index === -1) {\r\n this.notification.showToast(\"error\",\"Table view not found\", `The table view to update data from was not found.`);\r\n return;\r\n }\r\n let viewData: ITableViewData = this.tableService.viewGenerateData(this.dt, this.globalSearchText, this.currentPage, this.currentRowsPerPage, this.modifyFiltersWithoutGlobalAndSelectedRows.bind(this))\r\n this.tableViewsList[index].viewData = viewData;\r\n this.viewsSave(1);\r\n }\r\n\r\n viewUpdateActiveStartup(viewAlias: string){\r\n const index = this.tableViewsList.findIndex(v => v.viewAlias === viewAlias);\r\n if (index === -1) {\r\n this.notification.showToast(\"error\",\"Table view not found\", `The table view to update data from was not found.`);\r\n return;\r\n }\r\n let newStatus: boolean = !this.tableViewsList[index].lastActive;\r\n this.tableViewsList.forEach(v => v.lastActive = false);\r\n this.tableViewsList[index].lastActive = newStatus;\r\n this.tableViews_menuItems=[...this.tableService.updateViewsMenuItems(this.tableViewsList)];\r\n this.viewsSave(4);\r\n }\r\n\r\n viewsSave(endMessage: number): void{\r\n let tableView: string = JSON.stringify(this.tableViewsList);\r\n switch(this.tableOptions.views!.saveMode){\r\n case TableViewSaveMode.SessionStorage:\r\n sessionStorage.setItem(this.tableOptions.views!.saveKey!, tableView);\r\n break;\r\n case TableViewSaveMode.LocalStorage:\r\n localStorage.setItem(this.tableOptions.views!.saveKey!, tableView);\r\n break;\r\n case TableViewSaveMode.DatabaseStorage:\r\n const saveObsv = this.tableService.viewsSaveToDatabase(this.tableViewsList, this.tableOptions.views!.urlSave!, this.tableOptions.views!.saveKey!);\r\n saveObsv.subscribe({\r\n next: (response: HttpResponse<any>) => {\r\n this.viewsSaveEnd(endMessage);\r\n },\r\n error: (err) => this.tableService.handleTableError(err, 'Views save error')\r\n });\r\n return;\r\n default:\r\n this.notification.showToast(\"error\",\"NOT IMPLEMENTED\", \"This type os save view has not been implemented yet.\");\r\n return;\r\n }\r\n this.viewsSaveEnd(endMessage);\r\n }\r\n viewsSaveEnd(endMessage: number){\r\n switch(endMessage){\r\n case 0: // NEW VIEW\r\n this.notification.showToast(\"info\",\"Table view created\", `New table view has been created.`);\r\n this.viewsModalShow = false;\r\n break;\r\n case 1: // UPDATE VIEW\r\n this.notification.showToast(\"info\",\"Table view data updated\", `The table view data was updated.`);\r\n break;\r\n case 2: // UPDATE ALIAS\r\n this.notification.showToast(\"info\",\"Table view name updated\", `The table view alias was updated.`);\r\n break;\r\n case 3: // DELETE VIEW\r\n this.notification.showToast(\"info\",\"Table view delete\", `The table view was deleted.`);\r\n break;\r\n case 4: // DELETE VIEW\r\n this.notification.showToast(\"info\",\"Table view active on startup\", `Changed the view that will be active on startup.`);\r\n break;\r\n }\r\n }\r\n\r\n fetchTableData(event: TableLazyLoadEvent): void {\r\n if(!this.canFetchData()){\r\n return;\r\n }\r\n if (!this.initialConfigurationFetched) {\r\n return;\r\n }\r\n this.tableLazyLoadEventInformation = event; // Store the event information for later use\r\n if (event.rows != null && event.rows !== undefined) {\r\n this.currentRowsPerPage = event.rows;\r\n }\r\n if (event.first != null && event.first !== undefined && event.rows != null && event.rows !== undefined) {\r\n this.currentPage = event.first / event.rows;\r\n }\r\n let filtersWithoutGlobalAndSelectedRows = this.modifyFiltersWithoutGlobalAndSelectedRows(this.tableLazyLoadEventInformation.filters); // Create filters excluding the global filter\r\n filtersWithoutGlobalAndSelectedRows=this.revertDateTimeZoneFilters(filtersWithoutGlobalAndSelectedRows);\r\n const requestData: ITableQueryRequest = {\r\n page: this.currentPage, // Set the current page number\r\n pageSize: this.currentRowsPerPage, // Set the number of rows per page\r\n sort: this.tableLazyLoadEventInformation.multiSortMeta, // Set the sorting information\r\n filter: filtersWithoutGlobalAndSelectedRows, // Set the filters excluding the global filter\r\n globalFilter: this.globalSearchText, // Set the global filter text\r\n columns: this.tableOptions.columns!.shown!.map(col => col.field), // Set the columns to show\r\n dateFormat: this.dateFormat,\r\n dateTimezone: this.dateTimezone,\r\n dateCulture: this.dateCulture\r\n };\r\n this.tableService.fetchTableData(this.tableOptions.urlTableData!, requestData)\r\n .pipe(\r\n finalize(() => {\r\n this.onDataEndUpdate.emit(); // This is always executed after data update.\r\n })\r\n )\r\n .subscribe({\r\n next: (response: HttpResponse<ITablePagedResponse>) => this.handleTableDataResponse(response.body!),\r\n error: (err) => this.tableService.handleTableError(err, 'Columns Error')\r\n });\r\n }\r\n\r\n private modifyFiltersWithoutGlobalAndSelectedRows(filters: any, overrideOption: number = -1): any {\r\n if (this.globalSearchText === \"\") { // If the global search text is an empty string\r\n this.globalSearchText = null; // Set it to null\r\n }\r\n let filtersWithoutGlobalAndSelectedRows = { ...filters }; // Create a copy of filters to delete the global.\r\n if (filtersWithoutGlobalAndSelectedRows.hasOwnProperty('global')) { // If there is an entry with the global filter\r\n delete filtersWithoutGlobalAndSelectedRows['global']; // Remove the global filter\r\n }\r\n this.selectorRowFilterBuilder(filtersWithoutGlobalAndSelectedRows, overrideOption);\r\n return filtersWithoutGlobalAndSelectedRows; // Return the filters without global array\r\n }\r\n\r\n resetTableView(): void {\r\n this.tableViewCurrentSelectedAlias = '';\r\n this.fetchTableConfiguration(true);\r\n }\r\n\r\n private selectorRowFilterBuilder(filtersWithoutGlobalAndSelectedRows: any, overrideOption: number = -1): void {\r\n if (filtersWithoutGlobalAndSelectedRows.hasOwnProperty('selector')) {\r\n const selectorFilter = filtersWithoutGlobalAndSelectedRows['selector'][0];\r\n let filterType: boolean | null = null;\r\n if(overrideOption<0 || overrideOption>2){\r\n filterType = selectorFilter.value;\r\n } else {\r\n switch (overrideOption){\r\n case 0: // All\r\n filterType = null;\r\n break;\r\n case 1: // Only selected rows\r\n filterType = true;\r\n break;\r\n case 2: // Only NOT selected\r\n filterType = false;\r\n break;\r\n }\r\n }\r\n if (!filtersWithoutGlobalAndSelectedRows.hasOwnProperty('rowID')) {\r\n filtersWithoutGlobalAndSelectedRows['rowID'] = [\r\n {\r\n \"value\": null,\r\n \"matchMode\": \"in\",\r\n \"operator\": \"or\"\r\n }\r\n ];\r\n }\r\n const idFilter = filtersWithoutGlobalAndSelectedRows['rowID'][0];\r\n if (filterType === true) {\r\n idFilter.matchMode = \"in\";\r\n idFilter.value = this.selectedRowsCheckbox;\r\n } else if (filterType === false) {\r\n idFilter.operator = \"and\"\r\n idFilter.matchMode = \"notIn\";\r\n idFilter.value = this.selectedRowsCheckbox;\r\n } else if (filterType === null) {\r\n idFilter.value = null;\r\n idFilter.matchMode = \"in\";\r\n }\r\n }\r\n }\r\n\r\n revertDateTimeZoneFilters(inputFilter: any){\r\n this.tableOptions.columns!.shown!.forEach((column) => {\r\n if (column.dataType === DataType.Date) { // If its date type\r\n if (inputFilter.hasOwnProperty(column.field)) {\r\n const originalDate = inputFilter[column.field][0].value;\r\n if(originalDate !== null && originalDate instanceof Date){\r\n const utcDate = new Date(Date.UTC(originalDate.getFullYear(), originalDate.getMonth(), originalDate.getDate()))\r\n inputFilter[column.field][0].value=utcDate;\r\n }\r\n }\r\n }\r\n });\r\n return inputFilter;\r\n }\r\n\r\n handleTableDataResponse(body: ITablePagedResponse): void{\r\n this.tableOptions.data = body.data; // Update the table data\r\n this.totalRecords = body.totalRecords; // Update the total number of records\r\n this.totalRecordsNotFiltered = body.totalRecordsNotFiltered; // Update the total records not filtered\r\n this.currentPage = body.page; // Update the current page\r\n }\r\n\r\n clearFilters(dt: Table, force: boolean = false, onlyGlobalFilter: boolean = false): void{\r\n let hasToClear = this.hasToClearFilters(dt, this.globalSearchText, force);\r\n if(hasToClear){\r\n if(!onlyGlobalFilter){\r\n this.predefinedFiltersSelectedValuesCollection = {};\r\n for (const key in dt.filters) {\r\n if (dt.filters.hasOwnProperty(key)) {\r\n const filters = dt.filters[key];\r\n if (Array.isArray(filters)) {\r\n filters.forEach(filter => {\r\n filter.value = null; // Set value to null\r\n });\r\n } else {\r\n filters.value = null; // Set value to null\r\n }\r\n }\r\n }\r\n let filters = {...this.dt.filters};\r\n dt.columns?.forEach(\r\n element => {\r\n dt.filter(null, element.field, element.matchMode)\r\n }\r\n );\r\n this.dt.filters = filters;\r\n }\r\n this.globalSearchText = null;\r\n dt.filterGlobal('','');\r\n }\r\n }\r\n\r\n clearSorts(dt: Table, force: boolean = false): void{\r\n let hasToClear = this.hasToClearSorts(dt, force);\r\n if(hasToClear){\r\n dt.multiSortMeta = [];\r\n dt.sortMultiple();\r\n }\r\n }\r\n hasToClearSorts(dt: Table, force: boolean = false): boolean{\r\n let hasToClear: boolean = false;\r\n const hasSorts = (dt.multiSortMeta && dt.multiSortMeta.length > 0);\r\n if(force || hasSorts){\r\n hasToClear = true;\r\n }\r\n return hasToClear;\r\n }\r\n hasToClearFilters(dt: Table, globalSearchText: string|null, force:boolean = false): boolean{\r\n let hasToClear: boolean = false;\r\n const filtersWithoutGlobalAndSelectedRows = this.modifyFiltersWithoutGlobalAndSelectedRows(dt.filters)\r\n const hasFilters = this.hasFilters(filtersWithoutGlobalAndSelectedRows);\r\n const hasGlobalFilter = (globalSearchText && globalSearchText.trim() !== \"\");\r\n if(force || hasFilters || hasGlobalFilter){\r\n hasToClear = true;\r\n }\r\n return hasToClear;\r\n }\r\n\r\n /**\r\n * Determines whether there are active filters based on the provided filter rules.\r\n *\r\n * @param {any} filterRules An object representing filter rules for each column.\r\n * The keys are column names, and the values are arrays of filter rules.\r\n * Each filter rule has the following properties:\r\n * - `field`: The field or property name of the column.\r\n * - `value`: The filter value entered by the user.\r\n * - Other properties depending on the type of filter (e.g., `matchMode` for string filters).\r\n * @returns {boolean} `true` if at least one active filter is found, otherwise `false`.\r\n */\r\n private hasFilters(filterRules: any): boolean {\r\n for (const columnName of Object.keys(filterRules)) { // Iterate over each column name in the filter rules\r\n const columnFilters = filterRules[columnName]; // Get the filter rules for the current column\r\n for (const filterRule of columnFilters) { // Iterate over each filter rule for the current column\r\n if (filterRule.value !== null && filterRule.value !== \"\") { // Check if the filter value is not null or an empty string\r\n return true; // At least one active filter found\r\n }\r\n }\r\n }\r\n return false; // No active filters found\r\n }\r\n\r\n getColumnStyle(col: any, headerCols: boolean = false): Record<string, string> {\r\n return this.tableService.getColumnStyle(col, headerCols);\r\n }\r\n\r\n getPredefinedFilterValues(columnKeyName: string): IPredefinedFilter[] {\r\n return this.tableOptions.predefinedFilters?.[columnKeyName] || []; // Return the predefined filter values or an empty array if the option name does not exist\r\n }\r\n\r\n getFrozenColumnAlignAsText(frozenColumnAlign: FrozenColumnAlign): string {\r\n return frozenColumnAlignAsText(frozenColumnAlign);\r\n }\r\n\r\n getDataTypeAsText(dataType: DataType): string {\r\n return dataTypeAsText(dataType);\r\n }\r\n\r\n /**\r\n * Updates the filters of a PrimeNG data table based on predefined filter changes.\r\n *\r\n * @param {string} filterName - The name of the filter to be updated.\r\n * @param {IPrimengPredefinedFilter[]} selectedValues - An array of selected predefined filter values.\r\n */\r\n onPredefinedFilterChange(filterName: string, selectedValues: IPredefinedFilter[]): void {\r\n const filters = { ...this.dt.filters }; // Create a shallow copy of the current filters to avoid mutating the original filters directly\r\n if (Array.isArray(filters[filterName])) { // Check if the filter for the given filterName is an array\r\n (filters[filterName] as FilterMetadata[]).forEach(criteria => { // If it is an array, iterate over each filter criteria\r\n criteria.value = selectedValues.map(value => value.value); // Update the value of each criteria with the values from selectedValues\r\n });\r\n } else if (filters[filterName]) { // Check if the filter for the given filterName exists and is not an array\r\n const criteria = filters[filterName] as FilterMetadata; // Cast the filter criteria to FilterMetadata\r\n criteria.value = selectedValues.map(value => value.value); // Update the value of the criteria with the values from selectedValues\r\n }\r\n this.dt.filters = filters; // Update the data table's filters with the modified filters object\r\n this.dt._filter(); // Trigger the filtering operation on the data table to apply the new filters\r\n }\r\n\r\n /**\r\n * Checks if the provided column metadata matches a specific style of the predefined filters \r\n * that need to be applied to an item on a row.\r\n *\r\n * @param {IprimengColumnsMetadata} colMetadata - The metadata of the column being checked.\r\n * @param {any} value - The value to be matched against the predefined filter values.\r\n * @returns {any} The matching predefined filter value if found, otherwise null.\r\n */\r\n getPredfinedFilterMatch(colMetadata: IColumnMetadata, value: any): any {\r\n if (colMetadata.filterPredefinedValuesName && colMetadata.filterPredefinedValuesName.length > 0) { // Check if the column uses predefined filter values\r\n const options = this.getPredefinedFilterValues(colMetadata.filterPredefinedValuesName); // Get the predefined filter values based on the name\r\n return options.find(option => option.value === value); // Return the matching option if found\r\n }\r\n return null; // Return null if the column does not use predefined filter values\r\n }\r\n\r\n copyToClipboardStart(event: MouseEvent) {\r\n if((this.tableOptions.copyToClipboardTime ?? 0) > 0) {\r\n const cellContent = (event.target as HTMLElement).innerText;\r\n this.copyCellDataTimer = setTimeout(() => {\r\n navigator.clipboard.writeText(cellContent).then(() => {\r\n this.notification.clearToasts();\r\n this.notification.showToast(\"info\", \"CELL CONTENT COPIED\", \"The cell content has been copied to your clipboard.\");\r\n }).catch(err => {\r\n this.notification.clearToasts();\r\n this.notification.showToast(\"error\", \"CELL CONTENT COPIED\", `The cell content failed to copy to your clipboard with error: ${err}`);\r\n });\r\n }, (this.tableOptions.copyToClipboardTime ?? 0) * 1000 );\r\n }\r\n }\r\n\r\n copyToClipboardCancel(){\r\n if((this.tableOptions.copyToClipboardTime ?? 0) > 0) {\r\n clearTimeout(this.copyCellDataTimer);\r\n }\r\n }\r\n\r\n getDataAlignHorizontalAsText(dataAlignHorizontal: DataAlignHorizontal){\r\n return dataAlignHorizontalAsText(dataAlignHorizontal);\r\n }\r\n getDataAlignVerticalAsText(dataAlignVertical: DataAlignVertical){\r\n return dataAlignVerticalAsText(dataAlignVertical);\r\n }\r\n\r\n isRowCheckboxSelected(rowID: any): boolean {\r\n return this.selectedRowsCheckbox.includes(rowID);\r\n }\r\n\r\n onRowChekboxChange(event: any, rowID: any): void {\r\n if (event.checked) { // Add the selected item\r\n this.selectedRowsCheckbox.push(rowID);\r\n } else { // Remove the selected item\r\n this.selectedRowsCheckbox = this.selectedRowsCheckbox.filter(selectedId => selectedId !== rowID);\r\n }\r\n this.onRowCheckboxChange.emit({\r\n rowID: rowID,\r\n selected: event.checked\r\n });\r\n }\r\n rowSelect(event: TableRowSelectEvent<any>): void{\r\n this.onRowSelect.emit({\r\n rowID: event.data.rowID,\r\n rowData: event.data\r\n });\r\n }\r\n rowUnselect(event: TableRowUnSelectEvent<any>): void{\r\n this.onRowUnselect.emit({\r\n rowID: event.data.rowID,\r\n rowData: event.data\r\n });\r\n }\r\n pageChange(event: TablePageEvent): void {\r\n this.currentPage = event.rows ? event.first / event.rows : 0;\r\n this.currentRowsPerPage = event.rows ? event.rows : 0;\r\n }\r\n\r\n columnSelectorShow(){\r\n this.tableOptions.columns?.selectorOrderByColumnName\r\n let tempData = this.columns.map(column => {\r\n const isSelected = this.columnsSelected.some(selectedColumn => selectedColumn.field === column.field) || this.columnsCantBeHidden.some(selectedColumn => selectedColumn.field === column.field);\r\n const isSelectDisabled = this.columnsCantBeHidden.some(selectedColumn => selectedColumn.field === column.field);\r\n return {\r\n field: column.field,\r\n header: column.header,\r\n selected: isSelected,\r\n selectDisabled: isSelectDisabled,\r\n cellOverflowBehaviour: column.cellOverflowBehaviour,\r\n cellOverflowBehaviourDisabled: !column.cellOverflowBehaviourAllowUserEdit,\r\n dataAlignHorizontal: column.dataAlignHorizontal,\r\n dataAlignHorizontalDisabled: !column.dataAlignHorizontalAllowUserEdit,\r\n dataAlignVertical: column.dataAlignVertical,\r\n dataAlignVerticalDisabled: !column.dataAlignVerticalAllowUserEdit\r\n };\r\n });\r\n if (this.tableOptions.columns?.selectorOrderByColumnName === true) { // Sort columns by header only if order by column name is true\r\n tempData = tempData.slice().sort((a, b) => {\r\n return a.header.toUpperCase().localeCompare(b.header.toUpperCase()); // Sort by header text (A-Z)\r\n });\r\n }\r\n this.columnModalData = [...tempData];\r\n this.filteredColumnData = this.columnModalData;\r\n this.showColumnSelector=true;\r\n }\r\n\r\n applyColumnModalChanges(selectedColumns: IColumnMetadata[]) {\r\n const existingColumns = this.dt.columns!;\r\n const columnsToKeep = new Set<string>();\r\n\r\n this.columnsCantBeHidden.forEach(col => columnsToKeep.add(col.field));\r\n selectedColumns.forEach(col => columnsToKeep.add(col.field));\r\n\r\n const finalColumns: IColumnMetadata[] = [];\r\n existingColumns.forEach(col => {\r\n if (columnsToKeep.has(col.field)) {\r\n finalColumns.push(col);\r\n }\r\n });\r\n\r\n selectedColumns.forEach(col => {\r\n const matchingColumn = this.columns.find(c => c.field === col.field);\r\n if (matchingColumn && !finalColumns.find(c => c.field === matchingColumn.field)) {\r\n finalColumns.push(matchingColumn);\r\n }\r\n });\r\n\r\n let prevColsToShow = this.tableOptions.columns!.shown;\r\n this.tableOptions.columns!.shown = this.tableService.orderColumnsWithFrozens(finalColumns);\r\n\r\n let sameColumnsAsBefore =\r\n prevColsToShow!.length === this.tableOptions.columns!.shown.length &&\r\n prevColsToShow!.every((prevCol, index) => prevCol.field === this.tableOptions.columns!.shown![index].field);\r\n\r\n this.columnsSelected = this.tableOptions.columns!.shown.filter(\r\n column => !this.columnsCantBeHidden.some(nonSelectable => nonSelectable.field === column.field)\r\n );\r\n\r\n this.updateColumnsSpecialProperties(this.columnModalData);\r\n\r\n if (!sameColumnsAsBefore) {\r\n this.tableOptions.isActive = false;\r\n this.clearSorts(this.dt, true);\r\n setTimeout(() => {\r\n this.tableOptions.isActive = true;\r\n this.clearSorts(this.dt, true);\r\n }, 1);\r\n }\r\n }\r\n\r\n private updateColumnsSpecialProperties(columnsSource: any[]){\r\n const allColumns = [this.columns, this.tableOptions.columns!.shown!, this.columnsSelected, this.columnsCantBeHidden];\r\n const columnModalDataMap = new Map(columnsSource.map((item: any) => [item.field, { \r\n cellOverflowBehaviour: item.cellOverflowBehaviour, \r\n dataAlignHorizontal: item.dataAlignHorizontal,\r\n dataAlignVertical: item.dataAlignVertical,\r\n width: item.width\r\n }]));\r\n const updatedFields = new Set(); // To track updated fields\r\n allColumns.forEach((columnList) => {\r\n columnList.forEach((col: any) => {\r\n if (columnModalDataMap.has(col.field) && !updatedFields.has(col.field)) {\r\n const columnData = columnModalDataMap.get(col.field);\r\n if (columnData) {\r\n col.cellOverflowBehaviour = columnData.cellOverflowBehaviour;\r\n col.dataAlignHorizontal = columnData.dataAlignHorizontal;\r\n col.dataAlignVertical = columnData.dataAlignVertical;\r\n col.width = columnData.width;\r\n updatedFields.add(col.field);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n openExcelExport(){\r\n const defaultTitle = this.tableOptions.excelReport?.defaultTitle?.trim();\r\n const allowEdit = this.tableOptions.excelReport?.titleAllowUserEdit === true;\r\n this.excelReportTitle = (!defaultTitle && !allowEdit) ? 'Report' : defaultTitle!;\r\n this.showExportModal=true;\r\n }\r\n generateExcelReport(event: any){\r\n if(!this.tableOptions.excelReport?.url?.trim()){\r\n return;\r\n }\r\n let filtersWithoutGlobalAndSelectedRows = this.modifyFiltersWithoutGlobalAndSelectedRows(this.tableLazyLoadEventInformation.filters, event.selectedRows); // Create filters excluding the global filter\r\n filtersWithoutGlobalAndSelectedRows=this.revertDateTimeZoneFilters(filtersWithoutGlobalAndSelectedRows);\r\n const filtersMustBeApplied: boolean = (event.selectedRows === 1 || event.selectedRows === 2) \r\n ? true \r\n : event.applyFilters;\r\n const requestData: IExcelExportRequest = {\r\n page: this.currentPage, // Set the current page number\r\n pageSize: this.currentRowsPerPage, // Set the number of rows per page\r\n sort: this.tableLazyLoadEventInformation.multiSortMeta, // Set the sorting information\r\n filter: filtersWithoutGlobalAndSelectedRows, // Set the filters excluding the global filter\r\n globalFilter: this.globalSearchText, // Set the global filter text\r\n columns: this.tableOptions.columns!.shown!.map(col => col.field), // Set the columns to show\r\n dateFormat: this.dateFormat,\r\n dateTimezone: this.dateTimezone,\r\n dateCulture: this.dateCulture,\r\n allColumns: event.allColumns,\r\n applyFilters: filtersMustBeApplied,\r\n applySorts: event.applySorts,\r\n filename: event.filename,\r\n useIconInBools: event.useIconInBools\r\n };\r\n this.tableService.fetchExcelReport(this.tableOptions.excelReport.url, requestData).subscribe({\r\n next: (response: HttpResponse<Blob>) => {\r\n this.tableService.downloadFile(response.body!, event.filename, 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');\r\n this.showExportModal=false;\r\n },\r\n error: (err) => this.tableService.handleTableError(err, 'Excel export error')\r\n });\r\n }\r\n\r\n updateIconBlobsForCollections(): void {\r\n Object.keys(this.tableOptions.predefinedFilters ?? {}).forEach(key => {\r\n const filters = this.tableOptions.predefinedFilters?.[key];\r\n if (Array.isArray(filters) && filters.length > 0) {\r\n filters.forEach(filter => {\r\n if (filter.imageBlobSourceEndpoint && !filter.imageBlob) {\r\n filter.imageBlob = undefined;\r\n filter.imageBlobFetchError = false;\r\n this.tableService.getIconBlob(filter.imageBlobSourceEndpoint).subscribe({\r\n next: (response: HttpResponse<Blob>) => {\r\n filter.imageBlob = response.body!;\r\n this.showExportModal=false;\r\n },\r\n error: () => { // Handle error response\r\n filter.imageBlobFetchError = true;\r\n }\r\n });\r\n }\r\n });\r\n }else {\r\n console.warn(`Filters for key ${key} is not an array:`, filters);\r\n }\r\n });\r\n }\r\n}","<div #tableContainer>\r\n <p-table #dt\r\n size=\"small\" showGridlines stripedRows \r\n sortMode=\"multiple\"\r\n [resizableColumns]=\"true\" columnResizeMode=\"expand\"\r\n [reorderableColumns]=\"true\"\r\n [scrollable]=\"true\" [scrollHeight]=\"scrollHeightValue\"\r\n [columns]=\"tableOptions.columns?.shown ?? []\" [value]=\"tableOptions.data ?? []\" dataKey=\"rowID\" \r\n [paginator]=\"true\" paginatorDropdownAppendTo=\"body\" [first]=\"currentPage * currentRowsPerPage\" [rows]=\"currentRowsPerPage\" [totalRecords]=\"totalRecords\"\r\n [rowsPerPageOptions]=\"allowedRowsPerPage\" [showCurrentPageReport]=\"false\" (onPage)=\"pageChange($event)\"\r\n [metaKeySelection]=\"true\" [selectionMode]=\"tableOptions.rows?.singleSelector?.enabled ? 'single' : null\" [metaKeySelection]=\"tableOptions.rows?.singleSelector?.metakey\" [(selection)]=\"rowSelection\" (onRowSelect)=\"rowSelect($event)\" (onRowUnselect)=\"rowUnselect($event)\"\r\n [lazy]=\"true\" (onLazyLoad)=\"fetchTableData($event)\">\r\n\r\n <!--TEMPLATE FOR THE ACTIONS HEADER COLUMN-->\r\n <ng-template #actionColumnHeaderTemplate>\r\n @if ((tableOptions.rows?.action?.buttons?.length ?? 0) > 0) {\r\n <th [ngStyle]=\"{'max-width': (tableOptions.rows?.action?.width ?? 150) + 'px','min-width': (tableOptions.rows?.action?.width ?? 150) + 'px','width': (tableOptions.rows?.action?.width ?? 150) + 'px'}\"\r\n pResizableColumn [pResizableColumnDisabled]=\"!tableOptions.rows?.action?.resizable\" pFrozenColumn [frozen]=\"tableOptions.rows?.action?.frozen ?? false\"\r\n [alignFrozen]=\"getFrozenColumnAlignAsText(tableOptions.rows?.action?.alignmentRight ? FrozenColumnAlign.Right : FrozenColumnAlign.Left)\" id=\"actions-header\"\r\n [attr.scope]=\"'col'\" style=\"text-align: center;\">\r\n {{ tableOptions.rows?.action?.header ?? ''}}\r\n </th>\r\n }\r\n </ng-template>\r\n\r\n <!--TEMPLATE FOR THE ACTIONS ROW COLUMN-->\r\n <ng-template #actionColumnTemplate let-rowData=\"rowData\">\r\n @if ((tableOptions.rows?.action?.buttons?.length ?? 0) > 0) {\r\n <td \r\n [ngStyle]=\"{'max-width': (tableOptions.rows?.action?.width ?? 150) + 'px','min-width': (tableOptions.rows?.action?.width ?? 150) + 'px','width': (tableOptions.rows?.action?.width ?? 150) + 'px'}\"\r\n style=\"text-align: center; vertical-align: middle;\" pFrozenColumn [frozen]=\"tableOptions.rows?.action?.frozen ?? false\"\r\n [alignFrozen]=\"getFrozenColumnAlignAsText(tableOptions.rows?.action?.alignmentRight ? FrozenColumnAlign.Right : FrozenColumnAlign.Left)\">\r\n @for (button of tableOptions.rows?.action?.buttons; track button; let last = $last) {\r\n <ecs-table-button [button]=\"button\" [rowData]=\"rowData\" [isActionButton]=\"true\" [isLastActionButton]=\"last\"/>\r\n }\r\n </td>\r\n }\r\n </ng-template>\r\n\r\n <!-- TEMPLATE FOR THE ROW CHECKBOX SELECTOR HEADER COLUMN -->\r\n <ng-template #rowSelectorColumnHeaderTemplate>\r\n <th \r\n [ngStyle]=\"{'max-width': (tableOptions.rows?.checkboxSelector?.width ?? 150) + 'px','min-width': (tableOptions.rows?.checkboxSelector?.width ?? 150) + 'px','width': (tableOptions.rows?.checkboxSelector?.width ?? 150) + 'px'}\"\r\n id=\"rowSelector-header\" [attr.scope]=\"'col'\" pResizableColumn [pResizableColumnDisabled]=\"!tableOptions.rows?.checkboxSelector?.resizable\" pFrozenColumn \r\n [frozen]=\"tableOptions.rows?.checkboxSelector?.frozen ?? false\" [alignFrozen]=\"getFrozenColumnAlignAsText(tableOptions.rows?.checkboxSelector?.alignmentRight ? FrozenColumnAlign.Right : FrozenColumnAlign.Left)\"\r\n style=\"text-align: center; vertical-align: middle;\">\r\n <div style=\"display: flex; justify-content: space-between; align-items: center;\">\r\n {{ tableOptions.rows?.checkboxSelector?.header ?? '' }}\r\n <p-columnFilter type=\"boolean\" field=\"selector\" display=\"menu\" [showButtons]=\"false\"/>\r\n </div>\r\n </th>\r\n </ng-template>\r\n\r\n <!--TEMPLATE FOR THE ROW CHECKBOX SELECTOR COLUMN-->\r\n <ng-template #rowSelectorColumnTemplate let-rowData=\"rowData\">\r\n <td \r\n [ngStyle]=\"{'max-width': (tableOptions.rows?.checkboxSelector?.width ?? 150) + 'px', 'min-width': (tableOptions.rows?.checkboxSelector?.width ?? 150) + 'px', 'width': (tableOptions.rows?.checkboxSelector?.width ?? 150) + 'px'}\"\r\n style=\"text-align: center; vertical-align: middle;\" pFrozenColumn [frozen]=\"tableOptions.rows?.checkboxSelector?.frozen ?? false\" \r\n [alignFrozen]=\"getFrozenColumnAlignAsText(tableOptions.rows?.checkboxSelector?.alignmentRight ? FrozenColumnAlign.Right : FrozenColumnAlign.Left)\">\r\n <p-checkbox \r\n [disabled]=\"!(tableOptions.rows?.checkboxSelector?.enabledCondition?.(rowData) ?? true)\"\r\n [binary]=\"true\"\r\n [ngModel]=\"isRowCheckboxSelected(rowData.rowID)\"\r\n (onChange)=\"onRowChekboxChange($event, rowData.rowID)\"/>\r\n </td>\r\n </ng-template>\r\n\r\n\r\n <!-- LOGIC FOR DRAWING TABLE ACTIONS ABOVE THE HEADER -->\r\n <ng-template #caption>\r\n <div #headerContainer style=\"display: flex; justify-content: space-between; align-items: center;\">\r\n <div style=\"display: flex; align-items: center; gap: 10px;\">\r\n <!--CHOOSE COLUMNS TO SHOW-->\r\n @if (tableOptions.columns?.selectorEnabled) {\r\n <p-button [icon]=\"tableOptions.columns?.selectorIcon ?? 'pi pi-pen-to-square'\" (onClick)=\"columnSelectorShow()\" pTooltip=\"Modify columns\"\r\n [showDelay]=\"700\" tooltipPosition=\"top\" styleClass=\"p-button-icon-only\"/>\r\n }\r\n <!--CLEAR SORTS AND FILTERS-->\r\n @if (tableOptions.header?.clearSortsEnabled) {\r\n <p-button [icon]=\"tableOptions.header?.clearSortsIcon ?? 'pi pi-sort-alt-slash'\" (onClick)=\"clearSorts(dt)\" [disabled]=\"!hasToClearSorts(dt)\"\r\n pTooltip=\"Clear sorts\" [showDelay]=\"700\" tooltipPosition=\"top\" styleClass=\"p-button-icon-only\"/>\r\n }\r\n @if (tableOptions.header?.clearFiltersEnabled) {\r\n <p-button\r\n [icon]=\"tableOptions.header?.clearFiltersIcon ?? 'pi pi-filter-slash'\" (onClick)=\"clearFilters(dt)\" [disabled]=\"!hasToClearFilters(dt, globalSearchText)\"\r\n pTooltip=\"Clear filters\" [showDelay]=\"700\" tooltipPosition=\"top\" styleClass=\"p-button-icon-only\"/>\r\n }\r\n\r\n <!--TABLE DESCRIPTION-->\r\n @if(tableOptions.description?.text){ <!-- If a table description text is provided -->\r\n @if(!tableOptions.description!.tooltip){ <!-- The table description must be shown as text next to the icon -->\r\n <i [class]=\"tableOptions.description!.icon\"></i>\r\n <span [innerHTML]=\"tableOptions.description!.text\"></span>\r\n } @else {\r\n <i [escape]=\"false\" [pTooltip]=\"tableOptions.description!.text\" tooltipPosition=\"right\" [class]=\"tableOptions.description!.icon\"></i>\r\n }\r\n }\r\n </div>\r\n\r\n <!--TABLE VIEWS-->\r\n @if(tableViewsEnabled()){\r\n <div style=\"display: flex; align-items: center; gap: 10px;\">\r\n <p-buttongroup>\r\n <p-button (click)=\"viewsModalShow=true;\" [label]=\"tableViewCurrentSelectedAlias ? tableViewCurrentSelectedAlias : '--- Select a view ---'\" class=\"viewButton\"/>\r\n <p-button icon=\"pi pi-refresh\" (click)=\"viewLoad(tableViewCurrentSelectedAlias!)\" [disabled]=\"!tableViewCurrentSelectedAlias\" pTooltip=\"Apply view again\" [showDelay]=\"700\" tooltipPosition=\"top\"/>\r\n </p-buttongroup>\r\n </div>\r\n }\r\n\r\n <div style=\"display: flex; align-items: center; gap: 10px;\">\r\n <!--GLOBAL FILTER-->\r\n @if (tableOptions.globalFilter?.enabled) {\r\n <p-iconField iconPosition=\"left\" class=\"ml-auto\" [ngClass]=\"{'p-input-icon-right': globalSearchText}\">\r\n <p-inputIcon>\r\n <i class=\"pi pi-search\"></i>\r\n </p-inputIcon>\r\n <input pInputText type=\"text\" \r\n (input)=\"dt.filterGlobal($any($event.target).value, 'contains')\" autocomplete=\"off\" \r\n [maxlength]=\"tableOptions.globalFilter?.maxLength ?? null\" placeholder='Search keyword' [(ngModel)]=\"globalSearchText\"\r\n style=\"width: 220px;\"/>\r\n <!-- Right icon (only if there is text) -->\r\n @if (globalSearchText) {\r\n <p-inputIcon position=\"right\">\r\n <i class=\"pi pi-times\" style=\"cursor: pointer;\" (click)=\"clearFilters(dt, true, true); $event.stopPropagation()\"></i>\r\n </p-inputIcon>\r\n }\r\n </p-iconField>\r\n }\r\n\r\n <!--EXPORT DATA-->\r\n @if (tableOptions.excelReport?.url?.trim()) {\r\n <p-button icon=\"pi pi-file-excel\" (onClick)=\"openExcelExport()\"\r\n pTooltip=\"Export to Excel\" [showDelay]=\"700\" tooltipPosition=\"top\" styleClass=\"p-button-icon-only\"/>\r\n }\r\n\r\n <!--RESET TABLE VIEW-->\r\n @if(tableOptions.resetTableView?.enabled){\r\n <p-button [icon]=\"tableOptions.resetTableView?.icon ?? 'pi pi-eraser'\" (click)=\"resetTableView()\" pTooltip=\"Reset table view\" [showDelay]=\"700\"\r\n tooltipPosition=\"top\" styleClass=\"p-button-icon-only\"/>\r\n }\r\n\r\n <!--REFRESH DATA-->\r\n <p-button icon=\"pi pi-refresh\" (onClick)=\"refreshData($event)\" pTooltip=\"Refresh data\" [showDelay]=\"700\"\r\n tooltipPosition=\"top\" styleClass=\"p-button-icon-only\"/>\r\n \r\n <!-- HEADER ACTION BUTTONS -->\r\n @if ((tableOptions.header?.buttons?.length ?? 0) > 0) {\r\n <td style=\"display: flex; justify-content: center; align-items: center; gap: 10px;\">\r\n @for (button of tableOptions.header?.buttons; track $index) {\r\n <ecs-table-button [button]=\"button\" [rowData]=\"null\"/>\r\n }\r\n </td>\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- LOGIC FOR DRAWING TABLE HEADERS -->\r\n <ng-template #header let-columns>\r\n <tr>\r\n @if (!tableOptions.rows?.action?.alignmentRight) {\r\n <ng-container *ngTemplateOutlet=\"actionColumnHeaderTemplate\"></ng-container>\r\n }\r\n @if (tableOptions.rows?.checkboxSelector?.enabled && !tableOptions.rows?.checkboxSelector?.alignmentRight) {\r\n <ng-container [ngTemplateOutlet]=\"rowSelectorColumnHeaderTemplate\"></ng-container>\r\n }\r\n @for (col of columns; track col.header) {\r\n <th [ngStyle]=\"getColumnStyle(col, true)\"\r\n pResizableColumn [pResizableColumnDisabled]=\"!col.canBeResized ? true : false\"\r\n pReorderableColumn [pReorderableColumnDisabled]=\"!col.canBeReordered ? true : false\"\r\n pFrozenColumn [frozen]=\"col.frozenColumnAlign === FrozenColumnAlign.Left || col.frozenColumnAlign === FrozenColumnAlign.Right\" [alignFrozen]=\"getFrozenColumnAlignAsText(col.frozenColumnAlign)\"\r\n [pSortableColumn]=\"col.field\" [pSortableColumnDisabled]=\"!col.canBeSorted ? true : false\"\r\n style=\"text-align: center;\"\r\n [id]=\"col.field + '-header'\" [attr.scope]=\"'col'\">\r\n <div style=\"display: flex; justify-content: space-between; align-items: center; width: 100%;\">\r\n <div style=\"margin-right: 15px;\">\r\n <span>{{ col.header }}</span>\r\n </div>\r\n <div style=\"display: flex; align-items: center; gap: 5px;\">\r\n @if (col.canBeSorted) {\r\n <p-sortIcon [field]=\"col.field\"></p-sortIcon>\r\n }\r\n @if(col.canBeFiltered){\r\n @if (!col.filterPredefinedValuesName || col.filterPredefinedValuesName.length === 0) {\r\n <p-columnFilter [type]=\"getDataTypeAsText(col.dataType)\" [field]=\"col.field\" display=\"menu\" [showButtons]=\"false\"/>\r\n } @else {\r\n <p-columnFilter\r\n type=\"{{getDataTypeAsText(col.dataType)}}\" field=\"{{col.field}}\" display=\"menu\"\r\n [showButtons]=\"false\" matchMode=\"in\" operator=\"or\" [showMatchModes]=\"false\"\r\n [showOperator]=\"false\" [showAddButton]=\"false\" [showClearButton]=\"false\" [showApplyButton]=\"false\">\r\n <ng-template #filter>\r\n <p-multiSelect\r\n [style]=\"{ minWidth: '400px' }\" [(ngModel)]=\"predefinedFiltersSelectedValuesCollection[col.filterPredefinedValuesName]\"\r\n [options]=\"getPredefinedFilterValues(col.filterPredefinedValuesName)\" placeholder=\"Any value\"\r\n (onChange)=\"onPredefinedFilterChange(col.field, $event.value)\" optionLabel=\"name\">\r\n <ng-template #item let-option >\r\n <div style=\"display: inline-block; vertical-align: middle;\">\r\n <ecs-table-predefined-filters [option]=\"option\" [col]=\"col\" [selectable]=\"false\" [rowData]=\"null\"/>\r\n </div>\r\n </ng-template>\r\n </p-multiSelect>\r\n </ng-template>\r\n </p-columnFilter>\r\n }\r\n }\r\n @if (col.columnDescription && col.columnDescription.length > 0) {\r\n <i [pTooltip]=\"col.columnDescription\" tooltipPosition=\"top\" class=\"pi pi-info-circle\"></i>\r\n }\r\n </div>\r\n </div>\r\n </th>\r\n }\r\n @if (tableOptions.rows?.checkboxSelector?.enabled && tableOptions.rows?.checkboxSelector?.alignmentRight) {\r\n <ng-container [ngTemplateOutlet]=\"rowSelectorColumnHeaderTemplate\"></ng-container>\r\n }\r\n @if (tableOptions.rows?.action?.alignmentRight) {\r\n <ng-container *ngTemplateOutlet=\"actionColumnHeaderTemplate\"></ng-container>\r\n }\r\n </tr>\r\n </ng-template>\r\n\r\n <!-- LOGIC FOR DRAWING TABLE DATA WHEN THERE IS CONTENTS -->\r\n <ng-template #body let-rowData let-columns=\"columns\"> \r\n <tr [pSelectableRow]=\"rowData\" [ngClass]=\"tableOptions.rows?.class?.(rowData)\" [ngStyle]=\"tableOptions.rows?.style?.(rowData)\">\r\n @if (!tableOptions.rows?.action?.alignmentRight) {\r\n <ng-container *ngTemplateOutlet=\"actionColumnTemplate; context: { rowData: rowData }\"></ng-container>\r\n }\r\n @if (tableOptions.rows?.checkboxSelector?.enabled && !tableOptions.rows?.checkboxSelector?.alignmentRight) {\r\n <ng-container [ngTemplateOutlet]=\"rowSelectorColumnTemplate\" [ngTemplateOutletContext]=\"{ rowData: rowData }\"></ng-container>\r\n }\r\n @for (col of columns; track col.field) {\r\n <td (mousedown)=\"col.dataType !== DataType.Boolean && copyToClipboardStart($event)\" (mouseup)=\"copyToClipboardCancel()\"\r\n [ngStyle]=\"getColumnStyle(col)\" pFrozenColumn [frozen]=\"col.frozenColumnAlign === FrozenColumnAlign.Left || col.frozenColumnAlign === FrozenColumnAlign.Right\" \r\n [alignFrozen]=\"getFrozenColumnAlignAsText(col.frozenColumnAlign)\" [style.text-align]=\"getDataAlignHorizontalAsText(col.dataAlignHorizontal)\" [style.vertical-align]=\"getDataAlignVerticalAsText(col.dataAlignVertical)\">\r\n <ecs-table-cell [col]=\"col\" [rowData]=\"rowData\" [globalSearchText]=\"globalSearchText\" \r\n [dateFormat]=\"dateFormat\" [dateTimezone]=\"dateTimezone\" [dateCulture]=\"dateCulture\"\r\n [predefinedFiltersCollection]=\"tableOptions.predefinedFilters\"/>\r\n </td>\r\n }\r\n @if (tableOptions.rows?.checkboxSelector?.enabled && tableOptions.rows?.checkboxSelector?.alignmentRight) {\r\n <ng-container [ngTemplateOutlet]=\"rowSelectorColumnTemplate\" [ngTemplateOutletContext]=\"{ rowData: rowData }\"></ng-container>\r\n }\r\n @if (tableOptions.rows?.action?.alignmentRight) {\r\n <ng-container *ngTemplateOutlet=\"actionColumnTemplate; context: { rowData: rowData }\"></ng-container>\r\n }\r\n </tr>\r\n </ng-template>\r\n\r\n <!-- LOGIC FOR DRAWING TABLE DATA WHEN THERE IS NO CONTENTS -->\r\n <ng-template #emptymessage>\r\n <tr>\r\n <td colspan=\"999\">No data found for the current filter criteria.</td>\r\n </tr>\r\n </ng-template>\r\n\r\n <!-- SHOW CUSTOM RECORDS REPORT -->\r\n <ng-template #paginatorleft>\r\n <div #paginatorContainer>\r\n <div style=\"display: flex; align-items: center; gap: 10px;\">\r\n @if(tableOptions.legend?.content){\r\n <p-button (click)=\"op.toggle($event)\" [icon]=\"tableOptions.legend?.button?.icon || 'pi pi-bars'\" [label]=\"tableOptions.legend?.button?.text || 'Legend'\" />\r\n <p-popover #op>\r\n <div [innerHTML]=\"tableOptions.legend?.content\"></div>\r\n </p-popover>\r\n }\r\n <span>Showing {{totalRecords}} records of {{totalRecordsNotFiltered}} available records</span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </p-table>\r\n</div>\r\n<ecs-column-selector [visible]=\"showColumnSelector\" [columnModalData]=\"columnModalData\" [filteredColumnData]=\"filteredColumnData\" (visibleChange)=\"showColumnSelector=false\" (applyChanges)=\"applyColumnModalChanges($event)\"/>\r\n<ecs-export-excel [visible]=\"showExportModal\" [rowCheckboxSelectorActive]=\"tableOptions.rows?.checkboxSelector?.enabled ?? false\" [excelReportTitle]=\"excelReportTitle\" [allowTitleUserEdit]=\"tableOptions.excelReport?.titleAllowUserEdit ?? false\" (visibleChange)=\"showExportModal=false\" (exportToExcel)=\"generateExcelReport($event)\"/>\r\n<ecs-views-management [visible]=\"viewsModalShow\" [tableViews_menuItems]=\"tableViews_menuItems\" \r\n (onViewSelect)=\"viewLoad($event)\" (onViewCreate)=\"viewCreate($event)\" (onViewDelete)=\"viewDelete($event)\" (onViewEditAlias)=\"viewEditAlias($event)\" (onViewUpdateData)=\"viewUpdateData($event)\" (onViewUpdateActiveStartup)=\"viewUpdateActiveStartup($event)\"\r\n (visibleChange)=\"viewsModalShow=false\"/>","/*\r\n * Public API Surface of ecs-primeng-table\r\n */\r\n// ENUMS\r\nexport * from './lib/enums';\r\n\r\n// INTERFACES\r\nexport * from './lib/interfaces/columns-metadata.interface';\r\nexport * from './lib/interfaces/predefined-filter.interface';\r\nexport * from './lib/interfaces/table-button.interface';\r\nexport * from './lib/interfaces/table-options.interface';\r\n\r\n// UTILS\r\nexport * from \"./lib/utils/create-table-options\";\r\n\r\n// SERVICES\r\nexport * from './lib/services';\r\n\r\n// COMPONENTS AND DEPENDENCIES\r\nexport * from './lib/components/ecs-primeng-table/ecs-primeng-table';\r\nexport * from './lib/components/ecs-primeng-table/ecs-primeng-table.service';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ECSPrimengTableHttpService","i1.ECSPrimengTableNotificationService","i2.ECSPrimengTableService","i5","i1","i2","i1.ECSPrimengTableService","i4","i3","i7","i11","i12","i2.ExportExcelService","i6","i2.ECSPrimengTableNotificationService","i8","i10"],"mappings":"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"}
|