@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.
Files changed (83) hide show
  1. package/dist/cjs/components/accordion/accordion.style.d.ts +1 -1
  2. package/dist/cjs/components/alert/alert.style.d.ts +3 -3
  3. package/dist/cjs/components/button/button.style.d.ts +1 -1
  4. package/dist/cjs/components/checkboxBase/checkboxBase.style.d.ts +2 -2
  5. package/dist/cjs/components/clickAway/clickAway.d.ts +27 -27
  6. package/dist/cjs/components/dataGrid/dataGrid.style.d.ts +1 -1
  7. package/dist/cjs/components/descriptions/descriptions.style.d.ts +1 -1
  8. package/dist/cjs/components/dialog/dialog.style.d.ts +3 -3
  9. package/dist/cjs/components/inputBase/inputBase.style.d.ts +2 -2
  10. package/dist/cjs/components/menuItem/menuItem.d.ts +5 -1
  11. package/dist/cjs/components/menuItem/menuItem.js +1 -1
  12. package/dist/cjs/components/menuItem/menuItem.style.d.ts +2 -2
  13. package/dist/cjs/components/palette/palette.style.d.ts +1 -1
  14. package/dist/cjs/components/pickerDialog/pickerDialog.style.d.ts +1 -1
  15. package/dist/cjs/components/popper/popper.js +26 -21
  16. package/dist/cjs/components/progress/progress.js +2 -1
  17. package/dist/cjs/components/progress/progress.style.d.ts +1 -1
  18. package/dist/cjs/components/resizable/resizable.style.d.ts +1 -1
  19. package/dist/cjs/components/segmented/segmented.style.d.ts +1 -1
  20. package/dist/cjs/components/select/select.d.ts +1 -1
  21. package/dist/cjs/components/selectionContext/selectionContext.d.ts +2 -0
  22. package/dist/cjs/components/selectionContext/selectionHook.js +2 -1
  23. package/dist/cjs/components/snackbarBase/snackbarBase.style.d.ts +1 -1
  24. package/dist/cjs/components/status/status.style.d.ts +1 -1
  25. package/dist/cjs/components/tabs/tabs.style.d.ts +4 -4
  26. package/dist/cjs/components/tag/tag.style.d.ts +2 -2
  27. package/dist/cjs/components/transfer/transfer.style.d.ts +2 -2
  28. package/dist/cjs/components/tree/tree.d.ts +2 -2
  29. package/dist/cjs/components/tree/tree.js +15 -13
  30. package/dist/cjs/components/tree/tree.style.d.ts +5 -9
  31. package/dist/cjs/components/tree/tree.style.js +96 -206
  32. package/dist/cjs/components/tree/treeDnd.d.ts +3 -7
  33. package/dist/cjs/components/tree/treeDnd.js +7 -19
  34. package/dist/cjs/components/tree/treeDnd.style.d.ts +15 -0
  35. package/dist/cjs/components/tree/treeDnd.style.js +191 -0
  36. package/dist/cjs/components/tree/treeNode.d.ts +4 -4
  37. package/dist/cjs/components/tree/treeNode.js +82 -69
  38. package/dist/cjs/components/upload/upload.style.d.ts +1 -1
  39. package/dist/cjs/utils/dnd.d.ts +11 -3
  40. package/dist/cjs/utils/dnd.js +45 -2
  41. package/dist/cjs/utils/utils.d.ts +1 -1
  42. package/dist/esm/components/accordion/accordion.style.d.ts +1 -1
  43. package/dist/esm/components/alert/alert.style.d.ts +3 -3
  44. package/dist/esm/components/button/button.style.d.ts +1 -1
  45. package/dist/esm/components/checkboxBase/checkboxBase.style.d.ts +2 -2
  46. package/dist/esm/components/clickAway/clickAway.d.ts +27 -27
  47. package/dist/esm/components/dataGrid/dataGrid.style.d.ts +1 -1
  48. package/dist/esm/components/descriptions/descriptions.style.d.ts +1 -1
  49. package/dist/esm/components/dialog/dialog.style.d.ts +3 -3
  50. package/dist/esm/components/inputBase/inputBase.style.d.ts +2 -2
  51. package/dist/esm/components/menuItem/menuItem.d.ts +5 -1
  52. package/dist/esm/components/menuItem/menuItem.js +1 -1
  53. package/dist/esm/components/menuItem/menuItem.style.d.ts +2 -2
  54. package/dist/esm/components/palette/palette.style.d.ts +1 -1
  55. package/dist/esm/components/pickerDialog/pickerDialog.style.d.ts +1 -1
  56. package/dist/esm/components/popper/popper.js +26 -21
  57. package/dist/esm/components/progress/progress.js +2 -1
  58. package/dist/esm/components/progress/progress.style.d.ts +1 -1
  59. package/dist/esm/components/resizable/resizable.style.d.ts +1 -1
  60. package/dist/esm/components/segmented/segmented.style.d.ts +1 -1
  61. package/dist/esm/components/select/select.d.ts +1 -1
  62. package/dist/esm/components/selectionContext/selectionContext.d.ts +2 -0
  63. package/dist/esm/components/selectionContext/selectionHook.js +2 -1
  64. package/dist/esm/components/snackbarBase/snackbarBase.style.d.ts +1 -1
  65. package/dist/esm/components/status/status.style.d.ts +1 -1
  66. package/dist/esm/components/tabs/tabs.style.d.ts +4 -4
  67. package/dist/esm/components/tag/tag.style.d.ts +2 -2
  68. package/dist/esm/components/transfer/transfer.style.d.ts +2 -2
  69. package/dist/esm/components/tree/tree.d.ts +2 -2
  70. package/dist/esm/components/tree/tree.js +18 -16
  71. package/dist/esm/components/tree/tree.style.d.ts +5 -9
  72. package/dist/esm/components/tree/tree.style.js +95 -206
  73. package/dist/esm/components/tree/treeDnd.d.ts +3 -7
  74. package/dist/esm/components/tree/treeDnd.js +8 -20
  75. package/dist/esm/components/tree/treeDnd.style.d.ts +15 -0
  76. package/dist/esm/components/tree/treeDnd.style.js +186 -0
  77. package/dist/esm/components/tree/treeNode.d.ts +4 -4
  78. package/dist/esm/components/tree/treeNode.js +82 -69
  79. package/dist/esm/components/upload/upload.style.d.ts +1 -1
  80. package/dist/esm/utils/dnd.d.ts +11 -3
  81. package/dist/esm/utils/dnd.js +44 -2
  82. package/dist/esm/utils/utils.d.ts +1 -1
  83. 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 hoverStack = useRef(0);
