302 lines
9.4 KiB
Vue
302 lines
9.4 KiB
Vue
![]() |
<template>
|
|||
|
<div class="pages access-page p-3">
|
|||
|
<sub-header-with-select
|
|||
|
@open-form="toggleRolesPanel()"
|
|||
|
|
|||
|
:showProjectSelect="$attrs.showProjectSelect"
|
|||
|
title="تنظیم دسترسی کاربران">
|
|||
|
<!-- <button-->
|
|||
|
<!-- @click="toggleRolesPanel()"-->
|
|||
|
<!-- class="btn btn-outline-primary position-relative"-->
|
|||
|
<!-- type="button">-->
|
|||
|
<!-- اختصاص نقش جدید-->
|
|||
|
<!-- </button>-->
|
|||
|
</sub-header-with-select>
|
|||
|
|
|||
|
<div class="pages-content d-flex">
|
|||
|
<div class="table-responsive">
|
|||
|
<table class="table table-borderless table-hover">
|
|||
|
<thead>
|
|||
|
<th colspan="12" class="px-0">
|
|||
|
<form class="table-search-form" role="search">
|
|||
|
<div class="form-group">
|
|||
|
<div class="input-group">
|
|||
|
<div class="input-group-prepend">
|
|||
|
<span class="input-group-text">
|
|||
|
<svg class="" aria-hidden="true" focusable="false"
|
|||
|
data-prefix="fas" data-icon="search" role="img" xmlns="http://www.w3.org/2000/svg"
|
|||
|
viewBox="0 0 512 512" data-fa-i2svg="">
|
|||
|
<path fill="currentColor"
|
|||
|
d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"></path></svg>
|
|||
|
</span>
|
|||
|
</div>
|
|||
|
<input
|
|||
|
v-model="searchForm.query"
|
|||
|
type="search"
|
|||
|
required
|
|||
|
class="form-control"
|
|||
|
id="search-query"
|
|||
|
placeholder="جستجو..."
|
|||
|
name="search-query"
|
|||
|
aria-label="جستجو در اسناد، عناوین و واژگان"
|
|||
|
aria-describedby="basic-addon1"
|
|||
|
size="50"
|
|||
|
>
|
|||
|
<div class="input-group-append">
|
|||
|
<button :class="{'show-reset-btn' : searchForm.query.length > 0}"
|
|||
|
type="button"
|
|||
|
class="input-group-text"
|
|||
|
id="basic-addon1">
|
|||
|
<i class="tavasi tavasi-Component-294--1"></i>
|
|||
|
</button>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</form>
|
|||
|
</th>
|
|||
|
</thead>
|
|||
|
<thead>
|
|||
|
<tr>
|
|||
|
<th scope="col">#</th>
|
|||
|
<th scope="col">نام</th>
|
|||
|
<th scope="col">نقش</th>
|
|||
|
<th scope="col">تاریخ ثبت نام</th>
|
|||
|
<th scope="col">عملیات</th>
|
|||
|
</tr>
|
|||
|
</thead>
|
|||
|
<tbody>
|
|||
|
<template v-if="userRoles.length">
|
|||
|
<tr v-for="({user,...item},index) in userRoles"
|
|||
|
:class="{'active': item.active ?? false }" :key="index">
|
|||
|
<th scope="row">{{ index + 1 }}</th>
|
|||
|
<td>
|
|||
|
<div class="user-info">
|
|||
|
<div class="user-info-avatar">
|
|||
|
<img :src="userAvatar(user)" :alt="fullName(user)">
|
|||
|
</div>
|
|||
|
<div class="user-info-details">
|
|||
|
<p class="name">
|
|||
|
{{ fullName(user) }}
|
|||
|
</p>
|
|||
|
<p class="username">
|
|||
|
@{{ user.username ?? 'بدون نام کاربری' }}
|
|||
|
</p>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</td>
|
|||
|
<td><span>{{ item.role_name ?? '--' }}</span></td>
|
|||
|
<td><span>از {{ convertUnixToPersianDateTime(item.created_at) }}</span></td>
|
|||
|
<td>
|
|||
|
<button @click="toggleRolesPanel(index)" title="ویرایش"
|
|||
|
class="btn edit-btn"
|
|||
|
data-bs-toggle="modal"
|
|||
|
data-bs-target="#edit-paper">
|
|||
|
<i class="tavasi tavasi-Component-242--1"></i>
|
|||
|
</button>
|
|||
|
<!-- <button @click="deleteItem(item.id)" title="حذف"-->
|
|||
|
<!-- class="btn delete-btn"-->
|
|||
|
<!-- type="button"-->
|
|||
|
<!-- >-->
|
|||
|
<!-- <img class="" src="@assets/common/img/Component 295 – 1.svg" alt="حذف"/>-->
|
|||
|
<!-- </button>-->
|
|||
|
</td>
|
|||
|
|
|||
|
</tr>
|
|||
|
</template>
|
|||
|
<table-no-data v-else></table-no-data>
|
|||
|
|
|||
|
</tbody>
|
|||
|
</table>
|
|||
|
</div>
|
|||
|
|
|||
|
<div class="side-panel" v-if="showPanel">
|
|||
|
<div class="side-panel-header">
|
|||
|
<h6 class="">
|
|||
|
مدیریت نقش ها
|
|||
|
</h6>
|
|||
|
</div>
|
|||
|
|
|||
|
<div class="side-panel-content ">
|
|||
|
<!-- <div class="mb-5">-->
|
|||
|
<!-- <label for="role_id">انتخاب بخش</label>-->
|
|||
|
<!-- <select @change="getUserPermission()" name="role_id" id="role_id"-->
|
|||
|
<!-- class="form-control text__14">-->
|
|||
|
<!-- <template v-if="sections.length">-->
|
|||
|
<!-- <option disabled :value="undefined" selected>انتخاب بخش</option>-->
|
|||
|
|
|||
|
<!-- <option v-for="({project_id,section_title},index) in sections"-->
|
|||
|
<!-- :key="index" :value="project_id">{{ section_title }}-->
|
|||
|
<!-- </option>-->
|
|||
|
<!-- </template>-->
|
|||
|
|
|||
|
<!-- <option v-else :value="undefined" selected>بخشی ثبت نشده است.</option>-->
|
|||
|
<!-- </select>-->
|
|||
|
<!-- </div>-->
|
|||
|
|
|||
|
<accordion
|
|||
|
v-if="user_id"
|
|||
|
:user_id="user_id"
|
|||
|
></accordion>
|
|||
|
<div class="side-panel-footer mt-4">
|
|||
|
<div>
|
|||
|
|
|||
|
</div>
|
|||
|
<div>
|
|||
|
<button
|
|||
|
@click.prevent="showPanel = false"
|
|||
|
type="button"
|
|||
|
class="btn btn-primary"
|
|||
|
data-dismiss="modal"
|
|||
|
>
|
|||
|
بستن
|
|||
|
</button>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
|
|||
|
<Share @onCloseModal="showModal = false" v-if="showModal"></Share>
|
|||
|
</div>
|
|||
|
</template>
|
|||
|
|
|||
|
<script>
|
|||
|
|
|||
|
import apis from "@permission/permitApi";
|
|||
|
import {mapGetters} from "vuex";
|
|||
|
|
|||
|
export default {
|
|||
|
name:"UserAccessCustomization",
|
|||
|
components: {
|
|||
|
BreadCrumb: () =>
|
|||
|
import( "@components/BreadCrumb.vue"),
|
|||
|
Share: () =>
|
|||
|
import( "@view/modal/Share.vue"),
|
|||
|
Accordion: () =>
|
|||
|
import( "@permission/components/Accordion.vue"),
|
|||
|
},
|
|||
|
computed: {
|
|||
|
...mapGetters(["projectGetter"])
|
|||
|
},
|
|||
|
props: {
|
|||
|
items: {
|
|||
|
default() {
|
|||
|
return {}
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
data() {
|
|||
|
return {
|
|||
|
section_user_id: undefined,
|
|||
|
section_role_id: undefined,
|
|||
|
|
|||
|
user_id: undefined,
|
|||
|
role_id: undefined,
|
|||
|
loading: false,
|
|||
|
showPanel: false,
|
|||
|
userRoles: [],
|
|||
|
sections: [],
|
|||
|
selectedItem: {},
|
|||
|
|
|||
|
showModal: false,
|
|||
|
typingTimer: 0,
|
|||
|
doneTypingInterval: 1000,
|
|||
|
collapseAll: false,
|
|||
|
editMode: false,
|
|||
|
|
|||
|
searchForm: {
|
|||
|
query: '',
|
|||
|
replaceWith: '',
|
|||
|
wholeWord: false,
|
|||
|
},
|
|||
|
};
|
|||
|
},
|
|||
|
methods: {
|
|||
|
getUserPermission() {
|
|||
|
this.user_id = this.selectedItem.user.id;
|
|||
|
},
|
|||
|
|
|||
|
fullName(user) {
|
|||
|
if (user.name && user.lastname)
|
|||
|
return user.name + ' ' + user.lastname;
|
|||
|
else if (user.name && !user.lastname)
|
|||
|
return user.name;
|
|||
|
else if (!user.name && user.lastname)
|
|||
|
return user.lastname;
|
|||
|
return 'بدون نام';
|
|||
|
},
|
|||
|
deleteItem() {
|
|||
|
},
|
|||
|
getUserRole() {
|
|||
|
ApiService.formData(
|
|||
|
apis.permissions.listUserRole,
|
|||
|
{
|
|||
|
project_id: this.projectGetter?.id
|
|||
|
})
|
|||
|
.then((response) => {
|
|||
|
this.userRoles = response.data.data;
|
|||
|
})
|
|||
|
.catch((err) => {
|
|||
|
})
|
|||
|
.finally(() => {
|
|||
|
this.loading = false;
|
|||
|
})
|
|||
|
},
|
|||
|
|
|||
|
save() {
|
|||
|
// actions
|
|||
|
},
|
|||
|
|
|||
|
toggleRolesPanel(userRolesIndex = 0) {
|
|||
|
this.getSections().then(res => {
|
|||
|
this.sections = res.data.data;
|
|||
|
|
|||
|
this.role_id = this.userRoles[userRolesIndex].role_id ?? undefined;
|
|||
|
this.user_id = this.userRoles[userRolesIndex].user.id ?? undefined;
|
|||
|
|
|||
|
this.showPanel = true;
|
|||
|
})
|
|||
|
},
|
|||
|
getSections() {
|
|||
|
return ApiService.formData(apis.sections.list, {project_id: this.projectGetter?.id})
|
|||
|
},
|
|||
|
|
|||
|
collapseAllPanels() {
|
|||
|
this.collapseAll = true;
|
|||
|
},
|
|||
|
expandAllPanels() {
|
|||
|
this.collapseAll = false;
|
|||
|
},
|
|||
|
|
|||
|
sendQuery() {
|
|||
|
// todo: show loading.
|
|||
|
// todo: send query and show result.
|
|||
|
// todo: hide loading.
|
|||
|
|
|||
|
clearTimeout(this.typingTimer);
|
|||
|
this.typingTimer = setTimeout(() => {
|
|||
|
this.highLight();
|
|||
|
}, this.doneTypingInterval);
|
|||
|
|
|||
|
},
|
|||
|
onKeyDown() {
|
|||
|
clearTimeout(this.typingTimer);
|
|||
|
},
|
|||
|
},
|
|||
|
mounted() {
|
|||
|
this.getUserRole();
|
|||
|
// this.cloneItems = structuredClone(this.items);
|
|||
|
},
|
|||
|
watch: {
|
|||
|
projectGetter() {
|
|||
|
this.showPanel = false;
|
|||
|
this.getUserRole();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
</script>
|
|||
|
|
|||
|
<style scoped lang="scss">
|
|||
|
|
|||
|
</style>
|