Pārlūkot izejas kodu

Merge branch 'release/0.9.6'

Book Pauk 4 gadi atpakaļ
vecāks
revīzija
bd03ca5136

+ 3 - 1
client/components/ExternalLibs/BookmarkSettings/BookmarkSettings.vue

@@ -285,7 +285,9 @@ class BookmarkSettings extends BookmarkSettingsProps {
         });
         });
 
 
         if (result && result.value && result.value.toLowerCase() == 'да') {
         if (result && result.value && result.value.toLowerCase() == 'да') {
-            this.$emit('do-action', {action: 'setLibs', data: _.cloneDeep(rstore.libsDefaults)});
+            this.$emit('do-action', {action: 'setLibs', data: _.cloneDeep(
+                Object.assign({helpShowed: true}, rstore.libsDefaults)
+            )});
         }
         }
     }
     }
 
 

+ 73 - 8
client/components/ExternalLibs/ExternalLibs.vue

@@ -5,14 +5,22 @@
         </template>
         </template>
 
 
         <template slot="buttons">
         <template slot="buttons">
-            <span class="full-screen-button row justify-center items-center" @mousedown.stop @click="showHelp">
-                <q-icon name="la la-question-circle" size="16px"/>
-                <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">Справка</q-tooltip>
-            </span>
             <span class="full-screen-button row justify-center items-center" @mousedown.stop @click="fullScreenToggle">
             <span class="full-screen-button row justify-center items-center" @mousedown.stop @click="fullScreenToggle">
                 <q-icon :name="(fullScreenActive ? 'la la-compress-arrows-alt': 'la la-expand-arrows-alt')" size="16px"/>
                 <q-icon :name="(fullScreenActive ? 'la la-compress-arrows-alt': 'la la-expand-arrows-alt')" size="16px"/>
                 <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">На весь экран</q-tooltip>
                 <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">На весь экран</q-tooltip>
             </span>
             </span>
+            <span class="full-screen-button row justify-center items-center" @mousedown.stop @click="changeScale(0.1)">
+                <q-icon name="la la-plus" size="16px"/>
+                <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">Увеличить масштаб</q-tooltip>
+            </span>
+            <span class="full-screen-button row justify-center items-center" @mousedown.stop @click="changeScale(-0.1)">
+                <q-icon name="la la-minus" size="16px"/>
+                <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">Уменьшить масштаб</q-tooltip>
+            </span>
+            <span class="full-screen-button row justify-center items-center" @mousedown.stop @click="showHelp">
+                <q-icon name="la la-question-circle" size="16px"/>
+                <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">Справка</q-tooltip>
+            </span>
         </template>
         </template>
 
 
         <div v-show="ready" class="col column" style="min-width: 600px">
         <div v-show="ready" class="col column" style="min-width: 600px">
@@ -68,8 +76,10 @@
             </div>
             </div>
             <div class="separator"></div>
             <div class="separator"></div>
 
 
-            <div class="col fit" style="position: relative;">
-                <iframe v-if="frameVisible" class="fit" ref="frame" :src="frameSrc" frameborder="0"></iframe>
+            <div class="col fit" ref="frameBox" style="position: relative;">
+                <div ref="frameWrap" class="overflow-hidden">
+                    <iframe v-if="frameVisible" ref="frame" :src="frameSrc" frameborder="0"></iframe>
+                </div>
                 <div v-show="transparentLayoutVisible" ref="transparentLayout" class="fit transparent-layout" @click="transparentLayoutClick"></div>
                 <div v-show="transparentLayoutVisible" ref="transparentLayout" class="fit transparent-layout" @click="transparentLayoutClick"></div>
             </div>
             </div>
 
 
