Merge pull request #753 from jumpserver/dev

v2.9.0 发版
This commit is contained in:
Jiangjie.Bai 2021-04-15 21:05:14 +08:00 committed by GitHub
commit d8566d2f9e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 294 additions and 535 deletions

View File

@ -2,6 +2,7 @@ import Vue from 'vue'
import Select2 from '@/components/Select2' import Select2 from '@/components/Select2'
import NestedField from '@/components/AutoDataForm/components/NestedField' import NestedField from '@/components/AutoDataForm/components/NestedField'
import rules from '@/components/DataForm/rules' import rules from '@/components/DataForm/rules'
import { assignIfNot } from '@/utils/common'
export class FormFieldGenerator { export class FormFieldGenerator {
constructor() { constructor() {
@ -109,19 +110,21 @@ export class FormFieldGenerator {
return field return field
} }
generateField(name, fieldsMeta, remoteFieldsMeta) { generateField(name, fieldsMeta, remoteFieldsMeta) {
let field = { id: name, prop: name, el: {}, attrs: {}} let field = { id: name, prop: name, el: {}, attrs: {}, rules: [] }
const remoteFieldMeta = remoteFieldsMeta[name] || {} const remoteFieldMeta = remoteFieldsMeta[name] || {}
Vue.$log.debug('FieldsMeta: ', fieldsMeta, name)
const fieldMeta = fieldsMeta[name] || {} const fieldMeta = fieldsMeta[name] || {}
Vue.$log.debug('FieldMeta is: ', fieldMeta)
field.label = remoteFieldMeta.label field.label = remoteFieldMeta.label
field.helpText = remoteFieldMeta.help_text field.helpText = remoteFieldMeta.help_text
field = this.generateFieldByType(remoteFieldMeta.type, field, fieldMeta, remoteFieldMeta) field = this.generateFieldByType(remoteFieldMeta.type, field, fieldMeta, remoteFieldMeta)
field = this.generateFieldByName(name, field) field = this.generateFieldByName(name, field)
field = this.generateFieldByOther(field, fieldMeta, remoteFieldMeta) field = this.generateFieldByOther(field, fieldMeta, remoteFieldMeta)
const el = Object.assign(field.el || {}, fieldMeta.el || {}) const el = assignIfNot(fieldMeta.el || {}, field.el)
field = Object.assign(field, fieldMeta || {}, { el: el }) const rules = fieldMeta.rules || field.rules
field = Object.assign(field, fieldMeta)
field.el = el
field.rules = rules
_.set(field, 'attrs.error', '') _.set(field, 'attrs.error', '')
Vue.$log.debug('Generate field: ', name, field)
return field return field
} }
generateFieldGroup(field, fieldsMeta, remoteFieldsMeta) { generateFieldGroup(field, fieldsMeta, remoteFieldsMeta) {

View File

@ -78,6 +78,10 @@ export default {
$('body').unbind('mousedown') $('body').unbind('mousedown')
}, },
methods: { methods: {
refreshTree: function() {
const refreshIconRef = $('#tree-refresh')
refreshIconRef.click()
},
editTreeNode: function() { editTreeNode: function() {
this.hideRMenu() this.hideRMenu()
const currentNode = this.zTree.getSelectedNodes()[0] const currentNode = this.zTree.getSelectedNodes()[0]
@ -100,15 +104,19 @@ export default {
if (this.setting.url.indexOf('?') !== -1) { if (this.setting.url.indexOf('?') !== -1) {
combinator = '&' combinator = '&'
} }
let url = ''
const query = Object.assign({}, this.$route.query)
if (treeNode.meta.type === 'node') { if (treeNode.meta.type === 'node') {
this.currentNode = treeNode this.currentNode = treeNode
this.currentNodeId = treeNode.meta.node.id this.currentNodeId = treeNode.meta.node.id
this.$route.query['node'] = this.currentNodeId query['node'] = this.currentNodeId
this.$emit('urlChange', `${this.setting.url}${combinator}node_id=${treeNode.meta.node.id}&show_current_asset=${show_current_asset}`) url = `${this.setting.url}${combinator}node_id=${treeNode.meta.node.id}&show_current_asset=${show_current_asset}`
} else if (treeNode.meta.type === 'asset') { } else if (treeNode.meta.type === 'asset') {
this.$route.query['asset'] = treeNode.meta.asset.id query['asset'] = treeNode.meta.asset.id
this.$emit('urlChange', `${this.setting.url}${combinator}asset_id=${treeNode.meta.asset.id}&show_current_asset=${show_current_asset}`) url = `${this.setting.url}${combinator}asset_id=${treeNode.meta.asset.id}&show_current_asset=${show_current_asset}`
} }
this.$router.push({ query })
this.$emit('urlChange', url)
}, },
removeTreeNode: function() { removeTreeNode: function() {
this.hideRMenu() this.hideRMenu()
@ -121,6 +129,7 @@ export default {
).then(() => { ).then(() => {
this.$message.success(this.$t('common.deleteSuccessMsg')) this.$message.success(this.$t('common.deleteSuccessMsg'))
this.zTree.removeNode(currentNode) this.zTree.removeNode(currentNode)
this.refreshTree()
}).catch(() => { }).catch(() => {
// this.$message.error(this.$t('common.deleteErrorMsg') + ' ' + error) // this.$message.error(this.$t('common.deleteErrorMsg') + ' ' + error)
}) })
@ -141,7 +150,7 @@ export default {
treeNode.name = treeNode.name + ' (' + assetsAmount + ')' treeNode.name = treeNode.name + ' (' + assetsAmount + ')'
this.zTree.updateNode(treeNode) this.zTree.updateNode(treeNode)
this.$message.success(this.$t('common.updateSuccessMsg')) this.$message.success(this.$t('common.updateSuccessMsg'))
}) }).finally(() => { this.refreshTree() })
}, },
onBodyMouseDown: function(event) { onBodyMouseDown: function(event) {
const rMenuID = this.$refs.dataztree.$refs.ztree.iRMenuID const rMenuID = this.$refs.dataztree.$refs.ztree.iRMenuID
@ -210,7 +219,7 @@ export default {
this.$message.success(this.$t('common.updateSuccessMsg')) this.$message.success(this.$t('common.updateSuccessMsg'))
}).catch(error => { }).catch(error => {
this.$message.error(this.$t('common.updateErrorMsg' + ' ' + error)) this.$message.error(this.$t('common.updateErrorMsg' + ' ' + error))
}) }).finally(() => this.refreshTree())
}, },
createTreeNode: function() { createTreeNode: function() {
this.hideRMenu() this.hideRMenu()
@ -242,7 +251,6 @@ export default {
}) })
}, },
refresh: function() { refresh: function() {
}, },
getSelectedNodes: function() { getSelectedNodes: function() {
return this.zTree.getSelectedNodes() return this.zTree.getSelectedNodes()

View File

@ -72,7 +72,6 @@ export default {
watch: { watch: {
treeConfig: { treeConfig: {
handler(val) { handler(val) {
}, },
deep: true deep: true
} }

View File

@ -1,3 +1,5 @@
const _ = require('lodash')
function getTimeUnits(u) { function getTimeUnits(u) {
const units = { const units = {
'd': '天', 'd': '天',
@ -200,6 +202,12 @@ export function sleep(time) {
return new Promise((resolve) => setTimeout(resolve, time)) return new Promise((resolve) => setTimeout(resolve, time))
} }
function customizer(objValue, srcValue) {
return _.isUndefined(objValue) ? srcValue : objValue
}
export const assignIfNot = _.partialRight(_.assignInWith, customizer)
const scheme = document.location.protocol const scheme = document.location.protocol
const port = document.location.port ? ':' + document.location.port : '' const port = document.location.port ? ':' + document.location.port : ''
const BASE_URL = scheme + '//' + document.location.hostname + port const BASE_URL = scheme + '//' + document.location.hostname + port

View File

@ -4,13 +4,13 @@
<script> <script>
import GenericCreateUpdatePage from '@/layout/components/GenericCreateUpdatePage' import GenericCreateUpdatePage from '@/layout/components/GenericCreateUpdatePage'
import UploadKey from '@/components/UploadKey' import getFields from './fields'
import { Required } from '@/components/DataForm/rules'
export default { export default {
name: 'SystemUserCreateUpdate', name: 'SystemUserCreateUpdate',
components: { GenericCreateUpdatePage }, components: { GenericCreateUpdatePage },
data() { data() {
const fields = getFields.bind(this)()
return { return {
initial: { initial: {
login_mode: 'auto', login_mode: 'auto',
@ -25,120 +25,15 @@ export default {
[this.$t('common.Other'), ['comment']] [this.$t('common.Other'), ['comment']]
], ],
fieldsMeta: { fieldsMeta: {
login_mode: { login_mode: fields.login_mode,
helpText: this.$t('assets.LoginModeHelpMessage'), username: fields.username,
hidden: (form) => { private_key: fields.private_key,
if (form.protocol === 'k8s') { username_same_with_user: fields.username_same_with_user,
return true protocol: fields.protocol,
} update_password: fields.update_password,
password: fields.password
}, },
on: { url: '/api/v1/assets/system-users/'
input: ([value], updateForm) => {
if (value === 'manual') {
updateForm({ auto_push: false })
updateForm({ auto_generate_key: false })
}
}
}
},
username: {
el: {
disabled: false
},
rules: [Required],
hidden: (form) => {
if (form.login_mode === 'auto') {
this.fieldsMeta.username.rules = [Required]
} else {
this.fieldsMeta.username.rules[0].required = false
}
if (!form.username_same_with_user) {
this.fieldsMeta.username.rules = [Required]
} else {
this.fieldsMeta.username.rules[0].required = false
}
if (['mysql', 'postgresql', 'mariadb', 'oracle'].indexOf(form.protocol) !== -1) {
this.fieldsMeta.username.rules = [Required]
this.fieldsMeta.username.rules[0].required = true
}
}
},
private_key: {
component: UploadKey,
hidden: (form) => {
if (form.login_mode !== 'auto') {
return true
}
if (form.protocol === 'k8s') {
return true
}
return form.auto_generate_key === true
}
},
username_same_with_user: {
type: 'switch',
helpText: this.$t('assets.UsernameHelpMessage'),
hidden: (form) => {
this.fieldsMeta.username.el.disabled = form.username_same_with_user
return form.protocol === 'k8s'
},
el: {
disabled: false
}
},
protocol: {
rules: [Required],
el: {
disabled: true,
style: 'width:100%'
},
on: {
input: ([value], updateForm) => {
if (['ssh', 'rdp'].indexOf(value) === -1) {
updateForm({ auto_push: false })
updateForm({ auto_generate_key: false })
}
}
}
},
update_password: {
label: this.$t('users.UpdatePassword'),
type: 'checkbox',
hidden: (formValue) => {
if (formValue.update_password || formValue.protocol === 'k8s') {
return true
}
if (formValue.login_mode === 'manual') {
return true
}
return !this.$route.params.id
}
},
password: {
helpText: this.$t('assets.PasswordHelpMessage'),
hidden: form => {
if (form.login_mode !== 'auto' || form.protocol === 'k8s' || form.auto_generate_key) {
return true
}
if (!this.$route.params.id) {
return false
}
return !form.update_password
}
}
},
url: '/api/v1/assets/system-users/',
authHiden: false
}
},
method: {
},
mounted() {
const params = this.$route.params
const method = params.id ? 'update' : 'create'
if (method === 'update') {
this.fieldsMeta.username_same_with_user.el.disabled = true
} }
} }
} }

View File

@ -0,0 +1,179 @@
import { Required } from '@/components/DataForm/rules'
import UploadKey from '@/components/UploadKey'
import i18n from '@/i18n/i18n'
import { Select2 } from '@/components'
function getFields() {
const login_mode = {
helpText: i18n.t('assets.LoginModeHelpMessage'),
on: {
input: ([value], updateForm) => {
if (value === 'manual') {
updateForm({ auto_push: false })
updateForm({ auto_generate_key: false })
}
}
}
}
const username = {
el: {
disabled: false
},
on: {
input: ([value], updateForm) => {
updateForm({ home: `/home/${value}` })
}
},
rules: [Object.assign({}, Required)],
hidden: (form) => {
if (form.login_mode === 'manual' || form.username_same_with_user) {
this.fieldsMeta.username.rules[0].required = false
} else {
this.fieldsMeta.username.rules[0].required = true
}
if (form.username_same_with_user) {
this.fieldsMeta.username.el.disabled = true
} else {
this.fieldsMeta.username.el.disabled = false
}
}
}
const private_key = {
component: UploadKey,
hidden: (form) => {
if (form.login_mode !== 'auto') {
return true
}
return form.auto_generate_key === true
}
}
const username_same_with_user = {
type: 'switch',
helpText: this.$t('assets.UsernameHelpMessage'),
el: {
disabled: false
},
hidden: form => {
const params = this.$route.params
const method = params.id ? 'update' : 'create'
if (method === 'update') {
this.fieldsMeta.username_same_with_user.el.disabled = true
}
}
}
const auto_generate_key = {
type: 'switch',
label: this.$t('assets.AutoGenerateKey'),
hidden: form => {
if (JSON.stringify(this.$route.params) !== '{}') {
return true
}
if (form.protocol === 'k8s') {
return true
}
if (form.login_mode === 'manual') {
this.fieldsMeta.auto_generate_key.el.disabled = true
} else {
this.fieldsMeta.auto_generate_key.el.disabled = false
}
},
el: {
disabled: false
}
}
const protocol = {
rules: [Required],
el: {
style: 'width:100%',
disabled: true
}
}
const cmd_filters = {
component: Select2,
el: {
multiple: true,
value: [],
ajax: {
url: '/api/v1/assets/cmd-filters/'
}
}
}
const auto_push = {
type: 'switch',
el: {
disabled: false
},
hidden: form => {
if (form.login_mode === 'manual') {
this.fieldsMeta.auto_push.el.disabled = true
} else {
this.fieldsMeta.auto_push.el.disabled = false
}
},
on: {
input: ([value], updateForm) => {
if (!value) {
updateForm({ auto_generate_key: value })
}
}
}
}
const update_password = {
label: this.$t('users.UpdatePassword'),
type: 'checkbox',
hidden: (formValue) => {
if (formValue.update_password) {
return true
}
if (formValue.login_mode === 'manual') {
return true
}
return !this.$route.params.id
}
}
const password = {
helpText: this.$t('assets.PasswordHelpMessage'),
hidden: form => {
if (form.login_mode !== 'auto' || form.auto_generate_key) {
return true
}
if (!this.$route.params.id) {
return false
}
return !form.update_password
}
}
const system_groups = {
label: this.$t('assets.LinuxUserAffiliateGroup'),
hidden: (item) => !item.auto_push || item.username_same_with_user,
helpText: this.$t('assets.GroupsHelpMessage')
}
return {
login_mode: login_mode,
username: username,
private_key: private_key,
username_same_with_user: username_same_with_user,
auto_generate_key: auto_generate_key,
protocol: protocol,
cmd_filters: cmd_filters,
auto_push: auto_push,
update_password: update_password,
password: password,
system_groups: system_groups
}
}
export default getFields

View File

@ -26,10 +26,17 @@ export default {
], ],
fieldsMeta: { fieldsMeta: {
token: { token: {
rules: [Required], rules: [Object.assign({}, Required)],
el: { el: {
type: 'textarea', type: 'textarea',
autosize: { minRows: 3 } autosize: { minRows: 3 }
},
hidden: form => {
const params = this.$route.params
const method = params.id ? 'update' : 'create'
if (method === 'update') {
this.fieldsMeta.token.rules[0].required = false
}
} }
}, },
protocol: { protocol: {
@ -40,18 +47,7 @@ export default {
} }
} }
}, },
url: '/api/v1/assets/system-users/', url: '/api/v1/assets/system-users/'
authHiden: false
}
},
method: {
},
mounted() {
const params = this.$route.params
const method = params.id ? 'update' : 'create'
if (method === 'update') {
this.fieldsMeta.token.rules[0].required = false
} }
} }
} }

View File

@ -4,12 +4,13 @@
<script> <script>
import GenericCreateUpdatePage from '@/layout/components/GenericCreateUpdatePage' import GenericCreateUpdatePage from '@/layout/components/GenericCreateUpdatePage'
import { Required } from '@/components/DataForm/rules' import getFields from './fields'
export default { export default {
name: 'SystemUserCreateUpdate', name: 'SystemUserCreateUpdate',
components: { GenericCreateUpdatePage }, components: { GenericCreateUpdatePage },
data() { data() {
const fields = getFields.bind(this)()
return { return {
initial: { initial: {
login_mode: 'auto', login_mode: 'auto',
@ -28,131 +29,23 @@ export default {
[this.$t('common.Other'), ['comment']] [this.$t('common.Other'), ['comment']]
], ],
fieldsMeta: { fieldsMeta: {
login_mode: { login_mode: fields.login_mode,
helpText: this.$t('assets.LoginModeHelpMessage'), username: fields.username,
hidden: (form) => { username_same_with_user: fields.username_same_with_user,
if (form.protocol === 'k8s') { auto_push: fields.auto_push,
return true protocol: fields.protocol,
}
},
on: {
input: ([value], updateForm) => {
if (value === 'manual') {
updateForm({ auto_push: false })
updateForm({ auto_generate_key: false })
}
}
}
},
username: {
el: {
disabled: false
},
rules: [Required],
hidden: (form) => {
if (form.login_mode === 'auto') {
this.fieldsMeta.username.rules = [Required]
} else {
this.fieldsMeta.username.rules[0].required = false
}
if (!form.username_same_with_user) {
this.fieldsMeta.username.rules = [Required]
} else {
this.fieldsMeta.username.rules[0].required = false
}
}
},
username_same_with_user: {
type: 'switch',
helpText: this.$t('assets.UsernameHelpMessage'),
hidden: (form) => {
this.fieldsMeta.username.el.disabled = form.username_same_with_user
return form.protocol === 'k8s'
},
el: {
disabled: false
}
},
auto_push: {
type: 'switch',
el: {
disabled: false
},
hidden: form => {
if (form.login_mode === 'manual') { this.fieldsMeta.auto_push.el.disabled = true }
},
on: {
input: ([value], updateForm) => {
if (!value) {
updateForm({ auto_generate_key: value })
}
}
}
},
protocol: {
rules: [Required],
el: {
style: 'width:100%',
disabled: true
},
on: {
input: ([value], updateForm) => {
if (['ssh', 'rdp'].indexOf(value) === -1) {
updateForm({ auto_push: false })
updateForm({ auto_generate_key: false })
}
}
}
},
ad_domain: { ad_domain: {
label: this.$t('assets.AdDomain'), label: this.$t('assets.AdDomain'),
hidden: (form) => ['rdp'].indexOf(form.protocol) === -1,
helpText: this.$t('assets.AdDomainHelpText') helpText: this.$t('assets.AdDomainHelpText')
}, },
update_password: { update_password: fields.update_password,
label: this.$t('users.UpdatePassword'), password: fields.password,
type: 'checkbox', system_groups: fields.system_groups
hidden: (formValue) => {
if (formValue.update_password || formValue.protocol === 'k8s') {
return true
}
if (formValue.login_mode === 'manual') {
return true
}
return !this.$route.params.id
}
}, },
password: { url: '/api/v1/assets/system-users/'
helpText: this.$t('assets.PasswordHelpMessage'),
hidden: form => {
if (form.login_mode !== 'auto' || form.protocol === 'k8s' || form.auto_generate_key) {
return true
}
if (!this.$route.params.id) {
return false
}
return !form.update_password
}
},
system_groups: {
label: this.$t('assets.LinuxUserAffiliateGroup'),
hidden: (item) => ['ssh', 'rdp'].indexOf(item.protocol) === -1 || !item.auto_push || item.username_same_with_user,
helpText: this.$t('assets.GroupsHelpMessage')
}
},
url: '/api/v1/assets/system-users/',
authHiden: false
} }
}, },
method: { method: {
},
mounted() {
const params = this.$route.params
const method = params.id ? 'update' : 'create'
if (method === 'update') {
this.fieldsMeta.username_same_with_user.el.disabled = true
}
} }
} }
</script> </script>

View File

@ -4,17 +4,14 @@
<script> <script>
import GenericCreateUpdatePage from '@/layout/components/GenericCreateUpdatePage' import GenericCreateUpdatePage from '@/layout/components/GenericCreateUpdatePage'
import UploadKey from '@/components/UploadKey'
import { Select2 } from '@/components'
import { Required } from '@/components/DataForm/rules' import { Required } from '@/components/DataForm/rules'
import getFields from './fields'
// const asciiProtocols = ['ssh', 'telnet', 'mysql']
const graphProtocols = ['vnc', 'rdp', 'k8s']
export default { export default {
name: 'SystemUserCreateUpdate', name: 'SystemUserCreateUpdate',
components: { GenericCreateUpdatePage }, components: { GenericCreateUpdatePage },
data() { data() {
const fields = getFields.bind(this)()
return { return {
initial: { initial: {
login_mode: 'auto', login_mode: 'auto',
@ -29,185 +26,30 @@ export default {
fields: [ fields: [
[this.$t('common.Basic'), ['name', 'login_mode', 'username', 'username_same_with_user', 'priority', 'protocol']], [this.$t('common.Basic'), ['name', 'login_mode', 'username', 'username_same_with_user', 'priority', 'protocol']],
[this.$t('assets.AutoPush'), ['auto_push', 'sudo', 'shell', 'home', 'system_groups']], [this.$t('assets.AutoPush'), ['auto_push', 'sudo', 'shell', 'home', 'system_groups']],
[this.$t('common.Auth'), ['auto_generate_key', 'update_password', 'password', 'private_key', 'token', 'ad_domain']], [this.$t('common.Auth'), ['auto_generate_key', 'update_password', 'password', 'private_key']],
[this.$t('common.Command filter'), ['cmd_filters']], [this.$t('common.Command filter'), ['cmd_filters']],
[this.$t('common.Other'), ['sftp_root', 'comment']] [this.$t('common.Other'), ['sftp_root', 'comment']]
], ],
fieldsMeta: { fieldsMeta: {
login_mode: { login_mode: fields.login_mode,
helpText: this.$t('assets.LoginModeHelpMessage'), username: fields.username,
hidden: (form) => { private_key: fields.private_key,
if (form.protocol === 'k8s') { username_same_with_user: fields.username_same_with_user,
return true auto_generate_key: fields.auto_generate_key,
} protocol: fields.protocol,
}, cmd_filters: fields.cmd_filters,
on: { auto_push: fields.auto_push,
input: ([value], updateForm) => {
if (value === 'manual') {
updateForm({ auto_push: false })
updateForm({ auto_generate_key: false })
}
}
}
},
username: {
el: {
disabled: false
},
on: {
input: ([value], updateForm) => {
updateForm({ home: `/home/${value}` })
}
},
rules: [Required],
hidden: (form) => {
if (form.login_mode === 'auto') {
this.fieldsMeta.username.rules = [Required]
} else {
this.fieldsMeta.username.rules[0].required = false
}
if (!form.username_same_with_user) {
this.fieldsMeta.username.rules = [Required]
} else {
this.fieldsMeta.username.rules[0].required = false
}
if (['mysql', 'postgresql', 'mariadb', 'oracle'].indexOf(form.protocol) !== -1) {
this.fieldsMeta.username.rules = [Required]
this.fieldsMeta.username.rules[0].required = true
}
}
},
private_key: {
component: UploadKey,
hidden: (form) => {
if (form.login_mode !== 'auto') {
return true
}
if (form.protocol === 'k8s') {
return true
}
return form.auto_generate_key === true
}
},
username_same_with_user: {
type: 'switch',
helpText: this.$t('assets.UsernameHelpMessage'),
hidden: (form) => {
this.fieldsMeta.username.el.disabled = form.username_same_with_user
return form.protocol === 'k8s'
},
el: {
disabled: false
}
},
auto_generate_key: {
type: 'switch',
label: this.$t('assets.AutoGenerateKey'),
hidden: form => {
this.fieldsMeta.auto_generate_key.el.disabled = ['ssh', 'rdp'].indexOf(form.protocol) === -1 || form.login_mode === 'manual'
if (JSON.stringify(this.$route.params) !== '{}') {
return true
}
if (form.protocol === 'k8s') {
return true
}
},
el: {
disabled: false
}
},
token: {
rules: [Required],
el: {
type: 'textarea',
autosize: { minRows: 3 }
},
hidden: form => {
return form.protocol !== 'k8s'
}
},
protocol: {
rules: [Required],
el: {
style: 'width:100%',
disabled: true
},
on: {
input: ([value], updateForm) => {
if (['ssh', 'rdp'].indexOf(value) === -1) {
updateForm({ auto_push: false })
updateForm({ auto_generate_key: false })
}
}
}
},
ad_domain: {
label: this.$t('assets.AdDomain'),
hidden: (form) => ['rdp'].indexOf(form.protocol) === -1,
helpText: this.$t('assets.AdDomainHelpText')
},
cmd_filters: {
component: Select2,
hidden: (form) => graphProtocols.indexOf(form.protocol) !== -1,
el: {
multiple: true,
value: [],
ajax: {
url: '/api/v1/assets/cmd-filters/'
}
}
},
auto_push: {
type: 'switch',
el: {
disabled: false
},
hidden: form => {
this.fieldsMeta.auto_push.el.disabled = ['ssh', 'rdp'].indexOf(form.protocol) === -1 || form.login_mode === 'manual'
},
on: {
input: ([value], updateForm) => {
if (!value) {
updateForm({ auto_generate_key: value })
}
}
}
},
sftp_root: { sftp_root: {
rules: [Required], rules: [Required],
helpText: this.$t('assets.SFTPHelpMessage'), helpText: this.$t('assets.SFTPHelpMessage')
hidden: (item) => item.protocol !== 'ssh'
}, },
sudo: { sudo: {
rules: [Required], rules: [Required],
helpText: this.$t('assets.SudoHelpMessage'), helpText: this.$t('assets.SudoHelpMessage'),
hidden: (item) => item.protocol !== 'ssh' || !item.auto_push hidden: (item) => item.protocol !== 'ssh' || !item.auto_push
}, },
update_password: { update_password: fields.update_password,
label: this.$t('users.UpdatePassword'), password: fields.password,
type: 'checkbox',
hidden: (formValue) => {
if (formValue.update_password || formValue.protocol === 'k8s') {
return true
}
if (formValue.login_mode === 'manual') {
return true
}
return !this.$route.params.id
}
},
password: {
helpText: this.$t('assets.PasswordHelpMessage'),
hidden: form => {
if (form.login_mode !== 'auto' || form.protocol === 'k8s' || form.auto_generate_key) {
return true
}
if (!this.$route.params.id) {
return false
}
return !form.update_password
}
},
shell: { shell: {
hidden: (item) => item.protocol !== 'ssh' || !item.auto_push, hidden: (item) => item.protocol !== 'ssh' || !item.auto_push,
rules: [Required] rules: [Required]
@ -217,25 +59,12 @@ export default {
hidden: (item) => item.protocol !== 'ssh' || !item.auto_push || item.username_same_with_user, hidden: (item) => item.protocol !== 'ssh' || !item.auto_push || item.username_same_with_user,
helpText: this.$t('assets.HomeHelpMessage') helpText: this.$t('assets.HomeHelpMessage')
}, },
system_groups: { system_groups: fields.system_groups
label: this.$t('assets.LinuxUserAffiliateGroup'),
hidden: (item) => ['ssh', 'rdp'].indexOf(item.protocol) === -1 || !item.auto_push || item.username_same_with_user,
helpText: this.$t('assets.GroupsHelpMessage')
}
}, },
url: '/api/v1/assets/system-users/', url: '/api/v1/assets/system-users/'
authHiden: false
} }
}, },
method: { method: {
},
mounted() {
const params = this.$route.params
const method = params.id ? 'update' : 'create'
if (method === 'update') {
this.fieldsMeta.username_same_with_user.el.disabled = true
}
} }
} }
</script> </script>

View File

@ -4,7 +4,7 @@
<script> <script>
import GenericCreateUpdatePage from '@/layout/components/GenericCreateUpdatePage' import GenericCreateUpdatePage from '@/layout/components/GenericCreateUpdatePage'
import { Required } from '@/components/DataForm/rules' import getFields from '@/views/assets/SystemUser/SystemUserCreate/fields'
// const asciiProtocols = ['ssh', 'telnet', 'mysql'] // const asciiProtocols = ['ssh', 'telnet', 'mysql']
@ -12,6 +12,7 @@ export default {
name: 'SystemUserCreateUpdate', name: 'SystemUserCreateUpdate',
components: { GenericCreateUpdatePage }, components: { GenericCreateUpdatePage },
data() { data() {
const fields = getFields.bind(this)()
return { return {
initial: { initial: {
login_mode: 'auto', login_mode: 'auto',
@ -24,90 +25,14 @@ export default {
[this.$t('common.Other'), ['comment']] [this.$t('common.Other'), ['comment']]
], ],
fieldsMeta: { fieldsMeta: {
login_mode: { login_mode: fields.login_mode,
helpText: this.$t('assets.LoginModeHelpMessage') username: fields.username,
username_same_with_user: fields.username_same_with_user,
protocol: fields.protocol,
update_password: fields.update_password,
password: fields.password
}, },
username: { url: '/api/v1/assets/system-users/'
el: {
disabled: false
},
rules: [Required],
hidden: (form) => {
if (form.login_mode === 'auto') {
this.fieldsMeta.username.rules = [Required]
} else {
this.fieldsMeta.username.rules[0].required = false
}
if (!form.username_same_with_user) {
this.fieldsMeta.username.rules = [Required]
} else {
this.fieldsMeta.username.rules[0].required = false
}
}
},
username_same_with_user: {
type: 'switch',
helpText: this.$t('assets.UsernameHelpMessage'),
hidden: (form) => {
this.fieldsMeta.username.el.disabled = form.username_same_with_user
},
el: {
disabled: false
}
},
protocol: {
rules: [Required],
el: {
disabled: true,
style: 'width:100%'
},
on: {
input: ([value], updateForm) => {
if (['ssh', 'rdp'].indexOf(value) === -1) {
updateForm({ auto_push: false })
updateForm({ auto_generate_key: false })
}
}
}
},
update_password: {
label: this.$t('users.UpdatePassword'),
type: 'checkbox',
hidden: (formValue) => {
if (formValue.update_password || formValue.protocol === 'k8s') {
return true
}
if (formValue.login_mode === 'manual') {
return true
}
return !this.$route.params.id
}
},
password: {
helpText: this.$t('assets.PasswordHelpMessage'),
hidden: form => {
if (form.login_mode !== 'auto' || form.protocol === 'k8s' || form.auto_generate_key) {
return true
}
if (!this.$route.params.id) {
return false
}
return !form.update_password
}
}
},
url: '/api/v1/assets/system-users/',
authHiden: false
}
},
method: {
},
mounted() {
const params = this.$route.params
const method = params.id ? 'update' : 'create'
if (method === 'update') {
this.fieldsMeta.username_same_with_user.el.disabled = true
} }
} }
} }

View File

@ -56,7 +56,7 @@ export default {
type: 'primary' type: 'primary'
}, },
body: { body: {
route: `/terminal/session`, route: { name: `SessionList`, params: { activeMenu: 'OnlineList' }},
count: this.counter.total_count_online_users, count: this.counter.total_count_online_users,
comment: 'Online users' comment: 'Online users'
} }
@ -68,7 +68,7 @@ export default {
type: 'danger' type: 'danger'
}, },
body: { body: {
route: `/terminal/session`, route: { name: `SessionList`, params: { activeMenu: 'OnlineList' }},
count: this.counter.total_count_online_sessions, count: this.counter.total_count_online_sessions,
comment: 'Online sessions' comment: 'Online sessions'
} }

View File

@ -108,7 +108,7 @@ export default {
hasLeftActions: false, hasLeftActions: false,
hasImport: false, hasImport: false,
hasDatePicker: true, hasDatePicker: true,
canExportSelected: false, canExportSelected: true,
datePicker: { datePicker: {
dateStart: dateFrom, dateStart: dateFrom,
dateEnd: dateTo dateEnd: dateTo

View File

@ -41,6 +41,17 @@ export default {
Title() { Title() {
return this.$t('route.Sessions') return this.$t('route.Sessions')
} }
},
mounted() {
const params = this.$route.params
switch (params.activeMenu) {
case 'OnlineList':
this.config.activeMenu = 'OnlineList'
break
case 'OfflineList':
this.config.activeMenu = 'OfflineList'
break
}
} }
} }
</script> </script>

View File

@ -3,6 +3,7 @@
<GenericCreateUpdateForm <GenericCreateUpdateForm
:fields="fields" :fields="fields"
:url="url" :url="url"
:perform-submit="performSubmit"
:get-method="getMethod" :get-method="getMethod"
:fields-meta="fieldsMeta" :fields-meta="fieldsMeta"
:more-buttons="moreButtons" :more-buttons="moreButtons"
@ -92,8 +93,20 @@ export default {
methods: { methods: {
getMethod() { getMethod() {
return 'put' return 'put'
},
performSubmit(validValues) {
Object.keys(validValues).forEach(
function(key) {
if (validValues[key] === null) {
delete validValues[key]
} }
} }
)
return this.$axios['put'](`/api/v1/settings/setting/?category=email`, validValues)
}
}
} }
</script> </script>

View File

@ -164,7 +164,7 @@ export default {
{ {
name: 'updateSelected', name: 'updateSelected',
title: this.$t('common.updateSelected'), title: this.$t('common.updateSelected'),
can: ({ selectedRows }) => selectedRows.length > 0 && vm.currentOrgIsRoot, can: ({ selectedRows }) => selectedRows.length > 0 && !vm.currentOrgIsRoot,
callback: ({ selectedRows, reloadTable }) => { callback: ({ selectedRows, reloadTable }) => {
vm.updateSelectedDialogSetting.dialogSetting.dialogVisible = true vm.updateSelectedDialogSetting.dialogSetting.dialogVisible = true
vm.updateSelectedDialogSetting.selectedRows = selectedRows vm.updateSelectedDialogSetting.selectedRows = selectedRows

View File

@ -119,7 +119,7 @@ export default {
// //
if (params.id) { if (params.id) {
const form = await this.$refs.createUpdatePage.$refs.createUpdateForm.getFormValue() const form = await this.$refs.createUpdatePage.$refs.createUpdateForm.getFormValue()
this.fieldsMeta.regions.el.ajax.url = `/api/v1/xpack/cloud/regions/?account_id=${form.account}` this.fieldsMeta.regions.el.ajax.url = form.account ? `/api/v1/xpack/cloud/regions/?account_id=${form.account}` : `/api/v1/xpack/cloud/regions/`
} }
} }
} }