consul-templaterb 1.18.5 → 1.19.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,387 +1,363 @@
1
- class ConsulService {
2
- constructor(resourceURL, refresh) {
3
- this.resourceURL = resourceURL;
4
- this.fetchRessource();
5
- this.serviceList = $("#service-list");
6
- this.serviceFilter = $("#service-filter");
7
- this.serviceFilter.keyup(debounce(this.filterService, 250));
8
- this.instanceFilter = $("#instance-filter");
9
- this.instanceFilter.keyup(debounce(this.filterInstances, 250));
10
- this.refresh = parseInt(refresh);
11
- this.filterStatus = null;
12
- this.serviceFilterCounter = $("#service-counter");
13
- this.serviceFilterCount = 0;
14
- this.showProxiesInList = false;
15
- this.selectedServiceName = new URL(location.href).searchParams.get('service');
16
- this.serviceFilterValue = new URL(location.href).searchParams.get('filter');
17
- var cs = this
18
- this.loadFavorites();
19
- window.setTimeout(function(){
20
- cs.showTags($('#showTagsInList:checked').length > 0);
21
- cs.showProxies($('#showProxiesInList:checked').length > 0);
22
- }, 100);
23
-
24
- }
25
-
26
- initFilterValue() {
27
- if (this.serviceFilterValue) {
28
- this.serviceFilter.val(this.serviceFilterValue);
29
- this.filterService()
30
- }
31
- }
32
-
33
- showTags(enableTags) {
34
- var stylesheet = document.getElementById('css-states');
35
- stylesheet.textContent = '.service-tags { display: ' + (enableTags? 'block':'none') + '!important ;}';
36
- }
37
-
38
- showProxies(showProxies) {
39
- if (showProxies != this.showProxiesInList) {
40
- this.showProxiesInList = showProxies;
41
- console.log("showProxies:= "+this.showProxiesInList+", reloading list")
42
- this.reloadServiceList();
43
- }
44
- }
45
-
46
- async fetchRessource() {
47
- const response = await fetch(this.resourceURL);
48
- const result = await response.json();
49
- await this.initRessource(result);
50
- }
51
-
52
- async initRessource(data) {
53
- this.data = data;
54
- await this.reloadServiceList();
55
- console.log('Data generated at: ' + data['generated_at']);
56
-
57
- var urlParam = this.selectedServiceName
58
- if (urlParam) {
59
- var nodes = document.getElementById('service-list').childNodes;
60
- for (const node of nodes) {
61
- if($(node).find(".service-name").html() == urlParam) {
62
- var selectedElement = $(node);
63
- this.selectService(selectedElement);
64
- selectedElement.focus();
65
- break;
66
- }
67
- }
68
- } else {
69
- var servicePrefix = '#service_';
70
- if (location.hash.startsWith(servicePrefix)) {
71
- urlParam = location.hash.substr(servicePrefix.length);
72
- }
73
- this.selectService(document.getElementById('service-list').firstElementChild);
1
+ class ConsulServiceManager extends ConsulUIManager {
2
+ constructor(resourceURL) {
3
+ super(resourceURL);
4
+ var flags = {};
5
+ this.mainSelector = new ServiceMainSelector(
6
+ $("#service-title"),
7
+ $("#instances-list"),
8
+ $("#instance-filter"),
9
+ $("#instance-counter"),
10
+ $("#max-display-selector"),
11
+ "node_filter",
12
+ "node_status_filter"
13
+ );
14
+ this.sideSelector = new ServiceSideSelector(
15
+ this.mainSelector,
16
+ flags,
17
+ $("#service-filter"),
18
+ $("#service-list"),
19
+ $("#service-counter"),
20
+ "filter",
21
+ "service"
22
+ );
23
+ var obj = this;
24
+ flags["showTags"] = new DisplayFlag(
25
+ $("#showTagsInList").get(0),
26
+ function () {
27
+ obj.sideSelector.prepareData();
28
+ obj.sideSelector.refreshList();
29
+ }
30
+ );
31
+ flags["showConnectProxies"] = new DisplayFlag(
32
+ $("#showProxiesInList").get(0),
33
+ function () {
34
+ obj.sideSelector.refreshList();
35
+ }
36
+ );
37
+ this.fetchResource();
74
38
  }
75
- if(this.refresh > 0) {
76
- setTimeout(this.fetchRessource, this.refresh * 1000);
39
+
40
+ async initResource(data) {
41
+ this.mainSelector.nodes = data["nodes"];
42
+ this.sideSelector.data = data["services"];
43
+ this.sideSelector.prepareData();
44
+ this.sideSelector.refreshList();
77
45
  }
78
- this.initFilterValue();
79
- }
80
-
81
- async reloadServiceList() {
82
- this.serviceList.html('');
83
- this.serviceFilterCount = 0;
84
-
85
- if (!this.data || !this.data.services) {
86
- console.log("No data to display");
87
- } else {
88
- const services = Object.values(this.data.services).map((service, index) => ({ service, index }));
89
- const favorites = services.filter(({ service }) => this.favorites[service.name]);
90
- const others = services.filter(({ service }) => !this.favorites[service.name]);
91
-
92
- const appendServiceAsync = ({ service, index }) =>
93
- new Promise(resolve =>
94
- setTimeout(() => {
95
- this.appendService(service, index);
96
- resolve();
97
- }, 0)
98
- );
46
+ }
99
47
 
100
- await Promise.all([...favorites, ...others].map(appendServiceAsync));
48
+ class ServiceSideSelector extends SideSelector {
49
+ constructor(
50
+ mainSelector,
51
+ flags,
52
+ filterElement,
53
+ listElement,
54
+ counterElement,
55
+ URLLabelFilter,
56
+ URLLabelSelected
57
+ ) {
58
+ super(
59
+ filterElement,
60
+ listElement,
61
+ counterElement,
62
+ URLLabelFilter,
63
+ URLLabelSelected,
64
+ true
65
+ );
66
+ this.mainSelector = mainSelector;
67
+ this.flags = flags;
101
68
  }
102
69
 
103
- this.serviceFilterCounter.html(this.serviceFilterCount);
104
- resizeWrapper('service-wrapper', 'service-list');
105
- }
70
+ matchElement(serviceName, service, filter) {
71
+ if (
72
+ service["kind"] != undefined &&
73
+ !this.flags["showConnectProxies"].state
74
+ ) {
75
+ return false;
76
+ }
106
77
 
107
- appendService(service, index) {
108
- var serviceName = service.name;
109
- var serviceStatus = buildServiceStatus(service);
78
+ if (service.name.match(filter)) {
79
+ return true;
80
+ }
110
81
 
111
- var listItem = document.createElement('li');
112
- listItem.setAttribute('onfocus','consulService.onClickServiceName(this)');
113
- listItem.setAttribute('onclick','consulService.onClickServiceName(this)');
114
- listItem.setAttribute('value', serviceName);
115
- listItem.setAttribute('data-fav', this.favorites[serviceName] ? 1 : 0);
116
- listItem.setAttribute('data-index', index);
117
- var listItemClass = 'serviceListItem list-group-item list-group-item-action';
82
+ for (var i in service.tags) {
83
+ if (service.tags[i].match(filter)) {
84
+ return true;
85
+ }
86
+ }
118
87
 
119
- var statuses = document.createElement('div');
120
- statuses.setAttribute('class','statuses float-right');
88
+ for (var status in service.status) {
89
+ if (status.match(filter)) {
90
+ return true;
91
+ }
92
+ }
121
93
 
122
- if (!!serviceStatus['passing']) {
123
- statuses.appendChild(createBadge('badge-success passing', serviceStatus['passing']));
124
- listItem.setAttribute('status', 'passing');
94
+ return false;
125
95
  }
126
96
 
127
- if (!!serviceStatus['warning']) {
128
- statuses.appendChild(createBadge('badge-warning warning', serviceStatus['warning']));
129
- listItem.setAttribute('status', 'warning');
130
- }
97
+ elementGenerator(serviceName, service) {
98
+ var element = document.createElement("li");
99
+ var CSSClass = "service-list-item list-group-item list-group-item-action";
131
100
 
132
- if (!!serviceStatus['critical']) {
133
- statuses.appendChild(createBadge('badge-danger critical', serviceStatus['critical']));
134
- listItem.setAttribute('status', 'critical');
135
- }
101
+ var obj = this;
102
+ element.addEventListener("focus", function () {
103
+ obj.onClickElement(this, serviceName);
104
+ });
105
+ element.addEventListener("click", function () {
106
+ obj.onClickElement(this, serviceName);
107
+ });
136
108
 
137
- statuses.appendChild(createBadge('badge-dark', (serviceStatus['total'] || 0)));
109
+ element.setAttribute("value", serviceName);
138
110
 
139
- statuses.append(this.buildFavButton(serviceName));
111
+ element.appendChild(this.generateStatuses(service));
140
112
 
141
- listItem.appendChild(statuses);
142
- if (!!service['kind']) {
143
- var kind = document.createElement('div');
144
- kind.setAttribute('class','kind float-right');
145
- kind.appendChild(createBadge('badge-info kind', service['kind']));
146
- listItem.appendChild(kind);
147
- listItemClass+= " kind-" + service['kind'];
148
- }
149
- listItem.setAttribute('class', listItemClass);
113
+ if (!!service["kind"]) {
114
+ var kind = document.createElement("div");
115
+ kind.setAttribute("class", "kind float-right");
116
+ kind.appendChild(createBadge("badge-info kind", service["kind"]));
117
+ element.appendChild(kind);
118
+ CSSClass += " kind-" + service["kind"];
119
+ }
120
+ element.setAttribute("class", CSSClass);
150
121
 
151
- var serviceNameItem = document.createElement('div');
152
- serviceNameItem.setAttribute('class', 'service-name');
153
- serviceNameItem.appendChild(document.createTextNode(serviceName));
154
- listItem.appendChild(serviceNameItem);
122
+ var serviceNameItem = document.createElement("div");
123
+ serviceNameItem.setAttribute("class", "service-name");
124
+ serviceNameItem.appendChild(document.createTextNode(serviceName));
125
+ element.appendChild(serviceNameItem);
155
126
 
156
- var serviceTagsItem = document.createElement('div');
157
- serviceTagsItem.setAttribute('class', 'service-tags');
127
+ if (this.flags["showTags"].state) {
128
+ element.appendChild(this.generateServiceTags(service));
129
+ }
158
130
 
159
- for (var i = 0; i < service.tags.length; i++) {
160
- serviceTagsItem.appendChild(createBadge('float-right badge-' + (i%2?'secondary':'info') , service.tags[i]));
131
+ return element;
161
132
  }
162
133
 
163
- listItem.appendChild(serviceTagsItem);
134
+ generateStatuses(service) {
135
+ var serviceStatus = buildServiceStatus(service);
136
+ var statuses = document.createElement("div");
137
+ statuses.setAttribute("class", "statuses float-right");
138
+
139
+ if (!!serviceStatus["passing"]) {
140
+ statuses.appendChild(
141
+ createBadge("badge-success passing", serviceStatus["passing"])
142
+ );
143
+ }
144
+
145
+ if (!!serviceStatus["warning"]) {
146
+ statuses.appendChild(
147
+ createBadge("badge-warning warning", serviceStatus["warning"])
148
+ );
149
+ }
164
150
 
165
- this.serviceList.append(listItem);
151
+ if (!!serviceStatus["critical"]) {
152
+ statuses.appendChild(
153
+ createBadge("badge-danger critical", serviceStatus["critical"])
154
+ );
155
+ }
166
156
 
167
- this.serviceFilterCount += 1;
168
- }
157
+ statuses.appendChild(
158
+ createBadge("badge-dark", serviceStatus["total"] || 0)
159
+ );
169
160
 
170
- filterService() {
171
- var filter;
172
- var filterValue = consulService.serviceFilter.val();
173
- try {
174
- filter = new RegExp(filterValue);
175
- } catch (e) {
176
- var safeReg = filterValue.replace(/[-[\]{}()*+?.,\\^$|]/g, "\\$&")
177
- console.log("Failed to compile regexp for '" + filterValue + "', using strict lookup due to: " + e);
178
- filter = new RegExp(safeReg);
161
+ if (this.activateFavorite) {
162
+ statuses.append(this.favorites.buildButton(service.name));
163
+ }
164
+
165
+ return statuses;
179
166
  }
180
- consulService.serviceFilterValue = filterValue
181
- consulService.updateURL()
182
- consulService.serviceFilterCount = 0;
183
- var showProxiesInList = consulService.showProxiesInList;
184
- consulService.serviceList.children('.serviceListItem').each(function (){
185
- var ui = $(this);
186
- if(serviceMatcher(this, filter, showProxiesInList)) {
187
- ui.removeClass('d-none');
188
- ui.addClass('d-block');
189
- consulService.serviceFilterCount += 1;
190
- consulService.serviceFilterCounter.html(consulService.serviceFilterCount);
191
- } else {
192
- ui.removeClass('d-block');
193
- ui.addClass('d-none');
194
- }
195
- })
196
- }
197
-
198
- onClickServiceName(source) {
199
- this.selectService(source);
200
- this.selectedServiceName = $(source).find(".service-name").html()
201
- this.updateURL();
202
- }
203
-
204
- onClickFilter(source) {
205
- var status = $(source).attr('status');
206
- this.filterStatus = (this.filterStatus == status) ? null : status;
207
- this.filterInstances();
208
- }
209
-
210
- filterInstances() {
211
- updateFilterDisplay(consulService.filterStatus);
212
- var filter = new RegExp(consulService.instanceFilter.val());
213
- $('#instances-list').children('div').each(function() {
214
- var status = $(this).attr('status');
215
- if(instanceMatcher(this, filter)) {
216
- if (consulService.filterStatus == null) {
217
- $(this).removeClass('d-none');
218
- $(this).addClass('d-block');
219
- } else if (consulService.filterStatus == status) {
220
- $(this).removeClass('d-none');
221
- $(this).addClass('d-block');
222
- } else {
223
- $(this).removeClass('d-block');
224
- $(this).addClass('d-none');
167
+
168
+ generateServiceTags(service) {
169
+ var serviceTagsItem = document.createElement("div");
170
+ serviceTagsItem.setAttribute("class", "service-tags");
171
+
172
+ for (var i = 0; i < service.tags.length; i++) {
173
+ serviceTagsItem.appendChild(
174
+ createBadge(
175
+ "float-right badge-" + (i % 2 ? "secondary" : "info"),
176
+ service.tags[i]
177
+ )
178
+ );
225
179
  }
226
- } else {
227
- $(this).removeClass('d-block');
228
- $(this).addClass('d-none');
229
- }
230
- })
231
- }
232
-
233
- updateURL() {
234
- var newUrl = new URL(location.href);
235
- if (this.selectedServiceName) {
236
- newUrl.searchParams.set('service', this.selectedServiceName);
237
- } else {
238
- newUrl.searchParams.delete('service')
180
+ return serviceTagsItem;
239
181
  }
240
- if (this.serviceFilterValue) {
241
- newUrl.searchParams.set('filter', this.serviceFilterValue);
242
- } else {
243
- newUrl.searchParams.delete('filter')
244
- }
245
- window.history.pushState({},"",newUrl);
246
- }
247
-
248
- selectService(source) {
249
- if (this.selectedService) {
250
- $(this.selectedService).removeClass('active');
182
+
183
+ selectItem(element, service) {
184
+ super.selectItem(element, service);
185
+ this.mainSelector.initSelector(this.data[service]);
251
186
  }
252
- var serviceName = $(source).find(".service-name").html()
253
- this.selectedService = source.closest('li');
254
- $(this.selectedService).addClass('active');
255
-
256
- this.displayService(this.data.services[serviceName], this.data.nodes);
257
- }
258
-
259
- displayService(service, nodes) {
260
- var titleText = service['name'] + ' <a href="consul-timeline-ui.html?service=' + service['name'] + '">timeline</a>';
261
- $("#service-title").html(titleText);
262
- $("#instances-list").html("");
263
-
264
- var serviceStatus = buildServiceStatus(service);
265
-
266
- for (var key in service['instances']) {
267
- var instance = service['instances'][key];
268
- var serviceHtml = document.createElement('div');
269
- serviceHtml.setAttribute('class','list-group-item service-instance');
270
- var state = nodeState(instance.checks);
271
- serviceHtml.appendChild(weightsGenerator(instance.weights, state));
272
- serviceHtml.appendChild(serviceTitleGenerator(instance));
273
- var node_info = nodes[instance.name];
274
- if (node_info != null) {
275
- node_info = node_info.meta;
276
- serviceHtml.appendChild(nodeMetaGenerator(node_info));
277
- serviceHtml.appendChild(document.createElement('hr'));
278
- }
279
- if (instance.tags && instance.tags.length > 0) {
280
- serviceHtml.appendChild(tagsGenerator(instance.tags));
281
- serviceHtml.appendChild(document.createElement('hr'));
282
- }
283
- serviceHtml.appendChild(serviceMetaGenerator(instance.sMeta));
284
- serviceHtml.appendChild(connectGenerator(instance));
285
- serviceHtml.appendChild(checksStatusGenerator(instance, instance.name));
286
- serviceHtml.setAttribute('status', state);
287
- $("#instances-list").append(serviceHtml);
187
+ }
188
+
189
+ class ServiceMainSelector extends MainSelector {
190
+ constructor(
191
+ titleElement,
192
+ listElement,
193
+ filterElement,
194
+ counterElement,
195
+ maxDisplayed,
196
+ URLLabelFilter,
197
+ URLLabelStatus
198
+ ) {
199
+ super(listElement, filterElement, counterElement, maxDisplayed, URLLabelFilter, URLLabelStatus);
200
+ this.titleElement = titleElement;
201
+ this.passingStatusBarElement = $("#service-progress-passing");
202
+ this.warningStatusBarElement = $("#service-progress-warning");
203
+ this.criticalStatusBarElement = $("#service-progress-critical");
204
+ this.passingStatusButtonElement = $("#service-status-passing");
205
+ this.warningStatusButtonElement = $("#service-status-warning");
206
+ this.criticalStatusButtonElement = $("#service-status-critical");
207
+ this.totalStatusButtonElement = $("#service-status-total");
208
+ this.initStatusButtons();
209
+ this.initStatusBar();
288
210
  }
289
211
 
290
- $('#service-progress-passing').css('width', (serviceStatus['passing'] || 0) / serviceStatus['total'] * 100 + '%')
291
- $('#service-progress-passing').html("passing (" + (serviceStatus['passing'] || 0) + ")")
292
- $('#service-progress-warning').css('width', (serviceStatus['warning'] || 0) / serviceStatus['total'] * 100 + '%')
293
- $('#service-progress-warning').html("warning (" + (serviceStatus['warning'] || 0) +")")
294
- $('#service-progress-critical').css('width', (serviceStatus['critical'] || 0) / serviceStatus['total'] * 100 + '%')
295
- $('#service-progress-critical').html("critical (" + (serviceStatus['critical'] || 0) + ")")
296
-
297
- resizeWrapper('instances-wrapper', 'instances-list');
298
- $('#instances-list .list-group-item').resize(resizeAll);
299
- this.filterInstances();
300
- $('pre code').each(function(i, block) {
301
- hljs.highlightBlock(block);
302
- });
303
- }
304
-
305
- loadFavorites() {
306
- const all = (localStorage.getItem('favorite_services') || '').split(',').filter(e => e != '');
307
- this.favorites = {}
308
- for (var i in all) {
309
- this.favorites[all[i]] = true;
212
+ initStatusButtons() {
213
+ var obj = this;
214
+ this.passingStatusButtonElement
215
+ .get(0)
216
+ .addEventListener("click", function () {
217
+ obj.onClickFilter(this, "passing");
218
+ });
219
+ this.warningStatusButtonElement
220
+ .get(0)
221
+ .addEventListener("click", function () {
222
+ obj.onClickFilter(this, "warning");
223
+ });
224
+ this.criticalStatusButtonElement
225
+ .get(0)
226
+ .addEventListener("click", function () {
227
+ obj.onClickFilter(this, "critical");
228
+ });
229
+ this.totalStatusButtonElement.get(0).addEventListener("click", function () {
230
+ obj.onClickFilter(this, null);
231
+ });
310
232
  }
311
- }
312
-
313
- saveFavorites() {
314
- let str = "";
315
- for (var i in this.favorites) {
316
- if (!this.favorites[i]) {
317
- continue;
318
- }
319
- str == "" || (str += ",");
320
- str += i;
233
+
234
+ initStatusBar() {
235
+ var obj = this;
236
+ this.passingStatusBarElement.get(0).addEventListener("click", function () {
237
+ obj.onClickFilter(this, "passing");
238
+ });
239
+ this.warningStatusBarElement.get(0).addEventListener("click", function () {
240
+ obj.onClickFilter(this, "warning");
241
+ });
242
+ this.criticalStatusBarElement.get(0).addEventListener("click", function () {
243
+ obj.onClickFilter(this, "critical");
244
+ });
321
245
  }
322
- localStorage.setItem('favorite_services', str);
323
- }
324
246
 
325
- buildFavButton(serviceName) {
326
- const btn = document.createElement('button');
327
- btn.className = 'favorite';
328
- btn.setAttribute('title', 'Add/Remove from favorites');
247
+ initSelector(service) {
248
+ if (service) {
249
+ super.initSelector(service.instances);
250
+ this.generateTitle(service.name);
251
+ }
252
+ }
329
253
 
330
- if (this.favorites[serviceName]) {
331
- btn.className += ' favorited';
254
+ updateStatusCounters() {
255
+ updateStatusItem(this.selectorStatus);
256
+ this.passingStatusBarElement.css(
257
+ "width",
258
+ ((this.selectorStatus["passing"] || 0) / this.selectorStatus["total"]) *
259
+ 100 +
260
+ "%"
261
+ );
262
+ this.passingStatusBarElement.html(
263
+ "passing (" + (this.selectorStatus["passing"] || 0) + ")"
264
+ );
265
+ this.warningStatusBarElement.css(
266
+ "width",
267
+ ((this.selectorStatus["warning"] || 0) / this.selectorStatus["total"]) *
268
+ 100 +
269
+ "%"
270
+ );
271
+ this.warningStatusBarElement.html(
272
+ "warning (" + (this.selectorStatus["warning"] || 0) + ")"
273
+ );
274
+ this.criticalStatusBarElement.css(
275
+ "width",
276
+ ((this.selectorStatus["critical"] || 0) / this.selectorStatus["total"]) *
277
+ 100 +
278
+ "%"
279
+ );
280
+ this.criticalStatusBarElement.html(
281
+ "critical (" + (this.selectorStatus["critical"] || 0) + ")"
282
+ );
332
283
  }
333
284
 
334
- $(btn).click(e => {
335
- this.toggleFav(serviceName, !this.favorites[serviceName]);
336
- });
337
- return btn;
338
- }
285
+ generateTitle(serviceName) {
286
+ var titleText =
287
+ serviceName +
288
+ ' <a href="consul-timeline-ui.html?service=' +
289
+ serviceName +
290
+ '">timeline</a>';
291
+ this.titleElement.html(titleText);
292
+ resizeAll();
293
+ }
339
294
 
340
- toggleFav(serviceName, fav) {
341
- this.favorites[serviceName] = fav;
295
+ elementGenerator(instance) {
296
+ var element = document.createElement("div");
297
+ element.setAttribute("class", "list-group-item service-instance");
298
+ var state = nodeState(instance.checks);
299
+ element.appendChild(weightsGenerator(instance.weights, state));
300
+ element.appendChild(serviceTitleGenerator(instance));
301
+ var node_info = this.nodes[instance.name];
302
+ if (node_info != null) {
303
+ node_info = node_info.meta;
304
+ element.appendChild(nodeMetaGenerator(node_info));
305
+ element.appendChild(document.createElement("hr"));
306
+ }
307
+ if (instance.tags && instance.tags.length > 0) {
308
+ element.appendChild(tagsGenerator(instance.tags));
309
+ element.appendChild(document.createElement("hr"));
310
+ }
311
+ element.appendChild(serviceMetaGenerator(instance.sMeta));
312
+ element.appendChild(connectGenerator(instance));
313
+ element.appendChild(checksStatusGenerator(instance, instance.name));
314
+ element.setAttribute("status", state);
342
315
 
343
- let el = this.serviceList.find('[value="' + serviceName + '"]');
344
- if (!el.length) {
345
- return;
316
+ return element;
346
317
  }
347
318
 
348
- if (fav) {
349
- el.find('.favorite').addClass('favorited');
350
- } else {
351
- el.find('.favorite').removeClass('favorited');
352
- }
353
- el.attr('data-fav', fav ? 1 : 0);
354
-
355
- const elIdx = parseInt(el.attr('data-index'));
356
-
357
- let prev = fav ? null : this.serviceList.find('[data-fav="1"]').last();
358
- const others = this.serviceList.find('[data-fav="' + (fav ? 1 : 0) + '"]');
359
- for (var i = 0; i < others.length; i++) {
360
- const idx = parseInt($(others[i]).attr("data-index"));
361
- if (idx < elIdx) {
362
- prev = $(others[i]);
363
- } else if (idx > elIdx) {
364
- break;
365
- }
366
- };
367
-
368
- if (!prev || !prev.length) {
369
- this.serviceList.prepend(el);
370
- } else {
371
- prev.after(el);
319
+ getStatus(instance) {
320
+ return nodeState(instance["checks"]);
372
321
  }
373
322
 
374
- // if favorited, scroll to element new position
375
- if (fav) {
376
- const container = $('#service-wrapper');
377
- const top = el.position().top;
378
- const scroll = container.scrollTop();
379
- container.scrollTop(scroll + el.offset().top - container.offset().top);
380
- }
323
+ matchElement(instance, filter) {
324
+ if (
325
+ this.statusFilter != null &&
326
+ nodeState(instance["checks"]) != this.statusFilter
327
+ ) {
328
+ return false;
329
+ }
330
+
331
+ if (instance.name.match(filter)) {
332
+ return true;
333
+ }
334
+
335
+ if (instance.addr.match(filter)) {
336
+ return true;
337
+ }
381
338
 
382
- this.saveFavorites();
383
- }
339
+ for (var i in instance.tags) {
340
+ if (instance.tags[i].match(filter)) {
341
+ return true;
342
+ }
343
+ }
344
+
345
+ for (var key in instance.sMeta) {
346
+ if (key.match(filter) || instance.sMeta[key].match(filter)) {
347
+ return true;
348
+ }
349
+ }
350
+
351
+ var node = this.nodes[instance.name];
352
+ for (var key in node.meta) {
353
+ if ((key + ":" + node.meta[key]).match(filter)) {
354
+ return true;
355
+ }
356
+ }
357
+
358
+ return false;
359
+ }
384
360
  }
385
361
 
386
- $( window ).resize(resizeAll);
387
- resizeAll();
362
+ $(window).resize(resizeAll);
363
+ resizeAll();