@area8975/ui 0.2.2-dev.49 → 0.2.2-dev.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/fesm2022/area8975-ui-alert.mjs +113 -0
- package/fesm2022/area8975-ui-alert.mjs.map +1 -0
- package/fesm2022/area8975-ui-avatar.mjs +157 -0
- package/fesm2022/area8975-ui-avatar.mjs.map +1 -0
- package/fesm2022/area8975-ui-badge.mjs +116 -0
- package/fesm2022/area8975-ui-badge.mjs.map +1 -0
- package/fesm2022/area8975-ui-button.mjs +314 -0
- package/fesm2022/area8975-ui-button.mjs.map +1 -0
- package/fesm2022/area8975-ui-calendar.mjs +549 -0
- package/fesm2022/area8975-ui-calendar.mjs.map +1 -0
- package/fesm2022/area8975-ui-card-header.mjs +96 -0
- package/fesm2022/area8975-ui-card-header.mjs.map +1 -0
- package/fesm2022/area8975-ui-card.mjs +73 -0
- package/fesm2022/area8975-ui-card.mjs.map +1 -0
- package/fesm2022/area8975-ui-chart-palette.mjs +225 -0
- package/fesm2022/area8975-ui-chart-palette.mjs.map +1 -0
- package/fesm2022/area8975-ui-charts.mjs +2813 -0
- package/fesm2022/area8975-ui-charts.mjs.map +1 -0
- package/fesm2022/area8975-ui-checkbox.mjs +202 -0
- package/fesm2022/area8975-ui-checkbox.mjs.map +1 -0
- package/fesm2022/area8975-ui-colour.mjs +200 -0
- package/fesm2022/area8975-ui-colour.mjs.map +1 -0
- package/fesm2022/area8975-ui-container.mjs +40 -0
- package/fesm2022/area8975-ui-container.mjs.map +1 -0
- package/fesm2022/area8975-ui-counter.mjs +246 -0
- package/fesm2022/area8975-ui-counter.mjs.map +1 -0
- package/fesm2022/area8975-ui-date-range-picker.mjs +554 -0
- package/fesm2022/area8975-ui-date-range-picker.mjs.map +1 -0
- package/fesm2022/area8975-ui-datepicker.mjs +547 -0
- package/fesm2022/area8975-ui-datepicker.mjs.map +1 -0
- package/fesm2022/area8975-ui-disclosure.mjs +279 -0
- package/fesm2022/area8975-ui-disclosure.mjs.map +1 -0
- package/fesm2022/area8975-ui-drawer.mjs +106 -0
- package/fesm2022/area8975-ui-drawer.mjs.map +1 -0
- package/fesm2022/area8975-ui-dropdown-button.mjs +141 -0
- package/fesm2022/area8975-ui-dropdown-button.mjs.map +1 -0
- package/fesm2022/area8975-ui-dropdown-menu.mjs +96 -0
- package/fesm2022/area8975-ui-dropdown-menu.mjs.map +1 -0
- package/fesm2022/area8975-ui-dropdown.mjs +208 -0
- package/fesm2022/area8975-ui-dropdown.mjs.map +1 -0
- package/fesm2022/area8975-ui-dropzone.mjs +332 -0
- package/fesm2022/area8975-ui-dropzone.mjs.map +1 -0
- package/fesm2022/area8975-ui-field.mjs +191 -0
- package/fesm2022/area8975-ui-field.mjs.map +1 -0
- package/fesm2022/area8975-ui-file-input.mjs +340 -0
- package/fesm2022/area8975-ui-file-input.mjs.map +1 -0
- package/fesm2022/area8975-ui-file.mjs +47 -0
- package/fesm2022/area8975-ui-file.mjs.map +1 -0
- package/fesm2022/area8975-ui-format.mjs +70 -0
- package/fesm2022/area8975-ui-format.mjs.map +1 -0
- package/fesm2022/area8975-ui-input-addon.mjs +42 -0
- package/fesm2022/area8975-ui-input-addon.mjs.map +1 -0
- package/fesm2022/area8975-ui-input-group.mjs +86 -0
- package/fesm2022/area8975-ui-input-group.mjs.map +1 -0
- package/fesm2022/area8975-ui-input.mjs +682 -0
- package/fesm2022/area8975-ui-input.mjs.map +1 -0
- package/fesm2022/area8975-ui-kpi.mjs +167 -0
- package/fesm2022/area8975-ui-kpi.mjs.map +1 -0
- package/fesm2022/area8975-ui-layout.mjs +63 -0
- package/fesm2022/area8975-ui-layout.mjs.map +1 -0
- package/fesm2022/area8975-ui-loading.mjs +76 -0
- package/fesm2022/area8975-ui-loading.mjs.map +1 -0
- package/fesm2022/area8975-ui-modal-close-btn.mjs +89 -0
- package/fesm2022/area8975-ui-modal-close-btn.mjs.map +1 -0
- package/fesm2022/area8975-ui-modal.mjs +235 -0
- package/fesm2022/area8975-ui-modal.mjs.map +1 -0
- package/fesm2022/area8975-ui-money.mjs +230 -0
- package/fesm2022/area8975-ui-money.mjs.map +1 -0
- package/fesm2022/area8975-ui-overlay.mjs +317 -0
- package/fesm2022/area8975-ui-overlay.mjs.map +1 -0
- package/fesm2022/area8975-ui-pagination.mjs +152 -0
- package/fesm2022/area8975-ui-pagination.mjs.map +1 -0
- package/fesm2022/area8975-ui-private.mjs +63 -0
- package/fesm2022/area8975-ui-private.mjs.map +1 -0
- package/fesm2022/area8975-ui-progress.mjs +307 -0
- package/fesm2022/area8975-ui-progress.mjs.map +1 -0
- package/fesm2022/area8975-ui-radio.mjs +199 -0
- package/fesm2022/area8975-ui-radio.mjs.map +1 -0
- package/fesm2022/area8975-ui-rich-text-editor.mjs +778 -0
- package/fesm2022/area8975-ui-rich-text-editor.mjs.map +1 -0
- package/fesm2022/area8975-ui-search.mjs +266 -0
- package/fesm2022/area8975-ui-search.mjs.map +1 -0
- package/fesm2022/area8975-ui-segmented.mjs +118 -0
- package/fesm2022/area8975-ui-segmented.mjs.map +1 -0
- package/fesm2022/area8975-ui-select.mjs +926 -0
- package/fesm2022/area8975-ui-select.mjs.map +1 -0
- package/fesm2022/area8975-ui-sidebar-group.mjs +60 -0
- package/fesm2022/area8975-ui-sidebar-group.mjs.map +1 -0
- package/fesm2022/area8975-ui-sidebar-item.mjs +107 -0
- package/fesm2022/area8975-ui-sidebar-item.mjs.map +1 -0
- package/fesm2022/area8975-ui-sidebar.mjs +109 -0
- package/fesm2022/area8975-ui-sidebar.mjs.map +1 -0
- package/fesm2022/area8975-ui-skeleton.mjs +116 -0
- package/fesm2022/area8975-ui-skeleton.mjs.map +1 -0
- package/fesm2022/area8975-ui-stat.mjs +55 -0
- package/fesm2022/area8975-ui-stat.mjs.map +1 -0
- package/fesm2022/area8975-ui-switch.mjs +132 -0
- package/fesm2022/area8975-ui-switch.mjs.map +1 -0
- package/fesm2022/area8975-ui-tab.mjs +217 -0
- package/fesm2022/area8975-ui-tab.mjs.map +1 -0
- package/fesm2022/area8975-ui-table-filters.mjs +499 -0
- package/fesm2022/area8975-ui-table-filters.mjs.map +1 -0
- package/fesm2022/area8975-ui-table.mjs +1237 -0
- package/fesm2022/area8975-ui-table.mjs.map +1 -0
- package/fesm2022/area8975-ui-textarea.mjs +375 -0
- package/fesm2022/area8975-ui-textarea.mjs.map +1 -0
- package/fesm2022/area8975-ui-theme.mjs +246 -0
- package/fesm2022/area8975-ui-theme.mjs.map +1 -0
- package/fesm2022/area8975-ui-time-select.mjs +170 -0
- package/fesm2022/area8975-ui-time-select.mjs.map +1 -0
- package/fesm2022/area8975-ui-toast.mjs +269 -0
- package/fesm2022/area8975-ui-toast.mjs.map +1 -0
- package/fesm2022/area8975-ui-toaster.mjs +117 -0
- package/fesm2022/area8975-ui-toaster.mjs.map +1 -0
- package/fesm2022/area8975-ui-tooltip.mjs +196 -0
- package/fesm2022/area8975-ui-tooltip.mjs.map +1 -0
- package/fesm2022/area8975-ui-user-menu.mjs +186 -0
- package/fesm2022/area8975-ui-user-menu.mjs.map +1 -0
- package/fesm2022/area8975-ui.mjs +0 -16520
- package/package.json +237 -1
- package/types/area8975-ui-alert.d.ts +25 -0
- package/types/area8975-ui-avatar.d.ts +40 -0
- package/types/area8975-ui-badge.d.ts +31 -0
- package/types/area8975-ui-button.d.ts +129 -0
- package/types/area8975-ui-calendar.d.ts +177 -0
- package/types/area8975-ui-card-header.d.ts +28 -0
- package/types/area8975-ui-card.d.ts +18 -0
- package/types/area8975-ui-chart-palette.d.ts +176 -0
- package/types/area8975-ui-charts.d.ts +747 -0
- package/types/area8975-ui-checkbox.d.ts +61 -0
- package/types/area8975-ui-colour.d.ts +31 -0
- package/types/area8975-ui-container.d.ts +5 -0
- package/types/area8975-ui-counter.d.ts +43 -0
- package/types/area8975-ui-date-range-picker.d.ts +132 -0
- package/types/area8975-ui-datepicker.d.ts +124 -0
- package/types/area8975-ui-disclosure.d.ts +79 -0
- package/types/area8975-ui-drawer.d.ts +25 -0
- package/types/area8975-ui-dropdown-button.d.ts +32 -0
- package/types/area8975-ui-dropdown-menu.d.ts +25 -0
- package/types/area8975-ui-dropdown.d.ts +56 -0
- package/types/area8975-ui-dropzone.d.ts +96 -0
- package/types/area8975-ui-field.d.ts +72 -0
- package/types/area8975-ui-file-input.d.ts +72 -0
- package/types/area8975-ui-file.d.ts +21 -0
- package/types/area8975-ui-format.d.ts +37 -0
- package/types/area8975-ui-input-addon.d.ts +10 -0
- package/types/area8975-ui-input-group.d.ts +18 -0
- package/types/area8975-ui-input.d.ts +224 -0
- package/types/area8975-ui-kpi.d.ts +36 -0
- package/types/area8975-ui-layout.d.ts +7 -0
- package/types/area8975-ui-loading.d.ts +16 -0
- package/types/area8975-ui-modal-close-btn.d.ts +14 -0
- package/types/area8975-ui-modal.d.ts +45 -0
- package/types/area8975-ui-money.d.ts +77 -0
- package/types/area8975-ui-overlay.d.ts +75 -0
- package/types/area8975-ui-pagination.d.ts +27 -0
- package/types/area8975-ui-private.d.ts +20 -0
- package/types/area8975-ui-progress.d.ts +127 -0
- package/types/area8975-ui-radio.d.ts +61 -0
- package/types/area8975-ui-rich-text-editor.d.ts +165 -0
- package/types/area8975-ui-search.d.ts +56 -0
- package/types/area8975-ui-segmented.d.ts +41 -0
- package/types/area8975-ui-select.d.ts +293 -0
- package/types/area8975-ui-sidebar-group.d.ts +15 -0
- package/types/area8975-ui-sidebar-item.d.ts +20 -0
- package/types/area8975-ui-sidebar.d.ts +16 -0
- package/types/area8975-ui-skeleton.d.ts +35 -0
- package/types/area8975-ui-stat.d.ts +13 -0
- package/types/area8975-ui-switch.d.ts +32 -0
- package/types/area8975-ui-tab.d.ts +45 -0
- package/types/area8975-ui-table-filters.d.ts +138 -0
- package/types/area8975-ui-table.d.ts +371 -0
- package/types/area8975-ui-textarea.d.ts +126 -0
- package/types/area8975-ui-theme.d.ts +61 -0
- package/types/area8975-ui-time-select.d.ts +35 -0
- package/types/area8975-ui-toast.d.ts +78 -0
- package/types/area8975-ui-toaster.d.ts +23 -0
- package/types/area8975-ui-tooltip.d.ts +47 -0
- package/types/area8975-ui-user-menu.d.ts +39 -0
- package/types/area8975-ui.d.ts +1 -4546
- package/fesm2022/area8975-ui.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"area8975-ui-table.mjs","names":[],"sources":["../../../projects/ui/table/table.directives.ts","../../../projects/ui/table/table.registry.ts","../../../projects/ui/table/table.component.ts","../../../projects/ui/table/table.component.html","../../../projects/ui/table/table.datasource.ts"],"sourcesContent":["import { Directive, inject, input, TemplateRef } from '@angular/core';\n\nimport { type TableCellContext } from './table.types';\n\n\n/**\n * Draws a column's cells in place of its formatted value, matched by column id:\n * `<ng-template uiTableCell=\"description\" let-row>`. The accessor stays the cell's value.\n */\n@Directive({\n selector: 'ng-template[uiTableCell]'\n})\nexport class UiTableCellDirective {\n readonly columnId = input.required<string>({ alias: 'uiTableCell' });\n readonly template = inject<TemplateRef<TableCellContext<unknown>>>(\n TemplateRef\n );\n}\n\n/**\n * Content for a bar along the top of the table, e.g. a count and a sort control above a\n * `headerless` list: `<div uiTableBar>`. With `selectable`, the bar also selects every row.\n */\n@Directive({\n selector: '[uiTableBar]'\n})\nexport class UiTableBarDirective {}\n","import { Injectable, isDevMode, signal, type WritableSignal } from '@angular/core';\n\n\nexport interface UiLinkedTable {\n readonly query: WritableSignal<string>;\n readonly filters: WritableSignal<Record<string, unknown>>;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class UiTableRegistry {\n private readonly tables = signal<ReadonlyMap<string, UiLinkedTable>>(new Map());\n\n get(id: string): UiLinkedTable | null {\n return this.tables().get(id) ?? null;\n }\n\n register(id: string, table: UiLinkedTable): void {\n const existing = this.tables().get(id);\n\n if (isDevMode() && existing && existing !== table) {\n console.warn(`[ui-table] two tables share the id \"${id}\", controls will link to the newest one`);\n }\n\n this.tables.update(tables => new Map(tables).set(id, table));\n }\n\n unregister(id: string, table: UiLinkedTable): void {\n if (this.tables().get(id) !== table) {\n return;\n }\n\n this.tables.update(tables => {\n const next = new Map(tables);\n\n next.delete(id);\n\n return next;\n });\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectorRef,\n Component,\n computed,\n contentChild,\n contentChildren,\n DestroyRef,\n effect,\n inject,\n input,\n model,\n OnDestroy,\n OnInit,\n output,\n signal,\n type TemplateRef,\n untracked\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\n\nimport { UiButtonComponent } from '@area8975/ui/button';\nimport { UiCheckboxComponent } from '@area8975/ui/checkbox';\nimport { UiDropdownComponent } from '@area8975/ui/dropdown';\nimport { UiDropdownDirective } from '@area8975/ui/dropdown';\nimport { UI_FORMAT } from '@area8975/ui/format';\nimport { injectPrivateText, UI_PRIVACY } from '@area8975/ui/format';\nimport { UiInputComponent } from '@area8975/ui/input';\nimport { UiLoadingComponent } from '@area8975/ui/loading';\nimport { UiMoneyComponent } from '@area8975/ui/money';\nimport { UiPrivateComponent } from '@area8975/ui/private';\nimport { UiSelectComponent } from '@area8975/ui/select';\nimport {\n SelectDataSource,\n SelectLocalDataSource\n} from '@area8975/ui/select';\nimport { UiTooltipComponent } from '@area8975/ui/tooltip';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport {\n heroBars2,\n heroFunnel,\n heroMagnifyingGlass,\n heroViewColumns\n} from '@ng-icons/heroicons/outline';\nimport { catchError, debounceTime, filter, of, Subject, switchMap } from 'rxjs';\n\nimport {\n type TableDataSource,\n type TableDataSourceContent,\n type TableDataSourceParameters\n} from './table.datasource';\nimport { UiTableBarDirective, UiTableCellDirective } from './table.directives';\nimport { UiTableRegistry } from './table.registry';\nimport {\n type TableCellContext,\n type TableColumn,\n type TableColumnFilterOption,\n type TableRowAction,\n type TableSortDirection,\n type TableSortState\n} from './table.types';\n\n\nconst DEFAULT_COLUMN_WIDTH = 160;\nconst SELECTION_COLUMN_WIDTH = 44;\n\ninterface ColumnDragPreview {\n label: string;\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n@Component({\n selector: 'ui-table',\n templateUrl: './table.component.html',\n styleUrl: './table.component.css',\n imports: [\n NgIcon,\n NgTemplateOutlet,\n UiButtonComponent,\n UiCheckboxComponent,\n UiDropdownComponent,\n UiDropdownDirective,\n UiInputComponent,\n UiSelectComponent,\n UiLoadingComponent,\n UiMoneyComponent,\n UiPrivateComponent,\n UiTooltipComponent\n ],\n host: { class: 'block' },\n providers: [provideIcons({\n heroMagnifyingGlass,\n heroFunnel,\n heroViewColumns,\n heroBars2\n })]\n})\nexport class UiTableComponent<Row = unknown> implements OnInit, OnDestroy {\n readonly classes = input<string>('');\n\n /** Lets controls elsewhere on the page link to this table, e.g. `<ui-search [table]=\"'transactions'\">`. */\n readonly tableId = input<string | null>(null);\n\n readonly columns = input.required<TableColumn<Row>[]>();\n readonly dataSource = input.required<TableDataSource<Row>>();\n\n readonly emptyMessage = input<string>('No data to display.');\n readonly errorMessage = input<string>(\n 'Something went wrong loading this data.'\n );\n\n // identifies a row across sorts/filters/pages, defaults to its position which\n // is only stable for an unsorted, unfiltered, unpaginated table\n readonly rowId = input<(row: Row, index: number) => unknown>(\n (_row, index) => index\n );\n\n readonly selectable = input(false, { transform: booleanAttribute });\n readonly searchable = input(false, { transform: booleanAttribute });\n readonly searchPlaceholder = input<string>('Search...');\n readonly paginated = input(false, { transform: booleanAttribute });\n readonly pageSize = input<number>(10);\n readonly toggleableColumns = input(false, { transform: booleanAttribute });\n readonly reorderableColumns = input(false, { transform: booleanAttribute });\n readonly reorderableRows = input(false, { transform: booleanAttribute });\n readonly stickyHeader = input(false, { transform: booleanAttribute });\n /** Leaves out the header row, for rows that read on their own. A `uiTableBar` can still select every row. */\n readonly headerless = input(false, { transform: booleanAttribute });\n private readonly bar = contentChild(UiTableBarDirective);\n protected readonly hasBar = computed(() => !!this.bar());\n /** Starts each run of rows with a heading row, e.g. a date. A row gets one whenever its heading differs from the row before it. */\n readonly groupHeading = input<((row: Row) => string) | null>(null);\n readonly actions = input<TableRowAction<Row>[]>([]);\n\n readonly sort = model<TableSortState | null>(null);\n readonly selectedRowIds = model<Set<unknown>>(new Set());\n\n readonly selectionChange = output<Row[]>();\n readonly rowsReordered = output<Row[]>();\n\n readonly rows = signal<Row[]>([]);\n readonly total = signal(0);\n readonly loading = signal(false);\n readonly error = signal(false);\n\n readonly query = signal('');\n readonly filters = signal<Record<string, unknown>>({});\n\n protected readonly currentPage = signal(0);\n protected readonly hiddenColumnIds = signal<Set<string>>(new Set());\n protected readonly columnOrderIds = signal<string[] | null>(null);\n protected readonly columnWidths = signal<Record<string, number>>({});\n protected readonly columnMenuOpen = signal(false);\n protected readonly filterMenuOpen = signal(false);\n\n protected readonly draggedColumnId = signal<string | null>(null);\n protected readonly dragOverColumnId = signal<string | null>(null);\n protected readonly dragPreview = signal<ColumnDragPreview | null>(null);\n protected readonly draggedRowIndex = signal<number | null>(null);\n\n private readonly cellDirectives = contentChildren(UiTableCellDirective);\n\n protected readonly cellTemplates = computed(() =>\n new Map<string, TemplateRef<TableCellContext<unknown>>>(\n this.cellDirectives().map(cell => [cell.columnId(), cell.template])\n )\n );\n\n readonly isEmpty = computed(() =>\n !this.loading() && !this.error() && this.rows().length === 0\n );\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-table',\n 'ui-text-body',\n this.hasSensitiveColumns() && 'ui-table--fixed',\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n protected readonly orderedColumns = computed(() => {\n const order = this.columnOrderIds();\n\n if (!order) {\n return this.columns();\n }\n\n const byId = new Map(this.columns().map(column => [column.id, column]));\n const ordered = order\n .map(id => byId.get(id))\n .filter((column): column is TableColumn<Row> => !!column);\n\n const missing = this.columns().filter(column =>\n !order.includes(column.id)\n );\n\n return [...ordered, ...missing];\n });\n\n protected readonly hideableColumns = computed(() =>\n this.orderedColumns().filter(column => column.hideable !== false)\n );\n\n protected readonly visibleColumns = computed(() =>\n this.orderedColumns().filter(column =>\n !this.hiddenColumnIds().has(column.id)\n )\n );\n\n // pinned-left columns first, then unpinned, then pinned-right, so sticky offsets stack correctly\n protected readonly renderColumns = computed(() => {\n const columns = this.visibleColumns();\n\n return [\n ...columns.filter(column => column.pin === 'left'),\n ...columns.filter(column => !column.pin),\n ...columns.filter(column => column.pin === 'right')\n ];\n });\n\n // hidden columns stay filterable, the menu isn't tied to what's on screen\n protected readonly filterableColumns = computed(() =>\n this.orderedColumns().filter(column => column.filterable)\n );\n\n protected readonly hasFilterableColumns = computed(() =>\n this.filterableColumns().length > 0\n );\n\n protected readonly activeFilterCount = computed(() =>\n Object.keys(this.filters()).length\n );\n\n protected readonly hasActions = computed(() => this.actions().length > 0);\n\n protected readonly columnSpan = computed(() =>\n this.renderColumns().length +\n (this.selectable() ? 1 : 0) +\n (this.hasActions() ? 1 : 0)\n );\n\n /** Each row's heading, or null when it continues the run above it. */\n protected readonly groupHeadings = computed(() => {\n const headingOf = this.groupHeading();\n if (!headingOf) {\n return this.rows().map(() => null);\n }\n\n const headings = this.rows().map(headingOf);\n return headings.map((heading, index) =>\n heading === headings[index - 1] ? null : heading\n );\n });\n\n private readonly hasSensitiveColumns = computed(() => this.columns().some(column => column.sensitive));\n\n protected readonly fixedWidth = computed(() =>\n this.hasSensitiveColumns()\n ? (this.selectable() ? SELECTION_COLUMN_WIDTH : 0) +\n this.renderColumns().reduce((total, column) => total + this.columnWidth(column), 0) +\n (this.hasActions() ? this.actionsColumnWidth() : 0)\n : null\n );\n protected readonly actionsColumnWidth = computed(() =>\n Math.max(60, this.actions().length * 40)\n );\n\n protected readonly totalPages = computed(() =>\n this.paginated()\n ? Math.max(1, Math.ceil(this.total() / this.pageSize()))\n : 1\n );\n\n protected readonly resultsLabel = computed(() => {\n const total = this.total();\n\n return total === 1 ? '1 result' : `${total} results`;\n });\n\n readonly allSelected = computed(() => {\n const rows = this.rows();\n\n return rows.length > 0 &&\n rows.every((row, index) =>\n this.selectedRowIds().has(this.rowId()(row, index))\n );\n });\n\n readonly someSelected = computed(() => {\n const rows = this.rows();\n const selected = this.selectedRowIds();\n const count = rows.filter((row, index) =>\n selected.has(this.rowId()(row, index))\n ).length;\n\n return count > 0 && count < rows.length;\n });\n\n private readonly leftOffsets = computed(() => {\n const offsets: Record<string, number> = {};\n let offset = this.selectable() ? SELECTION_COLUMN_WIDTH : 0;\n\n for (\n const column of this.renderColumns().filter(c => c.pin === 'left')\n ) {\n offsets[column.id] = offset;\n offset += this.columnWidth(column);\n }\n\n return offsets;\n });\n\n private readonly rightOffsets = computed(() => {\n const offsets: Record<string, number> = {};\n let offset = 0;\n\n const columns = this.renderColumns()\n .filter(c => c.pin === 'right')\n .slice()\n .reverse();\n\n for (const column of columns) {\n offsets[column.id] = offset;\n offset += this.columnWidth(column);\n }\n\n return offsets;\n });\n\n // one shared stream for every load, so a newer request cancels whatever was still in flight\n private readonly load$ = new Subject<void>();\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly registry = inject(UiTableRegistry);\n protected readonly uiFormat = inject(UI_FORMAT);\n private readonly privateText = injectPrivateText();\n protected readonly privacy = inject(UI_PRIVACY);\n\n private loadedQuery = '';\n private loadedFilters: Record<string, unknown> = {};\n private loadedSort: TableSortState | null = null;\n\n private resizeState: {\n columnId: string;\n startX: number;\n startWidth: number;\n } | null = null;\n private columnDragState: {\n columnId: string;\n pointerOffsetX: number;\n previewY: number;\n previewHeight: number;\n } | null = null;\n private readonly filterDataSources = new Map<\n string,\n SelectDataSource<TableColumnFilterOption>\n >();\n\n constructor() {\n effect(onCleanup => {\n const id = this.tableId();\n\n if (!id) {\n return;\n }\n\n // registering reads the registry, tracked it would loop\n untracked(() => this.registry.register(id, this));\n onCleanup(() => this.registry.unregister(id, this));\n });\n\n // a query set before the first emission, e.g. by a linked search, still reloads\n toObservable(this.query).pipe(\n debounceTime(300),\n filter(query => query !== this.loadedQuery),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe(() => this.resetAndReload());\n\n toObservable(this.filters).pipe(\n debounceTime(300),\n filter(filters => filters !== this.loadedFilters),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe(() => this.resetAndReload());\n\n // a sort set from outside, e.g. by a control above a headerless table, reloads too\n toObservable(this.sort).pipe(\n filter(sort => sort !== this.loadedSort),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe(() => this.resetAndReload());\n\n this.load$.pipe(\n switchMap(() => this.fetch()),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe(result => this.applyResult(result));\n }\n\n ngOnInit(): void {\n this.reload();\n }\n\n ngOnDestroy(): void {\n document.removeEventListener('pointermove', this.onResizeMove);\n document.removeEventListener('pointerup', this.onResizeEnd);\n document.removeEventListener('pointermove', this.onColumnDragMove);\n document.removeEventListener('pointerup', this.onColumnDragEnd);\n }\n\n reload(): void {\n this.load$.next();\n }\n\n protected cellValue(column: TableColumn<Row>, row: Row): unknown {\n return column.accessor(row);\n }\n\n // ng-icon's `name` wants a string; displayType 'icon' is the caller's promise the accessor gives one\n protected cellIconValue(column: TableColumn<Row>, row: Row): string {\n return column.accessor(row) as string;\n }\n\n protected moneyCellValue(column: TableColumn<Row>, row: Row): number | null {\n const value = column.accessor(row);\n\n return value === null || value === undefined ? null : Number(value);\n }\n\n protected formattedCellValue(column: TableColumn<Row>, row: Row): string {\n const value = column.accessor(row);\n\n if (value === null || value === undefined) {\n return '';\n }\n\n switch (column.displayType) {\n case 'number':\n return new Intl.NumberFormat().format(Number(value));\n case 'date':\n return new Intl.DateTimeFormat(undefined, {\n dateStyle: 'medium'\n })\n .format(new Date(value as string | number | Date));\n case 'time':\n return new Intl.DateTimeFormat(undefined, {\n timeStyle: 'short'\n })\n .format(new Date(value as string | number | Date));\n default:\n return String(value);\n }\n }\n\n protected onQueryChange(value: string): void {\n this.query.set(value);\n }\n\n protected filterValue(columnId: string): string {\n return (this.filters()[columnId] as string) ?? '';\n }\n\n protected onFilterInput(columnId: string, value: string): void {\n this.setFilter(columnId, value);\n }\n\n protected filterDataSource(\n column: TableColumn<Row>\n ): SelectDataSource<TableColumnFilterOption> {\n let dataSource = this.filterDataSources.get(column.id);\n\n if (!dataSource) {\n dataSource = new SelectLocalDataSource(\n column.filterOptions ?? [],\n (option, query) =>\n option.label.toLowerCase().includes(query.toLowerCase())\n );\n\n this.filterDataSources.set(column.id, dataSource);\n }\n\n return dataSource;\n }\n\n protected selectedFilterOption(\n column: TableColumn<Row>\n ): TableColumnFilterOption | null {\n const value = this.filters()[column.id];\n\n return column.filterOptions?.find(option => option.value === value) ??\n null;\n }\n\n protected filterOptionLabel(option: TableColumnFilterOption): string {\n return option.label;\n }\n\n protected readonly sensitiveFilterOptionLabel = (option: TableColumnFilterOption): string =>\n this.privateText(option.label);\n\n protected onFilterSelect(\n columnId: string,\n option: TableColumnFilterOption | null\n ): void {\n this.setFilter(columnId, option?.value);\n }\n\n protected clearFilters(): void {\n this.filters.set({});\n }\n\n protected toggleSort(column: TableColumn<Row>): void {\n if (!column.sortable) {\n return;\n }\n\n const current = this.sort();\n\n if (!current || current.columnId !== column.id) {\n this.sort.set({ columnId: column.id, direction: 'asc' });\n } else if (current.direction === 'asc') {\n this.sort.set({ columnId: column.id, direction: 'desc' });\n } else {\n this.sort.set(null);\n }\n\n this.resetAndReload();\n }\n\n protected sortDirection(column: TableColumn<Row>): TableSortDirection | null {\n const current = this.sort();\n\n return current?.columnId === column.id ? current.direction : null;\n }\n\n protected goToPage(page: number): void {\n if (page < 0 || page >= this.totalPages()) {\n return;\n }\n\n this.currentPage.set(page);\n this.reload();\n }\n\n protected isColumnVisible(column: TableColumn<Row>): boolean {\n return !this.hiddenColumnIds().has(column.id);\n }\n\n protected toggleColumnVisibility(column: TableColumn<Row>): void {\n this.hiddenColumnIds.update(hidden => {\n const next = new Set(hidden);\n\n if (next.has(column.id)) {\n next.delete(column.id);\n } else {\n next.add(column.id);\n }\n\n return next;\n });\n }\n\n protected isRowSelected(row: Row, index: number): boolean {\n return this.selectedRowIds().has(this.rowId()(row, index));\n }\n\n protected toggleRow(row: Row, index: number): void {\n const id = this.rowId()(row, index);\n\n this.selectedRowIds.update(selected => {\n const next = new Set(selected);\n\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n\n return next;\n });\n\n this.emitSelectionChange();\n }\n\n toggleSelectAll(): void {\n const wasAllSelected = this.allSelected();\n\n this.selectedRowIds.update(selected => {\n const next = new Set(selected);\n\n this.rows().forEach((row, index) => {\n const id = this.rowId()(row, index);\n\n if (wasAllSelected) {\n next.delete(id);\n } else {\n next.add(id);\n }\n });\n\n return next;\n });\n\n this.emitSelectionChange();\n }\n\n protected columnWidth(column: TableColumn<Row>): number {\n return this.columnWidths()[column.id] ??\n column.width ??\n DEFAULT_COLUMN_WIDTH;\n }\n\n protected isPinned(column: TableColumn<Row>): boolean {\n return column.pin === 'left' || column.pin === 'right';\n }\n\n protected leftOffset(column: TableColumn<Row>): number | null {\n return column.pin === 'left' ? this.leftOffsets()[column.id] : null;\n }\n\n protected rightOffset(column: TableColumn<Row>): number | null {\n return column.pin === 'right' ? this.rightOffsets()[column.id] : null;\n }\n\n protected startResize(event: PointerEvent, column: TableColumn<Row>): void {\n event.preventDefault();\n event.stopPropagation();\n\n this.resizeState = {\n columnId: column.id,\n startX: event.clientX,\n startWidth: this.columnWidth(column)\n };\n\n document.addEventListener('pointermove', this.onResizeMove);\n document.addEventListener('pointerup', this.onResizeEnd);\n }\n\n protected canReorderRows(): boolean {\n return this.reorderableRows() && !this.sort();\n }\n\n // custom pointer-based drag instead of native HTML5 DnD, so the floating\n // preview can be pinned to the header row instead of following the cursor\n // wherever it goes, and so a drop indicator can show the exact landing spot\n protected onColumnDragStart(\n event: PointerEvent,\n column: TableColumn<Row>\n ): void {\n event.preventDefault();\n\n const headerCell = (event.currentTarget as HTMLElement).closest('th');\n const headerRow = headerCell?.closest('tr');\n\n if (!headerCell || !headerRow) {\n return;\n }\n\n const cellRect = headerCell.getBoundingClientRect();\n const rowRect = headerRow.getBoundingClientRect();\n\n this.columnDragState = {\n columnId: column.id,\n pointerOffsetX: event.clientX - cellRect.left,\n previewY: rowRect.top + (rowRect.height - cellRect.height) / 2,\n previewHeight: cellRect.height\n };\n\n this.draggedColumnId.set(column.id);\n this.dragPreview.set({\n label: column.header,\n x: cellRect.left,\n y: this.columnDragState.previewY,\n width: cellRect.width,\n height: this.columnDragState.previewHeight\n });\n\n document.addEventListener('pointermove', this.onColumnDragMove);\n document.addEventListener('pointerup', this.onColumnDragEnd);\n }\n\n protected onRowDragStart(event: DragEvent, index: number): void {\n this.draggedRowIndex.set(index);\n event.dataTransfer?.setData('text/plain', String(index));\n }\n\n protected onRowDragOver(event: DragEvent): void {\n if (this.draggedRowIndex() !== null) {\n event.preventDefault();\n }\n }\n\n protected onRowDrop(event: DragEvent, index: number): void {\n event.preventDefault();\n\n const from = this.draggedRowIndex();\n this.draggedRowIndex.set(null);\n\n if (from === null || from === index) {\n return;\n }\n\n const next = [...this.rows()];\n const [moved] = next.splice(from, 1);\n next.splice(index, 0, moved);\n\n this.rows.set(next);\n this.rowsReordered.emit(next);\n }\n\n private readonly onResizeMove = (event: PointerEvent): void => {\n if (!this.resizeState) {\n return;\n }\n\n const column = this.columns().find(c =>\n c.id === this.resizeState!.columnId\n );\n const minWidth = column?.minWidth ?? 60;\n const delta = event.clientX - this.resizeState.startX;\n const width = Math.max(minWidth, this.resizeState.startWidth + delta);\n\n this.columnWidths.update(widths => ({\n ...widths,\n [this.resizeState!.columnId]: width\n }));\n };\n\n private readonly onResizeEnd = (): void => {\n this.resizeState = null;\n document.removeEventListener('pointermove', this.onResizeMove);\n document.removeEventListener('pointerup', this.onResizeEnd);\n };\n\n private readonly onColumnDragMove = (event: PointerEvent): void => {\n const state = this.columnDragState;\n\n if (!state) {\n return;\n }\n\n // x tracks the pointer, y stays pinned to the header row - the preview\n // can never wander down into the body no matter where the pointer goes\n this.dragPreview.update(preview =>\n preview && {\n ...preview,\n x: event.clientX - state.pointerOffsetX\n }\n );\n\n const target = document.elementFromPoint(event.clientX, event.clientY);\n const headerCell = target?.closest<HTMLElement>('th[data-column-id]');\n const columnId = headerCell?.dataset['columnId'];\n\n this.dragOverColumnId.set(\n columnId && columnId !== state.columnId ? columnId : null\n );\n };\n\n private readonly onColumnDragEnd = (): void => {\n const state = this.columnDragState;\n const overId = this.dragOverColumnId();\n\n this.columnDragState = null;\n this.draggedColumnId.set(null);\n this.dragOverColumnId.set(null);\n this.dragPreview.set(null);\n\n document.removeEventListener('pointermove', this.onColumnDragMove);\n document.removeEventListener('pointerup', this.onColumnDragEnd);\n\n if (!state || !overId || state.columnId === overId) {\n return;\n }\n\n const order = this.columnOrderIds() ?? this.columns().map(c => c.id);\n const from = order.indexOf(state.columnId);\n const to = order.indexOf(overId);\n\n if (from === -1 || to === -1) {\n return;\n }\n\n // dropped column takes the exact slot of the highlighted target, which\n // shifts over to make room - `to` is deliberately the target's index\n // from before removal, so splicing it into the now-shorter array lands\n // the dragged column exactly where the target was and pushes it aside,\n // rather than merely landing next to it\n const next = [...order];\n next.splice(from, 1);\n next.splice(to, 0, state.columnId);\n\n this.columnOrderIds.set(next);\n };\n\n private setFilter(columnId: string, value: unknown): void {\n this.filters.update(filters => {\n const next = { ...filters };\n\n if (value) {\n next[columnId] = value;\n } else {\n delete next[columnId];\n }\n\n return next;\n });\n }\n\n private resetAndReload(): void {\n this.currentPage.set(0);\n this.reload();\n }\n\n private emitSelectionChange(): void {\n const ids = this.selectedRowIds();\n const selectedRows = this.rows().filter((row, index) =>\n ids.has(this.rowId()(row, index))\n );\n\n this.selectionChange.emit(selectedRows);\n }\n\n private fetch() {\n this.loading.set(true);\n this.error.set(false);\n\n const params: TableDataSourceParameters = {\n page: this.currentPage(),\n size: this.paginated() ? this.pageSize() : 0,\n query: this.query(),\n sort: this.sort(),\n filters: this.filters()\n };\n\n this.loadedQuery = params.query;\n this.loadedFilters = params.filters;\n this.loadedSort = params.sort;\n\n return this.dataSource().load(params).pipe(catchError(() => of(null)));\n }\n\n private applyResult(result: TableDataSourceContent<Row> | null): void {\n this.loading.set(false);\n\n if (result) {\n this.rows.set(result.items);\n this.total.set(result.total);\n } else {\n this.error.set(true);\n }\n\n this.cdr.markForCheck();\n }\n}\n","@if (searchable() || hasFilterableColumns() || toggleableColumns()) {\n <div class=\"ui-table-toolbar\">\n @if (searchable()) {\n <ui-input\n [value]=\"query()\"\n (valueChange)=\"onQueryChange($event)\"\n [placeholder]=\"searchPlaceholder()\"\n class=\"max-w-xs\"\n >\n <ng-template #leading>\n <ng-icon\n name=\"heroMagnifyingGlass\"\n class=\"ms-3 size-4 text-muted-foreground-1\"\n />\n </ng-template>\n </ui-input>\n }\n\n @if (hasFilterableColumns()) {\n <ui-dropdown\n [isOpen]=\"filterMenuOpen\"\n placement=\"bottom-start\"\n closeBehaviour=\"whenClickOutside\"\n >\n <ui-button\n size=\"sm\"\n appearance=\"white\"\n intent=\"secondary\"\n (click)=\"filterMenuOpen.update(open => !open)\"\n >\n <ng-icon name=\"heroFunnel\" class=\"size-4\" />\n Filters\n @if (activeFilterCount()) {\n <span class=\"ui-table-filter-count ui-text-caption\">\n {{ activeFilterCount() }}\n </span>\n }\n </ui-button>\n\n @if (filterMenuOpen()) {\n <div uiDropdownContent class=\"py-2\">\n <div class=\"ui-table-filter-menu\">\n @for (column of filterableColumns(); track column.id) {\n <div class=\"flex flex-col gap-1\">\n <span\n class=\"text-muted-foreground-1 ui-text-caption\"\n >\n {{ column.header }}\n </span>\n\n @if (column.filterOptions) {\n <ui-select\n [dataSource]=\"filterDataSource(column)\"\n [selectedItem]=\"selectedFilterOption(column)\"\n (selectionChange)=\"onFilterSelect(column.id, $event)\"\n [displayWith]=\"column.sensitive ? sensitiveFilterOptionLabel : filterOptionLabel\"\n [clearable]=\"true\"\n clearLabel=\"All\"\n placeholder=\"All\"\n />\n } @else {\n <ui-input\n [value]=\"filterValue(column.id)\"\n (valueChange)=\"onFilterInput(column.id, $event)\"\n placeholder=\"Filter...\"\n [ariaLabel]=\"'Filter ' + column.header\"\n />\n }\n </div>\n }\n\n @if (activeFilterCount()) {\n <ui-button\n appearance=\"link\"\n intent=\"secondary\"\n class=\"text-end\"\n classes=\"self-end p-0! text-sm\"\n (click)=\"clearFilters()\"\n >\n Clear filters\n </ui-button>\n }\n </div>\n </div>\n }\n </ui-dropdown>\n }\n\n @if (toggleableColumns()) {\n <ui-dropdown\n [isOpen]=\"columnMenuOpen\"\n placement=\"bottom-end\"\n closeBehaviour=\"whenClickOutside\"\n class=\"ms-auto\"\n >\n <ui-button\n size=\"sm\"\n appearance=\"white\"\n intent=\"secondary\"\n (click)=\"columnMenuOpen.update(open => !open)\"\n >\n <ng-icon name=\"heroViewColumns\" class=\"size-4\" />\n Columns\n </ui-button>\n\n @if (columnMenuOpen()) {\n <div uiDropdownContent class=\"py-2\">\n <div class=\"bg-layer shadow-xs py-1 border border-dropdown-divider rounded-lg min-w-40\">\n @for (column of hideableColumns(); track column.id) {\n <label\n class=\"flex items-center gap-2 hover:bg-dropdown-item-hover px-3 py-2 ui-text-body-alt cursor-pointer\"\n >\n <ui-checkbox\n [value]=\"isColumnVisible(column)\"\n (valueChange)=\"toggleColumnVisibility(column)\"\n />\n {{ column.header }}\n </label>\n }\n </div>\n </div>\n }\n </ui-dropdown>\n }\n </div>\n}\n\n<div class=\"ui-table-scroll\">\n <table [class]=\"generatedClasses()\" [style.width.px]=\"fixedWidth()\">\n <colgroup>\n @if (selectable()) {\n <col [style.width.px]=\"44\" />\n }\n\n @for (column of renderColumns(); track column.id) {\n <col [style.width.px]=\"columnWidth(column)\" />\n }\n\n @if (hasActions()) {\n <col [style.width.px]=\"actionsColumnWidth()\" />\n }\n </colgroup>\n\n @if (hasBar() || !headerless()) {\n <thead [class.ui-table-sticky]=\"stickyHeader()\">\n @if (hasBar()) {\n <!-- a row of the table, so its checkbox and content line up with the columns below -->\n <tr class=\"ui-table-bar-row\">\n @if (selectable()) {\n <th class=\"ui-table-select-cell\">\n <ui-checkbox\n [value]=\"allSelected()\"\n [indeterminate]=\"someSelected()\"\n (valueChange)=\"toggleSelectAll()\"\n />\n </th>\n }\n <th [attr.colspan]=\"columnSpan() - (selectable() ? 1 : 0)\">\n <ng-content select=\"[uiTableBar]\" />\n </th>\n </tr>\n }\n @if (!headerless()) {\n <tr>\n @if (selectable()) {\n <th class=\"text-center! ui-table-select-cell\">\n <ui-checkbox\n [value]=\"allSelected()\"\n [indeterminate]=\"someSelected()\"\n (valueChange)=\"toggleSelectAll()\"\n />\n </th>\n }\n\n @for (column of renderColumns(); track column.id) {\n <th\n scope=\"col\"\n [attr.data-column-id]=\"column.id\"\n [class.ui-table-pinned]=\"isPinned(column)\"\n [attr.data-pin]=\"column.pin || null\"\n [class.ui-table-column-dragging]=\"draggedColumnId() === column.id\"\n [class.ui-table-column-drag-over]=\"dragOverColumnId() === column.id\"\n [style.left.px]=\"leftOffset(column)\"\n [style.right.px]=\"rightOffset(column)\"\n >\n <div class=\"ui-table-th-content\">\n @if (reorderableColumns() && column.reorderable !== false) {\n <ng-icon\n name=\"heroBars2\"\n class=\"ui-table-drag-handle\"\n (pointerdown)=\"onColumnDragStart($event, column)\"\n />\n }\n\n @if (column.sortable) {\n <ui-button\n appearance=\"none\"\n classes=\"flex items-center gap-1 p-0! border-transparent! rounded-none! cursor-pointer hover:text-foreground focus-visible:text-foreground\"\n (click)=\"toggleSort(column)\"\n >\n <span\n class=\"font-medium text-muted-foreground-1 ui-text-caption uppercase\"\n >\n {{ column.header }}\n </span>\n <svg\n viewBox=\"0 0 8 13\"\n aria-hidden=\"true\"\n class=\"ui-table-sort\"\n [attr.data-direction]=\"sortDirection(column)\"\n >\n <path class=\"ui-table-sort-asc\" d=\"M4 0 8 5H0z\" />\n <path class=\"ui-table-sort-desc\" d=\"M4 13 0 8h8z\" />\n </svg>\n </ui-button>\n } @else {\n <span\n class=\"font-medium text-muted-foreground-1 ui-text-caption ui-text-caption uppercase\"\n >\n {{ column.header }}\n </span>\n }\n </div>\n\n @if (column.resizable) {\n <span\n class=\"ui-table-resize-handle\"\n (pointerdown)=\"startResize($event, column)\"\n ></span>\n }\n </th>\n }\n\n @if (hasActions()) {\n <th class=\"ui-table-actions-cell\"></th>\n }\n </tr>\n }\n </thead>\n }\n\n <tbody class=\"ui-text-body-alt\">\n @if (loading()) {\n <tr>\n <td\n [attr.colspan]=\"columnSpan()\"\n class=\"ui-table-status\"\n >\n <ui-loading type=\"loading-dots\" />\n </td>\n </tr>\n } @else if (error()) {\n <tr>\n <td\n [attr.colspan]=\"columnSpan()\"\n class=\"ui-table-status ui-table-status-error\"\n >\n {{ errorMessage() }}\n <ui-button\n appearance=\"link\"\n intent=\"danger\"\n classes=\"ms-1 p-0! text-sm underline\"\n (click)=\"reload()\"\n >\n Retry\n </ui-button>\n </td>\n </tr>\n } @else if (isEmpty()) {\n <tr>\n <td\n [attr.colspan]=\"columnSpan()\"\n class=\"ui-table-status\"\n >\n {{ emptyMessage() }}\n </td>\n </tr>\n } @else {\n @for (row of rows(); track rowId()(row, $index); let i = $index) {\n @if (groupHeadings()[i]; as heading) {\n <tr class=\"ui-table-group-row\">\n <th scope=\"rowgroup\" [attr.colspan]=\"columnSpan()\">{{ heading }}</th>\n </tr>\n }\n <tr\n [class.ui-table-row-selected]=\"isRowSelected(row, i)\"\n [class.ui-table-row-dragging]=\"draggedRowIndex() === i\"\n [draggable]=\"canReorderRows()\"\n (dragstart)=\"onRowDragStart($event, i)\"\n (dragover)=\"onRowDragOver($event)\"\n (drop)=\"onRowDrop($event, i)\"\n >\n @if (selectable()) {\n <td class=\"ui-table-select-cell\">\n <ui-checkbox\n [value]=\"isRowSelected(row, i)\"\n (valueChange)=\"toggleRow(row, i)\"\n />\n </td>\n }\n\n @for (column of renderColumns(); track column.id) {\n <td\n [class.ui-table-pinned]=\"isPinned(column)\"\n [attr.data-pin]=\"column.pin || null\"\n [style.left.px]=\"leftOffset(column)\"\n [style.right.px]=\"rightOffset(column)\"\n >\n @if (cellTemplates().get(column.id); as template) {\n @if (column.sensitive && privacy() !== 'visible') {\n <ui-private [text]=\"formattedCellValue(column, row)\" />\n } @else {\n <ng-container\n *ngTemplateOutlet=\"template; context: { $implicit: row, value: cellValue(column, row) }\"\n />\n }\n } @else if (column.displayType === 'icon') {\n <ng-icon\n [name]=\"cellIconValue(column, row)\"\n class=\"size-4\"\n />\n } @else if (column.displayType === 'currency') {\n <ui-money\n [value]=\"moneyCellValue(column, row)\"\n [currency]=\"column.currency ?? uiFormat.currency\"\n placeholder=\"\"\n />\n } @else if (column.sensitive) {\n <ui-private [text]=\"formattedCellValue(column, row)\" />\n } @else {\n {{ formattedCellValue(column, row) }}\n }\n </td>\n }\n\n @if (hasActions()) {\n <td class=\"ui-table-actions-cell\">\n <div class=\"ui-table-actions\">\n @for (action of actions(); track action.id) {\n <ui-tooltip [text]=\"action.label\">\n <ui-button\n appearance=\"none\"\n classes=\"p-1.5! border-transparent! rounded-md! text-muted-foreground-1 cursor-pointer hover:bg-surface-hover hover:text-foreground focus-visible:bg-surface-hover focus-visible:text-foreground disabled:opacity-40! disabled:cursor-not-allowed\"\n [disabled]=\"!!action.disabled?.(row)\"\n [ariaLabel]=\"action.label\"\n (click)=\"action.onClick(row)\"\n >\n <ng-icon\n [name]=\"action.icon\"\n class=\"size-4\"\n />\n </ui-button>\n </ui-tooltip>\n }\n </div>\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n</div>\n\n@if (dragPreview(); as preview) {\n <div\n class=\"ui-table-drag-preview ui-text-body-alt\"\n [style.left.px]=\"preview.x\"\n [style.top.px]=\"preview.y\"\n [style.width.px]=\"preview.width\"\n [style.height.px]=\"preview.height\"\n >\n <ng-icon name=\"heroBars2\" class=\"ui-table-drag-preview-icon\" />\n <span class=\"truncate\">{{ preview.label }}</span>\n </div>\n}\n\n@if (paginated()) {\n <div class=\"ui-table-footer\">\n <span class=\"text-muted-foreground-1 ui-text-caption\">{{\n resultsLabel()\n }}</span>\n\n <div class=\"ui-table-pagination\">\n <ui-button\n size=\"sm\"\n appearance=\"white\"\n intent=\"secondary\"\n [disabled]=\"currentPage() === 0\"\n (click)=\"goToPage(currentPage() - 1)\"\n >\n Prev\n </ui-button>\n\n <span class=\"ui-text-body-alt\">Page {{ currentPage() + 1 }} of {{\n totalPages()\n }}</span>\n\n <ui-button\n size=\"sm\"\n appearance=\"white\"\n intent=\"secondary\"\n [disabled]=\"currentPage() + 1 >= totalPages()\"\n (click)=\"goToPage(currentPage() + 1)\"\n >\n Next\n </ui-button>\n </div>\n </div>\n}\n","import { Observable, of } from 'rxjs';\n\nimport { type TableSortState } from './table.types';\n\n\nexport interface TableDataSourceParameters {\n page: number;\n /** 0 or less means \"no limit\", used when the table isn't paginated */\n size: number;\n query: string;\n sort: TableSortState | null;\n filters: Record<string, unknown>;\n}\n\nexport interface TableDataSourceContent<Row> {\n items: Row[];\n total: number;\n}\n\nexport interface TableDataSource<Row> {\n load(params: TableDataSourceParameters): Observable<TableDataSourceContent<Row>>;\n}\n\nexport interface TableLocalDataSourceOptions<Row> {\n search?: (item: Row, query: string) => boolean;\n sortValue?: (item: Row, columnId: string) => unknown;\n filter?: (item: Row, filters: Record<string, unknown>) => boolean;\n}\n\nexport class TableLocalDataSource<Row> implements TableDataSource<Row> {\n constructor(\n private readonly items: Row[],\n private readonly options: TableLocalDataSourceOptions<Row> = {}\n ) {}\n\n load(params: TableDataSourceParameters): Observable<TableDataSourceContent<Row>> {\n let result = this.items;\n\n const query = params.query.trim();\n\n if (query && this.options.search) {\n result = result.filter(item => this.options.search!(item, query));\n }\n\n if (Object.keys(params.filters).length && this.options.filter) {\n result = result.filter(item => this.options.filter!(item, params.filters));\n }\n\n if (params.sort && this.options.sortValue) {\n const { columnId, direction } = params.sort;\n const factor = direction === 'asc' ? 1 : -1;\n\n result = [...result].sort((a, b) => {\n const valueA = this.options.sortValue!(a, columnId);\n const valueB = this.options.sortValue!(b, columnId);\n\n if (valueA === valueB) {\n return 0;\n }\n\n return (valueA as never) > (valueB as never) ? factor : -factor;\n });\n }\n\n const total = result.length;\n const items = params.size > 0 ?\n result.slice(params.page * params.size, (params.page * params.size) + params.size) :\n result;\n\n return of({ items, total });\n }\n}\n\n// wraps any fetch function, so no specific backend is baked in here\nexport class TableRemoteDataSource<Row> implements TableDataSource<Row> {\n constructor(\n private readonly fetch: (\n params: TableDataSourceParameters\n ) => Observable<TableDataSourceContent<Row>>\n ) {}\n\n load(params: TableDataSourceParameters): Observable<TableDataSourceContent<Row>> {\n return this.fetch(params);\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import { Component, booleanAttribute, computed, input, model, output } from "@angular/core";
|
|
3
|
+
var UiTextareaComponent = class UiTextareaComponent {
|
|
4
|
+
value = model.required(...ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []);
|
|
5
|
+
classes = input("", ...ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []);
|
|
6
|
+
id = input("", ...ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []);
|
|
7
|
+
name = input("", ...ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []);
|
|
8
|
+
placeholder = input("", ...ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []);
|
|
9
|
+
rows = input(3, ...ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []);
|
|
10
|
+
resize = input("vertical", ...ngDevMode ? [{ debugName: "resize" }] : /* istanbul ignore next */ []);
|
|
11
|
+
required = input(false, {
|
|
12
|
+
...ngDevMode ? { debugName: "required" } : /* istanbul ignore next */ {},
|
|
13
|
+
transform: booleanAttribute
|
|
14
|
+
});
|
|
15
|
+
disabled = input(false, {
|
|
16
|
+
...ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {},
|
|
17
|
+
transform: booleanAttribute
|
|
18
|
+
});
|
|
19
|
+
readonly = input(false, {
|
|
20
|
+
...ngDevMode ? { debugName: "readonly" } : /* istanbul ignore next */ {},
|
|
21
|
+
transform: booleanAttribute
|
|
22
|
+
});
|
|
23
|
+
validationState = model(null, ...ngDevMode ? [{ debugName: "validationState" }] : /* istanbul ignore next */ []);
|
|
24
|
+
minlength = input(null, ...ngDevMode ? [{ debugName: "minlength" }] : /* istanbul ignore next */ []);
|
|
25
|
+
maxlength = input(null, ...ngDevMode ? [{ debugName: "maxlength" }] : /* istanbul ignore next */ []);
|
|
26
|
+
autofocus = input(false, {
|
|
27
|
+
...ngDevMode ? { debugName: "autofocus" } : /* istanbul ignore next */ {},
|
|
28
|
+
transform: booleanAttribute
|
|
29
|
+
});
|
|
30
|
+
spellcheck = input(true, {
|
|
31
|
+
...ngDevMode ? { debugName: "spellcheck" } : /* istanbul ignore next */ {},
|
|
32
|
+
transform: booleanAttribute
|
|
33
|
+
});
|
|
34
|
+
ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
|
|
35
|
+
describedBy = input("", ...ngDevMode ? [{ debugName: "describedBy" }] : /* istanbul ignore next */ []);
|
|
36
|
+
focused = output();
|
|
37
|
+
blurred = output();
|
|
38
|
+
generatedClasses = computed(() => [
|
|
39
|
+
"ui-textarea",
|
|
40
|
+
"ui-text-body",
|
|
41
|
+
this.classes()
|
|
42
|
+
].filter(Boolean).join(" "), ...ngDevMode ? [{ debugName: "generatedClasses" }] : /* istanbul ignore next */ []);
|
|
43
|
+
handleInput(event) {
|
|
44
|
+
const target = event.target;
|
|
45
|
+
this.value.set(target.value);
|
|
46
|
+
}
|
|
47
|
+
handleFocus(event) {
|
|
48
|
+
this.focused.emit(event);
|
|
49
|
+
}
|
|
50
|
+
handleBlur(event) {
|
|
51
|
+
this.blurred.emit(event);
|
|
52
|
+
}
|
|
53
|
+
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
54
|
+
minVersion: "12.0.0",
|
|
55
|
+
version: "22.2.1",
|
|
56
|
+
ngImport: i0,
|
|
57
|
+
type: UiTextareaComponent,
|
|
58
|
+
deps: [],
|
|
59
|
+
target: i0.ɵɵFactoryTarget.Component
|
|
60
|
+
});
|
|
61
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({
|
|
62
|
+
minVersion: "17.1.0",
|
|
63
|
+
version: "22.2.1",
|
|
64
|
+
type: UiTextareaComponent,
|
|
65
|
+
isStandalone: true,
|
|
66
|
+
selector: "ui-textarea",
|
|
67
|
+
inputs: {
|
|
68
|
+
value: {
|
|
69
|
+
classPropertyName: "value",
|
|
70
|
+
publicName: "value",
|
|
71
|
+
isSignal: true,
|
|
72
|
+
isRequired: true,
|
|
73
|
+
transformFunction: null
|
|
74
|
+
},
|
|
75
|
+
classes: {
|
|
76
|
+
classPropertyName: "classes",
|
|
77
|
+
publicName: "classes",
|
|
78
|
+
isSignal: true,
|
|
79
|
+
isRequired: false,
|
|
80
|
+
transformFunction: null
|
|
81
|
+
},
|
|
82
|
+
id: {
|
|
83
|
+
classPropertyName: "id",
|
|
84
|
+
publicName: "id",
|
|
85
|
+
isSignal: true,
|
|
86
|
+
isRequired: false,
|
|
87
|
+
transformFunction: null
|
|
88
|
+
},
|
|
89
|
+
name: {
|
|
90
|
+
classPropertyName: "name",
|
|
91
|
+
publicName: "name",
|
|
92
|
+
isSignal: true,
|
|
93
|
+
isRequired: false,
|
|
94
|
+
transformFunction: null
|
|
95
|
+
},
|
|
96
|
+
placeholder: {
|
|
97
|
+
classPropertyName: "placeholder",
|
|
98
|
+
publicName: "placeholder",
|
|
99
|
+
isSignal: true,
|
|
100
|
+
isRequired: false,
|
|
101
|
+
transformFunction: null
|
|
102
|
+
},
|
|
103
|
+
rows: {
|
|
104
|
+
classPropertyName: "rows",
|
|
105
|
+
publicName: "rows",
|
|
106
|
+
isSignal: true,
|
|
107
|
+
isRequired: false,
|
|
108
|
+
transformFunction: null
|
|
109
|
+
},
|
|
110
|
+
resize: {
|
|
111
|
+
classPropertyName: "resize",
|
|
112
|
+
publicName: "resize",
|
|
113
|
+
isSignal: true,
|
|
114
|
+
isRequired: false,
|
|
115
|
+
transformFunction: null
|
|
116
|
+
},
|
|
117
|
+
required: {
|
|
118
|
+
classPropertyName: "required",
|
|
119
|
+
publicName: "required",
|
|
120
|
+
isSignal: true,
|
|
121
|
+
isRequired: false,
|
|
122
|
+
transformFunction: null
|
|
123
|
+
},
|
|
124
|
+
disabled: {
|
|
125
|
+
classPropertyName: "disabled",
|
|
126
|
+
publicName: "disabled",
|
|
127
|
+
isSignal: true,
|
|
128
|
+
isRequired: false,
|
|
129
|
+
transformFunction: null
|
|
130
|
+
},
|
|
131
|
+
readonly: {
|
|
132
|
+
classPropertyName: "readonly",
|
|
133
|
+
publicName: "readonly",
|
|
134
|
+
isSignal: true,
|
|
135
|
+
isRequired: false,
|
|
136
|
+
transformFunction: null
|
|
137
|
+
},
|
|
138
|
+
validationState: {
|
|
139
|
+
classPropertyName: "validationState",
|
|
140
|
+
publicName: "validationState",
|
|
141
|
+
isSignal: true,
|
|
142
|
+
isRequired: false,
|
|
143
|
+
transformFunction: null
|
|
144
|
+
},
|
|
145
|
+
minlength: {
|
|
146
|
+
classPropertyName: "minlength",
|
|
147
|
+
publicName: "minlength",
|
|
148
|
+
isSignal: true,
|
|
149
|
+
isRequired: false,
|
|
150
|
+
transformFunction: null
|
|
151
|
+
},
|
|
152
|
+
maxlength: {
|
|
153
|
+
classPropertyName: "maxlength",
|
|
154
|
+
publicName: "maxlength",
|
|
155
|
+
isSignal: true,
|
|
156
|
+
isRequired: false,
|
|
157
|
+
transformFunction: null
|
|
158
|
+
},
|
|
159
|
+
autofocus: {
|
|
160
|
+
classPropertyName: "autofocus",
|
|
161
|
+
publicName: "autofocus",
|
|
162
|
+
isSignal: true,
|
|
163
|
+
isRequired: false,
|
|
164
|
+
transformFunction: null
|
|
165
|
+
},
|
|
166
|
+
spellcheck: {
|
|
167
|
+
classPropertyName: "spellcheck",
|
|
168
|
+
publicName: "spellcheck",
|
|
169
|
+
isSignal: true,
|
|
170
|
+
isRequired: false,
|
|
171
|
+
transformFunction: null
|
|
172
|
+
},
|
|
173
|
+
ariaLabel: {
|
|
174
|
+
classPropertyName: "ariaLabel",
|
|
175
|
+
publicName: "ariaLabel",
|
|
176
|
+
isSignal: true,
|
|
177
|
+
isRequired: false,
|
|
178
|
+
transformFunction: null
|
|
179
|
+
},
|
|
180
|
+
describedBy: {
|
|
181
|
+
classPropertyName: "describedBy",
|
|
182
|
+
publicName: "describedBy",
|
|
183
|
+
isSignal: true,
|
|
184
|
+
isRequired: false,
|
|
185
|
+
transformFunction: null
|
|
186
|
+
}
|
|
187
|
+
},
|
|
188
|
+
outputs: {
|
|
189
|
+
value: "valueChange",
|
|
190
|
+
validationState: "validationStateChange",
|
|
191
|
+
focused: "focused",
|
|
192
|
+
blurred: "blurred"
|
|
193
|
+
},
|
|
194
|
+
host: { properties: { "attr.id": "null" } },
|
|
195
|
+
ngImport: i0,
|
|
196
|
+
template: "<textarea\n [value]=\"value()\"\n [class]=\"generatedClasses()\"\n [attr.id]=\"id() || null\"\n [attr.name]=\"name() || null\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [required]=\"required()\"\n [rows]=\"rows()\"\n [style.resize]=\"resize()\"\n [attr.maxlength]=\"maxlength()\"\n [attr.minlength]=\"minlength()\"\n \n [attr.spellcheck]=\"spellcheck()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-describedby]=\"describedBy() || null\"\n [attr.data-invalid]=\"validationState() === false ? '' : null\"\n [attr.data-valid]=\"validationState() === true ? '' : null\"\n (input)=\"handleInput($event)\"\n (focus)=\"handleFocus($event)\"\n (blur)=\"handleBlur($event)\"\n></textarea>\n",
|
|
197
|
+
styles: ["@layer properties;@layer components{:host{width:100%}}:host{display:block}.ui-textarea{display:block;width:100%;border-radius:var(--radius-md, .375rem);border-style:var(--tw-border-style);border-width:1px;border-color:var(--border-line-2);background-color:var(--layer);padding:calc(var(--spacing, .25rem) * 3)}.ui-textarea:focus{border-color:var(--primary-focus)}.ui-textarea:focus{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ui-textarea:focus{--tw-ring-color: color-mix(in srgb, oklch(88.2% .059 254.128) 50%, transparent)}@supports (color: color-mix(in lab,red,red)){.ui-textarea:focus{--tw-ring-color: color-mix(in oklab, var(--color-primary-200, var(--color-blue-200)) 50%, transparent)}}.ui-textarea:focus{--tw-outline-style: none;outline-style:none}.ui-textarea:disabled{opacity:50%}.ui-textarea[data-invalid]{border-color:var(--color-danger-500, var(--color-red-500))}.ui-textarea[data-invalid]:focus{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ui-textarea[data-invalid]:focus{--tw-ring-color: color-mix(in srgb, oklch(88.5% .062 18.334) 50%, transparent)}@supports (color: color-mix(in lab,red,red)){.ui-textarea[data-invalid]:focus{--tw-ring-color: color-mix(in oklab, var(--color-danger-200, var(--color-red-200)) 50%, transparent)}}.ui-textarea[data-valid]{border-color:var(--color-success-500, var(--color-teal-500))}.ui-textarea[data-valid]:focus{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ui-textarea[data-valid]:focus{--tw-ring-color: color-mix(in srgb, oklch(91% .096 180.426) 50%, transparent)}@supports (color: color-mix(in lab,red,red)){.ui-textarea[data-valid]:focus{--tw-ring-color: color-mix(in oklab, var(--color-success-200, var(--color-teal-200)) 50%, transparent)}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"]
|
|
198
|
+
});
|
|
199
|
+
};
|
|
200
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
201
|
+
minVersion: "12.0.0",
|
|
202
|
+
version: "22.2.1",
|
|
203
|
+
ngImport: i0,
|
|
204
|
+
type: UiTextareaComponent,
|
|
205
|
+
decorators: [{
|
|
206
|
+
type: Component,
|
|
207
|
+
args: [{
|
|
208
|
+
selector: "ui-textarea",
|
|
209
|
+
host: { "[attr.id]": "null" },
|
|
210
|
+
template: "<textarea\n [value]=\"value()\"\n [class]=\"generatedClasses()\"\n [attr.id]=\"id() || null\"\n [attr.name]=\"name() || null\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [required]=\"required()\"\n [rows]=\"rows()\"\n [style.resize]=\"resize()\"\n [attr.maxlength]=\"maxlength()\"\n [attr.minlength]=\"minlength()\"\n \n [attr.spellcheck]=\"spellcheck()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-describedby]=\"describedBy() || null\"\n [attr.data-invalid]=\"validationState() === false ? '' : null\"\n [attr.data-valid]=\"validationState() === true ? '' : null\"\n (input)=\"handleInput($event)\"\n (focus)=\"handleFocus($event)\"\n (blur)=\"handleBlur($event)\"\n></textarea>\n",
|
|
211
|
+
styles: ["@layer properties;@layer components{:host{width:100%}}:host{display:block}.ui-textarea{display:block;width:100%;border-radius:var(--radius-md, .375rem);border-style:var(--tw-border-style);border-width:1px;border-color:var(--border-line-2);background-color:var(--layer);padding:calc(var(--spacing, .25rem) * 3)}.ui-textarea:focus{border-color:var(--primary-focus)}.ui-textarea:focus{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ui-textarea:focus{--tw-ring-color: color-mix(in srgb, oklch(88.2% .059 254.128) 50%, transparent)}@supports (color: color-mix(in lab,red,red)){.ui-textarea:focus{--tw-ring-color: color-mix(in oklab, var(--color-primary-200, var(--color-blue-200)) 50%, transparent)}}.ui-textarea:focus{--tw-outline-style: none;outline-style:none}.ui-textarea:disabled{opacity:50%}.ui-textarea[data-invalid]{border-color:var(--color-danger-500, var(--color-red-500))}.ui-textarea[data-invalid]:focus{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ui-textarea[data-invalid]:focus{--tw-ring-color: color-mix(in srgb, oklch(88.5% .062 18.334) 50%, transparent)}@supports (color: color-mix(in lab,red,red)){.ui-textarea[data-invalid]:focus{--tw-ring-color: color-mix(in oklab, var(--color-danger-200, var(--color-red-200)) 50%, transparent)}}.ui-textarea[data-valid]{border-color:var(--color-success-500, var(--color-teal-500))}.ui-textarea[data-valid]:focus{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ui-textarea[data-valid]:focus{--tw-ring-color: color-mix(in srgb, oklch(91% .096 180.426) 50%, transparent)}@supports (color: color-mix(in lab,red,red)){.ui-textarea[data-valid]:focus{--tw-ring-color: color-mix(in oklab, var(--color-success-200, var(--color-teal-200)) 50%, transparent)}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"]
|
|
212
|
+
}]
|
|
213
|
+
}],
|
|
214
|
+
propDecorators: {
|
|
215
|
+
value: [{
|
|
216
|
+
type: i0.Input,
|
|
217
|
+
args: [{
|
|
218
|
+
isSignal: true,
|
|
219
|
+
alias: "value",
|
|
220
|
+
required: true
|
|
221
|
+
}]
|
|
222
|
+
}, {
|
|
223
|
+
type: i0.Output,
|
|
224
|
+
args: ["valueChange"]
|
|
225
|
+
}],
|
|
226
|
+
classes: [{
|
|
227
|
+
type: i0.Input,
|
|
228
|
+
args: [{
|
|
229
|
+
isSignal: true,
|
|
230
|
+
alias: "classes",
|
|
231
|
+
required: false
|
|
232
|
+
}]
|
|
233
|
+
}],
|
|
234
|
+
id: [{
|
|
235
|
+
type: i0.Input,
|
|
236
|
+
args: [{
|
|
237
|
+
isSignal: true,
|
|
238
|
+
alias: "id",
|
|
239
|
+
required: false
|
|
240
|
+
}]
|
|
241
|
+
}],
|
|
242
|
+
name: [{
|
|
243
|
+
type: i0.Input,
|
|
244
|
+
args: [{
|
|
245
|
+
isSignal: true,
|
|
246
|
+
alias: "name",
|
|
247
|
+
required: false
|
|
248
|
+
}]
|
|
249
|
+
}],
|
|
250
|
+
placeholder: [{
|
|
251
|
+
type: i0.Input,
|
|
252
|
+
args: [{
|
|
253
|
+
isSignal: true,
|
|
254
|
+
alias: "placeholder",
|
|
255
|
+
required: false
|
|
256
|
+
}]
|
|
257
|
+
}],
|
|
258
|
+
rows: [{
|
|
259
|
+
type: i0.Input,
|
|
260
|
+
args: [{
|
|
261
|
+
isSignal: true,
|
|
262
|
+
alias: "rows",
|
|
263
|
+
required: false
|
|
264
|
+
}]
|
|
265
|
+
}],
|
|
266
|
+
resize: [{
|
|
267
|
+
type: i0.Input,
|
|
268
|
+
args: [{
|
|
269
|
+
isSignal: true,
|
|
270
|
+
alias: "resize",
|
|
271
|
+
required: false
|
|
272
|
+
}]
|
|
273
|
+
}],
|
|
274
|
+
required: [{
|
|
275
|
+
type: i0.Input,
|
|
276
|
+
args: [{
|
|
277
|
+
isSignal: true,
|
|
278
|
+
alias: "required",
|
|
279
|
+
required: false
|
|
280
|
+
}]
|
|
281
|
+
}],
|
|
282
|
+
disabled: [{
|
|
283
|
+
type: i0.Input,
|
|
284
|
+
args: [{
|
|
285
|
+
isSignal: true,
|
|
286
|
+
alias: "disabled",
|
|
287
|
+
required: false
|
|
288
|
+
}]
|
|
289
|
+
}],
|
|
290
|
+
readonly: [{
|
|
291
|
+
type: i0.Input,
|
|
292
|
+
args: [{
|
|
293
|
+
isSignal: true,
|
|
294
|
+
alias: "readonly",
|
|
295
|
+
required: false
|
|
296
|
+
}]
|
|
297
|
+
}],
|
|
298
|
+
validationState: [{
|
|
299
|
+
type: i0.Input,
|
|
300
|
+
args: [{
|
|
301
|
+
isSignal: true,
|
|
302
|
+
alias: "validationState",
|
|
303
|
+
required: false
|
|
304
|
+
}]
|
|
305
|
+
}, {
|
|
306
|
+
type: i0.Output,
|
|
307
|
+
args: ["validationStateChange"]
|
|
308
|
+
}],
|
|
309
|
+
minlength: [{
|
|
310
|
+
type: i0.Input,
|
|
311
|
+
args: [{
|
|
312
|
+
isSignal: true,
|
|
313
|
+
alias: "minlength",
|
|
314
|
+
required: false
|
|
315
|
+
}]
|
|
316
|
+
}],
|
|
317
|
+
maxlength: [{
|
|
318
|
+
type: i0.Input,
|
|
319
|
+
args: [{
|
|
320
|
+
isSignal: true,
|
|
321
|
+
alias: "maxlength",
|
|
322
|
+
required: false
|
|
323
|
+
}]
|
|
324
|
+
}],
|
|
325
|
+
autofocus: [{
|
|
326
|
+
type: i0.Input,
|
|
327
|
+
args: [{
|
|
328
|
+
isSignal: true,
|
|
329
|
+
alias: "autofocus",
|
|
330
|
+
required: false
|
|
331
|
+
}]
|
|
332
|
+
}],
|
|
333
|
+
spellcheck: [{
|
|
334
|
+
type: i0.Input,
|
|
335
|
+
args: [{
|
|
336
|
+
isSignal: true,
|
|
337
|
+
alias: "spellcheck",
|
|
338
|
+
required: false
|
|
339
|
+
}]
|
|
340
|
+
}],
|
|
341
|
+
ariaLabel: [{
|
|
342
|
+
type: i0.Input,
|
|
343
|
+
args: [{
|
|
344
|
+
isSignal: true,
|
|
345
|
+
alias: "ariaLabel",
|
|
346
|
+
required: false
|
|
347
|
+
}]
|
|
348
|
+
}],
|
|
349
|
+
describedBy: [{
|
|
350
|
+
type: i0.Input,
|
|
351
|
+
args: [{
|
|
352
|
+
isSignal: true,
|
|
353
|
+
alias: "describedBy",
|
|
354
|
+
required: false
|
|
355
|
+
}]
|
|
356
|
+
}],
|
|
357
|
+
focused: [{
|
|
358
|
+
type: i0.Output,
|
|
359
|
+
args: ["focused"]
|
|
360
|
+
}],
|
|
361
|
+
blurred: [{
|
|
362
|
+
type: i0.Output,
|
|
363
|
+
args: ["blurred"]
|
|
364
|
+
}]
|
|
365
|
+
}
|
|
366
|
+
});
|
|
367
|
+
const TextareaResizeOptions = [
|
|
368
|
+
"none",
|
|
369
|
+
"both",
|
|
370
|
+
"horizontal",
|
|
371
|
+
"vertical"
|
|
372
|
+
];
|
|
373
|
+
export { TextareaResizeOptions, UiTextareaComponent };
|
|
374
|
+
|
|
375
|
+
//# sourceMappingURL=area8975-ui-textarea.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"area8975-ui-textarea.mjs","names":[],"sources":["../../../projects/ui/textarea/textarea.component.ts","../../../projects/ui/textarea/textarea.component.html","../../../projects/ui/textarea/textarea.types.ts"],"sourcesContent":["import {\n booleanAttribute,\n Component,\n computed,\n input,\n model,\n output\n} from '@angular/core';\n\nimport { type TextareaResize, type TextareaValidation } from './textarea.types';\n\n\n@Component({\n selector: 'ui-textarea',\n templateUrl: './textarea.component.html',\n styleUrl: './textarea.component.css',\n host: { '[attr.id]': 'null' }\n})\nexport class UiTextareaComponent {\n readonly value = model.required<string>();\n\n readonly classes = input<string>('');\n\n readonly id = input<string>('');\n readonly name = input<string>('');\n readonly placeholder = input<string>('');\n\n readonly rows = input<number>(3);\n readonly resize = input<TextareaResize>('vertical');\n\n readonly required = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly readonly = input(false, { transform: booleanAttribute });\n\n /** true/false shows valid/invalid styling. null means not validated yet. */\n readonly validationState = model<TextareaValidation>(null);\n\n readonly minlength = input<number | null>(null);\n readonly maxlength = input<number | null>(null);\n\n readonly autofocus = input(false, { transform: booleanAttribute });\n readonly spellcheck = input(true, { transform: booleanAttribute });\n\n readonly ariaLabel = input<string>('');\n readonly describedBy = input<string>('');\n\n readonly focused = output<FocusEvent>();\n readonly blurred = output<FocusEvent>();\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-textarea',\n 'ui-text-body',\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n protected handleInput(event: Event): void {\n const target = event.target as HTMLTextAreaElement;\n\n this.value.set(target.value);\n }\n\n protected handleFocus(event: FocusEvent): void {\n this.focused.emit(event);\n }\n\n protected handleBlur(event: FocusEvent): void {\n this.blurred.emit(event);\n }\n}\n","<textarea\n [value]=\"value()\"\n [class]=\"generatedClasses()\"\n [attr.id]=\"id() || null\"\n [attr.name]=\"name() || null\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [required]=\"required()\"\n [rows]=\"rows()\"\n [style.resize]=\"resize()\"\n [attr.maxlength]=\"maxlength()\"\n [attr.minlength]=\"minlength()\"\n \n [attr.spellcheck]=\"spellcheck()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-describedby]=\"describedBy() || null\"\n [attr.data-invalid]=\"validationState() === false ? '' : null\"\n [attr.data-valid]=\"validationState() === true ? '' : null\"\n (input)=\"handleInput($event)\"\n (focus)=\"handleFocus($event)\"\n (blur)=\"handleBlur($event)\"\n></textarea>\n","/** Native resize values for the textarea element. */\nexport const TextareaResizeOptions = [\n 'none',\n 'both',\n 'horizontal',\n 'vertical'\n] as const;\n\n/** @see {@link TextareaResizeOptions} */\nexport type TextareaResize = typeof TextareaResizeOptions[number];\n\n/** true is valid, false is invalid, null is not yet validated. */\nexport type TextareaValidation = boolean | null;\n"],"mappings":"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"}
|