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