diff --git a/client/components/ExternalLibs/BookmarkSettings/BookmarkSettings.vue b/client/components/ExternalLibs/BookmarkSettings/BookmarkSettings.vue index a1ff69cd..0094cd83 100644 --- a/client/components/ExternalLibs/BookmarkSettings/BookmarkSettings.vue +++ b/client/components/ExternalLibs/BookmarkSettings/BookmarkSettings.vue @@ -9,7 +9,7 @@ Открыть выбранную закладку - + @@ -194,7 +194,58 @@ class BookmarkSettings extends BookmarkSettingsProps { } } - moveBookmark() { + moveBookmark(down = false) { + const newLibs = _.cloneDeep(this.libs); + + const ticked = new Set(this.ticked); + let moved = false; + let prevFull = false; + if (!down) { + for (let i = 0; i < newLibs.groups.length; i++) { + const g = newLibs.groups[i]; + let count = 0; + for (let j = 0; j < g.list.length; j++) { + if (ticked.has(g.list[j].l)) { + if (j > 0 && !ticked.has(g.list[j - 1].l)) { + [g.list[j], g.list[j - 1]] = [g.list[j - 1], g.list[j]]; + moved = true; + } + count++; + } + } + + if (count == g.list.length && !prevFull && i > 0) { + const gs = newLibs.groups; + [gs[i], gs[i - 1]] = [gs[i - 1], gs[i]]; + moved = true; + } else + prevFull = (count == g.list.length); + } + } else { + for (let i = newLibs.groups.length - 1; i >= 0; i--) { + const g = newLibs.groups[i]; + let count = 0; + for (let j = g.list.length - 1; j >= 0; j--) { + if (ticked.has(g.list[j].l)) { + if (j < g.list.length - 1 && !ticked.has(g.list[j + 1].l)) { + [g.list[j], g.list[j + 1]] = [g.list[j + 1], g.list[j]]; + moved = true; + } + count++; + } + } + + if (count == g.list.length && !prevFull && i < newLibs.groups.length - 1) { + const gs = newLibs.groups; + [gs[i], gs[i + 1]] = [gs[i + 1], gs[i]]; + moved = true; + } else + prevFull = (count == g.list.length); + } + } + + if (moved) + this.$emit('do-action', {action: 'setLibs', data: newLibs}); } async setDefaultBookmarks() {