Skip to content

Commit ab2888e

Browse files
authored
Toniq List Table (#72)
1 parent f14298b commit ab2888e

14 files changed

+998
-8
lines changed

cspell.config.cjs

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ module.exports = {
77
'.storybook-dist',
88
'*.otf',
99
'/graphics/',
10+
'./.github/CODEOWNERS',
1011
],
1112
words: [
1213
...baseConfig.words,
@@ -19,7 +20,6 @@ module.exports = {
1920
'nftgeek',
2021
'tablist',
2122
'toniq',
22-
'stephenandrews',
23-
'ponnexcodev',
23+
'CODEOWNERS',
2424
],
2525
};

package-lock.json

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/design-system/src/element-book/all-element-book-entries.ts

+2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {toniqHeadingBookPage} from '../elements/toniq-heading/toniq-heading.elem
1313
import {toniqHyperlinkPage} from '../elements/toniq-hyperlink/toniq-hyperlink.element.book';
1414
import {toniqIconBookPage} from '../elements/toniq-icon/toniq-icon.element.book';
1515
import {toniqInputPage} from '../elements/toniq-input/toniq-input.element.book';
16+
import {toniqListTableElementBookPage} from '../elements/toniq-list-table/toniq-list-table.element.book';
1617
import {toniqLoadingBookPage} from '../elements/toniq-loading/toniq-loading.element.book';
1718
import {toniqMiddleEllipsisPage} from '../elements/toniq-middle-ellipsis/toniq-middle-ellipsis.element.book';
1819
import {toniqProgressBookPage} from '../elements/toniq-progress/toniq-progress.element.book';
@@ -64,6 +65,7 @@ const childPages = [
6465
toniqSliderPage,
6566
toniqToggleButtonBookPage,
6667
toniqTopTabsPage,
68+
toniqListTableElementBookPage,
6769
].sort((a, b) => a.title.localeCompare(b.title));
6870

6971
export const allElementBookEntries = [

packages/design-system/src/elements/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export * from './toniq-heading/toniq-heading.element';
1616
export * from './toniq-hyperlink/toniq-hyperlink.element';
1717
export * from './toniq-icon/toniq-icon.element';
1818
export * from './toniq-input/toniq-input.element';
19+
export * from './toniq-list-table/toniq-list-table.element';
1920
export * from './toniq-loading/toniq-loading.element';
2021
export * from './toniq-middle-ellipsis/toniq-middle-ellipsis.element';
2122
export * from './toniq-pagination/toniq-pagination.element';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import {assertTypeOf} from 'run-time-assertions';
2+
import {createListTableTable} from './list-table-inputs';
3+
4+
describe(createListTableTable.name, () => {
5+
it('should have proper type enforcement', () => {
6+
createListTableTable({
7+
entries: [],
8+
columns: [
9+
{key: 'first', title: 'First'},
10+
{key: 'second', title: 'Second'},
11+
],
12+
// missing keys
13+
// @ts-expect-error
14+
createRowObject(entry) {
15+
return {
16+
cells: {
17+
first: 'yo',
18+
},
19+
};
20+
},
21+
});
22+
createListTableTable({
23+
entries: [
24+
{
25+
key1: 'string',
26+
key2: 42,
27+
},
28+
],
29+
columns: [
30+
{key: 'first', title: 'First'},
31+
{key: 'second', title: 'Second'},
32+
],
33+
createRowObject(entry) {
34+
assertTypeOf(entry).toEqualTypeOf<Readonly<{key1: string; key2: number}>>();
35+
return {
36+
cells: {
37+
first: 'yo',
38+
second: 'hi',
39+
},
40+
};
41+
},
42+
});
43+
createListTableTable({
44+
entries: [
45+
{
46+
key1: 'string',
47+
key2: 42,
48+
},
49+
],
50+
columns: [],
51+
// can't do anything if columNames is empty
52+
// @ts-expect-error
53+
createRowObject(entry) {
54+
return {cells: {}};
55+
},
56+
});
57+
});
58+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
import {ArrayElement, PartialAndUndefined, areJsonEqual} from '@augment-vir/common';
2+
import {HtmlInterpolation} from 'element-vir';
3+
4+
export type ColumnsBase = ReadonlyArray<
5+
Readonly<{
6+
key: PropertyKey;
7+
title: string;
8+
disabled?: boolean;
9+
mobile?: {
10+
sticky: boolean | undefined;
11+
};
12+
}>
13+
>;
14+
15+
export type HeaderItem = {
16+
title: string;
17+
key: string;
18+
left: number;
19+
mobile?: {
20+
sticky: boolean;
21+
};
22+
};
23+
24+
export type ListTableRow<Columns extends ColumnsBase> = {
25+
cells: Readonly<
26+
ArrayElement<Columns> extends never
27+
? never
28+
: Record<ArrayElement<Columns>['key'], HtmlInterpolation>
29+
>;
30+
rowActions?:
31+
| PartialAndUndefined<{
32+
click: (params: {
33+
clickEvent: MouseEvent;
34+
dispatch: (newEvent: Event) => void;
35+
}) => void;
36+
}>
37+
| undefined;
38+
};
39+
40+
export enum ListTableHeaderStyleEnum {
41+
Default = 'default',
42+
Transparent = 'transparent',
43+
}
44+
45+
export type ListTableInputs = {
46+
columns: Readonly<ColumnsBase>;
47+
rows: ReadonlyArray<Readonly<ListTableRow<any>>>;
48+
/** Defaults to ListTableHeaderStyleEnum.Default. */
49+
headerStyle?: ListTableHeaderStyleEnum | undefined;
50+
pagination?:
51+
| Readonly<{
52+
currentPage: number;
53+
pageCount: number;
54+
}>
55+
| undefined;
56+
showLoading?: boolean | undefined;
57+
};
58+
59+
export type CreateRowObjectCallback<EntryType, Columns extends ColumnsBase> = (
60+
entry: Readonly<EntryType>,
61+
index: number,
62+
) => Readonly<ListTableRow<Columns>>;
63+
64+
export function createListTableTable<EntryType, const Columns extends ColumnsBase>({
65+
entries,
66+
columns,
67+
createRowObject,
68+
}: {
69+
entries: ReadonlyArray<Readonly<EntryType>>;
70+
columns: Readonly<Columns>;
71+
createRowObject: CreateRowObjectCallback<EntryType, Columns>;
72+
}): Pick<ListTableInputs, 'rows' | 'columns'> {
73+
const columnsObject = Object.fromEntries(
74+
columns.map((column) => [
75+
column.key,
76+
'',
77+
]),
78+
);
79+
80+
const rows = entries.map((entry, index) => {
81+
const row = createRowObject(entry, index);
82+
83+
if (!areJsonEqual(Object.keys(columnsObject).sort(), Object.keys(row.cells).sort())) {
84+
console.error('broken list table row', {cells: row.cells, columns: columnsObject});
85+
throw new Error('List table row keys does not match expect column keys.');
86+
}
87+
88+
return row;
89+
});
90+
91+
return {rows, columns};
92+
}

0 commit comments

Comments
 (0)