perf: update menu

This commit is contained in:
ibuler 2025-01-21 17:48:44 +08:00
parent 83bb13b806
commit 7394ff27a5
10 changed files with 186 additions and 139 deletions

View File

@ -0,0 +1,10 @@
{
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"[vue]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"prettier.printWidth": 100,
"prettier.singleAttributePerLine": true,
"editor.wordWrap": "on"
}

View File

@ -422,7 +422,6 @@ export default {
object = await this.getObjectDetail(this.iUrl, this.actionId) object = await this.getObjectDetail(this.iUrl, this.actionId)
} }
} }
console.log('Object 2: ', object)
if (object) { if (object) {
object = _.cloneDeep(object) object = _.cloneDeep(object)
this.$emit('update:object', object) this.$emit('update:object', object)
@ -431,9 +430,11 @@ export default {
return object return object
}, },
async getObjectDetail(url, id) { async getObjectDetail(url, id) {
if (!id) {
return
}
this.$log.debug('Get object detail: ', url) this.$log.debug('Get object detail: ', url)
let data = await this.$axios.get(url, { params: { id }}) let data = await this.$axios.get(url, { params: { id }})
console.log('Is array: ', Array.isArray(data))
if (Array.isArray(data)) { if (Array.isArray(data)) {
data = {} data = {}
} }

View File

@ -2,7 +2,6 @@ import i18n from '@/i18n/i18n'
import empty from '@/layout/empty' import empty from '@/layout/empty'
import XPackRoutes from './xpack' import XPackRoutes from './xpack'
const globalSubmenu = () => import('@/layout/globalOrg.vue')
export default [ export default [
{ {
path: 'assets', path: 'assets',
@ -292,45 +291,6 @@ export default [
} }
] ]
}, },
{
path: 'platforms',
component: globalSubmenu,
meta: {
permissions: ['assets.view_platform'],
resource: 'platform',
icon: 'platform',
disableOrgsChange: true
},
redirect: '',
children: [
{
path: '',
name: 'PlatformList',
component: () => import('@/views/assets/Platform/PlatformList'),
meta: { title: i18n.t('PlatformList') }
},
{
path: 'create',
component: () => import('@/views/assets/Platform/PlatformCreateUpdate.vue'), // Parent router-view
name: 'PlatformCreate',
hidden: true,
meta: { title: i18n.t('PlatformCreate') }
},
{
path: ':id/update',
component: () => import('@/views/assets/Platform/PlatformCreateUpdate.vue'), // Parent router-view
name: 'PlatformUpdate',
hidden: true,
meta: { title: i18n.t('PlatformUpdate'), permissions: [] }
},
{
path: ':id',
component: () => import('@/views/assets/Platform/PlatformDetail'), // Parent router-view
name: 'PlatformDetail',
hidden: true,
meta: { title: i18n.t('PlatformDetail') }
}
]
},
...XPackRoutes ...XPackRoutes
] ]

View File

@ -1,8 +1,6 @@
import i18n from '@/i18n/i18n' import i18n from '@/i18n/i18n'
import empty from '@/layout/empty' import empty from '@/layout/empty'
const globalSubmenu = () => import('@/layout/globalOrg.vue')
export default [ export default [
{ {
path: 'users', path: 'users',
@ -91,64 +89,5 @@ export default [
meta: { title: i18n.t('UserGroupDetail') } meta: { title: i18n.t('UserGroupDetail') }
} }
] ]
},
{
path: 'roles',
component: globalSubmenu,
redirect: '',
meta: {
permissions: ['rbac.view_orgrole | rbac.view_systemrole'],
app: 'rbac',
disableOrgsChange: true,
licenseRequired: true,
icon: 'role'
},
children: [
{
path: '',
component: () => import('@/views/users/Role/RoleList/index'),
name: 'RoleList',
meta: {
title: i18n.t('RoleList'),
app: 'rbac',
permissions: ['rbac.view_orgrole | rbac.view_systemrole']
}
},
{
path: 'create',
component: () => import('@/views/users/Role/RoleCreateUpdate'),
name: 'RoleCreate',
hidden: true,
meta: {
title: i18n.t('RoleCreate'),
permissions: [],
app: 'rbac',
resource: 'role'
}
},
{
path: ':id/update',
component: () => import('@/views/users/Role/RoleCreateUpdate'),
name: 'RoleUpdate',
hidden: true,
meta: {
title: i18n.t('RoleUpdate'),
app: 'rbac',
permissions: []
}
},
{
path: ':id',
component: () => import('@/views/users/Role/RoleDetail/index'),
name: 'RoleDetail',
hidden: true,
meta: {
title: i18n.t('RoleDetail'),
app: 'rbac',
resource: 'role',
permissions: []
}
}
]
} }
] ]

