@canlooks/can-ui 0.0.162 → 0.0.164

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.
@@ -1,5 +1,5 @@
1
1
  import { ReactElement, ReactNode, Ref } from 'react';
2
- import { DivProps, Id, Obj } from '../../types';
2
+ import { DivProps, Id, Obj, Size } from '../../types';
3
3
  import { ColumnType, DataGridBaseProps, DataGridMultipleProps, DataGridSingleProps, OrderType, RowType } from '../dataGrid';
4
4
  import { FormItemProps, FormProps, FormRef, FormValue } from '../form';
5
5
  import { CurdFilterable, CurdFilterableProps } from './curdFilterable';
@@ -69,6 +69,8 @@ export interface CurdBaseProps<R extends RowType = RowType, F extends FormValue
69
69
  order?: Id[];
70
70
  onOrderChange?(order: Id[]): void;
71
71
  };
72
+ defaultSize?: Size;
73
+ onSizeChange?(size: Size): void;
72
74
  filterableProps?: Omit<CurdFilterableProps, 'columns'>;
73
75
  renderFilterable?(filterableProps: CurdFilterableProps): ReactNode;
74
76
  renderFilterConditions?: CurdFilterableProps['renderFilterConditions'];
@@ -24,7 +24,7 @@ const faPenToSquare_1 = require("@fortawesome/free-regular-svg-icons/faPenToSqua
24
24
  const faPlus_1 = require("@fortawesome/free-solid-svg-icons/faPlus");
25
25
  const faRotateRight_1 = require("@fortawesome/free-solid-svg-icons/faRotateRight");
26
26
  exports.Curd = (0, react_1.memo)((props) => {
27
- const { ref, wrapperProps, variant = 'standard', loadRows, onLoad, columns, toolbarLeft, toolbarRight, reloadable = true, onReload, resizable = true, columnConfigurable = true, filterProps, initialFilterValue, onFilter, filterableProps, renderFilterable, renderFilterConditions, copyable, creatable = true, updatable = true, deletable = true, createButtonProps, updateButtonProps, deleteButtonProps, deleteConfirmProps, controlColumnTitle = '操作', renderExtraControl, titleKey, dataName = '', createName = '添加', updateName = '编辑', deleteName = '删除', onCreate, onUpdate, onDelete, rowToForm, dialogProps, formProps, formRef, onChange, ...dataGridProps } = props;
27
+ const { ref, wrapperProps, variant = 'standard', loadRows, onLoad, columns, toolbarLeft, toolbarRight, reloadable = true, onReload, resizable = true, columnConfigurable = true, defaultSize = 'medium', onSizeChange, filterProps, initialFilterValue, onFilter, filterableProps, renderFilterable, renderFilterConditions, copyable, creatable = true, updatable = true, deletable = true, createButtonProps, updateButtonProps, deleteButtonProps, deleteConfirmProps, controlColumnTitle = '操作', renderExtraControl, titleKey, dataName = '', createName = '添加', updateName = '编辑', deleteName = '删除', onCreate, onUpdate, onDelete, rowToForm, dialogProps, formProps, formRef, onChange, ...dataGridProps } = props;
28
28
  /**
29
29
  * -------------------------------------------------------------
30
30
  * ref
@@ -120,7 +120,7 @@ exports.Curd = (0, react_1.memo)((props) => {
120
120
  * -------------------------------------------------------------
121
121
  * 表格设置
122
122
  */
123
- const [innerSize, setInnerSize] = (0, utils_1.useDerivedState)(props.size || props.tableProps?.size || 'medium');
123
+ const [innerSize, setInnerSize] = (0, utils_1.useControlled)(defaultSize, props.size || props.tableProps?.size, onSizeChange);
124
124
  const [innerPage, setInnerPage] = (0, utils_1.useControlled)(props.paginationProps?.defaultPage ?? 1, props.paginationProps?.page, props.paginationProps?.onPageChange);
125
125
  const [innerPageSize, setInnerPageSize] = (0, utils_1.useControlled)(props.paginationProps?.defaultPageSize ?? 10, props.paginationProps?.pageSize, props.paginationProps?.onPageSizeChange);
126
126
  const [innerOrderColumn, setInnerOrderColumn] = (0, utils_1.useControlled)(props.defaultOrderColumn, props.orderColumn);
@@ -134,6 +134,7 @@ exports.Curd = (0, react_1.memo)((props) => {
134
134
  * -------------------------------------------------------------
135
135
  * 行数据
136
136
  */
137
+ const containerRef = (0, react_1.useRef)(null);
137
138
  const { setOptions } = (0, selectionContext_1.useSelectionContext)();
138
139
  const [innerRows, _setInnerRows] = (0, utils_1.useDerivedState)(props.rows);
139
140
  (0, react_1.useEffect)(() => {
@@ -142,6 +143,7 @@ exports.Curd = (0, react_1.memo)((props) => {
142
143
  const setInnerRows = (data) => {
143
144
  setOptions?.(data);
144
145
  _setInnerRows(data);
146
+ containerRef.current.scrollTop = 0;
145
147
  };
146
148
  const [innerTotal, setInnerTotal] = (0, utils_1.useDerivedState)(props.paginationProps?.total || 0);
147
149
  const suppressReload = (0, react_1.useRef)(false);
@@ -245,10 +247,12 @@ exports.Curd = (0, react_1.memo)((props) => {
245
247
  (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [toolbarRight, (0, jsx_runtime_1.jsx)(divider_1.Divider, { className: curd_style_1.classes.divider, orientation: "vertical" })] }), reloadable &&
246
248
  (0, jsx_runtime_1.jsx)(tooltip_1.Tooltip, { title: "\u5237\u65B0", children: (0, jsx_runtime_1.jsx)(button_1.Button, { shape: "circular", variant: "text", color: "text.secondary", prefix: (0, jsx_runtime_1.jsx)(icon_1.Icon, { icon: faRotateRight_1.faRotateRight }), loading: innerLoading.current, onClick: reloadHandler }) }), resizable &&
247
249
  (0, jsx_runtime_1.jsx)(curdResizable_1.CurdResizable, { innerSize: innerSize.current, setInnerSize: setInnerSize }), columnConfigurable &&
248
- (0, jsx_runtime_1.jsx)(curdColumnConfig_1.CurdColumnConfig, { columns: orderedColumns, innerVisible: innerVisible.current, setInnerVisible: setInnerVisible, setInnerOrder: setInnerOrder })] })] }), (0, jsx_runtime_1.jsx)("div", { className: curd_style_1.classes.card, children: (0, jsx_runtime_1.jsx)(dataGrid_1.DataGrid, { ...dataGridProps, columns: actualColumns, tableProps: {
250
+ (0, jsx_runtime_1.jsx)(curdColumnConfig_1.CurdColumnConfig, { columns: orderedColumns, innerVisible: innerVisible.current, setInnerVisible: setInnerVisible, setInnerOrder: setInnerOrder })] })] }), (0, jsx_runtime_1.jsx)("div", { className: curd_style_1.classes.card, children: (0, jsx_runtime_1.jsx)(dataGrid_1.DataGrid, { ...dataGridProps, slotProps: {
251
+ container: { ref: (0, utils_1.cloneRef)(containerRef, dataGridProps?.slotProps?.container?.ref) }
252
+ }, tableProps: {
249
253
  ...props.tableProps,
250
254
  ...resizable && { size: innerSize.current }
251
- }, loading: innerLoading.current, rows: innerRows.current, paginatable: !loadRows && props.paginatable, renderPagination: loadRows && props.paginatable !== false
255
+ }, columns: actualColumns, loading: innerLoading.current, rows: innerRows.current, paginatable: !loadRows && props.paginatable, renderPagination: loadRows && props.paginatable !== false
252
256
  ? () => (0, jsx_runtime_1.jsx)(pagination_1.Pagination, { ...props.paginationProps, total: innerTotal.current, page: innerPage.current, onPageChange: setInnerPage, pageSize: innerPageSize.current, onPageSizeChange: setInnerPageSize })
253
257
  : props.renderPagination, orderColumn: innerOrderColumn.current, orderType: innerOrderType.current, onOrderChange: orderChangeHandler, _noRenderFormTag: true }) })] }), (creatable || updatable) &&
