diff --git a/README.md b/README.md index 74d1110..c23b894 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,9 @@ Easy Session Manager allows you to manage your Firefox session by backing up or # Download https://addons.mozilla.org/en-US/firefox/addon/easy-session-manager/ -# Version: 0.1.8 -Fixed select all issue. +# Version: 0.2.0 +Added additional edit functionality. +Added selective save functionality. # Images ![1 Default interface with no sessions. ](images/pic1.png) diff --git a/src/manifest.json b/src/manifest.json index 264393c..43b40c8 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 2, "name": " Easy Session Manager", - "version": "0.1.8", + "version": "0.2.0", "description": " Easy Session Manager allows you to manage your Firefox session by backing up or loading your saved sessions.", "applications": { diff --git a/src/pages/sessionManager.html b/src/pages/sessionManager.html index 9f8a69e..894dcb6 100755 --- a/src/pages/sessionManager.html +++ b/src/pages/sessionManager.html @@ -12,9 +12,9 @@

- + - +
diff --git a/src/scripts/events.js b/src/scripts/events.js index dff1beb..4fc279d 100644 --- a/src/scripts/events.js +++ b/src/scripts/events.js @@ -1,9 +1,9 @@ let selectedItem = null; -const toggleSelect = (name) => { +const toggleSelect = (source, name) => { let checkboxes = document.getElementsByName(name); for (var i = 0; i < checkboxes.length; i++) { - checkboxes[i].checked = !checkboxes[i].checked; + checkboxes[i].checked = source.checked; } } @@ -59,7 +59,7 @@ document.addEventListener("dblclick", (e) => { selectedItem = e.target; selectedItem.setAttribute("class", "sessionLI selected"); try { - let id = e.target.innerHTML.trim(); + let id = e.target.innerText.trim(); storage.get(id).then(storageResults => { let json = JSON.parse(storageResults[id]); let keys = Object.keys(json); @@ -70,71 +70,13 @@ document.addEventListener("dblclick", (e) => { if (!selectiveOpen.checked) { loadSession(json, replaceTabs.checked); } else { - let container = document.createElement("DIV"); - let ulTemplate = document.querySelector('#ulTemplate'); - let liTemplate = document.querySelector('#liTemplate'); - - for (let i = 0; i < keysLength; i++) { - let ulClone = document.importNode(ulTemplate.content, true); - let ulTag = ulClone.querySelector('.collection'); - let selAll = ulClone.querySelector('input'); - let h2Tag = ulClone.querySelector('.ulHeader'); - let ulLblTag = ulClone.querySelector('label'); - let h2Txt = document.createTextNode("Window: " + (i + 1)); - let store = json[keys[i]]; - let j = 0; - - container.id = "editSelectionContainer"; - selAll.id = "selectAllWin" + i; - ulLblTag.htmlFor = "selectAllWin" + i; - selAll.addEventListener("click", function () { - toggleSelect("Win" + i); - }); - h2Tag.appendChild(h2Txt); - - store.forEach(tab => { - let liClone = document.importNode(liTemplate.content, true); - let inptTag = liClone.querySelector("input"); - let lblTag = liClone.querySelector("label"); - let labelTxt = document.createTextNode(tab.link); - inptTag.id = "Win" + i + "Li" + j; - lblTag.htmlFor = "Win" + i + "Li" + j; - lblTag.title = tab.link; - inptTag.setAttribute("name", "Win" + i); - lblTag.appendChild(labelTxt); - ulTag.appendChild(liClone); - j++; - }); - - container.appendChild(ulClone); - } - + let container = selectionWindow(json, keys, keysLength); swal("Selective Open", { content: container, buttons: true, }).then((willOpen) => { if (willOpen) { - let sessionData = {}; - let ulTags = container.querySelectorAll("ul"); - - for (let i = 0; i < keysLength; i++) { - let links = []; - - for (var ii = 0; ii < ulTags[i].children.length; ii++) { - let li = ulTags[i].children[ii]; - if (li.children[0].checked) { - links.push( - {"link" : li.children[1].title.trim()} - ); - } - } - - if (links.length > 0) { - sessionData[keys[i]] = links; - } - } - - json = sessionData; + json = selectionData(container, keys, keysLength); keysLength = Object.keys(json).length; if (keysLength > 0) { loadSession(json, replaceTabs.checked); diff --git a/src/scripts/sessionManager.js b/src/scripts/sessionManager.js index a82ebe6..52dd22c 100644 --- a/src/scripts/sessionManager.js +++ b/src/scripts/sessionManager.js @@ -3,95 +3,128 @@ const windowSys = browser.windows; const regexp = /^[a-zA-Z0-9-_]+$/; // Alphanumeric, dash, underscore -const saveSession = (elm = null, message = "What is this session's name? Allowed: a-z, A-Z, -, _") => { +const saveSession = (elm = null, message = "[ Session Name ] Allowed: a-z, A-Z, -, _") => { let inputTag = document.createElement("INPUT"); inputTag.value = new Date().toLocaleString().split(',')[0].replace(/\//g, '-'); if (elm !== null) - inputTag.value = elm.innerHTML; + inputTag.value = elm.innerText; - swal(message, { - content: inputTag, - buttons: true, - }).then((value) => { - if (value) { - let enteryName = inputTag.value.replace(/ /g, "_"); - - if (enteryName) { - if (enteryName.search(regexp) == -1) { - saveSession("Please try again...\nAllowed: a-z, A-Z, -, _") - return ; + windowSys.getAll({ populate: true, windowTypes: ["normal"] }).then((windows) => { + let sessionData = {}; + for (let i = 0; i < windows.length; i++) { + let links = []; + for (var ii = 0; ii < windows[i].tabs.length; ii++) { + if (!windows[i].tabs[ii].url.includes("about:")) { + links.push( + {"link" : windows[i].tabs[ii].url.trim()} + ); } + } + sessionData["WindowID:" + windows[i].id] = links; + } - console.log("Saving session..."); - windowSys.getAll({ populate: true, windowTypes: ["normal"] }).then((windows) => { - let sessionData = {}; - for (let i = 0; i < windows.length; i++) { - let links = []; - for (var ii = 0; ii < windows[i].tabs.length; ii++) { - if (!windows[i].tabs[ii].url.includes("about:")) { - links.push( - {"link" : windows[i].tabs[ii].url.trim()} - ); - } + let keys = Object.keys(sessionData); + let keysLength = Object.keys(sessionData).length; + let container = selectionWindow(sessionData, keys, keysLength); + container.prepend(inputTag); - } - sessionData["WindowID:" + windows[i].id] = links; + swal(message, { + content: container, + buttons: true, + }).then((value) => { + if (value) { + let enteryName = inputTag.value.replace(/ /g, "_"); + + if (enteryName) { + if (enteryName.search(regexp) == -1) { + saveSession("Please try again...\nAllowed: a-z, A-Z, -, _") + return ; } + + console.log("Saving session..."); + sessionData = selectionData(container, keys, keysLength); saveToStorage(enteryName, JSON.stringify(sessionData)); - }).then(() => { - if (document.getElementsByName(enteryName).length == 0) { - appendToSavedSessionsList(enteryName); - } - }); + } else { + swal("Canceled save...", { + icon: "warning", + }); + } } else { swal("Canceled save...", { icon: "warning", }); } - } else { - swal("Canceled save...", { - icon: "warning", - }); - } + }); }); } -const editSession = (elm = null, message = "Editing selected session... Allowed: a-z, A-Z, -, _") => { - let id = elm.innerHTML; - let inputTag = document.createElement("INPUT"); - inputTag.value = id; +const editSession = (elm = null, message = "Editing selected session...\nAllowed: a-z, A-Z, -, _") => { + let id = elm.innerText; + let inputTag = document.createElement("INPUT"); + let checkedTag = document.createElement("INPUT"); + let labelTag = document.createElement("LABEL"); + let brTag = document.createElement("BR"); - swal(message, { - content: inputTag, - buttons: true, - }).then((value) => { - if (value) { - let newName = inputTag.value.replace(/ /g, "_"); + inputTag.disabled = true; + inputTag.value = id; + checkedTag.type = "checkbox"; + checkedTag.id = "newOrOld"; + labelTag.innerText = "Create New Session"; + labelTag.htmlFor = "newOrOld"; - if (newName) { - if (newName.search(regexp) == -1) { - editSession("Please try again...\nAllowed: a-z, A-Z, -, _") - return ; + checkedTag.onchange = function () { + inputTag.disabled = !inputTag.disabled; + } + + storage.get(id).then((storageResults) => { + let json = JSON.parse(storageResults[id]); + let keys = Object.keys(json); + let keysLength = Object.keys(json).length; + let container = selectionWindow(json, keys, keysLength); + container.prepend(labelTag); + container.prepend(checkedTag); + container.prepend(brTag); + container.prepend(inputTag); + + swal(message, { + content: container, + buttons: true, + }).then((value) => { + if (value) { + let newName = inputTag.value.replace(/ /g, "_"); + + if (newName) { + if (newName.search(regexp) == -1) { + editSession("Please try again...\nAllowed: a-z, A-Z, -, _") + return ; + } + + json = selectionData(container, keys, keysLength); + if (!checkedTag.checked) { + storage.get(id).then((storageResults) => { + storage.remove(id); + saveToStorage(newName, JSON.stringify(json), true); + }); + elm.textContent = newName; + } else { + if (newName !== elm.textContent) { + saveToStorage(newName, JSON.stringify(json), false); + } else { + editSession(elm, "Cannot have the same name as before...\nAllowed: a-z, A-Z, -, _") + } + } + } else { + swal("Canceled edit...", { + icon: "warning", + }); } - - storage.get(id).then((storageResults) => { - storage.remove(id); - json = JSON.parse(storageResults[id]); - saveToStorage(newName, JSON.stringify(json), true); - }); - - elm.textContent = newName; } else { swal("Canceled edit...", { icon: "warning", }); } - } else { - swal("Canceled edit...", { - icon: "warning", - }); - } + }); }); } @@ -109,6 +142,7 @@ const saveToStorage = (name, data, fromEdit = false) => { icon: "warning", }); } else { + appendToSavedSessionsList(name); swal("Saved session...", { icon: "success", }); @@ -122,13 +156,13 @@ const saveToStorage = (name, data, fromEdit = false) => { const deleteFromStorage = (elm = null) => { swal({ title: "Are you sure?", - text: "Do you wish to delete session:\n" + elm.innerHTML + "?", + text: "Do you wish to delete session:\n" + elm.innerText + "?", icon: "warning", buttons: true, dangerMode: true, }).then((willDelete) => { if (willDelete) { - storage.remove(elm.innerHTML).then(() => { + storage.remove(elm.innerText).then(() => { elm.parentElement.removeChild(elm); }); swal("Deleted session successfully...", { @@ -157,7 +191,7 @@ const downloadSession = (elm = null) => { let brTag = document.createElement("BR"); var dlAnchorElem = document.getElementById('downloadAnchorElem'); let text = document.createTextNode("Append Date?"); - let id = elm.innerHTML; + let id = elm.innerText; let fileName = "session:" + id + ".json"; chkBoxTag.type = "checkbox"; inputTag.value = fileName; @@ -201,7 +235,6 @@ const loadSession = (json = null, replaceTabs = false) => { let wasCurrentTabId = null; if (replaceTabs) { // Clear all windows but main then load... - // Clear all non-current windows and then current window's tabs for (let i = 0; i < windows.length; i++) { if (currentWindow.id != windows[i].id) { windowSys.remove(windows[i].id); @@ -272,3 +305,75 @@ const appendToSavedSessionsList = (enteryName) => { } getSavedSessionIDs(); + + + + +/* Selection Process */ + +const selectionWindow = (json = "", keys = null, keysLength = 0) => { + let container = document.createElement("DIV"); + let ulTemplate = document.querySelector('#ulTemplate'); + let liTemplate = document.querySelector('#liTemplate'); + + for (let i = 0; i < keysLength; i++) { + let ulClone = document.importNode(ulTemplate.content, true); + let ulTag = ulClone.querySelector('.collection'); + let selAll = ulClone.querySelector('input'); + let h2Tag = ulClone.querySelector('.ulHeader'); + let ulLblTag = ulClone.querySelector('label'); + let h2Txt = document.createTextNode("Window: " + (i + 1)); + let store = json[keys[i]]; + let j = 0; + + container.id = "editSelectionContainer"; + selAll.id = "selectAllWin" + i; + ulLblTag.htmlFor = "selectAllWin" + i; + selAll.addEventListener("click", function (eve) { + toggleSelect(eve.target, "Win" + i); + }); + h2Tag.appendChild(h2Txt); + + store.forEach(tab => { + let liClone = document.importNode(liTemplate.content, true); + let inptTag = liClone.querySelector("input"); + let lblTag = liClone.querySelector("label"); + let labelTxt = document.createTextNode(tab.link); + inptTag.id = "Win" + i + "Li" + j; + lblTag.htmlFor = "Win" + i + "Li" + j; + lblTag.title = tab.link; + inptTag.setAttribute("name", "Win" + i); // Used for toggle select all + lblTag.appendChild(labelTxt); + ulTag.appendChild(liClone); + j++; + }); + + container.appendChild(ulClone); + } + + return container; +} + +const selectionData = (container = null, keys = null, keysLength = 0) => { + let sessionData = {}; + let ulTags = container.querySelectorAll("ul"); + + for (let i = 0; i < keysLength; i++) { + let links = []; + + for (var ii = 0; ii < ulTags[i].children.length; ii++) { + let li = ulTags[i].children[ii]; + if (li.children[0].checked) { + links.push( + {"link" : li.children[1].innerText.trim()} + ); + } + } + + if (links.length > 0) { + sessionData[keys[i]] = links; + } + } + + return sessionData; +} diff --git a/src/styles/styles.css b/src/styles/styles.css index cec4e23..c174532 100644 --- a/src/styles/styles.css +++ b/src/styles/styles.css @@ -31,9 +31,9 @@ input[type=image]:hover { } #editSelectionContainer { - height: 350px; - min-height: 350x; - max-height: 350px; + height: 315px; + min-height: 315px; + max-height: 315px; white-space: nowrap; display: block; overflow-x: auto; @@ -62,6 +62,11 @@ input[type=image]:hover { color: rgba(255, 255, 255, 0.5); } +.collection { + padding-top: 1em; + padding-bottom: 1em; +} + .container { width: 100%; height: 100%;