github.com/hernad/nomad@v1.6.112/ui/app/components/job-version.js (about) 1 /** 2 * Copyright (c) HashiCorp, Inc. 3 * SPDX-License-Identifier: MPL-2.0 4 */ 5 6 import Component from '@ember/component'; 7 import { action, computed } from '@ember/object'; 8 import { classNames } from '@ember-decorators/component'; 9 import { inject as service } from '@ember/service'; 10 import { task } from 'ember-concurrency'; 11 import messageForError from 'nomad-ui/utils/message-from-adapter-error'; 12 import classic from 'ember-classic-decorator'; 13 14 const changeTypes = ['Added', 'Deleted', 'Edited']; 15 16 @classic 17 @classNames('job-version', 'boxed-section') 18 export default class JobVersion extends Component { 19 version = null; 20 isOpen = false; 21 22 // Passes through to the job-diff component 23 verbose = true; 24 25 @service router; 26 27 @computed('version.diff') 28 get changeCount() { 29 const diff = this.get('version.diff'); 30 const taskGroups = diff.TaskGroups || []; 31 32 if (!diff) { 33 return 0; 34 } 35 36 return ( 37 fieldChanges(diff) + 38 taskGroups.reduce(arrayOfFieldChanges, 0) + 39 (taskGroups.mapBy('Tasks') || []) 40 .reduce(flatten, []) 41 .reduce(arrayOfFieldChanges, 0) 42 ); 43 } 44 45 @computed('version.{number,job.version}') 46 get isCurrent() { 47 return this.get('version.number') === this.get('version.job.version'); 48 } 49 50 @action 51 toggleDiff() { 52 this.toggleProperty('isOpen'); 53 } 54 55 @task(function* () { 56 try { 57 const versionBeforeReversion = this.get('version.job.version'); 58 59 yield this.version.revertTo(); 60 yield this.version.job.reload(); 61 62 const versionAfterReversion = this.get('version.job.version'); 63 64 if (versionBeforeReversion === versionAfterReversion) { 65 this.handleError({ 66 level: 'warn', 67 title: 'Reversion Had No Effect', 68 description: 69 'Reverting to an identical older version doesn’t produce a new version', 70 }); 71 } else { 72 const job = this.get('version.job'); 73 this.router.transitionTo('jobs.job.index', job.get('idWithNamespace')); 74 } 75 } catch (e) { 76 this.handleError({ 77 level: 'danger', 78 title: 'Could Not Revert', 79 description: messageForError(e, 'revert'), 80 }); 81 } 82 }) 83 revertTo; 84 } 85 86 const flatten = (accumulator, array) => accumulator.concat(array); 87 const countChanges = (total, field) => 88 changeTypes.includes(field.Type) ? total + 1 : total; 89 90 function fieldChanges(diff) { 91 return ( 92 (diff.Fields || []).reduce(countChanges, 0) + 93 (diff.Objects || []).reduce(arrayOfFieldChanges, 0) 94 ); 95 } 96 97 function arrayOfFieldChanges(count, diff) { 98 if (!diff) { 99 return count; 100 } 101 102 return count + fieldChanges(diff); 103 }