Merge pull request #6352 from Budibase/fix/select-table-by-id

Fix autoscreen and autoscreen link creation and deletion
This commit is contained in:
Andrew Kingston 2022-06-22 12:47:57 +01:00 committed by GitHub
commit b6231b281b
6 changed files with 43 additions and 98 deletions

View File

@ -190,6 +190,7 @@ export const getFrontendStore = () => {
// Build array of promises to speed up bulk deletions // Build array of promises to speed up bulk deletions
const promises = [] const promises = []
let deleteUrls = []
screensToDelete.forEach(screen => { screensToDelete.forEach(screen => {
// Delete the screen // Delete the screen
promises.push( promises.push(
@ -199,14 +200,10 @@ export const getFrontendStore = () => {
}) })
) )
// Remove links to this screen // Remove links to this screen
promises.push( deleteUrls.push(screen.routing.route)
store.actions.components.links.delete(
screen.routing.route,
screen.props._instanceName
)
)
}) })
promises.push(store.actions.links.delete(deleteUrls))
await Promise.all(promises) await Promise.all(promises)
const deletedIds = screensToDelete.map(screen => screen._id) const deletedIds = screensToDelete.map(screen => screen._id)
store.update(state => { store.update(state => {
@ -578,6 +575,7 @@ export const getFrontendStore = () => {
}) })
await store.actions.preview.saveSelected() await store.actions.preview.saveSelected()
}, },
},
links: { links: {
save: async (url, title) => { save: async (url, title) => {
const layout = get(mainLayout) const layout = get(mainLayout)
@ -586,8 +584,6 @@ export const getFrontendStore = () => {
} }
// Add link setting to main layout // Add link setting to main layout
if (layout.props._component.endsWith("layout")) {
// If using a new SDK, add to the layout component settings
if (!layout.props.links) { if (!layout.props.links) {
layout.props.links = [] layout.props.links = []
} }
@ -595,74 +591,24 @@ export const getFrontendStore = () => {
text: title, text: title,
url, url,
}) })
} else {
// If using an old SDK, add to the navigation component
// TODO: remove this when we can assume everyone has updated
const nav = findComponentType(
layout.props,
"@budibase/standard-components/navigation"
)
if (!nav) {
return
}
let newLink
if (nav._children && nav._children.length) {
// Clone an existing link if one exists
newLink = cloneDeep(nav._children[0])
// Set our new props
newLink._id = Helpers.uuid()
newLink._instanceName = `${title} Link`
newLink.url = url
newLink.text = title
} else {
// Otherwise create vanilla new link
newLink = {
...store.actions.components.createInstance("link"),
url,
text: title,
_instanceName: `${title} Link`,
}
nav._children = [...nav._children, newLink]
}
}
// Save layout
await store.actions.layouts.save(layout) await store.actions.layouts.save(layout)
}, },
delete: async (url, title) => { delete: async urls => {
const layout = get(mainLayout) const layout = get(mainLayout)
if (!layout) { if (!layout?.props.links?.length) {
return return
} }
// Add link setting to main layout // Filter out the URLs to delete
if (layout.props._component.endsWith("layout")) { urls = Array.isArray(urls) ? urls : [urls]
// If using a new SDK, add to the layout component settings
layout.props.links = layout.props.links.filter( layout.props.links = layout.props.links.filter(
link => !(link.text === title && link.url === url) link => !urls.includes(link.url)
) )
} else {
// If using an old SDK, add to the navigation component
// TODO: remove this when we can assume everyone has updated
const nav = findComponentType(
layout.props,
"@budibase/standard-components/navigation"
)
if (!nav) {
return
}
nav._children = nav._children.filter(
child => !(child.url === url && child.text === title)
)
}
// Save layout
await store.actions.layouts.save(layout) await store.actions.layouts.save(layout)
}, },
}, },
},
settings: { settings: {
highlight: key => { highlight: key => {
store.update(state => ({ store.update(state => ({

View File

@ -15,7 +15,7 @@ export default function (tables) {
name: `${table.name} - New`, name: `${table.name} - New`,
create: () => createScreen(table), create: () => createScreen(table),
id: NEW_ROW_TEMPLATE, id: NEW_ROW_TEMPLATE,
table: table.name, table: table._id,
} }
}) })
} }

View File

@ -17,7 +17,7 @@ export default function (tables) {
name: `${table.name} - Detail`, name: `${table.name} - Detail`,
create: () => createScreen(table), create: () => createScreen(table),
id: ROW_DETAIL_TEMPLATE, id: ROW_DETAIL_TEMPLATE,
table: table.name, table: table._id,
} }
}) })
} }

