Create agent with nested steps - layout and code

James Peret лет %!s(int64=10): %!d(string=назад)
Родитель
Сommit
94c96a9373
31 измененных файлов с 486 добавлено и 75 удалено
  1. 1 0
      app/assets/javascripts/application.js
  2. 22 0
      app/assets/javascripts/mission_editor.js
  3. 1 1
      app/assets/javascripts/missions.js
  4. 2 0
      app/assets/stylesheets/avl2_theme/buttons.less
  5. 14 0
      app/assets/stylesheets/avl2_theme/panel.less
  6. 8 0
      app/assets/stylesheets/avl2_theme/typography.less
  7. 43 0
      app/assets/stylesheets/mission_editor.css.less
  8. 1 1
      app/assets/stylesheets/missions.css.less
  9. 14 9
      app/controllers/mission_editor/mission_agents_controller.rb
  10. 2 4
      app/controllers/mission_editor/rewards_controller.rb
  11. 28 0
      app/views/mission_editor/agents/_form.html.erb
  12. 33 0
      app/views/mission_editor/agents/_form_step.html.erb
  13. 20 0
      app/views/mission_editor/agents/_mission_editor_agent.html.erb
  14. 41 0
      app/views/mission_editor/agents/edit.html.erb
  15. 53 0
      app/views/mission_editor/agents/index.html.erb
  16. 0 0
      app/views/mission_editor/agents/index.json.jbuilder
  17. 41 0
      app/views/mission_editor/agents/new.html.erb
  18. 0 0
      app/views/mission_editor/agents/show.html.erb
  19. 0 0
      app/views/mission_editor/agents/show.json.jbuilder
  20. 0 10
      app/views/mission_editor/mission_agents/_form.html.erb
  21. 0 6
      app/views/mission_editor/mission_agents/edit.html.erb
  22. 0 25
      app/views/mission_editor/mission_agents/index.html.erb
  23. 0 5
      app/views/mission_editor/mission_agents/new.html.erb
  24. 1 1
      app/views/mission_editor/rewards/_form.html.erb
  25. 2 2
      app/views/mission_editor/rewards/index.html.erb
  26. 12 1
      config/locales/mission.en.yml
  27. 12 1
      config/locales/mission.pt-BR.yml
  28. 5 5
      config/locales/simple_form.en.yml
  29. 2 2
      config/routes.rb
  30. 114 0
      public/javascripts/nested_form.js
  31. 14 2
      readme.md

+ 1 - 0
app/assets/javascripts/application.js

@@ -19,4 +19,5 @@
19 19
 //= require summernote
20 20
 //= require turbolinks
21 21
 //= require google_analytics
22
+//= require jquery_nested_form
22 23
 //= require_tree .

+ 22 - 0
app/assets/javascripts/mission_editor.js

@@ -0,0 +1,22 @@
1
+// Mission Editor
2
+
3
+function attachHandler(jQuery) {
4
+	
5
+	$(document).on('nested:fieldAdded', function(event){
6
+
7
+	  var field = event.field; 
8
+	  var acordion_toggle = field.find('.accordion-toggle');
9
+	  var panel_body = field.find('.panel-body');
10
+	  field.find(".panel").removeClass("hidden");
11
+  
12
+	  var timestamp = new Date().getUTCMilliseconds();
13
+	  var new_id = "collapse_step_" + timestamp;
14
+	  acordion_toggle.attr("href", "#" + new_id);
15
+	  panel_body.attr("id", new_id);
16
+	  //alert(panel_body.id)
17
+	})
18
+	
19
+}
20
+
21
+$(document).ready(attachHandler);
22
+$(document).load(attachHandler);

+ 1 - 1
app/assets/javascripts/missions.js

@@ -1,4 +1,4 @@
1
-# Missions JS
1
+// Missions JS
2 2
 
3 3
 function attachHandler(jQuery) {
4 4
 	

+ 2 - 0
app/assets/stylesheets/avl2_theme/buttons.less

@@ -25,6 +25,8 @@
25 25
 	display: inline-block;
26 26
 	padding: 4px 12px;
27 27
 	margin-bottom: 0;
28
+	margin-left: 5px;
29
+	margin-right: 5px;
28 30
 	text-align: center;
29 31
 	vertical-align: middle;
30 32
 	cursor: pointer;

+ 14 - 0
app/assets/stylesheets/avl2_theme/panel.less

@@ -7,6 +7,20 @@
7 7
 	.box-theme; 
8 8
 }
9 9
 
