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  }