diff --git a/packages/builder/src/builderStore/store/frontend.js b/packages/builder/src/builderStore/store/frontend.js index 3932b04ce2..47a6b90ab3 100644 --- a/packages/builder/src/builderStore/store/frontend.js +++ b/packages/builder/src/builderStore/store/frontend.js @@ -13,7 +13,7 @@ import { } from "builderStore" import { fetchComponentLibDefinitions } from "../loadComponentLibraries" import api from "../api" -import { DEFAULT_LAYOUTS, FrontendTypes } from "../../constants" +import { FrontendTypes } from "../../constants" import getNewComponentName from "../getNewComponentName" import analytics from "analytics" import { @@ -27,7 +27,7 @@ const INITIAL_FRONTEND_STATE = { apps: [], name: "", description: "", - layouts: DEFAULT_LAYOUTS, + layouts: [], screens: [], mainUi: {}, unauthenticatedUi: {}, @@ -198,16 +198,17 @@ export const getFrontendStore = () => { preview: { saveSelected: async () => { const state = get(store) + const selectedAsset = get(currentAsset) if (state.currentFrontEndType !== FrontendTypes.LAYOUT) { - await store.actions.screens.save(currentAsset) + await store.actions.screens.save(selectedAsset) } - await store.actions.layouts.save(currentAsset) + await store.actions.layouts.save(selectedAsset) }, }, layouts: { - select: async layoutName => { + select: async layoutId => { store.update(state => { - const layout = store.actions.layouts.find(layoutName) + const layout = store.actions.layouts.find(layoutId) state.currentFrontEndType = FrontendTypes.LAYOUT state.currentView = "detail" @@ -236,9 +237,10 @@ export const getFrontendStore = () => { await Promise.all(cssPromises) }, save: async layout => { - const response = await api.post(`/api/layouts`, { - ...layout, - }) + const layoutToSave = cloneDeep(layout) + delete layoutToSave._css + + const response = await api.post(`/api/layouts`, layoutToSave) const json = await response.json() @@ -246,7 +248,7 @@ export const getFrontendStore = () => { store.update(state => { const layoutToUpdate = state.layouts.find( - stateLayouts => stateLayouts._id === layout._id + stateLayout => stateLayout._id === layout._id ) if (layoutToUpdate) { layoutToUpdate._rev = json.rev @@ -254,17 +256,12 @@ export const getFrontendStore = () => { return state }) }, - find: layoutName => { - if (!layoutName) { + find: layoutId => { + if (!layoutId) { return get(mainLayout) } const storeContents = get(store) - // TODO: only use ID - return storeContents.layouts.find( - layout => - layout.name.toLowerCase() === layoutName.toLowerCase() || - layout._id === layoutName - ) + return storeContents.layouts.find(layout => layout._id === layoutId) }, }, components: { diff --git a/packages/builder/src/components/backend/TableNavigator/modals/CreateTableModal.svelte b/packages/builder/src/components/backend/TableNavigator/modals/CreateTableModal.svelte index 75b27f71d3..7c26e236a6 100644 --- a/packages/builder/src/components/backend/TableNavigator/modals/CreateTableModal.svelte +++ b/packages/builder/src/components/backend/TableNavigator/modals/CreateTableModal.svelte @@ -51,7 +51,6 @@ const screens = screenTemplates($store, [table]) .filter(template => defaultScreens.includes(template.id)) .map(template => template.create()) - store.actions.layouts.select("main") for (let screen of screens) { // Record the table that created this screen so we can link it later screen.autoTableId = table._id diff --git a/packages/builder/src/components/userInterface/AppPreview/iframeTemplate.html b/packages/builder/src/components/userInterface/AppPreview/iframeTemplate.html index 4478011a73..247f2f4284 100644 --- a/packages/builder/src/components/userInterface/AppPreview/iframeTemplate.html +++ b/packages/builder/src/components/userInterface/AppPreview/iframeTemplate.html @@ -21,21 +21,11 @@ // Extract data from message const { selectedComponentId, layout, screen } = JSON.parse(event.data) - - // Update selected component style - if (selectedComponentStyle) { - document.head.removeChild(selectedComponentStyle) - } - selectedComponentStyle = document.createElement("style"); - document.head.appendChild(selectedComponentStyle) - var selectedCss = '[data-bb-id="' + selectedComponentId + '"]' + '{border:2px solid #0055ff !important;}' - selectedComponentStyle.appendChild(document.createTextNode(selectedCss)) // Set some flags so the app knows we're in the builder - window["##BUDIBASE_IN_BUILDER##"] = true; - window["##BUDIBASE_PREVIEW_LAYOUT##"] = layout; - window["##BUDIBASE_PREVIEW_SCREEN##"] = screen; window["##BUDIBASE_IN_BUILDER##"] = true + window["##BUDIBASE_PREVIEW_LAYOUT##"] = layout + window["##BUDIBASE_PREVIEW_SCREEN##"] = screen window["##BUDIBASE_SELECTED_COMPONENT_ID##"] = selectedComponentId window["##BUDIBASE_PREVIEW_ID##"] = Math.random() diff --git a/packages/builder/src/components/userInterface/ComponentDropdownMenu.svelte b/packages/builder/src/components/userInterface/ComponentDropdownMenu.svelte index a6b8a63cbb..615b3d0852 100644 --- a/packages/builder/src/components/userInterface/ComponentDropdownMenu.svelte +++ b/packages/builder/src/components/userInterface/ComponentDropdownMenu.svelte @@ -28,7 +28,7 @@ const selectComponent = component => { store.actions.components.select(component) const path = store.actions.components.findRoute(component) - $goto(`./:screen/${path}`) + // $goto(`./:screen/${path}`) } const moveUpComponent = () => { diff --git a/packages/builder/src/components/userInterface/ComponentNavigationTree/ComponentTree.svelte b/packages/builder/src/components/userInterface/ComponentNavigationTree/ComponentTree.svelte index d36cdacc11..d858394d80 100644 --- a/packages/builder/src/components/userInterface/ComponentNavigationTree/ComponentTree.svelte +++ b/packages/builder/src/components/userInterface/ComponentNavigationTree/ComponentTree.svelte @@ -6,12 +6,12 @@ import ComponentDropdownMenu from "../ComponentDropdownMenu.svelte" import NavItem from "components/common/NavItem.svelte" + export let layout export let components = [] export let currentComponent export let onSelect = () => {} export let level = 0 - - export let dragDropStore + export let dragDropStore const isScreenslot = name => name === "##builtin/screenslot" @@ -23,7 +23,11 @@ const path = store.actions.components.findRoute(component) // Go to correct URL - $goto(`./screens/:screen/${path}`) + if (layout) { + $goto(`./layouts/${path}`) + } else { + $goto(`./screens/${path}`) + } } const dragstart = component => e => { @@ -79,6 +83,7 @@ {#if component._children} + import { store, currentAsset } from "builderStore" + import { Select } from "@budibase/bbui" + + export let layout + + +
+ +
diff --git a/packages/builder/src/components/userInterface/ComponentNavigationTree/PathTree.svelte b/packages/builder/src/components/userInterface/ComponentNavigationTree/PathTree.svelte index 4426007281..8f5872b317 100644 --- a/packages/builder/src/components/userInterface/ComponentNavigationTree/PathTree.svelte +++ b/packages/builder/src/components/userInterface/ComponentNavigationTree/PathTree.svelte @@ -4,11 +4,11 @@ import { store } from "builderStore" import instantiateStore from "./dragDropStore" - import ComponentsTree from "./ComponentTree.svelte" + import ComponentTree from "./ComponentTree.svelte" import NavItem from "components/common/NavItem.svelte" import ScreenDropdownMenu from "./ScreenDropdownMenu.svelte" - const dragDropStore = instantiateStore() + const dragDropStore = instantiateStore(); export let route export let path @@ -39,13 +39,14 @@ text={url === '/' ? 'Home' : url} withArrow={route.subpaths} on:click={() => changeScreen(screenId)}> - + {#if selectedScreen?._id === screenId} - + {dragDropStore} + /> {/if} {/each} {/each} diff --git a/packages/builder/src/components/userInterface/ComponentNavigationTree/ScreenDropdownMenu.svelte b/packages/builder/src/components/userInterface/ComponentNavigationTree/ScreenDropdownMenu.svelte index f716b94351..d27bc2bdcd 100644 --- a/packages/builder/src/components/userInterface/ComponentNavigationTree/ScreenDropdownMenu.svelte +++ b/packages/builder/src/components/userInterface/ComponentNavigationTree/ScreenDropdownMenu.svelte @@ -3,20 +3,31 @@ import { store, allScreens } from "builderStore" import { notifier } from "builderStore/store/notifications" import ConfirmDialog from "components/common/ConfirmDialog.svelte" - import { DropdownMenu } from "@budibase/bbui" + import EditScreenLayoutModal from "./EditScreenLayoutModal.svelte" + import { DropdownMenu, Modal, ModalContent } from "@budibase/bbui" import { DropdownContainer, DropdownItem } from "components/common/Dropdowns" - export let screen + export let screenId let confirmDeleteDialog + let editLayoutDialog let dropdown let anchor + $: screen = $allScreens.find(screen => screen._id === screenId) + const deleteScreen = () => { - const screenToDelete = $allScreens.find(scr => scr._id === screen) - store.actions.screens.delete(screenToDelete) + store.actions.screens.delete(screen) store.actions.routing.fetch() } + + async function saveScreen() { + try { + await store.actions.screens.save(screen) + } catch (err) { + notifier.danger("Error saving page.") + } + }
@@ -29,6 +40,10 @@ icon="ri-delete-bin-line" title="Delete" on:click={() => confirmDeleteDialog.show()} /> + editLayoutDialog.show()} />
@@ -39,6 +54,12 @@ okText="Delete Screen" onOk={deleteScreen} /> + + + + + +