<template> <NuxtLayout name="default" :menu="adminMenu"> <div class="main-users"> <!-- <header> <the-navbar></the-navbar> </header> --> <!-- <the-sidebar :menu="menu"></the-sidebar> --> <main class="pages-content-container"> <div class="pages-content mt-lg-0"> <div :class="{ 'd-flex': showPanel }"> <div v-if="canView"> <my-table :tableActions="tableActions" height="calc(100vh - 17em)" :hasSearch="true" :paginationInfo="pagination" :sortingInfo="sorting" :items="users" :fetchingData="fetchingData" :tableColumns="tableColumns" :totalPages="pagination.pages" @search="searchGroups" @reset-form="searchUsers" @delete-table-item="deleteItem" @edit-table-item="toggleUsersPanel" @page-changed="pageChanged" @page-limit-changed="pageLimitChanged" @sort-changed="sortChanged" > <slot name="tableHeaderActions"> <button v-if="!showPanel" @click.prevent="openCreatePanel()" class="btn btn-primary add-user-btn" type="button" > ایجاد </button> <span v-if="!showPanel" @click.prevent="openCreatePanel()" class="add-user-svg" type="button" > <svg class="icon icon-Component-133--1"> <use xlink:href="#icon-Component-133--1"></use> </svg> </span> </slot> </my-table> </div> <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 mx-5" v-if="showPanel"> <div class="side-panel-header d-flex mb-3 pb-3 border-bottom"> <h6 class="m-0">مدیریت کاربران</h6> <button @click.prevent="toggleUsersPanel(undefined)" class="btn btn-outline-primary me-auto" type="button" > x </button> </div> <div class="side-panel-content"> <NewUserForm :parentLoading="loading" :userData="selectedItemClone" @on-pass-by-emit="save" ></NewUserForm> </div> </div> </div> </div> </main> </div> </NuxtLayout> </template> <script> import apis from "~/apis/permitApi"; import { mapState, mapActions } from "pinia"; import adminMenu from "~/json/admin/json/menu.json"; import { defineAsyncComponent } from "vue"; import { useCommonStore } from "~/stores/commonStore"; import { usePermitStore } from "~/stores/permitStore"; // import menu from "~/json/admin/json/menu.json"; export default { name: "adminUsers", setup() { definePageMeta({ name: "adminUsers", layout: false, }); }, beforeMount() { // this.httpService = new HttpService( // import.meta.env.VITE_BASE_URL + loginUrl() // ); this.httpService = useNuxtApp()["$http"]; // this.httpService + loginUrl(); }, mounted() { this.checkPermisionBeforGetList(); }, // watch: { // projectGetter() { // this.showPanel = false; // this.checkPermisionBeforGetList(); // }, // }, data() { return { adminMenu: adminMenu, // menu: menu, firstTimeSearching: false, httpService: undefined, tableActions: [ { showOutside: true, show: true, icon: "tavasi tavasi-Component-242--1", title: "ویرایش", to: { name: "undefined", }, selected: false, disabled: false, howToOpen: "", href: "", class: "edit-btn", action: "edit-table-item", }, { showOutside: true, show: true, icon: "tavasi tavasi-Component-295--1", title: "حذف", to: { name: "undefined", }, selected: false, disabled: false, howToOpen: "", href: "", class: "delete-btn", action: "delete-table-item", }, ], canView: false, fetchingData: false, tableColumns: [ { isLink: true, key: "name", title: "نام", width: "2", }, { isLink: true, key: "lastname", title: "نام خانوادگی", width: "2", }, { key: "username", title: "نام کاربری", width: "2", }, { key: "email", title: "ایمیل", width: "2", }, { key: "is_active", title: "فعال", width: "2", }, { key: "admin", title: "مدیر", width: "2", }, { key: "mobile", title: "موبایل", width: "2", }, { key: "date_c", title: "ایجاد", width: "2", }, { key: "last-signed-int", title: "آخرین ورود", width: "2", }, ], pagination: { page: 1, pages: 0, total: 0, offset: 0, limit: 10, }, sorting: { sortby: "name", sortorder: "asc", // asc | desc | none }, users: [], loading: false, showPanel: false, selectedItemClone: undefined, prevSelectedItemIndex: undefined, }; }, computed: { ...mapState(usePermitStore, ["projectGetter"]), ...mapState(useCommonStore, ["isSidebarCollapsed"]), // ...mapState(["isSidebarCollapsed"]), }, methods: { // ...mapActions(["checkPermissions"]), ...mapActions(useCommonStore, ["checkPermissions"]), checkPermisionBeforGetList() { if (this.fetchingData) return; this.fetchingData = true; this.checkPermissions({ _this: this, permission: "users_view" }) .then(() => { this.getUsers() .then(() => { this.canView = true; this.fetchingData = false; }) .catch(() => { this.canView = false; this.fetchingData = false; }); }) .catch(() => { this.canView = false; this.fetchingData = false; }); }, async searchUsers(query = "") { this.resetPagination(); let url = apis.users.search; url = url.replace("{{offset}}", this.pagination.offset); url = url.replace("{{limit}}", this.pagination.limit); url = url.replace("{{sortby}}", this.sorting.sortby); url = url.replace("{{sortorder}}", this.sorting.sortorder); // removing '/' before query if query is empty. if (query) url = url.replace("{{query}}", query); else url = url.replace("/{{query}}", query); return await this.httpService.getRequest(url).then((res) => { this.users = res.data; this.pagination = { ...this.pagination, ...res.pagination }; }); }, async getUsers() { let url = apis.users.list; url = url.replace("{{offset}}", this.pagination.offset); url = url.replace("{{limit}}", this.pagination.limit); url = url.replace("{{sortby}}", this.sorting.sortby); url = url.replace("{{sortorder}}", this.sorting.sortorder); return await this.httpService.getRequest(loginUrl() + url).then((res) => { this.users = res.data; this.pagination = { ...this.pagination, ...res.pagination }; }); }, save(formData = undefined) { if (this.loading) return; this.loading = true; const url = formData.id ? apis.users.update : apis.users.create; this.httpService .postRequest(url, formData) .then((res) => { this.getUsers().then(() => { this.loading = false; }); mySwalToast({ html: res.message, }); this.showPanel = false; this.resetForm(); }) .finally(() => { this.loading = false; }); }, deleteItem(index) { if (this.loading) return; this.loading = true; let userId = this.users[index].id; const payload = { id: userId, }; mySwalConfirm({ title: "هشدار", html: "هشدار!!!!", icon: "warning", }).then((result) => { if (result.isConfirmed) { this.httpService .postRequest(apis.users.delete, payload) .then((res) => { this.getUsers().then(() => { this.loading = false; this.showPanel = false; }); mySwalToast({ html: res.message, }); }); } }); }, resetPagination() { this.pagination = { pages: 0, total: 0, page: 1, offset: 0, limit: 10, }; }, pageLimitChanged(paging) { this.resetPagination(); this.pagination.limit = paging.limit; this.getUsers(); }, 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.getUsers(); }, sortChanged(sorting) { this.pagination.page = this.pagination.offset = 0; this.sorting = sorting; this.getUsers(); }, openCreatePanel() { this.selectedItemClone = undefined; this.showPanel = true; }, toggleUsersPanel(index = undefined) { if (index !== undefined) { if (this.prevSelectedItemIndex !== undefined) this.users[this.prevSelectedItemIndex].active = false; this.prevSelectedItemIndex = index; this.$set(this.users[index], "active", true); this.selectedItemClone = structuredClone(this.users[index]); this.showPanel = true; } else { this.resetForm(); } }, resetForm() { this.selectedItemClone = undefined; this.showPanel = false; }, }, components: { NewUserForm: defineAsyncComponent(() => import("@/components/admin/components/NewUserForm.vue") ), }, }; </script> <style scoped lang="scss"> .side-panel-content { min-width: 19em; } </style>