47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
removed from the object immediately after it is called.
All callback options are called with the PopupWidget object as
their "this".
.cssClass: optional CSS class, or list of classes, to apply to
the new element.
.style: optional object of properties to copy directly into
the element's style object.
The options passed to this constructor get normalized into a
separate object which includes any default values for options not
provided by the caller. That object is available this the
|
|
>
>
>
|
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
removed from the object immediately after it is called.
All callback options are called with the PopupWidget object as
their "this".
.cssClass: optional CSS class, or list of classes, to apply to
the new element. In addition to any supplied here (or inherited
from the default), the class "fossil-PopupWidget" is always set
in order to allow certain app-internal CSS to account for popup
windows in special cases.
.style: optional object of properties to copy directly into
the element's style object.
The options passed to this constructor get normalized into a
separate object which includes any default values for options not
provided by the caller. That object is available this the
|
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
tip.show(50, 100);
// ^^^ viewport-relative coordinates. See show() for other options.
*/
F.PopupWidget = function f(opt){
opt = F.mergeLastWins(f.defaultOptions,opt);
this.options = opt;
const e = this.e = D.addClass(D.div(), opt.cssClass);
this.show(false);
if(opt.style){
let k;
for(k in opt.style){
if(opt.style.hasOwnProperty(k)) e.style[k] = opt.style[k];
}
}
|
|
>
|
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
tip.show(50, 100);
// ^^^ viewport-relative coordinates. See show() for other options.
*/
F.PopupWidget = function f(opt){
opt = F.mergeLastWins(f.defaultOptions,opt);
this.options = opt;
const e = this.e = D.addClass(D.div(), opt.cssClass,
"fossil-PopupWidget");
this.show(false);
if(opt.style){
let k;
for(k in opt.style){
if(opt.style.hasOwnProperty(k)) e.style[k] = opt.style[k];
}
}
|
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
|
during initialization and stashed away for use in a PopupWidget
when the botton is clicked.
*/
setup: function f(){
if(!f.hasOwnProperty('clickHandler')){
f.clickHandler = function fch(ev){
if(!fch.popup){
fch.popup = new F.PopupWidget({
cssClass: ['fossil-tooltip', 'help-buttonlet-content'],
refresh: function(){
}
});
fch.popup.e.style.maxWidth = '80%'/*of body*/;
fch.popup.installClickToHide();
}
D.append(D.clearElement(fch.popup.e), ev.target.$helpContent);
var popupRect = ev.target.getClientRects()[0];
var x = popupRect.left, y = popupRect.top;
if(x<0) x = 0;
if(y<0) y = 0;
/* Shift the help around a bit to "better" fit the
screen. However, fch.popup.e.getClientRects() is empty
until the popup is shown, so we have to show it,
calculate the resulting size, then move and/or resize it.
This algorithm/these heuristics can certainly be improved
upon.
*/
fch.popup.show(x, y);
x = popupRect.left, y = popupRect.top;
popupRect = fch.popup.e.getBoundingClientRect();
const rectBody = document.body.getClientRects()[0];
if(popupRect.right > rectBody.right){
x -= (popupRect.right - rectBody.right);
}
|
>
<
<
<
<
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
|
during initialization and stashed away for use in a PopupWidget
when the botton is clicked.
*/
setup: function f(){
if(!f.hasOwnProperty('clickHandler')){
f.clickHandler = function fch(ev){
ev.preventDefault();
if(!fch.popup){
fch.popup = new F.PopupWidget({
cssClass: ['fossil-tooltip', 'help-buttonlet-content'],
refresh: function(){
}
});
fch.popup.e.style.maxWidth = '80%'/*of body*/;
fch.popup.installClickToHide();
}
D.append(D.clearElement(fch.popup.e), ev.target.$helpContent);
/* Shift the help around a bit to "better" fit the
screen. However, fch.popup.e.getClientRects() is empty
until the popup is shown, so we have to show it,
calculate the resulting size, then move and/or resize it.
This algorithm/these heuristics can certainly be improved
upon.
*/
var popupRect, rectElem = ev.target;
while(rectElem){
popupRect = rectElem.getClientRects()[0]/*undefined if off-screen!*/;
if(popupRect) break;
rectElem = rectElem.parentNode;
}
if(!popupRect) popupRect = {x:0, y:0, left:0, right:0};
var x = popupRect.left, y = popupRect.top;
if(x<0) x = 0;
if(y<0) y = 0;
if(rectElem){
/* Try to ensure that the popup's z-level is higher than this element's */
const rz = window.getComputedStyle(rectElem).zIndex;
var myZ;
if(rz && !isNaN(+rz)){
myZ = +rz + 1;
}else{
myZ = 10000/*guess!*/;
}
fch.popup.e.style.zIndex = myZ;
}
fch.popup.show(x, y);
x = popupRect.left, y = popupRect.top;
popupRect = fch.popup.e.getBoundingClientRect();
const rectBody = document.body.getClientRects()[0];
if(popupRect.right > rectBody.right){
x -= (popupRect.right - rectBody.right);
}
|