diff --git a/src/components/AutoDataForm/index.vue b/src/components/AutoDataForm/index.vue index 1e56941de..1399616f7 100644 --- a/src/components/AutoDataForm/index.vue +++ b/src/components/AutoDataForm/index.vue @@ -56,14 +56,8 @@ export default { this.loading = false }) }, - generateField(name) { - let field = {} - const fieldMeta = this.meta[name] || {} - field.id = name - field.label = fieldMeta.label - - let type = 'input' - switch (fieldMeta.type) { + generateFieldByType(type, field, fieldMeta) { + switch (type) { case 'choice': type = 'radio-group' field.options = fieldMeta.choices.map(v => { @@ -85,13 +79,41 @@ export default { break } field.type = type + return field + }, + generateFieldByName(name, field) { + switch (name) { + case 'email': + field.el = { type: 'email' } + break + case 'password': + field.el = { type: 'password' } + break + case 'comment': + field.el = { type: 'textarea' } + break + } + return field + }, + generateFieldByOther(field, fieldMeta) { if (fieldMeta.required) { - if (type === 'input') { + if (field.type === 'input') { field.rules = [rules.Required] } else { field.rules = [rules.RequiredChange] } } + return field + }, + generateField(name) { + let field = {} + const fieldMeta = this.meta[name] || {} + field.id = name + field.label = fieldMeta.label + field = this.generateFieldByType(fieldMeta.type, field, fieldMeta) + field = this.generateFieldByName(name, field) + field = this.generateFieldByOther(field, fieldMeta) + field = Object.assign(field, this.fieldsMeta[name] || {}) return field }, diff --git a/src/components/DataForm/index.vue b/src/components/DataForm/index.vue index 3d752e352..7fe55827c 100644 --- a/src/components/DataForm/index.vue +++ b/src/components/DataForm/index.vue @@ -56,6 +56,7 @@ export default { if (valid) { this.$emit('submit', this.$refs[formName].getFormValue()) } else { + this.$emit('invalid', valid) return false } }) diff --git a/src/layout/components/GenericCreateUpdatePage/index.vue b/src/layout/components/GenericCreateUpdatePage/index.vue index fa307fffc..35498a75b 100644 --- a/src/layout/components/GenericCreateUpdatePage/index.vue +++ b/src/layout/components/GenericCreateUpdatePage/index.vue @@ -19,7 +19,7 @@ export default { props: { url: { type: String, - required: true, + required: true }, method: { type: String, @@ -34,16 +34,34 @@ export default { form: { type: Object, default: () => { return {} } - } - }, - methods: { - handleSubmit(values) { - console.log('submit', values) + }, + onSubmit: { + type: Function, + default: null } }, mounted() { console.log('generic', this.$attrs) console.log(this.fields) + }, + methods: { + handleSubmit(values) { + let handler = this.onSubmit || this.defaultOnSubmit + handler = handler.bind(this) + console.log('submit', values) + return handler(values) + }, + defaultOnSubmit(validValues) { + this.$axios.post(this.url, validValues).then( + () => { + const msg = this.$tc('Create success') + this.$message.success(msg) + setTimeout(() => { + this.$router.push({ name: 'UserList' }) + }, 500) + } + ) + } } } diff --git a/src/router/index.js b/src/router/index.js index 5b7a310c2..201dd5dd4 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -104,7 +104,7 @@ export const constantRoutes = [ component: () => import('@/views/users/UserCreateUpdate.vue'), // Parent router-view name: 'UserGroupCreate', hidden: true, - meta: { title: 'UserGroupCreate' } + meta: { title: 'UserGroupCreate', activeMenu: '/users/groups' } }, { path: 'groups/:id', diff --git a/src/utils/jumpserver.js b/src/utils/jumpserver.js new file mode 100644 index 000000000..e69de29bb diff --git a/src/views/users/UserCreateUpdate.vue b/src/views/users/UserCreateUpdate.vue index a41eea71e..fee9b79f3 100644 --- a/src/views/users/UserCreateUpdate.vue +++ b/src/views/users/UserCreateUpdate.vue @@ -26,14 +26,11 @@ export default { }, fields: [ 'name', 'username', 'email', 'groups', 'password_strategy', 'password', 'mfa_level', - 'source', 'role', 'date_expired', 'phone', 'wechat', 'comment', + 'source', 'role', 'date_expired', 'phone', 'wechat', 'comment' ], url: '/api/v1/users/users/', fieldsMeta: { password: { - el: { - type: 'password' - }, hidden: (formValue, item) => { console.log('hidden password', formValue.password_strategy) if (this.$route.params.id === undefined) { @@ -43,21 +40,11 @@ export default { } } }, - email: { - el: { - type: 'email' - } - }, groups: { el: { value: [], url: '/api/v1/users/groups/' } - }, - comment: { - el: { - type: 'textarea' - } } } } diff --git a/src/views/users/UserList.vue b/src/views/users/UserList.vue index 554ad911c..81c199542 100644 --- a/src/views/users/UserList.vue +++ b/src/views/users/UserList.vue @@ -14,7 +14,7 @@ export default { tableConfig: { url: '/api/v1/users/users/', columns: [ - 'name', 'username', 'role', 'groups_display', 'source', 'is_valid', 'actions' + 'name', 'username', 'role', 'groups_display', 'source', 'is_active', 'actions' ], detailRoute: 'UserDetail' },