diff --git a/packages/react-moveable/src/MoveableIndividualGroup.tsx b/packages/react-moveable/src/MoveableIndividualGroup.tsx index f6096e5e2..fd81cc8da 100644 --- a/packages/react-moveable/src/MoveableIndividualGroup.tsx +++ b/packages/react-moveable/src/MoveableIndividualGroup.tsx @@ -1,14 +1,14 @@ import { ref, refs } from "framework-utils"; import * as React from "react"; import MoveableManager from "./MoveableManager"; -import { GroupableProps, RectInfo } from "./types"; +import { GroupableProps, IndividualGroupableProps, RectInfo } from "./types"; import { prefix } from "./utils"; /** * @namespace Moveable.IndividualGroup * @description Create targets individually, not as a group.Create targets individually, not as a group. */ -class MoveableIndividualGroup extends MoveableManager { +class MoveableIndividualGroup extends MoveableManager { public moveables: MoveableManager[] = []; public render() { const props = this.props; @@ -22,6 +22,7 @@ class MoveableIndividualGroup extends MoveableManager { const length = targets.length; const canPersist = this.isUnmounted || !length; let persistDatChildren = persistData?.children ?? []; + if (canPersist && !length && persistDatChildren.length) { targets = persistDatChildren.map(() => null); } else if (!canPersist) { @@ -33,10 +34,12 @@ class MoveableIndividualGroup extends MoveableManager { ref={ref(this, "controlBox")} className={prefix("control-box")}> {targets!.map((target, i) => { + const individualProps = props.individualGroupableProps?.(target, i) ?? {}; return Record | undefined | null | void; } export interface IndividualGroupableProps extends IndividualGroupableOptions { diff --git a/packages/react-moveable/stories/3-IndiviualGroup/0-Default.stories.tsx b/packages/react-moveable/stories/3-IndiviualGroup/0-Default.stories.tsx index d5aca849e..49ff5d5fd 100644 --- a/packages/react-moveable/stories/3-IndiviualGroup/0-Default.stories.tsx +++ b/packages/react-moveable/stories/3-IndiviualGroup/0-Default.stories.tsx @@ -1,7 +1,25 @@ +import { + DEFAULT_ROTATABLE_CONTROLS, + DEFAULT_DRAGGABLE_CONTROLS, + DEFAULT_SCALABLE_CONTROLS, +} from "../controls/default"; +import { makeStoryGroup } from "../utils/story"; -export default { - title: "Individual Group", -}; +const group = makeStoryGroup("Individual Group", module); -export * from "./1-DraggableScalableRotatable.stories"; + +group.add("Draggable & Scalable & Rotatable", { + app: require("./ReactDraggableScalableRotatableApp").default, + path: require.resolve("./ReactDraggableScalableRotatableApp"), + argsTypes: { + ...DEFAULT_SCALABLE_CONTROLS, + ...DEFAULT_ROTATABLE_CONTROLS, + ...DEFAULT_DRAGGABLE_CONTROLS, + }, +}); + +group.add("Use Individual Groupable Props", { + app: require("./ReactIndividualGroupablePropsApp").default, + path: require.resolve("./ReactIndividualGroupablePropsApp"), +}); diff --git a/packages/react-moveable/stories/3-IndiviualGroup/1-DraggableScalableRotatable.stories.tsx b/packages/react-moveable/stories/3-IndiviualGroup/1-DraggableScalableRotatable.stories.tsx deleted file mode 100644 index 1ce59fd44..000000000 --- a/packages/react-moveable/stories/3-IndiviualGroup/1-DraggableScalableRotatable.stories.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { DEFAULT_REACT_CODESANDBOX } from "storybook-addon-preview"; -import "../common.css"; -import "../templates/default.css"; -import { convertPath, convertReactTemplate, makeArgs } from "../utils"; -import App from "./apps/ReactDraggableScalableRotatableApp"; -import RawApp from "!!raw-loader!./apps/ReactDraggableScalableRotatableApp"; -import { - DEFAULT_DRAGGABLE_CONTROLS, - DEFAULT_SCALABLE_CONTROLS, - DEFAULT_ROTATABLE_CONTROLS, -} from "../controls/default"; -import { DEFAULT_CSS_TEMPLATE } from "../templates/default"; - - -export const DraggableScalableTemplate = App as any; - -DraggableScalableTemplate.storyName = "Draggable & Scalable & Rotatable"; -DraggableScalableTemplate.argTypes = { - ...DEFAULT_SCALABLE_CONTROLS, - ...DEFAULT_ROTATABLE_CONTROLS, - ...DEFAULT_DRAGGABLE_CONTROLS, -}; -DraggableScalableTemplate.args = { - ...makeArgs(DraggableScalableTemplate.argTypes), -}; - -DraggableScalableTemplate.parameters = { - preview: [ - { - tab: "React", - template: convertReactTemplate(convertPath(RawApp)), - codesandbox: DEFAULT_REACT_CODESANDBOX(["react-moveable"]), - language: "tsx", - }, - { - tab: "CSS", - template: DEFAULT_CSS_TEMPLATE, - language: "css", - }, - ], -}; diff --git a/packages/react-moveable/stories/3-IndiviualGroup/apps/ReactDraggableScalableRotatableApp.tsx b/packages/react-moveable/stories/3-IndiviualGroup/ReactDraggableScalableRotatableApp.tsx similarity index 100% rename from packages/react-moveable/stories/3-IndiviualGroup/apps/ReactDraggableScalableRotatableApp.tsx rename to packages/react-moveable/stories/3-IndiviualGroup/ReactDraggableScalableRotatableApp.tsx diff --git a/packages/react-moveable/stories/3-IndiviualGroup/ReactIndividualGroupablePropsApp.tsx b/packages/react-moveable/stories/3-IndiviualGroup/ReactIndividualGroupablePropsApp.tsx new file mode 100644 index 000000000..209df7775 --- /dev/null +++ b/packages/react-moveable/stories/3-IndiviualGroup/ReactIndividualGroupablePropsApp.tsx @@ -0,0 +1,31 @@ +import * as React from "react"; +import Moveable from "@/react-moveable"; + +export default function App() { + return ( +
+
+
Target1
+
Target2
+
Target3
+ { + if (element!.classList.contains("target2")) { + return { + resizable: false, + }; + } + }} + onRender={e => { + e.target.style.cssText += e.cssText; + }} + /> +
+
+ ); +}