ui: Adding option to select columns to display (#6001)

This commit is contained in:
davidjumani 2022-02-21 20:58:55 +05:30 committed by GitHub
parent 2a1a012a4d
commit b9e973ab9b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 86 additions and 7 deletions

View File

@ -598,6 +598,7 @@
"label.clustertype": "Cluster Type", "label.clustertype": "Cluster Type",
"label.clvm": "CLVM", "label.clvm": "CLVM",
"label.code": "Code", "label.code": "Code",
"label.columns": "Columns",
"label.comma.separated.list.description": "Enter comma-separated list of commands", "label.comma.separated.list.description": "Enter comma-separated list of commands",
"label.comments": "Comments", "label.comments": "Comments",
"label.community": "Community", "label.community": "Community",

View File

@ -42,7 +42,8 @@ const getters = {
darkMode: state => state.user.darkMode, darkMode: state => state.user.darkMode,
themeSetting: state => state.user.themeSetting, themeSetting: state => state.user.themeSetting,
defaultListViewPageSize: state => state.user.defaultListViewPageSize, defaultListViewPageSize: state => state.user.defaultListViewPageSize,
countNotify: state => state.user.countNotify countNotify: state => state.user.countNotify,
customColumns: state => state.user.customColumns
} }
export default getters export default getters

View File

@ -28,7 +28,8 @@ import {
DEFAULT_CONTENT_WIDTH_TYPE, DEFAULT_CONTENT_WIDTH_TYPE,
DEFAULT_MULTI_TAB, DEFAULT_MULTI_TAB,
USE_BROWSER_TIMEZONE, USE_BROWSER_TIMEZONE,
SERVER_MANAGER SERVER_MANAGER,
CUSTOM_COLUMNS
} from '@/store/mutation-types' } from '@/store/mutation-types'
const app = { const app = {
@ -110,6 +111,10 @@ const app = {
SET_SERVER: (state, server) => { SET_SERVER: (state, server) => {
Vue.ls.set(SERVER_MANAGER, server) Vue.ls.set(SERVER_MANAGER, server)
state.server = server state.server = server
},
SET_CUSTOM_COLUMNS: (state, customColumns) => {
Vue.ls.set(CUSTOM_COLUMNS, customColumns)
state.customColumns = customColumns
} }
}, },
actions: { actions: {
@ -163,6 +168,9 @@ const app = {
}, },
SetServer ({ commit }, server) { SetServer ({ commit }, server) {
commit('SET_SERVER', server) commit('SET_SERVER', server)
},
SetCustomColumns ({ commit }, bool) {
commit('SET_CUSTOM_COLUMNS', bool)
} }
} }
} }

View File

