Browse Source

Improve urlStateSync utility, improve routing structure, improve component tree

pull/6409/head
Andrew Kingston 4 years ago
parent
commit
f50ba7ab4f
  1. 2
      packages/builder/package.json
  2. 147
      packages/builder/src/helpers/urlStateSync.js
  3. 5
      packages/builder/src/pages/builder/app/[application]/_fallback.svelte
  4. 5
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPanel.svelte
  5. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPreview.svelte
  6. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/DevicePreviewSelect.svelte
  7. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/iframeTemplate.js
  8. 5
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/_fallback.svelte
  9. 24
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/_layout.svelte
  10. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/navigation/ComponentDropdownMenu.svelte
  11. 5
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/navigation/ComponentNavigationPanel.svelte
  12. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/navigation/ComponentTree.svelte
  13. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/navigation/ScreenslotDropdownMenu.svelte
  14. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/navigation/dragDropStore.js
  15. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/ComponentSettingsPanel.svelte
  16. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/ComponentSettingsSection.svelte
  17. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/ConditionalUIDrawer.svelte
  18. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/ConditionalUISection.svelte
  19. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/CustomStylesSection.svelte
  20. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/DesignSection.svelte
  21. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/StyleSection.svelte
  22. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/componentStyles.js
  23. 21
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_layout.svelte
  24. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/index.svelte
  25. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/index.svelte
  26. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/new/_components/NewComponentPanel.svelte
  27. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/new/_components/NewComponentTargetPanel.svelte
  28. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/new/_components/componentStructure.json
  29. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/new/index.svelte
  30. 5
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/index.svelte
  31. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/layouts/index.svelte
  32. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/navigation/_components/NavigationDrawer.svelte
  33. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/navigation/_components/NavigationEditor.svelte
  34. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/navigation/index.svelte
  35. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/screens/_components/DatasourceModal.svelte
  36. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/screens/_components/NewScreenModal.svelte
  37. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/screens/_components/ScreenDetailsModal.svelte
  38. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/screens/_components/ScreenDropdownMenu.svelte
  39. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/screens/_components/ScreenNavigationPanel.svelte
  40. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/screens/_components/ScreenSettingsPanel.svelte
  41. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/screens/_components/ScreenWizard.svelte
  42. 7
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/screens/index.svelte
  43. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/theme/_components/AppThemeSelect.svelte
  44. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/theme/_components/ThemeEditor.svelte
  45. 0
      packages/builder/src/pages/builder/app/[application]/design/[screenId]/theme/index.svelte
  46. 27
      packages/builder/src/pages/builder/app/[application]/design/components/[screenId]/_layout.svelte
  47. 21
      packages/builder/src/pages/builder/app/[application]/design/components/index.svelte
  48. 18
      packages/builder/src/pages/builder/app/[application]/design/index.svelte
  49. 29
      packages/builder/src/pages/builder/app/[application]/design/screens/[screenId].svelte
  50. 21
      packages/builder/src/pages/builder/app/[application]/design/screens/index.svelte
  51. 2
      packages/builder/src/pages/builder/app/[application]/index.svelte
  52. 8
      packages/builder/yarn.lock

2
packages/builder/package.json

@ -90,7 +90,7 @@
"@babel/preset-env": "^7.13.12",
"@babel/runtime": "^7.13.10",
"@rollup/plugin-replace": "^2.4.2",
"@roxi/routify": "2.18.0",
"@roxi/routify": "2.18.5",
"@sveltejs/vite-plugin-svelte": "1.0.0-next.19",
"@testing-library/jest-dom": "^5.11.10",
"@testing-library/svelte": "^3.0.0",

147
packages/builder/src/helpers/urlStateSync.js

