@canlooks/can-ui 0.0.96 → 0.0.98
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/dist/cjs/components/accordion/accordion.style.d.ts +1 -1
- package/dist/cjs/components/alert/alert.style.d.ts +3 -3
- package/dist/cjs/components/button/button.style.d.ts +1 -1
- package/dist/cjs/components/checkboxBase/checkboxBase.style.d.ts +2 -2
- package/dist/cjs/components/clickAway/clickAway.d.ts +27 -27
- package/dist/cjs/components/dataGrid/dataGrid.style.d.ts +1 -1
- package/dist/cjs/components/descriptions/descriptions.style.d.ts +1 -1
- package/dist/cjs/components/dialog/dialog.style.d.ts +3 -3
- package/dist/cjs/components/inputBase/inputBase.style.d.ts +2 -2
- package/dist/cjs/components/menuItem/menuItem.d.ts +5 -1
- package/dist/cjs/components/menuItem/menuItem.js +1 -1
- package/dist/cjs/components/menuItem/menuItem.style.d.ts +2 -2
- package/dist/cjs/components/palette/palette.style.d.ts +1 -1
- package/dist/cjs/components/pickerDialog/pickerDialog.style.d.ts +1 -1
- package/dist/cjs/components/popper/popper.js +26 -21
- package/dist/cjs/components/progress/progress.js +2 -1
- package/dist/cjs/components/progress/progress.style.d.ts +1 -1
- package/dist/cjs/components/resizable/resizable.style.d.ts +1 -1
- package/dist/cjs/components/segmented/segmented.style.d.ts +1 -1
- package/dist/cjs/components/select/select.d.ts +1 -1
- package/dist/cjs/components/selectionContext/selectionContext.d.ts +2 -0
- package/dist/cjs/components/selectionContext/selectionHook.js +2 -1
- package/dist/cjs/components/snackbarBase/snackbarBase.style.d.ts +1 -1
- package/dist/cjs/components/status/status.style.d.ts +1 -1
- package/dist/cjs/components/tabs/tabs.style.d.ts +4 -4
- package/dist/cjs/components/tag/tag.style.d.ts +2 -2
- package/dist/cjs/components/transfer/transfer.style.d.ts +2 -2
- package/dist/cjs/components/tree/tree.d.ts +2 -2
- package/dist/cjs/components/tree/tree.js +15 -13
- package/dist/cjs/components/tree/tree.style.d.ts +5 -9
- package/dist/cjs/components/tree/tree.style.js +96 -206
- package/dist/cjs/components/tree/treeDnd.d.ts +3 -7
- package/dist/cjs/components/tree/treeDnd.js +7 -19
- package/dist/cjs/components/tree/treeDnd.style.d.ts +15 -0
- package/dist/cjs/components/tree/treeDnd.style.js +191 -0
- package/dist/cjs/components/tree/treeNode.d.ts +4 -4
- package/dist/cjs/components/tree/treeNode.js +82 -69
- package/dist/cjs/components/upload/upload.style.d.ts +1 -1
- package/dist/cjs/utils/dnd.d.ts +11 -3
- package/dist/cjs/utils/dnd.js +45 -2
- package/dist/cjs/utils/utils.d.ts +1 -1
- package/dist/esm/components/accordion/accordion.style.d.ts +1 -1
- package/dist/esm/components/alert/alert.style.d.ts +3 -3
- package/dist/esm/components/button/button.style.d.ts +1 -1
- package/dist/esm/components/checkboxBase/checkboxBase.style.d.ts +2 -2
- package/dist/esm/components/clickAway/clickAway.d.ts +27 -27
- package/dist/esm/components/dataGrid/dataGrid.style.d.ts +1 -1
- package/dist/esm/components/descriptions/descriptions.style.d.ts +1 -1
- package/dist/esm/components/dialog/dialog.style.d.ts +3 -3
- package/dist/esm/components/inputBase/inputBase.style.d.ts +2 -2
- package/dist/esm/components/menuItem/menuItem.d.ts +5 -1
- package/dist/esm/components/menuItem/menuItem.js +1 -1
- package/dist/esm/components/menuItem/menuItem.style.d.ts +2 -2
- package/dist/esm/components/palette/palette.style.d.ts +1 -1
- package/dist/esm/components/pickerDialog/pickerDialog.style.d.ts +1 -1
- package/dist/esm/components/popper/popper.js +26 -21
- package/dist/esm/components/progress/progress.js +2 -1
- package/dist/esm/components/progress/progress.style.d.ts +1 -1
- package/dist/esm/components/resizable/resizable.style.d.ts +1 -1
- package/dist/esm/components/segmented/segmented.style.d.ts +1 -1
- package/dist/esm/components/select/select.d.ts +1 -1
- package/dist/esm/components/selectionContext/selectionContext.d.ts +2 -0
- package/dist/esm/components/selectionContext/selectionHook.js +2 -1
- package/dist/esm/components/snackbarBase/snackbarBase.style.d.ts +1 -1
- package/dist/esm/components/status/status.style.d.ts +1 -1
- package/dist/esm/components/tabs/tabs.style.d.ts +4 -4
- package/dist/esm/components/tag/tag.style.d.ts +2 -2
- package/dist/esm/components/transfer/transfer.style.d.ts +2 -2
- package/dist/esm/components/tree/tree.d.ts +2 -2
- package/dist/esm/components/tree/tree.js +18 -16
- package/dist/esm/components/tree/tree.style.d.ts +5 -9
- package/dist/esm/components/tree/tree.style.js +95 -206
- package/dist/esm/components/tree/treeDnd.d.ts +3 -7
- package/dist/esm/components/tree/treeDnd.js +8 -20
- package/dist/esm/components/tree/treeDnd.style.d.ts +15 -0
- package/dist/esm/components/tree/treeDnd.style.js +186 -0
- package/dist/esm/components/tree/treeNode.d.ts +4 -4
- package/dist/esm/components/tree/treeNode.js +82 -69
- package/dist/esm/components/upload/upload.style.d.ts +1 -1
- package/dist/esm/utils/dnd.d.ts +11 -3
- package/dist/esm/utils/dnd.js +44 -2
- package/dist/esm/utils/utils.d.ts +1 -1
- package/package.json +1 -1
|
@@ -357,51 +357,54 @@ export function Popper({ ref, popperRef, anchorElement, container = document.bod
|
|
|
357
357
|
const hoverable = triggersSet.has('hover');
|
|
358
358
|
const enterTimeout = useRef(void 0);
|
|
359
359
|
const leaveTimeout = useRef(void 0);
|
|
360
|
-
const
|
|
361
|
-
const
|
|
362
|
-
if (hoverStack.current++) {
|
|
363
|
-
return;
|
|
364
|
-
}
|
|
360
|
+
const isOvering = useRef(false);
|
|
361
|
+
const pointerEnterFn = useCallback(() => {
|
|
365
362
|
clearTimeout(leaveTimeout.current);
|
|
366
363
|
mouseEnterDelay
|
|
367
364
|
? enterTimeout.current = setTimeout(() => setInnerOpen(true), mouseEnterDelay)
|
|
368
365
|
: setInnerOpen(true);
|
|
369
|
-
};
|
|
370
|
-
const
|
|
371
|
-
if (--hoverStack.current) {
|
|
372
|
-
return;
|
|
373
|
-
}
|
|
366
|
+
}, [mouseEnterDelay]);
|
|
367
|
+
const pointerLeaveFn = useCallback(() => {
|
|
374
368
|
clearTimeout(enterTimeout.current);
|
|
375
369
|
mouseLeaveDelay
|
|
376
370
|
? leaveTimeout.current = setTimeout(() => setInnerOpen(false), mouseLeaveDelay)
|
|
377
371
|
: setInnerOpen(false);
|
|
378
|
-
};
|
|
379
|
-
// 绑定锚点元素
|
|
372
|
+
}, [mouseLeaveDelay]);
|
|
380
373
|
useEffect(() => {
|
|
381
374
|
if (!hoverable) {
|
|
382
375
|
return;
|
|
383
376
|
}
|
|
377
|
+
const pointerOver = (e) => {
|
|
378
|
+
if (!isOvering.current && e.target === anchorRef.current) {
|
|
379
|
+
isOvering.current = true;
|
|
380
|
+
pointerEnterFn();
|
|
381
|
+
}
|
|
382
|
+
};
|
|
383
|
+
const pointerLeave = () => {
|
|
384
|
+
isOvering.current = false;
|
|
385
|
+
pointerLeaveFn();
|
|
386
|
+
};
|
|
384
387
|
const anchorEl = anchorRef.current;
|
|
385
|
-
anchorEl.addEventListener('
|
|
388
|
+
anchorEl.addEventListener('pointerover', pointerOver);
|
|
386
389
|
anchorEl.addEventListener('pointerleave', pointerLeave);
|
|
387
390
|
return () => {
|
|
388
|
-
anchorEl.removeEventListener('
|
|
391
|
+
anchorEl.removeEventListener('pointerover', pointerOver);
|
|
389
392
|
anchorEl.removeEventListener('pointerleave', pointerLeave);
|
|
390
393
|
};
|
|
391
|
-
}, [
|
|
394
|
+
}, []);
|
|
392
395
|
// 绑定弹框元素,鼠标移入弹框也要保持弹框打开
|
|
393
396
|
useEffect(() => {
|
|
394
397
|
if (!hoverable || !innerPopperRef.current) {
|
|
395
398
|
return;
|
|
396
399
|
}
|
|
397
400
|
const popperEl = innerPopperRef.current;
|
|
398
|
-
popperEl.addEventListener('pointerenter',
|
|
399
|
-
popperEl.addEventListener('pointerleave',
|
|
401
|
+
popperEl.addEventListener('pointerenter', pointerEnterFn);
|
|
402
|
+
popperEl.addEventListener('pointerleave', pointerLeaveFn);
|
|
400
403
|
return () => {
|
|
401
|
-
popperEl.removeEventListener('pointerenter',
|
|
402
|
-
popperEl.removeEventListener('pointerleave',
|
|
404
|
+
popperEl.removeEventListener('pointerenter', pointerEnterFn);
|
|
405
|
+
popperEl.removeEventListener('pointerleave', pointerLeaveFn);
|
|
403
406
|
};
|
|
404
|
-
}, [innerOpen.current]);
|
|
407
|
+
}, [innerOpen.current, mouseLeaveDelay]);
|
|
405
408
|
/**
|
|
406
409
|
* focus相关
|
|
407
410
|
*/
|
|
@@ -510,7 +513,9 @@ export function Popper({ ref, popperRef, anchorElement, container = document.bod
|
|
|
510
513
|
}), [innerOpen.current, autoClose]);
|
|
511
514
|
const childRef = useCallback(cloneRef(children?.props.ref, anchorRef, ref), [children?.props.ref, ref]);
|
|
512
515
|
return (_jsxs(_Fragment, { children: [isValidElement(children)
|
|
513
|
-
? cloneElement(children, {
|
|
516
|
+
? cloneElement(children, {
|
|
517
|
+
ref: childRef
|
|
518
|
+
})
|
|
514
519
|
: children, renderedOnce.current && createPortal(_jsx(ClickAway, { disabled: !clickable && !enterable && !contextMenuable,
|
|
515
520
|
// 右键菜单点击anchor需要关闭弹框
|
|
516
521
|
targets: () => contextMenuEvent.current ? null : anchorRef.current, onClickAway: onClickAway, children: _jsx("div", { ...props, ref: innerPopperRef, css: style, className: clsx(classes.root, props.className), style: {
|
|
@@ -11,6 +11,7 @@ export const Progress = memo(({ showInfo = true, renderInfo, color, status = 'de
|
|
|
11
11
|
const isColorSpecified = !!color;
|
|
12
12
|
color ??= 'primary';
|
|
13
13
|
const { colors: { success, error } } = useTheme();
|
|
14
|
+
value = Math.max(0, Math.min(value, 100));
|
|
14
15
|
const isSucceed = status === 'success' || (status !== 'error' && value === 100 && variant !== 'gauge');
|
|
15
16
|
const renderInfoFn = () => {
|
|
16
17
|
if (renderInfo) {
|
|
@@ -68,6 +69,6 @@ export const Progress = memo(({ showInfo = true, renderInfo, color, status = 'de
|
|
|
68
69
|
: void 0
|
|
69
70
|
}, children: [_jsx("circle", { ...commonCircleProps, className: classes.track, strokeDasharray: variant === 'gauge' ? strokeDasharray : void 0, strokeDashoffset: variant === 'gauge' ? strokeDasharray * gapDegree / 360 : void 0 }), _jsx("circle", { ...commonCircleProps, ref: barRef, css: cssAnimation, className: classes.bar, strokeDasharray: strokeDasharray, strokeDashoffset: variant === 'circular'
|
|
70
71
|
? strokeDasharray * (1 - value / 100)
|
|
71
|
-
: strokeDasharray * (1 -
|
|
72
|
+
: strokeDasharray * (1 - value / 100 * (1 - gapDegree / 360)) })] }), showInfo && !indeterminate &&
|
|
72
73
|
_jsx("div", { className: classes.info, children: renderInfoFn() })] }) }));
|
|
73
74
|
});
|
|
@@ -32,4 +32,4 @@ export declare const Select: {
|
|
|
32
32
|
<O extends MenuOptionType, V extends Id = Id>(props: SelectProps<O, V>): ReactElement;
|
|
33
33
|
Option: typeof MenuItem;
|
|
34
34
|
};
|
|
35
|
-
export declare const Option: import("react").MemoExoticComponent<({ value, size, color, emphasized, selected, focused, disabled, showCheckbox, checkboxProps, ellipsis, prefix, label, suffix, searchToken, _level, indent, expandIcon, defaultExpanded, expanded, onExpandedChange, ...props }: import("../menuItem").MenuItemProps) => import("@emotion/react/jsx-runtime").JSX.Element>;
|
|
35
|
+
export declare const Option: import("react").MemoExoticComponent<({ value, size, color, emphasized, selected, focused, disabled, showCheckbox, checkboxProps, ellipsis, prefix, label, suffix, searchToken, scrollHere, _level, indent, expandIcon, defaultExpanded, expanded, onExpandedChange, ...props }: import("../menuItem").MenuItemProps) => import("@emotion/react/jsx-runtime").JSX.Element>;
|
|
@@ -4,6 +4,8 @@ export interface OptionType<V extends Id = Id> extends Obj {
|
|
|
4
4
|
children?: OptionType<V>[];
|
|
5
5
|
/** @private */
|
|
6
6
|
_parentId?: V;
|
|
7
|
+
/** @private */
|
|
8
|
+
_isLast?: boolean;
|
|
7
9
|
}
|
|
8
10
|
export type SelectionContextBaseProps<O extends OptionType<V>, V extends Id = Id> = {
|
|
9
11
|
options?: O[];
|
|
@@ -29,8 +29,9 @@ export function useSelection(props) {
|
|
|
29
29
|
const map = new Map();
|
|
30
30
|
const fn = (arr, parentId) => {
|
|
31
31
|
// 有时arr可能不为数组,需要判断,如DataGrid组件的row.children
|
|
32
|
-
Array.isArray(arr) && arr.forEach(item => {
|
|
32
|
+
Array.isArray(arr) && arr.forEach((item, i) => {
|
|
33
33
|
item._parentId = parentId;
|
|
34
|
+
item._isLast = i === arr.length - 1;
|
|
34
35
|
const id = item[props.primaryKey];
|
|
35
36
|
!isUnset(id) && map.set(id, item);
|
|
36
37
|
fn(item[props.childrenKey], id);
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { TabsProps } from './tabs';
|
|
2
2
|
export declare const classes: {
|
|
3
3
|
label: string;
|
|
4
|
-
scroll: string;
|
|
5
4
|
prefix: string;
|
|
5
|
+
suffix: string;
|
|
6
|
+
indicator: string;
|
|
6
7
|
end: string;
|
|
7
|
-
ellipsis: string;
|
|
8
8
|
start: string;
|
|
9
|
+
scroll: string;
|
|
10
|
+
ellipsis: string;
|
|
9
11
|
tab: string;
|
|
10
|
-
indicator: string;
|
|
11
|
-
suffix: string;
|
|
12
12
|
scrollWrap: string;
|
|
13
13
|
tabPrefix: string;
|
|
14
14
|
tabSuffix: string;
|
|
@@ -6,11 +6,11 @@ import { TreeNode, TreeNodeProps } from './treeNode';
|
|
|
6
6
|
export interface NodeType<V extends Id = Id> extends Partial<Omit<TreeNodeProps, 'children'>>, Omit<OptionType<V>, 'children'> {
|
|
7
7
|
children?: NodeType<V>[];
|
|
8
8
|
}
|
|
9
|
-
export type SortPlacement = 'before' | 'after';
|
|
9
|
+
export type SortPlacement = 'before' | 'after' | 'child';
|
|
10
10
|
export type SortInfo<V extends Id = Id> = {
|
|
11
11
|
source: V;
|
|
12
12
|
destination: V;
|
|
13
|
-
placement: SortPlacement
|
|
13
|
+
placement: SortPlacement;
|
|
14
14
|
};
|
|
15
15
|
export interface TreeBaseProps<N extends NodeType<V>, V extends Id = Id> extends Omit<SelectionContextBaseProps<N, V>, 'options'>, Omit<DivProps, 'defaultValue' | 'onChange' | 'onToggle'> {
|
|
16
16
|
nodes?: N[];
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { createElement as _createElement } from "@emotion/react";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
|
|
3
|
-
import { Children, createContext, isValidElement, memo, useContext, useMemo
|
|
3
|
+
import { Children, createContext, isValidElement, memo, useContext, useMemo } from 'react';
|
|
4
4
|
import { SelectionContext } from '../selectionContext';
|
|
5
5
|
import { Input } from '../input';
|
|
6
|
-
import { classes,
|
|
7
|
-
import {
|
|
6
|
+
import { classes, useStyle } from './tree.style';
|
|
7
|
+
import { clsx, useTreeSearch } from '../../utils';
|
|
8
8
|
import { Highlight } from '../highlight';
|
|
9
9
|
import { TreeNode } from './treeNode';
|
|
10
10
|
import { Icon } from '../icon';
|
|
@@ -17,11 +17,6 @@ export function useTreeContext() {
|
|
|
17
17
|
export const Tree = memo(({ nodes, labelKey = 'label', searchTokenKey, showLine = true, indent = 24, renderExpandIcon, multiple, showCheckbox = !!multiple, readOnly, clickLabelToExpand, defaultExpanded, expanded, onExpandedChange, sortable = false, showDragHandle = true, onSort, searchable, searchInputProps, defaultSearchValue, searchValue, onSearchChange,
|
|
18
18
|
// 从SelectionContext继承来的属性
|
|
19
19
|
primaryKey = 'id', childrenKey = 'children', relation = 'dependent', integration = 'shallowest', clearable, disabled, defaultValue, value, onChange, onToggle, ...props }) => {
|
|
20
|
-
const selectionContextProps = {
|
|
21
|
-
options: nodes, primaryKey, childrenKey, relation, integration,
|
|
22
|
-
multiple, defaultValue, value, onChange, disabled
|
|
23
|
-
};
|
|
24
|
-
const containerRef = useRef(null);
|
|
25
20
|
/**
|
|
26
21
|
* --------------------------------------------------------------
|
|
27
22
|
* 统一处理nodes与children
|
|
@@ -53,30 +48,37 @@ primaryKey = 'id', childrenKey = 'children', relation = 'dependent', integration
|
|
|
53
48
|
defaultExpanded, expanded, onExpandedChange,
|
|
54
49
|
defaultSearchValue, searchValue, onSearchChange
|
|
55
50
|
});
|
|
56
|
-
return (_jsxs("div", { ...props,
|
|
51
|
+
return (_jsxs("div", { ...props, css: useStyle({ indent }), className: clsx(classes.root, props.className), "data-show-line": showLine, children: [searchable &&
|
|
57
52
|
_jsx(Input, { className: classes.search, prefix: _jsx(Icon, { icon: faMagnifyingGlass }), placeholder: "\u641C\u7D22", value: innerSearchValue.current, ...searchInputProps, onChange: e => {
|
|
58
53
|
searchInputProps?.onChange?.(e);
|
|
59
54
|
setInnerSearchValue(e.target.value);
|
|
60
|
-
} }), _jsx(SelectionContext, { ...
|
|
55
|
+
} }), _jsx(SelectionContext, { ...{
|
|
56
|
+
options: actualTreeNodes, primaryKey, childrenKey, relation, integration,
|
|
57
|
+
multiple, defaultValue, value, onChange, disabled
|
|
58
|
+
}, children: _jsx(TreeContext, { value: useMemo(() => ({
|
|
61
59
|
expandedSet, toggleExpanded, indent, renderExpandIcon, clickLabelToExpand,
|
|
62
60
|
showCheckbox, readOnly, disabled
|
|
63
61
|
}), [
|
|
64
62
|
expandedSet, indent, renderExpandIcon, clickLabelToExpand,
|
|
65
63
|
showCheckbox, readOnly, disabled
|
|
66
|
-
]), children: _jsx(TreeDnd, { sortable: sortable, showDragHandle: showDragHandle, onSort: onSort,
|
|
64
|
+
]), children: _jsx(TreeDnd, { sortable: sortable, showDragHandle: showDragHandle, onSort: onSort, children: useMemo(() => {
|
|
67
65
|
if (!filteredTreeData?.length) {
|
|
68
66
|
return null;
|
|
69
67
|
}
|
|
70
68
|
const fn = (arr) => {
|
|
71
|
-
return arr?.map(({ _parentId, ...nodeProps }
|
|
72
|
-
const
|
|
69
|
+
return arr?.map(({ _isLast, _parentId, ...nodeProps }) => {
|
|
70
|
+
const currentId = nodeProps[primaryKey];
|
|
73
71
|
const label = nodeProps[labelKey];
|
|
74
|
-
|
|
72
|
+
const children = nodeProps[childrenKey];
|
|
73
|
+
delete nodeProps[primaryKey];
|
|
74
|
+
delete nodeProps[labelKey];
|
|
75
|
+
delete nodeProps[childrenKey];
|
|
76
|
+
return (_createElement(TreeNode, { ...nodeProps, key: currentId, id: currentId, label: typeof label === 'string' && deferredSearchValue
|
|
75
77
|
? _jsx(Highlight, { keywords: deferredSearchValue.split(' '), children: label })
|
|
76
|
-
: label }, fn(
|
|
78
|
+
: label }, fn(children)));
|
|
77
79
|
});
|
|
78
80
|
};
|
|
79
81
|
return fn(filteredTreeData);
|
|
80
|
-
}, [filteredTreeData]) }) }) })] }));
|
|
82
|
+
}, [filteredTreeData, primaryKey, labelKey, childrenKey, deferredSearchValue]) }) }) })] }));
|
|
81
83
|
});
|
|
82
84
|
Tree.Node = TreeNode;
|
|
@@ -2,20 +2,16 @@ export declare const classes: {
|
|
|
2
2
|
label: string;
|
|
3
3
|
search: string;
|
|
4
4
|
prefix: string;
|
|
5
|
+
suffix: string;
|
|
6
|
+
checkbox: string;
|
|
5
7
|
icon: string;
|
|
6
8
|
expand: string;
|
|
7
9
|
indent: string;
|
|
8
10
|
node: string;
|
|
9
|
-
checkbox: string;
|
|
10
|
-
container: string;
|
|
11
|
-
suffix: string;
|
|
12
11
|
contentWrap: string;
|
|
13
|
-
levelBlock: string;
|
|
14
|
-
dragHandle: string;
|
|
15
|
-
dragMask: string;
|
|
16
|
-
dragMaskPrev: string;
|
|
17
|
-
dragMaskNext: string;
|
|
18
12
|
} & {
|
|
19
13
|
root: string;
|
|
20
14
|
};
|
|
21
|
-
export declare
|
|
15
|
+
export declare function useStyle({ indent }: {
|
|
16
|
+
indent: number;
|
|
17
|
+
}): import("@emotion/react").SerializedStyles[];
|