diff --git a/.DS_Store b/.DS_Store index eb666dc..9efbcec 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/README.md b/README.md index f36209c..b7ee47b 100644 --- a/README.md +++ b/README.md @@ -39,4 +39,4 @@ You can open an issue and there you must describe the feedback, the bug or the n See folder screenshots to see screenshots also of the older versions. - + diff --git a/all-websites/index.html b/all-websites/index.html index a7b6b5f..587b0fb 100644 --- a/all-websites/index.html +++ b/all-websites/index.html @@ -6,11 +6,13 @@ + Limite: all time spent +
-

All time spent

+

All time spent

@@ -18,11 +20,19 @@

All time spent

diff --git a/css/style.css b/css/style.css index d3b63df..2cb1a70 100644 --- a/css/style.css +++ b/css/style.css @@ -336,6 +336,65 @@ textarea { z-index: 4; } +.th-sort-by-column { + cursor: pointer; + transition: 0s; +} + +.th-sort-by-column:hover { + background-color: #2c96ff; +} + +.th-sort-by-column-sel { + padding-right: 25px; + background-repeat: no-repeat; + background-position: right 5px center; + background-size: 20px auto; +} + +.sort-by-column-asc { + background-image: url("/img/sort-asc.svg"); +} + +.sort-by-column-desc { + background-image: url("/img/sort-desc.svg"); +} + +#search-container { + grid-area: search; + text-align: left; + overflow: visible; +} + +#nav-days-container { + grid-area: days; + text-align: right; + overflow: visible; +} + +#filters-container { + grid-area: filters; + text-align: center; + overflow: visible; +} + +#search-all-websites-text { + width: 100%; + min-width: 300px; + margin: 0px; + background-color: #2c96ff; + color: #ffffff; + opacity: 0.8; + border: 0px solid transparent; + padding: 4px 10px; +} + +#search-all-websites-text:active, #search-all-websites-text:focus { + background-color: #6ab4ff; + box-shadow: 0px 0px 0px 2px #ffffffaa; + color: #ffffff; +} + #navigator-days { background-color: #0080ff; margin: 5px; @@ -349,11 +408,12 @@ textarea { width: auto; height: auto; padding: 5px; - text-align: right; + display: grid; + grid-template-areas: "search days"; } .nav-days-fixed { - background-color: #0080ffaa !important; + background-color: #0080ffdd !important; border-radius: 5px !important; } @@ -634,10 +694,14 @@ h3 { .float-right { float: right; + overflow: visible; + text-align: right; } .float-left { float: left; + overflow: visible; + text-align: left; } .margin-right-5-px { @@ -673,7 +737,7 @@ h3 { } /*categories*/ -.other-category, .social-category, .travel-category, .news-category, .education-category, .shopping-category, .search-category, .reference-category, .entertainment-category, .adults-category, .sav22999-category, .develop-category, .messaging-category, .games-category, .health-category { +.other-category, .social-category, .travel-category, .news-category, .education-category, .shopping-category, .search-category, .reference-category, .entertainment-category, .adults-category, .sav22999-category, .develop-category, .messaging-category, .games-category, .health-category, .cloud-category { background-color: transparent; background-repeat: no-repeat; background-size: auto 100%; @@ -739,6 +803,11 @@ h3 { background-image: url("../img/categories/games.svg"); } +.cloud-category { + background-image: url("../img/categories/cloud.svg"); + background-size: auto 110%; +} + .health-category { background-image: url("../img/categories/health.svg"); } \ No newline at end of file diff --git a/img/categories/cloud.svg b/img/categories/cloud.svg new file mode 100644 index 0000000..d1bc973 --- /dev/null +++ b/img/categories/cloud.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/img/sort-asc.svg b/img/sort-asc.svg new file mode 100644 index 0000000..7ca6a0c --- /dev/null +++ b/img/sort-asc.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/img/sort-desc.svg b/img/sort-desc.svg new file mode 100644 index 0000000..3574bec --- /dev/null +++ b/img/sort-desc.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/js/all-websites.js b/js/all-websites.js index 293c3bc..90a4e6b 100644 --- a/js/all-websites.js +++ b/js/all-websites.js @@ -5,6 +5,8 @@ let all_dates = []; let start_date = null; let days_to_show = 7; //number of days to show +let categories = {}; +let sorted_by = ""; function loaded() { document.getElementById("refresh-data-button").onclick = function () { @@ -33,7 +35,12 @@ function loaded() { goOlder(); } - loadDataFromBrowser(true); + browser.runtime.sendMessage({from: "all-websites", ask: "categories"}, (response) => { + if (response !== undefined) { + categories = response.categories; + loadDataFromBrowser(true); + } + }); document.getElementById("all-websites-dedication-section").onscroll = function () { if (document.getElementById("all-websites-dedication-section").scrollTop > 30) { @@ -51,28 +58,39 @@ function loaded() { } } } + + document.getElementById("search-all-websites-text").onkeyup = function () { + search(document.getElementById("search-all-websites-text").value); + } + + let titleAllWebsites = document.getElementById("title-all-time-spent"); + let versionNumber = document.createElement("div"); + versionNumber.classList.add("float-right", "small-button"); + versionNumber.textContent = browser.runtime.getManifest().version; + versionNumber.id = "version"; + titleAllWebsites.append(versionNumber); } function goToday() { - loadDataFromBrowser(true); + loadDataFromBrowser(true, false); start_date = 0; } function goLast() { - loadDataFromBrowser(true); + loadDataFromBrowser(true, false); start_date = 0; if (all_dates.length > days_to_show) start_date = all_dates.length - days_to_show; } function goNewer() { - loadDataFromBrowser(true); + loadDataFromBrowser(true, false); //-7 if (start_date > days_to_show) start_date -= days_to_show; else start_date = 0; } function goOlder() { - loadDataFromBrowser(true); + loadDataFromBrowser(true, false); //+7 if ((start_date + days_to_show) < all_dates.length) start_date += days_to_show; //else start_date = all_dates.length - days_to_show; @@ -82,7 +100,7 @@ function setDateInterval(from, to) { document.getElementById("from-to-date-label").textContent = "Days: " + from + " – " + to; } -function loadDataFromBrowser(generate_section = true) { +function loadDataFromBrowser(generate_section = true, force_generation = true) { browser.storage.local.get("websites", function (value) { websites_json = {}; if (value["websites"] !== undefined) { @@ -90,13 +108,35 @@ function loadDataFromBrowser(generate_section = true) { } if (generate_section) { document.getElementById("all-websites-sections").textContent = ""; - websites_json_by_domain = []; - loadAllWebsites(); + //websites_json_by_domain = []; + loadAllWebsites(generate_section, force_generation); } //console.log(JSON.stringify(websites_json)); }); } +function search(value = "") { + browser.storage.local.get("websites").then(response => { + websites_json = {}; + if (response["websites"] !== undefined) { + websites_json = response["websites"]; + } + websites_json_by_domain = []; + document.getElementById("search-all-websites-text").value = value.toString(); + let valueToUse = value.toLowerCase(); + for (const website in websites_json) { + let current_website_json = websites_json[website]; + let condition_category = true//TODO// + let condition_time = true//TODO// + let condition_enabled = true//TODO + if ((website.toLowerCase().includes(valueToUse)) && condition_category && condition_time && condition_enabled) { + websites_json_by_domain.push(website); + } + } + loadAllWebsites(true, false, false); + }); +} + function deleteAllData() { let confirmation = confirm("Are you sure you want to clear all data?\nYou can't cancel this process once started."); if (confirmation) { @@ -200,213 +240,372 @@ function hideBackgroundOpacity() { document.getElementById("background-opacity").style.display = "none"; } -function loadAllWebsites() { - if (!isEmpty(websites_json)) { - //there are websites saved - - for (let url in websites_json) { - websites_json_by_domain.push(url); +/** + * Sort by column! + * @param column it can be "website", "category", "status", "since-install", "date-N" (where N is 0, 1, 2, ...) + * @param websites the dictionary to sort + * @param generate_ui true -> it "generates" also the UI, false -> otherwise it changes only the variable + */ +function sortByColumn(column, websites, generate_ui = true, toggle = true) { + if (sorted_by === "") sorted_by = "website-asc"; + + let previousColumn = ""; + let ascOrDesc = "asc"; + if (column === sorted_by.replace("-asc", "").replace("-desc", "")) { + //same column + if (sorted_by.includes("-asc") || !sorted_by.includes("-desc")) { + if (toggle) ascOrDesc = "desc"; + else ascOrDesc = "asc"; + } else if (sorted_by.includes("-desc")) { + if (toggle) ascOrDesc = "asc"; + else ascOrDesc = "desc"; } - //console.log(JSON.stringify(websites_json_by_domain)); - - websites_json_by_domain.sort(); - - smallest_date = getToday(); + previousColumn = column; + } else { + previousColumn = sorted_by.replace("-asc", "").replace("-desc", ""); + } - for (let index in websites_json_by_domain) { - for (let date in websites_json[websites_json_by_domain[index]]) { - if (date !== "enabled" && date !== "category") { - if (date < smallest_date) { - smallest_date = date; - } - } - } + sorted_by = column + "-" + ascOrDesc; + if (generate_ui) { + if (previousColumn !== "" && previousColumn !== column) { + if (document.getElementById("th-" + previousColumn).classList.contains("th-sort-by-column-sel")) document.getElementById("th-" + previousColumn).classList.remove("th-sort-by-column-sel"); + if (document.getElementById("th-" + previousColumn).classList.contains("sort-by-column-asc")) document.getElementById("th-" + previousColumn).classList.remove("sort-by-column-asc"); + if (document.getElementById("th-" + previousColumn).classList.contains("sort-by-column-desc")) document.getElementById("th-" + previousColumn).classList.remove("sort-by-column-desc"); } - all_dates = getAllDates(smallest_date, getToday()); - all_dates.reverse(); + if (!document.getElementById("th-" + column).classList.contains("th-sort-by-column-sel")) document.getElementById("th-" + column).classList.add("th-sort-by-column-sel"); + if (document.getElementById("th-" + column).classList.contains("sort-by-column-asc")) document.getElementById("th-" + column).classList.remove("sort-by-column-asc"); + if (document.getElementById("th-" + column).classList.contains("sort-by-column-desc")) document.getElementById("th-" + column).classList.remove("sort-by-column-desc"); + document.getElementById("th-" + column).classList.add("sort-by-column-" + ascOrDesc); + } - if (start_date === null) start_date = 0; + //console.log("col " + column + " | prev " + previousColumn + " | sorted_by " + sorted_by) - let last_seven_days = []; - let counter = start_date; //from index 0 - while (counter < (days_to_show + start_date)) { - if (all_dates.length >= (counter + 1)) { - last_seven_days.push(all_dates[counter]); + websites = getWebsitesToUse(websites_json); + if (sorted_by.includes("-asc")) { + //sort as "asc" + websites = websites.sort((a, b) => a[column] > b[column] ? 1 : -1); + } else { + //sort as "desc" + websites = websites.sort((a, b) => a[column] < b[column] ? 1 : -1); + } + + if (generate_ui) { + browser.storage.local.get("websites").then(response => { + websites_json = {}; + if (response["websites"] !== undefined) { + websites_json = response["websites"]; } - counter++; - } + document.getElementById("table-all-websites").removeChild(document.getElementById("tbody-table-all-websites")); + let tableTBodyElement = getTBodyTable(websites, getLastSevenDays()); + document.getElementById("table-all-websites").append(tableTBodyElement); + }); + } + return websites; +} - let section = document.createElement("div"); - section.classList.add("section", "overflow-auto", "no-padding"); - section.id = "table-section"; +function getWebsitesToUse(websites_json) { + let websites_to_use = []; + let last_seven_days = getLastSevenDays(); - let tableElement = document.createElement("table"); - tableElement.classList.add("table-days"); + for (let index in websites_json_by_domain) { + //website + let current_website = websites_json_by_domain[index]; - let tableTHeadElement = document.createElement("thead"); - let tableRowElement = document.createElement("tr"); + let new_website = {}; - let tableHeaderElement = document.createElement("th"); - tableHeaderElement.textContent = "Website"; - tableRowElement.append(tableHeaderElement); + new_website["website"] = current_website; + new_website["status"] = websites_json[current_website]["enabled"]; + new_website["category"] = websites_json[current_website]["category"]; - tableHeaderElement = document.createElement("th"); - tableHeaderElement.textContent = "Status"; - tableRowElement.append(tableHeaderElement); + //since install + let number_of_days = all_dates.length; - tableHeaderElement = document.createElement("th"); - tableHeaderElement.textContent = "Category"; - tableRowElement.append(tableHeaderElement); + let sum_since_install = 0; + for (let date in websites_json[current_website]) { + if (date !== "always" && date !== "enabled" && date !== "category") { + sum_since_install += websites_json[current_website][date]; + } + } + new_website["since-install"] = sum_since_install; - tableHeaderElement = document.createElement("th"); - tableHeaderElement.textContent = "Since install"; - tableRowElement.append(tableHeaderElement); + //days for (let date in last_seven_days) { let date_to_show = last_seven_days[date]; - tableHeaderElement = document.createElement("th"); - tableHeaderElement.textContent = date_to_show; - tableRowElement.append(tableHeaderElement); + let time = 0; + if (websites_json[current_website][date_to_show] !== undefined) { + time = websites_json[current_website][date_to_show]; + } + new_website["date-" + date] = time } - setDateInterval(last_seven_days[0], last_seven_days[last_seven_days.length - 1]); - tableTHeadElement.append(tableRowElement); - tableElement.append(tableTHeadElement); + websites_to_use.push(new_website); + } - let tableTBodyElement = document.createElement("tbody"); - for (let index in websites_json_by_domain) { - tableRowElement = document.createElement("tr"); + return websites_to_use; +} - //website - let current_website = websites_json_by_domain[index]; +function loadAllWebsites(clear = true, load_all_websites = true, apply_filter = true) { + if (clear) { + document.getElementById("all-websites-sections").textContent = ""; + } + if (!isEmpty(websites_json) && load_all_websites || !isEmpty(websites_json_by_domain) && !load_all_websites) { + //there are websites saved - let currentWebsiteElement = document.createElement("h2"); - currentWebsiteElement.textContent = "https://" + current_website; - currentWebsiteElement.classList.add("link", "go-to-external"); - currentWebsiteElement.onclick = function () { - browser.tabs.create({url: "https://" + current_website}); - } - currentWebsiteElement.title = currentWebsiteElement.textContent; - - let buttonDelete = document.createElement("input"); - buttonDelete.type = "button"; - buttonDelete.alt = "Delete"; - buttonDelete.classList.add("button", "button-delete", "very-small-button", "float-left", "margin-left-minus-20-px", "margin-top-5-px", "text-align-center"); - buttonDelete.id = "button-delete-single"; - buttonDelete.onclick = function () { - deleteAWebsite(current_website); + if (load_all_websites) { + websites_json_by_domain = []; + for (let url in websites_json) { + websites_json_by_domain.push(url); } + } + websites_json_by_domain.sort(); + //console.log(JSON.stringify(websites_json_by_domain)); - let tableDataElement = document.createElement("td"); - tableDataElement.classList.add("padding-left-30-px"); - tableDataElement.append(buttonDelete, currentWebsiteElement); - tableRowElement.append(tableDataElement); + let websites_to_use = getWebsitesToUse(websites_json); - //status - let status_to_show = true; - if (websites_json[current_website]["enabled"] !== undefined) { - status_to_show = websites_json[current_website]["enabled"]; - } - let tableDataElementStatus = document.createElement("td"); - tableDataElementStatus.classList.add("status-website"); - let switchToggleSection = document.createElement("div"); - switchToggleSection.id = "switch-toggle-section"; - let toggleContainer = document.createElement("div"); - toggleContainer.id = "toggle-container"; - let toggleBackground = document.createElement("div"); - toggleBackground.id = "toggle-background"; - let toggleThumb = document.createElement("div"); - toggleThumb.id = "toggle-thumb"; - toggleContainer.append(toggleBackground); - toggleContainer.append(toggleThumb); - toggleContainer.onclick = function () { - switchToggleOnOff(toggleThumb, current_website, tableDataElementStatus); - } - switchToggleSection.append(toggleContainer); - if (status_to_show) { - //enabled - toggleThumb.style.left = "auto"; - toggleThumb.style.right = "0px"; - toggleThumb.style.backgroundImage = "url('../img/yes.png')"; - tableDataElementStatus.append(switchToggleSection); - tableDataElementStatus.classList.add("status-enabled"); - } else { - //disabled - toggleThumb.style.left = "0px"; - toggleThumb.style.right = "auto"; - toggleThumb.style.backgroundImage = "url('../img/no.png')"; - tableDataElementStatus.append(switchToggleSection); - tableDataElementStatus.classList.add("status-disabled"); - } - tableRowElement.append(tableDataElementStatus); + //console.log(websites_to_use) + websites_to_use = sortByColumn("website", websites_to_use, false, false); + showWebsitesTable(websites_to_use, apply_filter); - //category - let tableDataElementCategory = document.createElement("td"); - tableDataElementCategory.append(generateCategories(checkCategory(current_website), current_website, tableDataElementCategory)); - tableRowElement.append(tableDataElementCategory); + } else { + //no websites + let section = document.createElement("div"); + section.classList.add("section-empty"); + section.textContent = "No websites found"; + document.getElementById("all-websites-sections").append(section); + } +} - //since install - let number_of_days = all_dates.length; +function getLastSevenDays() { + smallest_date = getToday(); - let sum_since_install = 0; - for (let date in websites_json[current_website]) { - if (date !== "always" && date !== "enabled" && date !== "category") { - sum_since_install += websites_json[current_website][date]; + for (let index in websites_json_by_domain) { + for (let date in websites_json[websites_json_by_domain[index]]) { + if (date !== "enabled" && date !== "category") { + if (date < smallest_date) { + smallest_date = date; } } - let since_install = getTimeConverted(sum_since_install); + } + } + + all_dates = getAllDates(smallest_date, getToday()); + all_dates.reverse(); + + if (start_date === null) start_date = 0; + + let last_seven_days = []; + let counter = start_date; //from index 0 + while (counter < (days_to_show + start_date)) { + if (all_dates.length >= (counter + 1)) { + last_seven_days.push(all_dates[counter]); + } + counter++; + } + + return last_seven_days; +} + +function getTHeadTable(websites, last_seven_days) { + let tableTHeadElement = document.createElement("thead"); + tableTHeadElement.id = "thead-table-all-websites"; + let tableRowElement = document.createElement("tr"); + + let tableHeaderElement = document.createElement("th"); + tableHeaderElement.textContent = "Website"; + tableHeaderElement.id = "th-website"; + tableHeaderElement.classList.add("th-sort-by-column"); + if (sorted_by === "" || sorted_by === "website-asc") tableHeaderElement.classList.add("th-sort-by-column-sel", "sort-by-column-asc"); + tableHeaderElement.onclick = function () { + websites = sortByColumn("website", websites); + } + tableRowElement.append(tableHeaderElement); + + tableHeaderElement = document.createElement("th"); + tableHeaderElement.textContent = "Status"; + tableHeaderElement.id = "th-status"; + tableHeaderElement.classList.add("th-sort-by-column"); + tableHeaderElement.onclick = function () { + websites = sortByColumn("status", websites); + } + tableRowElement.append(tableHeaderElement); + + tableHeaderElement = document.createElement("th"); + tableHeaderElement.textContent = "Category"; + tableHeaderElement.id = "th-category"; + tableHeaderElement.classList.add("th-sort-by-column"); + tableHeaderElement.onclick = function () { + websites = sortByColumn("category", websites); + } + tableRowElement.append(tableHeaderElement); + + tableHeaderElement = document.createElement("th"); + tableHeaderElement.textContent = "Since install"; + tableHeaderElement.id = "th-since-install"; + tableHeaderElement.classList.add("th-sort-by-column"); + tableHeaderElement.onclick = function () { + websites = sortByColumn("since-install", websites); + } + tableRowElement.append(tableHeaderElement); + for (let date in last_seven_days) { + + let date_to_show = last_seven_days[date]; + tableHeaderElement = document.createElement("th"); + tableHeaderElement.textContent = date_to_show; + tableHeaderElement.id = "th-date-" + date; + tableHeaderElement.classList.add("th-sort-by-column"); + tableHeaderElement.onclick = function () { + websites = sortByColumn("date-" + date, websites); + } + tableRowElement.append(tableHeaderElement); + } + setDateInterval(last_seven_days[0], last_seven_days[last_seven_days.length - 1]); + + tableTHeadElement.append(tableRowElement); + return tableTHeadElement; +} + +function getTBodyTable(websites, last_seven_days) { + let tableTBodyElement = document.createElement("tbody"); + tableTBodyElement.id = "tbody-table-all-websites"; + for (let website in websites) { + let tableRowElement = document.createElement("tr"); + + //console.log(websites[website]); + + let currentWebsiteElement = document.createElement("h2"); + currentWebsiteElement.textContent = "https://" + websites[website]["website"]; + currentWebsiteElement.classList.add("link", "go-to-external"); + currentWebsiteElement.onclick = function () { + browser.tabs.create({url: "https://" + websites[website]["website"]}); + } + currentWebsiteElement.title = currentWebsiteElement.textContent; + + let buttonDelete = document.createElement("input"); + buttonDelete.type = "button"; + buttonDelete.alt = "Delete"; + buttonDelete.classList.add("button", "button-delete", "very-small-button", "float-left", "margin-left-minus-20-px", "margin-top-5-px", "text-align-center"); + buttonDelete.id = "button-delete-single"; + buttonDelete.onclick = function () { + deleteAWebsite(websites[website]["website"]); + } + + + let tableDataElement = document.createElement("td"); + tableDataElement.classList.add("padding-left-30-px"); + tableDataElement.append(buttonDelete, currentWebsiteElement); + tableRowElement.append(tableDataElement); + + //status + let status_to_show = websites[website]["status"]; + let tableDataElementStatus = document.createElement("td"); + tableDataElementStatus.classList.add("status-website"); + let switchToggleSection = document.createElement("div"); + switchToggleSection.id = "switch-toggle-section"; + let toggleContainer = document.createElement("div"); + toggleContainer.id = "toggle-container"; + let toggleBackground = document.createElement("div"); + toggleBackground.id = "toggle-background"; + let toggleThumb = document.createElement("div"); + toggleThumb.id = "toggle-thumb"; + toggleContainer.append(toggleBackground); + toggleContainer.append(toggleThumb); + toggleContainer.onclick = function () { + switchToggleOnOff(toggleThumb, websites[website]["website"], tableDataElementStatus); + } + switchToggleSection.append(toggleContainer); + if (status_to_show) { + //enabled + toggleThumb.style.left = "auto"; + toggleThumb.style.right = "0px"; + toggleThumb.style.backgroundImage = "url('../img/yes.png')"; + tableDataElementStatus.append(switchToggleSection); + tableDataElementStatus.classList.add("status-enabled"); + } else { + //disabled + toggleThumb.style.left = "0px"; + toggleThumb.style.right = "auto"; + toggleThumb.style.backgroundImage = "url('../img/no.png')"; + tableDataElementStatus.append(switchToggleSection); + tableDataElementStatus.classList.add("status-disabled"); + } + tableRowElement.append(tableDataElementStatus); + + //category + let tableDataElementCategory = document.createElement("td"); + tableDataElementCategory.append(generateCategories(checkCategory(websites[website]["website"]), websites[website]["website"], tableDataElementCategory)); + tableRowElement.append(tableDataElementCategory); + + + //since install + let number_of_days = all_dates.length; + + let sum_since_install = websites[website]["since-install"] + let since_install = getTimeConverted(sum_since_install); + tableDataElement = document.createElement("td"); + tableDataElement.textContent = since_install; + tableDataElement.classList.add("since-install-time"); + if (sum_since_install >= (60 * 30) * number_of_days && sum_since_install < (60 * 60) * number_of_days) { + tableDataElement.classList.add("yellow"); + } else if (sum_since_install >= (60 * 60) * number_of_days && sum_since_install < (60 * 60 * 3) * number_of_days) { + tableDataElement.classList.add("orange"); + } else if (sum_since_install >= (60 * 60 * 3) * number_of_days) { + tableDataElement.classList.add("red"); + } + tableRowElement.append(tableDataElement); + + + //days + for (let date in last_seven_days) { + let date_to_show = last_seven_days[date]; + let time_to_show = getTimeConverted(websites[website]["date-" + date]); + let time = websites[website]["date-" + date]; + if (time_to_show === "") time_to_show = getTimeConverted(0); tableDataElement = document.createElement("td"); - tableDataElement.textContent = since_install; - tableDataElement.classList.add("since-install-time"); - if (sum_since_install >= (60 * 30) * number_of_days && sum_since_install < (60 * 60) * number_of_days) { + tableDataElement.textContent = time_to_show; + if (time >= 60 * 30 && time < 60 * 60) { tableDataElement.classList.add("yellow"); - } else if (sum_since_install >= (60 * 60) * number_of_days && sum_since_install < (60 * 60 * 3) * number_of_days) { + } else if (time >= 60 * 60 && time < 60 * 60 * 3) { tableDataElement.classList.add("orange"); - } else if (sum_since_install >= (60 * 60 * 3) * number_of_days) { + } else if (time >= 60 * 60 * 3) { tableDataElement.classList.add("red"); } tableRowElement.append(tableDataElement); + } + tableTBodyElement.append(tableRowElement); + } + return tableTBodyElement; +} - //days - for (let date in last_seven_days) { - let date_to_show = last_seven_days[date]; - let time_to_show = getTimeConverted(0); - let time = 0; - if (websites_json[current_website][date_to_show] !== undefined) { - time = websites_json[current_website][date_to_show]; - time_to_show = getTimeConverted(time); - } - if (time_to_show === "") time_to_show = getTimeConverted(0); - tableDataElement = document.createElement("td"); - tableDataElement.textContent = time_to_show; - if (time >= 60 * 30 && time < 60 * 60) { - tableDataElement.classList.add("yellow"); - } else if (time >= 60 * 60 && time < 60 * 60 * 3) { - tableDataElement.classList.add("orange"); - } else if (time >= 60 * 60 * 3) { - tableDataElement.classList.add("red"); - } - tableRowElement.append(tableDataElement); - } +function showWebsitesTable(websites, apply_filter = true) { + let section = document.createElement("div"); + section.classList.add("section", "overflow-auto", "no-padding"); + section.id = "table-section"; - tableTBodyElement.append(tableRowElement); - } - tableElement.append(tableTBodyElement); + let tableElement = document.createElement("table"); + tableElement.id = "table-all-websites"; + tableElement.classList.add("table-days"); - section.append(tableElement); - document.getElementById("all-websites-sections").append(section); + let tableTHeadElement = getTHeadTable(websites, getLastSevenDays()); + tableElement.append(tableTHeadElement); - } else { - //no websites - let section = document.createElement("div"); - section.classList.add("section-empty"); - section.textContent = "No websites found"; + let tableTBodyElement = getTBodyTable(websites, getLastSevenDays()); + tableElement.append(tableTBodyElement); - document.getElementById("all-websites-sections").append(section); + section.append(tableElement); + document.getElementById("all-websites-sections").append(section); + if (apply_filter) { + applyFilter(); + } +} + +function applyFilter() { + if (document.getElementById("search-all-websites-text").value.replaceAll(" ", "") !== "") { + search(document.getElementById("search-all-websites-text").value); } } @@ -464,24 +663,6 @@ function checkCategory(current_website) { return valueToReturn; } -let categories = { - "social": ["facebook.com", "twitter.com", "instagram.com", "chat.openai.com"], - "travel": ["booking.com", "expedia.com", "airbnb.com", "hotels.com", "trivago.it"], - "news": ["bbc.com", "bbc.co.uk", "cnn.com", "rainews.it", "corriere.it", "repubblica.it", "msn.com", "news.yahoo.com", "aol.com", "ladige.it", "ildolomiti.it"], - "education": ["classroom.google.com", "edu.google.com"], - "shopping": ["amazon.com", "amazon.it", "amazon.fr", "amazon.de", "ebay.com", "eprice.it", "lafeltrinelli.it", "ibs.it", "mediaworld.it", "euronics.it", "trony.it", "unieuro.it", "justeat.it", "glovoapp.com", "deliveroo.co.uk", "deliveroo.it", "deliveroo.com", "tesco.com", "asda.com", "sainsburys.co.uk", "ah.nl"], - "search": ["google.com", "google.it", "google.co.uk", "google.fr", "google.de", "bing.com", "duckduckgo.com", "qwant.com", "baidu.com", "yandex.com", "search.yahoo.com"], - "reference": ["wikipedia.org", "wordreference.com", "dictionary.cambridge.org", "treccani.it", "oxfordlearnersdictionaries.com", "emojipedia.org", "affinity.help"], - "entertainment": ["youtube.com", "netflix.com", "primevideo.com", "spotify.com", "deezer.com", "disneyplus.com", "imdb.com", "hulu.com"], - "adults": ["youporn.com", "pornhub.com", "xnxx.com", "xvideos.com", "xhamster.com"], - "sav22999": ["saveriomorelli.com", "emojiaddon.com", "savpdfviewer.com"], - "develop": ["github.com", "gitlab.com", "addons.mozilla.org", "thunderbird.net", "addons.thunderbird.net", "stackoverflow.com", "w3.org", "w3schools.com", "developer.mozilla.org", "w3docs.com"], - "messaging": ["whatsapp.com", "web.whatsapp.com", "telegram.org", "web.telegram.org", "t.me"], - "games": [], - "health": ["apss.tn.it"], - "other": [] //must remain empty here -}; - function getCategory(website) { let valueToReturn = "other"; for (item in categories) { diff --git a/js/background.js b/js/background.js index b92d054..4a5cd43 100644 --- a/js/background.js +++ b/js/background.js @@ -18,6 +18,25 @@ var minimized = false; var activeTabId; +const categories = { + "social": ["facebook.com", "twitter.com", "instagram.com", "chat.openai.com", "linkedin.com", "tiktok.com", "pinterest.com", "reddit.com"], + "travel": ["booking.com", "expedia.com", "airbnb.com", "hotels.com", "trivago.it", "trip.com", "hostelworld.com", "lastminute.com", "skyscanner.com", "thetrainline.com", "omio.it", "uber.com", "agoda.com", "edreams.it", "blablacar.com", "blablacar.it"], + "news": ["bbc.com", "bbc.co.uk", "cnn.com", "rainews.it", "corriere.it", "repubblica.it", "msn.com", "news.yahoo.com", "aol.com", "ladige.it", "ildolomiti.it"], + "education": ["classroom.google.com", "edu.google.com"], + "shopping": ["amazon.com", "amazon.it", "amazon.fr", "amazon.de", "ebay.com", "eprice.it", "lafeltrinelli.it", "ibs.it", "mediaworld.it", "euronics.it", "trony.it", "unieuro.it", "justeat.it", "glovoapp.com", "deliveroo.co.uk", "deliveroo.it", "deliveroo.com", "tesco.com", "asda.com", "sainsburys.co.uk", "ah.nl"], + "search": ["google.com", "google.it", "google.co.uk", "google.fr", "google.de", "bing.com", "duckduckgo.com", "qwant.com", "baidu.com", "yandex.com", "search.yahoo.com"], + "reference": ["wikipedia.org", "wordreference.com", "dictionary.cambridge.org", "treccani.it", "oxfordlearnersdictionaries.com", "emojipedia.org", "affinity.help"], + "entertainment": ["youtube.com", "netflix.com", "primevideo.com", "spotify.com", "deezer.com", "disneyplus.com", "imdb.com", "hulu.com"], + "adults": ["youporn.com", "pornhub.com", "xnxx.com", "xvideos.com", "xhamster.com", "badoo.com", "grindr.com", "tinder.com", "lovoo.com"], + "sav22999": ["saveriomorelli.com", "emojiaddon.com", "savpdfviewer.com"], + "develop": ["github.com", "gitlab.com", "addons.mozilla.org", "thunderbird.net", "addons.thunderbird.net", "stackoverflow.com", "w3.org", "w3schools.com", "developer.mozilla.org", "w3docs.com"], + "messaging": ["whatsapp.com", "web.whatsapp.com", "telegram.org", "web.telegram.org", "t.me", "signal.com", "kakaocorp.com", "snapchat.com", "wechat.com", "line.me"], + "games": ["store.steampowered.com", "ea.com", "ubisoft.com", "instant-gaming.com"], + "cloud": ["drive.google.com", "onedrive.live.com", "mega.io", "mega.nz", "pcloud.com", "my.pcloud.com", "icedrive.net", "dropbox.com", "box.com", "sync.com", "nordlocker.com"], + "health": ["apss.tn.it", "asmbasilicata.it", "aspbasilicata.it", "salute.gov.it", ""], + "other": [] //must remain empty here +}; + const linkReview = ["https://addons.mozilla.org/firefox/addon/limite/"]; //{firefox add-ons} const linkDonate = ["https://www.paypal.me/saveriomorelli", "https://ko-fi.com/saveriomorelli", "https://liberapay.com/Sav22999/donate"]; //{paypal, ko-fi} const icons = ["icon.png", "icon_disabled.png", "icon_yellow.png", "icon_orange.png", "icon_red.png"]; @@ -27,6 +46,11 @@ function loaded() { browser.tabs.onActivated.addListener(tabUpdated); browser.tabs.onUpdated.addListener(tabUpdated); browser.windows.onFocusChanged.addListener(checkLostFocus); + + //send categories to "all-websites" + browser.runtime.onMessage.addListener((message, sender, sendResponse) => { + if (message !== undefined && message["from"] === "all-websites" && message["ask"] === "categories") sendResponse({"categories": categories}); + }); } function checkLostFocus(windowId) { @@ -361,41 +385,11 @@ function setBadgeText(text, background_color = "#0080FF", text_color = "#FFFFFF" browser.browserAction.setBadgeBackgroundColor({color: background_color}); } -let categories = { - "social": ["facebook.com", "twitter.com", "instagram.com", "chat.openai.com"], - "travel": ["booking.com", "expedia.com", "airbnb.com", "hotels.com", "trivago.it"], - "news": ["bbc.com", "bbc.co.uk", "cnn.com", "rainews.it", "corriere.it", "repubblica.it", "msn.com", "news.yahoo.com", "aol.com", "ladige.it", "ildolomiti.it"], - "education": ["classroom.google.com", "edu.google.com"], - "shopping": ["amazon.com", "amazon.it", "amazon.fr", "amazon.de", "ebay.com", "eprice.it", "lafeltrinelli.it", "ibs.it", "mediaworld.it", "euronics.it", "trony.it", "unieuro.it", "justeat.it", "glovoapp.com", "deliveroo.co.uk", "deliveroo.it", "deliveroo.com", "tesco.com", "asda.com", "sainsburys.co.uk", "ah.nl"], - "search": ["google.com", "google.it", "google.co.uk", "google.fr", "google.de", "bing.com", "duckduckgo.com", "qwant.com", "baidu.com", "yandex.com", "search.yahoo.com"], - "reference": ["wikipedia.org", "wordreference.com", "dictionary.cambridge.org", "treccani.it", "oxfordlearnersdictionaries.com", "emojipedia.org", "affinity.help"], - "entertainment": ["youtube.com", "netflix.com", "primevideo.com", "spotify.com", "deezer.com", "disneyplus.com", "imdb.com", "hulu.com"], - "adults": ["youporn.com", "pornhub.com", "xnxx.com", "xvideos.com", "xhamster.com"], - "sav22999": ["saveriomorelli.com", "emojiaddon.com", "savpdfviewer.com"], - "develop": ["github.com", "gitlab.com", "addons.mozilla.org", "thunderbird.net", "addons.thunderbird.net", "stackoverflow.com", "w3.org", "w3schools.com", "developer.mozilla.org", "w3docs.com"], - "messaging": ["whatsapp.com", "web.whatsapp.com", "telegram.org", "web.telegram.org", "t.me"], - "games": [], - "health": ["apss.tn.it"], - "other": [] //must remain empty here -}; - function getCategory(website) { - let valueToReturn = ""; - if (website in categories["social"]) valueToReturn = "social"; - else if (categories["travel"].includes(website)) valueToReturn = "travel"; - else if (categories["news"].includes(website)) valueToReturn = "news"; - else if (categories["education"].includes(website)) valueToReturn = "education"; - else if (categories["shopping"].includes(website)) valueToReturn = "shopping"; - else if (categories["search"].includes(website)) valueToReturn = "search"; - else if (categories["reference"].includes(website)) valueToReturn = "reference"; - else if (categories["entertainment"].includes(website)) valueToReturn = "entertainment"; - else if (categories["adults"].includes(website)) valueToReturn = "adults"; - else if (categories["sav22999"].includes(website)) valueToReturn = "sav22999"; - else if (categories["develop"].includes(website)) valueToReturn = "develop"; - else if (categories["messaging"].includes(website)) valueToReturn = "messaging"; - else if (categories["games"].includes(website)) valueToReturn = "games"; - else if (categories["health"].includes(website)) valueToReturn = "health"; - else valueToReturn = "other"; + let valueToReturn = "other"; + for (item in categories) { + if (categories[item].includes(website)) valueToReturn = item; + } //console.log(website + " : " + valueToReturn);//TODO: use for testing websites filter return valueToReturn; } diff --git a/manifest.json b/manifest.json index 616d991..d107382 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 2, "name": "Limite", - "version": "2.0.1", + "version": "2.1", "author": "Saverio Morelli (Sav22999)", "description": "Check how much time you spend on each website every day.\nOptimise your productivity, your time and your life as well.\nDon't lose precious time!", "icons": { diff --git a/screenshots/2.0/2 2.png b/screenshots/2.0/2 2.png new file mode 100644 index 0000000..668b00d Binary files /dev/null and b/screenshots/2.0/2 2.png differ diff --git a/screenshots/2.0/3 2.xcf b/screenshots/2.0/3 2.xcf new file mode 100644 index 0000000..cf3cb91 Binary files /dev/null and b/screenshots/2.0/3 2.xcf differ diff --git a/screenshots/2.1/1.png b/screenshots/2.1/1.png new file mode 100644 index 0000000..52b64b9 Binary files /dev/null and b/screenshots/2.1/1.png differ diff --git a/screenshots/2.1/1.xcf b/screenshots/2.1/1.xcf new file mode 100644 index 0000000..d9e6590 Binary files /dev/null and b/screenshots/2.1/1.xcf differ diff --git a/screenshots/2.1/2.png b/screenshots/2.1/2.png new file mode 100644 index 0000000..92156e3 Binary files /dev/null and b/screenshots/2.1/2.png differ diff --git a/screenshots/2.1/2.xcf b/screenshots/2.1/2.xcf new file mode 100644 index 0000000..a4ad71c Binary files /dev/null and b/screenshots/2.1/2.xcf differ diff --git a/screenshots/2.1/3.png b/screenshots/2.1/3.png new file mode 100644 index 0000000..f271136 Binary files /dev/null and b/screenshots/2.1/3.png differ diff --git a/screenshots/2.1/3.xcf b/screenshots/2.1/3.xcf new file mode 100644 index 0000000..cf3cb91 Binary files /dev/null and b/screenshots/2.1/3.xcf differ