/** * 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. */ App.MainMirroringEditDataSetController = Ember.Controller.extend({ name: 'mainMirroringEditDataSetController', /** * Defines to show Edit Dataset or Create New Dataset popup * @type {Boolean} */ isEdit: false, /** * Contains Dataset id if isEdit is true * @type {Boolean} */ datasetIdToEdit: null, /** * Fields values from Edit DataSet form * @type {Object} */ formFields: Ember.Object.create({ datasetName: null, datasetTargetClusterName: null, datasetSourceDir: null, datasetTargetDir: null, datasetStartDate: null, hoursForStart: null, minutesForStart: null, middayPeriodForStart: null, datasetEndDate: null, hoursForEnd: null, minutesForEnd: null, middayPeriodForEnd: null, datasetFrequency: null, repeatOptionSelected: null }), /** * Messages for errors occurred during Edit DataSet form validation * @type {Object} */ errorMessages: Ember.Object.create({ name: '', sourceDir: '', targetDir: '', startDate: '', endDate: '', frequency: '', targetClusterName: '' }), /** * Flags with errors related to each field in Edit/Create Dataset form * @type {Object} */ errors: Ember.Object.create({ isNameError: false, isSourceDirError: false, isTargetDirError: false, isStartDateError: false, isEndDateError: false, isFrequencyError: false, isTargetClusterNameError: false }), /** * Clear all fields in Edit/Create Dataset form and clears all errors */ clearStep: function () { var formFields = this.get('formFields'); Em.keys(formFields).forEach(function (key) { formFields.set(key, null); }, this); this.clearErrors(); }, /** * Clear all error flags and messages */ clearErrors: function () { var errorMessages = this.get('errorMessages'); Em.keys(errorMessages).forEach(function (key) { errorMessages.set(key, ''); }, this); var errors = this.get('errors'); Em.keys(errors).forEach(function (key) { errors.set(key, false); }, this); }, /** * Show Create New Dataset popup * @return {Object} popup view */ showAddPopup: function () { var popup = this.showPopup(Em.I18n.t('mirroring.dataset.newDataset')); this.set('isEdit', false); return popup; }, /** * Show Edit Dataset popup * @return {Object} popup view */ showEditPopup: function (dataset) { this.set('datasetIdToEdit', dataset.get('id')); var popup = this.showPopup(Em.I18n.t('mirroring.dataset.editDataset')); this.set('isEdit', true); return popup; }, /** * Show popup with Dataset form fields * @return {Object} popup view */ showPopup: function (header) { var self = this; var popup = App.ModalPopup.show({ classNames: ['sixty-percent-width-modal'], header: header, primary: Em.I18n.t('mirroring.dataset.save'), secondary: Em.I18n.t('common.cancel'), showCloseButton: false, isSaving: false, saveDisabled: function () { return self.get('saveDisabled'); }.property('App.router.' + self.get('name') + '.saveDisabled'), disablePrimary: function () { return this.get('saveDisabled') || this.get('isSaving'); }.property('saveDisabled', 'isSaving'), onPrimary: function () { // Apply form validation for first click if (!this.get('primaryWasClicked')) { this.toggleProperty('primaryWasClicked'); self.applyValidation(); if (this.get('saveDisabled')) { return false; } } self.save(); App.router.transitionTo('main.mirroring.index'); }, primaryWasClicked: false, onSecondary: function () { this.hide(); App.router.send('gotoShowJobs'); }, bodyClass: App.MainMirroringEditDataSetView.extend({ controller: self }) }); this.set('popup', popup); return popup; }, /** * Set observer to call validate method if any property from formFields will change */ applyValidation: function () { Em.keys(this.get('formFields')).forEach(function (key) { this.addObserver('formFields.' + key, this, 'validate'); }, this); this.validate(); }, /** * Return date object calculated from appropriate fields * @type {Date} */ scheduleStartDate: function () { var startDate = this.get('formFields.datasetStartDate'); var hoursForStart = this.get('formFields.hoursForStart'); var minutesForStart = this.get('formFields.minutesForStart'); var middayPeriodForStart = this.get('formFields.middayPeriodForStart'); if (startDate && hoursForStart && minutesForStart && middayPeriodForStart) { return new Date(startDate + ' ' + hoursForStart + ':' + minutesForStart + ' ' + middayPeriodForStart); } return null; }.property('formFields.datasetStartDate', 'formFields.hoursForStart', 'formFields.minutesForStart', 'formFields.middayPeriodForStart'), /** * Return date object calculated from appropriate fields * @type {Date} */ scheduleEndDate: function () { var endDate = this.get('formFields.datasetEndDate'); var hoursForEnd = this.get('formFields.hoursForEnd'); var minutesForEnd = this.get('formFields.minutesForEnd'); var middayPeriodForEnd = this.get('formFields.middayPeriodForEnd'); if (endDate && hoursForEnd && minutesForEnd && middayPeriodForEnd) { return new Date(endDate + ' ' + hoursForEnd + ':' + minutesForEnd + ' ' + middayPeriodForEnd); } return null; }.property('formFields.datasetEndDate', 'formFields.hoursForEnd', 'formFields.minutesForEnd', 'formFields.middayPeriodForEnd'), /** * Validation for every field in Edit DataSet form */ validate: function () { var formFields = this.get('formFields'); var errors = this.get('errors'); var errorMessages = this.get('errorMessages'); this.clearErrors(); // Check if feild is empty Em.keys(errorMessages).forEach(function (key) { if (!formFields.get('dataset' + key.capitalize())) { errors.set('is' + key.capitalize() + 'Error', true); errorMessages.set(key, Em.I18n.t('mirroring.required.error')); } }, this); // Check that endDate is after startDate var scheduleStartDate = this.get('scheduleStartDate'); var scheduleEndDate = this.get('scheduleEndDate'); if (scheduleStartDate && scheduleEndDate && (scheduleStartDate > scheduleEndDate)) { errors.set('isEndDateError', true); errorMessages.set('endDate', Em.I18n.t('mirroring.dateOrder.error')); } // Check that startDate is after current date if (scheduleStartDate && !this.get('isEdit') && new Date(App.dateTime()) > scheduleStartDate) { errors.set('isStartDateError', true); errorMessages.set('startDate', Em.I18n.t('mirroring.startDate.error')); } // Check that repeat field value consists only from digits if (isNaN(this.get('formFields.datasetFrequency'))) { errors.set('isFrequencyError', true); errorMessages.set('frequency', Em.I18n.t('mirroring.required.invalidNumberError')); } }, /** * Add '0' for numbers less than 10 * @param {Number|String} number * @return {String} */ addZero: function (number) { return ('0' + number).slice(-2); }, /** * Convert date to TZ format * @param {Date} date * @return {String} */ toTZFormat: function (date) { return date.toISOString().replace(/\:\d{2}\.\d{3}/,''); }, /** * Converts hours value from 24-hours format to AM/PM format * @param {Number|String} hours * @return {String} */ toAMPMHours: function (hours) { var result = hours % 12; result = result ? result : 12; return this.addZero(result); }, /** * Save data from dataset form to server */ save: function () { this.set('popup.isSaving', true); var datasetXML = this.createDatasetXML(); this.sendDatasetToServer(datasetXML); }, /** * Compose XML-object from populated dataset form fields * @return {String} */ createDatasetXML: function () { var datasetNamePrefix = App.get('mirroringDatasetNamePrefix'); var datasetName = this.get('formFields.datasetName'); var prefixedDatasetName = datasetNamePrefix + datasetName; var sourceCluster = App.get('clusterName'); var targetCluster = this.get('formFields.datasetTargetClusterName'); var sourceDir = this.get('formFields.datasetSourceDir'); var targetDir = this.get('formFields.datasetTargetDir'); var datasetFrequency = this.get('formFields.datasetFrequency'); var repeatOptionSelected = this.get('formFields.repeatOptionSelected'); var startDate = this.get('scheduleStartDate'); var endDate = this.get('scheduleEndDate'); var scheduleStartDateFormatted = this.toTZFormat(startDate); var scheduleEndDateFormatted = this.toTZFormat(endDate); return '' + repeatOptionSelected + '(' + datasetFrequency + ')' + ''; }, /** * Send dataset XML-data to server * @param {String} datasetXML */ sendDatasetToServer: function (datasetXML) { var datasetNamePrefix = App.get('mirroringDatasetNamePrefix'); var datasetName = this.get('formFields.datasetName'); var prefixedDatasetName = datasetNamePrefix + datasetName; return App.ajax.send({ name: this.get('isEdit') ? 'mirroring.update_entity' : 'mirroring.create_new_dataset', sender: this, data: { name: prefixedDatasetName, type: 'feed', entity: datasetXML, falconServer: App.get('falconServerURL') }, success: 'onSaveSuccess', error: 'onSaveError' }); }, /** * Callback for success saving XML-data on server */ onSaveSuccess: function () { this.set('popup.isSaving', false); this.get('popup').hide(); App.router.get('mainMirroringController').loadData(); }, /** * Callback for error while saving XML-data on server */ onSaveError: function (response) { this.set('popup.isSaving', false); if (response && response.responseText) { var errorMessage = /(?:\)((.|\n)+)(?:\<\/message\>)/.exec(response.responseText); if (errorMessage.length > 1) { App.showAlertPopup(Em.I18n.t('common.error'), Em.I18n.t('mirroring.manageClusters.error') + ': ' + errorMessage[1]); } } }, /** * Defines if save button should be disabled * @type {Boolean} */ saveDisabled: function () { var errors = this.get('errors'); return errors.get('isNameError') || errors.get('isSourceDirError') || errors.get('isTargetDirError') || errors.get('isStartDateError') || errors.get('isEndDateError') || errors.get('isFrequencyError') || errors.get('isTargetClusterNameError'); }.property('errors.isNameError', 'errors.isSourceDirError', 'errors.isTargetDirError', 'errors.isStartDateError', 'errors.isEndDateError', 'errors.isFrequencyError', 'errors.isTargetClusterNameError') });