diff --git a/README.md b/README.md index 09a4a92..09a6892 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,8 @@ 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.2.1.3 -Improved width of SweetAlert windows. +# Version: 0.2.1.0 +Refactored code and added tab count per session. # Images ![1 Default interface with no sessions. ](images/pic1.png) diff --git a/src/manifest.json b/src/manifest.json index d20c51c..7003b03 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -1,8 +1,8 @@ { "manifest_version": 2, "name": " Easy Session Manager", - "version": "0.2.1.3", - "description": " Easy Session Manager allows you to manage your Firefox session by backing up or loading your saved sessions.", + "version": "0.2.1.0", + "description": "Easy Session Manager allows you to manage your Firefox session by backing up or loading your saved sessions.", "applications": { "gecko": { @@ -27,7 +27,7 @@ "browser_action": { "default_icon": "images/icons/sessionManager.png", - "default_title": " Easy Session Manager", + "default_title": "Easy Session Manager", "default_popup": "pages/sessionManager.html" } diff --git a/src/pages/import.html b/src/pages/import.html index f5afcca..63aefbb 100644 --- a/src/pages/import.html +++ b/src/pages/import.html @@ -29,7 +29,7 @@ body, html { - + diff --git a/src/pages/sessionManager.html b/src/pages/sessionManager.html index 73bb745..8ec7ead 100755 --- a/src/pages/sessionManager.html +++ b/src/pages/sessionManager.html @@ -42,9 +42,10 @@ + + + - - diff --git a/src/scripts/actions.js b/src/scripts/actions.js new file mode 100644 index 0000000..ed00c3f --- /dev/null +++ b/src/scripts/actions.js @@ -0,0 +1,81 @@ +const messageWindow = (type = "warning", message = "No message passed in...") => { + swal(message, { icon: type, }); +} + +const getSavedSessionIDs = () => { + storageApi.get(null).then((results) => { + let keys = Object.keys(results); + for (let key of keys) { + appendToSavedSessionsList(key); + } + }); +} + +const windowMaker = (i, keysLength, keys, json) => { + for (; i < keysLength; i++) { + let store = json[keys[i]]; + let urls = []; + + for (let j = 0; j < store.length; j++) { + urls.push(store[j].link); + } + windowApi.create({ url: urls }); + } +} + +const saveToStorage = (name, data, action = "undefined", willReplace = false) => { + storageApi.get(name).then((results) => { + try { + // If save finds a session successfully then check if replacing + const json = JSON.parse(results[name]); + if (!willReplace) { + swal({ + title: "Replace?", + text: "Found a session with that name! Do you want to replace it?", + icon: "warning", + buttons: true, + dangerMode: true, + }).then((willReplace) => { + if (willReplace) { + storageApi.set({[name]: data}); + messageWindow("warning", "Overwrote session..."); + } else { + messageWindow("warning", "Canceled " + action + "..."); + } + }); + } else { + storageApi.set({[name]: data}); + messageWindow("warning", "Overwrote session..."); + } + } catch (e) { + if (action !== "edit") { + appendToSavedSessionsList(name); + messageWindow("success", "Saved session..."); + storageApi.set({[name]: data}); + } else { + messageWindow("warning", "Overwrote session..."); + storageApi.set({[name]: data}); + } + } + }); +} + +const deleteFromStorage = (elm = null) => { + swal({ + title: "Are you sure?", + text: "Do you wish to delete session:\n" + elm.innerText + "?", + icon: "warning", + buttons: true, + dangerMode: true, + }).then((willDelete) => { + if (willDelete) { + storageApi.remove(elm.innerText).then(() => { + elm.parentElement.removeChild(elm); + }); + selectedItem = null; // reset selectedItem + messageWindow("success", "Deleted session successfully..."); + } else { + messageWindow("warning", "Canceled deletion..."); + } + }); +} diff --git a/src/scripts/background.js b/src/scripts/background.js index 627678e..ef799c3 100644 --- a/src/scripts/background.js +++ b/src/scripts/background.js @@ -1,7 +1,7 @@ -const regexp = /^[a-zA-Z0-9-_]+$/; // Alphanumeric, dash, underscore +const message1 = "What is this session's name? Allowed: a-z, A-Z, -, _"; +const regexp = /^[a-zA-Z0-9-_]+$/; // Alphanumeric, dash, underscore -const processor = (obj, enteryName = '', - message = "What is this session's name? Allowed: a-z, A-Z, -, _") => { +const processor = (obj, enteryName = '', message = message1) => { let data = obj.target.result; let inputTag = document.createElement("INPUT"); inputTag.value = enteryName; @@ -13,29 +13,24 @@ const processor = (obj, enteryName = '', }).then((value) => { if (value) { enteryName = inputTag.value.replace(/ /g, "_"); - if (enteryName) { - if (enteryName.search(regexp) == -1) { - processor(obj, enteryName, "Please try again...\nAllowed: a-z, A-Z, -, _") - return ; - } - try { - console.log("Importing session..."); - JSON.parse(data); - browser.storage.local.set({[enteryName]: data}); - swal("Imported file successfully.", { - icon: "success", - }); - } catch (e) { - swal("Failed to import data. Not a JSON parsable file.", { - icon: "error", - }); - return ; - } - } else { - swal("Canceled import.", { - icon: "warning", + if (enteryName.length < 0 || enteryName.length > 54 || enteryName.search(regexp) == -1) { + processor(obj, "", "Allowed: a-z, A-Z, 0-9, -, _ Please try again...\nName too long or none provided; or, unacceptable character used."); + return ; + } + + try { + console.log("Importing session..."); + JSON.parse(data); + browser.storage.local.set({[enteryName]: data}); + swal("Imported file successfully.", { + icon: "success", }); + } catch (e) { + swal("Failed to import data. Not a JSON parsable file.", { + icon: "error", + }); + return ; } } else { swal("Canceled import.", { diff --git a/src/scripts/events.js b/src/scripts/events.js index 0338d87..f220d4e 100644 --- a/src/scripts/events.js +++ b/src/scripts/events.js @@ -1,11 +1,4 @@ -let selectedItem = null; - -const toggleSelect = (source, name) => { - let checkboxes = document.getElementsByName(name); - for (var i = 0; i < checkboxes.length; i++) { - checkboxes[i].checked = source.checked; - } -} +getSavedSessionIDs(); document.addEventListener("click", (e) => { if (e.button == 0) { // Left click @@ -27,10 +20,7 @@ document.addEventListener("click", (e) => { } else if (name == "import") { importSession(); } else if (name == "donate") { - var dlAnchorElem = document.getElementById('downloadAnchorElem'); - dlAnchorElem.setAttribute("href", "https://www.paypal.me/ITDominator"); - dlAnchorElem.setAttribute("_blank", ""); - dlAnchorElem.click(); + doUrlAction("https://www.paypal.me/ITDominator",); } if (e.target.tagName == "LI" && e.target.className.includes("sessionLI")) { @@ -55,39 +45,9 @@ document.addEventListener("dblclick", (e) => { if (e.button == 0) { // Left click if (e.target.tagName == "LI" && e.target.className.includes("sessionLI")) { selectedItem = e.target; + let id = selectedItem.innerText.trim(); selectedItem.setAttribute("class", "sessionLI selected"); - try { - let id = e.target.innerText.trim(); - storage.get(id).then(storageResults => { - let json = JSON.parse(storageResults[id]); - let keys = Object.keys(json); - let keysLength = Object.keys(json).length; - let replaceTabs = document.getElementsByName("replaceTabs")[0]; - let selectiveOpen = document.getElementsByName("selectiveOpen")[0]; - - if (!selectiveOpen.checked) { - loadSession(json, replaceTabs.checked); - } else { - let container = selectionWindow(json, keys, keysLength); - swal("Selective Open", { - content: container, - buttons: true, - }).then((willOpen) => { - if (willOpen) { - json = selectionData(container, keys, keysLength); - keysLength = Object.keys(json).length; - if (keysLength > 0) { - loadSession(json, replaceTabs.checked); - } else { - messageWindow("warning", "Canceled operation; no tabs were selected..."); - } - } - }); - } - }); - } catch (e) { - console.log(e); - } + preLoadSession(id); } } }); diff --git a/src/scripts/require.js b/src/scripts/libs/require.js similarity index 100% rename from src/scripts/require.js rename to src/scripts/libs/require.js diff --git a/src/scripts/sweetalert.js b/src/scripts/libs/sweetalert.js similarity index 100% rename from src/scripts/sweetalert.js rename to src/scripts/libs/sweetalert.js diff --git a/src/scripts/session-manager.js b/src/scripts/session-manager.js new file mode 100644 index 0000000..01c5d75 --- /dev/null +++ b/src/scripts/session-manager.js @@ -0,0 +1,250 @@ +const message1 = "[ Session Name ] Allowed: a-z, A-Z, 0-9, -, _"; +const message2 = "Allowed: a-z, A-Z, 0-9, -, _ Please try again...\nName too long or none provided; or, unacceptable character used."; +const storageApi = browser.storage.local; +const tabsApi = browser.tabs; +const windowApi = browser.windows; +const regexp = /^[a-zA-Z0-9-_]+$/; // Alphanumeric, dash, underscore + + +const saveSession = (elm = null, message = message1) => { + let inputTag = document.createElement("INPUT"); + let willReplace = false; + inputTag.value = new Date().toLocaleString().split(',')[0].replace(/\//g, '-'); + + if (elm !== null) { + inputTag.value = elm.innerText; + willReplace = true; + } + + windowApi.getAll({ populate: true, windowTypes: ["normal"] }).then((windows) => { + let sessionData = getSessionData(windows); + let keys = Object.keys(sessionData); + let keysLength = Object.keys(sessionData).length; + let container = generateSelectionWindow(sessionData, keys, keysLength); + container.prepend(inputTag); + + swal(message, { + content: container, + buttons: true, + customClass: 'swal-modal', + }).then((value) => { + if (value) { + let enteryName = inputTag.value.replace(/ /g, "_"); + + if (enteryName.length < 0 || enteryName.length > 54 || enteryName.search(regexp) == -1) { + saveSession(elm, message2); + return ; + } + + console.log("Saving session..."); + sessionData = getSelectionData(container, keys, keysLength); + saveToStorage(enteryName, JSON.stringify(sessionData), "save", willReplace); + } else { + messageWindow("warning", "Canceled save..."); + } + }); + }); +} + +const editSession = (elm = null, message = message1) => { + let id = elm.innerText; + let inputTag = document.createElement("INPUT"); + let newSessionCheckTag = document.createElement("INPUT"); + let labelTag = document.createElement("LABEL"); + let brTag = document.createElement("BR"); + + inputTag.value = id; + newSessionCheckTag.type = "checkbox"; + newSessionCheckTag.id = "newSession"; + newSessionCheckTag.checked = false; + labelTag.innerText = "Create New Session"; + labelTag.htmlFor = "newSession"; + + storageApi.get(id).then((results) => { + let json = JSON.parse(results[id]); + let keys = Object.keys(json); + let keysLength = Object.keys(json).length; + let container = generateSelectionWindow(json, keys, keysLength); + container.prepend(labelTag); + container.prepend(newSessionCheckTag); + container.prepend(brTag); + container.prepend(inputTag); + + console.log("Editing session..."); + swal(message, { + content: container, + buttons: true, + customClass: 'swal-modal', + }).then((value) => { + if (value) { + let newName = inputTag.value.replace(/ /g, "_"); + + if (newName.length < 0 || newName.length > 54 || newName.search(regexp) == -1) { + editSession(elm, message2); + return ; + } + + json = getSelectionData(container, keys, keysLength); + // If creating from collection new session + if (newSessionCheckTag.checked) { + if (newName !== elm.innerText) { + newName = checkSessionListForDuplicate(newName); + saveToStorage(newName, JSON.stringify(json), "save"); + } else { // Enforce unique name + let min = 1; + let max = 200000; + var random = Math.floor(Math.random() * (+max - +min)) + +min; + newName += "-" + random + "-" + Math.floor(Math.random() * (+10 - +1)) + +1; + saveToStorage(newName, JSON.stringify(json), "edit"); + } + } else { + // If not creating new session and diff name enforced; generate new name + if (newName !== elm.innerText) { + newName = checkSessionListForDuplicate(newName); + storageApi.get(id).then((results) => { + storageApi.remove(id); + saveToStorage(newName, JSON.stringify(json), "edit"); + }).then(() => { + elm.textContent = newName; + }); + } else { // Replace found session + saveToStorage(newName, JSON.stringify(json), "edit", true); + } + } + } else { + messageWindow("warning", "Canceled edit..."); + } + }); + }); +} + +const downloadSession = (elm = null) => { + let pTag = document.createElement("P"); + let inputTag = document.createElement("INPUT"); + let chkBoxTag = document.createElement("INPUT"); + let lblTag = document.createElement("LABEL"); + let brTag = document.createElement("BR"); + let aTagElm = document.getElementById('downloadAnchorElem'); + let text = document.createTextNode("Append Date?"); + let id = elm.innerText; + let fileName = "session:" + id + ".json"; + + chkBoxTag.type = "checkbox"; + inputTag.value = fileName; + chkBoxTag.id = "chkbx"; + lblTag.htmlFor = "chkbx"; + lblTag.append(text); + pTag.append(lblTag); + pTag.append(chkBoxTag); + pTag.append(brTag); + pTag.append(inputTag); + + swal("Download Session?", { + content: pTag, + buttons: true, + customClass: 'swal-modal', + }).then((willDl) => { + if (willDl) { + if (chkBoxTag.checked) { + fileName = "session:" + id + ":" + + new Date().toLocaleString().split(',')[0].replace(/\//g, "-") + ".json"; + } + + storageApi.get(id).then((results) => { + let json = JSON.parse(results[id]); + console.log("Downloading: " + id); + let dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(json)); + doUrlAction(dataStr, fileName, true); + }); + } + }); +} + +const preLoadSession = (id) => { + storageApi.get(id).then(results => { + try { + let json = JSON.parse(results[id]); + let keys = Object.keys(json); + let keysLength = Object.keys(json).length; + let replaceTabs = document.getElementsByName("replaceTabs")[0]; + let selectiveOpen = document.getElementsByName("selectiveOpen")[0]; + + if (!selectiveOpen.checked) { + loadSession(json, replaceTabs.checked); + } else { + let container = generateSelectionWindow(json, keys, keysLength); + swal("Selective Open", { + content: container, + buttons: true, + }).then((willOpen) => { + if (willOpen) { + json = getSelectionData(container, keys, keysLength); + keysLength = Object.keys(json).length; + if (keysLength > 0) { + loadSession(json, replaceTabs.checked); + } else { + messageWindow("warning", "Canceled Operation: No tabs were selected..."); + } + } + }); + } + } catch (e) { + messageWindow("error", "Couldn't load session:\n" + e); + } + }); +} + +const loadSession = (json = null, replaceTabs = false) => { + let keys = Object.keys(json); + let keysLength = Object.keys(json).length; + try { + browser.windows.getAll().then(windows => { + windowApi.getCurrent({populate: true}).then(currentWindow => { + let wasCurrentTabId = null; + + if (replaceTabs) { // Clear all windows but main then load... + if (keysLength == 0) { + messageWindow("error", "Canceled operation; no tabs in session..."); + return ; + } + + for (let i = 0; i < windows.length; i++) { + if (currentWindow.id != windows[i].id) { + windowApi.remove(windows[i].id); + } else { + let ids = []; + currentWindow.tabs.forEach(tab => { + if (!tab.active) { + ids.push(tab.id); + } else { + wasCurrentTabId = tab.id; + } + }); + tabsApi.remove(ids); + } + } + + // First load tabs to current window. + let store = json[keys[0]]; + store.forEach(tab => { + tabsApi.create({ url: tab.link }); + }); + tabsApi.remove(wasCurrentTabId); + + // If more than one window, load tabs to new windows. + if (keysLength > 1) { + windowMaker(1, keysLength, keys, json) + } + } else { // Load into new windows... + if (keysLength == 1) { + windowMaker(0, keysLength, keys, json) + } else if (keysLength == 0) { + messageWindow("error", "Canceled operation; no tabs in session..."); + } + } + }); + }); + } catch (e) { + messageWindow("error", "Couldn't load session:\n" + e); + } +} diff --git a/src/scripts/sessionManager.js b/src/scripts/sessionManager.js deleted file mode 100644 index 6a5ae4c..0000000 --- a/src/scripts/sessionManager.js +++ /dev/null @@ -1,236 +0,0 @@ -const storage = browser.storage.local; -const windowSys = browser.windows; -const regexp = /^[a-zA-Z0-9-_]+$/; // Alphanumeric, dash, underscore - - -const saveSession = (elm = null, message = "[ Session Name ] Allowed: a-z, A-Z, 0-9, -, _") => { - let inputTag = document.createElement("INPUT"); - inputTag.value = new Date().toLocaleString().split(',')[0].replace(/\//g, '-'); - - if (elm !== null) - inputTag.value = elm.innerText; - - 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; - } - - let keys = Object.keys(sessionData); - let keysLength = Object.keys(sessionData).length; - let container = selectionWindow(sessionData, keys, keysLength); - container.prepend(inputTag); - - swal(message, { - content: container, - buttons: true, - customClass: 'swal-modal', - }).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, 0-9, -, _") - return ; - } - - console.log("Saving session..."); - sessionData = selectionData(container, keys, keysLength); - saveToStorage(enteryName, JSON.stringify(sessionData)); - } else { - messageWindow("warning", "Canceled save..."); - } - } else { - messageWindow("warning", "Canceled save..."); - } - }); - }); -} - -const editSession = (elm = null, message = "Editing selected session...\nAllowed: a-z, A-Z, 0-9, -, _") => { - let id = elm.innerText; - let inputTag = document.createElement("INPUT"); - let checkedTag = document.createElement("INPUT"); - let labelTag = document.createElement("LABEL"); - let brTag = document.createElement("BR"); - - inputTag.value = id; - checkedTag.type = "checkbox"; - checkedTag.id = "newSession"; - checkedTag.checked = false; - labelTag.innerText = "Create New Session"; - labelTag.htmlFor = "newSession"; - - 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, - customClass: 'swal-modal', - }).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, 0-9, -, _") - return ; - } - - json = selectionData(container, keys, keysLength); - if (checkedTag.checked) { // if creating from collection new session - if (newName !== elm.innerText) { - newName = checkSessionListForDuplicate(newName); - saveToStorage(newName, JSON.stringify(json), false); - } else { // enforce unique name - let min = 1; - let max = 200000; - var random = Math.floor(Math.random() * (+max - +min)) + +min; - newName += "-" + random + "-" + Math.floor(Math.random() * (+10 - +1)) + +1; - saveToStorage(newName, JSON.stringify(json), false); - } - } else { - if (newName !== elm.innerText) { // if not creating new session and diff name rename - newName = checkSessionListForDuplicate(newName); - storage.get(id).then((storageResults) => { - storage.remove(id); - saveToStorage(newName, JSON.stringify(json), true); - }).then(() => { - elm.textContent = newName; - }); - } else { // just replace - saveToStorage(newName, JSON.stringify(json), true); - } - } - } else { - messageWindow("warning", "Canceled edit..."); - } - } else { - messageWindow("warning", "Canceled edit..."); - } - }); - }); -} - -const importSession = () => { - browser.tabs.create({ - url: browser.extension.getURL("../pages/import.html"), - active: true - }); -} - -const downloadSession = (elm = null) => { - let pTag = document.createElement("P"); - let inputTag = document.createElement("INPUT"); - let chkBoxTag = document.createElement("INPUT"); - let lblTag = document.createElement("LABEL"); - let brTag = document.createElement("BR"); - var dlAnchorElem = document.getElementById('downloadAnchorElem'); - let text = document.createTextNode("Append Date?"); - let id = elm.innerText; - let fileName = "session:" + id + ".json"; - chkBoxTag.type = "checkbox"; - inputTag.value = fileName; - chkBoxTag.id = "chkbx"; - lblTag.htmlFor = "chkbx"; - lblTag.append(text); - pTag.append(lblTag); - pTag.append(chkBoxTag); - pTag.append(brTag); - pTag.append(inputTag); - - swal("Download Session?", { - content: pTag, - buttons: true, - customClass: 'swal-modal', - }).then((willDl) => { - if (willDl) { - if (chkBoxTag.checked) { - fileName = "session:" + id + ":" + - new Date().toLocaleString().split(',')[0].replace(/\//g, "-") + ".json"; - } - - storage.get(id).then((storageResults) => { - let json = JSON.parse(storageResults[id]); - let dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(json)); - dlAnchorElem.setAttribute("href", dataStr); - dlAnchorElem.setAttribute("download", fileName); - dlAnchorElem.setAttribute("target", ""); - dlAnchorElem.click(); - }); - } - }); -} - -const loadSession = (json = null, replaceTabs = false) => { - console.log("Loading session..."); - let keys = Object.keys(json); - let keysLength = Object.keys(json).length; - try { - browser.windows.getAll().then(windows => { - windowSys.getCurrent({populate: true}).then(currentWindow => { - let wasCurrentTabId = null; - - if (replaceTabs) { // Clear all windows but main then load... - if (keysLength == 0) { - messageWindow("error", "Canceled operation; no tabs in session..."); - return ; - } - - for (let i = 0; i < windows.length; i++) { - if (currentWindow.id != windows[i].id) { - windowSys.remove(windows[i].id); - } else { - let ids = []; - currentWindow.tabs.forEach(tab => { - if (!tab.active) { - ids.push(tab.id); - } else { - wasCurrentTabId = tab.id; - } - }); - browser.tabs.remove(ids); - } - } - - // First load tabs to current window. - let store = json[keys[0]]; - store.forEach(tab => { - browser.tabs.create({ url: tab.link }); - }); - browser.tabs.remove(wasCurrentTabId); - - // If more than one window, load tabs to new windows. - if (keysLength > 1) { - windowMaker(1, keysLength, keys, json) - } - } else { // Load into new windows... - if (keysLength == 1) { - windowMaker(0, keysLength, keys, json) - } else if (keysLength == 0) { - messageWindow("error", "Canceled operation; no tabs in session..."); - } - } - }); - }); - } catch (e) { console.log(e); } -} - -getSavedSessionIDs(); diff --git a/src/scripts/utils.js b/src/scripts/utils.js index a93061a..a19f222 100644 --- a/src/scripts/utils.js +++ b/src/scripts/utils.js @@ -1,95 +1,9 @@ -const messageWindow = (type = "warning", message = "No message passed in...") => { - swal(message, { icon: type, }); -} - -const getSavedSessionIDs = () => { - console.log("Getting saved sessions..."); - storage.get(null).then((storageResults) => { - let keys = Object.keys(storageResults); - for (let key of keys) { - appendToSavedSessionsList(key); - } - }); -} - -const appendToSavedSessionsList = (enteryName) => { - let liTag = document.createElement("LI"); - let text = document.createTextNode(enteryName.trim()); - liTag.setAttribute("name", enteryName.trim()); - liTag.className = "sessionLI"; - liTag.append(text); - document.getElementById("savedSessions").append(liTag); -} - - -const checkSessionListForDuplicate = (newName) => { - let sessions = document.getElementById("savedSessions").querySelectorAll("li"); - for (var i = 0; i < sessions.length; i++) { - if (sessions[i].innerText === newName) { - let min = 1; - let max = 200000; - var random = Math.floor(Math.random() * (+max - +min)) + +min; - newName += "-" + random + "-" + Math.floor(Math.random() * (+10 - +1)) + +1; - } - } - return newName; -} - -const windowMaker = (i, keysLength, keys, json) => { - for (; i < keysLength; i++) { - let store = json[keys[i]]; - let urls = []; - - for (let j = 0; j < store.length; j++) { - urls.push(store[j].link); - } - windowSys.create({ url: urls }); - } -} - -const saveToStorage = (name, data, fromEdit = false) => { - storage.get(name).then((storageResults) => { - let json = null; - try { - json = JSON.parse(storageResults[name]); - messageWindow("warning", "Overwrote session..."); - } catch (e) { - if (fromEdit) { // minor logic fix - messageWindow("warning", "Overwrote session..."); - } else { - appendToSavedSessionsList(name); - messageWindow("success", "Saved session..."); - } - } finally { - storage.set({[name]: data}); - } - }); -} - -const deleteFromStorage = (elm = null) => { - swal({ - title: "Are you sure?", - text: "Do you wish to delete session:\n" + elm.innerText + "?", - icon: "warning", - buttons: true, - dangerMode: true, - }).then((willDelete) => { - if (willDelete) { - storage.remove(elm.innerText).then(() => { - elm.parentElement.removeChild(elm); - }); - selectedItem = null; // reset selectedItem - messageWindow("success", "Deleted session successfully..."); - } else { - messageWindow("warning", "Canceled deletion..."); - } - }); -} +let selectedItem = null; +// UI supporters /* Selection Process */ - -const selectionWindow = (json = "", keys = null, keysLength = 0) => { +const generateSelectionWindow = (json = "", keys = null, keysLength = 0) => { let container = document.createElement("DIV"); let ulTemplate = document.querySelector('#ulTemplate'); let liTemplate = document.querySelector('#liTemplate'); @@ -132,7 +46,50 @@ const selectionWindow = (json = "", keys = null, keysLength = 0) => { return container; } -const selectionData = (container = null, keys = null, keysLength = 0) => { +const checkSessionListForDuplicate = (newName) => { + let sessions = document.getElementById("savedSessions").querySelectorAll("li"); + for (var i = 0; i < sessions.length; i++) { + if (sessions[i].innerText === newName) { + let min = 1; + let max = 200000; + let random = Math.floor(Math.random() * (+max - +min)) + +min; + newName += "-" + random + "-" + Math.floor(Math.random() * (+10 - +1)) + +1; + } + } + return newName; +} + +const appendToSavedSessionsList = (enteryName) => { + let liTag = document.createElement("LI"); + let text = document.createTextNode(enteryName.trim()); + liTag.className = "sessionLI"; + + liTag.setAttribute("name", enteryName.trim()); + liTag.append(text); + document.getElementById("savedSessions").append(liTag); +} + + + +// Generics + +const getSessionData = (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; + } + return sessionData; +} + +const getSelectionData = (container = null, keys = null, keysLength = 0) => { let sessionData = {}; let ulTags = container.querySelectorAll("ul"); @@ -155,3 +112,28 @@ const selectionData = (container = null, keys = null, keysLength = 0) => { return sessionData; } + +const doUrlAction = (url = "https://www.paypal.me/ITDominator", fileName = "", isDownload = false) => { + let aTagElm = document.getElementById('downloadAnchorElem'); + aTagElm.setAttribute("href", url); + + if (isDownload) + aTagElm.setAttribute("download", fileName); + + aTagElm.setAttribute("_blank", ""); + aTagElm.click(); +} + +const importSession = () => { + browser.tabs.create({ + url: browser.extension.getURL("../pages/import.html"), + active: true + }); +} + +const toggleSelect = (source, name) => { + let checkboxes = document.getElementsByName(name); + for (let i = 0; i < checkboxes.length; i++) { + checkboxes[i].checked = source.checked; + } +}