Survey
This commit is contained in:
		
						commit
						1371a82f8d
					
				|  | @ -0,0 +1,8 @@ | |||
| .bundle/ | ||||
| log/*.log | ||||
| pkg/ | ||||
| test/dummy/db/*.sqlite3 | ||||
| test/dummy/db/*.sqlite3-journal | ||||
| test/dummy/log/*.log | ||||
| test/dummy/tmp/ | ||||
| test/dummy/.sass-cache | ||||
|  | @ -0,0 +1,14 @@ | |||
| source "https://rubygems.org" | ||||
| 
 | ||||
| # Declare your gem's dependencies in survey.gemspec. | ||||
| # Bundler will treat runtime dependencies like base dependencies, and | ||||
| # development dependencies will be added by default to the :development group. | ||||
| gemspec | ||||
| 
 | ||||
| # Declare any dependencies that are still in development here instead of in | ||||
| # your gemspec. These might include edge Rails or gems from your path or | ||||
| # Git. Remember to move these dependencies to your gemspec before releasing | ||||
| # your gem to rubygems.org. | ||||
| 
 | ||||
| # To use debugger | ||||
| # gem 'debugger' | ||||
|  | @ -0,0 +1,92 @@ | |||
| PATH | ||||
|   remote: . | ||||
|   specs: | ||||
|     survey (0.0.1) | ||||
|       rails (~> 4.1.5) | ||||
| 
 | ||||
| GEM | ||||
|   remote: https://rubygems.org/ | ||||
|   specs: | ||||
|     actionmailer (4.1.5) | ||||
|       actionpack (= 4.1.5) | ||||
|       actionview (= 4.1.5) | ||||
|       mail (~> 2.5.4) | ||||
|     actionpack (4.1.5) | ||||
|       actionview (= 4.1.5) | ||||
|       activesupport (= 4.1.5) | ||||
|       rack (~> 1.5.2) | ||||
|       rack-test (~> 0.6.2) | ||||
|     actionview (4.1.5) | ||||
|       activesupport (= 4.1.5) | ||||
|       builder (~> 3.1) | ||||
|       erubis (~> 2.7.0) | ||||
|     activemodel (4.1.5) | ||||
|       activesupport (= 4.1.5) | ||||
|       builder (~> 3.1) | ||||
|     activerecord (4.1.5) | ||||
|       activemodel (= 4.1.5) | ||||
|       activesupport (= 4.1.5) | ||||
|       arel (~> 5.0.0) | ||||
|     activesupport (4.1.5) | ||||
|       i18n (~> 0.6, >= 0.6.9) | ||||
|       json (~> 1.7, >= 1.7.7) | ||||
|       minitest (~> 5.1) | ||||
|       thread_safe (~> 0.1) | ||||
|       tzinfo (~> 1.1) | ||||
|     arel (5.0.1.20140414130214) | ||||
|     builder (3.2.2) | ||||
|     erubis (2.7.0) | ||||
|     hike (1.2.3) | ||||
|     i18n (0.6.11) | ||||
|     json (1.8.1) | ||||
|     mail (2.5.4) | ||||
|       mime-types (~> 1.16) | ||||
|       treetop (~> 1.4.8) | ||||
|     mime-types (1.25.1) | ||||
|     minitest (5.4.1) | ||||
|     multi_json (1.10.1) | ||||
|     polyglot (0.3.5) | ||||
|     rack (1.5.2) | ||||
|     rack-test (0.6.2) | ||||
|       rack (>= 1.0) | ||||
|     rails (4.1.5) | ||||
|       actionmailer (= 4.1.5) | ||||
|       actionpack (= 4.1.5) | ||||
|       actionview (= 4.1.5) | ||||
|       activemodel (= 4.1.5) | ||||
|       activerecord (= 4.1.5) | ||||
|       activesupport (= 4.1.5) | ||||
|       bundler (>= 1.3.0, < 2.0) | ||||
|       railties (= 4.1.5) | ||||
|       sprockets-rails (~> 2.0) | ||||
|     railties (4.1.5) | ||||
|       actionpack (= 4.1.5) | ||||
|       activesupport (= 4.1.5) | ||||
|       rake (>= 0.8.7) | ||||
|       thor (>= 0.18.1, < 2.0) | ||||
|     rake (10.3.2) | ||||
|     sprockets (2.12.2) | ||||
|       hike (~> 1.2) | ||||
|       multi_json (~> 1.0) | ||||
|       rack (~> 1.0) | ||||
|       tilt (~> 1.1, != 1.3.0) | ||||
|     sprockets-rails (2.1.4) | ||||
|       actionpack (>= 3.0) | ||||
|       activesupport (>= 3.0) | ||||
|       sprockets (~> 2.8) | ||||
|     sqlite3 (1.3.9) | ||||
|     thor (0.19.1) | ||||
|     thread_safe (0.3.4) | ||||
|     tilt (1.4.1) | ||||
|     treetop (1.4.15) | ||||
|       polyglot | ||||
|       polyglot (>= 0.3.1) | ||||
|     tzinfo (1.2.2) | ||||
|       thread_safe (~> 0.1) | ||||
| 
 | ||||
| PLATFORMS | ||||
|   ruby | ||||
| 
 | ||||
| DEPENDENCIES | ||||
|   sqlite3 | ||||
|   survey! | ||||
|  | @ -0,0 +1,20 @@ | |||
| Copyright 2014 YOURNAME | ||||
| 
 | ||||
| Permission is hereby granted, free of charge, to any person obtaining | ||||
| a copy of this software and associated documentation files (the | ||||
| "Software"), to deal in the Software without restriction, including | ||||
| without limitation the rights to use, copy, modify, merge, publish, | ||||
| distribute, sublicense, and/or sell copies of the Software, and to | ||||
| permit persons to whom the Software is furnished to do so, subject to | ||||
| the following conditions: | ||||
| 
 | ||||
| The above copyright notice and this permission notice shall be | ||||
| included in all copies or substantial portions of the Software. | ||||
| 
 | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||
| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||||
| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | ||||
| LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | ||||
| OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | ||||
| WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
|  | @ -0,0 +1,3 @@ | |||
| = Survey | ||||
| 
 | ||||
| This project rocks and uses MIT-LICENSE. | ||||
|  | @ -0,0 +1,32 @@ | |||
| begin | ||||
|   require 'bundler/setup' | ||||
| rescue LoadError | ||||
|   puts 'You must `gem install bundler` and `bundle install` to run rake tasks' | ||||
| end | ||||
| 
 | ||||
| require 'rdoc/task' | ||||
| 
 | ||||
| RDoc::Task.new(:rdoc) do |rdoc| | ||||
|   rdoc.rdoc_dir = 'rdoc' | ||||
|   rdoc.title    = 'Survey' | ||||
|   rdoc.options << '--line-numbers' | ||||
|   rdoc.rdoc_files.include('README.rdoc') | ||||
|   rdoc.rdoc_files.include('lib/**/*.rb') | ||||
| end | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| Bundler::GemHelper.install_tasks | ||||
| 
 | ||||
| require 'rake/testtask' | ||||
| 
 | ||||
| Rake::TestTask.new(:test) do |t| | ||||
|   t.libs << 'lib' | ||||
|   t.libs << 'test' | ||||
|   t.pattern = 'test/**/*_test.rb' | ||||
|   t.verbose = false | ||||
| end | ||||
| 
 | ||||
| 
 | ||||
| task default: :test | ||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							|  | @ -0,0 +1,266 @@ | |||
| // Check Questions Length
 | ||||
| function checkQuestionsLength() { | ||||
| 	var questionsLength = $('.questions > .attributes').length; | ||||
| 	if(questionsLength == 1) { | ||||
| 		$('.questions .delete').addClass('hide'); | ||||
| 	} else { | ||||
| 		$('.questions .delete').removeClass('hide'); | ||||
| 	}; | ||||
| }; | ||||
| 
 | ||||
| // Role Attribute Template Data
 | ||||
| function setData(l, length, optionsI, className) { | ||||
| 	if(!optionsI) { | ||||
| 		optionsI = 0; | ||||
| 	} | ||||
| 	var id = "questionnaire_survey_survey_questions_attributes_", | ||||
| 		name = "questionnaire_survey[survey_questions_attributes][", | ||||
| 		optionID = l+"_survey_question_options_attributes_"+optionsI+"_name_translations_", | ||||
| 		optionName = l+"][survey_question_options_attributes]["+optionsI+"][name_translations]", | ||||
| 		radiogroupsID = l+"_survey_question_radiogroups_attributes_"+optionsI+"_name_translations_", | ||||
| 		radiogroupsName = l+"][survey_question_radiogroups_attributes]["+optionsI+"][name_translations]"; | ||||
| 	data = { | ||||
| 		_l: l, | ||||
| 		_ques: "new", | ||||
| 		_length: length, | ||||
| 		_className: className, | ||||
| 		_destroy: [id+l+"_destroy", name+l+"][_destroy]"], | ||||
| 		_sequence : [id+l+"_sequence",name+l+"][sequence]",length-1], | ||||
| 		_title_translations: [id+l+"_title_translations", name+l+"][title_translations]", "questions_title_"+l,{"en":"","zh_tw":""}], | ||||
| 		_description_translations: [id+l+"_description_translations", name+l+"][description_translations]", "questions_depiction_"+l,{"en":"","zh_tw":""}], | ||||
| 		_type: [id+l+"_type", name+l+"][type]"], | ||||
| 		_is_required: [id+l+"_is_required", name+l+"][is_required]",false], | ||||
| 		_option: [id+optionID, name+optionName, "attributes_"+l+"_options_"+optionsI+"_",{"en":"","zh_tw":""}], | ||||
| 		_radiogroups: [id+radiogroupsID, name+radiogroupsName, "attributes_"+l+"_radiogroups_"+optionsI+"_",{"en":"","zh_tw":""}], | ||||
| 		_custom_option: [id+l+"_custom_option", name+l+"][custom_option]",false] | ||||
| 	}; | ||||
| 	return data; | ||||
| }; | ||||
| 
 | ||||
| function setEditData(l, length, d, optionsI, className) { | ||||
| 	if(!optionsI) { | ||||
| 		optionsI = 0; | ||||
| 	} | ||||
| 	var id = "questionnaire_survey_survey_questions_attributes_", | ||||
| 		name = "questionnaire_survey[survey_questions_attributes][", | ||||
| 		optionID = l+"_survey_question_options_attributes_"+optionsI+"_name_translations_", | ||||
| 		optionName = l+"][survey_question_options_attributes]["+optionsI+"][name_translations]", | ||||
| 		radiogroupsID = l+"_survey_question_radiogroups_attributes_"+optionsI+"_name_translations_", | ||||
| 		radiogroupsName = l+"][survey_question_radiogroups_attributes]["+optionsI+"][name_translations]"; | ||||
| 	data = { | ||||
| 		_l: l, | ||||
| 		_ques: "old", | ||||
| 		_length: length, | ||||
| 		_className: className, | ||||
| 		_destroy: [id+l+"__destroy", name+l+"][_destroy]"], | ||||
| 		_id: [id+l+"_id", name+l+"][id]",d.qid], | ||||
| 		_sequence : [id+l+"_sequence",name+l+"][sequence]",d.sequence], | ||||
| 		_title_translations: [id+l+"_title_translations", name+l+"][title_translations]", "questions_title_"+l,d.title_translations], | ||||
| 		_description_translations: [id+l+"_description_translations", name+l+"][description_translations]", "questions_depiction_"+l,d.description_translations], | ||||
| 		_type: [id+l+"_type", name+l+"][type]",d.type], | ||||
| 		_is_required: [id+l+"_is_required", name+l+"][is_required]",d.is_required], | ||||
| 		_option: [id+optionID, name+optionName, "attributes_"+l+"_options_"+optionsI+"_"], | ||||
| 		_radiogroups: [id+radiogroupsID, name+radiogroupsName, "attributes_"+l+"_radiogroups_"+optionsI+"_"], | ||||
| 		_custom_option: [id+l+"_custom_option", name+l+"][custom_option]",d.custom_option] | ||||
| 	}; | ||||
| 	return data; | ||||
| }; | ||||
| 
 | ||||
| function setEditQuestionAttributes(l, length, d, optionsI, className) { | ||||
| 	if(!optionsI) { | ||||
| 		optionsI = 0; | ||||
| 	} | ||||
| 	var id = "questionnaire_survey_survey_questions_attributes_", | ||||
| 		name = "questionnaire_survey[survey_questions_attributes][", | ||||
| 		optionID = l+"_survey_question_options_attributes_"+optionsI+"_name_translations_", | ||||
| 		optionName = l+"][survey_question_options_attributes]["+optionsI+"][name_translations]", | ||||
| 		radiogroupsID = l+"_survey_question_radiogroups_attributes_"+optionsI+"_name_translations_", | ||||
| 		radiogroupsName = l+"][survey_question_radiogroups_attributes]["+optionsI+"][name_translations]", | ||||
| 		option_id = l+"][survey_question_options_attributes]["+optionsI+"][id]", | ||||
| 		destroy = l+"][survey_question_options_attributes]["+optionsI+"][_destroy]", | ||||
| 		radiogroups_id = l+"][survey_question_radiogroups_attributes]["+optionsI+"][id]"; | ||||
| 	data = { | ||||
| 		_l: l, | ||||
| 		_length: length, | ||||
| 		_ques: "old", | ||||
| 		_className: className, | ||||
| 		_destroy: [name+destroy], | ||||
| 		_option: [id+optionID, name+optionName, "attributes_"+l+"_options_"+optionsI+"_", d.name_translations], | ||||
| 		_radiogroups: [id+radiogroupsID, name+radiogroupsName, "attributes_"+l+"_radiogroups_"+optionsI+"_",d.name_translations], | ||||
| 		_options_id: [name+option_id,d.qid], | ||||
| 		_radiogroups_id: [name+radiogroups_id,d.qid] | ||||
| 
 | ||||
| 	}; | ||||
| 	return data; | ||||
| }; | ||||
| 
 | ||||
