diff --git a/client/components/App.vue b/client/components/App.vue index a568a3a9..514aaaf6 100644 --- a/client/components/App.vue +++ b/client/components/App.vue @@ -47,14 +47,12 @@ //----------------------------------------------------------------------------- import Vue from 'vue'; import Component from 'vue-class-component'; +import * as utils from '../share/utils'; export default @Component({ watch: { - rootRoute: function() { - this.setAppTitle(); - this.redirectIfNeeded(); - }, mode: function() { + this.setAppTitle(); this.redirectIfNeeded(); } }, @@ -123,6 +121,9 @@ class App extends Vue { }); } }); + + this.setAppTitle(); + this.redirectIfNeeded(); } toggleCollapse() { @@ -201,15 +202,18 @@ class App extends Vue { } redirectIfNeeded() { - if ((this.mode == 'reader' || this.mode == 'omnireader') && (this.rootRoute != '/reader')) { + if ((this.mode == 'reader' || this.mode == 'omnireader') && (!this.isReaderActive)) { //старый url const search = window.location.search.substr(1); - const url = search.split('url=')[1] || ''; + const s = search.split('url='); + const url = s[1] || ''; + const q = utils.parseQuery(s[0] || ''); if (url) { - window.location = `/#/reader?url=${url}`; - } else { - this.$router.replace('/reader'); + q.url = decodeURIComponent(url); } + + window.history.replaceState({}, '', '/'); + this.$router.replace({ path: '/reader', query: q }); } //yandex-метрика для omnireader diff --git a/client/components/Reader/ProgressPage/ProgressPage.vue b/client/components/Reader/ProgressPage/ProgressPage.vue index 7d1e9cb1..0ac1a0bc 100644 --- a/client/components/Reader/ProgressPage/ProgressPage.vue +++ b/client/components/Reader/ProgressPage/ProgressPage.vue @@ -94,6 +94,6 @@ class ProgressPage extends Vue { diff --git a/client/components/Reader/Reader.vue b/client/components/Reader/Reader.vue index b0caaf99..184e3c7d 100644 --- a/client/components/Reader/Reader.vue +++ b/client/components/Reader/Reader.vue @@ -1036,7 +1036,7 @@ class Reader extends Vue { overflow-x: auto; overflow-y: hidden; } - + .header { display: flex; justify-content: space-between; @@ -1064,6 +1064,10 @@ class Reader extends Vue { box-shadow: 3px 3px 5px black; } +.tool-button + .tool-button { + margin: 0 2px 0 2px; +} + .tool-button:hover { background-color: white; } diff --git a/client/components/Reader/SettingsPage/SettingsPage.vue b/client/components/Reader/SettingsPage/SettingsPage.vue index ec20e6f8..be2b07b6 100644 --- a/client/components/Reader/SettingsPage/SettingsPage.vue +++ b/client/components/Reader/SettingsPage/SettingsPage.vue @@ -871,9 +871,9 @@ class SettingsPage extends Vue { } .el-form-item { - padding: 0; - margin: 0; - margin-bottom: 5px; + padding: 0 !important; + margin: 0 !important; + margin-bottom: 5px !important; } .color-picked { diff --git a/client/components/Reader/share/bookManager.js b/client/components/Reader/share/bookManager.js index 9d2932af..294bd624 100644 --- a/client/components/Reader/share/bookManager.js +++ b/client/components/Reader/share/bookManager.js @@ -143,7 +143,6 @@ class BookManager { } } - async deflateWithProgress(data, callback) { const chunkSize = 128*1024; const deflator = new utils.pako.Deflate({level: 5}); @@ -178,6 +177,40 @@ class BookManager { return deflator.result; } + async inflateWithProgress(data, callback) { + const chunkSize = 64*1024; + const inflator = new utils.pako.Inflate({to: 'string'}); + + let chunkTotal = 1 + Math.floor(data.length/chunkSize); + let chunkNum = 0; + let perc = 0; + let prevPerc = 0; + + for (var i = 0; i < data.length; i += chunkSize) { + if ((i + chunkSize) >= data.length) { + inflator.push(data.subarray(i, i + chunkSize), true); + } else { + inflator.push(data.subarray(i, i + chunkSize), false); + } + chunkNum++; + + perc = Math.round(chunkNum/chunkTotal*100); + if (perc != prevPerc) { + callback(perc); + await utils.sleep(1); + prevPerc = perc; + } + } + + if (inflator.err) { + throw new Error(inflator.msg); + } + + callback(100); + + return inflator.result; + } + async addBook(newBook, callback) { if (!this.books) await this.init(); @@ -239,12 +272,18 @@ class BookManager { if (result && !result.parsed) { let data = await bmDataStore.getItem(`bmData-${meta.key}`); - callback(10); + callback(5); await utils.sleep(10); + let cb = (perc) => { + const p = 5 + Math.round(15*perc/100); + callback(p); + }; + if (result.dataCompressed) { try { - data = utils.pako.inflate(data, {to: 'string'}); + //data = utils.pako.inflate(data, {to: 'string'}); + data = await this.inflateWithProgress(data, cb); } catch (e) { this.delBook(meta); throw e; @@ -252,7 +291,7 @@ class BookManager { } callback(20); - const cb = (perc) => { + cb = (perc) => { const p = 20 + Math.round(80*perc/100); callback(p); }; diff --git a/client/components/Reader/versionHistory.js b/client/components/Reader/versionHistory.js index 795b2786..37e39480 100644 --- a/client/components/Reader/versionHistory.js +++ b/client/components/Reader/versionHistory.js @@ -1,4 +1,15 @@ export const versionHistory = [ +{ + showUntil: '2019-07-20', + header: '0.6.10 (2019-07-21)', + content: +` + +` +}, + { showUntil: '2019-06-22', header: '0.6.9 (2019-06-23)', diff --git a/client/main.js b/client/main.js index a30075e7..435575c4 100644 --- a/client/main.js +++ b/client/main.js @@ -1,10 +1,10 @@ import Vue from 'vue'; -import App from './components/App.vue'; import router from './router'; import store from './store'; import './element'; +import App from './components/App.vue'; //Vue.config.productionTip = false; new Vue({ diff --git a/client/router.js b/client/router.js index 99efcd06..512e0db4 100644 --- a/client/router.js +++ b/client/router.js @@ -2,21 +2,25 @@ import Vue from 'vue'; import VueRouter from 'vue-router'; import _ from 'lodash'; -import App from './components/App.vue'; +//немедленная загрузка +import CardIndex from './components/CardIndex/CardIndex.vue'; +//const CardIndex = () => import('./components/CardIndex/CardIndex.vue'); -const CardIndex = () => import('./components/CardIndex/CardIndex.vue'); const Search = () => import('./components/CardIndex/Search/Search.vue'); const Card = () => import('./components/CardIndex/Card/Card.vue'); const Book = () => import('./components/CardIndex/Book/Book.vue'); const History = () => import('./components/CardIndex/History/History.vue'); -const Reader = () => import('./components/Reader/Reader.vue'); +//немедленная загрузка +//const Reader = () => import('./components/Reader/Reader.vue'); +import Reader from './components/Reader/Reader.vue'; + //const Forum = () => import('./components/Forum/Forum.vue'); const Income = () => import('./components/Income/Income.vue'); const Sources = () => import('./components/Sources/Sources.vue'); const Settings = () => import('./components/Settings/Settings.vue'); const Help = () => import('./components/Help/Help.vue'); -const NotFound404 = () => import('./components/NotFound404/NotFound404.vue'); +//const NotFound404 = () => import('./components/NotFound404/NotFound404.vue'); const myRoutes = [ ['/', null, null, '/cardindex'], diff --git a/client/share/utils.js b/client/share/utils.js index 1469fbc1..c97aaf99 100644 --- a/client/share/utils.js +++ b/client/share/utils.js @@ -166,3 +166,27 @@ export function applyObjDiff(obj, diff, isAddChanged) { return result; } + +export function parseQuery(str) { + if (typeof str != 'string' || str.length == 0) + return {}; + let s = str.split('&'); + let s_length = s.length; + let bit, query = {}, first, second; + + for (let i = 0; i < s_length; i++) { + bit = s[i].split('='); + first = decodeURIComponent(bit[0]); + if (first.length == 0) + continue; + second = decodeURIComponent(bit[1]); + if (typeof query[first] == 'undefined') + query[first] = second; + else + if (query[first] instanceof Array) + query[first].push(second); + else + query[first] = [query[first], second]; + } + return query; +} \ No newline at end of file diff --git a/package.json b/package.json index a4011faf..41aa96f9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "Liberama", - "version": "0.6.9", + "version": "0.6.10", "engines": { "node": ">=10.0.0" },