blob: b293b71173f0c5cba2c13a9a74578d30a60a5df2 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import angular from 'angular';
import brIconGenarator from 'brooklyn-ui-utils/icon-generator/icon-generator';
import brAutoFocus from 'brooklyn-ui-utils/autofocus/autofocus';
import {capitalize} from "brooklyn-ui-utils/utils/general";
import {timeAgoFilter} from '../task-list/task-list.directive';
import template from './adjuncts-list.html';
const MODULE_NAME = 'brooklyn.components.adjuncts-list';
const SUMMARY_HIGHLIGHTS = [
'lastAction',
'lastConfirmation',
'lastViolation',
'triggers'
];
function replaceStart(name, start, newStart) {
if (name.startsWith(start)) {
return newStart + name.substring(start.length);
}
return name;
}
export function capitalizeFilter() {
return capitalize;
}
export function usefulNameFilter() {
return usefulName;
}
function usefulName(name) {
if (!name) return name;
// poor man's attempt to make class names show up nicely
// TODO replace this with intermediate ellipsis?
// cf https://codepen.io/markchitty/pen/RNZbRE
// (also make sure things have nice names!)
if (name.length>50 && name.length - name.lastIndexOf('.') > 10) {
name = name.substring(name.lastIndexOf('.')+1);
}
name = replaceStart(name, "org.apache.brooklyn.", "o.a.b.");
name = replaceStart(name, "o.a.b.enricher.stock.", "o.a.b.e.s.");
name = replaceStart(name, "o.a.b.entity.software.base.", "o.a.b.e.s.b.");
return name;
}
angular.module(MODULE_NAME, [brIconGenarator, brAutoFocus])
.directive('adjunctsList', adjunctsListDirective)
.filter('timeAgo', timeAgoFilter)
.filter('capitalize', capitalizeFilter)
.filter('usefulName', usefulNameFilter);
export default MODULE_NAME;
export function adjunctsListDirective() {
return {
restrict: 'E',
template: template,
transclude: true,
scope: {
adjuncts: '<',
summary: '<'
},
link: link
};
function link(scope) {
scope.filters = {
types: [],
search: ''
};
scope.predicate = (value, index, array) => {
let predicate = scope.filters.types.filter(types => types.active).map(types => types.value).includes(value.adjunctType);
if (scope.filters.search) {
let searchPredicate = value.name.toLowerCase().indexOf(scope.filters.search.toLowerCase()) > -1;
if (value.description) {
searchPredicate |= value.description.toLowerCase().indexOf(scope.filters.search.toLowerCase()) > -1;
}
predicate &= searchPredicate;
}
return predicate;
};
function sortHighlights(highlights) {
if (!highlights) return highlights;
var result1 = [];
for (var p in highlights) {
var result1i = angular.copy(highlights[p]);
result1i.id = p;
result1i.display = "ITEM "+p;
result1.push(result1i);
}
result1.sort(function(h1,h2) { return h2.time - h1.time; });
var result2 = {};
result1.forEach((x) => result2[x.id] = x);
return result2;
}
function adjunctsWithHighlightsSorted() {
var result = {};
Object.values(scope.adjuncts).forEach((a) =>
result[a.id] = sortHighlights(a.highlights));
return result;
}
scope.$watch('adjuncts', (newValue, oldValue) => {
scope.filters.types = scope.adjuncts.reduce((acc, adjunct) => {
if (!acc.find(filter => filter.value === adjunct.adjunctType)) {
acc.push({
value: adjunct.adjunctType,
active: true
});
}
return acc;
}, scope.filters.types);
// a bit messy doing this in a watch, but calling the function on display
// causing lots of iterator digest warnings
scope.adjunctsWithHighlightsSorted = adjunctsWithHighlightsSorted();
});
scope.showHighlight = (id) => {
return scope.summary ?
SUMMARY_HIGHLIGHTS.includes(id) :
true;
}
}
}