| function inputAppendLength(element, length) { | ||||
| 	if(length == 2) { | ||||
| 		element.closest('.add-target').find('.remove-input').addClass('hide').prev().addClass('last'); | ||||
| 	} | ||||
| 	var option = element.closest('.input-append'); | ||||
| 	if( option.data( 'question-option' ) == "old" ){ | ||||
| 		option.hide().removeAttr( 'question-option' ).find( "input.should_destroy_option" ).val("1"); | ||||
| 	} else if( option.data( "question-option" ) == "new"){ | ||||
| 		option.remove(); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| function editQuestion (dataArray){ | ||||
| 	var l = $('.questions > .attributes').length  || 0; | ||||
| 	$.each(dataArray,function ( i, d ) { | ||||
| 		$('#template-survery').tmpl(setEditData(l, $('.questions > .attributes').length + 1, d)).appendTo($('.questions')); | ||||
| 		checkQuestionsLength(); | ||||
| 		textareaResizable(); // from textarea-lang-btn.js
 | ||||
| 		if( d.type > 1 && d.type < 5 ){ | ||||
| 			onQuestionTypeChanged( $(".questions .field-type:eq("+ i +")"), d.type ); | ||||
| 			$.each(d.survey_question_options,function ( x, data ){ | ||||
| 				$('#template-survery-option').tmpl(setEditQuestionAttributes( l, "", data, x, "options" )).insertBefore($(".questions .field-type:eq("+ i +") .options .add-btn")); | ||||
| 				$(".questions .field-type:eq("+ i +") .options").data("index",x); | ||||
| 			}) | ||||
| 		} else if( d.type == 5 ) { | ||||
| 			onQuestionTypeChanged( $(".questions .field-type:eq("+ i +")"), d.type ); | ||||
| 			$.each(d.survey_question_radiogroups,function ( x, data ){ | ||||
| 				$('#template-survery-option').tmpl(setEditQuestionAttributes( l, "", data, x, "rgl" )).insertBefore($(".questions .field-type:eq("+ i +") .rgl .add-btn")); | ||||
| 				$(".questions .field-type:eq("+ i +") .options").data("index",x); | ||||
| 			}) | ||||
| 			$.each(d.survey_question_options,function ( x, data ){ | ||||
| 				$('#template-survery-option').tmpl(setEditQuestionAttributes( l, "", data, x, "options" )).insertBefore($(".questions .field-type:eq("+ i +") .options .add-btn")); | ||||
| 				$(".questions .field-type:eq("+ i +") .options").data("index",x); | ||||
| 			}) | ||||
| 		} | ||||
| 		l++; | ||||
| 	}) | ||||
| } | ||||
| 
 | ||||
| function onQuestionTypeChanged ( $fieldType, _val ){ | ||||
| 	if(_val < 2) { | ||||
| 		$fieldType.fadeOut(300); | ||||
| 	} else { | ||||
| 		$fieldType.fadeIn(300); | ||||
| 		if(_val < 5) { | ||||
| 			$fieldType.find('.rgl, hr').addClass('hide').siblings('.allow').removeClass('hide'); | ||||
| 		} else { | ||||
| 			$fieldType.find('.rgl, hr').removeClass('hide').siblings('.allow').addClass('hide'); | ||||
| 		} | ||||
| 	}; | ||||
| } | ||||
| 
 | ||||
| $(function() { | ||||
| 	var l = $('.questions > .attributes').length  || 0; | ||||
| 	if($('#survey_redirect_mode').prop('checked')) { | ||||
| 		$('.questions').fadeOut(300); | ||||
| 		$('.redirect-url').fadeIn(300); | ||||
| 	} else { | ||||
| 		$('.questions').fadeIn(300); | ||||
| 		$('.redirect-url').fadeOut(300); | ||||
| 	}; | ||||
| 	$('#survey_redirect_mode').change(function(event) { | ||||
| 		if($(this).prop('checked')) { | ||||
| 			$('.questions').fadeOut(300); | ||||
| 			$('.redirect-url').fadeIn(300); | ||||
| 		} else { | ||||
| 			$('.questions').fadeIn(300); | ||||
| 			$('.redirect-url').fadeOut(300); | ||||
| 		} | ||||
| 	}); | ||||
| 	$('.field-type').each(function() { | ||||
| 		$(this).children('.control-group').each(function() { | ||||
| 			$(this).data().index = $(this).find('.input-append').length | ||||
| 		}); | ||||
| 	}); | ||||
| 	$('.add-target').each(function() { | ||||
| 		if($(this).children('.input-append').length == 1) { | ||||
| 			$(this).find('.remove-input').addClass('hide').prev().addClass('last'); | ||||
| 		}; | ||||
| 	}); | ||||
| 	$('.add-question').on(clickEvent, function(event) { | ||||
| 		$('#template-survery').tmpl(setData(l, $('.questions > .attributes[data-question]').length + 1)).appendTo($('.questions')); | ||||
| 		checkQuestionsLength(); | ||||
| 		textareaResizable(); // from textarea-lang-btn.js
 | ||||
| 		l += 1; | ||||
| 	}); | ||||
| 
 | ||||
| 	$('.questions').on('change', '.type-selector', function(event) { | ||||
| 		var $fieldType = $(this).closest('.control-group').siblings('.field-type'), | ||||
| 			_val = $(this).val(), | ||||
| 			_index = $(this).closest('.attributes').data().index; | ||||
| 
 | ||||
| 		onQuestionTypeChanged( $fieldType, _val ); | ||||
| 	}); | ||||
| 	$('.questions').on(clickEvent, "input[type=checkbox]", function(){ | ||||
| 		if( $( this ).is(":checked") ) | ||||
| 			$( this ).parent().find( 'input[type=hidden]' ).val("1"); | ||||
| 		else | ||||
| 			$( this ).parent().find( 'input[type=hidden]' ).val("0"); | ||||
| 	}) | ||||
| 
 | ||||
| 	$('.questions').on('keyup', '.q-title', function(event) { | ||||
| 		var $questionsTitle = $(this).closest('.attributes-body').siblings('.attributes-header').find('.questions-title'), | ||||
| 			$tabPane = $(this).closest('.tab-content'); | ||||
| 		$questionsTitle.text($tabPane.find('.active input[type="text"]').val()) | ||||
| 		event.preventDefault(); | ||||
| 		/* Act on the event */ | ||||
| 	}); | ||||
| 	$(".questions").sortable({ | ||||
| 		update : function ( event, ui ){ | ||||
| 			$(".questions .attributes").each( function ( i ){ | ||||
| 				$( this ).find( "input.sequence" ).val( i ); | ||||
| 				$( this ).find( "h4 span:eq(0)" ).text( i + 1 ); | ||||
| 				$( this ).attr( "data-index", i ); | ||||
| 			}) | ||||
| 		} | ||||
| 	}); | ||||
| 
 | ||||
| 	$('.questions').on(clickEvent, '.add-btn a, .remove-input, .delete, .attributes-header h4 i, .btn-group .btn', function(event) { | ||||
| 		if($(this).hasClass('remove-input')){ | ||||
| 			inputAppendLength($(this), $(this).closest('.add-target').children('.input-append').length); | ||||
| 		} else if($(this).hasClass('delete')) { | ||||
| 			$(this).closest('.attributes').fadeOut(300, function() { | ||||
| 				if( $( this ).data( 'question' ) == "old" ){ | ||||
| 					$(this).hide().removeAttr('data-question'); | ||||
| 					$( this ).find( '.should_destroy' ).val(1); | ||||
| 					l--; | ||||
| 					checkQuestionsLength(); | ||||
| 					$('.questions .attributes[data-question]').each(function(index, el) { | ||||
| 						$( this ).find( "input.sequence" ).val( index ); | ||||
| 						$( this ).find( "h4 span:eq(0)" ).text( index + 1 ); | ||||
| 						$( this ).attr( "data-index", index ); | ||||
| 					}); | ||||
| 				} else if( $( this ).data( 'question' ) == "new" ){ | ||||
| 					$( this ).remove(); | ||||
| 					l--; | ||||
| 					checkQuestionsLength(); | ||||
| 					$('.questions .attributes[data-question]').each(function(index, el) { | ||||
| 						$( this ).find( "input.sequence" ).val( index ); | ||||
| 						$( this ).find( "h4 span:eq(0)" ).text( index + 1 ); | ||||
| 						$( this ).attr( "data-index", index ); | ||||
| 					}); | ||||
| 				} | ||||
| 			}); | ||||
| 		} else if($(this).hasClass('icon-caret-up') || $(this).hasClass('icon-caret-down')) { | ||||
| 			if($(this).hasClass('icon-caret-up')) { | ||||
| 				$(this).closest('.attributes-header').siblings('.attributes-body').slideUp(300) | ||||
| 				$(this).addClass('icon-caret-down').removeClass('icon-caret-up'); | ||||
| 			} else { | ||||
| 				$(this).closest('.attributes-header').siblings('.attributes-body').slideDown(300) | ||||
| 				$(this).addClass('icon-caret-up').removeClass('icon-caret-down'); | ||||
| 			} | ||||
| 		} else if($(this).hasClass('change-title')){ | ||||
| 			var $questionsTitle = $(this).closest('.attributes-body').siblings('.attributes-header').find('.questions-title'), | ||||
| 				$tabPane = $(this).closest('.btn-group').siblings('.tab-content'); | ||||
| 			$questionsTitle.text($tabPane.find('div').not('.active').children('input[type="text"]').val()) | ||||
| 		} else { | ||||
| 			var _i = $(this).closest('.control-group').data('index') || 0, | ||||
| 				_className = $(this).closest('.control-group').attr('class').match(/options|rgl/g)[0], | ||||
| 				_index = $(this).closest('.attributes').data().index, | ||||
| 				_length = $(this).closest('.add-btn').siblings('.input-append').length; | ||||
| 			$('#template-survery-option').tmpl(setData(_index, "", _i, _className)).insertBefore($(this).closest('.add-btn')); | ||||
| 			$(this).closest('.add-target').find('.input-append').find('.remove-input').removeClass('hide').prev().removeClass('last'); | ||||
| 			_i += 1 | ||||
| 			$(this).closest('.control-group').data('index', _i); | ||||
| 		} | ||||
| 		event.preventDefault(); | ||||
| 	}); | ||||
| 	checkQuestionsLength(); | ||||
| }); | ||||
|  | @ -0,0 +1,150 @@ | |||
| .o-question { | ||||
|   font-size: 15px; | ||||
| } | ||||
| .o-question input[type=checkbox], .o-question input[type=radio] { | ||||
|   margin: 0; | ||||
| } | ||||
| .o-question textarea { | ||||
|   resize: vertical; | ||||
| } | ||||
| .o-question-topic { | ||||
|   font-size: 2em; | ||||
|   line-height: normal; | ||||
|   margin: 0; | ||||
|   padding: 0.5em 0; | ||||
| } | ||||
| .o-question-description { | ||||
|   font-size: 0.9em; | ||||
|   line-height: 1.5em; | ||||
| } | ||||
| .o-question-list { | ||||
|   clear: both; | ||||
|   margin: 40px 0; | ||||
|   padding: 0; | ||||
|   font-weight: bold; | ||||
| } | ||||
| .o-question-list > li { | ||||
|   margin: 0 0 0 40px; | ||||
|   padding: 16px 0; | ||||
|   border-top: solid 1px #eee; | ||||
|   position: relative; | ||||
| } | ||||
| .o-question-list > li .required-star { | ||||
|   position: absolute; | ||||
|   left: -42px; | ||||
|   padding-top: 4px; | ||||
| } | ||||
| .o-question-list > li:first-child { | ||||
|   border: 0; | ||||
| } | ||||
| .o-question-title { | ||||
|   font-weight: bold; | ||||
|   font-size: 1.2em; | ||||
|   line-height: 1.5em; | ||||
|   margin-bottom: 16px; | ||||
| } | ||||
| .o-question-title + .o-question-description { | ||||
|   font-weight: normal; | ||||
|   background-color: #f6f6f6; | ||||
|   padding: 16px; | ||||
|   position: relative; | ||||
|   margin: 10px 0 10px 0; | ||||
|   width: 90%; | ||||
| } | ||||
| .o-question-title + .o-question-description:before { | ||||
|   display: block; | ||||
|   content: ""; | ||||
|   border-left: 12px solid transparent; | ||||
|   border-right: 12px solid transparent;  | ||||
|   border-bottom: 12px solid #f6f6f6; | ||||
|   position: absolute; | ||||
|   top: -12px; | ||||
|   left: 16px; | ||||
| } | ||||
| .o-question-title + input[type=text], | ||||
| .o-question-title + textarea, | ||||
| .o-question-title + select, | ||||
| .o-question-description + input[type=text], | ||||
| .o-question-description + textarea, | ||||
| .o-question-description + select { | ||||
|   display: block; | ||||
| } | ||||
| .o-question-title + input[type=text], .o-question-title + textarea { | ||||
|   border: solid 1px #ccc; | ||||
|   padding: 6px; | ||||
|   margin: 20px 0; | ||||
|   line-height: 24px; | ||||
| } | ||||
| .o-question-title + input[type=text] { | ||||
|   width: 40%; | ||||
| } | ||||
| .o-question-title + textarea { | ||||
|   width: 70%; | ||||
| } | ||||
| .o-question-group { | ||||
|   margin: 20px 0; | ||||
|   padding: 0; | ||||
| } | ||||
| .o-question-option { | ||||
|   font-weight: normal; | ||||
| } | ||||
| .o-question-group.view-list { | ||||
|   list-style: none; | ||||
| } | ||||
| .o-question-group.view-list .o-question-option {} | ||||
| .o-question-group.view-list > li { | ||||
|   margin-top: 8px; | ||||
| } | ||||
| .o-question-group.view-list > li:first-child { | ||||
|   margin: 0; | ||||
| } | ||||
| .o-question-group.view-list > li > * { | ||||
|   display: inline-block; | ||||
|   margin: 0; | ||||
|   padding: 0; | ||||
|   vertical-align: middle; | ||||
| } | ||||
| .o-question-group.view-list > li input + .o-question-option { | ||||
|   margin: 0 0 0 12px; | ||||
| } | ||||
| .o-question-group.view-dropdown { | ||||
|   height: 24px; | ||||
|   line-height: 24px; | ||||
| } | ||||
| .o-question-group.view-grid { | ||||
|   border-collapse: collapse; | ||||
|   max-width: 90%; | ||||
|   min-width: 50%; | ||||
|   width: auto; | ||||
| } | ||||
| .o-question-group.view-grid th, .o-question-group.view-grid td { | ||||
|   padding: 6px; | ||||
| } | ||||
| .o-question-group.view-grid thead th { | ||||
|   text-align: center; | ||||
| } | ||||
| .o-question-group.view-grid tbody th {} | ||||
| .o-question-group.view-grid tbody .odd .o-question-title, .o-question-group.view-grid tbody .odd td { | ||||
|   background-color: #f6f6f6; | ||||
| } | ||||
| .o-question-group.view-grid .o-question-title { | ||||
|   font-size: 1em; | ||||
| } | ||||
| .o-question-group.view-grid tbody .odd .o-question-title { | ||||
|   background-color: transparent; | ||||
| } | ||||
| .o-question-group.view-grid tbody .odd td {} | ||||
| .o-question-group.view-grid tbody tr:hover td { | ||||
|   background-color: #aaa; | ||||
| } | ||||
| .o-question-group.view-grid tbody td { | ||||
|   vertical-align: middle; | ||||
|   text-align: center; | ||||
| } | ||||
| .o-question-group.view-grid tbody td input { | ||||
|   vertical-align: baseline; | ||||
| } | ||||
| .o-question-action { | ||||
|   padding: 20px; | ||||
|   background-color: #f6f6f6; | ||||
| } | ||||
|  | @ -0,0 +1,3 @@ | |||
| // Place all the styles related to the survey controller here. | ||||
| // They will automatically be included in application.css. | ||||
| // You can use Sass (SCSS) here: http://sass-lang.com/ | ||||
|  | @ -0,0 +1,26 @@ | |||
| class Admin::SurveysAnswersController < OrbitAdminController | ||||
| 
 | ||||
|   def initialize | ||||
|     super | ||||
|     @app_title = 'survey_answer' | ||||
|   end | ||||
| 
 | ||||
|   def index | ||||
|     @survey = ::Survey.find(params[:survey_id]) | ||||
|     @answers = (params[:sort]) ? get_sorted_and_filtered("@survey.survey_answers") : get_viewable("@survey.survey_answers") | ||||
|     respond_to do |format| | ||||
|       format.html # index.html.erb | ||||
|       format.xml  { render :xml => @qas } | ||||
|       format.js | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   def delete | ||||
|     @survey = ::Survey.find(params[:survey_id]) | ||||
|     if params[:ids] | ||||
|       answers = @survey.survey_answers.any_in(:_id => params[:ids]).destroy_all | ||||
|     end | ||||
|     redirect_to panel_survey_back_end_survey_answers_url(@survey, :direction => params[:direction], :sort => params[:sort], :sort_options => params[:sort_options]) | ||||
|   end | ||||
| 
 | ||||
| end | ||||
|  | @ -0,0 +1,210 @@ | |||
| class Admin::SurveysController < OrbitAdminController | ||||
|   include Admin::SurveysHelper | ||||
| 
 | ||||
|   before_action ->(module_app = @app_title) { set_variables module_app } | ||||
|   before_action :set_survey, only: [:edit, :destroy, :export, :set_answers, :jump, :duplicate_it] | ||||
| 
 | ||||
|   def initialize | ||||
|     super | ||||
|     @app_title = 'survey' | ||||
|   end | ||||
| 
 | ||||
|   def index | ||||
|     @filter_fields = {} | ||||
|     @table_fields = [:title, 'survey.postdate', 'survey.deadline', 'survey.results_count', 'survey.update_user'] | ||||
| 
 | ||||
|     !params[:sort].blank? ? sort = {params[:sort].to_sym=>params[:order]} : sort = {:postdate=>"desc"} | ||||
| 
 | ||||
|     @surveys = QuestionnaireSurvey.all.order_by(sort) | ||||
| 
 | ||||
|     @surveys = search_data(@surveys,[:title]).page(params[:page]).per(10) | ||||
|      | ||||
|     if request.xhr? | ||||
|       render :partial => "index" | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   def new | ||||
|     @survey = QuestionnaireSurvey.new | ||||
|     @primary_locale = I18n.locale.to_s | ||||
|     @secondary_locale = (I18n.locale == :zh_tw) ? "en" : "zh_tw" | ||||
|   end | ||||
| 
 | ||||
|   def create | ||||
|     @survey = QuestionnaireSurvey.new(survey_params) | ||||
| 
 | ||||
|     @survey.create_user_id = current_user.id | ||||
|     @survey.update_user_id = current_user.id | ||||
| 
 | ||||
|     respond_to do |format| | ||||
|       if @survey.save | ||||
|         format.html { redirect_to(admin_surveys_path) } | ||||
|         format.xml  { render :xml => @survey, :status => :created, :location => @survey } | ||||
|       else | ||||
|         format.html { render :action => "new" } | ||||
|         format.xml  { render :xml => @survey.errors, :status => :unprocessable_entity } | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   def edit | ||||
|     @primary_locale = I18n.locale.to_s | ||||
|     @secondary_locale = (I18n.locale == :zh_tw) ? "en" : "zh_tw" | ||||
| 
 | ||||
|     @sqs = [] | ||||
|     @survey.survey_questions.each do |sq| | ||||
|       sq['title_translations'] = sq.title_translations | ||||
|       sq['description_translations'] = sq.description_translations | ||||
|       sq['qid'] = sq.id.to_s | ||||
|       temp = [] | ||||
|       sq.survey_question_options.each do |sqo| | ||||
|         sqo['name_translations'] = sqo.name_translations | ||||
|         sqo['qid'] = sqo.id.to_s | ||||
|         temp << sqo | ||||
|       end | ||||
|       temp = [] | ||||
|       sq.survey_question_radiogroups.each do |sqr| | ||||
|         sqr['name_translations'] = sqr.name_translations | ||||
|         sqr['qid'] = sqr.id.to_s | ||||
|         temp << sqr | ||||
|       end | ||||
|       sq.survey_question_radiogroups = temp | ||||
|       @sqs << sq | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   def update | ||||
|     uid = params[:id].split('-').last | ||||
|     @survey = QuestionnaireSurvey.find_by(:uid=>uid) | ||||
|     @survey.update_user_id = current_user.id | ||||
| 
 | ||||
|     respond_to do |format| | ||||
|       if @survey.update_attributes(survey_params) | ||||
|         format.html { redirect_to(admin_surveys_url(:page => params[:page])) } | ||||
|         format.xml  { head :ok } | ||||
|       else | ||||
|         format.html { render :action => "edit" } | ||||
|         format.xml  { render :xml => @survey.errors, :status => :unprocessable_entity } | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   def destroy | ||||
|     @survey.destroy | ||||
|     redirect_to "/admin/surveys" | ||||
| 
 | ||||
|     # @survey = QuestionnaireSurvey.find(params[:id]) | ||||
| 
 | ||||
|     # @survey.destroy | ||||
| 
 | ||||
|     # respond_to do |format| | ||||
| 
 | ||||
|     #   format.html { redirect_to(panel_survey_back_end_surveys_url) } | ||||
|     #   format.js | ||||
|     # end | ||||
|   end | ||||
| 
 | ||||
|   def delete | ||||
|     if params[:ids] | ||||
|       surveys = QuestionnaireSurvey.any_in(:_id => params[:ids]).destroy_all | ||||
|     end | ||||
|     redirect_to "/admin/surveys" | ||||
|     # redirect_to panel_survey_back_end_surveys_url(:direction => params[:direction], :sort => params[:sort], :sort_options => params[:sort_options]) | ||||
|   end | ||||
| 
 | ||||
|   def export | ||||
| 
 | ||||
|     @chart_data, @survey_questions, @survey_answers = @survey.generate_chart_data | ||||
|     respond_to do |format| | ||||
|       format.xlsx { | ||||
|         response.headers['Content-Disposition'] = 'attachment; filename="export.xlsx"' | ||||
|       } | ||||
|     end | ||||
| 
 | ||||
|   end | ||||
| 
 | ||||
|   def set_answers   | ||||
| 
 | ||||
|   end | ||||
| 
 | ||||
|   def jump  | ||||
| 
 | ||||
|     @questions = @survey.survey_questions.all | ||||
| 
 | ||||
|     @jump_to_options = [[ t('survey.not_jump'), 0 ], [t('survey.jump_to_end'), 1]] | ||||
|     @jump_to_options += @questions.collect {|q| [ q.title, q.id.to_s ] } | ||||
|   end | ||||
| 
 | ||||
|   def duplicate_it | ||||
| 
 | ||||
|     @new_survey = QuestionnaireSurvey.new | ||||
| 
 | ||||
|     @survey.attributes.each do |key, value| | ||||
|       unless ['_id', 'created_at', 'updated_at', 'update_user_id'].include? key | ||||
|         if @survey.respond_to?(key + '_translations') | ||||
|           @new_survey.send(key + '_translations=', value) | ||||
|         else | ||||
|           @new_survey.write_attribute(key, value) | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|     @survey.survey_questions.all.each do |question| | ||||
|       new_question = @new_survey.survey_questions.new | ||||
|       question.attributes.each do |key, value| | ||||
|         unless ['_id', 'survey_id'].include? key | ||||
|           if question.respond_to?(key + '_translations') | ||||
|             new_question.send(key + '_translations=', value) | ||||
|           else | ||||
|             new_question.write_attribute(key, value) | ||||
|           end | ||||
|         end | ||||
|       end | ||||
|       question.survey_question_options.all.each do |option| | ||||
|         new_option = new_question.survey_question_options.new | ||||
|         option.attributes.each do |key, value| | ||||
|           unless ['_id', 'survey_question_id'].include? key | ||||
|             if option.respond_to?(key + '_translations') | ||||
|               new_option.send(key + '_translations=', value) | ||||
|             else | ||||
|               new_option.write_attribute(key, value) | ||||
|             end | ||||
|           end | ||||
|         end | ||||
|       end | ||||
|       question.survey_question_radiogroups.all.each do |radiogroup| | ||||
|         new_radiogroup = new_question.survey_question_radiogroups.new | ||||
|         radiogroup.attributes.each do |key, value| | ||||
|           unless ['_id', 'survey_question_id'].include? key | ||||
|             if radiogroup.respond_to?(key + '_translations') | ||||
|               new_radiogroup.send(key + '_translations=', value) | ||||
|             else | ||||
|               new_radiogroup.write_attribute(key, value) | ||||
|             end | ||||
|           end | ||||
|         end | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     @new_survey.create_user_id = current_user.id | ||||
|     @new_survey.update_user_id = current_user.id | ||||
|     @new_survey.uid = nil | ||||
| 
 | ||||
|     @new_survey.save! | ||||
| 
 | ||||
|     respond_to do |format| | ||||
|       format.html { redirect_to(admin_surveys_url) } | ||||
|       format.xml  { render :xml => @survey, :status => :created, :location => @new_survey } | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   private | ||||
| 
 | ||||
|   def set_survey | ||||
|     @survey = QuestionnaireSurvey.find(params[:id]) | ||||
|   end | ||||
| 
 | ||||
|   def survey_params | ||||
|     params.require(:questionnaire_survey).permit! | ||||
|   end | ||||
|    | ||||
| end | ||||
|  | @ -0,0 +1,169 @@ | |||
| class SurveysController < ApplicationController | ||||
| 
 | ||||
|   include MemberHelper | ||||
| 
 | ||||
|   def index | ||||
| 
 | ||||
|     questionnairesurveys = QuestionnaireSurvey.any_of( {:postdate.lte => Time.now} ).desc(:postdate).page(OrbitHelper.params[:page_no]).per(OrbitHelper.page_data_count) | ||||
| 
 | ||||
|     surveys = questionnairesurveys.collect do |a| | ||||
| 
 | ||||
|       if !OrbitHelper.params[:page_no].blank? | ||||
|         title = ('<a href="'+ OrbitHelper.url_to_show(a.to_param) + "?method=show_data&page_no=#{OrbitHelper.params[:page_no]}" + '">' + a.title + '</a>').html_safe | ||||
|       else | ||||
|         title = ('<a href="'+ OrbitHelper.url_to_show(a.to_param) + '?method=show_data">' + a.title + '</a>').html_safe | ||||
|       end | ||||
| 
 | ||||
|       { | ||||
|         "title" => title, | ||||
|         "time_range" => QuestionnaireSurvey.time_range(a), | ||||
|         "write" => QuestionnaireSurvey.write(a), | ||||
|         "result" => QuestionnaireSurvey.result(a) | ||||
|       } | ||||
|     end | ||||
|     { | ||||
|       "surveys" => surveys, | ||||
|       "extras" => { | ||||
|         "widget-title"=>t('survey.survey'), | ||||
|         "th_time_range" => t('survey.time_range'), | ||||
|         "th_title" => t("survey.title"), | ||||
|         "th_write" => t('survey.write'), | ||||
|         "th_result" => t('survey.result') | ||||
|       }, | ||||
|       "total_pages" => questionnairesurveys.total_pages | ||||
|     }  | ||||
| 
 | ||||
|   end | ||||
| 
 | ||||
|   def show_data | ||||
| 
 | ||||
|     params = OrbitHelper.params | ||||
| 
 | ||||
|     survey = QuestionnaireSurvey.find_by(uid: params[:uid]) | ||||
| 
 | ||||
|     { | ||||
|       'survey' => survey, | ||||
|       'time_range' => QuestionnaireSurvey.time_range(survey) | ||||
|     } | ||||
| 
 | ||||
|   end | ||||
| 
 | ||||
|   def show | ||||
| 
 | ||||
|     params = OrbitHelper.params | ||||
| 
 | ||||
|     survey = QuestionnaireSurvey.find_by(uid: params[:uid]) | ||||
| 
 | ||||
| 
 | ||||
|     if survey.redirect_mode | ||||
| 
 | ||||
|       redirect_url = survey.redirect_url | ||||
| 
 | ||||
|       { | ||||
|         'redirect_url' => redirect_url | ||||
|       } | ||||
| 
 | ||||
|     else | ||||
| 
 | ||||
|       questions = survey.survey_questions.all.entries | ||||
| 
 | ||||
|       if survey.jump_mode | ||||
|         answers = Hash[questions.collect{ |o| [o.id.to_s, o.id.to_s] }] | ||||
|         jumpable_questions = questions.select{ |q| q.jumpable? && q.can_set_jump? } | ||||
|         jump_tos_map = jumpable_questions.map(&:get_jump_tos).inject(:merge) | ||||
|       end | ||||
|       { | ||||
|         'survey' => survey, | ||||
|         'redirect_url' => '', | ||||
|         'questions' => questions, | ||||
|         'answers' => answers, | ||||
|         'jump_tos_map' => jump_tos_map | ||||
|       } | ||||
| 
 | ||||
|     end | ||||
| 
 | ||||
|   end | ||||
| 
 | ||||
|   def update | ||||
| 
 | ||||
|     uid = params[:id].split('-').last | ||||
|     @survey = QuestionnaireSurvey.find_by(:uid=>uid) | ||||
|     | ||||
|     answer = params[:answer] | ||||
|     @answer_model = @survey.survey_answers.new | ||||
|     @survey.survey_questions.each do |question| | ||||
|       qid = question.id.to_s | ||||
|       if question.is_required && answer[qid].blank? && !@survey.jump_mode #&& (! @survey.jump_mode || ( @survey.jump_mode && question.jumpable? ) ) | ||||
|         @answer_model.errors.add question.title, t('survey_question.required_error') | ||||
|       else | ||||
|         case question.type | ||||
|         when SurveyQuestion::Radio, SurveyQuestion::Select | ||||
|           if question.custom_option && answer[qid] == 'custom_option' | ||||
|             @answer_model[qid] = answer[qid + '_custom_option'] | ||||
|           else | ||||
|             if answer[qid] | ||||
|               @answer_model[qid] = question.survey_question_options.find(answer[qid]).name | ||||
|             end | ||||
|           end | ||||
|         when SurveyQuestion::Check | ||||
|           @answer_model[qid] = [] | ||||
|           if answer[qid] | ||||
|             answer[qid].each do |oid, value| | ||||
|               if value.to_i != 0 | ||||
|                 if question.custom_option && oid == 'custom_option' | ||||
|                   @answer_model[qid].push answer[qid + '_custom_option'] | ||||
|                 else | ||||
|                   @answer_model[qid].push question.survey_question_options.find(oid).name | ||||
|                 end | ||||
|               end | ||||
|             end | ||||
|           end | ||||
|         when SurveyQuestion::Radiogroup | ||||
|           @answer_model[qid] = {} | ||||
|           options = Hash[question.survey_question_options.collect{|o| [ o.id.to_s, o.name ] }] | ||||
|           radiogroups = Hash[question.survey_question_radiogroups.collect{|rg| [ rg.id.to_s, rg.name] }] | ||||
|           if answer[qid] | ||||
|             answer[qid].each do |oid, value| | ||||
|               unless value.blank? | ||||
|                 @answer_model[qid][oid] = radiogroups[value] | ||||
|               else | ||||
|                 if question.is_required | ||||
|                   @answer_model.errors.add question.title, t('survey_question.required_error') | ||||
|                 end | ||||
|               end | ||||
|             end | ||||
|           end | ||||
|         when SurveyQuestion::Oneline, SurveyQuestion::Multiline | ||||
|           @answer_model[qid] = answer[qid] | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|     if @answer_model.errors.empty? | ||||
|       @answer_model.save! | ||||
|       render :answer_success | ||||
|     else | ||||
|       @survey_answer_error = @answer_model.errors.full_messages.join(',') | ||||
|       render :answer_error | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   def result | ||||
|     params = OrbitHelper.params | ||||
| 
 | ||||
|     survey = QuestionnaireSurvey.find_by(uid: params[:uid]) | ||||
|     # survey.result_type = QuestionnaireSurvey::ResultChart if params[:force_chart] | ||||
|     case survey.result_type | ||||
|     when QuestionnaireSurvey::ResultChart | ||||
|       chart_data, survey_questions, survey_answers = survey.generate_chart_data | ||||
|     end | ||||
| 
 | ||||
|     { | ||||
|       'survey' => survey, | ||||
|       'chart_data' => chart_data, | ||||
|       'survey_questions' => survey_questions, | ||||
|       'survey_answers' => survey_answers | ||||
|     } | ||||
| 
 | ||||
|   end | ||||
| 
 | ||||
| end | ||||
|  | @ -0,0 +1,31 @@ | |||
| module Admin::SurveysHelper | ||||
|   def page_for_survey(survey=nil) | ||||
|     ann_page = nil | ||||
|     pages = Page.where(:module=>'survey') | ||||
|      | ||||
|     # pages.each do |page| | ||||
|     #   if page.categories.count ==1 | ||||
|     #     if page.categories.include?(bulletin.category.id.to_s) | ||||
|     #       ann_page = page | ||||
|     #     end | ||||
|     #   end | ||||
|     #   break if !ann_page.nil? | ||||
|     # end | ||||
| 
 | ||||
|     # if ann_page.nil? | ||||
|     #    pages.each do |page| | ||||
|     #     if page.categories.include?(bulletin.category.id.to_s) | ||||
|     #       ann_page = page | ||||
|     #     end | ||||
|     #     break if !ann_page.nil? | ||||
|     #   end | ||||
|     # end | ||||
| 
 | ||||
|     ann_page = pages.first if ann_page.nil? | ||||
|     if !survey.blank? | ||||
|       request.protocol+(request.host_with_port+ann_page.url+'/'+survey.to_param).gsub('//','/') rescue "/" | ||||
|     else | ||||
|       request.protocol+(request.host_with_port+'/'+I18n.locale.to_s+ann_page.url+'/').gsub('//','/') rescue "/" | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  | @ -0,0 +1,160 @@ | |||
| # encoding: utf-8 | ||||
| class QuestionnaireSurvey | ||||
| 
 | ||||
|   include Mongoid::Document | ||||
|   include Mongoid::Timestamps | ||||
|   include Slug | ||||
| 
 | ||||
|   ResultChart = 0 | ||||
|   ResultExtern = 1 | ||||
|   ResultFile = 2 | ||||
| 
 | ||||
|   scope :can_display, ->{where(is_hidden: false)} | ||||
| 
 | ||||
|   field :title, as: :slug_title, type: String, localize: true | ||||
|   field :description, :localize => true | ||||
| 
 | ||||
|   field :create_user_id | ||||
|   field :update_user_id | ||||
| 
 | ||||
|   field :postdate, :type => DateTime | ||||
|   field :deadline, :type => DateTime | ||||
| 
 | ||||
|   field :is_hidden, :type => Boolean, :default => false | ||||
| 
 | ||||
|   field :result_type, :type => Integer, :default => 0 | ||||
|   field :extern_link | ||||
|   mount_uploader :upload_file, AssetUploader | ||||
| 
 | ||||
|   field :jump_mode, :type => Boolean, :default => false | ||||
| 
 | ||||
|   field :redirect_mode, :type => Boolean, :default => false | ||||
|   field :redirect_url, :type => String | ||||
|    | ||||
|   # validates :title, :at_least_one => true | ||||
|   # validates :title, :presence => { :message => I18n.t("survey.title") } | ||||
| 
 | ||||
|   has_many :survey_questions, :autosave => true, :dependent => :destroy | ||||
|   has_many :survey_answers, :dependent => :destroy | ||||
| 
 | ||||
|   accepts_nested_attributes_for :survey_questions, :allow_destroy => true | ||||
| 
 | ||||
|   before_save :check_deadline#, :update_avliable_language | ||||
| 
 | ||||
|   def update_user | ||||
|     User.find(update_user_id) rescue nil | ||||
|   end | ||||
| 
 | ||||
|   def update_user=(user) | ||||
|     self.update_user_id = user.id | ||||
|   end | ||||
| 
 | ||||
|   def self.time_range(data) | ||||
| 
 | ||||
|     r = "#{data.postdate.to_date}" | ||||
| 
 | ||||
|     if data.deadline | ||||
|       r += " - #{data.deadline.to_date}"  | ||||
|     else | ||||
|       r += " - #{I18n.t(:no_deadline)}" | ||||
|     end | ||||
| 
 | ||||
|     r | ||||
|   end | ||||
| 
 | ||||
|   def self.result(data) | ||||
|     if ( data.result_type == QuestionnaireSurvey::ResultChart && data.deadline && Time.now > data.deadline ) || | ||||
|        ( data.result_type == QuestionnaireSurvey::ResultExtern && !data.extern_link.blank? ) || | ||||
|        ( data.result_type == QuestionnaireSurvey::ResultFile && data.upload_file? ) | ||||
|        ('<a target="_blank" href="'+ OrbitHelper.url_to_show(data.to_param) + '?method=result&force_chart=true' + '"><span class="result"><i class="icon-align-left"></i></span></a>').html_safe | ||||
|     else | ||||
|       '' | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   def self.write(data) | ||||
|     unless data.deadline && Time.now > data.deadline | ||||
|       ('<a target="_blank" href="'+ OrbitHelper.url_to_show(data.to_param) + '"><span class="write"><i class="icon-edit"></i></span></a>').html_safe | ||||
|     else | ||||
|       '' | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   def generate_chart_data | ||||
|     survey_questions = self.survey_questions.all | ||||
|     survey_answers = self.survey_answers.all | ||||
| 
 | ||||
|     chart_data = {} | ||||
| 
 | ||||
|     survey_questions.each do |question| | ||||
|       qid = question.id.to_s | ||||
|       options = question.survey_question_options.map(&:name) | ||||
|       case question.type | ||||
|       when SurveyQuestion::Radio, SurveyQuestion::Select | ||||
|         chart_data[qid] = {} | ||||
|         answers = survey_answers.each do |answer| | ||||
|           if answer[qid] | ||||
|             this_answer = answer[qid] | ||||
|             unless options.include? this_answer | ||||
|               this_answer = I18n.t('survey_question.use_custom_option') | ||||
|             end | ||||
|             chart_data[qid][this_answer] ||= 0 | ||||
|             chart_data[qid][this_answer] += 1 | ||||
|           end | ||||
|         end | ||||
|       when SurveyQuestion::Check | ||||
|         chart_data[qid] = {} | ||||
|         answers = survey_answers.each do |answer| | ||||
|           if answer[qid] | ||||
|             answer[qid].each do |option| | ||||
|               this_answer = option | ||||
|               unless options.include? this_answer | ||||
|                 this_answer = I18n.t('survey_question.use_custom_option') | ||||
|               end | ||||
|               chart_data[qid][this_answer] ||= 0 | ||||
|               chart_data[qid][this_answer] += 1 | ||||
|             end | ||||
|           end | ||||
|         end | ||||
|       when SurveyQuestion::Radiogroup | ||||
|         chart_data[qid] = {} | ||||
|         answers = survey_answers.each do |answer| | ||||
|           if answer[qid] | ||||
|             answer[qid].each do |option, group| | ||||
|               chart_data[qid][option] ||= {} | ||||
|               chart_data[qid][option][group] ||= 0 | ||||
|               chart_data[qid][option][group] += 1 | ||||
|             end | ||||
|           end | ||||
|         end | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     [chart_data, survey_questions, survey_answers] | ||||
|   end | ||||
| 
 | ||||
|   def expired? | ||||
|     (self.deadline < Time.now) rescue false | ||||
|   end | ||||
| 
 | ||||
|   protected | ||||
|    | ||||
|   def check_deadline | ||||
|     if(!self.deadline.nil? and (self.deadline < self.postdate )) | ||||
|       self.deadline = nil | ||||
|     end | ||||
|   end | ||||
|    | ||||
|   # def update_avliable_language | ||||
|   #   VALID_LOCALES.each  do |locale| | ||||
|   #     if (title_translations[locale].blank? rescue true) | ||||
|   #       self["available_for_#{locale}".to_sym] = false  | ||||
|   #     else | ||||
|   #       self["available_for_#{locale}".to_sym] = true | ||||
|   #     end | ||||
|   #   end | ||||
|   # end | ||||
| 
 | ||||
|   paginates_per 10 | ||||
| 
 | ||||
| end | ||||
|  | @ -0,0 +1,7 @@ | |||
| class SurveyAnswer | ||||
|   include Mongoid::Document | ||||
|   include Mongoid::Timestamps | ||||
| 
 | ||||
|   belongs_to :questionnaire_survey | ||||
| 
 | ||||
| end | ||||
|  | @ -0,0 +1,49 @@ | |||
| class SurveyQuestion | ||||
| 
 | ||||
|   Oneline = 0 | ||||
|   Multiline = 1 | ||||
|   Radio = 2 | ||||
|   Check = 3 | ||||
|   Select = 4 | ||||
|   Radiogroup = 5 | ||||
| 
 | ||||
|   include Mongoid::Document | ||||
| 
 | ||||
|   field :title, :localize => true | ||||
|   field :description, :localize => true | ||||
|   field :is_required, :type => Boolean | ||||
|   field :type, :type => Integer | ||||
| 
 | ||||
|   # allow custom answer option | ||||
|   field :custom_option, :type => Boolean | ||||
| 
 | ||||
|   field :sequence, :type => Integer, :default => 0 | ||||
|   | ||||
|   belongs_to :questionnaire_survey | ||||
|   embeds_many :survey_question_options | ||||
|   embeds_many :survey_question_radiogroups | ||||
| 
 | ||||
|   accepts_nested_attributes_for :survey_question_options, :allow_destroy => true | ||||
|   accepts_nested_attributes_for :survey_question_radiogroups, :allow_destroy => true | ||||
| 
 | ||||
|   # default_scope asc(:sequence) | ||||
|   default_scope ->{ asc(:sequence) } | ||||
| 
 | ||||
|   def jumpable? | ||||
|     case type | ||||
|     when SurveyQuestion::Radio, SurveyQuestion::Select | ||||
|       true | ||||
|     else | ||||
|       false | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   def can_set_jump? | ||||
|     ( !custom_option ) | ||||
|   end | ||||
| 
 | ||||
|   def get_jump_tos | ||||
|     Hash[survey_question_options.select{ |o| !o.jump_to.blank? }.collect{ |o| [o.id.to_s, o.jump_to] }] | ||||
|   end | ||||
| 
 | ||||
| end | ||||
|  | @ -0,0 +1,3 @@ | |||
| class SurveyQuestionOneline < SurveyQuestion | ||||
| 
 | ||||
| end | ||||
|  | @ -0,0 +1,8 @@ | |||
| class SurveyQuestionOption | ||||
|   include Mongoid::Document | ||||
| 
 | ||||
|   field :name, :localize => true | ||||
|   field :jump_to, :default => 0 | ||||
| 
 | ||||
|   embedded_in :survey_question | ||||
| end | ||||
|  | @ -0,0 +1,7 @@ | |||
| class SurveyQuestionRadiogroup | ||||
|   include Mongoid::Document | ||||
| 
 | ||||
|   field :name, :localize => true | ||||
| 
 | ||||
|   embedded_in :survey_question | ||||
| end | ||||
|  | @ -0,0 +1,122 @@ | |||
| <% content_for :page_specific_css do %> | ||||
|   <%= stylesheet_link_tag "lib/main-forms" %> | ||||
|   <%= stylesheet_link_tag "lib/wrap-nav" %> | ||||
|   <%= stylesheet_link_tag "lib/main-list" %> | ||||
| <% end %> | ||||
| <% content_for :page_specific_javascript do %> | ||||
|   <%= javascript_include_tag "jquery-ui-custom.js" %> | ||||
|   <%= javascript_include_tag "lib/bootstrap-datetimepicker" %> | ||||
|   <%= javascript_include_tag "lib/datetimepicker/datetimepicker.js" %> | ||||
|   <%= javascript_include_tag "lib/member/textarea-lang-btn.js" %> | ||||
|   <%= javascript_include_tag "lib/jquery.tmpl.min.js" %> | ||||
|   <%= javascript_include_tag "survey.js" %> | ||||
| <% end %> | ||||
| 
 | ||||
| <%= f.error_messages %> | ||||
| 
 | ||||
| <div class="input-area"> | ||||
|   <div class="attributes"> | ||||
|       <div class="attributes-header clearfix"> | ||||
|         <h4>Basic</h4> | ||||
|       </div> | ||||
|       <div class="attributes-body"> | ||||
|   </div> | ||||
| 
 | ||||
|     <!-- Tiltle --> | ||||
|     <div class="control-group"> | ||||
|       <label class="control-label muted" for=""><%= t('survey.title') %></label> | ||||
|       <div class="controls"> | ||||
|         <div class="input-append"> | ||||
|           <div class="tab-content"> | ||||
|             <% @site_in_use_locales.each_with_index do |locale, i| %> | ||||
|             <div class="tab-pane fade <%= ( i == 0 ) ? "active in" : '' %>" id="title_<%= locale %>"> | ||||
|                 <%= f.fields_for :title_translations do |f| %> | ||||
|                   <%= f.text_field locale, :value => (@survey.title_translations[locale] rescue nil), :placeholder=>"#{t("survey.title")}" %> | ||||
|                 <% end %> | ||||
|             </div> | ||||
|             <% end %> | ||||
|           </div> | ||||
|           <div class="btn-group" data-toggle="buttons-radio"> | ||||
|              <% @site_in_use_locales.each_with_index do |locale, i| %> | ||||
|                 <a class="btn <%= ( i == 0 ) ? "active" : '' %>" href="#title_<%= locale %>" data-toggle="tab"><%= t(locale.to_s) %></a> | ||||
|               <% end %> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
| 
 | ||||
|       <!-- Description --> | ||||
|       <div class="control-group"> | ||||
|         <label class="control-label muted"><%= t('survey.description') %></label> | ||||
|         <div class="controls"> | ||||
|           <div class="tab-content textarea-lang"> | ||||
|             <div class="btn-group" data-toggle="buttons-radio"> | ||||
|               <% @site_in_use_locales.each_with_index do |locale, i| %> | ||||
|                 <a class="btn <%= ( i == 0 ) ? "active" : '' %>" href="#textarea_<%= locale %>_0" data-toggle="tab"><%= t(locale.to_s) %></a> | ||||
|               <% end %> | ||||
|             </div> | ||||
|             <% @site_in_use_locales.each_with_index do |locale, i| %> | ||||
|                <div class="tab-pane fade in <%= ( i == 0 ) ? "active" : '' %>" id="textarea_<%= locale %>_0"> | ||||
|                 <%= f.fields_for :description_translations do |f| %> | ||||
|                   <%= f.text_area locale, :class=>'resizable', :value => (@survey.description_translations[locale] rescue nil), :placeholder => "#{t("survey.description")}", :rows=>"3" %> | ||||
|                 <% end %> | ||||
|                </div> | ||||
|             <% end %> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|       <!-- start date --> | ||||
|       <div class="control-group"> | ||||
|         <label class="control-label muted" for="account"><%= t('survey.postdate') %></label> | ||||
|         <div class="controls"> | ||||
|          <%= f.datetime_picker :postdate, :no_label => true %> | ||||
|         </div> | ||||
|       </div> | ||||
|       <!-- end date --> | ||||
|        <div class="control-group"> | ||||
|         <label class="control-label muted" for="account"><%= t('survey.deadline') %></label> | ||||
|         <div class="controls"> | ||||
|          <%= f.datetime_picker :deadline, :no_label => true %> | ||||
|         </div> | ||||
|       </div> | ||||
| 
 | ||||
|        <!-- redirect mode --> | ||||
|         <div class="control-group"> | ||||
|           <label class="control-label muted" for="redirectMode"><%= t('survey.redirect_mode') %></label> | ||||
|           <div class="controls"> | ||||
|             <label class="checkbox"> | ||||
|              <!--  <input name="survey[redirect_mode]" type="hidden" value="0" /> | ||||
|               <input id="survey_redirect_mode" name="survey[redirect_mode]" type="checkbox" value="1" /> --> | ||||
|               <%= f.check_box :redirect_mode, :id =>'survey_redirect_mode' %> | ||||
|               <%= t('survey.is_external') %> | ||||
|             </label> | ||||
|           </div> | ||||
|         </div> | ||||
|         <!-- redirect url --> | ||||
| 
 | ||||
|         <div class="control-group redirect-url hide"> | ||||
|           <label class="control-label muted" for="survey_redirect_url"><%= t('survey.extern_link') %></label> | ||||
|           <div class="controls"> | ||||
|              <%= f.text_field :redirect_url, :class=>"input-xlarge", :placeholder=>"Redirect URL" %> | ||||
|           </div> | ||||
|         </div> | ||||
| 
 | ||||
|       </div> | ||||
|       <!-- questions --> | ||||
|       <div class="questions"> | ||||
|            | ||||
|       </div> | ||||
| 
 | ||||
|     </div> | ||||
| 
 | ||||
|     <div class="form-actions"> | ||||
|       <button type="button" class="btn btn-success add-question"><%= t('survey.add') %></button> | ||||
|       <%= f.submit t('save'), :class=>'btn btn-primary' %> | ||||
|       <%= link_to t('cancel'), get_go_back, :class=>"btn" %>  | ||||
|     </div> | ||||
| 
 | ||||
| <%= render :partial => "questions" %> | ||||
| 
 | ||||
| <script type="text/javascript"> | ||||
|   editQuestion(<%= @sqs.to_json.html_safe %>); | ||||
| </script> | ||||
|  | @ -0,0 +1,53 @@ | |||
| <script> | ||||
|   if(document.querySelectorAll("#orbit-bar").length==0) location.reload(); | ||||
| </script> | ||||
| 
 | ||||
| <table class="table main-list"> | ||||
|   <thead> | ||||
|     <tr class="sort-header"> | ||||
|       <% @table_fields.each do |f| %> | ||||
|         <% if f == 'survey.results_count' %> | ||||
|           <th class='span2'><%= t(f)%></th> | ||||
|         <% else %> | ||||
|           <%= thead(f) %> | ||||
|         <% end %> | ||||
|       <% end %> | ||||
|     </tr> | ||||
|   </thead> | ||||
|   <tbody> | ||||
|     <% @surveys.each do |survey| %> | ||||
|       <tr> | ||||
|         <td> | ||||
|           <% if survey.expired? %> | ||||
|             <%= survey.title %>  <span class='label'><%= t(:expired) %></span> | ||||
|           <% else %> | ||||
|             <a href="<%= page_for_survey(survey) %>" target="_blank"><%= survey.title %></a> | ||||
|           <% end %> | ||||
|           <div class="quick-edit"> | ||||
|             <ul class="nav nav-pills"> | ||||
|               <% if can_edit_or_delete?(survey) %> | ||||
|                 <li><a href="/admin/surveys/<%=survey.id.to_s%>/edit"><%= t(:edit) %></a></li> | ||||
|                 <li><a href="/admin/surveys/<%=survey.id.to_s%>/duplicate_it"><%= t('survey.duplicate_it') %></a></li> | ||||
|                 <li><a href="/admin/surveys/<%=survey.id.to_s%>/jump"><%= t('survey.jump') %></a></li> | ||||
|                 <li><a href="/admin/surveys/<%=survey.id.to_s%>/set_answers"><%= t('survey.set_answers') %></a></li> | ||||
|                 <li><a href="/admin/surveys/<%=survey.id.to_s%>/export?format=xlsx" target="_blank"><%= t('survey.export_csv') %></a></li> | ||||
|                 <li><a href="<%=page_for_survey(survey)%>?method=result&force_chart=true" target="_blank"><%= t('survey.chart') %></a></li> | ||||
|                 <li><a href="#" class="delete text-error" rel="/admin/surveys/<%=survey.id.to_s%>"><%= t(:delete_) %></a></li> | ||||
|               <% end %> | ||||
|             </ul> | ||||
|           </div> | ||||
|         </td> | ||||
|         <td><%= (survey.postdate) ? (format_value survey.postdate) : t(:no_deadline) %></td> | ||||
|         <td><%= (survey.deadline) ? (format_value survey.deadline) : t(:no_deadline) %></td> | ||||
|         <td><%= survey.survey_answers.count %></td> | ||||
|         <td><%= survey.update_user.user_name rescue ''%></td> | ||||
|       </tr> | ||||
|     <% end %> | ||||
|   </tbody> | ||||
| </table> | ||||
| 
 | ||||
| <%= | ||||
|   content_tag :div, class: "bottomnav clearfix" do | ||||
|     content_tag :div, paginate(@surveys), class: "pagination pagination-centered" | ||||
|   end | ||||
| %> | ||||
|  | @ -0,0 +1,176 @@ | |||
| <script id="template-survery" type="text/x-tmpl"> | ||||
|   <div class="attributes" data-index="${_l}" data-question="${_ques}"> | ||||
|     <div class="attributes-header clearfix"> | ||||
|       <a class="btn btn-mini pull-right btn-danger delete" href="#"><i class="icon-trash"></i> <%= t('survey_question.delete') %></a> | ||||
|       <input class="should_destroy" id="${_destroy[0]}" name="${_destroy[1]}" type="hidden"> | ||||
|       <input id="${_sequence[0]}" class="sequence" name="${_sequence[1]}" type="hidden" value="${_sequence[2]}"> | ||||
|       {{if _id}} | ||||
|         <input id="${_id[0]}" name="${_id[1]}" type="hidden" value="${_id[2]}"> | ||||
|       {{/if}} | ||||
| 
 | ||||
|       <h4><b></b> Q<span>${_length}</span> <i class="icon-caret-up"></i> <span class="questions-title">${_title_translations[3].<%= @primary_locale %>}</span></h4> | ||||
|     </div> | ||||
|     <div class="attributes-body"> | ||||
|       <div class="control-group"> | ||||
|         <label class="control-label muted" for=""><%= t('survey_question.title') %></label> | ||||
|         <div class="controls"> | ||||
|           <div class="input-append"> | ||||
|             <div class="tab-content"> | ||||
|               <div class="tab-pane fade active in" id="${_title_translations[2]+'_<%= @primary_locale %>'}"> | ||||
|                 <input class="span4 q-title" id="${_title_translations[0]+'_<%= @primary_locale %>'}" name="${_title_translations[1]+'[<%= @primary_locale %>]'}" type="text" value="${_title_translations[3].<%= @primary_locale %>}" /> | ||||
|               </div> | ||||
|               <div class="tab-pane fade" id="${_title_translations[2]+'_<%= @secondary_locale %>'}"> | ||||
|                 <input class="span4 q-title" id="${_title_translations[0]+'_<%= @secondary_locale %>'}" name="${_title_translations[1]+'[<%= @secondary_locale %>]'}" type="text" value="${_title_translations[3].<%= @secondary_locale %>}" /> | ||||
|               </div> | ||||
|             </div> | ||||
|             <div class="btn-group" data-toggle="buttons-radio"> | ||||
|               <% @site_in_use_locales.each_with_index do |locale, i| %> | ||||
|                   <a class="btn change-title <%= ( i == 0 ) ? "active" : '' %>" href="${'#'+_title_translations[2]+'_<%= locale %>'}" data-toggle="tab"><%= t(locale.to_s) %></a> | ||||
|               <% end %> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="control-group"> | ||||
|         <label class="control-label muted"><%= t('survey_question.description') %></label> | ||||
|         <div class="controls"> | ||||
|           <div class="tab-content textarea-lang"> | ||||
|             <div class="btn-group" data-toggle="buttons-radio"> | ||||
|               <% @site_in_use_locales.each_with_index do |locale, i| %> | ||||
|                   <a class="btn change-title <%= ( i == 0 ) ? "active" : '' %>" href="${'#'+_description_translations[2]+'_<%= locale %>'}" data-toggle="tab"><%= t(locale.to_s) %></a> | ||||
|               <% end %> | ||||
|             </div> | ||||
|             <div class="tab-pane fade active in" id="${_description_translations[2]+'_<%= @primary_locale %>'}"> | ||||
|               <textarea class="resizable" id="${_description_translations[0]+'_<%= @primary_locale %>'}" name="${_description_translations[1]+'[<%= @primary_locale %>]'}" rows="3">${_description_translations[3].<%= @primary_locale %>}</textarea> | ||||
|             </div> | ||||
|             <div class="tab-pane fade" id="${_description_translations[2]+'_<%= @secondary_locale %>'}"> | ||||
|               <textarea class="resizable" id="${_description_translations[0]+'_<%= @secondary_locale %>'}" name="${_description_translations[1]+'[<%= @secondary_locale %>]'}" rows="3">${_description_translations[3].<%= @secondary_locale %>}</textarea> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="control-group"> | ||||
|         <label class="control-label muted" for=""><%= t('survey_question.type') %> </label> | ||||
|         <div class="controls"> | ||||
|           <select class="type-selector" id="${_type[0]}" name="${_type[1]}" > | ||||
|             <option value="0" {{if _type[2] == 0}}selected="selected"{{/if}}><%= t('survey_question.oneline') %></option> | ||||
|             <option value="1" {{if _type[2] == 1}}selected="selected"{{/if}}><%= t('survey_question.multiline') %></option> | ||||
|             <option value="2" {{if _type[2] == 2}}selected="selected"{{/if}}><%= t('survey_question.radio') %></option> | ||||
|             <option value="3" {{if _type[2] == 3}}selected="selected"{{/if}}><%= t('survey_question.check') %></option> | ||||
|             <option value="4" {{if _type[2] == 4}}selected="selected"{{/if}}><%= t('survey_question.select') %></option> | ||||
|             <option value="5" {{if _type[2] == 5}}selected="selected"{{/if}}><%= t('survey_question.radiogroup') %></option> | ||||
|           </select> | ||||
|         </div> | ||||
|       </div> | ||||
| 
 | ||||
|       <div class="field-type" style="display: none"> | ||||
| 
 | ||||
| 
 | ||||
|         <div class="control-group rgl"> | ||||
|           <label for="" class="control-label muted"><%= t('survey_question.radiogroup_label') %></label> | ||||
|           <div class="controls add-input"> | ||||
|             <div class="add-target"> | ||||
|               | ||||
| 
 | ||||
|               <p class="add-btn"> | ||||
|                 <a href="#" class="btn btn-mini btn-primary"><i class="icons-plus"></i> <%= t('survey_question.add') %></a> | ||||
|               </p> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
| 
 | ||||
|         <hr /> | ||||
| 
 | ||||
|         <div class="control-group options"> | ||||
|           <label for="" class="control-label muted"><%= t('survey_question.options_lists') %></label> | ||||
|           <div class="controls add-input"> | ||||
|             <div class="add-target"> | ||||
|               | ||||
| 
 | ||||
|               <p class="add-btn"> | ||||
|                 <a href="#" class="btn btn-mini btn-primary"><i class="icons-plus"></i> <%= t('survey_question.add') %></a> | ||||
|               </p> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="control-group allow"> | ||||
|           <div class="controls"> | ||||
|             <label class="checkbox"> | ||||
|               <input name="${_custom_option[1]}" type="hidden" value="${_custom_option[2] << 0}" /> | ||||
|               <input id="${_custom_option[0]}" type="checkbox" {{if _custom_option[2]}} checked="checked" {{/if}} /> | ||||
|               <%= t('survey_question.custom_option') %> | ||||
|             </label> | ||||
|           </div> | ||||
|         </div> | ||||
| 
 | ||||
| 
 | ||||
|       </div> | ||||
| 
 | ||||
|       <div class="control-group"> | ||||
|         <label class="control-label muted" for="redirectMode"></label> | ||||
|         <div class="controls"> | ||||
|           <label class="checkbox"> | ||||
|             <input name="${_is_required[1]}" type="hidden" value="${_is_required[2] << 0}" /> | ||||
|             <input id="${_is_required[0]}" type="checkbox" {{if _is_required[2]}} checked="checked" {{/if}} /> | ||||
|             <%= t('survey_question.is_required') %> | ||||
|           </label> | ||||
|         </div> | ||||
|       </div> | ||||
| 
 | ||||
|     </div> | ||||
|   </div> | ||||
| </script> | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| <script id="template-survery-option" type="text/x-tmpl"> | ||||
| {{if _className == 'rgl'}} | ||||
|   <div class="input-append" data-question-option="${_ques}"> | ||||
|     {{if _radiogroups_id}} | ||||
|       <input type="hidden" value="${_radiogroups_id[1]}" name="${_radiogroups_id[0]}" /> | ||||
|       <input type="hidden" class="should_destroy_option" name="${_destroy[0]}" /> | ||||
|     {{/if}} | ||||
|     <div class="tab-content"> | ||||
|       <div class="tab-pane fade active in" id="${_radiogroups[2]+'<%= @primary_locale %>'}"> | ||||
|         <input type="text" class="span4" id="${_radiogroups[0]+'<%= @primary_locale %>'}" name="${_radiogroups[1]+'[<%= @primary_locale %>]'}" value="${_radiogroups[3].<%= @primary_locale %>}" /> | ||||
|       </div> | ||||
|       <div class="tab-pane fade" id="${_radiogroups[2]+'<%= @secondary_locale %>'}"> | ||||
|         <input type="text" class="span4" id="${_radiogroups[0]+'<%= @secondary_locale %>'}" name="${_radiogroups[1]+'[<%= @secondary_locale %>]'}" value="${_radiogroups[3].<%= @secondary_locale %>}" /> | ||||
|       </div> | ||||
|     </div> | ||||
|     <div class="btn-group" data-toggle="buttons-radio"> | ||||
|       <% @site_in_use_locales.each_with_index do |locale, i| %> | ||||
|           <a class="btn change-title <%= ( i == 0 ) ? "active" : '' %>" href="${'#'+_radiogroups[2]+'_<%= locale %>'}" data-toggle="tab"><%= t(locale.to_s) %></a> | ||||
|       <% end %> | ||||
|       <a href="#" class="btn remove-input"> | ||||
|         <i class="icon-trash"></i> | ||||
|       </a> | ||||
|     </div> | ||||
|   </div> | ||||
| {{else}} | ||||
|   <div class="input-append" data-question-option="${_ques}"> | ||||
|    {{if _options_id}} | ||||
|       <input type="hidden" value="${_options_id[1]}" name="${_options_id[0]}" /> | ||||
|        <input type="hidden" class="should_destroy_option" name="${_destroy[0]}" /> | ||||
|     {{/if}} | ||||
|     <div class="tab-content"> | ||||
|       <div class="tab-pane fade active in" id="${_option[2]+'<%= @primary_locale %>'}"> | ||||
|         <input type="text" class="span4" id="${_option[0]+'<%= @primary_locale %>'}" name="${_option[1]+'[<%= @primary_locale %>]'}" value="${_option[3].<%= @primary_locale %>}" /> | ||||
|       </div> | ||||
|       <div class="tab-pane fade" id="${_option[2]+'<%= @secondary_locale %>'}"> | ||||
|         <input type="text" class="span4" id="${_option[0]+'<%= @secondary_locale %>'}" name="${_option[1]+'[<%= @secondary_locale %>]'}" value="${_option[3].<%= @secondary_locale %>}" /> | ||||
|       </div> | ||||
|     </div> | ||||
|     <div class="btn-group" data-toggle="buttons-radio"> | ||||
|       <% @site_in_use_locales.each_with_index do |locale, i| %> | ||||
|           <a class="btn change-title <%= ( i == 0 ) ? "active" : '' %>" href="${'#'+_option[2]+'<%= locale %>'}" data-toggle="tab"><%= t(locale.to_s) %></a> | ||||
|       <% end %> | ||||
|       <a href="#" class="btn remove-input"> | ||||
|         <i class="icon-trash"></i> | ||||
|       </a> | ||||
|     </div> | ||||
|   </div> | ||||
| {{/if}} | ||||
| 
 | ||||
| </script> | ||||
|  | @ -0,0 +1,5 @@ | |||
| <%= form_for @survey, url: admin_survey_path(@survey), html: {class: "form-horizontal main-forms"} do |f| %> | ||||
|   <fieldset> | ||||
|     <%= render :partial => 'form', locals: {f: f} %> | ||||
|   </fieldset> | ||||
| <% end %> | ||||
|  | @ -0,0 +1,95 @@ | |||
| # encoding: utf-8 | ||||
| 
 | ||||
| wb = xlsx_package.workbook | ||||
| wb.add_worksheet(name: @survey.title) do |sheet| | ||||
| 
 | ||||
|   row = [] | ||||
|   @survey_questions.each_with_index do |question, i| | ||||
|     if question.type == 2 or question.type == 3 or question.type == 4  | ||||
|       question.survey_question_options.each do |option| | ||||
|         row << "#{i+1}. #{question.title} - #{option.name}" | ||||
|       end | ||||
|     elsif question.type == 5 | ||||
|       question.survey_question_options.each do |option| | ||||
|         question.survey_question_radiogroups.each do |radiogroup| | ||||
|           row << "#{i+1}. #{question.title} - #{option.name} - #{radiogroup.name}" | ||||
|         end | ||||
|       end | ||||
|     else | ||||
|       row << "#{i+1}. #{question.title}" | ||||
|     end | ||||
|     if question.custom_option | ||||
|       row << "#{i+1}. #{question.title} - #{t('survey_question.use_custom_option')}" | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   sheet.add_row row | ||||
| 
 | ||||
|   @survey_answers.each do |answer| | ||||
|     answer_row = [] | ||||
|     @survey_questions.each do |question| | ||||
| 
 | ||||
|       options = question.survey_question_options.collect{|o| o.name } | ||||
| 
 | ||||
|       if question.type == 2 or question.type == 4  | ||||
| 
 | ||||
|         options.collect do |o|  | ||||
|           | ||||
|           if !answer[question.id.to_s].blank? && answer[question.id.to_s].include?(o) | ||||
|             answer_row << '1' | ||||
|           else | ||||
|             answer_row << '' | ||||
|           end | ||||
| 
 | ||||
|         end | ||||
| 
 | ||||
|       elsif question.type == 3 | ||||
| 
 | ||||
|         options.collect do |o|  | ||||
|           | ||||
|           if !answer[question.id.to_s].blank? && answer[question.id.to_s].include?(o) | ||||
|             answer_row << '1' | ||||
|           else | ||||
|             answer_row << '' | ||||
|           end | ||||
|         end | ||||
| 
 | ||||
|       elsif question.type == 5 | ||||
| 
 | ||||
|         question.survey_question_options.each do |option| | ||||
|           question.survey_question_radiogroups.each do |radiogroup| | ||||
|             if !answer[question.id.to_s].blank? && answer[question.id.to_s][option.id.to_s] == radiogroup.name | ||||
|               answer_row << '1' | ||||
|             else | ||||
|               answer_row << '' | ||||
|             end | ||||
|           end | ||||
|         end | ||||
| 
 | ||||
|       else | ||||
|         if answer[question.id.to_s] | ||||
|           answer_row << answer[question.id.to_s] | ||||
|         else | ||||
|           answer_row << '' | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|       if question.custom_option | ||||
|         if !answer[question.id.to_s].blank? | ||||
|           if answer[question.id.to_s].class == Array | ||||
|             answer_row << (answer[question.id.to_s] - options).join | ||||
|           elsif answer[question.id.to_s].class == String | ||||
|             answer_row << ([answer[question.id.to_s]] - options).join | ||||
|           end | ||||
|         else | ||||
|           answer_row << '' | ||||
|         end | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     sheet.add_row answer_row | ||||
| 
 | ||||
|   end | ||||
| 
 | ||||
| end | ||||
| 
 | ||||
|  | @ -0,0 +1,6 @@ | |||
| <%=  render_filter @filter_fields, "index_table" %> | ||||
| <span id="index_table"> | ||||
|   <%= render 'index'%> | ||||
| </span> | ||||
| 
 | ||||
| <%= render 'layouts/delete_modal', delete_options: @delete_options %> | ||||
|  | @ -0,0 +1,4 @@ | |||
| $("#delete_all").attr("action", "<%= delete_admin_surveys_path(:direction => params[:direction], :sort => params[:sort], :filter => @filter, :new_filter => nil, :sort_options => params[:sort_options]) %>"); | ||||
| $("#sort_headers").html("<%= j render 'sort_headers' %>"); | ||||
| $("#tbody_surveys").html("<%= j render :partial => 'survey', :collection => @surveys %>"); | ||||
| $("#survey_pagination").html("<%= j paginate @surveys %>"); | ||||
|  | @ -0,0 +1,56 @@ | |||
| <h1><%= @survey.title %> <%= t('survey.jump') %></h1> | ||||
| 
 | ||||
| <%= form_for @survey, :url => admin_survey_path(@survey), :html => {:class => 'clear'} do |f| %> | ||||
|   <div id="post-body"> | ||||
|     <div id="post-body-content" class="clear"> | ||||
|       <div class="jump_mode"> | ||||
|         <%= f.label :jump_mode, t('survey.jump_mode')%>  | ||||
|         <%= f.check_box :jump_mode %> | ||||
|       </div> | ||||
| 
 | ||||
|       <% @questions.each_with_index do |question, i| %> | ||||
| 
 | ||||
|         <%= f.fields_for :survey_questions, question do |f| %> | ||||
| 
 | ||||
|           <div id="<%= "survey_question_#{question.id}"%>" class="survey_question_item clear"> | ||||
|             <div id="widget-question" class="widget-box"> | ||||
|               <h3 class="widget-title"><i class="icons-help"></i><%= question.title %></h3> | ||||
|               <div class="widget-content"> | ||||
|                 <% if question.jumpable? %> | ||||
|                   <% if question.can_set_jump? %> | ||||
|                     <ol> | ||||
|                       <% question.survey_question_options.each_with_index do |option, i| %> | ||||
| 
 | ||||
|                         <%= f.fields_for :survey_question_options, option do |f| %> | ||||
| 
 | ||||
|                           <li> | ||||
|                             <%= f.label :survey_question_options, option.name %> | ||||
|                             <%= f.select :jump_to, @jump_to_options %> | ||||
|                           </li> | ||||
|                            | ||||
|                         <% end %> | ||||
| 
 | ||||
|                       <% end %> | ||||
|                     </ol> | ||||
|                   <% else %> | ||||
|                     <%= t('survey.right_type_cant_jump') %> | ||||
|                   <% end %> | ||||
|                 <% else %> | ||||
|                   <%= t('survey.wrong_type_cant_jump') %> | ||||
|                 <% end %> | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
| 
 | ||||
|         <% end %> | ||||
| 
 | ||||
|       <% end %> | ||||
| 
 | ||||
|       <div class="form-actions"> | ||||
|         <%= hidden_field_tag 'page', params[:page] if !params[:page].blank? %> | ||||
|         <%= f.submit t('submit'), :class=>'btn btn-primary' %> | ||||
|         <%= link_to t('cancel'), get_go_back, :class=>"btn" %>  | ||||
|       </div> | ||||
|     </div> | ||||
|   </div> | ||||
| <% end %> | ||||
|  | @ -0,0 +1,5 @@ | |||
| <%= form_for @survey, url: admin_surveys_path, html: {class: "form-horizontal main-forms"} do |f| %> | ||||
|   <fieldset> | ||||
|     <%= render :partial => 'form', locals: {f: f} %> | ||||
|   </fieldset> | ||||
| <% end %> | ||||
|  | @ -0,0 +1,94 @@ | |||
| <% content_for :page_specific_css do %> | ||||
|   <%= stylesheet_link_tag "lib/main-forms" %> | ||||
|   <%= stylesheet_link_tag "lib/wrap-nav" %> | ||||
|   <%= stylesheet_link_tag "lib/main-list" %> | ||||
| <% end %> | ||||
| <% content_for :page_specific_javascript do %> | ||||
|   <%= javascript_include_tag "jquery-ui-custom.js" %> | ||||
|   <%= javascript_include_tag "lib/bootstrap-datetimepicker" %> | ||||
|   <%= javascript_include_tag "lib/datetimepicker/datetimepicker.js" %> | ||||
|   <%= javascript_include_tag "lib/member/textarea-lang-btn.js" %> | ||||
|   <%= javascript_include_tag "lib/jquery.tmpl.min.js" %> | ||||
|   <%= javascript_include_tag "survey.js" %> | ||||
| <% end %> | ||||
| 
 | ||||
| <%= form_for @survey, url: admin_survey_path(@survey), html: {class: "form-horizontal main-forms"} do |f| %> | ||||
| 
 | ||||
| <fieldset> | ||||
| 
 | ||||
| <div class="input-area"> | ||||
|   <div class="attributes"> | ||||
|       <div class="attributes-header clearfix"> | ||||
|         <h4><%= @survey.title %> <%= t('survey.set_answers') %></h4> | ||||
|       </div> | ||||
|   </div> | ||||
| 
 | ||||
|   <!-- Result Type --> | ||||
|   <div class="control-group" data-type="0"> | ||||
|     <label class="control-label muted" for="account"><%= t('survey.result_type') %></label> | ||||
|     <div class="controls"> | ||||
|         <%= f.select :result_type, { | ||||
|           t('survey.chart') => QuestionnaireSurvey::ResultChart,  | ||||
|           t('survey.extern_link') => QuestionnaireSurvey::ResultExtern, | ||||
|           t('survey.upload_file') => QuestionnaireSurvey::ResultFile | ||||
|         }, {}, :class => "tinput-medium", :onchange=>"OnSelectionChange (this)" %>       | ||||
|     </div> | ||||
|   </div> | ||||
| 
 | ||||
|   <!-- Extern Link --> | ||||
|   <div class="control-group <%= (@survey.result_type == 1) ? '' : 'hide' %>" data-type="1"> | ||||
|     <label class="control-label muted" for="account"><%= t('survey.extern_link') %></label> | ||||
|     <div class="controls"> | ||||
|         <%= f.text_field :extern_link, :style=>"width:80%;", :class=>'post-extern_link' %> | ||||
|     </div> | ||||
|   </div> | ||||
| 
 | ||||
|   <!-- Upload_file --> | ||||
|   <div class="control-group <%= (@survey.result_type == 2) ? '' : 'hide' %>" data-type="2"> | ||||
|     <label class="control-label muted" for="account"><%= t('survey.upload_file') %></label> | ||||
|     <div class="controls"> | ||||
|         <%= f.file_field :upload_file %> | ||||
|         <% if @survey.upload_file? %> | ||||
|           <div class="controls" data-toggle="buttons-checkbox"> | ||||
|             <%= link_to t(:view), @survey.upload_file.url, {:class => 'for_preview btn', :target => '_blank', :title => t(:view), "data-trigger" => :hover} %> | ||||
|             <label class="checkbox inline btn btn-danger fileupload-remove"> | ||||
|               <%= f.check_box :remove_upload_file %><%= t('survey.remove_upload_file') %> | ||||
|             </label> | ||||
|           </div> | ||||
|         <% end %> | ||||
|     </div> | ||||
|   </div> | ||||
| 
 | ||||
| </div> | ||||
| 
 | ||||
| <div class="form-actions"> | ||||
|   <%= hidden_field_tag 'page', params[:page] if !params[:page].blank? %> | ||||
|   <%= f.submit t('save'), :class=>'btn btn-primary' %> | ||||
|   <%= link_to t('cancel'), get_go_back, :class=>"btn" %>  | ||||
| </div> | ||||
| 
 | ||||
| </fieldset> | ||||
| 
 | ||||
| <% end %> | ||||
| 
 | ||||
| <script type="text/javascript"> | ||||
|     function OnSelectionChange (select) { | ||||
|         var selectedOption = select.options[select.selectedIndex]; | ||||
|         if (selectedOption.value == '1' ) | ||||
|         { | ||||
|           $('.control-group[data-type=1]').removeClass('hide'); | ||||
|           $('.control-group[data-type=2]').addClass('hide'); | ||||
|         } | ||||
|         else if (selectedOption.value == '2' ) | ||||
|         { | ||||
|           $('.control-group[data-type=2]').removeClass('hide'); | ||||
|           $('.control-group[data-type=1]').addClass('hide'); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|           $('.control-group[data-type=1]').addClass('hide'); | ||||
|           $('.control-group[data-type=2]').addClass('hide'); | ||||
|         } | ||||
|     } | ||||
| </script> | ||||
| 
 | ||||
|  | @ -0,0 +1,22 @@ | |||
| <tr  id="<%= dom_id answer %>" class="with_action"> | ||||
|   <td> | ||||
|     <%= check_box_tag 'to_delete[]', answer.id, false, :class => "checkbox_in_list" %> | ||||
|   </td> | ||||
|   <% @survey.survey_questions.each do |question| %> | ||||
|     <td> | ||||
|       <% qid = question.id %> | ||||
|       <% case question.type %> | ||||
|       <% when ::SurveyQuestion::Check %> | ||||
|         <%= ( answer[qid] || [] ).join(', ') %> | ||||
|       <% when ::SurveyQuestion::Radiogroup %> | ||||
|         <% options = Hash[question.survey_question_options.collect{|o| [ o.id.to_s, o.name ] }] %> | ||||
|         <%= ( answer[qid] || {} ).map{|key, value| ( options[key] || key ) + ': ' + value}.join('; ') unless answer[qid].blank? %> | ||||
|       <% else %> | ||||
|         <%= answer[qid] %> | ||||
|       <% end %> | ||||
|     </td> | ||||
|   <% end %> | ||||
|   <td> | ||||
|     <%= answer.created_at %> | ||||
|   </td> | ||||
| </tr> | ||||
|  | @ -0,0 +1 @@ | |||
| alert("<%= @survey_answer_error %>"); | ||||
|  | @ -0,0 +1,2 @@ | |||
| alert("<%= t('survey.answer_success')%>"); | ||||
| window.location.href = "<%= page_for_survey %>"; | ||||
|  | @ -0,0 +1,4 @@ | |||
| <script type="text/javascript"> | ||||
|   alert("<%= t('survey.answer_error')%>: <%= @survey_answer_error %>"); | ||||
|   window.history.back(); | ||||
| </script> | ||||
|  | @ -0,0 +1 @@ | |||
| <%= render 'answer_error' %> | ||||
|  | @ -0,0 +1,4 @@ | |||
| <script type="text/javascript"> | ||||
|   alert("<%= t('survey.answer_success')%>"); | ||||
|   window.location.href = "<%= page_for_survey %>"; | ||||
| </script> | ||||
|  | @ -0,0 +1 @@ | |||
| <%= render 'answer_success' %> | ||||
|  | @ -0,0 +1 @@ | |||
| <%= render_view %> | ||||
|  | @ -0,0 +1,86 @@ | |||
| 
 | ||||
| <%  | ||||
|   data = action_data  | ||||
|   @survey = data["survey"] | ||||
|   @chart_data = data["chart_data"] | ||||
|   @survey_questions = data["survey_questions"] | ||||
|   @survey_answers = data["survey_answers"] | ||||
| %> | ||||
| 
 | ||||
| <% case @survey.result_type %> | ||||
| <% when QuestionnaireSurvey::ResultChart %> | ||||
| 
 | ||||
|   <h1><%= @survey.title %> <%= t('survey.chart') %></h1> | ||||
|   <div> | ||||
|     <section> | ||||
|       <div class="o-question"> | ||||
|         <div class="o-question-description"> | ||||
|           <%= t 'survey.results_count' %>: <%= @survey.survey_answers.count %> | ||||
|         </div> | ||||
|         <ol class="o-question-list"> | ||||
|           <% @survey_questions.each do |question| %> | ||||
|             <% case question.type %> | ||||
|             <% when SurveyQuestion::Radio, SurveyQuestion::Check, ::SurveyQuestion::Select %> | ||||
|               <li> | ||||
|                 <div id="question_chart_<%= question.id.to_s %>" style="width: 600px; height: 300px;"></div> | ||||
|               </li> | ||||
|             <% when SurveyQuestion::Radiogroup %> | ||||
|               <% question.survey_question_options.each do |option| %> | ||||
|                 <li> | ||||
|                   <div id="question_chart_<%= question.id.to_s %>_<%= option.id.to_s %>" style="width: 600px; height: 300px;"></div> | ||||
|                 </li> | ||||
|               <% end %> | ||||
|             <% end %> | ||||
| 
 | ||||
|           <% end %> | ||||
|         </ol> | ||||
|       </div> | ||||
|     </section> | ||||
|   </div> | ||||
| 
 | ||||
|   <script type="text/javascript" src="https://www.google.com/jsapi"></script> | ||||
|   <script type="text/javascript"> | ||||
|     if (window.google) { | ||||
|       window.google.load("visualization", "1", {packages:["corechart"]}); | ||||
|       window.google.setOnLoadCallback(function(){ | ||||
|       <% @survey_questions.each do |question| %> | ||||
|         <% qid = question.id.to_s %> | ||||
|         <% case question.type %> | ||||
|         <% when ::SurveyQuestion::Radio, ::SurveyQuestion::Check, ::SurveyQuestion::Select %> | ||||
|           var data_<%= qid %> = google.visualization.arrayToDataTable([ | ||||
|             ['<%= t("survey_question.option") %>', ''], | ||||
|             <% @chart_data[qid].each do |option, count| %> | ||||
|               ['<%= option %>', <%= count %>], | ||||
|             <% end %> | ||||
|           ]); | ||||
|           var chart_<%= qid %> = new google.visualization.PieChart(document.getElementById('question_chart_<%= qid %>')); | ||||
|           chart_<%= qid %>.draw(data_<%= qid %>, {title: '<%= question.title %>'}); | ||||
|         <% when ::SurveyQuestion::Radiogroup %> | ||||
|           <% options = Hash[question.survey_question_options.collect{|o| [ o.id.to_s, o.name ] }] %> | ||||
|           <% @chart_data[qid].each do |option, groups| %> | ||||
|             var data_<%= qid %>_<%= option %> = google.visualization.arrayToDataTable([ | ||||
|               ['<%= t("survey_question.option") %>', ''], | ||||
|               <% groups.each do |group, count| %> | ||||
|                 ['<%= group %>', <%= count %>], | ||||
|               <% end %> | ||||
|             ]); | ||||
|             var chart_<%= qid %>_<%= option %> = new google.visualization.PieChart(document.getElementById('question_chart_<%= qid %>_<%= option %>')); | ||||
|           chart_<%= qid %>_<%= option %>.draw(data_<%= qid %>_<%= option %>, {title: '<%= question.title %> - <%= options[option] %>'}); | ||||
|           <% end %> | ||||
|         <% end %> | ||||
|       <% end %> | ||||
|       }); | ||||
|     } else { | ||||
|       window.location.href = "<%= survey_path(@survey, :inner => 'true') %>"; | ||||
|     } | ||||
|   </script> | ||||
| <% when QuestionnaireSurvey::ResultExtern %> | ||||
|   <script type="text/javascript"> | ||||
|     window.location.href = "<%= @survey.extern_link %>"; | ||||
|   </script> | ||||
| <% when QuestionnaireSurvey::ResultFile %> | ||||
|   <h1><%= @survey.title %> <%= t('survey.upload_file') %></h1> | ||||
|   <section> | ||||
|     <%= link_to t(:view), @survey.upload_file.url, {:class => 'for_preview btn', :target => '_blank', :title => t(:view), "data-trigger" => :hover} if !@survey.upload_file.blank? %> | ||||
|   </section> | ||||
| <% end %> | ||||
|  | @ -0,0 +1,203 @@ | |||
| <% # encoding: utf-8 %> | ||||
| 
 | ||||
| <%  | ||||
| 	data = action_data  | ||||
| 	@survey = data["survey"] | ||||
| 	@questions = data["questions"] | ||||
| 	@jump_tos_map = data["jump_tos_map"] | ||||
| 	@answers = data["answers"] | ||||
| 
 | ||||
| 	@redirect_url = data["redirect_url"] | ||||
| %> | ||||
| 
 | ||||
| 
 | ||||
| <% if !@redirect_url.blank? %> | ||||
| 
 | ||||
| <script type="text/javascript"> | ||||
|   window.location.href = "<%= @redirect_url %>"; | ||||
| </script> | ||||
| 
 | ||||
| <% else %> | ||||
| 
 | ||||
|   <% unless @survey.deadline && Time.now > @survey.deadline %> | ||||
| 
 | ||||
| 	<div class="o-question"> | ||||
| 	  <%= form_for :answer, :method => :put, :url => survey_path(@survey, :standalone => true), :html => {:class => 'survey clear'} do |f| %> | ||||
| 		<h3 class="o-question-topic"><%= @survey.title %></h3> | ||||
| 		<div class="o-question-description"> | ||||
| 		  <%= @survey.description %> | ||||
| 		</div> | ||||
| 		<ol class="o-question-list"> | ||||
| 		  <% @questions.each_with_index do |question, i| %> | ||||
| 			<li class="question-item question-<%= question.id.to_s %> hide" data-index="<%= i %>" data-type="<%= question.type%>" data-custom="<%= question.custom_option.to_s %>"> | ||||
| 			  <% label = question.title %> | ||||
| 			  <% if question.is_required %> | ||||
| 	        <span class="required-star">(*)</span> | ||||
| 	      <% end %> | ||||
| 			  <%= f.label question.id, label, :class => "o-question-title" %> | ||||
| 			  <% if !question.description.blank? %> | ||||
| 			  <div class="o-question-description"> | ||||
| 				<%= question.description %> | ||||
| 			  </div> | ||||
| 			  <% end %> | ||||
| 			  <% case question.type %> | ||||
| 			  <% when SurveyQuestion::Oneline %> | ||||
| 				<%= f.text_field question.id, :required => question.is_required %> | ||||
| 			  <% when SurveyQuestion::Multiline %> | ||||
| 				<%= f.text_area question.id, :rows => 5, :required => question.is_required %> | ||||
| 			  <% when SurveyQuestion::Radio %> | ||||
| 			  	<ul class="o-question-group view-list"> | ||||
| 				<% question.survey_question_options.each do |option| %> | ||||
| 				  <li> | ||||
| 					<%= f.radio_button question.id, option.id %> | ||||
| 					<%= f.label "#{question.id}_#{option.id}", option.name, :class => 'o-question-option' %> | ||||
| 				  </li> | ||||
| 				<% end %> | ||||
| 				<% if question.custom_option %> | ||||
| 				  <li> | ||||
| 					<%= f.radio_button question.id, 'custom_option' %> | ||||
| 					<%= f.label "#{question.id}_custom_option", t('survey_question.use_custom_option') + ': ', :class => 'o-question-option' %> | ||||
| 					<%= f.text_field "#{question.id}_custom_option" %> | ||||
| 				  </li> | ||||
| 				<% end %> | ||||
| 				</ul> | ||||
| 			  <% when SurveyQuestion::Check %> | ||||
| 			  	<ul class="o-question-group view-list"> | ||||
| 				<%= f.fields_for "#{question.id}" do |cf| %> | ||||
| 				  <% question.survey_question_options.each do |option| %> | ||||
| 					<li> | ||||
| 					  <%= cf.check_box option.id %> | ||||
| 					  <%= cf.label option.id, option.name, :class => 'o-question-option' %> | ||||
| 					</li> | ||||
| 				  <% end %> | ||||
| 				  <% if question.custom_option %> | ||||
| 					<li> | ||||
| 					  <%= cf.check_box 'custom_option' %> | ||||
| 					  <%= f.label "#{question.id}_custom_option", t('survey_question.use_custom_option') + ': ', :class => 'o-question-option' %> | ||||
| 					  <%= f.text_field "#{question.id}_custom_option" %> | ||||
| 					</li> | ||||
| 				  <% end %> | ||||
| 				<% end %> | ||||
| 				</ul> | ||||
| 			  <% when SurveyQuestion::Select %> | ||||
| 				<% options = question.survey_question_options.collect {|o| [ o.name, o.id ] } %> | ||||
| 				<% if question.custom_option %> | ||||
| 				  <% options.push [t('survey_question.use_custom_option'), 'custom_option'] %> | ||||
| 				<% end %> | ||||
| 				<%= f.select question.id, options, {}, :class => 'o-question-group view-dropdown' %> | ||||
| 				<% if question.custom_option %> | ||||
| 				  <%= f.text_field "#{question.id}_custom_option", :class => 'custom_option' %> | ||||
| 				<% end %> | ||||
| 			  <% when SurveyQuestion::Radiogroup %> | ||||
| 				<%= f.fields_for "#{question.id}" do |rgf| %> | ||||
| 				  <table class="o-question-group view-grid"> | ||||
| 					<thead> | ||||
| 					  <tr> | ||||
| 						<th></th> | ||||
| 						<% question.survey_question_radiogroups.each do |radiogroup| %> | ||||
| 						  <th> | ||||
| 							<%= radiogroup.name %> | ||||
| 						  </th> | ||||
| 						<% end %> | ||||
| 					  </tr> | ||||
| 					</thead> | ||||
| 					<tbody> | ||||
| 					  <% question.survey_question_options.each_with_index do |option, j| %> | ||||
| 						<tr<%= (' class="odd"').html_safe if (j % 2 == 0) %>> | ||||
| 						  <th class="o-question-title"> | ||||
| 							<%= option.name %> | ||||
| 						  </th> | ||||
| 						  <% question.survey_question_radiogroups.each do |radiogroup| %> | ||||
| 							<td> | ||||
| 							  <%= rgf.radio_button option.id, radiogroup.id %> | ||||
| 							</td> | ||||
| 						  <% end %> | ||||
| 						</tr> | ||||
| 					  <% end %> | ||||
| 					</tbody> | ||||
| 				  </table> | ||||
| 				<% end %> | ||||
| 			  <% end %> | ||||
| 			</li> | ||||
| 		  <% end %> | ||||
| 		</ol> | ||||
| 		<div> | ||||
| 		  <%= f.submit t('submit'), :class => 'survey-submit' %> | ||||
| 		</div> | ||||
| 	  <% end %> | ||||
| 	</div> | ||||
| 
 | ||||
| 
 | ||||
| 	<%= stylesheet_link_tag "questionnaire" %> | ||||
| 
 | ||||
| 	<%= javascript_include_tag "lib/jquery.form"%> | ||||
| 
 | ||||
| 	<script type="text/javascript"> | ||||
| 	  $('form.survey').ajaxForm({ | ||||
| 	    beforeSubmit: function(a,f,o) { | ||||
| 	      o.dataType = 'script'; | ||||
| 	    }, | ||||
| 	    success: function(data) { | ||||
| 	    } | ||||
| 	  }); | ||||
| 
 | ||||
| 	<% if @survey.jump_mode %> | ||||
| 	  var answers = <%== @answers.to_json %>; | ||||
| 	  var jump_tos_map = <%== @jump_tos_map.to_json %>; | ||||
| 	  var $current_question = $('.question-item').eq(0); | ||||
| 	  var current_index = parseInt($current_question.attr('data-index')); | ||||
| 	  $current_question.removeClass('hide'); | ||||
| 	  $('.survey-submit').click(function(){ | ||||
| 	    $current_question.addClass('hide'); | ||||
| 	    if ( $current_question.attr('data-type') == '<%= SurveyQuestion::Radio %>' || $current_question.attr('data-type') == '<%= SurveyQuestion::Select %>' ) { | ||||
| 	      if ( $current_question.attr('data-type') == '<%= SurveyQuestion::Radio %>' ) { | ||||
| 	        value = $current_question.find('input[type=radio]:checked').val(); | ||||
| 	      } else if ( $current_question.attr('data-type') == '<%= SurveyQuestion::Select %>') { | ||||
| 	        value = $current_question.find('select option:selected').val(); | ||||
| 	      } | ||||
| 	      if ( value == undefined ) { | ||||
| 	        alert("<%= t('survey.must_answer') %>"); | ||||
| 	      } else { | ||||
| 	        jump_to = jump_tos_map[value]; | ||||
| 	        if (jump_to == '1') { | ||||
| 	          return true; | ||||
| 	        } else if ( jump_to != '0' && jump_to != undefined ) { | ||||
| 	          $current_question = $('.question-item.question-' + jump_to); | ||||
| 	        } else { | ||||
| 	          $current_question = $('.question-item[data-index=' + (current_index + 1) + ']'); | ||||
| 	        } | ||||
| 	      } | ||||
| 	    } else { | ||||
| 	      $current_question = $('.question-item[data-index=' + (current_index + 1) + ']'); | ||||
| 	    } | ||||
| 	    if ( $current_question[0] ) { | ||||
| 	      $current_question.removeClass('hide'); | ||||
| 	      current_index = parseInt($current_question.attr('data-index')); | ||||
| 	      return false; | ||||
| 	    } else { | ||||
| 	      return true; | ||||
| 	    } | ||||
| 	    return false; | ||||
| 	  }); | ||||
| 	<% else %> | ||||
| 	  $('.question-item').removeClass('hide'); | ||||
| 	<% end %> | ||||
| 	  $('.question-item[data-type=<%= SurveyQuestion::Select %>][data-custom=true]').each(function(){ | ||||
| 	    $(this).change(function(){ | ||||
| 	      if ( $(this).find('option:selected').val() == 'custom_option' ) { | ||||
| 	        $(this).find('input.custom_option').removeClass('hide'); | ||||
| 	      } else { | ||||
| 	        $(this).find('input.custom_option').addClass('hide'); | ||||
| 	      } | ||||
| 	    }); | ||||
| 	    $(this).trigger('change'); | ||||
| 	  }); | ||||
| 	</script> | ||||
| 
 | ||||
|   <% else %> | ||||
| 
 | ||||
|     the end | ||||
| 
 | ||||
|   <% end %> | ||||
| 
 | ||||
| <% end %> | ||||
|  | @ -0,0 +1,34 @@ | |||
| <% # encoding: utf-8 %> | ||||
| 
 | ||||
| <%  | ||||
| 	data = action_data  | ||||
| 	@survey = data["survey"] | ||||
| 	@time_range = data["time_range"] | ||||
| %> | ||||
| 
 | ||||
| <article class="show-survey" id="spen-survey"> | ||||
| 	 | ||||
|   <h1 class="show-title"> | ||||
|     <span><%= @survey.title %></span> | ||||
|   </h1> | ||||
| 
 | ||||
|   <ul class="post-metadata list-unstyled"> | ||||
|     <li class="metadata-date"> | ||||
|       <i class="fa fa-calendar fa-fw"></i> | ||||
|       <span class="date"><%= @time_range %></span> | ||||
|     </li> | ||||
|   </ul> | ||||
|    | ||||
|   <% if !@survey.description.blank? %> | ||||
|   <blockquote> | ||||
|      <p><%= nl2br(@survey.description) %></p> | ||||
|   </blockquote> | ||||
|   <% end %> | ||||
| 
 | ||||
| </article> | ||||
| 
 | ||||
| <% if !params[:page_no].blank? %> | ||||
| <%= link_to t('back'), page_for_survey+"?page_no=#{params[:page_no]}", :class => 'btn btn-primary' %> | ||||
| <% else %> | ||||
| <%= link_to t('back'), page_for_survey, :class => 'btn btn-primary' %> | ||||
| <% end %> | ||||
|  | @ -0,0 +1,18 @@ | |||
| #!/usr/bin/env ruby | ||||
| # This command will automatically be run when you run "rails" with Rails 4 gems installed from the root of your application. | ||||
| 
 | ||||
| ENGINE_ROOT = File.expand_path('../..', __FILE__) | ||||
| ENGINE_PATH = File.expand_path('../../lib/survey/engine', __FILE__) | ||||
| 
 | ||||
| # Set up gems listed in the Gemfile. | ||||
| ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) | ||||
| require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE']) | ||||
| 
 | ||||
| # require 'rails/all' | ||||
| # require 'rails/engine/commands' | ||||
| require "action_controller/railtie" | ||||
| require "action_mailer/railtie" | ||||
| require "sprockets/railtie" | ||||
| require "rails/test_unit/railtie" | ||||
| require 'rails/engine/commands' | ||||
| require "mongoid/railtie" | ||||
|  | @ -0,0 +1,86 @@ | |||
| en: | ||||
| 
 | ||||
|   survey: | ||||
|     survey: Survey | ||||
|     title: Title | ||||
| 
 | ||||
|     time_range: Date Range | ||||
|     write: Write | ||||
|     result: Result | ||||
| 
 | ||||
|     description: Description | ||||
|     postdate: Start Date | ||||
|     deadline: End Date | ||||
|     no_postdate: No Start Date | ||||
|     no_deadline: No End Date | ||||
|     results_count: Results Count | ||||
|     update_user: Update User | ||||
|     question: Question | ||||
|     is_external: The survey is an external link | ||||
|     add: Add Question | ||||
| 
 | ||||
|     result_type: Result Type (Frontend) | ||||
|     extern_link: External Link | ||||
|     upload_file: Uploaded File | ||||
| 
 | ||||
|     remove_upload_file: Remove Uploaded File | ||||
| 
 | ||||
|     answer_success: Successfully answered,jump back now | ||||
|     answer_error: Unsuccessful answer | ||||
| 
 | ||||
|     answers_list: Answers List | ||||
|     export_csv: Export CSV | ||||
|     chart: Chart | ||||
|     set_answers: Set Answers | ||||
|     duplicate_it: Duplicate It | ||||
| 
 | ||||
|     view_result: View Result | ||||
| 
 | ||||
|     jump: Jump-To | ||||
|     jump_mode: Jump-To Mode | ||||
|     wrong_type_cant_jump: Only radio or select can set jump-to | ||||
|     right_type_cant_jump: Custom option allowed can't set jump-to | ||||
|     not_jump: Not Jump | ||||
|     jump_to_end: End of Survey | ||||
| 
 | ||||
|     redirect: Redirect | ||||
|     redirect_mode: Redirect Mode | ||||
|     redirect_url: Redirect Url | ||||
| 
 | ||||
|     must_answer: Must be Answered | ||||
| 
 | ||||
|     default_widget: | ||||
|       title: Title | ||||
|       time_range: Date Range | ||||
|       result: Result | ||||
| 
 | ||||
|     frontend: | ||||
|         survey: Survey Frontend | ||||
| 
 | ||||
|   survey_question: | ||||
|     title: Question | ||||
|     description: Description | ||||
|     sequence: Sequence | ||||
|     type: Type | ||||
|     is_required: Is Required | ||||
|     required: Required | ||||
|     required_error: Can't not be empty | ||||
|     oneline: Oneline | ||||
|     multiline: Multi-line | ||||
|     radio: Radio | ||||
|     check: Check | ||||
|     select: Select | ||||
|     radiogroup: Radio Group | ||||
|     options_lists: Options List | ||||
|     radiogroup_label: Radio Group Label | ||||
|     radiogroups_lists: Radio Groups List | ||||
|     option: Option | ||||
|     custom_option: Allow Custom Option | ||||
|     use_custom_option: Other | ||||
|     add: Add | ||||
|     delete: Delete | ||||
| 
 | ||||
|     have_not_chart: This type of question havn't chart | ||||
| 
 | ||||
|     move_up: Move up | ||||
|     move_down: Move down | ||||
|  | @ -0,0 +1,91 @@ | |||
| zh_tw: | ||||
| 
 | ||||
|   module_name: | ||||
|     survey: 問卷調查 | ||||
| 
 | ||||
|   survey: | ||||
|     survey: 問卷調查 | ||||
|     title: 問卷標題 | ||||
| 
 | ||||
|     time_range: 問卷期間 | ||||
|     write: 填問卷 | ||||
|     result: 結果 | ||||
| 
 | ||||
|     description: 問卷說明 | ||||
|     postdate: 開始時間 | ||||
|     deadline: 結束時間 | ||||
|     start_deadline: 開始/結束時間 | ||||
|     no_postdate: 沒有開始時間 | ||||
|     no_deadline: 沒有結束時間 | ||||
|     results_count: 填寫人數 | ||||
|     update_user: 最後更新者 | ||||
|     question: 問題 | ||||
|     is_external: 這份問卷為外部連結 | ||||
|     add: 新增題目 | ||||
| 
 | ||||
|     result_type: 前端結果表示方式 | ||||
|     extern_link: 外部連結 | ||||
|     upload_file: 結果文件 | ||||
| 
 | ||||
|     remove_upload_file: 移除存在的結果文件 | ||||
| 
 | ||||
|     answer_success: 問卷填寫成功,現在跳回 | ||||
|     answer_error: 問卷填寫錯誤 | ||||
| 
 | ||||
|     answers_list: 結果清單 | ||||
|     export_csv: 匯出CSV | ||||
|     chart: 結果圖表 | ||||
|     set_answers: 設定結果 | ||||
|     duplicate_it: 複製問卷 | ||||
| 
 | ||||
|     view_result: 查看結果 | ||||
| 
 | ||||
|     jump: 跳題 | ||||
|     jump_mode: 設爲跳題方式回答 | ||||
|     wrong_type_cant_jump: 不是單選或下拉無法使用跳題 | ||||
|     right_type_cant_jump: 允許自定回答的問題無法使用跳題 | ||||
|     not_jump: 依據試卷列出所有問題數 | ||||
|     jump_to_end: 結束問題 | ||||
| 
 | ||||
|     redirect: 問卷跳轉 | ||||
|     redirect_mode: 設爲跳轉模式 | ||||
|     redirect_url: 跳轉地址 | ||||
| 
 | ||||
|     must_answer: 必須回答這個問題 | ||||
| 
 | ||||
|     default_widget: | ||||
|       title: 問卷標題 | ||||
|       time_range: 問卷期間 | ||||
|       write: 填問卷 | ||||
|       result: 結果 | ||||
| 
 | ||||
|     frontend: | ||||
|         survey: 問卷調查前台 | ||||
| 
 | ||||
|   survey_question: | ||||
|     title: 題目 | ||||
|     description: 說明 | ||||
|     sequence: 順序 | ||||
|     type: 作答方式 | ||||
|     is_required: 設為必填 | ||||
|     required: 必填 | ||||
|     required_error: 沒有回答 | ||||
|     oneline: 單行文字 | ||||
|     multiline: 多行文字 | ||||
|     radio: 單選按鈕 | ||||
|     check: 多選方塊 | ||||
|     select: 下拉選單 | ||||
|     radiogroup: 格狀呈現 | ||||
|     options_lists: 選項清單 | ||||
|     radiogroup_label: 橫欄 | ||||
|     radiogroups_lists: 橫欄清單 | ||||
|     option: 選項 | ||||
|     custom_option: 允許自定回答選項 | ||||
|     use_custom_option: 其他 | ||||
|     add: 新增 | ||||
|     delete: 刪除 | ||||
| 
 | ||||
|     have_not_chart: 此種類型問題不含結果圖表 | ||||
| 
 | ||||
|     move_up: 上移 | ||||
|     move_down: 下移 | ||||
|  | @ -0,0 +1,36 @@ | |||
| Rails.application.routes.draw do | ||||
| 
 | ||||
|   locales = Site.first.in_use_locales rescue I18n.available_locales | ||||
|    | ||||
|   scope "(:locale)", locale: Regexp.new(locales.join("|")) do | ||||
|    namespace :admin do | ||||
|     resources :surveys do | ||||
|       collection do | ||||
|         get 'delete' | ||||
|       end | ||||
|       member do | ||||
|         get 'export' | ||||
|         get 'set_answers' | ||||
|         get 'jump' | ||||
|         get 'duplicate_it' | ||||
|       end | ||||
|       resources :answers, :controller => :surveys_answers do | ||||
|         collection do | ||||
|           get 'delete' | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|    end | ||||
| 
 | ||||
|     resources :surveys do | ||||
|       collection do | ||||
|         get ':slug_title-:uid', to: 'surveys#show' | ||||
|       end | ||||
|       member do | ||||
|         get 'result' | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|   end | ||||
|    | ||||
| end | ||||
|  | @ -0,0 +1,4 @@ | |||
| require "survey/engine" | ||||
| 
 | ||||
| module Survey | ||||
| end | ||||
|  | @ -0,0 +1,34 @@ | |||
| module Survey | ||||
|   class Engine < ::Rails::Engine | ||||
|     initializer "survey" do  | ||||
|       OrbitApp.registration "Survey", :type => "ModuleApp" do | ||||
|         module_label "survey.survey" | ||||
|         base_url File.expand_path File.dirname(__FILE__) | ||||
|         widget_methods ["widget","widget1"] | ||||
|         widget_settings [{"data_count"=>10}] | ||||
|         authorizable | ||||
|         frontend_enabled | ||||
|         data_count 1..20 | ||||
| 
 | ||||
|         side_bar do | ||||
|           head_label_i18n 'survey.survey', icon_class: "icons-pie" | ||||
|           available_for "users" | ||||
|           active_for_controllers (['admin/surveys']) | ||||
|           head_link_path "admin_surveys_path" | ||||
| 
 | ||||
|           context_link 'list_', | ||||
|                                 :link_path=>"admin_surveys_path" , | ||||
|                                 :priority=>1, | ||||
|                                 :active_for_action=>{'admin/surveys'=>'index'}, | ||||
|                                 :available_for => 'users' | ||||
|           context_link 'new_',  | ||||
|                                 :link_path=>"new_admin_survey_path" , | ||||
|                                 :priority=>2, | ||||
|                                 :active_for_action=>{'admin/surveys'=>'new'}, | ||||
|                                 :available_for => 'sub_managers' | ||||
|         end | ||||
| 
 | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  | @ -0,0 +1,3 @@ | |||
| module Survey | ||||
|   VERSION = "0.0.1" | ||||
| end | ||||
|  | @ -0,0 +1,4 @@ | |||
| # desc "Explaining what the task does" | ||||
| # task :survey do | ||||
| #   # Task goes here | ||||
| # end | ||||
|  | @ -0,0 +1,19 @@ | |||
| $:.push File.expand_path("../lib", __FILE__) | ||||
| 
 | ||||
| # Maintain your gem's version: | ||||
| require "survey/version" | ||||
| 
 | ||||
| # Describe your gem and declare its dependencies: | ||||
| Gem::Specification.new do |s| | ||||
|   s.name        = "survey" | ||||
|   s.version     = Survey::VERSION | ||||
|   s.authors     = ["RulingDigital"] | ||||
|   s.email       = ["orbit@rulingcom.com"] | ||||
|   s.homepage    = "http://www.rulingcom.com" | ||||
|   s.summary     = "Surveys for Orbit" | ||||
|   s.description = "Surveys for Orbit" | ||||
|   s.license     = "MIT" | ||||
| 
 | ||||
|   s.files = Dir["{app,config,db,lib}/**/*", "MIT-LICENSE", "Rakefile", "README.rdoc"] | ||||
|   s.test_files = Dir["test/**/*"] | ||||
| end | ||||
|  | @ -0,0 +1,28 @@ | |||
| == README | ||||
| 
 | ||||
| This README would normally document whatever steps are necessary to get the | ||||
| application up and running. | ||||
| 
 | ||||
| Things you may want to cover: | ||||
| 
 | ||||
| * Ruby version | ||||
| 
 | ||||
| * System dependencies | ||||
| 
 | ||||
| * Configuration | ||||
| 
 | ||||
| * Database creation | ||||
| 
 | ||||
| * Database initialization | ||||
| 
 | ||||
| * How to run the test suite | ||||
| 
 | ||||
| * Services (job queues, cache servers, search engines, etc.) | ||||
| 
 | ||||
| * Deployment instructions | ||||
| 
 | ||||
| * ... | ||||
| 
 | ||||
| 
 | ||||
| Please feel free to use a different markup language if you do not plan to run | ||||
| <tt>rake doc:app</tt>. | ||||
|  | @ -0,0 +1,6 @@ | |||
| # Add your own tasks in files placed in lib/tasks ending in .rake, | ||||
| # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. | ||||
| 
 | ||||
| require File.expand_path('../config/application', __FILE__) | ||||
| 
 | ||||
| Rails.application.load_tasks | ||||
|  | @ -0,0 +1,13 @@ | |||
| // This is a manifest file that'll be compiled into application.js, which will include all the files
 | ||||
| // listed below.
 | ||||
| //
 | ||||
| // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
 | ||||
| // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
 | ||||
| //
 | ||||
| // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
 | ||||
| // compiled file.
 | ||||
| //
 | ||||
| // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
 | ||||
| // about supported directives.
 | ||||
| //
 | ||||
| //= require_tree .
 | ||||
|  | @ -0,0 +1,15 @@ | |||
| /* | ||||
|  * This is a manifest file that'll be compiled into application.css, which will include all the files | ||||
|  * listed below. | ||||
|  * | ||||
|  * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, | ||||
|  * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path. | ||||
|  * | ||||
|  * You're free to add application-wide styles to this file and they'll appear at the bottom of the | ||||
|  * compiled file so the styles you add here take precedence over styles defined in any styles | ||||
|  * defined in the other CSS/SCSS files in this directory. It is generally better to create a new | ||||
|  * file per style scope. | ||||
|  * | ||||
|  *= require_tree . | ||||
|  *= require_self | ||||
|  */ | ||||
|  | @ -0,0 +1,5 @@ | |||
| class ApplicationController < ActionController::Base | ||||
|   # Prevent CSRF attacks by raising an exception. | ||||
|   # For APIs, you may want to use :null_session instead. | ||||
|   protect_from_forgery with: :exception | ||||
| end | ||||
|  | @ -0,0 +1,2 @@ | |||
| module ApplicationHelper | ||||
| end | ||||
|  | @ -0,0 +1,14 @@ | |||
| <!DOCTYPE html> | ||||
| <html> | ||||
| <head> | ||||
|   <title>Dummy</title> | ||||
|   <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %> | ||||
|   <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %> | ||||
|   <%= csrf_meta_tags %> | ||||
| </head> | ||||
| <body> | ||||
| 
 | ||||
| <%= yield %> | ||||
| 
 | ||||
| </body> | ||||
| </html> | ||||
|  | @ -0,0 +1,3 @@ | |||
| #!/usr/bin/env ruby | ||||
| ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) | ||||
| load Gem.bin_path('bundler', 'bundle') | ||||
|  | @ -0,0 +1,4 @@ | |||
| #!/usr/bin/env ruby | ||||
| APP_PATH = File.expand_path('../../config/application',  __FILE__) | ||||
| require_relative '../config/boot' | ||||
| require 'rails/commands' | ||||
|  | @ -0,0 +1,4 @@ | |||
| #!/usr/bin/env ruby | ||||
| require_relative '../config/boot' | ||||
| require 'rake' | ||||
| Rake.application.run | ||||
|  | @ -0,0 +1,4 @@ | |||
| # This file is used by Rack-based servers to start the application. | ||||
| 
 | ||||
