surveyor 0.7.0 → 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -105,6 +105,12 @@ Surveyor depends on Rails 2.3 and the SASS style sheet language, part of HAML (h
105
105
 
106
106
  # Changes
107
107
 
108
+ 0.7.1
109
+
110
+ custom index page
111
+ custom classes and renderers
112
+ fixing typo in kitchen sink survey
113
+
108
114
  0.7.0
109
115
 
110
116
  * new kitchen sink survey with better documentation of DSL
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.7.0
1
+ 0.7.1
@@ -23,6 +23,7 @@ class SurveyorController < ApplicationController
23
23
  # Actions
24
24
  def new
25
25
  @surveys = Survey.find(:all)
26
+ redirect_to surveyor_default(:index) unless available_surveys_path == surveyor_default(:index)
26
27
  end
27
28
  def create
28
29
  if (@survey = Survey.find_by_access_code(params[:survey_code])) && (@response_set = ResponseSet.create(:survey => @survey, :user_id => @current_user))
@@ -68,7 +69,7 @@ class SurveyorController < ApplicationController
68
69
  format.html do
69
70
  if saved && params[:finish]
70
71
  flash[:notice] = "Completed survey"
71
- redirect_to surveyor_default_finish
72
+ redirect_to surveyor_default(:finish)
72
73
  else
73
74
  flash[:notice] = "Unable to update survey" if !saved and !saved.nil? # saved.nil? is true if there are no questions on the page (i.e. if it only contains a label)
74
75
  redirect_to :action => "edit", :anchor => anchor_from(params[:section]), :params => {:section => section_id_from(params[:section])}
@@ -98,18 +99,19 @@ class SurveyorController < ApplicationController
98
99
  end
99
100
 
100
101
  # Extending surveyor
101
- def surveyor_default_finish
102
+ def surveyor_default(type = :finish)
102
103
  # http://www.postal-code.com/mrhappy/blog/2007/02/01/ruby-comparing-an-objects-class-in-a-case-statement/
103
104
  # http://www.skorks.com/2009/08/how-a-ruby-case-statement-works-and-what-you-can-do-with-it/
104
- case finish = Surveyor::Config['default.finish']
105
+ case arg = Surveyor::Config["default.#{type.to_s}"]
105
106
  when String
106
- return finish
107
+ return arg
107
108
  when Symbol
108
- return self.send(finish)
109
+ return self.send(arg)
109
110
  else
110
- return '/surveys'
111
+ return available_surveys_path
111
112
  end
112
113
  end
114
+
113
115
  def extend_actions
114
116
  # http://blog.mattwynne.net/2009/07/11/rails-tip-use-polymorphism-to-extend-your-controllers-at-runtime/
115
117
  self.extend SurveyorControllerExtensions::Actions if Surveyor::Config['extend_controller'] && defined? SurveyorControllerExtensions::Actions
@@ -35,8 +35,8 @@ class Question < ActiveRecord::Base
35
35
  def triggered?(response_set)
36
36
  dependent? ? self.dependency.met?(response_set) : true
37
37
  end
38
- def dep_class(response_set)
39
- dependent? ? triggered?(response_set) ? "dependent" : "hidden dependent" : nil
38
+ def css_class(response_set)
39
+ [(dependent? ? "dependent" : nil), (triggered?(response_set) ? nil : "hidden"), custom_class].compact.join(" ")
40
40
  end
41
41
 
42
42
  def part_of_group?
@@ -23,8 +23,8 @@ class QuestionGroup < ActiveRecord::Base
23
23
  def triggered?(response_set)
24
24
  dependent? ? self.dependency.met?(response_set) : true
25
25
  end
26
- def dep_class(response_set)
27
- dependent? ? triggered?(response_set) ? "dependent" : "hidden dependent" : nil
26
+ def css_class(response_set)
27
+ [(dependent? ? "dependent" : nil), (triggered?(response_set) ? nil : "hidden"), custom_class].compact.join(" ")
28
28
  end
29
29
 
30
30
  end
@@ -1,8 +1,7 @@
1
1
  - renderer = question.renderer(question_group ||= nil)
2
- - dep_class = question.dep_class(response_set)
3
2
  - case renderer
4
3
  - when :label
5
- - div_for question, :class => "label #{dep_class}" do
4
+ - div_for question, :class => "label #{question.css_class(response_set)}" do
6
5
  %span.text= question.text
7
6
  %span.help= question.help_text
8
7
  - when :image
@@ -10,7 +9,7 @@
10
9
  - when :dropdown, :slider
11
10
  - if renderer == :slider
12
11
  %script{:type => "text/javascript"}= "$(function(){$('#slider_#{question.id}').accessibleUISlider({width: 400, labels:#{question.answers.size} }).hide();});"
13
- - div_for question, :class => dep_class do
12
+ - div_for question, :class => question.css_class(response_set) do
14
13
  .number= next_number unless question.dependent?
15
14
  %fieldset
16
15
  %legend{:style => "display:inline;"}
@@ -23,19 +22,19 @@
23
22
  = renderer == :slider ? select_tag("responses[#{question.id}][answer_id]", options, {:id => "slider_#{question.id}"}) : select_tag("responses[#{question.id}][answer_id]", ["<option value=''>Select one...</option>"].concat(options))
24
23
  - when :grid_default
25
24
  - reset_cycle("col")
26
- - content_tag_for :tr, question, :class => dep_class do
25
+ - content_tag_for :tr, question, :class => question.css_class(response_set) do
27
26
  %th.question_prefix
28
27
  %span.text= split_text(question.text)[:prefix]
29
28
  %span.help= question.help_text
30
29
  = hidden_field_tag("responses[#{question.id}][question_id]", question.id)
31
30
  - question.answers.each do |answer|
32
31
  %td{:class => "#{cycle("column_highlight", "", :name => "col")}"}
33
- .answer= render(:partial => "/partials/answer", :locals => {:answer => answer, :question => question, :response_obj => @response_set.response_for(question.id, answer.id), :hide_label => true})
32
+ .answer{:class => answer.custom_class}= render(:partial => answer.custom_renderer || "/partials/answer", :locals => {:answer => answer, :question => question, :response_obj => @response_set.response_for(question.id, answer.id), :hide_label => true})
34
33
  %th.question_postfix
35
34
  %span.text= split_text(question.text)[:postfix]
36
35
  - when :repeater_default, :repeater_dropdown
37
36
  - disabled ||= false
38
- - div_for question, :class => "#{disabled ? 'dis' : 'en'}abled #{dep_class}" do
37
+ - div_for question, :class => "#{disabled ? 'dis' : 'en'}abled #{question.css_class(response_set)}" do
39
38
  %span.text= question.text
40
39
  %span.help= question.help_text
41
40
  = hidden_field_tag("response_groups[#{question.id}][#{response_group}][response_group]", response_group)
@@ -43,23 +42,23 @@
43
42
  %ol.answers
44
43
  - if renderer == :repeater_default
45
44
  - question.answers.each do |answer|
46
- - content_tag_for :li, answer do
47
- = render(:partial => "/partials/answer", :locals => {:answer => answer, :question => question, :response_obj => @response_set.response_for(question.id, answer.id, response_group), :response_group => response_group, :hide_label => true, :disabled => disabled})
45
+ - content_tag_for :li, answer, :class => answer.custom_class do
46
+ = render(:partial => answer.custom_renderer || "/partials/answer", :locals => {:answer => answer, :question => question, :response_obj => @response_set.response_for(question.id, answer.id, response_group), :response_group => response_group, :hide_label => true, :disabled => disabled})
48
47
  - else
49
48
  %li.answer
50
49
  - options = question.answers.collect{|a| "<option #{ (response_set.response_for(question.id, a.id, response_group).selected?)? "selected='selected'" : nil } value ='#{a.id}'>#{a.text}</option>" }
51
50
  = select_tag("response_groups[#{question.id}][#{response_group}][answer_id]", ["<option value=''>Select one...</option>"].concat(options), :disabled => disabled)
52
51
  - when :inline_default, :inline_dropdown
53
- - div_for question, :class => "inline #{dep_class}" do
52
+ - div_for question, :class => "inline #{question.css_class(response_set)}" do
54
53
  = hidden_field_tag("responses[#{question.id}][question_id]", question.id)
55
54
  - if renderer == :inline_default
56
55
  - question.answers.each do |answer|
57
- .answer= render(:partial => "/partials/answer", :locals => {:answer => answer, :question => question, :response_obj => @response_set.response_for(question.id, answer.id), :hide_label => answer.hide_label})
56
+ .answer{:class => answer.custom_class}= render(:partial => answer.custom_renderer || "/partials/answer", :locals => {:answer => answer, :question => question, :response_obj => @response_set.response_for(question.id, answer.id), :hide_label => answer.hide_label})
58
57
  - else
59
58
  - options = question.answers.collect{|a| "<option #{ (response_set.response_for(question.id, a.id).selected?)? "selected='selected'" : nil } value ='#{a.id}'>#{a.text}</option>" }
60
59
  = select_tag("responses[#{question.id}][answer_id]", ["<option value=''>Select one...</option>"].concat(options))
61
60
  - else # :default, :inline
62
- - div_for question, :class => dep_class do
61
+ - div_for question, :class => question.css_class(response_set) do
63
62
  .number= next_number unless question.dependent?
64
63
  %fieldset
65
64
  %legend
@@ -68,5 +67,5 @@
68
67
  = hidden_field_tag("responses[#{question.id}][question_id]", question.id)
69
68
  %ol.answers{:class => renderer == :inline ? "inline" : nil}
70
69
  - question.answers.each do |answer|
71
- - content_tag_for :li, answer do
72
- = render(:partial => "/partials/answer", :locals => {:answer => answer, :question => question, :response_obj => @response_set.response_for(question.id, answer.id), :hide_label => answer.hide_label})
70
+ - content_tag_for :li, answer, :class => answer.custom_class do
71
+ = render(:partial => answer.custom_renderer || "/partials/answer", :locals => {:answer => answer, :question => question, :response_obj => @response_set.response_for(question.id, answer.id), :hide_label => answer.hide_label})
@@ -1,8 +1,6 @@
1
1
  - renderer = question_group.renderer
2
- - dep_class = question_group.dep_class(response_set)
3
2
  - locals = {:question_group => question_group, :response_set => response_set, :hide_label => true}
4
-
5
- - div_for question_group, :class => dep_class do
3
+ - div_for question_group, :class => question_group.css_class(response_set) do
6
4
  .head
7
5
  .number= next_number
8
6
  %span.text= question_group.text
@@ -19,7 +17,7 @@
19
17
  %th{:class => "#{cycle("column_highlight", "", :name => "column_highlight")}"}= answer.text
20
18
  %tbody
21
19
  - group_questions.each_with_index do |question, i|
22
- = render(:partial => "/partials/question", :locals => locals.merge({:question => question}))
20
+ = render(:partial => question.custom_renderer || "/partials/question", :locals => locals.merge({:question => question}))
23
21
  - if i%10 == 9
24
22
  %th= "&nbsp;"
25
23
  - reset_cycle("column_highlight")
@@ -30,12 +28,12 @@
30
28
  - (response_set.count_group_responses(group_questions) + 3).times do |group_number|
31
29
  %li.repeater
32
30
  - group_questions.each do |question|
33
- = render(:partial => "/partials/question", :locals => locals.merge({:question => question, :response_group => group_number, :disabled => false}))
31
+ = render(:partial => question.custom_renderer || "/partials/question", :locals => locals.merge({:question => question, :response_group => group_number, :disabled => false}))
34
32
  %li.repeater
35
33
  - group_questions.each do |question|
36
- = render(:partial => "/partials/question", :locals => locals.merge({:question => question, :response_group => 9999, :disabled => true}))
34
+ = render(:partial => question.custom_renderer || "/partials/question", :locals => locals.merge({:question => question, :response_group => 9999, :disabled => true}))
37
35
  = submit_tag("&lt;= add row", :name => "section[#{group_questions.first.survey_section_id}]question_group_#{question_group.id}", :class => "add_row")
38
36
  - else # :inline
39
37
  %ul
40
38
  - group_questions.each do |question|
41
- %li{:class => question_group.renderer == :inline ? "inline" : nil}= render(:partial => "/partials/question", :locals => locals.merge({:question => question}))
39
+ %li{:class => question_group.renderer == :inline ? "inline" : nil}= render(:partial => question.custom_renderer || "/partials/question", :locals => locals.merge({:question => question}))
@@ -1,5 +1,5 @@
1
1
  #surveyor
2
- - form_tag(update_my_survey_path, :method => :put, :id => "survey_form") do
2
+ - form_tag(update_my_survey_path, :method => :put, :id => "survey_form", :class => @survey.custom_class) do
3
3
  = hidden_field_tag :current_section_id, @section.id
4
4
  - unless @sections.size < 3
5
5
  #menu
@@ -15,19 +15,19 @@
15
15
  .title Follow-up questions from your answers on the previous page
16
16
  -# @dependents.each_with_index do |question, index|
17
17
  = dependency_explanation_helper(question, @response_set)
18
- = render(:partial => "/partials/question", :locals => {:question => question, :response_set => @response_set, :number => "D#{index+1}"})
19
- - div_for @section do
18
+ = render(:partial => question.custom_renderer || "/partials/question", :locals => {:question => question, :response_set => @response_set, :number => "D#{index+1}"})
19
+ - div_for @section, :class => @section.custom_class do
20
20
  %span.title= @section.title
21
21
  .questions
22
22
  - group_questions ||= []
23
23
  - @questions.each_with_index do |question, index|
24
24
  - unless question.part_of_group?
25
- = render(:partial => "/partials/question", :locals => {:question => question, :response_set => @response_set})
25
+ = render(:partial => question.custom_renderer || "/partials/question", :locals => {:question => question, :response_set => @response_set})
26
26
  - else # gather up the group questions
27
27
  - group_questions << question
28
28
  - if (index + 1 >= @questions.size) or (question.question_group_id != @questions[index + 1].question_group_id)
29
29
  - # this is the last question of the section, or the group
30
- = render(:partial => "/partials/question_group", :locals => {:question_group => question.question_group, :response_set => @response_set, :group_questions => group_questions})
30
+ = render(:partial => question.question_group.custom_renderer || "/partials/question_group", :locals => {:question_group => question.question_group, :response_set => @response_set, :group_questions => group_questions})
31
31
  - group_questions = []
32
32
  .next_section= next_section
33
33
 
@@ -2,6 +2,7 @@ Surveyor::Config.run do |config|
2
2
  config['default.relative_url_root'] = nil # "surveys/" # should end with '/'
3
3
  config['default.title'] = nil # "You can take these surveys:"
4
4
  config['default.layout'] = nil # "surveyor_default"
5
+ config['default.index'] = nil # "/surveys" # or :index_path_method
5
6
  config['default.finish'] = nil # "/surveys" # or :finish_path_method
6
7
  config['use_restful_authentication'] = false # set to true to use restful authentication
7
8
  config['extend_controller'] = false # set to true to extend SurveyorController
@@ -40,8 +40,8 @@ survey "&#8220;Kitchen Sink&#8221; survey" do
40
40
  # :reference_identifier # usually from paper
41
41
  # :data_export_identifier # data export
42
42
  # :common_namespace # maping to a common vocab
43
- # :common_identitier # maping to a common vocab
44
- q "Get me started on an improv sketch", :reference_identifier => "improv_start", :data_export_identifier => "i_s", :common_namespace => "sketch comedy questions", :common_identifer => "get me started"
43
+ # :common_identifier # maping to a common vocab
44
+ q "Get me started on an improv sketch", :reference_identifier => "improv_start", :data_export_identifier => "i_s", :common_namespace => "sketch comedy questions", :common_identifier => "get me started"
45
45
  a "who", :string
46
46
  a "what", :string
47
47
  a "where", :string
@@ -49,11 +49,14 @@ survey "&#8220;Kitchen Sink&#8221; survey" do
49
49
  # Various types of respones can be accepted
50
50
  q "How many pets do you own?"
51
51
  a :integer
52
-
53
- q "What is your address?"
54
- a :text
55
-
56
- q "Pick your favorite date AND time"
52
+
53
+ # Surveys, sections, questions, groups, and answers also take a custom css class for covenience in custom styling
54
+ q "What is your address?", :custom_class => 'address'
55
+ a :text, :custom_class => 'mapper'
56
+
57
+ # Questions, groups, and answers take a custom renderer (a partial in the application's views dir)
58
+ # defaults are "/partials/question_group", "/partials/question", "/partials/answer", so the custom renderers should have a different name
59
+ q "Pick your favorite date AND time" #, :custom_renderer => "/partials/custom_question"
57
60
  a :datetime
58
61
 
59
62
  q "What time do you usually take a lunch break?"
data/surveyor.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{surveyor}
8
- s.version = "0.7.0"
8
+ s.version = "0.7.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Brian Chamberlain", "Mark Yoon"]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: surveyor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Chamberlain