@@ -22,6 +22,7 @@ gem 'coffee-rails', '~> 4.0.0' |
||
22 | 22 |
|
23 | 23 |
# Use jquery as the JavaScript library |
24 | 24 |
gem 'jquery-rails' |
25 |
+gem 'jquery-ui-rails' |
|
25 | 26 |
|
26 | 27 |
# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks |
27 | 28 |
gem 'turbolinks' |
@@ -70,6 +71,7 @@ gem 'valid_email', :require => 'valid_email/email_validator' |
||
70 | 71 |
gem 'hirb' |
71 | 72 |
gem 'wirble' |
72 | 73 |
gem 'roadie-rails' |
74 |
+gem 'acts_as_list' |
|
73 | 75 |
|
74 | 76 |
group :development do |
75 | 77 |
gem "rename" |
@@ -25,6 +25,8 @@ GEM |
||
25 | 25 |
multi_json (~> 1.3) |
26 | 26 |
thread_safe (~> 0.1) |
27 | 27 |
tzinfo (~> 0.3.37) |
28 |
+ acts_as_list (0.6.0) |
|
29 |
+ activerecord (>= 3.0) |
|
28 | 30 |
addressable (2.3.6) |
29 | 31 |
arel (4.0.2) |
30 | 32 |
bcrypt (3.1.7) |
@@ -144,6 +146,8 @@ GEM |
||
144 | 146 |
jquery-turbolinks (2.1.0) |
145 | 147 |
railties (>= 3.1.0) |
146 | 148 |
turbolinks |
149 |
+ jquery-ui-rails (5.0.3) |
|
150 |
+ railties (>= 3.2.16) |
|
147 | 151 |
json (1.8.1) |
148 | 152 |
kgio (2.9.2) |
149 | 153 |
launchy (2.4.2) |
@@ -315,6 +319,7 @@ PLATFORMS |
||
315 | 319 |
ruby |
316 | 320 |
|
317 | 321 |
DEPENDENCIES |
322 |
+ acts_as_list |
|
318 | 323 |
bootstrap-switch-rails |
319 | 324 |
bootstrap-timepicker-rails |
320 | 325 |
bootstrap_form |
@@ -338,6 +343,7 @@ DEPENDENCIES |
||
338 | 343 |
jbuilder (~> 1.2) |
339 | 344 |
jquery-rails |
340 | 345 |
jquery-turbolinks |
346 |
+ jquery-ui-rails |
|
341 | 347 |
less-rails |
342 | 348 |
letter_opener (~> 1.3.0) |
343 | 349 |
mini_magick |
@@ -13,6 +13,7 @@ |
||
13 | 13 |
//= require jquery |
14 | 14 |
//= require jquery.turbolinks |
15 | 15 |
//= require jquery_ujs |
16 |
+//= require jquery-ui/sortable |
|
16 | 17 |
//= require twitter/bootstrap |
17 | 18 |
//= require bootstrap-switch |
18 | 19 |
//= require jasny-bootstrap |
@@ -28,6 +28,23 @@ function attachHandler(jQuery) { |
||
28 | 28 |
|
29 | 29 |
}); |
30 | 30 |
|
31 |
+ $('#steps_container').sortable({ |
|
32 |
+ axis:'y', |
|
33 |
+ handle: '.handle', |
|
34 |
+ cursor: 'crosshair', |
|
35 |
+ item: 'div', |
|
36 |
+ update: function(){ |
|
37 |
+ console.log("Serialize:" + $('#steps_container').sortable('serialize', {attribute: "id"}, { key: "agent_step" })); |
|
38 |
+ $.ajax({ |
|
39 |
+ url: $(this).data('update'), |
|
40 |
+ type: 'post', |
|
41 |
+ data: $('#steps_container').sortable("serialize", {attribute: "id"}, { key: "agent_step" }), |
|
42 |
+ dataType: 'script' |
|
43 |
+ }); |
|
44 |
+ |
|
45 |
+ } |
|
46 |
+ }); |
|
47 |
+ |
|
31 | 48 |
} |
32 | 49 |
|
33 | 50 |
$(document).ready(attachHandler); |
@@ -64,6 +64,13 @@ class MissionEditor::AgentsController < ApplicationController |
||
64 | 64 |
format.json { head :no_content } |
65 | 65 |
end |
66 | 66 |
end |
67 |
+ |
|
68 |
+ def sort_steps |
|
69 |
+ params[:agent_step].each_with_index do |step, index| |
|
70 |
+ AgentStep.find(step).update(position: (index + 1)) |
|
71 |
+ end |
|
72 |
+ render nothing: true |
|
73 |
+ end |
|
67 | 74 |
|
68 | 75 |
private |
69 | 76 |
# Use callbacks to share common setup or constraints between actions. |
@@ -124,7 +124,7 @@ class MissionsController < ApplicationController |
||
124 | 124 |
def step_submission |
125 | 125 |
mission = Mission.friendly.find(params[:id]) |
126 | 126 |
agent = mission.mission_agents.friendly.find(params[:agent]) |
127 |
- step = agent.agent_steps.find_by_step(params[:step]) |
|
127 |
+ step = agent.agent_steps.where(id: params[:step]).last |
|
128 | 128 |
submission = step.create_submission(step_submission_params, params[:step_submission][:submission_contents_attributes].values) |
129 | 129 |
respond_to do |format| |
130 | 130 |
if submission.save |
@@ -5,6 +5,8 @@ class AgentStep < ActiveRecord::Base |
||
5 | 5 |
|
6 | 6 |
accepts_nested_attributes_for :step_validations, allow_destroy:true |
7 | 7 |
|
8 |
+ acts_as_list scope: :mission_agent |
|
9 |
+ |
|
8 | 10 |
def create_submission(step_submission, contents) |
9 | 11 |
submission = StepSubmission.new(step_submission) |
10 | 12 |
submission.agent_step = self |
@@ -7,7 +7,7 @@ class MissionAgent < ActiveRecord::Base |
||
7 | 7 |
belongs_to :mission |
8 | 8 |
belongs_to :user |
9 | 9 |
|
10 |
- has_many :agent_steps, :dependent => :destroy |
|
10 |
+ has_many :agent_steps, -> { order("position ASC") }, :dependent => :destroy |
|
11 | 11 |
has_many :mission_candidates, :dependent => :destroy |
12 | 12 |
|
13 | 13 |
has_and_belongs_to_many :rewards |
@@ -16,7 +16,7 @@ class MissionAgent < ActiveRecord::Base |
||
16 | 16 |
accepts_nested_attributes_for :mission_candidates |
17 | 17 |
|
18 | 18 |
def is_assigned |
19 |
- if self.mission_candidates.find_all_by_status(1).last == nil |
|
19 |
+ if self.user == nil |
|
20 | 20 |
return false |
21 | 21 |
else |
22 | 22 |
return true |
@@ -3,8 +3,6 @@ class StepValidation < ActiveRecord::Base |
||
3 | 3 |
has_many :submission_contents |
4 | 4 |
belongs_to :validation, polymorphic: true |
5 | 5 |
|
6 |
- after_save :create_validation |
|
7 |
- |
|
8 | 6 |
attr_writer :description |
9 | 7 |
|
10 | 8 |
def icon |
@@ -33,8 +31,4 @@ class StepValidation < ActiveRecord::Base |
||
33 | 31 |
end |
34 | 32 |
end |
35 | 33 |
|
36 |
- def create_validation |
|
37 |
- |
|
38 |
- end |
|
39 |
- |
|
40 | 34 |
end |
@@ -14,7 +14,7 @@ |
||
14 | 14 |
<% end %> |
15 | 15 |
<% end %> |
16 | 16 |
|
17 |
- <%= render :partial => 'form_step', locals: { mission_agent: @mission_agent, f: f } %> |
|
17 |
+ <%= render :partial => 'form_step', locals: { mission_agent: @mission_agent, f: f, mission: @mission } %> |
|
18 | 18 |
|
19 | 19 |
|
20 | 20 |
<%= content_tag(:div, class: "form-submit-center") do %> |
@@ -1,9 +1,9 @@ |
||
1 |
-<%= content_tag(:div, id: 'steps_container') do %> |
|
1 |
+<%= content_tag(:div, id: 'steps_container', class: 'list', data: {update: sort_agent_steps_path(mission.slug) }) do %> |
|
2 | 2 |
<% step_number = 0 %> |
3 |
- <%= f.fields_for :agent_steps, show_empty: false do |ff| %> |
|
3 |
+ <%= f.fields_for :agent_steps, :wrapper => false, show_empty: false do |ff| %> |
|
4 | 4 |
<% step_number = step_number + 1%> |
5 |
- <%= content_tag(:div, class: "panel panel-white #{'hidden' if ff.object == nil}") do %> |
|
6 |
- <%= content_tag(:div, class: 'panel-heading') do %> |
|
5 |
+ <%= content_tag(:div, id: "agent_step_#{ff.object.id}" ,class: "fields panel panel-white step #{'hidden' if ff.object == nil}") do %> |
|
6 |
+ <%= content_tag(:div, class: 'panel-heading handle') do %> |
|
7 | 7 |
<%= content_tag(:h3, class: 'panel-title') do %> |
8 | 8 |
<%= content_tag(:span, (ff.object.step.to_s != '' ? ff.object.step.to_s : '#'), class: 'task-number') %> |
9 | 9 |
<a class="accordion-toggle" data-toggle="collapse" data-parent="#colapse_steps" href="#collapse_step_<%= step_number.to_s %>"> |
@@ -23,7 +23,7 @@ |
||
23 | 23 |
<%= ff.text_area :description, label: (t 'mission_editor.agents.description'), class: 'input-block-level', rows: 10 %> |
24 | 24 |
<% end %> |
25 | 25 |
<% end %> |
26 |
- <%= render :partial => 'form_step_validation', locals: {ff: ff} %> |
|
26 |
+ <%= render :partial => 'form_step_validation', locals: {ff: ff, mission: mission} %> |
|
27 | 27 |
|
28 | 28 |
<% end %> |
29 | 29 |
<% end %> |
@@ -203,7 +203,7 @@ |
||
203 | 203 |
<%= content_tag(:div, class: 'page-header') do %> |
204 | 204 |
<%= content_tag(:small, ((t 'mission.notification')+':').html_safe) %> |
205 | 205 |
<%= content_tag(:h2) do %> |
206 |
- <%= "#{t 'mission.step'} #{@step.step.to_s} #{t 'step.denied'}".html_safe %> |
|
206 |
+ <%= "#{t 'mission.step'} #{@step.position.to_s} #{t 'step.denied'}".html_safe %> |
|
207 | 207 |
<% end %> |
208 | 208 |
<hr> |
209 | 209 |
<%= content_tag(:small, ((t 'mission.step')+':').html_safe) %> |
@@ -1,6 +1,6 @@ |
||
1 | 1 |
----------------- |
2 | 2 |
|
3 |
-<%= "#{t 'mission.step'} #{@step.step.to_s} #{t 'step.denied'} - #{@step.title}" %> |
|
3 |
+<%= "#{t 'mission.step'} #{@step.position.to_s} #{t 'step.denied'} - #{@step.title}" %> |
|
4 | 4 |
|
5 | 5 |
<%= "#{t 'mission.mission'}:" %> |
6 | 6 |
<%= @step.mission_agent.mission.title %> |
@@ -203,7 +203,7 @@ |
||
203 | 203 |
<%= content_tag(:div, class: 'page-header') do %> |
204 | 204 |
<%= content_tag(:small, ((t 'mission.notification')+':').html_safe) %> |
205 | 205 |
<%= content_tag(:h2) do %> |
206 |
- <%= "#{t 'mission.step'} #{@step.step.to_s} #{t 'step.validated'}".html_safe %> |
|
206 |
+ <%= "#{t 'mission.step'} #{@step.position.to_s} #{t 'step.validated'}".html_safe %> |
|
207 | 207 |
<% end %> |
208 | 208 |
<hr> |
209 | 209 |
<%= content_tag(:small, ((t 'mission.step')+':').html_safe) %> |
@@ -1,6 +1,6 @@ |
||
1 | 1 |
----------------- |
2 | 2 |
|
3 |
-<%= "#{t 'mission.step'} #{@step.step.to_s} #{t 'step.validated'} - #{@step.title}" %> |
|
3 |
+<%= "#{t 'mission.step'} #{@step.position.to_s} #{t 'step.validated'} - #{@step.title}" %> |
|
4 | 4 |
|
5 | 5 |
<%= "#{t 'mission.mission'}:" %> |
6 | 6 |
<%= @step.mission_agent.mission.title %> |
@@ -7,7 +7,7 @@ |
||
7 | 7 |
<% if step_count <= 2 || agent.agent_steps.count <= 3 %> |
8 | 8 |
<%= content_tag(:div, class: 'thumbnail-task') do %> |
9 | 9 |
<%= content_tag(:p) do %> |
10 |
- <%= content_tag(:span, step.step, class: 'task-number') %> |
|
10 |
+ <%= content_tag(:span, step.position, class: 'task-number') %> |
|
11 | 11 |
<%= content_tag(:span, step.title, class: 'task-text') %> |
12 | 12 |
<%= content_tag(:span, step.icons.html_safe, class: 'task-icon pull-right') %> |
13 | 13 |
<% end %> |
@@ -1,4 +1,4 @@ |
||
1 |
-<% submission_id = 'collapse_step_' + step.step.to_s + '_validations' %> |
|
1 |
+<% submission_id = 'collapse_step_' + step.position.to_s + '_validations' %> |
|
2 | 2 |
<%= content_tag(:div, class: 'panel-group accordion', id: submission_id) do %> |
3 | 3 |
<% step.step_validations.each do |validation| %> |
4 | 4 |
<% validation_id = 'collapse_validation_' + validation.id.to_s %> |
@@ -7,7 +7,7 @@ |
||
7 | 7 |
<%= link_to(('#'+ validation_id), class: 'accordion-toggle', :data => {toggle: 'collapse', parent: submission_id}) do %> |
8 | 8 |
<%= content_tag(:span, validation.icon.html_safe, class: 'task-icon pull-left') %> |
9 | 9 |
<%= content_tag(:span, '', class: 'caret caret-center') %> |
10 |
- <%= content_tag(:span, (step.step_validations.first != nil ? step.step_validations.first.validation.description : 'test'), class: 'task-text') %> |
|
10 |
+ <%= content_tag(:span, (step.step_validations.first.description != nil ? step.step_validations.first.validation.description : 'test'), class: 'task-text') %> |
|
11 | 11 |
<% end %> |
12 | 12 |
|
13 | 13 |
<% end %> |
@@ -71,12 +71,12 @@ |
||
71 | 71 |
<% # Steps %> |
72 | 72 |
<% @agent.agent_steps.order('step ASC').each do |step| %> |
73 | 73 |
<% step_submission = StepSubmission.new %> |
74 |
- <%= bootstrap_nested_form_for(StepSubmission.new, url: step_submission_path(step: step.step, mission: @mission.slug, agent: @agent.slug)) do |f| %> |
|
74 |
+ <%= bootstrap_nested_form_for(StepSubmission.new, url: step_submission_path(step: step.id, mission: @mission.slug, agent: @agent.slug)) do |f| %> |
|
75 | 75 |
<%= content_tag(:div, class: 'panel panel-default') do %> |
76 | 76 |
<%= content_tag(:div, class: 'panel-heading') do %> |
77 | 77 |
<%= content_tag(:h3, class: 'panel-title') do %> |
78 |
- <%= content_tag(:span, step.step, class: 'task-number') %> |
|
79 |
- <a class="accordion-toggle" data-toggle="collapse" data-parent="#colapse_steps" href="#collapse_step_<%= step.step %>"> |
|
78 |
+ <%= content_tag(:span, step.position, class: 'task-number') %> |
|
79 |
+ <a class="accordion-toggle" data-toggle="collapse" data-parent="#colapse_steps" href="#collapse_step_<%= step.position %>"> |
|
80 | 80 |
<span class="caret"></span> |
81 | 81 |
<%= content_tag(:span, step.title, class: 'task-text') %> |
82 | 82 |
|
@@ -92,7 +92,7 @@ |
||
92 | 92 |
<% end %> |
93 | 93 |
<% end %> |
94 | 94 |
<% end %> |
95 |
- <%= content_tag(:div, class: 'panel-body collapse', id: ('collapse_step_'+ step.step.to_s)) do %> |
|
95 |
+ <%= content_tag(:div, class: 'panel-body collapse', id: ('collapse_step_'+ step.position.to_s)) do %> |
|
96 | 96 |
<%= content_tag(:div, class: "panel-content") do %> |
97 | 97 |
<%= content_tag(:div, class: "panel-text") do %> |
98 | 98 |
<%= step.description.html_safe if step.description %> |
@@ -30,17 +30,17 @@ Avalanche2::Application.configure do |
||
30 | 30 |
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 } |
31 | 31 |
config.action_mailer.raise_delivery_errors = true |
32 | 32 |
|
33 |
- #config.action_mailer.delivery_method = :letter_opener |
|
34 |
- config.action_mailer.delivery_method = :smtp |
|
35 |
- |
|
36 |
- config.action_mailer.smtp_settings = { |
|
37 |
- :address => "smtp.mandrillapp.com", |
|
38 |
- :port => 587, # ports 587 and 2525 are also supported with STARTTLS |
|
39 |
- :enable_starttls_auto => true, # detects and uses STARTTLS |
|
40 |
- :user_name => ENV["MANDRILL_USERNAME"], |
|
41 |
- :password => ENV["MANDRILL_KEY"], # SMTP password is any valid API key |
|
42 |
- :authentication => 'login', # Mandrill supports 'plain' or 'login' |
|
43 |
- :domain => ENV["DOMAIN_NAME"] # your domain to identify your server when connecting |
|
44 |
- } |
|
33 |
+ config.action_mailer.delivery_method = :letter_opener |
|
34 |
+ # config.action_mailer.delivery_method = :smtp |
|
35 |
+# |
|
36 |
+# config.action_mailer.smtp_settings = { |
|
37 |
+# :address => "smtp.mandrillapp.com", |
|
38 |
+# :port => 587, # ports 587 and 2525 are also supported with STARTTLS |
|
39 |
+# :enable_starttls_auto => true, # detects and uses STARTTLS |
|
40 |
+# :user_name => ENV["MANDRILL_USERNAME"], |
|
41 |
+# :password => ENV["MANDRILL_KEY"], # SMTP password is any valid API key |
|
42 |
+# :authentication => 'login', # Mandrill supports 'plain' or 'login' |
|
43 |
+# :domain => ENV["DOMAIN_NAME"] # your domain to identify your server when connecting |
|
44 |
+# } |
|
45 | 45 |
|
46 | 46 |
end |
@@ -35,11 +35,14 @@ Avalanche2::Application.routes.draw do |
||
35 | 35 |
get 'missions/:id/mission_control/reject_step_submission/:step_submission_id' => 'missions#reject_step_submission', as: :reject_step_submission |
36 | 36 |
|
37 | 37 |
# Mission Editor |
38 |
- get 'missions/:id/editor' => 'missions#edit', as: :mission_editor |
|
38 |
+ get 'missions/:id/editor' => 'missions#edit', as: :mission_editor |
|
39 |
+ |
|
39 | 40 |
scope 'missions/:mission/editor' do |
40 | 41 |
resources :rewards, :controller => "mission_editor/rewards" |
41 | 42 |
resources :mission_agents, :controller => "mission_editor/agents", path: '/agents' |
43 |
+ post '/sort_steps', :controller => "mission_editor/agents", :action => "sort_steps", as: :sort_agent_steps |
|
42 | 44 |
end |
45 |
+ |
|
43 | 46 |
|
44 | 47 |
# get 'missions/:id/editor/rewards' => 'rewards#index', as: :mission_editor_rewards_list |
45 | 48 |
# get 'missions/:id/editor/rewards/new' => 'rewards#new', as: :mission_editor_new_reward |
@@ -0,0 +1,5 @@ |
||
1 |
+class AddPositionToAgentStep < ActiveRecord::Migration |
|
2 |
+ def change |
|
3 |
+ add_column :agent_steps, :position, :integer |
|
4 |
+ end |
|
5 |
+end |
@@ -11,7 +11,7 @@ |
||
11 | 11 |
# |
12 | 12 |
# It's strongly recommended that you check this file into your version control system. |
13 | 13 |
|
14 |
-ActiveRecord::Schema.define(version: 20150314233050) do |
|
14 |
+ActiveRecord::Schema.define(version: 20150315034117) do |
|
15 | 15 |
|
16 | 16 |
# These are extensions that must be enabled in order to support this database |
17 | 17 |
enable_extension "plpgsql" |
@@ -27,6 +27,7 @@ ActiveRecord::Schema.define(version: 20150314233050) do |
||
27 | 27 |
t.datetime "updated_at" |
28 | 28 |
t.integer "step_submissions_id" |
29 | 29 |
t.integer "step_validations_id" |
30 |
+ t.integer "position" |
|
30 | 31 |
end |
31 | 32 |
|
32 | 33 |
add_index "agent_steps", ["mission_agent_id"], name: "index_agent_steps_on_mission_agent_id", using: :btree |