From efd0d39587dee1ca2ce9aec9b3460a9336e66d9f Mon Sep 17 00:00:00 2001 From: Michael Shanks Date: Fri, 7 Aug 2020 12:01:16 +0100 Subject: [PATCH] new components get unique name --- .../src/builderStore/getNewComponentName.js | 34 +++++++++++++++++++ .../builder/src/builderStore/store/index.js | 4 +-- .../ComponentDropdownMenu.svelte | 10 +++--- 3 files changed, 41 insertions(+), 7 deletions(-) create mode 100644 packages/builder/src/builderStore/getNewComponentName.js diff --git a/packages/builder/src/builderStore/getNewComponentName.js b/packages/builder/src/builderStore/getNewComponentName.js new file mode 100644 index 0000000000..3991decf67 --- /dev/null +++ b/packages/builder/src/builderStore/getNewComponentName.js @@ -0,0 +1,34 @@ +import { walkProps } from "./storeUtils" +import { get_capitalised_name } from "../helpers" + +export default function(component, state) { + const screen = + state.currentFrontEndType === "screen" ? state.currentPreviewItem : null + const page = state.pages[state.currentPageName] + const capitalised = get_capitalised_name(component) + + const matchingComponents = [] + + if (screen) + walkProps(screen.props, c => { + if ((c._instanceName || "").startsWith(capitalised)) { + matchingComponents.push(c._instanceName) + } + }) + + walkProps(page.props, c => { + if ((c._instanceName || "").startsWith(capitalised)) { + matchingComponents.push(c._instanceName) + } + }) + + let index = 0 + let name + while (!name) { + const tryName = `${capitalised} ${index}` + if (!matchingComponents.includes(tryName)) name = tryName + index++ + } + + return name +} diff --git a/packages/builder/src/builderStore/store/index.js b/packages/builder/src/builderStore/store/index.js index c6ab194379..a5dfb85bf8 100644 --- a/packages/builder/src/builderStore/store/index.js +++ b/packages/builder/src/builderStore/store/index.js @@ -1,5 +1,5 @@ import { values } from "lodash/fp" -import { get_capitalised_name } from "../../helpers" +import getNewComponentName from "../getNewComponentName" import { backendUiStore } from "builderStore" import * as backendStoreActions from "./backend" import { writable, get } from "svelte/store" @@ -281,7 +281,7 @@ const addChildComponent = store => (componentToAdd, presetName) => { const presetProps = presetName ? component.presets[presetName] : {} const instanceId = get(backendUiStore).selectedDatabase._id - const instanceName = get_capitalised_name(componentToAdd) + const instanceName = getNewComponentName(componentToAdd, state) const newComponent = createProps( component, diff --git a/packages/builder/src/components/userInterface/ComponentDropdownMenu.svelte b/packages/builder/src/components/userInterface/ComponentDropdownMenu.svelte index 28dd59c16f..8fb9fc0dd3 100644 --- a/packages/builder/src/components/userInterface/ComponentDropdownMenu.svelte +++ b/packages/builder/src/components/userInterface/ComponentDropdownMenu.svelte @@ -2,6 +2,7 @@ import { MoreIcon } from "components/common/Icons" import { store } from "builderStore" import { getComponentDefinition } from "builderStore/store" + import getNewComponentName from "builderStore/getNewComponentName" import ConfirmDialog from "components/common/ConfirmDialog.svelte" import { last, cloneDeep } from "lodash/fp" import UIkit from "uikit" @@ -80,9 +81,7 @@ store.update(s => { const parent = getParent(s.currentPreviewItem.props, component) const copiedComponent = cloneDeep(component) - walkProps(copiedComponent, p => { - p._id = uuid() - }) + generateNewIdsForComponent(copiedComponent, s) parent._children = [...parent._children, copiedComponent] saveCurrentPreviewItem(s) s.currentComponentInfo = copiedComponent @@ -105,9 +104,10 @@ }) } - const generateNewIdsForComponent = c => + const generateNewIdsForComponent = (c, state) => walkProps(c, p => { p._id = uuid() + p._instanceName = getNewComponentName(p._component, state) }) const storeComponentForCopy = (cut = false) => { @@ -129,7 +129,7 @@ if (!s.componentToPaste) return s const componentToPaste = cloneDeep(s.componentToPaste) - generateNewIdsForComponent(componentToPaste) + generateNewIdsForComponent(componentToPaste, s) delete componentToPaste._cutId if (mode === "inside") {