diff --git a/package.json b/package.json index 617ce96ed..bb5f32208 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,7 @@ "vue-cookie": "^1.1.4", "vue-echarts": "^5.0.0-beta.0", "vue-i18n": "^8.15.5", + "vue-json-editor": "^1.4.3", "vue-moment": "^4.1.0", "vue-password-strength-meter": "^1.7.2", "vue-router": "3.0.6", diff --git a/src/components/FormFields/JsonEditor.vue b/src/components/FormFields/JsonEditor.vue new file mode 100644 index 000000000..c6fa8d167 --- /dev/null +++ b/src/components/FormFields/JsonEditor.vue @@ -0,0 +1,73 @@ + + + + + diff --git a/src/components/FormFields/index.js b/src/components/FormFields/index.js index d7b0744be..fa49bde31 100644 --- a/src/components/FormFields/index.js +++ b/src/components/FormFields/index.js @@ -8,6 +8,7 @@ import UploadKey from './UploadKey' import UserPassword from './UserPassword' import WeekCronSelect from './WeekCronSelect' import UpdateToken from './UpdateToken' +import JsonEditor from './JsonEditor' export default { DatetimeRangePicker, @@ -19,7 +20,8 @@ export default { UploadField, UserPassword, WeekCronSelect, - UpdateToken + UpdateToken, + JsonEditor } export { @@ -32,5 +34,6 @@ export { UploadField, UserPassword, WeekCronSelect, - UpdateToken + UpdateToken, + JsonEditor } diff --git a/src/i18n/langs/cn.json b/src/i18n/langs/cn.json index 5fd857906..65725b943 100644 --- a/src/i18n/langs/cn.json +++ b/src/i18n/langs/cn.json @@ -138,6 +138,7 @@ "Disk": "硬盘", "AdDomain": "AD域名", "AdDomainHelpText": "提供给域用户登录的AD域名", + "SetAdDomainNoDisabled": "如果设置了AD域名不能修改", "Domain": "网域", "DomainDetail": "网域详情", "DomainHelpMessage": "网域功能是为了解决部分环境(如:混合云)无法直接连接而新增的功能,原理是通过网关服务器进行跳转登录。JMS => 网域网关 => 目标资产", @@ -445,6 +446,7 @@ "lastCannotBeDeleteMsg": "最后一项,不能被删除", "InvalidJson": "不是合法 JSON", "time_period": "时段", + "FormatError": "格式错误", "WeekCronSelect": { "Monday": "星期一", "Tuesday": "星期二", @@ -916,6 +918,9 @@ "authSAML2MetadataUrl": "IDP metadata URL", "authSAML2AdvancedSettings": "高级配置", "IdpMetadataHelpText": "IDP metadata URL 和 IDP metadata XML参数二选一即可,IDP metadata URL的优先级高", + "IdpMetadataUrlHelpText": "从远端地址中加载 IDP Metadata", + "authSAMLKeyHelpText": "SP 证书和密钥 是用来和 IDP 加密通信的", + "authSAMLCertHelpText": "上传证书密钥后保存, 然后查看 SP Metadata", "authCASAttrMap": "用户属性映射", "SignaturesAndTemplates": "Signatures and Templates", "unselectedUser": "没有选择用户", @@ -1046,6 +1051,9 @@ "PermissionName": "授权规则名称", "Accept": "同意", "AssignedMe": "待我审批", + "FlowSetUp": "流程设置", + "ApprovalProcess": "审批流程", + "LevelApproval": "级审批", "Assignee": "处理人", "Assignees": "待处理人", "Close": "关闭", diff --git a/src/i18n/langs/en.json b/src/i18n/langs/en.json index 43336dce6..a006e75fe 100644 --- a/src/i18n/langs/en.json +++ b/src/i18n/langs/en.json @@ -18,9 +18,9 @@ "username_group":"Username group", "hostname_group":"Hostname group", "asset_ip_group": "Asset ip group", - "system_users_name_group": "Systemusers name group", - "system_users_protocol_group": "Systemusers protocol group", - "system_users_username_group": "systemusers username group", + "system_users_name_group": "Systemuser name", + "system_users_protocol_group": "Systemuser protocol", + "system_users_username_group": "systemuser username", "apply_login_asset": "Apply login asset", "apply_login_system_user": "Apply login system user", "apply_login_user": "Apply login user", @@ -136,6 +136,7 @@ "Disk": "Disk", "AdDomain": "AD Domain", "AdDomainHelpText": "AD domain provided to domain users for login", + "SetAdDomainNoDisabled": "If AD domain is set, it cannot be modified", "Domain": "Domain", "DomainDetail": "Domain detail", "DomainHelpMessage": "The domain function is added to address the fact that some environments (such as the hybrid cloud) cannot be connected directly by jumping on the gateway server.\nJMS => Domain gateway => Target assets", @@ -468,6 +469,7 @@ "failedConditions": "cron expression error" }, "Cycle": "Cycle", + "FormatError": "Format error", "WeekCronSelect": { "Monday": "Monday", "Tuesday": "Tuesday", @@ -893,6 +895,9 @@ "authSAML2Xml": "IDP metadata XML", "authSAML2MetadataUrl": "IDP metadata URL", "IdpMetadataHelpText": "Choose one of IDP metadata URL and IDP metadata XML parameters. IDP metadata URL has high priority", + "IdpMetadataUrlHelpText": "Load IDP Metadata from remote url", + "authSAMLKeyHelpText": "SP cert and private key, using communicate with IDP", + "authSAMLCertHelpText": "After upload cert and private key, View SP Metadata", "authSAML2AdvancedSettings": "Advanced Settings", "unselectedUser": "Unselected user", "auto": "Auto", @@ -1008,6 +1013,9 @@ "PermissionName": "Permission name", "Accept": "Accept", "AssignedMe": "Assigned me", + "FlowSetUp": "Flow set up", + "ApprovalProcess": "Approval process", + "LevelApproval": "Level approval", "Assignee": "Assignee", "RequestPerm":"Request Perm", "AssignedInfo":"Assigned Info", @@ -1252,6 +1260,7 @@ "NodeAmount": "Node", "PasswordLength": "Password length", "PasswordStrategy": "Password strategy", + "SecretKeyStrategy": "Secret key strategy", "RegularlyPerform": "Regularly perform", "Result": "Result", "Retry": "Retry", @@ -1259,6 +1268,7 @@ "TaskList": "Task list", "TimeDelta": "Time delta", "Timer": "Timer", + "TimerPeriod": "Timer period", "Username": "Username" }, "Cloud": { diff --git a/src/utils/jms.js b/src/utils/jms.js index f3b67b60e..c499f0fa4 100644 --- a/src/utils/jms.js +++ b/src/utils/jms.js @@ -1,3 +1,3 @@ -export function openTaskPage(taskId) { - window.open(`/#/ops/celery/task/${taskId}/log/`, '', 'width=900,height=600') +export function openTaskPage(taskId, type = '') { + window.open(`/#/ops/celery/task/${taskId}/log/?type=${type}`, '', 'width=900,height=600') } diff --git a/src/views/applications/DatabaseApp/DatabaseAppList.vue b/src/views/applications/DatabaseApp/DatabaseAppList.vue index 62802486a..ac3cf04f3 100644 --- a/src/views/applications/DatabaseApp/DatabaseAppList.vue +++ b/src/views/applications/DatabaseApp/DatabaseAppList.vue @@ -68,6 +68,9 @@ export default { hasImport: false, hasBulkDelete: true, createRoute: 'DatabaseAppCreate', + searchConfig: { + exclude: ['category', 'type'] + }, moreCreates: { callback: (item) => { vm.$router.push({ name: 'DatabaseAppCreate', query: { type: item.name.toLowerCase() }}) diff --git a/src/views/applications/KubernetesApp/KubernetesAppList.vue b/src/views/applications/KubernetesApp/KubernetesAppList.vue index 671fef7bb..628ba7ded 100644 --- a/src/views/applications/KubernetesApp/KubernetesAppList.vue +++ b/src/views/applications/KubernetesApp/KubernetesAppList.vue @@ -56,7 +56,10 @@ export default { hasExport: false, hasImport: false, hasBulkDelete: true, - createRoute: 'KubernetesAppCreate' + createRoute: 'KubernetesAppCreate', + searchConfig: { + exclude: ['category', 'type'] + } } } } diff --git a/src/views/applications/RemoteApp/RemoteAppList.vue b/src/views/applications/RemoteApp/RemoteAppList.vue index 6710bce19..ede2da147 100644 --- a/src/views/applications/RemoteApp/RemoteAppList.vue +++ b/src/views/applications/RemoteApp/RemoteAppList.vue @@ -66,6 +66,9 @@ export default { hasExport: false, hasImport: false, // createRoute: 'RemoteAppCreate', + searchConfig: { + exclude: ['category', 'type'] + }, moreCreates: { dropdown: this.getCreateAppType(), callback: (app) => { diff --git a/src/views/assets/SystemUser/SystemUserCreateUpdate/fields.js b/src/views/assets/SystemUser/SystemUserCreateUpdate/fields.js index 7443dbc19..fbf5cb0b8 100644 --- a/src/views/assets/SystemUser/SystemUserCreateUpdate/fields.js +++ b/src/views/assets/SystemUser/SystemUserCreateUpdate/fields.js @@ -121,7 +121,7 @@ function getFields() { disabled: false }, hidden: form => { - if (form.login_mode === 'manual' || form.type === 'admin') { + if (form.login_mode === 'manual' || form.type === 'admin' || (form.ad_domain && form.ad_domain !== '')) { this.fieldsMeta.auto_push.el.disabled = true } else { this.fieldsMeta.auto_push.el.disabled = false @@ -133,7 +133,8 @@ function getFields() { updateForm({ auto_generate_key: value }) } } - } + }, + helpText: this.$t('assets.SetAdDomainNoDisabled') } const update_password = { diff --git a/src/views/assets/SystemUser/SystemUserDetail/AssetList.vue b/src/views/assets/SystemUser/SystemUserDetail/AssetList.vue index ae76fdd89..2274e3bfd 100644 --- a/src/views/assets/SystemUser/SystemUserDetail/AssetList.vue +++ b/src/views/assets/SystemUser/SystemUserDetail/AssetList.vue @@ -7,7 +7,7 @@ - + @@ -182,6 +182,12 @@ export default { const objectId = this.object.id const relationUrl = `/api/v1/assets/system-users-nodes-relations/?systemuser=${objectId}&node=${itemId}` return this.$axios.delete(relationUrl) + }, + onAddSuccess: (objects, that) => { + that.iHasObjects = [...that.iHasObjects, ...objects] + vm.$refs.nodeRelation.$refs.select2.clearSelected() + this.$message.success(this.$t('common.updateSuccessMsg')) + vm.$refs.ListTable.reloadTable() } }, assetRelationConfig: { diff --git a/src/views/assets/SystemUser/SystemUserList/CommonUserList.vue b/src/views/assets/SystemUser/SystemUserList/CommonUserList.vue index 2ae076c30..8fd7a8acd 100644 --- a/src/views/assets/SystemUser/SystemUserList/CommonUserList.vue +++ b/src/views/assets/SystemUser/SystemUserList/CommonUserList.vue @@ -68,7 +68,7 @@ export default { hasCreate: false, createRoute: 'SystemUserCreate', searchConfig: { - exclude: ['type'] + exclude: ['type', 'protocol'] }, moreCreates: { callback: (option) => { diff --git a/src/views/ops/TaskDetail/HistoryExecutionDetail/HistoryExecutionDetail.vue b/src/views/ops/TaskDetail/HistoryExecutionDetail/HistoryExecutionDetail.vue index b1439344c..a716d88ba 100644 --- a/src/views/ops/TaskDetail/HistoryExecutionDetail/HistoryExecutionDetail.vue +++ b/src/views/ops/TaskDetail/HistoryExecutionDetail/HistoryExecutionDetail.vue @@ -78,7 +78,7 @@ export default { value: this.object.id, formatter: function(row, value) { const onClick = function() { - openTaskPage(value) + openTaskPage(value, 'ansible') } const title = this.$t('common.View') return { title } diff --git a/src/views/ops/TaskDetail/TaskDetail.vue b/src/views/ops/TaskDetail/TaskDetail.vue index 8662e412b..15917f1ac 100644 --- a/src/views/ops/TaskDetail/TaskDetail.vue +++ b/src/views/ops/TaskDetail/TaskDetail.vue @@ -102,7 +102,7 @@ export default { value: this.object.latest_execution.id, formatter: function(row, value) { const onClick = function() { - openTaskPage(value) + openTaskPage(value, 'ansible') } const title = this.$t('common.View') return { title } diff --git a/src/views/settings/Auth/CAS.vue b/src/views/settings/Auth/CAS.vue index 07c4cd260..3d99d0501 100644 --- a/src/views/settings/Auth/CAS.vue +++ b/src/views/settings/Auth/CAS.vue @@ -11,6 +11,8 @@