Skip to content

Commit 0bf900e

Browse files
committed
Элемент "назад" в последней ячейке, URL теперь не валидится, README
1 parent c5b3d56 commit 0bf900e

File tree

7 files changed

+98
-33
lines changed

7 files changed

+98
-33
lines changed

README.md

+39-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,41 @@
11
# Multilevel Speed Dial
2+
Организуй часто посещаемые сайты в удобное меню визуальных закладок вместо
3+
пустой страницы браузера. Закладки можно собирать в папки, а папки - в другие
4+
папки. Быстро открыть закладку или папку можно с любой другой вкладки,
5+
используя сочетания клавиш на клавиатуре. Каждую папку можно стилизовать.
6+
Если не хочешь привлекать внимание к какой-либо закладке, её не обязательно
7+
прятать куда-нибудь подальше, а можно лишь скрыть её превью и/или заголовок
8+
и расположить так, как будет удобно. Структуру закладок можно легко
9+
синхронизировать между разными устройствами или сохранить на диск.
210

3-
Extension for Mozilla Firefox that adds visual bookmarks. Bookmarks can be divided into folders for orderly accessing. User can navigate through saved bookmarks by opening new tab or by using shortcut with bookmark's code.
11+
# Зачем этому расширению различные полномочия?
12+
- Хранение неограниченного количества клиентских данных:
13+
- хранение информации о закладках и папках;
14+
- хранение настроек;
15+
- Доступ к истории просмотров:
16+
- составление списка предложений во время создания закладки;
17+
- Доступ ко вкладкам браузера:
18+
- открытие закладок в существующих или новых вкладках;
19+
- обработка сочетаний клавиш для навигации по закладкам с клавиатуры;
20+
- Доступ к данным других сайтов (не обязательно):
21+
- получение информации о страницах во время создания закладок (заголовок
22+
страницы, иконка, скриншот-превью);
23+
- размещение на страницах элементов интерфейса для навигации с клавиатуры;
24+
- Сокрытие и отображение вкладок (не обязательно):
25+
- запрос информации о страницах (заголовка, иконки, скриншота-превью) при
26+
создании и обновлении закладок без отображения новой вкладки на панели
27+
вкладок.
28+
29+
# Навигация с помощью сочетаний клавиш
30+
Открыть закладку или папку (далее - элемент) можно с любой страницы используя
31+
сочетания клавиш клавиатуры сразу после того как страница полностью загрузится.
32+
Для этого следует зажать <kbd>Ctrl</kbd> и, не отпуская, набрать адрес элемента. Адрес - это
33+
номера папок, разделённые слешами (символ "/"), ведущие к данному элементу.
34+
Всё как с файлами и папками на компьютере, но в виде чисел.
35+
36+
Итак, зажав <kbd>Ctrl</kbd>, используй следующие клавиши:
37+
- <kbd>0</kbd>-<kbd>9</kbd> → набор адреса;
38+
- <kbd>+</kbd>/<kbd>-</kbd> → перебор элементов в текущей папке;
39+
- <kbd>/</kbd>/<kbd>SPACE</kbd> → разделитель;
40+
- <kbd>Backspace</kbd> → стереть;
41+
- <kbd>Shift</kbd> → открыть в новой вкладке (достаточно нажать один раз).

_locales/ru/messages.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
"extensionDescription":
88
{
9-
"message": "Организуй часто посещаемые сайты в удобное меню визуальных закладкок вместо\nпустой страницы браузера. Закладки можно собирать в папки, а папки - в другие\nпапки. Быстро открыть закладку или папку можно с любой другой вкладки,\nиспользуя сочетания клавиш на клавиатуре. Каждую папку можно стилизовать.\nЕсли не хочешь привлекать внимание к какой-либо закладке, её не обязательно\nпрятать куда-нибудь подальше, а можно лишь скрыть её превью и/или заголовок\nи расположить так, как бдует удобно. Структуру закладок можно лекго\nсинхронизировать между разными устройствами или сохранить на диск.\n\nЗачем этому расширению различные полномочия?\n- Хранение неограниченного количества клиентских данных:\n - хранение информации о закладках и папках;\n - хранение настроек;\n- Доступ к истории просмотров:\n - составление списка предложений во время создания закладки;\n- Доступ ко вкладкам браузера:\n - открытие закладок в существующих или новых вкладках;\n - обработка сочетаний клавиш для навигации по закладкам с клавиатуры;\n- Доступ к данным других сайтов (не обязательно):\n - получение информации о страницах во время создания закладок (заголовок\n страницы, иконка, скриншот-превью);\n - размещение на страницах элементов интерфейса для навигации с клавиатуры;\n- Сокрытие и отображение вкладок (не обязательно):\n - запрос информации о страницах (заголовка, иконки, скриншота-превью) при\n создании и обновлении закладок без отображения новой вкладки на панели\n вкладок."
9+
"message": "Организуй часто посещаемые сайты в удобное меню визуальных закладок вместо\nпустой страницы браузера. Закладки можно собирать в папки, а папки - в другие\nпапки. Быстро открыть закладку или папку можно с любой другой вкладки,\nиспользуя сочетания клавиш на клавиатуре. Каждую папку можно стилизовать.\nЕсли не хочешь привлекать внимание к какой-либо закладке, её не обязательно\nпрятать куда-нибудь подальше, а можно лишь скрыть её превью и/или заголовок\nи расположить так, как будет удобно. Структуру закладок можно легко\nсинхронизировать между разными устройствами или сохранить на диск.\n\nЗачем этому расширению различные полномочия?\n- Хранение неограниченного количества клиентских данных:\n - хранение информации о закладках и папках;\n - хранение настроек;\n- Доступ к истории просмотров:\n - составление списка предложений во время создания закладки;\n- Доступ ко вкладкам браузера:\n - открытие закладок в существующих или новых вкладках;\n - обработка сочетаний клавиш для навигации по закладкам с клавиатуры;\n- Доступ к данным других сайтов (не обязательно):\n - получение информации о страницах во время создания закладок (заголовок\n страницы, иконка, скриншот-превью);\n - размещение на страницах элементов интерфейса для навигации с клавиатуры;\n- Сокрытие и отображение вкладок (не обязательно):\n - запрос информации о страницах (заголовка, иконки, скриншота-превью) при\n создании и обновлении закладок без отображения новой вкладки на панели\n вкладок."
1010
},
1111

