Skip to content

Commit e44e96d

Browse files
Add LoadMore and LoadMoreBehavior
1 parent dc2b55e commit e44e96d

File tree

2 files changed

+133
-0
lines changed

2 files changed

+133
-0
lines changed
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
define(["../widget/LoadMore", "Icinga"],function (LoadMore, Icinga) {
2+
3+
"use strict";
4+
5+
class LoadMoreBehavior extends Icinga.EventListener {
6+
constructor(icinga) {
7+
super(icinga);
8+
9+
this.on('rendered', '#main > .container', this.onRendered, this);
10+
this.on('load', this.onLoad, this);
11+
12+
/**
13+
* Load More elements
14+
*
15+
* @type {WeakMap<object, LoadMore>}
16+
* @private
17+
*/
18+
this._loadMoreElements = new WeakMap();
19+
}
20+
21+
/**
22+
* @param event
23+
*/
24+
onRendered(event)
25+
{
26+
let _this = event.data.self;
27+
28+
event.currentTarget.querySelectorAll('.load-more').forEach(element => {
29+
_this._loadMoreElements.set(element, new LoadMore(element));
30+
});
31+
}
32+
33+
onLoad(event) {
34+
let _this = event.data.self;
35+
let anchor = event.target;
36+
let showMore = anchor.parentElement;
37+
var progressTimer = _this.icinga.timer.register(function () {
38+
var label = anchor.innerText;
39+
40+
var dots = label.substr(-3);
41+
if (dots.slice(0, 1) !== '.') {
42+
dots = '. ';
43+
} else {
44+
label = label.slice(0, -3);
45+
if (dots === '...') {
46+
dots = '. ';
47+
} else if (dots === '.. ') {
48+
dots = '...';
49+
} else if (dots === '. ') {
50+
dots = '.. ';
51+
}
52+
}
53+
54+
anchor.innerText = label + dots;
55+
}, null, 250);
56+
57+
let url = anchor.getAttribute('href');
58+
59+
let req = _this.icinga.loader.loadUrl(
60+
// Add showCompact, we don't want controls in paged results
61+
_this.icinga.utils.addUrlFlag(url, 'showCompact'),
62+
$(showMore.parentElement),
63+
undefined,
64+
undefined,
65+
'append',
66+
false,
67+
progressTimer
68+
);
69+
req.addToHistory = false;
70+
req.done(function () {
71+
showMore.remove();
72+
73+
// Set data-icinga-url to make it available for Icinga.History.getCurrentState()
74+
req.$target.closest('.container').data('icingaUrl', url);
75+
76+
_this.icinga.history.replaceCurrentState();
77+
});
78+
79+
return req;
80+
}
81+
}
82+
83+
return LoadMoreBehavior;
84+
});

asset/js/widget/LoadMore.js

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
define(["../notjQuery"], function ($) {
2+
3+
"use strict";
4+
5+
class LoadMore {
6+
/**
7+
* @param element The element that contains the load-more anchor
8+
*/
9+
constructor(element) {
10+
$(element).on('click', '.load-more[data-no-icinga-ajax] a', this.onLoadMoreClick, this);
11+
$(element).on('keypress', '.load-more[data-no-icinga-ajax] a', this.onKeyPress, this);
12+
}
13+
14+
/**
15+
* Keypress (space) on load-more button
16+
*
17+
* @param event
18+
*/
19+
onKeyPress(event) {
20+
if (event.key === ' ') {
21+
this.onLoadMoreClick(event);
22+
}
23+
}
24+
25+
/**
26+
* Click on load-more button
27+
*
28+
* @param event
29+
*/
30+
onLoadMoreClick(event) {
31+
event.stopPropagation();
32+
event.preventDefault();
33+
34+
this.loadMore(event.target);
35+
}
36+
37+
38+
/**
39+
* Load more items based on the given anchor
40+
*
41+
* @param anchor
42+
*/
43+
loadMore(anchor) {
44+
$(anchor).trigger('load');
45+
}
46+
}
47+
48+
return LoadMore;
49+
});

0 commit comments

Comments
 (0)