/********************************************* * Copyright (c) 2014 AnsibleWorks, Inc. */ /** * @ngdoc function * @name helpers.function:Schedules * @description * Schedules Helper * * Display the scheduler widget in a dialog * */ 'use strict'; angular.module('SurveyHelper', [ 'Utilities', 'RestServices', 'SchedulesHelper', 'SearchHelper', 'PaginationHelpers', 'ListGenerator', 'ModalDialog', 'GeneratorHelpers']) .factory('ShowSurveyModal', ['Wait', 'CreateDialog', 'Empty', '$compile' , function(Wait, CreateDialog, Empty, $compile) { return function(params) { // Set modal dimensions based on viewport width var scope = params.scope, callback = params.callback, mode = (params.mode) ? params.mode : "survey-maker", title = params.title, element, target = (mode==='survey-taker') ? 'password-modal' : "survey-modal-dialog", buttons = [{ "label": "Cancel", "onClick": function() { $(this).dialog('close'); }, "icon": "fa-times", "class": "btn btn-default", "id": "survey-close-button" },{ "label": (mode==='survey-taker') ? "Launch" : "Save" , "onClick": function() { setTimeout(function(){ scope.$apply(function(){ if(mode==='survey-taker'){ scope.$emit('SurveyTakerCompleted'); } else{ scope.saveSurvey(); } }); }); }, "icon": (mode==='survey-taker') ? "fa-rocket" : "fa-check", "class": "btn btn-primary", "id": "survey-save-button" }]; CreateDialog({ id: target, title: title, scope: scope, buttons: buttons, width: 700, height: 725, minWidth: 400, onClose: function() { $('#'+target).empty(); }, onOpen: function() { Wait('stop'); if(mode!=="survey-taker"){ $('#survey-save-button').attr('ng-disabled', "survey_questions.length<1 "); element = angular.element(document.getElementById('survey-save-button')); $compile(element)(scope); } if(mode==="survey-taker"){ $('#survey-save-button').attr('ng-disabled', "survey_taker_form.$invalid"); element = angular.element(document.getElementById('survey-save-button')); $compile(element)(scope); } }, callback: callback }); }; }]) .factory('EditSurvey', ['$routeParams','SchedulerInit', 'ShowSurveyModal', 'Wait', 'Rest', 'ProcessErrors', 'GetBasePath', 'GenerateForm', 'SurveyMakerForm', 'Empty', 'AddSurvey', function($routeParams, SchedulerInit, ShowSurveyModal, Wait, Rest, ProcessErrors, GetBasePath, GenerateForm,SurveyMakerForm, Empty, AddSurvey) { return function(params) { var scope = params.scope, id = params.id, // callback = params.callback, tempSurv = {}, generator = GenerateForm, form = SurveyMakerForm, // labels={ // "type": "Type", // "question_name": "Question Text", // "question_description": "Question Description", // "variable": "Answer Varaible Name", // "choices": "Choices", // "min": "Min", // "max": "Max", // "required": "Required", // "default": "Default Answer" // }, url = GetBasePath('job_templates') + id + '/survey_spec/', i; if (scope.removeDialogReady) { scope.removeDialogReady(); } scope.removeDialogReady = scope.$on('DialogReady', function() { $('#survey-modal-dialog').dialog('open'); }); scope.resetForm(); Wait('start'); if(scope.mode === 'add'){ tempSurv.survey_name = scope.survey_name; tempSurv.survey_description = scope.survey_description; generator.inject(form, { id: 'survey-modal-dialog' , mode: 'edit', related: false, scope: scope, breadCrumbs: false }); ShowSurveyModal({ title: "Edit Survey", scope: scope, callback: 'DialogReady' }); scope.survey_name = tempSurv.survey_name; scope.survey_description = tempSurv.survey_description; // scope.survey_questions = data.spec; for(i=0; i0){ // $('#survey-save-button').removeAttr('disabled') // } question.index = index; if(!$('#question_'+question.index+':eq(0)').is('div')){ html+='
'; $('#finalized_questions').append(html); } required = (question.required===true) ? "prepend-asterisk" : ""; html = '
'+question.question_name+'
\n'; if(!Empty(question.question_description)){ html += '
'+question.question_description+'
\n'; } // defaultValue = (question.default) ? question.default : ""; if(question.type === 'text' ){ defaultValue = (question.default) ? question.default : ""; html+='
'+ '
'+ ''+ '
'; } if(question.type === "textarea"){ defaultValue = (question.default) ? question.default : (question.default_textarea) ? question.default_textarea: "" ; html+='
'+ '
'+ ''+ '
'; } if(question.type === 'multiplechoice' || question.type === "multiselect"){ choices = question.choices.split(/\n/); element = (question.type==="multiselect") ? "checkbox" : 'radio'; question.default = (question.default) ? question.default : (question.default_multiselect) ? question.default_multiselect : "" ; for( i = 0; i'+ '' +choices[i]+ ''; } } if(question.type === 'integer'){ min = (!Empty(question.min)) ? question.min : ""; max = (!Empty(question.max)) ? question.max : "" ; defaultValue = (!Empty(question.default)) ? question.default : (!Empty(question.default_int)) ? question.default_int : "" ; html+='
'+ '
'+ ''+ '
'; } if(question.type === "float"){ min = (!Empty(question.min)) ? question.min : ""; max = (!Empty(question.max)) ? question.max : "" ; defaultValue = (!Empty(question.default)) ? question.default : (!Empty(question.default_float)) ? question.default_float : "" ; html+='
'+ '
'+ ''+ '
'; } html += '
'; html += ' '; html += ' '; html += ' '; html += ' '; html+='
'; $('#question_'+question.index).append(html); element = angular.element(document.getElementById('question_'+question.index)); // element.html(html); element.css('opacity', 0.7); $compile(element)(scope); // var questionScope = scope.$new; $('#add_question_btn').show(); $('#add_question_btn').removeAttr('disabled'); $('#add_question_btn').focus(); $('#survey_maker_save_btn').removeAttr('disabled'); $('#delete-question_'+question.index+'').on('click', function($event){ scope.deleteQuestion($event.target.parentElement.parentElement.parentElement.id.split('_')[1]); }); $('#edit-question_'+question.index+'').on('click', function($event){ scope.editQuestion($event.target.parentElement.parentElement.parentElement.id.split('_')[1]); }); $('#question-up_'+question.index+'').on('click', function($event){ scope.questionUp($event.target.parentElement.parentElement.parentElement.id.split('_')[1]); }); $('#question-down_'+question.index+'').on('click', function($event){ scope.questionDown($event.target.parentElement.parentElement.parentElement.id.split('_')[1]); }); }; }]) .factory('SurveyTakerQuestion', ['GetBasePath','Rest', 'Wait', 'ProcessErrors', '$compile', 'Empty', function(GetBasePath, Rest, Wait, ProcessErrors, $compile, Empty) { return function(params) { var scope = params.scope, // id = params.id, question = params.question, index = params.index, requiredAsterisk, requiredClasses, element, choices, i, checked, max, min, defaultValue, numberValidation, html = ""; // if(scope.survey_questions.length>0){ // $('#survey-save-button').removeAttr('disabled') // } question.index = index; question[question.variable] = question.default; scope[question.variable] = question.default; if(!$('#question_'+question.index+':eq(0)').is('div')){ html+='
'; $('#survey_taker_finalized_questions').append(html); } requiredAsterisk = (question.required===true) ? "prepend-asterisk" : ""; requiredClasses = (question.required===true) ? "ng-pristine ng-invalid-required ng-invalid" : ""; html = '
'+question.question_name+'
\n'; if(!Empty(question.question_description)){ html += '
'+question.question_description+'
\n'; } defaultValue = (question.default) ? question.default : ""; if(question.type === 'text' ){ html+='
'+ '
'+ ''+ '
'; } if(question.type === "textarea"){ html+='
'+ '
'+ ''+ '
'; } if(question.type === 'multiplechoice' || question.type === "multiselect"){ choices = question.choices.split(/\n/); element = (question.type==="multiselect") ? "checkbox" : 'radio'; for( i = 0; i'+ '' +choices[i]+ ''; } } if(question.type === 'integer' || question.type === "float"){ min = (question.min) ? question.min : ""; max = (question.max) ? question.max : "" ; numberValidation = (question.type==="integer") ? "integer" : 'float'; html+='
'+ '
'+ ''+ '
'; } $('#question_'+question.index).append(html); element = angular.element(document.getElementById('question_'+question.index)); $compile(element)(scope); }; }]) .factory('EditQuestion', ['GetBasePath','Rest', 'Wait', 'ProcessErrors', '$compile', 'GenerateForm', 'SurveyQuestionForm', function(GetBasePath, Rest, Wait, ProcessErrors, $compile, GenerateForm, SurveyQuestionForm) { return function(params) { var scope = params.scope, index = params.index, element, fld, i, pre, form = SurveyQuestionForm; $('#add_question_btn').hide(); $('#new_question .aw-form-well').remove(); element = $('.question_final:eq('+index+')'); element.css('opacity', 1.0); element.empty(); // $('#new_question .aw-form-well').remove(); GenerateForm.inject(form, { id: 'question_'+index, mode: 'edit' , related: false, scope:scope, breadCrumbs: false}); for(fld in form.fields){ if( fld === 'float_options' || fld === 'int_options'){ pre = fld.substr(0, fld.indexOf('_')); scope[pre+'_min'] = scope.survey_questions[index].min; scope[pre+'_max'] = scope.survey_questions[index].max; // $('#'+pre+'_min').val(scope.survey_questions[index].min); // $('#'+pre+'_max').val(scope.survey_questions[index].max); } if( fld === 'default_int' || fld === 'default_float'){ $("#"+fld ).val(scope.survey_questions[index].default); } if(form.fields[fld].type === 'select'){ for (i = 0; i < scope.answer_types.length; i++) { if (scope.survey_questions[index][fld] === scope.answer_types[i].type) { scope[fld] = scope.answer_types[i]; } } } else { scope[fld] = scope.survey_questions[index][fld]; } } }; }]) .factory('DeleteQuestion' , function() { return function(params) { var scope = params.scope, index = params.index, element; element = $('.question_final:eq('+index+')'); element.remove(); scope.survey_questions.splice(index, 1); scope.reorder(); if(scope.survey_questions.length<1){ $('#survey-save-button').attr('disabled', 'disabled'); } }; }) .factory('SurveyControllerInit', ['$location', 'DeleteSurvey', 'EditSurvey', 'AddSurvey', 'GenerateForm', 'SurveyQuestionForm', 'Wait', 'Alert', 'GetBasePath', 'Rest', 'ProcessErrors' , '$compile', 'FinalizeQuestion', 'EditQuestion', 'DeleteQuestion', 'SurveyTakerQuestion', function($location, DeleteSurvey, EditSurvey, AddSurvey, GenerateForm, SurveyQuestionForm, Wait, Alert, GetBasePath, Rest, ProcessErrors, $compile, FinalizeQuestion, EditQuestion, DeleteQuestion, SurveyTakerQuestion) { return function(params) { var scope = params.scope, id = params.id, i, url, html, element, form = SurveyQuestionForm; scope.survey_questions = []; scope.answer_types=[ {name: 'Text' , type: 'text'}, {name: 'Textarea', type: 'textarea'}, {name: 'Multiple Choice (single select)', type: 'multiplechoice'}, {name: 'Multiple Choice (multiple select)', type: 'multiselect'}, {name: 'Integer', type: 'integer'}, {name: 'Float', type: 'float'} ]; scope.deleteSurvey = function() { DeleteSurvey({ scope: scope, id: id, // callback: 'SchedulesRefresh' }); }; scope.editSurvey = function() { EditSurvey({ scope: scope, id: id, // callback: 'SchedulesRefresh' }); }; scope.addSurvey = function() { AddSurvey({ scope: scope, // callback: 'SchedulesRefresh' }); }; scope.addQuestion = function(){ GenerateForm.inject(form, { id:'new_question', mode: 'add' , scope:scope, related: false, breadCrumbs: false}); scope.required = true; //set the required checkbox to true via the ngmodel attached to scope.required. scope.int_min = null; scope.int_max = null; scope.float_min = null; scope.float_max = null; }; scope.addNewQuestion = function(){ // $('#add_question_btn').on("click" , function(){ scope.addQuestion(); $('#survey_question_question_name').focus(); $('#add_question_btn').attr('disabled', 'disabled'); $('#add_question_btn').hide(); // }); }; scope.editQuestion = function(index){ EditQuestion({ index: index, scope: scope }); }; scope.deleteQuestion = function(index){ DeleteQuestion({ index:index, scope: scope }); }; scope.questionUp = function(index){ var animating = false, clickedDiv = $('#question_'+index), prevDiv = clickedDiv.prev(), distance = clickedDiv.outerHeight(); if (animating) { return; } if (prevDiv.length) { animating = true; $.when(clickedDiv.animate({ top: -distance }, 600), prevDiv.animate({ top: distance }, 600)).done(function () { prevDiv.css('top', '0px'); clickedDiv.css('top', '0px'); clickedDiv.insertBefore(prevDiv); animating = false; i = scope.survey_questions[index]; scope.survey_questions[index] = scope.survey_questions[index-1]; scope.survey_questions[index-1] = i; scope.reorder(); }); } }; scope.questionDown = function(index){ var clickedDiv = $('#question_'+index), nextDiv = clickedDiv.next(), distance = clickedDiv.outerHeight(), animating = false; if (animating) { return; } if (nextDiv.length) { animating = true; $.when(clickedDiv.animate({ top: distance }, 600), nextDiv.animate({ top: -distance }, 600)).done(function () { nextDiv.css('top', '0px'); clickedDiv.css('top', '0px'); nextDiv.insertBefore(clickedDiv); animating = false; i = scope.survey_questions[index]; scope.survey_questions[index] = scope.survey_questions[Number(index)+1]; scope.survey_questions[Number(index)+1] = i; scope.reorder(); }); } }; scope.reorder = function(){ for(i=0; i'+ ''+ '
'+ '
'+ ''+ '
'+ ''+ ''; $('#survey-modal-dialog').html(html); element = angular.element(document.getElementById('add_question_btn')); $compile(element)(scope); }; scope.saveSurvey = function() { Wait('start'); if(scope.mode==="add"){ $('#survey-modal-dialog').dialog('close'); scope.survey_name = ""; scope.survey_description = ""; scope.$emit('SurveySaved'); } else{ scope.survey_name = ""; scope.survey_description = ""; url = GetBasePath('job_templates') + id + '/survey_spec/'; Rest.setUrl(url); Rest.post({ name: scope.survey_name, description: scope.survey_description, spec: scope.survey_questions }) .success(function () { // Wait('stop'); $('#survey-modal-dialog').dialog('close'); scope.$emit('SurveySaved'); }) .error(function (data, status) { ProcessErrors(scope, data, status, { hdr: 'Error!', msg: 'Failed to add new survey. Post returned status: ' + status }); }); } }; }; }]);