| require ::File.expand_path('../config/environment',  __FILE__) | ||||
| run Rails.application | ||||
|  | @ -0,0 +1,23 @@ | |||
| require File.expand_path('../boot', __FILE__) | ||||
| 
 | ||||
| require 'rails/all' | ||||
| 
 | ||||
| Bundler.require(*Rails.groups) | ||||
| require "survey" | ||||
| 
 | ||||
| module Dummy | ||||
|   class Application < Rails::Application | ||||
|     # Settings in config/environments/* take precedence over those specified here. | ||||
|     # Application configuration should go into files in config/initializers | ||||
|     # -- all .rb files in that directory are automatically loaded. | ||||
| 
 | ||||
|     # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. | ||||
|     # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. | ||||
|     # config.time_zone = 'Central Time (US & Canada)' | ||||
| 
 | ||||
|     # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. | ||||
|     # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] | ||||
|     # config.i18n.default_locale = :de | ||||
|   end | ||||
| end | ||||
| 
 | ||||
|  | @ -0,0 +1,5 @@ | |||
| # Set up gems listed in the Gemfile. | ||||
| ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../../Gemfile', __FILE__) | ||||
| 
 | ||||
| require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE']) | ||||
| $LOAD_PATH.unshift File.expand_path('../../../../lib', __FILE__) | ||||
|  | @ -0,0 +1,25 @@ | |||
| # SQLite version 3.x | ||||
| #   gem install sqlite3 | ||||
| # | ||||
| #   Ensure the SQLite 3 gem is defined in your Gemfile | ||||
| #   gem 'sqlite3' | ||||
| # | ||||
| default: &default | ||||
|   adapter: sqlite3 | ||||
|   pool: 5 | ||||
|   timeout: 5000 | ||||
| 
 | ||||
