@aloudata/aloudata-design 3.0.3 → 3.0.5
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/Button/index.js +1 -1
- package/dist/Button/index.js.map +1 -1
- package/dist/Collapse/index.d.ts +8 -3
- package/dist/Collapse/index.js +104 -88
- package/dist/Collapse/index.js.map +1 -1
- package/dist/Form/index.js +5 -2
- package/dist/Form/index.js.map +1 -1
- package/dist/InputNumber/index.js +7 -3
- package/dist/InputNumber/index.js.map +1 -1
- package/dist/Menu/index.js +44 -44
- package/dist/Menu/index.js.map +1 -1
- package/dist/Select/Selector/FixedOverflow.d.ts +16 -0
- package/dist/Select/Selector/FixedOverflow.js +143 -0
- package/dist/Select/Selector/FixedOverflow.js.map +1 -0
- package/dist/Select/Selector/MultipleSelector.js +2 -4
- package/dist/Select/Selector/MultipleSelector.js.map +1 -1
- package/dist/Tabs/index.js +2 -2
- package/dist/Tabs/index.js.map +1 -1
- package/dist/aloudata-design.css +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/InputNumber/index.tsx"],"sourcesContent":["import React, {\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport DisabledContext from '../ConfigProvider/DisabledContext';\nimport SizeContext from '../ConfigProvider/sizeContext';\nimport { cn } from '../lib/utils';\nimport { IInputNumberProps } from './type';\n\nexport default function InputNumber(props: IInputNumberProps) {\n const {\n className,\n disabled: customDisabled,\n size: customSize,\n status,\n value: controlledValue,\n defaultValue,\n min = -Infinity,\n max = Infinity,\n step = 1,\n precision,\n onChange,\n onPressEnter,\n onBlur,\n onFocus,\n formatter,\n parser,\n prefix,\n addonBefore,\n addonAfter,\n placeholder,\n autoFocus,\n bordered = true,\n keyboard = true,\n readonly: readOnly,\n style,\n id,\n } = props;\n\n const contentSize = useContext(SizeContext);\n const size = customSize || contentSize || 'middle';\n const disabled = useContext(DisabledContext);\n const mergedDisabled = customDisabled ?? disabled;\n\n const isControlled = 'value' in props;\n const [innerValue, setInnerValue] = useState<number | null | undefined>(\n defaultValue ?? null,\n );\n const currentValue = isControlled ? controlledValue : innerValue;\n\n const [inputStr, setInputStr] = useState(\n currentValue !== null && currentValue !== undefined\n ? String(currentValue)\n : '',\n );\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (currentValue !== null && currentValue !== undefined) {\n setInputStr(String(currentValue));\n } else {\n setInputStr('');\n }\n }, [currentValue]);\n\n const clamp = useCallback(\n (val: number) => {\n let v = Math.max(min, Math.min(max, val));\n if (precision !== undefined) {\n v = Number(v.toFixed(precision));\n }\n return v;\n },\n [min, max, precision],\n );\n\n const updateValue = useCallback(\n (newVal: number | null) => {\n const clamped = newVal !== null ? clamp(newVal) : null;\n if (!isControlled) setInnerValue(clamped);\n onChange?.(clamped);\n },\n [clamp, isControlled, onChange],\n );\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value;\n setInputStr(raw);\n if (raw === '' || raw === '-') return;\n const parsed = parser ? parser(raw) : Number(raw);\n if (!isNaN(parsed)) {\n updateValue(parsed);\n }\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n if (inputStr === '' || inputStr === '-') {\n updateValue(null);\n setInputStr('');\n } else {\n const parsed = parser ? parser(inputStr) : Number(inputStr);\n if (!isNaN(parsed)) {\n const clamped = clamp(parsed);\n updateValue(clamped);\n setInputStr(String(clamped));\n }\n }\n onBlur?.(e);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n onPressEnter?.(e);\n }\n if (!keyboard) return;\n const numStep = typeof step === 'string' ? Number(step) : step;\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n updateValue(clamp((currentValue ?? 0) + numStep));\n } else if (e.key === 'ArrowDown') {\n e.preventDefault();\n updateValue(clamp((currentValue ?? 0) - numStep));\n }\n };\n\n const displayValue = formatter\n ? formatter(currentValue ?? undefined, {\n userTyping: document.activeElement === inputRef.current,\n input: inputStr,\n })\n : inputStr;\n\n const hasAddon = addonBefore || addonAfter;\n\n const sizeClasses = cn(\n size === 'large' && 'ald-input-number-large tw-h-9 tw-text-base',\n size === 'small' && 'ald-input-number-small tw-h-7 tw-text-xs',\n size !== 'large' &&\n size !== 'small' &&\n 'ald-input-number-middle tw-h-8 tw-text-sm',\n );\n\n const radiusClasses = cn(\n size === 'large' && 'tw-rounded-[8px]',\n size === 'small' && 'tw-rounded-[4px]',\n size !== 'large' && size !== 'small' && 'tw-rounded-[6px]',\n );\n\n const inputBox = (\n <div\n className={cn(\n 'ald-input-number tw-inline-flex tw-min-w-0 tw-items-center tw-overflow-hidden',\n bordered &&\n 'tw-border tw-border-solid tw-border-[var(--interaction-border-neutral-normal)]',\n mergedDisabled\n ? 'ald-input-number-disabled tw-cursor-not-allowed tw-bg-[var(--global-cool-gray-alpha-50)] tw-text-[var(--content-secondary)]'\n : 'tw-bg-[var(--interaction-background-form-field)] tw-text-[var(--content-primary)] hover:tw-border-[var(--interaction-border-hover)]',\n !hasAddon && sizeClasses,\n hasAddon\n ? 'tw-h-auto tw-flex-1 tw-self-stretch tw-rounded-none'\n : radiusClasses,\n status === 'error' && 'tw-border-[var(--border-negative-strong)]',\n status === 'warning' && 'tw-border-[var(--border-warning-subtle)]',\n 'focus-within:tw-border-[var(--interaction-border-hover)] focus-within:tw-outline focus-within:tw-outline-1 focus-within:tw-outline-[var(--global-blue-500)]',\n !hasAddon && className,\n )}\n style={!hasAddon ? style : undefined}\n >\n {prefix && (\n <span className=\"tw-px-2 tw-text-[var(--content-secondary)]\">\n {prefix}\n </span>\n )}\n <input\n ref={inputRef}\n id={id}\n type=\"text\"\n inputMode=\"numeric\"\n // size=1 让 <input> 的 intrinsic 宽度坍缩到 1 个字符,\n // 在 flex 父容器中按 width / flex-1 受控,避免默认 size=20 把 inline-flex 外层撑出 ~150px 内容宽度。\n size={1}\n className={cn(\n 'tw-min-w-0 tw-flex-1 tw-border-0 tw-bg-transparent tw-px-[7px] tw-text-inherit tw-outline-none',\n mergedDisabled &&\n 'tw-cursor-not-allowed tw-text-[var(--content-secondary)]',\n )}\n value={displayValue}\n onChange={handleChange}\n onBlur={handleBlur}\n onFocus={onFocus}\n onKeyDown={handleKeyDown}\n disabled={mergedDisabled}\n readOnly={readOnly}\n autoFocus={autoFocus}\n placeholder={placeholder}\n />\n </div>\n );\n\n if (!hasAddon) return inputBox;\n\n return (\n <div\n className={cn(\n 'ald-input-number-group tw-inline-flex tw-w-full tw-items-stretch',\n sizeClasses,\n radiusClasses,\n mergedDisabled && 'ald-input-number-disabled',\n className,\n )}\n style={style}\n >\n {addonBefore && (\n <span\n className={cn(\n 'ald-input-number-addon tw-flex tw-shrink-0 tw-items-center tw-border tw-border-r-0 tw-border-solid tw-border-[var(--interaction-border-neutral-normal)] tw-bg-[var(--background-neutral-subtle)] tw-px-3 tw-text-[var(--content-secondary)]',\n size === 'large' && 'tw-rounded-l-[8px]',\n size === 'small' && 'tw-rounded-l-[4px]',\n size !== 'large' && size !== 'small' && 'tw-rounded-l-[6px]',\n )}\n >\n {addonBefore}\n </span>\n )}\n {inputBox}\n {addonAfter && (\n <span\n className={cn(\n 'ald-input-number-addon tw-flex tw-shrink-0 tw-items-center tw-border tw-border-l-0 tw-border-solid tw-border-[var(--interaction-border-neutral-normal)] tw-bg-[var(--background-neutral-subtle)] tw-px-3 tw-text-[var(--content-secondary)]',\n size === 'large' && 'tw-rounded-r-[8px]',\n size === 'small' && 'tw-rounded-r-[4px]',\n size !== 'large' && size !== 'small' && 'tw-rounded-r-[6px]',\n )}\n >\n {addonAfter}\n </span>\n )}\n </div>\n );\n}\n\nexport type { IInputNumberProps };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/InputNumber/index.tsx"],"sourcesContent":["import React, {\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport DisabledContext from '../ConfigProvider/DisabledContext';\nimport SizeContext from '../ConfigProvider/sizeContext';\nimport { cn } from '../lib/utils';\nimport { IInputNumberProps } from './type';\n\nexport default function InputNumber(props: IInputNumberProps) {\n const {\n className,\n disabled: customDisabled,\n size: customSize,\n status,\n value: controlledValue,\n defaultValue,\n min = -Infinity,\n max = Infinity,\n step = 1,\n precision,\n onChange,\n onPressEnter,\n onBlur,\n onFocus,\n formatter,\n parser,\n prefix,\n addonBefore,\n addonAfter,\n placeholder,\n autoFocus,\n bordered = true,\n keyboard = true,\n readonly: readOnly,\n style,\n id,\n } = props;\n\n const contentSize = useContext(SizeContext);\n const size = customSize || contentSize || 'middle';\n const disabled = useContext(DisabledContext);\n const mergedDisabled = customDisabled ?? disabled;\n\n const isControlled = 'value' in props;\n const [innerValue, setInnerValue] = useState<number | null | undefined>(\n defaultValue ?? null,\n );\n const currentValue = isControlled ? controlledValue : innerValue;\n\n const [inputStr, setInputStr] = useState(\n currentValue !== null && currentValue !== undefined\n ? String(currentValue)\n : '',\n );\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (currentValue !== null && currentValue !== undefined) {\n setInputStr(String(currentValue));\n } else {\n setInputStr('');\n }\n }, [currentValue]);\n\n const clamp = useCallback(\n (val: number) => {\n let v = Math.max(min, Math.min(max, val));\n if (precision !== undefined) {\n v = Number(v.toFixed(precision));\n }\n return v;\n },\n [min, max, precision],\n );\n\n const updateValue = useCallback(\n (newVal: number | null) => {\n const clamped = newVal !== null ? clamp(newVal) : null;\n if (!isControlled) setInnerValue(clamped);\n onChange?.(clamped);\n },\n [clamp, isControlled, onChange],\n );\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value;\n setInputStr(raw);\n if (raw === '') {\n // 清空立即同步到 value,对齐 antd 行为。\n // 否则消费方\"清空后直接点确定\"(未 blur 触发 handleBlur 的 null 兜底)拿到的\n // 仍是旧值,把已清空的筛选条件错误带进 query(被 release-2.3_test 周期实例\n // 更多浮窗实测复现)。\n updateValue(null);\n return;\n }\n if (raw === '-') return;\n const parsed = parser ? parser(raw) : Number(raw);\n if (!isNaN(parsed)) {\n updateValue(parsed);\n }\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n if (inputStr === '' || inputStr === '-') {\n updateValue(null);\n setInputStr('');\n } else {\n const parsed = parser ? parser(inputStr) : Number(inputStr);\n if (!isNaN(parsed)) {\n const clamped = clamp(parsed);\n updateValue(clamped);\n setInputStr(String(clamped));\n }\n }\n onBlur?.(e);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n onPressEnter?.(e);\n }\n if (!keyboard) return;\n const numStep = typeof step === 'string' ? Number(step) : step;\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n updateValue(clamp((currentValue ?? 0) + numStep));\n } else if (e.key === 'ArrowDown') {\n e.preventDefault();\n updateValue(clamp((currentValue ?? 0) - numStep));\n }\n };\n\n const displayValue = formatter\n ? formatter(currentValue ?? undefined, {\n userTyping: document.activeElement === inputRef.current,\n input: inputStr,\n })\n : inputStr;\n\n const hasAddon = addonBefore || addonAfter;\n\n const sizeClasses = cn(\n size === 'large' && 'ald-input-number-large tw-h-9 tw-text-base',\n size === 'small' && 'ald-input-number-small tw-h-7 tw-text-xs',\n size !== 'large' &&\n size !== 'small' &&\n 'ald-input-number-middle tw-h-8 tw-text-sm',\n );\n\n const radiusClasses = cn(\n size === 'large' && 'tw-rounded-[8px]',\n size === 'small' && 'tw-rounded-[4px]',\n size !== 'large' && size !== 'small' && 'tw-rounded-[6px]',\n );\n\n const inputBox = (\n <div\n className={cn(\n // 默认宽度 90px 与 antd InputNumber 对齐:input 上 size={1} 会让 intrinsic\n // 宽度坍缩到 1 字符,若 wrapper 也不给宽度,整个组件在 flex / inline 上下\n // 文里就只剩 ~9px。消费方可通过 className(`w-[xxx]`)或 style 覆盖。\n 'ald-input-number tw-inline-flex tw-w-[90px] tw-min-w-0 tw-items-center tw-overflow-hidden',\n bordered &&\n 'tw-border tw-border-solid tw-border-[var(--interaction-border-neutral-normal)]',\n mergedDisabled\n ? 'ald-input-number-disabled tw-cursor-not-allowed tw-bg-[var(--global-cool-gray-alpha-50)] tw-text-[var(--content-secondary)]'\n : 'tw-bg-[var(--interaction-background-form-field)] tw-text-[var(--content-primary)] hover:tw-border-[var(--interaction-border-hover)]',\n !hasAddon && sizeClasses,\n hasAddon\n ? 'tw-h-auto tw-flex-1 tw-self-stretch tw-rounded-none'\n : radiusClasses,\n status === 'error' && 'tw-border-[var(--border-negative-strong)]',\n status === 'warning' && 'tw-border-[var(--border-warning-subtle)]',\n 'focus-within:tw-border-[var(--interaction-border-hover)] focus-within:tw-outline focus-within:tw-outline-1 focus-within:tw-outline-[var(--global-blue-500)]',\n !hasAddon && className,\n )}\n style={!hasAddon ? style : undefined}\n >\n {prefix && (\n <span className=\"tw-px-2 tw-text-[var(--content-secondary)]\">\n {prefix}\n </span>\n )}\n <input\n ref={inputRef}\n id={id}\n type=\"text\"\n inputMode=\"numeric\"\n // size=1 让 <input> 的 intrinsic 宽度坍缩到 1 个字符,\n // 在 flex 父容器中按 width / flex-1 受控,避免默认 size=20 把 inline-flex 外层撑出 ~150px 内容宽度。\n size={1}\n className={cn(\n 'tw-min-w-0 tw-flex-1 tw-border-0 tw-bg-transparent tw-px-[7px] tw-text-inherit tw-outline-none',\n mergedDisabled &&\n 'tw-cursor-not-allowed tw-text-[var(--content-secondary)]',\n )}\n value={displayValue}\n onChange={handleChange}\n onBlur={handleBlur}\n onFocus={onFocus}\n onKeyDown={handleKeyDown}\n disabled={mergedDisabled}\n readOnly={readOnly}\n autoFocus={autoFocus}\n placeholder={placeholder}\n />\n </div>\n );\n\n if (!hasAddon) return inputBox;\n\n return (\n <div\n className={cn(\n // 自然宽 = 内部 inputBox 默认 90px + addonBefore/After 内容宽。inline-flex\n // 让外层按内容宽呈现,不再 `tw-w-full` 强吞 flex 父级剩余空间——后者会把\n // 同 flex 行的 Slider 挤成 0 宽(看板\"图形宽度\"行只剩 thumb 圆点的根因)。\n // `tw-min-w-0` 让本身作为 flex item 时受消费方 `flex-basis` / `width`\n // 真正约束——默认 `min-width: auto = min-content` 会被内部 input(90px) +\n // addon 撑到 ~126px,覆盖消费方的 flex-basis。内部 inputBox 已 `tw-min-w-0\n // tw-overflow-hidden`,被约束后内容会按 input flex-1 收缩,不会溢出。\n // 消费方需要撑满显式加 `tw-w-full` className,需要更窄/更宽直接覆盖宽度。\n 'ald-input-number-group tw-inline-flex tw-min-w-0 tw-items-stretch',\n sizeClasses,\n radiusClasses,\n mergedDisabled && 'ald-input-number-disabled',\n className,\n )}\n style={style}\n >\n {addonBefore && (\n <span\n className={cn(\n 'ald-input-number-addon tw-flex tw-shrink-0 tw-items-center tw-border tw-border-r-0 tw-border-solid tw-border-[var(--interaction-border-neutral-normal)] tw-bg-[var(--background-neutral-subtle)] tw-px-3 tw-text-[var(--content-secondary)]',\n size === 'large' && 'tw-rounded-l-[8px]',\n size === 'small' && 'tw-rounded-l-[4px]',\n size !== 'large' && size !== 'small' && 'tw-rounded-l-[6px]',\n )}\n >\n {addonBefore}\n </span>\n )}\n {inputBox}\n {addonAfter && (\n <span\n className={cn(\n 'ald-input-number-addon tw-flex tw-shrink-0 tw-items-center tw-border tw-border-l-0 tw-border-solid tw-border-[var(--interaction-border-neutral-normal)] tw-bg-[var(--background-neutral-subtle)] tw-px-3 tw-text-[var(--content-secondary)]',\n size === 'large' && 'tw-rounded-r-[8px]',\n size === 'small' && 'tw-rounded-r-[4px]',\n size !== 'large' && size !== 'small' && 'tw-rounded-r-[6px]',\n )}\n >\n {addonAfter}\n </span>\n )}\n </div>\n );\n}\n\nexport type { IInputNumberProps };\n"],"mappings":"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"}
|
package/dist/Menu/index.js
CHANGED
|
@@ -23,40 +23,40 @@ function Menu(props) {
|
|
|
23
23
|
const currPath = [...parentPath, item.key];
|
|
24
24
|
const titleStr = _.isString(item.label) ? item.label : "";
|
|
25
25
|
const isSelected = selectedKeys?.includes(item.key);
|
|
26
|
-
if (isSubMenuItem(item))
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}
|
|
26
|
+
if (isSubMenuItem(item)) {
|
|
27
|
+
const isLeafSubMenu = isLeafMenu(item.children);
|
|
28
|
+
return /* @__PURE__ */ jsx(SubMenu, {
|
|
29
|
+
label: /* @__PURE__ */ jsxs("div", {
|
|
30
|
+
className: "ald-menu-item-label",
|
|
31
|
+
title: titleStr,
|
|
32
|
+
children: [
|
|
33
|
+
item.icon ? /* @__PURE__ */ jsx("div", {
|
|
34
|
+
className: "ald-menu-item-label-icon",
|
|
35
|
+
children: item.icon
|
|
36
|
+
}) : null,
|
|
37
|
+
/* @__PURE__ */ jsx("div", {
|
|
38
|
+
className: "ald-menu-item-label-text",
|
|
39
|
+
children: item.label
|
|
40
|
+
}),
|
|
41
|
+
/* @__PURE__ */ jsxs("div", {
|
|
42
|
+
className: "ald-menu-item-right",
|
|
43
|
+
children: [isSelectableGroup ? /* @__PURE__ */ jsx("div", { className: "ald-menu-item-selection-slot" }) : null, /* @__PURE__ */ jsx(Memo$1, { size: 16 })]
|
|
44
|
+
})
|
|
45
|
+
]
|
|
46
|
+
}),
|
|
47
|
+
disabled: item.disabled,
|
|
48
|
+
itemProps: { className: isLeafSubMenu ? "ald-menu-submenu-leaf-trigger" : void 0 },
|
|
49
|
+
align: "start",
|
|
50
|
+
direction: "right",
|
|
51
|
+
gap: -8,
|
|
52
|
+
position: "anchor",
|
|
53
|
+
shift: 0,
|
|
54
|
+
menuStyle: { ...menuStyle },
|
|
55
|
+
menuClassName: cn("ald-menu-submenu-popup", isLeafSubMenu && "ald-menu-submenu-popup-leaf", item.popupClassName, rootClosing && "ald-menu-submenu-popup-root-closing"),
|
|
56
|
+
overflow: isLeafSubMenu ? "auto" : void 0,
|
|
57
|
+
children: getMenuItems(item.children, currPath)
|
|
58
|
+
}, item.key);
|
|
59
|
+
}
|
|
60
60
|
return /* @__PURE__ */ jsx(MenuItem, {
|
|
61
61
|
className: cn(item.className, {
|
|
62
62
|
"ald-menu-item-danger": item.danger,
|
|
@@ -77,10 +77,6 @@ function Menu(props) {
|
|
|
77
77
|
className: "ald-menu-item-label",
|
|
78
78
|
title: titleStr,
|
|
79
79
|
children: [
|
|
80
|
-
isSelectableGroup ? /* @__PURE__ */ jsx("div", {
|
|
81
|
-
className: cn("ald-menu-item-selection-slot", isSelected && "ald-menu-item-selection-slot-selected ald-menu-item-selected-icon"),
|
|
82
|
-
children: isSelected ? /* @__PURE__ */ jsx(Memo, {}) : null
|
|
83
|
-
}) : null,
|
|
84
80
|
item.icon ? /* @__PURE__ */ jsx("div", {
|
|
85
81
|
className: "ald-menu-item-label-icon",
|
|
86
82
|
children: item.icon
|
|
@@ -88,7 +84,14 @@ function Menu(props) {
|
|
|
88
84
|
/* @__PURE__ */ jsx("div", {
|
|
89
85
|
className: "ald-menu-item-label-text",
|
|
90
86
|
children: item.label
|
|
91
|
-
})
|
|
87
|
+
}),
|
|
88
|
+
isSelectableGroup ? /* @__PURE__ */ jsx("div", {
|
|
89
|
+
className: "ald-menu-item-right",
|
|
90
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
91
|
+
className: cn("ald-menu-item-selection-slot", isSelected && "ald-menu-item-selection-slot-selected ald-menu-item-selected-icon"),
|
|
92
|
+
children: isSelected ? /* @__PURE__ */ jsx(Memo, {}) : null
|
|
93
|
+
})
|
|
94
|
+
}) : null
|
|
92
95
|
]
|
|
93
96
|
})
|
|
94
97
|
}, item.key);
|
|
@@ -108,12 +111,9 @@ function Menu(props) {
|
|
|
108
111
|
transitionTimeout: 200,
|
|
109
112
|
submenuOpenDelay: 0,
|
|
110
113
|
submenuCloseDelay: 0,
|
|
111
|
-
menuStyle: {
|
|
112
|
-
...menuStyle,
|
|
113
|
-
overflow: externalOverflow ? void 0 : leafOverflow
|
|
114
|
-
},
|
|
114
|
+
menuStyle: { ...menuStyle },
|
|
115
115
|
anchorRef: ref,
|
|
116
|
-
className: cn(className, "ald-menu"),
|
|
116
|
+
className: cn(className, "ald-menu", leafOverflow && !externalOverflow && "ald-menu-leaf"),
|
|
117
117
|
position: externalOverflow ? "initial" : "auto",
|
|
118
118
|
captureFocus: false,
|
|
119
119
|
viewScroll: externalOverflow ? "initial" : "auto",
|
package/dist/Menu/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/Menu/index.tsx"],"sourcesContent":["import {\n ControlledMenu,\n MenuDivider,\n MenuHeader,\n MenuItem,\n SubMenu,\n} from '@szhsin/react-menu';\nimport { cn } from '../lib/utils';\nimport _ from 'lodash';\nimport React, { useRef } from 'react';\nimport { CheckLightLine, ChevronRightLine } from '../Icon';\nimport './menu.css';\n\nexport interface MenuProps {\n onClick?: (info: MenuInfo) => void;\n onBeforeLeafItemClick?: () => void;\n className?: string;\n items: MenuItemType[];\n selectedKeys?: string[];\n menuStyle?: React.CSSProperties;\n rootClosing?: boolean;\n /** @internal 由 Dropdown 注入,禁用内部定位/overflow 计算。不支持含 SubMenu 的菜单 */\n externalOverflow?: boolean;\n}\n\nexport default function Menu(props: MenuProps) {\n const {\n className,\n items,\n onClick: onMenuClick,\n onBeforeLeafItemClick,\n selectedKeys,\n menuStyle,\n rootClosing = false,\n externalOverflow,\n } = props;\n const selectedKeySet = new Set(selectedKeys || []);\n\n const hasDirectSelectedItem = (items: MenuItemType[]): boolean =>\n items.some((item) => {\n if (isSubMenuItem(item)) {\n return selectedKeySet.has(item.key);\n }\n if (isHeaderMenuItem(item) || isDivideMenuItem(item)) {\n return false;\n }\n return selectedKeySet.has(item.key);\n });\n\n const getMenuItems = (items: MenuItemType[], parentPath: string[] = []) => {\n const isSelectableGroup = hasDirectSelectedItem(items);\n\n return items.map((item, index) => {\n if (isDivideMenuItem(item)) {\n return <MenuDivider key={`divider_${index}`} />;\n }\n if (isHeaderMenuItem(item)) {\n return <MenuHeader key={`header_${index}`}>{item.label}</MenuHeader>;\n }\n const currPath = [...parentPath, item.key];\n const titleStr = _.isString(item.label) ? item.label : '';\n const isSelected = selectedKeys?.includes(item.key);\n\n if (isSubMenuItem(item)) {\n const subMenuItemLabel = (\n <div className=\"ald-menu-item-label\" title={titleStr}>\n {isSelectableGroup ? (\n <div className=\"ald-menu-item-selection-slot\" />\n ) : null}\n {item.icon ? (\n <div className=\"ald-menu-item-label-icon\">{item.icon}</div>\n ) : null}\n <div className=\"ald-menu-item-label-text\">{item.label}</div>\n <div className=\"ald-menu-item-right\">\n <ChevronRightLine size={16} />\n </div>\n </div>\n );\n\n return (\n <SubMenu\n key={item.key}\n label={subMenuItemLabel}\n disabled={item.disabled}\n align=\"start\"\n direction=\"right\"\n gap={-8}\n position=\"anchor\"\n shift={0}\n menuStyle={{\n ...menuStyle,\n overflow: isLeafMenu(item.children) ? 'auto' : undefined,\n }}\n menuClassName={cn(\n 'ald-menu-submenu-popup',\n item.popupClassName,\n rootClosing && 'ald-menu-submenu-popup-root-closing',\n )}\n overflow={isLeafMenu(item.children) ? 'auto' : undefined}\n >\n {getMenuItems(item.children, currPath)}\n </SubMenu>\n );\n }\n\n return (\n <MenuItem\n key={item.key}\n className={cn(item.className, {\n 'ald-menu-item-danger': item.danger,\n 'ald-menu-item-selected': isSelected,\n })}\n disabled={item.disabled}\n onClick={({ syntheticEvent }) => {\n onBeforeLeafItemClick?.();\n const menuInfo = {\n key: item.key,\n keyPath: currPath,\n domEvent: syntheticEvent,\n };\n if (item.onClick) {\n item.onClick(menuInfo);\n }\n if (onMenuClick) {\n onMenuClick(menuInfo);\n }\n }}\n >\n <div className=\"ald-menu-item-label\" title={titleStr}>\n {isSelectableGroup ? (\n <div\n className={cn(\n 'ald-menu-item-selection-slot',\n isSelected &&\n 'ald-menu-item-selection-slot-selected ald-menu-item-selected-icon',\n )}\n >\n {isSelected ? <CheckLightLine /> : null}\n </div>\n ) : null}\n {item.icon ? (\n <div className=\"ald-menu-item-label-icon\">{item.icon}</div>\n ) : null}\n <div className=\"ald-menu-item-label-text\">{item.label}</div>\n </div>\n </MenuItem>\n );\n });\n };\n\n const ref = useRef(null);\n\n const leafOverflow = isLeafMenu(items) ? 'auto' : undefined;\n\n return (\n <>\n <div style={{ display: 'none' }} ref={ref} />\n <ControlledMenu\n state=\"open\"\n transition={{ open: true, close: true }}\n transitionTimeout={200}\n submenuOpenDelay={0}\n submenuCloseDelay={0}\n menuStyle={{\n ...menuStyle,\n overflow: externalOverflow ? undefined : leafOverflow,\n }}\n anchorRef={ref}\n className={cn(className, 'ald-menu')}\n position={externalOverflow ? 'initial' : 'auto'}\n captureFocus={false}\n viewScroll={externalOverflow ? 'initial' : 'auto'}\n overflow={externalOverflow ? 'visible' : leafOverflow}\n >\n {getMenuItems(items || [])}\n </ControlledMenu>\n </>\n );\n}\n\nexport function isHeaderMenuItem(\n menuItem: MenuItemType,\n): menuItem is MenuHeaderType {\n return 'type' in menuItem && menuItem.type === 'header';\n}\n\nexport function isDivideMenuItem(\n menuItem: MenuItemType,\n): menuItem is MenuDividerType {\n return 'type' in menuItem && menuItem.type === 'divider';\n}\n\nexport function isSubMenuItem(menuItem: MenuItemType): menuItem is SubMenuType {\n return 'children' in menuItem && !!menuItem.children;\n}\n\nexport function isLeafMenu(menuItems: MenuItemType[]) {\n return !_.some(menuItems, (item) => isSubMenuItem(item));\n}\n\nexport type MenuItemType =\n | ItemType\n | MenuDividerType\n | SubMenuType\n | MenuHeaderType;\n\nexport interface ItemType {\n key: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n onClick?: (info: MenuInfo) => void;\n danger?: boolean;\n disabled?: boolean;\n className?: string;\n}\n\nexport interface MenuDividerType {\n key?: string;\n type: 'divider';\n}\n\nexport interface MenuHeaderType {\n key?: string;\n type: 'header';\n label: string;\n}\n\nexport interface SubMenuType {\n children: MenuItemType[];\n key: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n popupClassName?: string;\n disabled?: boolean;\n}\n\nexport interface MenuInfo {\n key: string;\n keyPath: string[];\n domEvent: MouseEvent | KeyboardEvent;\n // 阻止菜单关闭\n keepOpen?: boolean;\n}\n"],"mappings":";;;;;;;;;AAyBA,SAAwB,KAAK,OAAkB;CAC7C,MAAM,EACJ,WACA,OACA,SAAS,aACT,uBACA,cACA,WACA,cAAc,OACd,qBACE;CACJ,MAAM,iBAAiB,IAAI,IAAI,gBAAgB,EAAE,CAAC;CAElD,MAAM,yBAAyB,UAC7B,MAAM,MAAM,SAAS;AACnB,MAAI,cAAc,KAAK,CACrB,QAAO,eAAe,IAAI,KAAK,IAAI;AAErC,MAAI,iBAAiB,KAAK,IAAI,iBAAiB,KAAK,CAClD,QAAO;AAET,SAAO,eAAe,IAAI,KAAK,IAAI;GACnC;CAEJ,MAAM,gBAAgB,OAAuB,aAAuB,EAAE,KAAK;EACzE,MAAM,oBAAoB,sBAAsB,MAAM;AAEtD,SAAO,MAAM,KAAK,MAAM,UAAU;AAChC,OAAI,iBAAiB,KAAK,CACxB,QAAO,oBAAC,aAAD,EAAwC,EAAtB,WAAW,QAAW;AAEjD,OAAI,iBAAiB,KAAK,CACxB,QAAO,oBAAC,YAAD,EAAA,UAAqC,KAAK,OAAmB,EAA5C,UAAU,QAAkC;GAEtE,MAAM,WAAW,CAAC,GAAG,YAAY,KAAK,IAAI;GAC1C,MAAM,WAAW,EAAE,SAAS,KAAK,MAAM,GAAG,KAAK,QAAQ;GACvD,MAAM,aAAa,cAAc,SAAS,KAAK,IAAI;AAEnD,OAAI,cAAc,KAAK,CAgBrB,QACE,oBAAC,SAAD;IAEE,OAjBF,qBAAC,OAAD;KAAK,WAAU;KAAsB,OAAO;eAA5C;MACG,oBACC,oBAAC,OAAD,EAAK,WAAU,gCAAiC,CAAA,GAC9C;MACH,KAAK,OACJ,oBAAC,OAAD;OAAK,WAAU;iBAA4B,KAAK;OAAW,CAAA,GACzD;MACJ,oBAAC,OAAD;OAAK,WAAU;iBAA4B,KAAK;OAAY,CAAA;MAC5D,oBAAC,OAAD;OAAK,WAAU;iBACb,oBAAC,QAAD,EAAkB,MAAM,IAAM,CAAA;OAC1B,CAAA;MACF;;IAOJ,UAAU,KAAK;IACf,OAAM;IACN,WAAU;IACV,KAAK;IACL,UAAS;IACT,OAAO;IACP,WAAW;KACT,GAAG;KACH,UAAU,WAAW,KAAK,SAAS,GAAG,SAAS;KAChD;IACD,eAAe,GACb,0BACA,KAAK,gBACL,eAAe,sCAChB;IACD,UAAU,WAAW,KAAK,SAAS,GAAG,SAAS;cAE9C,aAAa,KAAK,UAAU,SAAS;IAC9B,EApBH,KAAK,IAoBF;AAId,UACE,oBAAC,UAAD;IAEE,WAAW,GAAG,KAAK,WAAW;KAC5B,wBAAwB,KAAK;KAC7B,0BAA0B;KAC3B,CAAC;IACF,UAAU,KAAK;IACf,UAAU,EAAE,qBAAqB;AAC/B,8BAAyB;KACzB,MAAM,WAAW;MACf,KAAK,KAAK;MACV,SAAS;MACT,UAAU;MACX;AACD,SAAI,KAAK,QACP,MAAK,QAAQ,SAAS;AAExB,SAAI,YACF,aAAY,SAAS;;cAIzB,qBAAC,OAAD;KAAK,WAAU;KAAsB,OAAO;eAA5C;MACG,oBACC,oBAAC,OAAD;OACE,WAAW,GACT,gCACA,cACE,oEACH;iBAEA,aAAa,oBAAC,MAAD,EAAkB,CAAA,GAAG;OAC/B,CAAA,GACJ;MACH,KAAK,OACJ,oBAAC,OAAD;OAAK,WAAU;iBAA4B,KAAK;OAAW,CAAA,GACzD;MACJ,oBAAC,OAAD;OAAK,WAAU;iBAA4B,KAAK;OAAY,CAAA;MACxD;;IACG,EAtCJ,KAAK,IAsCD;IAEb;;CAGJ,MAAM,MAAM,OAAO,KAAK;CAExB,MAAM,eAAe,WAAW,MAAM,GAAG,SAAS;AAElD,QACE,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,OAAD;EAAK,OAAO,EAAE,SAAS,QAAQ;EAAO;EAAO,CAAA,EAC7C,oBAAC,gBAAD;EACE,OAAM;EACN,YAAY;GAAE,MAAM;GAAM,OAAO;GAAM;EACvC,mBAAmB;EACnB,kBAAkB;EAClB,mBAAmB;EACnB,WAAW;GACT,GAAG;GACH,UAAU,mBAAmB,SAAY;GAC1C;EACD,WAAW;EACX,WAAW,GAAG,WAAW,WAAW;EACpC,UAAU,mBAAmB,YAAY;EACzC,cAAc;EACd,YAAY,mBAAmB,YAAY;EAC3C,UAAU,mBAAmB,YAAY;YAExC,aAAa,SAAS,EAAE,CAAC;EACX,CAAA,CAChB,EAAA,CAAA;;AAIP,SAAgB,iBACd,UAC4B;AAC5B,QAAO,UAAU,YAAY,SAAS,SAAS;;AAGjD,SAAgB,iBACd,UAC6B;AAC7B,QAAO,UAAU,YAAY,SAAS,SAAS;;AAGjD,SAAgB,cAAc,UAAiD;AAC7E,QAAO,cAAc,YAAY,CAAC,CAAC,SAAS;;AAG9C,SAAgB,WAAW,WAA2B;AACpD,QAAO,CAAC,EAAE,KAAK,YAAY,SAAS,cAAc,KAAK,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/Menu/index.tsx"],"sourcesContent":["import {\n ControlledMenu,\n MenuDivider,\n MenuHeader,\n MenuItem,\n SubMenu,\n} from '@szhsin/react-menu';\nimport { cn } from '../lib/utils';\nimport _ from 'lodash';\nimport React, { useRef } from 'react';\nimport { CheckLightLine, ChevronRightLine } from '../Icon';\nimport './menu.css';\n\nexport interface MenuProps {\n onClick?: (info: MenuInfo) => void;\n onBeforeLeafItemClick?: () => void;\n className?: string;\n items: MenuItemType[];\n selectedKeys?: string[];\n menuStyle?: React.CSSProperties;\n rootClosing?: boolean;\n /** @internal 由 Dropdown 注入,禁用内部定位/overflow 计算。不支持含 SubMenu 的菜单 */\n externalOverflow?: boolean;\n}\n\nexport default function Menu(props: MenuProps) {\n const {\n className,\n items,\n onClick: onMenuClick,\n onBeforeLeafItemClick,\n selectedKeys,\n menuStyle,\n rootClosing = false,\n externalOverflow,\n } = props;\n const selectedKeySet = new Set(selectedKeys || []);\n\n const hasDirectSelectedItem = (items: MenuItemType[]): boolean =>\n items.some((item) => {\n if (isSubMenuItem(item)) {\n return selectedKeySet.has(item.key);\n }\n if (isHeaderMenuItem(item) || isDivideMenuItem(item)) {\n return false;\n }\n return selectedKeySet.has(item.key);\n });\n\n const getMenuItems = (items: MenuItemType[], parentPath: string[] = []) => {\n const isSelectableGroup = hasDirectSelectedItem(items);\n\n return items.map((item, index) => {\n if (isDivideMenuItem(item)) {\n return <MenuDivider key={`divider_${index}`} />;\n }\n if (isHeaderMenuItem(item)) {\n return <MenuHeader key={`header_${index}`}>{item.label}</MenuHeader>;\n }\n const currPath = [...parentPath, item.key];\n const titleStr = _.isString(item.label) ? item.label : '';\n const isSelected = selectedKeys?.includes(item.key);\n\n if (isSubMenuItem(item)) {\n const isLeafSubMenu = isLeafMenu(item.children);\n const subMenuItemLabel = (\n <div className=\"ald-menu-item-label\" title={titleStr}>\n {item.icon ? (\n <div className=\"ald-menu-item-label-icon\">{item.icon}</div>\n ) : null}\n <div className=\"ald-menu-item-label-text\">{item.label}</div>\n <div className=\"ald-menu-item-right\">\n {isSelectableGroup ? (\n <div className=\"ald-menu-item-selection-slot\" />\n ) : null}\n <ChevronRightLine size={16} />\n </div>\n </div>\n );\n\n return (\n <SubMenu\n key={item.key}\n label={subMenuItemLabel}\n disabled={item.disabled}\n itemProps={{\n className: isLeafSubMenu\n ? 'ald-menu-submenu-leaf-trigger'\n : undefined,\n }}\n align=\"start\"\n direction=\"right\"\n gap={-8}\n position=\"anchor\"\n shift={0}\n menuStyle={{\n ...menuStyle,\n }}\n menuClassName={cn(\n 'ald-menu-submenu-popup',\n isLeafSubMenu && 'ald-menu-submenu-popup-leaf',\n item.popupClassName,\n rootClosing && 'ald-menu-submenu-popup-root-closing',\n )}\n overflow={isLeafSubMenu ? 'auto' : undefined}\n >\n {getMenuItems(item.children, currPath)}\n </SubMenu>\n );\n }\n\n return (\n <MenuItem\n key={item.key}\n className={cn(item.className, {\n 'ald-menu-item-danger': item.danger,\n 'ald-menu-item-selected': isSelected,\n })}\n disabled={item.disabled}\n onClick={({ syntheticEvent }) => {\n onBeforeLeafItemClick?.();\n const menuInfo = {\n key: item.key,\n keyPath: currPath,\n domEvent: syntheticEvent,\n };\n if (item.onClick) {\n item.onClick(menuInfo);\n }\n if (onMenuClick) {\n onMenuClick(menuInfo);\n }\n }}\n >\n <div className=\"ald-menu-item-label\" title={titleStr}>\n {item.icon ? (\n <div className=\"ald-menu-item-label-icon\">{item.icon}</div>\n ) : null}\n <div className=\"ald-menu-item-label-text\">{item.label}</div>\n {isSelectableGroup ? (\n <div className=\"ald-menu-item-right\">\n <div\n className={cn(\n 'ald-menu-item-selection-slot',\n isSelected &&\n 'ald-menu-item-selection-slot-selected ald-menu-item-selected-icon',\n )}\n >\n {isSelected ? <CheckLightLine /> : null}\n </div>\n </div>\n ) : null}\n </div>\n </MenuItem>\n );\n });\n };\n\n const ref = useRef(null);\n\n const leafOverflow = isLeafMenu(items) ? 'auto' : undefined;\n\n return (\n <>\n <div style={{ display: 'none' }} ref={ref} />\n <ControlledMenu\n state=\"open\"\n transition={{ open: true, close: true }}\n transitionTimeout={200}\n submenuOpenDelay={0}\n submenuCloseDelay={0}\n menuStyle={{\n ...menuStyle,\n }}\n anchorRef={ref}\n className={cn(\n className,\n 'ald-menu',\n leafOverflow && !externalOverflow && 'ald-menu-leaf',\n )}\n position={externalOverflow ? 'initial' : 'auto'}\n captureFocus={false}\n viewScroll={externalOverflow ? 'initial' : 'auto'}\n overflow={externalOverflow ? 'visible' : leafOverflow}\n >\n {getMenuItems(items || [])}\n </ControlledMenu>\n </>\n );\n}\n\nexport function isHeaderMenuItem(\n menuItem: MenuItemType,\n): menuItem is MenuHeaderType {\n return 'type' in menuItem && menuItem.type === 'header';\n}\n\nexport function isDivideMenuItem(\n menuItem: MenuItemType,\n): menuItem is MenuDividerType {\n return 'type' in menuItem && menuItem.type === 'divider';\n}\n\nexport function isSubMenuItem(menuItem: MenuItemType): menuItem is SubMenuType {\n return 'children' in menuItem && !!menuItem.children;\n}\n\nexport function isLeafMenu(menuItems: MenuItemType[]) {\n return !_.some(menuItems, (item) => isSubMenuItem(item));\n}\n\nexport type MenuItemType =\n | ItemType\n | MenuDividerType\n | SubMenuType\n | MenuHeaderType;\n\nexport interface ItemType {\n key: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n onClick?: (info: MenuInfo) => void;\n danger?: boolean;\n disabled?: boolean;\n className?: string;\n}\n\nexport interface MenuDividerType {\n key?: string;\n type: 'divider';\n}\n\nexport interface MenuHeaderType {\n key?: string;\n type: 'header';\n label: string;\n}\n\nexport interface SubMenuType {\n children: MenuItemType[];\n key: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n popupClassName?: string;\n disabled?: boolean;\n}\n\nexport interface MenuInfo {\n key: string;\n keyPath: string[];\n domEvent: MouseEvent | KeyboardEvent;\n // 阻止菜单关闭\n keepOpen?: boolean;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export interface FixedOverflowProps<T> {
|
|
3
|
+
prefixCls?: string;
|
|
4
|
+
data: T[];
|
|
5
|
+
renderItem: (item: T, info: {
|
|
6
|
+
index: number;
|
|
7
|
+
}) => React.ReactNode;
|
|
8
|
+
itemKey: (item: T) => React.Key;
|
|
9
|
+
renderRest: (omittedItems: T[]) => React.ReactNode;
|
|
10
|
+
className?: string;
|
|
11
|
+
onVisibleChange?: (count: number) => void;
|
|
12
|
+
}
|
|
13
|
+
declare const FixedOverflow: <T>(props: FixedOverflowProps<T> & {
|
|
14
|
+
ref?: React.Ref<HTMLDivElement> | undefined;
|
|
15
|
+
}) => React.ReactElement;
|
|
16
|
+
export default FixedOverflow;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { forwardRef, useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import ResizeObserver from "rc-resize-observer";
|
|
4
|
+
import useLayoutEffect$1 from "rc-util/es/hooks/useLayoutEffect";
|
|
5
|
+
import cn from "classnames";
|
|
6
|
+
//#region src/Select/Selector/FixedOverflow.tsx
|
|
7
|
+
function InternalItem(props) {
|
|
8
|
+
const { prefixCls, display, order, itemKey, registerSize, className, children } = props;
|
|
9
|
+
const mergedHidden = !display;
|
|
10
|
+
const registerSizeRef = useRef(registerSize);
|
|
11
|
+
const itemKeyRef = useRef(itemKey);
|
|
12
|
+
registerSizeRef.current = registerSize;
|
|
13
|
+
itemKeyRef.current = itemKey;
|
|
14
|
+
useEffect(() => () => {
|
|
15
|
+
registerSizeRef.current(itemKeyRef.current, null);
|
|
16
|
+
}, []);
|
|
17
|
+
const overflowStyle = {
|
|
18
|
+
opacity: mergedHidden ? 0 : 1,
|
|
19
|
+
height: mergedHidden ? 0 : void 0,
|
|
20
|
+
overflowY: mergedHidden ? "hidden" : void 0,
|
|
21
|
+
order,
|
|
22
|
+
pointerEvents: mergedHidden ? "none" : void 0,
|
|
23
|
+
position: mergedHidden ? "absolute" : void 0
|
|
24
|
+
};
|
|
25
|
+
return /* @__PURE__ */ jsx(ResizeObserver, {
|
|
26
|
+
onResize: ({ offsetWidth }) => registerSize(itemKey, offsetWidth),
|
|
27
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
28
|
+
className: cn(prefixCls, className),
|
|
29
|
+
style: overflowStyle,
|
|
30
|
+
"aria-hidden": mergedHidden || void 0,
|
|
31
|
+
children
|
|
32
|
+
})
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
var ITEM_WIDTH = 10;
|
|
36
|
+
var REST_KEY = "__OVERFLOW_REST__";
|
|
37
|
+
function OverflowInner(props, ref) {
|
|
38
|
+
const { prefixCls = "rc-overflow", data, renderItem, itemKey, renderRest, className, onVisibleChange } = props;
|
|
39
|
+
const [containerWidth, setContainerWidth] = useState(null);
|
|
40
|
+
const mergedContainerWidth = containerWidth || 0;
|
|
41
|
+
const [itemWidths, setItemWidths] = useState(() => /* @__PURE__ */ new Map());
|
|
42
|
+
const [prevRestWidth, setPrevRestWidth] = useState(0);
|
|
43
|
+
const [restWidth, setRestWidth] = useState(0);
|
|
44
|
+
const [displayCount, setDisplayCount] = useState(null);
|
|
45
|
+
const [restReady, setRestReady] = useState(false);
|
|
46
|
+
const mergedDisplayCount = displayCount || 0;
|
|
47
|
+
const itemPrefixCls = `${prefixCls}-item`;
|
|
48
|
+
const mergedRestWidth = Math.max(prevRestWidth, restWidth);
|
|
49
|
+
const getKey = useCallback((item, index) => {
|
|
50
|
+
if (item == null) return index;
|
|
51
|
+
return itemKey(item) ?? index;
|
|
52
|
+
}, [itemKey]);
|
|
53
|
+
const mergedData = useMemo(() => {
|
|
54
|
+
if (!data.length) return data;
|
|
55
|
+
return data.slice(0, Math.min(data.length, mergedContainerWidth / ITEM_WIDTH));
|
|
56
|
+
}, [data, mergedContainerWidth]);
|
|
57
|
+
const omittedItems = useMemo(() => data.slice(mergedDisplayCount + 1), [data, mergedDisplayCount]);
|
|
58
|
+
const updateDisplayCount = (count, notReady) => {
|
|
59
|
+
if (!notReady) {
|
|
60
|
+
setRestReady(count < data.length - 1);
|
|
61
|
+
onVisibleChange?.(count);
|
|
62
|
+
}
|
|
63
|
+
if (displayCount !== count) setDisplayCount(count);
|
|
64
|
+
};
|
|
65
|
+
const registerSize = useCallback((key, width) => {
|
|
66
|
+
setItemWidths((origin) => {
|
|
67
|
+
const clone = new Map(origin);
|
|
68
|
+
if (width === null) clone.delete(key);
|
|
69
|
+
else clone.set(key, width);
|
|
70
|
+
return clone;
|
|
71
|
+
});
|
|
72
|
+
}, []);
|
|
73
|
+
const registerRestSize = useCallback((_key, width) => {
|
|
74
|
+
if (width === null) return;
|
|
75
|
+
setRestWidth((prev) => {
|
|
76
|
+
setPrevRestWidth(prev);
|
|
77
|
+
return width;
|
|
78
|
+
});
|
|
79
|
+
}, []);
|
|
80
|
+
const onOverflowResize = (_, element) => {
|
|
81
|
+
setContainerWidth(element.clientWidth);
|
|
82
|
+
};
|
|
83
|
+
useLayoutEffect$1(() => {
|
|
84
|
+
if (!mergedContainerWidth || !mergedData) return;
|
|
85
|
+
const len = mergedData.length;
|
|
86
|
+
const lastIndex = len - 1;
|
|
87
|
+
if (!len) {
|
|
88
|
+
updateDisplayCount(0);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
let totalWidth = 0;
|
|
92
|
+
const getItemWidth = (index) => itemWidths.get(getKey(mergedData[index], index));
|
|
93
|
+
for (let i = 0; i < len; i += 1) {
|
|
94
|
+
const currentItemWidth = getItemWidth(i);
|
|
95
|
+
if (currentItemWidth === void 0) {
|
|
96
|
+
updateDisplayCount(i - 1, true);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
totalWidth += currentItemWidth;
|
|
100
|
+
if (lastIndex === 0 && totalWidth <= mergedContainerWidth || i === lastIndex - 1 && totalWidth + (getItemWidth(lastIndex) ?? 0) <= mergedContainerWidth) {
|
|
101
|
+
updateDisplayCount(lastIndex);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (totalWidth + mergedRestWidth > mergedContainerWidth) {
|
|
105
|
+
updateDisplayCount(i - 1);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
const displayRest = restReady && !!omittedItems.length;
|
|
111
|
+
return /* @__PURE__ */ jsx(ResizeObserver, {
|
|
112
|
+
onResize: onOverflowResize,
|
|
113
|
+
disabled: !data.length,
|
|
114
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
115
|
+
className: cn(prefixCls, className),
|
|
116
|
+
ref,
|
|
117
|
+
children: [mergedData.map((item, index) => {
|
|
118
|
+
const key = getKey(item, index);
|
|
119
|
+
return /* @__PURE__ */ jsx(InternalItem, {
|
|
120
|
+
prefixCls: itemPrefixCls,
|
|
121
|
+
display: index <= mergedDisplayCount,
|
|
122
|
+
order: index,
|
|
123
|
+
itemKey: key,
|
|
124
|
+
registerSize,
|
|
125
|
+
children: renderItem(item, { index })
|
|
126
|
+
}, key);
|
|
127
|
+
}), /* @__PURE__ */ jsx(InternalItem, {
|
|
128
|
+
prefixCls: itemPrefixCls,
|
|
129
|
+
display: displayRest,
|
|
130
|
+
order: displayRest ? mergedDisplayCount : Number.MAX_SAFE_INTEGER,
|
|
131
|
+
itemKey: REST_KEY,
|
|
132
|
+
registerSize: registerRestSize,
|
|
133
|
+
className: `${itemPrefixCls}-rest`,
|
|
134
|
+
children: renderRest(omittedItems)
|
|
135
|
+
})]
|
|
136
|
+
})
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
var FixedOverflow = forwardRef(OverflowInner);
|
|
140
|
+
//#endregion
|
|
141
|
+
export { FixedOverflow as default };
|
|
142
|
+
|
|
143
|
+
//# sourceMappingURL=FixedOverflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FixedOverflow.js","names":[],"sources":["../../../src/Select/Selector/FixedOverflow.tsx"],"sourcesContent":["// 修复 rc-overflow 的 restReady 卡 false bug。\n//\n// 根因(rc-overflow@1.5 es/Overflow.js updateDisplayCount):\n// if (displayCount === count && ...) return; // <-- 这一行\n// setDisplayCount(count);\n// if (!notReady) { setRestReady(count < data.length - 1); onVisibleChange?.(count); }\n//\n// 触发条件:modal 首开等首屏渲染时,半测量阶段(部分 itemWidth 还没注册)\n// 会先以 notReady=true 把 displayCount 推到「最终值 N」(比如 9 个 tag 都已\n// 测过,第 10 个还没到时调用 updateDisplayCount(9, undefined, true),\n// 而最终稳定态恰好也是 displayCount=9)。后续 ready 路径 displayCount===count\n// 早返回,setRestReady 永远没被调用 → restReady 始终是 false →\n// rest 节点 opacity:0, position:absolute, height:0 不可见。\n//\n// 修复:把 setRestReady 和 onVisibleChange 移到 early-return 之前。只要本次\n// 是 ready 路径,无论 displayCount 是否变化,都把 rest 状态推到位。\n//\n// 其它逻辑 1:1 复刻 rc-overflow 的 responsive 分支(ald 只用 maxCount='responsive'\n// 一种模式,prefix/suffix/raw render 等都没用),删掉用不到的代码以降复杂度。\n// 用 React 18 自动批处理,不再重写 channelUpdate / unstable_batchedUpdates。\n\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport ResizeObserver from 'rc-resize-observer';\nimport useLayoutEffect from 'rc-util/es/hooks/useLayoutEffect';\nimport cn from 'classnames';\n\ninterface ResizeInfo {\n width: number;\n height: number;\n offsetWidth: number;\n offsetHeight: number;\n}\n\ninterface InternalItemProps {\n prefixCls: string;\n display: boolean;\n order: number;\n itemKey: React.Key;\n registerSize: (key: React.Key, width: number | null) => void;\n className?: string;\n children?: React.ReactNode;\n}\n\nfunction InternalItem(props: InternalItemProps) {\n const {\n prefixCls,\n display,\n order,\n itemKey,\n registerSize,\n className,\n children,\n } = props;\n const mergedHidden = !display;\n // 卸载时把本 item 的 width 从 Map 里删掉。registerSize/itemKey 用 ref 抓最新,\n // 这样 effect 自身依赖只有 [],不需要 eslint-disable。\n const registerSizeRef = useRef(registerSize);\n const itemKeyRef = useRef(itemKey);\n registerSizeRef.current = registerSize;\n itemKeyRef.current = itemKey;\n useEffect(\n () => () => {\n registerSizeRef.current(itemKeyRef.current, null);\n },\n [],\n );\n const overflowStyle: React.CSSProperties = {\n opacity: mergedHidden ? 0 : 1,\n height: mergedHidden ? 0 : undefined,\n overflowY: mergedHidden ? 'hidden' : undefined,\n order,\n pointerEvents: mergedHidden ? 'none' : undefined,\n position: mergedHidden ? 'absolute' : undefined,\n };\n return (\n <ResizeObserver\n onResize={({ offsetWidth }: ResizeInfo) =>\n registerSize(itemKey, offsetWidth)\n }\n >\n <div\n className={cn(prefixCls, className)}\n style={overflowStyle}\n aria-hidden={mergedHidden || undefined}\n >\n {children}\n </div>\n </ResizeObserver>\n );\n}\n\nexport interface FixedOverflowProps<T> {\n prefixCls?: string;\n data: T[];\n renderItem: (item: T, info: { index: number }) => React.ReactNode;\n itemKey: (item: T) => React.Key;\n renderRest: (omittedItems: T[]) => React.ReactNode;\n className?: string;\n onVisibleChange?: (count: number) => void;\n}\n\nconst ITEM_WIDTH = 10;\n// rest 节点的固定 React key。假设调用方传入的 itemKey 不会返回此常量\n// (ald 内部 Select 的 itemKey 取 value/key 字段,不会等于这个字符串)。\nconst REST_KEY: React.Key = '__OVERFLOW_REST__';\n\nfunction OverflowInner<T>(\n props: FixedOverflowProps<T>,\n ref: React.ForwardedRef<HTMLDivElement>,\n) {\n const {\n prefixCls = 'rc-overflow',\n data,\n renderItem,\n itemKey,\n renderRest,\n className,\n onVisibleChange,\n } = props;\n\n const [containerWidth, setContainerWidth] = useState<number | null>(null);\n const mergedContainerWidth = containerWidth || 0;\n const [itemWidths, setItemWidths] = useState<Map<React.Key, number>>(\n () => new Map(),\n );\n const [prevRestWidth, setPrevRestWidth] = useState(0);\n const [restWidth, setRestWidth] = useState(0);\n const [displayCount, setDisplayCount] = useState<number | null>(null);\n const [restReady, setRestReady] = useState(false);\n\n const mergedDisplayCount = displayCount || 0;\n const itemPrefixCls = `${prefixCls}-item`;\n const mergedRestWidth = Math.max(prevRestWidth, restWidth);\n\n const getKey = useCallback(\n (item: T, index: number): React.Key => {\n if (item == null) return index;\n return itemKey(item) ?? index;\n },\n [itemKey],\n );\n\n const mergedData = useMemo(() => {\n if (!data.length) return data;\n return data.slice(\n 0,\n Math.min(data.length, mergedContainerWidth / ITEM_WIDTH),\n );\n }, [data, mergedContainerWidth]);\n\n const omittedItems = useMemo(\n () => data.slice(mergedDisplayCount + 1),\n [data, mergedDisplayCount],\n );\n\n const updateDisplayCount = (count: number, notReady?: boolean) => {\n // === BUG FIX ===\n // 不论 displayCount 是否变化,只要本次是 ready 路径,立即把 restReady /\n // onVisibleChange 推到位。原版在 displayCount===count 时早返回,会跳过\n // 这两步,造成 restReady 卡死在 false。\n if (!notReady) {\n setRestReady(count < data.length - 1);\n onVisibleChange?.(count);\n }\n if (displayCount !== count) {\n setDisplayCount(count);\n }\n };\n\n const registerSize = useCallback((key: React.Key, width: number | null) => {\n setItemWidths((origin) => {\n const clone = new Map(origin);\n if (width === null) clone.delete(key);\n else clone.set(key, width);\n return clone;\n });\n }, []);\n\n const registerRestSize = useCallback(\n (_key: React.Key, width: number | null) => {\n if (width === null) return;\n setRestWidth((prev) => {\n setPrevRestWidth(prev);\n return width;\n });\n },\n [],\n );\n\n const onOverflowResize = (_: ResizeInfo, element: HTMLElement) => {\n setContainerWidth(element.clientWidth);\n };\n\n // 故意不加依赖数组:测量回路依赖每次渲染都重跑——itemWidths 变 → 重算 displayCount\n // → 触发再渲染 → 再测量。加 deps 会破坏 rc-overflow 原版的测量-更新循环。\n useLayoutEffect(() => {\n if (!mergedContainerWidth || !mergedData) return;\n const len = mergedData.length;\n const lastIndex = len - 1;\n if (!len) {\n updateDisplayCount(0);\n return;\n }\n let totalWidth = 0;\n const getItemWidth = (index: number): number | undefined =>\n itemWidths.get(getKey(mergedData[index], index));\n for (let i = 0; i < len; i += 1) {\n const currentItemWidth = getItemWidth(i);\n if (currentItemWidth === undefined) {\n // 半测量:先把 displayCount 推到 i-1,但不动 restReady(notReady=true)。\n updateDisplayCount(i - 1, true);\n return;\n }\n totalWidth += currentItemWidth;\n if (\n (lastIndex === 0 && totalWidth <= mergedContainerWidth) ||\n (i === lastIndex - 1 &&\n totalWidth + (getItemWidth(lastIndex) ?? 0) <= mergedContainerWidth)\n ) {\n // 全部塞得下\n updateDisplayCount(lastIndex);\n return;\n }\n if (totalWidth + mergedRestWidth > mergedContainerWidth) {\n // 当前这个塞不下了,需要展示 \"+N\"\n updateDisplayCount(i - 1);\n return;\n }\n }\n });\n\n const displayRest = restReady && !!omittedItems.length;\n\n return (\n <ResizeObserver onResize={onOverflowResize} disabled={!data.length}>\n <div className={cn(prefixCls, className)} ref={ref}>\n {mergedData.map((item, index) => {\n const key = getKey(item, index);\n return (\n <InternalItem\n key={key}\n prefixCls={itemPrefixCls}\n display={index <= mergedDisplayCount}\n order={index}\n itemKey={key}\n registerSize={registerSize}\n >\n {renderItem(item, { index })}\n </InternalItem>\n );\n })}\n <InternalItem\n prefixCls={itemPrefixCls}\n display={displayRest}\n order={displayRest ? mergedDisplayCount : Number.MAX_SAFE_INTEGER}\n itemKey={REST_KEY}\n registerSize={registerRestSize}\n className={`${itemPrefixCls}-rest`}\n >\n {renderRest(omittedItems)}\n </InternalItem>\n </div>\n </ResizeObserver>\n );\n}\n\nconst FixedOverflow = forwardRef(OverflowInner) as <T>(\n props: FixedOverflowProps<T> & { ref?: React.Ref<HTMLDivElement> },\n) => React.ReactElement;\n\nexport default FixedOverflow;\n"],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { cn } from "../../lib/utils.js";
|
|
2
2
|
import Tag from "../../Tag/index.js";
|
|
3
3
|
import ScrollArea_default from "../../ScrollArea/index.js";
|
|
4
|
+
import FixedOverflow from "./FixedOverflow.js";
|
|
4
5
|
import MultipleResponsiveSelectedSection from "./MultipleResponsiveSelectedSection.js";
|
|
5
6
|
import { isMultiple, isResponsive, isShowSelectedSection } from "../BaseSelect.js";
|
|
6
7
|
import { useEffect, useMemo, useState } from "react";
|
|
7
8
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
9
|
import _ from "lodash";
|
|
9
|
-
import Overflow from "rc-overflow";
|
|
10
10
|
//#region src/Select/Selector/MultipleSelector.tsx
|
|
11
11
|
var overflowPrefixCls = "beta-ald-select-selector-overflow";
|
|
12
12
|
var tagHeight = 20;
|
|
@@ -95,15 +95,13 @@ function MultipleSelector(props) {
|
|
|
95
95
|
className: "beta-ald-select-selector-overflow-item-first",
|
|
96
96
|
children: renderItem(displayValues[0], 0)
|
|
97
97
|
}),
|
|
98
|
-
/* @__PURE__ */ jsx(
|
|
98
|
+
/* @__PURE__ */ jsx(FixedOverflow, {
|
|
99
99
|
prefixCls: overflowPrefixCls,
|
|
100
100
|
data: displayValues,
|
|
101
101
|
renderItem: (item, info) => renderItem(item, info?.index),
|
|
102
102
|
className: cn({ "beta-ald-select-selector-overflow-hidden": showItemIndex === -1 && displayValues.length === 1 }),
|
|
103
103
|
renderRest,
|
|
104
|
-
suffix: null,
|
|
105
104
|
itemKey,
|
|
106
|
-
maxCount: "responsive",
|
|
107
105
|
onVisibleChange
|
|
108
106
|
}),
|
|
109
107
|
showResponsiveSelectedSection && /* @__PURE__ */ jsx(MultipleResponsiveSelectedSection, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultipleSelector.js","names":[],"sources":["../../../src/Select/Selector/MultipleSelector.tsx"],"sourcesContent":["import React, { RefObject, useEffect, useMemo, useState } from 'react';\nimport { SelectorProps } from './index';\nimport Tag from '../../Tag';\nimport { DisplayValueType, RawValueType } from '../interface';\nimport {\n CustomTagProps,\n isMultiple,\n isResponsive,\n isShowSelectedSection,\n} from '../BaseSelect';\nimport ScrollArea from '../../ScrollArea';\nimport { cn } from '../../lib/utils';\nimport _ from 'lodash';\n// 与 v2 保持一致直接用 rc-overflow:自研 SimpleOverflow 的\"临时显示再测量\"\n// 会扰动布局并被 ResizeObserver 再次触发,挤压态下持续抖动;\n// rc-overflow 隐藏项保持渲染(绝对定位+透明)可随时测量,测量与渲染单向无环\nimport Overflow from 'rc-overflow';\nimport MultipleResponsiveSelectedSection from './MultipleResponsiveSelectedSection';\nimport { RefTriggerProps } from '../SelectTrigger';\nconst overflowPrefixCls = 'beta-ald-select-selector-overflow';\nconst tagHeight = 20;\nconst gap = 4;\ninterface MultipleSelectorProps extends SelectorProps {\n // Event\n onRemove: (value: DisplayValueType) => void;\n onToggleOpen: (open?: boolean) => void;\n tagRender?: (props: CustomTagProps, isPreview?: boolean) => React.ReactNode;\n maxTagPlaceholder?:\n | React.ReactNode\n | ((omittedValues: DisplayValueType[]) => React.ReactNode);\n dropdownRef: RefObject<RefTriggerProps>;\n}\nconst onPreventMouseDown = (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n};\n\nfunction itemKey(value: DisplayValueType): React.Key {\n return (value.key ?? value.value) || '';\n}\n\nexport default function MultipleSelector(props: MultipleSelectorProps) {\n const {\n displayValues,\n tagRender,\n onRemove,\n onToggleOpen,\n mode,\n disabled,\n maxTagPlaceholder,\n showResponsiveSelectedSection,\n dropdownRef,\n suffixIcon,\n onOverflowCollapsedChange,\n } = props;\n const innerMaxTagPlaceholder = (omittedValues: DisplayValueType[]) => {\n return `+ ${\n omittedValues.length === displayValues.length\n ? omittedValues.length - 1\n : omittedValues.length\n }`;\n };\n const [showItemIndex, setShowItemIndex] = useState(0);\n const isCollapsed = showItemIndex === -1 && displayValues.length > 0;\n useEffect(() => {\n onOverflowCollapsedChange?.(isCollapsed);\n }, [isCollapsed, onOverflowCollapsedChange]);\n const customizeRenderSelector = (\n value: RawValueType | undefined,\n content: React.ReactNode,\n itemDisabled: boolean,\n closable?: boolean,\n onClose?: (event?: React.MouseEvent) => void,\n isPreview?: boolean,\n uniqueKey?: React.Key,\n ) => {\n const onMouseDown = (e: React.MouseEvent) => {\n onPreventMouseDown(e);\n };\n\n return (\n <span\n className=\"beta-ald-select-custom-tag-render-wrapper\"\n onMouseDown={onMouseDown}\n key={uniqueKey ?? value}\n >\n {tagRender?.(\n {\n label: content,\n value,\n disabled: itemDisabled,\n closable: isPreview ? false : closable ?? false,\n onClose: onClose ?? (() => {}),\n },\n isPreview,\n )}\n </span>\n );\n };\n const defaultRenderSelector = (\n item: DisplayValueType | undefined,\n content: React.ReactNode,\n itemDisabled: boolean,\n closable?: boolean,\n onClose?: React.MouseEventHandler,\n isPreview?: boolean,\n uniqueKey?: React.Key,\n ) => (\n <Tag\n disabled={itemDisabled}\n key={uniqueKey ?? item?.value}\n size=\"small\"\n closable={isPreview ? false : closable}\n onClose={(e) => {\n onPreventMouseDown(e);\n onClose?.(e);\n }}\n >\n {content}\n </Tag>\n );\n const isResponsiveMode = isResponsive(mode);\n const showSelectedSection = isShowSelectedSection(mode);\n const renderItem = (valueItem: DisplayValueType, index?: number) => {\n const { disabled: itemDisabled, label, value } = valueItem;\n const closable = !disabled && !itemDisabled;\n let isPreview = !showResponsiveSelectedSection;\n if (!isResponsiveMode) {\n isPreview = false;\n }\n if (!showSelectedSection) {\n isPreview = false;\n }\n if (disabled) {\n isPreview = true;\n }\n const displayLabel: React.ReactNode = label;\n\n const onClose = (event?: React.MouseEvent) => {\n if (event) {\n event.stopPropagation();\n }\n onRemove(valueItem);\n };\n if (_.isNil(value)) {\n return null;\n }\n\n // 生成唯一的 key,如果 value 可能重复,使用 value + index 组合\n const uniqueKey =\n valueItem.key ??\n (value !== undefined && value !== null\n ? `${value}-${index ?? ''}`\n : `item-${index ?? ''}`);\n\n return typeof tagRender === 'function'\n ? customizeRenderSelector(\n value,\n displayLabel,\n !!itemDisabled,\n closable,\n onClose,\n isPreview,\n uniqueKey,\n )\n : defaultRenderSelector(\n valueItem,\n displayLabel,\n !!itemDisabled,\n closable,\n onClose,\n isPreview,\n uniqueKey,\n );\n };\n\n const renderRest = (omittedValues: DisplayValueType[]) => {\n if (displayValues.length === 1) {\n return null;\n }\n\n const content =\n typeof maxTagPlaceholder === 'function'\n ? maxTagPlaceholder(\n omittedValues.length === displayValues.length\n ? omittedValues.slice(1, omittedValues.length)\n : omittedValues,\n )\n : innerMaxTagPlaceholder(\n omittedValues.length === displayValues.length\n ? omittedValues.slice(1, omittedValues.length)\n : omittedValues,\n );\n\n return typeof maxTagPlaceholder === 'function'\n ? content\n : defaultRenderSelector({ title: content }, content, false);\n };\n const onVisibleChange = (visibleCount: number) => {\n setShowItemIndex(visibleCount);\n };\n const maxHeight = useMemo(() => {\n if (isMultiple(mode)) {\n let maxRows: number | undefined;\n if (typeof mode === 'object') {\n maxRows = mode.maxRows;\n }\n if (!maxRows) {\n // 2.5行高+2行间距\n return 2.5 * tagHeight + 2 * gap;\n } else {\n // 总行高+总行间距\n return maxRows * tagHeight + (maxRows - 1) * gap;\n }\n }\n\n return undefined;\n }, [mode]);\n if (isResponsiveMode) {\n return (\n <div className=\"beta-ald-select-selector beta-ald-select-selector-multiple-responsive\">\n {showItemIndex === -1 && displayValues.length > 0 && (\n <div className=\"beta-ald-select-selector-overflow-item-first\">\n {renderItem(displayValues[0], 0)}\n </div>\n )}\n <Overflow\n prefixCls={overflowPrefixCls}\n data={displayValues}\n // rc-overflow >=1.4 的 renderItem 第二参是 { index },适配回 index\n renderItem={(item, info) => renderItem(item, info?.index)}\n className={cn({\n 'beta-ald-select-selector-overflow-hidden':\n showItemIndex === -1 && displayValues.length === 1,\n })}\n renderRest={renderRest}\n suffix={null}\n itemKey={itemKey}\n maxCount=\"responsive\"\n onVisibleChange={onVisibleChange}\n />\n {showResponsiveSelectedSection && (\n <MultipleResponsiveSelectedSection\n displayValues={displayValues}\n renderItem={renderItem}\n maxHeight={maxHeight}\n suffixIcon={suffixIcon}\n onToggleOpen={onToggleOpen}\n dropdownRef={dropdownRef}\n />\n )}\n </div>\n );\n }\n\n return (\n <ScrollArea\n innerClassName=\"beta-ald-select-selector-multiple-default-inner\"\n className=\"beta-ald-select-selector beta-ald-select-selector-multiple-default\"\n innerStyle={{\n maxHeight: maxHeight,\n }}\n >\n <div className=\"beta-ald-select-selector-multiple-default-tags\">\n {displayValues.map((item, index) => renderItem(item, index))}\n </div>\n </ScrollArea>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MultipleSelector.js","names":[],"sources":["../../../src/Select/Selector/MultipleSelector.tsx"],"sourcesContent":["import React, { RefObject, useEffect, useMemo, useState } from 'react';\nimport { SelectorProps } from './index';\nimport Tag from '../../Tag';\nimport { DisplayValueType, RawValueType } from '../interface';\nimport {\n CustomTagProps,\n isMultiple,\n isResponsive,\n isShowSelectedSection,\n} from '../BaseSelect';\nimport ScrollArea from '../../ScrollArea';\nimport { cn } from '../../lib/utils';\nimport _ from 'lodash';\n// 用 ald 内部 fork 的 FixedOverflow 替代 rc-overflow。\n// 原因:rc-overflow 1.5 的 updateDisplayCount 在 displayCount===count 时早返回,\n// 会跳过 setRestReady,导致 modal 首开等场景下半测量阶段把 displayCount 提前\n// 推到「最终值 N」后,restReady 卡在 false → \"+N\" 节点 opacity:0 不可见。\n// FixedOverflow 把 setRestReady/onVisibleChange 上移到 early-return 之前,\n// 其它逻辑 1:1 复刻 rc-overflow 的 responsive 分支。\nimport Overflow from './FixedOverflow';\nimport MultipleResponsiveSelectedSection from './MultipleResponsiveSelectedSection';\nimport { RefTriggerProps } from '../SelectTrigger';\nconst overflowPrefixCls = 'beta-ald-select-selector-overflow';\nconst tagHeight = 20;\nconst gap = 4;\ninterface MultipleSelectorProps extends SelectorProps {\n // Event\n onRemove: (value: DisplayValueType) => void;\n onToggleOpen: (open?: boolean) => void;\n tagRender?: (props: CustomTagProps, isPreview?: boolean) => React.ReactNode;\n maxTagPlaceholder?:\n | React.ReactNode\n | ((omittedValues: DisplayValueType[]) => React.ReactNode);\n dropdownRef: RefObject<RefTriggerProps>;\n}\nconst onPreventMouseDown = (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n};\n\nfunction itemKey(value: DisplayValueType): React.Key {\n return (value.key ?? value.value) || '';\n}\n\nexport default function MultipleSelector(props: MultipleSelectorProps) {\n const {\n displayValues,\n tagRender,\n onRemove,\n onToggleOpen,\n mode,\n disabled,\n maxTagPlaceholder,\n showResponsiveSelectedSection,\n dropdownRef,\n suffixIcon,\n onOverflowCollapsedChange,\n } = props;\n const innerMaxTagPlaceholder = (omittedValues: DisplayValueType[]) => {\n return `+ ${\n omittedValues.length === displayValues.length\n ? omittedValues.length - 1\n : omittedValues.length\n }`;\n };\n const [showItemIndex, setShowItemIndex] = useState(0);\n const isCollapsed = showItemIndex === -1 && displayValues.length > 0;\n useEffect(() => {\n onOverflowCollapsedChange?.(isCollapsed);\n }, [isCollapsed, onOverflowCollapsedChange]);\n const customizeRenderSelector = (\n value: RawValueType | undefined,\n content: React.ReactNode,\n itemDisabled: boolean,\n closable?: boolean,\n onClose?: (event?: React.MouseEvent) => void,\n isPreview?: boolean,\n uniqueKey?: React.Key,\n ) => {\n const onMouseDown = (e: React.MouseEvent) => {\n onPreventMouseDown(e);\n };\n\n return (\n <span\n className=\"beta-ald-select-custom-tag-render-wrapper\"\n onMouseDown={onMouseDown}\n key={uniqueKey ?? value}\n >\n {tagRender?.(\n {\n label: content,\n value,\n disabled: itemDisabled,\n closable: isPreview ? false : closable ?? false,\n onClose: onClose ?? (() => {}),\n },\n isPreview,\n )}\n </span>\n );\n };\n const defaultRenderSelector = (\n item: DisplayValueType | undefined,\n content: React.ReactNode,\n itemDisabled: boolean,\n closable?: boolean,\n onClose?: React.MouseEventHandler,\n isPreview?: boolean,\n uniqueKey?: React.Key,\n ) => (\n <Tag\n disabled={itemDisabled}\n key={uniqueKey ?? item?.value}\n size=\"small\"\n closable={isPreview ? false : closable}\n onClose={(e) => {\n onPreventMouseDown(e);\n onClose?.(e);\n }}\n >\n {content}\n </Tag>\n );\n const isResponsiveMode = isResponsive(mode);\n const showSelectedSection = isShowSelectedSection(mode);\n const renderItem = (valueItem: DisplayValueType, index?: number) => {\n const { disabled: itemDisabled, label, value } = valueItem;\n const closable = !disabled && !itemDisabled;\n let isPreview = !showResponsiveSelectedSection;\n if (!isResponsiveMode) {\n isPreview = false;\n }\n if (!showSelectedSection) {\n isPreview = false;\n }\n if (disabled) {\n isPreview = true;\n }\n const displayLabel: React.ReactNode = label;\n\n const onClose = (event?: React.MouseEvent) => {\n if (event) {\n event.stopPropagation();\n }\n onRemove(valueItem);\n };\n if (_.isNil(value)) {\n return null;\n }\n\n // 生成唯一的 key,如果 value 可能重复,使用 value + index 组合\n const uniqueKey =\n valueItem.key ??\n (value !== undefined && value !== null\n ? `${value}-${index ?? ''}`\n : `item-${index ?? ''}`);\n\n return typeof tagRender === 'function'\n ? customizeRenderSelector(\n value,\n displayLabel,\n !!itemDisabled,\n closable,\n onClose,\n isPreview,\n uniqueKey,\n )\n : defaultRenderSelector(\n valueItem,\n displayLabel,\n !!itemDisabled,\n closable,\n onClose,\n isPreview,\n uniqueKey,\n );\n };\n\n const renderRest = (omittedValues: DisplayValueType[]) => {\n if (displayValues.length === 1) {\n return null;\n }\n\n const content =\n typeof maxTagPlaceholder === 'function'\n ? maxTagPlaceholder(\n omittedValues.length === displayValues.length\n ? omittedValues.slice(1, omittedValues.length)\n : omittedValues,\n )\n : innerMaxTagPlaceholder(\n omittedValues.length === displayValues.length\n ? omittedValues.slice(1, omittedValues.length)\n : omittedValues,\n );\n\n return typeof maxTagPlaceholder === 'function'\n ? content\n : defaultRenderSelector({ title: content }, content, false);\n };\n const onVisibleChange = (visibleCount: number) => {\n setShowItemIndex(visibleCount);\n };\n const maxHeight = useMemo(() => {\n if (isMultiple(mode)) {\n let maxRows: number | undefined;\n if (typeof mode === 'object') {\n maxRows = mode.maxRows;\n }\n if (!maxRows) {\n // 2.5行高+2行间距\n return 2.5 * tagHeight + 2 * gap;\n } else {\n // 总行高+总行间距\n return maxRows * tagHeight + (maxRows - 1) * gap;\n }\n }\n\n return undefined;\n }, [mode]);\n if (isResponsiveMode) {\n return (\n <div className=\"beta-ald-select-selector beta-ald-select-selector-multiple-responsive\">\n {showItemIndex === -1 && displayValues.length > 0 && (\n <div className=\"beta-ald-select-selector-overflow-item-first\">\n {renderItem(displayValues[0], 0)}\n </div>\n )}\n <Overflow\n prefixCls={overflowPrefixCls}\n data={displayValues}\n renderItem={(item, info) => renderItem(item, info?.index)}\n className={cn({\n 'beta-ald-select-selector-overflow-hidden':\n showItemIndex === -1 && displayValues.length === 1,\n })}\n renderRest={renderRest}\n itemKey={itemKey}\n onVisibleChange={onVisibleChange}\n />\n {showResponsiveSelectedSection && (\n <MultipleResponsiveSelectedSection\n displayValues={displayValues}\n renderItem={renderItem}\n maxHeight={maxHeight}\n suffixIcon={suffixIcon}\n onToggleOpen={onToggleOpen}\n dropdownRef={dropdownRef}\n />\n )}\n </div>\n );\n }\n\n return (\n <ScrollArea\n innerClassName=\"beta-ald-select-selector-multiple-default-inner\"\n className=\"beta-ald-select-selector beta-ald-select-selector-multiple-default\"\n innerStyle={{\n maxHeight: maxHeight,\n }}\n >\n <div className=\"beta-ald-select-selector-multiple-default-tags\">\n {displayValues.map((item, index) => renderItem(item, index))}\n </div>\n </ScrollArea>\n );\n}\n"],"mappings":"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"}
|
package/dist/Tabs/index.js
CHANGED
|
@@ -7,7 +7,7 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from "react"
|
|
|
7
7
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
8
|
//#region src/Tabs/index.tsx
|
|
9
9
|
function Tabs(props) {
|
|
10
|
-
const { size, className, adaptHeight, style = {}, monospace: propsMonospace, tabPosition = "top", padding: propsPadding = false, compact, hasDividing = true, items, activeKey: controlledActiveKey, defaultActiveKey, onChange, onTabClick, destroyInactiveTabPane, tabBarExtraContent, headerBackgroundColor, children, type, onEdit, hideAdd } = props;
|
|
10
|
+
const { size, className, adaptHeight, style = {}, monospace: propsMonospace, tabPosition = "top", padding: propsPadding = false, compact, hasDividing = true, items, activeKey: controlledActiveKey, defaultActiveKey, onChange, onTabClick, destroyInactiveTabPane, centered, tabBarExtraContent, headerBackgroundColor, children, type, onEdit, hideAdd } = props;
|
|
11
11
|
const isEditable = type === "editable-card";
|
|
12
12
|
const isCard = type === "card" || type === "editable-card";
|
|
13
13
|
const resolvedItems = useMemo(() => {
|
|
@@ -108,7 +108,7 @@ function Tabs(props) {
|
|
|
108
108
|
style: paddingVal ? { margin: `0 ${paddingVal}px` } : void 0,
|
|
109
109
|
children: /* @__PURE__ */ jsx("div", {
|
|
110
110
|
ref: navListRef,
|
|
111
|
-
className: cn("ald-tabs-nav-list ant-tabs-nav-list tw-flex tw-overflow-hidden", isVertical && "tw-flex-col", monospace && "[&>*]:tw-flex-1", isCard ? "tw-gap-1" : !monospace && "tw-gap-8"),
|
|
111
|
+
className: cn("ald-tabs-nav-list ant-tabs-nav-list tw-flex tw-overflow-hidden", isVertical && "tw-flex-col", centered && !isVertical && "tw-justify-center", monospace && "[&>*]:tw-flex-1", isCard ? "tw-gap-1" : !monospace && "tw-gap-8"),
|
|
112
112
|
style: !isVertical ? {
|
|
113
113
|
scrollbarWidth: "none",
|
|
114
114
|
msOverflowStyle: "none"
|