Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: new-options.js

Issue 29411555: Issue 5169 - Add whitelisted tab to the new options page (Closed)
Patch Set: Addressed comments Created May 31, 2017, 8:27 a.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: new-options.js
===================================================================
--- a/new-options.js
+++ b/new-options.js
@@ -37,6 +37,7 @@
["synchronize_checksum_mismatch",
"options_filterList_lastDownload_checksumMismatch"]
]);
+ const timestampUI = Symbol();
function Collection(details)
{
@@ -44,18 +45,25 @@
this.items = [];
}
- Collection.prototype._setEmpty = function(table, text)
+ Collection.prototype._setEmpty = function(table, texts)
{
- let placeholder = table.querySelector(".empty-placeholder");
- if (text && !placeholder)
+ let placeholders = table.querySelectorAll(".empty-placeholder");
+
+ if (texts && placeholders.length == 0)
{
- placeholder = document.createElement("li");
- placeholder.className = "empty-placeholder";
- placeholder.textContent = getMessage(text);
- table.appendChild(placeholder);
+ for (let text of texts)
+ {
+ let placeholder = document.createElement("li");
+ placeholder.className = "empty-placeholder";
+ placeholder.textContent = getMessage(text);
+ table.appendChild(placeholder);
+ }
}
- else if (placeholder)
- table.removeChild(placeholder);
+ else if (placeholders.length > 0)
+ {
+ for (let placeholder of placeholders)
+ table.removeChild(placeholder);
+ }
};
Collection.prototype._createElementQuery = function(item)
@@ -76,12 +84,8 @@
return item.title || item.url || item.text;
};
- Collection.prototype.addItem = function(item)
+ Collection.prototype._sortItems = function()
{
- if (this.items.indexOf(item) >= 0)
- return;
-
- this.items.push(item);
this.items.sort((a, b) =>
{
// Make sure that Acceptable Ads is always last, since it cannot be
@@ -93,11 +97,26 @@
if (b.url == acceptableAdsUrl)
return -1;
+ // Make sure that duplicated whitelist entries are always being moved to
Thomas Greiner 2017/06/16 10:35:45 Detail: This is not about handling duplicated entr
saroyanm 2017/06/16 11:13:54 That's a very good question, I didn't know about t
saroyanm 2017/06/16 13:05:11 The mentioned behavior was confirmed, so I'll upda
saroyanm 2017/06/16 16:44:07 Done.
+ // the top of the list
+ let aTimestamp = a[timestampUI] || 0;
+ let bTimestamp = b[timestampUI] || 0;
+ if (aTimestamp || bTimestamp)
+ return bTimestamp - aTimestamp;
+
let aTitle = this._getItemTitle(a, 0).toLowerCase();
let bTitle = this._getItemTitle(b, 0).toLowerCase();
return aTitle.localeCompare(bTitle);
});
+ };
+ Collection.prototype.addItem = function(item)
+ {
+ if (this.items.indexOf(item) >= 0)
+ return;
+
+ this.items.push(item);
+ this._sortItems();
for (let j = 0; j < this.details.length; j++)
{
let table = E(this.details[j].id);
@@ -179,6 +198,8 @@
Collection.prototype.updateItem = function(item)
{
+ var oldIndex = this.items.indexOf(item);
+ this._sortItems();
let access = (item.url || item.text).replace(/'/g, "\\'");
for (let i = 0; i < this.details.length; i++)
{
@@ -197,7 +218,7 @@
{
control.setAttribute("aria-checked", item.disabled == false);
if (item.url == acceptableAdsUrl && this == collections.filterLists)
- control.setAttribute("disabled", true);
+ control.disabled = true;
}
let dateElement = element.querySelector(".date");
@@ -241,6 +262,9 @@
let sourceElement = element.querySelector(".context-menu .source");
if (sourceElement)
sourceElement.setAttribute("href", item.url);
+
+ if (oldIndex != this.items.indexOf(item))
Thomas Greiner 2017/06/16 10:35:46 Detail: `this.items.indexOf(item)` is duplicated s
saroyanm 2017/06/16 16:44:06 Done.
+ table.insertBefore(element, table.childNodes[this.items.indexOf(item)]);
}
};
@@ -285,17 +309,17 @@
collections.langs = new Collection([
{
id: "blocking-languages-table",
- emptyText: "options_dialog_language_added_empty"
+ emptyText: ["options_dialog_language_added_empty"]
},
{
id: "blocking-languages-dialog-table",
- emptyText: "options_dialog_language_added_empty"
+ emptyText: ["options_dialog_language_added_empty"]
}
]);
collections.allLangs = new Collection([
{
id: "all-lang-table",
- emptyText: "options_dialog_language_other_empty",
+ emptyText: ["options_dialog_language_other_empty"],
searchable: true
}
]);
@@ -312,13 +336,13 @@
collections.whitelist = new Collection([
{
id: "whitelisting-table",
- emptyText: "options_whitelisted_empty"
+ emptyText: ["options_whitelist_empty_1", "options_whitelist_empty_2"]
}
]);
collections.customFilters = new Collection([
{
id: "custom-filters-table",
- emptyText: "options_customFilters_empty"
+ emptyText: ["options_customFilters_empty"]
}
]);
collections.filterLists = new Collection([
@@ -495,22 +519,12 @@
case "cancel-custom-filters":
E("custom-filters").classList.remove("mode-edit");
break;
- case "cancel-domain-exception":
- E("whitelisting-textbox").value = "";
- document.querySelector("#whitelisting .controls").classList
- .remove("mode-edit");
- break;
case "close-dialog":
closeDialog();
break;
case "edit-custom-filters":
editCustomFilters();
break;
- case "edit-domain-exception":
- document.querySelector("#whitelisting .controls").classList
- .add("mode-edit");
- E("whitelisting-textbox").focus();
- break;
case "import-subscription": {
let url = E("blockingList-textbox").value;
addEnableSubscription(url);
@@ -750,10 +764,22 @@
let placeholderValue = getMessage("options_dialog_language_find");
E("find-language").setAttribute("placeholder", placeholderValue);
E("find-language").addEventListener("keyup", onFindLanguageKeyUp, false);
- E("whitelisting-textbox").addEventListener("keypress", (e) =>
+ let exampleValue = getMessages("options_whitelist_placeholder_example",
saroyanm 2017/06/14 11:51:22 Nit: This should be getMessage(...)
Thomas Greiner 2017/06/16 10:35:46 Indeed.
saroyanm 2017/06/16 16:43:07 Done.
+ ["www.example.com"]);
+ E("whitelisting-textbox").setAttribute("placeholder", exampleValue);
+ E("whitelisting-textbox").addEventListener("keyup", (e) =>
{
+ let addWhitelistButton = E("whitelisting-add-button");
+ addWhitelistButton.disabled = false;
if (getKey(e) == "Enter")
- addWhitelistedDomain();
+ {
+ if (!addWhitelistButton.disabled)
+ addWhitelistedDomain();
Thomas Greiner 2017/06/16 10:35:46 This will clear the input field so the whitelist b
saroyanm 2017/06/16 15:53:45 We do need: ` domain.value = ""; E("whitelisting-a
saroyanm 2017/06/16 16:43:07 Done.
+ }
+ else
+ {
+ addWhitelistButton.disabled = !e.target.value;
+ }
}, false);
// Advanced tab
@@ -962,6 +988,16 @@
function addWhitelistedDomain()
{
let domain = E("whitelisting-textbox");
+ for (let whitelistItem of collections.whitelist.items)
+ {
+ if (whitelistItem.title == domain.value)
+ {
+ whitelistItem[timestampUI] = Date.now();
+ collections.whitelist.updateItem(whitelistItem);
+ domain.value = "";
+ break;
+ }
+ }
if (domain.value)
{
sendMessageHandleErrors({
@@ -971,8 +1007,7 @@
}
domain.value = "";
- document.querySelector("#whitelisting .controls")
- .classList.remove("mode-edit");
+ E("whitelisting-add-button").disabled = true;
}
function editCustomFilters()
« locale/en-US/new-options.json ('K') | « new-options.html ('k') | skin/new-options.css » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld