16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
-
+
+
+
+
-
-
+
+
+
-
+
|
}else{/* single query result */
tbl = tbl[0];
}
}
const F = window.fossil, D = F.dom;
const tdLn = tbl.querySelector('td.line-numbers');
const lineState = {
urlArgs: (window.location.search||'?').replace(/&?\bln=[^&]*/,''),
urlArgs: (window.location.search||'?')
.replace(/&?\budc=[^&]*/,'') /* "update display prefs cookie" */
.replace(/&?\bln=[^&]*/,'') /* inbound line number/range */
.replace('?&','?'),
start: 0, end: 0
};
const lineTip = new fossil.PopupWidget({
style: {
cursor: 'pointer'
},
refresh: function(){
const link = this.state.link;
D.clearElement(link);
if(lineState.start){
const ls = [lineState.start];
if(lineState.end) ls.push(lineState.end);
link.dataset.url = (
window.location.toString().split('?')[0]
+ lineState.urlArgs + '&ln='+ls.join('-')
);
D.append(
D.clearElement(link),
' ',
(ls.length===1 ? 'line ' : 'lines ')+ls.join('-')
' Copy link to '+(
ls.length===1 ? 'line ' : 'lines '
)+ls.join('-')
);
}else{
D.append(link, "No lines selected.");
}
},
init: function(){
const e = this.e;
const btnCopy = D.span(),
link = D.span();
this.state = {link};
F.copyButton(btnCopy,{
copyFromElement: link,
extractText: ()=>link.dataset.url,
oncopy: (ev)=>{
D.flashOnce(ev.target, undefined, ()=>lineTip.hide());
F.toast.message("Copied link to clipboard.");
// arguably too snazzy: F.toast.message("Copied link to clipboard.");
}
});
this.e.addEventListener('click', ()=>btnCopy.click(), false);
D.append(this.e, btnCopy, link)
}
});
|