<template> <div class="position-relative"> <form action=""> <div class="row" v-if="statosPag == 0"> <div class="col-12 borders mb-2"> <p class="col-md-4" for="title">فهرست معیار ها :</p> <select class="form-control" style="border: 1px solid #495057" v-model="item" > <option :value="undefined" selected disabled> انتخاب از فهرست معیار ها </option> <option :key="index" :value="crition" v-for="(crition, index) in critions" > {{ crition.title }} </option> </select> <div class="d-flex mt-2"> <div> <p>موضوع:</p> </div> <div v-for="(item, index) in data.entity.subject" style="cursor: pointer" @click.prevent="getDataCriterionsSubject(item.id)" > <p id="item.id" class="me-1 text-primary"> {{ item.title }}<span class="me-1 text-muted" style="cursor: auto">،</span> </p> </div> </div> </div> <div v-if="criterionsSubject.length" class="col-12 mt-4 borders1"> <P>فهرست معیار های مرتبط با موضوع :</P> <div class="list-crition-select mt-3" v-if="show"> <div v-for="(crition, index) in criterionsSubject" class="crition-select d-flex flex-column bd-highlight mt-4 mb-4" > <div class="d-flex crition-select-item mb-3"> <div class="form-check"> <input class="form-check-input" type="checkbox" :value="crition" v-model="lists" :id="index" /> </div> <div> <p class="text__16" style="color: inherit"> {{ crition.title }} </p> </div> </div> <!-- <div> <p class="text__14" style="color: #92a2b2"> <span>مطلوب :</span> {{ crition.favorite }} </p> </div> --> <div> <p class="text__14" style="color: #92a2b2"> <span>توضیحات :</span> {{ crition.text }} </p> </div> </div> </div> <div v-if="show == false" style="color: #6c757d"> <p>روی یک موضوع کلیک کنید</p> </div> </div> <div class="col-12 mt-2"> <p>معیار های انتخاب شده :</p> <div class="list-crition" v-if="lists.length >= 1" ref="parent"> <div v-for="(list, index) in lists" class="critions d-flex flex-column bd-highlight" > <div class="d-flex justify-content-between"> <div class="d-flex"> <p :id="list.id" class="me-1 mb-1 crition" :ref="list.id"> <span>{{ index + 1 }}) </span>{{ list.title }} </p> <button type="button" class="close" @click.prevent="activeFormIndex = index" ></button> </div> <button type="button" class="close" @click.prevent="removCrition(index, list)" > × </button> </div> <div v-if="activeFormIndex == index" class="d-flex"> <input class="form-control form-control-sm" type="text" placeholder="توضیحات" v-model="itemDescription" @keyup.enter="submit(itemDescription, list)" /> <button type="button" class="close text-primary" @click.prevent="closeModal()" > × </button> </div> </div> </div> <div class="list-crition" v-if="lists.length == 0" style="color: #6c757d" > <p>از لیست بالا موردی را انتخابکنید</p> </div> </div> <div class="popUp-tab__buttons"> <div class="d-flex justify-content-between flex-grow-1"> <span> </span> <div data-v-e8ee7a26="" class="d-flex"> <button type="button" class="btn btn-outline-primary" @click.prevent="saveProperty()" > افزودن </button> </div> </div> </div> </div> <div class="row" v-if="statosPag == 1"> <div class="col-12 mb-2"> <div class="menu-multiselect"> <select class="form-control" style="border: 1px solid #495057" v-model="itemSelect.entity_id" > <option :value="undefined" selected disabled> انتخاب از فهرست معیار ها </option> <option :key="index" :value="crition.id" v-for="(crition, index) in critions" > {{ crition.title }} </option> </select> </div> </div> <div class="col-12 mb-2"> <div class="form-row form-group p-0"> <label class="col-md-12" for="description">توضیحات</label> <textarea class="col-md-12 h-auto mb-2" v-model="itemSelect.description" name="description" cols="30" rows="5" placeholder="توضیحات را وارد کنید" style="overflow: auto" ></textarea> </div> </div> <div class="popUp-tab__buttons"> <div class="d-flex justify-content-between flex-grow-1"> <button class="btn delete-btn btn-outline-danger" @click.prevent="removCrition(0, itemSelect)" > حذف </button> <div data-v-e8ee7a26="" class="d-flex"> <button type="button" class="popUp-tab__clear btn" @click.prevent="closeModal" > لغو </button> <button type="button" class="btn btn-outline-primary" @click.prevent="saveEditCriterion()" > ذخیره </button> </div> </div> </div> </div> </form> </div> </template> <script> import repoApi from "~/apis/repoApi"; import { mapState, mapActions } from "pinia"; import { propertyMixin } from "~/chat/mixins/propertyMixin"; export default { mixins: [propertyMixin], props: { data: { type: Object, default: () => ({}) }, }, beforeMount() { if (this.data.index == -1) { this.statosPag = 0; this.indexItemEdited = this.data.index; } else { this.statosPag = 1; this.indexItemEdited = this.data.index; } }, mounted() { this.httpServiceJahat = new HttpService(import.meta.env.VITE_REPO_BASE_URL); this.getCritions(); if (this.data.entity?.crition) { this.data.entity.crition.forEach((element) => { this.lists.push({ id: element.entity_id, title: element.entity_title, description: element.description, }); }); } this.itemSelect = { entity_id: this.lists[this.indexItemEdited].id, entity_title: this.lists[this.indexItemEdited].title, description: this.lists[this.indexItemEdited].description, }; }, data() { return { indexItemEdited: undefined, statosPag: 0, criterionsSubject: "", activeFormIndex: undefined, itemDescription: "", critions: [], item: undefined, itemSelect: "", lists: [], listCritions: [], httpServiceJahat: undefined, pagination: { page: 1, pages: 0, total: 0, offset: 0, limit: 500, }, show: false, }; }, watch: { item(newVal) { this.lists.push({ id: newVal.id, title: newVal.title, }); }, }, computed: { ...mapState("list", ["selectedProjectGetter", "selectedItemGetter"]), }, methods: { ...mapActions("list", ["SET_SELECTED_PROJECT"]), getDataCriterionsSubject(id) { const subject_id = id; const url = repoApi.public.bysubject .replace("{{from}}", "0") .replace("{{countInPage}}", "10") .replace("{{index_key}}", "crition") .replace("{{subject_id}}", subject_id); this.httpServiceJahat.getRequest(url).then((res) => { const list = []; res.hits.hits.forEach((item, key) => { list.push({ id: item._source.id, title: item._source.title, text: item._source.text, }); }); this.criterionsSubject = list; this.show = true; }); }, saveEditCriterion() { let url = "jahat" + "/" + repoApi.property.edit + `/${this.data.entity.id}/${this.data.keyName}`; url += "/id/" + this.itemSelect.entity_id; const formData = { [this.data.keyName]: this.itemSelect, }; this.httpServiceJahat.postRequest(url, formData).then((res) => { // console.log(res); mySwalToast({ title: " ثبت شد.", html: "", }); this.$emit("close-modal"); }); }, saveProperty() { var listCritions = this.data.entity.crition; var list = this.lists; let url = repoApi.crition.add.replace( "{{issue_id}}", this.data.entity.id ); if (listCritions) { const filteredList = list.filter( (newItem) => !listCritions.find((oldItem) => oldItem.entity_id === newItem.id) ); filteredList.forEach((element) => { const value = { entity_id: element.id, entity_title: element.title, description: element.description, }; const formData = { crition: value, }; this.httpServiceJahat.postRequest(url, formData).then((res) => { // console.log(res); mySwalToast({ title: " ثبت شد.", html: "", }); }); }); } else { list.forEach((element) => { const value = { entity_id: element.id, entity_title: element.title, description: element.description, }; const formData = { crition: value, }; this.httpServiceJahat.postRequest(url, formData).then((res) => { // console.log(res); mySwalToast({ title: " ثبت شد.", html: "", }); }); }); } this.$emit("close-modal"); }, getCritions() { if (this.fetchingData) return; this.fetchingData = true; let url = repoApi.entity.list.replace("{{type}}", this.data.keyName) + `/${this.pagination.offset}/${this.pagination.limit}`; url += "/date_create/desc"; this.httpServiceJahat.getRequest(url).then((res) => { const list = []; res.hits.hits.forEach((item, key) => { // console.log(item) list.push({ id: item._source.id, title: item._source.title, }); }); this.critions = list; this.listCritions = this.critions.splice(0, 7); this.fetchingData = false; }); }, removCrition(i, item) { var index = i; var list = []; list = this.lists; let url = ""; if (item.id) { url = repoApi.crition.delete .replace("{{issue_id}}", this.data.entity.id) .replace("{{crition_id}}", item.id); } else { url = repoApi.crition.delete .replace("{{issue_id}}", this.data.entity.id) .replace("{{crition_id}}", item.entity_id); } mySwalConfirm({ title: "هشدار", html: "از حذف این بخش مطمئن هستید؟", icon: "warning", }).then((result) => { if (result.isConfirmed) { this.httpServiceJahat.postRequest(url).then((res) => { mySwalToast({ title: "تبریک", html: res.data.message, icon: "success", }); }); var lists = list.splice(index, 1); } if (this.statosPag == 1) { this.$emit("close-modal"); } }); }, submit(item, list) { let mylist = list; mylist.description = item; }, closeModal() { this.activeFormIndex = undefined; this.itemDescription = undefined; }, }, }; </script> <style lang="scss" scoped> .my-profile { padding-bottom: 0 !important; } .my-profile__form { padding-top: 0 !important; } .green { background-color: green; } .btn-secondarys { color: #6c757d; background-color: #fff; border-color: #6c757d; border-radius: 7px; } .btn-secondarys:hover { color: #00b6e3; background-color: #fff; border-color: #00b6e3; } .borders { position: relative; } .borders::before { content: ""; border-bottom: solid #f1f1f1 1px; position: absolute; bottom: -14px; width: 96%; } .borders1 { position: relative; } .borders1::after { content: ""; border-bottom: solid #f1f1f1 1px; position: absolute; bottom: -8px; width: 96%; } .list-crition { width: 100%; height: 140px; margin-top: 10px; overflow: hidden; overflow-y: auto; } // .critions:hover { // color: red; // p, // button { // color: inherit; // } // } .list-crition-select { width: 100%; height: 140px; margin-top: 10px; overflow: hidden; overflow-y: auto; } .crition-select-item:hover { color: #00b6e3; div { p { color: inherit; } } } .crition { color: #00b6e3; } .form-check-input { height: 14px !important; } .critions { &:hover { .search-item__actions { width: 5.6em; transition: all 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: relative; // left: 20px; 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; &:hover { filter: brightness(0.9); } .niafam { color: #adbec4; } } } </style>