nightTab/js/links.js
2018-12-28 00:10:49 -07:00

420 lines
9.4 KiB
JavaScript

var links = (function() {
var currentEditIndex = null;
var currentAction = null;
var _bind = function(override) {
var options = {
element: null,
action: null
};
if (override) {
options = helper.applyOptions(options, override);
}
var action = {
edit: function() {
options.element.addEventListener("click", function() {
edit(this);
}, false);
},
delete: function() {
options.element.addEventListener("click", function() {
remove(this);
}, false);
}
};
if (options.element != null) {
action[options.action]();
}
};
var add = function() {
currentAction = "add";
var form = _makeLinkForm();
modal.render({
heading: "Add a new bookmark",
action: save,
actionText: "Add",
size: "small",
content: form
});
};
var edit = function(button) {
currentAction = "edit";
currentEditIndex = parseInt(button.closest(".link-item").dataset.index, 10);
var currentBookmark = bookmarks.get()[currentEditIndex];
var form = _makeLinkForm();
form.querySelector(".link-form-input-letter").value = currentBookmark.letter;
form.querySelector(".link-form-input-name").value = currentBookmark.name;
form.querySelector(".link-form-input-url").value = currentBookmark.url;
modal.render({
heading: "Edit " + currentBookmark.name,
action: save,
actionText: "Save",
size: "small",
content: form
});
};
var save = function(button) {
var action = {
add: function(newLinkData) {
bookmarks.add(newLinkData);
},
edit: function(newLinkData) {
bookmarks.edit(newLinkData, currentEditIndex);
}
};
var form = helper.e(".link-form");
var newLinkData = {
letter: form.querySelector(".link-form-input-letter").value,
name: form.querySelector(".link-form-input-name").value,
url: form.querySelector(".link-form-input-url").value
};
action[currentAction](newLinkData);
currentEditIndex = null;
currentAction = null;
clear();
if (search.get().search) {
search.render();
} else {
render();
};
data.save();
};
var remove = function(button) {
var index = parseInt(button.closest(".link-item").dataset.index, 10);
bookmarks.remove(index);
clear();
if (search.get().search) {
search.render();
} else {
render();
};
data.save();
};
var _makeElement = function(override) {
var options = {
tag: null,
classes: null,
text: null,
url: null,
index: null,
attr: null
};
if (override) {
options = helper.applyOptions(options, override);
};
var element = document.createElement(options.tag);
if (options.text != null) {
element.textContent = options.text;
};
if (options.attr != null) {
options.attr.forEach(function(arrayItem, index) {
if ("key" in arrayItem && "value" in arrayItem) {
element.setAttribute(arrayItem.key, arrayItem.value);
} else if ("key" in arrayItem) {
element.setAttribute(arrayItem.key, "");
}
});
};
return element;
};
var _makeLinkForm = function() {
var form = _makeElement({
tag: "form",
attr: [{
key: "class",
value: "link-form"
}]
});
var fieldset = _makeElement({
tag: "fieldset"
});
var letterLabel = _makeElement({
tag: "label",
text: "Letters",
attr: [{
key: "for",
value: "letters"
}]
});
var letterInput = _makeElement({
tag: "input",
attr: [{
key: "type",
value: "text"
}, {
key: "class",
value: "link-form-input-letter"
}, {
key: "id",
value: "letters"
}, {
key: "placeholder",
value: "E"
}, {
key: "tabindex",
value: "1"
}, {
key: "autocomplete",
value: "off"
}]
});
var nameLabel = _makeElement({
tag: "label",
text: "Name",
attr: [{
key: "for",
value: "name"
}]
});
var nameInput = _makeElement({
tag: "input",
attr: [{
key: "type",
value: "text"
}, {
key: "class",
value: "link-form-input-name"
}, {
key: "id",
value: "name"
}, {
key: "placeholder",
value: "Example"
}, {
key: "tabindex",
value: "1"
}, {
key: "autocomplete",
value: "off"
}]
});
var urlLabel = _makeElement({
tag: "label",
text: "URL",
attr: [{
key: "for",
value: "url"
}]
});
var urlInput = _makeElement({
tag: "input",
attr: [{
key: "type",
value: "text"
}, {
key: "class",
value: "link-form-input-url"
}, {
key: "id",
value: "url"
}, {
key: "placeholder",
value: "https://www.example.com/"
}, {
key: "tabindex",
value: "1"
}, {
key: "autocomplete",
value: "off"
}]
});
fieldset.appendChild(letterLabel);
fieldset.appendChild(letterInput);
fieldset.appendChild(nameLabel);
fieldset.appendChild(nameInput);
fieldset.appendChild(urlLabel);
fieldset.appendChild(urlInput);
form.appendChild(fieldset);
return form;
};
var _makeLink = function(data, index) {
var linkItem = _makeElement({
tag: "div",
attr: [{
key: "class",
value: "link-item"
}, {
key: "data-index",
value: index
}]
});
var linkPanelFront = _makeElement({
tag: "a",
attr: [{
key: "class",
value: "link-panel-front"
}, {
key: "href",
value: data.url
}, {
key: "tabindex",
value: 1
}]
});
var linkPanelBack = _makeElement({
tag: "div",
attr: [{
key: "class",
value: "link-panel-back"
}]
});
var linkLetter = _makeElement({
tag: "p",
text: data.letter,
attr: [{
key: "class",
value: "link-letter"
}, {
key: "data-index",
value: data.url
}]
});
var linkName = _makeElement({
tag: "p",
text: data.name,
attr: [{
key: "class",
value: "link-name"
}]
});
var linkUrl = _makeElement({
tag: "div",
attr: [{
key: "class",
value: "link-url"
}]
});
var linkUrlText = _makeElement({
tag: "p",
text: data.url.replace(/^https?\:\/\//i, "").replace(/\/$/, ""),
attr: [{
key: "class",
value: "link-url-text"
}]
});
var linkControl = _makeElement({
tag: "div",
attr: [{
key: "class",
value: "link-control"
}]
});
var linkEdit = _makeElement({
tag: "button",
attr: [{
key: "class",
value: "button button-small link-control-item link-edit"
}, {
key: "tabindex",
value: -1
}]
});
var linkEditIcon = _makeElement({
tag: "span",
attr: [{
key: "class",
value: "button-icon icon-edit"
}]
});
var linkDelete = _makeElement({
tag: "button",
attr: [{
key: "class",
value: "button button-small link-control-item link-delete"
}, {
key: "tabindex",
value: -1
}]
});
var linkDeleteIcon = _makeElement({
tag: "span",
attr: [{
key: "class",
value: "button-icon icon-close"
}]
});
linkPanelFront.appendChild(linkLetter);
linkPanelFront.appendChild(linkName);
linkEdit.appendChild(linkEditIcon);
linkDelete.appendChild(linkDeleteIcon);
linkControl.appendChild(linkEdit);
linkControl.appendChild(linkDelete);
linkUrl.appendChild(linkUrlText);
linkPanelBack.appendChild(linkUrl);
linkPanelBack.appendChild(linkControl);
linkItem.appendChild(linkPanelFront);
linkItem.appendChild(linkPanelBack);
_bind({
element: linkEdit,
action: "edit"
});
_bind({
element: linkDelete,
action: "delete"
});
return linkItem;
};
var render = function(array) {
var gridItemBody = helper.e(".grid-item-body");
if (array) {
array.forEach(function(arrayItem, index) {
if (arrayItem.index) {
index = arrayItem.index;
};
gridItemBody.appendChild(_makeLink(arrayItem, index));
});
} else {
bookmarks.get().forEach(function(arrayItem, index) {
gridItemBody.appendChild(_makeLink(arrayItem, index));
});
};
};
var tabIndex = function() {
var allLinkControlItem = helper.eA(".link-control-item");
if (control.get().edit) {
allLinkControlItem.forEach(function(arrayItem, index) {
arrayItem.tabIndex = 1;
});
} else {
allLinkControlItem.forEach(function(arrayItem, index) {
arrayItem.tabIndex = -1;
});
};
};
var clear = function() {
var gridItemBody = helper.e(".grid-item-body");
while (gridItemBody.lastChild) {
gridItemBody.removeChild(gridItemBody.lastChild);
};
};
var init = function() {
render();
};
// exposed methods
return {
init: init,
clear: clear,
add: add,
edit: edit,
save: save,
remove: remove,
render: render,
tabIndex: tabIndex
};
})();