base_ui/pages/notifications/index.vue

494 lines
15 KiB
Vue
Raw Permalink Normal View History

2025-02-01 09:34:55 +00:00
<template>
<div>
<NuxtLayout name="default" :menu="sidbarMenu">
<div class="container-fluid">
<div class="row">
<div class="col-12">
<div v-if="canView">
<div class="user__container">
<div class="d-flex justify-content-between align-items-center">
<div>
<h3>
{{ $t("Notifications") }}
</h3>
<p class="text__light text__13">
شما {{ list?.length }} اعلان خوانده نشده دارید.
</p>
</div>
<div>
<button-component
@click="markAll()"
buttonText="همه را خواندم"
v-tooltip="'همه را خواندم'"
classes="btn btn-primary"
>
</button-component>
</div>
</div>
<ul class="nav nav-tabs">
<li class="nav-item">
<button
title="همه"
type="button"
@click.prevent="filterNotifications('all')"
class="btn nav-link"
:class="{
active: activeTab == 'all',
}"
>
<span class="badge badge-light">{{
counts?.data?.all?.count
}}</span>
همه
</button>
</li>
<li class="nav-item">
<button
title="جدید"
type="button"
@click.prevent="filterNotifications('new')"
class="btn nav-link"
:class="{
active: activeTab == 'new',
}"
>
<span class="badge badge-light">{{
counts?.data?.new?.count
}}</span>
جدید
</button>
</li>
<li class="nav-item">
<button
title="خوانده نشده ها"
type="button"
@click.prevent="filterNotifications('unseen')"
class="btn nav-link"
:class="{
active: activeTab == 'unseen',
}"
>
<span class="badge badge-light">{{
counts?.data?.unseen?.count
}}</span>
خوانده نشده ها
</button>
</li>
<li class="nav-item">
<button
title="خوانده شده ها"
type="button"
@click.prevent="filterNotifications('seen')"
class="btn nav-link"
:class="{
active: activeTab == 'seen',
}"
>
<span class="badge badge-light">{{
counts?.data?.seen?.count
}}</span>
خوانده شده ها
</button>
</li>
</ul>
<the-content-loading
class="absolute-positioning"
v-if="fetchingData"
></the-content-loading>
<div v-else>
<div v-if="list && list.length">
<div class="notif-list firefox-scrollbar">
<notification-item
v-for="(item, index) in list"
:item="item"
:index="index"
:key="item._id"
@getList="getList"
@go-to-notification-show-page="
goToNotificationShowPage(item)
"
></notification-item>
</div>
<jahat-pagination
v-if="pagination.total"
:paginationInfo="pagination"
@page-changed="pageChanged"
@page-limit-changed="pageLimitChanged"
@sort-changed="sortChanged"
>
</jahat-pagination>
</div>
<no-data v-else></no-data>
</div>
</div>
</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>
</div>
</div>
</NuxtLayout>
</div>
</template>
<script lang="ts">
// import notificationMixin from "~/composables/notifications/notificationMixin";
import { mapActions, mapState } from "pinia";
import { useAuthStore } from "~/stores/authStore";
import { useCommonStore } from "~/stores/commonStore";
import type { Pagination } from "~/types/commonTypes";
import apis from "~/apis/adminApi";
import type { counts, listNotification } from "~/types/notificationTypes";
import monirMenu from "~/json/dashboard/monir/menu.json";
import majlesMenu from "~/json/dashboard/majles/menuDefault.json";
export default {
setup() {
definePageMeta({
layout: false,
// layout: "dashboard-layout",
});
},
data() {
return {
// httpService: undefined,
activeTab: "all",
canView: false,
fetchingData: false,
listUnseen: [],
countUnseen: undefined,
list: [] as listNotification[],
counts: {} as counts,
notificationItem: undefined,
buttonLoading: false,
pagination: {
total: 0,
pages: 0,
page: 1,
offset: 0,
limit: 10,
} as Pagination,
sorting: {},
};
},
mounted() {
if (this.isRealUser) {
this.canView = true;
this.getList();
this.numberOfMark();
}
// else this.canView = false;
// this.checkPermisionBeforGetList("notifications_users").then(() => {
// this.getList();
// });
},
computed: {
...mapState(useAuthStore, ["isRealUser"]),
sidbarMenu() {
if (isMajlesBuild()) return majlesMenu;
else return monirMenu;
},
},
methods: {
...mapActions(useCommonStore, ["checkPermissions"]),
filterNotifications(newTab: string) {
this.activeTab = newTab;
this.getList();
},
// async checkPermisionBeforGetList(permission) {
// if (this.fetchingData) return;
// this.fetchingData = true;
// return await this.checkPermissions({ permission, _this: this })
// .then(() => {
// this.canView = true;
// // this.fetchingData = false;
// })
// .catch(() => {
// this.canView = false;
// this.fetchingData = false;
// });
// },
// detelte item.
// async deleteItem({ _id }) {
// if (this.buttonLoading) return;
// this.buttonLoading = true;
// var url = adminApi.notification.delete;
// url = url.replace("{{id}}", _id);
// url = url.replace("{{entity_type}}", "notif");
// return await this.httpService
// .postRequest(url)
// .then((res) => {
// this.mySwalToast({
// title: "تبریک",
// html: res.message,
// icon: "success",
// });
// })
// .catch((error) => {})
// .finally(() => {
// this.buttonLoading = false;
// });
// try {
// const { $api } = useNuxtApp();
// const data: resModelThree = await $api(apis.captcha, {
// baseURL: import.meta.env.VITE_AUTH_BASE_URL,
// method: "GET",
// });
// } catch (err) {
//
// }
// },
// Getting notification item.
// getNotificationItem(id) {
// let url = adminApi.notification.get;
// url = url.replace("{{id}}", id);
// this.httpService
// .getRequest(url)
// .then((res) => {
// this.notificationItem = res;
// })
// .catch(() => {})
// .finally(() => {
// this.fetchingData = false;
// });
// },
// admin
async getList() {
// console.log("Offset:", this.pagination.offset);
// console.log("Limit:", this.pagination.limit);
// this.httpService
// .getRequest(url)
// .then((res) => {
// this.list = res.hits.hits;
// this.numberOfMark();
// const total = res.hits.total.value;
// const pages = Math.ceil(total / this.pagination.limit);
// const pagination = {
// total: total,
// pages: pages == 0 ? 1 : pages,
// };
// this.pagination = { ...this.pagination, ...pagination };
// })
// .catch(() => {})
// .finally(() => {
// this.fetchingData = false;
// });
let url =
apis.notification[this.activeTab as keyof typeof apis.notification];
let offset: number = this.pagination.offset;
let limit: number = this.pagination.limit;
url = url.replace("{{offset}}", offset as unknown as string);
url = url.replace("{{limit}}", limit as unknown as string);
try {
const { $api } = useNuxtApp();
const data: resModelThree = await $api(url, {
baseURL: repoUrl(),
method: "GET",
});
this.list = data.hits.hits;
} catch (err) {}
},
//user
// getListUnseen() {
// let url = adminApi.notification.listUnseen;
// url = url.replace("{{offset}}", this.pagination.offset);
// url = url.replace("{{limit}}", this.pagination.limit);
// this.httpService
// .getRequest(url)
// .then((res) => {
// this.listUnseen = res.hits.hits;
// const total = res.hits.total.value;
// const pages = Math.ceil(total / this.pagination.limit);
// const pagination = {
// total: total,
// pages: pages == 0 ? 1 : pages,
// };
// this.pagination = { ...this.pagination, ...pagination };
// })
// .catch(() => {})
// .finally(() => {
// this.fetchingData = false;
// });
// },
// user
// getCountUnseen() {
// const url = adminApi.notification.countUnseen;
// this.httpService
// .getRequest(url)
// .then((res) => {
// this.countUnseen = res.count;
// })
// .catch(() => {})
// .finally(() => {});
// },
goToNotificationShowPage(item: object) {
this.$router.push({
name: "notificationsShow",
params: {
// id: item._id,
id: (item as { _id: string })._id,
},
});
},
// goToNotificationPage() {
// this.$router.push({
// name: "notifications",
// });
// },
resetPagination() {
this.pagination = {
pages: 0,
total: 0,
page: 1,
offset: 0,
limit: 10,
};
},
pageLimitChanged(paging: object) {
this.resetPagination();
let limit: number = this.pagination.limit;
limit = (paging as { limit: number }).limit;
this.getList();
},
pageChanged(paging: object) {
let page = (paging as { pageNumber: number }).pageNumber;
page -= 1;
let offset: number = this.pagination.offset;
let limit: number = this.pagination.limit;
offset = page * (paging as { limit: number }).limit;
limit = (paging as { limit: number }).limit;
page = (paging as { pageNumber: number }).pageNumber;
this.getList();
},
sortChanged(sorting: object, paging: object) {
// keep limit status.
// reset page and offset values.
let page = (paging as { pageNumber: number }).pageNumber;
page = this.pagination.offset = 0;
this.sorting = sorting;
this.getList();
},
// timeSince(timeStamp) {
// var date = new Date(timeStamp * 1000);
// var seconds = Math.floor((new Date() - date) / 1000);
// var interval = seconds / 31536000;
// if (interval > 1) {
// return Math.floor(interval) + " سال";
// }
// interval = seconds / 2592000;
// if (interval > 1) {
// return Math.floor(interval) + " ماه";
// }
// interval = seconds / 86400;
// if (interval > 1) {
// return Math.floor(interval) + " روز";
// }
// interval = seconds / 3600;
// if (interval > 1) {
// return Math.floor(interval) + " ساعت";
// }
// interval = seconds / 60;
// if (interval > 1) {
// return Math.floor(interval) + " دقیقه";
// }
// return Math.floor(seconds) + " ثانیه";
// },
async markAll() {
// let url = adminApi.notification.markAllAsRead;
// this.httpService
// .postRequest(url)
// .then((res) => {
// this.getList();
// this.mySwalToast({
// html: res?.message ?? "با موفقیت تغییر یافت.",
// });
// this.numberOfMark();
// })
// .catch(() => {})
// .finally(() => {});
try {
const { $api } = useNuxtApp();
const data: resModelThree = await $api(
apis.notification.markAllAsRead,
{
baseURL: repoUrl(),
method: "POST",
}
);
} catch (err) {}
},
async numberOfMark() {
// let url = adminApi.notification.counts;
// url = url.replace("{{data_type}}", this.data_type);
// this.httpService
// .getRequest(url)
// .then((res) => {
// this.counts = res.data;
// })
// .catch(() => {})
// .finally(() => {});
try {
const { $api } = useNuxtApp();
const data: counts = await $api(apis.notification.counts, {
baseURL: repoUrl(),
method: "GET",
});
this.counts = data;
} catch (err) {}
},
},
};
</script>