@@ -217,12 +227,18 @@ class ExternalLibs extends Vue {
     closeAfterSubmit = false;
     closeAfterSubmit = false;
     openInFrameOnEnter = false;
     openInFrameOnEnter = false;
     openInFrameOnAdd = false;
     openInFrameOnAdd = false;
+    frameScale = 1;
 
 
     created() {
     created() {
         this.oldStartLink = '';
         this.oldStartLink = '';
         this.justOpened = true;
         this.justOpened = true;
         this.$root.addKeyHook(this.keyHook);
         this.$root.addKeyHook(this.keyHook);
 
 
+        this.$root.$on('resize', async() => {
+            await utils.sleep(200);
+            this.frameResize();
+        });
+
         document.addEventListener('fullscreenchange', () => {
         document.addEventListener('fullscreenchange', () => {
             this.fullScreenActive = (document.fullscreenElement !== null);
             this.fullScreenActive = (document.fullscreenElement !== null);
         });
         });
@@ -355,11 +371,24 @@ class ExternalLibs extends Vue {
     loadLibs() {
     loadLibs() {
         const libs = this.libs;
         const libs = this.libs;
 
 
+        if (!libs.helpShowed) {
+            this.showHelp();
+            (async() => {
+                await utils.sleep(1000);
+                this.commitProp('helpShowed', true);
+            })();
+        }
+
         this.selectedLink = libs.startLink;
         this.selectedLink = libs.startLink;
         this.closeAfterSubmit = libs.closeAfterSubmit || false;
         this.closeAfterSubmit = libs.closeAfterSubmit || false;
         this.openInFrameOnEnter = libs.openInFrameOnEnter || false;
         this.openInFrameOnEnter = libs.openInFrameOnEnter || false;
         this.openInFrameOnAdd = libs.openInFrameOnAdd || false;
         this.openInFrameOnAdd = libs.openInFrameOnAdd || false;
 
 
+        this.frameScale = 1;
+        const index = lu.getSafeRootIndexByUrl(this.libs.groups, this.selectedLink);
+        if (index >= 0)
+            this.frameScale = this.libs.groups[index].frameScale || 1;
+
         this.updateStartLink();
         this.updateStartLink();
     }
     }
 
 
@@ -494,12 +523,48 @@ class ExternalLibs extends Vue {
         this.$nextTick(() => {
         this.$nextTick(() => {
             this.frameVisible = true;
             this.frameVisible = true;
             this.$nextTick(() => {
             this.$nextTick(() => {
-                if (this.$refs.frame)
+                if (this.$refs.frame) {
                     this.$refs.frame.contentWindow.focus();
                     this.$refs.frame.contentWindow.focus();
+                    this.frameResize();
+                }
             });
             });
         });
         });
     }
     }
 
 
+    frameResize() {
+        this.$refs.frameWrap.style = 'width: 1px; height: 1px;';
+        this.$nextTick(() => {
+            if (this.$refs.frame) {
+                const w = this.$refs.frameBox.offsetWidth;
+                const h = this.$refs.frameBox.offsetHeight;
+                const normalSize = `width: ${w}px; height: ${h}px;`;
+                this.$refs.frameWrap.style = normalSize;
+                if (this.frameScale != 1) {
+                    const s = this.frameScale;
+                    this.$refs.frame.style = `width: ${w/s}px; height: ${h/s}px; transform: scale(${s}); transform-origin: 0 0;`;
+                } else {
+                    this.$refs.frame.style = normalSize;
+                }
+            }
+        });
+    }
+
+    changeScale(delta) {
+        if ((this.frameScale > 0.1 && delta <= 0) || (this.frameScale < 5 && delta >= 0)) {
+             this.frameScale = _.round(this.frameScale + delta, 1);
+
+            const index = lu.getSafeRootIndexByUrl(this.libs.groups, this.selectedLink);
+            if (index >= 0) {
+                let libs = _.cloneDeep(this.libs);
+                libs.groups[index].frameScale = this.frameScale;
+                this.commitLibs(libs);
+            }
+
+            this.frameResize();
+            this.$root.notify.success(`Масштаб изменен: ${(this.frameScale*100).toFixed(0)}%`, '', {position: 'bottom-right'});
+        }
+    }
+
     getCommentByLink(list, link) {
     getCommentByLink(list, link) {
         const item = lu.getListItemByLink(list, link);
         const item = lu.getListItemByLink(list, link);
         return (item ? item.c : '');
         return (item ? item.c : '');
@@ -725,7 +790,7 @@ class ExternalLibs extends Vue {
 что особенно актуально для мобильных устройств.</p>
 что особенно актуально для мобильных устройств.</p>
 
 
 <p>'Библиотека' разрешает свободный доступ к сайту flibusta.is. Имеется возможность управлять закладками
 <p>'Библиотека' разрешает свободный доступ к сайту flibusta.is. Имеется возможность управлять закладками
-на понравившиеся ресурсы, книги или страницы авторов. Открытие ссылок и навигация осуществляется во фрейме, но,
+на понравившиеся ресурсы, книги или страницы авторов. Открытие ссылок и навигация происходят во фрейме, но,
 к сожалению, в нем открываются не все страницы.
 к сожалению, в нем открываются не все страницы.
 </p>
 </p>
 
 

+ 8 - 144
client/components/Reader/Reader.vue

@@ -96,64 +96,7 @@
             <ClickMapPage v-show="clickMapActive" ref="clickMapPage"></ClickMapPage>
             <ClickMapPage v-show="clickMapActive" ref="clickMapPage"></ClickMapPage>
             <ServerStorage v-show="hidden" ref="serverStorage"></ServerStorage>
             <ServerStorage v-show="hidden" ref="serverStorage"></ServerStorage>
 
 
-            <Dialog ref="dialog1" v-model="whatsNewVisible">
-                <template slot="header">
-                    Что нового:
-                </template>
-
-                <div style="line-height: 20px" v-html="whatsNewContent"></div>
-
-                <span class="clickable" @click="openVersionHistory">Посмотреть историю версий</span>
-                <span slot="footer">
-                    <q-btn class="q-px-md" dense no-caps @click="whatsNewDisable">Больше не показывать</q-btn>
-                </span>
-            </Dialog>
-
-            <Dialog ref="dialog2" v-model="donationVisible">
-                <template slot="header">
-                    Здравствуйте, уважаемые читатели!
-                </template>
-
-                <div style="word-break: normal">
-                    Стартовала ежегодная акция "Оплатим хостинг вместе".<br><br>
-
-                    Для оплаты годового хостинга читалки, необходимо собрать около 2000 рублей.
-                    В настоящий момент у автора эта сумма есть в наличии. Однако будет справедливо, если каждый
-                    сможет проголосовать рублем за то, чтобы читалка так и оставалась:
-
-                    <ul>
-                        <li>непрерывно улучшаемой</li>
-                        <li>без рекламы</li>
-                        <li>без регистрации</li>
-                        <li>Open Source</li>
-                    </ul>
-
-                    Автор также обращается с просьбой о помощи в распространении 
-                    <a href="https://omnireader.ru" target="_blank">ссылки</a>
-                    <q-icon class="copy-icon" name="la la-copy" @click="copyLink('https://omnireader.ru')">
-                        <q-tooltip :delay="1000" anchor="top middle" self="center middle" content-style="font-size: 80%">Скопировать</q-tooltip>                    
-                    </q-icon>
-                    на читалку через тематические форумы, соцсети, мессенджеры и пр.
-                    Чем нас больше, тем легче оставаться на плаву и тем больше мотивации у разработчика, чтобы продолжать работать над проектом.
-
-                    <br><br>
-                    Если соберется бóльшая сумма, то разработка децентрализованной библиотеки для свободного обмена книгами будет по возможности ускорена.
-                    <br><br>
-                    P.S. При необходимости можно воспользоваться подходящим обменником на <a href="https://www.bestchange.ru" target="_blank">bestchange.ru</a>
-
-                    <br><br>
-                    <div class="row justify-center">
-                        <q-btn class="q-px-sm" color="primary" dense no-caps rounded @click="openDonate">Помочь проекту</q-btn>
-                    </div>
-                </div>
-
-                <span slot="footer">
-                    <span class="clickable row justify-end" style="font-size: 60%; color: grey" @click="donationDialogDisable">Больше не показывать</span>                        
-                    <br>
-                    <q-btn class="q-px-sm" dense no-caps @click="donationDialogRemind">Напомнить позже</q-btn>
-                </span>
-            </Dialog>
-
+            <ReaderDialogs ref="dialogs" @donate-toggle="donateToggle" @version-history-toggle="versionHistoryToggle"></ReaderDialogs>
         </div>
         </div>
     </div>
     </div>
 </template>
 </template>
@@ -178,13 +121,12 @@ import SettingsPage from './SettingsPage/SettingsPage.vue';
 import HelpPage from './HelpPage/HelpPage.vue';
 import HelpPage from './HelpPage/HelpPage.vue';
 import ClickMapPage from './ClickMapPage/ClickMapPage.vue';
 import ClickMapPage from './ClickMapPage/ClickMapPage.vue';
 import ServerStorage from './ServerStorage/ServerStorage.vue';
 import ServerStorage from './ServerStorage/ServerStorage.vue';
-import Dialog from '../share/Dialog.vue';
+import ReaderDialogs from './ReaderDialogs/ReaderDialogs.vue';
 
 
 import bookManager from './share/bookManager';
 import bookManager from './share/bookManager';
 import rstore from '../../store/modules/reader';
 import rstore from '../../store/modules/reader';
 import readerApi from '../../api/reader';
 import readerApi from '../../api/reader';
 import * as utils from '../../share/utils';
 import * as utils from '../../share/utils';
-import {versionHistory} from './versionHistory';
 
 
 export default @Component({
 export default @Component({
     components: {
     components: {
@@ -201,7 +143,7 @@ export default @Component({
         HelpPage,
         HelpPage,
         ClickMapPage,
         ClickMapPage,
         ServerStorage,
         ServerStorage,
-        Dialog,
+        ReaderDialogs,
     },
     },
     watch: {
     watch: {
         bookPos: function(newValue) {
         bookPos: function(newValue) {
@@ -339,8 +281,7 @@ class Reader extends Vue {
 
 
             this.updateRoute();
             this.updateRoute();
 
 
-            await this.showWhatsNew();
-            await this.showDonation();
+            await this.$refs.dialogs.init();
         })();
         })();
     }
     }
 
 
@@ -351,8 +292,6 @@ class Reader extends Vue {
         this.showClickMapPage = settings.showClickMapPage;
         this.showClickMapPage = settings.showClickMapPage;
         this.clickControl = settings.clickControl;
         this.clickControl = settings.clickControl;
         this.blinkCachedLoad = settings.blinkCachedLoad;
         this.blinkCachedLoad = settings.blinkCachedLoad;
-        this.showWhatsNewDialog = settings.showWhatsNewDialog;
-        this.showDonationDialog2020 = settings.showDonationDialog2020;
         this.showToolButton = settings.showToolButton;
         this.showToolButton = settings.showToolButton;
         this.enableSitesFilter = settings.enableSitesFilter;
         this.enableSitesFilter = settings.enableSitesFilter;
 
 
@@ -416,64 +355,6 @@ class Reader extends Vue {
         }
         }
     }
     }
 
 
-    async showWhatsNew() {
-        await utils.sleep(2000);
-
-        const whatsNew = versionHistory[0];
-        if (this.showWhatsNewDialog &&
-            whatsNew.showUntil >= utils.formatDate(new Date(), 'coDate') &&
-            whatsNew.header != this.whatsNewContentHash) {
-            this.whatsNewContent = 'Версия ' + whatsNew.header + whatsNew.content;
-            this.whatsNewVisible = true;
-        }
-    }
-
-    async showDonation() {
-        await utils.sleep(3000);
-        const today = utils.formatDate(new Date(), 'coDate');
-
-        if ((this.mode == 'omnireader' || this.mode == 'liberama.top') && today < '2020-03-01' && this.showDonationDialog2020 && this.donationRemindDate != today) {
-            this.donationVisible = true;
-        }
-    }
-
-    donationDialogDisable() {
-        this.donationVisible = false;
-        if (this.showDonationDialog2020) {
-            const newSettings = Object.assign({}, this.settings, { showDonationDialog2020: false });
-            this.commit('reader/setSettings', newSettings);
-        }
-    }
-
-    donationDialogRemind() {
-        this.donationVisible = false;
-        this.commit('reader/setDonationRemindDate', utils.formatDate(new Date(), 'coDate'));
-    }
-
-    openDonate() {
-        this.donationVisible = false;
-        this.donateToggle();
-    }
-
-    async copyLink(link) {
-        const result = await utils.copyTextToClipboard(link);
-        if (result)
-            this.$root.notify.success(`Ссылка ${link} успешно скопирована в буфер обмена`);
-        else
-            this.$root.notify.error('Копирование не удалось');
-    }
-
-    openVersionHistory() {
-        this.whatsNewVisible = false;
-        this.versionHistoryToggle();
-    }
-
-    whatsNewDisable() {
-        this.whatsNewVisible = false;
-        const whatsNew = versionHistory[0];
-        this.commit('reader/setWhatsNewContentHash', whatsNew.header);
-    }
-
     get routeParamPos() {
     get routeParamPos() {
         let result = undefined;
         let result = undefined;
         const q = this.$route.query;
         const q = this.$route.query;
@@ -577,14 +458,6 @@ class Reader extends Vue {
         return this.$store.state.reader.settings;
         return this.$store.state.reader.settings;
     }
     }
 
 
-    get whatsNewContentHash() {
-        return this.$store.state.reader.whatsNewContentHash;
-    }
-
-    get donationRemindDate() {
-        return this.$store.state.reader.donationRemindDate;
-    }
-
     addAction(pos) {
     addAction(pos) {
         let a = this.actionList;
         let a = this.actionList;
         if (!a.length || a[a.length - 1] != pos) {
         if (!a.length || a[a.length - 1] != pos) {
@@ -1228,9 +1101,12 @@ class Reader extends Vue {
     keyHook(event) {
     keyHook(event) {
         let result = false;
         let result = false;
         if (this.$root.rootRoute() == '/reader') {
         if (this.$root.rootRoute() == '/reader') {
-            if (this.$root.stdDialog.active || this.$refs.dialog1.active || this.$refs.dialog2.active)
+            if (this.$root.stdDialog.active)
                 return result;
                 return result;
 
 
+            if (!result)
+                result = this.$refs.dialogs.keyHook(event);
+
             if (!result && this.helpActive)
             if (!result && this.helpActive)
                 result = this.$refs.helpPage.keyHook(event);
                 result = this.$refs.helpPage.keyHook(event);
 
 
@@ -1339,16 +1215,4 @@ class Reader extends Vue {
 .clear {
 .clear {
     color: rgba(0,0,0,0);
     color: rgba(0,0,0,0);
 }
 }
-
-.clickable {
-    color: blue;
-    text-decoration: underline;
-    cursor: pointer;
-}
-
-.copy-icon {
-    cursor: pointer;
-    font-size: 120%;
-    color: blue;
-}
 </style>
 </style>

+ 250 - 0
client/components/Reader/ReaderDialogs/ReaderDialogs.vue

@@ -0,0 +1,250 @@
+<template>
+    <div>
+        <Dialog ref="dialog1" v-model="whatsNewVisible">
+            <template slot="header">
+                Что нового:
+            </template>
+
+            <div style="line-height: 20px" v-html="whatsNewContent"></div>
+
+            <span class="clickable" @click="openVersionHistory">Посмотреть историю версий</span>
+            <span slot="footer">
+                <q-btn class="q-px-md" dense no-caps @click="whatsNewDisable">Больше не показывать</q-btn>
+            </span>
+        </Dialog>
+
+        <Dialog ref="dialog2" v-model="donationVisible">
+            <template slot="header">
+                Здравствуйте, уважаемые читатели!
+            </template>
+
+            <div style="word-break: normal">
+                Стартовала ежегодная акция "Оплатим хостинг вместе".<br><br>
+
+                Для оплаты годового хостинга читалки, необходимо собрать около 2000 рублей.
+                В настоящий момент у автора эта сумма есть в наличии. Однако будет справедливо, если каждый
+                сможет проголосовать рублем за то, чтобы читалка так и оставалась:
+
+                <ul>
+                    <li>непрерывно улучшаемой</li>
+                    <li>без рекламы</li>
+                    <li>без регистрации</li>
+                    <li>Open Source</li>
+                </ul>
+
+                Автор также обращается с просьбой о помощи в распространении 
+                <a href="https://omnireader.ru" target="_blank">ссылки</a>
+                <q-icon class="copy-icon" name="la la-copy" @click="copyLink('https://omnireader.ru')">
+                    <q-tooltip :delay="1000" anchor="top middle" self="center middle" content-style="font-size: 80%">Скопировать</q-tooltip>                    
+                </q-icon>
+                на читалку через тематические форумы, соцсети, мессенджеры и пр.
+                Чем нас больше, тем легче оставаться на плаву и тем больше мотивации у разработчика, чтобы продолжать работать над проектом.
+
+                <br><br>
+                Если соберется бóльшая сумма, то разработка децентрализованной библиотеки для свободного обмена книгами будет по возможности ускорена.
+                <br><br>
+                P.S. При необходимости можно воспользоваться подходящим обменником на <a href="https://www.bestchange.ru" target="_blank">bestchange.ru</a>
+
+                <br><br>
+                <div class="row justify-center">
+                    <q-btn class="q-px-sm" color="primary" dense no-caps rounded @click="openDonate">Помочь проекту</q-btn>
+                </div>
+            </div>
+
+            <span slot="footer">
+                <span class="clickable row justify-end" style="font-size: 60%; color: grey" @click="donationDialogDisable">Больше не показывать</span>                        
+                <br>
+                <q-btn class="q-px-sm" dense no-caps @click="donationDialogRemind">Напомнить позже</q-btn>
+            </span>
+        </Dialog>
+
+        <Dialog ref="dialog3" v-model="liberamaTopVisible">
+            <template slot="header">
+                Здравствуйте, уважаемые читатели!
+            </template>
+
+            <div style="word-break: normal">
+                Создан новый ресурс:<br><br>
+
+                <a href="https://liberama.top" target="_blank">https://liberama.top</a>
+                <br><br>
+                Это клон читалки Omni Reader, но с некоторыми дополнениями, ориентированными в сторону более свободного обмена книгами:
+
+                <ul>
+                    <li>добавлено новое окно "Библиотека" для свободного доступа к Флибусте и другим ресурсам по желанию читателя</li>
+                    <li>планируется добавить возможность создания подборок книг и обмена ими между пользователями</li>
+                </ul>
+
+                Легко мигрировать на новый сайт можно с помощью синхронизации с сервером.
+                О багах и предложениях просьба сообщать на почту <a href="mailto:bookpauk@gmail.com">bookpauk@gmail.com</a><br><br>
+                Спасибо, что вы с нами!
+                <br><br>
+                <div class="row justify-center">
+                    <q-btn class="q-px-sm" color="primary" dense no-caps rounded @click="openDonate">Помочь проекту</q-btn>
+                </div>
+            </div>
+
+            <span slot="footer">
+                <q-btn class="q-px-sm" dense no-caps @click="liberamaTopDialogDisable">Больше не показывать</q-btn>
+            </span>
+        </Dialog>
+    </div>
+</template>
+
+<script>
+//-----------------------------------------------------------------------------
+import Vue from 'vue';
+import Component from 'vue-class-component';
+
+import Dialog from '../../share/Dialog.vue';
+import * as utils from '../../../share/utils';
+import {versionHistory} from '../versionHistory';
+
+export default @Component({
+    components: {
+        Dialog
+    },
+    watch: {
+        settings: function() {
+            this.loadSettings();
+        },
+    },
+})
+class ReaderDialogs extends Vue {
+    whatsNewVisible = false;
+    whatsNewContent = '';
+    donationVisible = false;
+    liberamaTopVisible = false;
+
+    created() {
+        this.commit = this.$store.commit;
+        this.loadSettings();
+    }
+
+    mounted() {
+    }
+
+    async init() {
+        await this.showWhatsNew();
+        await this.showDonation();
+        await this.showLiberamaTop();
+    }
+
+    loadSettings() {
+        const settings = this.settings;
+        this.showWhatsNewDialog = settings.showWhatsNewDialog;
+        this.showDonationDialog2020 = settings.showDonationDialog2020;
+        this.showLiberamaTopDialog2020 = settings.showLiberamaTopDialog2020;
+    }
+
+    async showWhatsNew() {
+        const whatsNew = versionHistory[0];
+        if (this.showWhatsNewDialog &&
+            whatsNew.showUntil >= utils.formatDate(new Date(), 'coDate') &&
+            whatsNew.header != this.whatsNewContentHash) {
+            await utils.sleep(2000);
+            this.whatsNewContent = 'Версия ' + whatsNew.header + whatsNew.content;
+            this.whatsNewVisible = true;
+        }
+    }
+
+    async showDonation() {
+        const today = utils.formatDate(new Date(), 'coDate');
+
+        if ((this.mode == 'omnireader' || this.mode == 'liberama.top') && today < '2020-03-01' && this.showDonationDialog2020 && this.donationRemindDate != today) {
+            await utils.sleep(3000);
+            this.donationVisible = true;
+        }
+    }
+
+    donationDialogDisable() {
+        this.donationVisible = false;
+        if (this.showDonationDialog2020) {
+            this.commit('reader/setSettings', { showDonationDialog2020: false });
+        }
+    }
+
+    donationDialogRemind() {
+        this.donationVisible = false;
+        this.commit('reader/setDonationRemindDate', utils.formatDate(new Date(), 'coDate'));
+    }
+
+    openDonate() {
+        this.donationVisible = false;
+        this.liberamaTopVisible = false;
+        this.$emit('donate-toggle');
+    }
+
+    async copyLink(link) {
+        const result = await utils.copyTextToClipboard(link);
+        if (result)
+            this.$root.notify.success(`Ссылка ${link} успешно скопирована в буфер обмена`);
+        else
+            this.$root.notify.error('Копирование не удалось');
+    }
+
+    openVersionHistory() {
+        this.whatsNewVisible = false;
+        this.$emit('version-history-toggle');
+    }
+
+    whatsNewDisable() {
+        this.whatsNewVisible = false;
+        const whatsNew = versionHistory[0];
+        this.commit('reader/setWhatsNewContentHash', whatsNew.header);
+    }
+
+    get mode() {
+        return this.$store.state.config.mode;
+    }
+
+    get settings() {
+        return this.$store.state.reader.settings;
+    }
+
+    get whatsNewContentHash() {
+        return this.$store.state.reader.whatsNewContentHash;
+    }
+
+    get donationRemindDate() {
+        return this.$store.state.reader.donationRemindDate;
+    }
+
+    async showLiberamaTop() {
+        const today = utils.formatDate(new Date(), 'coDate');
+
+        if (this.mode == 'omnireader' && today < '2020-12-01' && this.showLiberamaTopDialog2020) {
+            await utils.sleep(3000);
+            this.liberamaTopVisible = true;
+        }
+    }
+
+    liberamaTopDialogDisable()  {
+        this.liberamaTopVisible = false;
+        if (this.showLiberamaTopDialog2020) {
+            this.commit('reader/setSettings', { showLiberamaTopDialog2020: false });
+        }
+    }
+
+    keyHook() {
+        if (this.$refs.dialog1.active || this.$refs.dialog2.active || this.$refs.dialog3.active)
+            return true;
+        return false;
+    }
+}
+//-----------------------------------------------------------------------------
+</script>
+
+<style scoped>
+.clickable {
+    color: blue;
+    text-decoration: underline;
+    cursor: pointer;
+}
+
+.copy-icon {
+    cursor: pointer;
+    font-size: 120%;
+    color: blue;
+}
+</style>

+ 4 - 8
client/components/Reader/TextPage/TextPage.vue

@@ -904,8 +904,7 @@ class TextPage extends Vue {
         if (!this.settingsChanging) {
         if (!this.settingsChanging) {
             this.settingsChanging = true;
             this.settingsChanging = true;
             const newSize = (this.settings.fontSize + 1 < 200 ? this.settings.fontSize + 1 : 100);
             const newSize = (this.settings.fontSize + 1 < 200 ? this.settings.fontSize + 1 : 100);
-            const newSettings = Object.assign({}, this.settings, {fontSize: newSize});
-            this.commit('reader/setSettings', newSettings);
+            this.commit('reader/setSettings', {fontSize: newSize});
             await sleep(50);
             await sleep(50);
             this.settingsChanging = false;
             this.settingsChanging = false;
         }
         }
@@ -915,8 +914,7 @@ class TextPage extends Vue {
         if (!this.settingsChanging) {
         if (!this.settingsChanging) {
             this.settingsChanging = true;
             this.settingsChanging = true;
             const newSize = (this.settings.fontSize - 1 > 5 ? this.settings.fontSize - 1 : 5);
             const newSize = (this.settings.fontSize - 1 > 5 ? this.settings.fontSize - 1 : 5);
-            const newSettings = Object.assign({}, this.settings, {fontSize: newSize});
-            this.commit('reader/setSettings', newSettings);
+            this.commit('reader/setSettings', {fontSize: newSize});
             await sleep(50);
             await sleep(50);
             this.settingsChanging = false;
             this.settingsChanging = false;
         }
         }
@@ -926,8 +924,7 @@ class TextPage extends Vue {
         if (!this.settingsChanging) {
         if (!this.settingsChanging) {
             this.settingsChanging = true;
             this.settingsChanging = true;
             const newDelay = (this.settings.scrollingDelay - 50 > 1 ? this.settings.scrollingDelay - 50 : 1);
             const newDelay = (this.settings.scrollingDelay - 50 > 1 ? this.settings.scrollingDelay - 50 : 1);
-            const newSettings = Object.assign({}, this.settings, {scrollingDelay: newDelay});
-            this.commit('reader/setSettings', newSettings);
+            this.commit('reader/setSettings', {scrollingDelay: newDelay});
             await sleep(50);
             await sleep(50);
             this.settingsChanging = false;
             this.settingsChanging = false;
         }
         }
@@ -937,8 +934,7 @@ class TextPage extends Vue {
         if (!this.settingsChanging) {
         if (!this.settingsChanging) {
             this.settingsChanging = true;
             this.settingsChanging = true;
             const newDelay = (this.settings.scrollingDelay + 50 < 10000 ? this.settings.scrollingDelay + 50 : 10000);
             const newDelay = (this.settings.scrollingDelay + 50 < 10000 ? this.settings.scrollingDelay + 50 : 10000);
-            const newSettings = Object.assign({}, this.settings, {scrollingDelay: newDelay});
-            this.commit('reader/setSettings', newSettings);
+            this.commit('reader/setSettings', {scrollingDelay: newDelay});
             await sleep(50);
             await sleep(50);
             this.settingsChanging = false;
             this.settingsChanging = false;
         }
         }

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

@@ -1,4 +1,16 @@
 export const versionHistory = [
 export const versionHistory = [
+{
+    showUntil: '2020-11-05',
+    header: '0.9.6 (2020-11-06)',
+    content:
+`
+<ul>
+    <li>завершена работа над новым окном "Библиотека"</li>
+    <li>исправления багов</li>
+</ul>
+`
+},
+
 {
 {
     showUntil: '2020-10-31',
     showUntil: '2020-10-31',
     header: '0.9.5 (2020-11-01)',
     header: '0.9.5 (2020-11-01)',

+ 1 - 0
client/store/modules/reader.js

@@ -251,6 +251,7 @@ const settingDefaults = {
     showServerStorageMessages: true,
     showServerStorageMessages: true,
     showWhatsNewDialog: true,
     showWhatsNewDialog: true,
     showDonationDialog2020: true,
     showDonationDialog2020: true,
+    showLiberamaTopDialog2020: true,
     enableSitesFilter: true,
     enableSitesFilter: true,
 
 
     fontShifts: {},
     fontShifts: {},

+ 1 - 1
package-lock.json

@@ -1,6 +1,6 @@
 {
 {
   "name": "Liberama",
   "name": "Liberama",
-  "version": "0.9.5",
+  "version": "0.9.6",
   "lockfileVersion": 1,
   "lockfileVersion": 1,
   "requires": true,
   "requires": true,
   "dependencies": {
   "dependencies": {

+ 1 - 1
package.json

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