@quadrats/react 1.0.0 → 1.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/card/components/Card.js +83 -75
- package/card/index.cjs.js +82 -74
- package/carousel/components/Carousel.js +32 -28
- package/carousel/index.cjs.js +32 -28
- package/components/Tooltip/index.js +5 -2
- package/components/index.cjs.js +5 -2
- package/embed/renderers/base/components/BaseEmbedElement.js +51 -43
- package/embed/renderers/base/index.cjs.js +50 -42
- package/image/components/Image.js +34 -26
- package/image/createReactImage.js +1 -1
- package/image/index.cjs.js +34 -26
- package/package.json +4 -4
- package/table/components/Table.d.ts +9 -0
- package/table/components/Table.js +231 -0
- package/table/components/TableBody.d.ts +5 -0
- package/table/components/TableBody.js +8 -0
- package/table/components/TableCell.d.ts +5 -0
- package/table/components/TableCell.js +191 -0
- package/table/components/TableHeader.d.ts +5 -0
- package/table/components/TableHeader.js +13 -0
- package/table/components/TableMain.d.ts +5 -0
- package/table/components/TableMain.js +225 -0
- package/table/components/TableRow.d.ts +5 -0
- package/table/components/TableRow.js +8 -0
- package/table/components/TableTitle.d.ts +5 -0
- package/table/components/TableTitle.js +18 -0
- package/table/contexts/TableActionsContext.d.ts +3 -0
- package/table/contexts/TableActionsContext.js +5 -0
- package/table/contexts/TableHeaderContext.d.ts +2 -0
- package/table/contexts/TableHeaderContext.js +7 -0
- package/table/contexts/TableMetadataContext.d.ts +3 -0
- package/table/contexts/TableMetadataContext.js +5 -0
- package/table/contexts/TableScrollContext.d.ts +2 -0
- package/table/contexts/TableScrollContext.js +9 -0
- package/table/contexts/TableStateContext.d.ts +3 -0
- package/table/contexts/TableStateContext.js +5 -0
- package/table/createReactTable.d.ts +4 -0
- package/table/createReactTable.js +297 -0
- package/table/defaultRenderTableElements.d.ts +2 -0
- package/table/defaultRenderTableElements.js +20 -0
- package/table/hooks/useColumnResize.d.ts +12 -0
- package/table/hooks/useColumnResize.js +139 -0
- package/table/hooks/useTableActions.d.ts +25 -0
- package/table/hooks/useTableActions.js +886 -0
- package/table/hooks/useTableActionsContext.d.ts +1 -0
- package/table/hooks/useTableActionsContext.js +12 -0
- package/table/hooks/useTableCell.d.ts +16 -0
- package/table/hooks/useTableCell.js +166 -0
- package/table/hooks/useTableCellToolbarActions.d.ts +34 -0
- package/table/hooks/useTableCellToolbarActions.js +404 -0
- package/table/hooks/useTableMetadata.d.ts +1 -0
- package/table/hooks/useTableMetadata.js +12 -0
- package/table/hooks/useTableStateContext.d.ts +1 -0
- package/table/hooks/useTableStateContext.js +12 -0
- package/table/hooks/useTableStates.d.ts +18 -0
- package/table/hooks/useTableStates.js +14 -0
- package/table/index.cjs.js +3254 -0
- package/table/index.d.ts +16 -0
- package/table/index.js +24 -0
- package/table/jsx-serializer/components/Table.d.ts +3 -0
- package/table/jsx-serializer/components/Table.js +7 -0
- package/table/jsx-serializer/components/TableBody.d.ts +3 -0
- package/table/jsx-serializer/components/TableBody.js +7 -0
- package/table/jsx-serializer/components/TableCell.d.ts +5 -0
- package/table/jsx-serializer/components/TableCell.js +33 -0
- package/table/jsx-serializer/components/TableHeader.d.ts +3 -0
- package/table/jsx-serializer/components/TableHeader.js +10 -0
- package/table/jsx-serializer/components/TableMain.d.ts +6 -0
- package/table/jsx-serializer/components/TableMain.js +18 -0
- package/table/jsx-serializer/components/TableRow.d.ts +3 -0
- package/table/jsx-serializer/components/TableRow.js +7 -0
- package/table/jsx-serializer/components/TableTitle.d.ts +3 -0
- package/table/jsx-serializer/components/TableTitle.js +7 -0
- package/table/jsx-serializer/contexts/TableHeaderContext.d.ts +1 -0
- package/table/jsx-serializer/contexts/TableHeaderContext.js +5 -0
- package/table/jsx-serializer/contexts/TableScrollContext.d.ts +2 -0
- package/table/jsx-serializer/contexts/TableScrollContext.js +7 -0
- package/table/jsx-serializer/createJsxSerializeTable.d.ts +5 -0
- package/table/jsx-serializer/createJsxSerializeTable.js +113 -0
- package/table/jsx-serializer/defaultRenderTableElements.d.ts +2 -0
- package/table/jsx-serializer/defaultRenderTableElements.js +20 -0
- package/table/jsx-serializer/index.cjs.js +195 -0
- package/table/jsx-serializer/index.d.ts +3 -0
- package/table/jsx-serializer/index.js +2 -0
- package/table/jsx-serializer/package.json +7 -0
- package/table/jsx-serializer/typings.d.ts +12 -0
- package/table/package.json +10 -0
- package/table/table.css +1 -0
- package/table/table.scss +393 -0
- package/table/toolbar/TableToolbarIcon.d.ts +8 -0
- package/table/toolbar/TableToolbarIcon.js +12 -0
- package/table/toolbar/index.cjs.js +24 -0
- package/table/toolbar/index.d.ts +2 -0
- package/table/toolbar/index.js +2 -0
- package/table/toolbar/package.json +7 -0
- package/table/toolbar/useTableTool.d.ts +4 -0
- package/table/toolbar/useTableTool.js +13 -0
- package/table/typings.d.ts +66 -0
- package/table/utils/helper.d.ts +160 -0
- package/table/utils/helper.js +693 -0
- package/toolbar/components/InlineToolbar.d.ts +12 -11
- package/toolbar/components/InlineToolbar.js +23 -19
- package/toolbar/components/Toolbar.js +2 -2
- package/toolbar/index.cjs.js +24 -21
- package/toolbar/toolbar.css +1 -1
- package/toolbar/toolbar.scss +4 -1
- package/utils/index.cjs.js +7 -1
- package/utils/removePreviousElement.js +7 -1
package/table/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export * from './contexts/TableActionsContext';
|
|
2
|
+
export * from './contexts/TableMetadataContext';
|
|
3
|
+
export * from './contexts/TableStateContext';
|
|
4
|
+
export * from './hooks/useTableActionsContext';
|
|
5
|
+
export * from './hooks/useTableMetadata';
|
|
6
|
+
export * from './hooks/useTableStateContext';
|
|
7
|
+
export * from './hooks/useTableCellToolbarActions';
|
|
8
|
+
export * from './typings';
|
|
9
|
+
export * from './components/Table';
|
|
10
|
+
export * from './components/TableTitle';
|
|
11
|
+
export * from './components/TableMain';
|
|
12
|
+
export * from './components/TableHeader';
|
|
13
|
+
export * from './components/TableRow';
|
|
14
|
+
export * from './components/TableCell';
|
|
15
|
+
export { defaultRenderTableElements } from './defaultRenderTableElements';
|
|
16
|
+
export { CreateReactTableOptions, createReactTable } from './createReactTable';
|
package/table/index.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export { TableActionsContext } from './contexts/TableActionsContext.js';
|
|
2
|
+
export { TableMetadataContext } from './contexts/TableMetadataContext.js';
|
|
3
|
+
export { TableStateContext } from './contexts/TableStateContext.js';
|
|
4
|
+
export { useTableActionsContext } from './hooks/useTableActionsContext.js';
|
|
5
|
+
export { useTableMetadata } from './hooks/useTableMetadata.js';
|
|
6
|
+
export { useTableStateContext } from './hooks/useTableStateContext.js';
|
|
7
|
+
export { useTableCellToolbarActions } from './hooks/useTableCellToolbarActions.js';
|
|
8
|
+
import 'react';
|
|
9
|
+
import '@quadrats/core';
|
|
10
|
+
import '@quadrats/common/table';
|
|
11
|
+
import 'slate-react';
|
|
12
|
+
import '@quadrats/react';
|
|
13
|
+
import '@quadrats/common/align';
|
|
14
|
+
import '@quadrats/react/components';
|
|
15
|
+
import '@quadrats/icons';
|
|
16
|
+
import 'clsx';
|
|
17
|
+
import '@quadrats/react/toolbar';
|
|
18
|
+
import 'slate';
|
|
19
|
+
import './contexts/TableScrollContext.js';
|
|
20
|
+
import '@quadrats/react/utils';
|
|
21
|
+
import '@quadrats/common/list';
|
|
22
|
+
import './contexts/TableHeaderContext.js';
|
|
23
|
+
export { defaultRenderTableElements } from './defaultRenderTableElements.js';
|
|
24
|
+
export { createReactTable } from './createReactTable.js';
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import React, { useContext, useRef, useState, useEffect } from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
import { TableHeaderContext } from '../contexts/TableHeaderContext.js';
|
|
4
|
+
import { TableScrollContext } from '../contexts/TableScrollContext.js';
|
|
5
|
+
|
|
6
|
+
const TableCellJsxSerializeElement = ({ children, element, isColumnPinned, }) => {
|
|
7
|
+
const isHeader = useContext(TableHeaderContext);
|
|
8
|
+
// calculate the left position of the cell when it is stuck
|
|
9
|
+
const cellRef = useRef(null);
|
|
10
|
+
const { scrollRef } = useContext(TableScrollContext);
|
|
11
|
+
const [cellStuckAtLeft, setCellStuckAtLeft] = useState(0);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
const { current: cell } = cellRef;
|
|
14
|
+
const { current: scrollContainer } = scrollRef;
|
|
15
|
+
if (scrollContainer && cell) {
|
|
16
|
+
const cellRect = cell.getBoundingClientRect();
|
|
17
|
+
const containerRect = scrollContainer.getBoundingClientRect();
|
|
18
|
+
setCellStuckAtLeft(Math.max(Math.round(cellRect.left - containerRect.left), 0));
|
|
19
|
+
}
|
|
20
|
+
}, [scrollRef]);
|
|
21
|
+
const CellTag = isHeader ? 'th' : 'td';
|
|
22
|
+
const shouldPinned = element.pinned && isColumnPinned && element.treatAsTitle;
|
|
23
|
+
return (React.createElement(CellTag, { ref: cellRef, className: clsx('qdr-table__cell', {
|
|
24
|
+
'qdr-table__cell--header': isHeader || element.treatAsTitle,
|
|
25
|
+
'qdr-table__cell--pinned': shouldPinned,
|
|
26
|
+
}), style: shouldPinned
|
|
27
|
+
? {
|
|
28
|
+
left: cellStuckAtLeft,
|
|
29
|
+
}
|
|
30
|
+
: undefined }, children));
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export { TableCellJsxSerializeElement };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { TableHeaderContext } from '../contexts/TableHeaderContext.js';
|
|
3
|
+
|
|
4
|
+
const TableHeaderJsxSerializeElement = ({ children, element }) => {
|
|
5
|
+
const hasAnyRowPinned = element.children.some((child) => child.children.every((cell) => cell.pinned));
|
|
6
|
+
return (React.createElement(TableHeaderContext.Provider, { value: true },
|
|
7
|
+
React.createElement("thead", { className: `qdr-table__header ${hasAnyRowPinned ? 'qdr-table__header--pinned' : ''}` }, children)));
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export { TableHeaderJsxSerializeElement };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { JsxSerializeElementProps } from '@quadrats/react/jsx-serializer';
|
|
3
|
+
import { ColumnWidth } from '@quadrats/common/table';
|
|
4
|
+
export declare const TableMainJsxSerializeElement: ({ children, columnWidths, }: JsxSerializeElementProps & {
|
|
5
|
+
columnWidths?: ColumnWidth[];
|
|
6
|
+
}) => React.JSX.Element;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React, { useRef, useMemo } from 'react';
|
|
2
|
+
import { TableScrollContext } from '../contexts/TableScrollContext.js';
|
|
3
|
+
import { calculateTableMinWidth, columnWidthToCSS } from '@quadrats/common/table';
|
|
4
|
+
|
|
5
|
+
const TableMainJsxSerializeElement = ({ children, columnWidths, }) => {
|
|
6
|
+
const scrollRef = useRef(null);
|
|
7
|
+
const scrollContextValue = useMemo(() => ({ scrollRef }), [scrollRef]);
|
|
8
|
+
const tableMinWidth = useMemo(() => (columnWidths ? calculateTableMinWidth(columnWidths) : '100%'), [columnWidths]);
|
|
9
|
+
return (React.createElement("div", { ref: scrollRef, className: "qdr-table__scrollContainer" },
|
|
10
|
+
React.createElement(TableScrollContext.Provider, { value: scrollContextValue },
|
|
11
|
+
React.createElement("table", { className: "qdr-table__main", style: {
|
|
12
|
+
minWidth: tableMinWidth,
|
|
13
|
+
} },
|
|
14
|
+
(columnWidths === null || columnWidths === void 0 ? void 0 : columnWidths.length) ? (React.createElement("colgroup", null, columnWidths.map((width, index) => (React.createElement("col", { key: index, style: { width: columnWidthToCSS(width), minWidth: columnWidthToCSS(width) } }))))) : null,
|
|
15
|
+
children))));
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export { TableMainJsxSerializeElement };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const TableHeaderContext: import("react").Context<boolean>;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { TableTypeKey, TableTitleTypeKey, TableMainTypeKey, TableHeaderTypeKey, TableBodyTypeKey, TableRowTypeKey, TableCellTypeKey } from '@quadrats/common/table';
|
|
2
|
+
import { CreateJsxSerializeElementOptions, JsxSerializeElementProps } from '@quadrats/react/jsx-serializer';
|
|
3
|
+
import { JsxSerializeTableElementProps } from './typings';
|
|
4
|
+
export type CreateJsxSerializeTableOptions = Partial<Record<TableTypeKey, Partial<CreateJsxSerializeElementOptions<JsxSerializeTableElementProps>>> & Record<TableTitleTypeKey, Partial<CreateJsxSerializeElementOptions<JsxSerializeElementProps>>> & Record<TableMainTypeKey, Partial<CreateJsxSerializeElementOptions<JsxSerializeElementProps>>> & Record<TableHeaderTypeKey, Partial<CreateJsxSerializeElementOptions<JsxSerializeElementProps>>> & Record<TableBodyTypeKey, Partial<CreateJsxSerializeElementOptions<JsxSerializeElementProps>>> & Record<TableRowTypeKey, Partial<CreateJsxSerializeElementOptions<JsxSerializeElementProps>>> & Record<TableCellTypeKey, Partial<CreateJsxSerializeElementOptions<JsxSerializeElementProps>>>>;
|
|
5
|
+
export declare function createJsxSerializeTable(options?: CreateJsxSerializeTableOptions): (props: JsxSerializeElementProps) => import("react").JSX.Element | null | undefined;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { getFirstAncestor } from '@quadrats/core/serializers';
|
|
2
|
+
import { TABLE_TYPES } from '@quadrats/common/table';
|
|
3
|
+
import { createJsxSerializeElements } from '@quadrats/react/jsx-serializer';
|
|
4
|
+
import { defaultRenderTableElements } from './defaultRenderTableElements.js';
|
|
5
|
+
import { Element } from '@quadrats/core';
|
|
6
|
+
|
|
7
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
8
|
+
function createJsxSerializeTable(options = {}) {
|
|
9
|
+
const { table = {}, table_title = {}, table_main = {}, table_header = {}, table_body = {}, table_row = {}, table_cell = {}, } = options;
|
|
10
|
+
const tableType = table.type || TABLE_TYPES.table;
|
|
11
|
+
const tableTitleType = table_title.type || TABLE_TYPES.table_title;
|
|
12
|
+
const tableMainType = table_main.type || TABLE_TYPES.table_main;
|
|
13
|
+
const tableHeaderType = table_header.type || TABLE_TYPES.table_header;
|
|
14
|
+
const tableBodyType = table_body.type || TABLE_TYPES.table_body;
|
|
15
|
+
const tableRowType = table_row.type || TABLE_TYPES.table_row;
|
|
16
|
+
const tableCellType = table_cell.type || TABLE_TYPES.table_cell;
|
|
17
|
+
const renderTable = table.render || defaultRenderTableElements.table;
|
|
18
|
+
const renderTableTitle = table_title.render || defaultRenderTableElements.table_title;
|
|
19
|
+
const renderTableMain = table_main.render || defaultRenderTableElements.table_main;
|
|
20
|
+
const renderTableHeader = table_header.render || defaultRenderTableElements.table_header;
|
|
21
|
+
const renderTableBody = table_body.render || defaultRenderTableElements.table_body;
|
|
22
|
+
const renderTableRow = table_row.render || defaultRenderTableElements.table_row;
|
|
23
|
+
const renderTableCell = table_cell.render || defaultRenderTableElements.table_cell;
|
|
24
|
+
return createJsxSerializeElements([
|
|
25
|
+
{
|
|
26
|
+
type: tableType,
|
|
27
|
+
render: (props) => {
|
|
28
|
+
const { children } = props;
|
|
29
|
+
const element = props.element;
|
|
30
|
+
return renderTable({
|
|
31
|
+
children,
|
|
32
|
+
element,
|
|
33
|
+
});
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
type: tableTitleType,
|
|
38
|
+
render: (props) => {
|
|
39
|
+
const { children } = props;
|
|
40
|
+
const element = props.element;
|
|
41
|
+
return renderTableTitle({
|
|
42
|
+
children,
|
|
43
|
+
element,
|
|
44
|
+
});
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
type: tableMainType,
|
|
49
|
+
render: (props) => {
|
|
50
|
+
const { children } = props;
|
|
51
|
+
const element = props.element;
|
|
52
|
+
const firstAncestor = getFirstAncestor(element, (node) => node.type === tableType);
|
|
53
|
+
const columnWidths = (firstAncestor === null || firstAncestor === void 0 ? void 0 : firstAncestor.columnWidths) || [];
|
|
54
|
+
return renderTableMain({
|
|
55
|
+
children,
|
|
56
|
+
element,
|
|
57
|
+
columnWidths,
|
|
58
|
+
});
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
type: tableHeaderType,
|
|
63
|
+
render: (props) => {
|
|
64
|
+
const { children } = props;
|
|
65
|
+
const element = props.element;
|
|
66
|
+
return renderTableHeader({
|
|
67
|
+
children,
|
|
68
|
+
element,
|
|
69
|
+
});
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
type: tableBodyType,
|
|
74
|
+
render: (props) => {
|
|
75
|
+
const { children } = props;
|
|
76
|
+
const element = props.element;
|
|
77
|
+
return renderTableBody({
|
|
78
|
+
children,
|
|
79
|
+
element,
|
|
80
|
+
});
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
type: tableRowType,
|
|
85
|
+
render: (props) => {
|
|
86
|
+
const { children } = props;
|
|
87
|
+
const element = props.element;
|
|
88
|
+
return renderTableRow({
|
|
89
|
+
children,
|
|
90
|
+
element,
|
|
91
|
+
});
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
type: tableCellType,
|
|
96
|
+
render: (props) => {
|
|
97
|
+
const { children } = props;
|
|
98
|
+
const element = props.element;
|
|
99
|
+
const firstAncestor = getFirstAncestor(element, (node) => node.type === tableMainType);
|
|
100
|
+
const body = firstAncestor === null || firstAncestor === void 0 ? void 0 : firstAncestor.children.find((child) => child.type === tableBodyType);
|
|
101
|
+
const firstRow = body === null || body === void 0 ? void 0 : body.children[0];
|
|
102
|
+
const firstCell = Element.isElement(firstRow) ? firstRow.children[0] : null;
|
|
103
|
+
return renderTableCell({
|
|
104
|
+
children,
|
|
105
|
+
element,
|
|
106
|
+
isColumnPinned: Element.isElement(firstCell) ? firstCell.pinned : false,
|
|
107
|
+
});
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
]);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export { createJsxSerializeTable };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { TableJsxSerializeElement } from './components/Table.js';
|
|
3
|
+
import { TableTitleJsxSerializeElement } from './components/TableTitle.js';
|
|
4
|
+
import { TableMainJsxSerializeElement } from './components/TableMain.js';
|
|
5
|
+
import { TableHeaderJsxSerializeElement } from './components/TableHeader.js';
|
|
6
|
+
import { TableBodyJsxSerializeElement } from './components/TableBody.js';
|
|
7
|
+
import { TableRowJsxSerializeElement } from './components/TableRow.js';
|
|
8
|
+
import { TableCellJsxSerializeElement } from './components/TableCell.js';
|
|
9
|
+
|
|
10
|
+
const defaultRenderTableElements = {
|
|
11
|
+
table: (props) => React.createElement(TableJsxSerializeElement, Object.assign({}, props)),
|
|
12
|
+
table_title: (props) => React.createElement(TableTitleJsxSerializeElement, Object.assign({}, props)),
|
|
13
|
+
table_main: (props) => React.createElement(TableMainJsxSerializeElement, Object.assign({}, props)),
|
|
14
|
+
table_header: (props) => React.createElement(TableHeaderJsxSerializeElement, Object.assign({}, props)),
|
|
15
|
+
table_body: (props) => React.createElement(TableBodyJsxSerializeElement, Object.assign({}, props)),
|
|
16
|
+
table_row: (props) => React.createElement(TableRowJsxSerializeElement, Object.assign({}, props)),
|
|
17
|
+
table_cell: (props) => React.createElement(TableCellJsxSerializeElement, Object.assign({}, props)),
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export { defaultRenderTableElements };
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
var table = require('@quadrats/common/table');
|
|
5
|
+
var clsx = require('clsx');
|
|
6
|
+
var serializers = require('@quadrats/core/serializers');
|
|
7
|
+
var jsxSerializer = require('@quadrats/react/jsx-serializer');
|
|
8
|
+
var core = require('@quadrats/core');
|
|
9
|
+
|
|
10
|
+
const TableJsxSerializeElement = ({ children }) => {
|
|
11
|
+
return React.createElement("div", { className: "qdr-table" }, children);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const TableTitleJsxSerializeElement = ({ children }) => {
|
|
15
|
+
return React.createElement("span", { className: "qdr-table__title" }, children);
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const TableScrollContext = React.createContext({
|
|
19
|
+
scrollRef: { current: null },
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
const TableMainJsxSerializeElement = ({ children, columnWidths, }) => {
|
|
23
|
+
const scrollRef = React.useRef(null);
|
|
24
|
+
const scrollContextValue = React.useMemo(() => ({ scrollRef }), [scrollRef]);
|
|
25
|
+
const tableMinWidth = React.useMemo(() => (columnWidths ? table.calculateTableMinWidth(columnWidths) : '100%'), [columnWidths]);
|
|
26
|
+
return (React.createElement("div", { ref: scrollRef, className: "qdr-table__scrollContainer" },
|
|
27
|
+
React.createElement(TableScrollContext.Provider, { value: scrollContextValue },
|
|
28
|
+
React.createElement("table", { className: "qdr-table__main", style: {
|
|
29
|
+
minWidth: tableMinWidth,
|
|
30
|
+
} },
|
|
31
|
+
(columnWidths === null || columnWidths === void 0 ? void 0 : columnWidths.length) ? (React.createElement("colgroup", null, columnWidths.map((width, index) => (React.createElement("col", { key: index, style: { width: table.columnWidthToCSS(width), minWidth: table.columnWidthToCSS(width) } }))))) : null,
|
|
32
|
+
children))));
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const TableHeaderContext = React.createContext(false);
|
|
36
|
+
|
|
37
|
+
const TableHeaderJsxSerializeElement = ({ children, element }) => {
|
|
38
|
+
const hasAnyRowPinned = element.children.some((child) => child.children.every((cell) => cell.pinned));
|
|
39
|
+
return (React.createElement(TableHeaderContext.Provider, { value: true },
|
|
40
|
+
React.createElement("thead", { className: `qdr-table__header ${hasAnyRowPinned ? 'qdr-table__header--pinned' : ''}` }, children)));
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const TableBodyJsxSerializeElement = ({ children }) => {
|
|
44
|
+
return React.createElement("tbody", { className: "qdr-table__body" }, children);
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const TableRowJsxSerializeElement = ({ children }) => {
|
|
48
|
+
return React.createElement("tr", { className: "qdr-table__row" }, children);
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
const TableCellJsxSerializeElement = ({ children, element, isColumnPinned, }) => {
|
|
52
|
+
const isHeader = React.useContext(TableHeaderContext);
|
|
53
|
+
// calculate the left position of the cell when it is stuck
|
|
54
|
+
const cellRef = React.useRef(null);
|
|
55
|
+
const { scrollRef } = React.useContext(TableScrollContext);
|
|
56
|
+
const [cellStuckAtLeft, setCellStuckAtLeft] = React.useState(0);
|
|
57
|
+
React.useEffect(() => {
|
|
58
|
+
const { current: cell } = cellRef;
|
|
59
|
+
const { current: scrollContainer } = scrollRef;
|
|
60
|
+
if (scrollContainer && cell) {
|
|
61
|
+
const cellRect = cell.getBoundingClientRect();
|
|
62
|
+
const containerRect = scrollContainer.getBoundingClientRect();
|
|
63
|
+
setCellStuckAtLeft(Math.max(Math.round(cellRect.left - containerRect.left), 0));
|
|
64
|
+
}
|
|
65
|
+
}, [scrollRef]);
|
|
66
|
+
const CellTag = isHeader ? 'th' : 'td';
|
|
67
|
+
const shouldPinned = element.pinned && isColumnPinned && element.treatAsTitle;
|
|
68
|
+
return (React.createElement(CellTag, { ref: cellRef, className: clsx('qdr-table__cell', {
|
|
69
|
+
'qdr-table__cell--header': isHeader || element.treatAsTitle,
|
|
70
|
+
'qdr-table__cell--pinned': shouldPinned,
|
|
71
|
+
}), style: shouldPinned
|
|
72
|
+
? {
|
|
73
|
+
left: cellStuckAtLeft,
|
|
74
|
+
}
|
|
75
|
+
: undefined }, children));
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
const defaultRenderTableElements = {
|
|
79
|
+
table: (props) => React.createElement(TableJsxSerializeElement, Object.assign({}, props)),
|
|
80
|
+
table_title: (props) => React.createElement(TableTitleJsxSerializeElement, Object.assign({}, props)),
|
|
81
|
+
table_main: (props) => React.createElement(TableMainJsxSerializeElement, Object.assign({}, props)),
|
|
82
|
+
table_header: (props) => React.createElement(TableHeaderJsxSerializeElement, Object.assign({}, props)),
|
|
83
|
+
table_body: (props) => React.createElement(TableBodyJsxSerializeElement, Object.assign({}, props)),
|
|
84
|
+
table_row: (props) => React.createElement(TableRowJsxSerializeElement, Object.assign({}, props)),
|
|
85
|
+
table_cell: (props) => React.createElement(TableCellJsxSerializeElement, Object.assign({}, props)),
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
89
|
+
function createJsxSerializeTable(options = {}) {
|
|
90
|
+
const { table: table$1 = {}, table_title = {}, table_main = {}, table_header = {}, table_body = {}, table_row = {}, table_cell = {}, } = options;
|
|
91
|
+
const tableType = table$1.type || table.TABLE_TYPES.table;
|
|
92
|
+
const tableTitleType = table_title.type || table.TABLE_TYPES.table_title;
|
|
93
|
+
const tableMainType = table_main.type || table.TABLE_TYPES.table_main;
|
|
94
|
+
const tableHeaderType = table_header.type || table.TABLE_TYPES.table_header;
|
|
95
|
+
const tableBodyType = table_body.type || table.TABLE_TYPES.table_body;
|
|
96
|
+
const tableRowType = table_row.type || table.TABLE_TYPES.table_row;
|
|
97
|
+
const tableCellType = table_cell.type || table.TABLE_TYPES.table_cell;
|
|
98
|
+
const renderTable = table$1.render || defaultRenderTableElements.table;
|
|
99
|
+
const renderTableTitle = table_title.render || defaultRenderTableElements.table_title;
|
|
100
|
+
const renderTableMain = table_main.render || defaultRenderTableElements.table_main;
|
|
101
|
+
const renderTableHeader = table_header.render || defaultRenderTableElements.table_header;
|
|
102
|
+
const renderTableBody = table_body.render || defaultRenderTableElements.table_body;
|
|
103
|
+
const renderTableRow = table_row.render || defaultRenderTableElements.table_row;
|
|
104
|
+
const renderTableCell = table_cell.render || defaultRenderTableElements.table_cell;
|
|
105
|
+
return jsxSerializer.createJsxSerializeElements([
|
|
106
|
+
{
|
|
107
|
+
type: tableType,
|
|
108
|
+
render: (props) => {
|
|
109
|
+
const { children } = props;
|
|
110
|
+
const element = props.element;
|
|
111
|
+
return renderTable({
|
|
112
|
+
children,
|
|
113
|
+
element,
|
|
114
|
+
});
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
type: tableTitleType,
|
|
119
|
+
render: (props) => {
|
|
120
|
+
const { children } = props;
|
|
121
|
+
const element = props.element;
|
|
122
|
+
return renderTableTitle({
|
|
123
|
+
children,
|
|
124
|
+
element,
|
|
125
|
+
});
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
type: tableMainType,
|
|
130
|
+
render: (props) => {
|
|
131
|
+
const { children } = props;
|
|
132
|
+
const element = props.element;
|
|
133
|
+
const firstAncestor = serializers.getFirstAncestor(element, (node) => node.type === tableType);
|
|
134
|
+
const columnWidths = (firstAncestor === null || firstAncestor === void 0 ? void 0 : firstAncestor.columnWidths) || [];
|
|
135
|
+
return renderTableMain({
|
|
136
|
+
children,
|
|
137
|
+
element,
|
|
138
|
+
columnWidths,
|
|
139
|
+
});
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
type: tableHeaderType,
|
|
144
|
+
render: (props) => {
|
|
145
|
+
const { children } = props;
|
|
146
|
+
const element = props.element;
|
|
147
|
+
return renderTableHeader({
|
|
148
|
+
children,
|
|
149
|
+
element,
|
|
150
|
+
});
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
type: tableBodyType,
|
|
155
|
+
render: (props) => {
|
|
156
|
+
const { children } = props;
|
|
157
|
+
const element = props.element;
|
|
158
|
+
return renderTableBody({
|
|
159
|
+
children,
|
|
160
|
+
element,
|
|
161
|
+
});
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
type: tableRowType,
|
|
166
|
+
render: (props) => {
|
|
167
|
+
const { children } = props;
|
|
168
|
+
const element = props.element;
|
|
169
|
+
return renderTableRow({
|
|
170
|
+
children,
|
|
171
|
+
element,
|
|
172
|
+
});
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
type: tableCellType,
|
|
177
|
+
render: (props) => {
|
|
178
|
+
const { children } = props;
|
|
179
|
+
const element = props.element;
|
|
180
|
+
const firstAncestor = serializers.getFirstAncestor(element, (node) => node.type === tableMainType);
|
|
181
|
+
const body = firstAncestor === null || firstAncestor === void 0 ? void 0 : firstAncestor.children.find((child) => child.type === tableBodyType);
|
|
182
|
+
const firstRow = body === null || body === void 0 ? void 0 : body.children[0];
|
|
183
|
+
const firstCell = core.Element.isElement(firstRow) ? firstRow.children[0] : null;
|
|
184
|
+
return renderTableCell({
|
|
185
|
+
children,
|
|
186
|
+
element,
|
|
187
|
+
isColumnPinned: core.Element.isElement(firstCell) ? firstCell.pinned : false,
|
|
188
|
+
});
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
]);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
exports.createJsxSerializeTable = createJsxSerializeTable;
|
|
195
|
+
exports.defaultRenderTableElements = defaultRenderTableElements;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { TableElement, TableTypeKey, TableTitleTypeKey, TableMainTypeKey, TableHeaderTypeKey, TableBodyTypeKey, TableRowTypeKey, TableCellTypeKey, ColumnWidth } from '@quadrats/common/table';
|
|
2
|
+
import { JsxSerializeElementProps } from '@quadrats/react/jsx-serializer';
|
|
3
|
+
import { RefObject } from 'react';
|
|
4
|
+
export type JsxSerializeTableElementProps = JsxSerializeElementProps<TableElement>;
|
|
5
|
+
export type TableJsxSerializeElements = Record<TableTypeKey, (props: JsxSerializeTableElementProps) => JSX.Element | null | undefined> & Record<TableTitleTypeKey, (props: JsxSerializeTableElementProps) => JSX.Element | null | undefined> & Record<TableMainTypeKey, (props: JsxSerializeTableElementProps & {
|
|
6
|
+
columnWidths?: ColumnWidth[];
|
|
7
|
+
}) => JSX.Element | null | undefined> & Record<TableHeaderTypeKey, (props: JsxSerializeTableElementProps) => JSX.Element | null | undefined> & Record<TableBodyTypeKey, (props: JsxSerializeTableElementProps) => JSX.Element | null | undefined> & Record<TableRowTypeKey, (props: JsxSerializeTableElementProps) => JSX.Element | null | undefined> & Record<TableCellTypeKey, (props: JsxSerializeTableElementProps & {
|
|
8
|
+
isColumnPinned?: boolean;
|
|
9
|
+
}) => JSX.Element | null | undefined>;
|
|
10
|
+
export type TableScrollContextType = {
|
|
11
|
+
scrollRef: RefObject<HTMLDivElement | null>;
|
|
12
|
+
};
|
package/table/table.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.qdr-table__table-toolbar{right:unset;left:50%;top:-4px;transform:translate(-50%, -100%)}.qdr-table{display:flex;flex-flow:column;align-items:flex-start;gap:var(--qdr-spacing-4);margin:var(--qdr-spacing-11) 0;position:relative}.qdr-table__selection{padding:0;position:absolute;left:-22px;top:0;z-index:0;width:20px;height:20px;color:var(--qdr-action-inactive);border:none;border-radius:var(--qdr-radius-1);background-color:rgba(0,0,0,0);display:flex;align-items:center;justify-content:center;cursor:pointer}.qdr-table__selection:hover{background-color:var(--qdr-secondary-active-bg);color:var(--qdr-action-active)}.qdr-table__portal-container{position:relative;pointer-events:none}.qdr-table__title{width:100%;display:block;position:relative;margin:0;font-size:var(--qdr-typography-article-h6-font-size);line-height:var(--qdr-typography-article-h6-line-height);letter-spacing:var(--qdr-typography-article-h6-letter-spacing);font-weight:var(--qdr-typography-article-h6-font-weight);color:var(--qdr-text-primary);background-color:var(--qdr-surface-secondary)}.qdr-table__title__placeholder{position:absolute;left:0;top:0;color:var(--qdr-text-secondary);pointer-events:none}.qdr-table__header{background-color:var(--qdr-bg)}.qdr-table__header--pinned{position:sticky;z-index:2;top:0;box-shadow:0 2px 4px -2px rgba(0,0,0,.1490196078)}.qdr-table__scrollContainer{width:100%;max-width:100%;max-height:420px;overflow:auto;scrollbar-width:thin;position:relative}.qdr-table__main{margin:0;border-collapse:separate;border-spacing:0;table-layout:fixed}.qdr-table__main th:not(:first-child),.qdr-table__main td:not(:first-child){border-left:none}.qdr-table__main thead tr:not(:last-child) th,.qdr-table__main tbody tr:not(:last-child) td{border-bottom:none}.qdr-table__inline-table-toolbar,.qdr-table__cell__inline-table-toolbar{pointer-events:none;top:-50px;left:0;right:unset}.qdr-table__mainWrapper{width:100%;max-width:100%;height:100%;position:relative}.qdr-table__mainWrapper--selected .qdr-table__main{border:2px solid var(--qdr-primary)}.qdr-table__mainWrapper--selected .qdr-table__table-toolbar{opacity:1;pointer-events:auto}.qdr-table__body{background-color:var(--qdr-surface-primary)}.qdr-table__cell{position:relative;padding:var(--qdr-spacing-3) var(--qdr-spacing-4);font-size:var(--qdr-typography-article-body1-font-size);line-height:var(--qdr-typography-article-body1-line-height);letter-spacing:var(--qdr-typography-article-body1-letter-spacing);font-weight:var(--qdr-typography-article-body1-font-weight);color:var(--qdr-text-primary);text-align:left;border-top:1px solid var(--qdr-border);border-right:1px solid var(--qdr-border);border-bottom:1px solid var(--qdr-border);border-left:1px solid var(--qdr-border);vertical-align:top;word-break:break-all}.qdr-table__cell p,.qdr-table__cell ul,.qdr-table__cell ol{margin:0}.qdr-table__cell--resizing::after{content:"";position:absolute;right:0;top:0;width:2px;height:100%;background-color:var(--qdr-primary-light);pointer-events:none;opacity:1}.qdr-table__cell__resize-handle{position:absolute;right:0;top:0;width:6px;height:100%;transform:translateX(0);cursor:col-resize;z-index:1}.qdr-table__cell--header{font-weight:var(--qdr-typography-article-h6-font-weight);color:var(--qdr-text-primary);background-color:var(--qdr-bg)}.qdr-table__cell--pinned{position:sticky;z-index:1;left:0;box-shadow:2px 0 4px -2px rgba(0,0,0,.1490196078)}.qdr-table__cell--top-active{border-top:2px solid var(--qdr-primary-light) !important}.qdr-table__cell--right-active{border-right:2px solid var(--qdr-primary-light) !important}.qdr-table__cell--bottom-active{border-bottom:2px solid var(--qdr-primary-light) !important}.qdr-table__cell--left-active{border-left:2px solid var(--qdr-primary-light) !important}.qdr-table__btn-icon{color:var(--qdr-action-disabled);pointer-events:none}.qdr-table__add-column{position:absolute;z-index:0;cursor:pointer;padding:0;background-color:var(--qdr-block);border-radius:var(--qdr-radius-1);border:1px solid var(--qdr-divider);display:flex;align-items:center;justify-content:center;right:-24px;top:0;width:20px;height:100%}.qdr-table__add-column:hover{background-color:var(--qdr-bg)}.qdr-table__add-column:hover .qdr-table__btn-icon{color:var(--qdr-text-secondary)}.qdr-table__add-column:active{background-color:var(--qdr-divider);border:1px solid var(--qdr-border)}.qdr-table__add-column:active .qdr-table__btn-icon{color:var(--qdr-text-secondary)}.qdr-table__add-row{position:absolute;z-index:0;cursor:pointer;padding:0;background-color:var(--qdr-block);border-radius:var(--qdr-radius-1);border:1px solid var(--qdr-divider);display:flex;align-items:center;justify-content:center;bottom:-24px;left:0;width:100%;height:20px}.qdr-table__add-row:hover{background-color:var(--qdr-bg)}.qdr-table__add-row:hover .qdr-table__btn-icon{color:var(--qdr-text-secondary)}.qdr-table__add-row:active{background-color:var(--qdr-divider);border:1px solid var(--qdr-border)}.qdr-table__add-row:active .qdr-table__btn-icon{color:var(--qdr-text-secondary)}.qdr-table__add-both{position:absolute;z-index:0;cursor:pointer;padding:0;background-color:var(--qdr-block);border-radius:var(--qdr-radius-1);border:1px solid var(--qdr-divider);display:flex;align-items:center;justify-content:center;right:-24px;bottom:-24px;width:20px;height:20px}.qdr-table__add-both:hover{background-color:var(--qdr-bg)}.qdr-table__add-both:hover .qdr-table__btn-icon{color:var(--qdr-text-secondary)}.qdr-table__add-both:active{background-color:var(--qdr-divider);border:1px solid var(--qdr-border)}.qdr-table__add-both:active .qdr-table__btn-icon{color:var(--qdr-text-secondary)}.qdr-table__delete{color:var(--qdr-error)}@keyframes fade-in{0%{opacity:0}100%{opacity:1}}.qdr-table__cell__focus-toolbar,.qdr-table__cell__inline-table-toolbar{position:absolute;right:unset;transform:translate(-10%, -100%);padding:4px;border-radius:10px;border:1px solid var(--qdr-border);background:var(--qdr-bg);box-shadow:0 4px 8px -2px rgba(0,0,0,.1019607843),0 2px 4px -2px rgba(0,0,0,.0392156863);animation-name:fade-in;animation-duration:.1s;animation-delay:.1s;animation-iteration-count:1;animation-fill-mode:forwards;animation-timing-function:linear;pointer-events:auto;z-index:10}.qdr-table__cell-row-action{position:absolute;z-index:9;width:20px;height:24px;padding:0;border-radius:var(--qdr-radius-1);border:1px solid var(--qdr-primary-active-bg);background-color:var(--qdr-primary-hover-bg);display:flex;align-items:center;justify-content:center;pointer-events:auto;cursor:pointer;opacity:1}.qdr-table__cell-column-action{position:absolute;z-index:9;width:20px;height:24px;padding:0;border-radius:var(--qdr-radius-1);border:1px solid var(--qdr-primary-active-bg);background-color:var(--qdr-primary-hover-bg);display:flex;align-items:center;justify-content:center;pointer-events:auto;cursor:pointer;opacity:1;transform:rotate(90deg);transform-origin:center}.qdr-table__size-indicators{display:none;overflow:hidden;position:absolute;z-index:1;left:0;top:0;width:100%;max-width:100%;padding:8px 0;pointer-events:none;transform:translateY(-100%);flex-flow:row nowrap;align-items:center}.qdr-table__size-indicator{display:flex;align-items:center;justify-content:center;position:relative}.qdr-table__size{background-color:var(--qdr-action-inactive);color:var(--qdr-on-primary);padding:4px 8px;font-size:12px;white-space:pre-wrap;position:relative}.qdr-table__size::after{position:absolute;content:"";z-index:-1;top:calc(100% - 2px);left:50%;width:10px;height:10px;background-color:var(--qdr-action-inactive);border-right:1px solid var(--qdr-action-inactive);border-bottom:1px solid var(--qdr-action-inactive);transform:translateX(-50%) translateY(-50%) rotate(45deg)}
|