shirkasoft-ui-components 1.3.8 → 1.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -12
- package/fesm2022/shirkasoft-ui-components-button.mjs +2 -2
- package/fesm2022/shirkasoft-ui-components-button.mjs.map +1 -1
- package/fesm2022/shirkasoft-ui-components-confirm-dialog.mjs +2 -2
- package/fesm2022/shirkasoft-ui-components-confirm-dialog.mjs.map +1 -1
- package/fesm2022/shirkasoft-ui-components-date-picker.mjs +2 -2
- package/fesm2022/shirkasoft-ui-components-date-picker.mjs.map +1 -1
- package/fesm2022/shirkasoft-ui-components-loading.mjs +2 -2
- package/fesm2022/shirkasoft-ui-components-loading.mjs.map +1 -1
- package/fesm2022/shirkasoft-ui-components-modal.mjs +2 -2
- package/fesm2022/shirkasoft-ui-components-modal.mjs.map +1 -1
- package/fesm2022/shirkasoft-ui-components-notification.mjs +2 -2
- package/fesm2022/shirkasoft-ui-components-notification.mjs.map +1 -1
- package/fesm2022/shirkasoft-ui-components-price-input.mjs +2 -2
- package/fesm2022/shirkasoft-ui-components-price-input.mjs.map +1 -1
- package/fesm2022/shirkasoft-ui-components-select.mjs +2 -2
- package/fesm2022/shirkasoft-ui-components-select.mjs.map +1 -1
- package/fesm2022/shirkasoft-ui-components-table.mjs +198 -12
- package/fesm2022/shirkasoft-ui-components-table.mjs.map +1 -1
- package/fesm2022/shirkasoft-ui-components-tabs.mjs +7 -12
- package/fesm2022/shirkasoft-ui-components-tabs.mjs.map +1 -1
- package/fesm2022/shirkasoft-ui-components-tag.mjs +3 -3
- package/fesm2022/shirkasoft-ui-components-tag.mjs.map +1 -1
- package/fesm2022/shirkasoft-ui-components-text-field.mjs +2 -2
- package/fesm2022/shirkasoft-ui-components-text-field.mjs.map +1 -1
- package/fesm2022/shirkasoft-ui-components-toggle.mjs +61 -24
- package/fesm2022/shirkasoft-ui-components-toggle.mjs.map +1 -1
- package/package.json +1 -1
- package/src/theme.css +80 -0
- package/types/shirkasoft-ui-components-table.d.ts +86 -9
- package/types/shirkasoft-ui-components-toggle.d.ts +7 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shirkasoft-ui-components-table.mjs","sources":["../../../projects/ui-components/table/table.component.ts","../../../projects/ui-components/table/table.component.html","../../../projects/ui-components/table/shirkasoft-ui-components-table.ts"],"sourcesContent":["import {\n Component,\n input,\n output,\n inject,\n signal,\n computed,\n effect,\n linkedSignal,\n ChangeDetectionStrategy,\n untracked,\n ChangeDetectorRef,\n DestroyRef,\n HostListener,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { TranslocoModule, TranslocoService } from '@jsverse/transloco';\nimport { debounceTime, Subject, Subscription } from 'rxjs';\nimport { LucideDynamicIcon, LucidePlus } from '@lucide/angular';\nimport { TagComponent, TagSeverity } from 'shirkasoft-ui-components/tag';\nimport { TooltipComponent } from 'shirkasoft-ui-components/tooltip';\nimport { getIcon as getIconFromCentral } from 'shirkasoft-ui-components/utils';\n\nexport interface Column {\n field: string;\n header: string;\n sortable?: boolean;\n filter?: boolean;\n filterPlaceholder?: string;\n width?: string;\n defaultSort?: true;\n filterType?: 'text' | 'exact' | 'select';\n filterOptions?: { label: string; value: any }[];\n template?: 'text' | 'tag';\n format?: (row: any) => string;\n tagValue?: (row: any) => string;\n tagSeverity?: (row: any) => TagSeverity | undefined;\n tagRounded?: boolean | ((row: any) => boolean);\n tagIcon?: string | ((row: any) => string);\n tagStyle?: (row: any) => Record<string, string | number> | undefined;\n}\n\nexport interface TableAction {\n label: string;\n icon: string | any;\n onClick: () => void;\n class?: string;\n isVisible?: () => boolean;\n isDisabled?: () => boolean;\n}\n\nexport interface RowAction {\n label: string | ((data: any) => string);\n icon: string | ((data: any) => any) | any;\n onClick: (rowData: any) => void;\n class?: string | ((data: any) => string);\n isVisible?: (rowData: any) => boolean;\n isDisabled?: (rowData: any) => boolean;\n}\n\nexport interface PageChangeEvent {\n first: number;\n rows: number;\n page: number;\n pageCount: number;\n}\n\nexport interface FilterChangeEvent {\n filters: { [key: string]: any };\n}\n\n/**\n * Shirkasoft UI Components.\n * Authors: Roberto Valladares Martin (Ansem13), Julio César García García (Sanjuli14).\n * Belongs to Shirkasoft.\n */\n\n/**\n * Data table with sorting, column filters, global search, pagination,\n * row/header actions, tag cells and optional server-side mode.\n */\n@Component({\n selector: 'shk-table',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n TranslocoModule,\n LucideDynamicIcon,\n TagComponent,\n TooltipComponent,\n ],\n templateUrl: './table.component.html',\n styles: [\n `\n input:focus {\n outline: none;\n }\n input[type='text'] {\n font-weight: normal !important;\n }\n table th {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n table td {\n white-space: normal;\n word-break: break-word;\n }\n td button svg {\n width: 1.125rem !important;\n height: 1.125rem !important;\n }\n td button:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n .table-action-btn svg {\n width: 1rem !important;\n height: 1rem !important;\n min-width: 1rem !important;\n min-height: 1rem !important;\n }\n .table-action-btn {\n padding: 0.5rem !important;\n min-width: 2rem !important;\n min-height: 2rem !important;\n display: inline-flex !important;\n align-items: center !important;\n justify-content: center !important;\n }\n .table-scroll-wrapper {\n width: 100%;\n overflow-x: auto;\n overflow-y: hidden;\n border-radius: inherit;\n -webkit-overflow-scrolling: touch;\n container-type: inline-size;\n }\n .table-card {\n container-type: inline-size;\n }\n .table-pagination {\n container-type: inline-size;\n }\n @container (max-width: 640px) {\n .table-pagination {\n flex-direction: column;\n align-items: center;\n gap: 0.5rem;\n }\n .table-pagination > div {\n justify-content: center;\n }\n }\n .table-scroll-wrapper table {\n table-layout: fixed;\n width: 100%;\n }\n\n /*\n On wide screens the table behaves as before (auto columns stretching to\n 100% of the container, no horizontal scroll). Only when the real\n container is narrow (container query, not a viewport media query, so it\n also works inside sidebars/panels) columns get a fixed width (see\n getColumnWidth in the TS) so the table's intrinsic width exceeds the\n container and horizontal scrolling actually works, snapping column by\n column. table-layout: auto is used in compact mode because with\n table-layout: fixed the table is forced to the container width and\n cannot overflow (dead scroll).\n */\n @container (max-width: 768px) {\n .table-scroll-wrapper {\n scroll-snap-type: x mandatory;\n }\n .table-scroll-wrapper table {\n table-layout: auto;\n width: 100%;\n }\n .table-scroll-wrapper th:not([data-shk-actions]),\n .table-scroll-wrapper td:not([data-shk-actions]) {\n min-width: var(--shk-col-width, 140px);\n max-width: var(--shk-col-width, 140px);\n }\n .table-scroll-wrapper th,\n .table-scroll-wrapper td {\n scroll-snap-align: start;\n }\n }\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n `,\n ],\n})\nexport class TableComponent {\n private fb = inject(FormBuilder);\n private cdr = inject(ChangeDetectorRef);\n private transloco = inject(TranslocoService);\n private destroyRef = inject(DestroyRef);\n\n/** Maps icon names to lucide components, falling back to a plus icon. */\n protected getIcon = (name: any) => getIconFromCentral(name, LucidePlus);\n\n /**\n * Minimum width applied to each column (except `actions`, which keeps its\n * own computed width) only on narrow screens. On wide screens columns\n * stretch normally to fill the container width. Can be overridden per\n * column via `col.width`.\n */\n protected readonly DEFAULT_COLUMN_WIDTH = '140px';\n\n /** Returns the effective CSS width for a column ('actions' included). */\n getColumnWidth(col: Column): string {\n return col.width || this.DEFAULT_COLUMN_WIDTH;\n }\n\n /** Signal with the translated \"Actions\" header label. */\n private actionsHeaderLabel = toSignal(this.transloco.selectTranslate('common.actions'), {\n initialValue: 'Acciones',\n });\n\n /** Signal reacting to language changes so imperative translations are recomputed. */\n private currentLang = toSignal(this.transloco.langChanges$, {\n initialValue: this.transloco.getActiveLang(),\n });\n\n /** Reactive signal of loaded translations so pageReport is not stuck with raw keys. */\n private translations = toSignal(this.transloco.selectTranslation());\n\n /** Full dataset. In server-side mode only the current page rows. */\n data = input<any[]>([]);\n /** Column definitions (field, header, filterable, tag cell options, etc.). */\n columns = input<Column[]>([]);\n /** Number of rows displayed per page. */\n rowsPerPage = input<number>(10);\n /** Options shown in the rows-per-page selector. */\n rowsPerPageOptions = input<number[]>([10, 25, 50]);\n /** Whether the table is in loading state (shows the overlay/skeleton). */\n loading = input<boolean>(false);\n /** Whether to render the row actions column. */\n showActionRow = input<boolean>(true);\n /** Custom cell/header templates keyed by column field. */\n customTemplates = input<{ [key: string]: any }>({});\n /** Actions rendered in the table header. */\n headerActions = input<TableAction[]>([]);\n /** Actions rendered per row (icon, label, class, visibility/disabled). */\n rowActions = input<RowAction[]>([]);\n /** Whether the table container renders a drop shadow. */\n hasShadow = input<boolean>(true);\n /** Field used as the default initial sort. */\n defaultSortField = input<string>('');\n /** Order used by the default initial sort (1 asc, -1 desc). */\n defaultSortOrder = input<number>(1);\n /** Whether the global search input is shown. */\n showSearch = input<boolean>(true);\n /** Placeholder for the global search input. */\n searchPlaceholder = input<string>('');\n /** Message shown when there are no rows. */\n emptyMessage = input<string>('');\n /** Enables server-side pagination/filtering/sorting mode. */\n serverSide = input<boolean>(false);\n /** Total number of records in server-side mode (for pagination math). */\n totalRecords = input<number>(0);\n /** Optional prebuilt filter chips (label + value) shown above the table. */\n filters = input<{ label: string; value: string }[]>([]);\n /** Currently active filter chip value. */\n activeFilter = input<string>('');\n\n /** Emits when the user clicks the refresh button. */\n refresh = output<void>();\n /** Emits page changes (server-side mode) with first/rows/page info. */\n pageChange = output<PageChangeEvent>();\n /** Emits the active column filters. */\n filterChange = output<FilterChangeEvent>();\n /** Emits the debounced global search term. */\n searchChange = output<string>();\n /** Emits when a filter chip is clicked. */\n filterClick = output<string>();\n\n /** Internal copy of the input data used as the base for search/filter. */\n private originalData = signal<any[]>([]);\n /** Rows after the global search is applied. */\n searchedData = signal<any[]>([]);\n /** Rows after column filters are applied. */\n filteredData = signal<any[]>([]);\n /** Rows belonging to the current page (after slicing). */\n displayedData = signal<any[]>([]);\n /** Local total records after filtering (client mode). */\n localTotalRecords = signal<number>(0);\n /** Index of the first row of the current page. */\n first = signal<number>(0);\n /** Visibility map for each column filter input. */\n showFilterInput = signal<{ [key: string]: boolean }>({});\n /** Current global search term. */\n searchQuery = signal<string>('');\n /** Currently sorted field. */\n sortField = signal<string>('');\n /** Current sort direction (1 asc, -1 desc). */\n sortOrder = signal<number>(1);\n /** Local rows per page, kept in sync with the `rowsPerPage` input. */\n rowsPerPageLocal = linkedSignal(() => this.rowsPerPage());\n\n /** Total number of pages based on the effective record count. */\n totalPages = computed(() =>\n Math.max(1, Math.ceil(this.effectiveTotalRecords() / this.rowsPerPageLocal())),\n );\n /** Current page number (1-based). */\n currentPage = computed(() => Math.floor(this.first() / this.rowsPerPageLocal()) + 1);\n\n /** Reactive form holding the value of each column filter. */\n columnFiltersForm!: FormGroup;\n\n /** Subjects used to debounce column filters (server mode) and search. */\n private filterSubject = new Subject<void>();\n private searchSubject = new Subject<string>();\n\n /**\n * Signature of the last built set of filterable fields (+filter type) to\n * avoid rebuilding the form (and losing user input) on reference changes.\n */\n private lastFilterFieldsSignature = '';\n private columnFilterSubscriptions: Subscription[] = [];\n\n /** Columns array with the leading `actions` column when row actions exist. */\n columnsWithActions = computed<Column[]>(() => {\n const columnsArray = this.columns();\n const showAction = this.showActionRow();\n const rowActionsArray = this.rowActions();\n const translatedHeader = this.actionsHeaderLabel();\n if (showAction && rowActionsArray.length > 0) {\n const visibleCount = Math.min(rowActionsArray.length, this.MAX_VISIBLE_ACTIONS);\n const hasDropdown = rowActionsArray.length > this.MAX_VISIBLE_ACTIONS;\n const extraWidth = hasDropdown ? 40 : 0;\n let baseWidth: string;\n if (visibleCount <= 2) {\n baseWidth = '110px';\n } else if (visibleCount <= 3) {\n baseWidth = '130px';\n } else {\n baseWidth = '170px';\n }\n const actionsWidth = `calc(${baseWidth} + ${extraWidth}px)`;\n return [\n {\n field: 'actions',\n header: translatedHeader || 'Acciones',\n width: actionsWidth,\n defaultSort: true,\n },\n ...columnsArray,\n ];\n }\n return [...columnsArray];\n });\n\n /** Total records: server-provided in server mode, locally computed otherwise. */\n effectiveTotalRecords = computed(() => {\n return this.serverSide() ? this.totalRecords() : this.localTotalRecords();\n });\n /**\n * Rows rendered by the template: the input data in server-side mode or the\n * locally sliced/page current rows otherwise.\n */\n effectiveDisplayedData = computed(() => {\n return this.serverSide() ? this.data() : this.displayedData();\n });\n\n /**\n * Reactive \"X to Y of Z\" report. Depends on loaded translations and the\n * active language so it always reflects the translated template.\n */\n pageReport = computed(() => {\n this.translations(); // forces recomputation when translations finish loading\n this.currentLang(); // forces recomputation when the language changes\n const total = this.effectiveTotalRecords();\n if (total === 0) {\n return this.transloco.translate('table.pageReport', {\n from: 0,\n to: 0,\n total: 0,\n });\n }\n const from = this.first() + 1;\n const to = Math.min(this.first() + this.rowsPerPageLocal(), total);\n return this.transloco.translate('table.pageReport', { from, to, total });\n });\n\n constructor() {\n this.columnFiltersForm = this.fb.group({});\n\n // Debounced column-filter changes (server-side mode only).\n this.filterSubject\n .pipe(debounceTime(300), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n if (this.serverSide()) {\n this.emitFilterChange();\n }\n });\n\n // Debounced global search changes (server-side mode only).\n this.searchSubject\n .pipe(debounceTime(300), takeUntilDestroyed(this.destroyRef))\n .subscribe((value) => {\n this.searchChange.emit(value);\n });\n\n // When input data changes, refresh the internal copy and re-apply filters\n // unless the server already handles the filtering.\n effect(() => {\n const newData = this.data();\n untracked(() => {\n this.originalData.set([...newData]);\n if (!this.serverSide()) {\n this.applyFilters();\n }\n });\n });\n\n // Rebuild the column filter form whenever the columns change.\n effect(() => {\n const cols = this.columns();\n untracked(() => {\n this.setupColumnFilters(cols);\n });\n });\n\n // Apply the default sort once when the default fields are provided.\n effect(() => {\n const field = this.defaultSortField();\n const order = this.defaultSortOrder();\n if (field) {\n untracked(() => {\n this.sortField.set(field);\n this.sortOrder.set(order);\n if (!this.serverSide()) {\n this.applySort();\n this.updateDisplayedData();\n }\n });\n }\n });\n\n // Apply the global search locally whenever the term changes.\n effect(() => {\n const query = this.searchQuery();\n untracked(() => {\n if (!this.serverSide()) {\n this.applySearch();\n }\n });\n });\n }\n\n /**\n * Builds (or keeps) the reactive form with one control per filterable\n * column. The form is only rebuilt when the set of filterable\n * fields/filter types changes, preserving the values already typed by the\n * user otherwise. Previous subscriptions are unsubscribed to avoid leaks.\n */\n private setupColumnFilters(cols: Column[]) {\n const filterableCols = cols.filter((c) => c.filter);\n const signature = filterableCols.map((c) => `${c.field}:${c.filterType ?? 'text'}`).join('|');\n\n if (signature === this.lastFilterFieldsSignature && this.columnFiltersForm) {\n return;\n }\n this.lastFilterFieldsSignature = signature;\n\n // Clean up previous subscriptions before rebuilding.\n this.columnFilterSubscriptions.forEach((sub) => sub.unsubscribe());\n this.columnFilterSubscriptions = [];\n\n const previousValues: { [key: string]: any } = {};\n if (this.columnFiltersForm) {\n Object.keys(this.columnFiltersForm.controls).forEach((field) => {\n previousValues[field] = this.columnFiltersForm.get(field)?.value;\n });\n }\n\n const filterControls: any = {};\n const filterVisibility: { [key: string]: boolean } = { ...this.showFilterInput() };\n filterableCols.forEach((col) => {\n const defaultValue = col.filterType === 'select' ? null : '';\n const preserved = previousValues.hasOwnProperty(col.field)\n ? previousValues[col.field]\n : defaultValue;\n filterControls[col.field] = [preserved];\n if (!(col.field in filterVisibility)) {\n filterVisibility[col.field] = false;\n }\n });\n\n this.columnFiltersForm = this.fb.group(filterControls);\n this.showFilterInput.set(filterVisibility);\n\n Object.keys(this.columnFiltersForm.controls).forEach((field) => {\n const sub = this.columnFiltersForm\n .get(field)\n ?.valueChanges.pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.first.set(0);\n if (this.serverSide()) {\n this.filterSubject.next();\n } else {\n this.applyFilters();\n }\n this.cdr.markForCheck();\n });\n if (sub) {\n this.columnFilterSubscriptions.push(sub);\n }\n });\n }\n\n /** Collects the non-empty column filter values and emits them. */\n private emitFilterChange() {\n const filters: { [key: string]: any } = {};\n Object.keys(this.columnFiltersForm.controls).forEach((field) => {\n const value = this.columnFiltersForm.get(field)?.value;\n if (value !== null && value !== undefined && value !== '') {\n filters[field] = value;\n }\n });\n this.filterChange.emit({ filters });\n }\n\n /** Applies the global search over the original data (client mode). */\n private applySearch() {\n const original = this.originalData();\n const query = this.searchQuery().toLowerCase();\n if (!query) {\n this.searchedData.set([...original]);\n } else {\n const filtered = original.filter((item) => {\n return Object.values(item).some((val) => {\n if (val === null || val === undefined) return false;\n return String(val).toLowerCase().includes(query);\n });\n });\n this.searchedData.set(filtered);\n }\n this.applyColumnFilters();\n }\n\n /** Entry point that applies search (which cascades into column filters). */\n private applyFilters() {\n this.applySearch();\n }\n\n /**\n * Applies every column filter on top of the searched data using each\n * column's `filterType` ('select', 'exact' or text contains).\n */\n private applyColumnFilters() {\n const data = this.searchedData();\n let filtered = [...data];\n this.columns().forEach((col) => {\n if (col.filter) {\n const filterValue = this.columnFiltersForm.get(col.field)?.value;\n if (filterValue !== null && filterValue !== undefined && filterValue !== '') {\n if (col.filterType === 'select') {\n filtered = filtered.filter((item) => item[col.field] == filterValue);\n } else if (col.filterType === 'exact') {\n const searchTerm = String(filterValue).toLowerCase();\n filtered = filtered.filter(\n (item) => String(item[col.field]).toLowerCase() === searchTerm,\n );\n } else {\n const searchTerm = String(filterValue).toLowerCase();\n filtered = filtered.filter((item) =>\n String(item[col.field]).toLowerCase().includes(searchTerm),\n );\n }\n }\n }\n });\n this.filteredData.set(filtered);\n this.localTotalRecords.set(filtered.length);\n this.applySort();\n this.updateDisplayedData();\n }\n\n /** Slices the filtered rows for the current page. */\n private updateDisplayedData() {\n const filtered = this.filteredData();\n const firstIndex = this.first();\n const rows = this.rowsPerPageLocal();\n const displayed = filtered.slice(firstIndex, firstIndex + rows);\n this.displayedData.set(displayed);\n }\n\n /** Emits the filter chip clicked in the template. */\n onFilterClick(value: string) {\n this.filterClick.emit(value);\n }\n\n /** Toggles the sort direction of a column (first click sorts ascending). */\n toggleSort(field: string) {\n if (this.sortField() === field) {\n this.sortOrder.set(this.sortOrder() * -1);\n } else {\n this.sortField.set(field);\n this.sortOrder.set(1);\n }\n this.first.set(0);\n if (!this.serverSide()) {\n this.applySort();\n this.updateDisplayedData();\n }\n }\n\n /**\n * Sorts the filtered rows by the current field. Rows with null/undefined\n * values are always kept at the end regardless of sort direction.\n */\n private applySort() {\n const field = this.sortField();\n const order = this.sortOrder();\n if (!field) return;\n const data = [...this.filteredData()];\n data.sort((a, b) => {\n const va = a[field];\n const vb = b[field];\n if (va == null && vb == null) return 0;\n if (va == null) return 1; // nulls always at the end\n if (vb == null) return -1;\n if (va < vb) return -1 * order;\n if (va > vb) return 1 * order;\n return 0;\n });\n this.filteredData.set(data);\n }\n\n /** Handles the global search input (updates query, resets page, debounces server mode). */\n onSearchInput(value: string) {\n this.searchQuery.set(value);\n this.first.set(0);\n if (this.serverSide()) {\n this.searchSubject.next(value);\n }\n }\n\n /** Clears a column filter value and hides its input. */\n clearFilter(field: string) {\n const column = this.columns().find((col) => col.field === field);\n const value = column?.filterType === 'select' ? null : '';\n this.columnFiltersForm.get(field)?.setValue(value);\n const visibility = this.showFilterInput();\n this.showFilterInput.set({ ...visibility, [field]: false });\n this.cdr.markForCheck();\n }\n\n /** Toggles the visibility of a column filter input. */\n toggleFilter(field: string) {\n const visibility = this.showFilterInput();\n this.showFilterInput.set({ ...visibility, [field]: !visibility[field] });\n this.cdr.markForCheck();\n }\n\n /**\n * Whether a column filter is non-empty. Avoids treating the number 0 as\n * \"no value\".\n */\n hasFilterValue(field: string): boolean {\n const value = this.columnFiltersForm.get(field)?.value;\n return value !== null && value !== undefined && value !== '';\n }\n\n /** Returns the reactive page report string (template helper). */\n getPageReport(): string {\n return this.pageReport();\n }\n\n /** Goes to the first page (emits pageChange in server-side mode). */\n goToFirst() {\n const rows = this.rowsPerPageLocal();\n this.first.set(0);\n if (this.serverSide()) {\n this.pageChange.emit({\n first: 0,\n rows,\n page: 0,\n pageCount: Math.ceil(this.totalRecords() / rows),\n });\n } else {\n this.updateDisplayedData();\n }\n }\n\n /** Goes to the last page (emits pageChange in server-side mode). */\n goToLast() {\n const total = this.serverSide() ? this.totalRecords() : this.filteredData().length;\n const rows = this.rowsPerPageLocal();\n const lastFirst = Math.max(0, Math.ceil(total / rows) * rows - rows);\n this.first.set(lastFirst);\n if (this.serverSide()) {\n const page = Math.floor(lastFirst / rows);\n this.pageChange.emit({\n first: lastFirst,\n rows,\n page,\n pageCount: Math.ceil(total / rows),\n });\n } else {\n this.updateDisplayedData();\n }\n }\n\n /** Updates rows-per-page and resets to the first page. */\n onRowsPerPageChange(rows: number) {\n rows = Number(rows);\n this.rowsPerPageLocal.set(rows);\n this.first.set(0);\n if (this.serverSide()) {\n this.pageChange.emit({\n first: 0,\n rows,\n page: 0,\n pageCount: Math.ceil(this.totalRecords() / rows),\n });\n } else {\n this.updateDisplayedData();\n }\n }\n\n /** Emits the refresh output. */\n refreshData() {\n this.refresh.emit();\n }\n\n /** Whether the current page is the first one. */\n isFirstPage(): boolean {\n return this.first() === 0;\n }\n\n /** Whether the current page is the last one. */\n isLastPage(): boolean {\n const total = this.effectiveTotalRecords();\n return this.first() + this.rowsPerPageLocal() >= total;\n }\n\n /** Moves to the next page (emits pageChange in server-side mode). */\n next() {\n const total = this.serverSide() ? this.totalRecords() : this.filteredData().length;\n const rows = this.rowsPerPageLocal();\n let first = this.first() + rows;\n if (first >= total) {\n first = total - rows;\n }\n this.first.set(first);\n if (this.serverSide()) {\n const page = Math.floor(first / rows);\n this.pageChange.emit({\n first,\n rows,\n page,\n pageCount: Math.ceil(total / rows),\n });\n } else {\n this.updateDisplayedData();\n }\n }\n\n /** Moves to the previous page (emits pageChange in server mode). */\n prev() {\n const rows = this.rowsPerPageLocal();\n let first = this.first() - rows;\n const total = this.serverSide() ? this.totalRecords() : this.filteredData().length;\n if (first < 0) {\n first = 0;\n }\n this.first.set(first);\n if (this.serverSide()) {\n const page = Math.floor(first / rows);\n this.pageChange.emit({\n first,\n rows,\n page,\n pageCount: Math.ceil(total / rows),\n });\n } else {\n this.updateDisplayedData();\n }\n }\n\n /** Resets the table to the first page. */\n reset() {\n this.goToFirst();\n }\n\n /** Resolves the row action label, static or per-row function. */\n getRowActionLabel(action: RowAction, rowData: any): string {\n return typeof action.label === 'function' ? action.label(rowData) : action.label;\n }\n\n /**\n * Resolves the row action icon: a lucide component, a function returning\n * the icon name, or a raw string resolved by the central icon map.\n */\n getRowActionIconName(action: RowAction, rowData: any): any {\n const icon = action.icon;\n if (typeof icon === 'function') {\n if (icon.prototype === undefined) {\n return icon(rowData);\n }\n return icon;\n }\n return icon;\n }\n\n /** Resolves the CSS class of a row action, static or per-row function. */\n getRowActionClass(action: RowAction, rowData: any): string {\n if (!action.class) return '';\n return typeof action.class === 'function' ? action.class(rowData) : action.class;\n }\n\n /** Whether a header action is disabled. */\n isHeaderActionDisabled(action: TableAction): boolean {\n return action.isDisabled ? action.isDisabled() : false;\n }\n\n /** Whether a header action is visible. */\n isHeaderActionVisible(action: TableAction): boolean {\n return action.isVisible ? action.isVisible() : true;\n }\n\n /** Whether a row action is disabled for the given row. */\n isRowActionDisabled(action: RowAction, rowData: any): boolean {\n return action.isDisabled ? action.isDisabled(rowData) : false;\n }\n\n /** Whether a row action is visible for the given row. */\n isRowActionVisible(action: RowAction, rowData: any): boolean {\n return action.isVisible ? action.isVisible(rowData) : true;\n }\n\n /** Truncates a value with an ellipsis past the given character limit. */\n truncate(value: any, limit: number = 30): string {\n if (value === null || value === undefined) return '';\n const str = String(value);\n return str.length > limit ? str.slice(0, limit) + '\\u2026' : str;\n }\n\n /** Resolves the value displayed inside a tag cell, static or per-row function. */\n getTagValue(col: Column, rowData: any): string {\n return col.tagValue ? col.tagValue(rowData) : String(rowData[col.field] ?? '');\n }\n\n /** Resolves and validates the tag severity, falling back to 'secondary'. */\n getTagSeverity(col: Column, rowData: any): TagSeverity {\n const raw = col.tagSeverity ? col.tagSeverity(rowData) : 'secondary';\n const allowed: TagSeverity[] = [\n 'secondary',\n 'success',\n 'info',\n 'warning',\n 'danger',\n 'contrast',\n ];\n return allowed.includes(raw as TagSeverity) ? (raw as TagSeverity) : 'secondary';\n }\n\n /** Resolves whether the tag in a cell is rounded, static or per-row function. */\n getTagRounded(col: Column, rowData: any): boolean {\n if (typeof col.tagRounded === 'function') return col.tagRounded(rowData);\n return col.tagRounded ?? false;\n }\n\n /** Resolves the icon shown inside a tag cell, static or per-row function. */\n getTagIcon(col: Column, rowData: any): string {\n if (typeof col.tagIcon === 'function') return col.tagIcon(rowData);\n return col.tagIcon ?? '';\n }\n\n /** Resolves the CSS styles of a tag cell, static or per-row function. */\n getTagStyle(col: Column, rowData: any): Record<string, string | number> {\n return col.tagStyle ? col.tagStyle(rowData) || {} : {};\n }\n\n /**\n * trackBy for row identity: prefers `id`/`_id` and falls back to the index.\n */\n trackByRow(row: any, index: number): any {\n return row?.id ?? row?._id ?? index;\n }\n\n /** Keyboard support (Enter/Space) for sorting a column header. */\n onHeaderKeydown(event: KeyboardEvent, col: Column) {\n if (col.field === 'actions' || !col.sortable) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.toggleSort(col.field);\n }\n }\n\n /** Accessible aria-sort value for a given column header. */\n getAriaSort(col: Column): 'ascending' | 'descending' | 'none' {\n if (col.field === 'actions' || !col.sortable) return 'none';\n if (this.sortField() !== col.field) return 'none';\n return this.sortOrder() === 1 ? 'ascending' : 'descending';\n }\n\n /** Maximum number of row actions shown directly before collapsing into a dropdown. */\n protected readonly MAX_VISIBLE_ACTIONS = 4;\n\n /** Tracks which row's \"more actions\" dropdown is currently open (keyed by row identity). */\n actionsDropdownOpen = signal<Record<string, boolean>>({});\n\n /** Returns the row actions that should be displayed as direct icon buttons. */\n getVisibleRowActions(rowData: any): RowAction[] {\n const visible = this.rowActions().filter((a) => this.isRowActionVisible(a, rowData));\n return visible.slice(0, this.MAX_VISIBLE_ACTIONS);\n }\n\n /** Returns the row actions that overflow into the \"more\" dropdown. */\n getHiddenRowActions(rowData: any): RowAction[] {\n const visible = this.rowActions().filter((a) => this.isRowActionVisible(a, rowData));\n return visible.slice(this.MAX_VISIBLE_ACTIONS);\n }\n\n /** Toggles the \"more actions\" dropdown for a given row, closing any other open dropdown. */\n toggleActionsDropdown(rowData: any, event?: Event) {\n const key = this.getRowKey(rowData);\n const current = this.actionsDropdownOpen();\n const wasOpen = !!current[key];\n const next: Record<string, boolean> = {};\n if (!wasOpen) {\n next[key] = true;\n }\n this.actionsDropdownOpen.set(next);\n if (!wasOpen) {\n this.computeDropdownPosition(event);\n }\n }\n\n /** Computes the fixed position of the dropdown so it's not clipped by overflow. */\n dropdownPosition = signal<{ top: number; left: number }>({ top: 0, left: 0 });\n\n private computeDropdownPosition(event?: Event) {\n if (!event) return;\n const target = (event.currentTarget || event.target) as HTMLElement;\n const rect = target.getBoundingClientRect();\n const dropdownHeight = 180;\n const spaceBelow = window.innerHeight - rect.bottom;\n let top = rect.bottom + 4;\n let left = rect.right - 160;\n if (spaceBelow < dropdownHeight) {\n top = rect.top - dropdownHeight - 4;\n }\n if (left < 8) {\n left = 8;\n }\n this.dropdownPosition.set({ top, left });\n }\n\n /** Whether the \"more actions\" dropdown is open for a given row. */\n isActionsDropdownOpen(rowData: any): boolean {\n const key = this.getRowKey(rowData);\n return !!this.actionsDropdownOpen()[key];\n }\n\n /** Returns a unique key for a row to track dropdown state. */\n private getRowKey(rowData: any): string {\n return String(rowData?.id ?? rowData?._id ?? JSON.stringify(rowData));\n }\n\n /** Closes all open action dropdowns when clicking anywhere on the document. */\n @HostListener('document:click')\n onDocumentClick() {\n const current = this.actionsDropdownOpen();\n const hasOpen = Object.values(current).some((v) => v);\n if (hasOpen) {\n this.actionsDropdownOpen.set({});\n }\n }\n}\n","<div class=\"space-y-2 min-[1440px]:space-y-3 mt-2 min-[1440px]:mt-3 animate-fade-in pb-8\">\n @if (showSearch() || filters().length > 0 || headerActions().length > 0) {\n <div class=\"card p-2 min-[1440px]:p-2.5 flex flex-row items-center justify-between gap-2\">\n <div class=\"flex items-center gap-2 min-[1440px]:gap-3 flex-1 min-w-0\">\n @if (showSearch()) {\n <div class=\"relative w-full md:w-52 min-[1440px]:w-56\">\n <label [for]=\"'shk-table-search'\" class=\"sr-only\">{{\n searchPlaceholder() || ('common.search_placeholder' | transloco)\n }}</label>\n <div class=\"absolute inset-y-0 left-0 pl-2.5 flex items-center pointer-events-none\">\n <svg\n [lucideIcon]=\"getIcon('search')\"\n class=\"w-3.5 h-3.5 _shk-text-surface-400 dark:[color:var(--shk-surface-500)]\"\n ></svg>\n </div>\n <input\n id=\"shk-table-search\"\n type=\"text\"\n [value]=\"searchQuery()\"\n (input)=\"onSearchInput($any($event.target).value)\"\n [placeholder]=\"searchPlaceholder() || ('common.search_placeholder' | transloco)\"\n class=\"block w-full pl-8 pr-3 py-1.5 text-xs border _shk-border dark:[border-color:var(--shk-surface-200)] rounded-md leading-5 _shk-bg-surface-50 dark:[background-color:var(--shk-surface-100)] placeholder:[color:var(--shk-surface-400)] dark:placeholder:[color:var(--shk-surface-500)] _shk-text-surface-700 dark:[color:var(--shk-surface-700)] focus:outline-none focus:bg-white dark:focus:[background-color:var(--shk-surface-800)] focus:[border-color:var(--shk-primary-500)] focus:ring-1 focus:[--tw-ring-color:var(--shk-primary-500)]\"\n />\n </div>\n }\n @if (filters().length > 0) {\n <div\n class=\"flex _shk-bg-surface-100 dark:[background-color:var(--shk-surface-100)] p-0.5 rounded-md ml-auto\"\n role=\"group\"\n >\n @for (f of filters(); track f.value) {\n <button\n type=\"button\"\n (click)=\"onFilterClick(f.value)\"\n [attr.aria-pressed]=\"f.value === activeFilter()\"\n class=\"px-2.5 min-[1440px]:px-3 py-1 text-xs font-medium rounded _shk-text-surface-700 dark:[color:var(--shk-surface-700)] transition-all\"\n [class]=\"\n f.value === activeFilter()\n ? 'bg-white shadow-sm dark:[background-color:var(--shk-surface-700)]'\n : ''\n \"\n >\n {{ f.label }}\n </button>\n }\n </div>\n }\n </div>\n @if (headerActions().length > 0) {\n <div class=\"flex items-center gap-1.5 shrink-0\">\n @for (action of headerActions(); track $index) {\n @if (isHeaderActionVisible(action)) {\n <button\n type=\"button\"\n [class]=\"\n 'inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded-md _shk-bg-primary text-white hover:[background-color:var(--shk-primary-700)] transition-colors disabled:opacity-50 disabled:cursor-not-allowed ' +\n (action.class || '')\n \"\n [disabled]=\"isHeaderActionDisabled(action)\"\n [attr.aria-label]=\"action.label\"\n (click)=\"action.onClick()\"\n >\n @if (action.icon) {\n <svg [lucideIcon]=\"getIcon(action.icon)\" class=\"w-3.5 h-3.5\"></svg>\n }\n {{ action.label }}\n </button>\n }\n }\n </div>\n }\n </div>\n }\n <div class=\"card p-0 overflow-hidden table-card\" [class.shadow-lg]=\"hasShadow()\">\n <div class=\"table-scroll-wrapper _shk-scrollbar\">\n <table>\n <thead>\n <tr>\n @for (col of columnsWithActions(); track col.field) {\n <th\n scope=\"col\"\n (click)=\"col.field !== 'actions' && col.sortable && toggleSort(col.field)\"\n (keydown)=\"onHeaderKeydown($event, col)\"\n [tabindex]=\"col.field !== 'actions' && col.sortable ? 0 : -1\"\n [attr.role]=\"col.field !== 'actions' && col.sortable ? 'button' : null\"\n [attr.aria-sort]=\"getAriaSort(col)\"\n [attr.data-shk-actions]=\"col.field === 'actions' ? '' : null\"\n [style.cursor]=\"col.field !== 'actions' && col.sortable ? 'pointer' : 'default'\"\n [style.width]=\"col.field === 'actions' ? col.width : null\"\n [style.min-width]=\"col.field === 'actions' ? col.width : null\"\n [style.--shk-col-width]=\"col.field !== 'actions' ? getColumnWidth(col) : null\"\n class=\"relative px-2 min-[1440px]:px-3 py-2 min-[1440px]:py-2.5 text-left text-[10px] min-[1440px]:text-xs font-bold _shk-text-surface-500 dark:[color:var(--shk-surface-400)] uppercase tracking-wider _shk-bg-surface-50 dark:[background-color:var(--shk-surface-100)] border-b _shk-border dark:[border-color:var(--shk-surface-200)] focus:outline-none focus-visible:ring-1 focus-visible:[--tw-ring-color:var(--shk-primary-500)]\"\n >\n @if (col.field !== 'actions') {\n <div class=\"flex items-center justify-between gap-2\">\n <span>{{ col.header }}</span>\n <div class=\"flex items-center gap-1\">\n @if (col.sortable) {\n <shk-tooltip [text]=\"'table.tooltips.sort' | transloco\">\n @if (sortField() === col.field) {\n <svg\n [lucideIcon]=\"getIcon(sortOrder() === 1 ? 'arrow-up' : 'arrow-down')\"\n class=\"w-3.5 h-3.5 _shk-text-primary\"\n ></svg>\n } @else {\n <svg\n [lucideIcon]=\"getIcon('arrow-up-down')\"\n class=\"w-3.5 h-3.5 _shk-text-surface-400 dark:[color:var(--shk-surface-500)]\"\n ></svg>\n }\n </shk-tooltip>\n }\n @if (col.filter) {\n <shk-tooltip [text]=\"'table.tooltips.filter' | transloco\">\n <button\n type=\"button\"\n (click)=\"$event.stopPropagation(); toggleFilter(col.field)\"\n [attr.aria-label]=\"'table.tooltips.filter' | transloco\"\n [attr.aria-expanded]=\"showFilterInput()[col.field] || false\"\n class=\"_shk-text-surface-400 dark:[color:var(--shk-surface-500)] hover:[color:var(--shk-surface-600)] dark:hover:[color:var(--shk-surface-300)] transition-colors\"\n >\n <svg\n [lucideIcon]=\"getIcon('filter')\"\n class=\"w-3.5 h-3.5\"\n [class._shk-text-primary]=\"hasFilterValue(col.field)\"\n ></svg>\n </button>\n </shk-tooltip>\n }\n </div>\n </div>\n @if (col.filter && showFilterInput()[col.field]) {\n <div\n class=\"absolute left-0 top-full z-50 mt-1 p-2 min-w-[200px] bg-white dark:[background-color:var(--shk-surface-100)] border _shk-border dark:[border-color:var(--shk-surface-200)] rounded-lg shadow-lg\"\n [formGroup]=\"columnFiltersForm\"\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"relative\">\n @if (col.filterType !== 'select') {\n <label [for]=\"'shk-filter-' + col.field\" class=\"sr-only\">{{\n col.filterPlaceholder || ('common.search_placeholder' | transloco)\n }}</label>\n <input\n [id]=\"'shk-filter-' + col.field\"\n type=\"text\"\n [formControlName]=\"col.field\"\n class=\"w-full px-3 py-1.5 text-sm rounded-md border _shk-border dark:[border-color:var(--shk-surface-200)] bg-white dark:[background-color:var(--shk-surface-100)] _shk-text-surface-700 dark:[color:var(--shk-surface-700)] focus:[border-color:var(--shk-primary-500)] focus:ring-1 focus:[--tw-ring-color:var(--shk-primary-500)] placeholder:[color:var(--shk-surface-400)] dark:placeholder:[color:var(--shk-surface-500)]\"\n [placeholder]=\"\n col.filterPlaceholder || ('common.search_placeholder' | transloco)\n \"\n />\n }\n @if (col.filterType === 'select') {\n <label [for]=\"'shk-filter-' + col.field\" class=\"sr-only\">{{\n col.filterPlaceholder || ('common.search_placeholder' | transloco)\n }}</label>\n <select\n [id]=\"'shk-filter-' + col.field\"\n [formControlName]=\"col.field\"\n class=\"w-full px-2 py-1 text-xs rounded-md border _shk-border dark:[border-color:var(--shk-surface-200)] bg-white dark:[background-color:var(--shk-surface-100)] _shk-text-surface-700 dark:[color:var(--shk-surface-700)] focus:[border-color:var(--shk-primary-500)] focus:ring-1 focus:[--tw-ring-color:var(--shk-primary-500)] appearance-none\"\n >\n <option [ngValue]=\"null\">{{ 'table.filterAll' | transloco }}</option>\n @for (opt of col.filterOptions || []; track opt.value) {\n <option [ngValue]=\"opt.value\">{{ opt.label }}</option>\n }\n </select>\n }\n @if (hasFilterValue(col.field) && col.filterType !== 'select') {\n <button\n type=\"button\"\n class=\"absolute right-2 top-1/2 -translate-y-1/2 _shk-text-surface-400 dark:[color:var(--shk-surface-500)] hover:[color:var(--shk-surface-600)] dark:hover:[color:var(--shk-surface-300)]\"\n (click)=\"clearFilter(col.field)\"\n >\n <svg [lucideIcon]=\"getIcon('x')\" class=\"w-3.5 h-3.5\"></svg>\n </button>\n }\n </div>\n </div>\n }\n } @else {\n <div class=\"flex items-center justify-center\">\n <span>{{ col.header }}</span>\n </div>\n }\n </th>\n }\n </tr>\n </thead>\n @if (loading()) {\n <tbody class=\"border-b _shk-border dark:[border-color:var(--shk-surface-100)]\">\n <tr>\n <td [attr.colspan]=\"columnsWithActions().length\" class=\"text-center py-12\">\n <div\n class=\"flex items-center justify-center\"\n role=\"status\"\n [attr.aria-label]=\"'common.loading' | transloco\"\n >\n <svg\n [lucideIcon]=\"getIcon('loader')\"\n class=\"w-6 h-6 animate-spin _shk-text-primary\"\n ></svg>\n </div>\n </td>\n </tr>\n </tbody>\n } @else if (effectiveDisplayedData().length === 0) {\n <tbody class=\"border-b _shk-border dark:[border-color:var(--shk-surface-100)]\">\n <tr>\n <td [attr.colspan]=\"columnsWithActions().length\" class=\"text-center py-12\">\n <div class=\"flex flex-col items-center\">\n <div\n class=\"w-16 h-16 _shk-bg-surface-100 dark:[background-color:var(--shk-surface-100)] rounded-full flex items-center justify-center mb-4\"\n >\n <svg\n [lucideIcon]=\"getIcon('inbox')\"\n class=\"w-8 h-8 _shk-text-surface-400 dark:[color:var(--shk-surface-500)]\"\n ></svg>\n </div>\n <p\n class=\"text-lg font-semibold _shk-text-surface-600 dark:[color:var(--shk-surface-300)]\"\n >\n {{ emptyMessage() || ('common.no_records' | transloco) }}\n </p>\n </div>\n </td>\n </tr>\n </tbody>\n } @else {\n <tbody>\n @for (rowData of effectiveDisplayedData(); track trackByRow(rowData, $index)) {\n <tr\n class=\"hover:[background-color:color-mix(in srgb,var(--shk-primary-50)30%,transparent)] dark:hover:[background-color:color-mix(in srgb,var(--shk-primary-900)10%,transparent)] transition-colors duration-200 border-b _shk-border dark:[border-color:var(--shk-surface-100)]\"\n >\n @for (col of columnsWithActions(); track col.field) {\n <td\n [attr.data-shk-actions]=\"col.field === 'actions' ? '' : null\"\n [class]=\"\n 'px-2 min-[1440px]:px-3 py-2 min-[1440px]:py-2.5 text-xs font-medium _shk-text-surface-700 dark:[color:var(--shk-surface-700)] ' +\n (col.field === 'actions' ? 'whitespace-nowrap' : 'whitespace-normal break-words')\n \"\n [style.overflow]=\"col.field === 'actions' ? 'visible' : 'visible'\"\n [style.text-overflow]=\"'clip'\"\n [style.--shk-col-width]=\"col.field !== 'actions' ? getColumnWidth(col) : null\"\n >\n @if (col.field !== 'actions') {\n @if (col.template === 'tag') {\n <shk-tag\n [value]=\"getTagValue(col, rowData)\"\n [severity]=\"getTagSeverity(col, rowData)\"\n [rounded]=\"getTagRounded(col, rowData)\"\n [icon]=\"getTagIcon(col, rowData)\"\n [style]=\"getTagStyle(col, rowData)\"\n />\n } @else if (col.format) {\n <span>{{ col.format(rowData) }}</span>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"\n customTemplates()[col.field] || defaultTemplate;\n context: { $implicit: rowData, field: col.field }\n \"\n ></ng-container>\n }\n } @else {\n <div class=\"flex items-center justify-start gap-px\">\n @for (action of getVisibleRowActions(rowData); track $index) {\n @if (isRowActionVisible(action, rowData)) {\n <div class=\"relative group\">\n <shk-tooltip\n [text]=\"getRowActionLabel(action, rowData)\"\n position=\"top\"\n >\n <button\n type=\"button\"\n (click)=\"action.onClick(rowData)\"\n [class]=\"\n 'table-action-btn hover:[background-color:var(--shk-surface-100)] dark:hover:[background-color:var(--shk-surface-200)] rounded-md ' +\n getRowActionClass(action, rowData)\n \"\n [disabled]=\"isRowActionDisabled(action, rowData) || false\"\n [attr.aria-label]=\"getRowActionLabel(action, rowData)\"\n >\n <svg\n [lucideIcon]=\"getIcon(getRowActionIconName(action, rowData))\"\n class=\"w-4 h-4\"\n ></svg>\n </button>\n </shk-tooltip>\n </div>\n }\n }\n @if (getHiddenRowActions(rowData).length > 0) {\n <div class=\"relative\">\n <shk-tooltip\n [text]=\"'common.more_options' | transloco\"\n position=\"top\"\n >\n <button\n type=\"button\"\n (click)=\"$event.stopPropagation(); toggleActionsDropdown(rowData, $event)\"\n class=\"table-action-btn hover:[background-color:var(--shk-surface-100)] dark:hover:[background-color:var(--shk-surface-200)] rounded-md\"\n [attr.aria-label]=\"'common.more_options' | transloco\"\n [attr.aria-expanded]=\"isActionsDropdownOpen(rowData)\"\n >\n <svg\n [lucideIcon]=\"getIcon('ellipsis-vertical')\"\n class=\"w-4 h-4\"\n ></svg>\n </button>\n </shk-tooltip>\n @if (isActionsDropdownOpen(rowData)) {\n <div\n class=\"fixed z-[9999] min-w-[160px] bg-white dark:[background-color:var(--shk-surface-100)] border _shk-border dark:[border-color:var(--shk-surface-200)] rounded-md shadow-lg py-1\"\n [style.top]=\"dropdownPosition().top + 'px'\"\n [style.left]=\"dropdownPosition().left + 'px'\"\n >\n @for (action of getHiddenRowActions(rowData); track $index) {\n <button\n type=\"button\"\n (click)=\"action.onClick(rowData); toggleActionsDropdown(rowData)\"\n [disabled]=\"isRowActionDisabled(action, rowData) || false\"\n [class]=\"\n 'w-full flex items-center gap-2 px-3 py-2 text-xs text-left _shk-text-surface-700 dark:[color:var(--shk-surface-700)] hover:[background-color:var(--shk-surface-100)] dark:hover:[background-color:var(--shk-surface-200)] disabled:opacity-40 disabled:cursor-not-allowed transition-colors ' +\n getRowActionClass(action, rowData)\n \"\n >\n <svg\n [lucideIcon]=\"getIcon(getRowActionIconName(action, rowData))\"\n class=\"w-3.5 h-3.5 shrink-0\"\n ></svg>\n <span>{{ getRowActionLabel(action, rowData) }}</span>\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </td>\n }\n </tr>\n }\n </tbody>\n }\n </table>\n <ng-template #defaultTemplate let-rowData let-field=\"field\">\n {{ rowData[field] }}\n </ng-template>\n </div>\n <div\n class=\"table-pagination flex items-center justify-between gap-4 px-2 min-[1440px]:px-3 py-2 border-t _shk-border dark:[border-color:var(--shk-surface-100)]\"\n >\n <div class=\"text-xs _shk-text-surface-600 dark:[color:var(--shk-surface-400)]\">\n {{ pageReport() }}\n </div>\n <div\n class=\"flex items-center gap-0.5\"\n role=\"navigation\"\n >\n <button\n type=\"button\"\n (click)=\"goToFirst()\"\n [disabled]=\"isFirstPage()\"\n class=\"p-1 _shk-text-surface-500 hover:[color:var(--shk-surface-700)] dark:[color:var(--shk-surface-400)] dark:hover:[color:var(--shk-surface-200)] disabled:opacity-30 disabled:cursor-not-allowed rounded transition-colors\"\n >\n <svg [lucideIcon]=\"getIcon('chevrons-left')\" class=\"w-4 h-4\"></svg>\n </button>\n <button\n type=\"button\"\n (click)=\"prev()\"\n [disabled]=\"isFirstPage()\"\n class=\"p-1 _shk-text-surface-500 hover:[color:var(--shk-surface-700)] dark:[color:var(--shk-surface-400)] dark:hover:[color:var(--shk-surface-200)] disabled:opacity-30 disabled:cursor-not-allowed rounded transition-colors\"\n >\n <svg [lucideIcon]=\"getIcon('chevron-left')\" class=\"w-4 h-4\"></svg>\n </button>\n <span\n class=\"px-2 text-xs font-medium _shk-text-surface-700 dark:[color:var(--shk-surface-700)]\"\n >{{ currentPage() }} / {{ totalPages() }}</span\n >\n <button\n type=\"button\"\n (click)=\"next()\"\n [disabled]=\"isLastPage()\"\n class=\"p-1 _shk-text-surface-500 hover:[color:var(--shk-surface-700)] dark:[color:var(--shk-surface-400)] dark:hover:[color:var(--shk-surface-200)] disabled:opacity-30 disabled:cursor-not-allowed rounded transition-colors\"\n >\n <svg [lucideIcon]=\"getIcon('chevron-right')\" class=\"w-4 h-4\"></svg>\n </button>\n <button\n type=\"button\"\n (click)=\"goToLast()\"\n [disabled]=\"isLastPage()\"\n class=\"p-1 _shk-text-surface-500 hover:[color:var(--shk-surface-700)] dark:[color:var(--shk-surface-400)] dark:hover:[color:var(--shk-surface-200)] disabled:opacity-30 disabled:cursor-not-allowed rounded transition-colors\"\n >\n <svg [lucideIcon]=\"getIcon('chevrons-right')\" class=\"w-4 h-4\"></svg>\n </button>\n </div>\n <div\n class=\"flex items-center gap-1.5 text-xs _shk-text-surface-600 dark:[color:var(--shk-surface-400)]\"\n >\n <label [for]=\"'shk-rows-per-page'\">{{ 'table.rows' | transloco }}</label>\n <select\n id=\"shk-rows-per-page\"\n [value]=\"rowsPerPageLocal()\"\n (change)=\"onRowsPerPageChange($any($event.target).value)\"\n class=\"border _shk-border dark:[border-color:var(--shk-surface-200)] rounded px-2 py-1 text-xs bg-white dark:[background-color:var(--shk-surface-100)] _shk-text-surface-700 dark:[color:var(--shk-surface-700)] focus:outline-none focus:[border-color:var(--shk-primary-500)]\"\n >\n @for (opt of rowsPerPageOptions(); track opt) {\n <option [value]=\"opt\">{{ opt }}</option>\n }\n </select>\n </div>\n </div>\n </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["getIconFromCentral"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shirkasoft-ui-components-table.mjs","sources":["../../../projects/ui-components/table/table.component.ts","../../../projects/ui-components/table/table.component.html","../../../projects/ui-components/table/shirkasoft-ui-components-table.ts"],"sourcesContent":["import {\n Component,\n input,\n output,\n model,\n inject,\n signal,\n computed,\n effect,\n linkedSignal,\n ChangeDetectionStrategy,\n untracked,\n ChangeDetectorRef,\n DestroyRef,\n HostListener,\n afterEveryRender,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { TranslocoModule, TranslocoService } from '@jsverse/transloco';\nimport { debounceTime, Subject, Subscription } from 'rxjs';\nimport { LucideDynamicIcon, LucidePlus } from '@lucide/angular';\nimport { TagComponent, TagSeverity } from 'shirkasoft-ui-components/tag';\nimport { TooltipComponent } from 'shirkasoft-ui-components/tooltip';\nimport { getIcon as getIconFromCentral } from 'shirkasoft-ui-components/utils';\n\nexport interface Column {\n field: string;\n header: string;\n sortable?: boolean;\n filter?: boolean;\n filterPlaceholder?: string;\n width?: string;\n defaultSort?: true;\n filterType?: 'text' | 'exact' | 'select';\n filterOptions?: { label: string; value: any }[];\n template?: 'text' | 'tag';\n format?: (row: any) => string;\n tagValue?: (row: any) => string;\n tagSeverity?: (row: any) => TagSeverity | undefined;\n tagRounded?: boolean | ((row: any) => boolean);\n tagIcon?: string | ((row: any) => string);\n tagStyle?: (row: any) => Record<string, string | number> | undefined;\n}\n\nexport interface TableAction {\n label: string;\n icon: string | any;\n onClick: () => void;\n class?: string;\n isVisible?: () => boolean;\n isDisabled?: () => boolean;\n}\n\nexport interface RowAction {\n label: string | ((data: any) => string);\n icon: string | ((data: any) => any) | any;\n onClick: (rowData: any) => void;\n class?: string | ((data: any) => string);\n isVisible?: (rowData: any) => boolean;\n isDisabled?: (rowData: any) => boolean;\n}\n\nexport interface BulkAction {\n label: string;\n icon?: string | any;\n onClick: (selectedRows: any[]) => void;\n class?: string;\n isVisible?: (selectedRows: any[]) => boolean;\n isDisabled?: (selectedRows: any[]) => boolean;\n}\n\nexport interface PageChangeEvent {\n first: number;\n rows: number;\n page: number;\n pageCount: number;\n}\n\nexport interface FilterChangeEvent {\n filters: { [key: string]: any };\n}\n\n/**\n * Shirkasoft UI Components.\n * Authors: Roberto Valladares Martin (Ansem13), Julio César García García (Sanjuli14).\n * Belongs to Shirkasoft.\n */\n\n/** Counter used to generate unique element ids per table instance. */\nlet nextTableId = 0;\n\n/**\n * Data table with sorting, column filters, global search, pagination,\n * row/header actions, tag cells and optional server-side mode.\n */\n@Component({\n selector: 'shk-table',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n TranslocoModule,\n LucideDynamicIcon,\n TagComponent,\n TooltipComponent,\n ],\n templateUrl: './table.component.html',\n styles: [\n `\n input:focus {\n outline: none;\n }\n input[type='text'] {\n font-weight: normal !important;\n }\n /*\n Headers never wrap or clip: the column grows to fit the title plus the\n sort/filter icons (table-layout: auto), so the icons can't end up\n under the next column.\n */\n table th {\n white-space: nowrap;\n }\n /* Wrap only at spaces; a long unbroken word (email, URL) widens its\n column instead of being cut mid-word, and is only broken if it\n still can't fit. */\n table td {\n white-space: normal;\n overflow-wrap: break-word;\n }\n .shk-page-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.75rem;\n height: 1.75rem;\n border-radius: 0.375rem;\n transition:\n background-color 0.15s ease,\n color 0.15s ease;\n }\n .shk-page-btn:hover:not(:disabled) {\n background-color: var(--shk-surface-100);\n }\n :host-context(.dark) .shk-page-btn:hover:not(:disabled) {\n background-color: var(--shk-surface-200);\n }\n .shk-page-btn:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--shk-primary-500) 45%, transparent);\n }\n td button svg {\n width: 1.125rem !important;\n height: 1.125rem !important;\n }\n td button:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n .table-action-btn svg {\n width: 1rem !important;\n height: 1rem !important;\n min-width: 1rem !important;\n min-height: 1rem !important;\n }\n .table-action-btn {\n padding: 0.5rem !important;\n min-width: 2rem !important;\n min-height: 2rem !important;\n display: inline-flex !important;\n align-items: center !important;\n justify-content: center !important;\n }\n .table-scroll-wrapper {\n width: 100%;\n overflow-x: auto;\n overflow-y: hidden;\n border-radius: inherit;\n -webkit-overflow-scrolling: touch;\n container-type: inline-size;\n }\n .table-card {\n container-type: inline-size;\n }\n .table-pagination {\n container-type: inline-size;\n }\n @container (max-width: 640px) {\n .table-pagination {\n flex-direction: column;\n align-items: center;\n gap: 0.5rem;\n }\n .table-pagination > div {\n justify-content: center;\n }\n }\n .table-scroll-wrapper table {\n table-layout: auto;\n width: 100%;\n }\n\n /*\n On wide screens columns stretch to 100% of the container, sized by\n their content (each one at least as wide as its header). Only when the\n real container is narrow (container query, not a viewport media query,\n so it also works inside sidebars/panels) columns get a minimum width\n (see getColumnWidth in the TS) so the table's intrinsic width exceeds\n the container and horizontal scrolling actually works, snapping column\n by column. Headers only get a min-width (no max-width) so a long title\n still widens its column instead of overflowing it.\n */\n @container (max-width: 768px) {\n .table-scroll-wrapper {\n scroll-snap-type: x mandatory;\n }\n .table-scroll-wrapper table {\n table-layout: auto;\n width: 100%;\n }\n .table-scroll-wrapper th:not([data-shk-actions]):not([data-shk-select]) {\n min-width: var(--shk-col-width, 140px);\n }\n .table-scroll-wrapper td:not([data-shk-actions]):not([data-shk-select]) {\n min-width: var(--shk-col-width, 140px);\n max-width: var(--shk-col-width, 140px);\n }\n .table-scroll-wrapper th,\n .table-scroll-wrapper td {\n scroll-snap-align: start;\n }\n }\n th[data-shk-select],\n td[data-shk-select] {\n width: 2.5rem;\n min-width: 2.5rem;\n }\n .shk-table-checkbox {\n width: 0.875rem;\n height: 0.875rem;\n cursor: pointer;\n vertical-align: middle;\n accent-color: var(--shk-primary-500);\n }\n .shk-table-checkbox:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n tr.shk-row-selected {\n background-color: color-mix(in srgb, var(--shk-primary-50) 60%, transparent);\n }\n tr.shk-row-selected:hover {\n background-color: color-mix(in srgb, var(--shk-primary-50) 90%, transparent);\n }\n :host-context(.dark) tr.shk-row-selected {\n background-color: color-mix(in srgb, var(--shk-primary-900) 20%, transparent);\n }\n :host-context(.dark) tr.shk-row-selected:hover {\n background-color: color-mix(in srgb, var(--shk-primary-900) 30%, transparent);\n }\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n `,\n ],\n})\nexport class TableComponent {\n /** Unique id prefix so several tables on the same page don't share element ids. */\n protected readonly uid = `shk-table-${nextTableId++}`;\n\n private fb = inject(FormBuilder);\n private cdr = inject(ChangeDetectorRef);\n private transloco = inject(TranslocoService);\n private destroyRef = inject(DestroyRef);\n\n/** Maps icon names to lucide components, falling back to a plus icon. */\n protected getIcon = (name: any) => getIconFromCentral(name, LucidePlus);\n\n /**\n * Minimum width applied to each column (except `actions`, which keeps its\n * own computed width) only on narrow screens. On wide screens columns\n * stretch normally to fill the container width. Can be overridden per\n * column via `col.width`.\n */\n protected readonly DEFAULT_COLUMN_WIDTH = '140px';\n\n /** Returns the effective CSS width for a column ('actions' included). */\n getColumnWidth(col: Column): string {\n return col.width || this.DEFAULT_COLUMN_WIDTH;\n }\n\n /** Signal with the translated \"Actions\" header label. */\n private actionsHeaderLabel = toSignal(this.transloco.selectTranslate('common.actions'), {\n initialValue: 'Acciones',\n });\n\n /** Signal reacting to language changes so imperative translations are recomputed. */\n private currentLang = toSignal(this.transloco.langChanges$, {\n initialValue: this.transloco.getActiveLang(),\n });\n\n /** Reactive signal of loaded translations so pageReport is not stuck with raw keys. */\n private translations = toSignal(this.transloco.selectTranslation());\n\n /** Full dataset. In server-side mode only the current page rows. */\n data = input<any[]>([]);\n /** Column definitions (field, header, filterable, tag cell options, etc.). */\n columns = input<Column[]>([]);\n /** Number of rows displayed per page. */\n rowsPerPage = input<number>(10);\n /** Options shown in the rows-per-page selector. */\n rowsPerPageOptions = input<number[]>([10, 25, 50]);\n /** Whether the table is in loading state (shows the overlay/skeleton). */\n loading = input<boolean>(false);\n /** Whether to render the row actions column. */\n showActionRow = input<boolean>(true);\n /** Custom cell/header templates keyed by column field. */\n customTemplates = input<{ [key: string]: any }>({});\n /** Actions rendered in the table header. */\n headerActions = input<TableAction[]>([]);\n /** Actions rendered per row (icon, label, class, visibility/disabled). */\n rowActions = input<RowAction[]>([]);\n /** Whether the table container renders a drop shadow. */\n hasShadow = input<boolean>(true);\n /** Field used as the default initial sort. */\n defaultSortField = input<string>('');\n /** Order used by the default initial sort (1 asc, -1 desc). */\n defaultSortOrder = input<number>(1);\n /** Whether the global search input is shown. */\n showSearch = input<boolean>(true);\n /** Placeholder for the global search input. */\n searchPlaceholder = input<string>('');\n /** Message shown when there are no rows. */\n emptyMessage = input<string>('');\n /** Enables server-side pagination/filtering/sorting mode. */\n serverSide = input<boolean>(false);\n /** Total number of records in server-side mode (for pagination math). */\n totalRecords = input<number>(0);\n /** Optional prebuilt filter chips (label + value) shown above the table. */\n filters = input<{ label: string; value: string }[]>([]);\n /** Currently active filter chip value. */\n activeFilter = input<string>('');\n\n /** Whether to render the leading checkbox column for multi-row selection. */\n selectable = input<boolean>(false);\n /**\n * Field used to identify rows in the selection (keeps it stable across\n * pages and data reloads). Falls back to the row reference when missing.\n */\n dataKey = input<string>('id');\n /** Optional predicate to disable the checkbox of specific rows. */\n isRowSelectable = input<((row: any) => boolean) | undefined>(undefined);\n /** Actions shown in the header while at least one row is selected. */\n bulkActions = input<BulkAction[]>([]);\n /** Selected rows. Supports two-way binding via `[(selection)]`. */\n selection = model<any[]>([]);\n\n /** Emits when the user clicks the refresh button. */\n refresh = output<void>();\n /** Emits page changes (server-side mode) with first/rows/page info. */\n pageChange = output<PageChangeEvent>();\n /** Emits the active column filters. */\n filterChange = output<FilterChangeEvent>();\n /** Emits the debounced global search term. */\n searchChange = output<string>();\n /** Emits when a filter chip is clicked. */\n filterClick = output<string>();\n\n /** Internal copy of the input data used as the base for search/filter. */\n private originalData = signal<any[]>([]);\n /** Rows after the global search is applied. */\n searchedData = signal<any[]>([]);\n /** Rows after column filters are applied. */\n filteredData = signal<any[]>([]);\n /** Rows belonging to the current page (after slicing). */\n displayedData = signal<any[]>([]);\n /** Local total records after filtering (client mode). */\n localTotalRecords = signal<number>(0);\n /** Index of the first row of the current page. */\n first = signal<number>(0);\n /** Visibility map for each column filter input. */\n showFilterInput = signal<{ [key: string]: boolean }>({});\n /** Current global search term. */\n searchQuery = signal<string>('');\n /** Currently sorted field. */\n sortField = signal<string>('');\n /** Current sort direction (1 asc, -1 desc). */\n sortOrder = signal<number>(1);\n /** Local rows per page, kept in sync with the `rowsPerPage` input. */\n rowsPerPageLocal = linkedSignal(() => this.rowsPerPage());\n\n /** Total number of pages based on the effective record count. */\n totalPages = computed(() =>\n Math.max(1, Math.ceil(this.effectiveTotalRecords() / this.rowsPerPageLocal())),\n );\n /** Current page number (1-based). */\n currentPage = computed(() => Math.floor(this.first() / this.rowsPerPageLocal()) + 1);\n\n /** Reactive form holding the value of each column filter. */\n columnFiltersForm!: FormGroup;\n\n /** Subjects used to debounce column filters (server mode) and search. */\n private filterSubject = new Subject<void>();\n private searchSubject = new Subject<string>();\n\n /**\n * Signature of the last built set of filterable fields (+filter type) to\n * avoid rebuilding the form (and losing user input) on reference changes.\n */\n private lastFilterFieldsSignature = '';\n private columnFilterSubscriptions: Subscription[] = [];\n\n /** Columns array with the leading `actions` column when row actions exist. */\n columnsWithActions = computed<Column[]>(() => {\n const columnsArray = this.columns();\n const showAction = this.showActionRow();\n const rowActionsArray = this.rowActions();\n const translatedHeader = this.actionsHeaderLabel();\n if (showAction && rowActionsArray.length > 0) {\n const visibleCount = Math.min(rowActionsArray.length, this.MAX_VISIBLE_ACTIONS);\n const hasDropdown = rowActionsArray.length > this.MAX_VISIBLE_ACTIONS;\n const extraWidth = hasDropdown ? 40 : 0;\n let baseWidth: string;\n if (visibleCount <= 2) {\n baseWidth = '110px';\n } else if (visibleCount <= 3) {\n baseWidth = '130px';\n } else {\n baseWidth = '170px';\n }\n const actionsWidth = `calc(${baseWidth} + ${extraWidth}px)`;\n return [\n {\n field: 'actions',\n header: translatedHeader || 'Acciones',\n width: actionsWidth,\n defaultSort: true,\n },\n ...columnsArray,\n ];\n }\n return [...columnsArray];\n });\n\n /** Keys of the selected rows, for O(1) lookups in the template. */\n private selectedKeys = computed(\n () => new Set(this.selection().map((row) => this.getSelectionKey(row))),\n );\n\n /** Whether non-empty data has been received (see the selection pruning effect). */\n private hasReceivedData = false;\n\n /** Selectable rows of the current page. */\n protected selectablePageRows = computed(() =>\n this.effectiveDisplayedData().filter((row) => this.canSelectRow(row)),\n );\n\n /** Whether every selectable row of the current page is selected. */\n allPageSelected = computed(() => {\n const rows = this.selectablePageRows();\n const keys = this.selectedKeys();\n return rows.length > 0 && rows.every((row) => keys.has(this.getSelectionKey(row)));\n });\n\n /** Whether only part of the current page is selected (header checkbox indeterminate). */\n somePageSelected = computed(() => {\n const keys = this.selectedKeys();\n return (\n !this.allPageSelected() &&\n this.selectablePageRows().some((row) => keys.has(this.getSelectionKey(row)))\n );\n });\n\n /** Visible bulk actions for the current selection. */\n visibleBulkActions = computed(() => {\n const selected = this.selection();\n return this.bulkActions().filter((a) => (a.isVisible ? a.isVisible(selected) : true));\n });\n\n /** Number of rendered columns, including the selection column. */\n totalColspan = computed(() => this.columnsWithActions().length + (this.selectable() ? 1 : 0));\n\n /** Total records: server-provided in server mode, locally computed otherwise. */\n effectiveTotalRecords = computed(() => {\n return this.serverSide() ? this.totalRecords() : this.localTotalRecords();\n });\n /**\n * Rows rendered by the template: the input data in server-side mode or the\n * locally sliced/page current rows otherwise.\n */\n effectiveDisplayedData = computed(() => {\n return this.serverSide() ? this.data() : this.displayedData();\n });\n\n /**\n * Reactive \"X to Y of Z\" report. Depends on loaded translations and the\n * active language so it always reflects the translated template.\n */\n pageReport = computed(() => {\n this.translations(); // forces recomputation when translations finish loading\n this.currentLang(); // forces recomputation when the language changes\n const total = this.effectiveTotalRecords();\n if (total === 0) {\n return this.transloco.translate('table.pageReport', {\n from: 0,\n to: 0,\n total: 0,\n });\n }\n const from = this.first() + 1;\n const to = Math.min(this.first() + this.rowsPerPageLocal(), total);\n return this.transloco.translate('table.pageReport', { from, to, total });\n });\n\n constructor() {\n this.columnFiltersForm = this.fb.group({});\n this.destroyRef.onDestroy(() => this.filterListenersCleanup?.());\n\n // Close the filter popup if its header cell was removed (e.g. the column\n // disappeared). Re-renders of the same columns keep the cell (tracked by\n // field), so new `columns` references alone don't close it.\n afterEveryRender(() => {\n if (this.filterAnchor && !this.filterAnchor.isConnected) {\n this.closeFilters();\n }\n });\n\n // Debounced column-filter changes (server-side mode only).\n this.filterSubject\n .pipe(debounceTime(300), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n if (this.serverSide()) {\n this.emitFilterChange();\n }\n });\n\n // Debounced global search changes (server-side mode only).\n this.searchSubject\n .pipe(debounceTime(300), takeUntilDestroyed(this.destroyRef))\n .subscribe((value) => {\n this.searchChange.emit(value);\n });\n\n // When input data changes, refresh the internal copy and re-apply filters\n // unless the server already handles the filtering.\n effect(() => {\n const newData = this.data();\n untracked(() => {\n this.originalData.set([...newData]);\n if (!this.serverSide()) {\n this.applyFilters();\n }\n });\n });\n\n // Drop selected rows that disappeared from the data (client mode). Skipped\n // while loading and until the first non-empty data arrives, so a temporary\n // `[]` (initial value, async load, reload) doesn't wipe the selection.\n effect(() => {\n const newData = this.data();\n const loading = this.loading();\n untracked(() => {\n if (this.serverSide() || loading) return;\n if (newData.length > 0) this.hasReceivedData = true;\n if (this.hasReceivedData) this.pruneSelection(newData);\n });\n });\n\n // Rebuild the column filter form whenever the columns change.\n effect(() => {\n const cols = this.columns();\n untracked(() => {\n this.setupColumnFilters(cols);\n });\n });\n\n // Apply the default sort once when the default fields are provided.\n effect(() => {\n const field = this.defaultSortField();\n const order = this.defaultSortOrder();\n if (field) {\n untracked(() => {\n this.sortField.set(field);\n this.sortOrder.set(order);\n if (!this.serverSide()) {\n this.applySort();\n this.updateDisplayedData();\n }\n });\n }\n });\n\n // Apply the global search locally whenever the term changes.\n effect(() => {\n const query = this.searchQuery();\n untracked(() => {\n if (!this.serverSide()) {\n this.applySearch();\n }\n });\n });\n }\n\n /**\n * Builds (or keeps) the reactive form with one control per filterable\n * column. The form is only rebuilt when the set of filterable\n * fields/filter types changes, preserving the values already typed by the\n * user otherwise. Previous subscriptions are unsubscribed to avoid leaks.\n */\n private setupColumnFilters(cols: Column[]) {\n const filterableCols = cols.filter((c) => c.filter);\n const signature = filterableCols.map((c) => `${c.field}:${c.filterType ?? 'text'}`).join('|');\n\n if (signature === this.lastFilterFieldsSignature && this.columnFiltersForm) {\n return;\n }\n this.lastFilterFieldsSignature = signature;\n\n // Clean up previous subscriptions before rebuilding.\n this.columnFilterSubscriptions.forEach((sub) => sub.unsubscribe());\n this.columnFilterSubscriptions = [];\n\n const previousValues: { [key: string]: any } = {};\n if (this.columnFiltersForm) {\n Object.keys(this.columnFiltersForm.controls).forEach((field) => {\n previousValues[field] = this.columnFiltersForm.get(field)?.value;\n });\n }\n\n const filterControls: any = {};\n const filterVisibility: { [key: string]: boolean } = { ...this.showFilterInput() };\n filterableCols.forEach((col) => {\n const defaultValue = col.filterType === 'select' ? null : '';\n const preserved = previousValues.hasOwnProperty(col.field)\n ? previousValues[col.field]\n : defaultValue;\n filterControls[col.field] = [preserved];\n if (!(col.field in filterVisibility)) {\n filterVisibility[col.field] = false;\n }\n });\n\n this.columnFiltersForm = this.fb.group(filterControls);\n this.showFilterInput.set(filterVisibility);\n\n Object.keys(this.columnFiltersForm.controls).forEach((field) => {\n const sub = this.columnFiltersForm\n .get(field)\n ?.valueChanges.pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.first.set(0);\n if (this.serverSide()) {\n this.filterSubject.next();\n } else {\n this.applyFilters();\n }\n this.cdr.markForCheck();\n });\n if (sub) {\n this.columnFilterSubscriptions.push(sub);\n }\n });\n }\n\n /** Collects the non-empty column filter values and emits them. */\n private emitFilterChange() {\n const filters: { [key: string]: any } = {};\n Object.keys(this.columnFiltersForm.controls).forEach((field) => {\n const value = this.columnFiltersForm.get(field)?.value;\n if (value !== null && value !== undefined && value !== '') {\n filters[field] = value;\n }\n });\n this.filterChange.emit({ filters });\n }\n\n /** Applies the global search over the original data (client mode). */\n private applySearch() {\n const original = this.originalData();\n const query = this.searchQuery().toLowerCase();\n if (!query) {\n this.searchedData.set([...original]);\n } else {\n const filtered = original.filter((item) => {\n return Object.values(item).some((val) => {\n if (val === null || val === undefined) return false;\n return String(val).toLowerCase().includes(query);\n });\n });\n this.searchedData.set(filtered);\n }\n this.applyColumnFilters();\n }\n\n /** Entry point that applies search (which cascades into column filters). */\n private applyFilters() {\n this.applySearch();\n }\n\n /**\n * Applies every column filter on top of the searched data using each\n * column's `filterType` ('select', 'exact' or text contains).\n */\n private applyColumnFilters() {\n const data = this.searchedData();\n let filtered = [...data];\n this.columns().forEach((col) => {\n if (col.filter) {\n const filterValue = this.columnFiltersForm.get(col.field)?.value;\n if (filterValue !== null && filterValue !== undefined && filterValue !== '') {\n if (col.filterType === 'select') {\n filtered = filtered.filter((item) => item[col.field] == filterValue);\n } else if (col.filterType === 'exact') {\n const searchTerm = String(filterValue).toLowerCase();\n filtered = filtered.filter(\n (item) => String(item[col.field] ?? '').toLowerCase() === searchTerm,\n );\n } else {\n const searchTerm = String(filterValue).toLowerCase();\n filtered = filtered.filter((item) =>\n String(item[col.field] ?? '').toLowerCase().includes(searchTerm),\n );\n }\n }\n }\n });\n this.filteredData.set(filtered);\n this.localTotalRecords.set(filtered.length);\n this.applySort();\n this.updateDisplayedData();\n }\n\n /** Slices the filtered rows for the current page. */\n private updateDisplayedData() {\n const filtered = this.filteredData();\n const firstIndex = this.first();\n const rows = this.rowsPerPageLocal();\n const displayed = filtered.slice(firstIndex, firstIndex + rows);\n this.displayedData.set(displayed);\n }\n\n /** Identity used for a row inside the selection. */\n private getSelectionKey(row: any): any {\n const key = this.dataKey();\n return key && row?.[key] !== undefined ? row[key] : row;\n }\n\n /** Whether the row's checkbox is enabled. */\n canSelectRow(row: any): boolean {\n const predicate = this.isRowSelectable();\n return predicate ? predicate(row) : true;\n }\n\n /** Whether the row is currently selected. */\n isRowSelected(row: any): boolean {\n return this.selectedKeys().has(this.getSelectionKey(row));\n }\n\n /** Selects/deselects a single row. */\n toggleRowSelection(row: any) {\n if (!this.canSelectRow(row)) return;\n const key = this.getSelectionKey(row);\n if (this.isRowSelected(row)) {\n this.selection.set(this.selection().filter((r) => this.getSelectionKey(r) !== key));\n } else {\n this.selection.set([...this.selection(), row]);\n }\n }\n\n /**\n * Header checkbox: selects every selectable row of the current page or,\n * when all of them are already selected, removes them from the selection.\n * Rows selected on other pages are kept.\n */\n toggleSelectAllPage() {\n const pageRows = this.selectablePageRows();\n const pageKeys = new Set(pageRows.map((row) => this.getSelectionKey(row)));\n const rest = this.selection().filter((r) => !pageKeys.has(this.getSelectionKey(r)));\n this.selection.set(this.allPageSelected() ? rest : [...rest, ...pageRows]);\n }\n\n /** Clears the whole selection. */\n clearSelection() {\n this.selection.set([]);\n }\n\n /** Runs a bulk action with the current selection. */\n runBulkAction(action: BulkAction) {\n action.onClick([...this.selection()]);\n }\n\n /** Whether a bulk action is disabled for the current selection. */\n isBulkActionDisabled(action: BulkAction): boolean {\n return action.isDisabled ? action.isDisabled(this.selection()) : false;\n }\n\n /**\n * Drops selected rows that no longer exist in the data (client mode, e.g.\n * after a bulk delete) and refreshes kept rows with their new references.\n */\n private pruneSelection(data: any[]) {\n const current = this.selection();\n if (current.length === 0) return;\n const byKey = new Map(data.map((row) => [this.getSelectionKey(row), row]));\n const next = current\n .map((row) => byKey.get(this.getSelectionKey(row)))\n .filter((row) => row !== undefined);\n if (next.length !== current.length || next.some((row, i) => row !== current[i])) {\n this.selection.set(next);\n }\n }\n\n /** Emits the filter chip clicked in the template. */\n onFilterClick(value: string) {\n this.filterClick.emit(value);\n }\n\n /** Toggles the sort direction of a column (first click sorts ascending). */\n toggleSort(field: string) {\n if (this.sortField() === field) {\n this.sortOrder.set(this.sortOrder() * -1);\n } else {\n this.sortField.set(field);\n this.sortOrder.set(1);\n }\n this.first.set(0);\n if (!this.serverSide()) {\n this.applySort();\n this.updateDisplayedData();\n }\n }\n\n /**\n * Sorts the filtered rows by the current field. Rows with null/undefined\n * values are always kept at the end regardless of sort direction.\n */\n private applySort() {\n const field = this.sortField();\n const order = this.sortOrder();\n if (!field) return;\n const data = [...this.filteredData()];\n data.sort((a, b) => {\n const va = a[field];\n const vb = b[field];\n if (va == null && vb == null) return 0;\n if (va == null) return 1; // nulls always at the end\n if (vb == null) return -1;\n if (va < vb) return -1 * order;\n if (va > vb) return 1 * order;\n return 0;\n });\n this.filteredData.set(data);\n }\n\n /** Handles the global search input (updates query, resets page, debounces server mode). */\n onSearchInput(value: string) {\n this.searchQuery.set(value);\n this.first.set(0);\n if (this.serverSide()) {\n this.searchSubject.next(value);\n }\n }\n\n /** Clears a column filter value and hides its input. */\n clearFilter(field: string) {\n const column = this.columns().find((col) => col.field === field);\n const value = column?.filterType === 'select' ? null : '';\n this.columnFiltersForm.get(field)?.setValue(value);\n this.closeFilters();\n }\n\n /** Width (px) of the column filter popup, used to keep it inside the viewport. */\n private readonly FILTER_POPUP_WIDTH = 200;\n\n /** Viewport position of the open column filter popup. */\n filterPopupPosition = signal<{ top: number; left: number }>({ top: 0, left: 0 });\n\n /** Filter button the open popup is anchored to, and its scroll/resize listener cleanup. */\n private filterAnchor: HTMLElement | null = null;\n private filterListenersCleanup: (() => void) | null = null;\n\n /**\n * Toggles a column filter popup. Only one popup is open at a time. The\n * popup uses `position: fixed` anchored to the filter button, so the\n * header cell (`overflow: hidden`) and the scroll wrapper can't clip it.\n */\n toggleFilter(field: string, event?: Event) {\n const wasOpen = !!this.showFilterInput()[field];\n this.closeFilters();\n if (wasOpen) return;\n\n this.filterAnchor = (event?.currentTarget as HTMLElement | null) ?? null;\n this.updateFilterPopupPosition();\n this.showFilterInput.set({ ...this.showFilterInput(), [field]: true });\n\n const reposition = () => this.updateFilterPopupPosition();\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n this.filterListenersCleanup = () => {\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n };\n\n setTimeout(() => document.getElementById(`${this.uid}-filter-${field}`)?.focus());\n this.cdr.markForCheck();\n }\n\n /** Closes every column filter popup (values are kept). */\n closeFilters() {\n this.filterListenersCleanup?.();\n this.filterListenersCleanup = null;\n this.filterAnchor = null;\n const visibility = this.showFilterInput();\n if (Object.values(visibility).some((v) => v)) {\n const closed: { [key: string]: boolean } = {};\n Object.keys(visibility).forEach((key) => (closed[key] = false));\n this.showFilterInput.set(closed);\n this.cdr.markForCheck();\n }\n }\n\n /** Places the filter popup under its button, clamped to the viewport. */\n private updateFilterPopupPosition() {\n if (!this.filterAnchor) return;\n const rect = this.filterAnchor.getBoundingClientRect();\n const maxLeft = window.innerWidth - this.FILTER_POPUP_WIDTH - 8;\n const left = Math.max(8, Math.min(rect.right - this.FILTER_POPUP_WIDTH, maxLeft));\n this.filterPopupPosition.set({ top: rect.bottom + 6, left });\n }\n\n /**\n * Whether a column filter is non-empty. Avoids treating the number 0 as\n * \"no value\".\n */\n hasFilterValue(field: string): boolean {\n const value = this.columnFiltersForm.get(field)?.value;\n return value !== null && value !== undefined && value !== '';\n }\n\n /** Returns the reactive page report string (template helper). */\n getPageReport(): string {\n return this.pageReport();\n }\n\n /** Goes to the first page (emits pageChange in server-side mode). */\n goToFirst() {\n const rows = this.rowsPerPageLocal();\n this.first.set(0);\n if (this.serverSide()) {\n this.pageChange.emit({\n first: 0,\n rows,\n page: 0,\n pageCount: Math.ceil(this.totalRecords() / rows),\n });\n } else {\n this.updateDisplayedData();\n }\n }\n\n /** Goes to the last page (emits pageChange in server-side mode). */\n goToLast() {\n const total = this.serverSide() ? this.totalRecords() : this.filteredData().length;\n const rows = this.rowsPerPageLocal();\n const lastFirst = Math.max(0, Math.ceil(total / rows) * rows - rows);\n this.first.set(lastFirst);\n if (this.serverSide()) {\n const page = Math.floor(lastFirst / rows);\n this.pageChange.emit({\n first: lastFirst,\n rows,\n page,\n pageCount: Math.ceil(total / rows),\n });\n } else {\n this.updateDisplayedData();\n }\n }\n\n /** Updates rows-per-page and resets to the first page. */\n onRowsPerPageChange(rows: number) {\n rows = Number(rows);\n this.rowsPerPageLocal.set(rows);\n this.first.set(0);\n if (this.serverSide()) {\n this.pageChange.emit({\n first: 0,\n rows,\n page: 0,\n pageCount: Math.ceil(this.totalRecords() / rows),\n });\n } else {\n this.updateDisplayedData();\n }\n }\n\n /** Emits the refresh output. */\n refreshData() {\n this.refresh.emit();\n }\n\n /** Whether the current page is the first one. */\n isFirstPage(): boolean {\n return this.first() === 0;\n }\n\n /** Whether the current page is the last one. */\n isLastPage(): boolean {\n const total = this.effectiveTotalRecords();\n return this.first() + this.rowsPerPageLocal() >= total;\n }\n\n /** Moves to the next page (emits pageChange in server-side mode). */\n next() {\n const total = this.serverSide() ? this.totalRecords() : this.filteredData().length;\n const rows = this.rowsPerPageLocal();\n let first = this.first() + rows;\n if (first >= total) {\n first = total - rows;\n }\n this.first.set(first);\n if (this.serverSide()) {\n const page = Math.floor(first / rows);\n this.pageChange.emit({\n first,\n rows,\n page,\n pageCount: Math.ceil(total / rows),\n });\n } else {\n this.updateDisplayedData();\n }\n }\n\n /** Moves to the previous page (emits pageChange in server mode). */\n prev() {\n const rows = this.rowsPerPageLocal();\n let first = this.first() - rows;\n const total = this.serverSide() ? this.totalRecords() : this.filteredData().length;\n if (first < 0) {\n first = 0;\n }\n this.first.set(first);\n if (this.serverSide()) {\n const page = Math.floor(first / rows);\n this.pageChange.emit({\n first,\n rows,\n page,\n pageCount: Math.ceil(total / rows),\n });\n } else {\n this.updateDisplayedData();\n }\n }\n\n /** Resets the table to the first page. */\n reset() {\n this.goToFirst();\n }\n\n /** Resolves the row action label, static or per-row function. */\n getRowActionLabel(action: RowAction, rowData: any): string {\n return typeof action.label === 'function' ? action.label(rowData) : action.label;\n }\n\n /**\n * Resolves the row action icon: a lucide component, a function returning\n * the icon name, or a raw string resolved by the central icon map.\n */\n getRowActionIconName(action: RowAction, rowData: any): any {\n const icon = action.icon;\n if (typeof icon === 'function') {\n if (icon.prototype === undefined) {\n return icon(rowData);\n }\n return icon;\n }\n return icon;\n }\n\n /** Resolves the CSS class of a row action, static or per-row function. */\n getRowActionClass(action: RowAction, rowData: any): string {\n if (!action.class) return '';\n return typeof action.class === 'function' ? action.class(rowData) : action.class;\n }\n\n /** Whether a header action is disabled. */\n isHeaderActionDisabled(action: TableAction): boolean {\n return action.isDisabled ? action.isDisabled() : false;\n }\n\n /** Whether a header action is visible. */\n isHeaderActionVisible(action: TableAction): boolean {\n return action.isVisible ? action.isVisible() : true;\n }\n\n /** Whether a row action is disabled for the given row. */\n isRowActionDisabled(action: RowAction, rowData: any): boolean {\n return action.isDisabled ? action.isDisabled(rowData) : false;\n }\n\n /** Whether a row action is visible for the given row. */\n isRowActionVisible(action: RowAction, rowData: any): boolean {\n return action.isVisible ? action.isVisible(rowData) : true;\n }\n\n /** Truncates a value with an ellipsis past the given character limit. */\n truncate(value: any, limit: number = 30): string {\n if (value === null || value === undefined) return '';\n const str = String(value);\n return str.length > limit ? str.slice(0, limit) + '\\u2026' : str;\n }\n\n /** Resolves the value displayed inside a tag cell, static or per-row function. */\n getTagValue(col: Column, rowData: any): string {\n return col.tagValue ? col.tagValue(rowData) : String(rowData[col.field] ?? '');\n }\n\n /** Resolves and validates the tag severity, falling back to 'secondary'. */\n getTagSeverity(col: Column, rowData: any): TagSeverity {\n const raw = col.tagSeverity ? col.tagSeverity(rowData) : 'secondary';\n const allowed: TagSeverity[] = [\n 'secondary',\n 'success',\n 'info',\n 'warning',\n 'danger',\n 'contrast',\n ];\n return allowed.includes(raw as TagSeverity) ? (raw as TagSeverity) : 'secondary';\n }\n\n /** Resolves whether the tag in a cell is rounded, static or per-row function. */\n getTagRounded(col: Column, rowData: any): boolean {\n if (typeof col.tagRounded === 'function') return col.tagRounded(rowData);\n return col.tagRounded ?? false;\n }\n\n /** Resolves the icon shown inside a tag cell, static or per-row function. */\n getTagIcon(col: Column, rowData: any): string {\n if (typeof col.tagIcon === 'function') return col.tagIcon(rowData);\n return col.tagIcon ?? '';\n }\n\n /** Resolves the CSS styles of a tag cell, static or per-row function. */\n getTagStyle(col: Column, rowData: any): Record<string, string | number> {\n return col.tagStyle ? col.tagStyle(rowData) || {} : {};\n }\n\n /**\n * trackBy for row identity: prefers `id`/`_id` and falls back to the index.\n */\n trackByRow(row: any, index: number): any {\n return row?.id ?? row?._id ?? index;\n }\n\n /** Keyboard support (Enter/Space) for sorting a column header. */\n onHeaderKeydown(event: KeyboardEvent, col: Column) {\n if (col.field === 'actions' || !col.sortable) return;\n // Ignore keys typed inside the filter popup (e.g. spaces in the input).\n if (event.target !== event.currentTarget) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.toggleSort(col.field);\n }\n }\n\n /** Accessible aria-sort value for a given column header. */\n getAriaSort(col: Column): 'ascending' | 'descending' | 'none' {\n if (col.field === 'actions' || !col.sortable) return 'none';\n if (this.sortField() !== col.field) return 'none';\n return this.sortOrder() === 1 ? 'ascending' : 'descending';\n }\n\n /** Maximum number of row actions shown directly before collapsing into a dropdown. */\n protected readonly MAX_VISIBLE_ACTIONS = 4;\n\n /** Tracks which row's \"more actions\" dropdown is currently open (keyed by row identity). */\n actionsDropdownOpen = signal<Record<string, boolean>>({});\n\n /** Returns the row actions that should be displayed as direct icon buttons. */\n getVisibleRowActions(rowData: any): RowAction[] {\n const visible = this.rowActions().filter((a) => this.isRowActionVisible(a, rowData));\n return visible.slice(0, this.MAX_VISIBLE_ACTIONS);\n }\n\n /** Returns the row actions that overflow into the \"more\" dropdown. */\n getHiddenRowActions(rowData: any): RowAction[] {\n const visible = this.rowActions().filter((a) => this.isRowActionVisible(a, rowData));\n return visible.slice(this.MAX_VISIBLE_ACTIONS);\n }\n\n /** Toggles the \"more actions\" dropdown for a given row, closing any other open dropdown. */\n toggleActionsDropdown(rowData: any, event?: Event) {\n const key = this.getRowKey(rowData);\n const current = this.actionsDropdownOpen();\n const wasOpen = !!current[key];\n const next: Record<string, boolean> = {};\n if (!wasOpen) {\n next[key] = true;\n }\n this.actionsDropdownOpen.set(next);\n if (!wasOpen) {\n this.computeDropdownPosition(event);\n }\n }\n\n /** Computes the fixed position of the dropdown so it's not clipped by overflow. */\n dropdownPosition = signal<{ top: number; left: number }>({ top: 0, left: 0 });\n\n private computeDropdownPosition(event?: Event) {\n if (!event) return;\n const target = (event.currentTarget || event.target) as HTMLElement;\n const rect = target.getBoundingClientRect();\n const dropdownHeight = 180;\n const spaceBelow = window.innerHeight - rect.bottom;\n let top = rect.bottom + 4;\n let left = rect.right - 160;\n if (spaceBelow < dropdownHeight) {\n top = rect.top - dropdownHeight - 4;\n }\n if (left < 8) {\n left = 8;\n }\n this.dropdownPosition.set({ top, left });\n }\n\n /** Whether the \"more actions\" dropdown is open for a given row. */\n isActionsDropdownOpen(rowData: any): boolean {\n const key = this.getRowKey(rowData);\n return !!this.actionsDropdownOpen()[key];\n }\n\n /** Returns a unique key for a row to track dropdown state. */\n private getRowKey(rowData: any): string {\n return String(rowData?.id ?? rowData?._id ?? JSON.stringify(rowData));\n }\n\n /** Closes all open action dropdowns when clicking anywhere on the document. */\n @HostListener('document:click')\n onDocumentClick() {\n const current = this.actionsDropdownOpen();\n const hasOpen = Object.values(current).some((v) => v);\n if (hasOpen) {\n this.actionsDropdownOpen.set({});\n }\n this.closeFilters();\n }\n\n /** Closes the column filter popup with Escape. */\n @HostListener('document:keydown.escape')\n onEscape() {\n this.closeFilters();\n }\n}\n","<div class=\"space-y-2 min-[1440px]:space-y-3 mt-2 min-[1440px]:mt-3 animate-fade-in pb-8\">\n @if (\n showSearch() ||\n filters().length > 0 ||\n headerActions().length > 0 ||\n (selectable() && bulkActions().length > 0 && selection().length > 0)\n ) {\n <div class=\"card p-2 min-[1440px]:p-2.5 flex flex-row items-center justify-between gap-2\">\n <div class=\"flex items-center gap-2 min-[1440px]:gap-3 flex-1 min-w-0\">\n @if (showSearch()) {\n <div class=\"relative w-full md:w-52 min-[1440px]:w-56\">\n <label [for]=\"uid + '-search'\" class=\"sr-only\">{{\n searchPlaceholder() || ('common.search_placeholder' | transloco)\n }}</label>\n <div class=\"absolute inset-y-0 left-0 pl-2.5 flex items-center pointer-events-none\">\n <svg\n [lucideIcon]=\"getIcon('search')\"\n class=\"w-3.5 h-3.5 _shk-text-surface-400 dark:[color:var(--shk-surface-500)]\"\n ></svg>\n </div>\n <input\n [id]=\"uid + '-search'\"\n type=\"text\"\n [value]=\"searchQuery()\"\n (input)=\"onSearchInput($any($event.target).value)\"\n [placeholder]=\"searchPlaceholder() || ('common.search_placeholder' | transloco)\"\n class=\"block w-full pl-8 pr-3 py-1.5 text-xs border _shk-border dark:[border-color:var(--shk-surface-200)] rounded-md leading-5 _shk-bg-surface-50 dark:[background-color:var(--shk-surface-100)] placeholder:[color:var(--shk-surface-400)] dark:placeholder:[color:var(--shk-surface-500)] _shk-text-surface-700 dark:[color:var(--shk-surface-700)] focus:outline-none focus:bg-white dark:focus:[background-color:var(--shk-surface-800)] focus:[border-color:var(--shk-primary-500)] focus:ring-1 focus:[--tw-ring-color:var(--shk-primary-500)]\"\n />\n </div>\n }\n @if (filters().length > 0) {\n <div\n class=\"flex _shk-bg-surface-100 dark:[background-color:var(--shk-surface-100)] p-0.5 rounded-md ml-auto\"\n role=\"group\"\n >\n @for (f of filters(); track f.value) {\n <button\n type=\"button\"\n (click)=\"onFilterClick(f.value)\"\n [attr.aria-pressed]=\"f.value === activeFilter()\"\n class=\"px-2.5 min-[1440px]:px-3 py-1 text-xs font-medium rounded _shk-text-surface-700 dark:[color:var(--shk-surface-700)] transition-all\"\n [class]=\"\n f.value === activeFilter()\n ? 'bg-white shadow-sm dark:[background-color:var(--shk-surface-700)]'\n : ''\n \"\n >\n {{ f.label }}\n </button>\n }\n </div>\n }\n </div>\n @if (selectable() && selection().length > 0 && bulkActions().length > 0) {\n <div\n class=\"flex items-center gap-1.5 shrink-0\"\n role=\"toolbar\"\n [attr.aria-label]=\"'table.selected' | transloco: { count: selection().length }\"\n >\n <span\n class=\"text-xs font-medium _shk-text-surface-600 dark:[color:var(--shk-surface-400)] whitespace-nowrap\"\n aria-live=\"polite\"\n >{{ 'table.selected' | transloco: { count: selection().length } }}</span\n >\n <button\n type=\"button\"\n (click)=\"clearSelection()\"\n [attr.aria-label]=\"'table.clearSelection' | transloco\"\n class=\"table-action-btn rounded-md _shk-text-surface-500 dark:[color:var(--shk-surface-400)] hover:[background-color:var(--shk-surface-100)] dark:hover:[background-color:var(--shk-surface-200)]\"\n >\n <svg [lucideIcon]=\"getIcon('x')\" class=\"w-3.5 h-3.5\"></svg>\n </button>\n @for (action of visibleBulkActions(); track $index) {\n <button\n type=\"button\"\n [class]=\"\n 'inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded-md _shk-bg-primary text-white hover:[background-color:var(--shk-primary-700)] transition-colors disabled:opacity-50 disabled:cursor-not-allowed ' +\n (action.class || '')\n \"\n [disabled]=\"isBulkActionDisabled(action)\"\n [attr.aria-label]=\"action.label\"\n (click)=\"runBulkAction(action)\"\n >\n @if (action.icon) {\n <svg [lucideIcon]=\"getIcon(action.icon)\" class=\"w-3.5 h-3.5\"></svg>\n }\n {{ action.label }}\n </button>\n }\n </div>\n }\n @if (headerActions().length > 0) {\n <div class=\"flex items-center gap-1.5 shrink-0\">\n @for (action of headerActions(); track $index) {\n @if (isHeaderActionVisible(action)) {\n <button\n type=\"button\"\n [class]=\"\n 'inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded-md _shk-bg-primary text-white hover:[background-color:var(--shk-primary-700)] transition-colors disabled:opacity-50 disabled:cursor-not-allowed ' +\n (action.class || '')\n \"\n [disabled]=\"isHeaderActionDisabled(action)\"\n [attr.aria-label]=\"action.label\"\n (click)=\"action.onClick()\"\n >\n @if (action.icon) {\n <svg [lucideIcon]=\"getIcon(action.icon)\" class=\"w-3.5 h-3.5\"></svg>\n }\n {{ action.label }}\n </button>\n }\n }\n </div>\n }\n </div>\n }\n <div class=\"card p-0 overflow-hidden table-card\" [class.shadow-lg]=\"hasShadow()\">\n <div class=\"table-scroll-wrapper _shk-scrollbar\">\n <table>\n <thead>\n <tr>\n @if (selectable()) {\n <th\n scope=\"col\"\n data-shk-select\n class=\"w-10 px-2 min-[1440px]:px-3 py-2 min-[1440px]:py-2.5 text-center _shk-bg-surface-50 dark:[background-color:var(--shk-surface-100)] border-b _shk-border dark:[border-color:var(--shk-surface-200)]\"\n >\n <input\n type=\"checkbox\"\n class=\"shk-table-checkbox\"\n [checked]=\"allPageSelected()\"\n [indeterminate]=\"somePageSelected()\"\n [disabled]=\"loading() || selectablePageRows().length === 0\"\n (change)=\"toggleSelectAllPage()\"\n [attr.aria-label]=\"'table.selectAll' | transloco\"\n />\n </th>\n }\n @for (col of columnsWithActions(); track col.field) {\n <th\n scope=\"col\"\n (click)=\"col.field !== 'actions' && col.sortable && toggleSort(col.field)\"\n (keydown)=\"onHeaderKeydown($event, col)\"\n [tabindex]=\"col.field !== 'actions' && col.sortable ? 0 : -1\"\n [attr.role]=\"col.field !== 'actions' && col.sortable ? 'button' : null\"\n [attr.aria-sort]=\"getAriaSort(col)\"\n [attr.data-shk-actions]=\"col.field === 'actions' ? '' : null\"\n [style.cursor]=\"col.field !== 'actions' && col.sortable ? 'pointer' : 'default'\"\n [style.width]=\"col.field === 'actions' ? col.width : null\"\n [style.min-width]=\"col.field === 'actions' ? col.width : null\"\n [style.--shk-col-width]=\"col.field !== 'actions' ? getColumnWidth(col) : null\"\n class=\"relative px-2 min-[1440px]:px-3 py-2 min-[1440px]:py-2.5 text-left text-[10px] min-[1440px]:text-xs font-bold _shk-text-surface-500 dark:[color:var(--shk-surface-400)] uppercase tracking-wider _shk-bg-surface-50 dark:[background-color:var(--shk-surface-100)] border-b _shk-border dark:[border-color:var(--shk-surface-200)] focus:outline-none focus-visible:ring-1 focus-visible:[--tw-ring-color:var(--shk-primary-500)]\"\n >\n @if (col.field !== 'actions') {\n <div class=\"flex items-center justify-between gap-2\">\n <span>{{ col.header }}</span>\n <div class=\"flex items-center gap-1 shrink-0\">\n @if (col.sortable) {\n <shk-tooltip [text]=\"'table.tooltips.sort' | transloco\">\n @if (sortField() === col.field) {\n <svg\n [lucideIcon]=\"getIcon(sortOrder() === 1 ? 'arrow-up' : 'arrow-down')\"\n class=\"w-3.5 h-3.5 _shk-text-primary\"\n ></svg>\n } @else {\n <svg\n [lucideIcon]=\"getIcon('arrow-up-down')\"\n class=\"w-3.5 h-3.5 _shk-text-surface-400 dark:[color:var(--shk-surface-500)]\"\n ></svg>\n }\n </shk-tooltip>\n }\n @if (col.filter) {\n <shk-tooltip [text]=\"'table.tooltips.filter' | transloco\">\n <button\n type=\"button\"\n (click)=\"$event.stopPropagation(); toggleFilter(col.field, $event)\"\n [attr.aria-label]=\"'table.tooltips.filter' | transloco\"\n [attr.aria-expanded]=\"showFilterInput()[col.field] || false\"\n class=\"_shk-text-surface-400 dark:[color:var(--shk-surface-500)] hover:[color:var(--shk-surface-600)] dark:hover:[color:var(--shk-surface-300)] transition-colors\"\n >\n <svg\n [lucideIcon]=\"getIcon('filter')\"\n class=\"w-3.5 h-3.5\"\n [class._shk-text-primary]=\"hasFilterValue(col.field)\"\n ></svg>\n </button>\n </shk-tooltip>\n }\n </div>\n </div>\n @if (col.filter && showFilterInput()[col.field]) {\n <div\n class=\"fixed z-[9999] p-2 w-[200px] normal-case tracking-normal font-normal bg-white dark:[background-color:var(--shk-surface-100)] border _shk-border dark:[border-color:var(--shk-surface-200)] rounded-lg shadow-lg\"\n [style.top]=\"filterPopupPosition().top + 'px'\"\n [style.left]=\"filterPopupPosition().left + 'px'\"\n [formGroup]=\"columnFiltersForm\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keydown.escape)=\"closeFilters()\"\n >\n <div class=\"relative\">\n @if (col.filterType !== 'select') {\n <label [for]=\"uid + '-filter-' + col.field\" class=\"sr-only\">{{\n col.filterPlaceholder || ('common.search_placeholder' | transloco)\n }}</label>\n <input\n [id]=\"uid + '-filter-' + col.field\"\n type=\"text\"\n [formControlName]=\"col.field\"\n class=\"w-full px-3 py-1.5 text-sm rounded-md border _shk-border dark:[border-color:var(--shk-surface-200)] bg-white dark:[background-color:var(--shk-surface-100)] _shk-text-surface-700 dark:[color:var(--shk-surface-700)] focus:[border-color:var(--shk-primary-500)] focus:ring-1 focus:[--tw-ring-color:var(--shk-primary-500)] placeholder:[color:var(--shk-surface-400)] dark:placeholder:[color:var(--shk-surface-500)]\"\n [placeholder]=\"\n col.filterPlaceholder || ('common.search_placeholder' | transloco)\n \"\n />\n }\n @if (col.filterType === 'select') {\n <label [for]=\"uid + '-filter-' + col.field\" class=\"sr-only\">{{\n col.filterPlaceholder || ('common.search_placeholder' | transloco)\n }}</label>\n <select\n [id]=\"uid + '-filter-' + col.field\"\n [formControlName]=\"col.field\"\n class=\"w-full px-2 py-1 text-xs rounded-md border _shk-border dark:[border-color:var(--shk-surface-200)] bg-white dark:[background-color:var(--shk-surface-100)] _shk-text-surface-700 dark:[color:var(--shk-surface-700)] focus:[border-color:var(--shk-primary-500)] focus:ring-1 focus:[--tw-ring-color:var(--shk-primary-500)] appearance-none\"\n >\n <option [ngValue]=\"null\">{{ 'table.filterAll' | transloco }}</option>\n @for (opt of col.filterOptions || []; track opt.value) {\n <option [ngValue]=\"opt.value\">{{ opt.label }}</option>\n }\n </select>\n }\n @if (hasFilterValue(col.field) && col.filterType !== 'select') {\n <button\n type=\"button\"\n class=\"absolute right-2 top-1/2 -translate-y-1/2 _shk-text-surface-400 dark:[color:var(--shk-surface-500)] hover:[color:var(--shk-surface-600)] dark:hover:[color:var(--shk-surface-300)]\"\n (click)=\"clearFilter(col.field)\"\n >\n <svg [lucideIcon]=\"getIcon('x')\" class=\"w-3.5 h-3.5\"></svg>\n </button>\n }\n </div>\n </div>\n }\n } @else {\n <div class=\"flex items-center justify-center\">\n <span>{{ col.header }}</span>\n </div>\n }\n </th>\n }\n </tr>\n </thead>\n @if (loading()) {\n <tbody class=\"border-b _shk-border dark:[border-color:var(--shk-surface-100)]\">\n <tr>\n <td [attr.colspan]=\"totalColspan()\" class=\"text-center py-12\">\n <div\n class=\"flex items-center justify-center\"\n role=\"status\"\n [attr.aria-label]=\"'common.loading' | transloco\"\n >\n <svg\n [lucideIcon]=\"getIcon('loader')\"\n class=\"w-6 h-6 animate-spin _shk-text-primary\"\n ></svg>\n </div>\n </td>\n </tr>\n </tbody>\n } @else if (effectiveDisplayedData().length === 0) {\n <tbody class=\"border-b _shk-border dark:[border-color:var(--shk-surface-100)]\">\n <tr>\n <td [attr.colspan]=\"totalColspan()\" class=\"text-center py-12\">\n <div class=\"flex flex-col items-center\">\n <div\n class=\"w-16 h-16 _shk-bg-surface-100 dark:[background-color:var(--shk-surface-100)] rounded-full flex items-center justify-center mb-4\"\n >\n <svg\n [lucideIcon]=\"getIcon('inbox')\"\n class=\"w-8 h-8 _shk-text-surface-400 dark:[color:var(--shk-surface-500)]\"\n ></svg>\n </div>\n <p\n class=\"text-lg font-semibold _shk-text-surface-600 dark:[color:var(--shk-surface-300)]\"\n >\n {{ emptyMessage() || ('common.no_records' | transloco) }}\n </p>\n </div>\n </td>\n </tr>\n </tbody>\n } @else {\n <tbody>\n @for (rowData of effectiveDisplayedData(); track trackByRow(rowData, $index)) {\n <tr\n [attr.aria-selected]=\"selectable() ? isRowSelected(rowData) : null\"\n [class.shk-row-selected]=\"selectable() && isRowSelected(rowData)\"\n class=\"hover:[background-color:color-mix(in srgb,var(--shk-primary-50)30%,transparent)] dark:hover:[background-color:color-mix(in srgb,var(--shk-primary-900)10%,transparent)] transition-colors duration-200 border-b _shk-border dark:[border-color:var(--shk-surface-100)]\"\n >\n @if (selectable()) {\n <td data-shk-select class=\"w-10 px-2 min-[1440px]:px-3 py-2 min-[1440px]:py-2.5 text-center\">\n <input\n type=\"checkbox\"\n class=\"shk-table-checkbox\"\n [checked]=\"isRowSelected(rowData)\"\n [disabled]=\"!canSelectRow(rowData)\"\n (change)=\"toggleRowSelection(rowData)\"\n [attr.aria-label]=\"'table.selectRow' | transloco: { index: first() + $index + 1 }\"\n />\n </td>\n }\n @for (col of columnsWithActions(); track col.field) {\n <td\n [attr.data-shk-actions]=\"col.field === 'actions' ? '' : null\"\n [class]=\"\n 'px-2 min-[1440px]:px-3 py-2 min-[1440px]:py-2.5 text-xs font-medium _shk-text-surface-700 dark:[color:var(--shk-surface-700)] ' +\n (col.field === 'actions' ? 'whitespace-nowrap' : 'whitespace-normal break-words')\n \"\n [style.overflow]=\"col.field === 'actions' ? 'visible' : 'visible'\"\n [style.text-overflow]=\"'clip'\"\n [style.--shk-col-width]=\"col.field !== 'actions' ? getColumnWidth(col) : null\"\n >\n @if (col.field !== 'actions') {\n @if (col.template === 'tag') {\n <shk-tag\n [value]=\"getTagValue(col, rowData)\"\n [severity]=\"getTagSeverity(col, rowData)\"\n [rounded]=\"getTagRounded(col, rowData)\"\n [icon]=\"getTagIcon(col, rowData)\"\n [style]=\"getTagStyle(col, rowData)\"\n />\n } @else if (col.format) {\n <span>{{ col.format(rowData) }}</span>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"\n customTemplates()[col.field] || defaultTemplate;\n context: { $implicit: rowData, field: col.field }\n \"\n ></ng-container>\n }\n } @else {\n <div class=\"flex items-center justify-start gap-px\">\n @for (action of getVisibleRowActions(rowData); track $index) {\n @if (isRowActionVisible(action, rowData)) {\n <div class=\"relative group\">\n <shk-tooltip\n [text]=\"getRowActionLabel(action, rowData)\"\n position=\"top\"\n >\n <button\n type=\"button\"\n (click)=\"action.onClick(rowData)\"\n [class]=\"\n 'table-action-btn hover:[background-color:var(--shk-surface-100)] dark:hover:[background-color:var(--shk-surface-200)] rounded-md ' +\n getRowActionClass(action, rowData)\n \"\n [disabled]=\"isRowActionDisabled(action, rowData) || false\"\n [attr.aria-label]=\"getRowActionLabel(action, rowData)\"\n >\n <svg\n [lucideIcon]=\"getIcon(getRowActionIconName(action, rowData))\"\n class=\"w-4 h-4\"\n ></svg>\n </button>\n </shk-tooltip>\n </div>\n }\n }\n @if (getHiddenRowActions(rowData).length > 0) {\n <div class=\"relative\">\n <shk-tooltip\n [text]=\"'common.more_options' | transloco\"\n position=\"top\"\n >\n <button\n type=\"button\"\n (click)=\"$event.stopPropagation(); toggleActionsDropdown(rowData, $event)\"\n class=\"table-action-btn hover:[background-color:var(--shk-surface-100)] dark:hover:[background-color:var(--shk-surface-200)] rounded-md\"\n [attr.aria-label]=\"'common.more_options' | transloco\"\n [attr.aria-expanded]=\"isActionsDropdownOpen(rowData)\"\n >\n <svg\n [lucideIcon]=\"getIcon('ellipsis-vertical')\"\n class=\"w-4 h-4\"\n ></svg>\n </button>\n </shk-tooltip>\n @if (isActionsDropdownOpen(rowData)) {\n <div\n class=\"fixed z-[9999] min-w-[160px] bg-white dark:[background-color:var(--shk-surface-100)] border _shk-border dark:[border-color:var(--shk-surface-200)] rounded-md shadow-lg py-1\"\n [style.top]=\"dropdownPosition().top + 'px'\"\n [style.left]=\"dropdownPosition().left + 'px'\"\n >\n @for (action of getHiddenRowActions(rowData); track $index) {\n <button\n type=\"button\"\n (click)=\"action.onClick(rowData); toggleActionsDropdown(rowData)\"\n [disabled]=\"isRowActionDisabled(action, rowData) || false\"\n [class]=\"\n 'w-full flex items-center gap-2 px-3 py-2 text-xs text-left _shk-text-surface-700 dark:[color:var(--shk-surface-700)] hover:[background-color:var(--shk-surface-100)] dark:hover:[background-color:var(--shk-surface-200)] disabled:opacity-40 disabled:cursor-not-allowed transition-colors ' +\n getRowActionClass(action, rowData)\n \"\n >\n <svg\n [lucideIcon]=\"getIcon(getRowActionIconName(action, rowData))\"\n class=\"w-3.5 h-3.5 shrink-0\"\n ></svg>\n <span>{{ getRowActionLabel(action, rowData) }}</span>\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </td>\n }\n </tr>\n }\n </tbody>\n }\n </table>\n <ng-template #defaultTemplate let-rowData let-field=\"field\">\n {{ rowData[field] }}\n </ng-template>\n </div>\n <div\n class=\"table-pagination flex items-center justify-between gap-4 px-2 min-[1440px]:px-3 py-2 border-t _shk-border dark:[border-color:var(--shk-surface-100)]\"\n >\n <div class=\"text-xs _shk-text-surface-600 dark:[color:var(--shk-surface-400)]\">\n {{ pageReport() }}\n </div>\n <div\n class=\"flex items-center gap-0.5\"\n role=\"navigation\"\n >\n <button\n type=\"button\"\n (click)=\"goToFirst()\"\n [disabled]=\"isFirstPage()\"\n class=\"shk-page-btn p-1 _shk-text-surface-500 hover:[color:var(--shk-surface-700)] dark:[color:var(--shk-surface-400)] dark:hover:[color:var(--shk-surface-200)] disabled:opacity-30 disabled:cursor-not-allowed rounded transition-colors\"\n >\n <svg [lucideIcon]=\"getIcon('chevrons-left')\" class=\"w-4 h-4\"></svg>\n </button>\n <button\n type=\"button\"\n (click)=\"prev()\"\n [disabled]=\"isFirstPage()\"\n class=\"shk-page-btn p-1 _shk-text-surface-500 hover:[color:var(--shk-surface-700)] dark:[color:var(--shk-surface-400)] dark:hover:[color:var(--shk-surface-200)] disabled:opacity-30 disabled:cursor-not-allowed rounded transition-colors\"\n >\n <svg [lucideIcon]=\"getIcon('chevron-left')\" class=\"w-4 h-4\"></svg>\n </button>\n <span\n class=\"px-2 text-xs font-medium _shk-text-surface-700 dark:[color:var(--shk-surface-700)]\"\n >{{ currentPage() }} / {{ totalPages() }}</span\n >\n <button\n type=\"button\"\n (click)=\"next()\"\n [disabled]=\"isLastPage()\"\n class=\"shk-page-btn p-1 _shk-text-surface-500 hover:[color:var(--shk-surface-700)] dark:[color:var(--shk-surface-400)] dark:hover:[color:var(--shk-surface-200)] disabled:opacity-30 disabled:cursor-not-allowed rounded transition-colors\"\n >\n <svg [lucideIcon]=\"getIcon('chevron-right')\" class=\"w-4 h-4\"></svg>\n </button>\n <button\n type=\"button\"\n (click)=\"goToLast()\"\n [disabled]=\"isLastPage()\"\n class=\"shk-page-btn p-1 _shk-text-surface-500 hover:[color:var(--shk-surface-700)] dark:[color:var(--shk-surface-400)] dark:hover:[color:var(--shk-surface-200)] disabled:opacity-30 disabled:cursor-not-allowed rounded transition-colors\"\n >\n <svg [lucideIcon]=\"getIcon('chevrons-right')\" class=\"w-4 h-4\"></svg>\n </button>\n </div>\n <div\n class=\"flex items-center gap-1.5 text-xs _shk-text-surface-600 dark:[color:var(--shk-surface-400)]\"\n >\n <label [for]=\"uid + '-rows-per-page'\">{{ 'table.rows' | transloco }}</label>\n <select\n [id]=\"uid + '-rows-per-page'\"\n [value]=\"rowsPerPageLocal()\"\n (change)=\"onRowsPerPageChange($any($event.target).value)\"\n class=\"border _shk-border dark:[border-color:var(--shk-surface-200)] rounded px-2 py-1 text-xs bg-white dark:[background-color:var(--shk-surface-100)] _shk-text-surface-700 dark:[color:var(--shk-surface-700)] focus:outline-none focus:[border-color:var(--shk-primary-500)]\"\n >\n @for (opt of rowsPerPageOptions(); track opt) {\n <option [value]=\"opt\">{{ opt }}</option>\n }\n </select>\n </div>\n </div>\n </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["getIconFromCentral"],"mappings":"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"}
|
|
@@ -95,7 +95,7 @@ class TablistComponent {
|
|
|
95
95
|
>
|
|
96
96
|
<ng-content></ng-content>
|
|
97
97
|
</div>
|
|
98
|
-
`, isInline: true, styles: [".shk-tablist{display:flex;align-items:center;gap:.25rem;flex-wrap:wrap;border-bottom:1px solid var(--shk-surface-200)}.dark .shk-tablist{border-bottom-color:var(--shk-surface-200)}.shk-tablist-scrollable{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:thin}.shk-tablist-scrollable::-webkit-scrollbar{height:6px}.shk-tablist-scrollable::-webkit-scrollbar-thumb{background:var(--shk-surface-300);border-radius:9999px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
98
|
+
`, isInline: true, styles: [".shk-tablist{display:flex;align-items:center;gap:.25rem;flex-wrap:wrap;border-bottom:1px solid var(--shk-surface-200)}:host-context(.dark) .shk-tablist{border-bottom-color:var(--shk-surface-200)}.shk-tablist-scrollable{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:thin}.shk-tablist-scrollable::-webkit-scrollbar{height:6px}.shk-tablist-scrollable::-webkit-scrollbar-thumb{background:var(--shk-surface-300);border-radius:9999px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
99
99
|
}
|
|
100
100
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: TablistComponent, decorators: [{
|
|
101
101
|
type: Component,
|
|
@@ -109,7 +109,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImpo
|
|
|
109
109
|
>
|
|
110
110
|
<ng-content></ng-content>
|
|
111
111
|
</div>
|
|
112
|
-
`, styles: [".shk-tablist{display:flex;align-items:center;gap:.25rem;flex-wrap:wrap;border-bottom:1px solid var(--shk-surface-200)}.dark .shk-tablist{border-bottom-color:var(--shk-surface-200)}.shk-tablist-scrollable{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:thin}.shk-tablist-scrollable::-webkit-scrollbar{height:6px}.shk-tablist-scrollable::-webkit-scrollbar-thumb{background:var(--shk-surface-300);border-radius:9999px}\n"] }]
|
|
112
|
+
`, styles: [".shk-tablist{display:flex;align-items:center;gap:.25rem;flex-wrap:wrap;border-bottom:1px solid var(--shk-surface-200)}:host-context(.dark) .shk-tablist{border-bottom-color:var(--shk-surface-200)}.shk-tablist-scrollable{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:thin}.shk-tablist-scrollable::-webkit-scrollbar{height:6px}.shk-tablist-scrollable::-webkit-scrollbar-thumb{background:var(--shk-surface-300);border-radius:9999px}\n"] }]
|
|
113
113
|
}], propDecorators: { scrollable: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollable", required: false }] }], styleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "styleClass", required: false }] }] } });
|
|
114
114
|
|
|
115
115
|
/**
|
|
@@ -152,7 +152,7 @@ class TabComponent {
|
|
|
152
152
|
>
|
|
153
153
|
<ng-content></ng-content>
|
|
154
154
|
</button>
|
|
155
|
-
`, isInline: true, styles: [".shk-tab{display:inline-flex;align-items:center;gap:.375rem;padding:.625rem 1rem;font-size:.875rem;font-weight:500;color:var(--shk-surface-500);background:transparent;border:none;border-bottom:2px solid transparent;margin-bottom:-1px;cursor:pointer;white-space:nowrap;transition:color .15s ease-in-out,border-color .15s ease-in-out,background-color .15s ease-in-out}.shk-tab:hover:not(:disabled):not(.shk-tab-active){color:var(--shk-surface-800)}.shk-tab-active{color:var(--shk-primary-600);border-bottom-color:var(--shk-primary-600);font-weight:600}.dark .shk-tab-active{color:var(--shk-primary-400);border-bottom-color:var(--shk-primary-400)}.shk-tab:disabled{opacity:.5;cursor:not-allowed}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
155
|
+
`, isInline: true, styles: [".shk-tab{display:inline-flex;align-items:center;gap:.375rem;padding:.625rem 1rem;font-size:.875rem;font-weight:500;color:var(--shk-surface-500);background:transparent;border:none;border-bottom:2px solid transparent;margin-bottom:-1px;cursor:pointer;white-space:nowrap;transition:color .15s ease-in-out,border-color .15s ease-in-out,background-color .15s ease-in-out}.shk-tab:hover:not(:disabled):not(.shk-tab-active){color:var(--shk-surface-800)}.shk-tab-active{color:var(--shk-primary-600);border-bottom-color:var(--shk-primary-600);font-weight:600}:host-context(.dark) .shk-tab-active{color:var(--shk-primary-400);border-bottom-color:var(--shk-primary-400)}.shk-tab:disabled{opacity:.5;cursor:not-allowed}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
156
156
|
}
|
|
157
157
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: TabComponent, decorators: [{
|
|
158
158
|
type: Component,
|
|
@@ -170,7 +170,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImpo
|
|
|
170
170
|
>
|
|
171
171
|
<ng-content></ng-content>
|
|
172
172
|
</button>
|
|
173
|
-
`, styles: [".shk-tab{display:inline-flex;align-items:center;gap:.375rem;padding:.625rem 1rem;font-size:.875rem;font-weight:500;color:var(--shk-surface-500);background:transparent;border:none;border-bottom:2px solid transparent;margin-bottom:-1px;cursor:pointer;white-space:nowrap;transition:color .15s ease-in-out,border-color .15s ease-in-out,background-color .15s ease-in-out}.shk-tab:hover:not(:disabled):not(.shk-tab-active){color:var(--shk-surface-800)}.shk-tab-active{color:var(--shk-primary-600);border-bottom-color:var(--shk-primary-600);font-weight:600}.dark .shk-tab-active{color:var(--shk-primary-400);border-bottom-color:var(--shk-primary-400)}.shk-tab:disabled{opacity:.5;cursor:not-allowed}\n"] }]
|
|
173
|
+
`, styles: [".shk-tab{display:inline-flex;align-items:center;gap:.375rem;padding:.625rem 1rem;font-size:.875rem;font-weight:500;color:var(--shk-surface-500);background:transparent;border:none;border-bottom:2px solid transparent;margin-bottom:-1px;cursor:pointer;white-space:nowrap;transition:color .15s ease-in-out,border-color .15s ease-in-out,background-color .15s ease-in-out}.shk-tab:hover:not(:disabled):not(.shk-tab-active){color:var(--shk-surface-800)}.shk-tab-active{color:var(--shk-primary-600);border-bottom-color:var(--shk-primary-600);font-weight:600}:host-context(.dark) .shk-tab-active{color:var(--shk-primary-400);border-bottom-color:var(--shk-primary-400)}.shk-tab:disabled{opacity:.5;cursor:not-allowed}\n"] }]
|
|
174
174
|
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], styleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "styleClass", required: false }] }] } });
|
|
175
175
|
|
|
176
176
|
/**
|
|
@@ -223,22 +223,17 @@ class TabPanelComponent {
|
|
|
223
223
|
<ng-content></ng-content>
|
|
224
224
|
</div>
|
|
225
225
|
}
|
|
226
|
-
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
226
|
+
`, isInline: true, styles: [".shk-tabpanel{padding-top:.75rem;animation:shk-tabpanel-in .15s ease-out}@keyframes shk-tabpanel-in{0%{opacity:0}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
227
227
|
}
|
|
228
228
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: TabPanelComponent, decorators: [{
|
|
229
229
|
type: Component,
|
|
230
|
-
args: [{
|
|
231
|
-
selector: 'shk-tabpanel',
|
|
232
|
-
standalone: true,
|
|
233
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
234
|
-
template: `
|
|
230
|
+
args: [{ selector: 'shk-tabpanel', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
235
231
|
@if (active()) {
|
|
236
232
|
<div class="shk-tabpanel" role="tabpanel">
|
|
237
233
|
<ng-content></ng-content>
|
|
238
234
|
</div>
|
|
239
235
|
}
|
|
240
|
-
`,
|
|
241
|
-
}]
|
|
236
|
+
`, styles: [".shk-tabpanel{padding-top:.75rem;animation:shk-tabpanel-in .15s ease-out}@keyframes shk-tabpanel-in{0%{opacity:0}}\n"] }]
|
|
242
237
|
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }] } });
|
|
243
238
|
|
|
244
239
|
/**
|