You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by xx...@apache.org on 2023/04/21 08:49:07 UTC

[kylin] 07/17: KYLIN-5506 assign user group pagesize issue

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 <la...@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)