<template> <SearchLayout :menu="sidbarMenu"> <div class="searchNavigation"> <div class="container-fluid"> <div class="row main-page__content-header"> <div class="col"> <div class="row border-bottom"> <div class="col-12 order-1 order-lg-1 col-lg-3 d-flex justify-content-start" > <div class="d-flex align-items-center mb-1"> <button name="button" type="button" class="toggle-mobile-nav dropdown-hamburger d-md-none" @click.prevent="toggleSidebarMenu()" > <span class="sr-only">باز کردن منوی کنار</span> <svg class="s18" data-testid="sidebar-icon"> <use href="assets/common/img/icons.svg#sidebar"></use> </svg> </button> <div v-if="!isMajlesBuild()" class="d-flex align-items-center" > <label for="repositories-desktop" class="float-labels no-wrap ms-2" > فهرستهای مرتبط با مخزن داده: </label> <USelectMenu v-model="selectedListItem" :options="searchListSchemaGetter" @update:model-value="onSelectNavigation" > </USelectMenu> <!-- <multiselect v-if="searchListSchemaGetter?.length" :searchable="true" :close-on-select="true" :show-labels="false" label="label" track-by="key" placeholder="انتخاب فهرست" :value="searchListActiveSchemaGetter" :options="searchListSchemaGetter" @select="onSelectNavigation" :hide-selected="false" :max-height="250" :width="50" openDirection="rtl" id="repositories-desktop" class="multiselect" > </multiselect> --> </div> </div> </div> <div class="col-12 order-2 order-lg-1 col-lg-7"> <div class="nav-tabs-container nav-tabs border-bottom-0"> <div class="d-lg-none"> <button class="btn" @click.prevent="openNavigationFilter(2)" > <svg class="icon icon-Component-356--1"> <use xlink:href="#icon-Component-356--1"></use> </svg> </button> </div> <ul class="nav"> <li class="nav-item desktop" v-for="(navItem, index) in navTabs" :key="index" > <button :title="navItem.label" type="button" @click.prevent="updateCategoryList(navItem, index)" class="btn nav-link" :class="{ active: searchListActiveTabGetter?.key == navItem.key, }" > {{ navItem.label }} </button> </li> <li class="nav-item mobile tabs-more-btn d-md-none" v-if="navTabs?.length > 2" > <div class="dropdown"> <button class="btn" type="button" id="dropdownMenuButton" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" > <svg class="icon icon-Component-81--1"> <use xlink:href="#icon-Component-81--1"></use> </svg> </button> <div class="dropdown-menu" aria-labelledby="dropdownMenuButton" > <a v-if="navItem?.key !== 'custome'" class="dropdown-item" @click.prevent="updateCategoryList(navItem, index)" v-for="(navItem, index) in navTabs" :key="index" :class="{ active: searchListActiveTabGetter?.key == navItem.key, }" >{{ navItem.label }}</a > </div> </div> </li> </ul> </div> </div> <!-- <div class="col-1 order-1 order-lg-1 col-lg-1 d-flex justify-content-end"> <button class="btn" style="z-index: 9" v-if="activeTab?.key == 'custome'" @click.prevent=" selectedNavigationFilter = !selectedNavigationFilter " > <svg class="icon icon-filter"> <use xlink:href="#icon-filter"></use> </svg> </button> </div> --> </div> <!-- #region show only in custom tab --> <div class="d-flex pt-2 pb-2 justify-content-center custom-filter-container flex-column flex-lg-row" v-if="searchListActiveTabGetter?.key == 'custome'" > <div class="me-2 d-block align-items-center" v-if="searchListActiveSchemaGetter" > <label class="multiselect-lable ms-1" for="" >سطح اول فهرست:</label > <USelectMenu :popper="{ placement: 'left-end' }" searchable searchable-placeholder="Search a person..." v-model:query="fieldOneQuery" v-if="searchListActiveSchemaGetter?.info?.items?.length" option-attribute="title" placeholder="انتخاب کنید" v-model="fieldOne" :options="searchListActiveSchemaGetter?.info?.items" @update:model-value="onComboChanged()" > </USelectMenu> </div> <div class="me-3 ms-2 align-items-center d-none d-lg-block" v-if="searchListActiveSchemaGetter" > <label class="multiselect-lable ms-1" for="">سطح دوم:</label> <USelectMenu :popper="{ placement: 'left-end' }" searchable searchable-placeholder="Search a person..." v-model:query="fieldTwoQuery" v-if="searchListActiveSchemaGetter?.info?.items?.length" option-attribute="title" placeholder="انتخاب کنید" v-model="fieldTwo" :options="searchListActiveSchemaGetter?.info?.items" @update:model-value="onComboChanged()" > </USelectMenu> </div> <div class="me-2 align-items-center d-none d-lg-block" v-if="searchListActiveSchemaGetter" > <label class="multiselect-lable ms-1" for="">سطح سوم:</label> <USelectMenu :popper="{ placement: 'left-end' }" searchable searchable-placeholder="Search a person..." v-model:query="fieldThreeQuery" v-if="searchListActiveSchemaGetter?.info?.items?.length" option-attribute="title" placeholder="انتخاب کنید" v-model="fieldThree" :options="searchListActiveSchemaGetter?.info?.items" @update:model-value="onComboChanged()" > </USelectMenu> </div> </div> <!-- #endregion show only in custom tab --> </div> </div> <div class="row"> <div class="col-md-4 col-lg-3 pe-0"> <div class="pages-content" ref="navigationFilter"> <search-navigation-filter v-if="searchListActiveTabGetter?.key == 'custome'" :fieldThree="fieldThree" :fieldTwo="fieldTwo" :fieldOne="fieldOne" :fields="fields" :key="componentCounter" :class="{ 'show-list-panel': showListPanel }" @can-view="canView = $event" ref="panel" @statusPag="statusPag2" @isShowPag="isShowPag" @list-changed="setList" @update-meta="metaItems = $event" @list-item-changed="setListItem" @hide-panel="showToggleListPanel" ></search-navigation-filter> <div v-else> <category-list v-if="dataCatched" ref="categorylist" :activeTab="searchListActiveTabGetter" :selectedNavigation="searchListActiveSchemaGetter" :lastSearchInListMode="lastSearchInListMode" :treeLists="treeLists" @filterUpdate="filterUpdate" @list-changed="listChanged" @set-selected-list="updateTitle" @show-category="showCategory" :key="componentCounter" ></category-list> </div> </div> </div> <div class="col-md-8 col-lg-9"> <div class="tabel-main"> <div class="tab-content py-2 px-3" id="myTabContent"> <div class="container-fluid"> <div class="row"> <div class="col-12 col-md-6 d-flex align-items-center"> <!-- <div class="navigation-filter dropdown-hamburger"> <button class="btn" @click.prevent="openNavigationFilter(2)" style="z-index: 9" > <svg class="icon icon-Component-158--5"> <use xlink:href="#icon-Component-158--5"></use> </svg> </button> </div> --> <div class="d-flex w-100 overflow-hidden text-truncate" v-if="selectionFilterItemsGetter?.length <= 0" v-html="currentPathHtml" ></div> <div class="d-flex w-100" style="height: 4em" v-if="selectionFilterItemsGetter?.length" > <div class="me-1 d-flex w-100 overflow-hidden flex-column" > <a @click.prevent="emptyFilter()" class="filters__delete text__12" >حذف فیلترها </a> <search-filter :filters="selectionFilterItemsGetter" @remove-filter="delFilterItem" class="filter-items" ></search-filter> </div> </div> </div> <div class="col-12 col-md-6 d-flex align-items-center justify-content-end" > <sub-header :enableNewButton="false" :canCreate="'item_new'" :title="tableTitle" @view-mode-switched="switchViewMode" @filterSelect="filterSelect" class="sub-header" :key="rerenderSubheader" ></sub-header> <!-- v-if="listAggregations" --> <button class="btn" @click.prevent=" openModalFilter('SearchFilterModal', '') " style="z-index: 9" > <svg class="icon icon-filter-list"> <use xlink:href="#icon-filter-list"></use> </svg> </button> <div class="select-export-container mt-2"> <div class="dropdown"> <button class="btn btn-outline-light border-0" type="button" data-bs-toggle="dropdown" aria-expanded="false" > <span class="tavasi tavasi-excel-file-2 ms-1" ></span> </button> <div class="dropdown-menu"> <button class="dropdown-item" type="button" :disabled="fetchingDataForExport" @click="exportJsonToExcel('current')" value="current" > جاری </button> <button class="dropdown-item" type="button" :disabled="fetchingDataForExport" @click="exportJsonToExcel('all')" value="all" > همه </button> </div> </div> </div> <!-- <button class="btn" style="z-index: 9" v-if="activeTab?.key == 'custome'" @click.prevent=" selectedNavigationFilter = !selectedNavigationFilter " > <svg class="icon icon-filter"> <use xlink:href="#icon-filter"></use> </svg> </button> --> </div> </div> </div> <div class="tab-pane fade show active d-flex" id="table" role="tabpanel" aria-labelledby="table-tab" > <template v-if="canView"> <!-- <my-table :height="heightHandler('table')" v-if="viewMode === 'table'" :isDraggable="true" :hasSearch="false" :hasSubject="true" :hasSummary="true" :fetchingData="fetchingData" :items="listItem" :tableColumns="getTableColumns" :tableActions="tableActions" :paginationInfo="pagination" :sortingInfo="sorting" @update-order="updateOrder" @show-details="showDetails" @open-form="openForm" @show-text="showTextPage" @page-changed="pageChanged" @page-limit-changed="pageLimitChanged" @sort-changed="sortChanged" @search="searchInTable" @on-linked-title-click="onOnLinkedTitleClick" :showHeaderSortButton="false" class="my-table" > </my-table> --> <!-- :height="heightHandler('list')" --> <!-- :summeryKeys="['content', 'mindex', 'mintro']" --> <template v-if="fetchingData"> <the-content-loading :loadingTitle="'در حال دریافت اطلاعات'" class="table-loading" ></the-content-loading> </template> <template v-else> <MyContent :key="reRender" :pagination="pagination" :viewMode="viewMode" @changeCurrent="changeCurrent" @changePage="changePaging" :schemaItems=" searchListActiveSchemaGetter?.search_content " :items="listHits" :tableColumns=" searchListActiveSchemaGetter?.table_columns " :tableActions=" tableColumnsHandler(searchListActiveTabGetter) " class="col-12" > </MyContent> </template> <!-- <component v-if="dataCatched" :showActions="false" class="flex-grow-1" :key="reRender" :is="contentComponentName" :summeryKeys="['title', 'subtitle', 'mintro']" :courseKeys="['title', 'subtitle', 'mintro']" :pagination="pagination" :displayMode="'tangihlist'" :viewMode="viewMode" :key_data="searchListActiveSchemaGetter?.key" :activeTabGetter="searchListActiveSchemaGetter" :tableColumns="getTableColumns" :listItem="listItem" @changeCurrent="changeCurrent" @changePage="changePaging" ref="content" ></component> --> <search-item-details v-if="showDetailsPanel" :key="formRerrenderer" :selectedItem="rowItem" @open-form="openForm" @close-detail-panel="showDetailsPanel = false" ></search-item-details> </template> <no-data v-else> <p class="text-center p-3">عدم دسترسی</p> </no-data> </div> <!-- <template v-if="showModal"> <NewItemModal @close-modal="closeModal" @delete-item="updateList" @update-list="updateList" /> </template> --> <base-modal-v2 v-if="openSubjectForm" modalSize="modal-lg" :modalTitle="modalTitle" :hasFooter="false" @close="hideSubjectForm" > <SearchSubjectForm v-if="slotComponentName == 'SearchSubjectForm'" @update-list="updateList" @selectedFilterUrl="selectedFilterUrl" :listAggregations="listAggregations" :filteKey="'source_key'" :activeTabGetter="searchListActiveSchemaGetter" ></SearchSubjectForm> <SearchFilterModal v-if="slotComponentName == 'SearchFilterModal'" @update-list="updateList" @selectedFilterUrl="selectedFilterUrl" :listAggregations="listAggregations" :filteKey="'source_key'" :activeTabGetter="searchListActiveSchemaGetter" ></SearchFilterModal> </base-modal-v2> </div> </div> </div> </div> </div> </div> </SearchLayout> </template> <script> import tableActions from "@search/json/search/json/listTableContextMenu"; import { mapState, mapActions } from "pinia"; import searchApis from "@search/apis/searchApi"; import sidbarMenuDefault from "@search/json/search/json/menu.json"; import sidbarMenuMin from "@search/json/search/json/sidbarMenuMin.json"; // import menu from "~/json/reports/menu.json"; import { useSearchStore } from "@search/stores/searchStore"; import { useCommonStore } from "~/stores/commonStore"; import { useEntityStore } from "@search/stores/entityStore"; export default { name: "searchNavigation", setup() { useHead({ title: import.meta.env.VITE_ENTITY_PAGE_TITLE, meta: [{ name: "description", content: "My page description" }], bodyAttrs: { class: import.meta.env.VITE_SEARCH_PAGE_TITLE, }, }); definePageMeta({ layout: false, name: "searchNavigation", }); }, watch: { getPanelStatus(status) { if (status) this.openForm(); else this.closeModal(); }, // $route: { // handler: function () { // this.sidebarCollapsedSetter(false); // }, // deep: true, // immediate: true, // }, listIdGetter(newId) { this.filterBy(this.selectedFilter); }, // selectedListItem({ key, label }) { // const selected = this.searchListSchemaGetter.find((i) => i.key == key); // this.onSelectNavigation(selected); // }, }, created() { let schemaExist = this.searchListActiveTabGetter && this.searchListSchemaGetter; if (schemaExist) { this.getComboList(); } else this.getSchemas(); }, beforeMount() { if (buildName() == "monir" || window?.innerWidth < 575) { this.viewMode = "list"; } else { this.viewMode = "table"; } }, // mixins: [filterItemMixin], mounted() { if (window.outerWidth < 992) { this.$store.commit("TOGGLE_SIDEBAR_MENU"); } this.pagination.limit = 25; this.updatPathTitle(); this.selected = this.people[0]; this.selectedListItem = this.searchListActiveSchemaGetter; }, updated() { const itemActiveTabElement = this.$el.querySelector(".itemActiveTab"); if (itemActiveTabElement) { itemActiveTabElement.removeEventListener( "click", this.onItemActiveTabClick ); itemActiveTabElement.addEventListener("click", this.onItemActiveTabClick); } }, data() { return { selected: undefined, people: [ { id: "benjamincanac", label: "benjamincanac", href: "https://github.com/benjamincanac", target: "_blank", avatar: { src: "https://avatars.githubusercontent.com/u/739984?v=4" }, }, { id: "Atinux", label: "Atinux", href: "https://github.com/Atinux", target: "_blank", avatar: { src: "https://avatars.githubusercontent.com/u/904724?v=4" }, }, { id: "smarroufin", label: "smarroufin", href: "https://github.com/smarroufin", target: "_blank", avatar: { src: "https://avatars.githubusercontent.com/u/7547335?v=4", }, }, { id: "nobody", label: "Nobody", icon: "i-heroicons-user-circle", }, ], selectedListOptions: [ { key: "sanad", label: "منابع", }, { key: "qanon", label: "qanon", }, ], selectedListItem: undefined, dataCatched: false, // showing components after data cached. loading: false, rerenderSubheader: 1, tableActions: tableActions, viewMode: "", tableTitle: "", currentPageName: "list", listAggregations: undefined, treeLists: "", filterUrl: "", url_GET_item: "", filterLists: "", statusPag: "", state_list: 0, listItem: [], listHits: [], navigationOptions: [], fields: [], fieldOne: null, fieldTwo: null, fieldThree: null, fieldOneQuery: null, fieldTwoQuery: null, fieldThreeQuery: null, activeTab: null, activeListItem: undefined, // selectedNavigationIndex: undefined, // selectedNavigation: undefined, listPanelSorting: undefined, listPanelSorting: undefined, lastSearchInListMode: true, showfilterCategory: true, fetchingDataForExport: false, showListPanel: false, // selectedNavigationFilter: false, componentCounter: 1, page: 0, currentPathItem: "", currentPathHtml: "", schemaFilter: null, tabIndex: 0, reRender: 1, // menu: menu, // selectedFilter: "table", // sidbarMenuDefault: sidbarMenuDefault, // sidbarMenuMin: sidbarMenuMin, // showModal: false, formRerrenderer: 1, sorting: { sortby: "id", sortorder: "asc", // asc | desc }, componentName: "ItemList", openSubjectForm: false, metaItems: [], subjectItemState: false, subjectTitle: "", canView: true, currentPanelList: {}, tableTitle: "", rowItem: undefined, showDetailsPanel: false, formRerrenderer: 1, exportOffset: 0, exportLimit: 500, viewMode: "table", selectedFilter: "table", // menu: menu, showModal: false, listId: undefined, listItem: [], pagination: { pages: 0, total: 0, page: 1, offset: 0, limit: 10, }, fetchingData: false, roles: [], selectedItemClone: { title: "", id: undefined, project_id: this.projectGetter?.id, }, prevSelectedItemIndex: undefined, showPanel: false, projects: [], list: [], loading: false, currentItem: {}, listChilds: [], paragraphs: [], breadcrumb: [], selectedItem: {}, paperPropertyes: {}, prevActivePaperIndex: 0, FILTER_BY_ENUM: { 1: "دفترهای من", 2: "اشتراکی", 3: "همه اسناد", }, selectedFilterNumber: 3, items: [], editMode: false, contextMenu: [], newItemType: 0, childs: [ { title: "یادداشت", users: { name: "حسن", avatar: "", }, }, { title: "2یادداشت", }, ], SearchSubjectForm: "SearchFilterModal", }; }, computed: { ...mapState(useCommonStore, [ "getPanelStatus", "isSidebarCollapsed", "getUserLastState", "organNameGetter", "schemasGetter", "activeSchemaGetter", ]), ...mapState(useSearchStore, [ "searchListSchemaGetter", "searchListActiveSchemaGetter", "searchListActiveTabGetter", "selectionFilterItemsGetter", "searchListActiveTabGetter", "listComponentNameGetter", "selectedProjectGetter", "listIdGetter", "selectedItemGetter", "listGetter", ]), myKey() { // if (this.key_data) return this.key_data; return this.searchListActiveSchemaGetter?.key; }, navTabs() { if (!isMajlesBuild()) return this.searchListActiveSchemaGetter?.items; if (this.searchListActiveSchemaGetter?.items) { let res = this.searchListActiveSchemaGetter?.items.filter((item) => { if (item.key == "dotic" || item.key == "organ") return false; return true; }); return res; } else return []; }, schemasItem(item, index) { this.modetab = index; let full_path = this.$route.fullPath; let newRoutePath = full_path; let prevKey = this.$route.query.key; if (prevKey) newRoutePath = full_path.replace(`key=${prevKey}`, `key=${item.key}`); else newRoutePath = full_path + `?key=${item.key}`; this.$set(this.$route.query, "key", item.key); history.pushState({}, document.title, newRoutePath); this.searchActiveTabSetter(item); this.searchStart(this.textSearch); // this.$emit("searchStart", this.$refs.searchline?.textSearch); }, contentComponentName() { if (this.searchListActiveSchemaGetter?.searchContent) return this.searchListActiveSchemaGetter.searchContent; return "SearchContent"; }, getTableColumns() { if (this.searchListActiveTabGetter?.table_columns) return this.searchListActiveTabGetter.table_columns; if (this.searchListActiveSchemaGetter?.table_columns) return this.searchListActiveSchemaGetter.table_columns; return this.selectedProjectGetter?.table_columns; }, sidbarMenu() { if (isMajlesBuild()) return sidbarMenuMin; else return sidbarMenuDefault; }, }, methods: { ...mapActions(useCommonStore, [ "schemasSetter", "activeSchemaSetter", "TOGGLE_PANEL", "checkPermissions", "storeState", "getState", ]), ...mapActions(useSearchStore, [ "searchListActiveSchemaSetter", "searchListSchemaSetter", "searchListActiveTabSetter", "selectionFilterItemsSetter", "SET_LIST_COMPONENT_NAME", "SET_SELECTED_ITEM", "SET_SELECTED_PROJECT", "SET_LIST_ID", "SET_LIST", "SET_LIST_ID", "SET_SELECTED_PROJECT", ]), ...mapActions(useEntityStore, ["SET_ITEM_ENTITY", "SET_LIST_ENTITY"]), tableColumnsHandler(activeTab) { if (activeTab?.actions) return activeTab?.actions; else return this.searchListActiveSchemaGetter?.actions; }, getDetailUrl(item) { let key = ""; key = this.myKey; if (!key) key = "qasection"; // برای شرایطی که بصورت مدال استفاده می شود گتر بالا پر نیست let id = item._id; let hash = ""; if (this.$route.name == "qrule") { hash = "#qmodel"; key = "qsection"; id = item._source?.ref_id ? item._source.ref_id : id; } if (key == "qasection") { key = "qsection"; } let name = "detail"; const routeData = this.$router.resolve({ name: name, params: { id: id, key: key, }, hash: hash, query: {}, }); return routeData.href; }, showTextPage(index) { const item = this.listHits[index]; window.open(this.getDetailUrl(item), "_blank"); }, onOnLinkedTitleClick({ rowItem, tableColumn, index }) { const item = this.listHits[index]; if (tableColumn.key == "qanon_title") this.showtext(item._source, this.listHits, index, item); else window.open(this.getDetailUrl(item), "_blank"); }, /** * باز کردن یک تب جدید با جزئیات مورد انتخاب شده. * @param {Object} item - مورد انتخاب شده. * @param {Array} listAnswer - لیست پاسخها. * @param {Number} i - اندیس مورد. * @param {Object} t - شیء نماینده مورد. */ showtext(_source, listAnswer, index, rowItem) { let cloneList = listAnswer; cloneList.forEach((item, index) => { cloneList[index] = { ...item, ..._source }; }); let qanon_id = _source.qanon_id; let cloneItem = rowItem; cloneItem = { ...rowItem, _id: qanon_id }; this.SET_ITEM_ENTITY(cloneItem); this.SET_LIST_ENTITY(cloneList); localStorage.setItem("myList", JSON.stringify(cloneList)); localStorage.setItem("myItem", JSON.stringify(cloneItem)); window.open(this.urlResolver(qanon_id), "_blank"); }, /** * حل تارنمای مربوط به نمایش یک مورد خاص. * @param {String} _id - شناسه مورد. * @param {String} [key=""] - کلید مورد. * @returns {String} آدرس تارنما برای نمایش. */ urlResolver(_parent, key = "") { if (key == "") key = this.myKey; if (!key) key = "qasection"; // برای شرایطی که بصورت مدال استفاده می شود گتر بالا پر نیست let path = "/search/lists"; if (key == "qsection") path = "detail"; const routeData = this.$router.resolve({ path: path, params: { id: _parent, key: key, }, query: {}, }); return routeData.href; }, changeCurrent: function (item) { // this.showSummary = false; // this.$nextTick(() => { // this.showSummary = true; // }); // this.currentItem = item; // if (this.$refs.summary) this.$refs.summary.setInfo(item); }, changePaging: function (item) { this.pagination = item; this.getListItemByFilter(); }, hideSubjectForm() { this.selectedItem = {}; this.openSubjectForm = false; }, showSubjectForm({ rowItem }) { this.selectedItem = rowItem; this.SET_SELECTED_ITEM(rowItem); this.slotComponentName = "SearchSubjectForm"; this.openSubjectForm = true; this.modalTitle = "افزودن موضوع"; }, openModalFilter(componentName, title) { this.slotComponentName = componentName; this.openSubjectForm = true; this.modalTitle = title; }, async getCustumListItem() { if (this.fetchingData) return; this.fetchingData = true; let url = ""; if (this.subjectItemState) url = searchApis.navigation.reportSubjectItem.replace( "{{subject_title}}", this.subjectTitle ); else url = searchApis.navigation.reportItem; url += `/${this.searchListActiveSchemaGetter.key}`; url += `/${this.sorting.sortby}/${this.sorting.sortorder}`; url += `/${this.pagination.offset}/${this.pagination.limit}/`; if (this.listGetter && this.listGetter.length) { if (this.listGetter.length <= this.fields.length) { for (let i = 0; i < this.listGetter.length; i++) { url += `${this.fields[i].name}=${this.listGetter[i].key}`; if (i != this.listGetter.length - 1) url += "&"; } } } if (this.filterLists !== "") { url = url + this.filterLists; } try { const { $api } = useNuxtApp(); const response = await $api(searchApis.schema.list, { method: "POST", baseURL: repoUrl(), body: { organ: this.organNameGetter, system: "search", build_state: buildState(), }, }); this.listItem = []; this.listAggregations = response.aggregations; this.listHits = response.hits.hits; this.listHits.forEach((element) => { this.listItem.push(element._source); }); this.initNormalRespone(this.listHits, response.hits.total.value); const total = response.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 (err) { this.fetchingData = false; } }, updatPathTitle(item = "--") { let path = ""; let itemDtataRepository = this.searchListActiveSchemaGetter?.label; let itemActiveTab = this.searchListActiveTabGetter?.label; // path = `${itemDtataRepository}/${itemActiveTab}/${item}`; path = `<span class=" ms-2 me-1 " style="color: #00b6e3;">${itemDtataRepository}</span>/<span class="text-primary ms-2 me-1 itemActiveTab" style="color: #00b6e3; cursor:pointer">${itemActiveTab}</span>/ <span class=" ms-2 me-1" >${item}</span>`; // اضافه کردن ریشه به مسیر نهایی this.currentPathHtml = path; this.currentPathItem = `${itemDtataRepository}_${itemActiveTab}_${item}`; }, onItemActiveTabClick() { this.openNavigationFilter(2); }, emptyFilter() { this.selectionFilterItemsSetter([]); }, delFilterItem(item) { var filterItems = this.selectionFilterItemsGetter; var index = this.selectionFilterItemsGetter?.indexOf(item); var filterSelect = []; if (index != -1) { // this.filterSelect.splice(index, 1); filterItems.splice(index, 1); } else filterItems.forEach((element) => { filterSelect.push(element.id); }); // this.$emit("filterSelect", filterSelect); this.selectionFilterItemsSetter(filterItems); }, showCategory() { this.$refs.navigationFilter?.classList.add("d-none"); }, filterSelect(itemSelect) { itemSelect.sort(function (x, y) { return y - x; }); var filter = ""; var prevType = ""; itemSelect.forEach((item) => { var items = item.split("#"); if (prevType == items[0]) { filter += "$" + items[1]; } else { filter += "&" + items[0] + "=" + items[1]; } prevType = items[0]; }); this.filterLists = filter; this.getListItemByFilter(); }, selectedFilterUrl(url) { this.filterLists = url; this.getListItemByFilter(); }, heightHandler(item) { if (item == "table") { if (this.searchListActiveTabGetter?.key == "custome") { return "calc(100vh - 15em)"; } else { return "calc(100vh - 12em)"; } } else { if (this.searchListActiveTabGetter?.key == "custome") { return "calc(100vh - 17em)"; } else { return "calc(100vh - 14em)"; } } }, updateTitle(list) { this.tableTitle = list.title; }, updateCategoryList(navItem, index) { this.fetchingData = false; this.searchListActiveTabSetter(navItem); // this.activeTab = navItem; this.tabIndex = index; this.updatPathTitle(); this.selectionFilterItemsSetter([]); this.listItem = []; this.listAggregations = {}; this.listHits = []; this.switchViewMode(this.viewMode); this.componentCounter++; this.rerenderSubheader++; }, listChanged(tags = []) { let res = []; tags.split(",").forEach((e) => { let i = e.lastIndexOf("_"); if (i != -1) { res.push(e.substring(0, i)); } }); this.setFilterNavigate(res); }, setFilterNavigate(value = []) { this.filterNavigate = value; }, filterUpdate(object) { this.filterUrl = object.filter; this.url_GET_item = object.url; this.state_list = object.state_list; this.page = 0; this.updatPathTitle(object.title); this.getListItemByFilter(); // if (this.searchingState) this.getQuery(false, true); // else this.getDefaultByFilter(); }, getListItemByFilter(sortby = "sort_date_timestamp", sortorder = "desc") { if (this.searchListActiveTabGetter?.key == "custome") { this.getCustumListItem(); } else { if (this.state_list == 1) this.getListByFilter1(sortby, sortorder); else this.getListByFilter2(sortby, sortorder); } }, async getListByFilter1(sortby = "sort_date_timestamp", sortorder = "desc") { // let url = "{{buildName}}/data/{{index_key}}/{{field_collapsed}}/{{offset}}/{{limit}}/{{sortby}}/{{sortorder}}/{{filterUrl}}"; let url = this.url_GET_item; url = url.replace("{{buildName}}", buildName()); url = url.replace( "{{index_key}}", this.searchListActiveSchemaGetter?.key ); url = url.replace("{{offset}}", this.pagination?.offset); url = url.replace("{{limit}}", this.pagination?.limit); url = url.replace("{{sortby}}", sortby); url = url.replace("{{sortorder}}", sortorder); url = url.replace( "{{field_collapsed}}", this.searchListActiveTabGetter?.field_collapsed ?? "normal" ); url = url.replace("{{filter}}", this.filterUrl); if (this.filterLists !== "") { url = url + this.filterLists; } try { const { $api } = useNuxtApp(); const response = await $api(url, { baseURL: repoUrl(), }); this.listItem = []; this.listAggregations = response.aggregations; this.listHits = response.hits.hits; this.listHits.forEach((element, index) => { this.listItem[index] = { ...element, ...element._source }; }); // if (this.viewMode != "table") { this.initNormalRespone(this.listHits, response.hits.total.value); // } const total = response.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 }; this.reRender++; } catch (err) { this.fetchingData = false; } }, async getListByFilter2(sortby = "sort_date_timestamp", sortorder = "desc") { // let url = 'navigate/report/items/{{index_key}}/{{sortby}}/{{sortorder}}/{{offset}}/{{limit}}/{{filter}}'; let url = this.url_GET_item; url = url.replace( "{{index_key}}", this.searchListActiveSchemaGetter?.key ); url = url.replace("{{offset}}", this.pagination?.offset); url = url.replace("{{limit}}", this.pagination?.limit); url = url.replace("{{sortby}}", sortby); url = url.replace("{{sortorder}}", sortorder); // url = url.replace("{{field_collapsed}}", this.activeTab?.field_collapsed); url = url.replace("{{filter}}", this.filterUrl); if (this.filterLists !== "") { url = url + this.filterLists; } try { const { $api } = useNuxtApp(); const response = await $api(searchApis.schema.list, { method: "POST", baseURL: repoUrl(), body: { organ: this.organNameGetter, system: "search", build_state: buildState(), }, }); this.listItem = []; this.listAggregations = response.aggregations; this.listHits = response.hits.hits; this.listHits.forEach((element) => { this.listItem.push(element._source); }); // if (this.viewMode != "table") { this.initNormalRespone(this.listHits, response.hits.total.value); // } const total = response.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 }; this.reRender++; } catch (err) { this.fetchingData = false; } }, initNormalRespone(list, total, pageOnly = false, filteronly = false) { if (pageOnly) { this.$refs.content?.setAnswer(list, total); } else if (filteronly) { this.$refs.content?.setAnswer(list, total); } else { this.$refs.content?.setAnswer(list, total); } }, async getSchemas() { try { const { $api } = useNuxtApp(); const response = await $api(searchApis.schema.list, { method: "POST", baseURL: repoUrl(), body: { organ: this.organNameGetter, system: "navigateList", build_state: buildState(), }, }); this.searchListSchemaSetter(response.data.navigateList); this.searchListActiveSchemaSetter(response.data.navigateList[0]); this.searchListActiveTabSetter(response.data.navigateList[0].items[0]); this.getComboList(); } catch (err) {} }, //mehdi AddToFolder(text) { if (this.selectedProjectGetter.lists.length) { if (text == "positionOne") { let myString = this.selectedProjectGetter.lists[0].items; let myArray1 = myString.split(","); let myArray2 = this.selectedProjectGetter.items; let myArray3 = []; for (let i = 0; i < myArray1.length; i++) { for (let j = 0; j < myArray2.length; j++) { if (myArray1[i] === myArray2[j].name) { myArray3.push(myArray2[j]); break; } } } this.fieldOne = myArray3[0]; this.fieldTwo = myArray3[1]; this.fieldThree = myArray3[2]; setTimeout(() => { this.onComboChanged(); this.componentCounter++; }, 300); } else if (text == "positionTow") { let myString = this.selectedProjectGetter.lists[1].items; let myArray1 = myString.split(","); let myArray2 = this.selectedProjectGetter.items; let myArray3 = []; for (let i = 0; i < myArray1.length; i++) { for (let j = 0; j < myArray2.length; j++) { if (myArray1[i] === myArray2[j].name) { myArray3.push(myArray2[j]); break; } } } this.fieldOne = myArray3[0]; this.fieldTwo = myArray3[1]; this.fieldThree = myArray3[2]; setTimeout(() => { this.onComboChanged(); this.componentCounter++; }, 300); } else { let myString = this.selectedProjectGetter.lists[2].items; let myArray1 = myString.split(","); let myArray2 = this.selectedProjectGetter.items; let myArray3 = []; for (let i = 0; i < myArray1.length; i++) { for (let j = 0; j < myArray2.length; j++) { if (myArray1[i] === myArray2[j].name) { myArray3.push(myArray2[j]); break; } } } this.fieldOne = myArray3[0]; this.fieldTwo = myArray3[1]; this.fieldThree = myArray3[2]; setTimeout(() => { this.onComboChanged(); this.componentCounter++; }, 300); } } }, openNavigationFilter(item) { // debugger // if (item == 1) { // this.$refs.pags.classList.add("position1"); // this.$refs.pags.classList.remove("position2"); // } else { // this.$refs.pags.classList.add("position2"); // this.$refs.pags.classList.remove("position1"); // } this.$refs.navigationFilter?.classList.remove("d-none"); }, statusPag2($event) { this.statusPag = $event; switch (this.statusPag) { case (this.statusPag = 2): this.$refs.pags?.classList.add("position1"); this.$refs.pags?.classList.remove("position2"); break; case (this.statusPag = 1): this.$refs.pags?.classList.add("position2"); this.$refs.pags?.classList.remove("position1"); break; } }, isShowPag(event) { this.$refs.navigationFilter?.classList.add("d-none"); }, //mehdi exportJsonToExcel(evt) { let title = " "; if (evt === "current") { title = new Date().toJSON().slice(0, 10); if (this.currentPathItem) title = this.currentPathItem; convertJsonToExcelUsingPlugin( this.filterColumns(this.listItem, this.getTableColumns), title ).finally(() => { this.fetchingDataForExport = false; }); } else if (evt === "all") { //دسترسی را چک کند let file_counter = 1; // let offset = 0; // while (offset < this.pagination.total) { // let limit = 500; // درخواست this.getAllListItemForExport(this.exportOffset, this.exportLimit) .then((response) => { let file_name = new Date().toJSON().slice(0, 10) + file_counter; file_counter++; if (this.currentPathItem) title = this.currentPathItem; convertJsonToExcelUsingPlugin( this.filterColumns(response?.hits.hits, this.getTableColumns), file_name ) .then(() => { this.exportOffset += this.exportLimit; if ( this.exportOffset + this.exportLimit > this.pagination.total ) this.exportLimit = this.pagination.total - this.exportOffset; if (this.exportOffset < this.pagination.total) this.exportJsonToExcel(evt); }) .finally(() => { this.fetchingDataForExport = false; }); }) .finally(() => { this.fetchingDataForExport = false; }); } // } }, filterColumns(listItem = [], columns = []) { let clonedItems = listItem; let clonedColumns = columns; let filteredItems = []; clonedItems.forEach((item, index) => { let filterObject = {}; clonedColumns.forEach((j) => { filterObject[j.title] = item._source[j.key]; }); filteredItems[index] = filterObject; }); return filteredItems; }, async getAllListItemForExport(offset = 0, limit = 500) { if (this.fetchingDataForExport) return; this.fetchingDataForExport = true; let url = searchApis.navigation.reportItem + `/${this.searchListActiveSchemaGetter?.info?.index_name}`; url += `/${this.sorting.sortby}/${this.sorting.sortorder}`; url += `/${offset}/${limit}/&`; if (this.listGetter && this.listGetter.length) { if (this.listGetter.length <= this.fields.length) { for (let i = 0; i < this.listGetter.length; i++) { url += `${this.fields[i].name}=${this.listGetter[i].key}`; if (i != this.listGetter.length - 1) url += "&"; } } } try { const { $api } = useNuxtApp(); return await $api(url, { baseURL: repoUrl(), body: { organ: this.organNameGetter, system: "search", build_state: buildState(), }, }); } catch (err) {} }, async updateOrder({ rowItem, newOrder }) { const res = rowItem.subject.filter( (item) => item.title == this.listGetter[this.listGetter.length - 1].key ); const payload = { id: rowItem.id_store, subject_id: res[0].id, subject_title: res[0].title, subject_order: +newOrder, }; const url = searchApis.subject.order; try { const { $api } = useNuxtApp(); const response = await $api(url, { method: "POST", baseURL: repoUrl(), body: payload, }); this.mySwalToast({ title: response.message, html: "", }); } catch (err) {} }, async getComboList() { if (this.fetchingData) return; this.fetchingData = true; let url = searchApis.navigation.list; url = url.replace("@entity", this.searchListActiveSchemaGetter?.key); try { const { $api } = useNuxtApp(); const response = await $api(url, { baseURL: repoUrl(), }); // this.navigationOptions = response.data; // this.navigationOptions[0].meta = JSON.parse( // this.navigationOptions[0].meta // ); // this.navigationOptions[0].table_columns = JSON.parse( // this.navigationOptions[0].table_columns // ); // this.navigationOptions[0].table_columns_subject = JSON.parse( // this.navigationOptions[0].table_columns_subject // ); // this.SET_SELECTED_PROJECT(this.navigationOptions[0]); this.dataCatched = true; this.fetchingData = false; } catch (err) { this.fetchingData = false; } }, onSelectNavigation(evt = null) { if (evt) { // this.searchListSchemaSetter(); this.searchListActiveSchemaSetter(evt); this.searchListActiveTabSetter(evt); this.updatPathTitle(); // this.fieldOne = null; // this.fieldTwo = null; // this.fieldThree = null; // this.SET_LIST([]); // this.listItem = []; // this.fields = []; // this.componentCounter++; // if (typeof evt?.meta == "string") { // try { // evt.meta = JSON.parse(evt.meta); // evt.table_columns = JSON.parse(evt.table_columns); // evt.table_columns_subject = JSON.parse(evt.table_columns_subject); // } catch (e) {} // } // this.selectedNavigation = evt; // this.SET_SELECTED_PROJECT(this.selectedNavigation); // this.updatPathTitle(); } }, onComboChanged() { this.SET_LIST([]); this.listItem = []; const vm = this; setTimeout(() => { if (vm.fieldOne || vm.fieldTwo || vm.fieldThree) vm.fields = [vm.fieldOne, vm.fieldTwo, vm.fieldThree].filter( (item) => item != null ); vm.componentCounter++; }, 300); }, toggleSidebarMenu() { this.$store.commit("TOGGLE_SIDEBAR_MENU"); }, showToggleListPanel() { this.showListPanel = !this.showListPanel; }, searchInTable() {}, async getListItem() { if (this.fetchingData) return; this.fetchingData = true; let url = ""; if (this.subjectItemState) url = searchApis.navigation.reportSubjectItem.replace( "{{subject_title}}", this.subjectTitle ); else url = searchApis.navigation.reportItem; url += `/${this.searchListActiveSchemaGetter.key}`; url += `/${this.sorting.sortby}/${this.sorting.sortorder}`; url += `/${this.pagination.offset}/${this.pagination.limit}/`; if (this.listGetter && this.listGetter.length) { if (this.listGetter.length <= this.fields.length) { for (let i = 0; i < this.listGetter.length; i++) { url += `${this.fields[i].name}=${this.listGetter[i].key}`; if (i != this.listGetter.length - 1) url += "&"; } } } try { const { $api } = useNuxtApp(); const response = await $api(url, { baseURL: repoUrl(), }); let list = response.hits.hits; list.forEach((element, index) => { list[index] = { ...element, ...element._source }; }); this.listItem = list; this.listHits = list; this.listAggregations = response.aggregations ?? {}; const total = response.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 }; this.fetchingData = false; } catch (err) { this.fetchingData = false; } }, setList() { // this.listId = listId; }, setListItem(meta) { // this.listId = listId; let cc = this.getTableColumns; this.meta = meta; this.resetPagination(); this.checkPermisionBeforGetList(); // this.getListItem(); }, switchViewMode(mode) { this.viewMode = mode; if (this.viewMode != "table") { setTimeout(() => { this.initNormalRespone(this.listHits, this.pagination.total); }, 300); } }, showTextPage(index) { let pageTitle = this.listItem[index].title ?? "بدون عنوان"; pageTitle = pageTitle.replaceAll(" ", "-"); const routeData = this.$router.resolve({ name: "navigation", params: { id: this.listItem[index].id ?? this.listItem[index].id_store, key: this.searchListActiveSchemaGetter.key, }, query: { searchtext: this.pageTitle ?? undefined, }, }); window.open(routeData.href, "_blank"); }, resetPagination() { this.pagination = { pages: 0, total: 0, page: 1, offset: 0, limit: 10, }; }, 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.getListItemByFilter(); }, pageLimitChanged(paging) { this.resetPagination(); this.pagination.limit = paging.limit; this.getListItemByFilter(); }, sortChanged(sorting) { // keep limit status. // reset page and offset values. this.fetchingData = false; this.pagination.page = this.pagination.offset = 0; this.sorting = sorting; this.getListItemByFilter(this.sorting.sortby, this.sorting.sortorder); }, checkPermisionBeforGetList() { // this.checkPermissions({ permission: "item_view", _this: this }) // .then(() => { this.getListItem(); // }) // .catch(() => { }); }, showDetails(item) { const { show, rowItem } = item; this.SET_SELECTED_ITEM(rowItem); this.rowItem = rowItem; this.showDetailsPanel = true; this.formRerrenderer++; }, updateList() { this.closeModal(); this.getListItem(); }, openForm(data = undefined) { this.selectedItem = data; this.SET_SELECTED_ITEM(data); this.openModal(); }, closeModal() { $("#meta-item-modal").modal("hide"); // this.TOGGLE_PANEL(false); setTimeout(() => { this.showModal = false; }, 500); }, openModal() { this.showModal = true; setTimeout(() => { $("#meta-item-modal").modal( { backdrop: "static", keyboard: false }, "show" ); }, 500); }, }, components: { SearchFilterModal: defineAsyncComponent(() => import("@search/components/search/forms/SearchFilterModal.vue") ), SearchSubjectForm: defineAsyncComponent(() => import("@search/components/search/forms/SearchSubjectForm.vue") ), SearchItemDetails: defineAsyncComponent(() => import("@search/components/search/SearchItemDetails.vue") ), SearchFilter: defineAsyncComponent(() => import("@search/components/search/SearchFilter.vue") ), CategoryList: defineAsyncComponent(() => import("@search/components/search/view/CategoryList.vue") ), SearchNavigationFilter: defineAsyncComponent(() => import("@search/components/search/SearchNavigationFilter.vue") ), AutoComplation: defineAsyncComponent(() => import("@search/components/global/AutoComplation.vue") ), MyContent: defineAsyncComponent(() => import("@search/components/search/MyContent.vue") ), FilterListSearch: defineAsyncComponent(() => import("@search/components/search/view/FilterListSearch.vue") ), SwitchComponent: defineAsyncComponent(() => import("~/components/global/SwitchComponent.vue") ), SynonymSearch: defineAsyncComponent(() => import("@search/components/search/forms/SynonymSearch.vue") ), AdvancedSearch: defineAsyncComponent(() => import("@search/components/search/view/SearchAdvancedSearch.vue") ), TripleSwitch: defineAsyncComponent(() => import("~/components/global/TripleSwitch.vue") ), SearchLayout: defineAsyncComponent(() => import("@search/layouts/SearchLayout.vue") ), SwitchWithIcon: defineAsyncComponent(() => import("@components/other/SwitchWithIcon.vue") ), SearchSummary: defineAsyncComponent(() => import("@search/components/search/view/SearchSummary.vue") ), }, }; </script> <style lang="scss"> .custom-filter-container { @media screen and (min-width: 575px) { background-color: rgba(0, 0, 0, 0.05); } .multiselect { // width: 12em; // border: 2px solid rgb(127, 170, 170) !important; border-radius: 0.5em; // .multiselect__content-wrapper { // width: 12em; // } @media screen and (max-width: 575px) { .multiselect__tags { font-size: 0.8rem; } } } } </style> <style lang="scss" scoped> .multiselect { width: 12em; white-space: nowrap; } .table-container { padding: 0em; } .float-labels { margin-bottom: 0 !important; } .main-page__content-header { background: linear-gradient(to top, #fcfcfc 0%, #eee 90%); padding-top: 1em; } .multiselect-lable { white-space: nowrap; } </style>