10
+.panel.panel-white {
11
+	margin-top: 15px;
12
+	.box-theme; 
13
+	background-color: @white;
14
+	.panel-heading { background-color: @white; }
15
+}
16
+
17
+.panel.panel-dashed {
18
+	margin-top: 15px;
19
+	.box-theme; 
20
+	border: 2px dashed #AFB4BF;
21
+	padding: 6px;
22
+}
23
+
10 24
 .panel {
11 25
 	.panel-heading {
12 26
 		background-color: @light-gray;

+ 8 - 0
app/assets/stylesheets/avl2_theme/typography.less

@@ -7,6 +7,14 @@
7 7
 	line-height: 17px;
8 8
 }
9 9
 
10
+.banner-text {
11
+	font-family: Avenir-Black;
12
+	font-size: 21px;
13
+	color: #0F2105;
14
+	line-height: 29px;
15
+	text-transform: uppercase;
16
+}
17
+
10 18
 // Typography Hacks
11 19
 
12 20
 .all-caps { text-transform: uppercase;}

+ 43 - 0
app/assets/stylesheets/mission_editor.css.less

@@ -131,4 +131,47 @@ span.btn-file .form-group {
131 131
 		p { margin-top: -15px;}
132 132
 		i { font-size: 210px;}
133 133
 	}
134
+}
135
+
136
+.mission-editor-agents-list {
137
+	margin-left: 0px;
138
+	list-style: none;
139
+	li.agent-box {
140
+		background-color: @white;
141
+		margin-bottom: 35px;
142
+		.thumbnail {
143
+			height: 315px;
144
+			.thumbnail-agent-description {
145
+				height: 125px;
146
+			}
147
+			.thumbnail-banner {
148
+				text-align: center;
149
+				background-color: @green;
150
+				height: 50px;
151
+				padding-top: 25px;
152
+				p { .banner-text }
153
+			}
154
+		}
155
+	}
156
+	.editor-reward {
157
+		height: 315px;
158
+		border: @theme-border;
159
+		border-radius: @theme-border-radius;
160
+		background-color: @white;
161
+		.theme-box-padding
162
+	}
163
+	.editor-reward-new {
164
+		height: 315px;
165
+		border: 2px dashed #AFB4BF;
166
+		border-radius: 10px;
167
+		text-align: center;
168
+		i { font-size: 220px; color: #AFB4BF; }
169
+	}
170
+	.centered-editor-new {
171
+		width: 350px;
172
+		margin-left: auto;
173
+		margin-right: auto;
174
+		p { margin-top: -15px;}
175
+		i { font-size: 210px;}
176
+	}
134 177
 }

+ 1 - 1
app/assets/stylesheets/missions.css.less

@@ -171,7 +171,7 @@
171 171
 }
172 172
 
