Эх сурвалжийг харах

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

Book Pauk 2 жил өмнө
parent
commit
0867e4020f

+ 7 - 8
client/components/Search/Search.vue

@@ -57,7 +57,7 @@
                 </div>
                 </div>
                 <div v-show="!isExtendedSearch" class="row q-mx-md q-mb-xs items-center">
                 <div v-show="!isExtendedSearch" class="row q-mx-md q-mb-xs items-center">
                     <DivBtn
                     <DivBtn
-                        class="text-grey-5 bg-yellow-1 q-mt-xs" :size="34" :icon-size="24" round
+                        class="text-grey-5 bg-yellow-1 q-mt-xs" :size="30" :icon-size="24" round
                         :icon="(extendedParams ? 'la la-angle-double-up' : 'la la-angle-double-down')"
                         :icon="(extendedParams ? 'la la-angle-double-up' : 'la la-angle-double-down')"
                         @click.stop.prevent="extendedParams = !extendedParams"
                         @click.stop.prevent="extendedParams = !extendedParams"
                     >
                     >
@@ -110,7 +110,7 @@
                     </q-input>
                     </q-input>
                     <div class="q-mx-xs" />
                     <div class="q-mx-xs" />
                     <DivBtn
                     <DivBtn
-                        class="text-grey-8 bg-yellow-1 q-mt-xs" :size="34" :icon-size="24" round
+                        class="text-grey-8 bg-yellow-1 q-mt-xs" :size="30" :icon-size="24" round
                         icon="la la-level-up-alt"
                         icon="la la-level-up-alt"
                         @click.stop.prevent="cloneSearch"
                         @click.stop.prevent="cloneSearch"
                     >
                     >
@@ -122,7 +122,7 @@
                     </DivBtn>
                     </DivBtn>
                 </div>
                 </div>
                 <div v-show="!isExtendedSearch && extendedParams" class="row q-mx-md q-mb-xs items-center">
                 <div v-show="!isExtendedSearch && extendedParams" class="row q-mx-md q-mb-xs items-center">
-                    <div style="width: 34px" />
+                    <div style="width: 30px" />
                     <div class="q-mx-xs" />
                     <div class="q-mx-xs" />
                     <q-input
                     <q-input
                         v-model="genreNames" :maxlength="inputMaxLength" :debounce="inputDebounce"
                         v-model="genreNames" :maxlength="inputMaxLength" :debounce="inputDebounce"
@@ -192,7 +192,7 @@
                     <q-input
                     <q-input
                         v-model="extSearchNames"
                         v-model="extSearchNames"
                         class="col q-mt-xs" :bg-color="inputBgColor('extended')" input-style="cursor: pointer"
                         class="col q-mt-xs" :bg-color="inputBgColor('extended')" input-style="cursor: pointer"
-                        style="min-width: 200px; max-width: 756px;" label="Расширенный поиск" stack-label outlined dense clearable readonly
+                        style="min-width: 200px; max-width: 752px;" label="Расширенный поиск" stack-label outlined dense clearable readonly
                         @click.stop.prevent="selectExtSearch"
                         @click.stop.prevent="selectExtSearch"
                     >
                     >
                         <template v-if="extSearchNames" #append>
                         <template v-if="extSearchNames" #append>
@@ -206,7 +206,7 @@
 
 
                     <div class="q-mx-xs" />
                     <div class="q-mx-xs" />
                     <DivBtn
                     <DivBtn
-                        class="text-grey-8 bg-yellow-1 q-mt-xs" :size="34" :icon-size="24" round
+                        class="text-grey-8 bg-yellow-1 q-mt-xs" :size="30" :icon-size="24" round
                         icon="la la-level-up-alt"
                         icon="la la-level-up-alt"
                         @click.stop.prevent="cloneSearch"
                         @click.stop.prevent="cloneSearch"
                     >
                     >
