This is an automated email from the ASF dual-hosted git repository. xxyu pushed a commit to branch kylin5 in repository https://gitbox.apache.org/repos/asf/kylin.git
commit e230e0a7827c68f3203d85ddcac00b2f9cbc6d89 Author: Qian Xia <lauraxiaq...@gmail.com> AuthorDate: Wed Apr 12 16:11:20 2023 +0800 KYLIN-5506 assign user group pagesize issue --- .../src/components/common/GroupEditModal/index.vue | 1 + .../src/components/common/UserEditModal/index.vue | 116 +++++++++++++++++++-- .../src/components/common/UserEditModal/store.js | 4 +- kystudio/src/service/user.js | 2 +- 4 files changed, 109 insertions(+), 14 deletions(-) diff --git a/kystudio/src/components/common/GroupEditModal/index.vue b/kystudio/src/components/common/GroupEditModal/index.vue index 564fa3d96a..040f26bc04 100644 --- a/kystudio/src/components/common/GroupEditModal/index.vue +++ b/kystudio/src/components/common/GroupEditModal/index.vue @@ -304,6 +304,7 @@ export default class GroupEditModal extends Vue { text-align: left; cursor: pointer; margin-left: 15px; + line-height: 30px; &:hover { color: @base-color; } diff --git a/kystudio/src/components/common/UserEditModal/index.vue b/kystudio/src/components/common/UserEditModal/index.vue index 631dc39b34..0b8ed07e54 100644 --- a/kystudio/src/components/common/UserEditModal/index.vue +++ b/kystudio/src/components/common/UserEditModal/index.vue @@ -127,12 +127,15 @@ <el-form-item v-if="isFieldShow('group')"> <el-transfer filterable - :data="totalGroups" + :data="totalGroupsData" :value="form.authorities" + :before-query="queryHandler" :filter-placeholder="$t('userGroupFilter')" :titles="[$t('willCheckGroup'), $t('checkedGroup')]" + :total-elements="totalSizes" :show-overflow-tip="true" - @change="value => inputHandler('authorities', value)"> + @change="value => transferInputHandler('authorities', value)"> + <div class="load-more-uers" slot="left-remote-load-more" v-if="isShowLoadMore" @click="loadMoreUserGroups(searchValueLeft)">{{$t('kylinLang.common.loadMore')}}</div> </el-transfer> </el-form-item> </el-form> @@ -210,6 +213,19 @@ export default class UserEditModal extends Vue { char: '', letter: '' } + // 获取userGroup分页页码 + page_offset = 0 + // 每页请求数量 + pageSize = 100 + // 用户组总数 + totalUserGroupsSize = 0 + // 返回的数据总数 + totalSizes = [0, 10] + searchValueLeft = '' + searchValueRight = '' + autoLoadLimit = 100 + clickLoadMore = false + timer = null // Computed: Modal宽度 get modalWidth () { @@ -223,6 +239,13 @@ export default class UserEditModal extends Vue { return titleMaps[this.editType] } + get isShowLoadMore () { + return this.page_offset < Math.ceil(this.totalUserGroupsSize / this.pageSize) - 1 + } + get totalGroupsData () { + return this.totalGroups.length ? this.totalGroups : [] + } + get rules () { return { // Data: el-form表单验证规则 @@ -254,7 +277,7 @@ export default class UserEditModal extends Vue { onModalShow (newVal, oldVal) { if (newVal) { this.isFormShow = true - this.editType === 'group' && this.fetchUserGroups() + this.editType === 'group' && this.fetchGroups('') document.addEventListener('keyup', this.handlerKeyEvent) } else { // 密码规则出错信息重置 @@ -332,6 +355,74 @@ export default class UserEditModal extends Vue { } } } + queryHandler (title, query) { + const that = this + return new Promise(async (resolve, reject) => { + if (title === that.$t('willCheckGroup')) { + this.page_offset = 0 + clearTimeout(this.timer) + this.timer = setTimeout(async function () { + await that.setModal({totalGroups: []}) + await that.fetchGroups(query) + resolve() + }, 500) + } else if (title === that.$t('checkedGroup')) { + try { + that.searchValueRight = query + that.$set(that.totalSizes, 1, that.searchResults(query).length) + resolve() + } catch (e) { + console.error(e) + reject(e) + } + } + }) + } + // 匹配搜索结果的用户 + searchResults (content) { + return this.form.authorities.filter(group => group.toLowerCase().indexOf(content.toString().toLowerCase()) >= 0) + } + transferInputHandler (key, value) { + this.setModalForm({[key]: value}) + this.totalSizes[0] = this.totalUserGroupsSize - (!this.searchValueLeft.length ? value.length : this.searchResults(this.searchValueLeft).length) + const surplusUserGroups = this.totalGroups.filter(group => !value.includes(group.key)) + surplusUserGroups.length < this.autoLoadLimit && (!this.searchValueLeft.length ? this.loadMoreUserGroups() : this.loadMoreUserGroups(this.searchValueLeft)) + } + // Helper: 从后台获取用户 + async fetchGroups (value) { + this.searchValueLeft = typeof value === 'undefined' ? '' : value + const { data: { data } } = await this.getGroupList({ + page_size: this.pageSize, + page_offset: this.page_offset, + // project: this.currentSelectedProject, // 处理资源组时,发现这个接口不用传 project 参数 + name: value + }) + const remoteUserGroups = data.value + .map(group => ({ key: group, label: group })) + const selectedUserGroupsNotInRemote = this.form.authorities + .map(sItem => ({key: sItem, label: sItem})) + .filter(sItem => ![...(this.page_offset === 0 ? [] : this.totalGroups), ...remoteUserGroups].some(user => user.key === sItem.key)) + const searchUserGroupIsSelected = (typeof value !== 'undefined' && value) ? this.form.authorities.filter(group => group.toLowerCase().indexOf(value.toString().toLowerCase()) >= 0) : [...this.totalGroups, ...remoteUserGroups].filter(group => this.form.authorities.includes(group.key)) + this.totalUserGroupsSize = data.total_size + typeof value !== 'undefined' && value ? (this.totalSizes = [this.totalUserGroupsSize - searchUserGroupIsSelected.length]) : (this.totalSizes = [this.totalUserGroupsSize - this.form.authorities.length]) + const userGroups = [...new Set([ ...(this.page_offset === 0 ? [] : this.totalGroups), ...remoteUserGroups, ...selectedUserGroupsNotInRemote ].map(it => it.key))].map(item => ({key: item, label: item})) + this.autoLoadMoreData(userGroups, value) + this.setModal({totalGroups: userGroups}) + } + // 判断是否自动加载更多的数据 + autoLoadMoreData (userGroups, value) { + this.clickLoadMore = false + const len = userGroups.filter(group => this.form.authorities.includes(group.key)).length + if (userGroups.length - len < this.autoLoadLimit && this.isShowLoadMore) { + typeof value !== 'undefined' && !value.length ? this.loadMoreUserGroups() : this.loadMoreUserGroups(value) + return + } + } + loadMoreUserGroups (value) { + if (this.clickLoadMore) return + this.clickLoadMore = true + this.isShowLoadMore && (this.page_offset += 1, this.fetchGroups(value)) + } // Action: Form递交函数 async submit () { @@ -384,14 +475,6 @@ export default class UserEditModal extends Vue { return validate[type].bind(this) } } - - // Helper: 从后台获取用户组 - async fetchUserGroups () { - // const project = this.currentSelectedProject // 处理资源组时,发现这个接口不用传 project 参数 - const { data: { data: totalGroups } } = await this.getGroupList() - - this.setModal({ totalGroups: totalGroups.value }) - } } </script> @@ -415,6 +498,17 @@ export default class UserEditModal extends Vue { min-width: initial; } } + .load-more-uers { + color: @text-title-color; + font-size: @text-assist-size; + text-align: left; + cursor: pointer; + margin-left: 15px; + line-height: 30px; + &:hover { + color: @base-color; + } + } .change-system-password-tip { margin-bottom: 15px; font-size: 14px; diff --git a/kystudio/src/components/common/UserEditModal/store.js b/kystudio/src/components/common/UserEditModal/store.js index dd28c73423..10fe5b73ee 100644 --- a/kystudio/src/components/common/UserEditModal/store.js +++ b/kystudio/src/components/common/UserEditModal/store.js @@ -102,8 +102,8 @@ function setTotalGroups (payload, state) { .filter(groupName => groupName !== defaultGroup.key) .map(value => { return { - key: value, - label: value, + key: value.key, + label: value.label, disabled: false } }) diff --git a/kystudio/src/service/user.js b/kystudio/src/service/user.js index 6bddbbbd26..6d59ae2bd1 100644 --- a/kystudio/src/service/user.js +++ b/kystudio/src/service/user.js @@ -47,7 +47,7 @@ export default { return Vue.resource(apiUrl + 'user_group/users_with_group').get(para) }, getGroupList: (para) => { - return Vue.resource(apiUrl + 'user_group/groups').get() + return Vue.resource(apiUrl + 'user_group/groups').get(para) }, addGroup: (para) => { return Vue.resource(apiUrl + 'user_group').save(para)