View File

@ -2,6 +2,7 @@ import i18n from '@/i18n/i18n'
import empty from '@/layout/empty' import empty from '@/layout/empty'
const Setting = () => import('@/views/settings/index') const Setting = () => import('@/views/settings/index')
const globalSubmenu = () => import('@/layout/globalOrg.vue')
export default { export default {
path: '/settings', path: '/settings',
@ -86,6 +87,106 @@ export default {
} }
] ]
}, },
{
path: '/settings/roles',
component: globalSubmenu,
redirect: '',
meta: {
permissions: ['rbac.view_orgrole | rbac.view_systemrole'],
app: 'rbac',
disableOrgsChange: true,
licenseRequired: true,
icon: 'role'
},
children: [
{
path: '',
component: () => import('@/views/users/Role/RoleList/index'),
name: 'RoleList',
meta: {
title: i18n.t('RoleList'),
app: 'rbac',
permissions: ['rbac.view_orgrole | rbac.view_systemrole']
}
},
{
path: 'create',
component: () => import('@/views/users/Role/RoleCreateUpdate'),
name: 'RoleCreate',
hidden: true,
meta: {
title: i18n.t('RoleCreate'),
permissions: [],
app: 'rbac',
resource: 'role'
}
},
{
path: ':id/update',
component: () => import('@/views/users/Role/RoleCreateUpdate'),
name: 'RoleUpdate',
hidden: true,
meta: {
title: i18n.t('RoleUpdate'),
app: 'rbac',
permissions: []
}
},
{
path: ':id',
component: () => import('@/views/users/Role/RoleDetail/index'),
name: 'RoleDetail',
hidden: true,
meta: {
title: i18n.t('RoleDetail'),
app: 'rbac',
resource: 'role',
permissions: []
}
}
]
},
{
path: '/settings/platforms',
component: globalSubmenu,
meta: {
permissions: ['assets.view_platform'],
resource: 'platform',
icon: 'platform',
app: 'assets',
disableOrgsChange: true
},
redirect: '',
children: [
{
path: '',
name: 'PlatformList',
component: () => import('@/views/assets/Platform/PlatformList'),
meta: { title: i18n.t('PlatformList'), permissions: ['assets.view_platform'] }
},
{
path: 'create',
component: () => import('@/views/assets/Platform/PlatformCreateUpdate.vue'), // Parent router-view
name: 'PlatformCreate',
hidden: true,
meta: { title: i18n.t('PlatformCreate') }
},
{
path: ':id/update',
component: () => import('@/views/assets/Platform/PlatformCreateUpdate.vue'), // Parent router-view
name: 'PlatformUpdate',
hidden: true,
meta: { title: i18n.t('PlatformUpdate'), permissions: [] }
},
{
path: ':id',
component: () => import('@/views/assets/Platform/PlatformDetail'), // Parent router-view
name: 'PlatformDetail',
hidden: true,
meta: { title: i18n.t('PlatformDetail') }
}
]
},
{ {
path: '/settings/notification', path: '/settings/notification',
name: 'Msg', name: 'Msg',

View File

@ -1,7 +1,11 @@
<template> <template>
<span> <span>
<span v-if="iValue === '0'" class="risk-handler"> <span v-if="iValue === '0'" class="risk-handler">
<el-dropdown trigger="click" @command="handleDropdown" @visible-change="handleVisibleChange"> <el-dropdown
trigger="click"
@command="handleDropdown"
@visible-change="handleVisibleChange"
>
<el-button class="confirm action" size="mini"> <el-button class="confirm action" size="mini">
<i class="fa fa-check" /> <i class="fa fa-check" />
</el-button> </el-button>
@ -17,12 +21,21 @@
</el-dropdown-menu> </el-dropdown-menu>
</el-dropdown> </el-dropdown>
<el-tooltip :content="$tc('IgnoreAlert')" :open-delay="400"> <el-tooltip :content="$tc('IgnoreAlert')" :open-delay="400">
<el-button class="ignore action" size="mini" @click="handleDropdown('ignore')"> <el-button
class="ignore action"
size="mini"
@click="handleDropdown('ignore')"
>
<svg-icon icon-class="ignore" /> <svg-icon icon-class="ignore" />
</el-button> </el-button>
</el-tooltip> </el-tooltip>
</span> </span>
<el-tooltip v-else :content="iLabel" :open-delay="400" class="platform-status"> <el-tooltip
v-else
:content="iLabel"
:open-delay="400"
class="platform-status"
>
<el-button size="mini" type="text" @click="showDetail"> <el-button size="mini" type="text" @click="showDetail">
<span class="detail-icon"> <span class="detail-icon">
<i v-if="iValue === '1'" class="fa fa-check-circle color-primary" /> <i v-if="iValue === '1'" class="fa fa-check-circle color-primary" />
@ -41,11 +54,11 @@
</span> </span>
</template> </template>
<script> <script>
import BaseFormatter from '@/components/Table/TableFormatters/base.vue'
import ReviewDraw from '@/views/pam/RiskDetect/RiskHandlerFormatter/ReviewDrawer.vue'
import ProcessingDialog from '@/components/Dialog/ProcessingDialog.vue' import ProcessingDialog from '@/components/Dialog/ProcessingDialog.vue'
import { riskActions } from './const' import BaseFormatter from '@/components/Table/TableFormatters/base.vue'
import { sleep } from '@/utils/time' import { sleep } from '@/utils/time'
import ReviewDraw from '@/views/pam/RiskDetect/RiskHandlerFormatter/ReviewDrawer.vue'
import { riskActions } from './const'
export default { export default {
name: 'RiskSummaryFormatter', name: 'RiskSummaryFormatter',
@ -74,7 +87,10 @@ export default {
account: {}, account: {},
secretUrl: '', secretUrl: '',
actions: [], actions: [],
formatterArgs: Object.assign(this.formatterArgsDefault, this.col.formatterArgs) formatterArgs: Object.assign(
this.formatterArgsDefault,
this.col.formatterArgs
)
} }
}, },
computed: { computed: {
@ -135,7 +151,10 @@ export default {
row.status = { value: '3', label: this.$t('Processing') } row.status = { value: '3', label: this.$t('Processing') }
let risk = {} let risk = {}
try { try {
risk = await this.$axios.post(`/api/v1/accounts/account-risks/handle/`, data) risk = await this.$axios.post(
`/api/v1/accounts/account-risks/handle/`,
data
)
} catch (e) { } catch (e) {
row.status = { value: '4', label: this.$t('Failed') } row.status = { value: '4', label: this.$t('Failed') }
this.$emit('processDone', { index: i, row }) this.$emit('processDone', { index: i, row })
@ -206,7 +225,7 @@ export default {
} }
</script> </script>
<style lang='scss' scoped> <style lang="scss" scoped>
.action.el-button--mini { .action.el-button--mini {
cursor: pointer; cursor: pointer;
padding: 1px 4px; padding: 1px 4px;
@ -236,5 +255,4 @@ export default {
padding: 20px; padding: 20px;
font-size: 13px; font-size: 13px;
} }
</style> </style>

View File

@ -17,8 +17,15 @@ export default {
tableConfig: { tableConfig: {
url: '/api/v1/ops/tasks/', url: '/api/v1/ops/tasks/',
columns: [ columns: [
'name', 'queue', 'count', 'state', 'date_last_publish', 'exec_cycle', 'next_exec_time', 'enabled' 'name', 'queue', 'count', 'state', 'date_last_publish',
'exec_cycle', 'next_exec_time', 'enabled'
], ],
columnsShow: {
default: [
'name', 'count', 'state', 'date_last_publish',
'exec_cycle', 'next_exec_time', 'enabled'
]
},
columnsMeta: { columnsMeta: {
name: { name: {
formatter: DetailFormatter, formatter: DetailFormatter,
@ -69,8 +76,8 @@ export default {
label: `${this.$t('Success')}/${this.$t('Total')}`, label: `${this.$t('Success')}/${this.$t('Total')}`,
formatter: (row) => { formatter: (row) => {
return <div> return <div>
<span Class='text-primary'>{row.summary.success}</span>/ <span Class='text-primary'>{row.summary.success || 0}</span>/
<span>{row.summary.total}</span> <span>{row.summary.total || 0}</span>
</div> </div>
} }
}, },
@ -107,7 +114,7 @@ export default {
}, },
enabled: { enabled: {
width: '120px', width: '120px',
label: `${this.$t('Enable')}/${this.$t('Disable')}`, label: `${this.$t('Enable')}`,
formatter: SwitchFormatter, formatter: SwitchFormatter,
formatterArgs: { formatterArgs: {
isDisplay(row) { isDisplay(row) {

View File

@ -21,6 +21,7 @@ export default {
return { return {
group: { name: '', comment: '', users: [] }, group: { name: '', comment: '', users: [] },
config: { config: {
url: '/api/v1/users/groups/',
activeMenu: 'GroupInfo', activeMenu: 'GroupInfo',
submenu: [ submenu: [
{ {

View File

@ -1,10 +1,17 @@
<template> <template>
<GenericListPage ref="listPage" :header-actions="headerActions" :table-config="tableConfig" /> <GenericListPage
ref="listPage"
:create-drawer="createDrawer"
:detail-drawer="detailDrawer"
:header-actions="headerActions"
:resource="$t('Group')"
:table-config="tableConfig"
/>
</template> </template>
<script> <script>
import { GenericListPage } from '@/layout///components'
import AmountFormatter from '@/components/Table/TableFormatters/AmountFormatter.vue' import AmountFormatter from '@/components/Table/TableFormatters/AmountFormatter.vue'
import { GenericListPage } from '@/layout/components'
export default { export default {
components: { components: {
@ -12,6 +19,8 @@ export default {
}, },
data() { data() {
return { return {
createDrawer: () => import('./UserGroupCreateUpdate.vue'),
detailDrawer: () => import('./UserGroupDetail/index.vue'),
tableConfig: { tableConfig: {
url: '/api/v1/users/groups/', url: '/api/v1/users/groups/',
columns: ['name', 'users_amount', 'comment', 'actions'], columns: ['name', 'users_amount', 'comment', 'actions'],
@ -26,17 +35,6 @@ export default {
async: true, async: true,
getItem(item) { getItem(item) {
return item.is_service_account ? null : item.name return item.is_service_account ? null : item.name
},
getRoute({ row }) {
return {
name: 'UserGroupDetail',
params: {
id: row.id
},
query: {
tab: 'GroupUser'
}
}
} }
} }
} }

View File

@ -1,6 +1,6 @@
<template> <template>
<div> <div>
<GenericListDrawerPage <GenericListPage
ref="GenericListPage" ref="GenericListPage"
:header-actions="headerActions" :header-actions="headerActions"
:quick-filters="quickFilters" :quick-filters="quickFilters"
@ -13,23 +13,25 @@
:visible.sync="updateSelectedDialogSetting.visible" :visible.sync="updateSelectedDialogSetting.visible"
@update="handleDialogUpdate" @update="handleDialogUpdate"
/> />
<InviteUsersDialog :setting="InviteDialogSetting" @close="handleInviteDialogClose" /> <InviteUsersDialog
:setting="InviteDialogSetting"
@close="handleInviteDialogClose"
/>
</div> </div>
</template> </template>
<script> <script>
import { mapGetters } from 'vuex'
import { GenericUpdateFormDialog } from '@/layout/components'
import GenericListDrawerPage from '@/layout/components/GenericListDrawerPage/index.vue'
import { createSourceIdCache } from '@/api/common' import { createSourceIdCache } from '@/api/common'
import { GenericListPage, GenericUpdateFormDialog } from '@/layout/components'
import AmountFormatter from '@/components/Table/TableFormatters/AmountFormatter.vue'
import { mapGetters } from 'vuex'
import { getDayFuture } from '@/utils/time' import { getDayFuture } from '@/utils/time'
import InviteUsersDialog from './components/InviteUsersDialog' import InviteUsersDialog from './components/InviteUsersDialog'
import AmountFormatter from '@/components/Table/TableFormatters/AmountFormatter.vue'
export default { export default {
components: { components: {
InviteUsersDialog, InviteUsersDialog,
GenericListDrawerPage, GenericListPage,
GenericUpdateFormDialog GenericUpdateFormDialog
}, },
data() { data() {
@ -79,7 +81,6 @@ export default {
} }
] ]
} }
], ],
tableConfig: { tableConfig: {
url: '/api/v1/users/users/', url: '/api/v1/users/users/',
@ -233,6 +234,17 @@ export default {
callback: () => { callback: () => {
this.InviteDialogSetting.InviteDialogVisible = true this.InviteDialogSetting.InviteDialogVisible = true
} }
},
{
name: this.$t('Roles'),
title: this.$t('Roles'),
has: () => {
return this.publicSettings.XPACK_LICENSE_IS_VALID &&
this.$hasPerm(['rbac.view_orgrole | rbac.view_systemrole'],)
},
callback: () => {
this.$router.push({ name: 'RoleList' })
}
} }
], ],
hasBulkUpdate: true, hasBulkUpdate: true,