mirror of
https://gitlab.com/bramw/baserow.git
synced 2024-11-22 07:42:36 +00:00
121 lines
3.2 KiB
Vue
121 lines
3.2 KiB
Vue
<template>
|
|
<PageTemplateContent
|
|
v-if="!loading && workspace && page && builder"
|
|
:workspace="workspace"
|
|
:builder="builder"
|
|
:page="page"
|
|
:mode="mode"
|
|
/>
|
|
<PageSkeleton v-else />
|
|
</template>
|
|
|
|
<script>
|
|
import { StoreItemLookupError } from '@baserow/modules/core/errors'
|
|
import PageTemplateContent from '@baserow/modules/builder/components/page/PageTemplateContent'
|
|
import PageSkeleton from '@baserow/modules/builder/components/page/PageSkeleton'
|
|
import { DataProviderType } from '@baserow/modules/core/dataProviderTypes'
|
|
import { BuilderApplicationType } from '@baserow/modules/builder/applicationTypes'
|
|
import { clone } from '@baserow/modules/core/utils/object'
|
|
|
|
const mode = 'editing'
|
|
|
|
export default {
|
|
name: 'PageTemplate',
|
|
components: { PageTemplateContent, PageSkeleton },
|
|
props: {
|
|
pageValue: {
|
|
type: Object,
|
|
required: true,
|
|
},
|
|
},
|
|
data() {
|
|
return {
|
|
workspace: null,
|
|
builder: null,
|
|
page: null,
|
|
mode,
|
|
loading: true,
|
|
}
|
|
},
|
|
watch: {
|
|
'pageValue.page.id': {
|
|
handler() {
|
|
this.loadData()
|
|
},
|
|
immediate: true,
|
|
},
|
|
},
|
|
destroyed() {
|
|
// Restore the current application to the selected application if any
|
|
this.$store.dispatch('userSourceUser/setCurrentApplication', {
|
|
application: this.$store.getters['application/getSelected'],
|
|
})
|
|
},
|
|
methods: {
|
|
async loadData() {
|
|
this.loading = true
|
|
|
|
this.$store.dispatch('element/select', {
|
|
element: null,
|
|
})
|
|
try {
|
|
const builderToDisplay = this.pageValue.builder
|
|
|
|
if (
|
|
this.$store.getters['userSourceUser/getCurrentApplication']?.id !==
|
|
builderToDisplay.id
|
|
) {
|
|
// We clone the builder because we are using it in the userSourceUser store
|
|
// And the application is then modified outside of the store elsewhere.
|
|
this.$store.dispatch('userSourceUser/setCurrentApplication', {
|
|
application: clone(builderToDisplay),
|
|
})
|
|
}
|
|
|
|
const builder =
|
|
this.$store.getters['userSourceUser/getCurrentApplication']
|
|
|
|
const page = this.$store.getters['page/getById'](
|
|
builder,
|
|
this.pageValue.page.id
|
|
)
|
|
|
|
const builderApplicationType = this.$registry.get(
|
|
'application',
|
|
BuilderApplicationType.getType()
|
|
)
|
|
await builderApplicationType.loadExtraData(builder)
|
|
|
|
await Promise.all([
|
|
this.$store.dispatch('dataSource/fetch', {
|
|
page,
|
|
}),
|
|
this.$store.dispatch('element/fetch', { page }),
|
|
this.$store.dispatch('workflowAction/fetch', { page }),
|
|
])
|
|
|
|
await DataProviderType.initAll(
|
|
this.$registry.getAll('builderDataProvider'),
|
|
{
|
|
builder,
|
|
page,
|
|
mode,
|
|
}
|
|
)
|
|
|
|
this.builder = builder
|
|
this.page = page
|
|
this.workspace = builder.workspace
|
|
} catch (e) {
|
|
// In case of a network error we want to fail hard.
|
|
if (e.response === undefined && !(e instanceof StoreItemLookupError)) {
|
|
throw e
|
|
}
|
|
}
|
|
|
|
this.loading = false
|
|
},
|
|
},
|
|
}
|
|
</script>
|