blob: e409393dc96411b65caafd27b1ff269bae2ce1d4 [file] [log] [blame]
/*
* Licensed 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 {HeliumType} from './helium-type';
export default function HeliumCtrl($scope, $rootScope, $sce,
baseUrlSrv, ngToast, heliumService) {
'ngInject';
$scope.pkgSearchResults = {};
$scope.defaultPackages = {};
$scope.showVersions = {};
$scope.bundleOrder = [];
$scope.bundleOrderChanged = false;
$scope.vizTypePkg = {};
$scope.spellTypePkg = {};
$scope.intpTypePkg = {};
$scope.appTypePkg = {};
$scope.numberOfEachPackageByType = {};
$scope.allPackageTypes = [HeliumType][0];
$scope.pkgListByType = 'VISUALIZATION';
$scope.defaultPackageConfigs = {}; // { pkgName, [{name, type, desc, value, defaultValue}] }
$scope.intpDefaultIcon = $sce.trustAsHtml('<img src="../assets/images/maven_default_icon.png" style="width: 12px"/>');
function init() {
// get all package info and set config
heliumService.getAllPackageInfoAndDefaultPackages()
.then(({pkgSearchResults, defaultPackages}) => {
// pagination
$scope.itemsPerPage = 10;
$scope.currentPage = 1;
$scope.maxSize = 5;
$scope.pkgSearchResults = pkgSearchResults;
$scope.defaultPackages = defaultPackages;
classifyPkgType($scope.defaultPackages);
return heliumService.getAllPackageConfigs();
})
.then((defaultPackageConfigs) => {
$scope.defaultPackageConfigs = defaultPackageConfigs;
return heliumService.getVisualizationPackageOrder();
})
.then((visPackageOrder) => {
setVisPackageOrder(visPackageOrder);
});
}
const setVisPackageOrder = function(visPackageOrder) {
$scope.bundleOrder = visPackageOrder;
$scope.bundleOrderChanged = false;
};
let orderPackageByPubDate = function(a, b) {
if (!a.pkg.published) {
// Because local registry pkgs don't have 'published' field, put current time instead to show them first
a.pkg.published = new Date().getTime();
}
return new Date(a.pkg.published).getTime() - new Date(b.pkg.published).getTime();
};
const classifyPkgType = function(packageInfo) {
let allTypesOfPkg = {};
let vizTypePkg = [];
let spellTypePkg = [];
let intpTypePkg = [];
let appTypePkg = [];
let packageInfoArr = Object.keys(packageInfo).map((key) => packageInfo[key]);
packageInfoArr = packageInfoArr.sort(orderPackageByPubDate).reverse();
for (let name in packageInfoArr) {
if (packageInfoArr.hasOwnProperty(name)) {
let pkgs = packageInfoArr[name];
let pkgType = pkgs.pkg.type;
switch (pkgType) {
case HeliumType.VISUALIZATION:
vizTypePkg.push(pkgs);
break;
case HeliumType.SPELL:
spellTypePkg.push(pkgs);
break;
case HeliumType.INTERPRETER:
intpTypePkg.push(pkgs);
break;
case HeliumType.APPLICATION:
appTypePkg.push(pkgs);
break;
}
}
}
let pkgsArr = [
vizTypePkg,
spellTypePkg,
intpTypePkg,
appTypePkg,
];
for (let idx in _.keys(HeliumType)) {
if (_.keys(HeliumType).hasOwnProperty(idx)) {
allTypesOfPkg[_.keys(HeliumType)[idx]] = pkgsArr[idx];
}
}
$scope.allTypesOfPkg = allTypesOfPkg;
};
$scope.bundleOrderListeners = {
accept: function(sourceItemHandleScope, destSortableScope) {
return true;
},
itemMoved: function(event) {},
orderChanged: function(event) {
$scope.bundleOrderChanged = true;
},
};
$scope.saveBundleOrder = function() {
const confirm = BootstrapDialog.confirm({
closable: false,
closeByBackdrop: false,
closeByKeyboard: false,
title: '',
message: 'Save changes?',
callback: function(result) {
if (result) {
confirm.$modalFooter.find('button').addClass('disabled');
confirm.$modalFooter.find('button:contains("OK")')
.html('<i class="fa fa-circle-o-notch fa-spin"></i> Enabling');
heliumService.setVisualizationPackageOrder($scope.bundleOrder)
.success(function(data, status) {
setVisPackageOrder($scope.bundleOrder);
confirm.close();
})
.error(function(data, status) {
confirm.close();
console.log('Failed to save order');
BootstrapDialog.show({
title: 'Error on saving order ',
message: _.escape(data.message),
});
});
return false;
}
},
});
};
let getLicense = function(name, artifact) {
let filteredPkgSearchResults = _.filter($scope.defaultPackages[name], function(p) {
return p.artifact === artifact;
});
let license;
if (filteredPkgSearchResults.length === 0) {
filteredPkgSearchResults = _.filter($scope.pkgSearchResults[name], function(p) {
return p.pkg.artifact === artifact;
});
if (filteredPkgSearchResults.length > 0) {
license = filteredPkgSearchResults[0].pkg.license;
}
} else {
license = filteredPkgSearchResults[0].license;
}
if (!license) {
license = 'Unknown';
}
return license;
};
const getHeliumTypeText = function(type) {
if (type === HeliumType.VISUALIZATION) {
return `<a target="_blank" href="https://zeppelin.apache.org/docs/${$rootScope.zeppelinVersion}/development/helium/writing_visualization.html">${type}</a>`; // eslint-disable-line max-len
} else if (type === HeliumType.SPELL) {
return `<a target="_blank" href="https://zeppelin.apache.org/docs/${$rootScope.zeppelinVersion}/development/helium/writing_spell.html">${type}</a>`; // eslint-disable-line max-len
} else {
return type;
}
};
$scope.enable = function(name, artifact, type, groupId, description) {
let license = getLicense(name, artifact);
let mavenArtifactInfoToHTML = groupId + ':' + artifact.split('@')[0] + ':' + artifact.split('@')[1];
let confirm = '';
if (type === HeliumType.INTERPRETER) {
confirm = BootstrapDialog.confirm({
closable: false,
closeByBackdrop: false,
closeByKeyboard: false,
title: '<div style="font-weight: 300;">Do you want to download an interpreter?</div>',
message: '<div style="font-size: 14px; margin-top: 5px;">Name</div>' +
`<div style="color:gray">${name}</div>` +
'<hr style="margin-top: 10px; margin-bottom: 10px;" />' +
'<div style="font-size: 14px; margin-bottom: 2px;">Artifact</div>' +
`<div style="color:gray">${mavenArtifactInfoToHTML}</div>`,
callback: function(result) {
if (result) {
heliumService.installInterpreter({'name': name, 'artifact': mavenArtifactInfoToHTML})
.success(function(data, status) {
confirm.close();
}).error(function(data, status) {
confirm.close();
console.log('Failed to install an interpreter %o %o', name, artifact);
BootstrapDialog.show({
title: 'Error while starting to install ' + _.escape(name) + ' interpreter',
message: _.escape(data.message),
});
});
return false;
}
},
});
} else {
confirm = BootstrapDialog.confirm({
closable: false,
closeByBackdrop: false,
closeByKeyboard: false,
title: '<div style="font-weight: 300;">Do you want to enable Helium Package?</div>',
message:
'<div style="font-size: 14px; margin-top: 5px;">Artifact</div>' +
`<div style="color:gray">${artifact}</div>` +
'<hr style="margin-top: 10px; margin-bottom: 10px;" />' +
'<div style="font-size: 14px; margin-bottom: 2px;">Type</div>' +
`<div style="color:gray">${getHeliumTypeText(type)}</div>` +
'<hr style="margin-top: 10px; margin-bottom: 10px;" />' +
'<div style="font-size: 14px;">Description</div>' +
`<div style="color:gray">${description}</div>` +
'<hr style="margin-top: 10px; margin-bottom: 10px;" />' +
'<div style="font-size: 14px;">License</div>' +
`<div style="color:gray">${license}</div>`,
callback: function(result) {
if (result) {
confirm.$modalFooter.find('button').addClass('disabled');
confirm.$modalFooter.find('button:contains("OK")')
.html('<i class="fa fa-circle-o-notch fa-spin"></i> Enabling');
heliumService.enable(name, artifact, type).success(function(data, status) {
init();
confirm.close();
}).error(function(data, status) {
confirm.close();
console.log('Failed to enable package %o %o. %o', name, artifact, data);
BootstrapDialog.show({
title: 'Error on enabling ' + _.escape(name),
message: _.escape(data.message),
});
});
return false;
}
},
});
}
};
$scope.disable = function(name, artifact) {
const confirm = BootstrapDialog.confirm({
closable: false,
closeByBackdrop: false,
closeByKeyboard: false,
title: '<div style="font-weight: 300;">Do you want to disable Helium Package?</div>',
message: _.escape(artifact),
callback: function(result) {
if (result) {
confirm.$modalFooter.find('button').addClass('disabled');
confirm.$modalFooter.find('button:contains("OK")')
.html('<i class="fa fa-circle-o-notch fa-spin"></i> Disabling');
heliumService.disable(name)
.success(function(data, status) {
init();
confirm.close();
})
.error(function(data, status) {
confirm.close();
console.log('Failed to disable package %o. %o', name, data);
BootstrapDialog.show({
title: 'Error on disabling ' + _.escape(name),
message: _.escape(data.message),
});
});
return false;
}
},
});
};
$scope.toggleVersions = function(pkgName) {
if ($scope.showVersions[pkgName]) {
$scope.showVersions[pkgName] = false;
} else {
$scope.showVersions[pkgName] = true;
}
};
$scope.isLocalPackage = function(pkgSearchResult) {
const pkg = pkgSearchResult.pkg;
return pkg.artifact && !pkg.artifact.includes('@');
};
$scope.hasNpmLink = function(pkgSearchResult) {
const pkg = pkgSearchResult.pkg;
return (pkg.type === HeliumType.SPELL || pkg.type === HeliumType.VISUALIZATION) &&
!$scope.isLocalPackage(pkgSearchResult);
};
$scope.hasMavenLink = function(pkgSearchResult) {
const pkg = pkgSearchResult.pkg;
return (pkg.type === HeliumType.APPLICATION || pkg.type === HeliumType.INTERPRETER) &&
!$scope.isLocalPackage(pkgSearchResult);
};
$scope.getPackageSize = function(pkgSearchResult, targetPkgType) {
let result = [];
_.map(pkgSearchResult, function(pkg) {
result.push(_.find(pkg, {type: targetPkgType}));
});
return _.compact(result).length;
};
$scope.configExists = function(pkgSearchResult) {
// helium package config is persisted per version
return pkgSearchResult.pkg.config && pkgSearchResult.pkg.artifact;
};
$scope.configOpened = function(pkgSearchResult) {
return pkgSearchResult.configOpened && !pkgSearchResult.configFetching;
};
$scope.getConfigButtonClass = function(pkgSearchResult) {
return (pkgSearchResult.configOpened && pkgSearchResult.configFetching)
? 'disabled' : '';
};
$scope.toggleConfigButton = function(pkgSearchResult) {
if (pkgSearchResult.configOpened) {
pkgSearchResult.configOpened = false;
return;
}
const pkg = pkgSearchResult.pkg;
const pkgName = pkg.name;
pkgSearchResult.configFetching = true;
pkgSearchResult.configOpened = true;
heliumService.getSinglePackageConfigs(pkg)
.then((confs) => {
$scope.defaultPackageConfigs[pkgName] = confs;
pkgSearchResult.configFetching = false;
});
};
$scope.saveConfig = function(pkgSearchResult) {
const pkgName = pkgSearchResult.pkg.name;
const currentConf = $scope.defaultPackageConfigs[pkgName];
heliumService.saveConfig(pkgSearchResult.pkg, currentConf, () => {
// close after config is saved
pkgSearchResult.configOpened = false;
});
};
$scope.getDescriptionText = function(pkgSearchResult) {
return $sce.trustAsHtml(pkgSearchResult.pkg.description);
};
init();
}