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  }