Mercurial > hg
annotate mercurial/templates/static/followlines.js @ 31848:7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
In followlines.js, we create a <div id="followlines-tooltip"> element to draw
attention of users on "followlines" feature. The element shows up on hover of
source lines after one second and follows the cursor. After first click (start
line selection), the text changes and indicates that next click will terminate
selection.
author | Denis Laxalde <denis.laxalde@logilab.fr> |
---|---|
date | Thu, 06 Apr 2017 19:15:09 +0200 |
parents | d15c9feb4399 |
children | 5c1abb4bd3ee |
rev | line source |
---|---|
31785
d15c9feb4399
hgweb: rename linerangelog.js as followlines.js
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31784
diff
changeset
|
1 // followlines.js - JavaScript utilities for followlines UI |
31758
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
2 // |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
3 // Copyright 2017 Logilab SA <contact@logilab.fr> |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
4 // |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
5 // This software may be used and distributed according to the terms of the |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
6 // GNU General Public License version 2 or any later version. |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
7 |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
8 //** Install event listeners for line block selection and followlines action */ |
31783
70377de005a0
hgweb: use a function expression for the install listener of followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31758
diff
changeset
|
9 document.addEventListener('DOMContentLoaded', function() { |
31758
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
10 var sourcelines = document.getElementsByClassName('sourcelines')[0]; |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
11 if (typeof sourcelines === 'undefined') { |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
12 return; |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
13 } |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
14 // URL to complement with "linerange" query parameter |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
15 var targetUri = sourcelines.dataset.logurl; |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
16 if (typeof targetUri === 'undefined') { |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
17 return; |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
18 } |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
19 |
31848
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
20 // tooltip to invite on lines selection |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
21 var tooltip = document.createElement('div'); |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
22 tooltip.id = 'followlines-tooltip'; |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
23 tooltip.classList.add('hidden'); |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
24 var initTooltipText = 'click to start following lines history from here'; |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
25 tooltip.textContent = initTooltipText; |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
26 sourcelines.appendChild(tooltip); |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
27 |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
28 var tooltipTimeoutID; |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
29 //* move the "tooltip" with cursor (top-right) and show it after 1s */ |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
30 function moveAndShowTooltip(e) { |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
31 if (typeof tooltipTimeoutID !== 'undefined') { |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
32 // avoid accumulation of timeout callbacks (blinking) |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
33 window.clearTimeout(tooltipTimeoutID); |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
34 } |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
35 tooltip.classList.add('hidden'); |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
36 var x = (e.clientX + 10) + 'px', |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
37 y = (e.clientY - 20) + 'px'; |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
38 tooltip.style.top = y; |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
39 tooltip.style.left = x; |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
40 tooltipTimeoutID = window.setTimeout(function() { |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
41 tooltip.classList.remove('hidden'); |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
42 }, 1000); |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
43 } |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
44 |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
45 // on mousemove, show tooltip close to cursor position |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
46 sourcelines.addEventListener('mousemove', moveAndShowTooltip); |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
47 |
31758
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
48 // retrieve all direct <span> children of <pre class="sourcelines"> |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
49 var spans = Array.prototype.filter.call( |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
50 sourcelines.children, |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
51 function(x) { return x.tagName === 'SPAN' }); |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
52 |
31784
02eb52e9d413
hgweb: rely on a specific class to change cursor type in followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31783
diff
changeset
|
53 // add a "followlines-select" class to change cursor type in CSS |
02eb52e9d413
hgweb: rely on a specific class to change cursor type in followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31783
diff
changeset
|
54 for (var i = 0; i < spans.length; i++) { |
02eb52e9d413
hgweb: rely on a specific class to change cursor type in followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31783
diff
changeset
|
55 spans[i].classList.add('followlines-select'); |
02eb52e9d413
hgweb: rely on a specific class to change cursor type in followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31783
diff
changeset
|
56 } |
02eb52e9d413
hgweb: rely on a specific class to change cursor type in followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31783
diff
changeset
|
57 |
31758
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
58 var lineSelectedCSSClass = 'followlines-selected'; |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
59 |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
60 //** add CSS class on <span> element in `from`-`to` line range */ |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
61 function addSelectedCSSClass(from, to) { |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
62 for (var i = from; i <= to; i++) { |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
63 spans[i].classList.add(lineSelectedCSSClass); |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
64 } |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
65 } |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
66 |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
67 //** remove CSS class from previously selected lines */ |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
68 function removeSelectedCSSClass() { |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
69 var elements = sourcelines.getElementsByClassName( |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
70 lineSelectedCSSClass); |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
71 while (elements.length) { |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
72 elements[0].classList.remove(lineSelectedCSSClass); |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
73 } |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
74 } |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
75 |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
76 // ** return the <span> element parent of `element` */ |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
77 function findParentSpan(element) { |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
78 var parent = element.parentElement; |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
79 if (parent === null) { |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
80 return null; |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
81 } |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
82 if (element.tagName == 'SPAN' && parent.isSameNode(sourcelines)) { |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
83 return element; |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
84 } |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
85 return findParentSpan(parent); |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
86 } |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
87 |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
88 //** event handler for "click" on the first line of a block */ |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
89 function lineSelectStart(e) { |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
90 var startElement = findParentSpan(e.target); |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
91 if (startElement === null) { |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
92 // not a <span> (maybe <a>): abort, keeping event listener |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
93 // registered for other click with <span> target |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
94 return; |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
95 } |
31848
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
96 |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
97 // update tooltip text |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
98 tooltip.textContent = 'click again to terminate line block selection here'; |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
99 |
31758
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
100 var startId = parseInt(startElement.id.slice(1)); |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
101 startElement.classList.add(lineSelectedCSSClass); // CSS |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
102 |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
103 // remove this event listener |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
104 sourcelines.removeEventListener('click', lineSelectStart); |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
105 |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
106 //** event handler for "click" on the last line of the block */ |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
107 function lineSelectEnd(e) { |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
108 var endElement = findParentSpan(e.target); |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
109 if (endElement === null) { |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
110 // not a <span> (maybe <a>): abort, keeping event listener |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
111 // registered for other click with <span> target |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
112 return; |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
113 } |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
114 |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
115 // remove this event listener |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
116 sourcelines.removeEventListener('click', lineSelectEnd); |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
117 |
31848
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
118 // hide tooltip and disable motion tracking |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
119 tooltip.classList.add('hidden'); |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
120 sourcelines.removeEventListener('mousemove', moveAndShowTooltip); |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
121 window.clearTimeout(tooltipTimeoutID); |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
122 |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
123 //* restore initial "tooltip" state */ |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
124 function restoreTooltip() { |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
125 tooltip.textContent = initTooltipText; |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
126 sourcelines.addEventListener('mousemove', moveAndShowTooltip); |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
127 } |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
128 |
31758
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
129 // compute line range (startId, endId) |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
130 var endId = parseInt(endElement.id.slice(1)); |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
131 if (endId == startId) { |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
132 // clicked twice the same line, cancel and reset initial state |
31848
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
133 // (CSS, event listener for selection start, tooltip) |
31758
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
134 removeSelectedCSSClass(); |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
135 sourcelines.addEventListener('click', lineSelectStart); |
31848
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
136 restoreTooltip(); |
31758
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
137 return; |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
138 } |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
139 var inviteElement = endElement; |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
140 if (endId < startId) { |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
141 var tmp = endId; |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
142 endId = startId; |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
143 startId = tmp; |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
144 inviteElement = startElement; |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
145 } |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
146 |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
147 addSelectedCSSClass(startId - 1, endId -1); // CSS |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
148 |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
149 // append the <div id="followlines"> element to last line of the |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
150 // selection block |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
151 var divAndButton = followlinesBox(targetUri, startId, endId); |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
152 var div = divAndButton[0], |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
153 button = divAndButton[1]; |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
154 inviteElement.appendChild(div); |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
155 |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
156 //** event handler for cancelling selection */ |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
157 function cancel() { |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
158 // remove invite box |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
159 div.parentNode.removeChild(div); |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
160 // restore initial event listeners |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
161 sourcelines.addEventListener('click', lineSelectStart); |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
162 sourcelines.removeEventListener('click', cancel); |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
163 // remove styles on selected lines |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
164 removeSelectedCSSClass(); |
31848
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
165 // restore tooltip element |
7160bdd56b84
hgweb: add a floating tooltip to invite on followlines action
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31785
diff
changeset
|
166 restoreTooltip(); |
31758
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
167 } |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
168 |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
169 // bind cancel event to click on <button> |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
170 button.addEventListener('click', cancel); |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
171 // as well as on an click on any source line |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
172 sourcelines.addEventListener('click', cancel); |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
173 } |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
174 |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
175 sourcelines.addEventListener('click', lineSelectEnd); |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
176 |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
177 } |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
178 |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
179 sourcelines.addEventListener('click', lineSelectStart); |
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
180 |
31783
70377de005a0
hgweb: use a function expression for the install listener of followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31758
diff
changeset
|
181 //** return a <div id="followlines"> and inner cancel <button> elements */ |
70377de005a0
hgweb: use a function expression for the install listener of followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31758
diff
changeset
|
182 function followlinesBox(targetUri, fromline, toline) { |
70377de005a0
hgweb: use a function expression for the install listener of followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31758
diff
changeset
|
183 // <div id="followlines"> |
70377de005a0
hgweb: use a function expression for the install listener of followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31758
diff
changeset
|
184 var div = document.createElement('div'); |
70377de005a0
hgweb: use a function expression for the install listener of followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31758
diff
changeset
|
185 div.id = 'followlines'; |
31758
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
186 |
31783
70377de005a0
hgweb: use a function expression for the install listener of followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31758
diff
changeset
|
187 // <div class="followlines-cancel"> |
70377de005a0
hgweb: use a function expression for the install listener of followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31758
diff
changeset
|
188 var buttonDiv = document.createElement('div'); |
70377de005a0
hgweb: use a function expression for the install listener of followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31758
diff
changeset
|
189 buttonDiv.classList.add('followlines-cancel'); |
31758
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
190 |
31783
70377de005a0
hgweb: use a function expression for the install listener of followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31758
diff
changeset
|
191 // <button>x</button> |
70377de005a0
hgweb: use a function expression for the install listener of followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31758
diff
changeset
|
192 var button = document.createElement('button'); |
70377de005a0
hgweb: use a function expression for the install listener of followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31758
diff
changeset
|
193 button.textContent = 'x'; |
70377de005a0
hgweb: use a function expression for the install listener of followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31758
diff
changeset
|
194 buttonDiv.appendChild(button); |
70377de005a0
hgweb: use a function expression for the install listener of followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31758
diff
changeset
|
195 div.appendChild(buttonDiv); |
31758
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
196 |
31783
70377de005a0
hgweb: use a function expression for the install listener of followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31758
diff
changeset
|
197 // <div class="followlines-link"> |
70377de005a0
hgweb: use a function expression for the install listener of followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31758
diff
changeset
|
198 var aDiv = document.createElement('div'); |
70377de005a0
hgweb: use a function expression for the install listener of followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31758
diff
changeset
|
199 aDiv.classList.add('followlines-link'); |
31758
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
200 |
31783
70377de005a0
hgweb: use a function expression for the install listener of followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31758
diff
changeset
|
201 // <a href="/log/<rev>/<file>?patch=&linerange=..."> |
70377de005a0
hgweb: use a function expression for the install listener of followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31758
diff
changeset
|
202 var a = document.createElement('a'); |
70377de005a0
hgweb: use a function expression for the install listener of followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31758
diff
changeset
|
203 var url = targetUri + '?patch=&linerange=' + fromline + ':' + toline; |
70377de005a0
hgweb: use a function expression for the install listener of followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31758
diff
changeset
|
204 a.setAttribute('href', url); |
70377de005a0
hgweb: use a function expression for the install listener of followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31758
diff
changeset
|
205 a.textContent = 'follow lines ' + fromline + ':' + toline; |
70377de005a0
hgweb: use a function expression for the install listener of followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31758
diff
changeset
|
206 aDiv.appendChild(a); |
70377de005a0
hgweb: use a function expression for the install listener of followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31758
diff
changeset
|
207 div.appendChild(aDiv); |
31758
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
208 |
31783
70377de005a0
hgweb: use a function expression for the install listener of followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31758
diff
changeset
|
209 return [div, button]; |
70377de005a0
hgweb: use a function expression for the install listener of followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31758
diff
changeset
|
210 } |
31758
04ec317b8128
hgweb: expose a followlines UI in filerevision view
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff
changeset
|
211 |
31783
70377de005a0
hgweb: use a function expression for the install listener of followlines UI
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31758
diff
changeset
|
212 }, false); |