Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f650124428 | ||
|
|
795d109c76 | ||
|
|
6868b3effc | ||
|
|
26747b7013 | ||
|
|
5198f8aa60 | ||
|
|
552da48a32 | ||
|
|
db8a688620 | ||
|
|
3088028d05 | ||
|
|
fd62ef865d | ||
|
|
ed74ed00ed | ||
|
|
741317aaaf | ||
|
|
9b6ecd4e6b | ||
|
|
7863b3358e | ||
|
|
e1be68ec3d | ||
|
|
a054186d4b |
@@ -55,6 +55,6 @@ module.exports = merge(baseWpConfig, {
|
|||||||
filename: `${publicDir}/index.html`
|
filename: `${publicDir}/index.html`
|
||||||
}),
|
}),
|
||||||
new CopyWebpackPlugin([{from: `${clientDir}/assets/*`, to: `${publicDir}/`, flatten: true}]),
|
new CopyWebpackPlugin([{from: `${clientDir}/assets/*`, to: `${publicDir}/`, flatten: true}]),
|
||||||
new AppCachePlugin({})
|
new AppCachePlugin({exclude: ['../index.html']})
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -38,6 +38,9 @@
|
|||||||
<el-tooltip v-show="showToolButton['recentBooks']" content="Открыть недавние" :open-delay="1000" effect="light">
|
<el-tooltip v-show="showToolButton['recentBooks']" content="Открыть недавние" :open-delay="1000" effect="light">
|
||||||
<el-button ref="recentBooks" class="tool-button" :class="buttonActiveClass('recentBooks')" @click="buttonClick('recentBooks')"><i class="el-icon-document"></i></el-button>
|
<el-button ref="recentBooks" class="tool-button" :class="buttonActiveClass('recentBooks')" @click="buttonClick('recentBooks')"><i class="el-icon-document"></i></el-button>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
|
<el-tooltip v-show="showToolButton['offlineMode']" content="Автономный режим (без интернета)" :open-delay="1000" effect="light">
|
||||||
|
<el-button ref="offlineMode" class="tool-button" :class="buttonActiveClass('offlineMode')" @click="buttonClick('offlineMode')"><i class="el-icon-connection"></i></el-button>
|
||||||
|
</el-tooltip>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<el-tooltip content="Настроить" :open-delay="1000" effect="light">
|
<el-tooltip content="Настроить" :open-delay="1000" effect="light">
|
||||||
@@ -257,6 +260,7 @@ class Reader extends Vue {
|
|||||||
searchActive = false;
|
searchActive = false;
|
||||||
copyTextActive = false;
|
copyTextActive = false;
|
||||||
recentBooksActive = false;
|
recentBooksActive = false;
|
||||||
|
offlineModeActive = false;
|
||||||
settingsActive = false;
|
settingsActive = false;
|
||||||
helpActive = false;
|
helpActive = false;
|
||||||
clickMapActive = false;
|
clickMapActive = false;
|
||||||
@@ -696,6 +700,11 @@ class Reader extends Vue {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
offlineModeToggle() {
|
||||||
|
this.offlineModeActive = !this.offlineModeActive;
|
||||||
|
this.$refs.serverStorage.offlineModeActive = this.offlineModeActive;
|
||||||
|
}
|
||||||
|
|
||||||
settingsToggle() {
|
settingsToggle() {
|
||||||
this.settingsActive = !this.settingsActive;
|
this.settingsActive = !this.settingsActive;
|
||||||
if (this.settingsActive) {
|
if (this.settingsActive) {
|
||||||
@@ -781,11 +790,14 @@ class Reader extends Vue {
|
|||||||
case 'copyText':
|
case 'copyText':
|
||||||
this.copyTextToggle();
|
this.copyTextToggle();
|
||||||
break;
|
break;
|
||||||
|
case 'refresh':
|
||||||
|
this.refreshBook();
|
||||||
|
break;
|
||||||
case 'recentBooks':
|
case 'recentBooks':
|
||||||
this.recentBooksToggle();
|
this.recentBooksToggle();
|
||||||
break;
|
break;
|
||||||
case 'refresh':
|
case 'offlineMode':
|
||||||
this.refreshBook();
|
this.offlineModeToggle();
|
||||||
break;
|
break;
|
||||||
case 'settings':
|
case 'settings':
|
||||||
this.settingsToggle();
|
this.settingsToggle();
|
||||||
@@ -806,6 +818,7 @@ class Reader extends Vue {
|
|||||||
case 'search':
|
case 'search':
|
||||||
case 'copyText':
|
case 'copyText':
|
||||||
case 'recentBooks':
|
case 'recentBooks':
|
||||||
|
case 'offlineMode':
|
||||||
case 'settings':
|
case 'settings':
|
||||||
if (this[`${button}Active`])
|
if (this[`${button}Active`])
|
||||||
classResult = classActive;
|
classResult = classActive;
|
||||||
|
|||||||
@@ -71,9 +71,13 @@ class ServerStorage extends Vue {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async bookManagerEvent(eventName, itemKey) {
|
async bookManagerEvent(eventName, itemKey) {
|
||||||
if (eventName == 'recent-changed') {
|
if (!this.serverSyncEnabled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (eventName == 'recent-changed') {
|
||||||
if (itemKey) {
|
if (itemKey) {
|
||||||
if (!this.recentDeltaInited) {
|
if (!this.recentDeltaInited) {
|
||||||
|
await this.loadRecent();
|
||||||
this.warning('Функции сохранения на сервер пока недоступны');
|
this.warning('Функции сохранения на сервер пока недоступны');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -172,12 +176,12 @@ class ServerStorage extends Vue {
|
|||||||
}
|
}
|
||||||
|
|
||||||
warning(message) {
|
warning(message) {
|
||||||
if (this.showServerStorageMessages)
|
if (this.showServerStorageMessages && !this.offlineModeActive)
|
||||||
this.$notify.warning({message});
|
this.$notify.warning({message});
|
||||||
}
|
}
|
||||||
|
|
||||||
error(message) {
|
error(message) {
|
||||||
if (this.showServerStorageMessages)
|
if (this.showServerStorageMessages && !this.offlineModeActive)
|
||||||
this.$notify.error({message});
|
this.$notify.error({message});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -358,78 +362,80 @@ class ServerStorage extends Vue {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async loadRecent(doNotifySuccess = true) {
|
async loadRecent(skipRevCheck = false, doNotifySuccess = true) {
|
||||||
if (!this.keyInited || !this.serverSyncEnabled)
|
if (!this.keyInited || !this.serverSyncEnabled || this.loadingRecent)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const oldRecentRev = bookManager.recentRev;
|
this.loadingRecent = true;
|
||||||
const oldRecentDeltaRev = bookManager.recentDeltaRev;
|
|
||||||
//проверим ревизию на сервере
|
|
||||||
let revs = null;
|
|
||||||
try {
|
try {
|
||||||
revs = await this.storageCheck({recent: {}, recentDelta: {}});
|
const oldRecentRev = bookManager.recentRev;
|
||||||
if (revs.state == 'success' && revs.items.recent.rev == oldRecentRev &&
|
const oldRecentDeltaRev = bookManager.recentDeltaRev;
|
||||||
revs.items.recentDelta.rev == oldRecentDeltaRev) {
|
//проверим ревизию на сервере
|
||||||
if (!this.recentDeltaInited)
|
let revs = null;
|
||||||
await this.initRecentDelta();
|
if (!skipRevCheck) {
|
||||||
|
try {
|
||||||
|
revs = await this.storageCheck({recent: {}, recentDelta: {}});
|
||||||
|
if (revs.state == 'success' && revs.items.recent.rev == oldRecentRev &&
|
||||||
|
revs.items.recentDelta.rev == oldRecentDeltaRev) {
|
||||||
|
if (!this.recentDeltaInited)
|
||||||
|
await this.initRecentDelta();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} catch(e) {
|
||||||
|
this.error(`Ошибка соединения с сервером: ${e.message}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let recent = null;
|
||||||
|
try {
|
||||||
|
recent = await this.storageGet({recent: {}, recentDelta: {}});
|
||||||
|
} catch(e) {
|
||||||
|
this.error(`Ошибка соединения с сервером: ${e.message}`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} catch(e) {
|
|
||||||
this.error(`Ошибка соединения с сервером: ${e.message}`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let recent = null;
|
if (recent.state == 'success') {
|
||||||
try {
|
let recentDelta = recent.items.recentDelta;
|
||||||
if (revs.items.recent.rev != oldRecentRev) {
|
recent = recent.items.recent;
|
||||||
recent = await this.storageGet({recent: {}, recentDelta: {}});
|
|
||||||
} else {
|
|
||||||
recent = await this.storageGet({recentDelta: {}});
|
|
||||||
recent.items.recent = {data: _.cloneDeep(bookManager.recent), rev: oldRecentRev};
|
|
||||||
}
|
|
||||||
} catch(e) {
|
|
||||||
this.error(`Ошибка соединения с сервером: ${e.message}`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (recent.state == 'success') {
|
if (recent.rev == 0)
|
||||||
let recentDelta = recent.items.recentDelta;
|
recent.data = {};
|
||||||
recent = recent.items.recent;
|
|
||||||
|
|
||||||
if (recent.rev == 0)
|
let newRecent = {};
|
||||||
recent.data = {};
|
if (recentDelta && recentDelta.data) {
|
||||||
|
if (recentDelta.data.diff) {
|
||||||
let newRecent = {};
|
newRecent = recent.data;
|
||||||
if (recentDelta && recentDelta.data) {
|
const key = recentDelta.data.diff.key;
|
||||||
if (recentDelta.data.diff) {
|
if (newRecent[key])
|
||||||
newRecent = recent.data;
|
newRecent[key] = utils.applyObjDiff(newRecent[key], recentDelta.data.diff);
|
||||||
const key = recentDelta.data.diff.key;
|
} else {
|
||||||
if (newRecent[key])
|
newRecent = Object.assign(recent.data, recentDelta.data);
|
||||||
newRecent[key] = utils.applyObjDiff(newRecent[key], recentDelta.data.diff);
|
}
|
||||||
|
this.recentDelta = recentDelta.data;
|
||||||
} else {
|
} else {
|
||||||
newRecent = Object.assign(recent.data, recentDelta.data);
|
newRecent = recent.data;
|
||||||
|
this.recentDelta = {};
|
||||||
}
|
}
|
||||||
this.recentDelta = recentDelta.data;
|
|
||||||
|
this.recentDeltaInited = true;
|
||||||
|
|
||||||
|
if (!bookManager.loaded) {
|
||||||
|
this.warning('Ожидание загрузки списка книг перед синхронизацией');
|
||||||
|
while (!bookManager.loaded) await utils.sleep(100);
|
||||||
|
}
|
||||||
|
await bookManager.setRecent(newRecent);
|
||||||
|
await bookManager.setRecentRev(recent.rev);
|
||||||
|
await bookManager.setRecentDeltaRev(recentDelta.rev);
|
||||||
} else {
|
} else {
|
||||||
newRecent = recent.data;
|
this.warning(`Неверный ответ сервера: ${recent.state}`);
|
||||||
this.recentDelta = {};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.recentDeltaInited = true;
|
if (doNotifySuccess)
|
||||||
|
this.debouncedNotifySuccess();
|
||||||
if (!bookManager.loaded) {
|
} finally {
|
||||||
this.warning('Ожидание загрузки списка книг перед синхронизацией');
|
this.loadingRecent = false;
|
||||||
while (!bookManager.loaded) await utils.sleep(100);
|
|
||||||
}
|
|
||||||
await bookManager.setRecent(newRecent);
|
|
||||||
await bookManager.setRecentRev(recent.rev);
|
|
||||||
await bookManager.setRecentDeltaRev(recentDelta.rev);
|
|
||||||
} else {
|
|
||||||
this.warning(`Неверный ответ сервера: ${recent.state}`);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (doNotifySuccess)
|
|
||||||
this.debouncedNotifySuccess();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async saveRecent(itemKey, recurse) {
|
async saveRecent(itemKey, recurse) {
|
||||||
@@ -482,7 +488,9 @@ class ServerStorage extends Vue {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (result.state == 'reject') {
|
if (result.state == 'reject') {
|
||||||
await this.loadRecent(false);
|
|
||||||
|
await this.loadRecent(true, false);
|
||||||
|
|
||||||
this.warning(`Последние изменения отменены. Данные синхронизированы с сервером.`);
|
this.warning(`Последние изменения отменены. Данные синхронизированы с сервером.`);
|
||||||
if (!recurse) {
|
if (!recurse) {
|
||||||
this.savingRecent = false;
|
this.savingRecent = false;
|
||||||
@@ -508,7 +516,9 @@ class ServerStorage extends Vue {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (result.state == 'reject') {
|
if (result.state == 'reject') {
|
||||||
await this.loadRecent(false);
|
|
||||||
|
await this.loadRecent(true, false);
|
||||||
|
|
||||||
this.warning(`Последние изменения отменены. Данные синхронизированы с сервером.`);
|
this.warning(`Последние изменения отменены. Данные синхронизированы с сервером.`);
|
||||||
if (!recurse) {
|
if (!recurse) {
|
||||||
this.savingRecent = false;
|
this.savingRecent = false;
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ export const versionHistory = [
|
|||||||
`
|
`
|
||||||
<ul>
|
<ul>
|
||||||
<li>исправления багов</li>
|
<li>исправления багов</li>
|
||||||
|
<li>на панель управления добавлена кнопка "Автономный режим"</li>
|
||||||
</ul>
|
</ul>
|
||||||
`
|
`
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ const toolButtons = [
|
|||||||
{name: 'copyText', show: false, text: 'Скопировать текст со страницы'},
|
{name: 'copyText', show: false, text: 'Скопировать текст со страницы'},
|
||||||
{name: 'refresh', show: true, text: 'Принудительно обновить книгу'},
|
{name: 'refresh', show: true, text: 'Принудительно обновить книгу'},
|
||||||
{name: 'recentBooks', show: true, text: 'Открыть недавние'},
|
{name: 'recentBooks', show: true, text: 'Открыть недавние'},
|
||||||
|
{name: 'offlineMode', show: false, text: 'Автономный режим (без интернета)'},
|
||||||
];
|
];
|
||||||
|
|
||||||
const fonts = [
|
const fonts = [
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user