173 173
 .reward-blank {
174
-	height: 120px;
174
+	height: 130px;
175 175
 	font-family: Avenir-MediumOblique;
176 176
 	font-size: 14px;
177 177
 	color: #3C3F47;

+ 14 - 9
app/controllers/mission_editor/mission_agents_controller.rb

@@ -1,13 +1,12 @@
1
-class MissionEditor::MissionAgentsController < MissionEditorController
2
-  
3
-  MissionAgentsController.append_view_path("views/mission_editor/mission_agents")
1
+class MissionEditor::AgentsController < ApplicationController
4 2
   
5 3
   before_action :set_mission_agent, only: [:show, :edit, :update, :destroy]
4
+  before_action :set_mission
6 5
 
7 6
   # GET /mission_agents
8 7
   # GET /mission_agents.json
9 8
   def index
10
-    @mission_agents = MissionAgent.all
9
+    @mission_agents = MissionAgent.where(mission: @mission)
11 10
   end
12 11
 
13 12
   # GET /mission_agents/1
@@ -18,6 +17,8 @@ class MissionEditor::MissionAgentsController < MissionEditorController
18 17
   # GET /mission_agents/new
19 18
   def new
20 19
     @mission_agent = MissionAgent.new
20
+    @mission_agent.agent_steps.build
21
+    
21 22
   end
22 23
 
23 24
   # GET /mission_agents/1/edit
@@ -28,10 +29,10 @@ class MissionEditor::MissionAgentsController < MissionEditorController
28 29
   # POST /mission_agents.json
29 30
   def create
30 31
     @mission_agent = MissionAgent.new(mission_agent_params)
31
-
32
+    @mission_agent.mission = @mission
32 33
     respond_to do |format|
33 34
       if @mission_agent.save
34
-        format.html { redirect_to @mission_agent, notice: 'Mission agent was successfully created.' }
35
+        format.html { redirect_to mission_agents_path(@mission), notice: 'Mission agent was successfully created.' }
35 36
         format.json { render action: 'show', status: :created, location: @mission_agent }
36 37
       else
37 38
         format.html { render action: 'new' }
@@ -45,7 +46,7 @@ class MissionEditor::MissionAgentsController < MissionEditorController
45 46
   def update
46 47
     respond_to do |format|
47 48
       if @mission_agent.update(mission_agent_params)
48
-        format.html { redirect_to @mission_agent, notice: 'Mission agent was successfully updated.' }
49
+        format.html { redirect_to  mission_agents_path(@mission), notice: 'Mission agent was successfully updated.' }
49 50
         format.json { head :no_content }
50 51
       else
51 52
         format.html { render action: 'edit' }
@@ -67,11 +68,15 @@ class MissionEditor::MissionAgentsController < MissionEditorController
67 68
   private
68 69
     # Use callbacks to share common setup or constraints between actions.
69 70
     def set_mission_agent
70
-      @mission_agent = MissionAgent.find(params[:id])
71
+      @mission_agent = MissionAgent.friendly.find(params[:id])
72
+    end
73
+    
74
+    def set_mission
75
+       @mission = Mission.friendly.find(params[:mission])
71 76
     end
72 77
 
73 78
     # Never trust parameters from the scary internet, only allow the white list through.
74 79
     def mission_agent_params
75
-      params[:mission_agent]
80
+      params.require(:mission_agent).permit!
76 81
     end
77 82
 end

+ 2 - 4
app/controllers/mission_editor/rewards_controller.rb

@@ -1,7 +1,5 @@
1 1
 class MissionEditor::RewardsController < ApplicationController
2
-  
3
- 
4
-  
2
+
5 3
   before_action :set_reward, only: [:edit, :update, :destroy]
6 4
   before_action :set_mission
7 5
 
@@ -68,7 +66,7 @@ class MissionEditor::RewardsController < ApplicationController
68 66
     end
69 67
     
70 68
     def set_mission
71
-       @mission = Mission.friendly.find(params[:id])
69
+       @mission = Mission.friendly.find(params[:mission])
72 70
     end
73 71
 
74 72
     # Never trust parameters from the scary internet, only allow the white list through.

+ 28 - 0
app/views/mission_editor/agents/_form.html.erb

@@ -0,0 +1,28 @@
1
+<%= bootstrap_nested_form_for(@mission_agent, url: {action: form_action, mission: @mission.slug, id: @mission_agent.slug}) do |f| %>
2
+  <%= f.alert_message "Please fix the errors below." %>
3
+  <%= content_tag(:div, class: 'panel panel-default') do %>
4
+  	<%= content_tag(:div, class: 'panel-body white-bg') do %>
5
+		<%= content_tag(:div, class: "panel-content") do %>
6
+			<%= content_tag(:div, class: "panel-text") do %>
7
+				<%= content_tag(:div, class: "form-inputs") do %>
8
+				    <%= f.text_field :role, label: (t 'mission_editor.agents.role'), class: 'input-block-level' %>
9
+				    <%= f.text_area :objective, label: (t 'mission_editor.agents.objective'), class: 'input-block-level', rows: 5 %>
10
+				    <%= f.text_area :briefing, label: (t 'mission_editor.mission_details.briefing'), class: 'input-block-level', rows: 10 %>
11
+				<% end %>
12
+			<% end %>
13
+		<% end %>
14
+	<% end %>
15
+  <% end %>
16
+  
17
+  <%= render :partial => 'form_step', locals: { mission_agent: @mission_agent, f: f } %>
18
+
19
+  
20
+  <%= content_tag(:div, class: "form-submit-center") do %>
21
+  	<%= content_tag(:p) do %>
22
+		<%= f.submit (t 'mission_editor.agents.save_agent'), class: 'btn btn-large btn-success spacer-left-small' %>
23
+	<% end %>
24
+	<%= content_tag(:p) do %>
25
+		<%= link_to (t'nav.cancel'), mission_agents_path(@mission), class: 'btn btn-link btn-danger' %>
26
+	<% end %>
27
+  <% end %>
28
+<% end %>

+ 33 - 0
app/views/mission_editor/agents/_form_step.html.erb

@@ -0,0 +1,33 @@
1
+<%= content_tag(:div, id: 'steps_container') do %>
2
+	<% step_number = 0 %>
3
+	<%= f.fields_for :agent_steps, show_empty: false do |ff| %>
4
+		<% step_number = step_number + 1%>
5
+		<%= content_tag(:div, class: 'panel panel-white hidden') do %>
6
+			<%= content_tag(:div, class: 'panel-heading') do %>
7
+				<%= content_tag(:h3, class: 'panel-title') do %>
8
+					<%= content_tag(:span, (ff.object.step.to_s != '' ? ff.object.step.to_s : '#'), class: 'task-number') %>
9
+					<a class="accordion-toggle" data-toggle="collapse" data-parent="#colapse_steps" href="#collapse_step_<%= step_number.to_s %>">
10
+						<span class="caret"></span>
11
+						<%= content_tag(:span, (t 'mission_editor.agents.step'), class: 'task-text') %>
12
+						<%= content_tag(:span, ff.object.step.to_s, class: 'task-text') do %>
13
+							<%= ff.link_to_remove "Remove", class: 'pull-right btn btn-danger btn-small' %>
14
+						<% end %>
15
+					</a>
16
+			
17
+				<% end %>
18
+			<% end %>
19
+			<%= content_tag(:div, class: 'panel-body collapse', id: ('collapse_step_' + step_number.to_s)) do %>
20
+				<%= content_tag(:div, class: "panel-content") do %>
21
+					<%= content_tag(:div, class: "panel-text") do %>
22
+						<%= ff.text_field :title, label: (t 'mission_editor.agents.step_title'), class: 'input-block-level' %>
23
+						<%= ff.text_area :description, label: (t 'mission_editor.agents.description'), class: 'input-block-level', rows: 10 %>
24
+					<% end %>
25
+		
26
+				<% end %>
27
+			<% end %>
28
+		<% end %>
29
+	 <% end %>	 
30
+<% end %>
31
+ <%= content_tag(:div, class: 'panel panel-dashed centered') do %>
32
+ 	<%= f.link_to_add "Add a step", :agent_steps, class: 'btn', :data => { :target => "#steps_container" } %>
33
+<% end %>

+ 20 - 0
app/views/mission_editor/agents/_mission_editor_agent.html.erb

@@ -0,0 +1,20 @@
1
+<%= content_tag(:li, class: 'span4 agent-box') do %>
2
+	<% content_tag(:div, class: 'thumbnail') do %>
3
+		<%= content_tag(:div, class: 'thumbnail-content') do%>
4
+	          <%= content_tag(:h3, (link_to agent.role, mission_agent_details_path(mission, agent))) %>
5
+	          <%= content_tag(:p, agent.objective, class: 'thumbnail-agent-description') %>
6
+		<% end %>
7
+		<%= content_tag(:div, class: 'thumbnail-banner') do%>
8
+			<%= content_tag(:p, (t 'mission_editor.agents.ok'), class: 'banner-text') %>
9
+		<% end %>
10
+		
11
+		<% # Edit Agent %>
12
+		<%= content_tag(:div, class: 'thumbnail-content thumbnail-line-top') do%>
13
+	          <%= content_tag(:div, class: 'centered') do %>
14
+				<%= link_to (t'nav.edit'), url_for(controller: 'mission_editor/agents', action: 'edit', mission: @mission.slug, id: agent.slug, only_path: true), class: 'btn'%>
15
+				<%= link_to (t'mission_editor.agents.view'), mission_agent_path(mission, agent), class: 'btn' %>
16
+				<%= link_to (t'mission_editor.agents.destroy'), mission_agent_path(mission, agent), method: :delete, data: { confirm: 'Are you sure?' }, class: 'btn btn-danger' %>
17
+			<% end %>
18
+		<% end %>
19
+	<% end %>
20
+<% end %>

+ 41 - 0
app/views/mission_editor/agents/edit.html.erb

@@ -0,0 +1,41 @@
1
+<% title "#{t 'mission_editor.agents.edit_agent'} - #{@config.website_name}" %>
2
+
3
+<%= render :partial => 'missions/mission_editor_tabs' %>
4
+
5
+<%= content_tag(:div, class: 'container-bg') do %>
6
+	<%= content_tag(:div, class: 'container container-bg mission-detail-container') do %>
7
+		<%= content_tag(:div, class: 'row') do %>
8
+			<%= content_tag(:div, class: 'span12') do %>
9
+				
10
+				<%= content_tag(:div, class: 'page-header page-header-type') do %>
11
+					<%= content_tag(:small, @mission.title + ':') %>
12
+					<%= content_tag(:h1) do %>
13
+						<%= t 'mission_editor.agents.edit_agent' %>
14
+					<% end %>
15
+				<% end %>
16
+				
17
+			<% end%>
18
+		<% end %>
19
+		<%= content_tag(:div, class: 'row') do %>
20
+			<%= content_tag(:div, class: 'span8') do %>
21
+			
22
+				<%= render :partial => 'form', locals: {form_action: 'update'} %>
23
+			
24
+			<% end %>
25
+			<% # Sidebar %>
26
+			<%= content_tag(:div, class: 'span4 sidebar') do %>
27
+			     <%= content_tag(:div, class: 'panel panel-default sidebar-carret') do %>
28
+			     	<%= content_tag(:div, class: 'panel-body white-bg') do %>
29
+				   		<%= content_tag(:div, class: "panel-content") do %>
30
+				   			<%= content_tag(:div, class: "panel-text") do %>
31
+								<%= content_tag(:h3, (t 'mission_editor.agents.agent_details_help_title')) %>
32
+								<%= content_tag(:div, (t 'mission_editor.agents.agent_details_help').html_safe, class: 'small-text') %>
33
+							<% end %>
34
+						<% end %>
35
+					<% end %>
36
+				<% end %>
37
+			<% end %>
38
+			
39
+		<% end %>
40
+	<% end %>			
41
+<% end %>

+ 53 - 0
app/views/mission_editor/agents/index.html.erb

@@ -0,0 +1,53 @@
1
+<%= render :partial => 'missions/mission_editor_tabs' %>
2
+
3
+<%= content_tag(:div, class: 'container-bg') do %>
4
+	<%= content_tag(:div, class: 'container container-bg mission-detail-container') do %>
5
+		<%= content_tag(:div, class: 'row') do %>
6
+			<%= content_tag(:div, class: 'span12') do %>
7
+			
8
+				<%= content_tag(:div, class: 'page-header page-header-type') do %>
9
+					<%= content_tag(:small, @mission.title + ':') %>
10
+					<%= content_tag(:h1) do %>
11
+						<%= t 'mission_editor.agents.page_title' %>
12
+					<% end %>
13
+				<% end %>
14
+				
15
+			<% end%>
16
+		<% end %>
17
+		<%= content_tag(:div, class: 'row') do %>
18
+			<%= content_tag(:ul, class: 'mission-editor-agents-list') do %>
19
+			     <% @mission_agents.each do |agent| %>
20
+					<%= render :partial => 'mission_editor_agent', locals: {mission: @mission, agent: agent} %>
21
+				<% end %>
22
+				
23
+				<% if @mission_agents.count == 0 %>
24
+					<% centered = ['span12', 'centered-editor-new', "<p>#{t'mission_editor.agents.no_agents'}</p>"] %>
25
+				<% else %>
26
+					<% centered = ['span4', '', '<br>'] %>
27
+				<% end %>
28
+				<%= content_tag(:li, class: centered[0] ) do %>
29
+					<%= content_tag(:div, class: "editor-reward-new #{centered[1]}") do %>
30
+						<i class="icon-agent"></i><br>
31
+						<%= centered[2].html_safe %>
32
+						<%= link_to (t'mission_editor.agents.add'), new_mission_agent_path(@mission), class: 'btn' %>
33
+					<% end %>
34
+				<% end %>
35
+			<% end %>
36
+		<% end %>
37
+		<%= content_tag(:div, class: 'row') do %>
38
+			<%= content_tag(:div, class: 'span12') do %>
39
+			     <%= content_tag(:div, class: "form-submit-center") do %>
40
+			     	<%= content_tag(:p) do %>
41
+						<%= link_to (t'nav.back'), rewards_path(@mission), class: 'btn spacer-right-small' %>
42
+						<%= link_to((t'nav.next'), '#', class: 'btn btn-success')%>
43
+					<% end %>
44
+					<%= content_tag(:p) do %>
45
+						<%= link_to (t'mission_editor.continue_later'), missions_path, class: 'btn btn-link btn-danger' %>
46
+					<% end %>
47
+				<% end %>
48
+			<% end %>
49
+		<% end %>
50
+		
51
+		
52
+	<% end %>			
53
+<% end %>

app/views/mission_editor/mission_agents/index.json.jbuilder → app/views/mission_editor/agents/index.json.jbuilder


+ 41 - 0
app/views/mission_editor/agents/new.html.erb

@@ -0,0 +1,41 @@
1
+<% title "#{t 'mission_editor.agents.add_agent'} - #{@config.website_name}" %>
2
+
3
+<%= render :partial => 'missions/mission_editor_tabs' %>
4
+
5
+<%= content_tag(:div, class: 'container-bg') do %>
6
+	<%= content_tag(:div, class: 'container container-bg mission-detail-container') do %>
7
+		<%= content_tag(:div, class: 'row') do %>
8
+			<%= content_tag(:div, class: 'span12') do %>
9
+				
10
+				<%= content_tag(:div, class: 'page-header page-header-type') do %>
11
+					<%= content_tag(:small, @mission.title + ':') %>
12
+					<%= content_tag(:h1) do %>
13
+						<%= t 'mission_editor.agents.add_agent' %>
14
+					<% end %>
15
+				<% end %>
16
+				
17
+			<% end%>
18
+		<% end %>
19
+		<%= content_tag(:div, class: 'row') do %>
20
+			<%= content_tag(:div, class: 'span8') do %>
21
+			
22
+				<%= render :partial => 'form', locals: {form_action: 'create'} %>
23
+			
24
+			<% end %>
25
+			<% # Sidebar %>
26
+			<%= content_tag(:div, class: 'span4 sidebar') do %>
27
+			     <%= content_tag(:div, class: 'panel panel-default sidebar-carret') do %>
28
+			     	<%= content_tag(:div, class: 'panel-body white-bg') do %>
29
+				   		<%= content_tag(:div, class: "panel-content") do %>
30
+				   			<%= content_tag(:div, class: "panel-text") do %>
31
+								<%= content_tag(:h3, (t 'mission_editor.agents.agent_details_help_title')) %>
32
+								<%= content_tag(:div, (t 'mission_editor.agents.agent_details_help').html_safe, class: 'small-text') %>
33
+							<% end %>
34
+						<% end %>
35
+					<% end %>
36
+				<% end %>
37
+			<% end %>
38
+			
39
+		<% end %>
40
+	<% end %>			
41
+<% end %>

app/views/mission_editor/mission_agents/show.html.erb → app/views/mission_editor/agents/show.html.erb


app/views/mission_editor/mission_agents/show.json.jbuilder → app/views/mission_editor/agents/show.json.jbuilder


+ 0 - 10
app/views/mission_editor/mission_agents/_form.html.erb

@@ -1,10 +0,0 @@
1
-<%= simple_form_for(@mission_agent) do |f| %>
2
-  <%= f.error_notification %>
3
-
4
-  <div class="form-inputs">
5
-  </div>
6
-
7
-  <div class="form-actions">
8
-    <%= f.button :submit %>
9
-  </div>
10
-<% end %>

+ 0 - 6
app/views/mission_editor/mission_agents/edit.html.erb

@@ -1,6 +0,0 @@
1
-<h1>Editing mission_agent</h1>
2
-
3
-<%= render 'form' %>
4
-
5
-<%= link_to 'Show', @mission_agent %> |
6
-<%= link_to 'Back', mission_agents_path %>

+ 0 - 25
app/views/mission_editor/mission_agents/index.html.erb

@@ -1,25 +0,0 @@
1
-<h1>Listing mission_agents</h1>
2
-
3
-<table>
4
-  <thead>
5
-    <tr>
6
-      <th></th>
7
-      <th></th>
8
-      <th></th>
9
-    </tr>
10
-  </thead>
11
-
12
-  <tbody>
13
-    <% @mission_agents.each do |mission_agent| %>
14
-      <tr>
15
-        <td><%= link_to 'Show', mission_agent %></td>
16
-        <td><%= link_to 'Edit', edit_mission_agent_path(mission_agent) %></td>
17
-        <td><%= link_to 'Destroy', mission_agent, method: :delete, data: { confirm: 'Are you sure?' } %></td>
18
-      </tr>
19
-    <% end %>
20
-  </tbody>
21
-</table>
22
-
23
-<br>
24
-
25
-<%= link_to 'New Mission agent', new_mission_agent_path %>

+ 0 - 5
app/views/mission_editor/mission_agents/new.html.erb

@@ -1,5 +0,0 @@
1
-<h1>New mission_agent</h1>
2
-
3
-<%= render 'form' %>
4
-
5
-<%= link_to 'Back', mission_agents_path %>

+ 1 - 1
app/views/mission_editor/rewards/_form.html.erb

@@ -1,4 +1,4 @@
1
-<%= bootstrap_form_for(@reward, id: @mission.slug) do |f| %>
1
+<%= bootstrap_form_for(@reward, url: {action: 'update', mission: @mission.slug, id: @reward.id}) do |f| %>
2 2
   <%= f.alert_message "Please fix the errors below." %>
3 3
   <%= content_tag(:div, class: 'panel panel-default') do %>
4 4
   	<%= content_tag(:div, class: 'panel-body white-bg') do %>

+ 2 - 2
app/views/mission_editor/rewards/index.html.erb

@@ -25,7 +25,7 @@
25 25
 							<% end %>
26 26
 							<%= content_tag(:p, reward.description) %>
27 27
 							<%= content_tag(:p, class: 'centered') do %>
28
-								<%= link_to( (t 'nav.edit'), edit_reward_path(reward), class: 'btn')%>
28
+								<%= link_to( (t 'nav.edit'), edit_reward_path(reward, mission: @mission.slug), class: 'btn')%>
29 29
 							<% end %>
30 30
 						<% end %>
31 31
 					<% end %>
@@ -45,7 +45,7 @@
45 45
 			     <%= content_tag(:div, class: "form-submit-center") do %>
46 46
 			     	<%= content_tag(:p) do %>
47 47
 						<%= link_to (t'nav.back'), edit_mission_path(@mission), class: 'btn spacer-right-small' %>
48
-						<%= link_to((t'nav.next'), '#', class: 'btn btn-success')%>
48
+						<%= link_to((t'nav.next'), mission_agents_path(@mission), class: 'btn btn-success')%>
49 49
 					<% end %>
50 50
 					<%= content_tag(:p) do %>
51 51
 						<%= link_to (t'mission_editor.continue_later'), missions_path, class: 'btn btn-link btn-danger' %>

+ 12 - 1
config/locales/mission.en.yml

@@ -30,4 +30,15 @@ en:
30 30
     rewards:
31 31
       page_title: 'Rewards'
32 32
       save_reward: 'Save Reward'
33
-      add: 'Add Reward'
33
+      add: 'Add Reward'
34
+    agents:
35
+      page_title: 'Agents'
36
+      add_agent: 'Add Agent'
37
+      no_agents: 'No agents'
38
+      add: 'Add Agent Role'
39
+      role: 'Agent Role'
40
+      objective: 'Objective'
41
+      briefing: 'Briefing'
42
+      save_agent: 'Save Agent'
43
+      agent_details_help_title: 'Agent Details'
44
+      agent_details_help: 'Some tips about agents... coming soon'

+ 12 - 1
config/locales/mission.pt-BR.yml

@@ -30,4 +30,15 @@ pt-BR:
30 30
     rewards:
31 31
       page_title: 'Recompensas'
32 32
       save_reward: 'Salvar Recompensa'
33
-      add: 'Adicionar Recompensa'
33
+      add: 'Adicionar Recompensa'
34
+    agents:
35
+      page_title: 'Agentes'
36
+      add_agent: 'Criar agente'
37
+      no_agents: 'Nenhum agente'
38
+      add: 'Adicionar agente'
39
+      role: 'Papel do agente'
40
+      objective: 'Objetivo'
41
+      briefing: 'Briefing'
42
+      save_agent: 'Salvar agente'
43
+      agent_details_help_title: 'Detalhes do agente'
44
+      agent_details_help: 'Algumas dicas sobre como criar agentes em breve...'

+ 5 - 5
config/locales/simple_form.en.yml

@@ -1,15 +1,15 @@
1
-pt-BR:
1
+en:
2 2
   simple_form:
3
-    "sim": 'Sim'
4
-    "não": 'Não'
3
+    "yes": 'Yes'
4
+    "no": 'No'
5 5
     required:
6
-      text: 'necessario'
6
+      text: 'required'
7 7
       mark: '*'
8 8
       # You can uncomment the line below if you need to overwrite the whole required html.
9 9
       # When using html, text and mark won't be used.
10 10
       # html: '<abbr title="required">*</abbr>'
11 11
     error_notification:
12
-      default_message: "Por favor revise os problemas abaixo:"
12
+      default_message: "Please review the problems below:"
13 13
     # Labels and hints examples
14 14
     # labels:
15 15
     #   defaults:

+ 2 - 2
config/routes.rb

@@ -36,9 +36,9 @@ Avalanche2::Application.routes.draw do
36 36
   
37 37
   # Mission Editor
38 38
   get    'missions/:id/editor' => 'missions#edit', as: :mission_editor
39
-  scope 'missions/:id/editor' do
39
+  scope 'missions/:mission/editor' do
40 40
     resources :rewards, :controller => "mission_editor/rewards"
41
-    resources :mission_agents, :controller => "mission_editor/agents"
41
+    resources :mission_agents, :controller => "mission_editor/agents", path: '/agents'
42 42
   end
43 43
   
44 44
   # get    'missions/:id/editor/rewards' => 'rewards#index', as: :mission_editor_rewards_list

+ 114 - 0
public/javascripts/nested_form.js

@@ -0,0 +1,114 @@
1
+(function($) {
2
+  window.NestedFormEvents = function() {
3
+    this.addFields = $.proxy(this.addFields, this);
4
+    this.removeFields = $.proxy(this.removeFields, this);
5
+  };
6
+
7
+  NestedFormEvents.prototype = {
8
+    addFields: function(e) {
9
+      // Setup
10
+      var link      = e.currentTarget;
11
+      var assoc     = $(link).data('association');                // Name of child
12
+      var blueprint = $('#' + $(link).data('blueprint-id'));
13
+      var content   = blueprint.data('blueprint');                // Fields template
14
+
15
+      // Make the context correct by replacing <parents> with the generated ID
16
+      // of each of the parent objects
17
+      var context = ($(link).closest('.fields').closestChild('input, textarea, select').eq(0).attr('name') || '').replace(new RegExp('\[[a-z_]+\]$'), '');
18
+
19
+      // context will be something like this for a brand new form:
20
+      // project[tasks_attributes][1255929127459][assignments_attributes][1255929128105]
21
+      // or for an edit form:
22
+      // project[tasks_attributes][0][assignments_attributes][1]
23
+      if (context) {
24
+        var parentNames = context.match(/[a-z_]+_attributes(?=\]\[(new_)?\d+\])/g) || [];
25
+        var parentIds   = context.match(/[0-9]+/g) || [];
26
+
27
+        for(var i = 0; i < parentNames.length; i++) {
28
+          if(parentIds[i]) {
29
+            content = content.replace(
30
+              new RegExp('(_' + parentNames[i] + ')_.+?_', 'g'),
31
+              '$1_' + parentIds[i] + '_');
32
+
33
+            content = content.replace(
34
+              new RegExp('(\\[' + parentNames[i] + '\\])\\[.+?\\]', 'g'),
35
+              '$1[' + parentIds[i] + ']');
36
+          }
37
+        }
38
+      }
39
+
40
+      // Make a unique ID for the new child
41
+      var regexp  = new RegExp('new_' + assoc, 'g');
42
+      var new_id  = this.newId();
43
+      content     = $.trim(content.replace(regexp, new_id));
44
+
45
+      var field = this.insertFields(content, assoc, link);
46
+      // bubble up event upto document (through form)
47
+      field
48
+        .trigger({ type: 'nested:fieldAdded', field: field })
49
+        .trigger({ type: 'nested:fieldAdded:' + assoc, field: field });
50
+      return false;
51
+    },
52
+    newId: function() {
53
+      return new Date().getTime();
54
+    },
55
+    insertFields: function(content, assoc, link) {
56
+      var target = $(link).data('target');
57
+      if (target) {
58
+        return $(content).appendTo($(target));
59
+      } else {
60
+        return $(content).insertBefore(link);
61
+      }
62
+    },
63
+    removeFields: function(e) {
64
+      var $link = $(e.currentTarget),
65
+          assoc = $link.data('association'); // Name of child to be removed
66
+      
67
+      var hiddenField = $link.prev('input[type=hidden]');
68
+      hiddenField.val('1');
69
+      
70
+      var field = $link.closest('.fields');
71
+      field.hide();
72
+      
73
+      field
74
+        .trigger({ type: 'nested:fieldRemoved', field: field })
75
+        .trigger({ type: 'nested:fieldRemoved:' + assoc, field: field });
76
+      return false;
77
+    }
78
+  };
79
+
80
+  window.nestedFormEvents = new NestedFormEvents();
81
+  $(document)
82
+    .delegate('form a.add_nested_fields',    'click', nestedFormEvents.addFields)
83
+    .delegate('form a.remove_nested_fields', 'click', nestedFormEvents.removeFields);
84
+})(jQuery);
85
+
86
+// http://plugins.jquery.com/project/closestChild
87
+/*
88
+ * Copyright 2011, Tobias Lindig
89
+ *
90
+ * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
91
+ * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
92
+ *
93
+ */
94
+(function($) {
95
+        $.fn.closestChild = function(selector) {
96
+                // breadth first search for the first matched node
97
+                if (selector && selector != '') {
98
+                        var queue = [];
99
+                        queue.push(this);
100
+                        while(queue.length > 0) {
101
+                                var node = queue.shift();
102
+                                var children = node.children();
103
+                                for(var i = 0; i < children.length; ++i) {
104
+                                        var child = $(children[i]);
105
+                                        if (child.is(selector)) {
106
+                                                return child; //well, we found one
107
+                                        }
108
+                                        queue.push(child);
109
+                                }
110
+                        }
111
+                }
112
+                return $();//nothing found
113
+        };
114
+})(jQuery);

