@cqa-lib/cqa-ui 1.1.538 → 1.1.540
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/esm2020/lib/table/dynamic-table/dynamic-table.component.mjs +1 -2
- package/esm2020/lib/templates/modular-table-template/folder-sidebar/folder-sidebar.component.mjs +151 -17
- package/esm2020/lib/templates/modular-table-template/modular-table-template.component.mjs +144 -12
- package/esm2020/lib/templates/modular-table-template/modular-table-template.models.mjs +1 -1
- package/fesm2015/cqa-lib-cqa-ui.mjs +285 -18
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +280 -17
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/templates/modular-table-template/folder-sidebar/folder-sidebar.component.d.ts +63 -2
- package/lib/templates/modular-table-template/modular-table-template.component.d.ts +60 -1
- package/lib/templates/modular-table-template/modular-table-template.models.d.ts +13 -0
- package/package.json +1 -1
- package/styles.css +1 -1
|
@@ -2,7 +2,11 @@ import { ChangeDetectorRef, EventEmitter, OnDestroy } from '@angular/core';
|
|
|
2
2
|
import { ConnectedPosition } from '@angular/cdk/overlay';
|
|
3
3
|
import { FolderNode, FolderRenamedPayload, ModularLabels } from '../modular-table-template.models';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
|
+
/** A row in the flattened sidebar tree. `kind` distinguishes real folder rows
|
|
6
|
+
* from the lazy-load affordances ('loading' spinner, 'load-more' button) that
|
|
7
|
+
* the `rows` getter interleaves inside an expanded subtree. */
|
|
5
8
|
interface RenderNode {
|
|
9
|
+
kind: 'folder' | 'loading' | 'load-more';
|
|
6
10
|
node: FolderNode;
|
|
7
11
|
depth: number;
|
|
8
12
|
visible: boolean;
|
|
@@ -23,11 +27,43 @@ export declare class FolderSidebarComponent implements OnDestroy {
|
|
|
23
27
|
showCounts: boolean;
|
|
24
28
|
collapsed: boolean;
|
|
25
29
|
labels: ModularLabels;
|
|
30
|
+
/** When true, the sidebar emits `searchChange` and skips its local name filter
|
|
31
|
+
* — the host is expected to swap `folders` with server-side search results.
|
|
32
|
+
* Default keeps the legacy client-side behaviour for callers that haven't
|
|
33
|
+
* opted into lazy loading yet. */
|
|
34
|
+
serverSideSearch: boolean;
|
|
35
|
+
/** Backend-reported total root folders. When `folders.length < rootTotal` the
|
|
36
|
+
* sidebar renders a top-level "Load more" affordance after the tree. */
|
|
37
|
+
rootTotal: number;
|
|
38
|
+
/** True while a server-side folder-search request is in flight. The sidebar
|
|
39
|
+
* shows a spinner next to the search input so the user can tell typing
|
|
40
|
+
* has been registered. */
|
|
41
|
+
folderSearchLoading: boolean;
|
|
42
|
+
/** True while a root-page fetch is in flight (initial load OR scroll-driven
|
|
43
|
+
* pagination). When set with no folders yet, the sidebar shows a centered
|
|
44
|
+
* spinner; when set during pagination, a small spinner appears at the
|
|
45
|
+
* bottom of the tree. */
|
|
46
|
+
rootFoldersLoading: boolean;
|
|
26
47
|
folderSelected: EventEmitter<number>;
|
|
27
48
|
folderExpansionToggled: EventEmitter<{
|
|
28
49
|
id: number;
|
|
29
50
|
expanded: boolean;
|
|
30
51
|
}>;
|
|
52
|
+
/** Lazy-load: fires when the user expands a node whose children haven't been
|
|
53
|
+
* fetched yet (`hasChildren === true && loadedPages === undefined`). Host
|
|
54
|
+
* responds by calling its `loadFolderChildren(id, 0)`. */
|
|
55
|
+
folderChildrenRequested: EventEmitter<number>;
|
|
56
|
+
/** Lazy-load: fires when the user clicks the per-folder "Load more" row.
|
|
57
|
+
* Host responds by calling `loadFolderChildren(id, nextPage)`. */
|
|
58
|
+
folderLoadMoreRequested: EventEmitter<{
|
|
59
|
+
id: number;
|
|
60
|
+
nextPage: number;
|
|
61
|
+
}>;
|
|
62
|
+
/** Debounced search-input value. Always emitted; only consumed by hosts that
|
|
63
|
+
* set `serverSideSearch=true` to re-fetch the tree from the backend. */
|
|
64
|
+
searchChange: EventEmitter<string>;
|
|
65
|
+
/** Lazy-load: user clicked the top-level "Load more" affordance for roots. */
|
|
66
|
+
rootLoadMoreRequested: EventEmitter<void>;
|
|
31
67
|
/** Emitted after the host completes folder creation (e.g., inline rename flow). Reserved for future use. */
|
|
32
68
|
folderCreated: EventEmitter<{
|
|
33
69
|
parentId: number | null;
|
|
@@ -61,6 +97,10 @@ export declare class FolderSidebarComponent implements OnDestroy {
|
|
|
61
97
|
}>;
|
|
62
98
|
collapsedChange: EventEmitter<boolean>;
|
|
63
99
|
searchValue: string;
|
|
100
|
+
/** Debounce timer for `searchChange` emissions; cleared on each keystroke so
|
|
101
|
+
* the host only re-fetches once the user pauses typing. */
|
|
102
|
+
private searchEmitTimer;
|
|
103
|
+
private static readonly SEARCH_DEBOUNCE_MS;
|
|
64
104
|
renamingId: number | null;
|
|
65
105
|
renameDraft: string;
|
|
66
106
|
/** Inline rename uses the same name rules as the New Folder dialog. */
|
|
@@ -99,6 +139,27 @@ export declare class FolderSidebarComponent implements OnDestroy {
|
|
|
99
139
|
isExpanded(id: number): boolean;
|
|
100
140
|
isSelected(id: number | null): boolean;
|
|
101
141
|
onToggle(n: FolderNode, event: Event): void;
|
|
142
|
+
/** Search input handler: updates the local `searchValue` immediately (so the
|
|
143
|
+
* input stays responsive) and debounces `searchChange` emissions so a host
|
|
144
|
+
* doing server-side search fires at most one request per pause. */
|
|
145
|
+
onSearchInput(term: string): void;
|
|
146
|
+
/** Search input clear handler: flushes the debounce so the host sees an
|
|
147
|
+
* empty term immediately and can restore the lazy tree. */
|
|
148
|
+
onSearchClear(): void;
|
|
149
|
+
/** Lazy-load: user clicked the per-folder "Load more" row. The sidebar tracks
|
|
150
|
+
* pagination via `node.loadedPages`; the next page is loadedPages + 1. */
|
|
151
|
+
onLoadMore(n: FolderNode): void;
|
|
152
|
+
/** Cached `folders.length` at the moment we last emitted `rootLoadMoreRequested`.
|
|
153
|
+
* Used to throttle the scroll-based pagination so we don't re-emit until the
|
|
154
|
+
* host has actually appended a new page. */
|
|
155
|
+
private lastRootLoadEmittedAt;
|
|
156
|
+
/** Threshold (px) for "near the bottom" — emit a load-more once the scroll
|
|
157
|
+
* position is within this many px of the end. */
|
|
158
|
+
private static readonly SCROLL_LOAD_THRESHOLD_PX;
|
|
159
|
+
/** Vertical-scroll handler for the root-folder list. Fires `rootLoadMoreRequested`
|
|
160
|
+
* when the user scrolls within the threshold of the bottom and more roots
|
|
161
|
+
* are available on the backend. Suppressed during sidebar search. */
|
|
162
|
+
onTreeScroll(event: Event): void;
|
|
102
163
|
onSelect(n: FolderNode | null): void;
|
|
103
164
|
onSelectUnorganised(): void;
|
|
104
165
|
beginRename(n: FolderNode, event: Event): void;
|
|
@@ -162,7 +223,7 @@ export declare class FolderSidebarComponent implements OnDestroy {
|
|
|
162
223
|
private isDescendantOf;
|
|
163
224
|
private clearAllExpandTimers;
|
|
164
225
|
ngOnDestroy(): void;
|
|
165
|
-
trackByRow: (_: number, row: RenderNode) =>
|
|
226
|
+
trackByRow: (_: number, row: RenderNode) => string;
|
|
166
227
|
onRowKeydown(event: KeyboardEvent, row: RenderNode, index: number): void;
|
|
167
228
|
private focusRowElement;
|
|
168
229
|
/**
|
|
@@ -172,6 +233,6 @@ export declare class FolderSidebarComponent implements OnDestroy {
|
|
|
172
233
|
*/
|
|
173
234
|
private focusRenameInput;
|
|
174
235
|
static ɵfac: i0.ɵɵFactoryDeclaration<FolderSidebarComponent, never>;
|
|
175
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<FolderSidebarComponent, "cqa-folder-sidebar", never, { "folders": "folders"; "selectedFolderId": "selectedFolderId"; "expandedFolderIds": "expandedFolderIds"; "unorganisedCount": "unorganisedCount"; "allowCreate": "allowCreate"; "allowRename": "allowRename"; "allowDelete": "allowDelete"; "allowMove": "allowMove"; "allowDuplicate": "allowDuplicate"; "allowDrop": "allowDrop"; "showCounts": "showCounts"; "collapsed": "collapsed"; "labels": "labels"; }, { "folderSelected": "folderSelected"; "folderExpansionToggled": "folderExpansionToggled"; "folderCreated": "folderCreated"; "folderCreateRequested": "folderCreateRequested"; "folderRenamed": "folderRenamed"; "folderDeleted": "folderDeleted"; "folderMoveRequested": "folderMoveRequested"; "folderDuplicateRequested": "folderDuplicateRequested"; "testsDropped": "testsDropped"; "folderDropped": "folderDropped"; "collapsedChange": "collapsedChange"; }, never, never>;
|
|
236
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FolderSidebarComponent, "cqa-folder-sidebar", never, { "folders": "folders"; "selectedFolderId": "selectedFolderId"; "expandedFolderIds": "expandedFolderIds"; "unorganisedCount": "unorganisedCount"; "allowCreate": "allowCreate"; "allowRename": "allowRename"; "allowDelete": "allowDelete"; "allowMove": "allowMove"; "allowDuplicate": "allowDuplicate"; "allowDrop": "allowDrop"; "showCounts": "showCounts"; "collapsed": "collapsed"; "labels": "labels"; "serverSideSearch": "serverSideSearch"; "rootTotal": "rootTotal"; "folderSearchLoading": "folderSearchLoading"; "rootFoldersLoading": "rootFoldersLoading"; }, { "folderSelected": "folderSelected"; "folderExpansionToggled": "folderExpansionToggled"; "folderChildrenRequested": "folderChildrenRequested"; "folderLoadMoreRequested": "folderLoadMoreRequested"; "searchChange": "searchChange"; "rootLoadMoreRequested": "rootLoadMoreRequested"; "folderCreated": "folderCreated"; "folderCreateRequested": "folderCreateRequested"; "folderRenamed": "folderRenamed"; "folderDeleted": "folderDeleted"; "folderMoveRequested": "folderMoveRequested"; "folderDuplicateRequested": "folderDuplicateRequested"; "testsDropped": "testsDropped"; "folderDropped": "folderDropped"; "collapsedChange": "collapsedChange"; }, never, never>;
|
|
176
237
|
}
|
|
177
238
|
export {};
|
|
@@ -124,6 +124,33 @@ export declare class ModularTableTemplateComponent implements OnInit, OnChanges,
|
|
|
124
124
|
modularLabels: ModularLabels;
|
|
125
125
|
bulkActions: TableAction[];
|
|
126
126
|
sidebarCollapsed: boolean;
|
|
127
|
+
/** Lazy-load: when true, the sidebar emits `searchChange` and skips its
|
|
128
|
+
* local name filter so the host can serve search results from the backend. */
|
|
129
|
+
serverSideSearch: boolean;
|
|
130
|
+
/** Lazy-load: backend-reported total root folders. Drives the sidebar's
|
|
131
|
+
* top-level "Load more" affordance when `folders.length < rootTotal`. */
|
|
132
|
+
rootTotal: number;
|
|
133
|
+
/** Lazy-load: true while the host is fetching server-side folder-search
|
|
134
|
+
* results. Forwarded to the sidebar so it can render a search spinner. */
|
|
135
|
+
folderSearchLoading: boolean;
|
|
136
|
+
/** Lazy-load: true while a root-page fetch is in flight (initial load OR
|
|
137
|
+
* the scroll-driven "load more" pagination). Drives the loading indicator
|
|
138
|
+
* the modular grid renders at the right edge of the Organised row, and is
|
|
139
|
+
* forwarded to the sidebar for its own loading affordance. */
|
|
140
|
+
rootFoldersLoading: boolean;
|
|
141
|
+
/** Override for the currently-selected folder node. Used as a fallback when
|
|
142
|
+
* `findFolder(folders, selectedFolderId)` misses — e.g., during sidebar
|
|
143
|
+
* search when `folders` holds only the matched results, the selected
|
|
144
|
+
* folder may not be among them, but its breadcrumb / header label still
|
|
145
|
+
* needs to render. The host owns the lookup against its full folder map. */
|
|
146
|
+
selectedFolderNode: FolderNode | null;
|
|
147
|
+
/** Host-provided breadcrumb snapshot for the selected folder. Used as a
|
|
148
|
+
* fallback in `breadcrumbTrail` when `buildTrail` against `this.folders`
|
|
149
|
+
* yields empty — the canonical case is sidebar search, where `folders`
|
|
150
|
+
* is the search-results list and the selected folder's ancestors aren't
|
|
151
|
+
* present. The host walks `parentId` chains to build this; partial trails
|
|
152
|
+
* are acceptable when ancestors haven't been fetched yet. */
|
|
153
|
+
selectedFolderTrail: FolderNode[] | null;
|
|
127
154
|
/**
|
|
128
155
|
* When true (default), the library opens its own Move dialog for convenience
|
|
129
156
|
* during testing. Hosts taking over API + UX should set this to `false` and
|
|
@@ -135,6 +162,19 @@ export declare class ModularTableTemplateComponent implements OnInit, OnChanges,
|
|
|
135
162
|
id: number;
|
|
136
163
|
expanded: boolean;
|
|
137
164
|
}>;
|
|
165
|
+
/** Lazy-load: re-emitted from the sidebar when the user expands a node whose
|
|
166
|
+
* children haven't been fetched yet. Host responds by fetching that subtree. */
|
|
167
|
+
folderChildrenRequested: EventEmitter<number>;
|
|
168
|
+
/** Lazy-load: re-emitted when the user clicks the per-folder "Load more". */
|
|
169
|
+
folderLoadMoreRequested: EventEmitter<{
|
|
170
|
+
id: number;
|
|
171
|
+
nextPage: number;
|
|
172
|
+
}>;
|
|
173
|
+
/** Lazy-load: re-emitted when the user clicks the top-level "Load more". */
|
|
174
|
+
rootLoadMoreRequested: EventEmitter<void>;
|
|
175
|
+
/** Lazy-load: debounced sidebar-search term. Consumed by hosts that have
|
|
176
|
+
* set `serverSideSearch=true` to refetch the tree from the backend. */
|
|
177
|
+
folderSearchChange: EventEmitter<string>;
|
|
138
178
|
folderCreated: EventEmitter<FolderCreatedPayload>;
|
|
139
179
|
/** Emitted when the user clicks "+ New folder"; host should open a creation modal. */
|
|
140
180
|
folderCreateRequested: EventEmitter<{
|
|
@@ -374,6 +414,25 @@ export declare class ModularTableTemplateComponent implements OnInit, OnChanges,
|
|
|
374
414
|
id: number;
|
|
375
415
|
expanded: boolean;
|
|
376
416
|
}): void;
|
|
417
|
+
/** Tracks the `folders.length` at which we last emitted `rootLoadMoreRequested`
|
|
418
|
+
* from the Organized grid scroll, so rapid scroll events don't spam the host
|
|
419
|
+
* before it has had a chance to append the next page. */
|
|
420
|
+
private lastRootGridLoadAt;
|
|
421
|
+
/** Tracks the `currentFolderNode.children.length` at which we last emitted
|
|
422
|
+
* `folderLoadMoreRequested` from the Subfolders grid scroll, for the same
|
|
423
|
+
* reason as `lastRootGridLoadAt`. */
|
|
424
|
+
private lastSubfolderGridLoadAt;
|
|
425
|
+
private static readonly GRID_SCROLL_LOAD_THRESHOLD_PX;
|
|
426
|
+
/** Horizontal-scroll handler for the "Organised" root tiles. Emits
|
|
427
|
+
* `rootLoadMoreRequested` when the user scrolls within
|
|
428
|
+
* `GRID_SCROLL_LOAD_THRESHOLD_PX` of the right edge AND more roots are
|
|
429
|
+
* available on the backend. Throttled by `lastRootGridLoadAt`. */
|
|
430
|
+
onRootGridScroll(event: Event): void;
|
|
431
|
+
/** Horizontal-scroll handler for the "Subfolders in X" tiles. Emits
|
|
432
|
+
* `folderLoadMoreRequested({ id: selectedFolderId, nextPage })` when the
|
|
433
|
+
* user scrolls within threshold of the right edge AND the active folder
|
|
434
|
+
* has more children on the backend than have been loaded. */
|
|
435
|
+
onSubfolderGridScroll(event: Event): void;
|
|
377
436
|
onFolderCreated(payload: FolderCreatedPayload): void;
|
|
378
437
|
onFolderCreateRequested(payload: {
|
|
379
438
|
parentId: number | null;
|
|
@@ -461,5 +520,5 @@ export declare class ModularTableTemplateComponent implements OnInit, OnChanges,
|
|
|
461
520
|
*/
|
|
462
521
|
buildRowDragPayload: (row: any) => Array<string | number>;
|
|
463
522
|
static ɵfac: i0.ɵɵFactoryDeclaration<ModularTableTemplateComponent, never>;
|
|
464
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ModularTableTemplateComponent, "cqa-modular-table-template", never, { "searchPlaceholder": "searchPlaceholder"; "searchValue": "searchValue"; "showClear": "showClear"; "showSearchBar": "showSearchBar"; "showExportButton": "showExportButton"; "isExporting": "isExporting"; "filterConfig": "filterConfig"; "filterModel": "filterModel"; "showFilterPanel": "showFilterPanel"; "showFilterButton": "showFilterButton"; "otherButtons": "otherButtons"; "otherDropDownButtons": "otherDropDownButtons"; "otherSelectDropDownButtons": "otherSelectDropDownButtons"; "otherButtonLabel": "otherButtonLabel"; "otherButtonVariant": "otherButtonVariant"; "showOtherButton": "showOtherButton"; "showActionButton": "showActionButton"; "showSettingsButton": "showSettingsButton"; "showAutoRefreshButton": "showAutoRefreshButton"; "showViewModeToggle": "showViewModeToggle"; "viewMode": "viewMode"; "viewModeLabels": "viewModeLabels"; "data": "data"; "isEmptyState": "isEmptyState"; "emptyStateConfig": "emptyStateConfig"; "actions": "actions"; "chips": "chips"; "filterApplied": "filterApplied"; "columns": "columns"; "rowSelectable": "rowSelectable"; "selectedAutoRefreshInterval": "selectedAutoRefreshInterval"; "pageIndex": "pageIndex"; "pageSize": "pageSize"; "pageSizeOptions": "pageSizeOptions"; "pageSizeMenuDirection": "pageSizeMenuDirection"; "serverSidePagination": "serverSidePagination"; "totalElements": "totalElements"; "enableLocalSort": "enableLocalSort"; "isTableLoading": "isTableLoading"; "isTableDataLoading": "isTableDataLoading"; "cellJsonPathGetter": "cellJsonPathGetter"; "onJsonPathCopiedHandler": "onJsonPathCopiedHandler"; "selectedItems": "selectedItems"; "showSelectAllInToolbar": "showSelectAllInToolbar"; "showDismissInToolbar": "showDismissInToolbar"; "allSelectedInToolbar": "allSelectedInToolbar"; "folders": "folders"; "selectedFolderId": "selectedFolderId"; "expandedFolderIds": "expandedFolderIds"; "unorganisedCount": "unorganisedCount"; "folderIdAccessor": "folderIdAccessor"; "modularConfig": "modularConfig"; "modularLabels": "modularLabels"; "bulkActions": "bulkActions"; "sidebarCollapsed": "sidebarCollapsed"; "useInternalDialogs": "useInternalDialogs"; "showReorderButton": "showReorderButton"; "reorderSaving": "reorderSaving"; "reorderLabels": "reorderLabels"; "columnVisibility": "columnVisibility"; }, { "onSearchChange": "onSearchChange"; "onExportClick": "onExportClick"; "onApplyFilterClick": "onApplyFilterClick"; "onResetFilterClick": "onResetFilterClick"; "onClearAll": "onClearAll"; "removeChip": "removeChip"; "viewModeChange": "viewModeChange"; "pageChange": "pageChange"; "sortChange": "sortChange"; "folderSelected": "folderSelected"; "folderExpansionToggled": "folderExpansionToggled"; "folderCreated": "folderCreated"; "folderCreateRequested": "folderCreateRequested"; "folderRenamed": "folderRenamed"; "folderDeleted": "folderDeleted"; "testsMoved": "testsMoved"; "bulkActionClick": "bulkActionClick"; "bulkSelectAllChange": "bulkSelectAllChange"; "bulkDismiss": "bulkDismiss"; "bulkActionInvoked": "bulkActionInvoked"; "sidebarCollapsedChange": "sidebarCollapsedChange"; "reorderStart": "reorderStart"; "reorderCancel": "reorderCancel"; "reorderSave": "reorderSave"; "moveRequested": "moveRequested"; "selectedItemsChange": "selectedItemsChange"; "folderDeleteRequested": "folderDeleteRequested"; "folderMoveRequested": "folderMoveRequested"; "folderMoved": "folderMoved"; "folderDuplicateRequested": "folderDuplicateRequested"; "onReload": "onReload"; "onAutoRefreshClick": "onAutoRefreshClick"; "columnVisibilityChange": "columnVisibilityChange"; "autoRefreshIntervalChange": "autoRefreshIntervalChange"; }, never, never>;
|
|
523
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ModularTableTemplateComponent, "cqa-modular-table-template", never, { "searchPlaceholder": "searchPlaceholder"; "searchValue": "searchValue"; "showClear": "showClear"; "showSearchBar": "showSearchBar"; "showExportButton": "showExportButton"; "isExporting": "isExporting"; "filterConfig": "filterConfig"; "filterModel": "filterModel"; "showFilterPanel": "showFilterPanel"; "showFilterButton": "showFilterButton"; "otherButtons": "otherButtons"; "otherDropDownButtons": "otherDropDownButtons"; "otherSelectDropDownButtons": "otherSelectDropDownButtons"; "otherButtonLabel": "otherButtonLabel"; "otherButtonVariant": "otherButtonVariant"; "showOtherButton": "showOtherButton"; "showActionButton": "showActionButton"; "showSettingsButton": "showSettingsButton"; "showAutoRefreshButton": "showAutoRefreshButton"; "showViewModeToggle": "showViewModeToggle"; "viewMode": "viewMode"; "viewModeLabels": "viewModeLabels"; "data": "data"; "isEmptyState": "isEmptyState"; "emptyStateConfig": "emptyStateConfig"; "actions": "actions"; "chips": "chips"; "filterApplied": "filterApplied"; "columns": "columns"; "rowSelectable": "rowSelectable"; "selectedAutoRefreshInterval": "selectedAutoRefreshInterval"; "pageIndex": "pageIndex"; "pageSize": "pageSize"; "pageSizeOptions": "pageSizeOptions"; "pageSizeMenuDirection": "pageSizeMenuDirection"; "serverSidePagination": "serverSidePagination"; "totalElements": "totalElements"; "enableLocalSort": "enableLocalSort"; "isTableLoading": "isTableLoading"; "isTableDataLoading": "isTableDataLoading"; "cellJsonPathGetter": "cellJsonPathGetter"; "onJsonPathCopiedHandler": "onJsonPathCopiedHandler"; "selectedItems": "selectedItems"; "showSelectAllInToolbar": "showSelectAllInToolbar"; "showDismissInToolbar": "showDismissInToolbar"; "allSelectedInToolbar": "allSelectedInToolbar"; "folders": "folders"; "selectedFolderId": "selectedFolderId"; "expandedFolderIds": "expandedFolderIds"; "unorganisedCount": "unorganisedCount"; "folderIdAccessor": "folderIdAccessor"; "modularConfig": "modularConfig"; "modularLabels": "modularLabels"; "bulkActions": "bulkActions"; "sidebarCollapsed": "sidebarCollapsed"; "serverSideSearch": "serverSideSearch"; "rootTotal": "rootTotal"; "folderSearchLoading": "folderSearchLoading"; "rootFoldersLoading": "rootFoldersLoading"; "selectedFolderNode": "selectedFolderNode"; "selectedFolderTrail": "selectedFolderTrail"; "useInternalDialogs": "useInternalDialogs"; "showReorderButton": "showReorderButton"; "reorderSaving": "reorderSaving"; "reorderLabels": "reorderLabels"; "columnVisibility": "columnVisibility"; }, { "onSearchChange": "onSearchChange"; "onExportClick": "onExportClick"; "onApplyFilterClick": "onApplyFilterClick"; "onResetFilterClick": "onResetFilterClick"; "onClearAll": "onClearAll"; "removeChip": "removeChip"; "viewModeChange": "viewModeChange"; "pageChange": "pageChange"; "sortChange": "sortChange"; "folderSelected": "folderSelected"; "folderExpansionToggled": "folderExpansionToggled"; "folderChildrenRequested": "folderChildrenRequested"; "folderLoadMoreRequested": "folderLoadMoreRequested"; "rootLoadMoreRequested": "rootLoadMoreRequested"; "folderSearchChange": "folderSearchChange"; "folderCreated": "folderCreated"; "folderCreateRequested": "folderCreateRequested"; "folderRenamed": "folderRenamed"; "folderDeleted": "folderDeleted"; "testsMoved": "testsMoved"; "bulkActionClick": "bulkActionClick"; "bulkSelectAllChange": "bulkSelectAllChange"; "bulkDismiss": "bulkDismiss"; "bulkActionInvoked": "bulkActionInvoked"; "sidebarCollapsedChange": "sidebarCollapsedChange"; "reorderStart": "reorderStart"; "reorderCancel": "reorderCancel"; "reorderSave": "reorderSave"; "moveRequested": "moveRequested"; "selectedItemsChange": "selectedItemsChange"; "folderDeleteRequested": "folderDeleteRequested"; "folderMoveRequested": "folderMoveRequested"; "folderMoved": "folderMoved"; "folderDuplicateRequested": "folderDuplicateRequested"; "onReload": "onReload"; "onAutoRefreshClick": "onAutoRefreshClick"; "columnVisibilityChange": "columnVisibilityChange"; "autoRefreshIntervalChange": "autoRefreshIntervalChange"; }, never, never>;
|
|
465
524
|
}
|
|
@@ -7,6 +7,19 @@ export interface FolderNode {
|
|
|
7
7
|
totalCount?: number;
|
|
8
8
|
color?: string;
|
|
9
9
|
children?: FolderNode[];
|
|
10
|
+
/** Backend hint: true when this node has at least one direct child. Drives
|
|
11
|
+
* the sidebar chevron under lazy loading, so the affordance shows even
|
|
12
|
+
* before `children` has been fetched. */
|
|
13
|
+
hasChildren?: boolean;
|
|
14
|
+
/** Backend-reported total number of direct children. The sidebar shows a
|
|
15
|
+
* "Load more" row when `(children?.length ?? 0) < totalChildren`. */
|
|
16
|
+
totalChildren?: number;
|
|
17
|
+
/** Last 0-based page already fetched into `children`. `undefined` means the
|
|
18
|
+
* subtree has not been loaded yet — the host should fetch on first expand. */
|
|
19
|
+
loadedPages?: number;
|
|
20
|
+
/** True while a children-page fetch is in flight, so the sidebar can render
|
|
21
|
+
* a spinner row and the host can suppress duplicate requests. */
|
|
22
|
+
childrenLoading?: boolean;
|
|
10
23
|
}
|
|
11
24
|
export declare type FolderIdAccessor = (row: any) => number | null | undefined;
|
|
12
25
|
export interface ModularConfig {
|