markdown-note/markdown-notes

View on GitHub
src/common/utility.js

Summary

Maintainability
C
1 day
Test Coverage
'use strict';

var _i18n = require('i18n');
var _ejs = require('ejs');
var _fs = require('fs');

// Custom
var _appConfig = require(__dirname + '/../../config.js');
var _appError = require(_appConfig.commonsPath + 'app-error.js');

_i18n.configure(_appConfig.i18nConfiguration);

var Utility = function() {
  var loadPartial = function(partialName, data, callback) {
    loadTemplateFile(partialName, false, data, callback);
  };

  var loadDialog = function(dialogName, data, callback) {
    loadTemplateFile(dialogName, true, data, callback);
  };

  function loadTemplateFile(fileName, isDialog, data, callback) {
    try {
      if (typeof data === 'undefined' || !data) {
        data = {
          AppUtil: new Utility(),
          i18n: _i18n,
          basePath: _appConfig.basePath
        };
      } else {
        data.AppUtil = new Utility();
        data.i18n = _i18n;
        data.basePath = _appConfig.basePath;
      }
      var fileToLoad = '';
      if (isDialog) {
        fileToLoad = _appConfig.dialogsPath + fileName;
      } else {
        fileToLoad = _appConfig.partialsPath + fileName;
      }
      _fs.readFile(fileToLoad, 'utf-8', function(err, htmlFile) {
        if (err) {
          data.AppUtil = null;
          return callback(new _appError(err, _i18n.__('error.partial_load_error', fileToLoad)));
        }
        var tmpl = _ejs.compile(htmlFile);
        var str = tmpl(data);
        data.AppUtil = null;

        return callback(null, str);
      });
    } catch (e) {
      return callback(new _appError(e, _i18n.__('error.partial_load_error', fileName)));
    }
  }

  var mvFile = function(oldPath, newPath, cbMain) {
    var source = _fs.createReadStream(oldPath);
    var dest = _fs.createWriteStream(newPath);

    source.pipe(dest);
    source.on('end', function() {
      _fs.unlink(oldPath, function(err) {
        if (err) {
          return cbMain(new _appError(err, 'There was an error while moving the file.'));
        }
        return cbMain();
      });
    });

    source.on('error', function(err) {
      return cbMain(new _appError(err, 'There was an error while moving the file.'));
    });
  };

  function checkAndInsertDialog(err, html, errMsg) {
    if (err) {
      var errParse = new _appError(err, errMsg, false, true);
      errParse.display();
      return false;
    }
    document.querySelector('body').insertAdjacentHTML('beforeend', html);
    return true;
  }

  function addCloseEvent($dlg, cbOnClose) {
    $dlg.on('hidden.bs.modal', function() {
      $dlg.off('hidden.bs.modal');
      if (cbOnClose) {
        cbOnClose();
      }
      $dlg = null;
      this.remove();
    });
  }

  function readFormData(formElements) {
    var formData = {};
    // TODO Perform validation based on the classes / data attributes.
    for (var i = 0, len = formElements.length; i !== len; ++i) {
      var elem = formElements[i];
      if (elem.type === 'button' || elem.name === "") {
        continue;
      }
      var ctrlName = elem.name;
      var ctrlVal = elem.value;
      if (ctrlVal) {
        formData[ctrlName] = ctrlVal;
      }
    }
    return formData;
  }

  function checkDates(dtFirst, dtSecond) {
    var dtFirstString = getDateString(dtFirst);
    var dtSecondString = getDateString(dtSecond);

    if (dtFirstString < dtSecondString) {
      return -1;
    }

    if (dtFirstString === dtSecondString) {
      return 0;
    }

    if (dtFirstString > dtSecondString) {
      return 1;
    }

    return false;
  }

  function getDateString(dt) {
    var month = dt.getMonth() + 1;
    month = month < 10 ? '0' + month : month;

    var date = dt.getDate();
    date = date < 10 ? '0' + date : date;

    var year = dt.getFullYear();

    return '' + year + month + date;
  }

  return {
    loadPartial: loadPartial,
    loadDialog: loadDialog,
    mvFile: mvFile,
    checkAndInsertDialog: checkAndInsertDialog,
    addCloseEvent: addCloseEvent,
    readFormData: readFormData,
    checkDates: checkDates
  };
};

module.exports = new Utility();