blob: 1885425130e2a058eb0be52d4b007edead49a6d1 [file] [log] [blame]
<!--
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
-->
<!-- Authorized user Popup -->
<template>
<el-dialog :title="$t('sourcePage.grantUser')" width="520px" :append-to-body="true" v-model="visible" custom-class="grant-dialog">
<div class="dialog-content">
<div class="left">
<el-checkbox v-model="allCheck" :indeterminate="isIndeterminate" @change="handleCheckAllChange"
><span class="all-checkbox">{{ $t('sourcePage.userList') }} ({{ userList.length }})</span></el-checkbox
>
<el-checkbox-group v-model="checkedUser" @change="handleCheckedUser">
<el-checkbox v-for="user in pagiUsers" :key="user" :label="user">
{{ user }}
</el-checkbox>
</el-checkbox-group>
<el-pagination
layout="prev, pager, next"
v-model:currentPage="pagination.currPage"
:page-size="pagination.pageSize"
:total="userList.length"
@current-change="handleCurrentChange"
></el-pagination>
</div>
<div class="divider"></div>
<div class="right">
<div class="right-title">
<span>{{ $t('sourcePage.selectedUser') }} ({{ checkedUser.length }})</span><span class="clear" @click="handleClear">{{ $t('common.clear') }}</span>
</div>
<div class="right-item" v-for="user in checkedPagiUsers" :key="user">
{{ user }}
<span class="delete" @click="deleteUser(user)">{{ $t('common.delete') }}</span>
</div>
<el-pagination
layout="prev, pager, next"
v-model:currentPage="checkedPagination.currPage"
:page-size="checkedPagination.pageSize"
:total="checkedUser.length"
@current-change="handleCurrentSlectedChange"
></el-pagination>
</div>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="visible = false">{{ $t('common.cancel') }}</el-button>
<el-button type="primary" @click="submit">{{ $t('common.submit') }}</el-button>
</span>
</template>
</el-dialog>
</template>
<script>
import { ref, computed } from 'vue';
export default {
name: 'DialogGrantUser',
props: {
userList: {
type: Array,
default: () => [],
},
},
setup(props, { emit }) {
let visible = ref(false);
let allCheck = ref(false);
let isIndeterminate = ref(false);
let checkedUser = ref([]);
let pagination = ref({
currPage: 1,
pageSize: 10,
});
let checkedPagination = ref({
currPage: 1,
pageSize: 10,
});
let handleCheckAllChange = (val) => {
checkedUser.value = val ? props.userList : [];
isIndeterminate.value = false;
};
let handleCheckedUser = () => {
resetAllChecked();
};
let deleteUser = (user) => {
checkedUser.value = checkedUser.value.filter((d) => d !== user);
resetAllChecked();
};
let open = (users) => {
visible.value = true;
checkedUser.value = users ? [...users] : [];
resetAllChecked();
};
let resetAllChecked = () => {
const checkedCount = checkedUser.value.length;
isIndeterminate.value = checkedUser.value.length > 0 && checkedUser.value.length < props.userList.length;
allCheck.value = checkedCount === props.userList.length;
};
let handleCurrentChange = (currPage) => {
pagination.value.currPage = currPage;
};
let handleCurrentSlectedChange = (currPage) => {
checkedPagination.value.currPage = currPage;
};
let pagiUsers = computed(() => {
let { pageSize, currPage } = pagination.value;
return [...props.userList].splice((currPage - 1) * pageSize, pageSize);
});
let checkedPagiUsers = computed(() => {
let { pageSize, currPage } = checkedPagination.value;
return [...checkedUser.value].splice((currPage - 1) * pageSize, pageSize);
});
let handleClear = () => {
checkedUser.value = [];
resetAllChecked();
};
let submit = () => {
emit('change', { userList: checkedUser });
visible.value = false;
};
return {
checkedPagination,
checkedPagiUsers,
handleCurrentSlectedChange,
handleCurrentChange,
pagination,
pagiUsers,
visible,
open,
allCheck,
isIndeterminate,
handleCheckAllChange,
checkedUser,
deleteUser,
handleCheckedUser,
submit,
handleClear,
};
},
};
</script>
<style lang="scss">
.grant-dialog {
.el-dialog__body {
position: relative;
.el-pagination {
position: absolute;
bottom: 10px;
}
.dialog-content {
display: flex;
.el-checkbox {
display: block;
margin: 15px 0;
line-height: 20px;
font-size: 12px;
.el-checkbox__label {
font-size: 12px;
}
&:first-child {
margin-top: 0;
margin-bottom: 18px;
}
}
.left {
width: calc(50% - 1px);
font-size: 12px;
.all-checkbox {
color: #808ba3;
}
}
.divider {
width: 1px;
height: 445px;
margin: -10px 0;
background-color: $border-color;
}
.right {
width: 50%;
box-sizing: border-box;
padding-left: 20px;
font-size: 12px;
&-item {
display: flex;
justify-content: space-between;
line-height: 20px;
margin: 15px 0;
}
&-title {
display: flex;
justify-content: space-between;
color: #808ba3;
margin-bottom: 18px;
line-height: 20px;
.clear {
color: $theme-color;
cursor: pointer;
}
}
.delete {
color: $danger-color;
cursor: pointer;
}
}
}
}
}
</style>