浏览代码

Merge branch 'release/0.11.4'

Book Pauk 3 年之前
父节点
当前提交
48668d94ad

+ 4 - 4
client/components/Reader/HelpPage/HelpPage.vue

@@ -29,14 +29,14 @@ import CommonHelpPage from './CommonHelpPage/CommonHelpPage.vue';
 import HotkeysHelpPage from './HotkeysHelpPage/HotkeysHelpPage.vue';
 import MouseHelpPage from './MouseHelpPage/MouseHelpPage.vue';
 import VersionHistoryPage from './VersionHistoryPage/VersionHistoryPage.vue';
-import DonateHelpPage from './DonateHelpPage/DonateHelpPage.vue';
+//import DonateHelpPage from './DonateHelpPage/DonateHelpPage.vue';
 
 const pages = {
     'CommonHelpPage': CommonHelpPage,
     'HotkeysHelpPage': HotkeysHelpPage,
     'MouseHelpPage': MouseHelpPage,
     'VersionHistoryPage': VersionHistoryPage,
-    'DonateHelpPage': DonateHelpPage,
+    //'DonateHelpPage': DonateHelpPage,
 };
 
 const tabs = [
@@ -44,7 +44,7 @@ const tabs = [
     ['MouseHelpPage', 'Мышь/тачскрин'],
     ['HotkeysHelpPage', 'Клавиатура'],
     ['VersionHistoryPage', 'История версий'],
-    ['DonateHelpPage', 'Помочь проекту'],
+    //['DonateHelpPage', 'Помочь проекту'],
 ];
 
 const componentOptions = {
@@ -73,7 +73,7 @@ class HelpPage {
     }
 
     activateDonateHelpPage() {
-        this.selectedTab = 'DonateHelpPage';
+        //this.selectedTab = 'DonateHelpPage';
     }
 
     activateVersionHistoryHelpPage() {

+ 13 - 11
client/components/Reader/LoaderPage/LoaderPage.vue

@@ -22,11 +22,13 @@
 
             <div class="q-my-sm"></div>
             <q-btn no-caps dense class="q-px-sm" color="primary" size="13px" @click="loadFileClick">
+                <q-icon class="q-mr-xs" name="la la-caret-square-up" size="24px" />
                 Загрузить файл с диска
             </q-btn>
             
             <div class="q-my-sm"></div>
             <q-btn no-caps dense class="q-px-sm" color="primary" size="13px" @click="loadBufferClick">
+                <q-icon class="q-mr-xs" name="la la-comment" size="24px" />
                 Из буфера обмена
             </q-btn>
 
@@ -46,7 +48,7 @@
 
         <div class="col column justify-end items-center no-wrap overflow-hidden">
             <span class="bottom-span clickable" @click="openHelp">Справка</span>
-            <span class="bottom-span clickable" @click="openDonate">Помочь проекту</span>
+            <!--span class="bottom-span clickable" @click="openDonate">Помочь проекту</span-->
 
             <span v-if="version == clientVersion" class="bottom-span">v{{ version }}</span>
             <span v-else class="bottom-span">Версия сервера {{ version }}, версия клиента {{ clientVersion }}, необходимо обновить страницу</span>
@@ -64,6 +66,7 @@ import GithubCorner from './GithubCorner/GithubCorner.vue';
 
 import PasteTextPage from './PasteTextPage/PasteTextPage.vue';
 import {versionHistory} from '../versionHistory';
+import * as utils from '../../../share/utils';
 
 const componentOptions = {
     components: {
@@ -136,7 +139,7 @@ class LoaderPage {
     }
 
     loadBufferClick() {
-        this.pasteTextToggle();
+        this.showPasteText();
     }
 
     loadBuffer(opts) {
@@ -146,6 +149,10 @@ class LoaderPage {
         }
     }
 
+    showPasteText() {
+        this.pasteTextActive = true;
+    }
+
     pasteTextToggle() {
         this.pasteTextActive = !this.pasteTextActive;
     }
@@ -166,8 +173,9 @@ class LoaderPage {
         window.open('http://old.omnireader.ru', '_blank');
     }
 
-    onInputKeydown(event) {
+    async onInputKeydown(event) {
         if (event.key == 'Enter') {
+            await utils.sleep(100);
             this.submitUrl();
         }
     }
@@ -178,14 +186,8 @@ class LoaderPage {
         }
 
         const input = this.$refs.input.getNativeElement();
-        if (event.type == 'keydown' && document.activeElement !== input) {
-            const action = this.$root.readerActionByKeyEvent(event);
-            switch (action) {
-                case 'help':
-                    this.openHelp(event);
-                    return true;
-            }
-        }
+        if (event.type == 'keydown' && (document.activeElement === input || event.code == 'Enter') && event.code != 'Escape')
+            return true;
 
         return false;
     }

+ 92 - 3
client/components/Reader/Reader.vue

@@ -9,6 +9,24 @@
                             {{ rstore.readerActions['loader'] }}
                         </q-tooltip>
                     </button>
+                    <button v-show="showToolButton['loadFile']" ref="loadFile" v-ripple class="tool-button" :class="buttonActiveClass('loadFile')" @click="buttonClick('loadFile')">
+                        <q-icon name="la la-caret-square-up" size="32px" />
+                        <q-tooltip :delay="1500" anchor="bottom right" content-style="font-size: 80%">
+                            {{ rstore.readerActions['loadFile'] }}
+                        </q-tooltip>
+                    </button>
+                    <button v-show="showToolButton['loadBuffer']" ref="loadBuffer" v-ripple class="tool-button" :class="buttonActiveClass('loadBuffer')" @click="buttonClick('loadBuffer')">
+                        <q-icon name="la la-comment" size="32px" />
+                        <q-tooltip :delay="1500" anchor="bottom right" content-style="font-size: 80%">
+                            {{ rstore.readerActions['loadBuffer'] }}
+                        </q-tooltip>
+                    </button>
+                    <button v-show="showToolButton['help']" ref="help" v-ripple class="tool-button" :class="buttonActiveClass('help')" @click="buttonClick('help')">
+                        <q-icon name="la la-question" size="32px" />
+                        <q-tooltip :delay="1500" anchor="bottom right" content-style="font-size: 80%">
+                            {{ rstore.readerActions['help'] }}
+                        </q-tooltip>
+                    </button>
                 </div>
 
                 <div>
@@ -89,6 +107,12 @@
                 </div>
 
                 <div>
+                    <button v-show="showToolButton['clickControl']" ref="clickControl" v-ripple class="tool-button" :class="buttonActiveClass('clickControl')" @click="buttonClick('clickControl')">
+                        <q-icon name="la la-mouse" size="32px" />
+                        <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">
+                            {{ rstore.readerActions['clickControl'] }}
+                        </q-tooltip>
+                    </button>
                     <button v-show="showToolButton['offlineMode']" ref="offlineMode" v-ripple class="tool-button" :class="buttonActiveClass('offlineMode')" @click="buttonClick('offlineMode')">
                         <q-icon name="la la-unlink" size="32px" />
                         <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">
@@ -245,6 +269,8 @@ class Reader {
     rstore = {};
 
     loaderActive = false;
+    loadFileActive = false;
+    loadBufferActive = false;
     fullScreenActive = false;
     setPositionActive = false;
     searchActive = false;
@@ -254,6 +280,7 @@ class Reader {
     contentsActive = false;    
     libsActive = false;
     recentBooksActive = false;
+    clickControlActive = false;
     offlineModeActive = false;
     settingsActive = false;
 
@@ -372,6 +399,7 @@ class Reader {
         this.copyFullText = settings.copyFullText;
         this.showClickMapPage = settings.showClickMapPage;
         this.clickControl = settings.clickControl;
+        this.clickControlActive = this.clickControl;
         this.blinkCachedLoad = settings.blinkCachedLoad;
         this.showToolButton = settings.showToolButton;
         this.enableSitesFilter = settings.enableSitesFilter;
@@ -393,6 +421,23 @@ class Reader {
         this.loadWallpapers();//no await
     }
 
+    showHelpOnErrorIfNeeded(errorMessage) {
+        //небольшая эвристика
+        let i = errorMessage.indexOf('http://');
+        if (i < 0)
+            i = errorMessage.indexOf('https://');
+
+        errorMessage = errorMessage.substring(i + 7);
+        const perCount = errorMessage.split('%').length - 1;
+
+        if (perCount > errorMessage.length/3.2) {
+            this.$refs.dialogs.showUrlHelp();
+            return true;
+        }
+
+        return false;
+    }
+
     //wallpaper css
     async loadWallpapers() {
         const wallpaperDataLength = await wallpaperStorage.getLength();
@@ -657,6 +702,28 @@ class Reader {
         }
     }
 
+    loadFileToggle() {
+        if (!this.loaderActive)
+            this.loaderToggle();
+        this.$nextTick(() => {
+            const page = this.$refs.page;
+            if (this.activePage == 'LoaderPage' && page.loadFileClick) {
+                page.loadFileClick();
+            }
+        });        
+    }
+
+    loadBufferToggle() {
+        if (!this.loaderActive)
+            this.loaderToggle();
+        this.$nextTick(() => {
+            const page = this.$refs.page;
+            if (this.activePage == 'LoaderPage' && page.showPasteText) {
+                page.showPasteText();
+            }
+        });        
+    }
+
     setPositionToggle() {
         this.setPositionActive = !this.setPositionActive;
         const page = this.$refs.page;
@@ -784,6 +851,12 @@ class Reader {
         }
     }
 
+    clickControlToggle() {
+        const newSettings = _.cloneDeep(this.settings);
+        newSettings.clickControl = !this.clickControl;
+        this.commit('reader/setSettings', newSettings);
+    }
+
     offlineModeToggle() {
         this.offlineModeActive = !this.offlineModeActive;
         this.$refs.serverStorage.offlineModeActive = this.offlineModeActive;
@@ -872,6 +945,9 @@ class Reader {
 
         switch (action) {
             case 'loader':
+            case 'loadFile':
+            case 'loadBuffer':
+            case 'help':
             case 'fullScreen':
             case 'setPosition':
             case 'search':
@@ -881,6 +957,7 @@ class Reader {
             case 'contents':
             case 'libs':
             case 'recentBooks':
+            case 'clickControl':
             case 'offlineMode':
             case 'settings':
                 if (this.progressActive) {
@@ -1117,7 +1194,9 @@ class Reader {
         } catch (e) {
             progress.hide(); this.progressActive = false;
             this.loaderActive = true;
-            this.$root.stdDialog.alert(e.message, 'Ошибка', {color: 'negative'});
+            if (!this.showHelpOnErrorIfNeeded(e.message)) {
+                this.$root.stdDialog.alert(e.message, 'Ошибка', {color: 'negative'});
+            }
         } finally {
             this.checkNewVersionAvailable();
         }
@@ -1183,6 +1262,12 @@ class Reader {
             case 'loader':
                 this.loaderToggle();
                 break;
+            case 'loadFile':
+                this.loadFileToggle();
+                break;
+            case 'loadBuffer':
+                this.loadBufferToggle();
+                break;
             case 'help':
                 this.helpToggle();
                 break;
@@ -1225,6 +1310,9 @@ class Reader {
             case 'recentBooks':
                 this.recentBooksToggle();
                 break;
+            case 'clickControl':
+                this.clickControlToggle();
+                break;
             case 'offlineMode':
                 this.offlineModeToggle();
                 break;
@@ -1327,13 +1415,14 @@ class Reader {
             if (!result && event.type == 'keydown') {
                 const action = this.$root.readerActionByKeyEvent(event);
 
-                if (action == 'loader') {
+                /*if (action == 'loader') {
                     result = this.doAction({action, event});
                 }
 
                 if (!result && this.activePage == 'TextPage') {
                     result = this.doAction({action, event});
-                }
+                }*/
+                result = this.doAction({action, event});
             }
         }
         return result;

+ 33 - 3
client/components/Reader/ReaderDialogs/ReaderDialogs.vue

@@ -54,9 +54,9 @@
 
                 <br><br>
                 <div class="row justify-center">
-                    <q-btn class="q-px-sm" color="primary" dense no-caps rounded @click="openDonate">
+                    <!--q-btn class="q-px-sm" color="primary" dense no-caps rounded @click="openDonate">
                         Помочь проекту
-                    </q-btn>
+                    </q-btn-->
                 </div>
             </div>
 
@@ -68,6 +68,27 @@
                 </q-btn>
             </template>
         </Dialog>
+
+        <Dialog ref="dialog3" v-model="urlHelpVisible">
+            <template #header>
+                Обнаружена невалидная ссылка в поле "URL книги".
+                <br>
+            </template>
+
+            <div style="word-break: normal">
+                Если вы хотите найти определенную книгу и открыть в читалке, добро пожаловать в
+                раздел "Сетевая библиотека" (кнопка <q-icon name="la la-sitemap" size="32px" />) на сайте
+                <a href="https://liberama.top" target="_blank">liberama.top</a>
+
+                <br><br>
+                Если же вы пытаетесь вставить текст в читалку из буфера обмена, пожалуйста воспользуйтесь кнопкой
+                <q-btn no-caps dense class="q-px-sm" color="primary" size="13px" @click="loadBufferClick">
+                    <q-icon class="q-mr-xs" name="la la-comment" size="24px" />
+                    Из буфера обмена
+                </q-btn>
+                на странице загрузки.
+            </div>
+        </Dialog>
     </div>
 </template>
 
@@ -95,6 +116,7 @@ class ReaderDialogs {
     whatsNewVisible = false;
     whatsNewContent = '';
     donationVisible = false;
+    urlHelpVisible = false;
 
     created() {
         this.commit = this.$store.commit;
@@ -135,6 +157,14 @@ class ReaderDialogs {
         }
     }
 
+    async showUrlHelp() {
+        this.urlHelpVisible = true;
+    }
+
+    loadBufferClick() {
+        this.urlHelpVisible = false;
+    }
+
     donationDialogDisable() {
         this.donationVisible = false;
         if (this.showDonationDialog2020) {
@@ -191,7 +221,7 @@ class ReaderDialogs {
     }
 
     keyHook() {
-        if (this.$refs.dialog1.active || this.$refs.dialog2.active)
+        if (this.$refs.dialog1.active || this.$refs.dialog2.active || this.$refs.dialog3.active)
             return true;
         return false;
     }

+ 14 - 0
client/components/Reader/versionHistory.js

@@ -1,4 +1,18 @@
 export const versionHistory = [
+{
+    version: '0.11.4',
+    releaseDate: '2022-04-14',
+    showUntil: '2022-04-13',
+    content:
+`
+<ul>
+    <li>небольшие дополнения интерфейса</li>
+    <li>исправления багов</li>
+</ul>
+
+`
+},
+
 {
     version: '0.11.3',
     releaseDate: '2022-03-29',

+ 12 - 2
client/store/modules/reader.js

@@ -2,8 +2,10 @@ import * as utils from '../../share/utils';
 import googleFonts from './fonts/fonts.json';
 
 const readerActions = {
-    'help': 'Вызвать cправку',
     'loader': 'На страницу загрузки',
+    'loadFile': 'Загрузить файл с диска',
+    'loadBuffer': 'Загрузить из буфера обмена',
+    'help': 'Вызвать cправку',    
     'settings': 'Настроить',
     'undoAction': 'Действие назад',
     'redoAction': 'Действие вперед',
@@ -15,6 +17,7 @@ const readerActions = {
     'copyText': 'Скопировать текст со страницы',
     'convOptions': 'Настроить конвертирование',
     'refresh': 'Принудительно обновить книгу',
+    'clickControl': 'Управление кликом',
     'offlineMode': 'Автономный режим (без интернета)',
     'contents': 'Оглавление/закладки',
     'libs': 'Сетевая библиотека',
@@ -35,6 +38,9 @@ const readerActions = {
 
 //readerActions[name]
 const toolButtons = [
+    {name: 'loadFile',    show: true},
+    {name: 'loadBuffer',  show: true},    
+    {name: 'help',        show: true},
     {name: 'undoAction',  show: true},
     {name: 'redoAction',  show: true},
     {name: 'fullScreen',  show: true},
@@ -47,13 +53,16 @@ const toolButtons = [
     {name: 'contents',    show: true},
     {name: 'libs',        show: true},
     {name: 'recentBooks', show: true},
+    {name: 'clickControl', show: false},
     {name: 'offlineMode', show: false},
 ];
 
 //readerActions[name]
 const hotKeys = [
-    {name: 'help', codes: ['F1', 'H']},
     {name: 'loader', codes: ['Escape']},
+    {name: 'loadFile', codes: ['F3']},
+    {name: 'loadBuffer', codes: ['F4']},
+    {name: 'help', codes: ['F1', 'H']},
     {name: 'settings', codes: ['S']},
     {name: 'undoAction', codes: ['Ctrl+BracketLeft']},
     {name: 'redoAction', codes: ['Ctrl+BracketRight']},
@@ -67,6 +76,7 @@ const hotKeys = [
     {name: 'contents', codes: ['C']},
     {name: 'libs', codes: ['L']},
     {name: 'recentBooks', codes: ['X']},
+    {name: 'clickControl', codes: ['Ctrl+B']},
     {name: 'offlineMode', codes: ['O']},
 
     {name: 'switchToolbar', codes: ['Tab', 'Q']},

+ 2 - 2
package-lock.json

@@ -1,12 +1,12 @@
 {
   "name": "Liberama",
-  "version": "0.11.2",
+  "version": "0.11.4",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
       "name": "Liberama",
-      "version": "0.11.2",
+      "version": "0.11.4",
       "hasInstallScript": true,
       "license": "CC0-1.0",
       "dependencies": {

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "Liberama",
-  "version": "0.11.3",
+  "version": "0.11.4",
   "author": "Book Pauk <bookpauk@gmail.com>",
   "license": "CC0-1.0",
   "repository": "bookpauk/liberama",