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 @@