| development: | ||||
|   <<: *default | ||||
|   database: db/development.sqlite3 | ||||
| 
 | ||||
| # Warning: The database defined as "test" will be erased and | ||||
| # re-generated from your development database when you run "rake". | ||||
| # Do not set this db to the same as development or production. | ||||
| test: | ||||
|   <<: *default | ||||
|   database: db/test.sqlite3 | ||||
| 
 | ||||
| production: | ||||
|   <<: *default | ||||
|   database: db/production.sqlite3 | ||||
|  | @ -0,0 +1,5 @@ | |||
| # Load the Rails application. | ||||
| require File.expand_path('../application', __FILE__) | ||||
| 
 | ||||
| # Initialize the Rails application. | ||||
| Rails.application.initialize! | ||||
|  | @ -0,0 +1,37 @@ | |||
| Rails.application.configure do | ||||
|   # Settings specified here will take precedence over those in config/application.rb. | ||||
| 
 | ||||
|   # In the development environment your application's code is reloaded on | ||||
|   # every request. This slows down response time but is perfect for development | ||||
|   # since you don't have to restart the web server when you make code changes. | ||||
|   config.cache_classes = false | ||||
| 
 | ||||
|   # Do not eager load code on boot. | ||||
|   config.eager_load = false | ||||
| 
 | ||||
