aymerick/kowa-client

View on GitHub
app/components/bs-datetimepicker.js

Summary

Maintainability
D
1 day
Test Coverage

import Ember from 'ember';
import DateTimePickerTextFieldMixin from 'ember-bootstrap-datetimepicker/mixins/datetimepicker_textfield';

var computed = Ember.computed;
var datetimepickerDefaultConfig = Ember.$.fn.datetimepicker.defaults;
var isDatetimepickerConfigKeys = Ember.keys(datetimepickerDefaultConfig);

var bsDateTimePickerComponent = Ember.Component.extend({
  concatenatedProperties: ["textFieldClassNames"],
  classNames: ["date"],
  classNameBindings: ["inputGroupClass"],
  textFieldClass: Ember.TextField.extend(DateTimePickerTextFieldMixin),
  textFieldClassNames: ["form-control"],
  textFieldName: computed.alias("elementId"),
  textFieldOptions:null,
  date: null,
  bsDateTimePicker: null,

  //computed options
  minDate: datetimepickerDefaultConfig["minDate"],
  maxDate: datetimepickerDefaultConfig["maxDate"],
  disabledDates:[],
  enabledDates:[],
  dateIcon: "glyphicon glyphicon-calendar",

  disabled:false,
  open: false,
  forceDateOutput: false,

  _initDatepicker: Ember.on('didInsertElement', function() {
    var target;
    var self = this;
    if (this.get('noIcon')) {
      var targetClassNames = '.'+ this.get('textFieldClassNames').join('.');
      target = this.$(targetClassNames);
    } else {
      target = this.$();
    }
    var bsDateTimePicker = target.datetimepicker(this._buildConfig());
    var bsDateTimePickerFn = bsDateTimePicker.data("DateTimePicker");

    this.set('bsDateTimePicker', bsDateTimePickerFn);
    if(self.get("date") === undefined) {
      bsDateTimePickerFn.date(null);
    } else {
      bsDateTimePickerFn.date(self.get("date"));
    }


    bsDateTimePicker.on("dp.change", function(ev) {
      if(Ember.isNone(ev.date) || (ev.date === false)) {
        self.set("date", undefined);
      } else if (!ev.date.isSame(self.get('date'))) {
        if(self.forceDateOutput) {
          self.set("date", ev.date.toDate());
        } else {
          self.set("date", ev.date);
        }
      }
    });

    this._disabledObserver();

    if(self.get("open")) {
      self.get("bsDateTimePicker").show();
    }
  }),



  _disabledObserver: Ember.observer('disabled', function() {
    if(this.get("disabled")) {
      this.get("bsDateTimePicker").disable();
    } else {
      this.get("bsDateTimePicker").enable();
    }
  }),

  _openObserver: Ember.observer('open', function() {
    if(this.get("open")) {
      this.get("bsDateTimePicker").show();
    } else {
      this.get("bsDateTimePicker").hide();
    }
  }),

  _minDateObserver: Ember.observer('minDate', function() {
    if(Ember.isNone(this.get('minDate'))) {
      this.get("bsDateTimePicker").minDate(false);
    } else {
      this.get("bsDateTimePicker").minDate(this.get('minDate'));
    }
  }),

  _maxDateObserver: Ember.observer('maxDate', function() {
    if(Ember.isNone(this.get('maxDate'))) {
      this.get("bsDateTimePicker").maxDate(false);
    } else {
      this.get("bsDateTimePicker").maxDate(this.get('maxDate'));
    }
  }),

  _disabledDatesObserver: Ember.observer('disabledDates', function() {
    this.get("bsDateTimePicker").disabledDates(this.get('disabledDates'));
  }),

  _enabledDatesObserver: Ember.observer('enabledDates', function() {
    this.get("bsDateTimePicker").enabledDates(this.get('enabledDates'));
  }),

  _dateObserver: Ember.observer('date', function() {
    var bsDateTimePickerFn = this.get("bsDateTimePicker");

    if(this.get("date") === undefined) {
      bsDateTimePickerFn.date(null);
    } else {
      bsDateTimePickerFn.date(this.get("date"));
    }

  }),

  _destroyDatepicker: Ember.on('willDestroyElement', function() {
    this.get("bsDateTimePicker").destroy();
  }),

  _buildConfig: function() {
    var config = {};
    for(var i=0; i< isDatetimepickerConfigKeys.length; i++) {
      config[isDatetimepickerConfigKeys[i]] = this.get(isDatetimepickerConfigKeys[i]);
    }
    return config;
  },

  inputGroupClass: Ember.computed(function() {
    if(!this.get('noIcon')) {
      return 'input-group';
    }

  }),

  /**

    Exposing the textField properties.
    Every property beginning with "textField" will be exposed to the TextField view.

    ```handlebars
    {{bs-datetimepicker textFieldPlaceholder="Date"}}
    ```
    "textFieldPlaceholder" will be exposed to the TextField as "placeholder" property.

  */
  setUnknownProperty: function(key, value){
    var prop;
    var ckey;
    if(key.indexOf("textField") === 0) {

      if(Ember.isNone(this.get('textFieldOptions'))) {
        this.set('textFieldOptions',{});
      }

      if(Ember.IS_BINDING.test(key)) {
        prop = key.substring(0,key.length-7);
      }
      else {
       prop = key.substring(0,key.length);
      }

      ckey = prop.substring(9);
      ckey = ckey.charAt(0).toLowerCase() + ckey.substr(1);

      if(Ember.isNone(this.get('textFieldOptions.'+prop))) {

        this.set('textFieldOptions.'+prop,ckey);

        Ember.defineProperty(this, prop, null, value);
      }
    }
    else {
      if(Ember.platform.hasPropertyAccessors) {
        Ember.defineProperty(this, key, null, value);
      }
      else {
        this[key] = value;
      }
    }
  }
});


var computedProps = Ember.A(["minDate","maxDate","disabledDates","enabledDates","dateIcon"]);
var newClassConfig = {};
for(var i=0; i<isDatetimepickerConfigKeys.length; i++) {
  if(!computedProps.contains(isDatetimepickerConfigKeys[i])) {
    newClassConfig[isDatetimepickerConfigKeys[i]] = datetimepickerDefaultConfig[isDatetimepickerConfigKeys[i]];
  }
}

bsDateTimePickerComponent.reopen(newClassConfig);


export default bsDateTimePickerComponent;