Split javascript into several more managable pieces
This commit is contained in:
parent
15ccd7c41b
commit
c31c5e7058
|
@ -66,7 +66,7 @@
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="newBookmarkGroup">Group</label>
|
<label for="newBookmarkGroup">Group</label>
|
||||||
<select id="newBookmarkGroup" name="Group" class="form-control" onchange="selectGroupChanged(this.value)">
|
<select id="newBookmarkGroup" name="Group" class="form-control" onchange="selectGroupChanged(this.value)">
|
||||||
<option value="-">New Group</option>
|
<option value="--">New Group</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div id="createGroup" class="form-group newGroup">
|
<div id="createGroup" class="form-group newGroup">
|
||||||
|
@ -183,7 +183,12 @@
|
||||||
<script src="lib/jquery-3.2.1.min.js"></script>
|
<script src="lib/jquery-3.2.1.min.js"></script>
|
||||||
<script src="lib/popper.js"></script>
|
<script src="lib/popper.js"></script>
|
||||||
<script src="lib/bootstrap/js/bootstrap.min.js"></script>
|
<script src="lib/bootstrap/js/bootstrap.min.js"></script>
|
||||||
|
|
||||||
<script src="js/main.js"></script>
|
<script src="js/main.js"></script>
|
||||||
|
<script src="js/loadBookmarks.js"></script>
|
||||||
|
<script src="js/addBookmarks.js"></script>
|
||||||
|
<script src="js/editBookmarks.js"></script>
|
||||||
|
<script src="js/importExport.js"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
107
js/addBookmarks.js
Normal file
107
js/addBookmarks.js
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
$(document).ready(function () {
|
||||||
|
$("#newBookmarkModal").on("shown.bs.modal", function () {
|
||||||
|
var combo = $("#newBookmarkGroup");
|
||||||
|
combo.empty();
|
||||||
|
combo.append($("<option>").attr({ "value": "--" })
|
||||||
|
.text("New Group"));
|
||||||
|
|
||||||
|
for (let group of bookmarkList) {
|
||||||
|
combo.append($("<option>").attr({ "value": group.title })
|
||||||
|
.text(group.title));
|
||||||
|
}
|
||||||
|
|
||||||
|
$("#createGroup").prop("required", true);
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#addBookmarkForm").submit(addNewBookmark);
|
||||||
|
|
||||||
|
$("#newBookmarkGroup").on("change", selectGroupChanged);
|
||||||
|
});
|
||||||
|
|
||||||
|
function addNewBookmark(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
// read in data from the form
|
||||||
|
var bkmkName = $("#newBookmarkName").val();
|
||||||
|
var bkmkAddress = $("#newBookmarkURL").val();
|
||||||
|
var bkmkGroup = $("#newBookmarkGroup").val();
|
||||||
|
|
||||||
|
if (bkmkGroup == "--") { // create a new group
|
||||||
|
var newGroupName = $("#newBookMarkGroupNew").val();
|
||||||
|
|
||||||
|
var newGroup = {
|
||||||
|
"title": newGroupName,
|
||||||
|
"bookmarks": [ { "name": bkmkName, "address": bkmkAddress } ]
|
||||||
|
};
|
||||||
|
|
||||||
|
var openDBRequest = window.indexedDB.open("bookmarks", dbVersion + 1);
|
||||||
|
openDBRequest.onupgradeneeded = function (e) {
|
||||||
|
var db = e.target.result;
|
||||||
|
|
||||||
|
if (db.objectStoreNames.contains(newGroup.title)) {
|
||||||
|
window.alert("The group already exists");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var objStore = db.createObjectStore(newGroup.title, { autoIncrement: true });
|
||||||
|
objStore.createIndex("name", "name", { unique: false });
|
||||||
|
objStore.createIndex("address", "address", { unique: false });
|
||||||
|
|
||||||
|
|
||||||
|
var bookmarks = newGroup.bookmarks;
|
||||||
|
for (var i = 0; i < bookmarks.length; i++) {
|
||||||
|
var bkmk = bookmarks[i];
|
||||||
|
objStore.add({ "name": bkmk.name, "address": bkmk.address }, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
openDBRequest.onsuccess = function (e) {
|
||||||
|
var db = e.target.result;
|
||||||
|
|
||||||
|
db.transaction(["groupIndexes"], "readwrite")
|
||||||
|
.objectStore("groupIndexes")
|
||||||
|
.add({ "title": newGroup.title, "groupIndex": bookmarkList.length });
|
||||||
|
|
||||||
|
bookmarkList.push(newGroup);
|
||||||
|
|
||||||
|
db.close();
|
||||||
|
loadBookmarks();
|
||||||
|
$(".modal").modal("hide");
|
||||||
|
}
|
||||||
|
|
||||||
|
openDBRequest.onerror = function (e) { console.log(e); }
|
||||||
|
} else { // add to existing group
|
||||||
|
var openDBRequest = window.indexedDB.open("bookmarks");
|
||||||
|
openDBRequest.onsuccess = function (e) {
|
||||||
|
var db = e.target.result;
|
||||||
|
var newItem = { "name": bkmkName, "address": bkmkAddress };
|
||||||
|
|
||||||
|
db.transaction([bkmkGroup], "readwrite")
|
||||||
|
.objectStore(bkmkGroup)
|
||||||
|
.add(newItem);
|
||||||
|
|
||||||
|
for (let group of bookmarkList) {
|
||||||
|
if (group.title == bkmkGroup) {
|
||||||
|
group.bookmarks.push(newItem);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
db.close();
|
||||||
|
loadBookmarks();
|
||||||
|
$(".modal").modal("hide");
|
||||||
|
}
|
||||||
|
|
||||||
|
openDBRequest.onerror = function (e) { console.log(e); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function selectGroupChanged(value) {
|
||||||
|
var groupText = $("#createGroup");
|
||||||
|
if (value == "--") {
|
||||||
|
groupText.show();
|
||||||
|
groupText.prop("required", true);
|
||||||
|
} else {
|
||||||
|
groupText.hide();
|
||||||
|
groupText.prop("required", false);
|
||||||
|
}
|
||||||
|
}
|
6
js/editBookmarks.js
Normal file
6
js/editBookmarks.js
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
$(document).ready(function () {
|
||||||
|
$("#btnEdit").click(function (e) {
|
||||||
|
// TODO: editing bookmarks
|
||||||
|
window.alert("Editing is currently not implemented");
|
||||||
|
});
|
||||||
|
});
|
98
js/importExport.js
Normal file
98
js/importExport.js
Normal file
|
@ -0,0 +1,98 @@
|
||||||
|
$(document).ready(function () {
|
||||||
|
$("#importExportModal").on("shown.bs.modal", function () {
|
||||||
|
var data = JSON.stringify(bookmarkList, null, 4);
|
||||||
|
if (data != null)
|
||||||
|
$("#exportText").text(data);
|
||||||
|
else
|
||||||
|
$("#exportText").text("[]");
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#btnImport").click(importBookmarks);
|
||||||
|
|
||||||
|
$("#exportText").click(function () {
|
||||||
|
$("#exportText").select();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
function importBookmarks() {
|
||||||
|
try {
|
||||||
|
var newData = $.parseJSON($("#importText").val());
|
||||||
|
} catch (err) {
|
||||||
|
console.error("Import failed: " + err.message);
|
||||||
|
window.alert("Invalid Format");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verifyBookmarks(newData)) {
|
||||||
|
setList(newData);
|
||||||
|
|
||||||
|
$("#importExportModal").modal("hide");
|
||||||
|
} else {
|
||||||
|
window.alert("Invalid Format");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setList(data) {
|
||||||
|
// empty the DB and fill it with the new data
|
||||||
|
bookmarkList = data;
|
||||||
|
|
||||||
|
try {
|
||||||
|
indexedDB.deleteDatabase("bookmarks");
|
||||||
|
} catch (err) {
|
||||||
|
// it's OK if the DB doesn't exist
|
||||||
|
if (err.name != "NotFoundError") {
|
||||||
|
console.error(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var openDBRequest = window.indexedDB.open("bookmarks", 1);
|
||||||
|
|
||||||
|
openDBRequest.onsuccess = function (e) {
|
||||||
|
dbVersion = db.version;
|
||||||
|
db.close();
|
||||||
|
loadBookmarks();
|
||||||
|
}
|
||||||
|
|
||||||
|
openDBRequest.onerror = function (err) { console.error(err); }
|
||||||
|
|
||||||
|
openDBRequest.onupgradeneeded = function (e) {
|
||||||
|
db = e.target.result;
|
||||||
|
|
||||||
|
var groupStore = initDB(db);
|
||||||
|
|
||||||
|
// create the object stores
|
||||||
|
for (var i = 0; i < data.length; i++) {
|
||||||
|
addGroup(data[i], groupStore, db, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function verifyBookmarks(bookmarks) {
|
||||||
|
if (!Array.isArray(bookmarks))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (var i = 0; i < bookmarks.length; i++) {
|
||||||
|
var item = bookmarks[i];
|
||||||
|
|
||||||
|
if (item == null || typeof item != "object")
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (item.title == null || typeof item.title != "string")
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (var j = 0; j < item.bookmarks.length; j++) {
|
||||||
|
var bkmk = item.bookmarks[j];
|
||||||
|
|
||||||
|
if (bkmk == null || typeof bkmk != "object")
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (bkmk.name == null || typeof bkmk.name != "string")
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (bkmk.address == null || typeof bkmk.address != "string")
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
139
js/loadBookmarks.js
Normal file
139
js/loadBookmarks.js
Normal file
|
@ -0,0 +1,139 @@
|
||||||
|
$(document).ready(function () {
|
||||||
|
loadBookmarks();
|
||||||
|
});
|
||||||
|
|
||||||
|
function loadBookmarks() {
|
||||||
|
$("#cardList").empty();
|
||||||
|
var openDBRequest = window.indexedDB.open("bookmarks");
|
||||||
|
|
||||||
|
openDBRequest.onsuccess = function (dbEvt) {
|
||||||
|
db = dbEvt.target.result;
|
||||||
|
dbVersion = db.version;
|
||||||
|
bookmarkList = [];
|
||||||
|
|
||||||
|
db.transaction(["groupIndexes"], "readonly")
|
||||||
|
.objectStore("groupIndexes")
|
||||||
|
.getAll()
|
||||||
|
.onsuccess = function (indexEvt) {
|
||||||
|
var indexes = indexEvt.target.result;
|
||||||
|
|
||||||
|
// use a placholder because getting the group info is async
|
||||||
|
// and groups could finish loading in a different order
|
||||||
|
var cardList = $("#cardList");
|
||||||
|
for (var i = 0; i < indexes.length; i++) {
|
||||||
|
$("<div>").attr("id", "group-" + i).appendTo(cardList);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let item of indexes) {
|
||||||
|
buildGroup(item, $("#group-" + item.groupIndex));
|
||||||
|
}
|
||||||
|
|
||||||
|
db.close();
|
||||||
|
}
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
openDBRequest.onerror = function (e) { console.log(e); }
|
||||||
|
|
||||||
|
openDBRequest.onupgradeneeded = function (e) {
|
||||||
|
// the database doesn't exist
|
||||||
|
console.log("Creating database");
|
||||||
|
db = e.target.result;
|
||||||
|
|
||||||
|
var data = window.localStorage.getItem("bookmarks");
|
||||||
|
if (data != null) {
|
||||||
|
console.log("Importing data from old version");
|
||||||
|
data = JSON.parse(data);
|
||||||
|
db.close();
|
||||||
|
setList(data);
|
||||||
|
window.localStorage.removeItem("bookmarks");
|
||||||
|
} else {
|
||||||
|
var groupStore = initDB(db);
|
||||||
|
|
||||||
|
// add example bookmarks
|
||||||
|
var exBookmarks = db.createObjectStore("Examples", { autoIncrement: true });
|
||||||
|
exBookmarks.createIndex("name", "name", { unique: false });
|
||||||
|
exBookmarks.createIndex("address", "address", { unique: false });
|
||||||
|
groupStore.add({ "title": "Examples", "groupIndex": 0 });
|
||||||
|
|
||||||
|
exBookmarks.add({
|
||||||
|
"name": "Github",
|
||||||
|
"address": "https://github.com/"
|
||||||
|
});
|
||||||
|
exBookmarks.add({
|
||||||
|
"name": "This project on Github",
|
||||||
|
"address": "https://github.com/NeilBrommer/NewTabPage"
|
||||||
|
});
|
||||||
|
exBookmarks.add({
|
||||||
|
"name": "Hacker News",
|
||||||
|
"address": "https://news.ycombinator.com/"
|
||||||
|
});
|
||||||
|
exBookmarks.add({
|
||||||
|
"name": "reddit",
|
||||||
|
"address": "https://www.reddit.com/"
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#aboutModal").modal("show");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildGroup(groupInfo, placeholder) {
|
||||||
|
var groupTransaction = db.transaction([groupInfo.title], "readonly");
|
||||||
|
var groupStore = groupTransaction.objectStore(groupInfo.title);
|
||||||
|
var groupRequest = groupStore.getAll();
|
||||||
|
groupRequest.onsuccess = function (e) {
|
||||||
|
var bookmarks = e.target.result;
|
||||||
|
|
||||||
|
bookmarkList[groupInfo.groupIndex] = {
|
||||||
|
"title": groupInfo.title,
|
||||||
|
"bookmarks": bookmarks
|
||||||
|
};
|
||||||
|
|
||||||
|
buildCard(groupInfo.title, bookmarks).appendTo(placeholder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildCard(title, itemList) {
|
||||||
|
var card = $(document.createElement("div"));
|
||||||
|
card.attr({
|
||||||
|
"id": "group-" + title,
|
||||||
|
"class": "card bookmarkGroup"
|
||||||
|
});
|
||||||
|
|
||||||
|
var cardHead = $(document.createElement("div"));
|
||||||
|
cardHead.attr({ "class": "card-header" });
|
||||||
|
cardHead.text(title);
|
||||||
|
card.append(cardHead);
|
||||||
|
|
||||||
|
var cardList = $(document.createElement("div"));
|
||||||
|
cardList.attr({ "class": "list-group list-group-flush" });
|
||||||
|
card.append(cardList);
|
||||||
|
|
||||||
|
for (var i = 0; i < itemList.length; i++) {
|
||||||
|
var item = itemList[i];
|
||||||
|
var link = $(document.createElement("a"));
|
||||||
|
link.attr({
|
||||||
|
"class": "list-group-item list-group-item-action",
|
||||||
|
"href": item.address
|
||||||
|
});
|
||||||
|
link.text(item.name);
|
||||||
|
|
||||||
|
cardList.append(link);
|
||||||
|
}
|
||||||
|
|
||||||
|
return card;
|
||||||
|
}
|
||||||
|
|
||||||
|
function addGroup(group, groupStore, db, index) {
|
||||||
|
var objStore = db.createObjectStore(group.title, { autoIncrement: true });
|
||||||
|
objStore.createIndex("name", "name", { unique: false });
|
||||||
|
objStore.createIndex("address", "address", { unique: false });
|
||||||
|
groupStore.add({ "title": group.title, "groupIndex": index });
|
||||||
|
|
||||||
|
var bookmarks = group.bookmarks;
|
||||||
|
for (var i = 0; i < bookmarks.length; i++) {
|
||||||
|
var bkmk = bookmarks[i];
|
||||||
|
objStore.add({ "name": bkmk.name, "address": bkmk.address }, i);
|
||||||
|
}
|
||||||
|
}
|
347
js/main.js
347
js/main.js
|
@ -4,272 +4,8 @@ var dbVersion;
|
||||||
|
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
calcBackground();
|
calcBackground();
|
||||||
loadBookmarks();
|
|
||||||
|
|
||||||
$("#importExportModal").on("shown.bs.modal", function () {
|
|
||||||
var data = getListString();
|
|
||||||
if (data != null)
|
|
||||||
$("#exportText").text(data);
|
|
||||||
else
|
|
||||||
$("#exportText").text("[]");
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#newBookmarkModal").on("shown.bs.modal", function () {
|
|
||||||
var combo = $("#newBookmarkGroup");
|
|
||||||
combo.empty();
|
|
||||||
combo.append($("<option>").attr({ "value": "--" })
|
|
||||||
.text("New Group"));
|
|
||||||
|
|
||||||
for (let group of bookmarkList) {
|
|
||||||
combo.append($("<option>").attr({ "value": group.title })
|
|
||||||
.text(group.title));
|
|
||||||
}
|
|
||||||
|
|
||||||
$("#createGroup").prop("required", true);
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#addBookmarkForm").submit(addNewBookmark);
|
|
||||||
|
|
||||||
$("#btnEdit").click(function (e) {
|
|
||||||
// TODO: editing bookmarks
|
|
||||||
window.alert("Editing is currently not implemented");
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#btnImport").click(importBookmarks);
|
|
||||||
$("#exportText").click(function () {
|
|
||||||
$("#exportText").select();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
function addNewBookmark(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
|
|
||||||
// read in data from the form
|
|
||||||
var bkmkName = $("#newBookmarkName").val();
|
|
||||||
var bkmkAddress = $("#newBookmarkURL").val();
|
|
||||||
var bkmkGroup = $("#newBookmarkGroup").val();
|
|
||||||
|
|
||||||
if (bkmkGroup == "--") { // create a new group
|
|
||||||
var newGroupName = $("#newBookMarkGroupNew").val();
|
|
||||||
|
|
||||||
var newGroup = {
|
|
||||||
"title": newGroupName,
|
|
||||||
"bookmarks": [ { "name": bkmkName, "address": bkmkAddress } ]
|
|
||||||
};
|
|
||||||
|
|
||||||
var openDBRequest = window.indexedDB.open("bookmarks", dbVersion + 1);
|
|
||||||
openDBRequest.onupgradeneeded = function (e) {
|
|
||||||
var db = e.target.result;
|
|
||||||
|
|
||||||
if (db.objectStoreNames.contains(newGroup.title)) {
|
|
||||||
window.alert("The group already exists");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var objStore = db.createObjectStore(newGroup.title, { autoIncrement: true });
|
|
||||||
objStore.createIndex("name", "name", { unique: false });
|
|
||||||
objStore.createIndex("address", "address", { unique: false });
|
|
||||||
|
|
||||||
|
|
||||||
var bookmarks = newGroup.bookmarks;
|
|
||||||
for (var i = 0; i < bookmarks.length; i++) {
|
|
||||||
var bkmk = bookmarks[i];
|
|
||||||
objStore.add({ "name": bkmk.name, "address": bkmk.address }, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
openDBRequest.onsuccess = function (e) {
|
|
||||||
var db = e.target.result;
|
|
||||||
|
|
||||||
db.transaction(["groupIndexes"], "readwrite")
|
|
||||||
.objectStore("groupIndexes")
|
|
||||||
.add({ "title": newGroup.title, "groupIndex": bookmarkList.length });
|
|
||||||
|
|
||||||
bookmarkList.push(newGroup);
|
|
||||||
|
|
||||||
db.close();
|
|
||||||
loadBookmarks();
|
|
||||||
$(".modal").modal("hide");
|
|
||||||
}
|
|
||||||
|
|
||||||
openDBRequest.onerror = function (e) { console.log(e); }
|
|
||||||
} else { // add to existing group
|
|
||||||
var openDBRequest = window.indexedDB.open("bookmarks");
|
|
||||||
openDBRequest.onsuccess = function (e) {
|
|
||||||
var db = e.target.result;
|
|
||||||
var newItem = { "name": bkmkName, "address": bkmkAddress };
|
|
||||||
|
|
||||||
db.transaction([bkmkGroup], "readwrite")
|
|
||||||
.objectStore(bkmkGroup)
|
|
||||||
.add(newItem);
|
|
||||||
|
|
||||||
for (let group of bookmarkList) {
|
|
||||||
if (group.title == bkmkGroup) {
|
|
||||||
group.bookmarks.push(newItem);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
db.close();
|
|
||||||
loadBookmarks();
|
|
||||||
$(".modal").modal("hide");
|
|
||||||
}
|
|
||||||
|
|
||||||
openDBRequest.onerror = function (e) { console.log(e); }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function importBookmarks() {
|
|
||||||
try {
|
|
||||||
var newData = $.parseJSON($("#importText").val());
|
|
||||||
} catch (err) {
|
|
||||||
console.error("Import failed: " + err.message);
|
|
||||||
window.alert("Invalid Format");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (verifyBookmarks(newData)) {
|
|
||||||
setList(newData);
|
|
||||||
|
|
||||||
$("#importExportModal").modal("hide");
|
|
||||||
} else {
|
|
||||||
window.alert("Invalid Format");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function loadBookmarks() {
|
|
||||||
$("#cardList").empty();
|
|
||||||
var openDBRequest = window.indexedDB.open("bookmarks");
|
|
||||||
|
|
||||||
openDBRequest.onsuccess = function (dbEvt) {
|
|
||||||
db = dbEvt.target.result;
|
|
||||||
dbVersion = db.version;
|
|
||||||
bookmarkList = [];
|
|
||||||
|
|
||||||
db.transaction(["groupIndexes"], "readonly")
|
|
||||||
.objectStore("groupIndexes")
|
|
||||||
.getAll()
|
|
||||||
.onsuccess = function (indexEvt) {
|
|
||||||
var indexes = indexEvt.target.result;
|
|
||||||
|
|
||||||
// use a placholder because getting the group info is async
|
|
||||||
// and groups could finish loading in a different order
|
|
||||||
var cardList = $("#cardList");
|
|
||||||
for (var i = 0; i < indexes.length; i++) {
|
|
||||||
$("<div>").attr("id", "group-" + i).appendTo(cardList);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let item of indexes) {
|
|
||||||
buildGroup(item, $("#group-" + item.groupIndex));
|
|
||||||
}
|
|
||||||
|
|
||||||
db.close();
|
|
||||||
}
|
|
||||||
;
|
|
||||||
}
|
|
||||||
|
|
||||||
openDBRequest.onerror = function (e) { console.log(e); }
|
|
||||||
|
|
||||||
openDBRequest.onupgradeneeded = function (e) {
|
|
||||||
// the database doesn't exist
|
|
||||||
console.log("Creating database");
|
|
||||||
db = e.target.result;
|
|
||||||
|
|
||||||
var data = window.localStorage.getItem("bookmarks");
|
|
||||||
if (data != null) {
|
|
||||||
console.log("Importing data from old version");
|
|
||||||
data = JSON.parse(data);
|
|
||||||
db.close();
|
|
||||||
setList(data);
|
|
||||||
window.localStorage.removeItem("bookmarks");
|
|
||||||
} else {
|
|
||||||
var groupStore = initDB(db);
|
|
||||||
|
|
||||||
// add example bookmarks
|
|
||||||
var exBookmarks = db.createObjectStore("Examples", { autoIncrement: true });
|
|
||||||
exBookmarks.createIndex("name", "name", { unique: false });
|
|
||||||
exBookmarks.createIndex("address", "address", { unique: false });
|
|
||||||
groupStore.add({ "title": "Examples", "groupIndex": 0 });
|
|
||||||
|
|
||||||
exBookmarks.add({
|
|
||||||
"name": "Github",
|
|
||||||
"address": "https://github.com/"
|
|
||||||
});
|
|
||||||
exBookmarks.add({
|
|
||||||
"name": "This project on Github",
|
|
||||||
"address": "https://github.com/NeilBrommer/NewTabPage"
|
|
||||||
});
|
|
||||||
exBookmarks.add({
|
|
||||||
"name": "Hacker News",
|
|
||||||
"address": "https://news.ycombinator.com/"
|
|
||||||
});
|
|
||||||
exBookmarks.add({
|
|
||||||
"name": "reddit",
|
|
||||||
"address": "https://www.reddit.com/"
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#aboutModal").modal("show");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function buildGroup(groupInfo, placeholder) {
|
|
||||||
var groupTransaction = db.transaction([groupInfo.title], "readonly");
|
|
||||||
var groupStore = groupTransaction.objectStore(groupInfo.title);
|
|
||||||
var groupRequest = groupStore.getAll();
|
|
||||||
groupRequest.onsuccess = function (e) {
|
|
||||||
var bookmarks = e.target.result;
|
|
||||||
|
|
||||||
bookmarkList[groupInfo.groupIndex] = {
|
|
||||||
"title": groupInfo.title,
|
|
||||||
"bookmarks": bookmarks
|
|
||||||
};
|
|
||||||
|
|
||||||
buildCard(groupInfo.title, bookmarks).appendTo(placeholder);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function buildCard(title, itemList) {
|
|
||||||
var card = $(document.createElement("div"));
|
|
||||||
card.attr({
|
|
||||||
"id": "group-" + title,
|
|
||||||
"class": "card bookmarkGroup"
|
|
||||||
});
|
|
||||||
|
|
||||||
var cardHead = $(document.createElement("div"));
|
|
||||||
cardHead.attr({ "class": "card-header" });
|
|
||||||
cardHead.text(title);
|
|
||||||
card.append(cardHead);
|
|
||||||
|
|
||||||
var cardList = $(document.createElement("div"));
|
|
||||||
cardList.attr({ "class": "list-group list-group-flush" });
|
|
||||||
card.append(cardList);
|
|
||||||
|
|
||||||
for (var i = 0; i < itemList.length; i++) {
|
|
||||||
var item = itemList[i];
|
|
||||||
var link = $(document.createElement("a"));
|
|
||||||
link.attr({
|
|
||||||
"class": "list-group-item list-group-item-action",
|
|
||||||
"href": item.address
|
|
||||||
});
|
|
||||||
link.text(item.name);
|
|
||||||
|
|
||||||
cardList.append(link);
|
|
||||||
}
|
|
||||||
|
|
||||||
return card;
|
|
||||||
}
|
|
||||||
|
|
||||||
function selectGroupChanged(value) {
|
|
||||||
var groupText = $("#createGroup");
|
|
||||||
if (value == "--") {
|
|
||||||
groupText.show();
|
|
||||||
groupText.prop("required", true);
|
|
||||||
} else {
|
|
||||||
groupText.hide();
|
|
||||||
groupText.prop("required", false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function calcBackground() {
|
function calcBackground() {
|
||||||
var now = new Date();
|
var now = new Date();
|
||||||
var hours = now.getHours();
|
var hours = now.getHours();
|
||||||
|
@ -307,46 +43,6 @@ function setBackground(num, dark) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getListString() {
|
|
||||||
return JSON.stringify(bookmarkList, null, 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
function setList(data) {
|
|
||||||
// empty the DB and fill it with the new data
|
|
||||||
bookmarkList = data;
|
|
||||||
|
|
||||||
try {
|
|
||||||
indexedDB.deleteDatabase("bookmarks");
|
|
||||||
} catch (err) {
|
|
||||||
// it's OK if the DB doesn't exist
|
|
||||||
if (err.name != "NotFoundError") {
|
|
||||||
console.error(err);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var openDBRequest = window.indexedDB.open("bookmarks", 1);
|
|
||||||
|
|
||||||
openDBRequest.onsuccess = function (e) {
|
|
||||||
dbVersion = db.version;
|
|
||||||
db.close();
|
|
||||||
loadBookmarks();
|
|
||||||
}
|
|
||||||
|
|
||||||
openDBRequest.onerror = function (err) { console.error(err); }
|
|
||||||
|
|
||||||
openDBRequest.onupgradeneeded = function (e) {
|
|
||||||
console.log("filling db");
|
|
||||||
db = e.target.result;
|
|
||||||
|
|
||||||
var groupStore = initDB(db);
|
|
||||||
|
|
||||||
// create the object stores
|
|
||||||
for (var i = 0; i < data.length; i++) {
|
|
||||||
addGroup(data[i], groupStore, db, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function initDB(db) {
|
function initDB(db) {
|
||||||
// use a table to keep track of the order of groups
|
// use a table to keep track of the order of groups
|
||||||
var groupStore = db.createObjectStore("groupIndexes", { keyPath: "title" });
|
var groupStore = db.createObjectStore("groupIndexes", { keyPath: "title" });
|
||||||
|
@ -354,46 +50,3 @@ function initDB(db) {
|
||||||
groupStore.createIndex("groupIndex", "groupIndex", { unique: true });
|
groupStore.createIndex("groupIndex", "groupIndex", { unique: true });
|
||||||
return groupStore;
|
return groupStore;
|
||||||
}
|
}
|
||||||
|
|
||||||
function addGroup(group, groupStore, db, index) {
|
|
||||||
var objStore = db.createObjectStore(group.title, { autoIncrement: true });
|
|
||||||
objStore.createIndex("name", "name", { unique: false });
|
|
||||||
objStore.createIndex("address", "address", { unique: false });
|
|
||||||
groupStore.add({ "title": group.title, "groupIndex": index });
|
|
||||||
|
|
||||||
var bookmarks = group.bookmarks;
|
|
||||||
for (var i = 0; i < bookmarks.length; i++) {
|
|
||||||
var bkmk = bookmarks[i];
|
|
||||||
objStore.add({ "name": bkmk.name, "address": bkmk.address }, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function verifyBookmarks(bookmarks) {
|
|
||||||
if (!Array.isArray(bookmarks))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
for (var i = 0; i < bookmarks.length; i++) {
|
|
||||||
var item = bookmarks[i];
|
|
||||||
|
|
||||||
if (item == null || typeof item != "object")
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (item.title == null || typeof item.title != "string")
|
|
||||||
return false;
|
|
||||||
|
|
||||||
for (var j = 0; j < item.bookmarks.length; j++) {
|
|
||||||
var bkmk = item.bookmarks[j];
|
|
||||||
|
|
||||||
if (bkmk == null || typeof bkmk != "object")
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (bkmk.name == null || typeof bkmk.name != "string")
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (bkmk.address == null || typeof bkmk.address != "string")
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in a new issue