@ -2,13 +2,26 @@ import { get } from "svelte/store"
import { isChangingPage } from "@roxi/routify"
export const syncURLToState = options => {
const { keys, params, store, goto, redirect, baseUrl = "." } = options || {}
const {
urlParam,
stateKey,
validate,
baseUrl = "..",
fallbackUrl,
store,
routify,
} = options || {}
if (
!keys?.length ||
!params?.subscribe ||
!urlParam ||
!stateKey ||
!baseUrl ||
!urlParam ||
!store?.subscribe ||
!goto?.subscribe ||
!redirect?.subscribe
!routify ||
!routify.params?.subscribe ||
!routify.goto?.subscribe ||
!routify.redirect?.subscribe ||
!routify.page?.subscribe
) {
console.warn("syncURLToState invoked with missing parameters")
return
@ -18,96 +31,70 @@ export const syncURLToState = options => {
// to just subscribe and cache the latest versions.
// We can grab their initial values as this is during component
// initialisation.
let cachedParams = get(params)
let cachedGoto = get(goto)
let cachedRedirect = get(redirect)
let hydrated = false
let cachedParams = get(routify.params)
let cachedGoto = get(routify.goto)
let cachedRedirect = get(routify.redirect)
let cachedPage = get(routify.page)
let previousParamsHash = null
let debug = false
const log = (...params) => debug && console.log(...params)
// Navigate to a certain URL
const gotoUrl = url => {
if (get(isChangingPage) && hydrated) {
return
}
log("Navigating to", url)
cachedGoto(url)
const gotoUrl = (url, params) => {
log("Navigating to", url, "with params", params)
cachedGoto(url, params)
}
// Redirect to a certain URL
const redirectUrl = url => {
if (get(isChangingPage) && hydrated) {
return
}
log("Redirecting to", url)
cachedRedirect(url)
}
// Updates state with new URL params
const mapUrlToState = params => {
// Determine any required state updates
let stateUpdates = []
const state = get(store)
for (let key of keys) {
const urlValue = params?.[key.url]
const stateValue = state?.[key.state]
if (urlValue && urlValue !== stateValue) {
log(
`state.${key.state} (${stateValue}) <= url.${key.url} (${urlValue})`
)
stateUpdates.push(state => {
state[key.state] = urlValue
})
if (key.validate && key.fallbackUrl) {
if (!key.validate(urlValue)) {
log("Invalid URL param!")
redirectUrl(key.fallbackUrl)
hydrated = true
return
}
}
}
}
// Mark our initial hydration as completed
hydrated = true
// Avoid updating the store at all if not necessary to prevent a wasted
// store invalidation
if (!stateUpdates.length) {
// Check if we have new URL params
const paramsHash = JSON.stringify(params)
const newParams = paramsHash !== previousParamsHash
previousParamsHash = paramsHash
const urlValue = params?.[urlParam]
const stateValue = get(store)?.[stateKey]
if (!newParams || !urlValue) {
return
}
// Apply the required state updates
log("Performing", stateUpdates.length, "state updates")
store.update(state => {
for (let update of stateUpdates) {
update(state)
// Check if new value is valid
if (validate && fallbackUrl) {
if (!validate(urlValue)) {
log("Invalid URL param!")
redirectUrl(fallbackUrl)
return
}
return state
})
}
// Only update state if we have a new value
if (urlValue !== stateValue) {
log(`state.${stateKey} (${stateValue}) <= url.${urlParam} (${urlValue})`)
store.update(state => {
state[stateKey] = urlValue
return state
})
}
}
// Updates the URL with new state values
const mapStateToUrl = state => {
// Determine new URL while checking for changes
let url = baseUrl
let needsUpdate = false
for (let key of keys) {
const urlValue = cachedParams?.[key.url]
const stateValue = state?.[key.state]
url += `/${stateValue}`
if (stateValue !== urlValue) {
needsUpdate = true
log(
`url.${key.url} (${urlValue}) <= state.${key.state} (${stateValue})`
)
if (key.validate && key.fallbackUrl) {
if (!key.validate(stateValue)) {
log("Invalid state param!")
redirectUrl(key.fallbackUrl)
return
}
const urlValue = cachedParams?.[urlParam]
const stateValue = state?.[stateKey]
if (stateValue !== urlValue) {
needsUpdate = true
log(`url.${urlParam} (${urlValue}) <= state.${stateKey} (${stateValue})`)
if (validate && fallbackUrl) {
if (!validate(stateValue)) {
log("Invalid state param!")
redirectUrl(fallbackUrl)
return
}
}
}
@ -120,7 +107,11 @@ export const syncURLToState = options => {
// Navigate to the new URL
if (!get(isChangingPage)) {
gotoUrl(url)
const newUrlParams = {
...cachedParams,
[urlParam]: stateValue,
}
gotoUrl(cachedPage.path, newUrlParams)
}
}
@ -128,18 +119,21 @@ export const syncURLToState = options => {
mapUrlToState(cachedParams)
// Subscribe to URL changes and cache them
const unsubscribeParams = params.subscribe($urlParams => {
const unsubscribeParams = routify.params.subscribe($urlParams => {
cachedParams = $urlParams
mapUrlToState($urlParams)
})
// Subscribe to routify store changes and cache them
const unsubscribeGoto = goto.subscribe($goto => {
const unsubscribeGoto = routify.goto.subscribe($goto => {
cachedGoto = $goto
})
const unsubscribeRedirect = redirect.subscribe($redirect => {
const unsubscribeRedirect = routify.redirect.subscribe($redirect => {
cachedRedirect = $redirect
})
const unsubscribePage = routify.page.subscribe($page => {
cachedPage = $page
})
// Subscribe to store changes and keep URL up to date
const unsubscribeStore = store.subscribe(mapStateToUrl)
@ -149,6 +143,7 @@ export const syncURLToState = options => {
unsubscribeParams()
unsubscribeGoto()
unsubscribeRedirect()
unsubscribePage()
unsubscribeStore()
}
}

5
packages/builder/src/pages/builder/app/[application]/_fallback.svelte

@ -0,0 +1,5 @@
<script>
import { goto } from "@roxi/routify"
$goto("../design")
</script>

5
packages/builder/src/pages/builder/app/[application]/design/_components/AppPanel.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPanel.svelte

@ -11,9 +11,6 @@
$: roleColor = getRoleColor(roleId)
$: roleName = $roles.find(x => x._id === roleId)?.name || "Unknown"
// Needs to be absolute as we embed this component from multiple different URLs
$: newComponentUrl = `/builder/app/${$store.appId}/design/components/${$selectedScreen?._id}/new`
const getRoleColor = roleId => {
return RoleColours[roleId] || "#ffa500"
}
@ -42,7 +39,7 @@
<Button
cta
icon="Add"
on:click={() => $goto(`./components/${$selectedScreen._id}/new`)}
on:click={() => $goto(`../${$selectedScreen._id}/components/new`)}
>
Component
</Button>

0
packages/builder/src/pages/builder/app/[application]/design/_components/AppPreview.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPreview.svelte

0
packages/builder/src/pages/builder/app/[application]/design/_components/DevicePreviewSelect.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/DevicePreviewSelect.svelte

0
packages/builder/src/pages/builder/app/[application]/design/_components/iframeTemplate.js → packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/iframeTemplate.js

5
packages/builder/src/pages/builder/app/[application]/design/[screenId]/_fallback.svelte

@ -0,0 +1,5 @@
<script>
import { redirect } from "@roxi/routify"
$redirect("../screens")
</script>

24
packages/builder/src/pages/builder/app/[application]/design/_layout.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/_layout.svelte

@ -1,7 +1,23 @@
<script>
import { IconSideNav, IconSideNavItem } from "@budibase/bbui"
import { goto, isActive } from "@roxi/routify"
import * as routify from "@roxi/routify"
import AppPanel from "./_components/AppPanel.svelte"
import { syncURLToState } from "helpers/urlStateSync"
import { store, selectedScreen } from "builderStore"
import { onDestroy } from "svelte"
const { isActive, goto } = routify
// Keep URL and state in sync for selected screen ID
const stopSyncing = syncURLToState({
urlParam: "screenId",
stateKey: "selectedScreenId",
validate: id => $store.screens.some(screen => screen._id === id),
fallbackUrl: "../../",
store,
routify,
})
onDestroy(stopSyncing)
</script>
<div class="design">
@ -41,8 +57,10 @@
</div>
<div class="content">
<slot />
<AppPanel />
{#if $selectedScreen}
<slot />
<AppPanel />
{/if}
</div>
</div>

0
packages/builder/src/pages/builder/app/[application]/design/components/[screenId]/[componentId]/_components/navigation/ComponentDropdownMenu.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/navigation/ComponentDropdownMenu.svelte

5
packages/builder/src/pages/builder/app/[application]/design/components/[screenId]/[componentId]/_components/navigation/ComponentNavigationPanel.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/navigation/ComponentNavigationPanel.svelte

@ -22,7 +22,7 @@
let newOffsets = {}
// Calculate left offset
const offsetX = bounds.left + bounds.width + scrollLeft - 40
const offsetX = bounds.left + bounds.width + scrollLeft - 58
if (offsetX > sidebarWidth) {
newOffsets.left = offsetX - sidebarWidth
} else {
@ -91,8 +91,7 @@
<style>
.nav-items-container {
margin: 0 calc(-1 * var(--spacing-l));
padding: var(--spacing-xl) var(--spacing-l);
padding: var(--spacing-xl) 0;
flex: 1 1 auto;
overflow: auto;
height: 0;

0
packages/builder/src/pages/builder/app/[application]/design/components/[screenId]/[componentId]/_components/navigation/ComponentTree.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/navigation/ComponentTree.svelte

0
packages/builder/src/pages/builder/app/[application]/design/components/[screenId]/[componentId]/_components/navigation/ScreenslotDropdownMenu.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/navigation/ScreenslotDropdownMenu.svelte

0
packages/builder/src/pages/builder/app/[application]/design/components/[screenId]/[componentId]/_components/navigation/dragDropStore.js → packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/navigation/dragDropStore.js

0
packages/builder/src/pages/builder/app/[application]/design/components/[screenId]/[componentId]/_components/settings/ComponentSettingsPanel.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/ComponentSettingsPanel.svelte

0
packages/builder/src/pages/builder/app/[application]/design/components/[screenId]/[componentId]/_components/settings/ComponentSettingsSection.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/ComponentSettingsSection.svelte

0
packages/builder/src/pages/builder/app/[application]/design/components/[screenId]/[componentId]/_components/settings/ConditionalUIDrawer.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/ConditionalUIDrawer.svelte

0
packages/builder/src/pages/builder/app/[application]/design/components/[screenId]/[componentId]/_components/settings/ConditionalUISection.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/ConditionalUISection.svelte

0
packages/builder/src/pages/builder/app/[application]/design/components/[screenId]/[componentId]/_components/settings/CustomStylesSection.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/CustomStylesSection.svelte

0
packages/builder/src/pages/builder/app/[application]/design/components/[screenId]/[componentId]/_components/settings/DesignSection.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/DesignSection.svelte

0
packages/builder/src/pages/builder/app/[application]/design/components/[screenId]/[componentId]/_components/settings/StyleSection.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/StyleSection.svelte

0
packages/builder/src/pages/builder/app/[application]/design/components/[screenId]/[componentId]/_components/settings/componentStyles.js → packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_components/settings/componentStyles.js

21
packages/builder/src/pages/builder/app/[application]/design/components/[screenId]/[componentId]/_layout.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/_layout.svelte

@ -1,27 +1,18 @@
<script>
import { syncURLToState } from "helpers/urlStateSync"
import { store, selectedScreen } from "builderStore"
import { goto, params, redirect } from "@roxi/routify"
import * as routify from "@roxi/routify"
import { onDestroy } from "svelte"
import { findComponent } from "builderStore/componentUtils"
// Keep URL and state in sync for selected component ID
const stopSyncing = syncURLToState({
keys: [
{
url: "componentId",
state: "selectedComponentId",
validate: componentId => {
return !!findComponent($selectedScreen.props, componentId)
},
fallbackUrl: "../",
},
],
urlParam: "componentId",
stateKey: "selectedComponentId",
validate: id => !!findComponent($selectedScreen.props, id),
fallbackUrl: "../",
store,
params,
goto,
redirect,
baseUrl: "..",
routify,
})
onDestroy(stopSyncing)

0
packages/builder/src/pages/builder/app/[application]/design/components/[screenId]/[componentId]/index.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/[componentId]/index.svelte

0
packages/builder/src/pages/builder/app/[application]/design/components/[screenId]/index.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/index.svelte

0
packages/builder/src/pages/builder/app/[application]/design/components/[screenId]/new/_components/NewComponentPanel.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/new/_components/NewComponentPanel.svelte

0
packages/builder/src/pages/builder/app/[application]/design/components/[screenId]/new/_components/NewComponentTargetPanel.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/new/_components/NewComponentTargetPanel.svelte

0
packages/builder/src/pages/builder/app/[application]/design/components/[screenId]/new/_components/componentStructure.json → packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/new/_components/componentStructure.json

0
packages/builder/src/pages/builder/app/[application]/design/components/[screenId]/new/index.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/components/new/index.svelte

5
packages/builder/src/pages/builder/app/[application]/design/[screenId]/index.svelte

@ -0,0 +1,5 @@
<script>
import { redirect } from "@roxi/routify"
$redirect("./screens")
</script>

0
packages/builder/src/pages/builder/app/[application]/design/layouts/index.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/layouts/index.svelte

0
packages/builder/src/pages/builder/app/[application]/design/navigation/_components/NavigationDrawer.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/navigation/_components/NavigationDrawer.svelte

0
packages/builder/src/pages/builder/app/[application]/design/navigation/_components/NavigationEditor.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/navigation/_components/NavigationEditor.svelte

0
packages/builder/src/pages/builder/app/[application]/design/navigation/index.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/navigation/index.svelte

0
packages/builder/src/pages/builder/app/[application]/design/screens/_components/DatasourceModal.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/screens/_components/DatasourceModal.svelte

0
packages/builder/src/pages/builder/app/[application]/design/screens/_components/NewScreenModal.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/screens/_components/NewScreenModal.svelte

0
packages/builder/src/pages/builder/app/[application]/design/screens/_components/ScreenDetailsModal.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/screens/_components/ScreenDetailsModal.svelte

0
packages/builder/src/pages/builder/app/[application]/design/screens/_components/ScreenDropdownMenu.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/screens/_components/ScreenDropdownMenu.svelte

0
packages/builder/src/pages/builder/app/[application]/design/screens/_components/ScreenNavigationPanel.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/screens/_components/ScreenNavigationPanel.svelte

0
packages/builder/src/pages/builder/app/[application]/design/screens/_components/ScreenSettingsPanel.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/screens/_components/ScreenSettingsPanel.svelte

0
packages/builder/src/pages/builder/app/[application]/design/screens/_components/ScreenWizard.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/screens/_components/ScreenWizard.svelte

7
packages/builder/src/pages/builder/app/[application]/design/[screenId]/screens/index.svelte

@ -0,0 +1,7 @@
<script>
import ScreenNavigationPanel from "./_components/ScreenNavigationPanel.svelte"
import ScreenSettingsPanel from "./_components/ScreenSettingsPanel.svelte"
</script>
<ScreenNavigationPanel />
<ScreenSettingsPanel />

0
packages/builder/src/pages/builder/app/[application]/design/theme/_components/AppThemeSelect.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/theme/_components/AppThemeSelect.svelte

0
packages/builder/src/pages/builder/app/[application]/design/theme/_components/ThemeEditor.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/theme/_components/ThemeEditor.svelte

0
packages/builder/src/pages/builder/app/[application]/design/theme/index.svelte → packages/builder/src/pages/builder/app/[application]/design/[screenId]/theme/index.svelte

27
packages/builder/src/pages/builder/app/[application]/design/components/[screenId]/_layout.svelte

@ -1,27 +0,0 @@
<script>
import { store } from "builderStore"
import { onDestroy } from "svelte"
import { syncURLToState } from "helpers/urlStateSync"
import { goto, params, redirect } from "@roxi/routify"
// Keep URL and state in sync for selected screen ID
const stopSyncing = syncURLToState({
keys: [
{
url: "screenId",
state: "selectedScreenId",
validate: screenId => $store.screens.some(x => x._id === screenId),
fallbackUrl: "../",
},
],
store,
params,
goto,
redirect,
baseUrl: "..",
})
onDestroy(stopSyncing)
</script>
<slot />

21
packages/builder/src/pages/builder/app/[application]/design/components/index.svelte

@ -1,21 +0,0 @@
<script>
import { store, selectedScreen } from "builderStore"
import { onMount } from "svelte"
import { redirect } from "@roxi/routify"
let loaded = false
onMount(() => {
if ($selectedScreen) {
$redirect(`./${$selectedScreen._id}`)
} else if ($store.screens?.length) {
$redirect(`./${$store.screens[0]._id}`)
} else {
loaded = true
}
})
</script>
{#if loaded}
You need to create a screen!
{/if}

18
packages/builder/src/pages/builder/app/[application]/design/index.svelte

@ -1,5 +1,21 @@
<script>
import { store, selectedScreen } from "builderStore"
import { onMount } from "svelte"
import { redirect } from "@roxi/routify"
$redirect(`./screens`)
let loaded = false
onMount(() => {
if ($selectedScreen) {
$redirect(`./${$selectedScreen._id}`)
} else if ($store.screens?.length) {
$redirect(`./${$store.screens[0]._id}`)
} else {
loaded = true
}
})
</script>
{#if loaded}
You need to create a screen!
{/if}

29
packages/builder/src/pages/builder/app/[application]/design/screens/[screenId].svelte

@ -1,29 +0,0 @@
<script>
import { store } from "builderStore"
import { onDestroy } from "svelte"
import { syncURLToState } from "helpers/urlStateSync"
import { goto, params, redirect } from "@roxi/routify"
import ScreenNavigationPanel from "./_components/ScreenNavigationPanel.svelte"
import ScreenSettingsPanel from "./_components/ScreenSettingsPanel.svelte"
// Keep URL and state in sync for selected screen ID
const stopSyncing = syncURLToState({
keys: [
{
url: "screenId",
state: "selectedScreenId",
validate: screenId => $store.screens.some(x => x._id === screenId),
fallbackUrl: "../",
},
],
store,
params,
goto,
redirect,
})
onDestroy(stopSyncing)
</script>
<ScreenNavigationPanel />
<ScreenSettingsPanel />

21
packages/builder/src/pages/builder/app/[application]/design/screens/index.svelte

@ -1,21 +0,0 @@
<script>
import { store, selectedScreen } from "builderStore"
import { onMount } from "svelte"
import { redirect } from "@roxi/routify"
let loaded = false
onMount(() => {
if ($selectedScreen) {
$redirect(`./${$selectedScreen._id}`)
} else if ($store.screens?.length) {
$redirect(`./${$store.screens[0]._id}`)
} else {
loaded = true
}
})
</script>
{#if loaded}
You need to create a screen!
{/if}

2
packages/builder/src/pages/builder/app/[application]/index.svelte

@ -2,5 +2,3 @@
import { goto } from "@roxi/routify"
$goto("./design")
</script>
<!-- routify:options index=false -->

8
packages/builder/yarn.lock

@ -1223,10 +1223,10 @@
estree-walker "^2.0.1"
picomatch "^2.2.2"
"@roxi/routify@2.18.0":
version "2.18.0"
resolved "https://registry.yarnpkg.com/@roxi/routify/-/routify-2.18.0.tgz#8f88bedd936312d0dbe44cbc11ab179b1f938ec2"
integrity sha512-MVB50HN+VQWLzfjLplcBjsSBvwOiExKOmht2DuWR3WQ60JxQi9pSejkB06tFVkFKNXz2X5iYtKDqKBTdae/gRg==
"@roxi/routify@2.18.5":
version "2.18.5"
resolved "https://registry.yarnpkg.com/@roxi/routify/-/routify-2.18.5.tgz#abd2b7cadeed008ab20d40a68323719d9c254552"
integrity sha512-xNG84JOSUtCyOV0WeQwPcj+HbA4nxtXCqvt9JXQZm13pdJZqY18WV2C7ayReKGtRAa3ogQyDo8k/C8f1MixA1w==
dependencies:
"@roxi/ssr" "^0.2.1"
"@types/node" ">=4.2.0 < 13"

Loading…
Cancel
Save