@ -34,7 +34,8 @@ import {
HEADER_NOTICES, HEADER_NOTICES,
DOMAIN_STORE, DOMAIN_STORE,
DARK_MODE, DARK_MODE,
THEME_SETTING THEME_SETTING,
CUSTOM_COLUMNS
} from '@/store/mutation-types' } from '@/store/mutation-types'
const user = { const user = {
@ -125,6 +126,10 @@ const user = {
}, },
SET_COUNT_NOTIFY (state, number) { SET_COUNT_NOTIFY (state, number) {
state.countNotify = number state.countNotify = number
},
SET_CUSTOM_COLUMNS: (state, customColumns) => {
Vue.ls.set(CUSTOM_COLUMNS, customColumns)
state.customColumns = customColumns
} }
}, },
@ -154,6 +159,8 @@ const user = {
commit('SET_DARK_MODE', darkMode) commit('SET_DARK_MODE', darkMode)
const themeSetting = Vue.ls.get(THEME_SETTING, {}) const themeSetting = Vue.ls.get(THEME_SETTING, {})
commit('SET_THEME_SETTING', themeSetting) commit('SET_THEME_SETTING', themeSetting)
const cachedCustomColumns = Vue.ls.get(CUSTOM_COLUMNS, {})
commit('SET_CUSTOM_COLUMNS', cachedCustomColumns)
commit('SET_APIS', {}) commit('SET_APIS', {})
commit('SET_NAME', '') commit('SET_NAME', '')
@ -181,6 +188,7 @@ const user = {
const cachedZones = Vue.ls.get(ZONES, []) const cachedZones = Vue.ls.get(ZONES, [])
const cachedTimezoneOffset = Vue.ls.get(TIMEZONE_OFFSET, 0.0) const cachedTimezoneOffset = Vue.ls.get(TIMEZONE_OFFSET, 0.0)
const cachedUseBrowserTimezone = Vue.ls.get(USE_BROWSER_TIMEZONE, false) const cachedUseBrowserTimezone = Vue.ls.get(USE_BROWSER_TIMEZONE, false)
const cachedCustomColumns = Vue.ls.get(CUSTOM_COLUMNS, {})
const domainStore = Vue.ls.get(DOMAIN_STORE, {}) const domainStore = Vue.ls.get(DOMAIN_STORE, {})
const darkMode = Vue.ls.get(DARK_MODE, false) const darkMode = Vue.ls.get(DARK_MODE, false)
const themeSetting = Vue.ls.get(THEME_SETTING, {}) const themeSetting = Vue.ls.get(THEME_SETTING, {})
@ -195,6 +203,7 @@ const user = {
commit('SET_APIS', cachedApis) commit('SET_APIS', cachedApis)
commit('SET_TIMEZONE_OFFSET', cachedTimezoneOffset) commit('SET_TIMEZONE_OFFSET', cachedTimezoneOffset)
commit('SET_USE_BROWSER_TIMEZONE', cachedUseBrowserTimezone) commit('SET_USE_BROWSER_TIMEZONE', cachedUseBrowserTimezone)
commit('SET_CUSTOM_COLUMNS', cachedCustomColumns)
// Ensuring we get the user info so that store.getters.user is never empty when the page is freshly loaded // Ensuring we get the user info so that store.getters.user is never empty when the page is freshly loaded
api('listUsers', { username: Cookies.get('username'), listall: true }).then(response => { api('listUsers', { username: Cookies.get('username'), listall: true }).then(response => {

View File

@ -36,6 +36,7 @@ export const SERVER_MANAGER = 'SERVER_MANAGER'
export const DOMAIN_STORE = 'DOMAIN_STORE' export const DOMAIN_STORE = 'DOMAIN_STORE'
export const DARK_MODE = 'DARK_MODE' export const DARK_MODE = 'DARK_MODE'
export const THEME_SETTING = 'THEME_SETTING' export const THEME_SETTING = 'THEME_SETTING'
export const CUSTOM_COLUMNS = 'CUSTOM_COLUMNS'
export const CONTENT_WIDTH_TYPE = { export const CONTENT_WIDTH_TYPE = {
Fluid: 'Fluid', Fluid: 'Fluid',

View File

@ -73,6 +73,19 @@
</a-select-option> </a-select-option>
</a-select> </a-select>
</a-tooltip> </a-tooltip>
<a-dropdown style="margin-left: 8px" :trigger="['click']" v-if="!$store.getters.metrics" v-model="customColumnsDropdownVisible">
<a-button>
{{ $t('label.columns') }} <a-icon type="down" style="color: rgba(0,0,0,.45)" />
</a-button>
<a-menu
@click="() => { customColumnsDropdownVisible = true }"
slot="overlay" >
<a-menu-item v-for="(column, idx) in columnKeys" :key="idx" @click="updateSelectedColumns(column)">
<a-checkbox :id="idx.toString()" :checked="selectedColumns.includes(getColumnKey(column))"/>
{{ $t('label.' + getColumnKey(column)) }}
</a-menu-item>
</a-menu>
</a-dropdown>
</span> </span>
</breadcrumb> </breadcrumb>
</a-col> </a-col>
@ -441,7 +454,7 @@
<bulk-action-progress <bulk-action-progress
:showGroupActionModal="showGroupActionModal" :showGroupActionModal="showGroupActionModal"
:selectedItems="selectedItems" :selectedItems="selectedItems"
:selectedColumns="selectedColumns" :selectedColumns="bulkColumns"
:message="modalInfo" :message="modalInfo"
@handle-cancel="handleCancel" /> @handle-cancel="handleCancel" />
</div> </div>
@ -499,9 +512,13 @@ export default {
apiName: '', apiName: '',
loading: false, loading: false,
actionLoading: false, actionLoading: false,
columnKeys: [],
allColumns: [],
columns: [], columns: [],
bulkColumns: [],
selectedColumns: [], selectedColumns: [],
chosenColumns: [], chosenColumns: [],
customColumnsDropdownVisible: false,
showGroupActionModal: false, showGroupActionModal: false,
selectedItems: [], selectedItems: [],
items: [], items: [],
@ -716,6 +733,7 @@ export default {
this.actions = [] this.actions = []
this.columns = [] this.columns = []
this.columnKeys = [] this.columnKeys = []
this.selectedColumns = []
const refreshed = ('irefresh' in params) const refreshed = ('irefresh' in params)
params.listall = true params.listall = true
@ -825,7 +843,20 @@ export default {
scopedSlots: { customRender: key }, scopedSlots: { customRender: key },
sorter: function (a, b) { return genericCompare(a[this.dataIndex] || '', b[this.dataIndex] || '') } sorter: function (a, b) { return genericCompare(a[this.dataIndex] || '', b[this.dataIndex] || '') }
}) })
this.selectedColumns.push(key)
} }
this.allColumns = this.columns
if (!store.getters.metrics) {
if (!this.$store.getters.customColumns[this.$store.getters.userInfo.id]) {
this.$store.getters.customColumns[this.$store.getters.userInfo.id] = {}
this.$store.getters.customColumns[this.$store.getters.userInfo.id][this.$route.path] = this.selectedColumns
} else {
this.selectedColumns = this.$store.getters.customColumns[this.$store.getters.userInfo.id][this.$route.path] || this.selectedColumns
this.updateSelectedColumns()
}
}
this.chosenColumns = this.columns.filter(column => { this.chosenColumns = this.columns.filter(column => {
return ![this.$t('label.state'), this.$t('label.hostname'), this.$t('label.hostid'), this.$t('label.zonename'), return ![this.$t('label.state'), this.$t('label.hostname'), this.$t('label.hostid'), this.$t('label.zonename'),
this.$t('label.zone'), this.$t('label.zoneid'), this.$t('label.ip'), this.$t('label.ipaddress'), this.$t('label.privateip'), this.$t('label.zone'), this.$t('label.zoneid'), this.$t('label.ip'), this.$t('label.ipaddress'), this.$t('label.privateip'),
@ -1218,7 +1249,7 @@ export default {
eventBus.$emit('update-bulk-job-status', this.selectedItems, false) eventBus.$emit('update-bulk-job-status', this.selectedItems, false)
this.showGroupActionModal = false this.showGroupActionModal = false
this.selectedItems = [] this.selectedItems = []
this.selectedColumns = [] this.bulkColumns = []
this.selectedRowKeys = [] this.selectedRowKeys = []
this.message = {} this.message = {}
}, },
@ -1227,9 +1258,9 @@ export default {
this.promises = [] this.promises = []
if (!this.dataView && this.currentAction.groupAction && this.selectedRowKeys.length > 0) { if (!this.dataView && this.currentAction.groupAction && this.selectedRowKeys.length > 0) {
if (this.selectedRowKeys.length > 0) { if (this.selectedRowKeys.length > 0) {
this.selectedColumns = this.chosenColumns this.bulkColumns = this.chosenColumns
this.selectedItems = this.selectedItems.map(v => ({ ...v, status: 'InProgress' })) this.selectedItems = this.selectedItems.map(v => ({ ...v, status: 'InProgress' }))
this.selectedColumns.splice(0, 0, { this.bulkColumns.splice(0, 0, {
dataIndex: 'status', dataIndex: 'status',
title: this.$t('label.operation.status'), title: this.$t('label.operation.status'),
scopedSlots: { customRender: 'status' }, scopedSlots: { customRender: 'status' },
@ -1441,6 +1472,30 @@ export default {
shouldNavigateBack (action) { shouldNavigateBack (action) {
return ((action.icon === 'delete' || ['archiveEvents', 'archiveAlerts', 'unmanageVirtualMachine'].includes(action.api)) && this.dataView) return ((action.icon === 'delete' || ['archiveEvents', 'archiveAlerts', 'unmanageVirtualMachine'].includes(action.api)) && this.dataView)
}, },
getColumnKey (name) {
if (typeof name === 'object') {
name = Object.keys(name)[0]
}
return name
},
updateSelectedColumns (name) {
if (name) {
name = this.getColumnKey(name)
if (this.selectedColumns.includes(name)) {
this.selectedColumns = this.selectedColumns.filter(x => x !== name)
} else {
this.selectedColumns.push(name)
}
}
this.columns = this.allColumns.filter(x => this.selectedColumns.includes(x.dataIndex))
if (!this.$store.getters.customColumns[this.$store.getters.userInfo.id]) {
this.$store.getters.customColumns[this.$store.getters.userInfo.id] = {}
}
this.$store.getters.customColumns[this.$store.getters.userInfo.id][this.$route.path] = this.selectedColumns
this.$store.dispatch('SetCustomColumns', this.$store.getters.customColumns)
},
changeFilter (filter) { changeFilter (filter) {
const query = Object.assign({}, this.$route.query) const query = Object.assign({}, this.$route.query)
delete query.templatefilter delete query.templatefilter
@ -1609,4 +1664,8 @@ export default {
display: flex; display: flex;
align-items: center; align-items: center;
} }
.hide {
display: none !important;
}
</style> </style>