<template> <div class="emamain-content"> <div class="" v-if="listAnswer?.length"> <div class="search-items firefox-scrollbar"> <div class="search-items__item mb-5 mt-4 me-2" v-for="(item, i) in listAnswer" :key="i" > <div class="search-items__header"> <a class="search-items__label text__13 text__dark-gray"> {{ item._source.type }}</a > <a v-if="item._source.title || item._source.subtitle" class="search-items__title text__15 text__blue" :href="item._source.url" @click.prevent="showtext(item._source, listAnswer, i, item._id)" @auxclick.prevent.stop=" showtext(item._source, listAnswer, i, item._id) " > {{ item._source.title ?? subtitle }} </a> <!-- <a :href="item._source.url" target="_blank" class="search-items__title text__15 text__blue" > {{ item._source.title }} </a> --> </div> <div class="text__15 text__dark-gray search-items__code"> <span style="margin-left: 10px" >سایت : {{ item._source.author }}</span > <span style="margin-left: 10px" >تاریخ : {{ item._source.date }}</span > </div> <div v-html="highlightText(item)" class="search-items__detail text__15 line-clamp__2" ></div> <div class="search-items__content"> <div v-if="item._source.tags" class="text__15 line-clamp__2"> <span style="margin-left: 10px">برچسب : </span> <span class="text__dark-gray">{{ textTags(item) }} </span> </div> </div> </div> <!-- <div v-if="maxPage > 0" class="search-items__pagination" style="font-family: Sahel" > <ul> <li class="prev"><a @click="nextPage(1)">بعدی</a></li> <li :class="{ active: maxPage === currentPage }"> <a @click="setPage(maxPage)">{{ maxPage }}</a> </li> <li v-if="endPage < maxPage - 1"> <a @click="setPage(-2)">...</a> </li> <li v-for="(item, i) in listPage" :key="i" :class="{ active: item === currentPage }" > <a @click="setPage(item)">{{ item }}</a> </li> <li v-if="beginPage > 2"><a @click="setPage(-1)">...</a></li> <li :class="{ active: 1 === currentPage }"> <a @click="setPage(1)">1</a> </li> <li class="next"><a @click="nextPage(-1)">قبلی</a></li> </ul> </div> --> </div> <jahat-pagination style="font-size: 13px; border-top: 2px solid #dee2e6" 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> </template> <script> import idbUtil from "~/mixins/idb.js"; /** * @vue-prop {Object} [pagination=] - صفحه بندی * * * @data {Array} listAnswer - آرایهای برای ذخیره لیست پاسخها. * @data {number} totalCount - تعداد کل آیتمها. * @data {string} typeCount - رشتهای که نوع شمارش را نشان میدهد. * @data {number} countInPage - تعداد آیتمها در هر صفحه. * @data {number} maxPage - حداکثر تعداد صفحات. * @data {number} currentPage - شماره صفحه فعلی. * @data {number} beginPage - شماره صفحه شروع. * @data {number} endPage - شماره صفحه پایان. * @data {Array} listPage - آرایهای برای ذخیره شماره صفحات. * @data {string} textSearch - متن جستجو. * @data {Object} pag - پیکربندی صفحهبندی. * @data {Object} sorting - تنظیمات مرتبسازی. * @data {string} sorting.sortby - فیلدی که بر اساس آن مرتبسازی انجام میشود. * @data {string|undefined} sorting.sortorder - ترتیب مرتبسازی (صعودی، نزولی یا هیچ). */ export default { name: "EmamainContent", mixins: [idbUtil], props: { // summeryKeys: { // default() { // return []; // }, // }, pagination: { default() { return {}; }, }, // listSelectedPoint: { // default() { // return []; // }, // }, activeTabGetter: { default() { return {}; }, }, showActions: { default: true, }, }, async beforeMount() { this.db = await this.getDb(this.activeTabGetter.key); this.ready = true; }, mounted() { window.scrollTo(0, 0); if (this.$route.query.q) this.searchText = this.$route.query.q; }, data() { return { listAnswer: [], totalCount: 0, typeCount: "", countInPage: 0, maxPage: 0, currentPage: 1, beginPage: 1, endPage: 1, listPage: [], textSearch: "", pag: this.pagination, sorting: { sortby: "created", sortorder: undefined, // asc | desc | none }, // iscode: true, }; }, methods: { /** * نمایش متن آیتم در یک تب جدید * @param {Object} item - آیتم مورد نظر * @param {Array} listAnswer - لیست پاسخها * @param {Number} i - اندیس آیتم * @param {String} _id - شناسه آیتم */ // item._source, listAnswer, i, item._id async showtext(_source, listAnswer, rowItem, _id) { let cloneList = structuredClone(listAnswer); cloneList.forEach((item, index) => { cloneList[index] = { ...item, ..._source }; }); let cloneItem = structuredClone(rowItem); cloneItem = { ...rowItem, _id: _id }; const enableIdb = Boolean(import.meta.env.VITE_ENABLE_IDB); if (enableIdb) { this.addDisabled = true; await this.addToIdb(this.activeTabGetter.key, cloneItem); this.addDisabled = false; } window.open(_source.url, "_blank"); }, /** * استخراج و بازگرداندن متن هایلایت شده از آیتم * @param {Object} item - آیتم مورد بررسی * @returns {String} - متن هایلایت شده */ highlightText(item) { var text = ""; if (item.highlight) { if (item.highlight.text) text = item.highlight.text.join("... "); } return text; }, /** * تبدیل تاریخ آیتم به فرمت شمسی * @param {Object} item - آیتم مورد بررسی * @returns {String} - تاریخ به فرمت شمسی */ datefa(item) { var d = new Date(item._source.date).toLocaleDateString("fa-IR"); return d; }, /** * تنظیم پاسخها و محاسبه صفحهبندی * @param {Array} list - لیست پاسخها * @param {Number} count - تعداد کل آیتمها * @param {String} _typeCount - نوع تعداد (مساوی یا بیشتر از) */ setAnswer: function (list, count = -1, _typeCount = "") { if (count != -1) { this.totalCount = count; this.typeCount = _typeCount == "eq" ? "مساوی با " : "بیشتر از "; this.maxPage = this.totalCount == 0 ? 0 : Math.floor(this.totalCount / this.countInPage) + 1; this.currentPage = 1; this.beginPage = 2; this.endPage = this.beginPage + 3; if (this.endPage > this.maxPage - 1) { this.endPage = this.maxPage - 1; if (this.beginPage > 2) this.beginPage = this.beginPage - 1; } this.updateListPage(); } const total = count; const pages = Math.ceil(total / this.pag.limit); const pagination = { total: total, pages: pages == 0 ? 1 : pages, }; this.pag = { ...this.pagination, ...pagination }; this.listAnswer = list; this.scrollToTop(); localStorage.setItem("answer", JSON.stringify(this.listAnswer)); }, /** * بهروزرسانی لیست صفحات */ updateListPage: function () { this.listPage = []; for (let i = this.endPage; i >= this.beginPage; i--) { this.listPage.push(i); } }, /** * تغییر به صفحه بعدی یا قبلی * @param {Number} item - مقدار تغییر (مثبت یا منفی) */ nextPage: function (item) { if (item > 0) this.setPage(this.currentPage + 1); else this.setPage(this.currentPage - 1); }, /** * تنظیم صفحه فعلی و بهروزرسانی صفحات * @param {Number} item - شماره صفحه یا کد ویژه (برای شروع یا پایان) */ setPage: function (item) { if (item == -1) { // begin ... item = 3; this.beginPage = 2; this.endPage = 5; } else if (item == -2) { // end ... item = this.maxPage - 3; this.beginPage = this.maxPage - 5; this.endPage = this.maxPage - 1; } else if (item == this.beginPage) { this.beginPage--; if (this.beginPage > 5) { this.beginPage--; this.endPage--; } else { this.beginPage = 2; this.endPage = 5; } } else if (item == this.endPage) { if (this.endPage < this.maxPage - 5) { this.endPage++; this.beginPage++; } else { this.beginPage = this.maxPage - 5; this.endPage = this.maxPage - 1; } } this.updateListPage(); this.currentPage = item; this.$emit("changePage", item - 1); }, /** * تغییر آیتم فعلی و ارسال آن با استفاده از رویداد * @param {Number} i - اندیس آیتم در لیست پاسخها */ changeCurrent: function (i) { this.$emit("changeCurrent", this.listAnswer[i]); }, /** * تنظیم متن جستجو و تعداد آیتمها در هر صفحه * @param {String} item - متن جستجو * @param {Number} countInPage - تعداد آیتمها در هر صفحه */ setTextSearch(item, countInPage) { this.textSearch = item; this.countInPage = countInPage; }, /** * اسکرول کردن صفحه به بالای آن */ scrollToTop() { window.scrollTo(0, 0); }, /** * تبدیل تگهای آیتم به یک رشته متن * @param {Object} item - آیتم مورد بررسی * @returns {String} - تگهای آیتم به صورت رشتهای از هم جدا شده با کاما */ textTags(item) { let text = ""; if (Array.isArray(item._source.tags)) text = item._source.tags.join("، "); else text = item._source.tags; return text; }, /** * تغییر تعداد آیتمها در هر صفحه و بازنشانی صفحهبندی * @param {Object} paging - اطلاعات صفحهبندی */ pageLimitChanged(paging) { this.resetPagination(); this.pag.limit = paging.limit; this.$emit("changePage", this.pag); }, /** * تغییر صفحه و بازنشانی صفحهبندی * @param {Object} paging - اطلاعات صفحهبندی */ pageChanged(paging) { let page = paging.pageNumber; page -= 1; this.pag.offset = page * paging.limit; this.pag.limit = paging.limit; this.pag.page = paging.pageNumber; this.$emit("changePage", this.pag); }, /** * تغییر ترتیب صفحهبندی و بازنشانی صفحهبندی * @param {Object} sorting - اطلاعات ترتیب */ sortChanged(sorting) { this.pag.page = this.pag.offset = 0; this.sorting = sorting; this.$emit("changePage", this.sorting); }, /** * بازنشانی صفحهبندی به مقادیر اولیه */ resetPagination() { this.pag = { pages: 0, total: 0, page: 1, offset: 0, limit: 10, }; }, /** * دریافت لیست آیتمها بر اساس نوع موجودیت * @param {String} _entityType - نوع موجودیت */ getList(_entityType) { if (this.fetchingData) return; this.fetchingData = true; this.entity_type = _entityType; let url = searchApi.Farhanghestan.search_normal + `/${this.pag.offset}/${this.pag.limit}`; this.httpService.getRequest(url).then((res) => { this.listEntity = res.hits.hits; const total = res.hits.total.value; const pages = Math.ceil(total / this.pag.limit); const pagination = { total: total, pages: pages == 0 ? 1 : pages, }; this.pag = { ...this.pagination, ...pagination }; this.fetchingData = false; }); }, }, }; </script> <style lang="scss" scoped> .detail-page__content { position: initial; margin-right: 0 !important; } .detail-page__content { right: 79px !important; } @media screen and (min-width: 992px) { .search-system .detail-page .detail-page__content .detail-page__tab-content { position: initial; margin: 0 !important; /* margin-right: 310px; */ } } </style> <style lang="scss" scoped> // .detail-page__tab-content { // width: 90%; // margin-right: 0 !important; // position: relative; // &.serve-majles { // width: 100%; // } // } // .search-items { // overflow-y: auto; // height: calc(100vh - 13em); // } .search-items__item { position: relative; padding: 1em; overflow: hidden; &:not(:last-child) { margin-bottom: 30px; } &:hover, &.active { background-color: var(--list-background-color); .search-item__actions { // width: 6.5em; width: auto; transition: width 0.5s; background: #fff; border-radius: 0 0.5em 0.5em 0; .tavasi-more-vert { transition: all 0.2s; display: none; } } } } .search-item__actions { position: absolute; left: 0; width: 1.6em; top: 1em; // overflow: hidden; transition: all 0.5s; display: flex; align-items: center; .btn { display: flex; align-items: center; justify-content: center; padding: 0.175rem 0.35rem; &:hover { filter: brightness(0.7); } .icon-copy2 { font-size: 0.8rem; } &.favorites { color: calc(--primary-color); .icon-bookmark-1, .icon-bookmark-2 { height: 1.3em; } } } } // .detail-page__content { // top: 35px !important; // } // @media only screen and (min-width: 576px) and (max-width: 767.98px) { // .detail-page__content { // top: 170px !important; // } // } // @media (max-width: 575.98px) { // .detail-page__content { // top: 170px !important; // } // } // @media (max-width: 575.98px) { // } // @media only screen and (min-width: 576px) and (max-width: 767.98px) { // .detail-page__tab-content { // max-width: 500px; // } // } // @media only screen and (min-width: 768px) and (max-width: 900.98px) { // .detail-page__tab-content { // max-width: 600px; // } // } // @media only screen and (min-width: 901px) and (max-width: 1049.98px) { // .detail-page__tab-content { // max-width: 900px; // } // } // @media (min-width: 1050px) { // } </style>