NewTabPage/js/importExport.js
2017-12-27 15:27:08 -08:00

119 lines
2.5 KiB
JavaScript

$(document).ready(function () {
$("#importExportModal").on("shown.bs.modal", showBookmarkData);
$("#btnImportDialog").click(importBookmarks);
$("#exportText").click(function () {
$("#exportText").select();
});
});
function showBookmarkData() {
var openDBRequest = window.indexedDB.open("bookmarks");
openDBRequest.onsuccess = function (e) {
var db = e.target.result;
db.transaction("Groups").objectStore("Groups").getAllKeys().onsuccess = function (evt) {
var data = JSON.stringify(bookmarkList, null, 4);
if (data != null)
$("#exportText").text(data);
else
$("#exportText").text("[]");
}
}
}
function importBookmarks() {
try {
var newData = $.parseJSON($("#importText").val());
} catch (err) {
console.error("Import failed: " + err.message);
window.alert("Invalid Format");
return;
}
if (validateBookmarks(newData)) {
$("#btnImportDialog").prop("disabled", true);
setList(newData);
} else {
window.alert("Invalid Format");
}
}
function setList(data) {
// empty the DB and fill it with the new data
bookmarkList = data;
var openDBRequest = window.indexedDB.open("bookmarks");
openDBRequest.onsuccess = function (e) {
db = e.target.result;
var groupStore = db.transaction("Groups", "readwrite").objectStore("Groups");
groupStore.clear();
// create the object stores
for (group of data) {
groupStore.add(group);
}
$("#importExportModal").modal("hide");
$("#btnImportDialog").prop("disabled", false);
db.close();
loadBookmarks();
}
openDBRequest.onerror = function (err) { console.error(err); }
}
function validateBookmarks(bookmarks) {
var indexes = [];
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;
if (item.groupIndex == null || typeof item.groupIndex != "number")
return false;
if (arrayContains(indexes, item.groupIndex))
return false;
indexes.push(item.groupIndex);
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;
}
function arrayContains(array, searchFor) {
for (item of array) {
if (item == searchFor)
return true;
}
return false;
}