diff --git a/packages/builder/package.json b/packages/builder/package.json index c327a4e908..a298d823c7 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -81,8 +81,8 @@ "shortid": "^2.2.15", "svelte-loading-spinners": "^0.1.1", "svelte-portal": "^0.1.0", - "yup": "^0.29.2", - "uuid": "^8.3.1" + "uuid": "^8.3.1", + "yup": "^0.29.2" }, "devDependencies": { "@babel/core": "^7.5.5", @@ -107,6 +107,7 @@ "rollup-plugin-alias": "^1.5.2", "rollup-plugin-copy": "^3.0.0", "rollup-plugin-css-only": "^2.1.0", + "rollup-plugin-html": "^0.2.1", "rollup-plugin-livereload": "^1.0.0", "rollup-plugin-node-builtins": "^2.1.2", "rollup-plugin-node-globals": "^1.4.0", diff --git a/packages/builder/rollup.config.js b/packages/builder/rollup.config.js index 4afb8084bd..ca63dcef74 100644 --- a/packages/builder/rollup.config.js +++ b/packages/builder/rollup.config.js @@ -11,6 +11,7 @@ import copy from "rollup-plugin-copy" import css from "rollup-plugin-css-only" import replace from "rollup-plugin-replace" import json from "@rollup/plugin-json" +import html from "rollup-plugin-html" import path from "path" @@ -147,5 +148,6 @@ export default { // instead of npm run dev), minify production && terser(), json(), + html(), ], } diff --git a/packages/builder/src/builderStore/index.js b/packages/builder/src/builderStore/index.js index b29792fa94..41536d6205 100644 --- a/packages/builder/src/builderStore/index.js +++ b/packages/builder/src/builderStore/index.js @@ -11,11 +11,15 @@ export const automationStore = getAutomationStore() export const themeStore = getThemeStore() export const currentAsset = derived(store, $store => { - const layout = $store.layouts ? $store.layouts.find(layout => layout._id === $store.currentAssetId) : null + const layout = $store.layouts + ? $store.layouts.find(layout => layout._id === $store.currentAssetId) + : null if (layout) { return layout } - const screen = $store.screens ? $store.screens.find(screen => screen._id === $store.currentAssetId) : null + const screen = $store.screens + ? $store.screens.find(screen => screen._id === $store.currentAssetId) + : null if (screen) { return screen } @@ -32,7 +36,9 @@ export const allScreens = derived(store, $store => { }) export const mainLayout = derived(store, $store => { - return $store.layouts?.find(layout => layout.props?._id === "private-master-layout") + return $store.layouts?.find( + layout => layout.props?._id === "private-master-layout" + ) }) export const initialise = async () => { diff --git a/packages/builder/src/builderStore/store/frontend.js b/packages/builder/src/builderStore/store/frontend.js index 37337cb98c..3932b04ce2 100644 --- a/packages/builder/src/builderStore/store/frontend.js +++ b/packages/builder/src/builderStore/store/frontend.js @@ -5,10 +5,15 @@ import { getBuiltin, makePropsSafe, } from "components/userInterface/assetParsing/createProps" -import { allScreens, backendUiStore, currentAsset, mainLayout } from "builderStore" +import { + allScreens, + backendUiStore, + currentAsset, + mainLayout, +} from "builderStore" import { fetchComponentLibDefinitions } from "../loadComponentLibraries" import api from "../api" -import { DEFAULT_LAYOUTS } from "../../constants" +import { DEFAULT_LAYOUTS, FrontendTypes } from "../../constants" import getNewComponentName from "../getNewComponentName" import analytics from "analytics" import { @@ -44,7 +49,8 @@ export const getFrontendStore = () => { store.actions = { initialise: async pkg => { - const layouts = pkg.layouts, screens = pkg.screens, application = pkg.application + const { layouts, screens, application } = pkg + store.update(state => { state.appId = application._id return state @@ -97,7 +103,7 @@ export const getFrontendStore = () => { store.update(state => { const screen = get(allScreens).find(screen => screen._id === screenId) state.currentPreviewItem = screen - state.currentFrontEndType = "screen" + state.currentFrontEndType = FrontendTypes.SCREEN state.currentAssetId = screenId state.currentView = "detail" @@ -117,10 +123,12 @@ export const getFrontendStore = () => { store.update(state => { state.currentPreviewItem = screen state.currentComponentInfo = screen.props - state.currentFrontEndType = "screen" + state.currentFrontEndType = FrontendTypes.SCREEN if (state.currentPreviewItem) { - promises.push(store.actions.screens.regenerateCss(state.currentPreviewItem)) + promises.push( + store.actions.screens.regenerateCss(state.currentPreviewItem) + ) } promises.push(store.actions.screens.save(screen)) @@ -137,7 +145,9 @@ export const getFrontendStore = () => { screen._id = json.id store.update(state => { - const foundScreen = state.screens.findIndex(el => el._id === screen._id) + const foundScreen = state.screens.findIndex( + el => el._id === screen._id + ) if (foundScreen !== -1) { state.screens.splice(foundScreen, 1) } @@ -171,10 +181,14 @@ export const getFrontendStore = () => { const screenDeletePromises = [] store.update(state => { for (let screenToDelete of screensToDelete) { - state.screens = state.screens.filter(screen => screen._id !== screenToDelete._id) - screenDeletePromises.push(api.delete( - `/api/screens/${screenToDelete._id}/${screenToDelete._rev}` - )) + state.screens = state.screens.filter( + screen => screen._id !== screenToDelete._id + ) + screenDeletePromises.push( + api.delete( + `/api/screens/${screenToDelete._id}/${screenToDelete._rev}` + ) + ) } return state }) @@ -184,7 +198,7 @@ export const getFrontendStore = () => { preview: { saveSelected: async () => { const state = get(store) - if (state.currentFrontEndType !== "layout") { + if (state.currentFrontEndType !== FrontendTypes.LAYOUT) { await store.actions.screens.save(currentAsset) } await store.actions.layouts.save(currentAsset) @@ -195,7 +209,7 @@ export const getFrontendStore = () => { store.update(state => { const layout = store.actions.layouts.find(layoutName) - state.currentFrontEndType = "layout" + state.currentFrontEndType = FrontendTypes.LAYOUT state.currentView = "detail" state.currentAssetId = layout._id @@ -209,7 +223,7 @@ export const getFrontendStore = () => { ) state.currentComponentInfo = safeProps layout.props = safeProps - state.currentPreviewItem = store.actions.layouts.find(layoutName) + state.currentPreviewItem = layout return state }) @@ -231,7 +245,9 @@ export const getFrontendStore = () => { if (!json.ok) throw new Error("Error updating layout") store.update(state => { - const layoutToUpdate = state.layouts.find(stateLayouts => stateLayouts._id === layout._id) + const layoutToUpdate = state.layouts.find( + stateLayouts => stateLayouts._id === layout._id + ) if (layoutToUpdate) { layoutToUpdate._rev = json.rev } @@ -243,7 +259,12 @@ export const getFrontendStore = () => { return get(mainLayout) } const storeContents = get(store) - return storeContents.layouts.find(layout => layout.name.toLowerCase() === layoutName.toLowerCase()) + // TODO: only use ID + return storeContents.layouts.find( + layout => + layout.name.toLowerCase() === layoutName.toLowerCase() || + layout._id === layoutName + ) }, }, components: { diff --git a/packages/builder/src/builderStore/store/screenTemplates/utils/Component.js b/packages/builder/src/builderStore/store/screenTemplates/utils/Component.js index 0a40c62dc7..84de7e15ea 100644 --- a/packages/builder/src/builderStore/store/screenTemplates/utils/Component.js +++ b/packages/builder/src/builderStore/store/screenTemplates/utils/Component.js @@ -15,8 +15,6 @@ export class Component extends BaseStructure { selected: {}, }, _code: "", - className: "", - onLoad: [], type: "", _instanceName: "", _children: [], diff --git a/packages/builder/src/builderStore/storeUtils.js b/packages/builder/src/builderStore/storeUtils.js index 7833477ff5..4fd2a0b224 100644 --- a/packages/builder/src/builderStore/storeUtils.js +++ b/packages/builder/src/builderStore/storeUtils.js @@ -4,12 +4,13 @@ import getNewComponentName from "./getNewComponentName" export const getParent = (rootProps, child) => { let parent - walkProps(rootProps, (p, breakWalk) => { + walkProps(rootProps, (props, breakWalk) => { if ( - p._children && - (p._children.includes(child) || p._children.some(c => c._id === child)) + props._children && + (props._children.includes(child) || + props._children.some(c => c._id === child)) ) { - parent = p + parent = props breakWalk() } }) diff --git a/packages/builder/src/components/userInterface/AppPreview/CurrentItemPreview.svelte b/packages/builder/src/components/userInterface/AppPreview/CurrentItemPreview.svelte index 7cc936550f..33cf9fd7f3 100644 --- a/packages/builder/src/components/userInterface/AppPreview/CurrentItemPreview.svelte +++ b/packages/builder/src/components/userInterface/AppPreview/CurrentItemPreview.svelte @@ -28,21 +28,36 @@ selectedComponentId, } + // Saving pages and screens to the DB causes them to have _revs. + // These revisions change every time a save happens and causes + // these reactive statements to fire, even though the actual + // definition hasn't changed. + // By deleting all _rev properties we can avoid this and increase + // performance. + $: json = JSON.stringify(previewData) + $: strippedJson = json.replaceAll(/"_rev":\s*"[^"]+"/g, `"_rev":""`) + // Update the iframe with the builder info to render the correct preview - const refreshContent = () => { + const refreshContent = message => { if (iframe) { - iframe.contentWindow.postMessage(JSON.stringify(previewData)) + iframe.contentWindow.postMessage(message) } } // Refresh the preview when required - $: refreshContent(previewData) + $: refreshContent(strippedJson) // Initialise the app when mounted onMount(() => { - iframe.contentWindow.addEventListener("bb-ready", refreshContent, { - once: true, - }) + iframe.contentWindow.addEventListener( + "bb-ready", + () => { + refreshContent(strippedJson) + }, + { + once: true, + } + ) }) diff --git a/packages/builder/src/components/userInterface/AppPreview/iframeTemplate.html b/packages/builder/src/components/userInterface/AppPreview/iframeTemplate.html new file mode 100644 index 0000000000..4478011a73 --- /dev/null +++ b/packages/builder/src/components/userInterface/AppPreview/iframeTemplate.html @@ -0,0 +1,65 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/packages/builder/src/components/userInterface/AppPreview/iframeTemplate.js b/packages/builder/src/components/userInterface/AppPreview/iframeTemplate.js index 36e56bac3f..a544a5f9d3 100644 --- a/packages/builder/src/components/userInterface/AppPreview/iframeTemplate.js +++ b/packages/builder/src/components/userInterface/AppPreview/iframeTemplate.js @@ -1,62 +1 @@ -export default ` - - - - - - - - - -` +export { default } from "./iframeTemplate.html" diff --git a/packages/builder/src/components/userInterface/ComponentNavigationTree/ComponentTree.svelte b/packages/builder/src/components/userInterface/ComponentNavigationTree/ComponentTree.svelte index 5293f83d6f..d36cdacc11 100644 --- a/packages/builder/src/components/userInterface/ComponentNavigationTree/ComponentTree.svelte +++ b/packages/builder/src/components/userInterface/ComponentNavigationTree/ComponentTree.svelte @@ -23,7 +23,7 @@ const path = store.actions.components.findRoute(component) // Go to correct URL - $goto(`./:screen/${path}`) + $goto(`./screens/:screen/${path}`) } const dragstart = component => e => { diff --git a/packages/builder/src/components/userInterface/ComponentNavigationTree/PathTree.svelte b/packages/builder/src/components/userInterface/ComponentNavigationTree/PathTree.svelte index 23358839e4..4426007281 100644 --- a/packages/builder/src/components/userInterface/ComponentNavigationTree/PathTree.svelte +++ b/packages/builder/src/components/userInterface/ComponentNavigationTree/PathTree.svelte @@ -19,7 +19,7 @@ const changeScreen = screenId => { // select the route store.actions.screens.select(screenId) - $goto(`./${screenId}`) + $goto(`./screens/${screenId}`) } diff --git a/packages/builder/src/components/userInterface/ComponentNavigationTree/index.svelte b/packages/builder/src/components/userInterface/ComponentNavigationTree/index.svelte index dbdfad0828..2fb9ae67fa 100644 --- a/packages/builder/src/components/userInterface/ComponentNavigationTree/index.svelte +++ b/packages/builder/src/components/userInterface/ComponentNavigationTree/index.svelte @@ -2,10 +2,12 @@ import { goto } from "@sveltech/routify" import { store } from "builderStore" import PathTree from "./PathTree.svelte" + + $: console.log("routes", $store.routes)
- {#each Object.keys($store.routes) as path} + {#each Object.keys($store.routes || {}) as path} {/each}
diff --git a/packages/builder/src/components/userInterface/EventsEditor/EventsEditor.svelte b/packages/builder/src/components/userInterface/EventsEditor/EventsEditor.svelte deleted file mode 100644 index 4df9a0d62e..0000000000 --- a/packages/builder/src/components/userInterface/EventsEditor/EventsEditor.svelte +++ /dev/null @@ -1,127 +0,0 @@ - - - - -
-
- {#each events as event, index} - {#if event.handlers.length > 0} -
openModal({ ...event, index })}> - {event.name} - EDIT -
- {/if} - {/each} -
-
- - - - - - diff --git a/packages/builder/src/components/userInterface/EventsEditor/StateBindingCascader.svelte b/packages/builder/src/components/userInterface/EventsEditor/StateBindingCascader.svelte deleted file mode 100644 index 3475a14eed..0000000000 --- a/packages/builder/src/components/userInterface/EventsEditor/StateBindingCascader.svelte +++ /dev/null @@ -1,53 +0,0 @@ - - -
- {#if parameter.name === 'automation'}{parameter.name}{/if} - {#if parameter.name === 'automation'} - - {:else if parameter.name === 'url'} - - - {/each} - - {:else} - - {/if} -
- - diff --git a/packages/builder/src/components/userInterface/FrontendNavigatePane.svelte b/packages/builder/src/components/userInterface/FrontendNavigatePane.svelte index 193baef16c..6fd5bb8bb6 100644 --- a/packages/builder/src/components/userInterface/FrontendNavigatePane.svelte +++ b/packages/builder/src/components/userInterface/FrontendNavigatePane.svelte @@ -1,16 +1,28 @@
-

Screens

- -
- + + {#if tab === 'SCREENS'} + + + {#if $currentAsset} + + {/if} + + + + {:else if tab === 'LAYOUTS'} + + {/if} -{#if $store.currentFrontEndType === "layout" && $currentAsset} - - - - -{/if} + + + + + + + + + +