View File

@ -10,7 +10,7 @@ export default function (tables) {
name: `${table.name} - List`, name: `${table.name} - List`,
create: () => createScreen(table), create: () => createScreen(table),
id: ROW_LIST_TEMPLATE, id: ROW_LIST_TEMPLATE,
table: table.name, table: table._id,
} }
}) })
} }

View File

@ -14,14 +14,14 @@
let selectedScreens = [...initalScreens] let selectedScreens = [...initalScreens]
const toggleScreenSelection = (table, datasource) => { const toggleScreenSelection = (table, datasource) => {
if (selectedScreens.find(s => s.table === table.name)) { if (selectedScreens.find(s => s.table === table._id)) {
selectedScreens = selectedScreens.filter( selectedScreens = selectedScreens.filter(
screen => screen.table !== table.name screen => screen.table !== table._id
) )
} else { } else {
let partialTemplates = getTemplates($store, $tables.list).reduce( let partialTemplates = getTemplates($store, $tables.list).reduce(
(acc, template) => { (acc, template) => {
if (template.table === table.name) { if (template.table === table._id) {
template.datasource = datasource.name template.datasource = datasource.name
acc.push(template) acc.push(template)
} }
@ -88,7 +88,7 @@
<div <div
class="data-source-entry" class="data-source-entry"
class:selected={selectedScreens.find( class:selected={selectedScreens.find(
x => x.table === table.name x => x.table === table._id
)} )}
on:click={() => toggleScreenSelection(table, datasource)} on:click={() => toggleScreenSelection(table, datasource)}
> >
@ -102,8 +102,7 @@
<use xlink:href="#spectrum-icon-18-Table" /> <use xlink:href="#spectrum-icon-18-Table" />
</svg> </svg>
{table.name} {table.name}
{#if selectedScreens.find(x => x.table === table._id)}
{#if selectedScreens.find(x => x.table === table.name)}
<span class="data-source-check"> <span class="data-source-check">
<Icon size="S" name="CheckmarkCircle" /> <Icon size="S" name="CheckmarkCircle" />
</span> </span>
@ -116,7 +115,7 @@
<div <div
class="data-source-entry" class="data-source-entry"
class:selected={selectedScreens.find( class:selected={selectedScreens.find(
x => x.table === datasource.entities[table_key].name x => x.table === datasource.entities[table_key]._id
)} )}
on:click={() => on:click={() =>
toggleScreenSelection( toggleScreenSelection(
@ -134,8 +133,7 @@
<use xlink:href="#spectrum-icon-18-Table" /> <use xlink:href="#spectrum-icon-18-Table" />
</svg> </svg>
{datasource.entities[table_key].name} {datasource.entities[table_key].name}
{#if selectedScreens.find(x => x.table === datasource.entities[table_key]._id)}
{#if selectedScreens.find(x => x.table === datasource.entities[table_key].name)}
<span class="data-source-check"> <span class="data-source-check">
<Icon size="S" name="CheckmarkCircle" /> <Icon size="S" name="CheckmarkCircle" />
</span> </span>

View File

@ -66,7 +66,7 @@
// Add link in layout for list screens // Add link in layout for list screens
if (screen.props._instanceName.endsWith("List")) { if (screen.props._instanceName.endsWith("List")) {
await store.actions.components.links.save( await store.actions.links.save(
screen.routing.route, screen.routing.route,
screen.routing.route.split("/")[1] screen.routing.route.split("/")[1]
) )
@ -131,6 +131,7 @@
const screens = selectedTemplates.map(template => { const screens = selectedTemplates.map(template => {
let screenTemplate = template.create() let screenTemplate = template.create()
screenTemplate.datasource = template.datasource screenTemplate.datasource = template.datasource
screenTemplate.autoTableId = template.table
return screenTemplate return screenTemplate
}) })
await createScreens({ screens, screenAccessRole }) await createScreens({ screens, screenAccessRole })