base_ui/pages/notifications/index.vue
2025-02-01 13:04:55 +03:30

494 lines
15 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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>