+ 14 - 2
readme.md

@@ -1,4 +1,12 @@
1
-# Avalanche Network (avalanche2)
1
+	    ___  _    __ ___     __     ___     _   __ ______ __  __ ______
2
+	   /   || |  / //   |   / /    /   |   / | / // ____// / / // ____/
3
+	  / /| || | / // /| |  / /    / /| |  /  |/ // /    / /_/ // __/   
4
+	 / ___ || |/ // ___ | / /___ / ___ | / /|  // /___ / __  // /___   
5
+	/_/  |_||___//_/  |_|/_____//_/  |_|/_/ |_/ \____//_/ /_//_____/   
6
+                                                                   
7
+
8
+
9
+# avl2 system
2 10
 
3 11
 Second prototype source code of the avalanche network web app.
4 12
 
@@ -44,10 +52,10 @@ Second prototype source code of the avalanche network web app.
44 52
 
45 53
 ---------------
46 54
 
47
-
48 55
 # Avalanche2 Dev Notes
49 56
 
50 57
 ## System Scaffolding
58
+
51 59
 	
52 60
 	# Mission
53 61
 	rails g scaffold mission mission_agents:references title:string objective:string briefing:text owner:references status:integer launched:boolean 
@@ -97,9 +105,11 @@ Second prototype source code of the avalanche network web app.
97 105
 	
98 106
 
99 107
 ## Undone Commands
108
+
100 109
 	
101 110
 	# Mailers
102 111
 	rails g mailer MissionMailer
112
+	
103 113
 
104 114
 ## To dos
105 115
 
@@ -147,6 +157,8 @@ The *submission_content* class is also responsible for triggering the automatic
147 157
 * Enviar uma imagem para cada tela do app
148 158
 * Espere a validação pelo diretor da missão
149 159
 
160
+----------------------
161
+
150 162
 <!-- Highlight syntax for Mou.app, insert at the bottom of the markdown document  -->
151 163
  
152 164
 <script src="http://yandex.st/highlightjs/7.3/highlight.min.js"></script>