@aloudata/aloudata-design 3.1.0 → 3.1.1
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/AProgress/index.js +10 -0
- package/dist/AProgress/index.js.map +1 -1
- package/dist/Alert/index.js +3 -1
- package/dist/Alert/index.js.map +1 -1
- package/dist/Badge/index.js +37 -11
- package/dist/Badge/index.js.map +1 -1
- package/dist/Breadcrumb/index.js +12 -2
- package/dist/Breadcrumb/index.js.map +1 -1
- package/dist/Button/index.d.ts +1 -1
- package/dist/Button/index.js +20 -6
- package/dist/Button/index.js.map +1 -1
- package/dist/Card/index.js +1 -1
- package/dist/Card/index.js.map +1 -1
- package/dist/Carousel/index.js +9 -1
- package/dist/Carousel/index.js.map +1 -1
- package/dist/Checkbox/index.js +17 -2
- package/dist/Checkbox/index.js.map +1 -1
- package/dist/Checkbox/type.d.ts +10 -2
- package/dist/ColorPicker/index.js +112 -46
- package/dist/ColorPicker/index.js.map +1 -1
- package/dist/DataPreviewTable/components/Body/Cell.d.ts +2 -0
- package/dist/DataPreviewTable/components/Body/Cell.js +9 -1
- package/dist/DataPreviewTable/components/Body/Cell.js.map +1 -1
- package/dist/DataPreviewTable/components/Body/index.d.ts +1 -0
- package/dist/DataPreviewTable/components/Body/index.js +35 -23
- package/dist/DataPreviewTable/components/Body/index.js.map +1 -1
- package/dist/DataPreviewTable/components/Header/index.d.ts +1 -0
- package/dist/DataPreviewTable/components/Header/index.js +36 -28
- package/dist/DataPreviewTable/components/Header/index.js.map +1 -1
- package/dist/DataPreviewTable/index.js +19 -2
- package/dist/DataPreviewTable/index.js.map +1 -1
- package/dist/Drawer/index.d.ts +4 -0
- package/dist/Drawer/index.js +91 -78
- package/dist/Drawer/index.js.map +1 -1
- package/dist/Dropdown/index.d.ts +1 -1
- package/dist/Dropdown/index.js +64 -13
- package/dist/Dropdown/index.js.map +1 -1
- package/dist/Form/FormItemContext.d.ts +1 -1
- package/dist/Form/FormItemContext.js.map +1 -1
- package/dist/Form/index.js +50 -7
- package/dist/Form/index.js.map +1 -1
- package/dist/IconButton/index.d.ts +2 -2
- package/dist/IconButton/index.js +9 -3
- package/dist/IconButton/index.js.map +1 -1
- package/dist/Input/components/Input/index.js +18 -8
- package/dist/Input/components/Input/index.js.map +1 -1
- package/dist/Input/components/TextArea/index.js +18 -7
- package/dist/Input/components/TextArea/index.js.map +1 -1
- package/dist/Input/privateSemanticOwner.d.ts +2 -0
- package/dist/Input/privateSemanticOwner.js +1 -0
- package/dist/InputNumber/index.js +16 -9
- package/dist/InputNumber/index.js.map +1 -1
- package/dist/InputNumber/type.d.ts +2 -2
- package/dist/LogicTree/components/LogicItem/index.d.ts +2 -1
- package/dist/LogicTree/components/LogicItem/index.js +13 -2
- package/dist/LogicTree/components/LogicItem/index.js.map +1 -1
- package/dist/LogicTree/index.js +2 -0
- package/dist/LogicTree/index.js.map +1 -1
- package/dist/MemberPicker/components/MemberSelection.d.ts +1 -0
- package/dist/MemberPicker/components/MemberSelection.js +83 -94
- package/dist/MemberPicker/components/MemberSelection.js.map +1 -1
- package/dist/MemberPicker/components/MultipleOption.js +12 -0
- package/dist/MemberPicker/components/MultipleOption.js.map +1 -1
- package/dist/MemberPicker/components/Panel.d.ts +1 -0
- package/dist/MemberPicker/components/Panel.js +4 -1
- package/dist/MemberPicker/components/Panel.js.map +1 -1
- package/dist/MemberPicker/components/SelectedMemberTags.js +14 -6
- package/dist/MemberPicker/components/SelectedMemberTags.js.map +1 -1
- package/dist/MemberPicker/components/SingleOption.js +12 -0
- package/dist/MemberPicker/components/SingleOption.js.map +1 -1
- package/dist/MemberPicker/components/UserGroupSelection.d.ts +2 -1
- package/dist/MemberPicker/components/UserGroupSelection.js +61 -48
- package/dist/MemberPicker/components/UserGroupSelection.js.map +1 -1
- package/dist/MemberPicker/index.js +134 -108
- package/dist/MemberPicker/index.js.map +1 -1
- package/dist/Menu/index.d.ts +8 -0
- package/dist/Menu/index.js +33 -3
- package/dist/Menu/index.js.map +1 -1
- package/dist/Modal/index.d.ts +4 -0
- package/dist/Modal/index.js +55 -66
- package/dist/Modal/index.js.map +1 -1
- package/dist/OverflowCount/index.js +10 -0
- package/dist/OverflowCount/index.js.map +1 -1
- package/dist/Pagination/index.js +1 -0
- package/dist/Pagination/index.js.map +1 -1
- package/dist/Popconfirm/index.js +9 -1
- package/dist/Popconfirm/index.js.map +1 -1
- package/dist/Popover/index.js +52 -1
- package/dist/Popover/index.js.map +1 -1
- package/dist/Progress/index.js +4 -0
- package/dist/Progress/index.js.map +1 -1
- package/dist/Radio/components/Group/index.d.ts +5 -1
- package/dist/Radio/components/Group/index.js +7 -2
- package/dist/Radio/components/Group/index.js.map +1 -1
- package/dist/Radio/components/Radio/index.js +26 -0
- package/dist/Radio/components/Radio/index.js.map +1 -1
- package/dist/Radio/interface/radio.d.ts +7 -0
- package/dist/Radio/interface/radioGroup.d.ts +2 -0
- package/dist/RenameInput/index.js +11 -0
- package/dist/RenameInput/index.js.map +1 -1
- package/dist/Select/BaseSelect.d.ts +3 -0
- package/dist/Select/BaseSelect.js +229 -32
- package/dist/Select/BaseSelect.js.map +1 -1
- package/dist/Select/SelectTrigger.d.ts +2 -0
- package/dist/Select/SelectTrigger.js +13 -5
- package/dist/Select/SelectTrigger.js.map +1 -1
- package/dist/Select/components/OptionCollection.d.ts +41 -0
- package/dist/Select/components/OptionCollection.js +124 -0
- package/dist/Select/components/OptionCollection.js.map +1 -0
- package/dist/Select/index.js +45 -3
- package/dist/Select/index.js.map +1 -1
- package/dist/Select/interface.d.ts +1 -1
- package/dist/Skeleton/index.js +1 -1
- package/dist/Skeleton/index.js.map +1 -1
- package/dist/Spin/index.d.ts +1 -1
- package/dist/Spin/index.js +22 -7
- package/dist/Spin/index.js.map +1 -1
- package/dist/Switch/index.d.ts +5 -0
- package/dist/Switch/index.js +15 -5
- package/dist/Switch/index.js.map +1 -1
- package/dist/Table/components/Header.js +0 -1
- package/dist/Table/components/Header.js.map +1 -1
- package/dist/Table/index.js +42 -27
- package/dist/Table/index.js.map +1 -1
- package/dist/Tabs/index.js +1 -0
- package/dist/Tabs/index.js.map +1 -1
- package/dist/Tag/index.js +20 -1
- package/dist/Tag/index.js.map +1 -1
- package/dist/Tooltip/index.js +34 -5
- package/dist/Tooltip/index.js.map +1 -1
- package/dist/Tour/index.js +13 -1
- package/dist/Tour/index.js.map +1 -1
- package/dist/Tree/Tree2.js +2 -0
- package/dist/Tree/Tree2.js.map +1 -1
- package/dist/_utils/dialogAccessibility.d.ts +17 -0
- package/dist/_utils/dialogAccessibility.js +110 -0
- package/dist/_utils/dialogAccessibility.js.map +1 -0
- package/dist/_utils/formControlSemanticOwner.d.ts +3 -0
- package/dist/_utils/formControlSemanticOwner.js +17 -0
- package/dist/_utils/formControlSemanticOwner.js.map +1 -0
- package/dist/_utils/overlayCoordinator.js +1 -11
- package/dist/_utils/overlayCoordinator.js.map +1 -1
- package/dist/aloudata-design.css +1 -1
- package/dist/theme/contract/baselineResolvedTokenValueManifest.d.ts +1 -1
- package/dist/theme/contract/darkResolvedTokenValueManifest.d.ts +1 -1
- package/dist/theme/generator/acceptedColorValues.d.ts +2 -1
- package/dist/theme/generator/baselineTokenValueDelivery.d.ts +9 -1
- package/dist/theme/generator/minimalAcceptedColorValues.d.ts +2 -2
- package/dist/theme/generator/neutralSourceResolver.d.ts +28 -0
- package/dist/theme/generator/neutralSourceResolver.js +2 -0
- package/dist/theme/generator/neutralSourceValues.d.ts +27 -0
- package/dist/theme/generator/neutralSourceValues.js +2 -0
- package/dist/theme/index.d.ts +2 -0
- package/dist/theme/index.js +1 -0
- package/dist/theme/neutralSourceContract.d.ts +3 -0
- package/dist/theme/neutralSourceContract.js +11 -0
- package/dist/theme/neutralSourceContract.js.map +1 -0
- package/dist/theme/runtime/colorValueMode/generated/darkBaselineDeclarations.d.ts +1 -1
- package/dist/theme/runtime/colorValueMode/generated/darkBaselineDeclarations.js +45 -45
- package/dist/theme/runtime/colorValueMode/generated/darkBaselineDeclarations.js.map +1 -1
- package/dist/theme/runtime/colorValueMode/generated/slateDarkDeclarations.d.ts +3 -0
- package/dist/theme/runtime/colorValueMode/generated/slateDarkDeclarations.js +2 -0
- package/dist/theme/runtime/colorValueMode/generated/slateLightDeclarations.d.ts +3 -0
- package/dist/theme/runtime/colorValueMode/generated/slateLightDeclarations.js +2 -0
- package/dist/theme/runtime/colorValueMode/generated/stoneDarkDeclarations.d.ts +3 -0
- package/dist/theme/runtime/colorValueMode/generated/stoneDarkDeclarations.js +2 -0
- package/dist/theme/runtime/colorValueMode/generated/stoneLightDeclarations.d.ts +3 -0
- package/dist/theme/runtime/colorValueMode/generated/stoneLightDeclarations.js +2 -0
- package/dist/theme/runtime/colorValueMode/generated/v3BaselineDeclarations.d.ts +1 -1
- package/dist/theme/runtime/colorValueMode/generated/v3BaselineDeclarations.js +41 -41
- package/dist/theme/runtime/colorValueMode/generated/v3BaselineDeclarations.js.map +1 -1
- package/dist/theme/runtime/colorValueMode/index.js +2 -12
- package/dist/theme/runtime/colorValueMode/index.js.map +1 -1
- package/dist/theme/runtime/colorValueMode/legacyNeutralCompatibility.d.ts +2 -0
- package/dist/theme/runtime/colorValueMode/legacyNeutralCompatibility.js +48 -0
- package/dist/theme/runtime/colorValueMode/legacyNeutralCompatibility.js.map +1 -0
- package/dist/theme/runtime/colorValueMode/registry.d.ts +1 -1
- package/dist/theme/runtime/colorValueMode/registry.js +2 -1
- package/dist/theme/runtime/colorValueMode/registry.js.map +1 -1
- package/dist/theme/runtime/initAldTheme.js +1 -3
- package/dist/theme/runtime/initAldTheme.js.map +1 -1
- package/dist/theme/runtime/neutralSource/index.d.ts +6 -0
- package/dist/theme/runtime/neutralSource/index.js +11 -0
- package/dist/theme/runtime/neutralSource/index.js.map +1 -0
- package/dist/theme/runtime/neutralSource.d.ts +2 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/LogicTree/components/LogicItem/index.tsx"],"sourcesContent":["import { cn } from '../../../lib/utils';\nimport _ from 'lodash';\nimport React, {\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { DragPreviewImage, useDrag, useDrop } from 'react-dnd';\nimport { EPutPosition, TRenderCondition } from '../..';\nimport DragLightLine from '../../../Icon/components/DragLightLine';\nimport PlusIcon from '../../../Icon/components/SignLightLine';\nimport TrashLightLine from '../../../Icon/components/TrashLightLine';\nimport IconButton from '../../../IconButton';\nimport Select from '../../../Select';\nimport TextLink from '../../../TextLink';\nimport {\n ELangType,\n LocaleContext,\n getTranslator,\n} from '../../../locale/default';\nimport { ELogicType, ENodeType, TNode } from '../../type';\n\nconst dargPreviewImg =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAYSURBVHgB7cAxAQAAAMKg9U9tCU8oAPgYBlQAAX19SpgAAAAASUVORK5CYII=';\n\ninterface IProps<T> {\n value: TNode<T>;\n addCondition: (id: string) => void;\n addRelation: (id: string) => void;\n remove: (id: string) => void;\n changeRecordData: (id: string, data: T) => void;\n changeRelation: (id: string, logicType: ELogicType) => void;\n renderCondition: TRenderCondition<T>;\n onDragEnd: (\n dragId: string,\n hoverId: string,\n dropPosition: EPutPosition,\n ) => void;\n hoverId: string;\n setHoverId: (id: string) => void;\n isRoot?: boolean;\n hideBottomBtn?: {\n addRelation?: boolean;\n };\n}\n\nconst TWO = 2;\n\nexport default function LogicItem<T>({\n value,\n addCondition,\n addRelation,\n changeRecordData,\n remove,\n changeRelation,\n renderCondition,\n onDragEnd,\n hoverId,\n setHoverId,\n isRoot = false,\n hideBottomBtn,\n}: IProps<T>) {\n const [isHoverDragBox, setIsHoverDragBox] = useState(false);\n const [firstNodeHight, setFirstNodeHight] = useState(0);\n const [lastNodeHight, setLastNodeHight] = useState(0);\n const [dropPosition, setDropPosition] = useState<EPutPosition>();\n\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n\n const logicOptions = [\n {\n value: ELogicType.AND,\n label: t.LogicTree.select.and,\n },\n {\n value: ELogicType.OR,\n label: t.LogicTree.select.or,\n },\n ];\n\n const { type } = value;\n\n const ref = useRef<HTMLDivElement>(null);\n const firstResizeObserverRef = useRef<ResizeObserver | null>(null);\n const lastResizeObserverRef = useRef<ResizeObserver | null>(null);\n\n const [{ isDragging }, drag, preview] = useDrag({\n type: 'LOGIC_ITEM',\n item: { id: value.id },\n collect: (monitor) => ({\n isDragging: monitor.isDragging(),\n }),\n canDrag: !isRoot && isHoverDragBox,\n });\n\n const [{ isOver, canDrop }, drop] = useDrop({\n accept: 'LOGIC_ITEM',\n hover(item: { id: string }, monitor) {\n if (!ref.current) {\n return;\n }\n const dragId = item.id;\n const hoverId = value.id;\n\n if (dragId === hoverId) {\n return;\n }\n // 检查是否为最顶层的放置目标\n if (monitor.didDrop()) {\n return;\n }\n\n // 获取鼠标位置和目标元素位置\n const hoverBoundingRect = ref.current.getBoundingClientRect();\n const hoverMiddleY =\n (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2;\n const clientOffset = monitor.getClientOffset();\n if (clientOffset) {\n const hoverClientY = clientOffset.y - hoverBoundingRect.top;\n\n const dropPosition =\n hoverClientY < hoverMiddleY ? EPutPosition.TOP : EPutPosition.BOTTOM;\n\n setDropPosition(dropPosition);\n } else setDropPosition(undefined);\n },\n drop(item: { id: string }, monitor) {\n if (!ref.current) {\n return;\n }\n const dragId = item.id;\n const hoverId = value.id;\n\n if (dragId === hoverId) {\n return;\n }\n // 检查是否为最顶层的放置目标\n if (monitor.didDrop()) {\n return;\n }\n\n // 获取鼠标位置和目标元素位置\n const hoverBoundingRect = ref.current.getBoundingClientRect();\n const hoverMiddleY =\n (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2;\n const clientOffset = monitor.getClientOffset();\n if (clientOffset) {\n const hoverClientY = clientOffset.y - hoverBoundingRect.top;\n\n // 确定放置位置\n const dropPosition =\n hoverClientY < hoverMiddleY ? EPutPosition.TOP : EPutPosition.BOTTOM;\n\n onDragEnd(dragId, hoverId, dropPosition);\n }\n },\n collect: (monitor) => ({\n isOver: monitor.isOver({ shallow: true }),\n canDrop: monitor.canDrop(),\n }),\n });\n\n drag(drop(ref));\n\n const isDragOver = isOver && canDrop && !isRoot;\n\n const firstRef = useCallback((node: HTMLElement | null) => {\n if (firstResizeObserverRef.current) {\n firstResizeObserverRef.current.disconnect();\n firstResizeObserverRef.current = null;\n }\n\n if (!node) return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const newHeight = entry.contentRect.height;\n if (newHeight > 0) {\n setFirstNodeHight(newHeight);\n }\n }\n });\n resizeObserver.observe(node);\n firstResizeObserverRef.current = resizeObserver;\n }, []);\n\n const lastRef = useCallback((node: HTMLElement | null) => {\n if (lastResizeObserverRef.current) {\n lastResizeObserverRef.current.disconnect();\n lastResizeObserverRef.current = null;\n }\n\n if (!node) return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const newHeight = entry.contentRect.height;\n if (newHeight > 0) {\n setLastNodeHight(newHeight);\n }\n }\n });\n resizeObserver.observe(node);\n lastResizeObserverRef.current = resizeObserver;\n }, []);\n\n const onAddCondition = () => {\n const { id } = value;\n addCondition(id);\n };\n\n const onAddRelation = () => {\n const { id } = value;\n addRelation(id);\n };\n\n const onRemove = () => {\n const { id } = value;\n remove(id);\n };\n\n const onChangeRelation = (logicType: ELogicType) => {\n const { id } = value;\n changeRelation(id, logicType);\n };\n\n const onChangeRecordData = (data: T) => {\n const { id } = value;\n changeRecordData(id, data);\n };\n\n useEffect(() => {\n return () => {\n if (firstResizeObserverRef.current) {\n firstResizeObserverRef.current.disconnect();\n firstResizeObserverRef.current = null;\n }\n if (lastResizeObserverRef.current) {\n lastResizeObserverRef.current.disconnect();\n lastResizeObserverRef.current = null;\n }\n };\n }, []);\n\n const isEn = locale === ELangType.EN;\n\n if (type === ENodeType.LOGIC) {\n const { nodes, logicType } = value;\n const verticalLineHeight =\n nodes.length > 1\n ? `calc(100% - ${firstNodeHight / TWO}px - ${\n lastNodeHight / TWO\n }px - 42px)`\n : `30px`;\n\n return (\n <div\n className={cn('ald-logic-tree-logic-node', {\n 'is-hover-drag-box': isHoverDragBox,\n 'is-dragging': isDragging,\n 'is-hover-top': isDragOver && dropPosition === EPutPosition.TOP,\n 'is-hover-bottom': isDragOver && dropPosition === EPutPosition.BOTTOM,\n })}\n onMouseMove={(e) => {\n e.stopPropagation();\n setHoverId(value.id);\n }}\n onMouseOut={(e) => {\n e.stopPropagation();\n setHoverId('');\n }}\n ref={ref}\n >\n {_.map(nodes, (node, index) => {\n let heightRef = null;\n if (index === 0) {\n heightRef = firstRef;\n } else if (index === nodes.length - 1) {\n heightRef = lastRef;\n }\n\n return (\n <div\n className=\"ald-logic-tree-node-wrap\"\n key={node.id}\n ref={heightRef}\n >\n <div className=\"ald-logic-tree-horizontal-line\" />\n <LogicItem\n key={node.id}\n value={node}\n addCondition={addCondition}\n addRelation={addRelation}\n remove={remove}\n changeRelation={changeRelation}\n renderCondition={renderCondition}\n changeRecordData={changeRecordData}\n hoverId={hoverId}\n setHoverId={setHoverId}\n onDragEnd={onDragEnd}\n />\n </div>\n );\n })}\n <div className=\"ald-logic-tree-operation\">\n <div className=\"ald-logic-tree-left-bottom-dash-line\" />\n <TextLink icon={<PlusIcon size={24} />} onClick={onAddCondition}>\n {t.LogicTree.btn.addCondition}\n </TextLink>\n {!hideBottomBtn?.addRelation && (\n <TextLink icon={<PlusIcon size={24} />} onClick={onAddRelation}>\n {t.LogicTree.btn.addRelation}\n </TextLink>\n )}\n </div>\n {!!_.size(nodes) && (\n <div\n className=\"ald-logic-tree-logic-vertical-line\"\n style={{\n height: verticalLineHeight,\n top: `${firstNodeHight / TWO + 4}px`,\n }}\n />\n )}\n {!isRoot && (hoverId === value.id || isDragging) && (\n <div\n className=\"ald-logic-tree-node-drag-icon-wrapper\"\n onMouseMove={(e) => {\n e.stopPropagation();\n setIsHoverDragBox(true);\n setHoverId(value.id);\n }}\n onMouseOut={(e) => {\n e.stopPropagation();\n setIsHoverDragBox(false);\n }}\n >\n <DragLightLine\n onMouseMove={(e) => {\n e.stopPropagation();\n setIsHoverDragBox(true);\n setHoverId(value.id);\n }}\n size={16}\n color=\"var(--content-secondary)\"\n className=\"ald-logic-tree-node-drag-icon\"\n />\n </div>\n )}\n\n <Select\n options={logicOptions}\n className={cn('ald-logic-tree-select-relation', {\n 'ald-logic-tree-select-relation-en': isEn,\n })}\n size=\"small\"\n popupMatchSelectWidth={false}\n value={logicType}\n onChange={onChangeRelation}\n />\n <DragPreviewImage connect={preview} src={dargPreviewImg} />\n </div>\n );\n }\n\n return (\n <>\n <DragPreviewImage connect={preview} src={dargPreviewImg} />\n <div\n className={cn('ald-logic-tree-record-node', {\n 'is-hover-drag-box': isHoverDragBox,\n 'is-dragging': isDragging,\n 'is-hover-top': isDragOver && dropPosition === EPutPosition.TOP,\n 'is-hover-bottom': isDragOver && dropPosition === EPutPosition.BOTTOM,\n })}\n ref={ref}\n onMouseMove={(e) => {\n e.stopPropagation();\n setHoverId(value.id);\n }}\n onMouseOut={(e) => {\n e.stopPropagation();\n setHoverId('');\n }}\n >\n <div\n className=\"ald-logic-tree-node-drag-icon-preview\"\n ref={preview}\n ></div>\n {(hoverId === value.id || isDragging) && (\n <div\n className=\"ald-logic-tree-record-node-drag-icon-wrapper\"\n onMouseMove={(e) => {\n e.stopPropagation();\n setIsHoverDragBox(true);\n setHoverId(value.id);\n }}\n onMouseOut={(e) => {\n e.stopPropagation();\n setIsHoverDragBox(false);\n }}\n >\n <DragLightLine\n onMouseMove={(e) => {\n e.stopPropagation();\n setIsHoverDragBox(true);\n setHoverId(value.id);\n }}\n size={16}\n color=\"var(--content-secondary)\"\n className=\"ald-logic-tree-record-node-drag-icon\"\n />\n </div>\n )}\n\n <div className=\"ald-logic-tree-render-condition-wrap\">\n {renderCondition(\n value.data,\n { changeData: onChangeRecordData },\n value.id,\n )}\n </div>\n <IconButton\n icon={<TrashLightLine size={16} />}\n size={'small'}\n onClick={onRemove}\n />\n </div>\n </>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/LogicTree/components/LogicItem/index.tsx"],"sourcesContent":["import { cn } from '../../../lib/utils';\nimport _ from 'lodash';\nimport React, {\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { DragPreviewImage, useDrag, useDrop } from 'react-dnd';\nimport { EPutPosition, TRenderCondition } from '../..';\nimport DragLightLine from '../../../Icon/components/DragLightLine';\nimport PlusIcon from '../../../Icon/components/SignLightLine';\nimport TrashLightLine from '../../../Icon/components/TrashLightLine';\nimport IconButton from '../../../IconButton';\nimport Select from '../../../Select';\nimport TextLink from '../../../TextLink';\nimport {\n ELangType,\n LocaleContext,\n getTranslator,\n} from '../../../locale/default';\nimport { ELogicType, ENodeType, TNode } from '../../type';\n\nconst dargPreviewImg =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAYSURBVHgB7cAxAQAAAMKg9U9tCU8oAPgYBlQAAX19SpgAAAAASUVORK5CYII=';\n\ninterface IProps<T> {\n value: TNode<T>;\n addCondition: (id: string) => void;\n addRelation: (id: string) => void;\n remove: (id: string) => void;\n changeRecordData: (id: string, data: T) => void;\n changeRelation: (id: string, logicType: ELogicType) => void;\n renderCondition: TRenderCondition<T>;\n onDragEnd: (\n dragId: string,\n hoverId: string,\n dropPosition: EPutPosition,\n ) => void;\n hoverId: string;\n setHoverId: (id: string) => void;\n isRoot?: boolean;\n hideBottomBtn?: {\n addRelation?: boolean;\n };\n level?: number;\n}\n\nconst TWO = 2;\n\nexport default function LogicItem<T>({\n value,\n addCondition,\n addRelation,\n changeRecordData,\n remove,\n changeRelation,\n renderCondition,\n onDragEnd,\n hoverId,\n setHoverId,\n isRoot = false,\n hideBottomBtn,\n level = 1,\n}: IProps<T>) {\n const [isHoverDragBox, setIsHoverDragBox] = useState(false);\n const [firstNodeHight, setFirstNodeHight] = useState(0);\n const [lastNodeHight, setLastNodeHight] = useState(0);\n const [dropPosition, setDropPosition] = useState<EPutPosition>();\n\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n\n const logicOptions = [\n {\n value: ELogicType.AND,\n label: t.LogicTree.select.and,\n },\n {\n value: ELogicType.OR,\n label: t.LogicTree.select.or,\n },\n ];\n\n const { type } = value;\n\n const ref = useRef<HTMLDivElement>(null);\n const firstResizeObserverRef = useRef<ResizeObserver | null>(null);\n const lastResizeObserverRef = useRef<ResizeObserver | null>(null);\n\n const [{ isDragging }, drag, preview] = useDrag({\n type: 'LOGIC_ITEM',\n item: { id: value.id },\n collect: (monitor) => ({\n isDragging: monitor.isDragging(),\n }),\n canDrag: !isRoot && isHoverDragBox,\n });\n\n const [{ isOver, canDrop }, drop] = useDrop({\n accept: 'LOGIC_ITEM',\n hover(item: { id: string }, monitor) {\n if (!ref.current) {\n return;\n }\n const dragId = item.id;\n const hoverId = value.id;\n\n if (dragId === hoverId) {\n return;\n }\n // 检查是否为最顶层的放置目标\n if (monitor.didDrop()) {\n return;\n }\n\n // 获取鼠标位置和目标元素位置\n const hoverBoundingRect = ref.current.getBoundingClientRect();\n const hoverMiddleY =\n (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2;\n const clientOffset = monitor.getClientOffset();\n if (clientOffset) {\n const hoverClientY = clientOffset.y - hoverBoundingRect.top;\n\n const dropPosition =\n hoverClientY < hoverMiddleY ? EPutPosition.TOP : EPutPosition.BOTTOM;\n\n setDropPosition(dropPosition);\n } else setDropPosition(undefined);\n },\n drop(item: { id: string }, monitor) {\n if (!ref.current) {\n return;\n }\n const dragId = item.id;\n const hoverId = value.id;\n\n if (dragId === hoverId) {\n return;\n }\n // 检查是否为最顶层的放置目标\n if (monitor.didDrop()) {\n return;\n }\n\n // 获取鼠标位置和目标元素位置\n const hoverBoundingRect = ref.current.getBoundingClientRect();\n const hoverMiddleY =\n (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2;\n const clientOffset = monitor.getClientOffset();\n if (clientOffset) {\n const hoverClientY = clientOffset.y - hoverBoundingRect.top;\n\n // 确定放置位置\n const dropPosition =\n hoverClientY < hoverMiddleY ? EPutPosition.TOP : EPutPosition.BOTTOM;\n\n onDragEnd(dragId, hoverId, dropPosition);\n }\n },\n collect: (monitor) => ({\n isOver: monitor.isOver({ shallow: true }),\n canDrop: monitor.canDrop(),\n }),\n });\n\n drag(drop(ref));\n\n const isDragOver = isOver && canDrop && !isRoot;\n\n const firstRef = useCallback((node: HTMLElement | null) => {\n if (firstResizeObserverRef.current) {\n firstResizeObserverRef.current.disconnect();\n firstResizeObserverRef.current = null;\n }\n\n if (!node) return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const newHeight = entry.contentRect.height;\n if (newHeight > 0) {\n setFirstNodeHight(newHeight);\n }\n }\n });\n resizeObserver.observe(node);\n firstResizeObserverRef.current = resizeObserver;\n }, []);\n\n const lastRef = useCallback((node: HTMLElement | null) => {\n if (lastResizeObserverRef.current) {\n lastResizeObserverRef.current.disconnect();\n lastResizeObserverRef.current = null;\n }\n\n if (!node) return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const newHeight = entry.contentRect.height;\n if (newHeight > 0) {\n setLastNodeHight(newHeight);\n }\n }\n });\n resizeObserver.observe(node);\n lastResizeObserverRef.current = resizeObserver;\n }, []);\n\n const onAddCondition = () => {\n const { id } = value;\n addCondition(id);\n };\n\n const onAddRelation = () => {\n const { id } = value;\n addRelation(id);\n };\n\n const onRemove = () => {\n const { id } = value;\n remove(id);\n };\n\n const onChangeRelation = (logicType: ELogicType) => {\n const { id } = value;\n changeRelation(id, logicType);\n };\n\n const onChangeRecordData = (data: T) => {\n const { id } = value;\n changeRecordData(id, data);\n };\n\n useEffect(() => {\n return () => {\n if (firstResizeObserverRef.current) {\n firstResizeObserverRef.current.disconnect();\n firstResizeObserverRef.current = null;\n }\n if (lastResizeObserverRef.current) {\n lastResizeObserverRef.current.disconnect();\n lastResizeObserverRef.current = null;\n }\n };\n }, []);\n\n const isEn = locale === ELangType.EN;\n\n if (type === ENodeType.LOGIC) {\n const { nodes, logicType } = value;\n const verticalLineHeight =\n nodes.length > 1\n ? `calc(100% - ${firstNodeHight / TWO}px - ${\n lastNodeHight / TWO\n }px - 42px)`\n : `30px`;\n\n return (\n <div\n role=\"treeitem\"\n aria-label={`${logicType} group`}\n aria-level={level}\n aria-expanded={nodes.length > 0}\n className={cn('ald-logic-tree-logic-node', {\n 'is-hover-drag-box': isHoverDragBox,\n 'is-dragging': isDragging,\n 'is-hover-top': isDragOver && dropPosition === EPutPosition.TOP,\n 'is-hover-bottom': isDragOver && dropPosition === EPutPosition.BOTTOM,\n })}\n onMouseMove={(e) => {\n e.stopPropagation();\n setHoverId(value.id);\n }}\n onMouseOut={(e) => {\n e.stopPropagation();\n setHoverId('');\n }}\n ref={ref}\n >\n {_.map(nodes, (node, index) => {\n let heightRef = null;\n if (index === 0) {\n heightRef = firstRef;\n } else if (index === nodes.length - 1) {\n heightRef = lastRef;\n }\n\n return (\n <div\n role=\"group\"\n className=\"ald-logic-tree-node-wrap\"\n key={node.id}\n ref={heightRef}\n >\n <div className=\"ald-logic-tree-horizontal-line\" />\n <LogicItem\n key={node.id}\n value={node}\n addCondition={addCondition}\n addRelation={addRelation}\n remove={remove}\n changeRelation={changeRelation}\n renderCondition={renderCondition}\n changeRecordData={changeRecordData}\n hoverId={hoverId}\n setHoverId={setHoverId}\n onDragEnd={onDragEnd}\n level={level + 1}\n />\n </div>\n );\n })}\n <div className=\"ald-logic-tree-operation\">\n <div className=\"ald-logic-tree-left-bottom-dash-line\" />\n <TextLink icon={<PlusIcon size={24} />} onClick={onAddCondition}>\n {t.LogicTree.btn.addCondition}\n </TextLink>\n {!hideBottomBtn?.addRelation && (\n <TextLink icon={<PlusIcon size={24} />} onClick={onAddRelation}>\n {t.LogicTree.btn.addRelation}\n </TextLink>\n )}\n </div>\n {!!_.size(nodes) && (\n <div\n className=\"ald-logic-tree-logic-vertical-line\"\n style={{\n height: verticalLineHeight,\n top: `${firstNodeHight / TWO + 4}px`,\n }}\n />\n )}\n {!isRoot && (hoverId === value.id || isDragging) && (\n <div\n className=\"ald-logic-tree-node-drag-icon-wrapper\"\n onMouseMove={(e) => {\n e.stopPropagation();\n setIsHoverDragBox(true);\n setHoverId(value.id);\n }}\n onMouseOut={(e) => {\n e.stopPropagation();\n setIsHoverDragBox(false);\n }}\n >\n <DragLightLine\n onMouseMove={(e) => {\n e.stopPropagation();\n setIsHoverDragBox(true);\n setHoverId(value.id);\n }}\n size={16}\n color=\"var(--content-secondary)\"\n className=\"ald-logic-tree-node-drag-icon\"\n />\n </div>\n )}\n\n <Select\n aria-label={`${logicType} relation`}\n options={logicOptions}\n className={cn('ald-logic-tree-select-relation', {\n 'ald-logic-tree-select-relation-en': isEn,\n })}\n size=\"small\"\n popupMatchSelectWidth={false}\n value={logicType}\n onChange={onChangeRelation}\n />\n <DragPreviewImage connect={preview} src={dargPreviewImg} />\n </div>\n );\n }\n\n return (\n <>\n <DragPreviewImage connect={preview} src={dargPreviewImg} />\n <div\n role=\"treeitem\"\n aria-label=\"Condition\"\n aria-level={level}\n className={cn('ald-logic-tree-record-node', {\n 'is-hover-drag-box': isHoverDragBox,\n 'is-dragging': isDragging,\n 'is-hover-top': isDragOver && dropPosition === EPutPosition.TOP,\n 'is-hover-bottom': isDragOver && dropPosition === EPutPosition.BOTTOM,\n })}\n ref={ref}\n onMouseMove={(e) => {\n e.stopPropagation();\n setHoverId(value.id);\n }}\n onMouseOut={(e) => {\n e.stopPropagation();\n setHoverId('');\n }}\n >\n <div\n className=\"ald-logic-tree-node-drag-icon-preview\"\n ref={preview}\n ></div>\n {(hoverId === value.id || isDragging) && (\n <div\n className=\"ald-logic-tree-record-node-drag-icon-wrapper\"\n onMouseMove={(e) => {\n e.stopPropagation();\n setIsHoverDragBox(true);\n setHoverId(value.id);\n }}\n onMouseOut={(e) => {\n e.stopPropagation();\n setIsHoverDragBox(false);\n }}\n >\n <DragLightLine\n onMouseMove={(e) => {\n e.stopPropagation();\n setIsHoverDragBox(true);\n setHoverId(value.id);\n }}\n size={16}\n color=\"var(--content-secondary)\"\n className=\"ald-logic-tree-record-node-drag-icon\"\n />\n </div>\n )}\n\n <div className=\"ald-logic-tree-render-condition-wrap\">\n {renderCondition(\n value.data,\n { changeData: onChangeRecordData },\n value.id,\n )}\n </div>\n <IconButton\n aria-label=\"Remove condition\"\n icon={<TrashLightLine size={16} />}\n size={'small'}\n onClick={onRemove}\n />\n </div>\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AAwBA,IAAM,iBACJ;AAwBF,IAAM,MAAM;AAEZ,SAAwB,UAAa,EACnC,OACA,cACA,aACA,kBACA,QACA,gBACA,iBACA,WACA,SACA,YACA,SAAS,OACT,eACA,QAAQ,KACI;CACZ,MAAM,CAAC,gBAAgB,qBAAqB,SAAS,MAAM;CAC3D,MAAM,CAAC,gBAAgB,qBAAqB,SAAS,EAAE;CACvD,MAAM,CAAC,eAAe,oBAAoB,SAAS,EAAE;CACrD,MAAM,CAAC,cAAc,mBAAmB,UAAwB;CAEhE,MAAM,EAAE,WAAW,WAAW,cAAc;CAC5C,MAAM,IAAI,cAAc,OAAO;CAE/B,MAAM,eAAe,CACnB;EACE,OAAO,WAAW;EAClB,OAAO,EAAE,UAAU,OAAO;EAC3B,EACD;EACE,OAAO,WAAW;EAClB,OAAO,EAAE,UAAU,OAAO;EAC3B,CACF;CAED,MAAM,EAAE,SAAS;CAEjB,MAAM,MAAM,OAAuB,KAAK;CACxC,MAAM,yBAAyB,OAA8B,KAAK;CAClE,MAAM,wBAAwB,OAA8B,KAAK;CAEjE,MAAM,CAAC,EAAE,cAAc,MAAM,WAAW,QAAQ;EAC9C,MAAM;EACN,MAAM,EAAE,IAAI,MAAM,IAAI;EACtB,UAAU,aAAa,EACrB,YAAY,QAAQ,YAAY,EACjC;EACD,SAAS,CAAC,UAAU;EACrB,CAAC;CAEF,MAAM,CAAC,EAAE,QAAQ,WAAW,QAAQ,QAAQ;EAC1C,QAAQ;EACR,MAAM,MAAsB,SAAS;AACnC,OAAI,CAAC,IAAI,QACP;AAKF,OAHe,KAAK,OACJ,MAAM,GAGpB;AAGF,OAAI,QAAQ,SAAS,CACnB;GAIF,MAAM,oBAAoB,IAAI,QAAQ,uBAAuB;GAC7D,MAAM,gBACH,kBAAkB,SAAS,kBAAkB,OAAO;GACvD,MAAM,eAAe,QAAQ,iBAAiB;AAC9C,OAAI,aAMF,iBALqB,aAAa,IAAI,kBAAkB,MAGvC,eAAe,aAAa,MAAM,aAAa,OAEnC;OACxB,iBAAgB,OAAU;;EAEnC,KAAK,MAAsB,SAAS;AAClC,OAAI,CAAC,IAAI,QACP;GAEF,MAAM,SAAS,KAAK;GACpB,MAAM,UAAU,MAAM;AAEtB,OAAI,WAAW,QACb;AAGF,OAAI,QAAQ,SAAS,CACnB;GAIF,MAAM,oBAAoB,IAAI,QAAQ,uBAAuB;GAC7D,MAAM,gBACH,kBAAkB,SAAS,kBAAkB,OAAO;GACvD,MAAM,eAAe,QAAQ,iBAAiB;AAC9C,OAAI,aAOF,WAAU,QAAQ,SANG,aAAa,IAAI,kBAAkB,MAIvC,eAAe,aAAa,MAAM,aAAa,OAExB;;EAG5C,UAAU,aAAa;GACrB,QAAQ,QAAQ,OAAO,EAAE,SAAS,MAAM,CAAC;GACzC,SAAS,QAAQ,SAAS;GAC3B;EACF,CAAC;AAEF,MAAK,KAAK,IAAI,CAAC;CAEf,MAAM,aAAa,UAAU,WAAW,CAAC;CAEzC,MAAM,WAAW,aAAa,SAA6B;AACzD,MAAI,uBAAuB,SAAS;AAClC,0BAAuB,QAAQ,YAAY;AAC3C,0BAAuB,UAAU;;AAGnC,MAAI,CAAC,KAAM;EAEX,MAAM,iBAAiB,IAAI,gBAAgB,YAAY;AACrD,QAAK,MAAM,SAAS,SAAS;IAC3B,MAAM,YAAY,MAAM,YAAY;AACpC,QAAI,YAAY,EACd,mBAAkB,UAAU;;IAGhC;AACF,iBAAe,QAAQ,KAAK;AAC5B,yBAAuB,UAAU;IAChC,EAAE,CAAC;CAEN,MAAM,UAAU,aAAa,SAA6B;AACxD,MAAI,sBAAsB,SAAS;AACjC,yBAAsB,QAAQ,YAAY;AAC1C,yBAAsB,UAAU;;AAGlC,MAAI,CAAC,KAAM;EAEX,MAAM,iBAAiB,IAAI,gBAAgB,YAAY;AACrD,QAAK,MAAM,SAAS,SAAS;IAC3B,MAAM,YAAY,MAAM,YAAY;AACpC,QAAI,YAAY,EACd,kBAAiB,UAAU;;IAG/B;AACF,iBAAe,QAAQ,KAAK;AAC5B,wBAAsB,UAAU;IAC/B,EAAE,CAAC;CAEN,MAAM,uBAAuB;EAC3B,MAAM,EAAE,OAAO;AACf,eAAa,GAAG;;CAGlB,MAAM,sBAAsB;EAC1B,MAAM,EAAE,OAAO;AACf,cAAY,GAAG;;CAGjB,MAAM,iBAAiB;EACrB,MAAM,EAAE,OAAO;AACf,SAAO,GAAG;;CAGZ,MAAM,oBAAoB,cAA0B;EAClD,MAAM,EAAE,OAAO;AACf,iBAAe,IAAI,UAAU;;CAG/B,MAAM,sBAAsB,SAAY;EACtC,MAAM,EAAE,OAAO;AACf,mBAAiB,IAAI,KAAK;;AAG5B,iBAAgB;AACd,eAAa;AACX,OAAI,uBAAuB,SAAS;AAClC,2BAAuB,QAAQ,YAAY;AAC3C,2BAAuB,UAAU;;AAEnC,OAAI,sBAAsB,SAAS;AACjC,0BAAsB,QAAQ,YAAY;AAC1C,0BAAsB,UAAU;;;IAGnC,EAAE,CAAC;CAEN,MAAM,OAAO,WAAW,UAAU;AAElC,KAAI,SAAS,UAAU,OAAO;EAC5B,MAAM,EAAE,OAAO,cAAc;EAC7B,MAAM,qBACJ,MAAM,SAAS,IACX,eAAe,iBAAiB,IAAI,OAClC,gBAAgB,IACjB,cACD;AAEN,SACE,qBAAC,OAAD;GACE,MAAK;GACL,cAAY,GAAG,UAAU;GACzB,cAAY;GACZ,iBAAe,MAAM,SAAS;GAC9B,WAAW,GAAG,6BAA6B;IACzC,qBAAqB;IACrB,eAAe;IACf,gBAAgB,cAAc,iBAAiB,aAAa;IAC5D,mBAAmB,cAAc,iBAAiB,aAAa;IAChE,CAAC;GACF,cAAc,MAAM;AAClB,MAAE,iBAAiB;AACnB,eAAW,MAAM,GAAG;;GAEtB,aAAa,MAAM;AACjB,MAAE,iBAAiB;AACnB,eAAW,GAAG;;GAEX;aAnBP;IAqBG,EAAE,IAAI,QAAQ,MAAM,UAAU;KAC7B,IAAI,YAAY;AAChB,SAAI,UAAU,EACZ,aAAY;cACH,UAAU,MAAM,SAAS,EAClC,aAAY;AAGd,YACE,qBAAC,OAAD;MACE,MAAK;MACL,WAAU;MAEV,KAAK;gBAJP,CAME,oBAAC,OAAD,EAAK,WAAU,kCAAmC,CAAA,EAClD,oBAAC,WAAD;OAEE,OAAO;OACO;OACD;OACL;OACQ;OACC;OACC;OACT;OACG;OACD;OACX,OAAO,QAAQ;OACf,EAZK,KAAK,GAYV,CACE;QAlBC,KAAK,GAkBN;MAER;IACF,qBAAC,OAAD;KAAK,WAAU;eAAf;MACE,oBAAC,OAAD,EAAK,WAAU,wCAAyC,CAAA;MACxD,oBAAC,UAAD;OAAU,MAAM,oBAAC,QAAD,EAAU,MAAM,IAAM,CAAA;OAAE,SAAS;iBAC9C,EAAE,UAAU,IAAI;OACR,CAAA;MACV,CAAC,eAAe,eACf,oBAAC,UAAD;OAAU,MAAM,oBAAC,QAAD,EAAU,MAAM,IAAM,CAAA;OAAE,SAAS;iBAC9C,EAAE,UAAU,IAAI;OACR,CAAA;MAET;;IACL,CAAC,CAAC,EAAE,KAAK,MAAM,IACd,oBAAC,OAAD;KACE,WAAU;KACV,OAAO;MACL,QAAQ;MACR,KAAK,GAAG,iBAAiB,MAAM,EAAE;MAClC;KACD,CAAA;IAEH,CAAC,WAAW,YAAY,MAAM,MAAM,eACnC,oBAAC,OAAD;KACE,WAAU;KACV,cAAc,MAAM;AAClB,QAAE,iBAAiB;AACnB,wBAAkB,KAAK;AACvB,iBAAW,MAAM,GAAG;;KAEtB,aAAa,MAAM;AACjB,QAAE,iBAAiB;AACnB,wBAAkB,MAAM;;eAG1B,oBAAC,MAAD;MACE,cAAc,MAAM;AAClB,SAAE,iBAAiB;AACnB,yBAAkB,KAAK;AACvB,kBAAW,MAAM,GAAG;;MAEtB,MAAM;MACN,OAAM;MACN,WAAU;MACV,CAAA;KACE,CAAA;IAGR,oBAAC,gBAAD;KACE,cAAY,GAAG,UAAU;KACzB,SAAS;KACT,WAAW,GAAG,kCAAkC,EAC9C,qCAAqC,MACtC,CAAC;KACF,MAAK;KACL,uBAAuB;KACvB,OAAO;KACP,UAAU;KACV,CAAA;IACF,oBAAC,kBAAD;KAAkB,SAAS;KAAS,KAAK;KAAkB,CAAA;IACvD;;;AAIV,QACE,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,kBAAD;EAAkB,SAAS;EAAS,KAAK;EAAkB,CAAA,EAC3D,qBAAC,OAAD;EACE,MAAK;EACL,cAAW;EACX,cAAY;EACZ,WAAW,GAAG,8BAA8B;GAC1C,qBAAqB;GACrB,eAAe;GACf,gBAAgB,cAAc,iBAAiB,aAAa;GAC5D,mBAAmB,cAAc,iBAAiB,aAAa;GAChE,CAAC;EACG;EACL,cAAc,MAAM;AAClB,KAAE,iBAAiB;AACnB,cAAW,MAAM,GAAG;;EAEtB,aAAa,MAAM;AACjB,KAAE,iBAAiB;AACnB,cAAW,GAAG;;YAjBlB;GAoBE,oBAAC,OAAD;IACE,WAAU;IACV,KAAK;IACA,CAAA;IACL,YAAY,MAAM,MAAM,eACxB,oBAAC,OAAD;IACE,WAAU;IACV,cAAc,MAAM;AAClB,OAAE,iBAAiB;AACnB,uBAAkB,KAAK;AACvB,gBAAW,MAAM,GAAG;;IAEtB,aAAa,MAAM;AACjB,OAAE,iBAAiB;AACnB,uBAAkB,MAAM;;cAG1B,oBAAC,MAAD;KACE,cAAc,MAAM;AAClB,QAAE,iBAAiB;AACnB,wBAAkB,KAAK;AACvB,iBAAW,MAAM,GAAG;;KAEtB,MAAM;KACN,OAAM;KACN,WAAU;KACV,CAAA;IACE,CAAA;GAGR,oBAAC,OAAD;IAAK,WAAU;cACZ,gBACC,MAAM,MACN,EAAE,YAAY,oBAAoB,EAClC,MAAM,GACP;IACG,CAAA;GACN,oBAAC,YAAD;IACE,cAAW;IACX,MAAM,oBAAC,QAAD,EAAgB,MAAM,IAAM,CAAA;IAClC,MAAM;IACN,SAAS;IACT,CAAA;GACE;IACL,EAAA,CAAA"}
|
package/dist/LogicTree/index.js
CHANGED
|
@@ -96,6 +96,8 @@ function LogicTree(props) {
|
|
|
96
96
|
if (!innerValue) return null;
|
|
97
97
|
return /* @__PURE__ */ jsx(LogicTreeDndProvider, { children: /* @__PURE__ */ jsx("div", {
|
|
98
98
|
className: cn("ald-logic-tree-wrap", className),
|
|
99
|
+
role: "tree",
|
|
100
|
+
"aria-label": "Logic tree",
|
|
99
101
|
children: /* @__PURE__ */ jsx(LogicItem, {
|
|
100
102
|
value: innerValue,
|
|
101
103
|
addCondition: onAddCondition,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/LogicTree/index.tsx"],"sourcesContent":["import { useControllableValue } from 'ahooks';\nimport { cn } from '../lib/utils';\nimport './logic-tree.css';\nimport _ from 'lodash';\nimport React, { useCallback, useState } from 'react';\nimport { DndProvider, useDragDropManager } from 'react-dnd';\nimport { HTML5Backend } from 'react-dnd-html5-backend';\nimport { getUniqId } from '../_utils/getUniqId';\nimport LogicItem from './components/LogicItem';\nimport {\n addLogicNode,\n addRecordNode,\n changeRecordData,\n changeRelation,\n findNodeById,\n findParentNodeById,\n isDescendant,\n removeNode,\n} from './helper';\nimport { ELogicType, ENodeType, type TNode } from './type';\n\nexport { default as DisplayLogicTree } from './DisplayLogicTree';\nexport * from './type';\n\nexport enum EPutPosition {\n TOP = 'TOP',\n BOTTOM = 'BOTTOM',\n}\n\nexport type TRenderCondition<T> = (\n data: T,\n { changeData }: { changeData: (data: T) => void },\n nodeId: string,\n) => React.ReactNode;\n\ninterface IProps<T> {\n newInitializationData: T;\n onChange: (value: TNode<T>) => void;\n value?: TNode<T>;\n renderCondition: TRenderCondition<T>;\n rootNodeAllowedEmpty?: boolean;\n className?: string;\n needDndProvider?: boolean;\n hideBottomBtn?: {\n addRelation?: boolean;\n };\n}\n\nfunction useHasDndContext() {\n try {\n return !!useDragDropManager();\n } catch {\n return false;\n }\n}\n\nfunction LogicTreeDndProvider({ children }: { children: React.ReactNode }) {\n const hasDndContext = useHasDndContext();\n const [rootElement, setRootElement] = useState<HTMLDivElement | null>(null);\n\n if (hasDndContext) {\n return <>{children}</>;\n }\n\n return (\n <div ref={setRootElement} style={{ display: 'contents' }}>\n {rootElement ? (\n <DndProvider backend={HTML5Backend} options={{ rootElement }}>\n {children}\n </DndProvider>\n ) : null}\n </div>\n );\n}\n\nexport default function LogicTree<T>(props: IProps<T>) {\n const {\n newInitializationData,\n onChange: propsOnChange,\n renderCondition,\n rootNodeAllowedEmpty,\n className,\n hideBottomBtn,\n } = props;\n const initialNode: TNode<T> = {\n id: getUniqId(),\n type: ENodeType.LOGIC,\n logicType: ELogicType.AND,\n nodes: [\n {\n id: getUniqId(),\n type: ENodeType.RECORD,\n data: newInitializationData,\n },\n ],\n };\n\n const [innerValue, setInnerValue] = useControllableValue<TNode<T>>(\n props.value ? { value: props.value } : {},\n {\n defaultValue: initialNode,\n },\n );\n const [hoverItemId, setHoverItemId] = useState<string>('');\n\n const changeInnerValue = useCallback(\n (newValue: TNode<T>) => {\n setInnerValue(newValue);\n propsOnChange(newValue);\n },\n [propsOnChange, setInnerValue],\n );\n\n const onAddCondition = (id: string) => {\n const newRootNode = addRecordNode(id, innerValue, newInitializationData);\n changeInnerValue(newRootNode);\n };\n\n const onAddRelation = (id: string) => {\n const newRootNode = addLogicNode(id, innerValue, newInitializationData);\n changeInnerValue(newRootNode);\n };\n\n const onChangeRelation = (id: string, logicType: ELogicType) => {\n const newRootNode = changeRelation(id, logicType, innerValue);\n changeInnerValue(newRootNode);\n };\n\n const onRemove = (id: string) => {\n const newRootNode = removeNode(\n id,\n innerValue,\n initialNode,\n rootNodeAllowedEmpty,\n );\n changeInnerValue(newRootNode);\n };\n\n const onChangeRecordData = (id: string, data: T) => {\n const newRootNode = changeRecordData(id, data, innerValue);\n changeInnerValue(newRootNode);\n };\n\n const moveNode = useCallback(\n (dragId: string, hoverId: string, dropPosition: EPutPosition) => {\n const newRootNode = _.cloneDeep(innerValue);\n const dragNode = findNodeById(dragId, newRootNode);\n const hoverNode = findNodeById(hoverId, newRootNode);\n\n if (dragNode && hoverNode) {\n if (isDescendant(hoverId, dragNode)) {\n return;\n }\n\n const dragParent = findParentNodeById(dragId, newRootNode);\n const hoverParent = findParentNodeById(hoverId, newRootNode);\n\n if (dragParent && hoverParent) {\n // 从原位置移除节点\n dragParent.nodes = dragParent.nodes.filter(\n (node) => node.id !== dragId,\n );\n\n // 如果拖拽父节点为空,处理删除逻辑\n if (dragParent.nodes.length === 0) {\n const grandParent = findParentNodeById(dragParent.id, newRootNode);\n if (grandParent) {\n grandParent.nodes = grandParent.nodes.filter(\n (node) => node.id !== dragParent.id,\n );\n } else {\n dragParent.nodes = [];\n }\n }\n\n // 插入到新位置\n const hoverIndex = hoverParent.nodes.findIndex(\n (node) => node.id === hoverId,\n );\n const newIndex =\n dropPosition === EPutPosition.TOP ? hoverIndex : hoverIndex + 1;\n hoverParent.nodes.splice(newIndex, 0, dragNode);\n\n // 更新状态\n changeInnerValue(newRootNode);\n }\n }\n },\n [innerValue, changeInnerValue],\n );\n\n if (!innerValue) {\n return null;\n }\n\n const content = (\n <div
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/LogicTree/index.tsx"],"sourcesContent":["import { useControllableValue } from 'ahooks';\nimport { cn } from '../lib/utils';\nimport './logic-tree.css';\nimport _ from 'lodash';\nimport React, { useCallback, useState } from 'react';\nimport { DndProvider, useDragDropManager } from 'react-dnd';\nimport { HTML5Backend } from 'react-dnd-html5-backend';\nimport { getUniqId } from '../_utils/getUniqId';\nimport LogicItem from './components/LogicItem';\nimport {\n addLogicNode,\n addRecordNode,\n changeRecordData,\n changeRelation,\n findNodeById,\n findParentNodeById,\n isDescendant,\n removeNode,\n} from './helper';\nimport { ELogicType, ENodeType, type TNode } from './type';\n\nexport { default as DisplayLogicTree } from './DisplayLogicTree';\nexport * from './type';\n\nexport enum EPutPosition {\n TOP = 'TOP',\n BOTTOM = 'BOTTOM',\n}\n\nexport type TRenderCondition<T> = (\n data: T,\n { changeData }: { changeData: (data: T) => void },\n nodeId: string,\n) => React.ReactNode;\n\ninterface IProps<T> {\n newInitializationData: T;\n onChange: (value: TNode<T>) => void;\n value?: TNode<T>;\n renderCondition: TRenderCondition<T>;\n rootNodeAllowedEmpty?: boolean;\n className?: string;\n needDndProvider?: boolean;\n hideBottomBtn?: {\n addRelation?: boolean;\n };\n}\n\nfunction useHasDndContext() {\n try {\n return !!useDragDropManager();\n } catch {\n return false;\n }\n}\n\nfunction LogicTreeDndProvider({ children }: { children: React.ReactNode }) {\n const hasDndContext = useHasDndContext();\n const [rootElement, setRootElement] = useState<HTMLDivElement | null>(null);\n\n if (hasDndContext) {\n return <>{children}</>;\n }\n\n return (\n <div ref={setRootElement} style={{ display: 'contents' }}>\n {rootElement ? (\n <DndProvider backend={HTML5Backend} options={{ rootElement }}>\n {children}\n </DndProvider>\n ) : null}\n </div>\n );\n}\n\nexport default function LogicTree<T>(props: IProps<T>) {\n const {\n newInitializationData,\n onChange: propsOnChange,\n renderCondition,\n rootNodeAllowedEmpty,\n className,\n hideBottomBtn,\n } = props;\n const initialNode: TNode<T> = {\n id: getUniqId(),\n type: ENodeType.LOGIC,\n logicType: ELogicType.AND,\n nodes: [\n {\n id: getUniqId(),\n type: ENodeType.RECORD,\n data: newInitializationData,\n },\n ],\n };\n\n const [innerValue, setInnerValue] = useControllableValue<TNode<T>>(\n props.value ? { value: props.value } : {},\n {\n defaultValue: initialNode,\n },\n );\n const [hoverItemId, setHoverItemId] = useState<string>('');\n\n const changeInnerValue = useCallback(\n (newValue: TNode<T>) => {\n setInnerValue(newValue);\n propsOnChange(newValue);\n },\n [propsOnChange, setInnerValue],\n );\n\n const onAddCondition = (id: string) => {\n const newRootNode = addRecordNode(id, innerValue, newInitializationData);\n changeInnerValue(newRootNode);\n };\n\n const onAddRelation = (id: string) => {\n const newRootNode = addLogicNode(id, innerValue, newInitializationData);\n changeInnerValue(newRootNode);\n };\n\n const onChangeRelation = (id: string, logicType: ELogicType) => {\n const newRootNode = changeRelation(id, logicType, innerValue);\n changeInnerValue(newRootNode);\n };\n\n const onRemove = (id: string) => {\n const newRootNode = removeNode(\n id,\n innerValue,\n initialNode,\n rootNodeAllowedEmpty,\n );\n changeInnerValue(newRootNode);\n };\n\n const onChangeRecordData = (id: string, data: T) => {\n const newRootNode = changeRecordData(id, data, innerValue);\n changeInnerValue(newRootNode);\n };\n\n const moveNode = useCallback(\n (dragId: string, hoverId: string, dropPosition: EPutPosition) => {\n const newRootNode = _.cloneDeep(innerValue);\n const dragNode = findNodeById(dragId, newRootNode);\n const hoverNode = findNodeById(hoverId, newRootNode);\n\n if (dragNode && hoverNode) {\n if (isDescendant(hoverId, dragNode)) {\n return;\n }\n\n const dragParent = findParentNodeById(dragId, newRootNode);\n const hoverParent = findParentNodeById(hoverId, newRootNode);\n\n if (dragParent && hoverParent) {\n // 从原位置移除节点\n dragParent.nodes = dragParent.nodes.filter(\n (node) => node.id !== dragId,\n );\n\n // 如果拖拽父节点为空,处理删除逻辑\n if (dragParent.nodes.length === 0) {\n const grandParent = findParentNodeById(dragParent.id, newRootNode);\n if (grandParent) {\n grandParent.nodes = grandParent.nodes.filter(\n (node) => node.id !== dragParent.id,\n );\n } else {\n dragParent.nodes = [];\n }\n }\n\n // 插入到新位置\n const hoverIndex = hoverParent.nodes.findIndex(\n (node) => node.id === hoverId,\n );\n const newIndex =\n dropPosition === EPutPosition.TOP ? hoverIndex : hoverIndex + 1;\n hoverParent.nodes.splice(newIndex, 0, dragNode);\n\n // 更新状态\n changeInnerValue(newRootNode);\n }\n }\n },\n [innerValue, changeInnerValue],\n );\n\n if (!innerValue) {\n return null;\n }\n\n const content = (\n <div\n className={cn('ald-logic-tree-wrap', className)}\n role=\"tree\"\n aria-label=\"Logic tree\"\n >\n <LogicItem\n value={innerValue}\n addCondition={onAddCondition}\n addRelation={onAddRelation}\n remove={onRemove}\n changeRecordData={onChangeRecordData}\n renderCondition={renderCondition}\n changeRelation={onChangeRelation}\n onDragEnd={moveNode}\n hoverId={hoverItemId}\n setHoverId={setHoverItemId}\n isRoot={true} // 将最顶层的LogicItem标记为根节点\n hideBottomBtn={hideBottomBtn}\n />\n </div>\n );\n\n return <LogicTreeDndProvider>{content}</LogicTreeDndProvider>;\n}\n"],"mappings":"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"}
|
|
@@ -1,20 +1,18 @@
|
|
|
1
1
|
import { cn } from "../../lib/utils.js";
|
|
2
|
-
import Memo from "../../Icon/components/SearchLine.js";
|
|
3
2
|
import { LocaleContext, getTranslator } from "../../locale/default.js";
|
|
4
|
-
import Input from "../../Input/index.js";
|
|
5
3
|
import Empty from "../../Empty/index.js";
|
|
6
4
|
import CustomSpin from "../../Spin/index.js";
|
|
7
5
|
import { isUser } from "../utils/getUsersWithUserId.js";
|
|
8
6
|
import MultipleList from "./MultipleOption.js";
|
|
9
7
|
import SingleOption from "./SingleOption.js";
|
|
10
|
-
import React, { useContext, useDeferredValue, useEffect, useMemo
|
|
8
|
+
import React, { useContext, useDeferredValue, useEffect, useMemo } from "react";
|
|
11
9
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
12
10
|
import _ from "lodash";
|
|
13
11
|
import { useVirtualizer } from "@tanstack/react-virtual";
|
|
14
12
|
function MemberSelection(props) {
|
|
15
13
|
const { locale } = useContext(LocaleContext);
|
|
16
14
|
const t = getTranslator(locale);
|
|
17
|
-
const { className, userList, multiple, onChange, selectedUsers, onSearchValueChange, loading, width, lockedIds, filterItem, renderItem } = props;
|
|
15
|
+
const { className, userList, multiple, onChange, selectedUsers, onSearchValueChange, loading, width, lockedIds, filterItem, renderItem, searchValue = "" } = props;
|
|
18
16
|
const filteredList = useMemo(() => {
|
|
19
17
|
return userList.filter((item) => {
|
|
20
18
|
if (filterItem) return filterItem(item);
|
|
@@ -27,110 +25,101 @@ function MemberSelection(props) {
|
|
|
27
25
|
getScrollElement: () => parentRef.current,
|
|
28
26
|
estimateSize: () => 36
|
|
29
27
|
});
|
|
30
|
-
const [searchValue, setSearchValue] = useState("");
|
|
31
28
|
const deferredSearchValue = useDeferredValue(searchValue);
|
|
32
|
-
const inputRef = React.useRef(null);
|
|
33
29
|
useEffect(() => {
|
|
34
30
|
onSearchValueChange?.(deferredSearchValue);
|
|
35
31
|
}, [deferredSearchValue, onSearchValueChange]);
|
|
36
|
-
useEffect(() => {
|
|
37
|
-
if (inputRef.current) inputRef.current.focus();
|
|
38
|
-
}, []);
|
|
39
32
|
return /* @__PURE__ */ jsxs("div", {
|
|
40
33
|
className: cn(className, "ald-member-picker-member-list-wrap"),
|
|
41
|
-
children: [
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
size: "small",
|
|
60
|
-
className: "ald-member-picker-user-list",
|
|
34
|
+
children: [filteredList.length === 0 && !loading && /* @__PURE__ */ jsx(Empty, {
|
|
35
|
+
title: t.MemberPicker.noData,
|
|
36
|
+
size: "small",
|
|
37
|
+
image: Empty.PRESENTED_IMAGE_SEARCH,
|
|
38
|
+
className: "ald-member-picker-member-list-empty"
|
|
39
|
+
}), /* @__PURE__ */ jsx(CustomSpin, {
|
|
40
|
+
tip: "Loading",
|
|
41
|
+
spinning: loading,
|
|
42
|
+
size: "small",
|
|
43
|
+
className: "ald-member-picker-user-list",
|
|
44
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
45
|
+
ref: parentRef,
|
|
46
|
+
style: {
|
|
47
|
+
height: 300,
|
|
48
|
+
overflowY: "auto",
|
|
49
|
+
overflowX: "hidden"
|
|
50
|
+
},
|
|
51
|
+
className: cn("ald-member-picker-member-list", { "ald-member-picker-member-list-null": filteredList.length === 0 && !loading }),
|
|
61
52
|
children: /* @__PURE__ */ jsx("div", {
|
|
62
|
-
|
|
53
|
+
role: "listbox",
|
|
54
|
+
"aria-label": "Members",
|
|
55
|
+
"aria-multiselectable": multiple || void 0,
|
|
56
|
+
className: "ald-member-picker-member-list-inner",
|
|
63
57
|
style: {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
58
|
+
width: multiple ? width : void 0,
|
|
59
|
+
overflow: "hidden",
|
|
60
|
+
position: "relative",
|
|
61
|
+
height: `${rowVirtualizer.getTotalSize()}px`
|
|
67
62
|
},
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
63
|
+
children: rowVirtualizer.getVirtualItems().map((virtualItem) => {
|
|
64
|
+
const user = filteredList[virtualItem.index];
|
|
65
|
+
const isSelected = selectedUsers.some((selectedUser) => selectedUser.userId === user.userId);
|
|
66
|
+
const disabled = _.findIndex(lockedIds, {
|
|
67
|
+
userId: user.userId,
|
|
68
|
+
type: user.type
|
|
69
|
+
}) !== -1;
|
|
70
|
+
const originNode = multiple ? /* @__PURE__ */ jsx(MultipleList, {
|
|
71
|
+
user,
|
|
72
|
+
disabled,
|
|
73
|
+
selected: isSelected,
|
|
74
|
+
showUserId: true,
|
|
75
|
+
onChange: (selected, user) => {
|
|
76
|
+
if (isUser(user)) onChange(selected, user);
|
|
77
|
+
}
|
|
78
|
+
}, user.userId) : /* @__PURE__ */ jsx(SingleOption, {
|
|
79
|
+
user,
|
|
80
|
+
selected: isSelected,
|
|
81
|
+
showUserId: true,
|
|
82
|
+
onChange: (selected, user) => {
|
|
83
|
+
if (isUser(user)) onChange(selected, user);
|
|
84
|
+
}
|
|
85
|
+
}, user.userId);
|
|
86
|
+
if (renderItem) return /* @__PURE__ */ jsx("div", {
|
|
87
|
+
role: "option",
|
|
88
|
+
id: `ald-member-picker-option-${user.userId}`,
|
|
89
|
+
"aria-selected": isSelected,
|
|
90
|
+
"aria-disabled": disabled || void 0,
|
|
91
|
+
style: {
|
|
92
|
+
position: "absolute",
|
|
93
|
+
top: 0,
|
|
94
|
+
left: 0,
|
|
95
|
+
width: "100%",
|
|
96
|
+
height: `${virtualItem.size}px`,
|
|
97
|
+
transform: `translateY(${virtualItem.start}px)`
|
|
98
|
+
},
|
|
99
|
+
children: renderItem(user, {
|
|
100
|
+
isSelected,
|
|
86
101
|
disabled,
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
onChange: (selected, user) => {
|
|
90
|
-
if (isUser(user)) onChange(selected, user);
|
|
91
|
-
}
|
|
92
|
-
}, user.userId) : /* @__PURE__ */ jsx(SingleOption, {
|
|
93
|
-
user,
|
|
94
|
-
selected: isSelected,
|
|
95
|
-
showUserId: true,
|
|
96
|
-
onChange: (selected, user) => {
|
|
97
|
-
if (isUser(user)) onChange(selected, user);
|
|
98
|
-
}
|
|
99
|
-
}, user.userId);
|
|
100
|
-
if (renderItem) return /* @__PURE__ */ jsx("div", {
|
|
101
|
-
style: {
|
|
102
|
-
position: "absolute",
|
|
103
|
-
top: 0,
|
|
104
|
-
left: 0,
|
|
105
|
-
width: "100%",
|
|
106
|
-
height: `${virtualItem.size}px`,
|
|
107
|
-
transform: `translateY(${virtualItem.start}px)`
|
|
108
|
-
},
|
|
109
|
-
children: renderItem(user, {
|
|
110
|
-
isSelected,
|
|
111
|
-
disabled,
|
|
112
|
-
onClick: () => {
|
|
113
|
-
if (!disabled) onChange(!isSelected, user);
|
|
114
|
-
},
|
|
115
|
-
originNode
|
|
116
|
-
})
|
|
117
|
-
}, virtualItem.key);
|
|
118
|
-
return /* @__PURE__ */ jsx("div", {
|
|
119
|
-
style: {
|
|
120
|
-
position: "absolute",
|
|
121
|
-
top: 0,
|
|
122
|
-
left: 0,
|
|
123
|
-
width: "100%",
|
|
124
|
-
height: `${virtualItem.size}px`,
|
|
125
|
-
transform: `translateY(${virtualItem.start}px)`
|
|
102
|
+
onClick: () => {
|
|
103
|
+
if (!disabled) onChange(!isSelected, user);
|
|
126
104
|
},
|
|
127
|
-
|
|
128
|
-
}
|
|
129
|
-
})
|
|
105
|
+
originNode
|
|
106
|
+
})
|
|
107
|
+
}, virtualItem.key);
|
|
108
|
+
return /* @__PURE__ */ jsx("div", {
|
|
109
|
+
style: {
|
|
110
|
+
position: "absolute",
|
|
111
|
+
top: 0,
|
|
112
|
+
left: 0,
|
|
113
|
+
width: "100%",
|
|
114
|
+
height: `${virtualItem.size}px`,
|
|
115
|
+
transform: `translateY(${virtualItem.start}px)`
|
|
116
|
+
},
|
|
117
|
+
children: originNode
|
|
118
|
+
}, virtualItem.key);
|
|
130
119
|
})
|
|
131
120
|
})
|
|
132
121
|
})
|
|
133
|
-
]
|
|
122
|
+
})]
|
|
134
123
|
});
|
|
135
124
|
}
|
|
136
125
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemberSelection.js","names":[],"sources":["../../../src/MemberPicker/components/MemberSelection.tsx"],"sourcesContent":["import { useVirtualizer } from '@tanstack/react-virtual';\nimport { cn } from '../../lib/utils';\nimport _ from 'lodash';\nimport React, {
|
|
1
|
+
{"version":3,"file":"MemberSelection.js","names":[],"sources":["../../../src/MemberPicker/components/MemberSelection.tsx"],"sourcesContent":["import { useVirtualizer } from '@tanstack/react-virtual';\nimport { cn } from '../../lib/utils';\nimport _ from 'lodash';\nimport React, { useContext, useDeferredValue, useEffect, useMemo } from 'react';\nimport Empty from '../../Empty';\nimport Spin from '../../Spin';\nimport { LocaleContext, getTranslator } from '../../locale/default';\nimport { IUser, TUserGroupValue, TUserValue } from '../interface';\nimport { isUser } from '../utils/getUsersWithUserId';\nimport MultipleOption from './MultipleOption';\nimport SingleOption from './SingleOption';\n\ninterface IMemberSelectionProps {\n className?: string;\n userList: IUser[];\n multiple?: boolean;\n onChange: (selected: boolean, user: IUser) => void;\n selectedUsers: IUser[];\n onSearchValueChange?: (value: string) => void;\n loading: boolean;\n width: number;\n filterItem?: (item: IUser) => boolean;\n searchValue?: string;\n lockedIds: Array<TUserValue | TUserGroupValue>;\n renderItem?: (\n item: IUser,\n context: {\n isSelected: boolean;\n disabled: boolean;\n onClick: () => void;\n originNode: React.ReactNode;\n },\n ) => React.ReactNode;\n}\n\nexport const OPTION_HEIGHT = 36;\nexport const WRAPPER_HEIGHT = 300;\n\nexport default function MemberSelection(props: IMemberSelectionProps) {\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n\n const {\n className,\n userList,\n multiple,\n onChange,\n selectedUsers,\n onSearchValueChange,\n loading,\n width,\n lockedIds,\n filterItem,\n renderItem,\n searchValue = '',\n } = props;\n\n const filteredList = useMemo(() => {\n return userList.filter((item) => {\n if (filterItem) {\n return filterItem(item);\n }\n return true;\n });\n }, [userList, filterItem]);\n\n const parentRef = React.useRef<HTMLDivElement>(null);\n\n // The virtualizer\n const rowVirtualizer = useVirtualizer({\n count: filteredList.length,\n getScrollElement: () => parentRef.current,\n estimateSize: () => OPTION_HEIGHT,\n });\n\n const deferredSearchValue = useDeferredValue(searchValue);\n useEffect(() => {\n onSearchValueChange?.(deferredSearchValue);\n }, [deferredSearchValue, onSearchValueChange]);\n\n return (\n <div className={cn(className, 'ald-member-picker-member-list-wrap')}>\n {filteredList.length === 0 && !loading && (\n <Empty\n title={t.MemberPicker.noData}\n size=\"small\"\n image={Empty.PRESENTED_IMAGE_SEARCH}\n className=\"ald-member-picker-member-list-empty\"\n />\n )}\n\n <Spin\n tip=\"Loading\"\n spinning={loading}\n size=\"small\"\n className=\"ald-member-picker-user-list\"\n >\n <div\n ref={parentRef}\n style={{\n height: WRAPPER_HEIGHT,\n overflowY: 'auto',\n overflowX: 'hidden',\n }}\n className={cn('ald-member-picker-member-list', {\n 'ald-member-picker-member-list-null':\n filteredList.length === 0 && !loading,\n })}\n // innerClassName=\"ald-member-picker-member-scroll\"\n >\n <div\n role=\"listbox\"\n aria-label=\"Members\"\n aria-multiselectable={multiple || undefined}\n className=\"ald-member-picker-member-list-inner\"\n style={{\n width: multiple ? width : undefined,\n overflow: 'hidden',\n position: 'relative',\n height: `${rowVirtualizer.getTotalSize()}px`,\n }}\n >\n {rowVirtualizer.getVirtualItems().map((virtualItem) => {\n const user = filteredList[virtualItem.index];\n const isSelected = selectedUsers.some(\n (selectedUser) => selectedUser.userId === user.userId,\n );\n const index = _.findIndex(lockedIds, {\n userId: user.userId,\n type: user.type,\n });\n const disabled = index !== -1;\n\n const originNode = multiple ? (\n <MultipleOption\n key={user.userId}\n user={user}\n disabled={disabled}\n selected={isSelected}\n showUserId={true}\n onChange={(selected, user) => {\n if (isUser(user)) onChange(selected, user);\n }}\n ></MultipleOption>\n ) : (\n <SingleOption\n key={user.userId}\n user={user}\n selected={isSelected}\n showUserId={true}\n onChange={(selected, user) => {\n if (isUser(user)) onChange(selected, user);\n }}\n ></SingleOption>\n );\n\n if (renderItem) {\n return (\n <div\n role=\"option\"\n id={`ald-member-picker-option-${user.userId}`}\n aria-selected={isSelected}\n aria-disabled={disabled || undefined}\n key={virtualItem.key}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: `${virtualItem.size}px`,\n transform: `translateY(${virtualItem.start}px)`,\n }}\n >\n {renderItem(user, {\n isSelected,\n disabled,\n onClick: () => {\n if (!disabled) {\n onChange(!isSelected, user);\n }\n },\n originNode,\n })}\n </div>\n );\n }\n\n return (\n <div\n key={virtualItem.key}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: `${virtualItem.size}px`,\n transform: `translateY(${virtualItem.start}px)`,\n }}\n >\n {originNode}\n </div>\n );\n })}\n </div>\n </div>\n </Spin>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;AAsCA,SAAwB,gBAAgB,OAA8B;CACpE,MAAM,EAAE,WAAW,WAAW,cAAc;CAC5C,MAAM,IAAI,cAAc,OAAO;CAE/B,MAAM,EACJ,WACA,UACA,UACA,UACA,eACA,qBACA,SACA,OACA,WACA,YACA,YACA,cAAc,OACZ;CAEJ,MAAM,eAAe,cAAc;AACjC,SAAO,SAAS,QAAQ,SAAS;AAC/B,OAAI,WACF,QAAO,WAAW,KAAK;AAEzB,UAAO;IACP;IACD,CAAC,UAAU,WAAW,CAAC;CAE1B,MAAM,YAAY,MAAM,OAAuB,KAAK;CAGpD,MAAM,iBAAiB,eAAe;EACpC,OAAO,aAAa;EACpB,wBAAwB,UAAU;EAClC,oBAAA;EACD,CAAC;CAEF,MAAM,sBAAsB,iBAAiB,YAAY;AACzD,iBAAgB;AACd,wBAAsB,oBAAoB;IACzC,CAAC,qBAAqB,oBAAoB,CAAC;AAE9C,QACE,qBAAC,OAAD;EAAK,WAAW,GAAG,WAAW,qCAAqC;YAAnE,CACG,aAAa,WAAW,KAAK,CAAC,WAC7B,oBAAC,OAAD;GACE,OAAO,EAAE,aAAa;GACtB,MAAK;GACL,OAAO,MAAM;GACb,WAAU;GACV,CAAA,EAGJ,oBAAC,YAAD;GACE,KAAI;GACJ,UAAU;GACV,MAAK;GACL,WAAU;aAEV,oBAAC,OAAD;IACE,KAAK;IACL,OAAO;KACL,QAAA;KACA,WAAW;KACX,WAAW;KACZ;IACD,WAAW,GAAG,iCAAiC,EAC7C,sCACE,aAAa,WAAW,KAAK,CAAC,SACjC,CAAC;cAGF,oBAAC,OAAD;KACE,MAAK;KACL,cAAW;KACX,wBAAsB,YAAY;KAClC,WAAU;KACV,OAAO;MACL,OAAO,WAAW,QAAQ;MAC1B,UAAU;MACV,UAAU;MACV,QAAQ,GAAG,eAAe,cAAc,CAAC;MAC1C;eAEA,eAAe,iBAAiB,CAAC,KAAK,gBAAgB;MACrD,MAAM,OAAO,aAAa,YAAY;MACtC,MAAM,aAAa,cAAc,MAC9B,iBAAiB,aAAa,WAAW,KAAK,OAChD;MAKD,MAAM,WAJQ,EAAE,UAAU,WAAW;OACnC,QAAQ,KAAK;OACb,MAAM,KAAK;OACZ,CAAC,KACyB;MAE3B,MAAM,aAAa,WACjB,oBAAC,cAAD;OAEQ;OACI;OACV,UAAU;OACV,YAAY;OACZ,WAAW,UAAU,SAAS;AAC5B,YAAI,OAAO,KAAK,CAAE,UAAS,UAAU,KAAK;;OAE5B,EARX,KAAK,OAQM,GAElB,oBAAC,cAAD;OAEQ;OACN,UAAU;OACV,YAAY;OACZ,WAAW,UAAU,SAAS;AAC5B,YAAI,OAAO,KAAK,CAAE,UAAS,UAAU,KAAK;;OAE9B,EAPT,KAAK,OAOI;AAGlB,UAAI,WACF,QACE,oBAAC,OAAD;OACE,MAAK;OACL,IAAI,4BAA4B,KAAK;OACrC,iBAAe;OACf,iBAAe,YAAY;OAE3B,OAAO;QACL,UAAU;QACV,KAAK;QACL,MAAM;QACN,OAAO;QACP,QAAQ,GAAG,YAAY,KAAK;QAC5B,WAAW,cAAc,YAAY,MAAM;QAC5C;iBAEA,WAAW,MAAM;QAChB;QACA;QACA,eAAe;AACb,aAAI,CAAC,SACH,UAAS,CAAC,YAAY,KAAK;;QAG/B;QACD,CAAC;OACE,EApBC,YAAY,IAoBb;AAIV,aACE,oBAAC,OAAD;OAEE,OAAO;QACL,UAAU;QACV,KAAK;QACL,MAAM;QACN,OAAO;QACP,QAAQ,GAAG,YAAY,KAAK;QAC5B,WAAW,cAAc,YAAY,MAAM;QAC5C;iBAEA;OACG,EAXC,YAAY,IAWb;OAER;KACE,CAAA;IACF,CAAA;GACD,CAAA,CACH"}
|
|
@@ -21,8 +21,20 @@ function MultipleList(params) {
|
|
|
21
21
|
onChange?.(!selected, user);
|
|
22
22
|
};
|
|
23
23
|
return /* @__PURE__ */ jsxs("div", {
|
|
24
|
+
role: "option",
|
|
25
|
+
id: `ald-member-picker-option-${getId(user)}`,
|
|
26
|
+
"aria-selected": selected,
|
|
27
|
+
"aria-disabled": disabled || void 0,
|
|
28
|
+
tabIndex: -1,
|
|
24
29
|
className: cn("ald-member-picker-option", className, { ["ald-member-picker-option-disabled"]: disabled }),
|
|
25
30
|
onClick,
|
|
31
|
+
onKeyDown: (event) => {
|
|
32
|
+
if (disabled) return;
|
|
33
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
34
|
+
event.preventDefault();
|
|
35
|
+
onClick();
|
|
36
|
+
}
|
|
37
|
+
},
|
|
26
38
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
27
39
|
className: "ald-member-picker-label",
|
|
28
40
|
children: [/* @__PURE__ */ jsx(Checkbox, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultipleOption.js","names":[],"sources":["../../../src/MemberPicker/components/MultipleOption.tsx"],"sourcesContent":["import { cn } from '../../lib/utils';\nimport React, { useContext } from 'react';\nimport Badge from '../../Badge';\nimport Checkbox from '../../Checkbox';\nimport ConfigProvider from '../../ConfigProvider';\nimport { EUserType, IUserGroup } from '../../ConfigProvider/getUserList';\nimport TextLink from '../../TextLink/index';\nimport { LocaleContext, getTranslator } from '../../locale/default';\nimport { IUser } from '../interface';\nimport { getAccount, getId, getPhoto } from '../utils';\nimport { isUser, isUserGroup } from '../utils/getUsersWithUserId';\nimport NickLabel from './NickLabel';\n\ninterface IMultipleOptionProps {\n selected: boolean;\n disabled?: boolean;\n user: IUser | IUserGroup;\n onChange?: (selected: boolean, user: IUser | IUserGroup) => void;\n className?: string;\n onNextLevel?: (userGroup: IUserGroup) => void;\n hasNextLevel?: boolean;\n showUserId?: boolean;\n}\nexport default function MultipleList(params: IMultipleOptionProps) {\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n\n const { getMemberPickerItemMoreInfoKey } = ConfigProvider.useGetUserList();\n\n const {\n disabled,\n user,\n selected,\n onChange,\n className,\n onNextLevel,\n hasNextLevel = true,\n showUserId = false,\n } = params;\n\n const onClick = () => {\n if (disabled) return;\n\n onChange?.(!selected, user);\n };\n\n return (\n <div\n className={cn('ald-member-picker-option', className, {\n ['ald-member-picker-option-disabled']: disabled,\n })}\n onClick={onClick}\n >\n <div className={'ald-member-picker-label'}>\n <Checkbox\n className={'ald-member-picker-checkbox'}\n checked={selected}\n disabled={disabled}\n ></Checkbox>\n <div className={'ald-member-picker-option-content'}>\n <NickLabel\n type={user.type}\n id={getId(user)}\n name={user.name as string}\n photo={getPhoto(user)}\n account={getAccount(user)}\n addonBefore={\n showUserId &&\n user.type === EUserType.USER && (\n <span className={'ald-member-picker-option-id'}>\n {getMemberPickerItemMoreInfoKey\n ? getMemberPickerItemMoreInfoKey(user)\n : user.userId}\n </span>\n )\n }\n ></NickLabel>\n {/* 如果是用户的话并且user.ban为true,则展示 已停用 Tag */}\n {isUser(user) && user.ban && (\n <Badge\n status=\"default\"\n count={t.MemberPicker.ban}\n className={'ald-member-picker-ban-badge'}\n ></Badge>\n )}\n </div>\n </div>\n {isUserGroup(user) && hasNextLevel && (\n <TextLink\n className=\"ald-member-picker-btn\"\n size=\"small\"\n disabled={disabled}\n onClick={(e) => {\n onNextLevel?.(user);\n e.stopPropagation();\n e.preventDefault();\n }}\n >\n {t.MemberPicker.subLevel}\n </TextLink>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AAuBA,SAAwB,aAAa,QAA8B;CACjE,MAAM,EAAE,WAAW,WAAW,cAAc;CAC5C,MAAM,IAAI,cAAc,OAAO;CAE/B,MAAM,EAAE,mCAAmC,wBAAe,gBAAgB;CAE1E,MAAM,EACJ,UACA,MACA,UACA,UACA,WACA,aACA,eAAe,MACf,aAAa,UACX;CAEJ,MAAM,gBAAgB;AACpB,MAAI,SAAU;AAEd,aAAW,CAAC,UAAU,KAAK;;AAG7B,QACE,qBAAC,OAAD;EACE,WAAW,GAAG,4BAA4B,WAAW,GAClD,sCAAsC,UACxC,CAAC;EACO;
|
|
1
|
+
{"version":3,"file":"MultipleOption.js","names":[],"sources":["../../../src/MemberPicker/components/MultipleOption.tsx"],"sourcesContent":["import { cn } from '../../lib/utils';\nimport React, { useContext } from 'react';\nimport Badge from '../../Badge';\nimport Checkbox from '../../Checkbox';\nimport ConfigProvider from '../../ConfigProvider';\nimport { EUserType, IUserGroup } from '../../ConfigProvider/getUserList';\nimport TextLink from '../../TextLink/index';\nimport { LocaleContext, getTranslator } from '../../locale/default';\nimport { IUser } from '../interface';\nimport { getAccount, getId, getPhoto } from '../utils';\nimport { isUser, isUserGroup } from '../utils/getUsersWithUserId';\nimport NickLabel from './NickLabel';\n\ninterface IMultipleOptionProps {\n selected: boolean;\n disabled?: boolean;\n user: IUser | IUserGroup;\n onChange?: (selected: boolean, user: IUser | IUserGroup) => void;\n className?: string;\n onNextLevel?: (userGroup: IUserGroup) => void;\n hasNextLevel?: boolean;\n showUserId?: boolean;\n}\nexport default function MultipleList(params: IMultipleOptionProps) {\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n\n const { getMemberPickerItemMoreInfoKey } = ConfigProvider.useGetUserList();\n\n const {\n disabled,\n user,\n selected,\n onChange,\n className,\n onNextLevel,\n hasNextLevel = true,\n showUserId = false,\n } = params;\n\n const onClick = () => {\n if (disabled) return;\n\n onChange?.(!selected, user);\n };\n\n return (\n <div\n role=\"option\"\n id={`ald-member-picker-option-${getId(user)}`}\n aria-selected={selected}\n aria-disabled={disabled || undefined}\n tabIndex={-1}\n className={cn('ald-member-picker-option', className, {\n ['ald-member-picker-option-disabled']: disabled,\n })}\n onClick={onClick}\n onKeyDown={(event) => {\n if (disabled) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onClick();\n }\n }}\n >\n <div className={'ald-member-picker-label'}>\n <Checkbox\n className={'ald-member-picker-checkbox'}\n checked={selected}\n disabled={disabled}\n ></Checkbox>\n <div className={'ald-member-picker-option-content'}>\n <NickLabel\n type={user.type}\n id={getId(user)}\n name={user.name as string}\n photo={getPhoto(user)}\n account={getAccount(user)}\n addonBefore={\n showUserId &&\n user.type === EUserType.USER && (\n <span className={'ald-member-picker-option-id'}>\n {getMemberPickerItemMoreInfoKey\n ? getMemberPickerItemMoreInfoKey(user)\n : user.userId}\n </span>\n )\n }\n ></NickLabel>\n {/* 如果是用户的话并且user.ban为true,则展示 已停用 Tag */}\n {isUser(user) && user.ban && (\n <Badge\n status=\"default\"\n count={t.MemberPicker.ban}\n className={'ald-member-picker-ban-badge'}\n ></Badge>\n )}\n </div>\n </div>\n {isUserGroup(user) && hasNextLevel && (\n <TextLink\n className=\"ald-member-picker-btn\"\n size=\"small\"\n disabled={disabled}\n onClick={(e) => {\n onNextLevel?.(user);\n e.stopPropagation();\n e.preventDefault();\n }}\n >\n {t.MemberPicker.subLevel}\n </TextLink>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AAuBA,SAAwB,aAAa,QAA8B;CACjE,MAAM,EAAE,WAAW,WAAW,cAAc;CAC5C,MAAM,IAAI,cAAc,OAAO;CAE/B,MAAM,EAAE,mCAAmC,wBAAe,gBAAgB;CAE1E,MAAM,EACJ,UACA,MACA,UACA,UACA,WACA,aACA,eAAe,MACf,aAAa,UACX;CAEJ,MAAM,gBAAgB;AACpB,MAAI,SAAU;AAEd,aAAW,CAAC,UAAU,KAAK;;AAG7B,QACE,qBAAC,OAAD;EACE,MAAK;EACL,IAAI,4BAA4B,MAAM,KAAK;EAC3C,iBAAe;EACf,iBAAe,YAAY;EAC3B,UAAU;EACV,WAAW,GAAG,4BAA4B,WAAW,GAClD,sCAAsC,UACxC,CAAC;EACO;EACT,YAAY,UAAU;AACpB,OAAI,SAAU;AACd,OAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC9C,UAAM,gBAAgB;AACtB,aAAS;;;YAdf,CAkBE,qBAAC,OAAD;GAAK,WAAW;aAAhB,CACE,oBAAC,UAAD;IACE,WAAW;IACX,SAAS;IACC;IACA,CAAA,EACZ,qBAAC,OAAD;IAAK,WAAW;cAAhB,CACE,oBAAC,mBAAD;KACE,MAAM,KAAK;KACX,IAAI,MAAM,KAAK;KACf,MAAM,KAAK;KACX,OAAO,SAAS,KAAK;KACrB,SAAS,WAAW,KAAK;KACzB,aACE,cACA,KAAK,SAAS,UAAU,QACtB,oBAAC,QAAD;MAAM,WAAW;gBACd,iCACG,+BAA+B,KAAK,GACpC,KAAK;MACJ,CAAA;KAGA,CAAA,EAEZ,OAAO,KAAK,IAAI,KAAK,OACpB,oBAAC,OAAD;KACE,QAAO;KACP,OAAO,EAAE,aAAa;KACtB,WAAW;KACJ,CAAA,CAEP;MACF;MACL,YAAY,KAAK,IAAI,gBACpB,oBAAC,UAAD;GACE,WAAU;GACV,MAAK;GACK;GACV,UAAU,MAAM;AACd,kBAAc,KAAK;AACnB,MAAE,iBAAiB;AACnB,MAAE,gBAAgB;;aAGnB,EAAE,aAAa;GACP,CAAA,CAET"}
|
|
@@ -23,6 +23,7 @@ interface IPanelProps {
|
|
|
23
23
|
}) => ReactNode;
|
|
24
24
|
renderSelectedTag?: (user: IUser | IUserGroup, originNode: ReactNode) => ReactNode;
|
|
25
25
|
filterItem?: (item: IUser | IUserGroup) => boolean;
|
|
26
|
+
searchValue?: string;
|
|
26
27
|
}
|
|
27
28
|
export declare const userDisplayNameIsRepeated: (userList: TUser, displayName?: string) => boolean;
|
|
28
29
|
export default function Panel(props: IPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -14,7 +14,7 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
|
14
14
|
function Panel(props) {
|
|
15
15
|
const { locale } = useContext(LocaleContext);
|
|
16
16
|
const t = getTranslator(locale);
|
|
17
|
-
const { type, multiple, dropdownWidth, value, onChange, dataList, onSearchValueChange, className, lockedIds, footer, onCancel, renderItem, renderSelectedTag, filterItem } = props;
|
|
17
|
+
const { type, multiple, dropdownWidth, value, onChange, dataList, onSearchValueChange, className, lockedIds, footer, onCancel, renderItem, renderSelectedTag, filterItem, searchValue = "" } = props;
|
|
18
18
|
const [selectedUsers, setSelected] = useState([]);
|
|
19
19
|
const onSelectionChange = useCallback((selected, user) => {
|
|
20
20
|
if (multiple) if (selected) setSelected([...selectedUsers, user]);
|
|
@@ -52,6 +52,7 @@ function Panel(props) {
|
|
|
52
52
|
selectedUsers: selectedUsers.filter(isUser),
|
|
53
53
|
onChange: onSelectionChange,
|
|
54
54
|
onSearchValueChange,
|
|
55
|
+
searchValue,
|
|
55
56
|
multiple: true,
|
|
56
57
|
lockedIds,
|
|
57
58
|
loading: props.loading,
|
|
@@ -65,6 +66,7 @@ function Panel(props) {
|
|
|
65
66
|
selectedUsersGroup: selectedUsers.filter(isUserGroup),
|
|
66
67
|
onChange: onSelectionChange,
|
|
67
68
|
onSearchValueChange,
|
|
69
|
+
searchValue,
|
|
68
70
|
multiple: true,
|
|
69
71
|
lockedIds,
|
|
70
72
|
loading: props.loading,
|
|
@@ -93,6 +95,7 @@ function Panel(props) {
|
|
|
93
95
|
selectedUsers,
|
|
94
96
|
onSelectionChange,
|
|
95
97
|
onSearchValueChange,
|
|
98
|
+
searchValue,
|
|
96
99
|
lockedIds,
|
|
97
100
|
props.loading,
|
|
98
101
|
type,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Panel.js","names":[],"sources":["../../../src/MemberPicker/components/Panel.tsx"],"sourcesContent":["import { cn } from '../../lib/utils';\n\nimport React, {\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport {\n EUserType,\n IUserGroup,\n TUser,\n TUserGroupValue,\n TUserValue,\n} from '../../ConfigProvider/getUserList';\nimport Tabs from '../../Tabs';\nimport { LocaleContext, getTranslator } from '../../locale/default';\nimport { EMemberPicker, IUser } from '../interface';\nimport { getId } from '../utils';\nimport { isUser, isUserGroup } from '../utils/getUsersWithUserId';\nimport MemberSelection from './MemberSelection';\nimport SelectedMemberTags from './SelectedMemberTags';\nimport SelectorFooter from './SelectorFooter';\nimport UserGroupSelection from './UserGroupSelection';\n\ninterface IPanelProps {\n type: EMemberPicker;\n multiple?: boolean;\n onChange?: (value: TUser) => void;\n dropdownWidth?: number;\n value?: TUser | (IUser | IUserGroup);\n dataList: TUser;\n onSearchValueChange?: (value: string) => void;\n onCancel?: () => void;\n loading: boolean;\n className?: string;\n lockedIds: Array<TUserValue | TUserGroupValue>;\n footer?: ReactNode;\n renderItem?: (\n item: IUser | IUserGroup,\n context: {\n isSelected: boolean;\n disabled: boolean;\n onClick: () => void;\n onNextLevel?: () => void;\n originNode: ReactNode;\n },\n ) => ReactNode;\n renderSelectedTag?: (\n user: IUser | IUserGroup,\n originNode: ReactNode,\n ) => ReactNode;\n filterItem?: (item: IUser | IUserGroup) => boolean;\n}\n\nexport const userDisplayNameIsRepeated = (\n userList: TUser,\n displayName?: string,\n) => {\n return (\n userList.filter(\n (user) => user.type === EUserType.USER && user.nickname === displayName,\n ).length > 1\n );\n};\n\nexport default function Panel(props: IPanelProps) {\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n\n const {\n type,\n multiple,\n dropdownWidth,\n value,\n onChange,\n dataList,\n onSearchValueChange,\n className,\n lockedIds,\n footer,\n onCancel,\n renderItem,\n renderSelectedTag,\n filterItem,\n } = props;\n\n const [selectedUsers, setSelected] = useState<TUser>([]);\n\n const onSelectionChange = useCallback(\n (selected: boolean, user: IUser | IUserGroup) => {\n if (multiple) {\n if (selected) {\n setSelected([...selectedUsers, user]);\n } else {\n setSelected(\n selectedUsers.filter((item) => getId(item) !== getId(user)),\n );\n }\n } else {\n if (selected) {\n setSelected([user]);\n onChange?.([user]);\n } else {\n setSelected([]);\n onChange?.([]);\n }\n }\n },\n [multiple, selectedUsers, onChange],\n );\n\n const onRemove = useCallback(\n (user: IUser | IUserGroup) => {\n setSelected(selectedUsers.filter((item) => getId(item) !== getId(user)));\n },\n [selectedUsers],\n );\n\n const panelwidth = useMemo(() => {\n if (dropdownWidth) {\n return dropdownWidth;\n } else if (multiple) {\n return 480;\n } else {\n return 160;\n }\n }, [dropdownWidth, multiple]);\n\n useEffect(() => {\n if (value) {\n if (Array.isArray(value)) {\n setSelected(value);\n } else {\n setSelected([value]);\n }\n }\n }, [setSelected, value]);\n\n const renderDropdown = useCallback(() => {\n const userSelection = (\n <MemberSelection\n className={'ald-member-picker-member-selection-multiple'}\n userList={dataList.filter(isUser)}\n filterItem={filterItem}\n width={(panelwidth - 6) / 2}\n selectedUsers={selectedUsers.filter(isUser)}\n onChange={onSelectionChange}\n onSearchValueChange={onSearchValueChange}\n multiple={true}\n lockedIds={lockedIds}\n loading={props.loading}\n renderItem={renderItem}\n ></MemberSelection>\n );\n const userGroupSelection = (\n <UserGroupSelection\n className={'ald-member-picker-member-selection-multiple'}\n userGroupList={dataList.filter(isUserGroup)}\n filterItem={filterItem}\n width={(panelwidth - 6) / 2}\n selectedUsersGroup={selectedUsers.filter(isUserGroup)}\n onChange={onSelectionChange}\n onSearchValueChange={onSearchValueChange}\n multiple={true}\n lockedIds={lockedIds}\n loading={props.loading}\n renderItem={renderItem}\n ></UserGroupSelection>\n );\n if (type === EMemberPicker.USER) {\n return userSelection;\n }\n if (type === EMemberPicker.GROUP) {\n return userGroupSelection;\n }\n if (type === EMemberPicker.BOTH) {\n return (\n <Tabs\n centered\n destroyInactiveTabPane\n items={[\n {\n key: 'user',\n label: t.MemberPicker.users,\n children: userSelection,\n },\n {\n key: 'userGroup',\n label: t.MemberPicker.userGroups,\n children: userGroupSelection,\n },\n ]}\n className=\"ald-member-tabs\"\n ></Tabs>\n );\n }\n }, [\n t,\n dataList,\n panelwidth,\n selectedUsers,\n onSelectionChange,\n onSearchValueChange,\n lockedIds,\n props.loading,\n type,\n renderItem,\n filterItem,\n ]);\n\n // 单选 + 调用方未传 dropdownWidth 时让 wrapper 跟随父级(popupMatchSelectWidth=true 的浮窗 = 触发器宽度),\n // 否则按具体数字(多选 480 / 调用方自定义)固定宽度。\n const wrapperWidth: number | string =\n dropdownWidth ?? (multiple ? panelwidth : '100%');\n\n return (\n <div\n className={cn(className, 'ald-member-picker-wrapper', {\n ['ald-member-picker-multiple']: multiple,\n ['ald-member-picker-single']: !multiple,\n })}\n style={{ width: wrapperWidth }}\n >\n {multiple ? (\n <>\n <div className=\"ald-member-picker-inner\">\n <div className=\"ald-member-picker-member-selection-wrapper\">\n {renderDropdown()}\n </div>\n <SelectedMemberTags\n className={'ald-member-picker-selected-member-tags'}\n selectedUsers={selectedUsers}\n width={(panelwidth - 3) / 2}\n onRemove={onRemove}\n lockedIds={lockedIds}\n userList={dataList}\n renderSelectedTag={renderSelectedTag}\n ></SelectedMemberTags>\n </div>\n <SelectorFooter\n className={'ald-member-picker-selector-footer'}\n onCancel={onCancel}\n onOk={() => {\n onChange?.(selectedUsers);\n }}\n footer={footer}\n ></SelectorFooter>\n </>\n ) : (\n <>\n {type === EMemberPicker.USER && (\n <MemberSelection\n className={'ald-member-picker-member-selection-single'}\n userList={dataList.filter(isUser)}\n width={panelwidth - 2}\n onChange={onSelectionChange}\n selectedUsers={selectedUsers.filter(isUser)}\n onSearchValueChange={onSearchValueChange}\n multiple={false && multiple}\n lockedIds={lockedIds}\n loading={props.loading}\n renderItem={renderItem}\n ></MemberSelection>\n )}\n {type === EMemberPicker.GROUP && (\n <UserGroupSelection\n className={'ald-member-picker-member-selection-multiple'}\n userGroupList={dataList.filter(isUserGroup)}\n width={(panelwidth - 3) / 2}\n selectedUsersGroup={selectedUsers.filter(isUserGroup)}\n onChange={onSelectionChange}\n onSearchValueChange={onSearchValueChange}\n multiple={false}\n lockedIds={lockedIds}\n loading={props.loading}\n renderItem={renderItem}\n ></UserGroupSelection>\n )}\n </>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Panel.js","names":[],"sources":["../../../src/MemberPicker/components/Panel.tsx"],"sourcesContent":["import { cn } from '../../lib/utils';\n\nimport React, {\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport {\n EUserType,\n IUserGroup,\n TUser,\n TUserGroupValue,\n TUserValue,\n} from '../../ConfigProvider/getUserList';\nimport Tabs from '../../Tabs';\nimport { LocaleContext, getTranslator } from '../../locale/default';\nimport { EMemberPicker, IUser } from '../interface';\nimport { getId } from '../utils';\nimport { isUser, isUserGroup } from '../utils/getUsersWithUserId';\nimport MemberSelection from './MemberSelection';\nimport SelectedMemberTags from './SelectedMemberTags';\nimport SelectorFooter from './SelectorFooter';\nimport UserGroupSelection from './UserGroupSelection';\n\ninterface IPanelProps {\n type: EMemberPicker;\n multiple?: boolean;\n onChange?: (value: TUser) => void;\n dropdownWidth?: number;\n value?: TUser | (IUser | IUserGroup);\n dataList: TUser;\n onSearchValueChange?: (value: string) => void;\n onCancel?: () => void;\n loading: boolean;\n className?: string;\n lockedIds: Array<TUserValue | TUserGroupValue>;\n footer?: ReactNode;\n renderItem?: (\n item: IUser | IUserGroup,\n context: {\n isSelected: boolean;\n disabled: boolean;\n onClick: () => void;\n onNextLevel?: () => void;\n originNode: ReactNode;\n },\n ) => ReactNode;\n renderSelectedTag?: (\n user: IUser | IUserGroup,\n originNode: ReactNode,\n ) => ReactNode;\n filterItem?: (item: IUser | IUserGroup) => boolean;\n searchValue?: string;\n}\n\nexport const userDisplayNameIsRepeated = (\n userList: TUser,\n displayName?: string,\n) => {\n return (\n userList.filter(\n (user) => user.type === EUserType.USER && user.nickname === displayName,\n ).length > 1\n );\n};\n\nexport default function Panel(props: IPanelProps) {\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n\n const {\n type,\n multiple,\n dropdownWidth,\n value,\n onChange,\n dataList,\n onSearchValueChange,\n className,\n lockedIds,\n footer,\n onCancel,\n renderItem,\n renderSelectedTag,\n filterItem,\n searchValue = '',\n } = props;\n\n const [selectedUsers, setSelected] = useState<TUser>([]);\n\n const onSelectionChange = useCallback(\n (selected: boolean, user: IUser | IUserGroup) => {\n if (multiple) {\n if (selected) {\n setSelected([...selectedUsers, user]);\n } else {\n setSelected(\n selectedUsers.filter((item) => getId(item) !== getId(user)),\n );\n }\n } else {\n if (selected) {\n setSelected([user]);\n onChange?.([user]);\n } else {\n setSelected([]);\n onChange?.([]);\n }\n }\n },\n [multiple, selectedUsers, onChange],\n );\n\n const onRemove = useCallback(\n (user: IUser | IUserGroup) => {\n setSelected(selectedUsers.filter((item) => getId(item) !== getId(user)));\n },\n [selectedUsers],\n );\n\n const panelwidth = useMemo(() => {\n if (dropdownWidth) {\n return dropdownWidth;\n } else if (multiple) {\n return 480;\n } else {\n return 160;\n }\n }, [dropdownWidth, multiple]);\n\n useEffect(() => {\n if (value) {\n if (Array.isArray(value)) {\n setSelected(value);\n } else {\n setSelected([value]);\n }\n }\n }, [setSelected, value]);\n\n const renderDropdown = useCallback(() => {\n const userSelection = (\n <MemberSelection\n className={'ald-member-picker-member-selection-multiple'}\n userList={dataList.filter(isUser)}\n filterItem={filterItem}\n width={(panelwidth - 6) / 2}\n selectedUsers={selectedUsers.filter(isUser)}\n onChange={onSelectionChange}\n onSearchValueChange={onSearchValueChange}\n searchValue={searchValue}\n multiple={true}\n lockedIds={lockedIds}\n loading={props.loading}\n renderItem={renderItem}\n ></MemberSelection>\n );\n const userGroupSelection = (\n <UserGroupSelection\n className={'ald-member-picker-member-selection-multiple'}\n userGroupList={dataList.filter(isUserGroup)}\n filterItem={filterItem}\n width={(panelwidth - 6) / 2}\n selectedUsersGroup={selectedUsers.filter(isUserGroup)}\n onChange={onSelectionChange}\n onSearchValueChange={onSearchValueChange}\n searchValue={searchValue}\n multiple={true}\n lockedIds={lockedIds}\n loading={props.loading}\n renderItem={renderItem}\n ></UserGroupSelection>\n );\n if (type === EMemberPicker.USER) {\n return userSelection;\n }\n if (type === EMemberPicker.GROUP) {\n return userGroupSelection;\n }\n if (type === EMemberPicker.BOTH) {\n return (\n <Tabs\n centered\n destroyInactiveTabPane\n items={[\n {\n key: 'user',\n label: t.MemberPicker.users,\n children: userSelection,\n },\n {\n key: 'userGroup',\n label: t.MemberPicker.userGroups,\n children: userGroupSelection,\n },\n ]}\n className=\"ald-member-tabs\"\n ></Tabs>\n );\n }\n }, [\n t,\n dataList,\n panelwidth,\n selectedUsers,\n onSelectionChange,\n onSearchValueChange,\n searchValue,\n lockedIds,\n props.loading,\n type,\n renderItem,\n filterItem,\n ]);\n\n // 单选 + 调用方未传 dropdownWidth 时让 wrapper 跟随父级(popupMatchSelectWidth=true 的浮窗 = 触发器宽度),\n // 否则按具体数字(多选 480 / 调用方自定义)固定宽度。\n const wrapperWidth: number | string =\n dropdownWidth ?? (multiple ? panelwidth : '100%');\n\n return (\n <div\n className={cn(className, 'ald-member-picker-wrapper', {\n ['ald-member-picker-multiple']: multiple,\n ['ald-member-picker-single']: !multiple,\n })}\n style={{ width: wrapperWidth }}\n >\n {multiple ? (\n <>\n <div className=\"ald-member-picker-inner\">\n <div className=\"ald-member-picker-member-selection-wrapper\">\n {renderDropdown()}\n </div>\n <SelectedMemberTags\n className={'ald-member-picker-selected-member-tags'}\n selectedUsers={selectedUsers}\n width={(panelwidth - 3) / 2}\n onRemove={onRemove}\n lockedIds={lockedIds}\n userList={dataList}\n renderSelectedTag={renderSelectedTag}\n ></SelectedMemberTags>\n </div>\n <SelectorFooter\n className={'ald-member-picker-selector-footer'}\n onCancel={onCancel}\n onOk={() => {\n onChange?.(selectedUsers);\n }}\n footer={footer}\n ></SelectorFooter>\n </>\n ) : (\n <>\n {type === EMemberPicker.USER && (\n <MemberSelection\n className={'ald-member-picker-member-selection-single'}\n userList={dataList.filter(isUser)}\n width={panelwidth - 2}\n onChange={onSelectionChange}\n selectedUsers={selectedUsers.filter(isUser)}\n onSearchValueChange={onSearchValueChange}\n multiple={false && multiple}\n lockedIds={lockedIds}\n loading={props.loading}\n renderItem={renderItem}\n ></MemberSelection>\n )}\n {type === EMemberPicker.GROUP && (\n <UserGroupSelection\n className={'ald-member-picker-member-selection-multiple'}\n userGroupList={dataList.filter(isUserGroup)}\n width={(panelwidth - 3) / 2}\n selectedUsersGroup={selectedUsers.filter(isUserGroup)}\n onChange={onSelectionChange}\n onSearchValueChange={onSearchValueChange}\n multiple={false}\n lockedIds={lockedIds}\n loading={props.loading}\n renderItem={renderItem}\n ></UserGroupSelection>\n )}\n </>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -58,13 +58,21 @@ function SelectedMemberTags(props) {
|
|
|
58
58
|
count: t.MemberPicker.ban,
|
|
59
59
|
className: "ald-member-picker-ban-badge"
|
|
60
60
|
}),
|
|
61
|
-
!hasLocked && /* @__PURE__ */ jsx(
|
|
62
|
-
|
|
61
|
+
!hasLocked && /* @__PURE__ */ jsx("button", {
|
|
62
|
+
type: "button",
|
|
63
|
+
"aria-label": `Remove ${user.name}`,
|
|
63
64
|
className: "ald-member-picker-close",
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
65
|
+
style: {
|
|
66
|
+
border: 0,
|
|
67
|
+
background: "transparent",
|
|
68
|
+
padding: 0
|
|
69
|
+
},
|
|
70
|
+
onClick: () => props.onRemove?.(user),
|
|
71
|
+
children: /* @__PURE__ */ jsx(Memo, {
|
|
72
|
+
size: 20,
|
|
73
|
+
color: "var(--content-tertiary)",
|
|
74
|
+
"aria-hidden": "true"
|
|
75
|
+
})
|
|
68
76
|
})
|
|
69
77
|
]
|
|
70
78
|
}, getId(user));
|