1212
"developerName":

elements/BackstepElement.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Element from './Element.js';
99
*
1010
* @param int number Номер элемента
1111
*/
12-
var BackstepElement = function(number = 1) {
12+
var BackstepElement = function(number) {
1313
Element.call(this, number);
1414
this.type = ElementType.BACKSTEP;
1515
}
@@ -28,7 +28,7 @@ export default BackstepElement;
2828
* элемента с заданными свойствами
2929
*/
3030
BackstepElement.prototype.parseObj = function(data) {
31-
return new BackstepElement();
31+
return new BackstepElement(data.number);
3232
}
3333

3434
/**

elements/Element.js

+18-17
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,6 @@ Element.prototype.onDragEnter = function(event) {
164164
let srcPath = JSON.parse(event.dataTransfer.getData("srcPath"));
165165

166166
let isDragTarget = arraysEqual(currElementPath, srcPath);
167-
let isDropTarget;
168167
if (!isOverDropTarget && !isDragTarget) {
169168
let date = new Date();
170169
dragEnterTime = date.getTime();
@@ -208,22 +207,24 @@ Element.prototype.onDragOver = function(event) {
208207
Element.prototype.onDrop = function(event) {
209208
event.preventDefault();
210209

211-
let currElementPathStr = Array.from(currPath);
212-
currElementPathStr.push(this.number);
213-
currElementPathStr = currElementPathStr.join("/");
214-
let srcPath = JSON.parse(event.dataTransfer.getData("srcPath"));
215-
let srcPathStr = srcPath.join("/");
216-
217-
let isLoopDetected = srcPathStr.startsWith(currElementPathStr);
218-
219-
if (this.type != ElementType.BACKSTEP && !isLoopDetected) {
220-
let dstPath = Array.from(currPath);
221-
dstPath.push(this.number);
222-
223-
swapElements(srcPath, dstPath);
224-
} else {
225-
event.currentTarget.style.borderStyle = "solid";
226-
alert(browser.i18n.getMessage("ohnonono"));
210+
if (this.type != ElementType.BACKSTEP) {
211+
let currElementPathStr = Array.from(currPath);
212+
currElementPathStr.push(this.number);
213+
currElementPathStr = currElementPathStr.join("/");
214+
let srcPath = JSON.parse(event.dataTransfer.getData("srcPath"));
215+
let srcPathStr = srcPath.join("/");
216+
let isLoopDetected = srcPathStr.startsWith(currElementPathStr) &&
217+
srcPathStr.length > currElementPathStr.length;
218+
219+
if (!isLoopDetected) {
220+
let dstPath = Array.from(currPath);
221+
dstPath.push(this.number);
222+
223+
swapElements(srcPath, dstPath);
224+
} else {
225+
event.currentTarget.style.borderStyle = "solid";
226+
alert(browser.i18n.getMessage("ohnonono"));
227+
}
227228
}
228229
}
229230

elements/Folder.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,13 @@ var Folder = function(number, caption, rows = 3, cols = 3,
5858

5959
let amount = this.rows * this.cols;
6060
this.elements = new Array(amount);
61+
for (let i = 0; i < amount - 1; ++i) {
62+
this.elements[i] = new Element(i + 1);
63+
}
6164
if (this.number > 0) {
62-
this.elements[0] = new BackstepElement();
65+
this.elements[amount - 1] = new BackstepElement(amount);
6366
} else {
64-
this.elements[0] = new Element(1);
65-
}
66-
for (let i = 1; i < amount; ++i) {
67-
this.elements[i] = new Element(i + 1);
67+
this.elements[amount - 1] = new Element(amount);
6868
}
6969
}
7070
Folder.prototype = Object.create(FilledElement.prototype);

mlsd.html

+3-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
<div id="assignmentFormContainer">
1717
<form id="assignmentForm" method="post">
1818
<input type="hidden" id="modeTf" name="mode">
19+
<input type="hidden" id="bsNumberTf" name="mode">
1920
<fieldset>
2021
<legend id="cellAssignmentTitle"></legend>
2122
<div>
@@ -37,7 +38,8 @@
3738
<legend id="bookmarkSettingsLabel"></legend>
3839
<p>
3940
<label id="urlLabel"></label>
40-
<input type="url" id="urlTf" name="url" size="80" placeholder="https://www.google.com/" list="urlSuggectionsDL" autocomplete="off" required>
41+
<!--<input type="url" id="urlTf" name="url" size="80" placeholder="https://www.google.com/" list="urlSuggectionsDL" autocomplete="off" required>-->
42+
<input type="text" id="urlTf" name="url" size="80" placeholder="https://www.google.com/" list="urlSuggectionsDL" autocomplete="off" required>
4143
<datalist id="urlSuggectionsDL">
4244
</datalist>
4345
</p>

mlsd.js

+30-6
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,12 @@ window.onload = function() {
8080
onStorageCheckedOut(results);
8181
buildPage(rootFolder);
8282
}, onPromiseFailed);
83-
browser.storage.local.get().then(function(all) { //DEBUG
83+
/*browser.storage.local.get().then(function(all) { //DEBUG
8484
console.log("Stored data: ");
8585
for (let key in all) {
8686
console.log(key, " = ", all[key]);
8787
}
88-
}, onPromiseFailed);
88+
}, onPromiseFailed);*/
8989

9090
/*Вставка строк из файлов локализации*/
9191
document.getElementById("cellAssignmentTitle").textContent = browser.i18n.getMessage("cellAssignmentTitle") + " - " + browser.i18n.getMessage("extensionName");
@@ -190,6 +190,7 @@ export function initFolderForm(folder) {
190190
if (newAmount < oldAmount) {
191191
let elements;
192192
let numberTf = document.getElementById("numberTf");
193+
//let bsNumberTf = document.getElementById("bsNumberTf");
193194
if (folder) {
194195
elements = folder.elements;
195196
} else {
@@ -198,7 +199,8 @@ export function initFolderForm(folder) {
198199
}
199200
let nBookmarks = 0;
200201
let nFolders = 0;
201-
for (let i = newAmount; i < oldAmount; ++i) {
202+
const lastSavedN = newAmount - (numberTf ? 1 : 0);
203+
for (let i = lastSavedN; i < oldAmount; ++i) {
202204
switch (elements[i].type) {
203205
case ElementType.BOOKMARK:
204206
++nBookmarks;
@@ -228,7 +230,7 @@ export function initFolderForm(folder) {
228230
const endingBookmarks = getEnding(nBookmarks);
229231
const endingFolders = getEnding(nFolders);
230232
document.getElementById("elemsWillBeLostLabel").textContent =
231-
browser.i18n.getMessage("elemsWillBeLost", [newAmount,
233+
browser.i18n.getMessage("elemsWillBeLost", [lastSavedN,
232234
nBookmarks, endingBookmarks, nFolders, endingFolders]);
233235
document.getElementById("elemsWillBeLostLabel").style.display = "initial";
234236
} else {
@@ -627,10 +629,18 @@ async function parseAssignmentForm(copyElems) {
627629
if (copyElems) {
628630
let src = getFolderByPath(currPath, rootFolder).elements[number - 1];
629631
if (src.type == ElementType.FOLDER) {
630-
const bound = Math.min(src.elements.length, rows * cols);
632+
let amount = rows * cols;
633+
const bound = Math.min(src.elements.length, amount);
631634
for (let i = 0; i < bound; ++i) {
632635
result.elements[i] = src.elements[i];
633636
}
637+
let bsIndex = getBackstepIndex(result);
638+
console.log("bsIndex = ", bsIndex, " amount = ", amount);
639+
if (bsIndex >= 0 && bsIndex + 1 < amount) {
640+
result.elements[bsIndex] = new Element(bsIndex + 1);
641+
console.log("Done");
642+
}
643+
result.elements[amount - 1] = new BackstepElement(amount);
634644
}
635645
}
636646
} else {
@@ -868,7 +878,21 @@ browser.runtime.onMessage.addListener(function(msg, sender, sendResponse) {
868878
break;
869879
default:
870880
//DEBUG
871-
console.log("Поступила какая-то команда, но мы её проигнорируем");
881+
//console.log("Поступила какая-то команда, но мы её проигнорируем");
872882
break;
873883
}
874884
});
885+
886+
/**
887+
* Поиск элемента возврата в папке
888+
*
889+
* @param Folder folder Папка, в которой осуществляется поиск
890+
*/
891+
function getBackstepIndex(folder) {
892+
for (let i = 0; i < folder.elements.length; ++i) {
893+
if (folder.elements[i].type == ElementType.BACKSTEP) {
894+
return i;
895+
}
896+
}
897+
return -1;
898+
}

0 commit comments

Comments
 (0)