Advertisement
Guest User

Autosave

a guest
Jul 3rd, 2015
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. define(['angular', 'lodash'], function(angular, _) {
  2.   'use strict';
  3.  
  4.   return [AutoSave];
  5.  
  6.   function AutoSave() {
  7.  
  8.     var _this = this;
  9.  
  10.     _this.wait      = 10000;
  11.     _this.maxErrors = 2;
  12.  
  13.  
  14.     _this.$get = ['$interval', '$http', '$rootScope', 'slvConfig', 'formValidator', function($interval, $http, $rootScope, slvConfig, formValidator) {
  15.  
  16.       var _interval       = {},
  17.           _watcherCancel  = {},
  18.           _paused         = {},
  19.           _pausedAll      = false,
  20.           _dataChanged    = {},
  21.           _url            = {},
  22.           _resource       = {},
  23.           _data           = {},
  24.           _ctrlParams     = {},
  25.           _queryParams    = {},
  26.           _saveErrors     = {},
  27.           _formList       = {},
  28.           _formValidation = false,
  29.           _debug          = false;
  30.  
  31.       return {
  32.         register             : register,
  33.         enableFormValidation : enableFormValidation,
  34.         stopFormValidation   : stopFormValidation,
  35.         start                : register,
  36.         setParams            : setParams,
  37.         stop                 : stop,
  38.         pause                : pause,
  39.         resume               : resume,
  40.         force                : force,
  41.         debug                : debug
  42.       };
  43.  
  44.       function register(scope, context, name, urlOrResource) {
  45.  
  46.         _data[name]          = context[name];
  47.         _saveErrors[name]    = 0;
  48.  
  49.         if (urlOrResource && _.isString(urlOrResource)) {
  50.           _url[name] = urlOrResource;
  51.         } else {
  52.           _resource[name] = context[name];
  53.         }
  54.  
  55.         _setCtrlParams(scope, context, name);
  56.         _watcherCancel[name] = _watch(scope, context, name);
  57.  
  58.         _interval[name] = $interval(function() {
  59.           if (_validForms()) {
  60.             _save(name);
  61.           }
  62.         }, _this.wait);
  63.       }
  64.  
  65.       function enableFormValidation(name, formList) {
  66.         _formValidation = true;
  67.         _formList[name] = formList;
  68.       }
  69.  
  70.       function stopFormValidation(name) {
  71.         _formValidation = false;
  72.         if (name) {
  73.           delete _formList[name];
  74.         } else {
  75.           _formList = {};
  76.         }
  77.       }
  78.  
  79.       function setParams(name, params) {
  80.         if (name !== undefined) {
  81.           if (params !== undefined) {
  82.             _queryParams[name] = params;
  83.           } else if (name !== undefined) {
  84.             delete _queryParams[name];
  85.           }
  86.           return _queryParams[name];
  87.         }
  88.       }
  89.  
  90.       function stop(name, override, save) {
  91.  
  92.         if (arguments.length === 0) {
  93.  
  94.           _stop(undefined, undefined, undefined);
  95.  
  96.         } else if (arguments.length === 1) {
  97.  
  98.           if (_.isString(name)) {
  99.             _stop(name, undefined, undefined);
  100.           } else if (_.isObject(name)) {
  101.             _stop(undefined, name, undefined);
  102.           } else if (_.isBoolean(name)) {
  103.             _stop(undefined, undefined, name);
  104.           }
  105.  
  106.         } else if (arguments.length === 2) {
  107.  
  108.           if (_.isString(name)) {
  109.             if (_.isObject(override)) {
  110.               _stop(name, override, undefined);
  111.             } else if (_.isBoolean(override)) {
  112.               _stop(name, undefined, override);
  113.             }
  114.           } else if (_.isObject(name)) {
  115.             _stop(undefined, name, override);
  116.           }
  117.  
  118.         } else {
  119.           _stop(name, override, save);
  120.         }
  121.       }
  122.  
  123.       function _stop(name, override, save) {
  124.  
  125.         if (_.isUndefined(name)) {
  126.           _.forIn(_interval, function(interval, key) {
  127.             _stop(key, override, save);
  128.           });
  129.         } else {
  130.           if (_.isObject(override)) {
  131.             setParams(name, override);
  132.           }
  133.           if (_.isUndefined(save) || save === true) {
  134.             _save(name, true);
  135.           }
  136.           $interval.cancel(_interval[name]);
  137.           if (_watcherCancel[name]) {
  138.             _watcherCancel[name]();
  139.           }
  140.           delete _watcherCancel[name];
  141.           delete _data[name];
  142.           delete _url[name];
  143.           delete _resource[name];
  144.           delete _saveErrors[name];
  145.           delete _queryParams[name];
  146.           delete _ctrlParams[name];
  147.           stopFormValidation(name);
  148.           _debugLog('Stopped autosave for : ' + name);
  149.         }
  150.  
  151.       }
  152.  
  153.       function pause(name) {
  154.         if (name === undefined) {
  155.           _pausedAll = true;
  156.         } else {
  157.           _paused[name] = true;
  158.         }
  159.       }
  160.  
  161.       function resume(name) {
  162.         if (name === undefined) {
  163.           _pausedAll = false;
  164.         } else {
  165.           delete _paused[name];
  166.         }
  167.       }
  168.  
  169.       function force(name) {
  170.         console.log('Forcing', name);
  171.         if (name !== undefined) {
  172.           _save(name, true);
  173.         } else {
  174.           _.forIn(_interval, function(value, key) {
  175.             force(key);
  176.           });
  177.         }
  178.       }
  179.  
  180.       function debug(state) {
  181.         _debug = state !== false;
  182.         console.log({
  183.           debug    : _debug,
  184.           interval : _interval,
  185.           paused   : _paused,
  186.           url      : _url,
  187.           data     : _data
  188.         });
  189.       }
  190.  
  191.       function _watch(scope, context, name) {
  192.         return scope.$watch(angular.bind(context, function() {
  193.           return this[name];
  194.         }), function(newVal, oldVal) {
  195.           if (newVal !== oldVal) {
  196.             _change(name, newVal);
  197.           }
  198.           if (_debug) {
  199.             console.log('change detected : ' + name);
  200.           }
  201.         }, true);
  202.       }
  203.  
  204.       function _change(name, newVal) {
  205.         _dataChanged[name] = true;
  206.         _saveErrors[name]  = 0;
  207.         _data[name]        = newVal;
  208.       }
  209.  
  210.       function _save(name, forceSave) {
  211.         if (((!_pausedAll && !_paused[name] &&
  212.           _dataChanged[name]) ||
  213.           forceSave === true) &&
  214.           _formsValidate(name)) {
  215.           if (_url[name]) {
  216.             _debugLog('autoSaved with url:', _data[name]);
  217.             $http.put(slvConfig.wsBase + _url[name] + _setUrlParams(name)).then(_successSave(name), _errorSave(name));
  218.           } else if (_resource[name]) {
  219.             _debugLog('autoSaved with restangular:', _resource[name]);
  220.             _resourceCheckSave(name);
  221.           }
  222.         }
  223.       }
  224.  
  225.       function _formsValidate(name) {
  226.         if (_formValidation) {
  227.           if (formValidator.formsValid(_ctrlParams[name].context, _formList[name])) {
  228.             return true;
  229.           } else {
  230.             _debugLog('Not saved because forms are not valid !');
  231.             return false;
  232.           }
  233.         }
  234.         return true;
  235.       }
  236.  
  237.       function _resourceCheckSave(name) {
  238.         if (_resource[name].put !== undefined) {
  239.           _resource[name].put(_queryParams[name]).then(_successSave(name), _errorSave(name));
  240.         } else {
  241.           _dataChanged[name] = false;
  242.         }
  243.       }
  244.  
  245.       function _setUrlParams(name) {
  246.         var urlString = '';
  247.         _.forIn(_queryParams[name], function(value, key) {
  248.           var paramString = key + '=' + value;
  249.           if (urlString !== '') {
  250.             urlString += '&';
  251.           }
  252.           urlString += paramString;
  253.         });
  254.         return urlString !== '' ? '?' + urlString : '';
  255.       }
  256.  
  257.       function _setCtrlParams(scope, context, name) {
  258.         _ctrlParams[name]         = _ctrlParams[name] || {};
  259.         _ctrlParams[name].context = context;
  260.         _ctrlParams[name].scope   = scope;
  261.       }
  262.  
  263.       function _successSave(name) {
  264.         return function(data) {
  265.           _dataChanged[name] = false;
  266.           $rootScope.$broadcast('newSave', {
  267.             name    : name,
  268.             error   : false,
  269.             message : 'Success',
  270.             data    : data
  271.           });
  272.         };
  273.       }
  274.  
  275.       function _errorSave(name) {
  276.         return function(err) {
  277.           $rootScope.$broadcast('newSave', {
  278.             name    : name,
  279.             error   : true,
  280.             message : 'Error',
  281.             data    : err
  282.           });
  283.           _errorIncrement(name);
  284.         };
  285.       }
  286.  
  287.       function _validForms() {
  288.         return _formValidation ?
  289.           formValidator.formsValid() :
  290.           true;
  291.       }
  292.  
  293.       function _debugLog(title, data) {
  294.         if (_debug) {
  295.           console.log(title);
  296.           if (data) {
  297.             console.log(data);
  298.           }
  299.         }
  300.       }
  301.  
  302.       function _errorIncrement(name) {
  303.         _saveErrors[name]++;
  304.         if (_saveErrors[name] >= _this.maxErrors) {
  305.           _dataChanged[name] = false;
  306.           _saveErrors[name]  = 0;
  307.         }
  308.       }
  309.     }];
  310.   }
  311. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement