diff --git a/client/components/ExternalLibs/BookmarkSettings/BookmarkSettings.vue b/client/components/ExternalLibs/BookmarkSettings/BookmarkSettings.vue index 0924bf42..90ca0dc6 100644 --- a/client/components/ExternalLibs/BookmarkSettings/BookmarkSettings.vue +++ b/client/components/ExternalLibs/BookmarkSettings/BookmarkSettings.vue @@ -6,10 +6,13 @@
- + Открыть выбранную закладку - + + Опции @@ -39,13 +42,19 @@ + :filter="search" + no-nodes-label="Закладок пока нет" + no-results-label="Ничего не найдено" + > + +
@@ -58,6 +67,8 @@ import Vue from 'vue'; import Component from 'vue-class-component'; import Window from '../../share/Window.vue'; +import * as lu from '../linkUtils'; + const BookmarkSettingsProps = Vue.extend({ props: { libs: Object, @@ -92,12 +103,23 @@ class BookmarkSettings extends BookmarkSettingsProps { get nodes() { const result = []; + this.expanded = []; let i = 0; this.libs.groups.forEach(group => { - const g = {label: group.r, key: `${i}`, children: []}; + const rkey = `${i}`; + const g = {label: group.r, key: rkey, children: []}; let j = 0; group.list.forEach(link => { - g.children.push({label: (link.c ? link.c + ' ': '') + link.l, key: `${i}-${j}`}); + const key = `${i}-${j}`; + g.children.push({ + label: (link.c ? link.c + ' ': '') + lu.removeOrigin(link.l), + key + }); + if (link.l == this.libs.startLink && this.expanded.indexOf(rkey) < 0) { + this.expanded.push(rkey); + } + + j++; }); result.push(g); @@ -107,6 +129,11 @@ class BookmarkSettings extends BookmarkSettingsProps { return result; } + resetSearch() { + this.search = ''; + this.$refs.search.focus(); + } + openSelected() { } @@ -145,4 +172,8 @@ class BookmarkSettings extends BookmarkSettingsProps { .tree { padding: 10px; } + +.selected { + text-shadow: 0 0 20px yellow, 0 0 15px yellow, 0 0 10px yellow, 0 0 10px yellow, 0 0 5px yellow; +} diff --git a/client/components/ExternalLibs/ExternalLibs.vue b/client/components/ExternalLibs/ExternalLibs.vue index 92829d49..2439aaf5 100644 --- a/client/components/ExternalLibs/ExternalLibs.vue +++ b/client/components/ExternalLibs/ExternalLibs.vue @@ -28,7 +28,7 @@ @@ -113,6 +113,7 @@ import BookmarkSettings from './BookmarkSettings/BookmarkSettings.vue'; import rstore from '../../store/modules/reader'; import * as utils from '../../share/utils'; +import * as lu from './linkUtils'; const proxySubst = { 'http://flibusta.is': 'http://b.liberama.top:23480', @@ -286,8 +287,8 @@ class ExternalLibs extends Vue { loadLibs() { const libs = this.libs; - this.startLink = (libs.comment ? libs.comment + ' ': '') + this.removeProtocol(libs.startLink); - this.rootLink = this.getOrigin(libs.startLink); + this.startLink = (libs.comment ? libs.comment + ' ': '') + lu.removeProtocol(libs.startLink); + this.rootLink = lu.getOrigin(libs.startLink); this.updateSelectedLink(); } @@ -304,10 +305,14 @@ class ExternalLibs extends Vue { return result; } + get rootLinkWithoutProtocol() { + return lu.removeProtocol(this.rootLink); + } + updateSelectedLink() { if (!this.ready) return; - const index = this.getRootIndexByUrl(this.libs.groups, this.rootLink); + const index = lu.getRootIndexByUrl(this.libs.groups, this.rootLink); if (index >= 0) this.selectedLink = this.libs.groups[index].s; } @@ -315,7 +320,7 @@ class ExternalLibs extends Vue { updateStartLink() { if (!this.ready) return; - const index = this.getRootIndexByUrl(this.libs.groups, this.rootLink); + const index = lu.getRootIndexByUrl(this.libs.groups, this.rootLink); if (index >= 0) { let libs = _.cloneDeep(this.libs); libs.groups[index].s = this.selectedLink; @@ -332,7 +337,7 @@ class ExternalLibs extends Vue { return result; this.libs.groups.forEach(group => { - result.push({label: this.removeProtocol(group.r), value: group.r}); + result.push({label: lu.removeProtocol(group.r), value: group.r}); }); return result; @@ -342,7 +347,7 @@ class ExternalLibs extends Vue { let result = []; rstore.libsDefaults.groups.forEach(group => { - result.push({label: this.removeProtocol(group.r), value: group.r}); + result.push({label: lu.removeProtocol(group.r), value: group.r}); }); return result; @@ -353,10 +358,10 @@ class ExternalLibs extends Vue { if (!this.ready) return result; - const index = this.getRootIndexByUrl(this.libs.groups, this.rootLink); + const index = lu.getRootIndexByUrl(this.libs.groups, this.rootLink); if (index >= 0) { this.libs.groups[index].list.forEach(link => { - result.push({label: (link.c ? link.c + ' ': '') + this.removeOrigin(link.l), value: link.l}); + result.push({label: (link.c ? link.c + ' ': '') + lu.removeOrigin(link.l), value: link.l}); }); } @@ -365,7 +370,7 @@ class ExternalLibs extends Vue { openBookUrlInFrame() { if (this.bookUrl) { - this.goToLink(this.addProtocol(this.bookUrl)); + this.goToLink(lu.addProtocol(this.bookUrl)); } } @@ -383,48 +388,8 @@ class ExternalLibs extends Vue { }); } - addProtocol(url) { - if ((url.indexOf('http://') != 0) && (url.indexOf('https://') != 0)) - return 'http://' + url; - return url; - } - - removeProtocol(url) { - return url.replace(/(^\w+:|^)\/\//, ''); - } - - getOrigin(url) { - const parsed = new URL(url); - return parsed.origin; - } - - removeOrigin(url) { - const parsed = new URL(url); - const result = url.substring(parsed.origin.length); - return (result ? result : '/'); - } - - getRootIndexByUrl(groups, url) { - if (!this.ready) - return -1; - const origin = this.getOrigin(url); - for (let i = 0; i < groups.length; i++) { - if (groups[i].r == origin) - return i; - } - return -1; - } - - getListItemByLink(list, link) { - for (const item of list) { - if (item.l == link) - return item; - } - return null; - } - getCommentByLink(list, link) { - const item = this.getListItemByLink(list, link); + const item = lu.getListItemByLink(list, link); return (item ? item.c : ''); } @@ -457,7 +422,7 @@ class ExternalLibs extends Vue { submitUrl() { if (this.bookUrl) { this.sendMessage({type: 'submitUrl', data: { - url: this.makeProxySubst(this.addProtocol(this.bookUrl), true), + url: this.makeProxySubst(lu.addProtocol(this.bookUrl), true), force: true }}); this.bookUrl = ''; @@ -467,7 +432,7 @@ class ExternalLibs extends Vue { } addBookmark() { - this.bookmarkLink = (this.bookUrl ? this.makeProxySubst(this.addProtocol(this.bookUrl), true) : ''); + this.bookmarkLink = (this.bookUrl ? this.makeProxySubst(lu.addProtocol(this.bookUrl), true) : ''); this.bookmarkDesc = ''; this.addBookmarkVisible = true; this.$nextTick(() => { @@ -477,7 +442,7 @@ class ExternalLibs extends Vue { } updateBookmarkLink() { - const index = this.getRootIndexByUrl(rstore.libsDefaults.groups, this.defaultRootLink); + const index = lu.getRootIndexByUrl(rstore.libsDefaults.groups, this.defaultRootLink); if (index >= 0) { this.bookmarkLink = rstore.libsDefaults.groups[index].s; this.bookmarkDesc = this.getCommentByLink(rstore.libsDefaults.groups[index].list, this.bookmarkLink); @@ -509,10 +474,10 @@ class ExternalLibs extends Vue { if (!this.bookmarkLink) return; - const link = this.addProtocol(this.bookmarkLink); + const link = lu.addProtocol(this.bookmarkLink); let index = -1; try { - index = this.getRootIndexByUrl(this.libs.groups, link); + index = lu.getRootIndexByUrl(this.libs.groups, link); } catch (e) { await this.$root.stdDialog.alert('Неверный формат ссылки', 'Ошибка'); return; @@ -520,7 +485,7 @@ class ExternalLibs extends Vue { //есть группа в закладках if (index >= 0) { - const item = this.getListItemByLink(this.libs.groups[index].list, link); + const item = lu.getListItemByLink(this.libs.groups[index].list, link); if (!item || item.c != this.bookmarkDesc) { //добавляем @@ -543,9 +508,9 @@ class ExternalLibs extends Vue { } //добавляем сначала группу - libs.groups.push({r: this.getOrigin(link), s: link, list: []}); + libs.groups.push({r: lu.getOrigin(link), s: link, list: []}); - index = this.getRootIndexByUrl(libs.groups, link); + index = lu.getRootIndexByUrl(libs.groups, link); if (index >= 0) libs.groups[index].list.push({l: link, c: this.bookmarkDesc}); diff --git a/client/components/ExternalLibs/linkUtils.js b/client/components/ExternalLibs/linkUtils.js new file mode 100644 index 00000000..a837ac21 --- /dev/null +++ b/client/components/ExternalLibs/linkUtils.js @@ -0,0 +1,38 @@ +export function addProtocol(url) { + if ((url.indexOf('http://') != 0) && (url.indexOf('https://') != 0)) + return 'http://' + url; + return url; +} + +export function removeProtocol(url) { + return url.replace(/(^\w+:|^)\/\//, ''); +} + +export function getOrigin(url) { + const parsed = new URL(url); + return parsed.origin; +} + +export function removeOrigin(url) { + const parsed = new URL(url); + const result = url.substring(parsed.origin.length); + return (result ? result : '/'); +} + +export function getRootIndexByUrl(groups, url) { + const origin = this.getOrigin(url); + for (let i = 0; i < groups.length; i++) { + if (groups[i].r == origin) + return i; + } + return -1; +} + +export function getListItemByLink(list, link) { + for (const item of list) { + if (item.l == link) + return item; + } + return null; +} +