|   # Show full error reports and disable caching. | ||||
|   config.consider_all_requests_local       = true | ||||
|   config.action_controller.perform_caching = false | ||||
| 
 | ||||
|   # Don't care if the mailer can't send. | ||||
|   config.action_mailer.raise_delivery_errors = false | ||||
| 
 | ||||
|   # Print deprecation notices to the Rails logger. | ||||
|   config.active_support.deprecation = :log | ||||
| 
 | ||||
|   # Raise an error on page load if there are pending migrations. | ||||
|   config.active_record.migration_error = :page_load | ||||
| 
 | ||||
|   # Debug mode disables concatenation and preprocessing of assets. | ||||
|   # This option may cause significant delays in view rendering with a large | ||||
|   # number of complex assets. | ||||
|   config.assets.debug = true | ||||
| 
 | ||||
|   # Adds additional error checking when serving assets at runtime. | ||||
|   # Checks for improperly declared sprockets dependencies. | ||||
|   # Raises helpful error messages. | ||||
|   config.assets.raise_runtime_errors = true | ||||
| 
 | ||||
|   # Raises error for missing translations | ||||
|   # config.action_view.raise_on_missing_translations = true | ||||
| end | ||||
|  | @ -0,0 +1,82 @@ | |||
| Rails.application.configure do | ||||
|   # Settings specified here will take precedence over those in config/application.rb. | ||||
| 
 | ||||
