JobNotifier.onNotify = function(result) { DEFAULT_MESSAGES = { finished: { title: 'Completed Job', one: '1 job was successfully completed!', other: 'jobs were successfully completed!' }, failed: { title: 'Failed Job', one: '1 job was completed, but it contains errors...', other: 'jobs were completed, but they contains errors...' } }; function findTranslation(jobClass, status, key) { try { var translations = getTranslations(); return translations[jobClass][status][key]; } catch(err) { console.info('Translation not found. Using default...', jobClass, status, key); } return DEFAULT_MESSAGES[status][key]; } function camelToDash(str) { var parts = str.split('::'); str = parts[parts.length - 1].replace(/\W+/g, '_'); return str.replace(/([a-z\d])([A-Z])/g, '$1_$2').toLowerCase(); } function getTranslations() { var body = document.querySelector('body'); return JSON.parse(body.dataset.translations); } function getJobsUrl() { var body = document.querySelector('body'); return body.dataset.jobsUrl; } function prepareMessage(job, count) { var jobClass = camelToDash(job.job_class); var jobsUrl = getJobsUrl(); var msg = ''; if(count == 1) { jobsUrl += '/' + job.id; msg = findTranslation(jobClass, job.status, 'one'); } else { msg = count + ' ' + findTranslation(jobClass, job.status, 'other'); } var link = '<a href="' + jobsUrl + '">' + msg + '</a>'; return { title: findTranslation(jobClass, job.status, 'title'), message: link, duration: 6000 }; } function showPopUp(job, count) { var msg = prepareMessage(job, count); switch(job.status) { case 'finished': $.growl.notice(msg); break; case 'failed': $.growl.error(msg); break; default: console.error('Invalid job status given', job.status); } } function groupJobsByClass(jobs) { var groupedJobs = {}; for(i = 0; i < jobs.length; i++) { var job = jobs[i]; if(job.status == 'pending') { continue; } var jobClass = camelToDash(job.job_class); if(!groupedJobs[jobClass]) { groupedJobs[jobClass] = {}; } if(!groupedJobs[jobClass][job.status]) { groupedJobs[jobClass][job.status] = []; } groupedJobs[jobClass][job.status].push(job); } return groupedJobs; } function showMsg(jobs) { if(jobs.length === 0) { return; } var groupedJobs = groupJobsByClass(jobs); for(var jobClass in groupedJobs) { if(groupedJobs.hasOwnProperty(jobClass)) { for(var status in groupedJobs[jobClass]) { if(groupedJobs[jobClass].hasOwnProperty(status)) { jobs = groupedJobs[jobClass][status]; showPopUp(jobs[0], jobs.length); } } } } } showMsg(result); };