blob: dd6e2486724b3416f98907696f0711b811c268b6 [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 template from './bundle.template.html';
import brooklynTypeItem from '../../components/type-item/index';
import {catalogState, bundleNameFilter, bundleDescriptionFilter, bundleHighlightsFilter, bundleTypeFilter} from '../catalog/catalog.state';
import brUtils from 'brooklyn-ui-utils/utils/general';
import {HIDE_INTERSTITIAL_SPINNER_EVENT} from 'brooklyn-ui-utils/interstitial-spinner/interstitial-spinner';
const MODULE_NAME = 'bundle.state';
angular.module(MODULE_NAME, [brUtils, brooklynTypeItem])
.config(['$stateProvider', bundleStateConfig])
.filter('bundleName', ['$sce', bundleNameFilter])
.filter('bundleDescription', ['$sce', bundleDescriptionFilter])
.filter('bundleHighlights', ['$sce', bundleHighlightsFilter])
.filter('bundleTypeFilter', ['$sce', bundleTypeFilter]);
export default MODULE_NAME;
export const bundleState = {
name: 'bundle',
url: '/bundles/:bundleId/:bundleVersion',
template: template,
controller: ['$scope', '$state', '$stateParams', 'brSnackbar', 'brUtilsGeneral', 'catalogApi', bundleController],
controllerAs: 'ctrl'
};
export function bundleStateConfig($stateProvider) {
$stateProvider.state(bundleState);
}
export function bundleController($scope, $state, $stateParams, brSnackbar, brUtilsGeneral, catalogApi) {
const orderBys = [{
id: 'displayName',
label: 'Name'
}, {
id: '-version',
label: 'Version'
}, {
id: '-supertypes',
label: 'Type'
}];
$scope.config = {
orderBy: orderBys
};
$scope.state = {
orderBy: orderBys[0],
search: {}
};
$scope.clearSearchFilters = () => {
$scope.state.search = {};
$scope.state.orderBy = orderBys[0];
};
$scope.deleteBundle = () => {
$scope.state.deleting = true;
catalogApi.deleteBundle($scope.bundle.symbolicName, $scope.bundle.version).then(data => {
$state.go(catalogState);
}).catch(error => {
brSnackbar.create('Could not delete this bundle: ' + error.message);
}).finally(() => {
$scope.state.deleting = false;
});
};
$scope.isNonEmpty = (o) => {
return brUtilsGeneral.isNonEmpty(o);
};
catalogApi.getBundle($stateParams.bundleId, $stateParams.bundleVersion).then(bundle => {
bundle.types.forEach( (t) => {
// tidy up display so that things labelled [DEPRECATED] don't have that ugly name
// (since we highlight deprecated things, and particularly bad since [ appears first alphabetically!)
if (t.deprecated && t.displayName.match(/^[^\w]*deprecated[^\w]*/i)) {
t.displayName = t.displayName.replace(/^[^\w]*deprecated[^\w]*/i, '');
}
} );
$scope.bundle = bundle;
$scope.typeVersions = Array.from(new Set(bundle.types.map(type => type.version)));
return catalogApi.getBundleVersions($stateParams.bundleId);
}).then(bundleVersions => {
$scope.bundleVersions = bundleVersions.map(bundleVersion => bundleVersion.version);
$scope.$emit(HIDE_INTERSTITIAL_SPINNER_EVENT);
}).catch(error => {
brSnackbar.create(`Could not load bundle ${$stateParams.bundleId}:${$stateParams.bundleVersion}: ${error.status === 404 ? 'Not found' : error.message}`);
$state.go(catalogState);
});
}