361
- const pointerEnter = () => {
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 pointerLeave = () => {
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('pointerenter', pointerEnter);
388
+ anchorEl.addEventListener('pointerover', pointerOver);
386
389
  anchorEl.addEventListener('pointerleave', pointerLeave);
387
390
  return () => {
388
- anchorEl.removeEventListener('pointerenter', pointerEnter);
391
+ anchorEl.removeEventListener('pointerover', pointerOver);
389
392
  anchorEl.removeEventListener('pointerleave', pointerLeave);
390
393
  };
391
- }, [hoverable]);
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', pointerEnter);
399
- popperEl.addEventListener('pointerleave', pointerLeave);
401
+ popperEl.addEventListener('pointerenter', pointerEnterFn);
402
+ popperEl.addEventListener('pointerleave', pointerLeaveFn);
400
403
  return () => {
401
- popperEl.removeEventListener('pointerenter', pointerEnter);
402
- popperEl.removeEventListener('pointerleave', 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, { ref: childRef })
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 - Math.max(0, Math.min(100, value)) / 100 * (1 - gapDegree / 360)) })] }), showInfo && !indeterminate &&
72
+ : strokeDasharray * (1 - value / 100 * (1 - gapDegree / 360)) })] }), showInfo && !indeterminate &&
72
73
  _jsx("div", { className: classes.info, children: renderInfoFn() })] }) }));
73
74
  });
@@ -3,8 +3,8 @@ export declare const classes: {
3
3
  info: string;
4
4
  track: string;
5
5
  svg: string;
6
- icon: string;
7
6
  bar: string;
7
+ icon: string;
8
8
  } & {
9
9
  root: string;
10
10
  };
@@ -1,8 +1,8 @@
1
1
  import { Handle, ResizableProps } from './resizable';
2
2
  export declare const classes: {
3
+ container: string;
3
4
  corner: string;
4
5
  edge: string;
5
- container: string;
6
6
  } & {
7
7
  root: string;
8
8
  };
@@ -3,8 +3,8 @@ export declare const classes: {
3
3
  label: string;
4
4
  option: string;
5
5
  prefix: string;
6
- indicator: string;
7
6
  suffix: string;
7
+ indicator: string;
8
8
  } & {
9
9
  root: string;
10
10
  };
@@ -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);
@@ -2,8 +2,8 @@ export declare const classes: {
2
2
  text: string;
3
3
  title: string;
4
4
  content: string;
5
- close: string;
6
5
  icon: string;
6
+ close: string;
7
7
  item: string;
8
8
  titleRow: string;
9
9
  itemWrap: string;
@@ -1,7 +1,7 @@
1
1
  export declare const classes: {
2
2
  label: string;
3
- icon: string;
4
3
  dot: string;
4
+ icon: string;
5
5
  } & {
6
6
  root: string;
7
7
  };
@@ -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;
@@ -1,9 +1,9 @@
1
1
  import { TagProps } from './tag';
2
2
  export declare const classes: {
3
- content: string;
4
- close: string;
5
3
  prefix: string;
4
+ content: string;
6
5
  suffix: string;
6
+ close: string;
7
7
  } & {
8
8
  root: string;
9
9
  };
@@ -2,11 +2,11 @@ export declare const classes: {
2
2
  info: string;
3
3
  header: string;
4
4
  title: string;
5
- list: string;
6
5
  checkbox: string;
6
+ list: string;
7
+ buttons: string;
7
8
  count: string;
8
9
  panel: string;
9
- buttons: string;
10
10
  } & {
11
11
  root: string;
12
12
  };
@@ -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 | 'child';
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, useRef } from 'react';
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, style } from './tree.style';
7
- import { cloneRef, clsx, useTreeSearch } from '../../utils';
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, ref: cloneRef(containerRef, props.ref), css: style, className: clsx(classes.root, classes.levelBlock, props.className), "data-show-line": showLine, "data-sortable": sortable, children: [searchable &&
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, { ...selectionContextProps, children: _jsx(TreeContext, { value: useMemo(() => ({
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, containerRef: containerRef, children: useMemo(() => {
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 }, i) => {
72
- const currentValue = nodeProps[primaryKey];
69
+ return arr?.map(({ _isLast, _parentId, ...nodeProps }) => {
70
+ const currentId = nodeProps[primaryKey];
73
71
  const label = nodeProps[labelKey];
74
- return (_createElement(TreeNode, { ...nodeProps, key: currentValue, value: currentValue, label: typeof label === 'string' && deferredSearchValue
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(nodeProps[childrenKey])));
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 const style: () => import("@emotion/react").SerializedStyles;
15
+ export declare function useStyle({ indent }: {
16
+ indent: number;
17
+ }): import("@emotion/react").SerializedStyles[];