effective_polls 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +132 -0
  4. data/Rakefile +32 -0
  5. data/app/assets/config/effective_polls_manifest.js +1 -0
  6. data/app/assets/stylesheets/effective_polls.scss +0 -0
  7. data/app/controllers/admin/poll_notifications_controller.rb +15 -0
  8. data/app/controllers/admin/poll_questions_controller.rb +15 -0
  9. data/app/controllers/admin/polls_controller.rb +23 -0
  10. data/app/controllers/effective/ballots_controller.rb +70 -0
  11. data/app/controllers/effective/polls_controller.rb +19 -0
  12. data/app/datatables/admin/effective_poll_notifications_datatable.rb +43 -0
  13. data/app/datatables/admin/effective_poll_questions_datatable.rb +28 -0
  14. data/app/datatables/admin/effective_poll_results_datatable.rb +50 -0
  15. data/app/datatables/admin/effective_polls_datatable.rb +29 -0
  16. data/app/datatables/effective_polls_datatable.rb +30 -0
  17. data/app/helpers/effective_polls_helper.rb +23 -0
  18. data/app/mailers/effective/polls_mailer.rb +23 -0
  19. data/app/models/effective/access_denied.rb +17 -0
  20. data/app/models/effective/ballot.rb +73 -0
  21. data/app/models/effective/ballot_response.rb +92 -0
  22. data/app/models/effective/ballot_response_option.rb +6 -0
  23. data/app/models/effective/poll.rb +149 -0
  24. data/app/models/effective/poll_notification.rb +144 -0
  25. data/app/models/effective/poll_question.rb +76 -0
  26. data/app/models/effective/poll_question_option.rb +26 -0
  27. data/app/views/admin/poll_notifications/_form.html.haml +55 -0
  28. data/app/views/admin/poll_questions/_form.html.haml +100 -0
  29. data/app/views/admin/polls/_form.html.haml +20 -0
  30. data/app/views/admin/polls/_form_content.html.haml +27 -0
  31. data/app/views/admin/polls/_form_poll.html.haml +32 -0
  32. data/app/views/admin/polls/_poll.html.haml +2 -0
  33. data/app/views/admin/polls/results.html.haml +6 -0
  34. data/app/views/effective/ballot_responses/_ballot_response.html.haml +2 -0
  35. data/app/views/effective/ballot_responses/_fields.html.haml +14 -0
  36. data/app/views/effective/ballot_responses/fields/_choose_one.html.haml +1 -0
  37. data/app/views/effective/ballot_responses/fields/_date.html.haml +1 -0
  38. data/app/views/effective/ballot_responses/fields/_email.html.haml +1 -0
  39. data/app/views/effective/ballot_responses/fields/_long_answer.html.haml +1 -0
  40. data/app/views/effective/ballot_responses/fields/_number.html.haml +1 -0
  41. data/app/views/effective/ballot_responses/fields/_select_all_that_apply.html.haml +1 -0
  42. data/app/views/effective/ballot_responses/fields/_select_upto_1.html.haml +1 -0
  43. data/app/views/effective/ballot_responses/fields/_select_upto_2.html.haml +1 -0
  44. data/app/views/effective/ballot_responses/fields/_select_upto_3.html.haml +1 -0
  45. data/app/views/effective/ballot_responses/fields/_select_upto_4.html.haml +1 -0
  46. data/app/views/effective/ballot_responses/fields/_select_upto_5.html.haml +1 -0
  47. data/app/views/effective/ballot_responses/fields/_short_answer.html.haml +1 -0
  48. data/app/views/effective/ballot_responses/fields/_upload_file.html.haml +1 -0
  49. data/app/views/effective/ballot_responses/responses/_choose_one.html.haml +1 -0
  50. data/app/views/effective/ballot_responses/responses/_date.html.haml +1 -0
  51. data/app/views/effective/ballot_responses/responses/_email.html.haml +1 -0
  52. data/app/views/effective/ballot_responses/responses/_long_answer.html.haml +1 -0
  53. data/app/views/effective/ballot_responses/responses/_number.html.haml +1 -0
  54. data/app/views/effective/ballot_responses/responses/_select_all_that_apply.html.haml +5 -0
  55. data/app/views/effective/ballot_responses/responses/_select_upto_1.html.haml +1 -0
  56. data/app/views/effective/ballot_responses/responses/_select_upto_2.html.haml +5 -0
  57. data/app/views/effective/ballot_responses/responses/_select_upto_3.html.haml +5 -0
  58. data/app/views/effective/ballot_responses/responses/_select_upto_4.html.haml +5 -0
  59. data/app/views/effective/ballot_responses/responses/_select_upto_5.html.haml +5 -0
  60. data/app/views/effective/ballot_responses/responses/_short_answer.html.haml +1 -0
  61. data/app/views/effective/ballot_responses/responses/_upload_file.html.haml +4 -0
  62. data/app/views/effective/ballots/_ballot.html.haml +14 -0
  63. data/app/views/effective/ballots/complete.html.haml +11 -0
  64. data/app/views/effective/ballots/start.html.haml +17 -0
  65. data/app/views/effective/ballots/submit.html.haml +17 -0
  66. data/app/views/effective/ballots/vote.html.haml +19 -0
  67. data/app/views/effective/poll_results/_poll_result.html.haml +2 -0
  68. data/app/views/effective/poll_results/_results.html.haml +38 -0
  69. data/app/views/effective/poll_results/results/_choose_one.html.haml +2 -0
  70. data/app/views/effective/poll_results/results/_date.html.haml +14 -0
  71. data/app/views/effective/poll_results/results/_email.html.haml +14 -0
  72. data/app/views/effective/poll_results/results/_long_answer.html.haml +2 -0
  73. data/app/views/effective/poll_results/results/_number.html.haml +14 -0
  74. data/app/views/effective/poll_results/results/_poll_question_option.html.haml +17 -0
  75. data/app/views/effective/poll_results/results/_select_all_that_apply.html.haml +2 -0
  76. data/app/views/effective/poll_results/results/_select_upto_1.html.haml +2 -0
  77. data/app/views/effective/poll_results/results/_select_upto_2.html.haml +2 -0
  78. data/app/views/effective/poll_results/results/_select_upto_3.html.haml +2 -0
  79. data/app/views/effective/poll_results/results/_select_upto_4.html.haml +2 -0
  80. data/app/views/effective/poll_results/results/_select_upto_5.html.haml +2 -0
  81. data/app/views/effective/poll_results/results/_short_answer.html.haml +2 -0
  82. data/app/views/effective/poll_results/results/_upload_file.html.haml +3 -0
  83. data/app/views/effective/polls/_form.html.haml +10 -0
  84. data/app/views/effective/polls/_poll.html.haml +2 -0
  85. data/app/views/layouts/effective_polls_mailer_layout.html.haml +7 -0
  86. data/config/effective_polls.rb +59 -0
  87. data/config/routes.rb +23 -0
  88. data/db/migrate/01_create_effective_polls.rb.erb +92 -0
  89. data/lib/effective_polls.rb +50 -0
  90. data/lib/effective_polls/engine.rb +11 -0
  91. data/lib/effective_polls/version.rb +3 -0
  92. data/lib/generators/effective_polls/install_generator.rb +46 -0
  93. data/lib/generators/templates/effective_polls_mailer_preview.rb +35 -0
  94. data/lib/tasks/effective_polls_tasks.rake +24 -0
  95. metadata +276 -0
