/* * Licensed Materials - Property of IBM * * IBM Cognos Products: SHARE * * (C) Copyright IBM Corp. 2015, 2017 * * US Government Users Restricted Rights - Use, duplication or disclosure * restricted by GSA ADP Schedule Contract with IBM Corp. */ define([ 'bi/schedule/views/CadencePickerView', 'bi/schedule/app/appControler', 'jquery', 'bi/sharecommon/utils/translator', 'q', 'momentjs', 'bi/sharecommon/utils/simpledoT', 'text!bi/schedule/templates/DailyIntervalCadencePicker.html', 'underscore', 'bi/commons/ui/widgets/TimePicker', 'bi/commons/ui/properties/CheckBox', 'bi/commons/ui/properties/DropDown', 'bi/commons/utils/DateTimeUtils', 'bi/content_apps/utils/GlassContextHelper' ], function(View, controler, $, t, Q, moment, dot, template, _, TimePicker, CheckBox, DropDown, DateTimeUtils, GlassContextHelper) { 'use strict'; var dailyInterval = View.extend({ /** * @constructor */ init: function(options) { dailyInterval.inherited('init', this, arguments); _.extend(this, options); this.descriptor = this.objectInformation.descriptor; this.isEditMode = typeof (this.descriptor) !== "undefined"; this.dailyIntervalCheckbox = null; this.uniqueId = _.uniqueId(); this.frequencyTypeSelector = null; this.renderDailyIntervalCheckbox = false; this.timezone = GlassContextHelper.getUserPreference(this.glassContext, 'timeZoneID'); this.locale = this._determineDateLocale(); }, /** * Render the new schedule view intraday picker section * */ render: function() { var deferred = Q.defer(); var htmlGenerator = dot.simpleTemplate(template); var defaultPeriod = 1; if(this.isEditMode && this.descriptor.intradayRecurrence) { // PT3H var text = this.descriptor.intradayRecurrence.intradayRecurrenceInterval; defaultPeriod = text.substring(2, text.length - 1); } var attributes = { daily_time_interval_label: t.translate("daily_time_interval_label"), schedule_repeat_label: t.translate("schedule_repeat_label"), schedule_time_dropdown_hours_t: t.translate("schedule_time_dropdown_hours_t"), schedule_time_dropdown_minutes_t: t.translate("schedule_time_dropdown_minutes_t"), schedule_timepicker_label: t.translate("schedule_timepicker_label"), schedule_timepicker_start: t.translate("period_start_time_label"), schedule_timepicker_end: t.translate("period_end_time_label"), defaultPeriod: defaultPeriod, uniqueid: this.uniqueId }; this.$el.append(htmlGenerator(attributes)); if((this.glassContext.hasCapability("canUseSchedulingByHour") || this.glassContext.hasCapability("canUseSchedulingByMinute")) && this.objectInformation.showDailyIntervalCheckbox) { this.renderDailyIntervalCheckbox = true; } if(this.renderDailyIntervalCheckbox) { this._renderDailyIntervalCheckbox(); this._renderDailyIntervalTimePickers(); this._renderSelectors(); } if(this.isEditMode) { if(this.descriptor.scheduleInfo && this.descriptor.scheduleInfo.intradayRecurrence && this.renderDailyIntervalCheckbox) { this.$el.find(".schedule_dailyinterval").slideDown(); // repeat value var rtext = this.descriptor.scheduleInfo.intradayRecurrence.intradayRecurrenceInterval; var repeat = rtext.replace(/[^0-9]/g, ''); this.$el.find(".schedule_run_every_input").val(repeat); // recurrence val var recurrence = rtext.charAt(rtext.length - 1); this.frequencyTypeSelector.getHTMLControl().val(recurrence); } } else { if (this.renderDailyIntervalCheckbox) { // We have either ByHour or ByMinute capability to show the radio button group if(this.glassContext.hasCapability("canUseSchedulingByHour")) { this.frequencyTypeSelector.getHTMLControl().val('H'); } else { this.frequencyTypeSelector.getHTMLControl().val('M'); } } } this._setEvents(); deferred.resolve(this); return deferred.promise; }, _setEvents: function() { $('.schedule_run_every_input').on('input', function(event) { this.value = this.value.replace(/[^0-9]/g, ''); }); }, /** * All views should overwrite this function. It takes a partially * populated json schedule descriptor and adds to it based on the * properties of this view. * * @param desc the partial JSON schedule descriptor * @returns the descriptor passed in, with added attributes. */ toDescriptor: function(desc) { if (this.renderDailyIntervalCheckbox && this.dailyIntervalCheckbox.isChecked()) { var repeat = this.frequencyTypeSelector.getHTMLControl().val(); var recurrence = this.$el.find(".schedule_run_every_input").val(); var intradayRecurrenceStart = this.intervalStartTime.getTime24H(); var intradayRecurrenceEnd = this.intervalEndTime.getTime24H(); desc.intradayRecurrence = { intradayRecurrenceInterval: "PT" + recurrence + repeat, // PT3H intradayRecurrenceStart: intradayRecurrenceStart, intradayRecurrenceEnd: intradayRecurrenceEnd }; } return desc; }, validate: function(msgs) { if (this.renderDailyIntervalCheckbox && this.dailyIntervalCheckbox.isChecked()) { var parameters = { param1: "", param2: "", param3: "" }; var $everyDiv = this.$el.find(".schedule_dailyinterval_controls_container"); var $iStartTime = this.$el.find(".schedule_time_interval_start"); var $iEndTime = this.$el.find(".schedule_time_interval_end"); $everyDiv.removeAttr('aria-invalid aria-describedby'); $iStartTime.removeAttr('aria-invalid aria-describedby'); $iEndTime.removeAttr('aria-invalid aria-describedby'); var recurrence = parseInt(this.$el.find(".schedule_run_every_input").val(), 10); if(isNaN(recurrence) || recurrence === 0) { parameters.param1 = t.translate("daily_time_interval_label"); parameters.param2 = t.translate("schedule_repeat_label"); msgs.push(t.translate("schedule_invalid_form_input", parameters)); $everyDiv.attr({ 'aria-invalid': 'true', 'aria-describedby': msgs[0] }); } else if(!this.intervalStartTime.isValidTime()) { parameters.param1 = t.translate("daily_time_interval_label"); parameters.param2 = t.translate("schedule_timepicker_label"); parameters.param3 = t.translate("period_start_label"); msgs.push(t.translate("schedule_invalid_interval_time", parameters)); $iStartTime.attr({ 'aria-invalid': 'true', 'aria-describedby': msgs[0] }); } else if(!this.intervalEndTime.isValidTime()) { parameters.param1 = t.translate("daily_time_interval_label"); parameters.param2 = t.translate("schedule_timepicker_label"); parameters.param3 = t.translate("period_end_label"); msgs.push(t.translate("schedule_invalid_interval_time", parameters)); $iEndTime.attr({ 'aria-invalid': 'true', 'aria-describedby': msgs[0] }); } else if(this.intervalStartTime.isValidTime() && this.intervalEndTime.isValidTime()) { var startingTime = new Date(this.intervalStartTime.getDateTimeUTC()); var endingTime = new Date(this.intervalEndTime.getDateTimeUTC()); if(startingTime > endingTime) { parameters.param1 = t.translate("daily_time_interval_label"); parameters.param2 = t.translate("schedule_timepicker_label"); msgs.push(t.translate("schedule_invalid_time_range", parameters)); $iEndTime.attr({ 'aria-invalid': 'true', 'aria-describedby': msgs[0] }); } } } return msgs; }, _renderDailyIntervalCheckbox: function() { var checked = false; if(this.descriptor && this.descriptor.scheduleInfo && this.descriptor.scheduleInfo.intradayRecurrence) { checked = true; } this.dailyIntervalCheckbox = new CheckBox({ 'id': 'schedule_daily_interval_cadence_picker', 'el': this.$el.find('#schedule_daily_interval_cadence_picker_container_' + this.uniqueId), 'name': 'schedule_daily_pick', 'label': t.translate("daily_time_interval_label"), 'ariaLabel': t.translate("daily_time_interval_label"), 'checked': checked, 'controlOnLeft': true, 'readOnly': this.readOnly, 'onChange': this._toggleOption.bind(this) }); this.dailyIntervalCheckbox.doRender(); }, _renderDailyIntervalTimePickers: function() { this.intervalStartTime = new TimePicker({ $el: this.$el.find(".schedule_time_interval_start"), timezone: this.timezone, ariaLabel: t.translate("period_start_time_label"), attributes: { showMeridian: !DateTimeUtils.is24HrFormat(this.locale) } }); this.intervalStartTime.render(); this.intervalEndTime = new TimePicker({ $el: this.$el.find(".schedule_time_interval_end"), timezone: this.timezone, ariaLabel: t.translate("period_end_time_label"), attributes: { showMeridian: !DateTimeUtils.is24HrFormat(this.locale) } }); this.intervalEndTime.render(); if(this.isEditMode) { if(this.descriptor.scheduleInfo && this.descriptor.scheduleInfo.intradayRecurrence) { var startingTime = this.descriptor.scheduleInfo.intradayRecurrence.intradayRecurrenceStart; this.intervalStartTime.setTime24H(startingTime); var endTime = this.descriptor.scheduleInfo.intradayRecurrence.intradayRecurrenceEnd; this.intervalEndTime.setTime24H(endTime); } } }, _toggleOption: function(name, value) { if( value === true ) { this.$el.find(".schedule_dailyinterval").slideDown(); } else { this.$el.find(".schedule_dailyinterval").slideUp(); } }, _renderSelectors: function() { var mnOptions = []; if(this.glassContext.hasCapability("canUseSchedulingByHour")) { mnOptions.push({ 'label': t.translate("schedule_time_dropdown_hours_t"), 'value': 'H', 'selected': false }); } if(this.glassContext.hasCapability("canUseSchedulingByMinute")) { mnOptions.push({ 'label': t.translate("schedule_time_dropdown_minutes_t"), 'value': 'M', 'selected': false }); } this.frequencyTypeSelector = new DropDown({ 'id': 'schedule_cadence_id_' + this.uniqueId, 'el': this.$el.find('#schedule_daily_time_interval_selector_container_' + this.uniqueId), 'ariaLabel': t.translate("schedule_repeat_label"), 'name': 'schedule_interval_repeat_type', 'responsive': false, 'onChange': function() { return; }, 'options': mnOptions }); this.frequencyTypeSelector.doRender(); }, _determineDateLocale: function() { var prodLocale = GlassContextHelper.getUserPreference(this.glassContext, 'productLocale'); var contentLocale = GlassContextHelper.getUserPreference(this.glassContext, 'contentLocale'); if(prodLocale === contentLocale.substring(0,2)) { return contentLocale; } else { return prodLocale; } } }); return dailyInterval; });