254
258
  (0, jsx_runtime_1.jsx)(curdDialog_1.CurdDialog, { ...dialogProps, ref: curdDialogRef, onFinish: finishHandler, curdProps: props })] }));
@@ -53,6 +53,7 @@ export interface ColumnType<R extends RowType = RowType> extends Omit<ComponentP
53
53
  _negativeRowSpan?: number;
54
54
  }
55
55
  interface DataGridSharedProps<R extends RowType = RowType> extends SlotsAndProps<{
56
+ container: ComponentProps<'div'>;
56
57
  tr: ComponentProps<'tr'>;
57
58
  }> {
58
59
  rowProps?(row: R, index: number, rows: R[]): ComponentProps<'tr'>;
@@ -130,7 +130,12 @@ exports.DataGrid = (0, react_1.memo)(({ slots, slotProps, columns, rows, rowProp
130
130
  const { page, pageSize } = _paginationProps;
131
131
  return orderedRows?.slice((page - 1) * pageSize, page * pageSize);
132
132
  }, [orderedRows, _paginationProps.page, _paginationProps.pageSize, paginatable]);
133
- const renderedContent = ((0, jsx_runtime_1.jsx)(columnResize_1.ColumnResizeContext, { columnResizable: columnResizable, children: ({ scrollerRef, tableRef }) => (0, jsx_runtime_1.jsxs)(table_1.TableContainer, { ref: scrollerRef, className: dataGrid_style_1.classes.container, children: [(0, jsx_runtime_1.jsx)(table_1.Table, { size: size, bordered: bordered, striped: striped, ...tableProps, ref: (0, utils_1.cloneRef)(tableProps?.ref, tableRef), children: (0, jsx_runtime_1.jsxs)(selectionContext_1.SelectionContext, { options: rows, primaryKey: primaryKey, childrenKey: childrenKey !== null ? childrenKey : void 0, relation: relation, integration: integration, disabled: !selectable, multiple: multiple, defaultValue: defaultValue, value: value, onChange: onChange, children: [(0, jsx_runtime_1.jsx)(dataGridHead_1.DataGridHead, { rows: rows, flattedColumns: flattedColumns, completedColumns: completedColumns, primaryKey: primaryKey, allowSelectAll: allowSelectAll, columnResizable: columnResizable, orderColumn: innerOrderColumn.current, orderType: innerOrderType.current, onOrderChange: orderChangeHandler, filterBubbleProps: filterBubbleProps, onFilterClick: onFilterClick }), (0, jsx_runtime_1.jsx)("tbody", { children: (0, jsx_runtime_1.jsx)(DataGridContext, { value: (0, react_1.useMemo)(() => ({
133
+ const { container: Container = table_1.TableContainer } = slots || {};
134
+ const { container: containerProps } = slotProps || {};
135
+ const renderedContent = ((0, jsx_runtime_1.jsx)(columnResize_1.ColumnResizeContext, { columnResizable: columnResizable, children: ({ scrollerRef, tableRef }) => (0, jsx_runtime_1.jsxs)(Container, { ...(0, utils_1.mergeComponentProps)(containerProps, {
136
+ ref: scrollerRef,
137
+ className: dataGrid_style_1.classes.container
138
+ }), children: [(0, jsx_runtime_1.jsx)(table_1.Table, { size: size, bordered: bordered, striped: striped, ...tableProps, ref: (0, utils_1.cloneRef)(tableProps?.ref, tableRef), children: (0, jsx_runtime_1.jsxs)(selectionContext_1.SelectionContext, { options: rows, primaryKey: primaryKey, childrenKey: childrenKey !== null ? childrenKey : void 0, relation: relation, integration: integration, disabled: !selectable, multiple: multiple, defaultValue: defaultValue, value: value, onChange: onChange, children: [(0, jsx_runtime_1.jsx)(dataGridHead_1.DataGridHead, { rows: rows, flattedColumns: flattedColumns, completedColumns: completedColumns, primaryKey: primaryKey, allowSelectAll: allowSelectAll, columnResizable: columnResizable, orderColumn: innerOrderColumn.current, orderType: innerOrderType.current, onOrderChange: orderChangeHandler, filterBubbleProps: filterBubbleProps, onFilterClick: onFilterClick }), (0, jsx_runtime_1.jsx)("tbody", { children: (0, jsx_runtime_1.jsx)(DataGridContext, { value: (0, react_1.useMemo)(() => ({
134
139
  slots, slotProps,
135
140
  rowProps, primaryKey, childrenKey, clickRowToSelect, indent, renderExpandIcon,
136
141
  expandedSet, flattedColumns, toggleExpanded
@@ -1,5 +1,5 @@
1
1
  import { ReactElement, ReactNode, Ref } from 'react';
2
- import { DivProps, Id, Obj } from '../../types.js';
2
+ import { DivProps, Id, Obj, Size } from '../../types.js';
3
3
  import { ColumnType, DataGridBaseProps, DataGridMultipleProps, DataGridSingleProps, OrderType, RowType } from '../dataGrid/index.js';
4
4
  import { FormItemProps, FormProps, FormRef, FormValue } from '../form/index.js';
5
5
  import { CurdFilterable, CurdFilterableProps } from './curdFilterable.js';
@@ -69,6 +69,8 @@ export interface CurdBaseProps<R extends RowType = RowType, F extends FormValue
69
69
  order?: Id[];
70
70
  onOrderChange?(order: Id[]): void;
71
71
  };
72
+ defaultSize?: Size;
73
+ onSizeChange?(size: Size): void;
72
74
  filterableProps?: Omit<CurdFilterableProps, 'columns'>;
73
75
  renderFilterable?(filterableProps: CurdFilterableProps): ReactNode;
74
76
  renderFilterConditions?: CurdFilterableProps['renderFilterConditions'];
@@ -4,7 +4,7 @@ import { DataGrid } from '../dataGrid/index.js';
4
4
  import { Form } from '../form/index.js';
5
5
  import { CurdFilterable } from './curdFilterable.js';
6
6
  import { classes, style } from './curd.style.js';
7
- import { clsx, useControlled, useCurdColumns, useDerivedState, useLoading, useSync, mergeComponentProps, CONTROL_COLUMN_KEY, useStrictEffect } from '../../utils/index.js';
7
+ import { clsx, useControlled, useCurdColumns, useDerivedState, useLoading, useSync, mergeComponentProps, CONTROL_COLUMN_KEY, useStrictEffect, cloneRef } from '../../utils/index.js';
8
8
  import { Button } from '../button/index.js';
9
9
  import { Tooltip } from '../tooltip/index.js';
10
10
  import { CurdColumnConfig } from './curdColumnConfig.js';
@@ -21,7 +21,7 @@ import { faPenToSquare } from '@fortawesome/free-regular-svg-icons/faPenToSquare
21
21
  import { faPlus } from '@fortawesome/free-solid-svg-icons/faPlus';
22
22
  import { faRotateRight } from '@fortawesome/free-solid-svg-icons/faRotateRight';
23
23
  export const Curd = memo((props) => {
24
- const { ref, wrapperProps, variant = 'standard', loadRows, onLoad, columns, toolbarLeft, toolbarRight, reloadable = true, onReload, resizable = true, columnConfigurable = true, filterProps, initialFilterValue, onFilter, filterableProps, renderFilterable, renderFilterConditions, copyable, creatable = true, updatable = true, deletable = true, createButtonProps, updateButtonProps, deleteButtonProps, deleteConfirmProps, controlColumnTitle = '操作', renderExtraControl, titleKey, dataName = '', createName = '添加', updateName = '编辑', deleteName = '删除', onCreate, onUpdate, onDelete, rowToForm, dialogProps, formProps, formRef, onChange, ...dataGridProps } = props;
24
+ const { ref, wrapperProps, variant = 'standard', loadRows, onLoad, columns, toolbarLeft, toolbarRight, reloadable = true, onReload, resizable = true, columnConfigurable = true, defaultSize = 'medium', onSizeChange, filterProps, initialFilterValue, onFilter, filterableProps, renderFilterable, renderFilterConditions, copyable, creatable = true, updatable = true, deletable = true, createButtonProps, updateButtonProps, deleteButtonProps, deleteConfirmProps, controlColumnTitle = '操作', renderExtraControl, titleKey, dataName = '', createName = '添加', updateName = '编辑', deleteName = '删除', onCreate, onUpdate, onDelete, rowToForm, dialogProps, formProps, formRef, onChange, ...dataGridProps } = props;
25
25
  /**
26
26
  * -------------------------------------------------------------
27
27
  * ref
@@ -117,7 +117,7 @@ export const Curd = memo((props) => {
117
117
  * -------------------------------------------------------------
118
118
  * 表格设置
119
119
  */
120
- const [innerSize, setInnerSize] = useDerivedState(props.size || props.tableProps?.size || 'medium');
120
+ const [innerSize, setInnerSize] = useControlled(defaultSize, props.size || props.tableProps?.size, onSizeChange);
121
121
  const [innerPage, setInnerPage] = useControlled(props.paginationProps?.defaultPage ?? 1, props.paginationProps?.page, props.paginationProps?.onPageChange);
122
122
  const [innerPageSize, setInnerPageSize] = useControlled(props.paginationProps?.defaultPageSize ?? 10, props.paginationProps?.pageSize, props.paginationProps?.onPageSizeChange);
123
123
  const [innerOrderColumn, setInnerOrderColumn] = useControlled(props.defaultOrderColumn, props.orderColumn);
@@ -131,6 +131,7 @@ export const Curd = memo((props) => {
131
131
  * -------------------------------------------------------------
132
132
  * 行数据
133
133
  */
134
+ const containerRef = useRef(null);
134
135
  const { setOptions } = useSelectionContext();
135
136
  const [innerRows, _setInnerRows] = useDerivedState(props.rows);
136
137
  useEffect(() => {
@@ -139,6 +140,7 @@ export const Curd = memo((props) => {
139
140
  const setInnerRows = (data) => {
140
141
  setOptions?.(data);
141
142
  _setInnerRows(data);
143
+ containerRef.current.scrollTop = 0;
142
144
  };
143
145
  const [innerTotal, setInnerTotal] = useDerivedState(props.paginationProps?.total || 0);
144
146
  const suppressReload = useRef(false);
@@ -242,10 +244,12 @@ export const Curd = memo((props) => {
242
244
  _jsxs(_Fragment, { children: [toolbarRight, _jsx(Divider, { className: classes.divider, orientation: "vertical" })] }), reloadable &&
243
245
  _jsx(Tooltip, { title: "\u5237\u65B0", children: _jsx(Button, { shape: "circular", variant: "text", color: "text.secondary", prefix: _jsx(Icon, { icon: faRotateRight }), loading: innerLoading.current, onClick: reloadHandler }) }), resizable &&
244
246
  _jsx(CurdResizable, { innerSize: innerSize.current, setInnerSize: setInnerSize }), columnConfigurable &&
245
- _jsx(CurdColumnConfig, { columns: orderedColumns, innerVisible: innerVisible.current, setInnerVisible: setInnerVisible, setInnerOrder: setInnerOrder })] })] }), _jsx("div", { className: classes.card, children: _jsx(DataGrid, { ...dataGridProps, columns: actualColumns, tableProps: {
247
+ _jsx(CurdColumnConfig, { columns: orderedColumns, innerVisible: innerVisible.current, setInnerVisible: setInnerVisible, setInnerOrder: setInnerOrder })] })] }), _jsx("div", { className: classes.card, children: _jsx(DataGrid, { ...dataGridProps, slotProps: {
248
+ container: { ref: cloneRef(containerRef, dataGridProps?.slotProps?.container?.ref) }
249
+ }, tableProps: {
246
250
  ...props.tableProps,
247
251
  ...resizable && { size: innerSize.current }
248
- }, loading: innerLoading.current, rows: innerRows.current, paginatable: !loadRows && props.paginatable, renderPagination: loadRows && props.paginatable !== false
252
+ }, columns: actualColumns, loading: innerLoading.current, rows: innerRows.current, paginatable: !loadRows && props.paginatable, renderPagination: loadRows && props.paginatable !== false
249
253
  ? () => _jsx(Pagination, { ...props.paginationProps, total: innerTotal.current, page: innerPage.current, onPageChange: setInnerPage, pageSize: innerPageSize.current, onPageSizeChange: setInnerPageSize })
250
254
  : props.renderPagination, orderColumn: innerOrderColumn.current, orderType: innerOrderType.current, onOrderChange: orderChangeHandler, _noRenderFormTag: true }) })] }), (creatable || updatable) &&
251
255
  _jsx(CurdDialog, { ...dialogProps, ref: curdDialogRef, onFinish: finishHandler, curdProps: props })] }));
@@ -53,6 +53,7 @@ export interface ColumnType<R extends RowType = RowType> extends Omit<ComponentP
53
53
  _negativeRowSpan?: number;
54
54
  }
55
55
  interface DataGridSharedProps<R extends RowType = RowType> extends SlotsAndProps<{
56
+ container: ComponentProps<'div'>;
56
57
  tr: ComponentProps<'tr'>;
57
58
  }> {
58
59
  rowProps?(row: R, index: number, rows: R[]): ComponentProps<'tr'>;
@@ -126,7 +126,12 @@ export const DataGrid = memo(({ slots, slotProps, columns, rows, rowProps, prima
126
126
  const { page, pageSize } = _paginationProps;
127
127
  return orderedRows?.slice((page - 1) * pageSize, page * pageSize);
128
128
  }, [orderedRows, _paginationProps.page, _paginationProps.pageSize, paginatable]);
129
- const renderedContent = (_jsx(ColumnResizeContext, { columnResizable: columnResizable, children: ({ scrollerRef, tableRef }) => _jsxs(TableContainer, { ref: scrollerRef, className: classes.container, children: [_jsx(Table, { size: size, bordered: bordered, striped: striped, ...tableProps, ref: cloneRef(tableProps?.ref, tableRef), children: _jsxs(SelectionContext, { options: rows, primaryKey: primaryKey, childrenKey: childrenKey !== null ? childrenKey : void 0, relation: relation, integration: integration, disabled: !selectable, multiple: multiple, defaultValue: defaultValue, value: value, onChange: onChange, children: [_jsx(DataGridHead, { rows: rows, flattedColumns: flattedColumns, completedColumns: completedColumns, primaryKey: primaryKey, allowSelectAll: allowSelectAll, columnResizable: columnResizable, orderColumn: innerOrderColumn.current, orderType: innerOrderType.current, onOrderChange: orderChangeHandler, filterBubbleProps: filterBubbleProps, onFilterClick: onFilterClick }), _jsx("tbody", { children: _jsx(DataGridContext, { value: useMemo(() => ({
129
+ const { container: Container = TableContainer } = slots || {};
130
+ const { container: containerProps } = slotProps || {};
131
+ const renderedContent = (_jsx(ColumnResizeContext, { columnResizable: columnResizable, children: ({ scrollerRef, tableRef }) => _jsxs(Container, { ...mergeComponentProps(containerProps, {
132
+ ref: scrollerRef,
133
+ className: classes.container
134
+ }), children: [_jsx(Table, { size: size, bordered: bordered, striped: striped, ...tableProps, ref: cloneRef(tableProps?.ref, tableRef), children: _jsxs(SelectionContext, { options: rows, primaryKey: primaryKey, childrenKey: childrenKey !== null ? childrenKey : void 0, relation: relation, integration: integration, disabled: !selectable, multiple: multiple, defaultValue: defaultValue, value: value, onChange: onChange, children: [_jsx(DataGridHead, { rows: rows, flattedColumns: flattedColumns, completedColumns: completedColumns, primaryKey: primaryKey, allowSelectAll: allowSelectAll, columnResizable: columnResizable, orderColumn: innerOrderColumn.current, orderType: innerOrderType.current, onOrderChange: orderChangeHandler, filterBubbleProps: filterBubbleProps, onFilterClick: onFilterClick }), _jsx("tbody", { children: _jsx(DataGridContext, { value: useMemo(() => ({
130
135
  slots, slotProps,
131
136
  rowProps, primaryKey, childrenKey, clickRowToSelect, indent, renderExpandIcon,
132
137
  expandedSet, flattedColumns, toggleExpanded
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@canlooks/can-ui",
3
- "version": "0.0.162",
3
+ "version": "0.0.164",
4
4
  "author": "C.CanLiang <canlooks@gmail.com>",
5
5
  "description": "My ui framework",
6
6
  "license": "MIT",