|   # Code is not reloaded between requests. | ||||
|   config.cache_classes = true | ||||
| 
 | ||||
|   # Eager load code on boot. This eager loads most of Rails and | ||||
|   # your application in memory, allowing both threaded web servers | ||||
|   # and those relying on copy on write to perform better. | ||||
|   # Rake tasks automatically ignore this option for performance. | ||||
|   config.eager_load = true | ||||
| 
 | ||||
|   # Full error reports are disabled and caching is turned on. | ||||
|   config.consider_all_requests_local       = false | ||||
|   config.action_controller.perform_caching = true | ||||
| 
 | ||||
|   # Enable Rack::Cache to put a simple HTTP cache in front of your application | ||||
|   # Add `rack-cache` to your Gemfile before enabling this. | ||||
|   # For large-scale production use, consider using a caching reverse proxy like nginx, varnish or squid. | ||||
|   # config.action_dispatch.rack_cache = true | ||||
| 
 | ||||
|   # Disable Rails's static asset server (Apache or nginx will already do this). | ||||
|   config.serve_static_assets = false | ||||
| 
 | ||||
|   # Compress JavaScripts and CSS. | ||||
|   config.assets.js_compressor = :uglifier | ||||
|   # config.assets.css_compressor = :sass | ||||
| 
 | ||||