@@ -0,0 +1,23 @@
1
+ Rails.application.routes.draw do
2
+ mount EffectivePolls::Engine => '/', as: 'effective_polls'
3
+ end
4
+
5
+ EffectivePolls::Engine.routes.draw do
6
+ scope module: 'effective' do
7
+ resources :polls, only: [:show] do
8
+ resources :ballots, only: [:new, :show] do
9
+ resources :build, controller: :ballots, only: [:show, :update]
10
+ end
11
+ end
12
+ end
13
+
14
+ namespace :admin do
15
+ resources :polls, except: [:show] do
16
+ get :results, on: :member
17
+ end
18
+
19
+ resources :poll_notifications, except: [:show]
20
+ resources :poll_questions, except: [:show]
21
+ end
22
+
23
+ end
@@ -0,0 +1,92 @@
1
+ class CreateEffectivePolls < ActiveRecord::Migration[6.0]
2
+ def change
3
+ create_table <%= @polls_table_name %> do |t|
4
+ t.string :title
5
+
6
+ t.string :token
7
+ t.datetime :start_at
8
+ t.datetime :end_at
9
+
10
+ t.string :audience
11
+ t.text :audience_scope
12
+
13
+ t.datetime :updated_at
14
+ t.datetime :created_at
15
+ end
16
+
17
+ create_table <%= @poll_notifications_table_name %> do |t|
18
+ t.references :poll
19
+
20
+ t.string :category
21
+ t.integer :reminder
22
+
23
+ t.string :subject
24
+ t.text :body
25
+
26
+ t.datetime :started_at
27
+ t.datetime :completed_at
28
+
29
+ t.datetime :updated_at
30
+ t.datetime :created_at
31
+ end
32
+
33
+ create_table <%= @poll_questions_table_name %> do |t|
34
+ t.references :poll
35
+
36
+ t.string :title
37
+ t.string :category
38
+ t.boolean :required, default: true
39
+
40
+ t.integer :position
41
+
42
+ t.datetime :updated_at
43
+ t.datetime :created_at
44
+ end
45
+
46
+ create_table <%= @poll_question_options_table_name %> do |t|
47
+ t.references :poll_question
48
+
49
+ t.string :title
50
+ t.integer :position
51
+
52
+ t.datetime :updated_at
53
+ t.datetime :created_at
54
+ end
55
+
56
+ create_table <%= @ballots_table_name %> do |t|
57
+ t.references :poll
58
+ t.references :user
59
+
60
+ t.string :token
61
+ t.text :wizard_steps
62
+ t.datetime :completed_at
63
+
64
+ t.datetime :updated_at
65
+ t.datetime :created_at
66
+ end
67
+
68
+ create_table <%= @ballot_responses_table_name %> do |t|
69
+ t.references :ballot
70
+ t.references :poll
71
+ t.references :poll_question
72
+
73
+ t.date :date
74
+ t.string :email
75
+ t.integer :number
76
+ t.text :long_answer
77
+ t.text :short_answer
78
+
79
+ t.datetime :updated_at
80
+ t.datetime :created_at
81
+ end
82
+
83
+ create_table <%= @ballot_response_options_table_name %> do |t|
84
+ t.references :ballot_response
85
+ t.references :poll_question_option
86
+
87
+ t.datetime :updated_at
88
+ t.datetime :created_at
89
+ end
90
+
91
+ end
92
+ end
@@ -0,0 +1,50 @@
1
+ require 'effective_resources'
2
+ require 'effective_datatables'
3
+ require 'effective_polls/engine'
4
+ require 'effective_polls/version'
5
+
6
+ module EffectivePolls
7
+ mattr_accessor :polls_table_name
8
+ mattr_accessor :poll_notifications_table_name
9
+ mattr_accessor :poll_questions_table_name
10
+ mattr_accessor :poll_question_options_table_name
11
+ mattr_accessor :ballots_table_name
12
+ mattr_accessor :ballot_responses_table_name
13
+ mattr_accessor :ballot_response_options_table_name
14
+
15
+ mattr_accessor :authorization_method
16
+ mattr_accessor :permitted_params
17
+
18
+ mattr_accessor :layout
19
+
20
+ mattr_accessor :audience_user_scopes
21
+
22
+ # Hashes of configs
23
+ mattr_accessor :mailer
24
+
25
+ def self.setup
26
+ yield self
27
+ end
28
+
29
+ def self.authorized?(controller, action, resource)
30
+ @_exceptions ||= [Effective::AccessDenied, (CanCan::AccessDenied if defined?(CanCan)), (Pundit::NotAuthorizedError if defined?(Pundit))].compact
31
+
32
+ return !!authorization_method unless authorization_method.respond_to?(:call)
33
+ controller = controller.controller if controller.respond_to?(:controller)
34
+
35
+ begin
36
+ !!(controller || self).instance_exec((controller || self), action, resource, &authorization_method)
37
+ rescue *@_exceptions
38
+ false
39
+ end
40
+ end
41
+
42
+ def self.authorize!(controller, action, resource)
43
+ raise Effective::AccessDenied.new('Access Denied', action, resource) unless authorized?(controller, action, resource)
44
+ end
45
+
46
+ def self.permitted_params
47
+ raise('todo')
48
+ end
49
+
50
+ end
@@ -0,0 +1,11 @@
1
+ module EffectivePolls
2
+ class Engine < ::Rails::Engine
3
+ engine_name 'effective_polls'
4
+
5
+ # Set up our default configuration options.
6
+ initializer 'effective_polls.defaults', before: :load_config_initializers do |app|
7
+ eval File.read("#{config.root}/config/effective_polls.rb")
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ module EffectivePolls
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,46 @@
1
+ module EffectivePolls
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+ include Rails::Generators::Migration
5
+
6
+ desc 'Creates an EffectivePolls initializer in your application.'
7
+
8
+ source_root File.expand_path('../../templates', __FILE__)
9
+
10
+ def self.next_migration_number(dirname)
11
+ if not ActiveRecord::Base.timestamped_migrations
12
+ Time.new.utc.strftime("%Y%m%d%H%M%S")
13
+ else
14
+ '%.3d' % (current_migration_number(dirname) + 1)
15
+ end
16
+ end
17
+
18
+ def copy_initializer
19
+ template ('../' * 3) + 'config/effective_polls.rb', 'config/initializers/effective_polls.rb'
20
+ end
21
+
22
+ def create_migration_file
23
+ @polls_table_name = ':' + EffectivePolls.polls_table_name.to_s
24
+ @poll_questions_table_name = ':' + EffectivePolls.poll_questions_table_name.to_s
25
+ @poll_notifications_table_name = ':' + EffectivePolls.poll_notifications_table_name.to_s
26
+ @poll_question_options_table_name = ':' + EffectivePolls.poll_question_options_table_name.to_s
27
+ @ballots_table_name = ':' + EffectivePolls.ballots_table_name.to_s
28
+ @ballot_responses_table_name = ':' + EffectivePolls.ballot_responses_table_name.to_s
29
+ @ballot_response_options_table_name = ':' + EffectivePolls.ballot_responses_table_name.to_s
30
+
31
+ migration_template ('../' * 3) + 'db/migrate/01_create_effective_polls.rb.erb', 'db/migrate/create_effective_polls.rb'
32
+ end
33
+
34
+ def copy_mailer_preview
35
+ mailer_preview_path = (Rails.application.config.action_mailer.preview_path rescue nil)
36
+
37
+ if mailer_preview_path.present?
38
+ template 'effective_polls_mailer_preview.rb', File.join(mailer_preview_path, 'effective_polls_mailer_preview.rb')
39
+ else
40
+ puts "couldn't find action_mailer.preview_path. Skipping effective_polls_mailer_preview."
41
+ end
42
+ end
43
+
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,35 @@
1
+ # Visit http://localhost:3000/rails/mailers
2
+
3
+ class EffectivePollsMailerPreview < ActionMailer::Preview
4
+
5
+ def poll_upcoming_reminder(poll_notification, bcc)
6
+ mail(bcc: bcc, body: poll_notification.body, subject: poll_notification.subject)
7
+ end
8
+
9
+ def poll_start
10
+ poll_notification = build_poll_notification('The poll has started')
11
+ Effective::PollsMailer.poll_start(poll_notification, bccs)
12
+ end
13
+
14
+ def poll_reminder
15
+ poll_notification = build_poll_notification('This is a reminder')
16
+ Effective::PollsMailer.poll_reminder(poll_notification, bccs)
17
+ end
18
+
19
+ def poll_end
20
+ poll_notification = build_poll_notification('The poll has ended')
21
+ Effective::PollsMailer.poll_end(poll_notification, bccs)
22
+ end
23
+
24
+ protected
25
+
26
+ def bccs
27
+ ['one@example.com', 'two@example.com', 'three@example.com', 'two-hundred-fifty@example.com']
28
+ end
29
+
30
+ def build_poll_notification(text)
31
+ poll = Effective::Poll.new(start_at: Time.zone.now)
32
+ Effective::PollNotification.new(poll: poll, body: text, subject: text)
33
+ end
34
+
35
+ end
@@ -0,0 +1,24 @@
1
+ # rake effective_polls:notify
2
+
3
+ namespace :effective_polls do
4
+ desc 'Send email notifications for effective polls'
5
+ task notify: :environment do
6
+ poll_notifications = Effective::PollNotification.all.deep.notifiable
7
+
8
+ poll_notifications.find_each do |poll_notification|
9
+ begin
10
+ notified = poll_notification.notify!
11
+ puts "Sent #{poll_notification.category} for #{poll_notification.poll}" if notified
12
+ rescue => e
13
+ if defined?(ExceptionNotifier)
14
+ data = { poll_notification_id: poll_notification.id, poll_id: poll_notification.poll_id }
15
+ ExceptionNotifier.notify_exception(e, data: data)
16
+ end
17
+
18
+ puts "Error with effective poll_notification #{poll_notification.id}: #{e.errors.inspect}"
19
+ end
20
+ end
21
+
22
+ puts 'All done'
23
+ end
24
+ end
metadata ADDED
@@ -0,0 +1,276 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: effective_polls
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Code and Effect
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-01-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 6.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 6.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: sass
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: effective_bootstrap
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: effective_datatables
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 4.0.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 4.0.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: effective_resources
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: sqlite3
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: devise
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: haml-rails
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: wicked
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: pry-byebug
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ description: Online polls and user voting.
154
+ email:
155
+ - info@codeandeffect.com
156
+ executables: []
157
+ extensions: []
158
+ extra_rdoc_files: []
159
+ files:
160
+ - MIT-LICENSE
161
+ - README.md
162
+ - Rakefile
163
+ - app/assets/config/effective_polls_manifest.js
164
+ - app/assets/stylesheets/effective_polls.scss
165
+ - app/controllers/admin/poll_notifications_controller.rb
166
+ - app/controllers/admin/poll_questions_controller.rb
167
+ - app/controllers/admin/polls_controller.rb
168
+ - app/controllers/effective/ballots_controller.rb
169
+ - app/controllers/effective/polls_controller.rb
170
+ - app/datatables/admin/effective_poll_notifications_datatable.rb
171
+ - app/datatables/admin/effective_poll_questions_datatable.rb
172
+ - app/datatables/admin/effective_poll_results_datatable.rb
173
+ - app/datatables/admin/effective_polls_datatable.rb
174
+ - app/datatables/effective_polls_datatable.rb
175
+ - app/helpers/effective_polls_helper.rb
176
+ - app/mailers/effective/polls_mailer.rb
177
+ - app/models/effective/access_denied.rb
178
+ - app/models/effective/ballot.rb
179
+ - app/models/effective/ballot_response.rb
180
+ - app/models/effective/ballot_response_option.rb
181
+ - app/models/effective/poll.rb
182
+ - app/models/effective/poll_notification.rb
183
+ - app/models/effective/poll_question.rb
184
+ - app/models/effective/poll_question_option.rb
185
+ - app/views/admin/poll_notifications/_form.html.haml
186
+ - app/views/admin/poll_questions/_form.html.haml
187
+ - app/views/admin/polls/_form.html.haml
188
+ - app/views/admin/polls/_form_content.html.haml
189
+ - app/views/admin/polls/_form_poll.html.haml
190
+ - app/views/admin/polls/_poll.html.haml
191
+ - app/views/admin/polls/results.html.haml
192
+ - app/views/effective/ballot_responses/_ballot_response.html.haml
193
+ - app/views/effective/ballot_responses/_fields.html.haml
194
+ - app/views/effective/ballot_responses/fields/_choose_one.html.haml
195
+ - app/views/effective/ballot_responses/fields/_date.html.haml
196
+ - app/views/effective/ballot_responses/fields/_email.html.haml
197
+ - app/views/effective/ballot_responses/fields/_long_answer.html.haml
198
+ - app/views/effective/ballot_responses/fields/_number.html.haml
199
+ - app/views/effective/ballot_responses/fields/_select_all_that_apply.html.haml
200
+ - app/views/effective/ballot_responses/fields/_select_upto_1.html.haml
201
+ - app/views/effective/ballot_responses/fields/_select_upto_2.html.haml
202
+ - app/views/effective/ballot_responses/fields/_select_upto_3.html.haml
203
+ - app/views/effective/ballot_responses/fields/_select_upto_4.html.haml
204
+ - app/views/effective/ballot_responses/fields/_select_upto_5.html.haml
205
+ - app/views/effective/ballot_responses/fields/_short_answer.html.haml
206
+ - app/views/effective/ballot_responses/fields/_upload_file.html.haml
207
+ - app/views/effective/ballot_responses/responses/_choose_one.html.haml
208
+ - app/views/effective/ballot_responses/responses/_date.html.haml
209
+ - app/views/effective/ballot_responses/responses/_email.html.haml
210
+ - app/views/effective/ballot_responses/responses/_long_answer.html.haml
211
+ - app/views/effective/ballot_responses/responses/_number.html.haml
212
+ - app/views/effective/ballot_responses/responses/_select_all_that_apply.html.haml
213
+ - app/views/effective/ballot_responses/responses/_select_upto_1.html.haml
214
+ - app/views/effective/ballot_responses/responses/_select_upto_2.html.haml
215
+ - app/views/effective/ballot_responses/responses/_select_upto_3.html.haml
216
+ - app/views/effective/ballot_responses/responses/_select_upto_4.html.haml
217
+ - app/views/effective/ballot_responses/responses/_select_upto_5.html.haml
218
+ - app/views/effective/ballot_responses/responses/_short_answer.html.haml
219
+ - app/views/effective/ballot_responses/responses/_upload_file.html.haml
220
+ - app/views/effective/ballots/_ballot.html.haml
221
+ - app/views/effective/ballots/complete.html.haml
222
+ - app/views/effective/ballots/start.html.haml
223
+ - app/views/effective/ballots/submit.html.haml
224
+ - app/views/effective/ballots/vote.html.haml
225
+ - app/views/effective/poll_results/_poll_result.html.haml
226
+ - app/views/effective/poll_results/_results.html.haml
227
+ - app/views/effective/poll_results/results/_choose_one.html.haml
228
+ - app/views/effective/poll_results/results/_date.html.haml
229
+ - app/views/effective/poll_results/results/_email.html.haml
230
+ - app/views/effective/poll_results/results/_long_answer.html.haml
231
+ - app/views/effective/poll_results/results/_number.html.haml
232
+ - app/views/effective/poll_results/results/_poll_question_option.html.haml
233
+ - app/views/effective/poll_results/results/_select_all_that_apply.html.haml
234
+ - app/views/effective/poll_results/results/_select_upto_1.html.haml
235
+ - app/views/effective/poll_results/results/_select_upto_2.html.haml
236
+ - app/views/effective/poll_results/results/_select_upto_3.html.haml
237
+ - app/views/effective/poll_results/results/_select_upto_4.html.haml
238
+ - app/views/effective/poll_results/results/_select_upto_5.html.haml
239
+ - app/views/effective/poll_results/results/_short_answer.html.haml
240
+ - app/views/effective/poll_results/results/_upload_file.html.haml
241
+ - app/views/effective/polls/_form.html.haml
242
+ - app/views/effective/polls/_poll.html.haml
243
+ - app/views/layouts/effective_polls_mailer_layout.html.haml
244
+ - config/effective_polls.rb
245
+ - config/routes.rb
246
+ - db/migrate/01_create_effective_polls.rb.erb
247
+ - lib/effective_polls.rb
248
+ - lib/effective_polls/engine.rb
249
+ - lib/effective_polls/version.rb
250
+ - lib/generators/effective_polls/install_generator.rb
251
+ - lib/generators/templates/effective_polls_mailer_preview.rb
252
+ - lib/tasks/effective_polls_tasks.rake
253
+ homepage: https://github.com/code-and-effect/effective_polls
254
+ licenses:
255
+ - MIT
256
+ metadata: {}
257
+ post_install_message:
258
+ rdoc_options: []
259
+ require_paths:
260
+ - lib
261
+ required_ruby_version: !ruby/object:Gem::Requirement
262
+ requirements:
263
+ - - ">="
264
+ - !ruby/object:Gem::Version
265
+ version: '0'
266
+ required_rubygems_version: !ruby/object:Gem::Requirement
267
+ requirements:
268
+ - - ">="
269
+ - !ruby/object:Gem::Version
270
+ version: '0'
271
+ requirements: []
272
+ rubygems_version: 3.1.2
273
+ signing_key:
274
+ specification_version: 4
275
+ summary: Online polls and user voting.
276
+ test_files: []