Forráskód Böngészése

Merge branch 'release/1.2.0'

Book Pauk 1 éve
szülő
commit
cafdb5b04b

+ 4 - 0
README.md

@@ -115,6 +115,10 @@ Options:
 
     // Подключение себя, как клиента, к серверу обновлений
     "bucServer": false
+
+    // Сcылка для открытия в новом окне брауpера по клику на кнопку "Сетевая библиотека"
+    // Если не задано, открывается внутренний менеджер библиотек с использванием фрейма
+    "networkLibraryLink": "http://samlib.ru/"
 }
 ```
 

+ 1 - 1
client/api/misc.js

@@ -4,7 +4,7 @@ class Misc {
     async loadConfig() {
 
         const query = {params: [
-            'name', 'version', 'mode', 'maxUploadFileSize', 'useExternalBookConverter', 'acceptFileExt', 'bucEnabled', 'branch',
+            'name', 'version', 'mode', 'maxUploadFileSize', 'useExternalBookConverter', 'acceptFileExt', 'bucEnabled', 'branch', 'networkLibraryLink',
         ]};
 
         const config = await wsc.message(await wsc.send(Object.assign({action: 'get-config'}, query)));

+ 6 - 0
client/components/Reader/Reader.vue

@@ -1032,6 +1032,11 @@ class Reader {
     }
 
     libsToogle() {
+        if (this.config.networkLibraryLink) {
+            window.open(this.config.networkLibraryLink, '_blank');
+            return;
+        }
+
         this.libsActive = !this.libsActive;
         if (this.libsActive) {
             this.$refs.libsPage.init();//no await
@@ -1379,6 +1384,7 @@ class Reader {
                 found = (found ? _.cloneDeep(found) : found);
 
                 if (found) {
+                    //если такой файл уже не загружен (path не совпадают)
                     if (wasOpened.sameBookKey != found.sameBookKey) {
                         //спрашиваем, надо ли объединить файлы
                         const askResult = bookManager.keysEqual(found.path, addedBook.path) || 

+ 37 - 12
client/components/Reader/RecentBooksPage/RecentBooksPage.vue

@@ -201,7 +201,7 @@
 
                         <div
                             class="del-button self-end row justify-center items-center clickable"
-                            @click="handleDel(item.key)"
+                            @click="handleDel(item)"
                         >
                             <q-icon class="la la-times" size="12px" />
                             <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">
@@ -212,7 +212,7 @@
                         <div
                             v-show="showArchive"
                             class="restore-button self-start row justify-center items-center clickable"
-                            @click="handleRestore(item.key)"
+                            @click="handleRestore(item)"
                         >
                             <q-icon class="la la-arrow-left" size="14px" />
                             <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">
@@ -593,21 +593,46 @@ class RecentBooksPage {
         }
     }
 
-    async handleDel(key) {
-        if (!this.showArchive) {
-            await bookManager.delRecentBook({key});
-            this.$root.notify.info('Перенесено в архив');
+    async handleDel(item) {
+        if (item.group) {
+            const keys = [{key: item.key}];
+            for (const book of item.group)
+                keys.push({key: book.key});
+
+            if (!this.showArchive) {
+                await bookManager.delRecentBooks(keys);
+                this.$root.notify.info(`Группа книг (всего ${keys.length}) перенесена в архив`);
+            } else {
+                if (await this.$root.stdDialog.confirm(`Подтвердите удаление группы книг (всего ${keys.length}) из архива:`, ' ')) {
+                    await bookManager.delRecentBooks(keys, 2);
+                    this.$root.notify.info('Группа книг удалена безвозвратно');
+                }
+            }
         } else {
-            if (await this.$root.stdDialog.confirm('Подтвердите удаление из архива:', ' ')) {
-                await bookManager.delRecentBook({key}, 2);
-                this.$root.notify.info('Удалено безвозвратно');
+            if (!this.showArchive) {
+                await bookManager.delRecentBooks([{key: item.key}]);
+                this.$root.notify.info('Книга перенесена в архив');
+            } else {
+                if (await this.$root.stdDialog.confirm('Подтвердите удаление книги из архива:', ' ')) {
+                    await bookManager.delRecentBooks([{key: item.key}], 2);
+                    this.$root.notify.info('Книга удалено безвозвратно');
+                }
             }
         }
     }
 
-    async handleRestore(key) {
-        await bookManager.restoreRecentBook({key});
-        this.$root.notify.info('Восстановлено из архива');
+    async handleRestore(item) {
+        if (item.group) {
+            const keys = [{key: item.key}];
+            for (const book of item.group)
+                keys.push({key: book.key});
+
+            await bookManager.restoreRecentBooks(keys);
+            this.$root.notify.info(`Группа книг (всего ${keys.length}) восстановлена из архива`);
+        } else {
+            await bookManager.restoreRecentBooks([{key: item.key}]);
+            this.$root.notify.info('Книга восстановлена из архива');
+        }
     }
 
     async loadBook(item, force = false) {

+ 25 - 1
client/components/Reader/share/bookManager.js

@@ -467,7 +467,7 @@ class BookManager {
     async getRecentBook(value) {
         return this.recent[value.key];
     }
-
+/*
     async delRecentBook(value, delFlag = 1) {
         const item = this.recent[value.key];
         item.deleted = delFlag;
@@ -479,13 +479,37 @@ class BookManager {
         await this.recentSetItem(item);
         this.emit('recent-deleted', value.key);
     }
+*/
+    async delRecentBooks(values, delFlag = 1) {
+        for (const value of values) {
+            const item = this.recent[value.key];
+            item.deleted = delFlag;
+
+            if (this.recentLastKey == value.key) {
+                await this.recentSetLastKey(null);
+            }
 
+            await this.recentSetItem(item);
+        }
+        
+        this.emit('recent-deleted');
+    }
+/*
     async restoreRecentBook(value) {
         const item = this.recent[value.key];
         item.deleted = 0;
 
         await this.recentSetItem(item);
     }
+*/
+    async restoreRecentBooks(values) {
+        for (const value of values) {
+            const item = this.recent[value.key];
+            item.deleted = 0;
+
+            await this.recentSetItem(item);
+        }
+    }
 
     async setCheckBuc(value, checkBuc) {
         const item = this.recent[value.key];

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

@@ -1,4 +1,18 @@
 export const versionHistory = [
+{
+    version: '1.2.0',
+    releaseDate: '2024-03-25',
+    showUntil: '2024-03-24',
+    content:
+`
+<ul>
+    <li>в списке загруженных, книга в архив (из архива) переносится теперь со всей группой своих версий</li>
+    <li>добавлена возможность задавать в конфиге любую ссылку для кнопки "Сетевая библиотека", параматр networkLibraryLink (#47)</li>
+</ul>
+
+`
+},
+
 {
     version: '1.1.3',
     releaseDate: '2023-02-06',

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 287 - 330
package-lock.json


+ 33 - 33
package.json

@@ -1,6 +1,6 @@
 {
   "name": "liberama",
-  "version": "1.1.3",
+  "version": "1.2.0",
   "author": "Book Pauk <bookpauk@gmail.com>",
   "license": "CC0-1.0",
   "repository": "bookpauk/liberama",
@@ -25,41 +25,41 @@
     "scripts": "server/config/*.js"
   },
   "devDependencies": {
-    "@babel/core": "^7.20.5",
-    "@babel/eslint-parser": "^7.19.1",
-    "@babel/eslint-plugin": "^7.19.1",
-    "@babel/plugin-proposal-decorators": "^7.20.5",
-    "@babel/preset-env": "^7.20.2",
+    "@babel/core": "^7.23.5",
+    "@babel/eslint-parser": "^7.23.3",
+    "@babel/eslint-plugin": "^7.23.5",
+    "@babel/plugin-proposal-decorators": "^7.23.5",
+    "@babel/preset-env": "^7.23.5",
     "@vue/compiler-sfc": "^3.2.22",
-    "babel-loader": "^9.1.0",
+    "babel-loader": "^9.1.3",
     "copy-webpack-plugin": "^11.0.0",
-    "css-loader": "^6.7.3",
+    "css-loader": "^6.8.1",
     "css-minimizer-webpack-plugin": "^4.2.2",
-    "eslint": "^8.29.0",
-    "eslint-plugin-vue": "^9.8.0",
-    "html-webpack-plugin": "^5.5.0",
-    "mini-css-extract-plugin": "^2.7.2",
-    "pkg": "^5.8.0",
+    "eslint": "^8.55.0",
+    "eslint-plugin-vue": "^9.19.2",
+    "html-webpack-plugin": "^5.5.4",
+    "mini-css-extract-plugin": "^2.7.6",
+    "pkg": "^5.8.1",
     "showdown": "^2.1.0",
-    "terser-webpack-plugin": "^5.3.6",
-    "vue-eslint-parser": "^9.1.0",
-    "vue-loader": "^17.0.1",
+    "terser-webpack-plugin": "^5.3.9",
+    "vue-eslint-parser": "^9.3.2",
+    "vue-loader": "^17.3.1",
     "vue-style-loader": "^4.1.3",
-    "webpack": "^5.75.0",
-    "webpack-cli": "^5.0.1",
-    "webpack-dev-middleware": "^6.0.1",
-    "webpack-hot-middleware": "^2.25.3",
-    "webpack-merge": "^5.8.0",
-    "workbox-webpack-plugin": "^6.5.4"
+    "webpack": "^5.89.0",
+    "webpack-cli": "^5.1.4",
+    "webpack-dev-middleware": "^6.1.1",
+    "webpack-hot-middleware": "^2.25.4",
+    "webpack-merge": "^5.10.0",
+    "workbox-webpack-plugin": "^6.6.0"
   },
   "dependencies": {
-    "@quasar/extras": "^1.15.8",
-    "@vue/compat": "^3.2.45",
+    "@quasar/extras": "^1.16.9",
+    "@vue/compat": "^3.3.10",
     "axios": "^0.27.2",
     "base-x": "^4.0.0",
-    "chardet": "^1.5.0",
+    "chardet": "^1.6.0",
     "compression": "^1.7.4",
-    "dayjs": "^1.11.7",
+    "dayjs": "^1.11.10",
     "express": "^4.18.2",
     "fg-loadcss": "^3.1.0",
     "fs-extra": "^10.1.0",
@@ -68,23 +68,23 @@
     "jembadb": "^5.1.7",
     "localforage": "^1.10.0",
     "lodash": "^4.17.21",
-    "minimist": "^1.2.7",
+    "minimist": "^1.2.8",
     "multer": "^1.4.5-lts.1",
     "pako": "^2.1.0",
     "path-browserify": "^1.0.1",
     "pidusage": "^3.0.2",
-    "quasar": "^2.10.2",
+    "quasar": "^2.14.1",
     "safe-buffer": "^5.2.1",
-    "sanitize-html": "^2.8.0",
+    "sanitize-html": "^2.11.0",
     "sjcl": "^1.0.8",
     "tar-fs": "^2.1.1",
     "unbzip2-stream": "^1.4.3",
     "vue": "^3.2.37",
-    "vue-router": "^4.1.6",
+    "vue-router": "^4.2.5",
     "vuex": "^4.1.0",
     "vuex-persist": "^3.1.3",
-    "webdav": "^4.11.2",
-    "ws": "^8.11.0",
-    "zip-stream": "^4.1.0"
+    "webdav": "^4.11.3",
+    "ws": "^8.14.2",
+    "zip-stream": "^4.1.1"
   }
 }

+ 2 - 1
server/config/base.js

@@ -18,7 +18,7 @@ module.exports = {
 
     useExternalBookConverter: false,
     acceptFileExt: '.fb2, .fb3, .html, .txt, .zip, .bz2, .gz, .rar, .epub, .mobi, .rtf, .doc, .docx, .pdf, .djvu, .jpg, .jpeg, .png',
-    webConfigParams: ['name', 'version', 'mode', 'maxUploadFileSize', 'useExternalBookConverter', 'acceptFileExt', 'bucEnabled', 'branch'],
+    webConfigParams: ['name', 'version', 'mode', 'maxUploadFileSize', 'useExternalBookConverter', 'acceptFileExt', 'bucEnabled', 'branch', 'networkLibraryLink'],
 
     jembaDb: [
         {
@@ -74,5 +74,6 @@ module.exports = {
         accessToken: '',
     }
     */
+    networkLibraryLink: '',
 };
 

+ 1 - 0
server/config/index.js

@@ -14,6 +14,7 @@ const propsToSave = [
     'remoteStorage',
     'bucEnabled',
     'bucServer',
+    'networkLibraryLink',
 ];
 
 let instance = null;

Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott