2020-11-04 18:09:45 +01:00
|
|
|
import { getFrontendStore } from "./store/frontend"
|
2020-12-15 17:41:55 +01:00
|
|
|
import { getAutomationStore } from "./store/automation"
|
2020-10-30 14:23:49 +01:00
|
|
|
import { getThemeStore } from "./store/theme"
|
2022-05-11 13:47:24 +02:00
|
|
|
import { derived } from "svelte/store"
|
2022-04-26 14:44:21 +02:00
|
|
|
import { LAYOUT_NAMES } from "../constants"
|
2022-03-21 16:17:51 +01:00
|
|
|
import { findComponent, findComponentPath } from "./componentUtils"
|
2022-05-10 14:32:34 +02:00
|
|
|
import { RoleUtils } from "@budibase/frontend-core"
|
2019-07-13 11:35:57 +02:00
|
|
|
|
2020-11-04 18:09:45 +01:00
|
|
|
export const store = getFrontendStore()
|
2020-09-21 14:49:34 +02:00
|
|
|
export const automationStore = getAutomationStore()
|
2020-10-30 14:23:49 +01:00
|
|
|
export const themeStore = getThemeStore()
|
2019-07-13 11:35:57 +02:00
|
|
|
|
2022-04-25 20:33:43 +02:00
|
|
|
export const selectedScreen = derived(store, $store => {
|
|
|
|
return $store.screens.find(screen => screen._id === $store.selectedScreenId)
|
|
|
|
})
|
|
|
|
|
2022-05-11 13:47:24 +02:00
|
|
|
export const selectedLayout = derived(store, $store => {
|
|
|
|
return $store.layouts?.find(layout => layout._id === $store.selectedLayoutId)
|
|
|
|
})
|
|
|
|
|
|
|
|
export const selectedComponent = derived(
|
|
|
|
[store, selectedScreen],
|
|
|
|
([$store, $selectedScreen]) => {
|
|
|
|
if (!$selectedScreen || !$store.selectedComponentId) {
|
|
|
|
return null
|
|
|
|
}
|
|
|
|
return findComponent($selectedScreen?.props, $store.selectedComponentId)
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
2022-05-10 14:32:34 +02:00
|
|
|
export const sortedScreens = derived(store, $store => {
|
|
|
|
return $store.screens.slice().sort((a, b) => {
|
|
|
|
// Sort by role first
|
|
|
|
const roleA = RoleUtils.getRolePriority(a.routing.roleId)
|
|
|
|
const roleB = RoleUtils.getRolePriority(b.routing.roleId)
|
|
|
|
if (roleA !== roleB) {
|
|
|
|
return roleA > roleB ? -1 : 1
|
|
|
|
}
|
|
|
|
// Then put home screens first
|
|
|
|
const homeA = !!a.routing.homeScreen
|
|
|
|
const homeB = !!b.routing.homeScreen
|
|
|
|
if (homeA !== homeB) {
|
|
|
|
return homeA ? -1 : 1
|
|
|
|
}
|
2022-05-11 10:04:33 +02:00
|
|
|
// Then sort alphabetically by each URL param
|
|
|
|
const aParams = a.routing.route.split("/")
|
|
|
|
const bParams = b.routing.route.split("/")
|
|
|
|
let minParams = Math.min(aParams.length, bParams.length)
|
|
|
|
for (let i = 0; i < minParams; i++) {
|
|
|
|
if (aParams[i] === bParams[i]) {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
return aParams[i] < bParams[i] ? -1 : 1
|
|
|
|
}
|
|
|
|
// Then sort by the fewest amount of URL params
|
|
|
|
return aParams.length < bParams.length ? -1 : 1
|
2022-05-10 14:32:34 +02:00
|
|
|
})
|
|
|
|
})
|
|
|
|
|
2022-03-21 16:17:51 +01:00
|
|
|
export const selectedComponentPath = derived(
|
2022-04-26 14:44:21 +02:00
|
|
|
[store, selectedScreen],
|
|
|
|
([$store, $selectedScreen]) => {
|
2022-03-21 16:17:51 +01:00
|
|
|
return findComponentPath(
|
2022-04-26 14:44:21 +02:00
|
|
|
$selectedScreen?.props,
|
2022-03-21 16:17:51 +01:00
|
|
|
$store.selectedComponentId
|
|
|
|
).map(component => component._id)
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
2021-05-04 12:32:22 +02:00
|
|
|
export const mainLayout = derived(store, $store => {
|
2020-12-01 17:22:06 +01:00
|
|
|
return $store.layouts?.find(
|
2021-05-04 12:32:22 +02:00
|
|
|
layout => layout._id === LAYOUT_NAMES.MASTER.PRIVATE
|
2020-12-01 17:22:06 +01:00
|
|
|
)
|
2020-11-05 18:47:27 +01:00
|
|
|
})
|
|
|
|
|
2022-04-26 14:44:21 +02:00
|
|
|
// For compatibility
|
|
|
|
export const currentAsset = selectedScreen
|