|   # Do not fallback to assets pipeline if a precompiled asset is missed. | ||||
|   config.assets.compile = false | ||||
| 
 | ||||
|   # Generate digests for assets URLs. | ||||
|   config.assets.digest = true | ||||
| 
 | ||||
|   # `config.assets.precompile` has moved to config/initializers/assets.rb | ||||
| 
 | ||||
|   # Specifies the header that your server uses for sending files. | ||||
|   # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache | ||||
|   # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx | ||||
| 
 | ||||
|   # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. | ||||
|   # config.force_ssl = true | ||||
| 
 | ||||
|   # Set to :debug to see everything in the log. | ||||
|   config.log_level = :info | ||||
| 
 | ||||
|   # Prepend all log lines with the following tags. | ||||
|   # config.log_tags = [ :subdomain, :uuid ] | ||||
| 
 | ||||
|   # Use a different logger for distributed setups. | ||||
|   # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) | ||||
| 
 | ||||
|   # Use a different cache store in production. | ||||
|   # config.cache_store = :mem_cache_store | ||||
| 
 | ||||
|   # Enable serving of images, stylesheets, and JavaScripts from an asset server. | ||||
|   # config.action_controller.asset_host = "http://assets.example.com" | ||||
| 
 | ||||
|   # Precompile additional assets. | ||||
|   # application.js, application.css, and all non-JS/CSS in app/assets folder are already added. | ||||
|   # config.assets.precompile += %w( search.js ) | ||||
| 
 | ||||
|   # Ignore bad email addresses and do not raise email delivery errors. | ||||
|   # Set this to true and configure the email server for immediate delivery to raise delivery errors. | ||||
|   # config.action_mailer.raise_delivery_errors = false | ||||
| 
 | ||||
|   # Enable locale fallbacks for I18n (makes lookups for any locale fall back to | ||||
|   # the I18n.default_locale when a translation cannot be found). | ||||
|   config.i18n.fallbacks = true | ||||
| 
 | ||||