@@ -693,8 +693,7 @@ class Search {
     }
     }
 
 
     showSearchHelp() {
     showSearchHelp() {
-        let info = '';  
-        info += `<div style="min-width: 250px" />`;
+        let info = `<div style="min-width: 250px" />`;
         info += `
         info += `
 <p>
 <p>
     Для раздела <b>Авторы</b>, работу поискового движка можно описать простой фразой: найти авторов по указанным критериям.
     Для раздела <b>Авторы</b>, работу поискового движка можно описать простой фразой: найти авторов по указанным критериям.
@@ -733,7 +732,7 @@ class Search {
     <br><br>
     <br><br>
     Для разделов <b>Серии</b>, <b>Книги</b> все аналогично разделу <b>Авторы</b>.
     Для разделов <b>Серии</b>, <b>Книги</b> все аналогично разделу <b>Авторы</b>.
 </p>
 </p>
-`;        
+`;
 
 
         this.$root.stdDialog.alert(info, 'Памятка', {iconName: 'la la-info-circle'});
         this.$root.stdDialog.alert(info, 'Памятка', {iconName: 'la la-info-circle'});
     }
     }

+ 55 - 1
client/components/Search/SelectExtSearchDialog/SelectExtSearchDialog.vue

@@ -5,6 +5,14 @@
                 <div style="font-size: 110%">
                 <div style="font-size: 110%">
                     Расширенный поиск
                     Расширенный поиск
                 </div>
                 </div>
+
+                <DivBtn class="q-ml-md text-white bg-secondary" :size="30" :icon-size="24" icon="la la-question" round @click.stop.prevent="showSearchHelp">
+                    <template #tooltip>
+                        <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%" max-width="400px">
+                            Памятка
+                        </q-tooltip>
+                    </template>
+                </DivBtn>
             </div>
             </div>
         </template>
         </template>
 
 
@@ -41,11 +49,14 @@
 import vueComponent from '../../vueComponent.js';
 import vueComponent from '../../vueComponent.js';
 
 
 import Dialog from '../../share/Dialog.vue';
 import Dialog from '../../share/Dialog.vue';
+import DivBtn from '../../share/DivBtn.vue';
+
 import _ from 'lodash';
 import _ from 'lodash';
 
 
 const componentOptions = {
 const componentOptions = {
     components: {
     components: {
-        Dialog
+        Dialog,
+        DivBtn,
     },
     },
     watch: {
     watch: {
         modelValue(newValue) {
         modelValue(newValue) {
@@ -126,6 +137,49 @@ class SelectExtSearchDialog {
         this.error = error.join('<br>');
         this.error = error.join('<br>');
     }
     }
 
 
+    showSearchHelp() {
+        let info = `<div style="min-width: 250px" />`;
+        info += `
+<p>
+    Расширенный поиск ведется непосредственно по значениям атрибутов записей описания книг.
+    Атрибуты можно увидеть, если включить опцию "Показывать JSON".
+    Названия атрибутов соответствуют названиям полей струкутры записей из inpx-файла.
+    На поисковые значения действуют те же правила, что и для разделов "Авторы", "Серии", "Книги".
+    <br>
+    Для строковых значений (S):
+    <ul>
+        <li>
+            без префикса: значение трактуется, как "начинается с"
+        </li>
+        <br>
+        <li>
+            префикс "=": поиск по точному совпадению
+        </li>
+        <br>
+        <li>
+            префикс "*": поиск подстроки в строке
+        </li>
+        <br>
+        <li>
+            префикс "#": поиск подстроки в строке, но только среди начинающихся не с латинского или кириллического символа
+        </li>
+    </ul>
+    Для числовых значений (N):
+    <ul>
+        <li>
+            число N: поиск по точному совпадению
+        </li>
+        <li>
+            диапазон N..M: поиск по диапазону числовых значений, включая N и M. Например, поисковое значение 1024..2048 в поле "size"
+            найдет все ссылки на файлы размером от 1КБ до 2КБ.
+        </li>
+    </ul>
+</p>
+`;
+
+        this.$root.stdDialog.alert(info, 'Памятка', {iconName: 'la la-info-circle'});
+    }
+
     onKeyPress(event) {
     onKeyPress(event) {
         if (event.code == 'Enter')
         if (event.code == 'Enter')
             this.apply();
             this.apply();