@gtkx/components 1.0.0-rc.3 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -9
- package/dist/adw/combo-row.d.ts +1 -0
- package/dist/adw/combo-row.d.ts.map +1 -1
- package/dist/adw/combo-row.js.map +1 -1
- package/dist/adw/types.d.ts +2 -1
- package/dist/adw/types.d.ts.map +1 -1
- package/dist/adw/types.js.map +1 -1
- package/dist/column-view.d.ts +2 -2
- package/dist/column-view.d.ts.map +1 -1
- package/dist/column-view.js +15 -13
- package/dist/column-view.js.map +1 -1
- package/dist/drop-down.d.ts +1 -0
- package/dist/drop-down.d.ts.map +1 -1
- package/dist/drop-down.js.map +1 -1
- package/dist/grid-view.js +2 -2
- package/dist/grid-view.js.map +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/internal/cells.d.ts +32 -24
- package/dist/internal/cells.d.ts.map +1 -1
- package/dist/internal/cells.js +168 -77
- package/dist/internal/cells.js.map +1 -1
- package/dist/internal/collection-index.d.ts +9 -13
- package/dist/internal/collection-index.d.ts.map +1 -1
- package/dist/internal/collection-index.js +33 -70
- package/dist/internal/collection-index.js.map +1 -1
- package/dist/internal/collection-model.d.ts +23 -2
- package/dist/internal/collection-model.d.ts.map +1 -1
- package/dist/internal/collection-model.js +210 -98
- package/dist/internal/collection-model.js.map +1 -1
- package/dist/internal/collection.d.ts +9 -12
- package/dist/internal/collection.d.ts.map +1 -1
- package/dist/internal/collection.js +38 -49
- package/dist/internal/collection.js.map +1 -1
- package/dist/internal/controlled-sync.d.ts +11 -0
- package/dist/internal/controlled-sync.d.ts.map +1 -0
- package/dist/internal/controlled-sync.js +19 -0
- package/dist/internal/controlled-sync.js.map +1 -0
- package/dist/internal/drop-down.d.ts.map +1 -1
- package/dist/internal/drop-down.js +27 -15
- package/dist/internal/drop-down.js.map +1 -1
- package/dist/internal/expansion.d.ts +3 -2
- package/dist/internal/expansion.d.ts.map +1 -1
- package/dist/internal/expansion.js +80 -47
- package/dist/internal/expansion.js.map +1 -1
- package/dist/internal/keys.d.ts +5 -0
- package/dist/internal/keys.d.ts.map +1 -0
- package/dist/internal/keys.js +13 -0
- package/dist/internal/keys.js.map +1 -0
- package/dist/internal/selection.d.ts +3 -2
- package/dist/internal/selection.d.ts.map +1 -1
- package/dist/internal/selection.js +68 -35
- package/dist/internal/selection.js.map +1 -1
- package/dist/internal/slots.d.ts +10 -0
- package/dist/internal/slots.d.ts.map +1 -0
- package/dist/internal/slots.js +43 -0
- package/dist/internal/slots.js.map +1 -0
- package/dist/internal/tree-expansion.d.ts +20 -0
- package/dist/internal/tree-expansion.d.ts.map +1 -0
- package/dist/internal/tree-expansion.js +68 -0
- package/dist/internal/tree-expansion.js.map +1 -0
- package/dist/internal/tree-order.d.ts +27 -0
- package/dist/internal/tree-order.d.ts.map +1 -0
- package/dist/internal/tree-order.js +71 -0
- package/dist/internal/tree-order.js.map +1 -0
- package/dist/internal/use-collection.d.ts +5 -5
- package/dist/internal/use-collection.d.ts.map +1 -1
- package/dist/internal/use-collection.js +6 -6
- package/dist/internal/use-collection.js.map +1 -1
- package/dist/list-view.d.ts.map +1 -1
- package/dist/list-view.js +6 -6
- package/dist/list-view.js.map +1 -1
- package/dist/types.d.ts +127 -54
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +7 -7
- package/src/adw/combo-row.tsx +1 -0
- package/src/adw/types.ts +2 -1
- package/src/column-view.tsx +38 -35
- package/src/drop-down.tsx +1 -0
- package/src/grid-view.tsx +2 -2
- package/src/index.ts +10 -11
- package/src/internal/cells.tsx +345 -123
- package/src/internal/collection-index.ts +51 -99
- package/src/internal/collection-model.ts +259 -110
- package/src/internal/collection.ts +46 -68
- package/src/internal/controlled-sync.ts +34 -0
- package/src/internal/drop-down.tsx +44 -23
- package/src/internal/expansion.ts +104 -67
- package/src/internal/keys.ts +18 -0
- package/src/internal/selection.tsx +100 -51
- package/src/internal/slots.ts +67 -0
- package/src/internal/tree-expansion.ts +110 -0
- package/src/internal/tree-order.ts +138 -0
- package/src/internal/use-collection.tsx +11 -11
- package/src/list-view.tsx +14 -10
- package/src/types.ts +140 -65
- package/dist/size-group.d.ts +0 -12
- package/dist/size-group.d.ts.map +0 -1
- package/dist/size-group.js +0 -41
- package/dist/size-group.js.map +0 -1
- package/src/size-group.tsx +0 -77
package/src/column-view.tsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ReactNode } from "react";
|
|
1
|
+
import type { ReactNode, RefObject } from "react";
|
|
2
2
|
import * as Gtk from "@gtkx/gi/gtk";
|
|
3
3
|
import { GtkColumnView, GtkColumnViewColumn, GtkCustomSorter, GtkSignalListItemFactory } from "@gtkx/jsx/gtk";
|
|
4
4
|
import { useSignal } from "@gtkx/react";
|
|
@@ -6,40 +6,37 @@ import { omit } from "@gtkx/utils";
|
|
|
6
6
|
import { useLayoutEffect, useRef } from "react";
|
|
7
7
|
import type { CellSize } from "./internal/cells.js";
|
|
8
8
|
import type { Collection } from "./internal/collection.js";
|
|
9
|
-
import type {
|
|
10
|
-
import {
|
|
9
|
+
import type { ColumnViewColumn, ColumnViewProps, ExpanderDescriptions, SortProps } from "./types.js";
|
|
10
|
+
import { ItemPortals, useItemCells, useRowProps, useSectionHeader } from "./internal/cells.js";
|
|
11
11
|
import { useCollection } from "./internal/use-collection.js";
|
|
12
12
|
import { useWidgetRef } from "./internal/use-widget-ref.js";
|
|
13
13
|
|
|
14
|
-
type SortProps = {
|
|
15
|
-
sortColumn?: string | null | undefined;
|
|
16
|
-
sortOrder?: Gtk.SortType | null | undefined;
|
|
17
|
-
onSortChanged?: ((column: string | null, order: Gtk.SortType) => void) | null | undefined;
|
|
18
|
-
};
|
|
19
|
-
|
|
20
14
|
type SortTarget = { view: Gtk.ColumnView; column: Gtk.ColumnViewColumn | null };
|
|
21
15
|
|
|
22
16
|
type ColumnCellsProps = {
|
|
23
|
-
column:
|
|
17
|
+
column: ColumnViewColumn<never>;
|
|
24
18
|
collection: Collection;
|
|
25
19
|
expandedIds: string[] | null | undefined;
|
|
20
|
+
expanderDescriptions: ExpanderDescriptions | null | undefined;
|
|
26
21
|
size: CellSize;
|
|
27
22
|
};
|
|
28
23
|
|
|
29
24
|
type ColumnListProps = Omit<ColumnCellsProps, "column"> & {
|
|
30
|
-
columns:
|
|
25
|
+
columns: ColumnViewColumn<never>[];
|
|
31
26
|
};
|
|
32
27
|
|
|
33
28
|
const COLUMN_VIEW_PROPS = [
|
|
34
29
|
"items",
|
|
35
30
|
"sections",
|
|
36
31
|
"renderHeader",
|
|
32
|
+
"rowProps",
|
|
37
33
|
"columns",
|
|
38
34
|
"selectedIds",
|
|
39
35
|
"onSelectionChanged",
|
|
40
36
|
"selectionMode",
|
|
41
37
|
"expandedIds",
|
|
42
38
|
"onExpandedChange",
|
|
39
|
+
"expanderDescriptions",
|
|
43
40
|
"sortColumn",
|
|
44
41
|
"sortOrder",
|
|
45
42
|
"onSortChanged",
|
|
@@ -77,7 +74,7 @@ const getSortTarget = (view: Gtk.ColumnView | null, sortColumn: string | null |
|
|
|
77
74
|
};
|
|
78
75
|
|
|
79
76
|
const applySort = (
|
|
80
|
-
sorting:
|
|
77
|
+
sorting: RefObject<boolean>,
|
|
81
78
|
view: Gtk.ColumnView,
|
|
82
79
|
column: Gtk.ColumnViewColumn | null,
|
|
83
80
|
order: Gtk.SortType | null | undefined,
|
|
@@ -93,7 +90,7 @@ const applySort = (
|
|
|
93
90
|
|
|
94
91
|
const emitSortChanged = (
|
|
95
92
|
sorter: Gtk.ColumnViewSorter | null,
|
|
96
|
-
sorting:
|
|
93
|
+
sorting: RefObject<boolean>,
|
|
97
94
|
sort: SortProps,
|
|
98
95
|
): void => {
|
|
99
96
|
if (sorter === null || sorting.current) {
|
|
@@ -104,7 +101,7 @@ const emitSortChanged = (
|
|
|
104
101
|
};
|
|
105
102
|
|
|
106
103
|
const syncSort = (
|
|
107
|
-
sorting:
|
|
104
|
+
sorting: RefObject<boolean>,
|
|
108
105
|
view: Gtk.ColumnView | null,
|
|
109
106
|
sortColumn: string | null | undefined,
|
|
110
107
|
sortOrder: Gtk.SortType | null | undefined,
|
|
@@ -118,7 +115,7 @@ const syncSort = (
|
|
|
118
115
|
applySort(sorting, target.view, target.column, sortOrder);
|
|
119
116
|
};
|
|
120
117
|
|
|
121
|
-
const useColumnSorting = (view: Gtk.ColumnView | null, sort: SortProps, columns:
|
|
118
|
+
const useColumnSorting = (view: Gtk.ColumnView | null, sort: SortProps, columns: ColumnViewColumn<never>[]): void => {
|
|
122
119
|
const sorting = useRef(false);
|
|
123
120
|
const sorter = view?.getSorter() ?? null;
|
|
124
121
|
const columnSorter = sorter instanceof Gtk.ColumnViewSorter ? sorter : null;
|
|
@@ -134,54 +131,56 @@ const useColumnSorting = (view: Gtk.ColumnView | null, sort: SortProps, columns:
|
|
|
134
131
|
}, [view, sortColumn, sortOrder, columns]);
|
|
135
132
|
};
|
|
136
133
|
|
|
137
|
-
const ColumnCells = ({ column, collection, expandedIds, size }: ColumnCellsProps): ReactNode => {
|
|
134
|
+
const ColumnCells = ({ column, collection, expandedIds, expanderDescriptions, size }: ColumnCellsProps): ReactNode => {
|
|
138
135
|
const cells = useItemCells(size);
|
|
139
|
-
const rest = omit(column, ["id", "renderCell", "
|
|
136
|
+
const rest = omit(column, ["id", "renderCell", "isSortable"]);
|
|
140
137
|
|
|
141
138
|
return (
|
|
142
139
|
<>
|
|
143
140
|
<GtkColumnViewColumn
|
|
144
141
|
id={column.id}
|
|
145
142
|
factory={<GtkSignalListItemFactory {...cells.handlers} />}
|
|
146
|
-
sorter={column.
|
|
143
|
+
sorter={column.isSortable === true ? <GtkCustomSorter /> : null}
|
|
147
144
|
{...rest}
|
|
148
145
|
/>
|
|
149
146
|
<ItemPortals
|
|
150
|
-
|
|
147
|
+
registry={cells}
|
|
151
148
|
render={column.renderCell}
|
|
152
149
|
collection={collection}
|
|
153
150
|
expandedIds={expandedIds}
|
|
151
|
+
expanderDescriptions={expanderDescriptions}
|
|
154
152
|
/>
|
|
155
153
|
</>
|
|
156
154
|
);
|
|
157
155
|
};
|
|
158
156
|
|
|
159
|
-
const ColumnList = ({ columns, collection, expandedIds, size }: ColumnListProps): ReactNode =>
|
|
157
|
+
const ColumnList = ({ columns, collection, expandedIds, expanderDescriptions, size }: ColumnListProps): ReactNode =>
|
|
160
158
|
columns.map((column) => (
|
|
161
159
|
<ColumnCells
|
|
162
160
|
key={column.id}
|
|
163
161
|
column={column}
|
|
164
162
|
collection={collection}
|
|
165
163
|
expandedIds={expandedIds}
|
|
164
|
+
expanderDescriptions={expanderDescriptions}
|
|
166
165
|
size={size}
|
|
167
166
|
/>
|
|
168
167
|
));
|
|
169
168
|
|
|
170
169
|
/**
|
|
171
170
|
* Renders a Gtk.ColumnView from declarative items or sections and a columns array,
|
|
172
|
-
* with controlled selection, expansion, and sorting, per-column header menus,
|
|
173
|
-
* section header rendering.
|
|
171
|
+
* with controlled selection, expansion, and sorting, per-column header menus,
|
|
172
|
+
* section header rendering, and per-row props such as a screen-reader label.
|
|
174
173
|
*/
|
|
175
174
|
function ColumnView<T = unknown, S = unknown>(props: ColumnViewProps<T, S>): ReactNode {
|
|
176
|
-
const { renderHeader, columns, expandedIds,
|
|
177
|
-
|
|
178
|
-
|
|
175
|
+
const { renderHeader, rowProps, columns, expandedIds, expanderDescriptions } = props;
|
|
176
|
+
const { sortColumn, sortOrder, onSortChanged, ref } = props;
|
|
179
177
|
const rest = omit(props, COLUMN_VIEW_PROPS);
|
|
178
|
+
const size = { width: -1, height: props.estimatedItemHeight ?? -1 };
|
|
180
179
|
const [view, refCallback] = useWidgetRef<Gtk.ColumnView>(ref);
|
|
181
|
-
const size = { width: -1, height: estimatedItemHeight ?? -1 };
|
|
182
180
|
const { collection, selection } = useCollection(props);
|
|
183
|
-
const
|
|
184
|
-
const
|
|
181
|
+
const header = useSectionHeader(renderHeader, collection, size);
|
|
182
|
+
const rows = useRowProps(rowProps, collection, expandedIds);
|
|
183
|
+
const columnList = columns as ColumnViewColumn<never>[];
|
|
185
184
|
useColumnSorting(view, { sortColumn, sortOrder, onSortChanged }, columnList);
|
|
186
185
|
|
|
187
186
|
return (
|
|
@@ -189,16 +188,20 @@ function ColumnView<T = unknown, S = unknown>(props: ColumnViewProps<T, S>): Rea
|
|
|
189
188
|
<GtkColumnView
|
|
190
189
|
ref={refCallback}
|
|
191
190
|
model={selection}
|
|
192
|
-
{...
|
|
193
|
-
|
|
194
|
-
})}
|
|
191
|
+
{...header.factoryProps}
|
|
192
|
+
{...rows.factoryProps}
|
|
195
193
|
{...rest}
|
|
196
194
|
>
|
|
197
|
-
<ColumnList
|
|
195
|
+
<ColumnList
|
|
196
|
+
columns={columnList}
|
|
197
|
+
collection={collection}
|
|
198
|
+
expandedIds={expandedIds}
|
|
199
|
+
expanderDescriptions={expanderDescriptions}
|
|
200
|
+
size={size}
|
|
201
|
+
/>
|
|
198
202
|
</GtkColumnView>
|
|
199
|
-
{
|
|
200
|
-
|
|
201
|
-
)}
|
|
203
|
+
{header.portals}
|
|
204
|
+
{rows.portals}
|
|
202
205
|
</>
|
|
203
206
|
);
|
|
204
207
|
}
|
package/src/drop-down.tsx
CHANGED
|
@@ -4,6 +4,7 @@ import type { DropDownBaseProps } from "./internal/drop-down.js";
|
|
|
4
4
|
import type { DropDownProps } from "./types.js";
|
|
5
5
|
import { DropDownBase } from "./internal/drop-down.js";
|
|
6
6
|
|
|
7
|
+
/** Call signature of {@link DropDown}, generic in the item and section value types. */
|
|
7
8
|
type DropDownComponent = <T = unknown, S = unknown>(props: DropDownProps<T, S>) => ReactNode;
|
|
8
9
|
|
|
9
10
|
/**
|
package/src/grid-view.tsx
CHANGED
|
@@ -23,13 +23,13 @@ function GridView<T = unknown>(props: GridViewProps<T>): ReactNode {
|
|
|
23
23
|
const { renderItem, estimatedItemHeight, estimatedItemWidth } = props;
|
|
24
24
|
const rest = omit(props, GRID_VIEW_PROPS);
|
|
25
25
|
const size = { width: estimatedItemWidth ?? -1, height: estimatedItemHeight ?? -1 };
|
|
26
|
-
const { collection, selection } = useCollection({ ...props,
|
|
26
|
+
const { collection, selection } = useCollection({ ...props, isFlat: true });
|
|
27
27
|
const itemCells = useItemCells(size);
|
|
28
28
|
|
|
29
29
|
return (
|
|
30
30
|
<>
|
|
31
31
|
<GtkGridView model={selection} factory={<GtkSignalListItemFactory {...itemCells.handlers} />} {...rest} />
|
|
32
|
-
<ItemPortals
|
|
32
|
+
<ItemPortals registry={itemCells} render={renderItem} collection={collection} />
|
|
33
33
|
</>
|
|
34
34
|
);
|
|
35
35
|
}
|
package/src/index.ts
CHANGED
|
@@ -2,20 +2,19 @@ export { ColumnView } from "./column-view.js";
|
|
|
2
2
|
export { DropDown } from "./drop-down.js";
|
|
3
3
|
export { GridView } from "./grid-view.js";
|
|
4
4
|
export { ListView } from "./list-view.js";
|
|
5
|
-
export { SizeGroup } from "./size-group.js";
|
|
6
5
|
export type {
|
|
7
|
-
|
|
8
|
-
Column,
|
|
6
|
+
ColumnViewColumn,
|
|
9
7
|
ColumnViewProps,
|
|
10
8
|
DropDownProps,
|
|
9
|
+
ExpanderDescriptions,
|
|
11
10
|
GridViewProps,
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
ListItem,
|
|
12
|
+
ListItemRenderArgs,
|
|
13
|
+
ListItemRenderer,
|
|
14
|
+
ListRowProps,
|
|
15
|
+
ListRowPropsResolver,
|
|
16
|
+
ListSection,
|
|
17
|
+
ListSectionRenderArgs,
|
|
18
|
+
ListSectionRenderer,
|
|
15
19
|
ListViewProps,
|
|
16
|
-
RenderHeaderArgs,
|
|
17
|
-
RenderItemArgs,
|
|
18
|
-
Section,
|
|
19
|
-
SizeGroupChildProps,
|
|
20
|
-
SizeGroupProps,
|
|
21
20
|
} from "./types.js";
|