decide.nolog.cz/app/controllers/create/options-datetime.js
2014-10-26 18:19:07 +01:00

209 lines
No EOL
5.1 KiB
JavaScript

export default Ember.ObjectController.extend(Ember.Validations.Mixin, {
actions: {
/*
* copy first line
*/
copyFirstLine: function(){
var datetimes = this.get('datetimes'),
firstLine = datetimes[0];
datetimes.forEach(function(datetime, key) {
// skip first element
if (key > 0) {
var newTimes = [];
firstLine.contents.times.forEach(function(time){
newTimes.pushObject({
value: time.value
});
});
datetime.set('contents.times', newTimes);
}
});
},
/*
* increase number of inputs fields for time
*/
moreTimes: function(){
this.set('datetimesInputFields', this.get('datetimesInputFields') + 1);
this.get('datetimes').forEach(function(datetime){
datetime.contents.times.pushObject({
value: ''
});
});
// update polyfill used for legacy support of html5 input time after new form elements have been insert
// has to wait after dom is updated
Ember.run.next(this, function() { $('input[type=time]').updatePolyfill(); });
},
save: function(){
/*
* set new options depending on selected times
*/
var datetimes = this.get('datetimes'),
newOptions = [],
self = this;
datetimes.forEach(function(datetime){
datetime.contents.times.forEach(function(t){
var date = new Date(datetime.contents.title),
delimiter = '';
// check if there is a value for time
if (Ember.isEmpty(t.value)) {
return;
}
// try to split time in minutes and hours
var time = self.getHoursAndMinutesFromInput(t.value);
// check time for valid format
if (time !== false) {
// hours and minutes seems valid, so update the date
date.setHours(time.hours);
date.setMinutes(time.minutes);
newOptions.pushObject({
title: date
});
}
});
});
// check if we have at least 2 options now
if (newOptions.length < 2) {
return;
}
this.set('options', newOptions);
// redirect to create/settings route
this.transitionToRoute('create.settings');
},
submit: function(){
this.validate();
$.each(Ember.View.views, function(id, view) {
if(view.isEasyForm) {
view.focusOut();
}
});
if (this.get('isValid')) {
// tricker save action
this.send('save');
}
}
},
/*
* only used on init, not on increasing number of input fields!
*/
datetimes: function(key, value, previousValue){
var datetimes = Ember.A(),
dates = this.get('options'),
datetimesCount = this.get('datetimesInputFields'),
self = this;
if (typeof dates !== 'undefined') {
dates.forEach(function(date){
var o = {
title: date.title,
times: Ember.A()
};
for(var i = 1; i<=datetimesCount; i++) {
o.times.pushObject({
value: ''
});
}
datetimes.pushObject(self.get('datetimesTimesArray').create({'contents':o}));
});
}
return datetimes;
}.property('options'),
/*
* helper Object as work-a-round to observe a nested array
*/
datetimesTimesArray: Ember.Object.extend({
'@eachTimesValue': function(){
var times = [];
this.get('contents.times').forEach(function(value){
times.push(value.value);
});
return times;
}.property('contents.times.@each.value')
}),
enoughTimes: function(){
var datetimes = this.get('datetimes'),
self = this,
isValid = true;
datetimes.forEach(function(value, key){
var times = self.get('datetimes.' + key + '.@eachTimesValue'),
valid = false;
times.forEach(function(time){
if(self.getHoursAndMinutesFromInput(time) !== false){
valid = true;
}
});
if (valid === false) {
isValid = false;
}
});
return isValid;
}.property('datetimes.@each.@eachTimesValue'),
getHoursAndMinutesFromInput: function(time){
// try to split time in minutes and hours
var t;
if (time.indexOf(':') !== -1) {
t = time.split(':');
}
else {
// time is not in a correct format
return false;
}
if (t.length !== 2) {
// time is not in a correct format
return false;
}
// get hours and minutes
var h = parseInt(t[0]),
m = parseInt(t[1]);
// check time for valid format
if (h >= 0 && h <= 23 &&
m >= 0 && m <= 59) {
return {
hours: h,
minutes: m
};
}
else {
return false;
}
},
validations: {
enoughTimes: {
acceptance: {
message: Ember.I18n.t('create.options-datetime.error.notEnoughTimes')
}
}
}
});