9 Commits

Author SHA1 Message Date
Book Pauk
57cd9be637 Добавлена возможность задавать префикс "%" для поискового значения.
Данный префикс позволяет вести поиск по группе подстрок, разделенных пробелами
2024-08-29 17:45:35 +07:00
Book Pauk
84ad5d6b0a Добавил define 2024-08-29 17:44:43 +07:00
Book Pauk
a85e001f1c Merge tag '1.5.8' into develop
1.5.8
2024-06-04 20:08:49 +07:00
Book Pauk
9c0c83143f Merge branch 'release/1.5.8' 2024-06-04 20:08:44 +07:00
Book Pauk
ac074c4c00 v1.5.8 2024-06-04 20:08:04 +07:00
Book Pauk
9a3ce1e184 Исправлен баг: версия 1.5.7 не создает файл конфигурации (#32) 2024-06-04 20:07:08 +07:00
Book Pauk
e17053141d Небольшие переименования 2024-04-04 18:38:01 +07:00
Book Pauk
320e5aec2a Мелкая поправка 2024-04-04 18:27:11 +07:00
Book Pauk
2d8c1c655a Merge tag '1.5.7' into develop
1.5.7
2024-04-04 18:11:16 +07:00
12 changed files with 94 additions and 29 deletions

View File

@@ -1,3 +1,7 @@
1.6.0 / 2024-??-??
- Добавлена возможность задавать префикс "%" для поискового значения. Данный префикс позволяет вести поиск по группе подстрок, разделенных пробелами
1.5.7 / 2024-04-04 1.5.7 / 2024-04-04
- В параметр bookReadLink конфига добавлен вариант замены DOWNLOAD_URI на uri из ссылки для скачивания книги (#29) - В параметр bookReadLink конфига добавлен вариант замены DOWNLOAD_URI на uri из ссылки для скачивания книги (#29)

View File

@@ -110,7 +110,7 @@ Options:
// пустая строка: использовать значение по умолчанию - inpx-файл, что найдется в директории библиотеки // пустая строка: использовать значение по умолчанию - inpx-файл, что найдется в директории библиотеки
"inpx": "", "inpx": "",
// конфигурационный файл для фильра по авторам и книгам (см. ниже) // конфигурационный файл для фильтра по авторам и книгам (см. ниже)
// пустая строка: использовать значение по умолчанию - файл filter.json в директории файла конфигурации // пустая строка: использовать значение по умолчанию - файл filter.json в директории файла конфигурации
"inpxFilterFile": "", "inpxFilterFile": "",

View File

@@ -61,6 +61,7 @@ module.exports = {
new DefinePlugin({ new DefinePlugin({
__VUE_OPTIONS_API__: true, __VUE_OPTIONS_API__: true,
__VUE_PROD_DEVTOOLS__: false, __VUE_PROD_DEVTOOLS__: false,
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__: true,
__QUASAR_SSR__: false, __QUASAR_SSR__: false,
__QUASAR_SSR_SERVER__: false, __QUASAR_SSR_SERVER__: false,
__QUASAR_SSR_CLIENT__: false, __QUASAR_SSR_CLIENT__: false,

View File

@@ -387,21 +387,34 @@ export default class BaseList {
searchValue = searchValue.toLowerCase(); searchValue = searchValue.toLowerCase();
//особая обработка префиксов //особая обработка префиксов
if (searchValue[0] == '=') { if (searchValue[0] === '=') {
searchValue = searchValue.substring(1); searchValue = searchValue.substring(1);
return bookValue.localeCompare(searchValue) == 0; return bookValue.localeCompare(searchValue) == 0;
} else if (searchValue[0] == '*') { } else if (searchValue[0] === '%') {
searchValue = searchValue.substring(1);
const words = searchValue.split(' ').filter(a => a);
if (!words.length)
words.push('');
for (const w of words)
if (bookValue !== emptyFieldValue && bookValue.indexOf(w) >= 0)
return true;
return false;
} else if (searchValue[0] === '*') {
searchValue = searchValue.substring(1); searchValue = searchValue.substring(1);
return bookValue !== emptyFieldValue && bookValue.indexOf(searchValue) >= 0; return bookValue !== emptyFieldValue && bookValue.indexOf(searchValue) >= 0;
} else if (searchValue[0] == '#') { } else if (searchValue[0] === '#') {
searchValue = searchValue.substring(1); searchValue = searchValue.substring(1);
if (!bookValue) if (!bookValue)
return false; return false;
return bookValue !== emptyFieldValue && !enru.has(bookValue[0]) && bookValue.indexOf(searchValue) >= 0; return bookValue !== emptyFieldValue && !enru.has(bookValue[0]) && bookValue.indexOf(searchValue) >= 0;
} else if (searchValue[0] == '~') {//RegExp } else if (searchValue[0] === '~') {//RegExp
searchValue = searchValue.substring(1); searchValue = searchValue.substring(1);
const re = new RegExp(searchValue, 'i'); const re = new RegExp(searchValue, 'i');

View File

@@ -846,8 +846,13 @@ class Search {
</li> </li>
<br> <br>
<li> <li>
"*" поиск подстроки в строке. Например, для "*Александр" в поле автора, будут найдены "%" поиск по группе подстрок, разделенных пробелами. Например, для "%Александр Пушкин" в поле автора, будут найдены
все авторы, имя которых содержит "Александр" все авторы, имя которых содержит и "Александр", и "Пушкин" одновременно
</li>
<br>
<li>
"*" поиск подстроки в строке вместе с пробелами. Например, для "*Александр Сергеевич" в поле автора, будут найдены
все авторы, имя которых содержит "Александр Сергеевич"
</li> </li>
<br> <br>
<li> <li>

View File

@@ -155,7 +155,10 @@ class SelectExtSearchDialog {
префикс "=": поиск по точному совпадению префикс "=": поиск по точному совпадению
</li> </li>
<li> <li>
префикс "*": поиск подстроки в строке префикс "%": поиск по группе подстрок, разделенных пробелами
</li>
<li>
префикс "*": поиск подстроки в строке (вместе с пробелами)
</li> </li>
<li> <li>
префикс "#": поиск подстроки в строке, но только среди начинающихся не с латинского или кириллического символа префикс "#": поиск подстроки в строке, но только среди начинающихся не с латинского или кириллического символа

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "inpx-web", "name": "inpx-web",
"version": "1.5.7", "version": "1.5.8",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "inpx-web", "name": "inpx-web",
"version": "1.5.7", "version": "1.5.8",
"hasInstallScript": true, "hasInstallScript": true,
"license": "CC0-1.0", "license": "CC0-1.0",
"dependencies": { "dependencies": {

View File

@@ -1,6 +1,6 @@
{ {
"name": "inpx-web", "name": "inpx-web",
"version": "1.5.7", "version": "1.5.8",
"author": "Book Pauk <bookpauk@gmail.com>", "author": "Book Pauk <bookpauk@gmail.com>",
"license": "CC0-1.0", "license": "CC0-1.0",
"repository": "bookpauk/inpx-web", "repository": "bookpauk/inpx-web",

View File

@@ -52,7 +52,7 @@ class ConfigManager {
return instance; return instance;
} }
async init(tempDataDir, configFile) { async init(defaultDataDir, configFile) {
if (this.inited) if (this.inited)
throw new Error('already inited'); throw new Error('already inited');
@@ -69,14 +69,15 @@ class ConfigManager {
this.branchConfigFile = __dirname + `/${this.branch}.js`; this.branchConfigFile = __dirname + `/${this.branch}.js`;
const config = require(this.branchConfigFile); const config = require(this.branchConfigFile);
if (!tempDataDir) { if (!defaultDataDir) {
tempDataDir = `${config.execDir}/.${config.name}`; defaultDataDir = `${config.execDir}/.${config.name}`;
} }
if (configFile) { if (configFile) {
config.configFile = path.resolve(configFile); config.configFile = path.resolve(configFile);
} else { } else {
config.configFile = `${tempDataDir}/config.json`; await fs.ensureDir(defaultDataDir);
config.configFile = `${defaultDataDir}/config.json`;
} }
this._config = config; this._config = config;

View File

@@ -54,13 +54,24 @@ class DbSearcher {
let where; let where;
//особая обработка префиксов //особая обработка префиксов
if (a[0] == '=') { if (a[0] === '=') {
a = a.substring(1); a = a.substring(1);
where = `@dirtyIndexLR('value', ${db.esc(a)}, ${db.esc(a)})`; where = `@dirtyIndexLR('value', ${db.esc(a)}, ${db.esc(a)})`;
} else if (a[0] == '*') { } else if (a[0] === '%') {
a = a.substring(1);
const ands = [];
const words = a.split(' ').filter(a => a);
if (!words.length)
words.push('');
for (const w of words)
ands.push(`v.indexOf(${db.esc(w)}) >= 0`);
where = `@indexIter('value', (v) => (v !== ${db.esc(emptyFieldValue)} && (${ands.join('&&')})) )`;
} else if (a[0] === '*') {
a = a.substring(1); a = a.substring(1);
where = `@indexIter('value', (v) => (v !== ${db.esc(emptyFieldValue)} && v.indexOf(${db.esc(a)}) >= 0) )`; where = `@indexIter('value', (v) => (v !== ${db.esc(emptyFieldValue)} && v.indexOf(${db.esc(a)}) >= 0) )`;
} else if (a[0] == '#') { } else if (a[0] === '#') {
a = a.substring(1); a = a.substring(1);
where = `@indexIter('value', (v) => { where = `@indexIter('value', (v) => {
const enru = new Set(${db.esc(enruArr)}); const enru = new Set(${db.esc(enruArr)});
@@ -68,7 +79,7 @@ class DbSearcher {
return false; return false;
return v !== ${db.esc(emptyFieldValue)} && !enru.has(v[0]) && v.indexOf(${db.esc(a)}) >= 0; return v !== ${db.esc(emptyFieldValue)} && !enru.has(v[0]) && v.indexOf(${db.esc(a)}) >= 0;
})`; })`;
} else if (a[0] == '~') {//RegExp } else if (a[0] === '~') {//RegExp
a = a.substring(1); a = a.substring(1);
where = ` where = `
await (async() => { await (async() => {
@@ -595,21 +606,32 @@ class DbSearcher {
const filterBySearch = (bookField, searchValue) => { const filterBySearch = (bookField, searchValue) => {
searchValue = searchValue.toLowerCase(); searchValue = searchValue.toLowerCase();
//особая обработка префиксов //особая обработка префиксов
if (searchValue == emptyFieldValue) { if (searchValue === emptyFieldValue) {
return `(row.${bookField} === '' || row.${bookField}.indexOf(${db.esc(emptyFieldValue)}) === 0)`; return `(row.${bookField} === '' || row.${bookField}.indexOf(${db.esc(emptyFieldValue)}) === 0)`;
} else if (searchValue[0] == '=') { } else if (searchValue[0] === '=') {
searchValue = searchValue.substring(1); searchValue = searchValue.substring(1);
return `(row.${bookField}.toLowerCase().localeCompare(${db.esc(searchValue)}) === 0)`; return `(row.${bookField}.toLowerCase().localeCompare(${db.esc(searchValue)}) === 0)`;
} else if (searchValue[0] == '*') { } else if (searchValue[0] === '%') {
searchValue = searchValue.substring(1);
const ands = [];
const words = searchValue.split(' ').filter(a => a);
if (!words.length)
words.push('');
for (const w of words)
ands.push(`row.${bookField}.toLowerCase().indexOf(${db.esc(w)}) >= 0`);
return `(row.${bookField} && (${ands.join('&&')}))`;
} else if (searchValue[0] === '*') {
searchValue = searchValue.substring(1); searchValue = searchValue.substring(1);
return `(row.${bookField} && row.${bookField}.toLowerCase().indexOf(${db.esc(searchValue)}) >= 0)`; return `(row.${bookField} && row.${bookField}.toLowerCase().indexOf(${db.esc(searchValue)}) >= 0)`;
} else if (searchValue[0] == '#') { } else if (searchValue[0] === '#') {
searchValue = searchValue.substring(1); searchValue = searchValue.substring(1);
return `(row.${bookField} === '' || (!enru.has(row.${bookField}.toLowerCase()[0]) && row.${bookField}.toLowerCase().indexOf(${db.esc(searchValue)}) >= 0))`; return `(row.${bookField} === '' || (!enru.has(row.${bookField}.toLowerCase()[0]) && row.${bookField}.toLowerCase().indexOf(${db.esc(searchValue)}) >= 0))`;
} else if (searchValue[0] == '~') {//RegExp } else if (searchValue[0] === '~') {//RegExp
searchValue = searchValue.substring(1); searchValue = searchValue.substring(1);
return ` return `

View File

@@ -247,21 +247,34 @@ class BasePage {
searchValue = searchValue.toLowerCase(); searchValue = searchValue.toLowerCase();
//особая обработка префиксов //особая обработка префиксов
if (searchValue[0] == '=') { if (searchValue[0] === '=') {
searchValue = searchValue.substring(1); searchValue = searchValue.substring(1);
return bookValue.localeCompare(searchValue) == 0; return bookValue.localeCompare(searchValue) == 0;
} else if (searchValue[0] == '*') { } else if (searchValue[0] === '%') {
searchValue = searchValue.substring(1);
const words = searchValue.split(' ').filter(a => a);
if (!words.length)
words.push('');
for (const w of words)
if (bookValue !== emptyFieldValue && bookValue.indexOf(w) >= 0)
return true;
return false;
} else if (searchValue[0] === '*') {
searchValue = searchValue.substring(1); searchValue = searchValue.substring(1);
return bookValue !== emptyFieldValue && bookValue.indexOf(searchValue) >= 0; return bookValue !== emptyFieldValue && bookValue.indexOf(searchValue) >= 0;
} else if (searchValue[0] == '#') { } else if (searchValue[0] === '#') {
searchValue = searchValue.substring(1); searchValue = searchValue.substring(1);
if (!bookValue) if (!bookValue)
return false; return false;
return bookValue !== emptyFieldValue && !enru.has(bookValue[0]) && bookValue.indexOf(searchValue) >= 0; return bookValue !== emptyFieldValue && !enru.has(bookValue[0]) && bookValue.indexOf(searchValue) >= 0;
} else if (searchValue[0] == '~') {//RegExp } else if (searchValue[0] === '~') {//RegExp
searchValue = searchValue.substring(1); searchValue = searchValue.substring(1);
const re = new RegExp(searchValue, 'i'); const re = new RegExp(searchValue, 'i');

View File

@@ -24,7 +24,10 @@ class SearchHelpPage extends BasePage {
префикс "=": поиск по точному совпадению префикс "=": поиск по точному совпадению
</li> </li>
<li> <li>
префикс "*": поиск подстроки в строке префикс "%": поиск по группе подстрок, разделенных пробелами
</li>
<li>
префикс "*": поиск подстроки в строке (вместе с пробелами)
</li> </li>
<li> <li>
префикс "#": поиск подстроки в строке, но только среди значений, начинающихся не с латинского или кириллического символа префикс "#": поиск подстроки в строке, но только среди значений, начинающихся не с латинского или кириллического символа