Source: e2e/fields/DateTimeField.js

'use strict';

/**
 * @module e2e/fields/DateTimeField
 */

var util = require('util');
var Field = process.requireTest('lib/e2e/fields/Field.js');
var browserExt = process.requireTest('lib/e2e/browser.js');

/**
 * Defines a form date / time field.
 *
 * Use [Field.get]{@link module:e2e/fields/Field~Field.get} method to get an instance of DateTimeField.
 *
 * @example
 * var Field = require('@openveo/test').e2e.fields.Field;
 *
 * var myTextField = Field.get({
 *   type: 'dateTime',
 *   name: 'My field',
 *   baseElement: element(by.css('form'))
 * });
 *
 * @class DateTimeField
 * @extends module:e2e/fields/Field~Field
 * @constructor
 * @param {Object} conf A field configuration object
 */
function DateTimeField(conf) {
  DateTimeField.super_.call(this, conf);

  Object.defineProperties(this,

    /** @lends module:e2e/fields/DateTimeField~DateTimeField */
    {

      /**
       * Date input locator.
       *
       * @type {Object}
       * @instance
       * @readonly
       */
      dateInputLocator: {value: by.css('input[uib-datepicker-popup]')},

      /**
       * Hours input locator.
       *
       * @type {Object}
       * @instance
       * @readonly
       */
      hoursInputLocator: {value: by.css('.hours input')},

      /**
       * Minutes input locator.
       *
       * @type {Object}
       * @instance
       * @readonly
       */
      minutesInputLocator: {value: by.css('.minutes input')}

    }

  );
}

module.exports = DateTimeField;
util.inherits(DateTimeField, Field);

/**
 * Gets field value.
 *
 * @example
 * myField.getValue().then(function(date) {
 *   console.log('Got value : ' + date);
 * });
 *
 * @return {Promise} Promise resolving with field value
 */
DateTimeField.prototype.getValue = function() {
  var self = this;

  return this.getElement().then(function(elementFinder) {
    var inputDateElement = elementFinder.element(self.dateInputLocator);
    var inputHoursElement = elementFinder.element(self.hoursInputLocator);
    var inputMinutesElement = elementFinder.element(self.minutesInputLocator);

    return protractor.promise.all([
      browserExt.getProperty(inputDateElement, 'value'),
      browserExt.getProperty(inputHoursElement, 'value'),
      browserExt.getProperty(inputMinutesElement, 'value')
    ]);

  }).then(function(results) {
    var date = new Date(results[0]);
    date.setHours(results[1] || 0);
    date.setMinutes(results[2] || 0);
    date.setSeconds(0);

    return protractor.promise.fulfilled(date);
  });
};

/**
 * Sets field value.
 *
 * @example
 * myField.setValue(new Date('2018-05-16 17:56:00')).then(function() {
 *   console.log('Value set');
 * });
 *
 * @param {Date} [value=null] Field's value
 * @return {Promise} Promise resolving when the field is filled
 */
DateTimeField.prototype.setValue = function(value) {
  var self = this;
  var inputDateElement;
  var inputHoursElement;
  var inputMinutesElement;

  if (!value) return this.clear();

  return this.getElement().then(function(elementFinder) {
    inputDateElement = elementFinder.element(self.dateInputLocator);
    inputHoursElement = elementFinder.element(self.hoursInputLocator);
    inputMinutesElement = elementFinder.element(self.minutesInputLocator);
    return self.clear();
  }).then(function() {
    return browser.executeScript(
      'var $injector = angular.injector([\'ng\']);' +
      'var $filter = $injector.get(\'$filter\');' +
      'return $filter(\'date\')(' + value.getTime() + ', \'shortDate\');'
    );
  }).then(function(shortDate) {
    return protractor.promise.all([
      Field.setInputValue(inputDateElement, shortDate),
      Field.setInputValue(inputHoursElement, value.getHours()),
      Field.setInputValue(inputMinutesElement, value.getMinutes())
    ]);
  });
};

/**
 * Clears field value.
 *
 * @example
 * myField.clear().then(function() {
 *   console.log('Field cleared');
 * });
 *
 * @return {Promise} Promise resolving when the field is cleared
 */
DateTimeField.prototype.clear = function() {
  var self = this;

  return this.getElement().then(function(elementFinder) {
    var inputDateElement = elementFinder.element(self.dateInputLocator);
    var inputHoursElement = elementFinder.element(self.hoursInputLocator);
    var inputMinutesElement = elementFinder.element(self.minutesInputLocator);
    return protractor.promise.all([
      inputDateElement.clear(),
      inputHoursElement.clear(),
      inputMinutesElement.clear()
    ]);
  });
};

/**
 * Tests if a field is considered as on error.
 *
 * @example
 * myField.isOnError().then(function(isOnError) {
 *   console.log('Is field on error ? ' + isOnError);
 * });
 *
 * @return {Promise} Promise resolving with a boolean indicating if the field is on error
 */
DateTimeField.prototype.isOnError = function() {
  return this.getElement().then(function(elementFinder) {
    return elementFinder.getAttribute('class').then(function(classes) {
      var errorClass = 'has-error';
      var reg = new RegExp('^' + errorClass + ' |' + errorClass + ' |' + errorClass + ' |' + errorClass + '$');
      return protractor.promise.fulfilled(reg.test(classes));
    });
  });
};