first commit
This commit is contained in:
commit
947af21d6d
24
apis/researchApi.js
Normal file
24
apis/researchApi.js
Normal file
|
@ -0,0 +1,24 @@
|
|||
export default {
|
||||
admin: {
|
||||
list: "",
|
||||
show: "",
|
||||
edit: "",
|
||||
update: "",
|
||||
delete: "",
|
||||
},
|
||||
|
||||
research:{
|
||||
listDefault:"research/search/{{user_id}}/{{offset}}/{{limit}}",
|
||||
listBySearch:"research/search/{{user_id}}/{{offset}}/{{limit}}/q=",
|
||||
deleteItem: "/public/{{index_key}}/delete/{{id}}", //ایدی فیش و یا حاشیه
|
||||
},
|
||||
subject: {
|
||||
move: 'subject/order/move/parent',
|
||||
order: 'subject/order/move/one',
|
||||
list: 'list/subject/list',
|
||||
add: 'list/subject/add',
|
||||
edit: 'list/subject/edit',
|
||||
delete: 'list/subject/delete',
|
||||
order: 'list/subject/order',
|
||||
},
|
||||
};
|
142
assets/research/scss/research.scss
Normal file
142
assets/research/scss/research.scss
Normal file
|
@ -0,0 +1,142 @@
|
|||
.research-system {
|
||||
.main-page__content {
|
||||
margin-right: var(--sidebar-collapsed-width);
|
||||
.search-items {
|
||||
height: calc(100vh - 10em);
|
||||
overflow: auto;
|
||||
}
|
||||
.myResearches {
|
||||
.search-container {
|
||||
.input-group {
|
||||
/* justify-content: space-between; */
|
||||
border-radius: 50px;
|
||||
.form-control {
|
||||
border: 0;
|
||||
border-right: 1px solid #eee;
|
||||
border-left: 1px solid #eee;
|
||||
height: 3em;
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
border-radius: 50px 0 0 50px;
|
||||
min-width: 5em;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.advanced-search {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
|
||||
padding-top: 1em;
|
||||
padding-bottom: 1em;
|
||||
|
||||
width: 20em;
|
||||
// height: calc(100dvh - 10em);
|
||||
overflow-y: auto;
|
||||
background: #fff;
|
||||
z-index: 99;
|
||||
box-shadow: 0 0.4688rem 2.1875rem rgba(4, 9, 20, 0.03),
|
||||
0 0.9375rem 1.4063rem rgba(4, 9, 20, 0.03),
|
||||
0 0.25rem 0.5313rem rgba(4, 9, 20, 0.03),
|
||||
0 0.125rem 0.1875rem rgba(4, 9, 20, 0.03);
|
||||
// border-radius: 0.25em;
|
||||
|
||||
.multiselect__tags {
|
||||
border: unset !important;
|
||||
}
|
||||
|
||||
.bottom-close-form {
|
||||
&:hover {
|
||||
color: #6acfef;
|
||||
}
|
||||
}
|
||||
@media (max-width: 768px) {
|
||||
.bottom-close-form {
|
||||
position: absolute;
|
||||
bottom: 7em !important;
|
||||
}
|
||||
}
|
||||
// .search-page__search.in-search {
|
||||
// input {
|
||||
// padding-right: 5em !important;
|
||||
// border: 1px solid transparent;
|
||||
// }
|
||||
// }
|
||||
.form-group {
|
||||
&.inside-advanced-search {
|
||||
.form-control {
|
||||
border-radius: 0.5em;
|
||||
border: 1px solid #ced4da;
|
||||
// padding: 1.2em;
|
||||
// width: 14em;
|
||||
&:focus {
|
||||
border: 1px solid #61bb9e;
|
||||
}
|
||||
}
|
||||
.date-picker {
|
||||
.vpd-input-group {
|
||||
direction: ltr;
|
||||
.vpd-icon-btn {
|
||||
margin-bottom: 0;
|
||||
// position: absolute;
|
||||
// right: 15.6em;
|
||||
// height: 3em;
|
||||
border-radius: 0.5em 0em 0em 0.5em;
|
||||
}
|
||||
.form-control {
|
||||
border-radius: 0 0.5em 0.5em 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.select.in-advanced-search {
|
||||
// padding: 0.3em !important;
|
||||
border-radius: 0.5em;
|
||||
font-size: 1rem;
|
||||
// height: 3em;
|
||||
// width: 15em !important;
|
||||
border: 1px solid #ced4da !important;
|
||||
&:focus {
|
||||
border: 1px solid rgb(127, 170, 170) !important;
|
||||
}
|
||||
}
|
||||
// .tribute.in-advanced-search {
|
||||
// width: 18em !important;
|
||||
// }
|
||||
.form-control {
|
||||
height: 2.2em;
|
||||
}
|
||||
}
|
||||
.filter-list-container {
|
||||
.mobile-mode {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
.TermPage {
|
||||
.nav-tabs-container {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
.nav-link {
|
||||
.active {
|
||||
color: #495057;
|
||||
background-color: #fff;
|
||||
border-color: #dee2e6 #dee2e6 #fff;
|
||||
}
|
||||
}
|
||||
}
|
||||
.pages-content {
|
||||
width: 100%;
|
||||
|
||||
// margin-top: 2em;
|
||||
padding: 0;
|
||||
// height: calc(100dvh - 2em);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@import "./responsive/responsive";
|
||||
}
|
130
assets/research/scss/responsive/max_width/991/_group.scss
Normal file
130
assets/research/scss/responsive/max_width/991/_group.scss
Normal file
|
@ -0,0 +1,130 @@
|
|||
.main-page__content {
|
||||
// .pages {
|
||||
// .pages-content {
|
||||
.menu-bar__content {
|
||||
position: fixed !important;
|
||||
max-width: 24em;
|
||||
min-width: 22em;
|
||||
z-index: 3;
|
||||
background-color: #fff;
|
||||
right: 0;
|
||||
// overflow: hidden;
|
||||
transition: right 0.3s ease-out;
|
||||
top: 0;
|
||||
bottom: 4.5em;
|
||||
|
||||
&.mini {
|
||||
right: -100%;
|
||||
transition: right 0.3s ease-out;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
.home-list__header {
|
||||
.search-form {
|
||||
.form-group {
|
||||
.form-control {
|
||||
// width: 98%;
|
||||
}
|
||||
|
||||
.dropdown {
|
||||
// width: 1.5rem;
|
||||
// position: relative;
|
||||
// left: 0.5rem;
|
||||
// top: 0.25rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.home-list__content {
|
||||
.scroll-needed {
|
||||
height: calc(100dvh - 10em);
|
||||
}
|
||||
}
|
||||
.hide-list-panel {
|
||||
}
|
||||
|
||||
|
||||
.groups-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
.right-icons {
|
||||
.toggle-list {
|
||||
display: none!important;
|
||||
}
|
||||
// .group-name {
|
||||
// display: none;
|
||||
// }
|
||||
}
|
||||
.left-icons {
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.dropdown {
|
||||
&.profile-dropdown {
|
||||
.nav-link {
|
||||
&.dropdown-toggle {
|
||||
span {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.btn {
|
||||
// display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.create-forms {
|
||||
right: 0;
|
||||
z-index: 99;
|
||||
max-width: 80%;
|
||||
border-left: 1px solid #eee;
|
||||
}
|
||||
}
|
||||
|
||||
.position-relative {
|
||||
.show-toggle-list-panel {
|
||||
// position: absolute;
|
||||
// right: 3rem;
|
||||
// top: 0.25rem;
|
||||
// display: block;
|
||||
// button {
|
||||
// left: 0px;
|
||||
// }
|
||||
}
|
||||
.dropdown {
|
||||
// position: absolute;
|
||||
// top: 0px;
|
||||
}
|
||||
}
|
||||
.hide-list-panel .toggle-mobile-nav {
|
||||
// position: absolute;
|
||||
// bottom: 0.25rem;
|
||||
// right: 0.25rem;
|
||||
}
|
||||
}
|
||||
#myTabContent {
|
||||
#property {
|
||||
// position: relative;
|
||||
// top: 8rem;
|
||||
}
|
||||
}
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
.navbar {
|
||||
.profile-dropdown {
|
||||
// bottom: 0.5rem;
|
||||
}
|
||||
}
|
40
assets/research/scss/responsive/max_width/991/_replays.scss
Normal file
40
assets/research/scss/responsive/max_width/991/_replays.scss
Normal file
|
@ -0,0 +1,40 @@
|
|||
#replays {
|
||||
position: fixed !important;
|
||||
left: -25em;
|
||||
top: 0;
|
||||
bottom: 4.5em;
|
||||
transition: left 0.3s ease-out;
|
||||
max-width: 80%;
|
||||
z-index: 98;
|
||||
|
||||
&.show {
|
||||
transition: left 0.3s ease-out;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
.replay-list {
|
||||
.comment-container {
|
||||
.comment {
|
||||
margin-right: 0;
|
||||
|
||||
&::after,
|
||||
&::before {
|
||||
display: none;
|
||||
}
|
||||
.comment-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 0.5em;
|
||||
|
||||
.commentor-avatar {
|
||||
margin-left: 0.5em;
|
||||
position: static;
|
||||
}
|
||||
}
|
||||
.comment-actions {
|
||||
visibility: visible;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,78 @@
|
|||
.mobile-footer {
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
/* height: 3.5em; */
|
||||
/* -webkit-box-shadow: 0px 1px 6px 3px #eee; */
|
||||
box-shadow: 0px 1px 6px 3px #eee;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
padding: 0.5em 1em;
|
||||
background-color: #fafafa;
|
||||
z-index: 98;
|
||||
|
||||
.footer-menu {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
justify-content: space-around;
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
|
||||
.footer-menu-item {
|
||||
.footer-menu-item-btn {
|
||||
width: 3.3em;
|
||||
height: 3.3em;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-radius: 50%;
|
||||
padding: 0;
|
||||
color: #333;
|
||||
position: relative;
|
||||
|
||||
|
||||
|
||||
* {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.button-title {
|
||||
font-size: 0.8rem;
|
||||
// color:#6f6f6f;
|
||||
}
|
||||
|
||||
&.active {
|
||||
color: #00b6e3;
|
||||
// fill:blue;
|
||||
.icon {
|
||||
// background-color: blue;
|
||||
}
|
||||
// border: 1px solid #c7c7c7;
|
||||
// background-color: #fafafa;
|
||||
// border-color: green;
|
||||
// transform: translateY(-10px) scale(1.1);
|
||||
|
||||
&::before {
|
||||
content: "";
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: -0.6em;
|
||||
left: 0;
|
||||
right: 0;
|
||||
border-top: 2px solid #00b6e3;
|
||||
}
|
||||
}
|
||||
|
||||
&.disabled, &:disabled {
|
||||
opacity: 0.4;
|
||||
// filter: grayscale(0.6);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
126
assets/research/scss/responsive/max_width/991/chat-list.scss
Normal file
126
assets/research/scss/responsive/max_width/991/chat-list.scss
Normal file
|
@ -0,0 +1,126 @@
|
|||
.main-page__content {
|
||||
#comments-and-replays {
|
||||
.chat-list-group-info {
|
||||
.group-info-actions {
|
||||
& > .btn:not(.issue-redirect-btn),
|
||||
& > .multiselect,
|
||||
& > .multiselect-container {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.group-row .group-content .group-title-container .group-title {
|
||||
max-width: 13em;
|
||||
}
|
||||
.group-row
|
||||
.group-content
|
||||
.group-description-container
|
||||
.group-description {
|
||||
max-width: 13em;
|
||||
}
|
||||
}
|
||||
|
||||
.comment-list {
|
||||
.comments {
|
||||
// height: 70vh;
|
||||
// height: calc(100dvh - 70px - 63px - 3.7em);
|
||||
// height: calc(100dvh - 8.5em);
|
||||
// height: calc(100dvh - 10em);
|
||||
.drop {
|
||||
// height: calc(100dvh - 16.5em);
|
||||
|
||||
.stream {
|
||||
// height: calc(100dvh - 12em);
|
||||
// height: calc(100dvh - 16.5em);
|
||||
height: calc(100dvh - 16.5em);
|
||||
|
||||
&.filter-is-active {
|
||||
// height: calc(100dvh - 21em) !important;
|
||||
// height: calc(100dvh - 24.5em) !important;
|
||||
height: calc(100dvh - 21em);
|
||||
|
||||
& + .empty .wrapper {
|
||||
bottom: 5em;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.replays-is-open {
|
||||
.comments {
|
||||
// height: 70vh;
|
||||
// height: calc(100dvh - 70px - 63px - 3.7em);
|
||||
// height: calc(100dvh - 8.5em);
|
||||
// height: calc(100dvh - 10em);
|
||||
.drop {
|
||||
// height: calc(100dvh - 16.5em);
|
||||
|
||||
.stream {
|
||||
height: calc(100dvh - 20em);
|
||||
|
||||
&.filter-is-active {
|
||||
// height: calc(100dvh - 21em) !important;
|
||||
// height: calc(100dvh - 24.5em) !important;
|
||||
height: calc(100dvh - 24em);
|
||||
|
||||
& + .empty .wrapper {
|
||||
bottom: 8.5em;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.comment-form-container {
|
||||
min-width: unset;
|
||||
}
|
||||
|
||||
.comments {
|
||||
.comment-container {
|
||||
margin: 0;
|
||||
|
||||
&.replayer {
|
||||
.comment {
|
||||
margin-left: 0;
|
||||
}
|
||||
}
|
||||
.comment {
|
||||
margin-right: 0;
|
||||
max-width: 20em;
|
||||
|
||||
&::after,
|
||||
&::before {
|
||||
display: none;
|
||||
}
|
||||
.comment-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 0.5em;
|
||||
|
||||
.commentor-avatar {
|
||||
margin-left: 0.5em;
|
||||
position: static;
|
||||
}
|
||||
}
|
||||
.comment-actions {
|
||||
visibility: visible;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.first-last-button {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.menu-multiselect {
|
||||
}
|
||||
|
||||
.auth-page .sign-up--tabs {
|
||||
height: auto;
|
||||
}
|
||||
}
|
||||
}
|
130
assets/research/scss/responsive/max_width/max_width.scss
Normal file
130
assets/research/scss/responsive/max_width/max_width.scss
Normal file
|
@ -0,0 +1,130 @@
|
|||
// 1600px
|
||||
@media screen and (max-width: 100em) {
|
||||
// @import "./1600/my_table_1600";
|
||||
// @import "./1600/the_list_panel_1600";
|
||||
// @import "./1600/sub_header_1600";
|
||||
}
|
||||
// 1399px
|
||||
@media screen and (max-width: 87.499em) {
|
||||
// @import "./1399/the_list_panel-1399";
|
||||
// @import "./1399/_sub_header_1399";
|
||||
}
|
||||
|
||||
// 991px
|
||||
@media screen and (max-width: 61.998em) {
|
||||
.main-page__content {
|
||||
.search-items {
|
||||
height: calc(100vh - 13em);
|
||||
}
|
||||
.filter-list-container {
|
||||
padding-top: 0.5em;
|
||||
position: fixed;
|
||||
|
||||
z-index: 9;
|
||||
width: auto;
|
||||
|
||||
.main-filter {
|
||||
display: none;
|
||||
}
|
||||
.mobile-mode {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
|
||||
.btn {
|
||||
border-radius: 50%;
|
||||
// font-size: 0.7rem;
|
||||
width: 2.5em;
|
||||
height: 2.5em;
|
||||
box-shadow: 0px 0px 7px 1px #eee;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
transform: translateX(1.5em);
|
||||
background-color: #eee;
|
||||
|
||||
&:hover {
|
||||
filter: brightness(0.8);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.expanded {
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
margin-right: var(--sidebar-collapsed-width);
|
||||
background: #fff;
|
||||
justify-content: center;
|
||||
box-shadow: -1px 0px 7px 1px #eee;
|
||||
|
||||
.main-filter {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// @import "./991/group";
|
||||
// @import "./991/the-footer";
|
||||
// @import "./991/chat-list.scss";
|
||||
// @import "./991/replays";
|
||||
// @import "./991/_sub_header_991";
|
||||
// @import "./991/my_table_991";
|
||||
}
|
||||
|
||||
// 767px
|
||||
@media screen and (max-width: 47.938em) {
|
||||
.main-page__content {
|
||||
.search-items {
|
||||
height: calc(100vh - 15em);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
// @import "./767/group";
|
||||
// @import "./767/the_list_panel_767";
|
||||
// @import "./767/the_navbar_767";
|
||||
// @import "./767/_sub_header_767";
|
||||
// @import "./767/the-footer";
|
||||
}
|
||||
|
||||
// 575px
|
||||
@media screen and (max-width: 35.938em) {
|
||||
.main-page__content {
|
||||
.search-items {
|
||||
height: calc(100vh - 15em);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
// @import "./575/main_575";
|
||||
// @import "./575/my_table_575";
|
||||
// @import "./575/the_list_panel_575";
|
||||
// @import "./575/the_navbar_575";
|
||||
// @import "./575/sub_header_575";
|
||||
}
|
||||
|
||||
// 399px
|
||||
@media screen and (max-width: 24.938em) {
|
||||
.main-page__content {
|
||||
.search-items {
|
||||
height: calc(100vh - 15em);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
// @import "./399/chat-list.scss";
|
||||
// @import "./399/my_table_399";
|
||||
// @import "./399/sub_header_399";
|
||||
// @import "./399/the-_navbar_399";
|
||||
// @import "./399/the_list_panel_399";
|
||||
}
|
||||
//360px
|
||||
@media screen and (max-width: 22.5em) {
|
||||
// @import "./360/main_360";
|
||||
// @import "./360/sub_header_360";
|
||||
// @import "./360/the_list_panel_360";
|
||||
// @import "./360/the_navbar_360";
|
||||
}
|
78
assets/research/scss/responsive/min_width/400/_group.scss
Normal file
78
assets/research/scss/responsive/min_width/400/_group.scss
Normal file
|
@ -0,0 +1,78 @@
|
|||
.main-page__content {
|
||||
.menu-bar__content {
|
||||
// max-width: 50%;
|
||||
// min-width: 50%;
|
||||
|
||||
.groups-header {
|
||||
// display: flex;
|
||||
// justify-content: space-between;
|
||||
// align-items: center;
|
||||
|
||||
.dropdown {
|
||||
&.profile-dropdown {
|
||||
// display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
.group-filter-mobile {
|
||||
// display: none;
|
||||
}
|
||||
|
||||
.toggle-sidebar {
|
||||
// display: none;
|
||||
}
|
||||
.toggle-menu-bar {
|
||||
// display: none;
|
||||
}
|
||||
|
||||
&.mini {
|
||||
// max-width: 5em;
|
||||
// min-width: 5em;
|
||||
|
||||
.right-icons {
|
||||
& > .btn:not(.toggle-list), .group-name ,& > svg {
|
||||
// display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.groups-header {
|
||||
.toggle-search {
|
||||
// display: none;
|
||||
}
|
||||
.toggle-filter {
|
||||
// display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.group-item {
|
||||
.group-row {
|
||||
.group-picture-container {
|
||||
.context-menu-dropdown {
|
||||
// display: none !important;
|
||||
}
|
||||
|
||||
.group-picture.mini-mode {
|
||||
// display: inline !important;
|
||||
// cursor: pointer;
|
||||
}
|
||||
.group-picture {
|
||||
// display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.group-content {
|
||||
// display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.home-list__content {
|
||||
}
|
||||
}
|
||||
}
|
||||
.position-relative {
|
||||
.dropdown {
|
||||
// top: 50px;
|
||||
}
|
||||
}
|
||||
}
|
80
assets/research/scss/responsive/min_width/576/_group.scss
Normal file
80
assets/research/scss/responsive/min_width/576/_group.scss
Normal file
|
@ -0,0 +1,80 @@
|
|||
.main-page__content {
|
||||
.menu-bar__content {
|
||||
// max-width: 24em;
|
||||
// min-width: 20em;
|
||||
|
||||
.groups-header {
|
||||
// display: flex;
|
||||
// justify-content: space-between;
|
||||
// align-items: center;
|
||||
|
||||
.dropdown {
|
||||
&.profile-dropdown {
|
||||
// display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
.group-filter-mobile {
|
||||
// display: none;
|
||||
}
|
||||
|
||||
.toggle-sidebar {
|
||||
// display: none;
|
||||
}
|
||||
.toggle-menu-bar {
|
||||
// display: none;
|
||||
}
|
||||
|
||||
&.mini {
|
||||
// max-width: 5em;
|
||||
// min-width: 5em;
|
||||
|
||||
.right-icons {
|
||||
& > .btn:not(.toggle-list),
|
||||
.group-name,
|
||||
& > svg {
|
||||
// display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.groups-header {
|
||||
.toggle-search {
|
||||
// display: none;
|
||||
}
|
||||
.toggle-filter {
|
||||
// display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.group-item {
|
||||
.group-row {
|
||||
.group-picture-container {
|
||||
.context-menu-dropdown {
|
||||
// display: none !important;
|
||||
}
|
||||
|
||||
.group-picture.mini-mode {
|
||||
// display: inline !important;
|
||||
// cursor: pointer;
|
||||
}
|
||||
.group-picture {
|
||||
// display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.group-content {
|
||||
// display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.home-list__content {
|
||||
}
|
||||
}
|
||||
}
|
||||
.position-relative {
|
||||
.dropdown {
|
||||
// top: 50px;
|
||||
}
|
||||
}
|
||||
}
|
81
assets/research/scss/responsive/min_width/768/_group.scss
Normal file
81
assets/research/scss/responsive/min_width/768/_group.scss
Normal file
|
@ -0,0 +1,81 @@
|
|||
.main-page__content {
|
||||
.menu-bar__content {
|
||||
// max-width: 40%;
|
||||
// min-width: 40%;
|
||||
right:4.5em;
|
||||
|
||||
.groups-header {
|
||||
// display: flex;
|
||||
// justify-content: space-between;
|
||||
// align-items: center;
|
||||
|
||||
.dropdown {
|
||||
&.profile-dropdown {
|
||||
// display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
.group-filter-mobile {
|
||||
// display: none;
|
||||
}
|
||||
|
||||
.toggle-sidebar {
|
||||
// display: none;
|
||||
}
|
||||
.toggle-menu-bar {
|
||||
// display: none;
|
||||
}
|
||||
|
||||
&.mini {
|
||||
// max-width: 5em;
|
||||
// min-width: 5em;
|
||||
|
||||
.right-icons {
|
||||
& > .btn:not(.toggle-list),
|
||||
.group-name,
|
||||
& > svg {
|
||||
// display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.groups-header {
|
||||
.toggle-search {
|
||||
// display: none;
|
||||
}
|
||||
.toggle-filter {
|
||||
// display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.group-item {
|
||||
.group-row {
|
||||
.group-picture-container {
|
||||
.context-menu-dropdown {
|
||||
// display: none !important;
|
||||
}
|
||||
|
||||
.group-picture.mini-mode {
|
||||
// display: inline !important;
|
||||
// cursor: pointer;
|
||||
}
|
||||
.group-picture {
|
||||
// display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.group-content {
|
||||
// display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.home-list__content {
|
||||
}
|
||||
}
|
||||
}
|
||||
.position-relative {
|
||||
.dropdown {
|
||||
// top: 50px;
|
||||
}
|
||||
}
|
||||
}
|
81
assets/research/scss/responsive/min_width/992/_group.scss
Normal file
81
assets/research/scss/responsive/min_width/992/_group.scss
Normal file
|
@ -0,0 +1,81 @@
|
|||
.main-page__content {
|
||||
.menu-bar__content {
|
||||
// -webkit-box-flex: 1;
|
||||
// -ms-flex: 1 1 100%;
|
||||
// max-width: 200px;
|
||||
// width: auto;
|
||||
// position: fixed!important;
|
||||
|
||||
.groups-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
.dropdown {
|
||||
&.profile-dropdown {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
.group-filter-mobile {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.toggle-sidebar {
|
||||
display: none;
|
||||
}
|
||||
.toggle-menu-bar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
&.mini {
|
||||
max-width: 5em;
|
||||
min-width: 5em;
|
||||
|
||||
.right-icons {
|
||||
& > .btn:not(.toggle-list), .group-name ,& > svg {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.groups-header {
|
||||
.toggle-search {
|
||||
display: none;
|
||||
}
|
||||
.toggle-filter {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.group-item {
|
||||
.group-row {
|
||||
.group-picture-container {
|
||||
.context-menu-dropdown {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.group-picture.mini-mode {
|
||||
display: inline !important;
|
||||
cursor: pointer;
|
||||
}
|
||||
.group-picture {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.group-content {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.home-list__content {
|
||||
}
|
||||
}
|
||||
}
|
||||
.position-relative {
|
||||
.dropdown {
|
||||
// top: 50px;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
.mobile-footer {
|
||||
display: none;
|
||||
}
|
45
assets/research/scss/responsive/min_width/min-width.scss
Normal file
45
assets/research/scss/responsive/min_width/min-width.scss
Normal file
|
@ -0,0 +1,45 @@
|
|||
// 200px
|
||||
@media screen and (min-width: 200px) {
|
||||
// @import "./200/main_200";
|
||||
}
|
||||
|
||||
//400px
|
||||
|
||||
@media screen and (min-width: 24.938em) {
|
||||
// @import "./400/group";
|
||||
// @import "./399/sub_header_399";
|
||||
// @import "./399/the_navbar_399";
|
||||
}
|
||||
// 576px
|
||||
@media screen and (min-width: 36em) {
|
||||
// @import "./576/group";
|
||||
// @import "./576/sub_header_576";
|
||||
// @import "./576/my_table_576";
|
||||
}
|
||||
// 768px
|
||||
@media screen and (min-width: 48em) {
|
||||
// @import "./768/group";
|
||||
// @import "./576/sub_header_576";
|
||||
// @import "./576/my_table_576";
|
||||
}
|
||||
// 992px
|
||||
@media screen and (min-width: 62em) {
|
||||
// @import "./992/group";
|
||||
// @import "./992/the-footer";
|
||||
// @import "./992/sub_header_992";
|
||||
}
|
||||
|
||||
// 1200px
|
||||
|
||||
// 1400px
|
||||
|
||||
// // 1600px
|
||||
// @media screen and (min-width: 100.000em) {
|
||||
// @import "./992/category_992";
|
||||
// }
|
||||
|
||||
// //1800px
|
||||
// @media screen and (min-width: 112.500em) {}
|
||||
|
||||
// //2000px
|
||||
// @media screen and (min-width: 125.000em) {}
|
11
assets/research/scss/responsive/responsive.scss
Normal file
11
assets/research/scss/responsive/responsive.scss
Normal file
|
@ -0,0 +1,11 @@
|
|||
// the base pixel size is : "16px"
|
||||
|
||||
//
|
||||
// max width media queries
|
||||
//
|
||||
@import "./max_width/max_width.scss";
|
||||
|
||||
//
|
||||
// min width media queries
|
||||
//
|
||||
@import "./min_width/min-width.scss";
|
178
components/research/components/AdvancedSearch.vue
Normal file
178
components/research/components/AdvancedSearch.vue
Normal file
|
@ -0,0 +1,178 @@
|
|||
<template>
|
||||
<div class="advanced-search firefox-scrollbar">
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<form>
|
||||
<component
|
||||
v-for="(formElement, index) in localFormElements"
|
||||
:key="index"
|
||||
:formElement="getValueToFormElement(formElement)"
|
||||
:inputClass="formElement.inputClass"
|
||||
:labelClass="formElement.labelClass"
|
||||
:is="returnComponentName(formElement.type)"
|
||||
@tribute-on-search="remoteSearch"
|
||||
@oninput="createQuery($event, index)"
|
||||
class="inside-advanced-search"
|
||||
></component>
|
||||
|
||||
<div class="d-flex justify-content-end align-items-baseline">
|
||||
<div class="bottom-close-form ms-3">
|
||||
<a @click.prevent="closeAdvancedSearch">بستن</a>
|
||||
</div>
|
||||
<div class="bottom-save-form">
|
||||
<button
|
||||
type="submit"
|
||||
class="btn btn-primary"
|
||||
style="font-size: 11px; height: 3em; width: 7em"
|
||||
@click.prevent="searchStart()"
|
||||
>
|
||||
جستجو
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
import { useResearchStore } from "~/stores/researchStore";
|
||||
|
||||
import { mapState } from "pinia";
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
listUpdatedText: {},
|
||||
localFormElements: [],
|
||||
value: "",
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState(useSearchStore, ["searchActiveTabGetter"]),
|
||||
...mapState(useResearchStore, ["researchSchemaGetter"]),
|
||||
},
|
||||
watch: {
|
||||
researchSchemaGetter: {
|
||||
handler: function (newSchema) {
|
||||
if (newSchema[0].advance)
|
||||
this.localFormElements = structuredClone(newSchema[0].advance);
|
||||
},
|
||||
// deep: true,
|
||||
immediate: true,
|
||||
},
|
||||
},
|
||||
beforeMount() {
|
||||
this.httpService = new HttpService(import.meta.env.VITE_BASE_URL);
|
||||
},
|
||||
|
||||
mounted() {
|
||||
this.localFormElements = structuredClone(
|
||||
this.researchSchemaGetter[0].advance
|
||||
);
|
||||
},
|
||||
methods: {
|
||||
closeAdvancedSearch() {
|
||||
this.$emit("closeAdvancedSearch");
|
||||
},
|
||||
remoteSearch({ text, cb, item }) {
|
||||
// for clearing the query when user remove by keyboard backspace.
|
||||
if (text == "") this.makeSearchParams(undefined, 1);
|
||||
|
||||
let url = item.completion;
|
||||
|
||||
text = text.trim();
|
||||
url = url.replace("{{key}}", this.researchSchemaGetter[0].key);
|
||||
if (text == "") url = url.replace("/{{query}}", "");
|
||||
else url = url.replace("{{query}}", text);
|
||||
this.httpService.getRequest(url).then((response) => {
|
||||
cb(response.data);
|
||||
});
|
||||
},
|
||||
getValueToFormElement(elements) {
|
||||
Object.keys(elements).forEach((key, index) => {
|
||||
elements["value"] = this.researchSchemaGetter[0][elements.key];
|
||||
});
|
||||
return elements;
|
||||
},
|
||||
saveComponentValue(value, formElement) {
|
||||
// در صورت تغییر نگهداری می شود تا وقتی کلید ثبت زد، ذخیره شود
|
||||
if (this.researchSchemaGetter[0][formElement.key] != value) {
|
||||
this.listUpdatedText[formElement.key] = value;
|
||||
}
|
||||
},
|
||||
returnComponentName(type) {
|
||||
// if(!this.isEditable(searchActiveTabGetter?.key))
|
||||
// return "LabelComponent";
|
||||
|
||||
if (type == "select") return "SelectComponent";
|
||||
else if (type == "range_date") return "RangeDateComponent";
|
||||
else if (type == "completion") return "TributeComponent";
|
||||
else return "InputComponent";
|
||||
},
|
||||
|
||||
// این لازم نیست و استفاده نداره!!!!!
|
||||
// saveProperty() {
|
||||
// let id = this.$route.params.id;
|
||||
// let key = this.$route.params.key;
|
||||
|
||||
// let formData = {
|
||||
// id: id,
|
||||
// meta: JSON.stringify(this.listUpdatedText),
|
||||
// };
|
||||
|
||||
// let url = "/public/{{index_key}}/update/{{id}}";
|
||||
// url = url.replace("{{index_key}}", key).replace("{{id}}", id);
|
||||
// this.httpService.postRequest(url, formData).then((res) => {
|
||||
// this.getServerItem();
|
||||
// });
|
||||
// },
|
||||
createQuery(evt, index) {
|
||||
// evt.target.value => from input component.
|
||||
//evt => from datetime component.
|
||||
let value = evt?.target?.value ?? evt;
|
||||
this.$emit("set-query-advanced", this.makeSearchParams(value, index));
|
||||
},
|
||||
makeSearchParams(value, index) {
|
||||
if (value != undefined) this.localFormElements[index].value = value;
|
||||
else this.localFormElements[index].value = undefined;
|
||||
|
||||
let query = "";
|
||||
|
||||
this.localFormElements.forEach((item, rowIndex, array) => {
|
||||
if (item.value?.length)
|
||||
query += "#" + item.tag + " " + item.value + " ";
|
||||
});
|
||||
|
||||
return query;
|
||||
},
|
||||
searchStart() {
|
||||
this.$emit("searchStart", this.searchStartValue());
|
||||
},
|
||||
searchStartValue() {
|
||||
let query = "";
|
||||
this.localFormElements.forEach((item, rowIndex, array) => {
|
||||
if (item.value?.length)
|
||||
query += "#" + item.tag + " " + item.value + " ";
|
||||
});
|
||||
return myEncodeQuery(query);
|
||||
},
|
||||
|
||||
myEncodeQuery(text) {
|
||||
let ch1 = encodeURIComponent("#");
|
||||
let ch2 = encodeURIComponent("/");
|
||||
let ch3 = encodeURIComponent("\\");
|
||||
// let ch4 = encodeURIComponent(".");
|
||||
text = text.replaceAll("#", ch1);
|
||||
text = text.replaceAll("/", "\\");
|
||||
text = text.replaceAll("\\", ch3);
|
||||
// text = text.replaceAll(".", '%2E');
|
||||
return text;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
76
components/research/components/FormAddChildrenToTree.vue
Normal file
76
components/research/components/FormAddChildrenToTree.vue
Normal file
|
@ -0,0 +1,76 @@
|
|||
<template>
|
||||
<form
|
||||
class="container"
|
||||
role="create"
|
||||
style="height: 100%; display: flex; flex-direction: column"
|
||||
>
|
||||
<div class="form-group">
|
||||
<label>نام را وارد کنید :</label>
|
||||
<input
|
||||
type="text"
|
||||
class="form-control"
|
||||
placeholder="شروع به نوشتن کنید"
|
||||
v-focus
|
||||
v-model="nameInput"
|
||||
/>
|
||||
</div>
|
||||
<div class="form-row d-flex justify-content-end">
|
||||
<div class="form-group">
|
||||
<button
|
||||
@click.prevent="close()"
|
||||
type="button"
|
||||
class="btn btn-default"
|
||||
data-dismiss="modal"
|
||||
>
|
||||
بستن
|
||||
</button>
|
||||
<button
|
||||
@click.prevent="save()"
|
||||
type="button"
|
||||
class="btn btn-outline-primary me-2"
|
||||
>
|
||||
ذخیره
|
||||
</button>
|
||||
<!-- <button
|
||||
:disabled="fetchingData"
|
||||
@click.prevent="remove()"
|
||||
type="button"
|
||||
class="btn btn-primary"
|
||||
>
|
||||
حذف
|
||||
</button> -->
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
|
||||
export default {
|
||||
props: {
|
||||
value: {
|
||||
default: "",
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.httpService = new HttpService(import.meta.env.VITE_BASE_URL);
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
nameInput: "",
|
||||
inputfocused: false,
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
close() {
|
||||
this.$emit("closeAddName");
|
||||
},
|
||||
save() {
|
||||
this.$emit("addNewChildren", this.nameInput);
|
||||
this.$emit("close");
|
||||
},
|
||||
},
|
||||
|
||||
};
|
||||
</script>
|
74
components/research/components/FormAddToTree.vue
Normal file
74
components/research/components/FormAddToTree.vue
Normal file
|
@ -0,0 +1,74 @@
|
|||
<template>
|
||||
<form
|
||||
class="container"
|
||||
role="create"
|
||||
style="height: 100%; display: flex; flex-direction: column"
|
||||
>
|
||||
<div class="form-group">
|
||||
<label>نام را وارد کنید :</label>
|
||||
<input
|
||||
type="text"
|
||||
class="form-control"
|
||||
placeholder="شروع به نوشتن کنید"
|
||||
v-model="nameInput"
|
||||
/>
|
||||
</div>
|
||||
<div class="form-row d-flex justify-content-end">
|
||||
<div class="form-group">
|
||||
<button
|
||||
@click.prevent="close()"
|
||||
type="button"
|
||||
class="btn btn-default"
|
||||
data-dismiss="modal"
|
||||
>
|
||||
بستن
|
||||
</button>
|
||||
<button
|
||||
@click.prevent="save()"
|
||||
type="button"
|
||||
class="btn btn-outline-primary me-2"
|
||||
>
|
||||
ذخیره
|
||||
</button>
|
||||
<!-- <button
|
||||
:disabled="fetchingData"
|
||||
@click.prevent="remove()"
|
||||
type="button"
|
||||
class="btn btn-primary"
|
||||
>
|
||||
حذف
|
||||
</button> -->
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
|
||||
export default {
|
||||
props: {
|
||||
value: {
|
||||
default: "",
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.httpService = new HttpService(import.meta.env.VITE_BASE_URL);
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
nameInput: "",
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
close() {
|
||||
this.$emit("closeAddName");
|
||||
},
|
||||
save() {
|
||||
this.$emit("addNew", this.nameInput);
|
||||
this.$emit("close");
|
||||
},
|
||||
},
|
||||
|
||||
};
|
||||
</script>
|
78
components/research/components/FormEditToTree.vue
Normal file
78
components/research/components/FormEditToTree.vue
Normal file
|
@ -0,0 +1,78 @@
|
|||
<template>
|
||||
<form
|
||||
class="container"
|
||||
role="create"
|
||||
style="height: 100%; display: flex; flex-direction: column"
|
||||
>
|
||||
<div class="form-group">
|
||||
<label>نام را وارد کنید :</label>
|
||||
<input
|
||||
type="text"
|
||||
class="form-control"
|
||||
placeholder="شروع به نوشتن کنید"
|
||||
v-model="nameInput"
|
||||
/>
|
||||
</div>
|
||||
<div class="form-row d-flex justify-content-end">
|
||||
<div class="form-group">
|
||||
<button
|
||||
@click.prevent="close()"
|
||||
type="button"
|
||||
class="btn btn-default"
|
||||
data-dismiss="modal"
|
||||
>
|
||||
بستن
|
||||
</button>
|
||||
<button
|
||||
@click.prevent="save()"
|
||||
type="button"
|
||||
class="btn btn-outline-primary me-2"
|
||||
>
|
||||
ذخیره
|
||||
</button>
|
||||
<!-- <button
|
||||
:disabled="fetchingData"
|
||||
@click.prevent="remove()"
|
||||
type="button"
|
||||
class="btn btn-primary"
|
||||
>
|
||||
حذف
|
||||
</button> -->
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
|
||||
export default {
|
||||
props: {
|
||||
value: {
|
||||
default: "",
|
||||
},
|
||||
editingItem: {
|
||||
default: {},
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.httpService = new HttpService(import.meta.env.VITE_BASE_URL);
|
||||
this.nameInput = this.editingItem?.text
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
nameInput: "",
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
close() {
|
||||
this.$emit("closeAddName");
|
||||
},
|
||||
save() {
|
||||
this.$emit("edit", this.nameInput);
|
||||
this.$emit("close");
|
||||
},
|
||||
},
|
||||
|
||||
};
|
||||
</script>
|
169
components/research/components/FormForAdd.vue
Normal file
169
components/research/components/FormForAdd.vue
Normal file
|
@ -0,0 +1,169 @@
|
|||
<template>
|
||||
<form @submit.prevent="save()">
|
||||
<div class="form-group form-row">
|
||||
<label class="col-2" for="title">عنوان: </label>
|
||||
<input
|
||||
class="form-control col"
|
||||
placeholder="عنوان را وارد کنید"
|
||||
type="text"
|
||||
id="title"
|
||||
name="title"
|
||||
v-model.trim="selectedItemClone.title"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="form-group form-row">
|
||||
<div class="col-12 d-flex justify-content-between">
|
||||
<div class="d-flex">
|
||||
<button-component
|
||||
type="submit"
|
||||
classes="btn-outline-primary"
|
||||
:buttonText="buttonText"
|
||||
:buttonLoading="buttonLoading"
|
||||
></button-component>
|
||||
<button-component
|
||||
classes="btn-default"
|
||||
@click="closeModal()"
|
||||
buttonText="انصراف"
|
||||
:buttonLoading="buttonLoading"
|
||||
></button-component>
|
||||
</div>
|
||||
<button-component
|
||||
v-if="selectedItem.id"
|
||||
classes="delete-btn btn-outline-danger"
|
||||
@click="deleteItem()"
|
||||
buttonText="حذف"
|
||||
:buttonLoading="buttonLoading"
|
||||
>
|
||||
<i class="tavasi tavasi-bin"></i>
|
||||
</button-component>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import apis from "~/apis/listApi";
|
||||
import { mapState } from "pinia";
|
||||
|
||||
export default {
|
||||
props: {
|
||||
selectedItem: {
|
||||
default() {
|
||||
return {};
|
||||
},
|
||||
},
|
||||
parentId: {
|
||||
default: 0,
|
||||
},
|
||||
|
||||
apiName: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
},
|
||||
|
||||
emits: ["update-list", "close-modal", "delete-item"],
|
||||
|
||||
data() {
|
||||
return {
|
||||
buttonLoading: false,
|
||||
selectedItemClone: {
|
||||
id: undefined,
|
||||
title: "",
|
||||
listtype: 0,
|
||||
projectid: this.selectedProjectGetter?.id,
|
||||
parent: this.parentId,
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState("list", [
|
||||
"selectedProjectGetter",
|
||||
"listIdGetter",
|
||||
"selectedItemGetter",
|
||||
]),
|
||||
buttonText() {
|
||||
return this.selectedItemClone.id || this.selectedItemClone.guid
|
||||
? "ذخیره"
|
||||
: "ثبت";
|
||||
},
|
||||
},
|
||||
|
||||
methods: {
|
||||
save() {
|
||||
if (this.buttonLoading) return;
|
||||
this.buttonLoading = true;
|
||||
|
||||
// apiName = subject | list
|
||||
const url = this.selectedItemClone.id
|
||||
? apis[this.apiName].edit
|
||||
: apis[this.apiName].add;
|
||||
|
||||
this.selectedItemClone.listid = this.listIdGetter;
|
||||
|
||||
ApiService.formData(url, this.selectedItemClone)
|
||||
.then((res) => {
|
||||
mySwalToast({
|
||||
title: "تبریک",
|
||||
html: res.data.message,
|
||||
icon: "success",
|
||||
});
|
||||
|
||||
this.$emit("update-list");
|
||||
})
|
||||
|
||||
.finally(() => {
|
||||
this.buttonLoading = false;
|
||||
});
|
||||
},
|
||||
deleteItem() {
|
||||
if (this.buttonLoading) return;
|
||||
this.buttonLoading = true;
|
||||
|
||||
const data = { id: this.listIdGetter, projectid: this.selectedProjectGetter?.id };
|
||||
|
||||
mySwalConfirm({
|
||||
title: "هشدار!!!",
|
||||
html: "از حذف این مورد مطمئن هستید؟",
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed) {
|
||||
ApiService.formData(apis.item.delete, data)
|
||||
.then((response) => {
|
||||
mySwalToast({
|
||||
title: "تبریک",
|
||||
html: response.data.message,
|
||||
icon: "success",
|
||||
});
|
||||
|
||||
this.$emit("delete-item");
|
||||
})
|
||||
|
||||
.finally(() => {
|
||||
this.buttonLoading = false;
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
closeModal() {
|
||||
this.resetForm();
|
||||
this.$emit("close-modal");
|
||||
},
|
||||
resetForm() {
|
||||
this.selectedItemClone = {
|
||||
id: undefined,
|
||||
title: "",
|
||||
listtype: 0,
|
||||
projectid: this.selectedProjectGetter?.id,
|
||||
parent: this.parentId,
|
||||
};
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
if (this.selectedItem?.id)
|
||||
this.selectedItemClone = structuredClone(this.selectedItem);
|
||||
else this.resetForm();
|
||||
},
|
||||
};
|
||||
</script>
|
94
components/research/components/FormForDelete.vue
Normal file
94
components/research/components/FormForDelete.vue
Normal file
|
@ -0,0 +1,94 @@
|
|||
<template>
|
||||
<form
|
||||
class="create-form container"
|
||||
role="create"
|
||||
style="height: 100%; display: flex; flex-direction: column"
|
||||
>
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<input
|
||||
class="form-check-input"
|
||||
type="radio"
|
||||
value="delete_all"
|
||||
v-model="selectedOption"
|
||||
/>
|
||||
<label for="title" class="me-5">حذف کل شاخه:</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<input
|
||||
class="form-check-input"
|
||||
type="radio"
|
||||
value="delete_one"
|
||||
v-model="selectedOption"
|
||||
/>
|
||||
<label for="title" class="me-5">حذف گره اصلی:</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex justify-content-center">
|
||||
<div v-if="selectedOption == 'delete_all'">
|
||||
<p>مراقب باشد کل داده شما پاک میشود</p>
|
||||
</div>
|
||||
<div v-else-if="selectedOption == 'delete_one'">
|
||||
<p>فقط مقدار اول پاک می شود و داده های آن به شاخه اصلی منتقل می شود</p>
|
||||
</div>
|
||||
<div v-else>
|
||||
<p>یکی از موارد را انتخاب کنید</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex justify-content-end align-items-end mt-auto">
|
||||
<button
|
||||
@click.prevent="close()"
|
||||
type="button"
|
||||
class="btn btn-secondary"
|
||||
data-dismiss="modal"
|
||||
>
|
||||
بستن
|
||||
</button>
|
||||
<button
|
||||
|
||||
@click.prevent="save()"
|
||||
type="button"
|
||||
class="btn btn-primary me-2"
|
||||
>
|
||||
حذف
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
import apis from "~/apis/borhanApi.js";
|
||||
|
||||
export default {
|
||||
props: {
|
||||
value: {
|
||||
default: "",
|
||||
},
|
||||
|
||||
},
|
||||
mounted() {
|
||||
this.httpService = new HttpService(import.meta.env.VITE_BASE_URL);
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
selectedOption: null,
|
||||
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
close() {
|
||||
|
||||
this.$emit("close");
|
||||
},
|
||||
save() {
|
||||
this.$emit("removItem", this.selectedOption);
|
||||
this.$emit("close");
|
||||
this.selectedOption = ""
|
||||
},
|
||||
},
|
||||
|
||||
};
|
||||
</script>
|
290
components/research/components/MainContent.vue
Normal file
290
components/research/components/MainContent.vue
Normal file
|
@ -0,0 +1,290 @@
|
|||
<template>
|
||||
<div class="prodigy-annotator c01118">
|
||||
<div class="c01119">
|
||||
<div class="prodigy-container c01139 c01137">
|
||||
<div tabindex="-1"></div>
|
||||
<div class="c01146">
|
||||
<div class="prodigy-title-wrapper c01152">
|
||||
<div class="prodigy-title c01150 c01147 c01151">
|
||||
<div tabindex="-1">
|
||||
<div class="prodigy-labels c01153">
|
||||
<span
|
||||
><input
|
||||
hidden=""
|
||||
type="radio"
|
||||
name="label"
|
||||
id="7cc2eef9-c52c-4a85-a815-aa7229ad261a"
|
||||
value="PERSON"
|
||||
checked=""
|
||||
/><label
|
||||
class="prodigy-label c01154 c01155"
|
||||
for="7cc2eef9-c52c-4a85-a815-aa7229ad261a"
|
||||
data-prodigy-label="PERSON"
|
||||
>PERSON<span class="c01156">1</span></label
|
||||
></span
|
||||
><span
|
||||
><input
|
||||
hidden=""
|
||||
type="radio"
|
||||
name="label"
|
||||
id="cb04bff7-3de1-4f74-a3e8-7f8ef398d98b"
|
||||
value="ORG"
|
||||
/><label
|
||||
class="prodigy-label c01154"
|
||||
for="cb04bff7-3de1-4f74-a3e8-7f8ef398d98b"
|
||||
data-prodigy-label="ORG"
|
||||
>ORG<span class="c01156">2</span></label
|
||||
></span
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="prodigy-content c01158 c01157">
|
||||
<div
|
||||
ref="section1"
|
||||
id="section1"
|
||||
@mouseup.left="onMouseUp($event)"
|
||||
class="c01164 c01148 c01165"
|
||||
>
|
||||
<p id="c01157">
|
||||
ماده واحده - به بانک مرکزی جمهوری اسلامی ایران اجازه داده می شود
|
||||
در اجرای ماده (11) قانون موافقتنامه تشویق و حمایت متقابل از
|
||||
سرمایه گذاری بین دولت جمهوری اسلامی ایران و دولت پادشاهی بحرین
|
||||
مصوب 1382/10/23 با همکاری معاونت حقوقی ریاست جمهوری نسبت به طی
|
||||
فرایند داوری مطابق موافقتنامه مذکور درباره اختلافات آن شرکت با
|
||||
دولت بحرین اقدام نماید.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="c01202 prodigy-meta">
|
||||
<span><strong>SOURCE: </strong>CMU Movie Summary Corpus</span>
|
||||
</div> -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- <footer class="c01122">
|
||||
<div class="prodigy-buttons c01127 c01126">
|
||||
<button
|
||||
class="prodigy-button-accept c01129 c01130"
|
||||
aria-label="accept (a)"
|
||||
title="accept (a)"
|
||||
>
|
||||
<svg
|
||||
aria-hidden="true"
|
||||
fill="currentColor"
|
||||
width="40"
|
||||
height="40"
|
||||
viewBox="0 0 24 24"
|
||||
class="c01134"
|
||||
>
|
||||
<path
|
||||
d="M9 16.172l10.594-10.594 1.406 1.406-12 12-5.578-5.578 1.406-1.406z"
|
||||
></path>
|
||||
</svg></button
|
||||
><button
|
||||
class="prodigy-button-reject c01129 c01131"
|
||||
aria-label="reject (x)"
|
||||
title="reject (x)"
|
||||
>
|
||||
<svg
|
||||
aria-hidden="true"
|
||||
fill="currentColor"
|
||||
width="40"
|
||||
height="40"
|
||||
viewBox="0 0 24 24"
|
||||
class="c01134"
|
||||
>
|
||||
<path
|
||||
d="M18.984 6.422l-5.578 5.578 5.578 5.578-1.406 1.406-5.578-5.578-5.578 5.578-1.406-1.406 5.578-5.578-5.578-5.578 1.406-1.406 5.578 5.578 5.578-5.578z"
|
||||
></path>
|
||||
</svg></button
|
||||
><button
|
||||
class="prodigy-button-ignore c01129 c01132"
|
||||
aria-label="ignore (space)"
|
||||
title="ignore (space)"
|
||||
>
|
||||
<svg
|
||||
aria-hidden="true"
|
||||
fill="currentColor"
|
||||
width="40"
|
||||
height="40"
|
||||
viewBox="0 0 24 24"
|
||||
class="c01134"
|
||||
>
|
||||
<path
|
||||
d="M12 20.016c4.406 0 8.016-3.609 8.016-8.016 0-1.828-0.609-3.563-1.688-4.922l-11.25 11.25c1.359 1.078 3.094 1.688 4.922 1.688zM3.984 12c0 1.828 0.609 3.563 1.688 4.922l11.25-11.25c-1.359-1.078-3.094-1.688-4.922-1.688-4.406 0-8.016 3.609-8.016 8.016zM12 2.016c5.531 0 9.984 4.453 9.984 9.984s-4.453 9.984-9.984 9.984-9.984-4.453-9.984-9.984 4.453-9.984 9.984-9.984z"
|
||||
></path>
|
||||
</svg></button
|
||||
><button
|
||||
class="prodigy-button-undo c01129 c01133"
|
||||
aria-label="undo (backspace, del)"
|
||||
title="undo (backspace, del)"
|
||||
>
|
||||
<svg
|
||||
aria-hidden="true"
|
||||
fill="currentColor"
|
||||
width="40"
|
||||
height="40"
|
||||
viewBox="0 0 24 24"
|
||||
class="c01134"
|
||||
>
|
||||
<path
|
||||
d="M11.016 9l1.406 1.406-3.609 3.609h9.188v-10.031h2.016v12h-11.203l3.609 3.609-1.406 1.406-6-6z"
|
||||
></path>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</footer> -->
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
// import Vue from "vue";
|
||||
// import VueRecord from "@codekraft-studio/vue-record";
|
||||
import { mapState, mapActions } from "pinia";
|
||||
|
||||
import chatApi from "~/apis/chatApi";
|
||||
import selectTextMixin from "~/research/mixins/selectTextMixin";
|
||||
// import commentMixin from "~/mixins/commentMixin";
|
||||
|
||||
export default {
|
||||
mixins: [selectTextMixin],
|
||||
|
||||
beforeMount() {
|
||||
// this.initServices();
|
||||
},
|
||||
mounted() {
|
||||
// this.linksHandler();
|
||||
},
|
||||
watch: {
|
||||
$route: {
|
||||
handler: function (to) {},
|
||||
deep: true,
|
||||
// immediate: true,
|
||||
},
|
||||
},
|
||||
|
||||
computed: {
|
||||
...mapState([
|
||||
"getPanelStatus",
|
||||
"isSidebarCollapsed",
|
||||
"currentUser",
|
||||
"sidebarListStatusGetter",
|
||||
]),
|
||||
},
|
||||
methods: {
|
||||
...mapActions(["checkPermissions"]),
|
||||
},
|
||||
|
||||
};
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.c01150 {
|
||||
color: #fff;
|
||||
width: 100%;
|
||||
padding: 15px 20px;
|
||||
font-size: 20px;
|
||||
background: #583fcf;
|
||||
text-align: center;
|
||||
box-sizing: border-box;
|
||||
font-weight: bold;
|
||||
font-family: "Roboto Condensed", "Arial Narrow", sans-serif;
|
||||
text-transform: uppercase;
|
||||
border-top-left-radius: 0;
|
||||
border-top-right-radius: 0;
|
||||
}
|
||||
.c01151 {
|
||||
padding: 8px 20px;
|
||||
}
|
||||
.c01147 {
|
||||
display: flex;
|
||||
text-align: left;
|
||||
}
|
||||
.c01152 {
|
||||
top: 0;
|
||||
width: 100%;
|
||||
z-index: 100;
|
||||
position: sticky;
|
||||
}
|
||||
.c01153 {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.c01150 {
|
||||
color: #fff;
|
||||
font-size: 20px;
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
font-family: "Roboto Condensed", "Arial Narrow", sans-serif;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
.c01154 {
|
||||
margin: 5px 10px 5px 0;
|
||||
border: 1px solid;
|
||||
cursor: pointer;
|
||||
display: block;
|
||||
padding: 1px 10px;
|
||||
position: relative;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.c01148 {
|
||||
padding: 20px;
|
||||
line-height: 2;
|
||||
}
|
||||
.c01165 ::selection {
|
||||
background: #ffe184;
|
||||
}
|
||||
.c01186 {
|
||||
margin: 0 1px;
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
}
|
||||
.c01210 {
|
||||
color: #583fcf;
|
||||
font-size: 0.675em;
|
||||
font-weight: bold;
|
||||
font-family: "Roboto Condensed", "Arial Narrow", sans-serif;
|
||||
margin-left: 8px;
|
||||
text-transform: uppercase;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.c01174 {
|
||||
top: -7px;
|
||||
left: -7px;
|
||||
color: #fff;
|
||||
width: 14px;
|
||||
height: 14px;
|
||||
display: flex;
|
||||
opacity: 0;
|
||||
z-index: 10;
|
||||
position: absolute;
|
||||
font-size: 0.9em;
|
||||
background: #444;
|
||||
text-align: center;
|
||||
transition: opacity 0.1s ease;
|
||||
align-items: center;
|
||||
font-family: sans-serif;
|
||||
line-height: 1.1;
|
||||
user-select: none;
|
||||
border-radius: 50%;
|
||||
justify-content: center;
|
||||
}
|
||||
.c01172 {
|
||||
position: relative;
|
||||
}
|
||||
.c01173:hover .c01174 {
|
||||
opacity: 1;
|
||||
}
|
||||
.c01206 {
|
||||
color: inherit;
|
||||
margin: 0 0.15em;
|
||||
display: inline;
|
||||
padding: 0.25em 0.4em;
|
||||
background: #ffe184;
|
||||
font-weight: bold;
|
||||
line-height: 1;
|
||||
box-decoration-break: clone;
|
||||
}
|
||||
</style>
|
29
components/research/components/ProcessologyPage.vue
Normal file
29
components/research/components/ProcessologyPage.vue
Normal file
|
@ -0,0 +1,29 @@
|
|||
<template>
|
||||
<div>سسسس</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
import researchApi from "~/apis/researchApi";
|
||||
import { mapActions, mapState } from "pinia";
|
||||
import { useResearchStore } from "~/stores/researchStore";
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
httpService: undefined,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState(useResearchStore, ["researchSchemaGetter"]),
|
||||
},
|
||||
|
||||
beforeMount() {
|
||||
this.httpService = new HttpService(import.meta.env.VITE_BASE_URL);
|
||||
},
|
||||
|
||||
|
||||
|
||||
|
||||
};
|
||||
</script>
|
843
components/research/components/ResearchContent.vue
Normal file
843
components/research/components/ResearchContent.vue
Normal file
|
@ -0,0 +1,843 @@
|
|||
<template>
|
||||
<div class="">
|
||||
<div class="pt-1">
|
||||
<div class="search-items firefox-scrollbar">
|
||||
<div
|
||||
class="search-items__item"
|
||||
v-for="(item, i) in listAnswer"
|
||||
:key="i"
|
||||
>
|
||||
<div>
|
||||
<div class="search-items__header">
|
||||
<a class="search-items__label text__13 text__dark-gray">{{
|
||||
item._source.research_type
|
||||
}}</a>
|
||||
<a
|
||||
class="search-items__title text__15 text__blue"
|
||||
@click.prevent="showModalResearch(item, true)"
|
||||
@auxclick.prevent.stop="showModalResearch(item, true)"
|
||||
v-html="
|
||||
highlightKey(item, 'title', 'text_subject', 'text_user')
|
||||
"
|
||||
>
|
||||
</a>
|
||||
</div>
|
||||
<div>
|
||||
<span style="margin-left: 10px"
|
||||
>نشانی :
|
||||
<a
|
||||
class="search-items__title text__15 text__blue"
|
||||
@click.prevent="
|
||||
showtext(item._source, listAnswer, i, item._id)
|
||||
"
|
||||
@auxclick.prevent.stop="
|
||||
showtext(item._source, listAnswer, i, item._id)
|
||||
"
|
||||
>
|
||||
{{ item._source.address ?? "--" }}
|
||||
</a>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="text__15 text__dark-gray search-items__code">
|
||||
<span style="margin-left: 10px"
|
||||
>نوع برداشت : {{ item._source.take_type ?? "--" }}</span
|
||||
>
|
||||
<span style="margin-left: 10px"
|
||||
>فعل متن : {{ item._source.text_verb ?? "--" }}</span
|
||||
>
|
||||
|
||||
<span style="margin-left: 10px"
|
||||
>تاریخ : {{ datefa(item._source.date_create * 1000) }}</span
|
||||
>
|
||||
</div>
|
||||
<div class="search-items__content">
|
||||
<div
|
||||
class="text__15 line-clamp__2"
|
||||
v-html="highlightKey(item, 'text_main')"
|
||||
></div>
|
||||
|
||||
<div
|
||||
v-if="
|
||||
item._source?.subject?.length && $route.name == 'TermPage'
|
||||
"
|
||||
class="mt-2 text__15 text__dark-gray search-items__code"
|
||||
>
|
||||
<span style="margin-left: 10px">اصطلاحات :</span>
|
||||
|
||||
<ul>
|
||||
<li
|
||||
v-for="(sub, subIndex) in item._source.subject"
|
||||
:key="subIndex"
|
||||
>
|
||||
{{ sub.title }}
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="search-item__actions">
|
||||
<span class="tavasi tavasi-more-vert"></span>
|
||||
<!-- <button
|
||||
v-can="'search_summary'"
|
||||
@click.pevent="AddToFavorites(item, i)"
|
||||
title="علاقه مندی ها"
|
||||
class="btn show-detail-btn favorites"
|
||||
type="button"
|
||||
>
|
||||
<svg
|
||||
class="icon"
|
||||
:class="
|
||||
item._source.tbookmark == 1
|
||||
? 'icon-bookmark-1'
|
||||
: 'icon-bookmark-4'
|
||||
"
|
||||
>
|
||||
<use
|
||||
:xlink:href="
|
||||
item._source.tbookmark == 1
|
||||
? '#icon-bookmark-1'
|
||||
: '#icon-bookmark-4'
|
||||
"
|
||||
></use>
|
||||
</svg>
|
||||
</button> -->
|
||||
<!-- <button
|
||||
v-can="'search_analyze'"
|
||||
@click="showDetails(item)"
|
||||
title="نمایش جزییات"
|
||||
class="btn show-detail-btn"
|
||||
type="button"
|
||||
>
|
||||
<span class="tavasi tavasi-eye"></span>
|
||||
</button> -->
|
||||
<!-- v-can="$route.name + '_subject'" برای موضوع زنی -->
|
||||
<button
|
||||
@click="SubjectFormHandler(item)"
|
||||
title="موضوع زنی"
|
||||
class="btn show-detail-btn px-1"
|
||||
type="button"
|
||||
>
|
||||
<span class="tavasi tavasi-doc-outline"></span>
|
||||
</button>
|
||||
<button
|
||||
v-can="'search_summary'"
|
||||
@click="showModalResearch(item, false)"
|
||||
title="ویرایش"
|
||||
class="btn show-detail-btn -rotate-180"
|
||||
type="button"
|
||||
>
|
||||
<svg style="color: #adbec4" class="icon icon-Component-242--1">
|
||||
<use xlink:href="#icon-Component-242--1"></use>
|
||||
</svg>
|
||||
</button>
|
||||
<button
|
||||
v-can="'search_summary'"
|
||||
@click="deleteResearch(item)"
|
||||
title="حذف"
|
||||
class="btn show-detail-btn -rotate-180"
|
||||
type="button"
|
||||
>
|
||||
<svg style="color: #adbec4" class="icon icon-Component-295--1">
|
||||
<use xlink:href="#icon-Component-295--1"></use>
|
||||
</svg>
|
||||
</button>
|
||||
<button-component
|
||||
:title="copyButtonTitleMaker(item._source)"
|
||||
buttonText=""
|
||||
class="btn show-detail-btn px-1"
|
||||
@click="
|
||||
copyToClipboard(
|
||||
'',
|
||||
urlResolver(item._source, item, 'entityResearch')
|
||||
)
|
||||
"
|
||||
>
|
||||
<svg class="icon icon-copy2 fz-8">
|
||||
<use xlink:href="#icon-copy2"></use>
|
||||
</svg>
|
||||
</button-component>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<jahat-pagination
|
||||
class="pagination"
|
||||
style="font-size: 13px"
|
||||
v-if="page.total"
|
||||
:paginationInfo="page"
|
||||
@page-changed="pageChanged"
|
||||
@page-limit-changed="pageLimitChanged"
|
||||
@sort-changed="sortChanged"
|
||||
>
|
||||
</jahat-pagination>
|
||||
</div>
|
||||
|
||||
<base-modal
|
||||
v-if="openSubjectForm"
|
||||
modalSize="modal-lg"
|
||||
:modalTitle="modalTitle"
|
||||
:hasFooter="false"
|
||||
@close="hideSubjectForm"
|
||||
>
|
||||
<component :is="slotComponentName"></component>
|
||||
</base-modal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import favoriteApi from "~/apis/favoriteApi";
|
||||
import researchApi from "~/apis/researchApi";
|
||||
|
||||
import { mapState, mapActions } from "pinia";
|
||||
import { useResearchStore } from "~/stores/researchStore";
|
||||
|
||||
export default {
|
||||
props: {
|
||||
summeryKeys: {
|
||||
default() {
|
||||
return {};
|
||||
},
|
||||
},
|
||||
listAnswer: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
},
|
||||
pagination: {
|
||||
default() {
|
||||
return {};
|
||||
},
|
||||
},
|
||||
listSelectedPoint: {
|
||||
default() {
|
||||
return [];
|
||||
},
|
||||
},
|
||||
},
|
||||
beforeMount() {
|
||||
this.httpService = new HttpService(import.meta.env.VITE_REPO_BASE_URL);
|
||||
},
|
||||
mounted() {
|
||||
window.scrollTo(0, 0);
|
||||
if (this.$route.query.q) this.searchText = this.$route.query.q;
|
||||
if (this.myActiveSchema) {
|
||||
this.researchActiveSchemaSetter(this.myActiveSchema);
|
||||
}
|
||||
|
||||
// if (this.listAnswer.length>=0) {
|
||||
// console.log(this.selectedlists)
|
||||
|
||||
// this.listAnswer=this.selectedlists
|
||||
// }
|
||||
},
|
||||
watch: {
|
||||
// selectedlists(newVal) {
|
||||
// if (this.listAnswer.length>=0) {
|
||||
|
||||
// console.log(this.selectedlists)
|
||||
|
||||
// this.listAnswer=this.selectedlists
|
||||
// }
|
||||
// },
|
||||
pagination(newVal) {
|
||||
this.page = newVal;
|
||||
},
|
||||
listSelectedPoint(newVal) {
|
||||
this.listAnswer = newVal;
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
openSubjectForm: false,
|
||||
slotComponentName: "",
|
||||
modalTitle: "",
|
||||
showModal: false,
|
||||
listId: undefined,
|
||||
projectId: undefined,
|
||||
selectedItem: undefined,
|
||||
page: this.pagination,
|
||||
// listAnswer: [],
|
||||
totalCount: 0,
|
||||
typeCount: "",
|
||||
countInPage: 0,
|
||||
maxPage: 0,
|
||||
currentPage: 1,
|
||||
beginPage: 1,
|
||||
endPage: 1,
|
||||
listPage: [],
|
||||
textSearch: "",
|
||||
iscode: true,
|
||||
maxLength: 250,
|
||||
httpService: undefined,
|
||||
navigationOptions: [],
|
||||
sorting: {
|
||||
sortby: "created",
|
||||
sortorder: undefined, // asc | desc | none
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState(["userPermisionGetter", "currentUser", "selectedlists"]),
|
||||
...mapState(useResearchStore, ["researchSchemaGetter"]),
|
||||
...mapState(useSearchStore, ["searchActiveTabGetter"]),
|
||||
|
||||
showActionMenu() {
|
||||
let show = false;
|
||||
if (this.userPermisionGetter?.length)
|
||||
["search_analyze", "search_summary"].forEach(
|
||||
(item) =>
|
||||
(show =
|
||||
this.currentUser.user_level > 1 ||
|
||||
this.userPermisionGetter.includes(item))
|
||||
);
|
||||
|
||||
return show;
|
||||
},
|
||||
|
||||
myActiveSchema() {
|
||||
return this.researchSchemaGetter?.find((item) => {
|
||||
return item.key == "research";
|
||||
});
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
...mapActions("list", ["SET_SELECTED_ITEM", "SET_LIST"]),
|
||||
...mapActions(useResearchStore, ["researchActiveSchemaSetter"]),
|
||||
...mapActions("entity", ["SET_ITEM_ENTITY", "SET_LIST_ENTITY"]),
|
||||
showModalResearch(item, isReadonly) {
|
||||
let schema = this.myActiveSchema.contextMenu.find(
|
||||
(itemKey) => itemKey.key === item._source?.research_key
|
||||
);
|
||||
|
||||
this.$emit("researchModalHandler", {
|
||||
action: "edit",
|
||||
itemEdit: item,
|
||||
itemSchema: schema,
|
||||
isReadonly: isReadonly,
|
||||
});
|
||||
},
|
||||
deleteResearch(item) {
|
||||
mySwalConfirm({
|
||||
title: "هشدار!!!",
|
||||
html: `از حذف <b>${item._source.text_subject}</b> اطمینان دارید؟ `,
|
||||
icon: "warning",
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed) {
|
||||
let url = researchApi.research.deleteItem;
|
||||
url = url.replace("{{index_key}}", item._source.ref_key);
|
||||
url = url.replace("{{id}}", item._id);
|
||||
this.httpService.postRequest(url).then((res) => {
|
||||
mySwalToast({
|
||||
html: res.message,
|
||||
});
|
||||
setTimeout(() => {
|
||||
this.$emit("updateForDeleteResearch");
|
||||
}, 500);
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
SubjectFormHandler(item) {
|
||||
this.openModalFilter("SubjectForm", "موضوع زنی");
|
||||
let cloneItem = structuredClone(item);
|
||||
cloneItem = { ...item._source, _id: item._id };
|
||||
|
||||
this.SET_SELECTED_ITEM(cloneItem);
|
||||
},
|
||||
openModalFilter(componentName, title) {
|
||||
this.openSubjectForm = true;
|
||||
this.slotComponentName = componentName;
|
||||
this.modalTitle = title;
|
||||
setTimeout(() => {
|
||||
$("#meta-item-modal").modal(
|
||||
{ backdrop: "static", keyboard: false },
|
||||
"show"
|
||||
);
|
||||
}, 500);
|
||||
},
|
||||
hideSubjectForm() {
|
||||
$("#base-modal").modal({
|
||||
show: false,
|
||||
});
|
||||
|
||||
setTimeout(() => {
|
||||
this.openSubjectForm = false;
|
||||
}, 200);
|
||||
},
|
||||
copyButtonTitleMaker(item) {
|
||||
return `کپی لینک: link:\n${location.origin + this.urlResolver(item)}`;
|
||||
},
|
||||
// //This function adds a new favorite to the user's favorites
|
||||
// AddToFavorites(item, index) {
|
||||
// if (item._source.tbookmark == 0) {
|
||||
// let url = favoriteApi.favorite.add;
|
||||
// url = url.replace("{{data_type}}", "bookmark");
|
||||
// url = url.replace("{{ref_key}}", this.researchSchemaGetter[0].key);
|
||||
// const formData = {
|
||||
// ref_id: item._id,
|
||||
// title: item._source.title,
|
||||
// };
|
||||
// this.httpService.postRequest(url, formData).then((res) => {
|
||||
// console.log(res);
|
||||
// // this.UpdateList();
|
||||
// //refresh After removing or adding favorites
|
||||
// //this.$emit("UpdateList", item.tbookmark);
|
||||
// this.updateListAnswer(index, "tbookmark", 1);
|
||||
// });
|
||||
// } else {
|
||||
// let url = favoriteApi.favorite.delete;
|
||||
// url = url.replace("{{data_type}}", "bookmark");
|
||||
// url = url.replace("{{id}}", item._id);
|
||||
|
||||
// const formData = {
|
||||
// ref_id: item._id,
|
||||
// title: item._source.title,
|
||||
// };
|
||||
// this.httpService.postRequest(url, formData).then((res) => {
|
||||
// console.log(res);
|
||||
|
||||
// //refresh After removing or adding favorites
|
||||
// //this.$emit("UpdateList", item.tbookmark);
|
||||
// this.updateListAnswer(index, "tbookmark", 0);
|
||||
// });
|
||||
// }
|
||||
// },
|
||||
|
||||
updateListAnswer(index, key, value) {
|
||||
if (index in this.listAnswer) {
|
||||
if (key in this.listAnswer[index]["_source"])
|
||||
this.listAnswer[index]["_source"][key] = value;
|
||||
}
|
||||
},
|
||||
|
||||
datefa(item) {
|
||||
var m = item;
|
||||
var d = new Date(m).toLocaleDateString("fa-IR");
|
||||
return d;
|
||||
},
|
||||
countAudio(item) {
|
||||
return item._source.voices;
|
||||
},
|
||||
showDetails(selectedItem) {
|
||||
this.selectedItem = selectedItem;
|
||||
this.openModal();
|
||||
},
|
||||
closeModal() {
|
||||
$("#subject-modal")?.modal("hide");
|
||||
|
||||
setTimeout(() => {
|
||||
this.showModal = false;
|
||||
}, 500);
|
||||
},
|
||||
openModal() {
|
||||
this.showModal = true;
|
||||
|
||||
setTimeout(() => {
|
||||
$("#subject-modal")?.modal(
|
||||
{ backdrop: "static", keyboard: false },
|
||||
"show"
|
||||
);
|
||||
}, 500);
|
||||
},
|
||||
|
||||
highlightKey(item, key1, key2 = "", key3 = "") {
|
||||
var text = "";
|
||||
if (item.highlight) {
|
||||
if (item.highlight[key1]) text = item.highlight[key1].join("... ");
|
||||
else if (key2 && item.highlight[key2])
|
||||
text = item.highlight[key2].join("... ");
|
||||
else if (key3 && item.highlight[key3])
|
||||
text = item.highlight[key3].join("... ");
|
||||
}
|
||||
|
||||
if (text == "") {
|
||||
if (item._source[key1]) text = item._source[key1];
|
||||
else if (key2 && item._source[key2]) text = item._source[key2];
|
||||
else if (key3 && item._source[key3]) text = item._source[key3];
|
||||
|
||||
if (text.length > 500) text = text.substring(0, 500);
|
||||
}
|
||||
return text;
|
||||
},
|
||||
|
||||
/*
|
||||
اگر تب انتخاب شده همه باشد،کلید ها content خواهد بود.
|
||||
اگر تب انتخاب شده فهرست باشد،کلید ها mindex & mintro خواهد بود.
|
||||
|
||||
*/
|
||||
|
||||
// urlResolver(_id) {
|
||||
// if (this.researchSchemaGetter) {
|
||||
// const routeData = this.$router.resolve({
|
||||
// name: "navigationView",
|
||||
// params: {
|
||||
// id: _id,
|
||||
// key: this.researchSchemaGetter[0].key,
|
||||
// },
|
||||
// query: {},
|
||||
// });
|
||||
// return routeData.href;
|
||||
// }
|
||||
// },
|
||||
urlResolver(_source, item, _name = "research") {
|
||||
const routeData = this.$router.resolve({
|
||||
name: _name,
|
||||
params: {
|
||||
id: _source.ref_id,
|
||||
key: "sanad",
|
||||
},
|
||||
query: {
|
||||
research_id: item?._id ?? undefined,
|
||||
research_type: _source?.research_type ?? undefined,
|
||||
},
|
||||
});
|
||||
|
||||
return routeData.href;
|
||||
},
|
||||
showMultiText(id, _listkey) {
|
||||
let _name = "navigation";
|
||||
const routeData = this.$router.resolve({
|
||||
name: _name,
|
||||
params: {
|
||||
id: id,
|
||||
key: this.researchSchemaGetter[0].key,
|
||||
},
|
||||
|
||||
query: {
|
||||
searchtext: this.textSearch ?? undefined,
|
||||
listkey: _listkey,
|
||||
},
|
||||
});
|
||||
|
||||
window.open(routeData.href, "_blank");
|
||||
},
|
||||
|
||||
showtext(item, listAnswer, i, _id) {
|
||||
let cloneList = structuredClone(listAnswer);
|
||||
cloneList.forEach((item, index) => {
|
||||
cloneList[index] = { ...item, ...item._source };
|
||||
});
|
||||
|
||||
let cloneItem = structuredClone(item);
|
||||
cloneItem = { ...item, _id: _id };
|
||||
|
||||
// this.SET_ITEM_ENTITY(cloneItem);
|
||||
// this.SET_LIST_ENTITY(cloneList);
|
||||
// localStorage.setItem("myList", JSON.stringify(cloneList));
|
||||
// localStorage.setItem("myItem", JSON.stringify(cloneItem));
|
||||
|
||||
const domainName = buildName() + "";
|
||||
let _name = "entityResearch";
|
||||
|
||||
const routeData = this.$router.resolve({
|
||||
name: _name,
|
||||
params: {
|
||||
id: cloneItem.ref_id,
|
||||
// key: cloneItem.ref_key,
|
||||
key: "sanad",
|
||||
},
|
||||
|
||||
query: {
|
||||
research_id: cloneItem._id ?? undefined,
|
||||
research_type: cloneItem.research_type ?? undefined,
|
||||
},
|
||||
});
|
||||
|
||||
window.open(routeData.href, "_blank");
|
||||
},
|
||||
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.page.limit);
|
||||
const pagination = {
|
||||
total: total,
|
||||
pages: pages == 0 ? 1 : pages,
|
||||
};
|
||||
|
||||
this.page = { ...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);
|
||||
}
|
||||
|
||||
setTimeout(() => {
|
||||
this.scrollToTop();
|
||||
}, 700);
|
||||
},
|
||||
nextPage: function (item) {
|
||||
if (item > 0) this.setPage(this.currentPage + 1);
|
||||
else this.setPage(this.currentPage - 1);
|
||||
},
|
||||
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);
|
||||
},
|
||||
changeCurrent: function (i) {
|
||||
this.$emit("changeCurrent", this.listAnswer[i]);
|
||||
},
|
||||
setTextSearch(item, countInPage) {
|
||||
this.textSearch = item;
|
||||
this.countInPage = countInPage;
|
||||
// console.log(this.textSearch);
|
||||
},
|
||||
scrollToTop() {
|
||||
window.scrollTo(0, 0);
|
||||
},
|
||||
|
||||
//mehdi
|
||||
pageLimitChanged(paging) {
|
||||
this.resetPagination();
|
||||
this.page.limit = paging.limit;
|
||||
|
||||
this.$emit("changePage", this.page);
|
||||
},
|
||||
pageChanged(paging) {
|
||||
let page = paging.pageNumber;
|
||||
page -= 1;
|
||||
this.page.offset = page * paging.limit;
|
||||
this.page.limit = paging.limit;
|
||||
this.page.page = paging.pageNumber;
|
||||
|
||||
this.$emit("changePage", this.page);
|
||||
},
|
||||
sortChanged(sorting) {
|
||||
this.page.page = this.page.offset = 0;
|
||||
this.sorting = sorting;
|
||||
|
||||
this.$emit("changePage", this.sorting);
|
||||
},
|
||||
resetPagination() {
|
||||
this.page = {
|
||||
pages: 0,
|
||||
total: 0,
|
||||
page: 1,
|
||||
offset: 0,
|
||||
limit: 10,
|
||||
};
|
||||
},
|
||||
setListAnswer() {},
|
||||
// getListSpecial(_entityType, _specialType) {
|
||||
|
||||
// if (this.fetchingData) return;
|
||||
// this.fetchingData = true;
|
||||
|
||||
// this.entity_type = _entityType;
|
||||
|
||||
// let url = searchApi.Farhanghestan.search_normal;
|
||||
|
||||
// url = url + `/${this.pagination.offset}/${this.pagination.limit}/`;
|
||||
|
||||
// this.httpService.getRequest(url).then((res) => {
|
||||
|
||||
// this.listEntity = 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 };
|
||||
|
||||
// this.fetchingData = false;
|
||||
// });
|
||||
// },
|
||||
|
||||
getList(_entityType) {
|
||||
if (this.fetchingData) return;
|
||||
this.fetchingData = true;
|
||||
|
||||
this.entity_type = _entityType;
|
||||
|
||||
let url =
|
||||
searchApi.Farhanghestan.search_normal +
|
||||
`/${this.page.offset}/${this.page.limit}`;
|
||||
|
||||
this.httpService.getRequest(url).then((res) => {
|
||||
this.listEntity = res.hits.hits;
|
||||
|
||||
const total = res.hits.total.value;
|
||||
const pages = Math.ceil(total / this.page.limit);
|
||||
const pagination = {
|
||||
total: total,
|
||||
pages: pages == 0 ? 1 : pages,
|
||||
};
|
||||
|
||||
this.page = { ...this.pagination, ...pagination };
|
||||
|
||||
this.fetchingData = false;
|
||||
});
|
||||
},
|
||||
},
|
||||
|
||||
};
|
||||
</script>
|
||||
|
||||
<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);
|
||||
}
|
||||
|
||||
.tavasi,
|
||||
.icon-copy2 {
|
||||
color: #adbec4;
|
||||
}
|
||||
.icon-copy2 {
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
&.favorites {
|
||||
color: calc(--primary-color);
|
||||
.icon-bookmark-1,
|
||||
.icon-bookmark-4 {
|
||||
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>
|
749
components/research/components/ResearchContentForTerm.vue
Normal file
749
components/research/components/ResearchContentForTerm.vue
Normal file
|
@ -0,0 +1,749 @@
|
|||
<template>
|
||||
<div class="">
|
||||
<div class="" v-if="listAnswer?.length">
|
||||
<div class="search-items firefox-scrollbar">
|
||||
<div
|
||||
class="search-items__item"
|
||||
v-for="(item, i) in listAnswer"
|
||||
:key="i"
|
||||
>
|
||||
<div>
|
||||
<div class="search-items__header">
|
||||
<span class="search-items__label text__13 text__dark-gray">
|
||||
نشانی
|
||||
</span>
|
||||
|
||||
<a
|
||||
@click.prevent="goToDocumentPage(item)"
|
||||
:href="urlResolver(item._source)"
|
||||
class="search-items__title text__15 text__blue"
|
||||
v-html="highlightKey(item, 'address')"
|
||||
>
|
||||
</a>
|
||||
</div>
|
||||
<div class="text__15 text__dark-gray search-items__code">
|
||||
<span v-if="item._source.take_type" style="margin-left: 10px"
|
||||
>نوع برداشت : {{ item._source.take_type }}</span
|
||||
>
|
||||
<span v-if="item._source.text_verb" style="margin-left: 10px"
|
||||
>فعل متن : {{ item._source.text_verb }}</span
|
||||
>
|
||||
|
||||
<!-- <span style="margin-left: 10px"
|
||||
>تاریخ ایجاد : {{ datefa(item._source.date_edit * 1000) }}</span
|
||||
> -->
|
||||
<span style="margin-left: 10px"
|
||||
>تاریخ ایجاد : {{ item._source.date_edit }}</span
|
||||
>
|
||||
<span
|
||||
v-if="item._source.text_position?.length"
|
||||
style="margin-left: 10px"
|
||||
>خط : {{ lineExtractor(item._source.text_position) }}</span
|
||||
>
|
||||
</div>
|
||||
<div class="search-items__content">
|
||||
<div
|
||||
class="text__15 line-clamp__2"
|
||||
v-html="highlightKey(item, 'text_main')"
|
||||
></div>
|
||||
|
||||
<div
|
||||
v-if="item._source?.subject?.length"
|
||||
class="mt-2 text__15 text__dark-gray search-items__code"
|
||||
>
|
||||
<span style="margin-left: 10px">اصطلاحات :</span>
|
||||
|
||||
<ul>
|
||||
<li
|
||||
v-for="(sub, subIndex) in item._source.subject"
|
||||
:key="subIndex"
|
||||
>
|
||||
{{ sub.title }}
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="search-item__actions">
|
||||
<span class="tavasi tavasi-more-vert"></span>
|
||||
<!-- <button
|
||||
v-can="'search_summary'"
|
||||
@click.pevent="AddToFavorites(item, i)"
|
||||
title="علاقه مندی ها"
|
||||
class="btn show-detail-btn favorites"
|
||||
type="button"
|
||||
>
|
||||
<svg
|
||||
class="icon"
|
||||
:class="
|
||||
item._source.tbookmark == 1
|
||||
? 'icon-bookmark-1'
|
||||
: 'icon-bookmark-4'
|
||||
"
|
||||
>
|
||||
<use
|
||||
:xlink:href="
|
||||
item._source.tbookmark == 1
|
||||
? '#icon-bookmark-1'
|
||||
: '#icon-bookmark-4'
|
||||
"
|
||||
></use>
|
||||
</svg>
|
||||
</button> -->
|
||||
<!-- <button
|
||||
v-can="'search_analyze'"
|
||||
@click="showDetails(item)"
|
||||
title="نمایش جزییات"
|
||||
class="btn show-detail-btn"
|
||||
type="button"
|
||||
>
|
||||
<span class="tavasi tavasi-eye"></span>
|
||||
</button> -->
|
||||
<!-- v-can="$route.name + '_subject'" برای موضوع زنی -->
|
||||
<button
|
||||
@click="openModalFilter(item,'SubjectForm', 'فیلتر ها')"
|
||||
title="موضوع زنی"
|
||||
class="btn show-detail-btn px-1"
|
||||
type="button"
|
||||
>
|
||||
<span class="tavasi tavasi-doc-outline"></span>
|
||||
</button>
|
||||
<!-- <button
|
||||
v-can="'search_summary'"
|
||||
@click="changeCurrent(i)"
|
||||
title="مشخصات"
|
||||
class="btn show-detail-btn -rotate-180"
|
||||
type="button"
|
||||
>
|
||||
<span class="tavasi tavasi-Component-71--1"></span>
|
||||
</button> -->
|
||||
<button-component
|
||||
:title="copyButtonTitleMaker(item._id)"
|
||||
buttonText=""
|
||||
class="btn show-detail-btn px-1"
|
||||
@click="copyToClipboard('', urlResolver(item._source))"
|
||||
>
|
||||
<svg class="icon icon-copy2 fz-8">
|
||||
<use xlink:href="#icon-copy2"></use>
|
||||
</svg>
|
||||
</button-component>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<jahat-pagination
|
||||
class="pagination"
|
||||
style="font-size: 13px"
|
||||
v-if="page.total"
|
||||
:paginationInfo="page"
|
||||
@page-changed="pageChanged"
|
||||
@page-limit-changed="pageLimitChanged"
|
||||
@sort-changed="sortChanged"
|
||||
>
|
||||
</jahat-pagination>
|
||||
</div>
|
||||
<no-data v-else></no-data>
|
||||
|
||||
<!-- <SubjectModal
|
||||
v-if="showModal"
|
||||
:selectedItem="selectedItem"
|
||||
@close-modal="closeModal"
|
||||
>
|
||||
</SubjectModal> -->
|
||||
<base-modal
|
||||
v-if="openSubjectForm"
|
||||
modalSize="modal-lg"
|
||||
:modalTitle="modalTitle"
|
||||
:hasFooter="false"
|
||||
@close="hideSubjectForm"
|
||||
>
|
||||
<component :metaItems="selectedItem?._source?.subject" :is="slotComponentName"></component>
|
||||
</base-modal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import favoriteApi from "~/apis/favoriteApi";
|
||||
|
||||
import { mapState, mapActions } from "pinia";
|
||||
import { useResearchStore } from "~/stores/researchStore";
|
||||
|
||||
export default {
|
||||
props: [
|
||||
"summeryKeys",
|
||||
"pagination",
|
||||
"listSelectedPoint",
|
||||
"listAnswerForTerm",
|
||||
],
|
||||
|
||||
data() {
|
||||
return {
|
||||
openSubjectForm: false,
|
||||
slotComponentName: "",
|
||||
modalTitle: "",
|
||||
showModal: false,
|
||||
// listId: undefined,
|
||||
// projectId: undefined,
|
||||
selectedItem: undefined,
|
||||
page: this.pagination,
|
||||
listAnswer: [],
|
||||
totalCount: 0,
|
||||
typeCount: "",
|
||||
countInPage: 0,
|
||||
maxPage: 0,
|
||||
currentPage: 1,
|
||||
beginPage: 1,
|
||||
endPage: 1,
|
||||
listPage: [],
|
||||
textSearch: "",
|
||||
// iscode: true,
|
||||
// maxLength: 250,
|
||||
httpService: undefined,
|
||||
// navigationOptions: [],
|
||||
sorting: {
|
||||
sortby: "created",
|
||||
sortorder: undefined, // asc | desc | none
|
||||
},
|
||||
};
|
||||
},
|
||||
beforeMount() {
|
||||
this.httpService = new HttpService(import.meta.env.VITE_REPO_BASE_URL);
|
||||
},
|
||||
|
||||
computed: {
|
||||
...mapState(["userPermisionGetter", "currentUser", "selectedlists"]),
|
||||
...mapState(useResearchStore, ["researchSchemaGetter"]),
|
||||
|
||||
// showActionMenu() {
|
||||
// let show = false;
|
||||
// if (this.userPermisionGetter?.length)
|
||||
// ["search_analyze", "search_summary"].forEach(
|
||||
// (item) =>
|
||||
// (show =
|
||||
// this.currentUser.user_level > 1 ||
|
||||
// this.userPermisionGetter.includes(item))
|
||||
// );
|
||||
|
||||
// return show;
|
||||
// },
|
||||
},
|
||||
watch: {
|
||||
listAnswerForTerm(newVal) {
|
||||
this.listAnswer = newVal;
|
||||
},
|
||||
pagination(newVal) {
|
||||
this.page = newVal;
|
||||
},
|
||||
listSelectedPoint(newVal) {
|
||||
this.listAnswer = newVal;
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
window.scrollTo(0, 0);
|
||||
if (this.$route.query.q) this.searchText = this.$route.query.q;
|
||||
|
||||
this.listAnswer = this.listAnswerForTerm;
|
||||
},
|
||||
|
||||
methods: {
|
||||
...mapActions("list", ["SET_SELECTED_ITEM", "SET_LIST"]),
|
||||
...mapActions("entity", ["SET_ITEM_ENTITY", "SET_LIST_ENTITY"]),
|
||||
goToDocumentPage({ _source }) {
|
||||
window.open(this.urlResolver(_source), "_blank");
|
||||
},
|
||||
|
||||
lineExtractor(text_position) {
|
||||
let items = text_position.split(",");
|
||||
let from = items[0].split(":")[1];
|
||||
let to = items[2].split(":")[1];
|
||||
return `${from} تا ${to}`;
|
||||
},
|
||||
openModalFilter(selectedItem,componentName, title) {
|
||||
this.openSubjectForm = true;
|
||||
this.slotComponentName = componentName;
|
||||
this.modalTitle = title;
|
||||
this.selectedItem = selectedItem;
|
||||
this.SET_SELECTED_ITEM(selectedItem)
|
||||
|
||||
this.openModal();
|
||||
// setTimeout(() => {
|
||||
// $("#meta-item-modal").modal(
|
||||
// { backdrop: "static", keyboard: false },
|
||||
// "show"
|
||||
// );
|
||||
// }, 500);
|
||||
},
|
||||
hideSubjectForm() {
|
||||
$("#base-modal").modal({
|
||||
show: false,
|
||||
});
|
||||
|
||||
setTimeout(() => {
|
||||
this.openSubjectForm = false;
|
||||
}, 200);
|
||||
},
|
||||
copyButtonTitleMaker(id) {
|
||||
return `کپی لینک: link:\n${location.origin + this.urlResolver(id)}`;
|
||||
},
|
||||
// //This function adds a new favorite to the user's favorites
|
||||
// AddToFavorites(item, index) {
|
||||
// if (item._source.tbookmark == 0) {
|
||||
// let url = favoriteApi.favorite.add;
|
||||
// url = url.replace("{{data_type}}", "bookmark");
|
||||
// url = url.replace("{{ref_key}}", this.researchSchemaGetter[0].key);
|
||||
// const formData = {
|
||||
// ref_id: item._id,
|
||||
// title: item._source.title,
|
||||
// };
|
||||
// this.httpService.postRequest(url, formData).then((res) => {
|
||||
// console.log(res);
|
||||
// // this.UpdateList();
|
||||
// //refresh After removing or adding favorites
|
||||
// //this.$emit("UpdateList", item.tbookmark);
|
||||
// this.updateListAnswer(index, "tbookmark", 1);
|
||||
// });
|
||||
// } else {
|
||||
// let url = favoriteApi.favorite.delete;
|
||||
// url = url.replace("{{data_type}}", "bookmark");
|
||||
// url = url.replace("{{id}}", item._id);
|
||||
|
||||
// const formData = {
|
||||
// ref_id: item._id,
|
||||
// title: item._source.title,
|
||||
// };
|
||||
// this.httpService.postRequest(url, formData).then((res) => {
|
||||
// console.log(res);
|
||||
|
||||
// //refresh After removing or adding favorites
|
||||
// //this.$emit("UpdateList", item.tbookmark);
|
||||
// this.updateListAnswer(index, "tbookmark", 0);
|
||||
// });
|
||||
// }
|
||||
// },
|
||||
|
||||
updateListAnswer(index, key, value) {
|
||||
if (index in this.listAnswer) {
|
||||
if (key in this.listAnswer[index]["_source"])
|
||||
this.listAnswer[index]["_source"][key] = value;
|
||||
}
|
||||
},
|
||||
|
||||
datefa(item) {
|
||||
var m = item;
|
||||
var d = new Date(m).toLocaleDateString("fa-IR");
|
||||
return d;
|
||||
},
|
||||
countAudio(item) {
|
||||
return item._source.voices;
|
||||
},
|
||||
showDetails(selectedItem) {
|
||||
this.selectedItem = selectedItem;
|
||||
this.openModal();
|
||||
},
|
||||
closeModal() {
|
||||
$("#subject-modal")?.modal("hide");
|
||||
|
||||
setTimeout(() => {
|
||||
this.showModal = false;
|
||||
}, 500);
|
||||
},
|
||||
openModal() {
|
||||
this.showModal = true;
|
||||
|
||||
setTimeout(() => {
|
||||
$("#subject-modal")?.modal(
|
||||
{ backdrop: "static", keyboard: false },
|
||||
"show"
|
||||
);
|
||||
}, 500);
|
||||
},
|
||||
|
||||
highlightKey(item, key1, key2 = "", key3 = "") {
|
||||
var text = "";
|
||||
if (item.highlight) {
|
||||
if (item.highlight[key1]) text = item.highlight[key1].join("... ");
|
||||
else if (key2 && item.highlight[key2])
|
||||
text = item.highlight[key2].join("... ");
|
||||
else if (key3 && item.highlight[key3])
|
||||
text = item.highlight[key3].join("... ");
|
||||
}
|
||||
|
||||
if (text == "") {
|
||||
if (item._source[key1]) text = item._source[key1];
|
||||
else if (key2 && item._source[key2]) text = item._source[key2];
|
||||
else if (key3 && item._source[key3]) text = item._source[key3];
|
||||
|
||||
if (text.length > 500) text = text.substring(0, 500);
|
||||
}
|
||||
return text;
|
||||
},
|
||||
|
||||
/*
|
||||
اگر تب انتخاب شده همه باشد،کلید ها content خواهد بود.
|
||||
اگر تب انتخاب شده فهرست باشد،کلید ها mindex & mintro خواهد بود.
|
||||
|
||||
*/
|
||||
|
||||
urlResolver(_source) {
|
||||
// const routeData = this.$router.resolve({
|
||||
// name: "navigationView",
|
||||
// params: {
|
||||
// id: _id,
|
||||
// key: this.researchSchemaGetter[0].key,
|
||||
// },
|
||||
// query: {},
|
||||
// });
|
||||
|
||||
const routeData = this.$router.resolve({
|
||||
name: "navigation",
|
||||
params: {
|
||||
id: _source.ref_id,
|
||||
key: _source.ref_key,
|
||||
},
|
||||
});
|
||||
|
||||
return routeData.href;
|
||||
},
|
||||
showMultiText(id, _listkey) {
|
||||
let _name = "navigation";
|
||||
const routeData = this.$router.resolve({
|
||||
name: _name,
|
||||
params: {
|
||||
id: id,
|
||||
key: this.researchSchemaGetter[0].key,
|
||||
},
|
||||
|
||||
query: {
|
||||
searchtext: this.textSearch ?? undefined,
|
||||
listkey: _listkey,
|
||||
},
|
||||
});
|
||||
|
||||
window.open(routeData.href, "_blank");
|
||||
},
|
||||
|
||||
showtext(item, listAnswer, i, _id) {
|
||||
let cloneList = structuredClone(listAnswer);
|
||||
cloneList.forEach((item, index) => {
|
||||
cloneList[index] = { ...item, ...item._source };
|
||||
});
|
||||
|
||||
let cloneItem = structuredClone(item);
|
||||
cloneItem = { ...item, _id: _id };
|
||||
|
||||
this.SET_ITEM_ENTITY(cloneItem);
|
||||
this.SET_LIST_ENTITY(cloneList);
|
||||
localStorage.setItem("myList", JSON.stringify(cloneList));
|
||||
localStorage.setItem("myItem", JSON.stringify(cloneItem));
|
||||
|
||||
const domainName = buildName() + "";
|
||||
let _name = "navigation";
|
||||
|
||||
const routeData = this.$router.resolve({
|
||||
name: _name,
|
||||
params: {
|
||||
id: cloneItem._id,
|
||||
key: this.researchSchemaGetter[0].key,
|
||||
},
|
||||
|
||||
query: {
|
||||
searchtext: this.textSearch ?? undefined,
|
||||
},
|
||||
});
|
||||
|
||||
window.open(routeData.href, "_blank");
|
||||
},
|
||||
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.page.limit);
|
||||
const pagination = {
|
||||
total: total,
|
||||
pages: pages == 0 ? 1 : pages,
|
||||
};
|
||||
|
||||
this.page = { ...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);
|
||||
}
|
||||
|
||||
setTimeout(() => {
|
||||
this.scrollToTop();
|
||||
}, 700);
|
||||
},
|
||||
nextPage: function (item) {
|
||||
if (item > 0) this.setPage(this.currentPage + 1);
|
||||
else this.setPage(this.currentPage - 1);
|
||||
},
|
||||
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);
|
||||
},
|
||||
changeCurrent: function (i) {
|
||||
this.$emit("changeCurrent", this.listAnswer[i]);
|
||||
},
|
||||
setTextSearch(item, countInPage) {
|
||||
this.textSearch = item;
|
||||
this.countInPage = countInPage;
|
||||
// console.log(this.textSearch);
|
||||
},
|
||||
scrollToTop() {
|
||||
window.scrollTo(0, 0);
|
||||
},
|
||||
|
||||
//mehdi
|
||||
pageLimitChanged(paging) {
|
||||
this.resetPagination();
|
||||
this.page.limit = paging.limit;
|
||||
|
||||
this.$emit("changePage", this.page);
|
||||
},
|
||||
pageChanged(paging) {
|
||||
let page = paging.pageNumber;
|
||||
page -= 1;
|
||||
this.page.offset = page * paging.limit;
|
||||
this.page.limit = paging.limit;
|
||||
this.page.page = paging.pageNumber;
|
||||
|
||||
this.$emit("changePage", this.page);
|
||||
},
|
||||
sortChanged(sorting) {
|
||||
this.page.page = this.page.offset = 0;
|
||||
this.sorting = sorting;
|
||||
|
||||
this.$emit("changePage", this.sorting);
|
||||
},
|
||||
resetPagination() {
|
||||
this.page = {
|
||||
pages: 0,
|
||||
total: 0,
|
||||
page: 1,
|
||||
offset: 0,
|
||||
limit: 10,
|
||||
};
|
||||
},
|
||||
setListAnswer() {},
|
||||
// getListSpecial(_entityType, _specialType) {
|
||||
|
||||
// if (this.fetchingData) return;
|
||||
// this.fetchingData = true;
|
||||
|
||||
// this.entity_type = _entityType;
|
||||
|
||||
// let url = searchApi.Farhanghestan.search_normal;
|
||||
|
||||
// url = url + `/${this.pagination.offset}/${this.pagination.limit}/`;
|
||||
|
||||
// this.httpService.getRequest(url).then((res) => {
|
||||
|
||||
// this.listEntity = 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 };
|
||||
|
||||
// this.fetchingData = false;
|
||||
// });
|
||||
// },
|
||||
|
||||
getList(_entityType) {
|
||||
if (this.fetchingData) return;
|
||||
this.fetchingData = true;
|
||||
|
||||
this.entity_type = _entityType;
|
||||
|
||||
let url =
|
||||
searchApi.Farhanghestan.search_normal +
|
||||
`/${this.page.offset}/${this.page.limit}`;
|
||||
|
||||
this.httpService.getRequest(url).then((res) => {
|
||||
this.listEntity = res.hits.hits;
|
||||
|
||||
const total = res.hits.total.value;
|
||||
const pages = Math.ceil(total / this.page.limit);
|
||||
const pagination = {
|
||||
total: total,
|
||||
pages: pages == 0 ? 1 : pages,
|
||||
};
|
||||
|
||||
this.page = { ...this.pagination, ...pagination };
|
||||
|
||||
this.fetchingData = false;
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<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);
|
||||
}
|
||||
|
||||
.tavasi,
|
||||
.icon-copy2 {
|
||||
color: #adbec4;
|
||||
}
|
||||
.icon-copy2 {
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
&.favorites {
|
||||
color: calc(--primary-color);
|
||||
.icon-bookmark-1,
|
||||
.icon-bookmark-4 {
|
||||
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>
|
677
components/research/components/ResearchFilterList.vue
Normal file
677
components/research/components/ResearchFilterList.vue
Normal file
|
@ -0,0 +1,677 @@
|
|||
<template>
|
||||
<div class="main-filter" ref="filterdiv">
|
||||
<!-- <div class="button-hiden text__12" ref="button" :style="{ height: $attrs.height}">
|
||||
<button class="btn btn-primary" @click.prevent="hidenfilter">
|
||||
<svg class="icon icon-chevron-double-right ms-1">
|
||||
<use xlink:href="#icon-chevron-double-right"></use>
|
||||
</svg>
|
||||
بستن فیلتر
|
||||
</button>
|
||||
</div> -->
|
||||
|
||||
<div class="search-items filter-list firefox-scrollbar mt-2">
|
||||
<div :key="reRender">
|
||||
<div>
|
||||
<a
|
||||
v-if="filterSelect.length"
|
||||
@click.prevent="emptyFilter()"
|
||||
class="filters__delete text__12"
|
||||
>حذف فیلترها
|
||||
</a>
|
||||
<filter-items
|
||||
:key="filterListKey"
|
||||
:filters="filterItems"
|
||||
@remove-filter="delFilterItem"
|
||||
></filter-items>
|
||||
</div>
|
||||
|
||||
|
||||
<div
|
||||
v-for="(filter, index) in researchSchemaGetter[0].filter"
|
||||
v-if="researchSchemaGetter && listFilter && listFilter[filter.source_key]?.buckets.length > 0"
|
||||
class="filters__sec"
|
||||
:key="index"
|
||||
>
|
||||
<div class="main-title">{{ filter.title }}</div>
|
||||
<ul>
|
||||
<li
|
||||
v-for="(item, i) in getFilterItems(
|
||||
filter.source_key,
|
||||
filter.by_more
|
||||
)"
|
||||
:key="i"
|
||||
>
|
||||
<a
|
||||
@click.prevent="
|
||||
toggelClick($event.target, filter.filter_key, item.key)
|
||||
"
|
||||
class="text-filter mt-2"
|
||||
>
|
||||
<span class="title text__14">{{ getTitle(item) }}</span>
|
||||
<span class="num text__12">{{ getCount(item) }}</span>
|
||||
</a>
|
||||
</li>
|
||||
<li
|
||||
v-if="
|
||||
filter.by_more &&
|
||||
listFilter &&
|
||||
listFilter[filter.source_key]?.buckets.length > maxItem
|
||||
"
|
||||
style="color: #3f4abc"
|
||||
>
|
||||
<a
|
||||
v-if="!filter_expand2[filter.source_key]"
|
||||
@click.prevent="setFilterExpand(filter.source_key, true)"
|
||||
>بیشتر</a
|
||||
>
|
||||
<a
|
||||
v-if="filter_expand2[filter.source_key]"
|
||||
@click.prevent="setFilterExpand(filter.source_key, false)"
|
||||
>بستن</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapState, mapActions } from "pinia";
|
||||
import { useSearchStore } from "~/stores/searchStore";
|
||||
import { useResearchStore } from "~/stores/researchStore";
|
||||
|
||||
export default {
|
||||
name: "FilterList",
|
||||
props: ["changePageFilter", "listAggregations", "selectedFilterItems"],
|
||||
data() {
|
||||
return {
|
||||
reRender: 1,
|
||||
listFilter: [],
|
||||
filterSelect: [],
|
||||
filterItems: [],
|
||||
filterListKey: 1,
|
||||
filterUrl: "",
|
||||
filter_schema: [],
|
||||
filter_expand2: {},
|
||||
maxItem: 5,
|
||||
tagsExpanded: false,
|
||||
isHideFilter: 0,
|
||||
windowWidth: window?.innerWidth,
|
||||
};
|
||||
},
|
||||
|
||||
computed: {
|
||||
...mapState(useSearchStore, [
|
||||
"searchSchemaGetter",
|
||||
"searchActiveTabGetter",
|
||||
"selectionFilterItemsGetter",
|
||||
]),
|
||||
...mapState(useResearchStore, [
|
||||
"researchSchemaGetter",
|
||||
|
||||
]),
|
||||
|
||||
listTags() {
|
||||
if (
|
||||
this.tagsExpanded ||
|
||||
this.listFilter?.tags?.buckets.length < this.maxItem
|
||||
)
|
||||
return this.listFilter.tags.buckets;
|
||||
else return this.listFilter.tags.buckets.slice(0, this.maxItem);
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
// changePageFilter(newVal) {
|
||||
// if (this.$route.name === "searchResult") {
|
||||
// if (newVal == 0) {
|
||||
// this.$refs.filterdiv.classList.remove("hide");
|
||||
// this.$refs.filterdiv.classList.add("show");
|
||||
// } else {
|
||||
// this.$refs.filterdiv.classList.remove("show");
|
||||
// this.$refs.filterdiv.classList.add("hide");
|
||||
// }
|
||||
// } else {
|
||||
// if (newVal == 0) {
|
||||
// this.$refs.filterdiv.classList.remove("d-none");
|
||||
|
||||
// this.$refs.filterdiv.classList.remove("hide");
|
||||
// this.$refs.filterdiv.classList.add("show");
|
||||
// } else {
|
||||
// this.$refs.filterdiv.classList.remove("show");
|
||||
// this.$refs.filterdiv.classList.add("hide");
|
||||
// }
|
||||
// }
|
||||
// },
|
||||
filterItems(newVal) {
|
||||
// this.selectionFilterItemsSetter(newVal)
|
||||
this.$emit("filterItems", newVal);
|
||||
},
|
||||
$route: {
|
||||
handler: function (to, from) {},
|
||||
},
|
||||
},
|
||||
|
||||
beforeDestroy() {
|
||||
window.removeEventListener("resize", this.handleResize);
|
||||
},
|
||||
mounted() {
|
||||
window.addEventListener("resize", this.handleResize);
|
||||
if (this.$route.name === "searchResult") {
|
||||
// this.$refs.filterbuttom.classList.add("d-none");
|
||||
// this.$refs.button.classList.add("d-none");
|
||||
// this.$refs.filterdiv.classList.remove("show");
|
||||
} else if (this.$route.name === "searchCategory") {
|
||||
// this.$refs.filterbuttom.classList.remove("show");
|
||||
// this.$refs.filterdiv.classList.add("d-none");
|
||||
// this.$refs.filterbuttom.classList.add("d-none");
|
||||
// this.hidenfilter();
|
||||
} else if (this.$route.name === "searchNavigation") {
|
||||
this.setAnswer(this.listAggregations);
|
||||
this.filterItems = this.selectedFilterItems ;
|
||||
this.selectedFilterItems.forEach((element) => {
|
||||
this.filterSelect.push(element.id);
|
||||
});
|
||||
this.searchfilter();
|
||||
// this.filterSelect = this.selectedFilterItems
|
||||
} else if (this.$route.name !== "searchCategory") {
|
||||
// this.$refs.filterbuttom.classList.add("d-none");
|
||||
// this.$refs.button.classList.add("d-none");
|
||||
// this.$refs.filterdiv.classList.remove("hide");
|
||||
}
|
||||
|
||||
// window.addEventListener('resize', this.handleResize);
|
||||
// if (window.innerWidth <= 991) {
|
||||
// this.$nextTick(() => {
|
||||
// this.$refs.filterdiv.classList.remove("hide");
|
||||
|
||||
// });
|
||||
// }
|
||||
},
|
||||
methods: {
|
||||
...mapActions(useSearchStore, ["selectionFilterItemsSetter"]),
|
||||
|
||||
// handleResize() {
|
||||
// this.windowWidth = window.innerWidth;
|
||||
// if (this.$route.name === "searchCategory") {
|
||||
// this.$refs.filterdiv.classList.add("d-none");
|
||||
// if (this.windowWidth < 991) {
|
||||
// this.$refs.filterbuttom.classList.add("d-none");
|
||||
// this.$refs.filterbuttom.classList.add("hide");
|
||||
|
||||
// // this.$refs.filterbuttom.classList.add("d-none");
|
||||
// } else if (this.windowWidth > 991) {
|
||||
// this.$refs.filterbuttom.classList.remove("d-none");
|
||||
// this.$refs.filterbuttom.classList.remove("hide");
|
||||
// }
|
||||
|
||||
// // if (!this.$refs.filterdiv.classList.contains("d-none")) {}
|
||||
// } else {
|
||||
// if (this.windowWidth > 991) {
|
||||
// this.$refs.filterdiv.classList.remove("hide");
|
||||
// this.$refs.filterdiv.classList.add("show");
|
||||
// this.$refs.filterbuttom.classList.remove("d-none");
|
||||
// this.$refs.button.classList.remove("hide");
|
||||
// } else if (this.windowWidth < 991) {
|
||||
// this.$refs.filterdiv.classList.remove("show");
|
||||
// this.$refs.filterdiv.classList.add("hide");
|
||||
// this.$refs.filterbuttom.classList.add("hide");
|
||||
// this.$refs.button.classList.add("hide");
|
||||
// }
|
||||
// }
|
||||
// },
|
||||
showfilter: function () {
|
||||
// this.$refs.filterdiv.classList.add("show");
|
||||
// this.$refs.filterdiv.classList.remove("d-none");
|
||||
// this.$refs.filterdiv.classList.remove("hide");
|
||||
// this.$refs.filterdiv.classList.add("show");
|
||||
// this.$refs.filterbuttom.classList.add("hide");
|
||||
// this.$refs.filterbuttom.classList.remove("show");
|
||||
|
||||
this.isHideFilter = 0;
|
||||
this.$emit("changeHideFilter", this.isHideFilter);
|
||||
},
|
||||
hidenfilter: function () {
|
||||
// this.$refs.filterdiv.classList.remove("show");
|
||||
// this.$refs.filterdiv.classList.add("hide");
|
||||
// this.$refs.filterdiv.classList.remove("show");
|
||||
// this.$refs.filterbuttom.classList.remove("hide");
|
||||
|
||||
this.isHideFilter = 1;
|
||||
this.$emit("changeHideFilter", this.isHideFilter);
|
||||
},
|
||||
setAnswer: function (list, emptyPrevFilter = true) {
|
||||
// console.log(list)
|
||||
this.listFilter = list;
|
||||
this.reRender++;
|
||||
},
|
||||
resetFilter() {
|
||||
this.filterSelect = [];
|
||||
this.filterItems = [];
|
||||
this.listFilter = [];
|
||||
this.filterListKey++;
|
||||
},
|
||||
emptyFilter: function () {
|
||||
this.filterSelect = [];
|
||||
this.filterItems = [];
|
||||
this.filterListKey++;
|
||||
this.$el.querySelectorAll("a.active").forEach((el) => {
|
||||
el.classList.remove("active");
|
||||
});
|
||||
this.searchfilter();
|
||||
},
|
||||
// toggelClick(el, type, item) {
|
||||
// var key = type + "#" + item;
|
||||
// if (el.classList.contains("active")) {
|
||||
// this.delFilter(key);
|
||||
// el.classList.remove("active");
|
||||
// } else {
|
||||
// this.addFilter(key);
|
||||
// this.filterItems.push({ id: key, title: item });
|
||||
// el.classList.add("active");
|
||||
// }
|
||||
// // this.selectionFilterItemsSetter(this.filterItems);
|
||||
// this.filterListKey++;
|
||||
// },
|
||||
toggelClick(el, type, item) {
|
||||
var key = type + "#" + item;
|
||||
var foundIndex = -1;
|
||||
|
||||
// جستجو در آرایه filterItems برای یافتن ایتم مورد نظر
|
||||
for (var i = 0; i < this.filterItems.length; i++) {
|
||||
if (this.filterItems[i].id === key) {
|
||||
foundIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (foundIndex !== -1) {
|
||||
// اگر ایتم در آرایه وجود داشت، آن را حذف کن
|
||||
this.delFilter(key);
|
||||
// this.filterItems.splice(foundIndex, 1);
|
||||
el.classList.remove("active");
|
||||
|
||||
|
||||
} else {
|
||||
// اگر ایتم در آرایه وجود نداشت، آن را اضافه کن
|
||||
this.addFilter(key);
|
||||
this.filterItems.push({ id: key, title: item });
|
||||
el.classList.add("active");
|
||||
}
|
||||
// this.selectionFilterItemsSetter(this.filterItems);
|
||||
this.filterListKey++;
|
||||
},
|
||||
|
||||
delFilterItem(key) {
|
||||
var index = this.filterItems.indexOf(key);
|
||||
if (index != -1) {
|
||||
this.filterSelect.splice(index, 1);
|
||||
this.filterItems.splice(index, 1);
|
||||
// this.selectionFilterItemsSetter(this.filterItems);
|
||||
}
|
||||
this.filterListKey++;
|
||||
this.searchfilter();
|
||||
},
|
||||
delFilter(key) {
|
||||
var index = this.filterSelect.indexOf(key);
|
||||
if (index != -1) {
|
||||
this.filterSelect.splice(index, 1);
|
||||
this.filterItems.splice(index, 1);
|
||||
}
|
||||
this.filterListKey++;
|
||||
this.searchfilter();
|
||||
},
|
||||
addFilter(key) {
|
||||
this.filterSelect.push(key);
|
||||
this.filterListKey++;
|
||||
this.searchfilter();
|
||||
},
|
||||
searchfilter() {
|
||||
this.filterSelect.sort(function (x, y) {
|
||||
return y - x;
|
||||
});
|
||||
this.filterUrl = "";
|
||||
var prevType = "";
|
||||
this.filterSelect.forEach((item) => {
|
||||
|
||||
var items = item.split("#");
|
||||
|
||||
if (prevType == items[0]) {
|
||||
this.filterUrl += "$" + items[1];
|
||||
} else {
|
||||
this.filterUrl += "&" + items[0] + "=" + items[1];
|
||||
}
|
||||
prevType = items[0];
|
||||
});
|
||||
this.$emit("filterUpdate", this.filterUrl);
|
||||
},
|
||||
isFilterExpand(key) {
|
||||
if (!(key in this.filter_expand2))
|
||||
this.$set(this.filter_expand2, key, false);
|
||||
|
||||
return this.filter_expand2[key];
|
||||
},
|
||||
setFilterExpand(key, state = false) {
|
||||
this.$set(this.filter_expand2, key, state);
|
||||
},
|
||||
getFilterItems(key, by_more = 0) {
|
||||
if (!(key in this.listFilter)) return [];
|
||||
|
||||
if (!by_more) {
|
||||
return this.listFilter[key].buckets;
|
||||
} else if (!this.isFilterExpand(key)) {
|
||||
if (this.listFilter[key].buckets.length < this.maxItem)
|
||||
return this.listFilter[key].buckets;
|
||||
else return this.listFilter[key].buckets.slice(0, this.maxItem);
|
||||
} else return this.listFilter[key].buckets;
|
||||
},
|
||||
getTitle(item) {
|
||||
if (item && item.key && item.key != "") return item.key;
|
||||
else return "نامشخص";
|
||||
},
|
||||
getCount(item) {
|
||||
if (item.total && item.total.value)
|
||||
return item.total.value; //برای حالت کولپس اجزاء مثل قانون
|
||||
else return item.doc_count;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.accordion {
|
||||
margin-top: 24px;
|
||||
.card {
|
||||
border-radius: 0;
|
||||
border: none;
|
||||
|
||||
.card-header {
|
||||
background-color: #fff;
|
||||
// width: 20em;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
// border-bottom: none;
|
||||
button {
|
||||
position: relative;
|
||||
left: -31px;
|
||||
}
|
||||
p {
|
||||
width: 10em;
|
||||
position: relative;
|
||||
right: -19px;
|
||||
}
|
||||
}
|
||||
.show {
|
||||
height: 19vh;
|
||||
}
|
||||
.card-body {
|
||||
padding: 0 !important;
|
||||
height: 25vh;
|
||||
}
|
||||
}
|
||||
}
|
||||
// .search-items {
|
||||
// height: calc(100vh - 17em);
|
||||
// border-left: 1px solid #f2f2e6;
|
||||
// }
|
||||
.circle {
|
||||
position: relative;
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
border-radius: 50%;
|
||||
border: black solid 1px;
|
||||
|
||||
display: flex;
|
||||
cursor: pointer;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
.circle-icon {
|
||||
position: fixed;
|
||||
margin-right: 15.6%;
|
||||
top: 9em;
|
||||
&:hover {
|
||||
margin-right: 15.9%;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<!-- <style lang="scss">
|
||||
.main-tree {
|
||||
position: fixed;
|
||||
right: 57px;
|
||||
z-index: 10;
|
||||
top: 149px;
|
||||
width: 13.1%;
|
||||
background-color: #fff;
|
||||
border-left: 1px solid #f2f2e6;
|
||||
height: 81vh;
|
||||
}
|
||||
.main-tree-select {
|
||||
.form-control {
|
||||
border-radius: 0.35rem !important;
|
||||
width: 92% !important;
|
||||
margin: 15px auto;
|
||||
}
|
||||
}
|
||||
|
||||
.os-scrollbar-horizontal {
|
||||
display: none !important;
|
||||
}
|
||||
.os-host-overflow {
|
||||
height: 79vh;
|
||||
}
|
||||
.button-close {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
margin: 5px 0;
|
||||
button {
|
||||
border: 0px;
|
||||
color: #5897fb;
|
||||
background-color: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
.detail-page__filters {
|
||||
top: 7.75rem !important;
|
||||
|
||||
|
||||
}
|
||||
.scrollbar {
|
||||
height: 100vh !important ;
|
||||
padding-right: 18px !important;
|
||||
padding-left: 18px !important;
|
||||
}
|
||||
.display-none {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
@media (min-width: 992px) {
|
||||
.tab-content--scrolled {
|
||||
max-height: 100vh;
|
||||
}
|
||||
.detail-page__filters {
|
||||
top: 9.15rem !important;
|
||||
|
||||
}
|
||||
.detail-page__filters{
|
||||
right: 22.1rem !important;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 720px) {
|
||||
|
||||
|
||||
.buttonshow {
|
||||
position: fixed;
|
||||
right: 5px;
|
||||
top: 30vh;
|
||||
}
|
||||
.detail-page__filters {
|
||||
top: 11.35rem !important;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 575.98px) {
|
||||
.display-none {
|
||||
display: flex !important;
|
||||
}
|
||||
}
|
||||
@media only screen and (min-width: 576px) and (max-width: 767.98px) {
|
||||
.display-none {
|
||||
display: flex !important;
|
||||
}
|
||||
}
|
||||
@media only screen and (min-width: 768px) and (max-width: 991.98px) {
|
||||
.display-none {
|
||||
display: flex !important;
|
||||
}
|
||||
}
|
||||
</style> -->
|
||||
<style lang="scss" scoped>
|
||||
// .main-filter {
|
||||
// background-color: green;
|
||||
// z-index: 2;
|
||||
// width: 16.3%;
|
||||
// height: 82.6vh;
|
||||
// position: fixed;
|
||||
// margin-right: 16.5%;
|
||||
// top: 8.9em;
|
||||
// top: 0;
|
||||
// background-color: #fff;
|
||||
// width: 95%;
|
||||
// margin: 5px auto;
|
||||
// height: 100%;
|
||||
// }
|
||||
.button-hiden {
|
||||
padding: 1em;
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
// position: relative;
|
||||
|
||||
// top: 21px;
|
||||
// left: 17px;
|
||||
// z-index: 9;
|
||||
|
||||
.btn {
|
||||
background-color: var(--primary-color);
|
||||
font-size: 0.7rem;
|
||||
border-radius: 0.5em;
|
||||
border: 1px solid var(--primary-color);
|
||||
|
||||
* {
|
||||
color: #fff;
|
||||
|
||||
&::before {
|
||||
color: inherit;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// .body-filter {
|
||||
// height: calc(100dvh - 13em);
|
||||
// overflow: auto;
|
||||
// }
|
||||
.text-filter {
|
||||
display: flex;
|
||||
justify-content: space-between !important;
|
||||
margin: 0px 12px;
|
||||
}
|
||||
.hide {
|
||||
// transform: translateX(80%);
|
||||
display: none;
|
||||
}
|
||||
|
||||
.show {
|
||||
// transform: translateX(0);
|
||||
display: block;
|
||||
}
|
||||
@media (max-width: 575.98px) {
|
||||
// .main-filter {
|
||||
// width: 100%;
|
||||
// height: 99.5vh;
|
||||
// top: 0;
|
||||
// margin: 0;
|
||||
// }
|
||||
// .search-items {
|
||||
// height: calc(100vh - 3em);
|
||||
// border-left: 1px solid #f2f2e6;
|
||||
// }
|
||||
// .body-filter {
|
||||
// height: 100%;
|
||||
// }
|
||||
}
|
||||
@media only screen and (min-width: 576px) and (max-width: 767.98px) {
|
||||
// .main-filter {
|
||||
// width: 26em;
|
||||
// height: 98.2vh;
|
||||
// top: 11.9em;
|
||||
// margin-right: 3.5%;
|
||||
// }
|
||||
// .search-items {
|
||||
// height: calc(100vh - 4em);
|
||||
// }
|
||||
// .body-filter {
|
||||
// height: 100%;
|
||||
// }
|
||||
}
|
||||
@media only screen and (min-width: 768px) and (max-width: 991.98px) {
|
||||
// .main-filter {
|
||||
// width: 23em;
|
||||
// height: 83.2vh;
|
||||
// top: 8.9em;
|
||||
// margin-right: 6.5%;
|
||||
// }
|
||||
// .body-filter {
|
||||
// height: 100%;
|
||||
// }
|
||||
// .search-items {
|
||||
// height: calc(100vh - 3em);
|
||||
// }
|
||||
}
|
||||
@media only screen and (min-width: 992px) and (max-width: 1049.98px) {
|
||||
// .main-filter {
|
||||
// width: 20em;
|
||||
// height: 83.2vh;
|
||||
// top: 8.9em;
|
||||
// margin-right: 5.5%;
|
||||
// }
|
||||
.circle-icon {
|
||||
position: fixed;
|
||||
margin-right: 2.8em;
|
||||
top: 9em;
|
||||
&:hover {
|
||||
margin-right: 2.9em;
|
||||
}
|
||||
}
|
||||
}
|
||||
@media (min-width: 1050px) {
|
||||
// .main-filter {
|
||||
// width: 20em;
|
||||
// height: 83.2vh;
|
||||
// // top: 8.9em;
|
||||
// margin-right: 3.5em;
|
||||
// }
|
||||
.circle-icon {
|
||||
position: fixed;
|
||||
margin-right: 2.8em;
|
||||
top: 9em;
|
||||
&:hover {
|
||||
margin-right: 2.9em;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<style lang="scss">
|
||||
.filters__delete {
|
||||
padding: 5px;
|
||||
}
|
||||
.text-filter:hover {
|
||||
.title {
|
||||
color: var(--primary-color);
|
||||
}
|
||||
span {
|
||||
color: var(--primary-color);
|
||||
}
|
||||
}
|
||||
</style>
|
448
components/research/components/ResearchFishModal.vue
Normal file
448
components/research/components/ResearchFishModal.vue
Normal file
|
@ -0,0 +1,448 @@
|
|||
<template>
|
||||
<div
|
||||
class="container-fluid"
|
||||
:style="{
|
||||
height: $attrs.height,
|
||||
}"
|
||||
>
|
||||
<div class="row h-100">
|
||||
<!-- #region قسمت مربوط به تبهای فعال -->
|
||||
<div v-if="valueModal.itemSchema">
|
||||
<div class="col h-100 d-flex flex-column ">
|
||||
<div class="row " style="height: 90%; overflow: auto;">
|
||||
<div class="col-12">
|
||||
<FormBuilder
|
||||
v-if="showFormBuilder"
|
||||
:formElements="valueModal.itemSchema.form.items_main"
|
||||
:formData="formDataInit"
|
||||
:readOnly="
|
||||
readOnlyHandler(
|
||||
valueModal.itemSchema,
|
||||
valueModal.itemEdit._source.user.user_id
|
||||
)
|
||||
"
|
||||
:displayMode="'default'"
|
||||
@saveComponentValue="changedFormValues"
|
||||
class="row"
|
||||
></FormBuilder>
|
||||
</div>
|
||||
|
||||
<div class="col-12 mt-2" v-show="showMore">
|
||||
<FormBuilder
|
||||
v-if="showFormBuilder"
|
||||
:formElements="valueModal.itemSchema.form.items_more"
|
||||
:formData="formDataInit"
|
||||
:displayMode="'default'"
|
||||
:readOnly="
|
||||
readOnlyHandler(
|
||||
valueModal.itemSchema,
|
||||
valueModal.itemEdit._source.user.user_id
|
||||
)
|
||||
"
|
||||
@saveComponentValue="changedFormValues"
|
||||
class="row"
|
||||
></FormBuilder>
|
||||
</div>
|
||||
<div
|
||||
class="col-12 d-flex justify-content-start align-items-start mb-2"
|
||||
>
|
||||
<ToggleButton
|
||||
openText="بیشتر"
|
||||
openIcon="Component-25--1"
|
||||
closeText="بستن"
|
||||
closeIcon="Component-22--1"
|
||||
@toggle="clickToggleButton"
|
||||
>
|
||||
</ToggleButton>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row px-3 border-top h-auto">
|
||||
<div class="col-12 d-flex justify-content-end align-items-end">
|
||||
<button
|
||||
title="ذخیره"
|
||||
classes="btn btn-outline-primary fz-13"
|
||||
@click="saveFish(valueModal.action)"
|
||||
buttonText="ذخیره"
|
||||
class="btn btn-outline-primary fz-13 mt-2"
|
||||
:class="{ disabled: valueModal?.isReadonly == true }"
|
||||
>
|
||||
ذخیره
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else>
|
||||
<div class="col">
|
||||
<h2>در حال بارگزاری ...</h2>
|
||||
<!-- <EntityEditFormBuilder> </EntityEditFormBuilder> -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- #endregion -->
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import entityApi from "~/apis/entityApi.js";
|
||||
|
||||
import { mapState } from "pinia";
|
||||
/**
|
||||
|
||||
* @vue-prop {Object} [valueModal={}] - یک آبجکت از مقادیر مورد نیاز برای فیش
|
||||
|
||||
* @vue-data {Object} [formDataInit={}] - آبجکتی که شامل مقادیر ورودی ثابت برای فرم بیلدر است
|
||||
* @vue-data {Object} [changValue={}] - مقادیر بازگشتی از فرم بیلدر که خود فرد پر کرده است
|
||||
* @vue-data {Object} [itemForEdit={}] - آبجکتی که متشکل از مقادیری است که باید ویرایش شود
|
||||
* @vue-data {String} [date_create=""] - تاریخ ایجاد فیش
|
||||
* @vue-data {String} [username=""] - نام فردی که فیش را ایجاد کرده است
|
||||
* @vue-data {String} [address=""] - آدرس ایجاد فیش
|
||||
|
||||
* @vue-data {Number} [showFormBuilder=false] - برای دوباره ساختن فرم بیلدر
|
||||
* @vue-data {String} [httpService=undefined] - محل قرارگیری URL
|
||||
* @vue-data {Array} [tableActions=[]] - لیست اقدامات context-menu
|
||||
* @vue-data {String} [listFishs=""] - لیست تمام فیشهای زده شده
|
||||
* @vue-data {Boolean} [ShowMore=false] - وضعیت نمایش موارد بیشتر .
|
||||
*
|
||||
* @vue-event {Object} removeItemHandler - این متد برای حذف آیتم از لیست استفاده میشود.
|
||||
* @vue-event {Object} editItemHandler - این متد برای ویرایش آیتم از لیست استفاده میشود.
|
||||
* @vue-event {String} saveFish - این متد برای ذخیره فیش جدید یا ویرایش شده استفاده میشود.
|
||||
*/
|
||||
export default {
|
||||
props: {
|
||||
valueModal: {
|
||||
type: Object,
|
||||
default: () => ({}),
|
||||
},
|
||||
},
|
||||
beforeMount() {
|
||||
this.httpService = new HttpService(import.meta.env.VITE_REPO_BASE_URL);
|
||||
},
|
||||
mounted() {
|
||||
if (this.valueModal.action == "edit") {
|
||||
this.itemForEdit = this.valueModal.itemEdit._source;
|
||||
|
||||
// filter null/undefined values
|
||||
Object.keys(this.itemForEdit).forEach((key) => {
|
||||
if (this.itemForEdit[key] == null) return;
|
||||
this.formDataInit[key] = this.itemForEdit[key];
|
||||
});
|
||||
}
|
||||
|
||||
this.showFormBuilder = true;
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
showMore: false,
|
||||
httpService: undefined,
|
||||
formDataInit: {},
|
||||
changValue: {},
|
||||
itemForEdit: {},
|
||||
|
||||
date_create: "",
|
||||
address: "",
|
||||
username: "",
|
||||
|
||||
showFormBuilder: false,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState(["userPermisionGetter", "currentUser"]),
|
||||
},
|
||||
methods: {
|
||||
//برسی میکنه که آیا اجازه ویرایش فیش بدهد یا نه
|
||||
readOnlyHandler(Schema, OwnerResearch) {
|
||||
if (this.valueModal.isReadonly == true) return true;
|
||||
let isUserAccess = this.isEditable(Schema.key);
|
||||
|
||||
let isOwnerResearch = "";
|
||||
if (this.currentUser.user_id == OwnerResearch) isOwnerResearch = true;
|
||||
else isOwnerResearch = false;
|
||||
|
||||
if (isUserAccess == true || isOwnerResearch == true) return false;
|
||||
else return true;
|
||||
},
|
||||
isEditable(key) {
|
||||
if (key) {
|
||||
let res = this.hasPermission(key + "_edit");
|
||||
return res;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
|
||||
hasPermission(permission) {
|
||||
if (this.currentUser?.user_level > 1) return true;
|
||||
|
||||
if (this.userPermisionGetter && this.userPermisionGetter?.length)
|
||||
return this.userPermisionGetter?.includes(permission);
|
||||
return false;
|
||||
},
|
||||
/**
|
||||
* تغییر وضعیت نمایش بیشتر با توجه به ایونت دریافتی.
|
||||
* @param {Boolean} event - وضعیت جدید برای نمایش بیشتر.
|
||||
* @description این متد وضعیت نمایش بیشتر را بر اساس ایونت دریافتی تغییر میدهد.
|
||||
* این متد معمولاً به عنوان یک هندلر برای ایونتهای toggle استفاده میشود.
|
||||
*/
|
||||
clickToggleButton(event) {
|
||||
this.showMore = event;
|
||||
},
|
||||
|
||||
/**
|
||||
* بستن مدال.
|
||||
* @description این متد برای بستن مدال استفاده میشود.
|
||||
* @fires close
|
||||
*/
|
||||
close() {
|
||||
this.$emit("close");
|
||||
},
|
||||
|
||||
// استفاده نشده ... !!!!!!!!!!!!!!!!!!!
|
||||
// /**
|
||||
// * دریافت متن مرجع.
|
||||
// * @param {Object} fieldFooter متغیر حاوی اطلاعات مرجع
|
||||
// * @returns {String} متن مرجع
|
||||
// * @description این متد برای دریافت متن مرجع استفاده میشود.
|
||||
// */
|
||||
// referenceText(fieldFooter) {
|
||||
// if (!fieldFooter.reference) return;
|
||||
// const regex = /(\{(\w+)\})/gm;
|
||||
// const str = fieldFooter.reference;
|
||||
// let m;
|
||||
// let matches = [];
|
||||
|
||||
// while ((m = regex.exec(str)) !== null) {
|
||||
// if (m.index === regex.lastIndex) {
|
||||
// regex.lastIndex++;
|
||||
// }
|
||||
// matches.push(m);
|
||||
// }
|
||||
|
||||
// let reference = str;
|
||||
|
||||
// matches.forEach((match, groupIndex) => {
|
||||
// let group = match[0];
|
||||
// let key = group.replace("{", "").replace("}", "");
|
||||
// reference = reference.replaceAll(
|
||||
// group,
|
||||
// this.selectedItemEntityGetter[key]
|
||||
// );
|
||||
// });
|
||||
// this.addressFish = reference;
|
||||
// return reference;
|
||||
// },
|
||||
/**
|
||||
* دریافت تاریخ امروز به شکل رشته متنی.
|
||||
* @returns {String} تاریخ امروز به فرمت YYYY/MM/DD
|
||||
* @description این متد برای دریافت تاریخ امروز به فرمت مشخص شده استفاده میشود.
|
||||
*/
|
||||
todays() {
|
||||
const today = new Date();
|
||||
const year = today.getFullYear();
|
||||
const month = today.getMonth() + 1;
|
||||
const day = today.getDate();
|
||||
const currentDate = `${year}/${month}/${day}`;
|
||||
|
||||
return this.datefa(currentDate);
|
||||
},
|
||||
/**
|
||||
* تبدیل تاریخ میلادی به تاریخ فارسی.
|
||||
* @param {String} date تاریخ میلادی
|
||||
* @returns {String} تاریخ فارسی
|
||||
* @description این متد برای تبدیل تاریخ میلادی به تاریخ فارسی استفاده میشود.
|
||||
*/
|
||||
datefa(date) {
|
||||
var m = date;
|
||||
var d = new Date(m).toLocaleDateString("fa-IR");
|
||||
return d;
|
||||
},
|
||||
|
||||
/**
|
||||
* تغییرات اعمال شده در فرم را ذخیره کنید.
|
||||
* @param {Object} form فرم با تغییرات جدید
|
||||
* @description این متد برای ذخیره تغییراتی که در فرم اعمال شدهاند استفاده میشود.
|
||||
*/
|
||||
changedFormValues(form) {
|
||||
Object.keys(form).forEach((key) => {
|
||||
if (this.itemForEdit[key] !== form[key]) {
|
||||
this.changValue[key] = form[key];
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* ذخیره فیش.
|
||||
* @param {String} editState وضعیت ویرایش یا اضافه کردن
|
||||
* @description این متد برای ذخیره فیش جدید یا ویرایش شده استفاده میشود.
|
||||
*/
|
||||
saveFish(editState) {
|
||||
let item = this.changValue;
|
||||
let url = "";
|
||||
|
||||
let formData = {};
|
||||
let key = "";
|
||||
if (this.$route.params?.key) key = this.$route.params.key;
|
||||
if (editState == "edit") {
|
||||
url = entityApi.fish.update;
|
||||
url = url.replace("{{id}}", this.valueModal.itemEdit._id);
|
||||
formData = item;
|
||||
}
|
||||
url = url.replace("{{index_key}}", "research");
|
||||
|
||||
this.httpService.postRequest(url, formData).then((res) => {
|
||||
mySwalToast({
|
||||
html: res.message,
|
||||
});
|
||||
this.$emit("closeAfterSaving");
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<style scoped lang="scss">
|
||||
// #region all
|
||||
.modal {
|
||||
background-color: rgba(81, 79, 78, 0.577);
|
||||
}
|
||||
|
||||
.modal-dialog {
|
||||
max-width: 1200px;
|
||||
margin: 2.75rem auto;
|
||||
}
|
||||
.active {
|
||||
background-color: #e8fcff;
|
||||
}
|
||||
.nav_item {
|
||||
cursor: pointer;
|
||||
|
||||
span {
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background-color: #e8fcff;
|
||||
}
|
||||
}
|
||||
|
||||
.button_grop {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.footer_fish {
|
||||
.footer_fish_main {
|
||||
display: flex;
|
||||
margin-right: 3px;
|
||||
margin-top: 12px;
|
||||
|
||||
div {
|
||||
margin-right: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// #endregion
|
||||
|
||||
// #region activeTab===0
|
||||
.header_fish_list {
|
||||
display: grid;
|
||||
justify-content: space-evenly;
|
||||
// grid-template-columns: 1fr 1fr 1fr;
|
||||
// grid-template-rows: 1fr 1fr 1fr;
|
||||
// grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
|
||||
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
||||
margin-left: 5px;
|
||||
// background-color: green;
|
||||
// grid-template-columns: repeat(3, 12px);
|
||||
// grid-template-rows: repeat(3, auto);
|
||||
// grid-row-gap: 1px;
|
||||
grid-column-gap: 9px;
|
||||
|
||||
.header_item {
|
||||
display: grid;
|
||||
grid-template-columns: 2fr 4fr;
|
||||
align-items: center;
|
||||
justify-items: flex-start;
|
||||
margin: 5px 5px 5px 5px;
|
||||
|
||||
input {
|
||||
margin: 0 5px !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// #endregion
|
||||
|
||||
// #region activeTab===1
|
||||
.main_pag {
|
||||
width: 83%;
|
||||
// height: 76vh;
|
||||
height: 15em;
|
||||
// display: grid;
|
||||
// grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
||||
// gap: 15px 15px;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: flex-start;
|
||||
align-content: flex-start;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.card_fish {
|
||||
width: 17em;
|
||||
height: 150px;
|
||||
display: grid;
|
||||
grid-template-rows: 1fr 2fr 1fr;
|
||||
justify-self: center;
|
||||
background-color: #f2f2f2;
|
||||
border-radius: 10px;
|
||||
// box-shadow: 0px 3px 7px;
|
||||
box-shadow: 0px 1px 3px;
|
||||
margin: 2em;
|
||||
.img {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
margin: 6px 10px;
|
||||
.text-date {
|
||||
font-size: 0.875em;
|
||||
color: #a7a098;
|
||||
}
|
||||
}
|
||||
|
||||
.card_fish_main {
|
||||
.text_fish {
|
||||
margin: 0px 12px;
|
||||
|
||||
height: 73px;
|
||||
overflow: hidden;
|
||||
|
||||
p {
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.card_fish_footer {
|
||||
// display: grid;
|
||||
display: none;
|
||||
grid-template-columns: 25px 25px 25px;
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
|
||||
div {
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// #endregion
|
||||
|
||||
@media only screen and (min-width: 768px) and (max-width: 991.98px) {
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 576px) and (max-width: 766.98px) {
|
||||
}
|
||||
|
||||
@media (max-width: 575.98px) {
|
||||
}
|
||||
</style>
|
647
components/research/components/ResearchTreeList.vue
Normal file
647
components/research/components/ResearchTreeList.vue
Normal file
|
@ -0,0 +1,647 @@
|
|||
<template>
|
||||
<div class="tree-list-container text-end">
|
||||
<div class="d-flex align-items-center py-1 my-2 border-bottom">
|
||||
<label for="">پوشه جدید :</label>
|
||||
<button
|
||||
class="btn"
|
||||
@click="openModal('FormAddToTree', ' فرم ایجاد خصوصیت ')"
|
||||
>
|
||||
<svg class="icon icon-Component-212--1">
|
||||
<use xlink:href="#icon-Component-212--1"></use>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
<div class="firefox-scrollbar v-jstree">
|
||||
<v-jstree
|
||||
allow-transition
|
||||
:data="data"
|
||||
:draggable="true"
|
||||
ref="tree"
|
||||
klass="tree-rtl"
|
||||
size="large"
|
||||
multiple
|
||||
tree-rtl
|
||||
textFieldName="text"
|
||||
valueFieldName="item"
|
||||
@item-click="itemclick"
|
||||
@item-toggle="itemtoggle"
|
||||
@item-drag-start="onItemDragStart"
|
||||
@item-drag-end="onItemDragEnd"
|
||||
@item-drop-before="onItemDropBefore"
|
||||
@item-drop="onItemDrop"
|
||||
>
|
||||
<slot name="node">
|
||||
<div
|
||||
class="row tree-item mx-0"
|
||||
style="width: 25em"
|
||||
:class="{
|
||||
'active-item': activeItem && activeItem.id === node.model.id,
|
||||
}"
|
||||
@click="setActiveItem(node.model, node.vm)"
|
||||
>
|
||||
<div class="col-8">
|
||||
<div v-if="node.model.isEdit" class="d-flex align-items-center">
|
||||
<input
|
||||
type="text"
|
||||
class="form-control"
|
||||
v-model="node.model.text"
|
||||
/>
|
||||
<button @click.prevent="node.model.isEdit = false" class="btn">
|
||||
Save
|
||||
</button>
|
||||
</div>
|
||||
<div
|
||||
class="text-truncate"
|
||||
v-tooltip="node.model.text"
|
||||
style="width: 100px"
|
||||
v-else
|
||||
>
|
||||
{{ node.model.text }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-4 button-group" v-if="node.model.id !== 0">
|
||||
<button
|
||||
@click="removeNode(node.vm)"
|
||||
class="btn p-0"
|
||||
style="font-size: 0.6rem"
|
||||
>
|
||||
<svg class="icon icon-Component-295--1">
|
||||
<use xlink:href="#icon-Component-295--1"></use>
|
||||
</svg>
|
||||
</button>
|
||||
<button
|
||||
@click.prevent="editNode(node.vm)"
|
||||
class="btn p-0"
|
||||
style="font-size: 0.6rem"
|
||||
>
|
||||
<svg class="icon icon-Component-242--1">
|
||||
<use xlink:href="#icon-Component-242--1"></use>
|
||||
</svg>
|
||||
</button>
|
||||
<button
|
||||
@click.prevent="addChildNode(node.model, node.vm)"
|
||||
class="btn p-0"
|
||||
style="font-size: 0.6rem"
|
||||
>
|
||||
<svg class="icon icon-Component-133--1">
|
||||
<use xlink:href="#icon-Component-133--1"></use>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</slot>
|
||||
</v-jstree>
|
||||
</div>
|
||||
<base-modal
|
||||
v-if="uploadForFirstTime"
|
||||
@canel="closeModal()"
|
||||
:showHeaderCloseButton="true"
|
||||
:modalTitle="modalTitle"
|
||||
class="borhan-modal"
|
||||
modalSize="modal-lg"
|
||||
height="auto"
|
||||
maxHeight="20em"
|
||||
overflow="hidden"
|
||||
width="30em"
|
||||
:showSaveButton="true"
|
||||
:hasFooter="false"
|
||||
>
|
||||
<component
|
||||
:is="slotComponentName"
|
||||
:uploadForFirstTime="uploadForFirstTime"
|
||||
:editingItem="editingItem"
|
||||
@close="closeModal()"
|
||||
@addNew="addNewItem($event)"
|
||||
@edit="edit($event)"
|
||||
@addNewChildren="addNewChildren($event)"
|
||||
></component>
|
||||
</base-modal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
// import VJstree from "vue-jstree";
|
||||
import researchApi from "~/apis/researchApi";
|
||||
|
||||
import { mapActions, mapState } from "pinia";
|
||||
import { useResearchStore } from "~/stores/researchStore";
|
||||
|
||||
/**
|
||||
* @vue-event {Number} increment - Emit counter's value after increment
|
||||
* @vue-event {Number} decrement - Emit counter's value after decrement
|
||||
*/
|
||||
export default {
|
||||
beforeMount() {
|
||||
this.httpService = new HttpService(import.meta.env.VITE_BASE_URL);
|
||||
},
|
||||
props: {
|
||||
treeItems: {
|
||||
default() {
|
||||
return [];
|
||||
},
|
||||
},
|
||||
newProjects: {
|
||||
default() {
|
||||
return [];
|
||||
},
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
isEdit: false,
|
||||
// searchText: "",
|
||||
uploadForFirstTime: false,
|
||||
slotComponentName: null,
|
||||
modalTitle: null,
|
||||
data: [
|
||||
{
|
||||
text: "همه",
|
||||
name: "Root",
|
||||
id: "0",
|
||||
pid: "Root",
|
||||
opened: false,
|
||||
selected: false,
|
||||
disabled: true,
|
||||
loading: false,
|
||||
children: [],
|
||||
label: {
|
||||
backgroundColor: "#ee6666",
|
||||
},
|
||||
},
|
||||
],
|
||||
httpService: undefined,
|
||||
editingItem: "",
|
||||
editingNode: "",
|
||||
activeItem: null,
|
||||
|
||||
colors: [
|
||||
"#5470C6",
|
||||
"#d44646",
|
||||
"#008b8b",
|
||||
"#3BA272",
|
||||
"#FC8452",
|
||||
"#9A60B4",
|
||||
"#EA7CCC",
|
||||
"#F59F00",
|
||||
"#ddc4b0",
|
||||
"#73C0DE",
|
||||
"#b333ad",
|
||||
"#e86c6b",
|
||||
"#39cfed",
|
||||
],
|
||||
currentIndex: 0,
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
treeItems(newValue) {
|
||||
this.data[0].children = [];
|
||||
if (Array.isArray(newValue)) {
|
||||
newValue.forEach((element, index) => {
|
||||
const color = this.getNextColor();
|
||||
var node = {
|
||||
item: element,
|
||||
text: element.title,
|
||||
name: element.title,
|
||||
id: element.id,
|
||||
pid: 0,
|
||||
opened: false,
|
||||
selected: false,
|
||||
disabled: false,
|
||||
loading: false,
|
||||
children: [],
|
||||
label: {
|
||||
backgroundColor: color,
|
||||
},
|
||||
itemStyle: {
|
||||
color: color,
|
||||
},
|
||||
};
|
||||
// if (element.children >= 1) {
|
||||
// node.children = [];
|
||||
// }
|
||||
this.data[0].children.push(node);
|
||||
this.dataForTreeMapSetter(this.data);
|
||||
});
|
||||
}
|
||||
},
|
||||
// data(newValue){
|
||||
// console.log("🚀 ~ data ~ newValue:", newValue)
|
||||
|
||||
// },
|
||||
},
|
||||
computed: {
|
||||
...mapState(useResearchStore, ["researchTermsGetter"]),
|
||||
},
|
||||
methods: {
|
||||
...mapActions(useResearchStore, ["dataForTreeMapSetter"]),
|
||||
getNextColor() {
|
||||
// Get the color at the current index
|
||||
const color = this.colors[this.currentIndex];
|
||||
|
||||
// Update the index to the next color
|
||||
this.currentIndex = (this.currentIndex + 1) % this.colors.length;
|
||||
|
||||
return color;
|
||||
},
|
||||
// #region function Default for tree
|
||||
/**
|
||||
* دادههای لیست درخت را از API دریافت میکند.
|
||||
* @param {number} [parent=0] - شناسه والد برای دریافت فرزندان.
|
||||
* @param {boolean} [ischildren=false] - پرچمی برای نشان دادن دریافت گرههای فرزند.
|
||||
* @param {Object} [parentItem={}] - شیء آیتم والد.
|
||||
* @returns {Promise} - پاسخ API که شامل دادههای درخت است.
|
||||
*/
|
||||
getListTree(parent = 0, ischildren = false, parentItem = {}) {
|
||||
const payload = {
|
||||
projectid: this.newProjects?.id,
|
||||
parent: parent,
|
||||
sortby: "id",
|
||||
offset: 0,
|
||||
limit: 100,
|
||||
listtype: 0,
|
||||
};
|
||||
let url = researchApi.subject.list;
|
||||
return this.httpService.formDataRequest(url, payload).then((res) => {
|
||||
return res.data;
|
||||
});
|
||||
},
|
||||
/**
|
||||
* مدال افزودن گره فرزند را باز میکند.
|
||||
* @param {Object} parentNode - مدل گره والد.
|
||||
* @param {Object} node - مدل نمای گره.
|
||||
*/
|
||||
addChildNode(parentNode, node) {
|
||||
this.editingItem = node.model;
|
||||
this.editingNode = node;
|
||||
|
||||
this.openModal("FormAddChildrenToTree", " فرم ایجاد فرزند ");
|
||||
},
|
||||
|
||||
/**
|
||||
* یک گره را از درخت پس از تأیید حذف میکند.
|
||||
* @param {Object} vm - مدل نمای گره برای حذف.
|
||||
*/
|
||||
removeNode(vm) {
|
||||
mySwalConfirm({
|
||||
title: "هشدار!!!",
|
||||
html: `از حذف <b>${vm.model.text}</b> اطمینان دارید؟ `,
|
||||
icon: "warning",
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed) {
|
||||
this.editingItem = vm.model;
|
||||
this.editingNode = vm;
|
||||
this.getRemov(this.editingItem);
|
||||
if (this.editingItem.id !== undefined) {
|
||||
var index = this.editingNode.parentItem.indexOf(this.editingItem);
|
||||
this.editingNode.parentItem.splice(index, 1);
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* درخواست حذف یک آیتم از API را ارسال میکند.
|
||||
* @param {Object} item - آیتمی که باید حذف شود.
|
||||
*/
|
||||
getRemov(item) {
|
||||
const payload = {
|
||||
subjectid: item.id,
|
||||
projectid: this.newProjects?.id,
|
||||
listid: item.id,
|
||||
};
|
||||
let url = researchApi.subject.delete;
|
||||
this.httpService.postRequest(url, payload).then((res) => {
|
||||
mySwalToast({
|
||||
title: "موفق",
|
||||
html: "با موفقیت حذف شد",
|
||||
icon: "success",
|
||||
});
|
||||
});
|
||||
},
|
||||
/**
|
||||
* مدال ویرایش یک گره را باز میکند.
|
||||
* @param {Object} node - مدل نمای گره برای ویرایش.
|
||||
*/
|
||||
editNode(node) {
|
||||
this.editingItem = node.model;
|
||||
this.editingNode = node;
|
||||
this.openModal("FormEditToTree", " فرم ویرایش خصوصیت ");
|
||||
// this.editingNode = node;
|
||||
},
|
||||
/**
|
||||
* رویداد کلیک روی آیتم را مدیریت میکند و فرزندان را اگر قبلاً بارگیری نشده باشند بارگیری میکند.
|
||||
* @param {Object} nodeItem - آیتم گره کلیک شده.
|
||||
*/
|
||||
itemclick(nodeItem) {
|
||||
if (nodeItem.model.children.length >= 1) return;
|
||||
let parent = nodeItem.model;
|
||||
try {
|
||||
this.getListTree(parent.id, true, parent).then((list) => {
|
||||
list.forEach((element, index) => {
|
||||
var node = {
|
||||
item: element,
|
||||
text: element.title,
|
||||
name: element.title,
|
||||
id: element.id,
|
||||
pid: parent.id,
|
||||
opened: false,
|
||||
selected: false,
|
||||
disabled: false,
|
||||
loading: false,
|
||||
lineStyle: parent.lineStyle,
|
||||
label: parent.label,
|
||||
children: [],
|
||||
};
|
||||
|
||||
const nodeExists = parent.children.some(
|
||||
(child) => child.id === node.id
|
||||
);
|
||||
if (!nodeExists) {
|
||||
parent.children.push(node);
|
||||
}
|
||||
});
|
||||
});
|
||||
} catch (error) {
|
||||
console.error("Error fetching children nodes:", error);
|
||||
}
|
||||
},
|
||||
/**
|
||||
* رویداد تغییر وضعیت آیتم را مدیریت میکند.
|
||||
* @param {Object} data - دادههای آیتم تغییر وضعیت داده شده.
|
||||
*/
|
||||
itemtoggle(data) {
|
||||
},
|
||||
/**
|
||||
* آیتم فعال را تنظیم میکند و رویداد 'on-click' را ارسال میکند.
|
||||
* @param {Object} item - آیتمی که باید به عنوان فعال تنظیم شود.
|
||||
*/
|
||||
setActiveItem(item) {
|
||||
this.activeItem = item;
|
||||
this.$emit("on-click", item);
|
||||
},
|
||||
// #endregion
|
||||
|
||||
// #region function for modals
|
||||
|
||||
/**
|
||||
* مدال را میبندد و پرچم uploadForFirstTime را تنظیم مجدد میکند.
|
||||
*/
|
||||
closeModal() {
|
||||
$("#base-modal").modal("hide");
|
||||
|
||||
setTimeout(() => {
|
||||
this.uploadForFirstTime = false;
|
||||
}, 500);
|
||||
},
|
||||
/**
|
||||
* یک مدال با مؤلفه و عنوان مشخص باز میکند.
|
||||
* @param {string} componentName - نام مؤلفهای که باید در مدال بارگیری شود.
|
||||
* @param {string} title - عنوان مدال.
|
||||
*/
|
||||
openModal(componentName, title) {
|
||||
this.uploadForFirstTime = true;
|
||||
this.slotComponentName = componentName;
|
||||
this.modalTitle = title;
|
||||
|
||||
setTimeout(() => {
|
||||
$("#base-modal").modal({ backdrop: "static", keyboard: false }, "show");
|
||||
}, 500);
|
||||
},
|
||||
/**
|
||||
* یک آیتم جدید به درخت اضافه میکند.
|
||||
* @param {Object} item - آیتمی که باید اضافه شود.
|
||||
*/
|
||||
addNewItem(item) {
|
||||
// console.log("🚀 ~ addNewItem ~ item:", item);
|
||||
const payload = {
|
||||
id: undefined,
|
||||
listtype: 0,
|
||||
parent: 0,
|
||||
projectid: this.newProjects?.id,
|
||||
title: item,
|
||||
};
|
||||
let url = researchApi.subject.add;
|
||||
this.httpService.postRequest(url, payload).then((res) => {
|
||||
mySwalToast({
|
||||
title: "موفق",
|
||||
html: res.data.message,
|
||||
icon: "success",
|
||||
});
|
||||
res.data.forEach((element, index) => {
|
||||
var node = {
|
||||
item: element,
|
||||
text: element.title,
|
||||
name: element.title,
|
||||
id: element.id,
|
||||
pid: 0,
|
||||
opened: false,
|
||||
selected: false,
|
||||
disabled: false,
|
||||
loading: false,
|
||||
children: [],
|
||||
};
|
||||
|
||||
this.data[0].children.push(node);
|
||||
this.dataForTreeMapSetter(this.data);
|
||||
});
|
||||
});
|
||||
},
|
||||
/**
|
||||
* یک آیتم موجود در درخت را ویرایش میکند.
|
||||
* @param {string} item - عنوان جدید برای آیتم.
|
||||
*/
|
||||
edit(item) {
|
||||
this.editingItem.text = item;
|
||||
|
||||
const payload = {
|
||||
subjectid: this.editingItem.id,
|
||||
projectid: this.newProjects?.id,
|
||||
title: this.editingItem.text,
|
||||
};
|
||||
let url = researchApi.subject.edit;
|
||||
this.httpService.formDataRequest(url, payload).then((res) => {
|
||||
mySwalToast({
|
||||
title: "موفق",
|
||||
html: "تغییر نام با موفقیت انجام شد ",
|
||||
icon: "success",
|
||||
});
|
||||
});
|
||||
},
|
||||
/**
|
||||
* یک آیتم فرزند جدید به درخت اضافه میکند.
|
||||
* @param {Object} item - آیتم فرزند که باید اضافه شود.
|
||||
*/
|
||||
addNewChildren(item) {
|
||||
const payload = {
|
||||
projectid: this.newProjects?.id,
|
||||
parent: this.editingItem.id,
|
||||
listid: this.editingItem.id,
|
||||
listtype: 0,
|
||||
title: item,
|
||||
};
|
||||
let url = researchApi.subject.add;
|
||||
this.httpService.postRequest(url, payload).then((res) => {
|
||||
mySwalToast({
|
||||
title: "موفق",
|
||||
html: " با موفقیت انجام شد ",
|
||||
icon: "success",
|
||||
});
|
||||
|
||||
res.data.forEach((element, index) => {
|
||||
var node = {
|
||||
item: element,
|
||||
text: element.title,
|
||||
name: element.title,
|
||||
id: element.id,
|
||||
pid: 0,
|
||||
opened: false,
|
||||
selected: false,
|
||||
disabled: false,
|
||||
loading: false,
|
||||
children: [],
|
||||
};
|
||||
|
||||
this.editingItem.children.push(node);
|
||||
});
|
||||
});
|
||||
},
|
||||
// #endregion
|
||||
// #region function draggable for tree
|
||||
|
||||
/**
|
||||
* قبل از انداختن آیتم، رویداد را مدیریت میکند.
|
||||
* @param {Object} node - گرهای که آیتم به آن انداخته میشود.
|
||||
* @param {Object} item - آیتمی که درگ شده است.
|
||||
* @param {Object} draggedItem - آیتمی که در حال درگ شدن است.
|
||||
* @param {Object} e - رویداد.
|
||||
*/
|
||||
onItemDropBefore(node, item, draggedItem, e) {
|
||||
this.itemclick(node);
|
||||
},
|
||||
/**
|
||||
* رویداد انداختن آیتم را مدیریت میکند.
|
||||
* @param {Object} node - گرهای که آیتم به آن انداخته شده است.
|
||||
* @param {Object} item - آیتمی که درگ شده است.
|
||||
* @param {Object} draggedItem - آیتمی که در حال درگ شدن است.
|
||||
* @param {Object} e - رویداد.
|
||||
*/
|
||||
onItemDrop(node, item, draggedItem, e) {
|
||||
const cloneId = draggedItem.id;
|
||||
// const fromId = draggedItem.id;
|
||||
const toId = item?.id;
|
||||
|
||||
this.moveFromFolderToFolder(cloneId, toId);
|
||||
},
|
||||
/**
|
||||
* آیتم را از یک فولدر به فولدر دیگر منتقل میکند.
|
||||
* @param {number} cloneId - شناسه آیتمی که باید منتقل شود.
|
||||
* @param {number} toId - شناسه فولدر مقصد.
|
||||
*/
|
||||
moveFromFolderToFolder(cloneId, toId) {
|
||||
const formData = {
|
||||
id: cloneId,
|
||||
newparent: toId ?? 0,
|
||||
projectid: this.researchTermsGetter?.id,
|
||||
};
|
||||
|
||||
this.moveItem(formData);
|
||||
},
|
||||
/**
|
||||
* آیتم را جابجا میکند.
|
||||
* @param {Object} formData - دادههای فرم برای جابجایی آیتم.
|
||||
*/
|
||||
moveItem(formData) {
|
||||
let url = listUrl() + researchApi.subject.move;
|
||||
|
||||
this.httpService
|
||||
.formDataRequest(url, formData)
|
||||
.then((res) => {
|
||||
// console.log("🚀 ~ .then ~ res:", res);
|
||||
mySwalToast({
|
||||
title: "تبریک",
|
||||
html: res.message,
|
||||
icon: "success",
|
||||
});
|
||||
})
|
||||
.catch((err) => {
|
||||
mySwalToast({
|
||||
title: "خطا!!!",
|
||||
html: err?.message,
|
||||
icon: "error",
|
||||
});
|
||||
});
|
||||
},
|
||||
onItemDragStart() {},
|
||||
onItemDragEnd() {},
|
||||
// #endregion
|
||||
moveToParent(node) {
|
||||
let cloneId = node.model.id;
|
||||
|
||||
this.moveFromFolderToRoot(cloneId);
|
||||
},
|
||||
moveUp() {},
|
||||
moveDown() {},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.item-content {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.button-group {
|
||||
display: none;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.tree-item:hover .button-group {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.tree-open {
|
||||
.tree-children {
|
||||
.tree-anchor {
|
||||
.tree-item {
|
||||
width: 150px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.tree-list-container {
|
||||
width: 100%;
|
||||
// height: calc(100vh - 10em);
|
||||
// overflow-y: auto;
|
||||
.tree-item {
|
||||
width: 220px;
|
||||
position: relative;
|
||||
&:hover {
|
||||
color: var(--primary-color); /* رنگ پسزمینه هاور سفارشی */
|
||||
}
|
||||
|
||||
.icon {
|
||||
&:hover {
|
||||
cursor: pointer;
|
||||
color: var(--primary-color);
|
||||
}
|
||||
}
|
||||
}
|
||||
.active-item {
|
||||
background-color: var(--hover-color) !important;
|
||||
}
|
||||
.tree {
|
||||
text-align: right;
|
||||
height: calc(100vh - 10em);
|
||||
overflow-y: auto;
|
||||
scrollbar-width: thin;
|
||||
scrollbar-color: #ccc #eee;
|
||||
}
|
||||
.v-jstree {
|
||||
}
|
||||
}
|
||||
</style>
|
443
components/research/components/RightPanel.vue
Normal file
443
components/research/components/RightPanel.vue
Normal file
|
@ -0,0 +1,443 @@
|
|||
<template>
|
||||
<div
|
||||
class="menu-bar__content home-list p-3"
|
||||
:class="[{ mini: sidebarListStatusGetter }]"
|
||||
>
|
||||
<div class="home-list__content" :class="{ loading: fetchingData }">
|
||||
<div class="content scroll-needed">
|
||||
<the-content-loading
|
||||
class="absolute-positioning"
|
||||
v-if="fetchingData"
|
||||
></the-content-loading>
|
||||
|
||||
<div v-else>
|
||||
<form action="" class="my-form">
|
||||
<div class="prodigy-sidebar c0177">
|
||||
<!-- <header class="prodigy-sidebar-title c0179">
|
||||
<a href="https://prodi.gy"
|
||||
><svg
|
||||
aria-label="Prodigy"
|
||||
viewBox="0 0 540 158"
|
||||
width="100"
|
||||
height="29"
|
||||
>
|
||||
<path
|
||||
d="M70.6 48.6c7 7.3 10.5 17 10.5 29.2s-3.3 22-10.4 29.2c-7 7.3-16 11-27 11-9.4 0-16.8-2.6-21.7-8v44.7H0V39h20.7v8c4.8-6.3 12.4-9.5 23-9.5 11 0 20 3.7 27 11zM22 76v3.6c0 12 7.2 19.8 18.2 19.8 11.2 0 18.7-8 18.7-21.6S51.3 56.2 40 56.2C29.2 56.2 22 64 22 76zM133.8 59.4c-12.6 0-20.5 7-20.5 17.8v39.3h-22V39h21v8.8c4-6.4 11.3-9.6 21.4-9.6v21.2zM209.5 107c-7.6 7.4-17.5 11.2-29.5 11.2s-22-3.8-29.7-11c-7.6-7.6-11.5-17.3-11.5-29.3 0-12.2 4-22 11.5-29.3 7.8-7.3 17.7-11 29.7-11s22 3.7 29.5 11c7.8 7.3 11.7 17 11.7 29.2 0 11.8-4 21.6-11.7 29zM180 56.3c-5.7 0-10.3 2-13.8 5.8s-5.2 9-5.2 15.7c0 6.7 1.8 12 5.2 15.7 3.4 3.8 8 5.7 13.8 5.7s10.3-1.8 13.8-5.6 5.2-9 5.2-15.7c0-6.8-1.8-12-5.2-15.7-3.5-3.8-8-5.8-13.8-5.8zM313 116.5h-20.5v-8c-4.4 5.6-12.7 9.7-23 9.7-11 0-20-3.8-27-11-7-7.5-10.5-17.2-10.5-29.4s3.5-22 10.3-29.2c7-7.3 16-11 27-11 9.7 0 17 2.6 22 8V0H313v116.5zm-58.8-38.7c0 13.6 7.5 21.4 18.7 21.4 10.8 0 18.2-7.3 18.2-19.8V76c0-12.2-7.3-19.8-18.3-19.8-11.3 0-18.8 8-18.8 21.6zM354 13.6c0 3.6-1.2 6.8-3.8 9.3-5 4.8-13.6 4.8-18.6 0C323.2 15.3 330-.3 341 .3c7.3 0 13 6 13 13.2zm-2 103h-22V39h22v77.5zM425 47v-8h20.6v80.4c0 11.2-3.6 20-10.6 26.8-7 6.7-16.6 10-28.5 10-23.4 0-37-11.4-40-29.8l21.8-.8c1 7.6 7.6 12 17.4 12 11.2 0 18-5.8 18-16.6v-11c-5 5.4-12.4 8-21.8 8-11 0-20-3.7-27-11s-10.4-17-10.4-29.2 3.5-22 10.3-29.2c7-7.3 16-11 27-11 10.6 0 18.3 3 23 9.5zM387 78c0 13.6 7.5 21.6 18.7 21.6 11 0 18.3-7.6 18.3-19.8V76c0-12.2-7.3-19.8-18.3-19.8-11.2 0-18.7 8-18.7 21.6zM488.8 154.8H465l19.8-45L454.5 39h24l18 46.2L514 39h24.3l-49.7 115.8z"
|
||||
></path>
|
||||
</svg>
|
||||
</a>
|
||||
<div class="c0180"></div>
|
||||
</header> -->
|
||||
<div class="prodigy-content">
|
||||
<section class="c0197">
|
||||
<div class="c01104">
|
||||
<div class="c01111">Example</div>
|
||||
<select class="c01112">
|
||||
<option value="ner_manual" id="ner_manual">
|
||||
Named Entities (manual)
|
||||
</option>
|
||||
<option value="ner_chars" id="ner_chars">
|
||||
Named Entities (character-based)
|
||||
</option>
|
||||
<option value="ner" id="ner">
|
||||
Named Entities (binary)
|
||||
</option>
|
||||
<option value="spans_manual" id="spans_manual">
|
||||
Span Categorization (overlapping)
|
||||
</option>
|
||||
<option value="textcat_multi" id="textcat_multi">
|
||||
Text Classification (multiple)
|
||||
</option>
|
||||
<option value="textcat" id="textcat">
|
||||
Text Classification (binary)
|
||||
</option>
|
||||
<option value="pos_manual" id="pos_manual">
|
||||
POS Tagging (manual)
|
||||
</option>
|
||||
<option value="dep" id="dep">
|
||||
Dependency Parsing (manual)
|
||||
</option>
|
||||
<option value="rel_spans" id="rel_spans">
|
||||
Relations & Spans (manual)
|
||||
</option>
|
||||
<option value="rel_coref" id="rel_coref">
|
||||
Relations (coreference)
|
||||
</option>
|
||||
<option value="rel_bio" id="rel_bio">
|
||||
Relations (biomedical)
|
||||
</option>
|
||||
<option value="image_manual" id="image_manual">
|
||||
Image (manual)
|
||||
</option>
|
||||
<option value="imageseg" id="imageseg">
|
||||
Image (binary)
|
||||
</option>
|
||||
<option value="image_caption" id="image_caption">
|
||||
Image (captioning)
|
||||
</option>
|
||||
<option value="audio_manual" id="audio_manual">
|
||||
Audio (manual)
|
||||
</option>
|
||||
<option value="video" id="video">Video (manual)</option>
|
||||
<option value="audio_transcript" id="audio_transcript">
|
||||
Audio (transcript)
|
||||
</option>
|
||||
<option value="textchoice" id="textchoice">
|
||||
Single Choice (Text)
|
||||
</option>
|
||||
<option value="imgchoice" id="imgchoice">
|
||||
Multiple Choice (Image)
|
||||
</option>
|
||||
<option value="diff" id="diff">Diff</option>
|
||||
<option value="html" id="html">Custom HTML</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="c01104">
|
||||
<div class="c01111">Theme</div>
|
||||
<select class="c01112">
|
||||
<option value="basic" id="basic">Basic</option>
|
||||
<option value="dark" id="dark">Dark</option>
|
||||
<option value="eighties" id="eighties">Eighties</option>
|
||||
<option value="spacy" id="spacy">spaCy</option>
|
||||
<option value="brutalist" id="brutalist">
|
||||
Brutalist
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
</section>
|
||||
<section class="c0197">
|
||||
<h3 class="c0189">Project Info</h3>
|
||||
<div class="c01104">
|
||||
<div class="c01111">Dataset</div>
|
||||
prodigy_demo
|
||||
</div>
|
||||
<div class="c01104">
|
||||
<div class="c01111">View ID</div>
|
||||
ner_manual
|
||||
</div>
|
||||
</section>
|
||||
<section class="c0197">
|
||||
<h3 class="c0189">Progress</h3>
|
||||
<div class="c01104">
|
||||
<div class="c01111">This session</div>
|
||||
0
|
||||
</div>
|
||||
<div class="c01104">
|
||||
<div class="c01111">Total</div>
|
||||
0
|
||||
</div>
|
||||
<div class="c0194">
|
||||
<progress class="c0195" max="100" value="0"></progress>
|
||||
<div class="c0196">0%</div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="c01113 c01114">
|
||||
<svg viewBox="0 0 225 10" width="225" height="10"></svg>
|
||||
</div>
|
||||
<div class="c01104">
|
||||
<div class="c01111">accept</div>
|
||||
0
|
||||
</div>
|
||||
<div class="c01104">
|
||||
<div class="c01111">reject</div>
|
||||
0
|
||||
</div>
|
||||
<div class="c01104">
|
||||
<div class="c01111">ignore</div>
|
||||
0
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="c0197 c0198">
|
||||
<h3 class="c0189 c0190">History</h3>
|
||||
<span></span>
|
||||
</section>
|
||||
<footer class="c0188">
|
||||
<a href="https://explosion.ai" target="_blank"
|
||||
>© 2017-2024 Explosion</a
|
||||
><a href="https://prodi.gy" target="_blank"
|
||||
>(<strong>Prodigy</strong> v1.11)</a
|
||||
>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<!-- <div v-if="groups && groups.length"> </div>
|
||||
<no-data v-else></no-data> -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<base-modal
|
||||
v-if="showInvitePostModal"
|
||||
modalSize="modal-lg"
|
||||
modalTitle="فرم ایجاد پست دعوت نامه"
|
||||
:hasFooter="false"
|
||||
@close="closeAndResetInvitePostModal"
|
||||
>
|
||||
</base-modal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
// import { dragDropMoveMixin } from "~/list/mixins/dragDropMoveMixin";
|
||||
// import { searchMixin } from "~/list/mixins/searchMixin";
|
||||
import aiToolsApi from "~/apis/aiToolsApi";
|
||||
import { mapState, mapActions } from "pinia";
|
||||
|
||||
import menu from "~/json/research/json/menu.json";
|
||||
|
||||
export default {
|
||||
|
||||
props: {
|
||||
// statusPagHedear: {
|
||||
// default: 1,
|
||||
// type: Number,
|
||||
// },
|
||||
},
|
||||
watch: {
|
||||
$route: {
|
||||
handler: function (to) {},
|
||||
deep: true,
|
||||
// immediate: true,
|
||||
},
|
||||
},
|
||||
beforeMount() {
|
||||
this.httpService = new HttpService(
|
||||
import.meta.env.VITE_BASE_URL
|
||||
// headers
|
||||
);
|
||||
|
||||
// window.addEventListener("load", this.resizeAction);
|
||||
// window.addEventListener("resize", this.resizeAction);
|
||||
},
|
||||
mounted() {
|
||||
// this.getGroupTypes();
|
||||
},
|
||||
beforeDestroy() {
|
||||
// window.removeEventListener("load", this.resizeAction);
|
||||
// window.removeEventListener("resize", this.resizeAction);
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
// #region mehdi
|
||||
|
||||
showMainpag: true,
|
||||
menu: menu,
|
||||
|
||||
// #endregion
|
||||
|
||||
typingTimer: 0,
|
||||
doneTypingInterval: 500,
|
||||
searchText: "",
|
||||
|
||||
searchType: "groups",
|
||||
showAddUserForm: false,
|
||||
busy: false,
|
||||
foundGroups: [],
|
||||
showUploadAvatarForm: false,
|
||||
showGroupSearchForm: false,
|
||||
|
||||
groupsExpanded: false,
|
||||
showNewGroupForm: false,
|
||||
hasImage: false,
|
||||
imageUrl: undefined,
|
||||
uploading: false,
|
||||
|
||||
selectedUser: {},
|
||||
foundUsers: [],
|
||||
isLoading: false,
|
||||
showUserSearchForm: false,
|
||||
|
||||
selectedGroup: undefined,
|
||||
commonContextMenu: [],
|
||||
|
||||
fetchingData: false,
|
||||
users: [],
|
||||
prevSelectedItemIndex: 0,
|
||||
prevParentSelectedItemIndex: 0,
|
||||
|
||||
convertGroupIntegerToString: {
|
||||
groups: 1,
|
||||
lobbies: 2,
|
||||
privates: 3,
|
||||
},
|
||||
convertGroupStringToInteger: {
|
||||
1: "groups",
|
||||
2: "lobbies",
|
||||
3: "privates",
|
||||
},
|
||||
showForm: false,
|
||||
formType: 1,
|
||||
form: {
|
||||
id: undefined,
|
||||
title: null,
|
||||
desc: null,
|
||||
type: 1,
|
||||
is_public: 1,
|
||||
message_state: 1,
|
||||
members: [],
|
||||
parent_id: undefined,
|
||||
},
|
||||
collapseAll: false,
|
||||
groups: [],
|
||||
showReplaceInput: true,
|
||||
httpService: undefined,
|
||||
authHttpService: undefined,
|
||||
list: [],
|
||||
|
||||
pagination: {
|
||||
pages: 0,
|
||||
total: 0,
|
||||
page: 1,
|
||||
offset: 0, // page * per_page
|
||||
limit: 15, //per_page
|
||||
},
|
||||
isRedirectedFromOtherSystems: false,
|
||||
groupId: undefined,
|
||||
messageId: undefined,
|
||||
|
||||
groupModel: {
|
||||
id: undefined,
|
||||
title: null,
|
||||
desc: null,
|
||||
avatar: null,
|
||||
user: undefined,
|
||||
icon_type: 1,
|
||||
type: 0,
|
||||
parent_id: 0,
|
||||
refrence_id: 0,
|
||||
subject_id: 0,
|
||||
template_key: null,
|
||||
admins: [],
|
||||
created_at: undefined,
|
||||
message_state: 0,
|
||||
live_link: null,
|
||||
live_button_pic: null,
|
||||
live_start_time: null,
|
||||
live_duration: null,
|
||||
message_expire_time: 0,
|
||||
file_type: 0,
|
||||
last_message: {
|
||||
id: undefined,
|
||||
text: null,
|
||||
user: undefined,
|
||||
message_type: undefined,
|
||||
date_c: undefined,
|
||||
date_e: undefined,
|
||||
},
|
||||
attachment: {
|
||||
name: null,
|
||||
url: null,
|
||||
ext: null,
|
||||
size: undefined,
|
||||
length: 0,
|
||||
width: 0,
|
||||
height: 0,
|
||||
},
|
||||
},
|
||||
showSearch: false,
|
||||
showInvitePostModal: false,
|
||||
groupToInvite: {},
|
||||
|
||||
inviteLinkId: null,
|
||||
redirectViaInviteLink: false,
|
||||
searchInCurrentGroup: false,
|
||||
|
||||
groupfilters: [],
|
||||
isGroupFilterActive: false, // toggle group filter
|
||||
selectedGroupFilter: [], // group filter items.
|
||||
// showSidebarInMobile: false, // close the panel.
|
||||
};
|
||||
},
|
||||
|
||||
computed: {
|
||||
...mapState([
|
||||
"isSidebarCollapsed",
|
||||
"getForwardItem",
|
||||
"userPermisionGetter",
|
||||
"getPanelStatus",
|
||||
"sidebarListStatusGetter",
|
||||
]),
|
||||
...mapState("list", ["listGetter"]),
|
||||
|
||||
},
|
||||
methods: {
|
||||
...mapActions([
|
||||
"TOGGLE_PANEL",
|
||||
"checkPermissions",
|
||||
"SET_SIDEBAR_LIST_STATUS",
|
||||
]),
|
||||
...mapActions("list", ["SET_LIST"]),
|
||||
},
|
||||
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.c0177 {
|
||||
// width: 260px;
|
||||
color: #fff;
|
||||
// z-index: 30;
|
||||
// transform: translateX(-100%);
|
||||
font-size: 14px;
|
||||
background: #54606e;
|
||||
|
||||
font-family: "Lato", "Trebuchet MS", Roboto, Helvetica, Arial, sans-serif;
|
||||
border-right: none;
|
||||
transition: transform 0.2s ease;
|
||||
min-height: 90dvh;
|
||||
max-height: 90dvh;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
padding:2em 0;
|
||||
}
|
||||
|
||||
.c0179 {
|
||||
flex: 0 0 50px;
|
||||
display: flex;
|
||||
padding: 15px 20px;
|
||||
background: #384451;
|
||||
align-items: center;
|
||||
margin-bottom: 20px;
|
||||
justify-content: space-between;
|
||||
}
|
||||
.c0197 {
|
||||
padding: 0 17.5px 20px 17.5px;
|
||||
}
|
||||
.c0197:not(:last-child) {
|
||||
border-bottom: 1px solid #384451;
|
||||
margin-bottom: 17.5px;
|
||||
}
|
||||
.c01104 {
|
||||
display: flex;
|
||||
text-align: right;
|
||||
line-height: 1.5;
|
||||
justify-content: space-between;
|
||||
}
|
||||
.c01111 {
|
||||
color: #b9b9b9;
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
font-family: "Roboto Condensed", "Arial Narrow", sans-serif;
|
||||
margin-right: 10px;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
.c01112 {
|
||||
color: #444;
|
||||
width: 130px;
|
||||
height: 22px;
|
||||
border: none;
|
||||
padding: 0 2.5px;
|
||||
font-size: 14px;
|
||||
background: #fff;
|
||||
font-family: inherit;
|
||||
border-radius: 4px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.c0197:not(:last-child) {
|
||||
border-bottom: 1px solid #384451;
|
||||
margin-bottom: 17.5px;
|
||||
}
|
||||
</style>
|
579
components/research/components/SubjectForm.vue
Normal file
579
components/research/components/SubjectForm.vue
Normal file
|
@ -0,0 +1,579 @@
|
|||
<template>
|
||||
<div class="position-relative">
|
||||
<form @submit.prevent="save()" class="p-3">
|
||||
<!-- <div class="form-row p-0">
|
||||
<div class="col d-flex align-items-center">
|
||||
<div v-for="(metaItem, index) in metaItems">
|
||||
<span :key="'meta' + metaItem.id" class="title text__12">
|
||||
{{ metaItem.title }}
|
||||
</span>
|
||||
<span
|
||||
style="color: blue"
|
||||
v-if="index < metaItems.length - 1"
|
||||
class="tavasi tavasi-Component-22--1"
|
||||
></span>
|
||||
</template>
|
||||
</div>
|
||||
</div> -->
|
||||
<div class="form-row form-group p-0">
|
||||
<label class="col-md-4" for="title">فهرست موضوعی</label>
|
||||
<div class="col-md-8">
|
||||
<div class="row form-group">
|
||||
<select
|
||||
@change="projectChanged"
|
||||
v-model="subjectProjectId"
|
||||
class="form-control col-md-9"
|
||||
>
|
||||
<option :value="undefined" selected disabled>
|
||||
انتخاب فهرست موضوعی
|
||||
</option>
|
||||
|
||||
<option v-for="item in projects" :key="item.id" :value="item.id">
|
||||
{{ item.title }}
|
||||
</option>
|
||||
</select>
|
||||
|
||||
<div class="col"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-row form-group p-0" v-if="comboListCount">
|
||||
<label class="col-md-4" for="subject">موضوع</label>
|
||||
<div class="col-md-8">
|
||||
<div
|
||||
v-for="(comboItem, key) in comboListCount"
|
||||
:key="key"
|
||||
class="row d-flex align-items-center form-group"
|
||||
>
|
||||
<select
|
||||
id="subject"
|
||||
name="subject"
|
||||
class="form-control col-md-9"
|
||||
@change="getSubjects($event, comboItem)"
|
||||
v-model="arrayOfSubjectId[key]"
|
||||
>
|
||||
<option :value="undefined" selected disabled>انتخاب موضوع</option>
|
||||
|
||||
<option
|
||||
v-for="(item, key) in subjects[key]"
|
||||
:key="item.id"
|
||||
:value="item.title + '#' + item.id"
|
||||
>
|
||||
{{ item.title }}
|
||||
({{ item.children }})
|
||||
</option>
|
||||
</select>
|
||||
|
||||
<!-- <div class="col-md-4 remov_button "> -->
|
||||
<div class="col-auto d-flex">
|
||||
<button-component
|
||||
title="باز کردن فرم ایجاد موضوع جدید"
|
||||
v-if="key == lastComboItem"
|
||||
classes=" btn btn-default popUp-tab__clear button_giveup px-1"
|
||||
@click="openNewSubjectForm(comboItem)"
|
||||
buttonText=""
|
||||
>
|
||||
<span class="tavasi tavasi-Component-133--1"></span>
|
||||
</button-component>
|
||||
|
||||
<button-component
|
||||
v-if="key == lastComboItem && comboListCount > 1"
|
||||
classes=" btn btn-default popUp-tab__clear button_giveup px-1"
|
||||
@click="removeSubject(key)"
|
||||
buttonText=""
|
||||
>
|
||||
<span class="tavasi tavasi-Component-295--1"></span>
|
||||
</button-component>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="form-row form-group p-0 submit_button d-flex justify-content-sm-end"
|
||||
>
|
||||
<button-component
|
||||
type="submit"
|
||||
classes="btn-outline-primary"
|
||||
buttonText="افزودن"
|
||||
:buttonLoading="buttonLoading"
|
||||
@click="save()"
|
||||
></button-component>
|
||||
</div>
|
||||
|
||||
<div class="form-row form-group p-0">
|
||||
<!-- <the-content-loading v-if="fetchingData"></the-content-loading> -->
|
||||
|
||||
<!-- <template v-else> -->
|
||||
<my-table
|
||||
height="auto"
|
||||
:showHeaderSortButton="false"
|
||||
:hasPagination="false"
|
||||
:fetchingData="fetchingData"
|
||||
:items="itemSubject"
|
||||
:tableActions="tableActions"
|
||||
:tableColumns="tableColumns"
|
||||
:paginationInfo="pagination"
|
||||
:sortingInfo="sorting"
|
||||
@delete-table-item="deleteItem"
|
||||
/>
|
||||
<!-- </template> -->
|
||||
</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
|
||||
title="لغو"
|
||||
@click.prevent="$emit('close-modal')"
|
||||
class="popUp-tab__clear btn"
|
||||
type="button"
|
||||
data-dismiss="modal"
|
||||
>
|
||||
لغو
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div> -->
|
||||
</form>
|
||||
|
||||
<div class="new-subject-form-container" v-if="showSubjectForm">
|
||||
<title-form
|
||||
:selectedItem="{}"
|
||||
@close-modal="closeNewSubjectForm"
|
||||
@save-title="addNewItemToCombo"
|
||||
></title-form>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
import repoApi from "~/apis/repoApi";
|
||||
import listApis from "~/apis/listApi";
|
||||
import { mapState, mapActions } from "pinia";
|
||||
import { useResearchStore } from "~/stores/researchStore";
|
||||
|
||||
export default {
|
||||
props: {
|
||||
metaItems: {
|
||||
default() {
|
||||
return [];
|
||||
},
|
||||
},
|
||||
// called from jahat entity list subjecting.
|
||||
projectTagsName: {
|
||||
default: undefined,
|
||||
},
|
||||
},
|
||||
emits: ["update-list", "close-modal", "delete-item"],
|
||||
mounted() {
|
||||
this.httpService = new HttpService(import.meta.env.VITE_BASE_URL);
|
||||
this.httpServiceJahat = new HttpService(
|
||||
import.meta.env.VITE_REPO_BASE_URL + this.researchActiveSchemaGetter?.key
|
||||
);
|
||||
this.httpServiceList = new HttpService(import.meta.env.VITE_LIST_BASE_URL);
|
||||
|
||||
this.getProjects();
|
||||
if (
|
||||
this.selectedItemGetter?.subject ||
|
||||
this.selectedItemGetter?._source?.subject
|
||||
)
|
||||
this.itemSubject =
|
||||
this.selectedItemGetter.subject ??
|
||||
this.selectedItemGetter?._source?.subject;
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
showSubjectForm: false,
|
||||
tableActions: [
|
||||
{
|
||||
showOutside: true,
|
||||
|
||||
show: true,
|
||||
icon: "tavasi tavasi-Component-295--1",
|
||||
title: "حذف",
|
||||
to: {
|
||||
name: "undefined",
|
||||
},
|
||||
selected: false,
|
||||
disabled: false,
|
||||
howToOpen: "",
|
||||
href: "",
|
||||
class: "delete-btn",
|
||||
action: "delete-table-item",
|
||||
// can: "subject-",
|
||||
},
|
||||
],
|
||||
tableColumns: [
|
||||
{
|
||||
key: "title",
|
||||
title: "عنوان",
|
||||
},
|
||||
{
|
||||
key: "path",
|
||||
title: "مسیر",
|
||||
},
|
||||
],
|
||||
sorting: {
|
||||
sortby: "created",
|
||||
sortorder: undefined, // asc | none
|
||||
},
|
||||
pagination: {
|
||||
pages: 0,
|
||||
total: 0,
|
||||
page: 1,
|
||||
offset: 0, // page * per_page
|
||||
limit: 100, //per_page
|
||||
},
|
||||
httpService: undefined,
|
||||
httpServiceList: undefined,
|
||||
httpServiceJahat: undefined,
|
||||
fetchingData: false,
|
||||
itemSubject: [],
|
||||
subjectProjectId: undefined,
|
||||
projects: [],
|
||||
comboListCount: 0,
|
||||
arrayOfSubjectId: [],
|
||||
subjects: {},
|
||||
buttonLoading: false,
|
||||
lastSubjectSelected: undefined,
|
||||
|
||||
selectedItemClone: {
|
||||
id: undefined,
|
||||
title: "",
|
||||
number: "",
|
||||
resource: "",
|
||||
date_text: "",
|
||||
text: "",
|
||||
projectid: this.subjectProjectId,
|
||||
item_type: "text",
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState("list", ["selectedProjectGetter", "selectedItemGetter"]),
|
||||
...mapState(useResearchStore, ["researchActiveSchemaGetter"]),
|
||||
lastComboItem() {
|
||||
return this.comboListCount - 1;
|
||||
},
|
||||
},
|
||||
|
||||
methods: {
|
||||
...mapActions("list", ["SET_SELECTED_PROJECT"]),
|
||||
|
||||
removeSubject(index) {
|
||||
this.arrayOfSubjectId.splice(index, 1);
|
||||
this.comboListCount--;
|
||||
},
|
||||
|
||||
getProjects() {
|
||||
const payload = {
|
||||
isown: 3,
|
||||
type: 3,
|
||||
tags: "term",
|
||||
...this.sorting,
|
||||
...this.pagination,
|
||||
};
|
||||
|
||||
this.httpServiceList
|
||||
.formDataRequest(listApis.projects.list, payload)
|
||||
.then((response) => {
|
||||
this.projects = response.data;
|
||||
|
||||
this.subjectProjectId = this.projects[0].id;
|
||||
this.SET_SELECTED_PROJECT(this.projects[0]);
|
||||
|
||||
this.getSubjects(0, 0);
|
||||
|
||||
// this.getItemSubject();
|
||||
});
|
||||
},
|
||||
projectChanged() {
|
||||
this.comboListCount = 0;
|
||||
this.arrayOfSubjectId = [];
|
||||
this.subjects = {};
|
||||
|
||||
this.getSubjects(0, 0);
|
||||
},
|
||||
|
||||
getSubjects(ev, index) {
|
||||
let parentid = 0;
|
||||
|
||||
this.lastSubjectSelected = undefined;
|
||||
if (typeof ev == "object") {
|
||||
let value = ev.target.value;
|
||||
let items = value.split("#");
|
||||
|
||||
this.lastSubjectSelected = {
|
||||
id: items[1],
|
||||
title: items[0],
|
||||
};
|
||||
|
||||
parentid = items[1];
|
||||
}
|
||||
|
||||
const payload = {
|
||||
projectid: this.subjectProjectId,
|
||||
parent: parentid,
|
||||
sortby: "id",
|
||||
offset: 0,
|
||||
limit: 100,
|
||||
};
|
||||
|
||||
this.httpServiceList
|
||||
.formDataRequest(listApis.subject.list, payload)
|
||||
.then((response) => {
|
||||
if (response.data.length) {
|
||||
this.subjects[index] = response.data;
|
||||
this.comboListCount = ++index;
|
||||
this.arrayOfSubjectId = this.arrayOfSubjectId.slice(0, index);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
getItemSubject() {
|
||||
if (this.fetchingData) return;
|
||||
this.fetchingData = true;
|
||||
|
||||
const payload = {
|
||||
projectid: this.selectedProjectGetter?.id,
|
||||
id: this.selectedItemGetter.id,
|
||||
sortby: "id",
|
||||
offset: 0,
|
||||
limit: 100,
|
||||
};
|
||||
|
||||
this.httpServiceJahat
|
||||
.formDataRequest(repoApi.item.subject, payload)
|
||||
.then((response) => {
|
||||
if (response.data.length) {
|
||||
{
|
||||
const myResponse = structuredClone(response.data);
|
||||
myResponse.forEach((element) => {
|
||||
const stringPath = element.path.map((mapItem) => mapItem.title);
|
||||
element.path = stringPath.join("/");
|
||||
});
|
||||
|
||||
this.itemSubject = myResponse;
|
||||
}
|
||||
} else this.itemSubject = [];
|
||||
|
||||
this.fetchingData = false;
|
||||
})
|
||||
.catch(() => (this.fetchingData = false));
|
||||
},
|
||||
save() {
|
||||
if (this.buttonLoading) return;
|
||||
this.buttonLoading = true;
|
||||
|
||||
const formData = {
|
||||
id: this.selectedItemGetter?._id,
|
||||
subject_id: this.lastSubjectSelected?.id,
|
||||
subject_title: this.lastSubjectSelected?.title,
|
||||
};
|
||||
|
||||
if (formData.subject_id === undefined) {
|
||||
mySwalToast({
|
||||
title: "موضوع انتخاب نشده است.",
|
||||
html: null,
|
||||
icon: "error",
|
||||
});
|
||||
this.buttonLoading = false;
|
||||
return;
|
||||
}
|
||||
|
||||
let url =
|
||||
repoUrl() +
|
||||
"public/" +
|
||||
this.researchActiveSchemaGetter?.key +
|
||||
"/" +
|
||||
repoApi.subject.add;
|
||||
|
||||
this.httpService
|
||||
.formDataRequest(url, formData)
|
||||
.then((response) => {
|
||||
this.itemSubject.push({
|
||||
id: formData.subject_id,
|
||||
title: formData?.subject_title,
|
||||
});
|
||||
|
||||
mySwalToast({
|
||||
title: response.message,
|
||||
html: null,
|
||||
icon: "success",
|
||||
});
|
||||
|
||||
// setTimeout(() => {
|
||||
// this.getItemSubject();
|
||||
// }, 500);
|
||||
})
|
||||
.catch((err) => {
|
||||
// mySwalToast({
|
||||
// title: err.response.data.message,
|
||||
// html: null,
|
||||
// icon: "error",
|
||||
// });
|
||||
})
|
||||
.finally(() => {
|
||||
this.buttonLoading = false;
|
||||
});
|
||||
},
|
||||
|
||||
deleteItem(tableRowItemIndex) {
|
||||
const data = {
|
||||
id: this.selectedItemGetter?._id,
|
||||
subject_id: this.itemSubject[tableRowItemIndex].id,
|
||||
subject_title: this.itemSubject[tableRowItemIndex].title,
|
||||
};
|
||||
|
||||
mySwalConfirm({
|
||||
title: "هشدار",
|
||||
html: "از حذف رابطه موضوع مطمئن هستید؟",
|
||||
icon: "warning",
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed) {
|
||||
const url =
|
||||
repoUrl() +
|
||||
"public/" +
|
||||
this.researchActiveSchemaGetter.key +
|
||||
"/" +
|
||||
repoApi.subject.delete;
|
||||
|
||||
this.httpService.formDataRequest(url, data).then((res) => {
|
||||
this.itemSubject.splice(tableRowItemIndex, 1);
|
||||
|
||||
mySwalToast({
|
||||
title: res.message,
|
||||
html: undefined,
|
||||
icon: "success",
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
closeNewSubjectForm() {
|
||||
this.showSubjectForm = false;
|
||||
},
|
||||
openNewSubjectForm(comboItem) {
|
||||
this.showSubjectForm = true;
|
||||
},
|
||||
addNewItemToCombo(item) {
|
||||
const payload = {
|
||||
title: item.title,
|
||||
listtype: this.listTypeId ?? 0,
|
||||
projectid: this.selectedProjectGetter?.id,
|
||||
parent: this.lastSubjectSelected?.id,
|
||||
};
|
||||
|
||||
this.httpServiceList
|
||||
.formDataRequest(listApis.subject.add, payload)
|
||||
.then((res) => {
|
||||
mySwalToast({
|
||||
title: "تبریک",
|
||||
html: res.message,
|
||||
icon: "success",
|
||||
});
|
||||
|
||||
payload["id"] = res.data["id"];
|
||||
this.subjects[this.lastComboItem].push(payload);
|
||||
})
|
||||
.catch((err) => {
|
||||
mySwalToast({
|
||||
title: err.message,
|
||||
html: null,
|
||||
icon: "error",
|
||||
});
|
||||
})
|
||||
.finally(() => {
|
||||
this.closeNewSubjectForm();
|
||||
});
|
||||
},
|
||||
|
||||
// pageChanged({ pageNumber, limit }) {
|
||||
// let page = paging.pageNumber;
|
||||
// page -= 1;
|
||||
// this.pagination.offset = page * paging.limit;
|
||||
// this.pagination.limit = paging.limit;
|
||||
// this.pagination.page = pageNumber;
|
||||
|
||||
// this.countInPage = limit;
|
||||
|
||||
// this.getItemSubject();
|
||||
// },
|
||||
// pageLimitChanged(paging) {
|
||||
// this.resetPagination();
|
||||
// this.pagination.limit = paging.limit;
|
||||
|
||||
// this.getItemSubject();
|
||||
// },
|
||||
},
|
||||
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.new-subject-form-container {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
background: #fff;
|
||||
box-shadow: 0px 0px 17px 1px #eee;
|
||||
padding: 1em;
|
||||
width: 70%;
|
||||
margin: auto;
|
||||
height: 50%;
|
||||
}
|
||||
|
||||
.form-control {
|
||||
// border-radius: 0 20px 20px 0;
|
||||
font-size: 14px;
|
||||
font-weight: 300;
|
||||
text-align: right;
|
||||
color: #707b87;
|
||||
height: 100%;
|
||||
// border-color: transparent;
|
||||
// padding-right: 0;
|
||||
// padding-left: 0;
|
||||
}
|
||||
.remov_button {
|
||||
top: 20px;
|
||||
right: 60%;
|
||||
}
|
||||
.submit_button {
|
||||
// position: relative;
|
||||
// right: 90px !important;
|
||||
}
|
||||
|
||||
.form-control::-webkit-input-placeholder {
|
||||
/* Chrome/Opera/Safari */
|
||||
color: pink;
|
||||
}
|
||||
.form-control::-moz-placeholder {
|
||||
/* Firefox 19+ */
|
||||
color: pink;
|
||||
}
|
||||
.form-control:-ms-input-placeholder {
|
||||
/* IE 10+ */
|
||||
color: pink;
|
||||
}
|
||||
.form-control:-moz-placeholder {
|
||||
/* Firefox 18- */
|
||||
color: pink;
|
||||
}
|
||||
.form-row {
|
||||
flex-direction: unset !important;
|
||||
}
|
||||
.col {
|
||||
flex-basis: unset;
|
||||
}
|
||||
.new-subject-form-container {
|
||||
box-shadow: rgba(22, 19, 19, 0.24) 0px 2px 10px;
|
||||
border-radius: 1em;
|
||||
z-index: 99;
|
||||
}
|
||||
</style>
|
59
components/research/components/WikiPage.vue
Normal file
59
components/research/components/WikiPage.vue
Normal file
|
@ -0,0 +1,59 @@
|
|||
<template>
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="col-12 d-flex justify-content-end">
|
||||
<button @click.prevent="saveForm" title="" type="button" class="btn btn-outline-primary">
|
||||
ثبت
|
||||
</button>
|
||||
</div>
|
||||
<div class="col-12 mt-3">
|
||||
<div style="height: calc(100dvh - 8em); overflow-y: auto;">
|
||||
<VueEditor
|
||||
dir="rtl"
|
||||
v-model="editorData"
|
||||
:editorOptions="editorOptions"
|
||||
class="h-75"
|
||||
></VueEditor>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
import researchApi from "~/apis/researchApi";
|
||||
import { mapActions, mapState } from "pinia";
|
||||
import { VueEditor } from "vue2-editor";
|
||||
import { useResearchStore } from "~/stores/researchStore";
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
httpService: undefined,
|
||||
editorData: "",
|
||||
editorOptions: {
|
||||
formats: {
|
||||
direction: "rtl",
|
||||
align: "right",
|
||||
},
|
||||
placeholder: "توضیحات...",
|
||||
// readOnly: true,
|
||||
// theme: "snow",
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState(useResearchStore, ["researchSchemaGetter"]),
|
||||
},
|
||||
|
||||
beforeMount() {
|
||||
this.httpService = new HttpService(import.meta.env.VITE_BASE_URL);
|
||||
},
|
||||
|
||||
|
||||
|
||||
|
||||
};
|
||||
</script>
|
28
json/research/json/menu.json
Normal file
28
json/research/json/menu.json
Normal file
|
@ -0,0 +1,28 @@
|
|||
{
|
||||
"researches": [
|
||||
{
|
||||
"icon": "Home-21",
|
||||
"color": 1,
|
||||
"link": "defaultRoute",
|
||||
"actionMode": 1,
|
||||
"title": "خانه",
|
||||
"translateKey": "Home"
|
||||
},
|
||||
{
|
||||
"color": 1,
|
||||
"icon": "reports",
|
||||
"link": "myResearches",
|
||||
"title": "تحقیقات",
|
||||
"longTitle": "تحقیقات ",
|
||||
"translateKey": "MyResearchs"
|
||||
},
|
||||
{
|
||||
"color": 1,
|
||||
"icon": "Component-68--1",
|
||||
"link": "TermPage",
|
||||
"title": "اصطلاحات",
|
||||
"longTitle": "اصطلاحات",
|
||||
"translateKey": "TermPage"
|
||||
}
|
||||
]
|
||||
}
|
184
json/research/json/test.json
Normal file
184
json/research/json/test.json
Normal file
File diff suppressed because one or more lines are too long
50
mixins/research/searchLineMixin.js
Normal file
50
mixins/research/searchLineMixin.js
Normal file
|
@ -0,0 +1,50 @@
|
|||
const HISTORY_SEARCH_RECENT = "historysearchrecent";
|
||||
|
||||
export default {
|
||||
mounted() {
|
||||
if (window.localStorage.getItem([HISTORY_SEARCH_RECENT])) {
|
||||
try {
|
||||
this.historySearch = JSON.parse(
|
||||
window.localStorage.getItem([HISTORY_SEARCH_RECENT])
|
||||
);
|
||||
} catch (e) {
|
||||
window.localStorage.removeItem([HISTORY_SEARCH_RECENT]);
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
initText(item) {
|
||||
this.textSearch = item;
|
||||
},
|
||||
|
||||
getHighlight(item) {
|
||||
var find = this.textSearch;
|
||||
var text = item.replaceAll(find, "<b>" + find + "</b>");
|
||||
return text;
|
||||
},
|
||||
selectHistorySearch(item) {
|
||||
this.textSearch = item;
|
||||
this.searchStart(this.textSearch);
|
||||
},
|
||||
addHistorySearch(newSearch = "") {
|
||||
if (newSearch == "") {
|
||||
return;
|
||||
}
|
||||
var index = this.historySearch.indexOf(newSearch);
|
||||
if (index != -1) {
|
||||
this.historySearch.splice(index, 1);
|
||||
}
|
||||
|
||||
this.historySearch.unshift(newSearch);
|
||||
this.saveHistorySearch();
|
||||
},
|
||||
removeHistorySearch(x) {
|
||||
this.historySearch.splice(x, 1);
|
||||
this.saveHistorySearch();
|
||||
},
|
||||
saveHistorySearch() {
|
||||
const parsed = JSON.stringify(this.historySearch);
|
||||
window.localStorage.setItem([HISTORY_SEARCH_RECENT], parsed);
|
||||
},
|
||||
},
|
||||
};
|
441
mixins/research/selectTextMixin.js
Normal file
441
mixins/research/selectTextMixin.js
Normal file
|
@ -0,0 +1,441 @@
|
|||
import apis from "~/apis/tahrirApi";
|
||||
// import tinyTahrir from "assets/tahrir/vendors/tinymce-files/tinytahrir";
|
||||
|
||||
export default {
|
||||
created() {
|
||||
this.httpService = useNuxtApp()["$http"];
|
||||
},
|
||||
// beforeMount() {
|
||||
// this.commentHttpService = new HttpService(
|
||||
// import.meta.env.VITE_TAHRIR_BASE_URL
|
||||
// );
|
||||
// },
|
||||
destroyed() {
|
||||
// window.removeEventListener("scroll", this.handleScroll);
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
id: "",
|
||||
|
||||
comments: [],
|
||||
newComment: false,
|
||||
selectedText: null,
|
||||
globalGuid: undefined,
|
||||
paragraphId: undefined,
|
||||
paragraphParentId: undefined,
|
||||
commentHttpService: undefined,
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
/*
|
||||
open comment form when user select a text
|
||||
*/
|
||||
onMouseUp($event) {
|
||||
// Get selected text and encode it
|
||||
const selection = encodeURIComponent(
|
||||
this.getSelected().toString()
|
||||
).replace(/[!'()*]/g);
|
||||
|
||||
if (selection) {
|
||||
this.selectedText = selection;
|
||||
|
||||
this.setParagraphId($event);
|
||||
// this.createPopup($event);
|
||||
this.saveSelectedTextComment($event);
|
||||
}
|
||||
},
|
||||
/*
|
||||
extract user selected text
|
||||
*/
|
||||
getSelected() {
|
||||
if (window.getSelection) {
|
||||
return window.getSelection();
|
||||
} else if (document.getSelection) {
|
||||
return document.getSelection();
|
||||
} else {
|
||||
var selection = document.selection && document.selection.createRange();
|
||||
if (selection.text) {
|
||||
return selection.text;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
},
|
||||
setParagraphId(ev) {
|
||||
this.paragraphId = ev.target.id;
|
||||
this.paragraphParentId = ev.target.parentNode?.id;
|
||||
},
|
||||
/*
|
||||
create comment popup and place it on top fo the selected text;
|
||||
*/
|
||||
createPopup(event) {
|
||||
// this.openCommentForm();
|
||||
// Get cursor position
|
||||
// const posX = event.clientX - 130;
|
||||
// const posY = event.clientY - 200;
|
||||
// const posX = event.clientX;
|
||||
// const posY = event.clientY;
|
||||
// try {
|
||||
// this.$refs.popupMenu.$el.style.top = posY + "px";
|
||||
// this.$refs.popupMenu.$el.style.left = posX + "px";
|
||||
// this.$refs.popupMenu.$el.style.opacity = 1;
|
||||
// }
|
||||
// catch(err) {
|
||||
// setTimeout(() => {
|
||||
// this.$refs.popupMenu.$el.style.top = posY + "px";
|
||||
// this.$refs.popupMenu.$el.style.left = posX + "px";
|
||||
// this.$refs.popupMenu.$el.style.opacity = 1;
|
||||
// }, 700);
|
||||
// }
|
||||
},
|
||||
openCommentForm() {
|
||||
this.newComment = true;
|
||||
},
|
||||
|
||||
/*
|
||||
summary: save selected text
|
||||
|
||||
description: replace selected text with the new span.tcomment tag and then save it.
|
||||
send a new request to api for saving the comment.
|
||||
then update/replace paragraph content with newely created content.
|
||||
then crawle all paragraphs for .tcomment ids.
|
||||
then request api for paragraphs comments.
|
||||
|
||||
@fires when user clicked on comment popup save button.
|
||||
@param {userComment} Html user comment.
|
||||
@return void.
|
||||
*/
|
||||
saveSelectedTextComment(userComment) {
|
||||
const url = tahrirUrl()+ apis.comments.addCommentToSelectedParag;
|
||||
const replacedContent = this.replaceSelectedText();
|
||||
|
||||
const payload = {
|
||||
content: replacedContent,
|
||||
guid: this.paragraphId,
|
||||
};
|
||||
|
||||
this.commentHttpService
|
||||
.formDataRequest(url, payload)
|
||||
.then((res) => {
|
||||
this.newComment = false;
|
||||
|
||||
this.addComment(
|
||||
{
|
||||
text: userComment,
|
||||
pid: this.globalGuid,
|
||||
},
|
||||
replacedContent
|
||||
);
|
||||
})
|
||||
.catch((err) => {
|
||||
mySwalToast({
|
||||
html: err?.message,
|
||||
});
|
||||
})
|
||||
.finally(() => (this.loading = false));
|
||||
},
|
||||
/*
|
||||
summary: save comment
|
||||
|
||||
description:
|
||||
send a new request to api for saving the comment.
|
||||
then update/replace paragraph content with newely created content.
|
||||
then crawle all paragraphs for .tcomment ids.
|
||||
then request api for paragraphs comments.
|
||||
|
||||
@fires when saveSelectedTextComment method completed...
|
||||
|
||||
@param {text} String user comment.
|
||||
@param {pid} String globalGuid.
|
||||
@param {replacedContent} Html user comment.
|
||||
|
||||
@return void.
|
||||
*/
|
||||
addComment({ text, pid }, replacedContent) {
|
||||
const payload = { text: JSON.stringify(text) };
|
||||
const url = tahrirUrl()+ apis.comments.add + "/" + pid;
|
||||
|
||||
this.commentHttpService.formDataRequest(url, payload).then((res) => {
|
||||
this.updateParagraphContentProperty(replacedContent);
|
||||
|
||||
this.crawlParagsForCommentId(this.localParagraphs).then((guidList) => {
|
||||
this.getComments(guidList);
|
||||
});
|
||||
|
||||
mySwalToast({
|
||||
html: res.message,
|
||||
});
|
||||
});
|
||||
},
|
||||
/*
|
||||
summary: update paragraph content property
|
||||
|
||||
description: update paragraph old content property with updated content.
|
||||
|
||||
@fires when addComment method completed...
|
||||
|
||||
@param {replacedContent} Html user comment.
|
||||
|
||||
@return void.
|
||||
*/
|
||||
updateParagraphContentProperty(replacedContent) {
|
||||
this.localParagraphs.forEach((pars) => {
|
||||
if (pars.id == this.paragraphParentId.slice(7))
|
||||
pars.content = replacedContent;
|
||||
});
|
||||
},
|
||||
|
||||
/*
|
||||
summary: update new comment form position
|
||||
|
||||
description: update position of new comment form when scrolling.
|
||||
|
||||
@fires when user scroll
|
||||
|
||||
@param {event} event window scroll event.
|
||||
|
||||
@return void.
|
||||
*/
|
||||
updateCommentFormTopPosition(event) {
|
||||
// Find out how much (if any) user has scrolled
|
||||
var scrollTop =
|
||||
window.screenY !== undefined
|
||||
? window.screenY
|
||||
: (
|
||||
document.documentElement ||
|
||||
document.body.parentNode ||
|
||||
document.body
|
||||
).scrollTop;
|
||||
|
||||
const posY = event.clientY - 200 + scrollTop;
|
||||
this.$refs.popupMenu._vnode.elm.style.top = posY + "px";
|
||||
},
|
||||
|
||||
/*
|
||||
summary: comment list
|
||||
description: getting list of comments from the api.
|
||||
|
||||
@fires after page crawl for tcomment complete.
|
||||
|
||||
@param {array} guidList paragraph's comment ids.
|
||||
|
||||
@return void.
|
||||
*/
|
||||
|
||||
getComments(guidList) {
|
||||
const payload = {
|
||||
pids: guidList,
|
||||
};
|
||||
|
||||
this.commentHttpService
|
||||
.formDataRequest(tahrirUrl()+apis.comments.documentComment, payload)
|
||||
.then((res) => {
|
||||
if (res.data) this.attachCommentsToParags(res.data);
|
||||
});
|
||||
},
|
||||
/*
|
||||
summary: attach comments to paragraphs object
|
||||
description: loop over paragraphs and find paragraphs that
|
||||
its content property math the comment id catched from the api.
|
||||
|
||||
@fires after getComment method called.
|
||||
|
||||
@param {object}
|
||||
|
||||
@return void.
|
||||
*/
|
||||
attachCommentsToParags(comments) {
|
||||
try {
|
||||
this.localParagraphs.forEach((parag) => {
|
||||
const commentList = [];
|
||||
|
||||
Object.keys(comments).forEach((value) => {
|
||||
if (parag.content.includes(value))
|
||||
commentList.push(comments[value]);
|
||||
});
|
||||
this.$set(parag, "comments", commentList);
|
||||
});
|
||||
} catch (err) {
|
||||
this.comments = comments;
|
||||
}
|
||||
|
||||
this.fetchingData = false;
|
||||
},
|
||||
|
||||
/*
|
||||
summary: replace selected text with new span.
|
||||
description: find the parent paragraph with its refs and
|
||||
then replace the selected text with new span.
|
||||
|
||||
@fires when saveSelectedTextComment method called.
|
||||
|
||||
@return Html.
|
||||
*/
|
||||
replaceSelectedText() {
|
||||
const text = decodeURIComponent(this.selectedText);
|
||||
this.globalGuid = this.newGuid();
|
||||
const replacementTag = `<mark id="${this.globalGuid}" class="c01206 c01172 c01173"><span class="c01186" id="19">${text} </span> <span class="c01210 c01209">ORG<span class="c01174">×</span></span></mark>`;
|
||||
const refContent = this.$refs[this.paragraphParentId];
|
||||
refContent.innerHTML = refContent.innerHTML.replace(text, replacementTag);
|
||||
|
||||
return refContent.innerHTML;
|
||||
},
|
||||
|
||||
closeCommentForm() {
|
||||
this.newComment = false;
|
||||
},
|
||||
|
||||
/*
|
||||
summary: crawl paragraphs for .tcomment.
|
||||
description: crawl paragraph fot .tcomment tags and getting its id.
|
||||
|
||||
@fires when addComment method called.
|
||||
|
||||
@return Html.
|
||||
*/
|
||||
async crawlParagsForCommentId(pars) {
|
||||
return await pars
|
||||
.map((par) => {
|
||||
if (par?.content.includes("tcomment"))
|
||||
return this.geCommenttIds(par.content);
|
||||
})
|
||||
.filter((item) => item)
|
||||
.join(",");
|
||||
},
|
||||
|
||||
/*
|
||||
summary: create unique id.
|
||||
|
||||
@fires when crawlParagsForCommentId method called.
|
||||
|
||||
@return string.
|
||||
*/
|
||||
newGuid() {
|
||||
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(
|
||||
/[xy]/g,
|
||||
function (c) {
|
||||
var r = (Math.random() * 16) | 0,
|
||||
v = c == "x" ? r : (r & 0x3) | 0x8;
|
||||
return v.toString(16);
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
/*
|
||||
summary: separate spans id property..
|
||||
|
||||
@fires when crawlParagsForCommentId method called.
|
||||
|
||||
@return string.
|
||||
*/
|
||||
|
||||
geCommenttIds(content) {
|
||||
var ids = "";
|
||||
var regex =
|
||||
/\<span id=\\{0,1}\"([a-z0-9-]*?)\\{0,1}\" class=\\{0,1}\"tcomment\\{0,1}\".*?\>/g;
|
||||
var m = regex.exec(content);
|
||||
while (m !== null) {
|
||||
if (m.index === regex.lastIndex) {
|
||||
regex.lastIndex++;
|
||||
}
|
||||
if (ids != "") ids += ",";
|
||||
ids += m[1];
|
||||
m = regex.exec(content);
|
||||
}
|
||||
|
||||
return ids;
|
||||
},
|
||||
|
||||
handleScroll(event) {
|
||||
// Any code to be executed when the window is scrolled
|
||||
},
|
||||
|
||||
/*
|
||||
summary: hide/show other paragraphs comments.
|
||||
description: when user clicked on comment, hide other
|
||||
comments and add active class to .tcomment tag in the paragraph
|
||||
|
||||
@fires when user open/close the comments.
|
||||
|
||||
@param {object} paragraph
|
||||
@param {Number} commentIndex
|
||||
|
||||
@return void.
|
||||
*/
|
||||
|
||||
hideOtherComments({ paragraph, commentIndex }) {
|
||||
const _this = this;
|
||||
|
||||
_this.localParagraphs.forEach((par) => {
|
||||
// parse other paragraphs
|
||||
if (par.id != paragraph.id) {
|
||||
if (par.comments?.length) {
|
||||
par.comments.forEach((com, index) => {
|
||||
const res = com.isShow == undefined ? false : !com.isShow;
|
||||
_this.$set(par.comments[index], "isShow", res);
|
||||
});
|
||||
}
|
||||
}
|
||||
// parse selected paragraph
|
||||
else {
|
||||
if (par.comments?.length) {
|
||||
par.comments.forEach((com, index) => {
|
||||
// hide sibling comments in the active paragraph.
|
||||
if (index != commentIndex) {
|
||||
const res = com.isShow == undefined ? false : !com.isShow;
|
||||
_this.$set(par.comments[index], "isShow", res);
|
||||
}
|
||||
// toggle paragraph .tcomment class
|
||||
else {
|
||||
Array.from(
|
||||
_this.$refs["parent-" + par.id][0].children[0].children
|
||||
).forEach((child) => {
|
||||
if (child.id == com[0].pid) {
|
||||
child.classList.toggle("active");
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
removSpan(comment) {
|
||||
const spanTag = document.getElementsById(comment.pid);
|
||||
const rawText = spanTag.innerHTML;
|
||||
|
||||
this.paragraph.content = this.paragraph.content.replace(spanTag, rawText);
|
||||
return this.paragraph.content;
|
||||
},
|
||||
|
||||
saveChangeSelectedTextComment(userComment) {
|
||||
const url = apis.comments.addCommentToSelectedParag;
|
||||
const replacedContent = this.removSpan();
|
||||
|
||||
const payload = {
|
||||
content: replacedContent,
|
||||
guid: this.paragraphId,
|
||||
};
|
||||
|
||||
ApiService.formData(url, payload)
|
||||
.then((res) => {
|
||||
this.newComment = false;
|
||||
|
||||
this.addComment(
|
||||
{
|
||||
text: userComment,
|
||||
pid: this.globalGuid,
|
||||
},
|
||||
replacedContent
|
||||
);
|
||||
})
|
||||
.catch((err) => {
|
||||
mySwalToast({
|
||||
html: err?.message,
|
||||
});
|
||||
})
|
||||
.finally(() => (this.loading = false));
|
||||
},
|
||||
},
|
||||
};
|
1018
pages/Research.vue
Normal file
1018
pages/Research.vue
Normal file
File diff suppressed because it is too large
Load Diff
421
pages/TermPage.vue
Normal file
421
pages/TermPage.vue
Normal file
|
@ -0,0 +1,421 @@
|
|||
<template>
|
||||
<section :class="$route.name">
|
||||
<div class="container-fluid mt-3">
|
||||
<div class="row">
|
||||
<div class="col col-md-3 border-start right-panel" v-if="isRightPanel">
|
||||
<div class="pages-content" ref="navigationFilter">
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="d-flex justify-content-between w-100">
|
||||
<multiselect
|
||||
:allow-empty="false"
|
||||
:searchable="true"
|
||||
:close-on-select="true"
|
||||
:show-labels="false"
|
||||
label="title"
|
||||
track-by="id"
|
||||
placeholder="انتخاب پروژه"
|
||||
:value="newProjects"
|
||||
:options="projects"
|
||||
@select="selectProject"
|
||||
:hide-selected="false"
|
||||
:max-height="200"
|
||||
style="width: auto"
|
||||
>
|
||||
<template #singleLabel="props">
|
||||
<span class="option__desc"
|
||||
><span
|
||||
class="option__title text-truncate"
|
||||
style="display: block; max-width: 120px"
|
||||
>
|
||||
{{ props.option.title }}
|
||||
</span></span
|
||||
>
|
||||
</template>
|
||||
</multiselect>
|
||||
<button
|
||||
type="button"
|
||||
class="close btn-right-panel"
|
||||
aria-label="Close"
|
||||
@click="isRightPanel = false"
|
||||
>
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<ResearchTreeList
|
||||
:treeItems="treeItems"
|
||||
:newProjects="newProjects"
|
||||
@on-click="clickOnTreeItem"
|
||||
></ResearchTreeList>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col">
|
||||
<div class="row border-bottom mx-0">
|
||||
<div
|
||||
class="col-12 order-1 order-lg-1 col-lg-1 d-flex justify-content-start"
|
||||
>
|
||||
<div
|
||||
class="d-flex position-relative align-items-center"
|
||||
style="top: -0.3em"
|
||||
>
|
||||
<button
|
||||
class="btn btn-right-panel"
|
||||
@click="isRightPanel = true"
|
||||
>
|
||||
<svg class="icon icon-Component-356--1">
|
||||
<use xlink:href="#icon-Component-356--1"></use>
|
||||
</svg>
|
||||
</button>
|
||||
<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>
|
||||
</div>
|
||||
<div class="col-12 order-2 order-lg-1 col-lg-10">
|
||||
<div class="nav-tabs-container nav-tabs border-bottom-0">
|
||||
<ul class="nav">
|
||||
<li
|
||||
class="nav-item desktop"
|
||||
v-for="(navItem, index) in myActiveSchema?.tabs"
|
||||
:key="index"
|
||||
>
|
||||
<button
|
||||
:title="navItem.label"
|
||||
type="button"
|
||||
@click.prevent="updateCategoryList(navItem, index)"
|
||||
class="btn nav-link"
|
||||
:class="{ active: activeTab?.key == navItem.key }"
|
||||
>
|
||||
{{ navItem.title }}
|
||||
</button>
|
||||
</li>
|
||||
<li
|
||||
class="nav-item mobile tabs-more-btn d-md-none"
|
||||
v-if="myActiveSchema?.tabs?.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
|
||||
class="dropdown-item"
|
||||
@click.prevent="updateCategoryList(navItem, index)"
|
||||
v-for="(navItem, index) in myActiveSchema?.tabs"
|
||||
:key="index"
|
||||
:class="{ active: activeTab?.key == navItem.key }"
|
||||
>
|
||||
{{ navItem.title }}</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-12 pt-3">
|
||||
<component
|
||||
:is="contentComponentName(activeTab?.key)"
|
||||
:listAnswer="listAnswerForTerm"
|
||||
:pagination="pagination"
|
||||
@changePage="changePaging"
|
||||
@researchModalHandler="researchModalHandler"
|
||||
></component>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<base-modal-v2
|
||||
v-if="showModal"
|
||||
@close="closeBaseModal"
|
||||
:showHeaderCloseButton="true"
|
||||
:hasFooter="false"
|
||||
:modalTitle="modalTitle"
|
||||
minHeight="17em"
|
||||
overflow="hidden"
|
||||
:showSaveButton="true"
|
||||
:showCloseButton="true"
|
||||
:showDeleteButton="false"
|
||||
>
|
||||
<slot> {{ modalTitle }}</slot>
|
||||
|
||||
<slot name="body">
|
||||
<component
|
||||
:is="slotComponentName"
|
||||
:valueModal="valueModalResearch"
|
||||
@closeAfterSaving="closeAfterSaving"
|
||||
></component>
|
||||
</slot>
|
||||
</base-modal-v2>
|
||||
</div>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapState, mapActions } from "pinia";
|
||||
import researchApi from "~/apis/researchApi";
|
||||
|
||||
import { useResearchStore } from "~/stores/researchStore";
|
||||
|
||||
export default {
|
||||
beforeMount() {
|
||||
this.httpService = new HttpService(import.meta.env.VITE_BASE_URL);
|
||||
},
|
||||
mounted() {
|
||||
if (this.myActiveSchema) {
|
||||
this.researchActiveSchemaSetter(this.myActiveSchema);
|
||||
|
||||
this.getMultiSelect(this.myActiveSchema.lists.url_GET);
|
||||
this.activeTab = this.myActiveTabs;
|
||||
}
|
||||
},
|
||||
beforeDestroy() {},
|
||||
data() {
|
||||
return {
|
||||
projects: [],
|
||||
showModal: false,
|
||||
modalTitle: null,
|
||||
slotComponentName: null,
|
||||
valueModalResearch: {},
|
||||
newProjects: "",
|
||||
listAnswerForTerm: [],
|
||||
treeItems: [],
|
||||
childrenList: [],
|
||||
parentList: {},
|
||||
httpService: undefined,
|
||||
activeTab: null,
|
||||
listTypeId: 0,
|
||||
firstChoiceOfTree: "",
|
||||
isRightPanel: true,
|
||||
pagination: {
|
||||
page: 1,
|
||||
pages: 0,
|
||||
total: 0,
|
||||
offset: 0, // page * per_page
|
||||
limit: 10, //per_page
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState(useResearchStore, ["researchSchemaGetter", "researchTermsGetter"]),
|
||||
|
||||
repoUrl() {
|
||||
return import.meta.env.VITE_REPO + "/";
|
||||
},
|
||||
myActiveSchema() {
|
||||
return this.researchSchemaGetter.find((item) => {
|
||||
return item.key == "term";
|
||||
});
|
||||
},
|
||||
myActiveTabs() {
|
||||
return this.myActiveSchema.tabs.find((item) => {
|
||||
return item.key == "fish";
|
||||
});
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
...mapActions(useResearchStore, [
|
||||
"researchTermsSetter",
|
||||
"researchActiveSchemaSetter",
|
||||
]),
|
||||
closeAfterSaving() {
|
||||
this.closeBaseModal();
|
||||
setTimeout(() => {
|
||||
this.getItemsForResearch(this.firstChoiceOfTree.id);
|
||||
}, 1000);
|
||||
},
|
||||
// #region function all
|
||||
researchModalHandler(event) {
|
||||
this.openBaseModal("ResearchFishModal", event.itemSchema.title);
|
||||
this.valueModalResearch = event;
|
||||
},
|
||||
openBaseModal(componentName, title) {
|
||||
this.showModal = true;
|
||||
this.slotComponentName = componentName;
|
||||
this.modalTitle = title;
|
||||
},
|
||||
closeBaseModal() {
|
||||
this.showModal = false;
|
||||
},
|
||||
updateCategoryList(navItem, index) {
|
||||
this.activeTab = navItem;
|
||||
},
|
||||
contentComponentName(key) {
|
||||
if (key == "fish") return "ResearchContent";
|
||||
else if (key == "wiki") return "WikiPage";
|
||||
else if (key == "change") return "ProcessologyPage";
|
||||
else if (key == "treechart") return "Tree";
|
||||
|
||||
return "ResearchContent";
|
||||
},
|
||||
selectProject(item) {
|
||||
this.researchTermsSetter(item);
|
||||
this.newProjects = item;
|
||||
this.getListTree();
|
||||
},
|
||||
// #endregion
|
||||
// #region function for tree and MultiSelect
|
||||
getMultiSelect(url) {
|
||||
this.httpService.getRequest(url).then((res) => {
|
||||
this.researchTermsSetter(res.data[0]);
|
||||
|
||||
this.projects = res.data;
|
||||
this.newProjects = res.data[0];
|
||||
this.getListTree();
|
||||
});
|
||||
},
|
||||
getListTree(parent = 0, ischildren = false, parentItem = {}) {
|
||||
const payload = {
|
||||
projectid: this.newProjects?.id,
|
||||
parent: parent,
|
||||
sortby: "id",
|
||||
offset: 0,
|
||||
limit: 100,
|
||||
listtype: this.listTypeId,
|
||||
};
|
||||
let url = researchApi.subject.list;
|
||||
|
||||
this.httpService.formDataRequest(url, payload).then((res) => {
|
||||
if (!ischildren) {
|
||||
this.treeItems = res.data;
|
||||
this.firstChoiceOfTree = res.data[0];
|
||||
this.getItemsForResearch(res.data[0].id);
|
||||
} else {
|
||||
this.childrenList = res.data;
|
||||
this.parentList = parentItem;
|
||||
}
|
||||
});
|
||||
},
|
||||
clickOnTreeItem(item) {
|
||||
this.firstChoiceOfTree = item;
|
||||
this.resetPagination();
|
||||
this.getItemsForResearch(item.id);
|
||||
},
|
||||
// #endregion
|
||||
// #region function for component
|
||||
getItemsForResearch(id) {
|
||||
let url = this.activeTab?.url_GET;
|
||||
url = url.replace("{{offset}}", this.pagination.offset);
|
||||
url = url.replace("{{limit}}", this.pagination.limit);
|
||||
let filter = "";
|
||||
if (id == 0)
|
||||
filter = `&f_rt=${this.myActiveSchema.label}`; // برای نمایش همه
|
||||
else filter = `&f_rt=${this.myActiveSchema.label}&f_sb=${id}`;
|
||||
url = url.replace("{{filter}}", filter);
|
||||
|
||||
this.httpService.getRequest(url).then((res) => {
|
||||
this.listAnswerForTerm = 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 };
|
||||
});
|
||||
},
|
||||
changePaging(item) {
|
||||
this.pagination = item;
|
||||
this.getItemsForResearch(this.firstChoiceOfTree.id);
|
||||
},
|
||||
resetPagination() {
|
||||
this.pagination = {
|
||||
page: 1,
|
||||
pages: 0,
|
||||
total: 0,
|
||||
offset: 0, // page * per_page
|
||||
limit: 10, //per_page
|
||||
};
|
||||
},
|
||||
|
||||
// #endregion
|
||||
},
|
||||
|
||||
};
|
||||
</script>
|
||||
<style scoped lang="scss">
|
||||
.v-popper--theme-dropdown {
|
||||
display: flex;
|
||||
|
||||
.v-popper__inner {
|
||||
.my-tooltip-content {
|
||||
color: white;
|
||||
background-color: black;
|
||||
padding: 1em;
|
||||
}
|
||||
}
|
||||
}
|
||||
.btn-right-panel {
|
||||
display: none;
|
||||
}
|
||||
@media screen and (max-width: 61.998em) {
|
||||
.right-panel {
|
||||
padding-top: 0.5em;
|
||||
position: fixed;
|
||||
z-index: 9;
|
||||
width: 24em;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
margin-right: var(--sidebar-collapsed-width);
|
||||
background: #fff;
|
||||
justify-content: center;
|
||||
// box-shadow: -1px 0px 7px 1px #eee;
|
||||
}
|
||||
.btn-right-panel {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
@media screen and (max-width: 47.938em) {
|
||||
.nav {
|
||||
li {
|
||||
.nav-link {
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
}
|
||||
li.desktop:nth-child(n + 3) {
|
||||
display: none;
|
||||
}
|
||||
.dropdown-menu {
|
||||
a.dropdown-item:nth-child(-n + 2) {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
// .combo-list {
|
||||
// margin-top: 1em;
|
||||
// }
|
||||
}
|
||||
.right-panel {
|
||||
margin-right: 0;
|
||||
width: 18em;
|
||||
}
|
||||
}
|
||||
</style>
|
1176
pages/index.vue
Normal file
1176
pages/index.vue
Normal file
File diff suppressed because it is too large
Load Diff
116
stores/researchStore.ts
Normal file
116
stores/researchStore.ts
Normal file
|
@ -0,0 +1,116 @@
|
|||
import type {
|
||||
domain,
|
||||
researchActiveSchema,
|
||||
researchTerms,
|
||||
searchActiveTab,
|
||||
selectionFilterItems,
|
||||
} from "~/types/researchTypes";
|
||||
import { defineStore } from "pinia";
|
||||
|
||||
export const useResearchStore = defineStore("researchStore", {
|
||||
persist: {
|
||||
storage: piniaPluginPersistedstate.localStorage(),
|
||||
|
||||
}, state: () => ({
|
||||
researchActiveSchema: [] as researchActiveSchema[],
|
||||
researchSchema: [] as researchActiveSchema[],
|
||||
researchDomainActive: {} as domain,
|
||||
searchActiveTab: undefined as searchActiveTab | undefined,
|
||||
selectionFilterItems: [] as selectionFilterItems,
|
||||
researchTerms: undefined as researchTerms | undefined,
|
||||
// dataForTreeMap: undefined,
|
||||
// activeTab: undefined,
|
||||
// navigateListActiveTab: undefined,
|
||||
// navigateListSchema: undefined,
|
||||
// activeNavigateListSchema: undefined,
|
||||
// navigateChartActiveTab: undefined,
|
||||
// navigateChartSchema: undefined,
|
||||
// activeNavigateChartSchema: undefined,
|
||||
}),
|
||||
getters: {
|
||||
researchSchemaGetter(state) {
|
||||
return state.researchSchema;
|
||||
},
|
||||
researchActiveSchemaGetter(state) {
|
||||
return state.researchActiveSchema;
|
||||
},
|
||||
researchDomainActiveGetter(state) {
|
||||
return state.researchDomainActive;
|
||||
},
|
||||
searchActiveTabGetter(state) {
|
||||
return state.searchActiveTab;
|
||||
},
|
||||
selectionFilterItemsGetter(state) {
|
||||
return state.selectionFilterItems;
|
||||
},
|
||||
researchTermsGetter(state) {
|
||||
return state.researchTerms;
|
||||
},
|
||||
// dataForTreeMapGetter(state) {
|
||||
// return state.dataForTreeMap;
|
||||
// },
|
||||
// activeTabGetter(state) {
|
||||
// return state.activeTab;
|
||||
// },
|
||||
// navigateListActiveTabGetter(state) {
|
||||
// return state.activeTab;
|
||||
// },
|
||||
// navigateListSchemaGetter(state) {
|
||||
// return state.navigateListSchema;
|
||||
// },
|
||||
// activeNavigateListSchemaGetter(state) {
|
||||
// return state.activeNavigateListSchema;
|
||||
// },
|
||||
// activeTabGetter(state) {
|
||||
// return state.activeTab;
|
||||
// },
|
||||
// navigateChartSchemaGetter(state) {
|
||||
// return state.navigateChartSchema;
|
||||
// },
|
||||
// activeNavigateChartSchemaGetter(state) {
|
||||
// return state.activeNavigateChartSchema;
|
||||
// },
|
||||
},
|
||||
actions: {
|
||||
researchTermsSetter( researchTerms = undefined) {
|
||||
this.researchTerms = researchTerms;
|
||||
},
|
||||
|
||||
researchSchemaSetter( researchSchema = undefined) {
|
||||
this.researchSchema = researchSchema;
|
||||
},
|
||||
|
||||
researchActiveSchemaSetter( researchActiveSchema = undefined) {
|
||||
this.researchActiveSchema = researchActiveSchema;
|
||||
},
|
||||
researchDomainActiveSetter(domain:domain) {
|
||||
this.researchDomainActive = domain;
|
||||
},
|
||||
searchActiveTabSetter( searchActiveTab = undefined) {
|
||||
this.searchActiveTab = searchActiveTab;
|
||||
},
|
||||
selectionFilterItemsSetter( selectionFilterItems: selectionFilterItems = []) {
|
||||
this.selectionFilterItems = selectionFilterItems;
|
||||
},
|
||||
// dataForTreeMapSetter(state, dataForTreeMap = undefined) {
|
||||
// state.dataForTreeMap = dataForTreeMap;
|
||||
// },
|
||||
// activeTabSetter(state, activeTab = undefined) {
|
||||
// state.activeTab = activeTab;
|
||||
// },
|
||||
// navigateChartActiveTabSetter(state, navigateChartActiveTab = undefined) {
|
||||
// state.navigateChartActiveTab = navigateChartActiveTab;
|
||||
// },
|
||||
// navigateChartSchemaSetter(state, navigateChartSchema = undefined) {
|
||||
// state.navigateChartSchema = navigateChartSchema;
|
||||
// },
|
||||
// activeNavigateChartSchemaSetter(
|
||||
// state,
|
||||
// activeNavigateChartSchema = undefined
|
||||
// ) {
|
||||
// state.activeNavigateChartSchema = activeNavigateChartSchema;
|
||||
// },
|
||||
|
||||
|
||||
},
|
||||
});
|
307
types/researchTypes.ts
Normal file
307
types/researchTypes.ts
Normal file
|
@ -0,0 +1,307 @@
|
|||
export type researchTerms = {
|
||||
id: number;
|
||||
created_at: number;
|
||||
updated_at: number;
|
||||
type: number;
|
||||
title: string;
|
||||
color: number;
|
||||
meta: string;
|
||||
guid: string;
|
||||
owner: number;
|
||||
comment: string;
|
||||
ispublic: number;
|
||||
stt: number;
|
||||
project_version: number;
|
||||
organ_code: number;
|
||||
project_relations: null;
|
||||
item_state: number;
|
||||
table_columns: string;
|
||||
tags: string;
|
||||
repo_index: number;
|
||||
};
|
||||
export type options = [{ value: string; title: string }];
|
||||
export type items_main = [
|
||||
{
|
||||
key: string;
|
||||
label: string;
|
||||
type: string;
|
||||
placeholder: string;
|
||||
required: string;
|
||||
classes: string;
|
||||
inputClass: string;
|
||||
multi_select: string;
|
||||
options: options[];
|
||||
}
|
||||
];
|
||||
export type items_more = [
|
||||
{
|
||||
key: string;
|
||||
label: string;
|
||||
type: string;
|
||||
placeholder: string;
|
||||
required: number | string;
|
||||
classes: string;
|
||||
inputClass: string;
|
||||
multi_select: number | string;
|
||||
options: options[];
|
||||
}
|
||||
];
|
||||
export type form = {
|
||||
title: string;
|
||||
key: string;
|
||||
items_main: items_main[];
|
||||
items_more: items_more[];
|
||||
};
|
||||
export type contextMenu = [
|
||||
{ key: string; title: string; icon: string; form: form }
|
||||
];
|
||||
export type filter = [
|
||||
{ title: string; filter_key: string; source_key: string; by_more: number }
|
||||
];
|
||||
export type advance = [
|
||||
{
|
||||
key: string;
|
||||
label: string;
|
||||
tag: string;
|
||||
placeholder: string;
|
||||
labelClass: string;
|
||||
inputClass: string;
|
||||
options: [];
|
||||
}
|
||||
];
|
||||
export type lists = [
|
||||
{
|
||||
title: string;
|
||||
list_key: string;
|
||||
filter_key: string;
|
||||
icon: string;
|
||||
key: string;
|
||||
number: number;
|
||||
label: string;
|
||||
type: string;
|
||||
placeholder: string;
|
||||
required: number | string;
|
||||
classes: number | string;
|
||||
multi_select: number | string;
|
||||
url_GET: string;
|
||||
}
|
||||
];
|
||||
export type researchSchemaRes = {
|
||||
status: number;
|
||||
message: string;
|
||||
postion: number;
|
||||
meta: null;
|
||||
data: {
|
||||
dataset: researchActiveSchema[];
|
||||
};
|
||||
};
|
||||
|
||||
export type researchActiveSchema = {
|
||||
key: string;
|
||||
routeName: string;
|
||||
searchContent: string;
|
||||
label: string;
|
||||
description: string;
|
||||
contextMenu: contextMenu[];
|
||||
summary: null;
|
||||
|
||||
filter: filter[];
|
||||
domain: {
|
||||
tags: { عنوان: string; منبع: string; تاریخ: string };
|
||||
domain: domain;
|
||||
};
|
||||
advance: advance[];
|
||||
lists: lists[];
|
||||
tabs: [
|
||||
{
|
||||
title: string;
|
||||
key: string;
|
||||
url_GET: string;
|
||||
}
|
||||
];
|
||||
};
|
||||
export type domain = { label: string; key: string };
|
||||
|
||||
export type table_actions = [
|
||||
{
|
||||
icon: string;
|
||||
title: string;
|
||||
key: string;
|
||||
"v-can": string;
|
||||
type: string;
|
||||
api_items: {
|
||||
data_type: string;
|
||||
ref_key: string;
|
||||
id: string;
|
||||
title: string;
|
||||
};
|
||||
toggle_icons: { icon1: string; icon2: string };
|
||||
link_route: { id: string; name: string; key: string };
|
||||
}
|
||||
];
|
||||
export type table_columns = [
|
||||
{
|
||||
key: string;
|
||||
title: string;
|
||||
width: number | string;
|
||||
textAlign: string;
|
||||
isLink: boolean;
|
||||
link_route: { id: string; name: string; key: string };
|
||||
trancate_word: 50;
|
||||
}
|
||||
];
|
||||
|
||||
export type domainActive = {
|
||||
label: string;
|
||||
tag: string;
|
||||
key: string;
|
||||
field_collapse: string;
|
||||
table_actions: table_actions[];
|
||||
table_columns: table_columns[];
|
||||
};
|
||||
export type summary = {
|
||||
title: string;
|
||||
key: string;
|
||||
options: [{ key: string; label: string; type: string }];
|
||||
};
|
||||
export type items = [
|
||||
{
|
||||
key: string;
|
||||
items: [
|
||||
{
|
||||
key: string;
|
||||
source_key: string;
|
||||
label: string;
|
||||
style: string;
|
||||
hilight_key: string;
|
||||
link_route: { id: string; name: string; key: string };
|
||||
}
|
||||
];
|
||||
}
|
||||
];
|
||||
export type actions = [
|
||||
{
|
||||
icon: string;
|
||||
title: string;
|
||||
key: string;
|
||||
"v-can": string;
|
||||
type: string;
|
||||
api_items: {
|
||||
data_type: string;
|
||||
ref_key: string;
|
||||
id: string;
|
||||
title: string;
|
||||
};
|
||||
toggle_icons: {
|
||||
icon1: string;
|
||||
icon2: string;
|
||||
};
|
||||
link_route: {
|
||||
id: string;
|
||||
name: string;
|
||||
key: string;
|
||||
};
|
||||
}
|
||||
];
|
||||
export type search_content = {
|
||||
items: items[];
|
||||
actions: actions[];
|
||||
};
|
||||
export type searchActiveTab = {
|
||||
key: string;
|
||||
routeName: string;
|
||||
searchContent: string;
|
||||
label: string;
|
||||
description: string;
|
||||
showTableList: number;
|
||||
summary: summary;
|
||||
filter: filter[];
|
||||
domain: {
|
||||
tags: {
|
||||
قانون: string;
|
||||
عنوان: string;
|
||||
متن: string;
|
||||
سال: string;
|
||||
مقنن: string;
|
||||
منبع: string;
|
||||
مصوب: string;
|
||||
تاریخ: string;
|
||||
};
|
||||
domain: domainActive[];
|
||||
};
|
||||
advance: advance[];
|
||||
searchType: [
|
||||
{ key: string; label: string },
|
||||
{
|
||||
key: string;
|
||||
description: string;
|
||||
label: string;
|
||||
},
|
||||
{
|
||||
key: string;
|
||||
description: string;
|
||||
label: string;
|
||||
},
|
||||
{
|
||||
key: string;
|
||||
description: string;
|
||||
label: string;
|
||||
item: {
|
||||
label: string;
|
||||
type: string;
|
||||
component: string;
|
||||
};
|
||||
},
|
||||
{
|
||||
key: string;
|
||||
description: string;
|
||||
label: string;
|
||||
}
|
||||
];
|
||||
search_content: search_content;
|
||||
lists: lists[];
|
||||
};
|
||||
export type selectionFilterItems = [];
|
||||
export type researchQuery = [
|
||||
{
|
||||
_index: string;
|
||||
_id: string;
|
||||
_score: null;
|
||||
_ignored: [string];
|
||||
_source: {
|
||||
research_type: string;
|
||||
research_key: string;
|
||||
service: string;
|
||||
ref_key: string;
|
||||
ref_id: string;
|
||||
text_position: string;
|
||||
address: string;
|
||||
date_create: number;
|
||||
text_main: string;
|
||||
username: string;
|
||||
take_type: string;
|
||||
text_user: string;
|
||||
user_create: number;
|
||||
title: null;
|
||||
text_target: null;
|
||||
text_subject: null;
|
||||
text_verb: null;
|
||||
subject_public: null;
|
||||
subject_specific: null;
|
||||
time_edit: number;
|
||||
date_edit: string;
|
||||
user_edit: number;
|
||||
user: {
|
||||
id: number;
|
||||
user_id: number;
|
||||
first_name: string;
|
||||
last_name: string;
|
||||
username: string;
|
||||
full_name: string;
|
||||
avatar: string;
|
||||
color: string;
|
||||
};
|
||||
};
|
||||
sort: [number];
|
||||
}
|
||||
];
|
Loading…
Reference in New Issue
Block a user