1
0
mirror of https://gitlab.com/bramw/baserow.git synced 2024-11-24 16:36:46 +00:00
bramw_baserow/web-frontend/modules/database/components/view/ViewContext.vue
Jonathan Adeline 9ac6cb17de Context rework
2024-08-29 10:03:55 +00:00

248 lines
6.3 KiB
Vue

<template>
<Context ref="context" overflow-scroll max-height-if-outside-viewport>
<div class="context__menu-title">{{ view.name }} ({{ view.id }})</div>
<ul class="context__menu">
<li
v-if="
hasValidExporter &&
$hasPermission(
'database.table.run_export',
table,
database.workspace.id
)
"
class="context__menu-item"
>
<a class="context__menu-item-link" @click="exportView()">
<i class="context__menu-item-icon iconoir-share-ios"></i>
{{ $t('viewContext.exportView') }}
</a>
</li>
<li
v-if="
$hasPermission(
'database.table.import_rows',
table,
database.workspace.id
)
"
class="context__menu-item"
>
<a class="context__menu-item-link" @click="importFile()">
<i class="context__menu-item-icon iconoir-import"></i>
{{ $t('viewContext.importFile') }}
</a>
</li>
<li
v-if="
$hasPermission(
'database.table.view.duplicate',
view,
database.workspace.id
)
"
class="context__menu-item"
>
<a
class="context__menu-item-link"
:class="{ 'context__menu-item-link--loading': duplicateLoading }"
@click="duplicateView()"
>
<i class="context__menu-item-icon iconoir-copy"></i>
{{ $t('viewContext.duplicateView') }}
</a>
</li>
<li
v-for="(
changeViewOwnershipTypeComponent, index
) in changeViewOwnershipTypeMenuItems"
:key="'view-ownership-type-' + index"
>
<component
:is="changeViewOwnershipTypeComponent"
:view="view"
:database="database"
></component>
</li>
<li
v-if="
$hasPermission(
'database.table.create_webhook',
table,
database.workspace.id
)
"
class="context__menu-item"
>
<a class="context__menu-item-link" @click="openWebhookModal()">
<i class="context__menu-item-icon iconoir-globe"></i>
{{ $t('viewContext.webhooks') }}
</a>
</li>
<li
v-if="
$hasPermission(
'database.table.view.update',
view,
database.workspace.id
)
"
class="context__menu-item"
>
<a class="context__menu-item-link" @click="enableRename()">
<i class="context__menu-item-icon iconoir-edit-pencil"></i>
{{ $t('viewContext.renameView') }}
</a>
</li>
<li
v-if="
$hasPermission(
'database.table.view.delete',
view,
database.workspace.id
)
"
class="context__menu-item context-menu-item--with-separator"
>
<a
class="context__menu-item-link context__menu-item-link--delete"
:class="{ 'context__menu-item-link--loading': deleteLoading }"
@click="deleteView()"
>
<i class="context__menu-item-icon iconoir-bin"></i>
{{ $t('viewContext.deleteView') }}
</a>
</li>
</ul>
<ExportTableModal
ref="exportViewModal"
:database="database"
:table="table"
:view="view"
/>
<ImportFileModal
ref="importFileModal"
:database="database"
:table="table"
:fields="fields"
/>
<WebhookModal
ref="webhookModal"
:database="database"
:table="table"
:fields="fields"
/>
</Context>
</template>
<script>
import { mapGetters } from 'vuex'
import context from '@baserow/modules/core/mixins/context'
import viewTypeHasExporterTypes from '@baserow/modules/database/utils/viewTypeHasExporterTypes'
import ImportFileModal from '@baserow/modules/database/components/table/ImportFileModal'
import { notifyIf } from '@baserow/modules/core/utils/error'
import ExportTableModal from '@baserow/modules/database/components/export/ExportTableModal'
import WebhookModal from '@baserow/modules/database/components/webhook/WebhookModal.vue'
export default {
name: 'ViewContext',
components: {
ExportTableModal,
WebhookModal,
ImportFileModal,
},
mixins: [context],
props: {
database: {
type: Object,
required: true,
},
view: {
type: Object,
required: true,
},
table: {
type: Object,
required: true,
},
},
data() {
return {
duplicateLoading: false,
deleteLoading: false,
}
},
computed: {
hasValidExporter() {
return viewTypeHasExporterTypes(this.view.type, this.$registry)
},
...mapGetters({
fields: 'field/getAll',
}),
changeViewOwnershipTypeMenuItems() {
const activeOwnershipTypes = Object.values(
this.$registry.getAll('viewOwnershipType')
)
return activeOwnershipTypes
.map((viewOwnershipType) => {
return viewOwnershipType.getChangeOwnershipTypeMenuItemComponent()
})
.filter((component) => component !== null)
},
},
methods: {
enableRename() {
this.$refs.context.hide()
this.$emit('enable-rename')
},
async deleteView() {
this.deleteLoading = true
try {
await this.$store.dispatch('view/delete', this.view)
} catch (error) {
notifyIf(error, 'view')
}
this.deleteLoading = false
},
async duplicateView() {
this.duplicateLoading = true
let newView
try {
newView = await this.$store.dispatch('view/duplicate', this.view)
} catch (error) {
notifyIf(error, 'view')
}
this.$refs.context.hide()
this.duplicateLoading = false
// Redirect to the newly created view.
this.$nuxt.$router.push({
name: 'database-table',
params: {
databaseId: this.table.database_id,
tableId: this.table.id,
viewId: newView.id,
},
})
},
exportView() {
this.$refs.context.hide()
this.$refs.exportViewModal.show()
},
importFile() {
this.$refs.context.hide()
this.$refs.importFileModal.show()
},
openWebhookModal() {
this.$refs.context.hide()
this.$refs.webhookModal.show()
},
},
}
</script>