blob: c883a11effc712a84ad7e186788a88e52d7d3553 [file]
/*
* 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 './job/job.component';
import {JobManagerFilter} from './jobmanager.filter';
import {JobManagerService} from './jobmanager.service';
import {getJobIconByStatus, getJobColorByStatus} from './job-status';
angular.module('zeppelinWebApp')
.controller('JobManagerCtrl', JobManagerController)
.filter('JobManager', JobManagerFilter)
.service('JobManagerService', JobManagerService);
const JobDateSorter = {
RECENTLY_UPDATED: 'Recently Update',
OLDEST_UPDATED: 'Oldest Updated',
};
function JobManagerController($scope, ngToast, JobManagerFilter, JobManagerService) {
'ngInject';
$scope.isFilterLoaded = false;
$scope.jobs = [];
$scope.sorter = {
availableDateSorter: Object.keys(JobDateSorter).map((key) => {
return JobDateSorter[key];
}),
currentDateSorter: JobDateSorter.RECENTLY_UPDATED,
};
$scope.filteredJobs = $scope.jobs;
$scope.filterConfig = {
isRunningAlwaysTop: true,
noteNameFilterValue: '',
interpreterFilterValue: '*',
isSortByAsc: true,
};
$scope.pagination = {
currentPage: 1,
itemsPerPage: 10,
maxPageCount: 5,
};
ngToast.dismiss();
init();
/** functions */
$scope.setJobDateSorter = function(dateSorter) {
$scope.sorter.currentDateSorter = dateSorter;
};
$scope.getJobsInCurrentPage = function(jobs) {
const cp = $scope.pagination.currentPage;
const itp = $scope.pagination.itemsPerPage;
return jobs.slice((cp - 1) * itp, (cp * itp));
};
let asyncNotebookJobFilter = function(jobs, filterConfig) {
return new Promise((resolve, reject) => {
// eslint-disable-next-line new-cap
$scope.filteredJobs = JobManagerFilter(jobs, filterConfig);
resolve($scope.filteredJobs);
});
};
$scope.$watch('sorter.currentDateSorter', function() {
$scope.filterConfig.isSortByAsc =
$scope.sorter.currentDateSorter === JobDateSorter.OLDEST_UPDATED;
asyncNotebookJobFilter($scope.jobs, $scope.filterConfig);
});
$scope.getJobIconByStatus = getJobIconByStatus;
$scope.getJobColorByStatus = getJobColorByStatus;
$scope.filterJobs = function(jobs, filterConfig) {
asyncNotebookJobFilter(jobs, filterConfig)
.then(() => {
$scope.isFilterLoaded = true;
})
.catch((error) => {
console.error('Failed to search jobs from server', error);
});
};
$scope.filterValueToName = function(filterValue, maxStringLength) {
if (typeof $scope.defaultInterpreters === 'undefined') {
return;
}
let index = $scope.defaultInterpreters.findIndex((intp) => intp.value === filterValue);
if (typeof $scope.defaultInterpreters[index].name !== 'undefined') {
if (typeof maxStringLength !== 'undefined' &&
maxStringLength > $scope.defaultInterpreters[index].name) {
return $scope.defaultInterpreters[index].name.substr(0, maxStringLength - 3) + '...';
}
return $scope.defaultInterpreters[index].name;
} else {
return 'NONE';
}
};
$scope.setFilterValue = function(filterValue) {
$scope.filterConfig.interpreterFilterValue = filterValue;
$scope.filterJobs($scope.jobs, $scope.filterConfig);
};
$scope.setJobs = function(jobs) {
$scope.jobs = jobs;
let interpreters = $scope.jobs
.filter((j) => typeof j.interpreter !== 'undefined')
.map((j) => j.interpreter);
interpreters = [...new Set(interpreters)]; // remove duplicated interpreters
$scope.defaultInterpreters = [{name: 'ALL', value: '*'}];
for (let i = 0; i < interpreters.length; i++) {
$scope.defaultInterpreters.push({name: interpreters[i], value: interpreters[i]});
}
};
function init() {
JobManagerService.getJobs();
JobManagerService.subscribeSetJobs($scope, setJobsCallback);
JobManagerService.subscribeUpdateJobs($scope, updateJobsCallback);
$scope.$on('$destroy', function() {
JobManagerService.disconnect();
});
}
/*
** $scope.$on functions below
*/
function setJobsCallback(event, response) {
const jobs = response.jobs;
$scope.setJobs(jobs);
$scope.filterJobs($scope.jobs, $scope.filterConfig);
}
function updateJobsCallback(event, response) {
let jobs = $scope.jobs;
let jobByNoteId = jobs.reduce((acc, j) => {
const noteId = j.noteId;
acc[noteId] = j;
return acc;
}, {});
let updatedJobs = response.jobs;
updatedJobs.map((updatedJob) => {
if (typeof jobByNoteId[updatedJob.noteId] === 'undefined') {
let newItem = angular.copy(updatedJob);
jobs.push(newItem);
jobByNoteId[updatedJob.noteId] = newItem;
} else {
let job = jobByNoteId[updatedJob.noteId];
if (updatedJob.isRemoved === true) {
delete jobByNoteId[updatedJob.noteId];
let removeIndex = jobs.findIndex((j) => j.noteId === updatedJob.noteId);
if (removeIndex) {
jobs.splice(removeIndex, 1);
}
} else {
// update the job
job.isRunningJob = updatedJob.isRunningJob;
job.noteName = updatedJob.noteName;
job.noteType = updatedJob.noteType;
job.interpreter = updatedJob.interpreter;
job.unixTimeLastRun = updatedJob.unixTimeLastRun;
job.paragraphs = updatedJob.paragraphs;
}
}
});
$scope.filterJobs(jobs, $scope.filterConfig);
}
}