mirror of
https://github.com/jumpserver/lina.git
synced 2025-11-12 21:34:02 +00:00
215 lines
5.2 KiB
Vue
215 lines
5.2 KiB
Vue
<template>
|
|
<div>
|
|
<ActionsGroup :actions="rightSideActions" :is-fa="true" class="right-side-actions right-side-item" />
|
|
<ImExportDialog
|
|
v-if="dialogExportVisible"
|
|
:export-options="iExportOptions"
|
|
:import-options="iImportOptions"
|
|
:selected-rows="selectedRows"
|
|
v-bind="$attrs"
|
|
@importDialogClose="onImportDialogClose"
|
|
@importDialogConfirm="onImportDialogConfirm"
|
|
/>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import ActionsGroup from '@/components/ActionsGroup/index.vue'
|
|
import ImExportDialog from './ImExportDialog.vue'
|
|
import { cleanActions } from './utils'
|
|
import { assignIfNot } from '@/utils/common'
|
|
|
|
const defaultTrue = { type: [Boolean, Function, String], default: true }
|
|
|
|
export default {
|
|
name: 'RightSide',
|
|
components: {
|
|
ActionsGroup,
|
|
ImExportDialog
|
|
},
|
|
props: {
|
|
tableUrl: {
|
|
type: String,
|
|
default: ''
|
|
},
|
|
hasExport: defaultTrue,
|
|
exportOptions: {
|
|
type: Object,
|
|
default: () => ({})
|
|
},
|
|
handleExportClick: {
|
|
type: Function,
|
|
default: function({ selectedRows }) {
|
|
const { exportOptions, tableUrl } = this
|
|
const url = exportOptions?.url ? exportOptions.url : tableUrl
|
|
this.dialogExportVisible = true
|
|
this.$nextTick(() => {
|
|
this.$eventBus.$emit('showExportDialog', { selectedRows, url, name: this.name })
|
|
})
|
|
}
|
|
},
|
|
hasImport: defaultTrue,
|
|
importOptions: {
|
|
type: Object,
|
|
default: () => ({})
|
|
},
|
|
handleImportClick: {
|
|
type: Function,
|
|
default: function({ selectedRows }) {
|
|
const { importOptions, tableUrl } = this
|
|
const url = importOptions?.url ? importOptions.url : tableUrl
|
|
this.dialogExportVisible = true
|
|
this.$nextTick(() => {
|
|
this.$eventBus.$emit('showImportDialog', { selectedRows, url, name: this.name })
|
|
})
|
|
}
|
|
},
|
|
hasColumnSetting: defaultTrue,
|
|
handleTableSettingClick: {
|
|
type: Function,
|
|
default: function({ selectedRows }) {
|
|
this.$eventBus.$emit('showColumnSettingPopover', { url: this.tableUrl, row: selectedRows, name: this.name })
|
|
}
|
|
},
|
|
hasRefresh: defaultTrue,
|
|
handleRefreshClick: {
|
|
type: Function,
|
|
default: function() {
|
|
this.reloadTable()
|
|
}
|
|
},
|
|
selectedRows: {
|
|
type: Array,
|
|
default: () => []
|
|
},
|
|
reloadTable: {
|
|
type: Function,
|
|
default: () => {
|
|
}
|
|
},
|
|
extraRightSideActions: {
|
|
type: Array,
|
|
default: () => []
|
|
},
|
|
canCreate: {
|
|
type: [Boolean, Function, String],
|
|
default: false
|
|
},
|
|
canBulkUpdate: {
|
|
type: [Boolean, Function, String],
|
|
default: false
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
defaultRightSideActions: [
|
|
{
|
|
name: 'actionSetting',
|
|
icon: 'system-setting',
|
|
tip: this.$t('TableSetting'),
|
|
has: this.hasColumnSetting,
|
|
callback: this.handleTableSettingClick.bind(this)
|
|
},
|
|
{
|
|
name: 'actionImport',
|
|
icon: 'upload',
|
|
tip: this.$t('Import'),
|
|
has: this.hasImport,
|
|
callback: this.handleImportClick.bind(this)
|
|
},
|
|
{
|
|
name: 'actionExport',
|
|
icon: 'download',
|
|
tip: this.$t('Export'),
|
|
has: this.hasExport,
|
|
callback: this.handleExportClick.bind(this)
|
|
},
|
|
{
|
|
name: 'actionRefresh',
|
|
icon: 'refresh',
|
|
tip: this.$t('Refresh'),
|
|
has: this.hasRefresh,
|
|
callback: this.handleRefreshClick.bind(this)
|
|
}
|
|
],
|
|
dialogExportVisible: false
|
|
}
|
|
},
|
|
computed: {
|
|
rightSideActions() {
|
|
const actions = [...this.defaultRightSideActions, ...this.extraRightSideActions]
|
|
const params = {
|
|
selectedRows: this.selectedRows,
|
|
reloadTable: this.reloadTable
|
|
}
|
|
return cleanActions(actions, true, params)
|
|
},
|
|
hasSelectedRows() {
|
|
return this.selectedRows.length > 0
|
|
},
|
|
iImportOptions() {
|
|
return assignIfNot(this.importOptions, {
|
|
url: this.tableUrl,
|
|
canImportCreate: this.canCreate,
|
|
canImportUpdate: this.canBulkUpdate
|
|
})
|
|
},
|
|
iExportOptions() {
|
|
return assignIfNot(this.exportOptions, { url: this.tableUrl })
|
|
}
|
|
},
|
|
methods: {
|
|
handleTagSearch(val) {
|
|
this.searchTable(val)
|
|
},
|
|
onImportDialogClose() {
|
|
this.$emit('importDialogClose')
|
|
setTimeout(() => {
|
|
this.dialogExportVisible = false
|
|
}, 100)
|
|
this.reloadTable()
|
|
},
|
|
onImportDialogConfirm() {
|
|
this.$emit('importDialogClose')
|
|
setTimeout(() => {
|
|
this.dialogExportVisible = false
|
|
}, 100)
|
|
this.reloadTable()
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.right-side-actions.right-side-item {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding-left: 10px;
|
|
height: 30px;
|
|
line-height: 30px;
|
|
|
|
::v-deep .el-button {
|
|
border: none;
|
|
padding: 7px;
|
|
font-size: 13px;
|
|
color: var(--color-icon-primary);
|
|
background-color: transparent;
|
|
|
|
&:hover {
|
|
background-color: rgba(0, 0, 0, 0.05);
|
|
}
|
|
}
|
|
|
|
::v-deep .fa {
|
|
height: 16px;
|
|
width: 16px;
|
|
}
|
|
}
|
|
|
|
.table-action-right-side {
|
|
display: flex;
|
|
justify-content: center;
|
|
}
|
|
</style>
|