<template> <!-- #region لیست تمام موجودیت ها --> <div> <div class="navigation mt-3 firefox-scrollbar"> <div v-for="(item, key) in listEntity" :key="key" class="item mt-2" :class="{ active: activeItemClass(item) }" > <div class="d-flex position-relative text-10 mt-2 item-navigation"> <i class="tavasi tavasi-Component-149--3 ms-1" style="color: var(--text-primary-highlight)" ></i> <a @click.prevent="showEntityContent(item, key)" class="text-title" :title="item.title" data-bs-toggle="tooltip" data-placement="top" > {{ getDataValue( item, activeEntityViewSchemaGetter?.entity_title, activeEntityViewSchemaGetter?.list_title ) }} </a> </div> </div> </div> <div class="mt-2 me-auto" style="bottom: 20px" v-if="showPagination"> <div v-if="isMorePagination"> <more-pagination @next-page="pageChanged"></more-pagination> <span class="d-flex justify-content-center mt-2"> از {{ pagination.total }} جلسه مقدار {{ listEntity.length }} جلسه مشاهده شد </span> </div> <!-- <div v-else> <span> تمام موارد را مشاهده کردید </span> </div> --> <no-data v-else> <div 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> <!-- #endregion --> </template> <script> import { mapActions, mapState } from "pinia"; import { useEntityStore } from "@search/stores/entityStore"; import repoApi from "~/apis/repoApi"; /** * @vue-data {Array} [listEntity=[]] - آرایهای از موجودیتها. */ export default { props: ["item"], // mixins: [entityViewMixin], mounted() { if (this.$route.query.listkey) { this.getEntityList( this.$route.params.key, this.$route.params.id, this.$route.query.listkey ); this.showPagination = true; } else if (this.listEntity.length == 0) this.listEntity = this.listEntityGetter; }, computed: { ...mapState(useEntityStore, [ "activeEntityViewSchemaGetter", "activeTabGetter", "listEntityGetter", ]), }, data() { return { listEntity: [], selectedItem: undefined, pagination: { pages: 0, total: 0, page: 1, offset: 0, // page * per_page limit: 15, //per_page }, isMorePagination: true, showPagination: false, }; }, methods: { // ...mapActions(useEntityStore, ["activeResearchTypeSetter"]), ...mapActions(useEntityStore, ["SET_ITEM_ENTITY"]), pageChanged(paging) { // let page = paging.pageNumber; // page -= 1; if (this.pagination.offset <= this.pagination.total) { this.pagination.offset = this.pagination.page * this.pagination.limit; this.pagination.limit = this.pagination.limit; this.pagination.page++; this.getEntityList( this.$route.params.key, this.$route.params.id, this.$route.query.listkey ); } }, /** * این تابع لیست موجودیتها را بر اساس نوع موجودیت، شناسه موجودیت و کلید لیست دریافت میکند. * @param {string} _entityType - نوع موجودیت * @param {string} _entityId - شناسه موجودیت * @param {string} _listKey - کلید لیست */ async getEntityList(_entityType, _entityId, _listKey) { this.entity_type = _entityType; let url = repoApi.public.list; url = url.replace("{{index_key}}", _entityType); url = url.replace("{{entity_id}}", _entityId); url = url.replace("{{list_key}}", _listKey); url = url.replace("{{offset}}", this.pagination.offset); url = url.replace("{{limit}}", this.pagination.limit); try { const { $api } = useNuxtApp(); const res = await $api(url, { baseURL: repoUrl(), body: { organ: this.organNameGetter, system: "search", build_state: buildState(), }, }); this.listEntity.push(...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 }; if (this.pagination.offset >= this.pagination.total) { this.isMorePagination = false; } } catch (err) {} }, /** * این تابع مقدار دادهای خاص از آیتم و کلید داده شده را بازمیگرداند. * @param {Object} item - آیتم داده * @param {string} key - کلید داده * @param {Object} [list_title] - قالب و کلیدهای لیست عنوان (اختیاری) * @returns {string} - مقدار دادهای */ getDataValue(item, key, list_title = undefined) { if (!key) key = "title"; let text = ""; if (list_title) { text = list_title.template; list_title.keys.forEach((el) => { if (item._source[el.key]) { let tt = item._source[el.key]; if (el.isDate) { tt = new Date(tt).toLocaleDateString("fa-IR"); } text = text.replace("{" + el.key + "}", tt); } else { let tt = item._source.title; if (el.isDate) { tt = new Date(tt).toLocaleDateString("fa-IR"); } text = text.replace("{" + el.key + "}", tt); } }); } else text = item._source[key]; return text; }, /** * این تابع محتوای موجودیت را نمایش میدهد و آیتم را به روز میکند. * @param {Object} item - آیتم موجودیت * @param {string} key - کلید موجودیت */ showEntityContent(item, key) { this.selectedItem = item; let _id = item._id; if ( this.$route.params?.key == "qasection" || this.$route.params?.key == "rgsection" ) { _id = item._source?.qanon_id; } let _listkey = this.$route.query.listkey; let name = "navigationView"; if (_listkey) name = "navigation"; this.SET_ITEM_ENTITY(item); this.appendclass(); this.$router .push({ name: name, params: { id: _id, key: this.$route.params?.key, }, query: { searchtext: this.textSearch ?? undefined, listkey: _listkey, }, }) .catch(() => {}); }, /** * این تابع آدرس URL مرتبط با شناسه داده شده را بازمیگرداند. * @param {string} _id - شناسه موجودیت * @returns {string} - آدرس URL */ urlResolver(_id) { let key = this.activeEntityViewSchemaGetter?.key; const routeData = this.$router.resolve({ name: "navigationView", params: { id: _id, key: key, }, query: { searchtext: this.$route.query.searchtext ?? undefined, }, }); return routeData.href; }, /** * این تابع کلاس فعال را به آیتم اضافه میکند. * @param {Object} item - آیتم موجودیت * @returns {boolean} - وضعیت فعال بودن آیتم */ activeItemClass(item) { let id = item._id ?? item.id_store; let id_select = this.$route.params.id; if ( this.$route.params.key == "rgsection" || this.$route.params.key == "qasection" ) { id = item.qanon_id; if (this.selectedItem) { id_select = this.selectedItem.qanon_id; } } else { if (this.selectedItem) { id_select = this.selectedItem._id ?? this.selectedItem.id_store; } } return id_select == id; }, /** * این تابع کلاس "active" را به آیتمی که کاربر بر روی آن کلیک کرده است اضافه میکند و از بقیه آیتمها حذف میکند. */ appendclass() { const listItems = document.querySelectorAll(".item"); listItems.forEach(function (item) { item.addEventListener("click", function () { // حذف کلاس "active" از همه المانهای لیست listItems.forEach(function (item) { item.classList.remove("active"); }); // اضافه کردن کلاس "active" به المانی که کاربر بر روی آن کلیک کرده است this.classList.add("active"); }); }); }, }, }; </script> <style lang="scss" scoped> .text-title { font-size: 13px; text-decoration: none; color: #465a71; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; padding: 0.3em; } .navigation { height: calc(100% - 5em); overflow: auto; background-color: var(--main-background-white); .item { &.active { .text-title { background-color: var(--hover-color); } } } } </style>