kellyselden/ember-cli-dirty-confirm

View on GitHub
addon/utils/check-model-for-dirty.js

Summary

Maintainability
A
1 hr
Test Coverage
import Ember from 'ember';

const { isArray } = Ember;

var ABORT = 0;
var ROLLBACK = 1;
var BUBBLE = 2;

function addDirtyModel(dirtyModels, model) {
  if (!isArray(model)) {
    model = [model];
  }

  model.forEach(m => {
    var hasDirtyAttributes = m.get('hasDirtyAttributes');

    // backward compatibility
    if ((hasDirtyAttributes === undefined && m.get('isDirty')) || hasDirtyAttributes) {
      dirtyModels.push(m);
    }
  });
}

function getDirtyModels(model, dirtyRelationships) {
  var dirtyModels = [];
  addDirtyModel(dirtyModels, model);
  dirtyRelationships.forEach(prop => addDirtyModel(dirtyModels, model.get(prop)));
  return dirtyModels;
}

export default function checkModelForDirty(model, dirtyRelationships, dirtyMessage, transition, continueRollingBack) {
  var dirtyModels = getDirtyModels(model, dirtyRelationships);
  if (dirtyModels.length && !model.get('isSaving')) {
    // continueRollingBack if an earlier model in a collection was rolled back
    if (!continueRollingBack && !confirm(dirtyMessage)) {
      if (transition) {
        transition.abort();
      }

      return ABORT;
    }
    dirtyModels.forEach(dirtyModel => {
      // backward compatibility
      if (dirtyModel.rollbackAttributes !== undefined) {
        dirtyModel.rollbackAttributes();
        return;
      }

      dirtyModel.rollback();
    });

    return ROLLBACK;
  }

  return BUBBLE;
}