|   # Send deprecation notices to registered listeners. | ||||
|   config.active_support.deprecation = :notify | ||||
| 
 | ||||
|   # Disable automatic flushing of the log to improve performance. | ||||
|   # config.autoflush_log = false | ||||
| 
 | ||||
|   # Use default logging formatter so that PID and timestamp are not suppressed. | ||||
|   config.log_formatter = ::Logger::Formatter.new | ||||
| 
 | ||||
|   # Do not dump schema after migrations. | ||||
|   config.active_record.dump_schema_after_migration = false | ||||
| end | ||||
|  | @ -0,0 +1,39 @@ | |||
| Rails.application.configure do | ||||
|   # Settings specified here will take precedence over those in config/application.rb. | ||||
| 
 | ||||
|   # The test environment is used exclusively to run your application's | ||||
|   # test suite. You never need to work with it otherwise. Remember that | ||||
|   # your test database is "scratch space" for the test suite and is wiped | ||||
|   # and recreated between test runs. Don't rely on the data there! | ||||
|   config.cache_classes = true | ||||
| 
 | ||||
|   # Do not eager load code on boot. This avoids loading your whole application | ||||
|   # just for the purpose of running a single test. If you are using a tool that | ||||
|   # preloads Rails for running tests, you may have to set it to true. | ||||
|   config.eager_load = false | ||||
| 
 | ||||
|   # Configure static asset server for tests with Cache-Control for performance. | ||||
|   config.serve_static_assets  = true | ||||
|   config.static_cache_control = 'public, max-age=3600' | ||||
| 
 | ||||
|   # Show full error reports and disable caching. | ||||
|   config.consider_all_requests_local       = true | ||||
|   config.action_controller.perform_caching = false | ||||
| 
 | ||||
|   # Raise exceptions instead of rendering exception templates. | ||||
|   config.action_dispatch.show_exceptions = false | ||||
| 
 | ||||
|   # Disable request forgery protection in test environment. | ||||
|   config.action_controller.allow_forgery_protection = false | ||||
| 
 | ||||
|   # Tell Action Mailer not to deliver emails to the real world. | ||||
|   # The :test delivery method accumulates sent emails in the | ||||
|   # ActionMailer::Base.deliveries array. | ||||
|   config.action_mailer.delivery_method = :test | ||||
| 
 | ||||
|   # Print deprecation notices to the stderr. | ||||
|   config.active_support.deprecation = :stderr | ||||
| 
 | ||||
|   # Raises error for missing translations | ||||
|   # config.action_view.raise_on_missing_translations = true | ||||
| end | ||||
|  | @ -0,0 +1,8 @@ | |||
| # Be sure to restart your server when you modify this file. | ||||
| 
 | ||||
| # Version of your assets, change this if you want to expire all your assets. | ||||
| Rails.application.config.assets.version = '1.0' | ||||
| 
 | ||||
| # Precompile additional assets. | ||||
| # application.js, application.css, and all non-JS/CSS in app/assets folder are already added. | ||||
| # Rails.application.config.assets.precompile += %w( search.js ) | ||||
|  | @ -0,0 +1,7 @@ | |||
| # Be sure to restart your server when you modify this file. | ||||
| 
 | ||||
| # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. | ||||
| # Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } | ||||
| 
 | ||||
| # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. | ||||
| # Rails.backtrace_cleaner.remove_silencers! | ||||
|  | @ -0,0 +1,3 @@ | |||
| # Be sure to restart your server when you modify this file. | ||||
| 
 | ||||
| Rails.application.config.action_dispatch.cookies_serializer = :json | ||||
|  | @ -0,0 +1,4 @@ | |||
| # Be sure to restart your server when you modify this file. | ||||
| 
 | ||||
| # Configure sensitive parameters which will be filtered from the log file. | ||||
| Rails.application.config.filter_parameters += [:password] | ||||
|  | @ -0,0 +1,16 @@ | |||
| # Be sure to restart your server when you modify this file. | ||||
| 
 | ||||
| # Add new inflection rules using the following format. Inflections | ||||
| # are locale specific, and you may define rules for as many different | ||||
| # locales as you wish. All of these examples are active by default: | ||||
| # ActiveSupport::Inflector.inflections(:en) do |inflect| | ||||
| #   inflect.plural /^(ox)$/i, '\1en' | ||||
| #   inflect.singular /^(ox)en/i, '\1' | ||||
| #   inflect.irregular 'person', 'people' | ||||
| #   inflect.uncountable %w( fish sheep ) | ||||
| # end | ||||
| 
 | ||||
| # These inflection rules are supported but not enabled by default: | ||||
| # ActiveSupport::Inflector.inflections(:en) do |inflect| | ||||
| #   inflect.acronym 'RESTful' | ||||
| # end | ||||
|  | @ -0,0 +1,4 @@ | |||
| # Be sure to restart your server when you modify this file. | ||||
| 
 | ||||
| # Add new mime types for use in respond_to blocks: | ||||
| # Mime::Type.register "text/richtext", :rtf | ||||
|  | @ -0,0 +1,3 @@ | |||
| # Be sure to restart your server when you modify this file. | ||||
| 
 | ||||
| Rails.application.config.session_store :cookie_store, key: '_dummy_session' | ||||
|  | @ -0,0 +1,14 @@ | |||
| # Be sure to restart your server when you modify this file. | ||||
| 
 | ||||
| # This file contains settings for ActionController::ParamsWrapper which | ||||
| # is enabled by default. | ||||
| 
 | ||||
| # Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. | ||||
| ActiveSupport.on_load(:action_controller) do | ||||
|   wrap_parameters format: [:json] if respond_to?(:wrap_parameters) | ||||
| end | ||||
| 
 | ||||
| # To enable root element in JSON for ActiveRecord objects. | ||||
| # ActiveSupport.on_load(:active_record) do | ||||
| #  self.include_root_in_json = true | ||||
| # end | ||||
|  | @ -0,0 +1,23 @@ | |||
| # Files in the config/locales directory are used for internationalization | ||||
| # and are automatically loaded by Rails. If you want to use locales other | ||||
| # than English, add the necessary files in this directory. | ||||
| # | ||||
| # To use the locales, use `I18n.t`: | ||||
| # | ||||
| #     I18n.t 'hello' | ||||
| # | ||||
| # In views, this is aliased to just `t`: | ||||
| # | ||||
| #     <%= t('hello') %> | ||||
| # | ||||
| # To use a different locale, set it with `I18n.locale`: | ||||
| # | ||||
| #     I18n.locale = :es | ||||
| # | ||||
| # This would use the information in config/locales/es.yml. | ||||
| # | ||||
| # To learn more, please read the Rails Internationalization guide | ||||
| # available at http://guides.rubyonrails.org/i18n.html. | ||||
| 
 | ||||
| en: | ||||
|   hello: "Hello world" | ||||
|  | @ -0,0 +1,56 @@ | |||
| Rails.application.routes.draw do | ||||
|   # The priority is based upon order of creation: first created -> highest priority. | ||||
|   # See how all your routes lay out with "rake routes". | ||||
| 
 | ||||
|   # You can have the root of your site routed with "root" | ||||
|   # root 'welcome#index' | ||||
| 
 | ||||
|   # Example of regular route: | ||||
|   #   get 'products/:id' => 'catalog#view' | ||||
| 
 | ||||
|   # Example of named route that can be invoked with purchase_url(id: product.id) | ||||
|   #   get 'products/:id/purchase' => 'catalog#purchase', as: :purchase | ||||
| 
 | ||||
|   # Example resource route (maps HTTP verbs to controller actions automatically): | ||||
|   #   resources :products | ||||
| 
 | ||||
|   # Example resource route with options: | ||||
|   #   resources :products do | ||||
|   #     member do | ||||
|   #       get 'short' | ||||
|   #       post 'toggle' | ||||
|   #     end | ||||
|   # | ||||
|   #     collection do | ||||
|   #       get 'sold' | ||||
|   #     end | ||||
|   #   end | ||||
| 
 | ||||
|   # Example resource route with sub-resources: | ||||
|   #   resources :products do | ||||
|   #     resources :comments, :sales | ||||
|   #     resource :seller | ||||
|   #   end | ||||
| 
 | ||||
|   # Example resource route with more complex sub-resources: | ||||
|   #   resources :products do | ||||
|   #     resources :comments | ||||
|   #     resources :sales do | ||||
|   #       get 'recent', on: :collection | ||||
|   #     end | ||||
|   #   end | ||||
| 
 | ||||
|   # Example resource route with concerns: | ||||
|   #   concern :toggleable do | ||||
|   #     post 'toggle' | ||||
|   #   end | ||||
|   #   resources :posts, concerns: :toggleable | ||||
|   #   resources :photos, concerns: :toggleable | ||||
| 
 | ||||
|   # Example resource route within a namespace: | ||||
|   #   namespace :admin do | ||||
|   #     # Directs /admin/products/* to Admin::ProductsController | ||||
|   #     # (app/controllers/admin/products_controller.rb) | ||||
|   #     resources :products | ||||
|   #   end | ||||
| end | ||||
|  | @ -0,0 +1,22 @@ | |||
| # Be sure to restart your server when you modify this file. | ||||
| 
 | ||||
| # Your secret key is used for verifying the integrity of signed cookies. | ||||
| # If you change this key, all old signed cookies will become invalid! | ||||
| 
 | ||||
| # Make sure the secret is at least 30 characters and all random, | ||||
| # no regular words or you'll be exposed to dictionary attacks. | ||||
| # You can use `rake secret` to generate a secure secret key. | ||||
| 
 | ||||
| # Make sure the secrets in this file are kept private | ||||
| # if you're sharing your code publicly. | ||||
| 
 | ||||
| development: | ||||
|   secret_key_base: 342dfa95c55e3393f7a484a0a1090f7c07dd05c063c96c7c240fc42961af2264ba357fd7b92d2cbe4ef1f7ce4f83df060d9f778f526c919513b33df664298849 | ||||
| 
 | ||||
| test: | ||||
|   secret_key_base: 986a3a6b8e1a92fbf7e14f91fc66c285bfd6bf620008ff63ad65c8a0bfe82d90e59c4da7c7754371bb696c936c0eb4640f3c45b84f34eef1ace580f41b8d7b8b | ||||
| 
 | ||||
| # Do not keep production secrets in the repository, | ||||
| # instead read values from the environment. | ||||
| production: | ||||
|   secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> | ||||
|  | @ -0,0 +1,67 @@ | |||
| <!DOCTYPE html> | ||||
| <html> | ||||
| <head> | ||||
|   <title>The page you were looking for doesn't exist (404)</title> | ||||
|   <meta name="viewport" content="width=device-width,initial-scale=1"> | ||||
|   <style> | ||||
|   body { | ||||
|     background-color: #EFEFEF; | ||||
|     color: #2E2F30; | ||||
|     text-align: center; | ||||
|     font-family: arial, sans-serif; | ||||
|     margin: 0; | ||||
|   } | ||||
| 
 | ||||
|   div.dialog { | ||||
|     width: 95%; | ||||
|     max-width: 33em; | ||||
|     margin: 4em auto 0; | ||||
|   } | ||||
| 
 | ||||
|   div.dialog > div { | ||||
|     border: 1px solid #CCC; | ||||
|     border-right-color: #999; | ||||
|     border-left-color: #999; | ||||
|     border-bottom-color: #BBB; | ||||
|     border-top: #B00100 solid 4px; | ||||
|     border-top-left-radius: 9px; | ||||
|     border-top-right-radius: 9px; | ||||
|     background-color: white; | ||||
|     padding: 7px 12% 0; | ||||
|     box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17); | ||||
|   } | ||||
| 
 | ||||
|   h1 { | ||||
|     font-size: 100%; | ||||
|     color: #730E15; | ||||
|     line-height: 1.5em; | ||||
|   } | ||||
| 
 | ||||
|   div.dialog > p { | ||||
|     margin: 0 0 1em; | ||||
|     padding: 1em; | ||||
|     background-color: #F7F7F7; | ||||
|     border: 1px solid #CCC; | ||||
|     border-right-color: #999; | ||||
|     border-left-color: #999; | ||||
|     border-bottom-color: #999; | ||||
|     border-bottom-left-radius: 4px; | ||||
|     border-bottom-right-radius: 4px; | ||||
|     border-top-color: #DADADA; | ||||
|     color: #666; | ||||
|     box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17); | ||||
|   } | ||||
|   </style> | ||||
| </head> | ||||
| 
 | ||||
| <body> | ||||
|   <!-- This file lives in public/404.html --> | ||||
|   <div class="dialog"> | ||||
|     <div> | ||||
|       <h1>The page you were looking for doesn't exist.</h1> | ||||
|       <p>You may have mistyped the address or the page may have moved.</p> | ||||
|     </div> | ||||
|     <p>If you are the application owner check the logs for more information.</p> | ||||
|   </div> | ||||
| </body> | ||||
| </html> | ||||
|  | @ -0,0 +1,67 @@ | |||
| <!DOCTYPE html> | ||||
| <html> | ||||
| <head> | ||||
|   <title>The change you wanted was rejected (422)</title> | ||||
|   <meta name="viewport" content="width=device-width,initial-scale=1"> | ||||
|   <style> | ||||
|   body { | ||||
|     background-color: #EFEFEF; | ||||
|     color: #2E2F30; | ||||
|     text-align: center; | ||||
|     font-family: arial, sans-serif; | ||||
|     margin: 0; | ||||
|   } | ||||
| 
 | ||||
|   div.dialog { | ||||
|     width: 95%; | ||||
|     max-width: 33em; | ||||
|     margin: 4em auto 0; | ||||
|   } | ||||
| 
 | ||||
|   div.dialog > div { | ||||
|     border: 1px solid #CCC; | ||||
|     border-right-color: #999; | ||||
|     border-left-color: #999; | ||||
|     border-bottom-color: #BBB; | ||||
|     border-top: #B00100 solid 4px; | ||||
|     border-top-left-radius: 9px; | ||||
|     border-top-right-radius: 9px; | ||||
|     background-color: white; | ||||
|     padding: 7px 12% 0; | ||||
|     box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17); | ||||
|   } | ||||
| 
 | ||||
|   h1 { | ||||
|     font-size: 100%; | ||||
|     color: #730E15; | ||||
|     line-height: 1.5em; | ||||
|   } | ||||
| 
 | ||||
|   div.dialog > p { | ||||
|     margin: 0 0 1em; | ||||
|     padding: 1em; | ||||
|     background-color: #F7F7F7; | ||||
|     border: 1px solid #CCC; | ||||
|     border-right-color: #999; | ||||
|     border-left-color: #999; | ||||
|     border-bottom-color: #999; | ||||
|     border-bottom-left-radius: 4px; | ||||
|     border-bottom-right-radius: 4px; | ||||
|     border-top-color: #DADADA; | ||||
|     color: #666; | ||||
|     box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17); | ||||
|   } | ||||
|   </style> | ||||
| </head> | ||||
| 
 | ||||
| <body> | ||||
|   <!-- This file lives in public/422.html --> | ||||
|   <div class="dialog"> | ||||
|     <div> | ||||
|       <h1>The change you wanted was rejected.</h1> | ||||
|       <p>Maybe you tried to change something you didn't have access to.</p> | ||||
|     </div> | ||||
|     <p>If you are the application owner check the logs for more information.</p> | ||||
|   </div> | ||||
| </body> | ||||
| </html> | ||||
|  | @ -0,0 +1,66 @@ | |||
| <!DOCTYPE html> | ||||
| <html> | ||||
| <head> | ||||
|   <title>We're sorry, but something went wrong (500)</title> | ||||
|   <meta name="viewport" content="width=device-width,initial-scale=1"> | ||||
|   <style> | ||||
|   body { | ||||
|     background-color: #EFEFEF; | ||||
|     color: #2E2F30; | ||||
|     text-align: center; | ||||
|     font-family: arial, sans-serif; | ||||
|     margin: 0; | ||||
|   } | ||||
| 
 | ||||
|   div.dialog { | ||||
|     width: 95%; | ||||
|     max-width: 33em; | ||||
|     margin: 4em auto 0; | ||||
|   } | ||||
| 
 | ||||
|   div.dialog > div { | ||||
|     border: 1px solid #CCC; | ||||
|     border-right-color: #999; | ||||
|     border-left-color: #999; | ||||
|     border-bottom-color: #BBB; | ||||
|     border-top: #B00100 solid 4px; | ||||
|     border-top-left-radius: 9px; | ||||
|     border-top-right-radius: 9px; | ||||
|     background-color: white; | ||||
|     padding: 7px 12% 0; | ||||
|     box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17); | ||||
|   } | ||||
| 
 | ||||
|   h1 { | ||||
|     font-size: 100%; | ||||
|     color: #730E15; | ||||
|     line-height: 1.5em; | ||||
|   } | ||||
| 
 | ||||
|   div.dialog > p { | ||||
|     margin: 0 0 1em; | ||||
|     padding: 1em; | ||||
|     background-color: #F7F7F7; | ||||
|     border: 1px solid #CCC; | ||||
|     border-right-color: #999; | ||||
|     border-left-color: #999; | ||||
|     border-bottom-color: #999; | ||||
|     border-bottom-left-radius: 4px; | ||||
|     border-bottom-right-radius: 4px; | ||||
|     border-top-color: #DADADA; | ||||
|     color: #666; | ||||
|     box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17); | ||||
|   } | ||||
|   </style> | ||||
| </head> | ||||
| 
 | ||||
| <body> | ||||
|   <!-- This file lives in public/500.html --> | ||||
|   <div class="dialog"> | ||||
|     <div> | ||||
|       <h1>We're sorry, but something went wrong.</h1> | ||||
|     </div> | ||||
|     <p>If you are the application owner check the logs for more information.</p> | ||||
|   </div> | ||||
| </body> | ||||
| </html> | ||||
|  | @ -0,0 +1,7 @@ | |||
| require 'test_helper' | ||||
| 
 | ||||
| class SurveyTest < ActiveSupport::TestCase | ||||
|   test "truth" do | ||||
|     assert_kind_of Module, Survey | ||||
|   end | ||||
| end | ||||
|  | @ -0,0 +1,15 @@ | |||
| # Configure Rails Environment | ||||
| ENV["RAILS_ENV"] = "test" | ||||
| 
 | ||||
| require File.expand_path("../dummy/config/environment.rb",  __FILE__) | ||||
| require "rails/test_help" | ||||
| 
 | ||||
| Rails.backtrace_cleaner.remove_silencers! | ||||
| 
 | ||||
| # Load support files | ||||
| Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f } | ||||
| 
 | ||||
| # Load fixtures from the engine | ||||
| if ActiveSupport::TestCase.method_defined?(:fixture_path=) | ||||
|   ActiveSupport::TestCase.fixture_path = File.expand_path("../fixtures", __FILE__) | ||||
| end | ||||
		Loading…
	
		Reference in New Issue