@@ -152,7 +152,7 @@ span.not-applicable:after { |
||
152 | 152 |
top: 2px; |
153 | 153 |
} |
154 | 154 |
|
155 |
-h2 .scenario { |
|
155 |
+h2 .scenario, a span.label.scenario { |
|
156 | 156 |
position: relative; |
157 | 157 |
top: -2px; |
158 | 158 |
} |
@@ -98,7 +98,7 @@ class AgentsController < ApplicationController |
||
98 | 98 |
end |
99 | 99 |
|
100 | 100 |
def diagram |
101 |
- @agents = current_user.agents.includes(:receivers) |
|
101 |
+ @agents = ((params[:scenario_id].present? && current_user.scenarios.find(params[:scenario_id])) || current_user).agents.includes(:receivers) |
|
102 | 102 |
end |
103 | 103 |
|
104 | 104 |
def create |
@@ -130,6 +130,17 @@ class AgentsController < ApplicationController |
||
130 | 130 |
end |
131 | 131 |
end |
132 | 132 |
|
133 |
+ def leave_scenario |
|
134 |
+ @agent = current_user.agents.find(params[:id]) |
|
135 |
+ @scenario = current_user.scenarios.find(params[:scenario_id]) |
|
136 |
+ @agent.scenarios.destroy(@scenario) |
|
137 |
+ |
|
138 |
+ respond_to do |format| |
|
139 |
+ format.html { redirect_back "'#{@agent.name}' removed from '#{@scenario.name}'" } |
|
140 |
+ format.json { head :no_content } |
|
141 |
+ end |
|
142 |
+ end |
|
143 |
+ |
|
133 | 144 |
def destroy |
134 | 145 |
@agent = current_user.agents.find(params[:id]) |
135 | 146 |
@agent.destroy |
@@ -9,7 +9,7 @@ module AgentHelper |
||
9 | 9 |
def scenario_links(agent) |
10 | 10 |
agent.scenarios.map { |scenario| |
11 | 11 |
link_to(scenario.name, scenario, class: "label label-info") |
12 |
- }.to_sentence |
|
12 |
+ }.join(" ").html_safe |
|
13 | 13 |
end |
14 | 14 |
|
15 | 15 |
def agent_show_class(agent) |
@@ -35,6 +35,7 @@ module DotHelper |
||
35 | 35 |
dot << '%s;' % disabled_label(agent) |
36 | 36 |
end |
37 | 37 |
agent.receivers.each do |receiver| |
38 |
+ next unless agents.include?(receiver) |
|
38 | 39 |
dot << "%s->%s;" % [disabled_label(agent), disabled_label(receiver)] |
39 | 40 |
end |
40 | 41 |
end |
@@ -27,6 +27,16 @@ |
||
27 | 27 |
<% end %> |
28 | 28 |
</li> |
29 | 29 |
|
30 |
+ <% if agent.scenarios.length > 0 %> |
|
31 |
+ <li class="divider"></li> |
|
32 |
+ |
|
33 |
+ <% agent.scenarios.each do |scenario| %> |
|
34 |
+ <li> |
|
35 |
+ <%= link_to "<span class='color-warning glyphicon glyphicon-remove-circle'></span> Remove from <span class='scenario label label-info'>#{h scenario.name}</span>".html_safe, leave_scenario_agent_path(agent, :scenario_id => scenario.to_param, :return => returnTo), method: :put, :tabindex => "-1" %> |
|
36 |
+ </li> |
|
37 |
+ <% end %> |
|
38 |
+ <% end %> |
|
39 |
+ |
|
30 | 40 |
<li class="divider"></li> |
31 | 41 |
|
32 | 42 |
<% if agent.can_create_events? && agent.events.count > 0 %> |
@@ -11,6 +11,7 @@ |
||
11 | 11 |
|
12 | 12 |
<div class="btn-group"> |
13 | 13 |
<%= link_to '<span class="glyphicon glyphicon-chevron-left"></span> Back'.html_safe, scenarios_path, class: "btn btn-default" %> |
14 |
+ <%= link_to '<span class="glyphicon glyphicon-random"></span> View Diagram'.html_safe, diagram_agents_path(:scenario_id => @scenario.to_param), class: "btn btn-default" %> |
|
14 | 15 |
<%= link_to '<span class="glyphicon glyphicon-edit"></span> Edit'.html_safe, edit_scenario_path(@scenario), class: "btn btn-default" %> |
15 | 16 |
<%= link_to '<span class="glyphicon glyphicon-share-alt"></span> Share'.html_safe, share_scenario_path(@scenario), class: "btn btn-default" %> |
16 | 17 |
<%= link_to '<span class="glyphicon glyphicon-trash"></span> Delete'.html_safe, scenario_path(@scenario), method: :delete, data: { confirm: "This will remove the '#{@scenario.name}' Scenerio from all Agents and delete it. Are you sure?" }, class: "btn btn-default" %> |
@@ -3,6 +3,7 @@ Huginn::Application.routes.draw do |
||
3 | 3 |
member do |
4 | 4 |
post :run |
5 | 5 |
post :handle_details_post |
6 |
+ put :leave_scenario |
|
6 | 7 |
delete :remove_events |
7 | 8 |
end |
8 | 9 |
|
@@ -207,6 +207,12 @@ describe AgentsController do |
||
207 | 207 |
assigns(:agent).should have(1).errors_on(:sources) |
208 | 208 |
end |
209 | 209 |
|
210 |
+ it "will not accept Scenarios owned by other users" do |
|
211 |
+ sign_in users(:bob) |
|
212 |
+ post :update, :id => agents(:bob_website_agent).to_param, :agent => valid_attributes(:scenario_ids => [scenarios(:jane_weather).id]) |
|
213 |
+ assigns(:agent).should have(1).errors_on(:scenarios) |
|
214 |
+ end |
|
215 |
+ |
|
210 | 216 |
it "shows errors" do |
211 | 217 |
sign_in users(:bob) |
212 | 218 |
post :update, :id => agents(:bob_website_agent).to_param, :agent => valid_attributes(:name => "") |
@@ -247,6 +253,22 @@ describe AgentsController do |
||
247 | 253 |
end |
248 | 254 |
end |
249 | 255 |
|
256 |
+ describe "PUT leave_scenario" do |
|
257 |
+ it "removes an Agent from the given Scenario for the current user" do |
|
258 |
+ sign_in users(:bob) |
|
259 |
+ |
|
260 |
+ agents(:bob_weather_agent).scenarios.should include(scenarios(:bob_weather)) |
|
261 |
+ put :leave_scenario, :id => agents(:bob_weather_agent).to_param, :scenario_id => scenarios(:bob_weather).to_param |
|
262 |
+ agents(:bob_weather_agent).scenarios.should_not include(scenarios(:bob_weather)) |
|
263 |
+ |
|
264 |
+ Scenario.where(:id => scenarios(:bob_weather).id).should exist |
|
265 |
+ |
|
266 |
+ lambda { |
|
267 |
+ put :leave_scenario, :id => agents(:jane_weather_agent).to_param, :scenario_id => scenarios(:jane_weather).to_param |
|
268 |
+ }.should raise_error(ActiveRecord::RecordNotFound) |
|
269 |
+ end |
|
270 |
+ end |
|
271 |
+ |
|
250 | 272 |
describe "DELETE destroy" do |
251 | 273 |
it "destroys only Agents owned by the current user" do |
252 | 274 |
sign_in users(:bob) |