strong-arc
Version:
A visual suite for the StrongLoop API Platform
344 lines (287 loc) • 10.4 kB
JavaScript
PM.directive('slPmHostForm', [
'PMHostService',
'PMPidService',
'$state',
function(PMHostService, PMPidService, $state) {
return {
scope: {
onLoadHost: '&',
onUpdateProcesses: '&',
onUpdateSelection: '&'
},
templateUrl: './scripts/modules/pm/templates/pm.host.form.html',
controller: [
'$scope',
'$log',
'$q',
'growl',
'$timeout',
'PMServerService',
'ManagerServices',
'$timeout',
function($scope, $log, $q, growl, $timeout, PMServerService, ManagerServices, $timeout) {
var isLocal = false;
$scope.selectedPMHost = {};
$scope.currentInstanceId = 1;
$scope.candidateServerConfig = {};
$scope.managerHosts = ManagerServices.getManagerHosts(function(hosts) {
$scope.$apply(function () {
$scope.managerHosts = hosts;
if ($scope.managerHosts.length) {
$scope.candidateServerConfig = $scope.managerHosts[0];
$scope.selectedPMHost = $scope.candidateServerConfig;
}
});
});
$scope.goToAddPM = function() {
$state.go('process-manager');
};
$scope.changePMHost = function(host) {
$scope.candidateServerConfig = host;
$scope.selectedPMHost = host;
$scope.onUpdateProcesses({
processes: []
});
};
$scope.selected = undefined;
$scope.activeProcess = null;
$scope.showMoreMenu = false;
$scope.isRemoteValid = false;
$scope.isOpen = false;
$scope.showPortInput = function() {
return !isLocal;
};
$scope.pmHostFocus = function() {
isLocal = false;
};
$scope.processes = [];
$scope.onPMServerSelect = function(item) {
isLocal = false;
//fixes infinite host property being referenced
$scope.candidateServerConfig.host = item.host;
$scope.candidateServerConfig.port = item.port;
$scope.processes = [];
};
$scope.hideMenu = function(){
$scope.isOpen = false;
};
$scope.submitPMHostForm = function(form) {
if ( form.$valid ) {
$scope.loadProcesses();
}
};
$scope.pmHostBlur = function(event) {
};
$scope.loadProcesses = function(form){
if ( $scope.hasClickLoad ) {
if ( form.$valid ) {
return $scope.onClickLoad({ form: form });
}
}
$scope.isLoading = true;
// make sure the values are at least valid
if ($scope.candidateServerConfig.host && Number.isInteger(JSON.parse($scope.candidateServerConfig.port)) && (JSON.parse($scope.candidateServerConfig.port) > 1)) {
$scope.currentServerConfig = $scope.candidateServerConfig;
isLocal = false;
$scope.initServerProcesses($scope.currentServerConfig, $scope.currentInstanceId);
}
else {
$log.warn('invalid server host config form loadProcess request: ' + JSON.stringify($scope.candidateServerConfig));
}
$scope.onLoadHost({host: $scope.currentServerConfig});
};
$scope.setProcesses = function(pids, refresh) {
$scope.processes = pids.filter(function(process) {
return process.serviceInstanceId === 1 && process.workerId > 0;
});
$scope.onUpdateProcesses({
processes: $scope.processes,
refresh: refresh
});
$scope.isRemoteValid = $scope.processes.length > 0;
return $scope.processes;
};
$scope.initServerProcesses = function(serverConfig, ServiceId) {
growl.addInfoMessage('retrieving server processes', {ttl:2000});
$scope.activeProcess = null;
$scope.selectedPMHost = ManagerServices.processHostStatus(serverConfig);
// make sure selected host is working
return PMHostService.getFirstPMInstance($scope.selectedPMHost, function(err, instance) {
if(err) {
$log.warn('bad get first pm instance: ' + JSON.stringify(err));
$log.warn('invalid PM server values');
growl.addWarnMessage('invalid PM server values');
return;
}
if (instance && !$scope.selectedPMHost.status.isProblem) {
var refresh = function() {
var deferred = $q.defer();
instance.processes(function(err, rawProcesses) {
if (err) {
$log.warn('bad get processes: ' + err.message);
return [];
}
var returnProcesses = [];
//filter out dead pids and supervisor
returnProcesses = rawProcesses.filter(function(process){
return (!process.stopTime && (process.workerId !== 0));
});
for (var i = 0;i < returnProcesses.length;i++) {
returnProcesses[i].status = 'Running';
}
deferred.resolve(returnProcesses);
});
return deferred.promise;
};
refresh().then(function(processes) {
$scope.setProcesses(processes, refresh);
//activate first process
if (processes.length > 0) {
$scope.setActiveProcess(processes[0], false);
}
});
}
else {
$log.warn('invalid PM server values');
growl.addWarnMessage('invalid PM server values');
}
$scope.isLoading = false;
});
};
$scope.setActiveProcess = function(process, isMoreClick){
if ( $scope.activeProcess && $scope.activeProcess.status !== 'Running' ) return false;
$scope.activeProcess = process;
$scope.isProcessFromMore = isMoreClick;
$scope.isRemoteValid = true;
};
}],
link: function(scope, el, attrs) {
scope.$watch('selectedPMHost', function(newHost) {
if (newHost.host) {
if (newHost.host !== scope.candidateServerConfig.host || newHost.port !== scope.candidateServerConfig.port) {
scope.candidateServerConfig = newHost;
}
scope.onLoadHost({host:newHost});
scope.initServerProcesses(newHost, scope.currentInstanceId);
}
}, true);
}
}
}
]);
PM.directive('slPmProcesses', [
function(){
return {
templateUrl: './scripts/modules/pm/templates/pm.processes.html',
scope: {
processes: '=',
multiple: '=',
showSupervisor: '=',
onUpdateSelection: '&'
},
controller: function($scope) {
$scope.selectCount = 0;
function updateSelection() {
$scope.onUpdateSelection({
selection: $scope.processes.filter(function(process) {
return process.isActive;
})
});
}
var selectProcess = function(process) {
if (!$scope.multiple) {
$scope.deselectAll();
}
if (!process.isActive) {
process.isActive = true;
$scope.selectCount++;
}
};
var deselectProcess = function(process) {
if (process.isActive) {
process.isActive = false;
$scope.selectCount--;
}
};
$scope.processHidden = function(process) {
return process.workerId > 0 || $scope.showSupervisor;
};
$scope.selectAll = function() {
$scope.processes.forEach(selectProcess);
updateSelection();
};
$scope.deselectAll = function() {
$scope.processes.forEach(deselectProcess);
updateSelection();
};
$scope.isActive = function(process) {
return process.isActive;
};
$scope.toggleSelect = function(process) {
if (!$scope.isActive(process)) {
selectProcess(process);
} else {
deselectProcess(process);
}
updateSelection();
};
}
};
}
]);
PM.directive('slPmPidSelector', [
'$log',
function($log){
return {
restrict: 'E',
replace: true,
transclude: true,
templateUrl: './scripts/modules/pm/templates/pm.pid.selector.html',
scope: {
onUpdateHost: '&',
onUpdateProcesses: '&',
onUpdateSelection: '&',
externalProcesses: '=',
showPidSelector: '=',
multiple: '='
},
controller: function($scope) {
$scope.processes = [];
$scope.isExternalProcesses = false;
$scope._showPidSelector = true;
$scope.$watch('showPidSelector', function(newVal) {
if (angular.isDefined(newVal)) {
$scope._showPidSelector = !!newVal;
}
});
$scope.updateProcesses = function(processes, refresh) {
if ($scope.isExternalProcesses){
return;
}
$scope.processes = processes;
$scope.onUpdateProcesses({
processes: processes,
refresh: refresh
});
};
// in case a component (tracing) needs to supply an external set of processes
// based on some additional filtering
$scope.$watch('externalProcesses', function(newVal) {
if (newVal !== undefined) {
$scope.isExternalProcesses = true;
$scope.processes = newVal;
}
}, true);
$scope.updateHost = function(host) {
$scope.onUpdateHost({
host: host
});
};
$scope.updateSelection = function(selection) {
$scope.onUpdateSelection({
selection: selection
});
};
}
}
}]);