Работа над расширенным поиском

This commit is contained in:
Book Pauk
2022-12-07 15:36:54 +07:00
parent 5b6ef8202f
commit 85007f3e91
4 changed files with 122 additions and 99 deletions

View File

@@ -21,13 +21,16 @@ const componentOptions = {
this.loadSettings();
},
search: {
handler(newValue) {
this.limit = newValue.limit;
if (this.pageCount > 1)
this.prevPage = this.search.page;
this.refresh();
handler() {
if (!this.isExtendedSearch)
this.refresh();
},
deep: true,
},
extSearch: {
handler() {
if (this.isExtendedSearch)
this.refresh();
},
deep: true,
},
@@ -519,9 +522,8 @@ export default class BaseList {
getQuery() {
const search = (this.isExtendedSearch ? this.extSearch : this.search);
let newQuery = _.cloneDeep(search);
newQuery = newQuery.setDefaults(newQuery);
delete newQuery.setDefaults;
const newQuery = {};
search.setDefaults(newQuery, search);
//дата
if (newQuery.date) {
@@ -532,8 +534,8 @@ export default class BaseList {
newQuery.offset = (newQuery.page - 1)*newQuery.limit;
//del
if (!this.showDeleted)
newQuery.del = 0;
if (!newQuery.del && !this.showDeleted)
newQuery.del = '0';
return newQuery;
}

View File

@@ -339,6 +339,13 @@ const componentOptions = {
},
deep: true,
},
extSearch: {
handler() {
this.makeTitle();
this.updateRouteQueryFromSearch();
},
deep: true,
},
extendedParams(newValue) {
this.setSetting('extendedParams', newValue);
},
@@ -415,31 +422,8 @@ class Search {
inputDebounce = 200;
//search fields
search = {
setDefaults(search) {
return Object.assign({}, search, {
author: search.author || '',
series: search.series || '',
title: search.title || '',
genre: search.genre || '',
lang: search.lang || '',
date: search.date || '',
librate: search.librate || '',
page: search.page || 1,
limit: search.limit || 50,
});
},
};
extSearch = {
setDefaults(search) {
return Object.assign({}, search, {
page: search.page || 1,
limit: search.limit || 50,
});
},
};
search = {};
extSearch = {};
searchDate = '';
prevManualDate = '';
@@ -478,13 +462,22 @@ class Search {
{label: 'выбрать даты', value: 'manual'},
];
generateDefaults(obj, fields) {
obj.setDefaults = (self, value = {}) => {
for (const f of fields)
self[f] = value[f] || '';
self.page = value.page || 1;
self.limit = value.limit || 50;
};
}
created() {
this.commit = this.$store.commit;
this.api = this.$root.api;
this.search = this.search.setDefaults(this.search);
this.extSearch = this.extSearch.setDefaults(this.extSearch);
this.search.lang = this.langDefault;
this.generateDefaults(this.search, ['author', 'series', 'title', 'genre', 'lang', 'date', 'librate']);
this.search.setDefaults(this.search);
this.loadSettings();
}
@@ -493,6 +486,10 @@ class Search {
(async() => {
await this.api.updateConfig();
this.generateDefaults(this.extSearch, this.recStruct.map(f => f.field));
this.extSearch.setDefaults(this.extSearch);
this.search.lang = this.langDefault;
//для встраивания в liberama
window.addEventListener('message', (event) => {
if (!_.isObject(event.data) || event.data.from != 'ExternalLibs')
@@ -510,11 +507,11 @@ class Search {
this.$refs.authorInput.focus();
this.updateListFromRoute(this.$route);
this.updateSearchFromRouteQuery(this.$route);
this.sendMessage({type: 'mes', data: 'hello-from-inpx-web'});
this.ready = true;
this.sendMessage({type: 'mes', data: 'hello-from-inpx-web'});
this.updateSearchFromRouteQuery(this.$route);
})();
}
@@ -554,6 +551,13 @@ class Search {
return this.$store.state.config;
}
get recStruct() {
if (this.config.dbConfig && this.config.dbConfig.inpxInfo.recStruct)
return this.config.dbConfig.inpxInfo.recStruct;
else
return [];
}
get settings() {
return this.$store.state.settings;
}
@@ -610,7 +614,12 @@ class Search {
}
get extSearchNames() {
return '';
let result = [];
for (const f of this.recStruct) {
if (this.extSearch[f.field])
result.push(`${f.field}=${this.extSearch[f.field]}`);
}
return result.join(', ');
}
inputBgColor(inp) {
@@ -820,6 +829,8 @@ class Search {
}
clearExtSearch() {
const self = this.extSearch;
self.setDefaults(self, {page: self.page, limit: self.limit});
}
onScroll() {
@@ -925,6 +936,8 @@ class Search {
}
updateSearchFromRouteQuery(to) {
if (!this.ready)
return;
if (this.list.liberamaReady)
this.sendCurrentUrl();
@@ -933,35 +946,34 @@ class Search {
const query = to.query;
if (!this.isExtendedSearch) {
this.search = this.search.setDefaults(
Object.assign({}, this.search, {
author: query.author,
series: query.series,
title: query.title,
genre: query.genre,
lang: (typeof(query.lang) == 'string' ? query.lang : this.langDefault),
date: query.date,
librate: query.librate,
this.search.setDefaults(this.search, {
author: query.author,
series: query.series,
title: query.title,
genre: query.genre,
lang: (typeof(query.lang) == 'string' ? query.lang : this.langDefault),
date: query.date,
librate: query.librate,
page: parseInt(query.page, 10),
limit: parseInt(query.limit, 10) || this.search.limit,
})
);
page: parseInt(query.page, 10),
limit: parseInt(query.limit, 10) || this.search.limit,
});
if (this.search.limit > maxLimit)
this.search.limit = maxLimit;
} else {
this.extSearch = this.extSearch.setDefaults(
Object.assign({}, this.extSearch, {
page: parseInt(query.page, 10),
limit: parseInt(query.limit, 10) || this.search.limit,
})
);
if (this.search.limit > maxLimit)
this.search.limit = maxLimit;
if (this.extSearch.limit > maxLimit)
this.extSearch.limit = maxLimit;
const queryExtSearch = {
page: this.search.page,
limit: this.search.limit,
};
for (const f of this.recStruct) {
const field = `ex_${f.field}`;
if (query[field])
queryExtSearch[f.field] = query[field];
}
this.extSearch.setDefaults(this.extSearch, queryExtSearch);
}
updateRouteQueryFromSearch() {
@@ -973,22 +985,21 @@ class Search {
const oldQuery = this.$route.query;
let query = {};
if (!this.isExtendedSearch) {
const cloned = _.cloneDeep(this.search);
const cloned = {};
this.search.setDefaults(cloned, this.search);
delete cloned.setDefaults;
query = _.pickBy(cloned);
query = _.pickBy(cloned);
if (this.search.lang == this.langDefault) {
delete query.lang;
} else {
query.lang = this.search.lang;
}
if (this.search.lang == this.langDefault) {
delete query.lang;
} else {
const cloned = _.cloneDeep(this.extSearch);
delete cloned.setDefaults;
query = _.pickBy(cloned);
query.lang = this.search.lang;
}
for (const f of this.recStruct) {
const field = `ex_${f.field}`;
if (this.extSearch[f.field])
query[field] = this.extSearch[f.field];
}
const diff = diffUtils.getObjDiff(oldQuery, query);

View File

@@ -8,13 +8,13 @@
</div>
</template>
<div ref="box" class="column q-mt-xs overflow-auto" style="max-width: 700px; padding: 0px 10px 10px 10px;">
<div ref="box" class="column q-mt-xs overflow-auto" style="max-width: 660px; padding: 0px 10px 10px 10px;">
<div class="row">
<div v-for="f in recStruct" :key="f.field" class="row">
<div class="q-mx-xs" />
<q-input
v-model="search[f.field]" :maxlength="5000"
class="q-mt-xs" style="width: 150px;" :label="`${f.field} (${f.type == 'N' ? 'число' : 'строка'})`"
class="q-mt-xs" style="width: 150px;" :label="`(${f.type}) ${f.field}`"
:bg-color="bgColor[f.field] || 'white'"
stack-label outlined dense clearable
>
@@ -31,9 +31,6 @@
<q-btn class="q-px-md q-ml-sm" color="primary" dense no-caps :disabled="error !== ''" @click="apply">
Применить
</q-btn>
<q-btn class="q-px-md q-ml-sm" color="primary" dense no-caps @click="okClick">
Закрыть
</q-btn>
</template>
</Dialog>
</template>
@@ -43,6 +40,7 @@
import vueComponent from '../../vueComponent.js';
import Dialog from '../../share/Dialog.vue';
import _ from 'lodash';
const componentOptions = {
components: {
@@ -55,8 +53,11 @@ const componentOptions = {
dialogVisible(newValue) {
this.$emit('update:modelValue', newValue);
},
extSearch(newValue) {
this.search = newValue;
extSearch: {
handler(newValue) {
this.search = _.cloneDeep(newValue);
},
deep: true,
},
search: {
handler() {
@@ -98,7 +99,16 @@ class SelectExtSearchDialog {
validate() {
const validNumValue = (n) => {
return false;
const validChars = new Set('0123456789.'.split(''));
for (const c of n.split(''))
if (!validChars.has(c))
return false;
const v = n.split('..');
if ( isNaN(parseInt(v[0] || '0', 10)) || isNaN(parseInt(v[1] || '0', 10)) )
return false;
return true;
};
let error = [];
@@ -115,13 +125,12 @@ class SelectExtSearchDialog {
this.error = error.join('<br>');
}
okClick() {
this.dialogVisible = false;
}
apply() {
this.validate();
this.dialogVisible = false;
if (!this.error) {
this.$emit('update:extSearch', _.cloneDeep(this.search));
this.dialogVisible = false;
}
}
}