@ui-organized/angular-table 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +132 -2
- package/dist/LICENSE +201 -0
- package/dist/README.md +133 -0
- package/dist/fesm2022/ui-organized-angular-table.mjs +5828 -0
- package/dist/fesm2022/ui-organized-angular-table.mjs.map +1 -0
- package/dist/styles.css +895 -0
- package/dist/types/ui-organized-angular-table.d.ts +1455 -0
- package/package.json +77 -3
- package/styles.css +895 -0
|
@@ -0,0 +1,1455 @@
|
|
|
1
|
+
import * as _ui_organized_table_core from '@ui-organized/table-core';
|
|
2
|
+
import { RowData, BulkSelection, UioTableFeatures, TableRowModel, TableChrome, TableColumn as TableColumn$1, TableSize, TableVariant, SelectionMode, ReorderSetting, VirtualConfig, DataTableQuery, TableEditPatch, ResponsiveConfig, TableFilterCondition, FilterOperatorDef, TableMode, SelectionState, TableFilterType, ConditionDescription, TableFilterFacetOption, FilterOperatorArity, EditState, TableEditContext, DetailState, GridCursor, HorizontalScrollState, ReorderMode, DropSide, TableRowScope, Store, ElementProps, TableHeaderInstance, TableFilterValue } from '@ui-organized/table-core';
|
|
3
|
+
export { DataTableQuery, ReorderSetting, ResponsiveConfig, SelectionMode, TableDateDef, TableDateSetting, TableFilterCondition, TableFilterType, TableMode, TableRowModel, TableRowScope, TableSize, TableVariant, VirtualConfig } from '@ui-organized/table-core';
|
|
4
|
+
import * as _angular_core from '@angular/core';
|
|
5
|
+
import { TemplateRef, Signal, WritableSignal, InjectionToken, Renderer2, OnInit } from '@angular/core';
|
|
6
|
+
import * as _ui_organized_angular from '@ui-organized/angular';
|
|
7
|
+
import { IconName, ButtonIntent, internalGlyph, AccordionItem } from '@ui-organized/angular';
|
|
8
|
+
import { AngularTable, TableState } from '@tanstack/angular-table';
|
|
9
|
+
import { AngularVirtualizer } from '@tanstack/angular-virtual';
|
|
10
|
+
import * as _ui_organized_angular_table from '@ui-organized/angular-table';
|
|
11
|
+
import * as _tanstack_table_core from '@tanstack/table-core';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Anything Angular will render from a renderer function.
|
|
15
|
+
*
|
|
16
|
+
* The counterpart of React's `ReactNode` in the one place a framework type
|
|
17
|
+
* legitimately enters — a custom cell or edit renderer, which core declares as
|
|
18
|
+
* `unknown` precisely so each adapter can narrow it to its own. A `TemplateRef`
|
|
19
|
+
* is Angular's "a piece of markup you can hand around"; a string is the common
|
|
20
|
+
* case and costs the caller nothing.
|
|
21
|
+
*/
|
|
22
|
+
type AngularNode = TemplateRef<unknown> | string | number | null | undefined;
|
|
23
|
+
/** The Angular column type. Identical to core's, with `meta.edit.render` narrowed. */
|
|
24
|
+
type TableColumn<T extends RowData> = TableColumn$1<T>;
|
|
25
|
+
type TableEditRenderer<T extends RowData> = (ctx: TableEditContext<T>) => AngularNode;
|
|
26
|
+
/**
|
|
27
|
+
* A condition a table starts with. `id` is omitted because the table assigns
|
|
28
|
+
* them — deterministically, so baselines and assertions stay stable.
|
|
29
|
+
*/
|
|
30
|
+
type TableFilterInput = Omit<TableFilterCondition, "id">;
|
|
31
|
+
/** One filterable column, as the "Add filter" list sees it. */
|
|
32
|
+
interface FilterableField {
|
|
33
|
+
columnId: string;
|
|
34
|
+
label: string;
|
|
35
|
+
type: TableFilterType;
|
|
36
|
+
/** How many conditions already target it. Shown as a suffix in the list. */
|
|
37
|
+
count: number;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* ── How this API is reactive ────────────────────────────────────────────────
|
|
41
|
+
*
|
|
42
|
+
* React's `DataTableApi` is a plain object rebuilt on every render, so its
|
|
43
|
+
* fields are values. Angular's factory runs **once**, so anything derived has to
|
|
44
|
+
* arrive as a `Signal` or it is a snapshot of the first frame that never updates
|
|
45
|
+
* again — the single most likely way to port this file wrongly, and one that
|
|
46
|
+
* fails silently: the table renders correctly and then never changes.
|
|
47
|
+
*
|
|
48
|
+
* So the rule is uniform and worth stating once: **derived state is a `Signal`,
|
|
49
|
+
* actions are plain functions.** A template reads `api.rows()` and calls
|
|
50
|
+
* `api.selection.toggle(...)`. Nothing in between is a bare value.
|
|
51
|
+
*/
|
|
52
|
+
interface FiltersApi {
|
|
53
|
+
/** Every applied condition, in the order added. What the chips render from. */
|
|
54
|
+
conditions: Signal<TableFilterCondition[]>;
|
|
55
|
+
/** Columns that may be filtered, in menu order. */
|
|
56
|
+
fields: Signal<FilterableField[]>;
|
|
57
|
+
/**
|
|
58
|
+
* Add a condition on a column, starting on its default operator. Returns the
|
|
59
|
+
* id it assigned, so the caller can open that chip's editor immediately.
|
|
60
|
+
*/
|
|
61
|
+
add: (columnId: string) => string;
|
|
62
|
+
update: (id: string, patch: Partial<Omit<TableFilterCondition, "id" | "columnId">>) => void;
|
|
63
|
+
/**
|
|
64
|
+
* Move a condition to another column — the chip's field segment. Keeps the
|
|
65
|
+
* operator and value when both columns read them the same way, and starts
|
|
66
|
+
* over on the new column's default otherwise (`retargetCondition`).
|
|
67
|
+
*/
|
|
68
|
+
changeField: (id: string, columnId: string) => void;
|
|
69
|
+
/** Put a condition back as it was — Escape in an open editor. */
|
|
70
|
+
restore: (condition: TableFilterCondition) => void;
|
|
71
|
+
remove: (id: string) => void;
|
|
72
|
+
clear: () => void;
|
|
73
|
+
/** The chip's words, decided in core so every adapter agrees. */
|
|
74
|
+
describe: (condition: TableFilterCondition) => ConditionDescription;
|
|
75
|
+
/** The operators a condition's column offers, in menu order. */
|
|
76
|
+
operatorsFor: (condition: TableFilterCondition) => {
|
|
77
|
+
id: string;
|
|
78
|
+
label: string;
|
|
79
|
+
}[];
|
|
80
|
+
/** Enum choices with faceted counts, and whether each would yield nothing. */
|
|
81
|
+
optionsFor: (condition: TableFilterCondition) => TableFilterFacetOption[];
|
|
82
|
+
/** The filter type of a condition's column. Decides which editor renders. */
|
|
83
|
+
typeOf: (condition: TableFilterCondition) => TableFilterType;
|
|
84
|
+
/** How many operands the condition's operator takes. Decides the editor's shape. */
|
|
85
|
+
arityOf: (condition: TableFilterCondition) => FilterOperatorArity;
|
|
86
|
+
/** Chips past the collapse limit are hidden until this is true. */
|
|
87
|
+
expanded: Signal<boolean>;
|
|
88
|
+
setExpanded: (expanded: boolean) => void;
|
|
89
|
+
/**
|
|
90
|
+
* The condition whose editor is open. `add` sets it, so a filter chosen from
|
|
91
|
+
* the header opens for editing without the two components having to know
|
|
92
|
+
* about each other.
|
|
93
|
+
*/
|
|
94
|
+
editing: Signal<string | null>;
|
|
95
|
+
setEditing: (id: string | null) => void;
|
|
96
|
+
/** Announced in the live region on add, remove, change and clear. */
|
|
97
|
+
announcement: Signal<string>;
|
|
98
|
+
}
|
|
99
|
+
interface BulkAction<T extends RowData> {
|
|
100
|
+
id: string;
|
|
101
|
+
label: string;
|
|
102
|
+
/** The icon's native name in the active library (`"pencil"`), registered with `registerIcons`. */
|
|
103
|
+
icon?: IconName;
|
|
104
|
+
/** Routes through `AlertDialog` before running. */
|
|
105
|
+
destructive?: boolean;
|
|
106
|
+
/** Confirmation copy. Defaults are derived from `label`. */
|
|
107
|
+
confirm?: {
|
|
108
|
+
title?: string;
|
|
109
|
+
description?: string;
|
|
110
|
+
confirmLabel?: string;
|
|
111
|
+
};
|
|
112
|
+
onRun: (rows: T[], selection: BulkSelection) => void | Promise<void>;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* A button in the table's header — "New user", "Import", "Refresh". The table's
|
|
116
|
+
* own actions, as opposed to a row's or a selection's.
|
|
117
|
+
*/
|
|
118
|
+
interface TableAction {
|
|
119
|
+
id: string;
|
|
120
|
+
label: string;
|
|
121
|
+
/** The icon's native name in the active library (`"pencil"`), registered with `registerIcons`. */
|
|
122
|
+
icon?: IconName;
|
|
123
|
+
/** Button hierarchy. Defaults to `tertiary` — chrome, not a call to action. */
|
|
124
|
+
intent?: ButtonIntent;
|
|
125
|
+
/** Drop the visible label and keep only the icon. `label` still names it. */
|
|
126
|
+
iconOnly?: boolean;
|
|
127
|
+
disabled?: boolean;
|
|
128
|
+
onRun: () => void | Promise<void>;
|
|
129
|
+
}
|
|
130
|
+
interface RowAction<T extends RowData> {
|
|
131
|
+
id: string;
|
|
132
|
+
label: string;
|
|
133
|
+
/** The icon's native name in the active library (`"pencil"`), registered with `registerIcons`. */
|
|
134
|
+
icon?: IconName;
|
|
135
|
+
destructive?: boolean;
|
|
136
|
+
disabled?: (row: T) => boolean;
|
|
137
|
+
onRun: (row: T) => void | Promise<void>;
|
|
138
|
+
}
|
|
139
|
+
interface DetailConfig<T extends RowData> {
|
|
140
|
+
render: (row: T) => AngularNode;
|
|
141
|
+
/** Sheet title. Defaults to the primary column's value. */
|
|
142
|
+
title?: (row: T) => string;
|
|
143
|
+
description?: (row: T) => string;
|
|
144
|
+
/** Footer actions, rendered after the built-in Close. */
|
|
145
|
+
footer?: (row: T) => AngularNode;
|
|
146
|
+
}
|
|
147
|
+
interface EmptyStateConfig {
|
|
148
|
+
title?: string;
|
|
149
|
+
description?: string;
|
|
150
|
+
action?: AngularNode;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* The options, read reactively.
|
|
154
|
+
*
|
|
155
|
+
* Handed to `createDataTable` as a **getter** — `createDataTable(() => ({ ... }))`
|
|
156
|
+
* — so every field is read inside a `computed` and a signal-backed source keeps
|
|
157
|
+
* the table in step. A component built on this passes its own `input()` signals
|
|
158
|
+
* through the getter, which is what `<uio-data-table>` does.
|
|
159
|
+
*/
|
|
160
|
+
interface UseDataTableOptions<T extends RowData> {
|
|
161
|
+
data: readonly T[];
|
|
162
|
+
columns: readonly TableColumn<T>[];
|
|
163
|
+
/**
|
|
164
|
+
* The table's accessible name. Required, not optional: it becomes the
|
|
165
|
+
* `<caption>`, and a table announced as "table" and nothing else is the most
|
|
166
|
+
* common data-table accessibility failure there is.
|
|
167
|
+
*/
|
|
168
|
+
label: string;
|
|
169
|
+
/** Show the caption instead of hiding it visually. */
|
|
170
|
+
captionVisible?: boolean;
|
|
171
|
+
/**
|
|
172
|
+
* Stable row identity. Selection, inline edit and the detail sheet are keyed
|
|
173
|
+
* by it; without one they follow row *position*, which breaks on every sort.
|
|
174
|
+
*/
|
|
175
|
+
getRowId?: (row: T, index: number) => string;
|
|
176
|
+
size?: TableSize;
|
|
177
|
+
variant?: TableVariant;
|
|
178
|
+
selection?: SelectionMode;
|
|
179
|
+
sortable?: boolean;
|
|
180
|
+
filterable?: boolean;
|
|
181
|
+
searchable?: boolean;
|
|
182
|
+
paginated?: boolean;
|
|
183
|
+
pageSize?: number;
|
|
184
|
+
resizable?: boolean;
|
|
185
|
+
/**
|
|
186
|
+
* Lets people rearrange the columns by dragging a header, or with its move
|
|
187
|
+
* buttons (and Alt+Arrow on a focused header). Adds "Reset column order" to
|
|
188
|
+
* the Columns menu.
|
|
189
|
+
*
|
|
190
|
+
* - `true` / `"always"`: movable at any time; the move buttons appear on
|
|
191
|
+
* hover and focus.
|
|
192
|
+
* - `"toggle"`: movable only in a reorder mode, switched from the toolbar.
|
|
193
|
+
*
|
|
194
|
+
* The table's own columns (selection, row actions) and pinned columns stay
|
|
195
|
+
* where they are.
|
|
196
|
+
*/
|
|
197
|
+
reorderable?: ReorderSetting;
|
|
198
|
+
hideableColumns?: boolean;
|
|
199
|
+
/** The header's sort button. On by default whenever any column is sortable. */
|
|
200
|
+
sortMenu?: boolean;
|
|
201
|
+
/** Offer CSV download and clipboard copy in the toolbar. */
|
|
202
|
+
exportable?: boolean;
|
|
203
|
+
/** Row virtualization. `true` uses the defaults; an object tunes them. */
|
|
204
|
+
virtual?: boolean | VirtualConfig;
|
|
205
|
+
/** Caps the scroll viewport. A table with no cap cannot scroll or virtualize. */
|
|
206
|
+
maxHeight?: number | string;
|
|
207
|
+
loading?: boolean;
|
|
208
|
+
error?: AngularNode;
|
|
209
|
+
empty?: EmptyStateConfig;
|
|
210
|
+
/** Server-driven mode. Sorting, filtering and pagination stop happening locally. */
|
|
211
|
+
manual?: boolean;
|
|
212
|
+
/** Total matching rows. Required in `manual` mode — the client cannot count. */
|
|
213
|
+
rowCount?: number;
|
|
214
|
+
onQueryChange?: (query: DataTableQuery) => void;
|
|
215
|
+
/** Infinite scroll: fires as the viewport approaches the end of the rows. */
|
|
216
|
+
onLoadMore?: () => void;
|
|
217
|
+
onRowClick?: (row: T) => void;
|
|
218
|
+
onEdit?: (patch: TableEditPatch<T>) => void | Promise<void>;
|
|
219
|
+
rowActions?: RowAction<T>[];
|
|
220
|
+
bulkActions?: BulkAction<T>[];
|
|
221
|
+
/** The table's own actions, rendered in the header row. */
|
|
222
|
+
actions?: TableAction[];
|
|
223
|
+
detail?: DetailConfig<T>;
|
|
224
|
+
responsive?: ResponsiveConfig;
|
|
225
|
+
defaultSorting?: {
|
|
226
|
+
id: string;
|
|
227
|
+
desc: boolean;
|
|
228
|
+
}[];
|
|
229
|
+
defaultColumnVisibility?: Record<string, boolean>;
|
|
230
|
+
/**
|
|
231
|
+
* Conditions the table starts with. Also the only way to render a chip in a
|
|
232
|
+
* static surface — a visual baseline, an axe scan, a jsdom test.
|
|
233
|
+
*/
|
|
234
|
+
defaultFilters?: TableFilterInput[];
|
|
235
|
+
/** Extra or replacement operators, including for localizing labels. */
|
|
236
|
+
filterOperators?: FilterOperatorDef[];
|
|
237
|
+
}
|
|
238
|
+
interface SelectionApi<T extends RowData> {
|
|
239
|
+
mode: Signal<SelectionMode>;
|
|
240
|
+
state: Signal<SelectionState>;
|
|
241
|
+
/** Rows the user believes are selected, including the all-matching case. */
|
|
242
|
+
count: Signal<number>;
|
|
243
|
+
/** Rows actually loaded and selected. */
|
|
244
|
+
rows: Signal<T[]>;
|
|
245
|
+
isSelected: (rowId: string) => boolean;
|
|
246
|
+
toggle: (rowId: string, checked: boolean, shift?: boolean) => void;
|
|
247
|
+
togglePage: (checked: boolean) => void;
|
|
248
|
+
selectAllMatching: () => void;
|
|
249
|
+
clear: () => void;
|
|
250
|
+
header: Signal<{
|
|
251
|
+
checked: boolean;
|
|
252
|
+
indeterminate: boolean;
|
|
253
|
+
}>;
|
|
254
|
+
/** True when the page is fully selected and more rows match beyond it. */
|
|
255
|
+
canSelectAllMatching: Signal<boolean>;
|
|
256
|
+
totalMatching: Signal<number>;
|
|
257
|
+
asBulk: () => BulkSelection;
|
|
258
|
+
}
|
|
259
|
+
interface EditApi<T extends RowData> {
|
|
260
|
+
enabled: Signal<boolean>;
|
|
261
|
+
state: Signal<EditState>;
|
|
262
|
+
isEditing: (rowId: string, columnId: string) => boolean;
|
|
263
|
+
start: (row: TableRowModel<T>, columnId: string) => void;
|
|
264
|
+
setValue: (value: unknown) => void;
|
|
265
|
+
commit: () => void;
|
|
266
|
+
cancel: () => void;
|
|
267
|
+
contextFor: (row: TableRowModel<T>, columnId: string) => TableEditContext<T> | null;
|
|
268
|
+
}
|
|
269
|
+
interface DetailApi<T extends RowData> {
|
|
270
|
+
enabled: Signal<boolean>;
|
|
271
|
+
state: Signal<DetailState>;
|
|
272
|
+
row: Signal<T | null>;
|
|
273
|
+
total: Signal<number>;
|
|
274
|
+
open: (rowId: string) => void;
|
|
275
|
+
close: () => void;
|
|
276
|
+
step: (direction: -1 | 1) => void;
|
|
277
|
+
canStep: (direction: -1 | 1) => boolean;
|
|
278
|
+
setDirty: (dirty: boolean) => void;
|
|
279
|
+
/** Answer the "discard unsaved changes?" prompt. */
|
|
280
|
+
resolveConfirm: (discard: boolean) => void;
|
|
281
|
+
}
|
|
282
|
+
interface FocusApi {
|
|
283
|
+
cursor: Signal<GridCursor>;
|
|
284
|
+
/**
|
|
285
|
+
* Follow focus that has already moved. Updates the cursor and takes no focus
|
|
286
|
+
* of its own — which is what keeps it from pulling focus back out of an open
|
|
287
|
+
* inline editor.
|
|
288
|
+
*/
|
|
289
|
+
setCursor: (cursor: GridCursor) => void;
|
|
290
|
+
/** Move the cursor and take DOM focus with it. */
|
|
291
|
+
focusCell: (cursor: GridCursor) => void;
|
|
292
|
+
isFocused: (rowIndex: number, colIndex: number) => boolean;
|
|
293
|
+
}
|
|
294
|
+
interface VirtualApi {
|
|
295
|
+
enabled: Signal<boolean>;
|
|
296
|
+
/**
|
|
297
|
+
* The adapter's own proxy, not a signal wrapping one: it is callable — the
|
|
298
|
+
* raw virtualizer is `virtualizer()` — and its `getVirtualItems` and
|
|
299
|
+
* `getTotalSize` are already signals. Wrapping it again would add a `()` that
|
|
300
|
+
* bought nothing.
|
|
301
|
+
*/
|
|
302
|
+
virtualizer: AngularVirtualizer<HTMLElement, HTMLElement>;
|
|
303
|
+
spacers: Signal<{
|
|
304
|
+
top: number;
|
|
305
|
+
bottom: number;
|
|
306
|
+
}>;
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* The viewport's horizontal overflow, live. `overflowing` is false whenever
|
|
310
|
+
* every column fits — which is what lets a scroll control render itself only
|
|
311
|
+
* when there is something to scroll to.
|
|
312
|
+
*/
|
|
313
|
+
interface HorizontalScrollApi {
|
|
314
|
+
state: Signal<HorizontalScrollState>;
|
|
315
|
+
/** Move most of a viewport width: `-1` towards the first column, `1` away. */
|
|
316
|
+
by: (direction: -1 | 1) => void;
|
|
317
|
+
}
|
|
318
|
+
/** A header drag in progress: what is moving, and where it would land. */
|
|
319
|
+
interface ColumnDrag {
|
|
320
|
+
source: string;
|
|
321
|
+
target: string | null;
|
|
322
|
+
side: DropSide;
|
|
323
|
+
}
|
|
324
|
+
/** Same members as React's `ReorderApi`, with state as signals. */
|
|
325
|
+
interface ReorderApi {
|
|
326
|
+
/** The `reorderable` setting, resolved. */
|
|
327
|
+
mode: Signal<ReorderMode>;
|
|
328
|
+
/** Columns can be moved right now: always, or inside toggle mode. */
|
|
329
|
+
active: Signal<boolean>;
|
|
330
|
+
/** Enters or leaves reorder mode. Only meaningful when `mode` is `"toggle"`. */
|
|
331
|
+
setActive: (active: boolean) => void;
|
|
332
|
+
/** Visible, not pinned, and not one of the table's own columns. */
|
|
333
|
+
isMovable: (columnId: string) => boolean;
|
|
334
|
+
canMove: (columnId: string, direction: -1 | 1) => boolean;
|
|
335
|
+
/** One place left or right, past the nearest movable visible column. */
|
|
336
|
+
move: (columnId: string, direction: -1 | 1) => void;
|
|
337
|
+
drop: (sourceId: string, targetId: string, side: DropSide) => void;
|
|
338
|
+
drag: Signal<ColumnDrag | null>;
|
|
339
|
+
setDrag: (drag: ColumnDrag | null) => void;
|
|
340
|
+
}
|
|
341
|
+
/** One row as the renderer sees it: the model, plus both of its indices. */
|
|
342
|
+
interface RenderRow<T extends RowData> {
|
|
343
|
+
row: TableRowModel<T>;
|
|
344
|
+
/** The cursor coordinate: where the row sits on the current page. */
|
|
345
|
+
index: number;
|
|
346
|
+
/** What `aria-rowindex` reports: where it sits in the whole dataset. */
|
|
347
|
+
absoluteIndex: number;
|
|
348
|
+
}
|
|
349
|
+
interface DataTableApi<T extends RowData> {
|
|
350
|
+
/**
|
|
351
|
+
* The raw TanStack instance. Exposed deliberately as the escape hatch: every
|
|
352
|
+
* feature the wrapper does not cover is reachable through it, which is what
|
|
353
|
+
* stops a missing prop from being a fork.
|
|
354
|
+
*
|
|
355
|
+
* The *Angular* instance, so its signal-backed atoms come with it. Not a
|
|
356
|
+
* signal — the instance is created once and mutated in place; its reactivity
|
|
357
|
+
* lives in the atoms it holds.
|
|
358
|
+
*/
|
|
359
|
+
table: AngularTable<UioTableFeatures, T>;
|
|
360
|
+
/**
|
|
361
|
+
* The controlled state — sorting, pagination, visibility, selection.
|
|
362
|
+
*
|
|
363
|
+
* React's adapter hangs a `state` getter off the table instance; Angular's
|
|
364
|
+
* exposes signal-backed `atoms` instead. It is handed back here rather than
|
|
365
|
+
* reached for on the engine because the table is controlled: these values are
|
|
366
|
+
* the source of truth and the engine is downstream of them.
|
|
367
|
+
*/
|
|
368
|
+
state: Signal<Partial<TableState<UioTableFeatures>>>;
|
|
369
|
+
/** The rows to render — the current page, before virtualization. */
|
|
370
|
+
rows: Signal<TableRowModel<T>[]>;
|
|
371
|
+
/** The rows actually rendered, which under virtualization is a window. */
|
|
372
|
+
renderRows: Signal<RenderRow<T>[]>;
|
|
373
|
+
chrome: Signal<TableChrome>;
|
|
374
|
+
options: UseDataTableOptions<T>;
|
|
375
|
+
size: Signal<TableSize>;
|
|
376
|
+
variant: Signal<TableVariant>;
|
|
377
|
+
label: Signal<string>;
|
|
378
|
+
captionVisible: Signal<boolean>;
|
|
379
|
+
interactive: Signal<boolean>;
|
|
380
|
+
mode: Signal<TableMode>;
|
|
381
|
+
loading: Signal<boolean>;
|
|
382
|
+
/** The urgent search value. Bind an input to this, never to the deferred one. */
|
|
383
|
+
search: Signal<string>;
|
|
384
|
+
setSearch: (value: string) => void;
|
|
385
|
+
selection: SelectionApi<T>;
|
|
386
|
+
filters: FiltersApi;
|
|
387
|
+
edit: EditApi<T>;
|
|
388
|
+
detail: DetailApi<T>;
|
|
389
|
+
focus: FocusApi;
|
|
390
|
+
virtual: VirtualApi;
|
|
391
|
+
scroll: HorizontalScrollApi;
|
|
392
|
+
reorder: ReorderApi;
|
|
393
|
+
columnWidths: Signal<Record<string, number>>;
|
|
394
|
+
/**
|
|
395
|
+
* The root and viewport nodes, as writable signals a directive fills in.
|
|
396
|
+
*
|
|
397
|
+
* Angular has no per-element ref callback and `viewChild` cannot reach into a
|
|
398
|
+
* *projected* node, which the viewport is — so `UioTableElementRef` writes
|
|
399
|
+
* into these. A signal rather than a plain field because the resize and
|
|
400
|
+
* scroll observers below are `effect`s that have to re-run when the node
|
|
401
|
+
* arrives.
|
|
402
|
+
*/
|
|
403
|
+
rootRef: WritableSignal<HTMLElement | null>;
|
|
404
|
+
viewportRef: WritableSignal<HTMLElement | null>;
|
|
405
|
+
exportCsv: (scope?: TableRowScope) => void;
|
|
406
|
+
copySelection: (scope?: TableRowScope) => Promise<boolean>;
|
|
407
|
+
onGridKeyDown: (event: KeyboardEvent) => void;
|
|
408
|
+
activate: (row: TableRowModel<T>) => void;
|
|
409
|
+
primaryColumnId: Signal<string | undefined>;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
declare function createDataTable<T extends RowData>(options: () => UseDataTableOptions<T>): DataTableApi<T>;
|
|
413
|
+
|
|
414
|
+
/**
|
|
415
|
+
* Binds one of core's framework-free stores to Angular signals.
|
|
416
|
+
*
|
|
417
|
+
* `@ui-organized/table-core`'s `state.ts` chose `{ getState, subscribe,
|
|
418
|
+
* dispatch }` because it is exactly what React's `useSyncExternalStore` wants —
|
|
419
|
+
* and the shape turns out to cost nothing anywhere else: Vue mirrors it with a
|
|
420
|
+
* `shallowRef`, Svelte with `$state`, and this with a `signal`.
|
|
421
|
+
*
|
|
422
|
+
* The store's two invariants are what make it safe: `getState()` returns the
|
|
423
|
+
* same reference until something actually changes, and a no-op action notifies
|
|
424
|
+
* nobody. So the mirror only ever changes when the state did.
|
|
425
|
+
*
|
|
426
|
+
* `DestroyRef` rather than `ngOnDestroy`, because this is called from an
|
|
427
|
+
* injection context rather than from a class that has lifecycle hooks.
|
|
428
|
+
*/
|
|
429
|
+
declare function trackStore<S, A>(store: Store<S, A>): Signal<S>;
|
|
430
|
+
|
|
431
|
+
declare function createDeferred<T>(source: () => T): Signal<T>;
|
|
432
|
+
|
|
433
|
+
/**
|
|
434
|
+
* The styled parts are usable on their own — that is the whole point of layer 2
|
|
435
|
+
* — so they need somewhere to find the table without every one of them taking
|
|
436
|
+
* the api as an input through four levels of markup.
|
|
437
|
+
*
|
|
438
|
+
* An `InjectionToken` on the element injector, which is Angular's spelling of
|
|
439
|
+
* the same arrangement React uses a context object for: the component that owns
|
|
440
|
+
* the table provides it, every part injects it, and a part rendered outside one
|
|
441
|
+
* says so with a message that names the fix.
|
|
442
|
+
*/
|
|
443
|
+
declare const UIO_DATA_TABLE: InjectionToken<DataTableApi<any>>;
|
|
444
|
+
/** Providers for a component that owns a table. */
|
|
445
|
+
declare function provideDataTable<T extends RowData>(factory: () => DataTableApi<T>): {
|
|
446
|
+
provide: InjectionToken<DataTableApi<any>>;
|
|
447
|
+
useFactory: () => DataTableApi<T>;
|
|
448
|
+
};
|
|
449
|
+
declare function injectDataTable<T extends RowData = RowData>(): DataTableApi<T>;
|
|
450
|
+
/** For parts that are legitimately optional inside a table (toolbars reused elsewhere). */
|
|
451
|
+
declare function injectOptionalDataTable<T extends RowData = RowData>(): DataTableApi<T> | null;
|
|
452
|
+
|
|
453
|
+
/**
|
|
454
|
+
* The two columns the table adds for itself.
|
|
455
|
+
*
|
|
456
|
+
* They are built here rather than in the factory because their cells render real
|
|
457
|
+
* components — `Checkbox`, `Menu` — and each reads the table from the injector,
|
|
458
|
+
* which works because cells render inside the provider.
|
|
459
|
+
*
|
|
460
|
+
* `flexRenderComponent` rather than a bare component: the Angular adapter's
|
|
461
|
+
* `FlexRender` identifies a component by the wrapper this returns, which is how
|
|
462
|
+
* it tells "a component to mount" from "a string to print". The plan expected
|
|
463
|
+
* this to need hand-rolled `TemplateRef` plumbing; v9's adapter ships it.
|
|
464
|
+
*/
|
|
465
|
+
declare function selectionColumn<T extends RowData>(): TableColumn<T>;
|
|
466
|
+
declare function actionsColumn<T extends RowData>(): TableColumn<T>;
|
|
467
|
+
|
|
468
|
+
interface Applied {
|
|
469
|
+
attributes: Set<string>;
|
|
470
|
+
styles: Set<string>;
|
|
471
|
+
}
|
|
472
|
+
declare function applyElementProps(element: HTMLElement, renderer: Renderer2, props: ElementProps, previous: Applied): Applied;
|
|
473
|
+
declare class UioTableProps {
|
|
474
|
+
readonly props: Signal<ElementProps>;
|
|
475
|
+
private readonly host;
|
|
476
|
+
private readonly renderer;
|
|
477
|
+
private applied;
|
|
478
|
+
constructor();
|
|
479
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableProps, never>;
|
|
480
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UioTableProps, "[uioTableProps]", never, { "props": { "alias": "uioTableProps"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
/**
|
|
484
|
+
* Hand an element to a signal when it mounts, and `null` when it goes.
|
|
485
|
+
*
|
|
486
|
+
* React takes a callback ref for the root and the viewport; Vue binds a template
|
|
487
|
+
* ref and watches it; Svelte uses an action. Angular has neither a per-element
|
|
488
|
+
* ref callback nor a `viewChild` that can reach a **projected** node — and the
|
|
489
|
+
* viewport is projected, because `<uio-table-viewport>` is written by the caller
|
|
490
|
+
* inside `<uio-table>`. Writing into the api's own signal is what makes the
|
|
491
|
+
* node's arrival reactive, which the resize and scroll observers need.
|
|
492
|
+
*
|
|
493
|
+
* ```html
|
|
494
|
+
* <div [uioTableElementRef]="table.rootRef">
|
|
495
|
+
* ```
|
|
496
|
+
*/
|
|
497
|
+
declare class UioTableElementRef {
|
|
498
|
+
readonly target: _angular_core.InputSignal<WritableSignal<HTMLElement>>;
|
|
499
|
+
private readonly host;
|
|
500
|
+
constructor();
|
|
501
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableElementRef, never>;
|
|
502
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UioTableElementRef, "[uioTableElementRef]", never, { "target": { "alias": "uioTableElementRef"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
/**
|
|
506
|
+
* ── Why the host is the `<span>` ────────────────────────────────────────────
|
|
507
|
+
*
|
|
508
|
+
* Both of these are rendered by `flexRenderComponent`, which creates the
|
|
509
|
+
* component's host element — so the host is a node in the table whether it is
|
|
510
|
+
* wanted or not. Selecting on `span[uioTableSelectCell]` rather than a custom
|
|
511
|
+
* element makes that unavoidable node *be* the hit target React renders, instead
|
|
512
|
+
* of an extra `<uio-table-select-cell>` wrapped around it.
|
|
513
|
+
*
|
|
514
|
+
* The same reasoning as everywhere else in this package: an Angular component
|
|
515
|
+
* always has a host element, so the only way to match React's DOM is to make the
|
|
516
|
+
* host the element React renders.
|
|
517
|
+
*/
|
|
518
|
+
/**
|
|
519
|
+
* The header's tri-state checkbox: from empty it selects the rows on screen;
|
|
520
|
+
* from checked or mixed it clears the selection. What the box shows decides
|
|
521
|
+
* the click, not the box's own next state — see `headerToggleTarget`.
|
|
522
|
+
*/
|
|
523
|
+
declare class UioTableSelectAllCell {
|
|
524
|
+
protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
|
|
525
|
+
protected readonly selectAllLabel: _angular_core.Signal<string>;
|
|
526
|
+
protected toggle(): void;
|
|
527
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableSelectAllCell, never>;
|
|
528
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableSelectAllCell, "span[uioTableSelectAllCell]", never, {}, {}, never, never, true, never>;
|
|
529
|
+
}
|
|
530
|
+
/**
|
|
531
|
+
* A row's selection checkbox, with shift-click range selection.
|
|
532
|
+
*
|
|
533
|
+
* Given a `UioCheckbox` with a closed prop API, the wrapper records `shiftKey`
|
|
534
|
+
* from the pointer or keyboard event that *precedes* the change, which the
|
|
535
|
+
* change handler then reads. It needs no change to `@ui-organized/angular`,
|
|
536
|
+
* which is the point: widening a component's API to serve one consumer is how a
|
|
537
|
+
* design system's props turn into a junk drawer.
|
|
538
|
+
*/
|
|
539
|
+
declare class UioTableSelectCell {
|
|
540
|
+
readonly rowId: _angular_core.InputSignal<string>;
|
|
541
|
+
readonly rowLabel: _angular_core.InputSignal<string>;
|
|
542
|
+
protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
|
|
543
|
+
private shift;
|
|
544
|
+
protected remember(event: MouseEvent | KeyboardEvent): void;
|
|
545
|
+
protected change(checked: boolean): void;
|
|
546
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableSelectCell, never>;
|
|
547
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableSelectCell, "span[uioTableSelectCell]", never, { "rowId": { "alias": "rowId"; "required": true; "isSignal": true; }; "rowLabel": { "alias": "rowLabel"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
/**
|
|
551
|
+
* The actions column's header: a name for assistive tech and nothing visible.
|
|
552
|
+
*
|
|
553
|
+
* A component rather than a plain string, because the string would be *shown* —
|
|
554
|
+
* a column of ellipsis buttons under a visible "Actions" heading is not what the
|
|
555
|
+
* design draws, and a column with no accessible name at all is worse.
|
|
556
|
+
*/
|
|
557
|
+
declare class UioTableActionsHeader {
|
|
558
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableActionsHeader, never>;
|
|
559
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableActionsHeader, "uio-table-actions-header", never, {}, {}, never, never, true, never>;
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
/**
|
|
563
|
+
* A part that applies core's prop bag to **its own host element**.
|
|
564
|
+
*
|
|
565
|
+
* `UioTableProps` is the directive for the ordinary case — a plain element in
|
|
566
|
+
* someone's template, `<td [uioTableProps]="…">`. It cannot serve a component
|
|
567
|
+
* that computes its own props, because `hostDirectives` exposes the input for
|
|
568
|
+
* *binding* and a component has no way to bind an input to itself.
|
|
569
|
+
*
|
|
570
|
+
* So the parts that own their props extend this instead. Subclasses declare
|
|
571
|
+
* `tableProps` as a `computed` and the effect below keeps the host in step,
|
|
572
|
+
* diffing exactly as the directive does — see `applyElementProps` for why
|
|
573
|
+
* diffing rather than assigning is load-bearing.
|
|
574
|
+
*/
|
|
575
|
+
declare abstract class UioTablePropsHost {
|
|
576
|
+
/** The bag this part puts on its own host element. */
|
|
577
|
+
protected abstract readonly tableProps: Signal<ElementProps>;
|
|
578
|
+
private readonly propsHost;
|
|
579
|
+
private readonly propsRenderer;
|
|
580
|
+
constructor();
|
|
581
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTablePropsHost, never>;
|
|
582
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UioTablePropsHost, never, never, {}, {}, never, never, true, never>;
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
/**
|
|
586
|
+
* The parts, flat-exported — `UioTableHeader`, not `Table.Header`. That is the
|
|
587
|
+
* repo's convention everywhere else (`UioDialogContent`, `UioMenuItem`) and
|
|
588
|
+
* there is no reason for the table to be the exception.
|
|
589
|
+
*
|
|
590
|
+
* The DOM they compose to:
|
|
591
|
+
*
|
|
592
|
+
* <div uioTable> class="data-table" root, size + variant
|
|
593
|
+
* <div uioTableToolbar> …
|
|
594
|
+
* <div uioTableViewport> class="data-table__viewport", then <table>
|
|
595
|
+
* <thead uioTableHeader>
|
|
596
|
+
* <tbody uioTableBody> spacer / rows / spacer
|
|
597
|
+
* <div uioTablePagination>
|
|
598
|
+
*
|
|
599
|
+
* ── Why every part is an attribute directive ────────────────────────────────
|
|
600
|
+
*
|
|
601
|
+
* `@ui-organized/angular` puts its components on the caller's own element
|
|
602
|
+
* (`<button uioButton>`, `<span uioChip>`) rather than on a custom element, and
|
|
603
|
+
* the table has two reasons of its own to do the same. A custom element between
|
|
604
|
+
* `<table>` and `<thead>` is invalid HTML — the browser hoists the `<thead>`
|
|
605
|
+
* straight back out — so `<uio-table-header>` cannot exist at all. And anywhere
|
|
606
|
+
* else, a host element is a DOM node the other three libraries do not render,
|
|
607
|
+
* which the parity gate reports as a difference on every case.
|
|
608
|
+
*
|
|
609
|
+
* So the caller writes the element and the part decorates it. Each one also
|
|
610
|
+
* binds core's prop bag through `UioTablePropsHost` rather than unpacking it
|
|
611
|
+
* field by field — see `../core/element-props.ts` for why that is the whole of
|
|
612
|
+
* Angular's "no prop spread" cost.
|
|
613
|
+
*/
|
|
614
|
+
/** The root: size, variant, and the element every part measures itself against. */
|
|
615
|
+
declare class UioTable extends UioTablePropsHost {
|
|
616
|
+
protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
|
|
617
|
+
protected readonly tableProps: _angular_core.Signal<_ui_organized_table_core.ElementProps>;
|
|
618
|
+
private readonly element;
|
|
619
|
+
constructor();
|
|
620
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTable, never>;
|
|
621
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UioTable, "div[uioTable]", never, {}, {}, never, never, true, never>;
|
|
622
|
+
}
|
|
623
|
+
/**
|
|
624
|
+
* The scroll container and the `<table>` element, which are inseparable: a
|
|
625
|
+
* viewport with two tables in it means nothing, and `<caption>` and `<colgroup>`
|
|
626
|
+
* have to be emitted between them.
|
|
627
|
+
*/
|
|
628
|
+
declare class UioTableViewport extends UioTablePropsHost {
|
|
629
|
+
protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
|
|
630
|
+
protected readonly tableProps: _angular_core.Signal<_ui_organized_table_core.ElementProps | {
|
|
631
|
+
style: {
|
|
632
|
+
maxHeight: string | number;
|
|
633
|
+
width?: string | number;
|
|
634
|
+
minWidth?: string | number;
|
|
635
|
+
maxWidth?: string | number;
|
|
636
|
+
height?: string | number;
|
|
637
|
+
minHeight?: string | number;
|
|
638
|
+
left?: string | number;
|
|
639
|
+
right?: string | number;
|
|
640
|
+
top?: string | number;
|
|
641
|
+
position?: "sticky" | "relative" | "absolute" | "static";
|
|
642
|
+
tableLayout?: "fixed" | "auto";
|
|
643
|
+
textAlign?: "left" | "center" | "right" | "start" | "end";
|
|
644
|
+
zIndex?: number;
|
|
645
|
+
transform?: string;
|
|
646
|
+
};
|
|
647
|
+
className?: string;
|
|
648
|
+
role?: string;
|
|
649
|
+
tabIndex?: number;
|
|
650
|
+
id?: string;
|
|
651
|
+
scope?: "col" | "row" | "colgroup" | "rowgroup";
|
|
652
|
+
colSpan?: number;
|
|
653
|
+
hidden?: boolean;
|
|
654
|
+
title?: string;
|
|
655
|
+
}>;
|
|
656
|
+
protected readonly tableAttrs: _angular_core.Signal<_ui_organized_table_core.ElementProps>;
|
|
657
|
+
protected readonly caption: _angular_core.Signal<_ui_organized_table_core.ElementProps>;
|
|
658
|
+
protected readonly columns: _angular_core.Signal<_tanstack_table_core.Column<_ui_organized_table_core.UioTableFeatures, _tanstack_table_core.RowData, unknown>[]>;
|
|
659
|
+
private readonly element;
|
|
660
|
+
constructor();
|
|
661
|
+
protected colProps(columnId: string): _ui_organized_table_core.ElementProps;
|
|
662
|
+
protected onKeyDown(event: KeyboardEvent): void;
|
|
663
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableViewport, never>;
|
|
664
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableViewport, "div[uioTableViewport]", never, {}, {}, never, ["*"], true, never>;
|
|
665
|
+
}
|
|
666
|
+
declare class UioTableHeader {
|
|
667
|
+
protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
|
|
668
|
+
protected readonly groups: _angular_core.Signal<_tanstack_table_core.HeaderGroup<_ui_organized_table_core.UioTableFeatures, _tanstack_table_core.RowData>[]>;
|
|
669
|
+
protected readonly rowProps: _ui_organized_table_core.ElementProps;
|
|
670
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableHeader, never>;
|
|
671
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableHeader, "thead[uioTableHeader]", never, {}, {}, never, never, true, never>;
|
|
672
|
+
}
|
|
673
|
+
/**
|
|
674
|
+
* The body, and the four states it decides between on its own.
|
|
675
|
+
*
|
|
676
|
+
* Projected content wins: layer-2 composition is the point of these parts.
|
|
677
|
+
* Otherwise `<tbody uioTableBody>` alone is a complete table body — the error,
|
|
678
|
+
* the loading skeleton, the empty state and the rows are all its business.
|
|
679
|
+
*/
|
|
680
|
+
declare class UioTableBody {
|
|
681
|
+
protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
|
|
682
|
+
protected readonly spacers: _angular_core.Signal<{
|
|
683
|
+
top: number;
|
|
684
|
+
bottom: number;
|
|
685
|
+
}>;
|
|
686
|
+
protected readonly state: _angular_core.Signal<"error" | "loading" | "empty" | "rows">;
|
|
687
|
+
protected spacerRow(height: number): _ui_organized_table_core.ElementProps;
|
|
688
|
+
protected spacerCell(height: number): _ui_organized_table_core.ElementProps;
|
|
689
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableBody, never>;
|
|
690
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableBody, "tbody[uioTableBody]", never, {}, {}, never, ["*"], true, never>;
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
/**
|
|
694
|
+
* Pointer drag and keyboard, on one control.
|
|
695
|
+
*
|
|
696
|
+
* The drag is TanStack's own handler; the keyboard is core's `resizeKeyDown`, so
|
|
697
|
+
* the two cannot drift. It is a `role="separator"` with `aria-valuenow`, which is
|
|
698
|
+
* what makes the column width something a screen reader can report rather than
|
|
699
|
+
* something only a mouse can discover.
|
|
700
|
+
*/
|
|
701
|
+
declare class UioTableResizeHandle<T extends RowData> extends UioTablePropsHost {
|
|
702
|
+
readonly header: _angular_core.InputSignal<TableHeaderInstance<T>>;
|
|
703
|
+
protected readonly table: _ui_organized_angular_table.DataTableApi<T>;
|
|
704
|
+
private readonly column;
|
|
705
|
+
private readonly bounds;
|
|
706
|
+
/** Applied to this button by `UioTablePropsHost`. */
|
|
707
|
+
protected readonly tableProps: _angular_core.Signal<_ui_organized_table_core.ElementProps>;
|
|
708
|
+
/** Stops the header's sort button from firing on the same press. */
|
|
709
|
+
protected startResize(event: MouseEvent | TouchEvent): void;
|
|
710
|
+
protected onKeyDown(event: KeyboardEvent): void;
|
|
711
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableResizeHandle<any>, never>;
|
|
712
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableResizeHandle<any>, "button[uioTableResizeHandle]", never, { "header": { "alias": "header"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
713
|
+
}
|
|
714
|
+
/** One header cell: the sort control, the roving tab stop, and the resize grip. */
|
|
715
|
+
declare class UioTableHeadCell<T extends RowData> extends UioTablePropsHost {
|
|
716
|
+
protected readonly glyph: typeof internalGlyph;
|
|
717
|
+
readonly header: _angular_core.InputSignal<TableHeaderInstance<T>>;
|
|
718
|
+
readonly index: _angular_core.InputSignal<number>;
|
|
719
|
+
protected readonly table: _ui_organized_angular_table.DataTableApi<T>;
|
|
720
|
+
protected readonly column: _angular_core.Signal<_tanstack_table_core.Column<_ui_organized_table_core.UioTableFeatures, T, any>>;
|
|
721
|
+
protected readonly sortable: _angular_core.Signal<boolean>;
|
|
722
|
+
protected readonly sorted: _angular_core.Signal<false | _tanstack_table_core.SortDirection>;
|
|
723
|
+
protected readonly interactive: _angular_core.Signal<boolean>;
|
|
724
|
+
protected readonly editable: _angular_core.Signal<boolean>;
|
|
725
|
+
protected readonly sortIcon: _angular_core.Signal<"sort-desc" | "sort-asc">;
|
|
726
|
+
private readonly focused;
|
|
727
|
+
protected readonly tabIndex: _angular_core.Signal<0 | -1>;
|
|
728
|
+
/** Applied to this `<th>` by `UioTablePropsHost`. */
|
|
729
|
+
protected readonly tableProps: _angular_core.Signal<_ui_organized_table_core.ElementProps>;
|
|
730
|
+
protected onFocus(): void;
|
|
731
|
+
protected readonly movable: _angular_core.Signal<boolean>;
|
|
732
|
+
protected readonly headerText: _angular_core.Signal<string>;
|
|
733
|
+
protected readonly dragging: _angular_core.Signal<boolean>;
|
|
734
|
+
protected readonly dropSide: _angular_core.Signal<_ui_organized_table_core.DropSide>;
|
|
735
|
+
protected onDragStart(event: DragEvent): void;
|
|
736
|
+
protected onDragOver(event: DragEvent): void;
|
|
737
|
+
protected onDrop(event: DragEvent): void;
|
|
738
|
+
protected onDragEnd(): void;
|
|
739
|
+
/**
|
|
740
|
+
* Re-rendering in the new order moves this header's DOM node, and a moved
|
|
741
|
+
* node drops focus. Put it back on the same button — or on the other one,
|
|
742
|
+
* when this move took the column to the end it pointed at. Only after a
|
|
743
|
+
* keyboard press: a mouse click does not leave focus on the button.
|
|
744
|
+
*/
|
|
745
|
+
protected pressMove(direction: -1 | 1, event: MouseEvent, own: HTMLButtonElement, other: HTMLButtonElement): void;
|
|
746
|
+
protected toggleSort(event: Event): void;
|
|
747
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableHeadCell<any>, never>;
|
|
748
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableHeadCell<any>, "th[uioTableHeadCell]", never, { "header": { "alias": "header"; "required": true; "isSignal": true; }; "index": { "alias": "index"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
/**
|
|
752
|
+
* One cell.
|
|
753
|
+
*
|
|
754
|
+
* The identifying column is a real row header, which is what makes a screen
|
|
755
|
+
* reader announce "Ada Lovelace, Role, Engineer" instead of just "Engineer" —
|
|
756
|
+
* so the row picks `th` or `td` and this decorates whichever it wrote. Angular
|
|
757
|
+
* has no dynamic element by name, and a component selector that matched both
|
|
758
|
+
* would be two selectors on one class, so the tag choice lives in the row's
|
|
759
|
+
* template and the behaviour lives here.
|
|
760
|
+
*/
|
|
761
|
+
declare class UioTableCell<T extends RowData> extends UioTablePropsHost {
|
|
762
|
+
readonly cell: _angular_core.InputSignal<_tanstack_table_core.Cell_Core<_ui_organized_table_core.UioTableFeatures, T, any>>;
|
|
763
|
+
readonly row: _angular_core.InputSignal<TableRowModel<T>>;
|
|
764
|
+
readonly index: _angular_core.InputSignal<number>;
|
|
765
|
+
readonly rowIndex: _angular_core.InputSignal<number>;
|
|
766
|
+
readonly primary: _angular_core.InputSignal<boolean>;
|
|
767
|
+
protected readonly table: _ui_organized_angular_table.DataTableApi<T>;
|
|
768
|
+
private readonly host;
|
|
769
|
+
protected readonly column: Signal<_tanstack_table_core.Column<_ui_organized_table_core.UioTableFeatures, T, any>>;
|
|
770
|
+
private readonly meta;
|
|
771
|
+
private readonly editable;
|
|
772
|
+
protected readonly editing: Signal<_ui_organized_table_core.TableEditContext<T>>;
|
|
773
|
+
private readonly focused;
|
|
774
|
+
/** Applied to this cell by `UioTablePropsHost`. */
|
|
775
|
+
protected readonly tableProps: Signal<_ui_organized_table_core.ElementProps>;
|
|
776
|
+
protected readonly editorTemplate: Signal<unknown>;
|
|
777
|
+
constructor();
|
|
778
|
+
protected onFocus(): void;
|
|
779
|
+
/**
|
|
780
|
+
* One click opens the editor. The click stops here either way: it must not
|
|
781
|
+
* also activate the row (open its detail sheet), and a click *inside* the open
|
|
782
|
+
* editor must not restart the edit and throw the draft away.
|
|
783
|
+
*/
|
|
784
|
+
protected onClick(event: Event): void;
|
|
785
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableCell<any>, never>;
|
|
786
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableCell<any>, "[uioTableCell]", never, { "cell": { "alias": "cell"; "required": true; "isSignal": true; }; "row": { "alias": "row"; "required": true; "isSignal": true; }; "index": { "alias": "index"; "required": true; "isSignal": true; }; "rowIndex": { "alias": "rowIndex"; "required": true; "isSignal": true; }; "primary": { "alias": "primary"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
787
|
+
}
|
|
788
|
+
/**
|
|
789
|
+
* One row.
|
|
790
|
+
*
|
|
791
|
+
* React memoizes this on a hand-written nine-field comparator, and threads every
|
|
792
|
+
* value it needs through props so the comparator can see them. Angular needs
|
|
793
|
+
* neither: a signal-driven template updates only what changed, so the row takes
|
|
794
|
+
* what genuinely *varies per row* as inputs and reads the rest from the
|
|
795
|
+
* injector.
|
|
796
|
+
*/
|
|
797
|
+
declare class UioTableRow<T extends RowData> extends UioTablePropsHost {
|
|
798
|
+
readonly row: _angular_core.InputSignal<TableRowModel<T>>;
|
|
799
|
+
readonly index: _angular_core.InputSignal<number>;
|
|
800
|
+
readonly absoluteIndex: _angular_core.InputSignal<number>;
|
|
801
|
+
protected readonly table: _ui_organized_angular_table.DataTableApi<T>;
|
|
802
|
+
private readonly host;
|
|
803
|
+
protected readonly cells: Signal<_tanstack_table_core.Cell_Core<_ui_organized_table_core.UioTableFeatures, T, unknown>[]>;
|
|
804
|
+
/** Applied to this `<tr>` by `UioTablePropsHost`. */
|
|
805
|
+
protected readonly tableProps: Signal<_ui_organized_table_core.ElementProps>;
|
|
806
|
+
constructor();
|
|
807
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableRow<any>, never>;
|
|
808
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableRow<any>, "tr[uioTableRow]", never, { "row": { "alias": "row"; "required": true; "isSignal": true; }; "index": { "alias": "index"; "required": true; "isSignal": true; }; "absoluteIndex": { "alias": "absoluteIndex"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
809
|
+
}
|
|
810
|
+
|
|
811
|
+
/**
|
|
812
|
+
* Empty, loading and error all live *inside* `<tbody>` rather than replacing the
|
|
813
|
+
* table.
|
|
814
|
+
*
|
|
815
|
+
* Keeping the header on screen keeps the column widths, the scroll position and
|
|
816
|
+
* the filter controls exactly where they were — so clearing a filter that
|
|
817
|
+
* emptied the table does not also move every control the user was about to
|
|
818
|
+
* click.
|
|
819
|
+
*/
|
|
820
|
+
declare class UioTableEmpty {
|
|
821
|
+
readonly title: _angular_core.InputSignal<string>;
|
|
822
|
+
readonly description: _angular_core.InputSignal<string>;
|
|
823
|
+
protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
|
|
824
|
+
protected readonly heading: _angular_core.Signal<string>;
|
|
825
|
+
protected readonly detail: _angular_core.Signal<string>;
|
|
826
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableEmpty, never>;
|
|
827
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableEmpty, "tr[uioTableEmpty]", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
828
|
+
}
|
|
829
|
+
/**
|
|
830
|
+
* Skeleton rows sized to the real row height, so the table does not resize when
|
|
831
|
+
* the data lands — which is the entire reason to prefer a skeleton to a spinner.
|
|
832
|
+
* (There is no Spinner in the library, which settles it anyway.)
|
|
833
|
+
*/
|
|
834
|
+
declare class UioTableLoading {
|
|
835
|
+
readonly rows: _angular_core.InputSignal<number>;
|
|
836
|
+
protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
|
|
837
|
+
protected readonly columns: _angular_core.Signal<_tanstack_table_core.Column<_ui_organized_table_core.UioTableFeatures, _tanstack_table_core.RowData, unknown>[]>;
|
|
838
|
+
protected readonly bars: _angular_core.Signal<number[]>;
|
|
839
|
+
protected readonly barHeight: _angular_core.Signal<10 | 12>;
|
|
840
|
+
protected widthFor(columnId: string): string;
|
|
841
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableLoading, never>;
|
|
842
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableLoading, "[uioTableLoading]", never, { "rows": { "alias": "rows"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
843
|
+
}
|
|
844
|
+
declare class UioTableError {
|
|
845
|
+
readonly title: _angular_core.InputSignal<string>;
|
|
846
|
+
protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
|
|
847
|
+
/** The table's `error` option, when it is a plain string. */
|
|
848
|
+
protected readonly message: _angular_core.Signal<string>;
|
|
849
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableError, never>;
|
|
850
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableError, "tr[uioTableError]", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
/**
|
|
854
|
+
* The row above the table: search, filters, and the controls that change what
|
|
855
|
+
* the table shows rather than what it contains.
|
|
856
|
+
*
|
|
857
|
+
* Not a `UioToolbar` — that is a `role="toolbar"` with roving focus, which is
|
|
858
|
+
* right for a cluster of icon buttons and wrong for a row containing a text
|
|
859
|
+
* input.
|
|
860
|
+
*
|
|
861
|
+
* ── Why the controls are inline rather than six exported parts ──────────────
|
|
862
|
+
*
|
|
863
|
+
* React, Vue and Svelte export `TableSearch`, `TableSortMenu`, `TableViewOptions`,
|
|
864
|
+
* `TableExportMenu`, `TableActions` and `TableScrollButtons` separately, and each
|
|
865
|
+
* renders exactly the element it is — a fragment, in effect. **An Angular
|
|
866
|
+
* component always has a host element**, so each of those would put a node in
|
|
867
|
+
* the DOM that the other three do not render, and every parity case would differ.
|
|
868
|
+
*
|
|
869
|
+
* A directive on the caller's element is the usual escape, and it does not work
|
|
870
|
+
* here: these parts configure themselves *from the table* rather than from
|
|
871
|
+
* bindings, so a host directive would need the caller to bind what the part
|
|
872
|
+
* already knows.
|
|
873
|
+
*
|
|
874
|
+
* So Angular's layer 2 is one part coarser here. The toolbar is still a part —
|
|
875
|
+
* `<div uioTableToolbar>` — and everything it composes is still core's decision;
|
|
876
|
+
* what a consumer loses is the ability to reorder the six controls, which the
|
|
877
|
+
* other three allow. Recorded rather than hidden.
|
|
878
|
+
*/
|
|
879
|
+
declare class UioTableToolbar {
|
|
880
|
+
protected readonly glyph: typeof internalGlyph;
|
|
881
|
+
protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
|
|
882
|
+
protected readonly searchable: _angular_core.Signal<boolean>;
|
|
883
|
+
protected readonly hideable: _angular_core.Signal<boolean>;
|
|
884
|
+
protected readonly exportable: _angular_core.Signal<boolean>;
|
|
885
|
+
protected readonly filterable: _angular_core.Signal<boolean>;
|
|
886
|
+
protected readonly actions: _angular_core.Signal<TableAction[]>;
|
|
887
|
+
protected readonly scroll: _angular_core.Signal<_ui_organized_table_core.HorizontalScrollState>;
|
|
888
|
+
protected readonly cards: _angular_core.Signal<boolean>;
|
|
889
|
+
protected readonly hasSelection: _angular_core.Signal<boolean>;
|
|
890
|
+
protected readonly reorderToggle: _angular_core.Signal<boolean>;
|
|
891
|
+
/**
|
|
892
|
+
* The export menu's items report through `UioMenu (select)`, not their own:
|
|
893
|
+
* `UioMenuItem` has no `select` output, so `(select)` on an item binds a DOM
|
|
894
|
+
* event that never fires.
|
|
895
|
+
*/
|
|
896
|
+
protected runExport(value: string): void;
|
|
897
|
+
protected readonly searchLabel: _angular_core.Signal<string>;
|
|
898
|
+
protected readonly filterFields: _angular_core.Signal<_ui_organized_angular_table.FilterableField[]>;
|
|
899
|
+
protected readonly sortableColumns: _angular_core.Signal<_tanstack_table_core.Column<_ui_organized_table_core.UioTableFeatures, _tanstack_table_core.RowData, unknown>[]>;
|
|
900
|
+
protected readonly toggleable: _angular_core.Signal<_ui_organized_table_core.TableColumnInstance<_tanstack_table_core.RowData>[]>;
|
|
901
|
+
protected readonly sortMenu: _angular_core.Signal<boolean>;
|
|
902
|
+
private readonly activeSort;
|
|
903
|
+
protected readonly activeSortId: _angular_core.Signal<string>;
|
|
904
|
+
protected readonly sortDirection: _angular_core.Signal<"asc" | "desc">;
|
|
905
|
+
protected readonly sortIcon: _angular_core.Signal<_ui_organized_angular.IconGlyph>;
|
|
906
|
+
protected iconOf(action: TableAction): IconName | undefined;
|
|
907
|
+
protected isIconOnly(action: TableAction): boolean;
|
|
908
|
+
protected headerOf(column: {
|
|
909
|
+
id: string;
|
|
910
|
+
columnDef: {
|
|
911
|
+
header?: unknown;
|
|
912
|
+
};
|
|
913
|
+
}): string;
|
|
914
|
+
protected chooseColumn(id: string): void;
|
|
915
|
+
protected chooseDirection(next: string): void;
|
|
916
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableToolbar, never>;
|
|
917
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableToolbar, "div[uioTableToolbar]", never, {}, {}, never, never, true, never>;
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
/**
|
|
921
|
+
* Focus has to land somewhere deliberate when a chip disappears, or it falls to
|
|
922
|
+
* `<body>` and a keyboard user loses their place entirely.
|
|
923
|
+
*/
|
|
924
|
+
declare function focusAfterRemoval(removedId: string): void;
|
|
925
|
+
/**
|
|
926
|
+
* The value half of a condition editor.
|
|
927
|
+
*
|
|
928
|
+
* Which control appears follows from **type and operator together**, never from
|
|
929
|
+
* the type alone — that is the whole point of separating the two. A date column
|
|
930
|
+
* shows one date field for "is before", two for "is between", and a number plus
|
|
931
|
+
* a unit for "is in the last".
|
|
932
|
+
*/
|
|
933
|
+
declare class UioTableFilterValueEditor {
|
|
934
|
+
readonly condition: _angular_core.InputSignal<TableFilterCondition>;
|
|
935
|
+
readonly arity: _angular_core.InputSignal<FilterOperatorArity>;
|
|
936
|
+
protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
|
|
937
|
+
protected readonly query: _angular_core.WritableSignal<string>;
|
|
938
|
+
protected readonly BOOLEAN_ITEMS: {
|
|
939
|
+
value: string;
|
|
940
|
+
label: string;
|
|
941
|
+
}[];
|
|
942
|
+
protected readonly UNITS: {
|
|
943
|
+
value: string;
|
|
944
|
+
label: string;
|
|
945
|
+
}[];
|
|
946
|
+
private readonly type;
|
|
947
|
+
/** One switch value rather than nested conditions, which a template cannot nest. */
|
|
948
|
+
protected readonly kind: _angular_core.Signal<"number" | "boolean" | "text" | "date" | "enum" | "none" | "relative-date">;
|
|
949
|
+
private readonly options;
|
|
950
|
+
protected readonly searchable: _angular_core.Signal<boolean>;
|
|
951
|
+
protected readonly listboxOptions: _angular_core.Signal<{
|
|
952
|
+
value: string;
|
|
953
|
+
label: string;
|
|
954
|
+
disabled: boolean;
|
|
955
|
+
}[]>;
|
|
956
|
+
protected readonly selectedValues: _angular_core.Signal<string[]>;
|
|
957
|
+
protected readonly booleanValue: _angular_core.Signal<string>;
|
|
958
|
+
protected numberAt(index: number): number | null;
|
|
959
|
+
protected stringAt(index: number): string;
|
|
960
|
+
private set;
|
|
961
|
+
protected setAt(index: number, value: TableFilterValue): void;
|
|
962
|
+
protected setBoolean(value: string): void;
|
|
963
|
+
protected setSelected(values: string[]): void;
|
|
964
|
+
protected setUnit(unit: string): void;
|
|
965
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableFilterValueEditor, never>;
|
|
966
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableFilterValueEditor, "[uioTableFilterValueEditor]", never, { "condition": { "alias": "condition"; "required": true; "isSignal": true; }; "arity": { "alias": "arity"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
967
|
+
}
|
|
968
|
+
/**
|
|
969
|
+
* One condition's value editor (Figma 2298:726): the value, then a rule and a
|
|
970
|
+
* remove. The field and the operator have segments of their own on the chip,
|
|
971
|
+
* so the editor carries only what the value segment opens.
|
|
972
|
+
*/
|
|
973
|
+
declare class UioTableFilterEditor {
|
|
974
|
+
protected readonly glyph: typeof internalGlyph;
|
|
975
|
+
readonly condition: _angular_core.InputSignal<TableFilterCondition>;
|
|
976
|
+
protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
|
|
977
|
+
protected readonly arity: _angular_core.Signal<FilterOperatorArity>;
|
|
978
|
+
protected remove(): void;
|
|
979
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableFilterEditor, never>;
|
|
980
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableFilterEditor, "[uioTableFilterEditor]", never, { "condition": { "alias": "condition"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
981
|
+
}
|
|
982
|
+
type ChipMenu = "field" | "operator";
|
|
983
|
+
/**
|
|
984
|
+
* One condition, as a segmented chip (Figma 2462:2636): "Name | is greater than
|
|
985
|
+
* | 30". Each segment opens the control for the one parameter it shows — the
|
|
986
|
+
* field menu, the operator menu, the value editor — so changing a filter is one
|
|
987
|
+
* click on the part you mean rather than a trip through a form.
|
|
988
|
+
*
|
|
989
|
+
* Removal lives in the field menu and at the foot of the value editor, not in a
|
|
990
|
+
* dismiss button: a fourth 24px target in a row of segments is a coin-flip on
|
|
991
|
+
* touch, and an operator that takes no value ("is empty") has no value editor to
|
|
992
|
+
* put it in.
|
|
993
|
+
*/
|
|
994
|
+
declare class UioTableFilterChip {
|
|
995
|
+
readonly condition: _angular_core.InputSignal<TableFilterCondition>;
|
|
996
|
+
protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
|
|
997
|
+
private readonly editor;
|
|
998
|
+
protected readonly editing: _angular_core.Signal<boolean>;
|
|
999
|
+
private readonly settled;
|
|
1000
|
+
protected readonly open: _angular_core.Signal<boolean>;
|
|
1001
|
+
private readonly host;
|
|
1002
|
+
protected readonly menu: _angular_core.WritableSignal<ChipMenu>;
|
|
1003
|
+
protected readonly description: _angular_core.Signal<_ui_organized_table_core.ConditionDescription>;
|
|
1004
|
+
protected readonly takesValue: _angular_core.Signal<boolean>;
|
|
1005
|
+
protected readonly operators: _angular_core.Signal<{
|
|
1006
|
+
id: string;
|
|
1007
|
+
label: string;
|
|
1008
|
+
}[]>;
|
|
1009
|
+
private snapshot;
|
|
1010
|
+
constructor();
|
|
1011
|
+
protected setOpen(next: boolean): void;
|
|
1012
|
+
protected setMenu(name: ChipMenu, next: boolean): void;
|
|
1013
|
+
protected remove(): void;
|
|
1014
|
+
protected onKeyDown(event: KeyboardEvent): void;
|
|
1015
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableFilterChip, never>;
|
|
1016
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableFilterChip, "[uioTableFilterChip]", never, { "condition": { "alias": "condition"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
1017
|
+
}
|
|
1018
|
+
/**
|
|
1019
|
+
* The applied filters, on their own line under the header (Figma 2298:362).
|
|
1020
|
+
*
|
|
1021
|
+
* A *summary*, not a control panel: the filter button lives in the header above,
|
|
1022
|
+
* and this line does not exist until the user has actually filtered something. A
|
|
1023
|
+
* bar that is always present and usually empty is chrome that teaches people to
|
|
1024
|
+
* stop looking at it.
|
|
1025
|
+
*/
|
|
1026
|
+
declare class UioTableFilters {
|
|
1027
|
+
protected readonly glyph: typeof internalGlyph;
|
|
1028
|
+
private readonly presence;
|
|
1029
|
+
constructor();
|
|
1030
|
+
protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
|
|
1031
|
+
protected readonly conditions: _angular_core.Signal<TableFilterCondition[]>;
|
|
1032
|
+
protected readonly filterFields: _angular_core.Signal<_ui_organized_angular_table.FilterableField[]>;
|
|
1033
|
+
protected readonly render: _angular_core.Signal<boolean>;
|
|
1034
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableFilters, never>;
|
|
1035
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableFilters, "div[uioTableFilters]", never, {}, {}, never, never, true, never>;
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
/**
|
|
1039
|
+
* Wraps the library's `Pagination`, which takes a page *count* — the conversion
|
|
1040
|
+
* from row count and page size happens here so consumers never do that
|
|
1041
|
+
* arithmetic themselves and get the off-by-one wrong.
|
|
1042
|
+
*/
|
|
1043
|
+
declare class UioTablePagination {
|
|
1044
|
+
readonly showPageSize: _angular_core.InputSignal<boolean>;
|
|
1045
|
+
readonly pageSizes: _angular_core.InputSignal<number[]>;
|
|
1046
|
+
protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
|
|
1047
|
+
private readonly pagination;
|
|
1048
|
+
protected readonly pageIndex: _angular_core.Signal<number>;
|
|
1049
|
+
protected readonly pageSize: _angular_core.Signal<number>;
|
|
1050
|
+
protected readonly pageSizeValue: _angular_core.Signal<string>;
|
|
1051
|
+
private readonly total;
|
|
1052
|
+
protected readonly pageCount: _angular_core.Signal<number>;
|
|
1053
|
+
protected readonly status: _angular_core.Signal<string>;
|
|
1054
|
+
protected readonly sizeOptions: _angular_core.Signal<{
|
|
1055
|
+
value: string;
|
|
1056
|
+
label: string;
|
|
1057
|
+
}[]>;
|
|
1058
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTablePagination, never>;
|
|
1059
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTablePagination, "div[uioTablePagination]", never, { "showPageSize": { "alias": "showPageSize"; "required": false; "isSignal": true; }; "pageSizes": { "alias": "pageSizes"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
1060
|
+
}
|
|
1061
|
+
|
|
1062
|
+
/**
|
|
1063
|
+
* Appears only while something is selected, and then takes the place of the
|
|
1064
|
+
* toolbar's sort, filter and table actions: with rows selected, what to do
|
|
1065
|
+
* with them is the decision in front of the user, so it sits where they were
|
|
1066
|
+
* already looking rather than on a line of its own. The count, and the offer
|
|
1067
|
+
* to select the rows off screen, are in `UioTableSelectionFooter` under the
|
|
1068
|
+
* rows.
|
|
1069
|
+
*
|
|
1070
|
+
* Plain buttons in a labelled group, with no surface of its own. It shares the
|
|
1071
|
+
* toolbar row with the search box, so `role="toolbar"`'s roving focus would
|
|
1072
|
+
* make it the only cluster in that row that Tab skips through. Destructive
|
|
1073
|
+
* actions route through `UioAlertDialog`; "archive 40,000 rows" is not an
|
|
1074
|
+
* undo-able mis-click.
|
|
1075
|
+
*/
|
|
1076
|
+
declare class UioTableSelectionBar<T extends RowData> {
|
|
1077
|
+
private readonly presence;
|
|
1078
|
+
constructor();
|
|
1079
|
+
readonly actions: _angular_core.InputSignal<BulkAction<T>[]>;
|
|
1080
|
+
protected readonly table: _ui_organized_angular_table.DataTableApi<T>;
|
|
1081
|
+
protected readonly confirming: _angular_core.WritableSignal<BulkAction<T>>;
|
|
1082
|
+
protected readonly items: _angular_core.Signal<BulkAction<T>[]>;
|
|
1083
|
+
protected readonly count: _angular_core.Signal<number>;
|
|
1084
|
+
private readonly rowsWord;
|
|
1085
|
+
protected readonly confirmTitle: _angular_core.Signal<string>;
|
|
1086
|
+
protected readonly confirmDescription: _angular_core.Signal<string>;
|
|
1087
|
+
protected readonly confirmLabel: _angular_core.Signal<string>;
|
|
1088
|
+
protected iconOf(action: BulkAction<T>): IconName | undefined;
|
|
1089
|
+
private run;
|
|
1090
|
+
protected choose(action: BulkAction<T>): void;
|
|
1091
|
+
protected runConfirmed(): void;
|
|
1092
|
+
protected onOpenChange(open: boolean): void;
|
|
1093
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableSelectionBar<any>, never>;
|
|
1094
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableSelectionBar<any>, "div[uioTableSelectionBar]", never, { "actions": { "alias": "actions"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
1095
|
+
}
|
|
1096
|
+
|
|
1097
|
+
/**
|
|
1098
|
+
* Enters and leaves reorder mode, for `reorderable: "toggle"`.
|
|
1099
|
+
*
|
|
1100
|
+
* A directive on a `uioButton` rather than a component of its own: React's
|
|
1101
|
+
* toggle is a single `<button>`, and an Angular component would put a host
|
|
1102
|
+
* element around it. So the button is the caller's, and this supplies what it
|
|
1103
|
+
* does and what it is called:
|
|
1104
|
+
*
|
|
1105
|
+
* <button uioButton uioTableReorderToggle #reorder="uioTableReorderToggle"
|
|
1106
|
+
* [intent]="reorder.active() ? 'primary' : 'secondary'">{{ reorder.text() }}</button>
|
|
1107
|
+
*
|
|
1108
|
+
* The label says what a press does next — "Reorder", then "Done" — rather
|
|
1109
|
+
* than carrying a pressed state, so it reads the same to a screen reader as
|
|
1110
|
+
* it does on screen. Render it only while `table.reorder.mode()` is "toggle"
|
|
1111
|
+
* and the table is not in card mode, as the toolbar does.
|
|
1112
|
+
*/
|
|
1113
|
+
declare class UioTableReorderToggle {
|
|
1114
|
+
private readonly table;
|
|
1115
|
+
readonly active: _angular_core.Signal<boolean>;
|
|
1116
|
+
readonly text: _angular_core.Signal<"Done" | "Reorder">;
|
|
1117
|
+
protected toggle(): void;
|
|
1118
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableReorderToggle, never>;
|
|
1119
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UioTableReorderToggle, "button[uioTableReorderToggle]", ["uioTableReorderToggle"], {}, {}, never, never, true, never>;
|
|
1120
|
+
}
|
|
1121
|
+
|
|
1122
|
+
/**
|
|
1123
|
+
* Under the rows: how many are selected, and the offer to select the matching
|
|
1124
|
+
* rows that are not on screen.
|
|
1125
|
+
*
|
|
1126
|
+
* At the bottom rather than in the toolbar, because that is where the user's
|
|
1127
|
+
* eye is once they have ticked down a page — and where the visible rows run
|
|
1128
|
+
* out is where "there are more of these" belongs. The bulk actions stay in the
|
|
1129
|
+
* toolbar (see `UioTableSelectionBar`).
|
|
1130
|
+
*
|
|
1131
|
+
* The offer is a real button, and counts the rows it would *add*: "Select
|
|
1132
|
+
* 99,981 hidden rows" says plainly that the ticks so far only reached what was
|
|
1133
|
+
* visible.
|
|
1134
|
+
*/
|
|
1135
|
+
declare class UioTableSelectionFooter {
|
|
1136
|
+
private readonly presence;
|
|
1137
|
+
constructor();
|
|
1138
|
+
protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
|
|
1139
|
+
protected readonly count: _angular_core.Signal<number>;
|
|
1140
|
+
protected readonly countLabel: _angular_core.Signal<string>;
|
|
1141
|
+
protected readonly hiddenLabel: _angular_core.Signal<string>;
|
|
1142
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableSelectionFooter, never>;
|
|
1143
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableSelectionFooter, "div[uioTableSelectionFooter]", never, {}, {}, never, never, true, never>;
|
|
1144
|
+
}
|
|
1145
|
+
|
|
1146
|
+
/**
|
|
1147
|
+
* The row under the toolbar: what is filtered.
|
|
1148
|
+
*
|
|
1149
|
+
* The selection's bulk actions used to share this line. They now replace the
|
|
1150
|
+
* toolbar's own controls while anything is selected (see `UioTableToolbar`), so
|
|
1151
|
+
* acting on the selection happens in the row the user was already reading.
|
|
1152
|
+
*
|
|
1153
|
+
* It renders nothing at all until there is a filter to show, so an empty row
|
|
1154
|
+
* never takes a slice of the table's `gap` — and nothing in card mode, where
|
|
1155
|
+
* the filter sheet holds them.
|
|
1156
|
+
*/
|
|
1157
|
+
declare class UioTableSubBar {
|
|
1158
|
+
private readonly presence;
|
|
1159
|
+
constructor();
|
|
1160
|
+
protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
|
|
1161
|
+
protected readonly render: _angular_core.Signal<boolean>;
|
|
1162
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableSubBar, never>;
|
|
1163
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableSubBar, "div[uioTableSubBar]", never, {}, {}, never, never, true, never>;
|
|
1164
|
+
}
|
|
1165
|
+
|
|
1166
|
+
/**
|
|
1167
|
+
* Per-row actions, as a menu rather than a row of buttons.
|
|
1168
|
+
*
|
|
1169
|
+
* A menu is one tab stop per row instead of three, which matters a great deal
|
|
1170
|
+
* when there are two hundred rows — and it is the only affordance that survives
|
|
1171
|
+
* card mode unchanged.
|
|
1172
|
+
*
|
|
1173
|
+
* The six menu parts this needs are the ones §E added to `@ui-organized/angular`
|
|
1174
|
+
* before this package could exist.
|
|
1175
|
+
*/
|
|
1176
|
+
declare class UioTableRowActions<T extends RowData> {
|
|
1177
|
+
protected readonly glyph: typeof internalGlyph;
|
|
1178
|
+
/** The row the actions operate on. */
|
|
1179
|
+
readonly row: _angular_core.InputSignal<T>;
|
|
1180
|
+
/**
|
|
1181
|
+
* Overrides the table's own `rowActions`. Only needed when the part is used
|
|
1182
|
+
* outside a `<uio-data-table>`.
|
|
1183
|
+
*/
|
|
1184
|
+
readonly actions: _angular_core.InputSignal<RowAction<T>[]>;
|
|
1185
|
+
/** Accessible name for the trigger. Defaults to "Row actions". */
|
|
1186
|
+
readonly label: _angular_core.InputSignal<string>;
|
|
1187
|
+
protected readonly table: _ui_organized_angular_table.DataTableApi<T>;
|
|
1188
|
+
protected readonly items: _angular_core.Signal<RowAction<T>[]>;
|
|
1189
|
+
protected run(id: string): void;
|
|
1190
|
+
protected iconOf(action: RowAction<T>): IconName | undefined;
|
|
1191
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableRowActions<any>, never>;
|
|
1192
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableRowActions<any>, "[uioTableRowActions]", never, { "row": { "alias": "row"; "required": true; "isSignal": true; }; "actions": { "alias": "actions"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
1193
|
+
}
|
|
1194
|
+
|
|
1195
|
+
/**
|
|
1196
|
+
* One card: the row's title, its controls in the top-right corner, and every
|
|
1197
|
+
* other visible column as a label and value.
|
|
1198
|
+
*
|
|
1199
|
+
* Title first, then the row's controls: the actions menu, and the checkbox
|
|
1200
|
+
* last, in the corner a thumb reaches and where a ticked card is easiest to scan
|
|
1201
|
+
* for down a list.
|
|
1202
|
+
*/
|
|
1203
|
+
declare class UioTableCard<T extends RowData> {
|
|
1204
|
+
readonly row: _angular_core.InputSignal<TableRowModel<T>>;
|
|
1205
|
+
readonly index: _angular_core.InputSignal<number>;
|
|
1206
|
+
/** Column ids in card order — `cardFieldOrder`, computed once by the list. */
|
|
1207
|
+
readonly fieldOrder: _angular_core.InputSignal<readonly string[]>;
|
|
1208
|
+
protected readonly table: _ui_organized_angular_table.DataTableApi<T>;
|
|
1209
|
+
private readonly host;
|
|
1210
|
+
protected readonly selected: _angular_core.Signal<boolean>;
|
|
1211
|
+
protected readonly selectable: _angular_core.Signal<boolean>;
|
|
1212
|
+
protected readonly hasActions: _angular_core.Signal<boolean>;
|
|
1213
|
+
protected readonly clickable: _angular_core.Signal<boolean>;
|
|
1214
|
+
private readonly cells;
|
|
1215
|
+
protected readonly primaryCell: _angular_core.Signal<_tanstack_table_core.Cell_Core<_ui_organized_table_core.UioTableFeatures, T, unknown>>;
|
|
1216
|
+
/** The words the card's controls are named with: "Select Ada Lovelace". */
|
|
1217
|
+
protected readonly titleText: _angular_core.Signal<string>;
|
|
1218
|
+
protected readonly fields: _angular_core.Signal<{
|
|
1219
|
+
id: string;
|
|
1220
|
+
cell: _tanstack_table_core.Cell_Core<_ui_organized_table_core.UioTableFeatures, T, unknown>;
|
|
1221
|
+
label: string;
|
|
1222
|
+
}[]>;
|
|
1223
|
+
constructor();
|
|
1224
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableCard<any>, never>;
|
|
1225
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableCard<any>, "li[uioTableCard]", never, { "row": { "alias": "row"; "required": true; "isSignal": true; }; "index": { "alias": "index"; "required": true; "isSignal": true; }; "fieldOrder": { "alias": "fieldOrder"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
1226
|
+
}
|
|
1227
|
+
/**
|
|
1228
|
+
* Card mode: one card per row, below the breakpoint.
|
|
1229
|
+
*
|
|
1230
|
+
* The table is *replaced*, not hidden — rendering both trees and hiding one with
|
|
1231
|
+
* a container query would double the DOM and defeat virtualization on exactly
|
|
1232
|
+
* the devices that can least afford it. Selection, row actions and the detail
|
|
1233
|
+
* sheet all keep working, because they are table state rather than table markup.
|
|
1234
|
+
*
|
|
1235
|
+
* The host is `display: contents` and the list is inside it, because the list
|
|
1236
|
+
* is a `<ul>` with rows and a `<table>` with the empty state without them, and
|
|
1237
|
+
* an Angular host element cannot change its tag.
|
|
1238
|
+
*/
|
|
1239
|
+
declare class UioTableCards {
|
|
1240
|
+
protected readonly table: _ui_organized_angular_table.DataTableApi<RowData>;
|
|
1241
|
+
private readonly list;
|
|
1242
|
+
protected readonly fieldOrder: _angular_core.Signal<string[]>;
|
|
1243
|
+
protected readonly spacers: _angular_core.Signal<{
|
|
1244
|
+
top: number;
|
|
1245
|
+
bottom: number;
|
|
1246
|
+
}>;
|
|
1247
|
+
protected readonly maxHeight: _angular_core.Signal<string>;
|
|
1248
|
+
constructor();
|
|
1249
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableCards, never>;
|
|
1250
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableCards, "div[uioTableCards]", never, {}, {}, never, never, true, never>;
|
|
1251
|
+
}
|
|
1252
|
+
|
|
1253
|
+
declare class UioTableSortSheet {
|
|
1254
|
+
/** Button label and sheet title. */
|
|
1255
|
+
readonly label: _angular_core.InputSignal<string>;
|
|
1256
|
+
protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
|
|
1257
|
+
protected readonly DIRECTIONS: {
|
|
1258
|
+
value: string;
|
|
1259
|
+
label: string;
|
|
1260
|
+
}[];
|
|
1261
|
+
protected readonly columns: Signal<_tanstack_table_core.Column<_ui_organized_table_core.UioTableFeatures, _tanstack_table_core.RowData, unknown>[]>;
|
|
1262
|
+
protected readonly columnOptions: Signal<{
|
|
1263
|
+
value: string;
|
|
1264
|
+
label: string;
|
|
1265
|
+
}[]>;
|
|
1266
|
+
private readonly sorting;
|
|
1267
|
+
protected readonly count: Signal<number>;
|
|
1268
|
+
protected readonly activeId: Signal<string>;
|
|
1269
|
+
protected readonly direction: Signal<"asc" | "desc">;
|
|
1270
|
+
protected readonly icon: Signal<_ui_organized_angular.IconGlyph>;
|
|
1271
|
+
private readonly sheet;
|
|
1272
|
+
constructor();
|
|
1273
|
+
protected chooseColumn(id: string): void;
|
|
1274
|
+
protected chooseDirection(next: string): void;
|
|
1275
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableSortSheet, never>;
|
|
1276
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableSortSheet, "[uioTableSortSheet]", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
1277
|
+
}
|
|
1278
|
+
/**
|
|
1279
|
+
* One condition inside a field's section: its relation, its value, and a way
|
|
1280
|
+
* to clear it. The field is the section, so there is no field control.
|
|
1281
|
+
*/
|
|
1282
|
+
declare class UioTableFilterSheetCondition {
|
|
1283
|
+
protected readonly glyph: typeof internalGlyph;
|
|
1284
|
+
readonly condition: _angular_core.InputSignal<TableFilterCondition>;
|
|
1285
|
+
readonly fieldLabel: _angular_core.InputSignal<string>;
|
|
1286
|
+
protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
|
|
1287
|
+
protected readonly description: Signal<_ui_organized_table_core.ConditionDescription>;
|
|
1288
|
+
protected readonly arity: Signal<_ui_organized_table_core.FilterOperatorArity>;
|
|
1289
|
+
protected readonly operatorOptions: Signal<{
|
|
1290
|
+
value: string;
|
|
1291
|
+
label: string;
|
|
1292
|
+
}[]>;
|
|
1293
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableFilterSheetCondition, never>;
|
|
1294
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableFilterSheetCondition, "div[uioTableFilterSheetCondition]", never, { "condition": { "alias": "condition"; "required": true; "isSignal": true; }; "fieldLabel": { "alias": "fieldLabel"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
1295
|
+
}
|
|
1296
|
+
/**
|
|
1297
|
+
* Marks the template for one field's section, so the sheet can hand the
|
|
1298
|
+
* accordion one `TemplateRef` per field. `AccordionItem.content` takes a
|
|
1299
|
+
* template but passes it no context, so the field cannot be a template
|
|
1300
|
+
* variable; a view created from this template keeps the `@for` iteration it
|
|
1301
|
+
* was declared in, and with it the field.
|
|
1302
|
+
*/
|
|
1303
|
+
declare class UioTableSheetSection {
|
|
1304
|
+
readonly field: _angular_core.InputSignal<string>;
|
|
1305
|
+
readonly template: TemplateRef<unknown>;
|
|
1306
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableSheetSection, never>;
|
|
1307
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UioTableSheetSection, "ng-template[uioTableSheetSection]", never, { "field": { "alias": "uioTableSheetSection"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
1308
|
+
}
|
|
1309
|
+
/**
|
|
1310
|
+
* Every filterable field at once, one accordion section each, so filtering on
|
|
1311
|
+
* a phone is "open the field, pick the value" rather than "add a filter,
|
|
1312
|
+
* choose its field, then pick the value".
|
|
1313
|
+
*
|
|
1314
|
+
* Each section edits a real condition. While the sheet is open every field has
|
|
1315
|
+
* at least one, so its editor has something to write to: the sheet adds an
|
|
1316
|
+
* empty draft for any field without one. A draft is an incomplete condition,
|
|
1317
|
+
* which the filter model keeps but never applies, so drafts change nothing
|
|
1318
|
+
* until they are given a value; the badge counts only complete conditions;
|
|
1319
|
+
* and closing the sheet removes the drafts nobody filled in.
|
|
1320
|
+
*/
|
|
1321
|
+
declare class UioTableFilterSheet {
|
|
1322
|
+
protected readonly glyph: typeof internalGlyph;
|
|
1323
|
+
/** Button label and sheet title. */
|
|
1324
|
+
readonly label: _angular_core.InputSignal<string>;
|
|
1325
|
+
protected readonly table: _ui_organized_angular_table.DataTableApi<_tanstack_table_core.RowData>;
|
|
1326
|
+
private readonly sheet;
|
|
1327
|
+
private readonly sectionTemplates;
|
|
1328
|
+
protected readonly fields: Signal<_ui_organized_angular_table.FilterableField[]>;
|
|
1329
|
+
protected readonly allFields: Signal<string[]>;
|
|
1330
|
+
private readonly applied;
|
|
1331
|
+
protected readonly count: Signal<number>;
|
|
1332
|
+
private readonly isOpen;
|
|
1333
|
+
/** Sections the user has collapsed or expanded; null until they touch one. */
|
|
1334
|
+
protected readonly expanded: _angular_core.WritableSignal<readonly (string | number)[]>;
|
|
1335
|
+
/**
|
|
1336
|
+
* The accordion's items. The title is the field, and once something is
|
|
1337
|
+
* applied, what it is: "Role: is any of Admin". It has to be one string —
|
|
1338
|
+
* `AccordionItem.title` takes no template — so the summary rides in the
|
|
1339
|
+
* title rather than in a styled line of its own beneath it.
|
|
1340
|
+
*/
|
|
1341
|
+
protected readonly sections: Signal<AccordionItem[]>;
|
|
1342
|
+
constructor();
|
|
1343
|
+
protected conditionsOf(columnId: string): TableFilterCondition[];
|
|
1344
|
+
protected onOpenChange(open: boolean): void;
|
|
1345
|
+
/** Only what is applied: the drafts stay, so every section keeps its editor. */
|
|
1346
|
+
protected clearApplied(): void;
|
|
1347
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioTableFilterSheet, never>;
|
|
1348
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioTableFilterSheet, "[uioTableFilterSheet]", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
1349
|
+
}
|
|
1350
|
+
|
|
1351
|
+
/**
|
|
1352
|
+
* Layer 3: the whole table from an input object.
|
|
1353
|
+
*
|
|
1354
|
+
* It composes exactly the parts a consumer would compose by hand — which is the
|
|
1355
|
+
* test of whether layer 2 is real. Anything this does that the parts cannot is a
|
|
1356
|
+
* gap in the parts, not a feature of the wrapper.
|
|
1357
|
+
*
|
|
1358
|
+
* ── Why the inputs are spelled out ──────────────────────────────────────────
|
|
1359
|
+
*
|
|
1360
|
+
* React, Vue and Svelte all hand their whole props object to the composable. An
|
|
1361
|
+
* Angular component has no such object: `input()` is one signal per option, and
|
|
1362
|
+
* the options getter below assembles them. That is the last of the three costs
|
|
1363
|
+
* Angular carries, and it is the cheap one — it costs length, not correctness,
|
|
1364
|
+
* and it buys a properly typed template API in exchange.
|
|
1365
|
+
*/
|
|
1366
|
+
declare class UioDataTable<T extends RowData> implements OnInit {
|
|
1367
|
+
readonly data: _angular_core.InputSignal<readonly T[]>;
|
|
1368
|
+
readonly columns: _angular_core.InputSignal<readonly TableColumn<T>[]>;
|
|
1369
|
+
/**
|
|
1370
|
+
* The table's accessible name. Required, not optional: it becomes the
|
|
1371
|
+
* `<caption>`, and a table announced as "table" and nothing else is the most
|
|
1372
|
+
* common data-table accessibility failure there is.
|
|
1373
|
+
*/
|
|
1374
|
+
readonly label: _angular_core.InputSignal<string>;
|
|
1375
|
+
readonly captionVisible: _angular_core.InputSignal<boolean>;
|
|
1376
|
+
readonly getRowId: _angular_core.InputSignal<(row: T, index: number) => string>;
|
|
1377
|
+
readonly size: _angular_core.InputSignal<TableSize>;
|
|
1378
|
+
readonly variant: _angular_core.InputSignal<TableVariant>;
|
|
1379
|
+
readonly selection: _angular_core.InputSignal<SelectionMode>;
|
|
1380
|
+
readonly sortable: _angular_core.InputSignal<boolean>;
|
|
1381
|
+
readonly filterable: _angular_core.InputSignal<boolean>;
|
|
1382
|
+
readonly searchable: _angular_core.InputSignal<boolean>;
|
|
1383
|
+
readonly paginated: _angular_core.InputSignal<boolean>;
|
|
1384
|
+
readonly pageSize: _angular_core.InputSignal<number>;
|
|
1385
|
+
readonly resizable: _angular_core.InputSignal<boolean>;
|
|
1386
|
+
/**
|
|
1387
|
+
* Lets people rearrange the columns by dragging a header, or with its move
|
|
1388
|
+
* buttons (and Alt+Arrow on a focused header). Adds "Reset column order" to
|
|
1389
|
+
* the Columns menu.
|
|
1390
|
+
*
|
|
1391
|
+
* - `true` / `"always"`: movable at any time; the move buttons appear on
|
|
1392
|
+
* hover and focus.
|
|
1393
|
+
* - `"toggle"`: movable only in a reorder mode, switched from the toolbar.
|
|
1394
|
+
*
|
|
1395
|
+
* The table's own columns (selection, row actions) and pinned columns stay
|
|
1396
|
+
* where they are.
|
|
1397
|
+
*/
|
|
1398
|
+
readonly reorderable: _angular_core.InputSignal<ReorderSetting>;
|
|
1399
|
+
readonly hideableColumns: _angular_core.InputSignal<boolean>;
|
|
1400
|
+
readonly sortMenu: _angular_core.InputSignal<boolean>;
|
|
1401
|
+
readonly exportable: _angular_core.InputSignal<boolean>;
|
|
1402
|
+
readonly virtual: _angular_core.InputSignal<boolean | VirtualConfig>;
|
|
1403
|
+
readonly maxHeight: _angular_core.InputSignal<string | number>;
|
|
1404
|
+
readonly loading: _angular_core.InputSignal<boolean>;
|
|
1405
|
+
readonly error: _angular_core.InputSignal<AngularNode>;
|
|
1406
|
+
readonly empty: _angular_core.InputSignal<EmptyStateConfig>;
|
|
1407
|
+
readonly manual: _angular_core.InputSignal<boolean>;
|
|
1408
|
+
readonly rowCount: _angular_core.InputSignal<number>;
|
|
1409
|
+
readonly onQueryChange: _angular_core.InputSignal<(query: DataTableQuery) => void>;
|
|
1410
|
+
readonly onLoadMore: _angular_core.InputSignal<() => void>;
|
|
1411
|
+
readonly onRowClick: _angular_core.InputSignal<(row: T) => void>;
|
|
1412
|
+
readonly onEdit: _angular_core.InputSignal<(patch: TableEditPatch<T>) => void | Promise<void>>;
|
|
1413
|
+
readonly rowActions: _angular_core.InputSignal<RowAction<T>[]>;
|
|
1414
|
+
readonly bulkActions: _angular_core.InputSignal<BulkAction<T>[]>;
|
|
1415
|
+
readonly actions: _angular_core.InputSignal<TableAction[]>;
|
|
1416
|
+
readonly detail: _angular_core.InputSignal<DetailConfig<T>>;
|
|
1417
|
+
readonly responsive: _angular_core.InputSignal<ResponsiveConfig>;
|
|
1418
|
+
readonly defaultSorting: _angular_core.InputSignal<{
|
|
1419
|
+
id: string;
|
|
1420
|
+
desc: boolean;
|
|
1421
|
+
}[]>;
|
|
1422
|
+
readonly defaultColumnVisibility: _angular_core.InputSignal<Record<string, boolean>>;
|
|
1423
|
+
readonly defaultFilters: _angular_core.InputSignal<TableFilterInput[]>;
|
|
1424
|
+
/** Every input, as the one object the shared factory reads. */
|
|
1425
|
+
private readonly options;
|
|
1426
|
+
private readonly injector;
|
|
1427
|
+
/**
|
|
1428
|
+
* Public because the provider above reads it; not part of the template API.
|
|
1429
|
+
*
|
|
1430
|
+
* Built in `ngOnInit` rather than in a field initialiser, and that is forced
|
|
1431
|
+
* rather than chosen: `createDataTable` reads `data`, `columns` and `label`
|
|
1432
|
+
* immediately — `injectTable` has to construct a table out of them — and a
|
|
1433
|
+
* **required input has no value during construction**. Angular says so
|
|
1434
|
+
* outright (NG0950), and the table simply failed to bootstrap.
|
|
1435
|
+
*
|
|
1436
|
+
* `runInInjectionContext` because `ngOnInit` is not one, and the factory needs
|
|
1437
|
+
* `inject` for `DestroyRef`, `injectTable` and `injectVirtualizer`. The
|
|
1438
|
+
* provider above resolves lazily — a child injects it while the view is being
|
|
1439
|
+
* created, which is after this has run.
|
|
1440
|
+
*/
|
|
1441
|
+
private created;
|
|
1442
|
+
/**
|
|
1443
|
+
* Built on first ask rather than in `ngOnInit`, so the order between this
|
|
1444
|
+
* component's lifecycle and a child part's injection stops mattering. Either
|
|
1445
|
+
* way the inputs are set by the time it runs, which is the whole constraint.
|
|
1446
|
+
*/
|
|
1447
|
+
ensureApi(): DataTableApi<T>;
|
|
1448
|
+
ngOnInit(): void;
|
|
1449
|
+
protected readonly cards: _angular_core.Signal<boolean>;
|
|
1450
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UioDataTable<any>, never>;
|
|
1451
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UioDataTable<any>, "div[uioDataTable]", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "captionVisible": { "alias": "captionVisible"; "required": false; "isSignal": true; }; "getRowId": { "alias": "getRowId"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "selection": { "alias": "selection"; "required": false; "isSignal": true; }; "sortable": { "alias": "sortable"; "required": false; "isSignal": true; }; "filterable": { "alias": "filterable"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "paginated": { "alias": "paginated"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "resizable": { "alias": "resizable"; "required": false; "isSignal": true; }; "reorderable": { "alias": "reorderable"; "required": false; "isSignal": true; }; "hideableColumns": { "alias": "hideableColumns"; "required": false; "isSignal": true; }; "sortMenu": { "alias": "sortMenu"; "required": false; "isSignal": true; }; "exportable": { "alias": "exportable"; "required": false; "isSignal": true; }; "virtual": { "alias": "virtual"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "empty": { "alias": "empty"; "required": false; "isSignal": true; }; "manual": { "alias": "manual"; "required": false; "isSignal": true; }; "rowCount": { "alias": "rowCount"; "required": false; "isSignal": true; }; "onQueryChange": { "alias": "onQueryChange"; "required": false; "isSignal": true; }; "onLoadMore": { "alias": "onLoadMore"; "required": false; "isSignal": true; }; "onRowClick": { "alias": "onRowClick"; "required": false; "isSignal": true; }; "onEdit": { "alias": "onEdit"; "required": false; "isSignal": true; }; "rowActions": { "alias": "rowActions"; "required": false; "isSignal": true; }; "bulkActions": { "alias": "bulkActions"; "required": false; "isSignal": true; }; "actions": { "alias": "actions"; "required": false; "isSignal": true; }; "detail": { "alias": "detail"; "required": false; "isSignal": true; }; "responsive": { "alias": "responsive"; "required": false; "isSignal": true; }; "defaultSorting": { "alias": "defaultSorting"; "required": false; "isSignal": true; }; "defaultColumnVisibility": { "alias": "defaultColumnVisibility"; "required": false; "isSignal": true; }; "defaultFilters": { "alias": "defaultFilters"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof UioTable; inputs: {}; outputs: {}; }]>;
|
|
1452
|
+
}
|
|
1453
|
+
|
|
1454
|
+
export { UIO_DATA_TABLE, UioDataTable, UioTable, UioTableActionsHeader, UioTableBody, UioTableCard, UioTableCards, UioTableCell, UioTableElementRef, UioTableEmpty, UioTableError, UioTableFilterChip, UioTableFilterEditor, UioTableFilterSheet, UioTableFilterSheetCondition, UioTableFilterValueEditor, UioTableFilters, UioTableHeadCell, UioTableHeader, UioTableLoading, UioTablePagination, UioTableProps, UioTableReorderToggle, UioTableResizeHandle, UioTableRow, UioTableRowActions, UioTableSelectAllCell, UioTableSelectCell, UioTableSelectionBar, UioTableSelectionFooter, UioTableSheetSection, UioTableSortSheet, UioTableSubBar, UioTableToolbar, UioTableViewport, actionsColumn, applyElementProps, createDataTable, createDeferred, focusAfterRemoval, injectDataTable, injectOptionalDataTable, provideDataTable, selectionColumn, trackStore };
|
|
1455
|
+
export type { AngularNode, BulkAction, DataTableApi, DetailApi, DetailConfig, EditApi, EmptyStateConfig, FilterableField, FiltersApi, FocusApi, HorizontalScrollApi, RenderRow, RowAction, SelectionApi, TableAction, TableColumn, TableEditRenderer, TableFilterInput, UseDataTableOptions, VirtualApi };
|