base_ui/pages/admin/permit/user-permission.vue

502 lines
13 KiB
Vue
Raw Normal View History

2025-02-01 09:34:55 +00:00
<template>
<NuxtLayout name="default" :menu="adminMenu">
<div class="pages user-role px-3 pb-0 pt-2">
<sub-header-with-select
canCreate="user-permission_new"
@open-form="showShareModal()"
:showProjectSelect="$attrs.showProjectSelect"
title="کاربران"
>
</sub-header-with-select>
<div class="pages-content d-flex pb-0 pt-2">
<template v-if="canView">
<my-table
:tableActions="tableActions"
height="auto"
maxHeight="calc(100vh - 15em)"
class="my-table"
ref="userRolesTable"
:hasSearch="false"
:paginationInfo="pagination"
:sortingInfo="sorting"
:items="userRoles"
:fetchingData="fetchingData"
:tableColumns="tableColumns"
:totalPages="pagination.pages"
@delete-table-item="deleteItem"
@edit-table-item="toggleRolesPanel"
@page-changed="pageChanged"
@page-limit-changed="pageLimitChanged"
@sort-changed="sortChanged"
></my-table>
</template>
<no-data v-else>
<the-content-loading v-if="fetchingData"></the-content-loading>
<div v-else class="d-flex justify-content-center align-items-center">
<div
class="alert alert-warning d-flex justify-content-center align-items-center"
>
<span
class="tavasi tavasi-warning-circle color-inherit ms-1 text__32"
></span>
عدم دسترسی
</div>
</div>
</no-data>
<div class="side-panel" v-if="showPanel">
<div class="side-panel-header">
<h6 class="">مدیریت نقش ها</h6>
</div>
<div class="side-panel-content">
<Accordion
class="role-permission"
canEdit="user-permission_edit"
: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 text-white"
>
بستن
</button>
</div>
</div>
</div>
</div>
</div>
<Share
@update-user-role="updateUserRole"
:roles="roles"
v-if="showModal"
:item="[]"
></Share>
</div>
</NuxtLayout>
</template>
<script>
// import apis from "@permission/permitApi";
// import { mapGetters, mapMutations, mapActions } from "vuex";
// import Share from "@permission/modal/Share.vue";
import apis from "~/apis/permitApi";
import adminMenu from "~/json/admin/json/menu.json";
import { defineAsyncComponent } from "vue";
import { mapActions, mapState } from "pinia";
import { useCommonStore } from "~/stores/commonStore";
import { usePermitStore } from "~/stores/permitStore";
export default {
name: "UserPermission",
setup() {
definePageMeta({
name: "UserPermission",
layout: false,
});
},
mounted() {
this.checkPermisionBeforGetList();
this.getRoles();
// this.cloneItems = structuredClone(this.items);
},
// watch: {
// projectGetter() {
// this.showPanel = false;
// this.checkPermisionBeforGetList();
// },
// },
props: {
items: {
default() {
return {};
},
},
},
data() {
return {
adminMenu:adminMenu,
tableActions: [
{
showOutside: true,
show: true,
icon: "Component-242--1",
title: "ویرایش",
to: {
name: "undefined",
},
selected: false,
disabled: false,
howToOpen: "",
href: "",
class: "edit-btn",
action: "edit-table-item",
can: "item-info_edit",
},
{
showOutside: true,
show: true,
icon: "Component-295--1",
title: "حذف",
to: {
name: "undefined",
},
selected: false,
disabled: false,
howToOpen: "",
href: "",
class: "delete-btn",
action: "delete-table-item",
can: "item-list_delete",
},
],
pagination: {
page: 1,
pages: 0,
total: 0,
offset: 0, // page * per_page
limit: 10, //per_page
},
sorting: {
sortby: "id",
sortorder: "asc", // asc | desc
},
tableColumns: [
{
isLink: true,
key: "full_name",
title: "نام",
width: "2",
},
{
key: "role_name",
title: "نقش",
width: "2",
},
{
key: "created_at",
title: "تاریخ ثبت نام",
width: "4",
},
],
canView: false,
fetchingData: false,
roles: [],
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,
},
};
},
computed: {
// ...mapGetters("permit", ["projectGetter"]),
...mapState(usePermitStore, ["projectGetter"]),
},
methods: {
// ...mapActions(["checkPermissions"]),
// ...mapMutations("permit", ["SET_PROJECT"]),
...mapActions(useCommonStore, ["checkPermissions"]),
...mapActions(usePermitStore, ["SET_PROJECT"]),
updateUserRole(payload) {
const formData = {
...payload,
...{ project_id: this.projectGetter?.id },
};
ApiService.formData(apis.roleUser.AddRoleUser, formData)
.then((response) => {
this.mySwalToast({
title: "تبریک",
html: response.data.message,
icon: "success",
});
this.getUserRole();
})
.catch((err) => {
this.mySwalToast({
title: "خطا",
html: err.response.data.message ?? err.message,
icon: "error",
});
})
.finally(() => {
$("#share-modal").modal("hide");
setTimeout(() => {
this.showModal = true;
}, 500);
this.loading = false;
});
},
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(index) {
const item = this.userRoles[index];
var vm = this;
this.mySwalConfirm({
title: "هشدار!!!",
html: "از حذف این مورد مطمئن هستید؟",
}).then((result) => {
if (result.isConfirmed) {
ApiService.formData(apis.permissions.deleteUserRole, {
project_id: vm.projectGetter?.id,
id: item.id,
})
.then((response) => {
vm.getUserRole();
})
.catch((err) => {
vm.mySwalToast({
title: "خطا",
html: err.response.data.message ?? err.message,
icon: "error",
});
})
.finally(() => {
vm.loading = false;
});
}
});
},
async getUserRole() {
const payload = {
project_id: this.projectGetter?.id,
isown: 3,
...this.sorting,
...this.pagination,
};
return await ApiService.formData(apis.permissions.listUserRole, payload)
.then((response) => {
this.userRoles = response.data.data;
this.userRoles.forEach((item, key) => {
item["role_name"] =
item["role_name"] && item["role_name"] != 0
? item["role_name"]
: "نقش حذف شده";
this.userRoles[key] = {
...this.userRoles[key],
...{
full_name: this.userRoles[key].user.full_name,
user_id: this.userRoles[key].user.user_id,
},
};
this.userRoles[key].created_at = this.convertUnixToPersianDateTime(
item.created_at
);
});
this.pagination = { ...this.pagination, ...response.data.pagination };
})
.catch((err) => {
this.mySwalToast({
title: "خطا",
html: err.response.data.message ?? err.message,
icon: "error",
});
})
.finally(() => {
this.loading = false;
});
},
save() {
// actions
},
showShareModal() {
this.getRoles().then(() => {
this.showModal = true;
setTimeout(() => {
$("#share-modal").modal("show");
}, 500);
});
},
updateList() {
this.resetPagination();
this.getUserRole();
},
resetPagination() {
this.pagination = {
pages: 0,
total: 0,
page: 1,
offset: 0,
limit: 10,
};
},
pageLimitChanged(paging) {
this.resetPagination();
this.pagination.limit = paging.limit;
this.getUserRole();
},
pageChanged(paging) {
let page = paging.pageNumber;
page -= 1;
this.pagination.offset = page * paging.limit;
this.pagination.limit = paging.limit;
this.pagination.page = paging.pageNumber;
this.getUserRole();
},
sortChanged(sorting) {
// keep limit status.
// reset page and offset values.
this.pagination.page = this.pagination.offset = 0;
this.sorting = sorting;
this.getUserRole();
},
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;
},
async getSections() {
return await 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);
},
async getRoles() {
return await ApiService.formData(apis.roles.list, {
project_id: this.projectGetter?.id,
}).then((res) => {
this.roles = res.data.data;
});
},
checkPermisionBeforGetList() {
if (this.fetchingData) return;
this.fetchingData = true;
this.checkPermissions({ permission: "user-permission_view", _this: this })
.then(() => {
if (this.projectGetter) {
this.getUserRole()
.then(() => {
this.canView = true;
this.fetchingData = false;
})
.catch(() => {
this.canView = false;
this.fetchingData = false;
});
} else {
this.getProjects().then(() => {
this.getUserRole()
.then(() => {
this.canView = true;
this.fetchingData = false;
})
.catch(() => {
this.canView = false;
this.fetchingData = false;
});
});
}
})
.catch(() => {
this.canView = false;
this.fetchingData = false;
});
},
async getProjects() {
return await ApiService.formData(apis.projects.list).then((res) => {
this.SET_PROJECT(res.data.data[0]);
});
},
},
components: {
// BreadCrumb: () => import("@components/BreadCrumb.vue"),
// Accordion: () => import("@permission/components/Accordion.vue"),
// SubHeaderWithSelect: defineAsyncComponent(() =>
// import("@/components/global/SubHeaderWithSelect.vue")
// ),
// TheContentLoading: defineAsyncComponent(() =>
// import("@/components/global/TheContentLoading.vue")
// ),
// MyTable: defineAsyncComponent(() =>
// import("@/components/global/MyTable.vue")
// ),
// NoData: defineAsyncComponent(() =>
// import("@/components/global/NoData.vue")
// ),
Share: defineAsyncComponent(() =>
import("@/components/admin/modal/Share.vue")
),
Accordion: defineAsyncComponent(() =>
import("@/components/admin/components/Accordion.vue")
),
// ShareModal: Share,
},
};
</script>
<style lang="scss"></style>