2025-02-01 11:06:10 +00:00
|
|
|
|
<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";
|
|
|
|
|
|
2025-02-11 07:09:05 +00:00
|
|
|
|
import { useEntityStore } from "@search/stores/entityStore";
|
2025-02-01 11:06:10 +00:00
|
|
|
|
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>
|