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

Unified Diff: new-options.js

Issue 29334038: Issue 2802/2358 - Dynamically generate tooltips in options page (Closed)
Patch Set: Rebased to 75534a4a1e0e and addressed comments Created May 31, 2016, 4:57 p.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
« no previous file with comments | « new-options.html ('k') | skin/new-options.css » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: new-options.js
===================================================================
--- a/new-options.js
+++ b/new-options.js
@@ -20,7 +20,6 @@
(function()
{
var subscriptionsMap = Object.create(null);
- var recommendationsMap = Object.create(null);
var filtersMap = Object.create(null);
var collections = Object.create(null);
var acceptableAdsUrl = null;
@@ -108,6 +107,12 @@
var labelId = "label-" + (++maxLabelId);
var label = listItem.querySelector(".display");
label.setAttribute("id", labelId);
+ if (item.recommended && label.hasAttribute("data-tooltip"))
+ {
+ var tooltipId = label.getAttribute("data-tooltip");
+ tooltipId = tooltipId.replace("%value%", item.recommended);
+ label.setAttribute("data-tooltip", tooltipId);
+ }
var control = listItem.querySelector(".control");
if (control)
@@ -388,9 +393,7 @@
function updateLanguageCollections(subscription)
{
- var recommendation = recommendationsMap[subscription.url];
-
- if (recommendation && recommendation.type == "ads")
+ if (subscription.recommended == "ads")
{
if (subscription.disabled)
{
@@ -408,10 +411,9 @@
function addSubscription(subscription)
{
var collection;
- if (subscription.url in recommendationsMap)
+ if (subscription.recommended)
{
- var recommendation = recommendationsMap[subscription.url];
- if (recommendation.type != "ads")
+ if (subscription.recommended != "ads")
collection = collections.popular;
else if (subscription.disabled == false)
collection = collections.langs;
@@ -425,6 +427,7 @@
collection.addItems(subscription);
subscriptionsMap[subscription.url] = subscription;
+ updateTooltips();
}
function updateSubscription(subscription)
@@ -432,7 +435,7 @@
var knownSubscription = subscriptionsMap[subscription.url];
for (var property in subscription)
{
- if (property == "title" && subscription.url in recommendationsMap)
+ if (property == "title" && subscription.recommended)
knownSubscription.originalTitle = subscription.title;
else
knownSubscription[property] = subscription[property];
@@ -473,14 +476,16 @@
for (var i = 0; i < elements.length; i++)
{
var element = elements[i];
- var subscription = Object.create(null);
- subscription.originalTitle = element.getAttribute("title");
- subscription.url = element.getAttribute("url");
- subscription.disabled = null;
- subscription.downloadStatus = null;
- subscription.homepage = null;
- var recommendation = Object.create(null);
- recommendation.type = element.getAttribute("type");
+ var type = element.getAttribute("type");
+ var subscription = {
+ disabled: null,
+ downloadStatus: null,
+ homepage: null,
+ originalTitle: element.getAttribute("title"),
+ recommended: type,
+ url: element.getAttribute("url")
+ };
+
var prefix = element.getAttribute("prefixes");
if (prefix)
{
@@ -489,11 +494,10 @@
}
else
{
- var type = recommendation.type.replace(/\W/g, "_");
+ type = type.replace(/\W/g, "_");
subscription.title = getMessage("common_feature_" + type + "_title");
}
- recommendationsMap[subscription.url] = recommendation;
addSubscription(subscription);
}
});
@@ -679,6 +683,7 @@
});
updateShareLink();
+ updateTooltips();
// Initialize interactive UI elements
document.body.addEventListener("click", onClick, false);
@@ -800,7 +805,6 @@
{
subscriptionsMap = Object.create(null);
filtersMap = Object.create(null);
- recommendationsMap = Object.create(null);
// Empty collections and lists
for (var property in collections)
@@ -950,8 +954,7 @@
case "removed":
var knownSubscription = subscriptionsMap[subscription.url];
- if (subscription.url == acceptableAdsUrl ||
- subscription.url in recommendationsMap)
+ if (subscription.url == acceptableAdsUrl || subscription.recommended)
{
subscription.disabled = true;
onSubscriptionMessage("disabled", subscription);
@@ -1067,6 +1070,84 @@
checkShareResource(shareResources[i], onResult);
}
+ function getMessages(id)
+ {
+ var messages = [];
+ for (var i = 1; true; i++)
+ {
+ var message = ext.i18n.getMessage(id + "_" + i);
+ if (!message)
+ break;
+
+ messages.push(message);
+ }
+ return messages;
+ }
+
+ function updateTooltips()
+ {
+ var anchors = document.querySelectorAll(":not(.tooltip) > [data-tooltip]");
+ for (var i = 0; i < anchors.length; i++)
+ {
+ var anchor = anchors[i];
+ var id = anchor.getAttribute("data-tooltip");
+
+ var wrapper = document.createElement("div");
+ wrapper.className = "tooltip";
+ anchor.parentNode.replaceChild(wrapper, anchor);
+ wrapper.appendChild(anchor);
+
+ var topTexts = getMessages(id);
+ var bottomTexts = getMessages(id + "_notes");
+
+ // We have to use native tooltips to avoid issues when attaching a tooltip
+ // to an element in a scrollable list or otherwise it might get cut off
+ if (anchor.hasAttribute("data-tooltip-native"))
+ {
+ var title = topTexts.concat(bottomTexts).join("\n\n");
+ anchor.setAttribute("title", title);
+ continue;
+ }
+
+ var tooltip = document.createElement("div");
+ tooltip.setAttribute("role", "tooltip");
+
+ var flip = anchor.getAttribute("data-tooltip-flip");
+ if (flip)
+ tooltip.className = "flip-" + flip;
+
+ var imageSource = anchor.getAttribute("data-tooltip-image");
+ if (imageSource)
+ {
+ var image = document.createElement("img");
+ image.src = imageSource;
+ image.alt = "";
+ tooltip.appendChild(image);
+ }
+
+ for (var j = 0; j < topTexts.length; j++)
+ {
+ var paragraph = document.createElement("p");
+ paragraph.innerHTML = topTexts[j];
+ tooltip.appendChild(paragraph);
+ }
+ if (bottomTexts.length > 0)
+ {
+ var notes = document.createElement("div");
+ notes.className = "notes";
+ for (var j = 0; j < bottomTexts.length; j++)
+ {
+ var paragraph = document.createElement("p");
+ paragraph.innerHTML = bottomTexts[j];
+ notes.appendChild(paragraph);
+ }
+ tooltip.appendChild(notes);
+ }
+
+ wrapper.appendChild(tooltip);
+ }
+ }
+
ext.onMessage.addListener(function(message)
{
switch (message.type)
« no previous file with comments | « new-options.html ('k') | skin/new-options.css » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld