| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| var App = require('app'); |
| |
| var stringUtils = require('utils/string_utils'); |
| |
| App.JobsCustomDatesSelectView = Em.View.extend({ |
| |
| name: 'jobsCustomDatesSelectView', |
| |
| templateName: require('templates/common/custom_date_popup'), |
| |
| middayPeriodOptions: [Em.I18n.t('jobs.table.custom.date.am'), Em.I18n.t('jobs.table.custom.date.pm')], |
| |
| hourOptions: ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'], |
| |
| minuteOptions: ['00', '05', '10', '15', '20', '25', '30', '35', '40', '45', '50', '55'], |
| |
| customDateFormFields: Ember.Object.create({ |
| startDate: null, |
| hoursForStart: null, |
| minutesForStart: null, |
| middayPeriodForStart: null, |
| duration: null, |
| endDate: null, |
| hoursForEnd: null, |
| minutesForEnd: null, |
| middayPeriodForEnd: null |
| }), |
| |
| errors: Ember.Object.create({ |
| isStartDateError: false, |
| isEndDateError: false |
| }), |
| |
| errorMessages: Ember.Object.create({ |
| startDate: '', |
| endDate: '' |
| }), |
| |
| durationSelect: Em.Select.extend({ |
| classNames: ['input-medium'], |
| content: [ |
| { |
| value: 900000, |
| label: Em.I18n.t('jobs.customDateFilter.duration.15min') |
| }, |
| { |
| value: 1800000, |
| label: Em.I18n.t('jobs.customDateFilter.duration.30min') |
| }, |
| { |
| value: 3600000, |
| label: Em.I18n.t('jobs.customDateFilter.duration.1hr') |
| }, |
| { |
| value: 7200000, |
| label: Em.I18n.t('jobs.customDateFilter.duration.2hr') |
| }, |
| { |
| value: 14400000, |
| label: Em.I18n.t('jobs.customDateFilter.duration.4hr') |
| }, |
| { |
| value: 43200000, |
| label: Em.I18n.t('jobs.customDateFilter.duration.12hr') |
| }, |
| { |
| value: 86400000, |
| label: Em.I18n.t('jobs.customDateFilter.duration.24hr') |
| }, |
| { |
| value: 604800000, |
| label: Em.I18n.t('jobs.customDateFilter.duration.1w') |
| }, |
| { |
| value: 2592000000, |
| label: Em.I18n.t('jobs.customDateFilter.duration.1m') |
| }, |
| { |
| value: 31536000000, |
| label: Em.I18n.t('jobs.customDateFilter.duration.1yr') |
| }, |
| { |
| value: 0, |
| label: Em.I18n.t('common.custom') |
| } |
| ], |
| optionValuePath: 'content.value', |
| optionLabelPath: 'content.label', |
| selectionBinding: 'parentView.customDateFormFields.duration', |
| willInsertElement: function () { |
| var duration = this.get('selection'), |
| initialOption = this.get('content').find(function (item) { |
| return duration === item.value || duration === item.label; |
| }, this); |
| if (!initialOption) { |
| initialOption = this.get('content').findProperty('value', 0); |
| } |
| this.set('selection', initialOption); |
| } |
| }), |
| |
| isCustomEndDate: Em.computed.equal('customDateFormFields.duration.value', 0), |
| |
| didInsertElement: function () { |
| $('.datepicker').datepicker({ |
| format: 'mm/dd/yyyy' |
| }).on('changeDate', function() { |
| $(this).datepicker('hide'); |
| }); |
| }, |
| |
| createCustomStartDate: function () { |
| var startDate = this.get('customDateFormFields.startDate'); |
| var hoursForStart = this.get('customDateFormFields.hoursForStart'); |
| var minutesForStart = this.get('customDateFormFields.minutesForStart'); |
| var middayPeriodForStart = this.get('customDateFormFields.middayPeriodForStart'); |
| if (startDate && hoursForStart && minutesForStart && middayPeriodForStart) { |
| return App.getTimeStampFromLocalTime(new Date(startDate + ' ' + hoursForStart + ':' + minutesForStart + ' ' + middayPeriodForStart)); |
| } |
| return null; |
| }, |
| |
| createCustomEndDate: function (startDate) { |
| var duration = this.get('customDateFormFields.duration.value'), |
| date; |
| if (duration === 0) { |
| var endDate = this.get('customDateFormFields.endDate'); |
| var hoursForEnd = this.get('customDateFormFields.hoursForEnd'); |
| var minutesForEnd = this.get('customDateFormFields.minutesForEnd'); |
| var middayPeriodForEnd = this.get('customDateFormFields.middayPeriodForEnd'); |
| if (endDate && hoursForEnd && minutesForEnd && middayPeriodForEnd) { |
| date = App.getTimeStampFromLocalTime(new Date(endDate + ' ' + hoursForEnd + ':' + minutesForEnd + ' ' + middayPeriodForEnd)); |
| } |
| } else if (!Em.isNone(startDate)) { |
| date = startDate + duration; |
| } |
| return date; |
| }, |
| |
| setErrorMessage: function (key, message) { |
| var errors = this.get('errors'), |
| errorMessages = this.get('errorMessages'), |
| isError = !Em.isNone(message); |
| message = isError ? message: ''; |
| errors.set('is' + key.capitalize() + 'Error', isError); |
| errorMessages.set(key, message); |
| }, |
| |
| validate: function () { |
| var hasErrors = false, |
| formFields = this.get('customDateFormFields'), |
| errors = this.get('errors'), |
| errorMessages = this.get('errorMessages'); |
| |
| // Check if fields are empty or invalid |
| Em.keys(errorMessages).forEach(function (key) { |
| var value = formFields.get(key), |
| timestamp = App.getTimeStampFromLocalTime(value); |
| if (key !== 'endDate' || this.get('isCustomEndDate')) { |
| if (!formFields.get(key)) { |
| hasErrors = true; |
| this.setErrorMessage(key); |
| } else if (isNaN(timestamp)) { |
| this.setErrorMessage(key, Em.I18n.t('jobs.customDateFilter.error.incorrect')); |
| hasErrors = true; |
| } else { |
| this.setErrorMessage(key); |
| } |
| } |
| }, this); |
| |
| // Check that endDate is after startDate |
| if (!hasErrors) { |
| var startDate = this.createCustomStartDate(), |
| endDate = this.createCustomEndDate(startDate); |
| if (startDate && endDate) { |
| if (startDate > endDate) { |
| hasErrors = true; |
| this.setErrorMessage('endDate', Em.I18n.t('jobs.customDateFilter.error.date.order')); |
| } |
| if (startDate > new Date().getTime()) { |
| hasErrors = true; |
| this.setErrorMessage('startDate', Em.I18n.t('jobs.customDateFilter.error.laterThanNow')); |
| } |
| } |
| } |
| |
| this.set('parentView.disablePrimary', hasErrors); |
| |
| // Get customized time range if there are no errors |
| if (!hasErrors) { |
| var duration; |
| if (this.get('isCustomEndDate')) { |
| var values = [ |
| { |
| label: 'year', |
| max: Infinity |
| }, |
| { |
| label: 'month', |
| max: 12 |
| }, |
| { |
| label: 'week', |
| max: 4 |
| }, |
| { |
| label: 'day', |
| max: 7 |
| }, |
| { |
| label: 'hour', |
| max: 24 |
| }, |
| { |
| label: 'minute', |
| max: 60 |
| } |
| ], |
| start = moment(startDate), |
| end = moment(endDate); |
| values.forEach(function (item) { |
| var diff = end.diff(start, item.label); |
| item.value = diff >= item.max ? diff % item.max : diff; |
| }); |
| duration = values.filterProperty('value').map(function (item) { |
| return item.value + ' ' + stringUtils.pluralize(item.value, item.label); |
| }).join(' '); |
| } else { |
| duration = this.get('customDateFormFields.duration.label'); |
| } |
| this.get('controller').setProperties({ |
| startTime: startDate, |
| endTime: endDate, |
| customDuration: duration |
| }); |
| } |
| |
| }.observes('customDateFormFields.startDate', 'customDateFormFields.hoursForStart', 'customDateFormFields.minutesForStart', 'customDateFormFields.middayPeriodForStart', 'customDateFormFields.endDate', 'customDateFormFields.hoursForEnd', 'customDateFormFields.minutesForEnd', 'customDateFormFields.middayPeriodForEnd', 'customDateFormFields.duration.value') |
| }); |