From 4bb833fd8903c5f2ea242767377fa6b1eab28c14 Mon Sep 17 00:00:00 2001 From: Andrew Cantino Date: Wed, 17 Sep 2014 21:39:21 -0700 Subject: [PATCH 1/3] Minor refector to avoid global @agent --- app/controllers/agents_controller.rb | 2 +- app/views/agents/_form.html.erb | 2 +- app/views/agents/_oauth_dropdown.html.erb | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/agents_controller.rb b/app/controllers/agents_controller.rb index a459e8b5..c0b76701 100644 --- a/app/controllers/agents_controller.rb +++ b/app/controllers/agents_controller.rb @@ -43,7 +43,7 @@ class AgentsController < ApplicationController :can_control_other_agents => @agent.can_control_other_agents?, :options => @agent.default_options, :description_html => @agent.html_description, - :form => render_to_string(partial: 'oauth_dropdown') + :form => render_to_string(partial: 'oauth_dropdown', locals: { agent: @agent }) } end diff --git a/app/views/agents/_form.html.erb b/app/views/agents/_form.html.erb index 5e5a548e..59204d16 100644 --- a/app/views/agents/_form.html.erb +++ b/app/views/agents/_form.html.erb @@ -31,7 +31,7 @@
- <%= render partial: 'oauth_dropdown' %> + <%= render partial: 'oauth_dropdown', locals: { agent: @agent } %>
diff --git a/app/views/agents/_oauth_dropdown.html.erb b/app/views/agents/_oauth_dropdown.html.erb index 459f27a5..6dbe1dd9 100644 --- a/app/views/agents/_oauth_dropdown.html.erb +++ b/app/views/agents/_oauth_dropdown.html.erb @@ -1,6 +1,6 @@ -<% if @agent.try(:oauthable?) %> +<% if agent.try(:oauthable?) %>
<%= label_tag :service %> - <%= select_tag 'agent[service_id]', options_for_select(@agent.valid_services_for(current_user).collect { |s| ["(#{s.provider}) #{s.name}", s.id]}, @agent.service_id), class: 'form-control' %> + <%= select_tag 'agent[service_id]', options_for_select(agent.valid_services_for(current_user).collect { |s| ["(#{s.provider}) #{s.name}", s.id]}, agent.service_id), class: 'form-control' %>
<% end %> From 53b9e47371dced1793046482dd6963ce41107119 Mon Sep 17 00:00:00 2001 From: Andrew Cantino Date: Wed, 17 Sep 2014 23:23:14 -0700 Subject: [PATCH 2/3] refactor JS and fix scheduling clearing bug --- .../javascripts/application.js.coffee.erb | 220 +----------------- .../javascripts/components/core.js.coffee | 30 +++ .../components/json-editor.js.coffee.erb | 14 ++ .../javascripts/components/search.js.coffee | 29 +++ .../javascripts/components/utils.js.coffee | 14 ++ .../{ => components}/worker-checker.js.coffee | 0 app/assets/javascripts/diagram.js.coffee | 2 + app/assets/javascripts/graphing.js.coffee | 2 + .../pages/agent-edit-page.js.coffee | 126 ++++++++++ .../pages/agent-show-page.js.coffee | 35 +++ .../javascripts/user_credentials.js.coffee | 2 + app/models/agents/adioso_agent.rb | 1 - app/views/agents/_form.html.erb | 180 +++++++------- app/views/layouts/application.html.erb | 23 +- 14 files changed, 360 insertions(+), 318 deletions(-) create mode 100644 app/assets/javascripts/components/core.js.coffee create mode 100644 app/assets/javascripts/components/json-editor.js.coffee.erb create mode 100644 app/assets/javascripts/components/search.js.coffee create mode 100644 app/assets/javascripts/components/utils.js.coffee rename app/assets/javascripts/{ => components}/worker-checker.js.coffee (100%) create mode 100644 app/assets/javascripts/pages/agent-edit-page.js.coffee create mode 100644 app/assets/javascripts/pages/agent-show-page.js.coffee diff --git a/app/assets/javascripts/application.js.coffee.erb b/app/assets/javascripts/application.js.coffee.erb index ad6e15c4..89a70317 100644 --- a/app/assets/javascripts/application.js.coffee.erb +++ b/app/assets/javascripts/application.js.coffee.erb @@ -7,220 +7,6 @@ #= require jquery.json-editor #= require latlon_and_geo #= require spectrum -#= require ./worker-checker -#= require_self - -window.setupJsonEditor = ($editors = $(".live-json-editor")) -> - JSONEditor.prototype.ADD_IMG = '<%= image_path 'json-editor/add.png' %>' - JSONEditor.prototype.DELETE_IMG = '<%= image_path 'json-editor/delete.png' %>' - editors = [] - $editors.each -> - $editor = $(this) - jsonEditor = new JSONEditor($editor, $editor.data('width') || 400, $editor.data('height') || 500) - jsonEditor.doTruncation true - jsonEditor.showFunctionButtons() - editors.push jsonEditor - return editors - -hideSchedule = -> - $(".schedule-region .can-be-scheduled").hide() - $(".schedule-region .cannot-be-scheduled").show() - -showSchedule = (defaultSchedule = null) -> - if defaultSchedule? - $(".schedule-region select").val(defaultSchedule).change() - $(".schedule-region .can-be-scheduled").show() - $(".schedule-region .cannot-be-scheduled").hide() - -hideLinks = -> - $(".link-region .select2-container").hide() - $(".link-region .propagate-immediately").hide() - $(".link-region .cannot-receive-events").show() - -showLinks = -> - $(".link-region .select2-container").show() - $(".link-region .propagate-immediately").show() - $(".link-region .cannot-receive-events").hide() - showEventDescriptions() - -hideControlLinks = -> - $(".control-link-region").hide() - -showControlLinks = -> - $(".control-link-region").show() - -hideEventCreation = -> - $(".event-related-region").hide() - -showEventCreation = -> - $(".event-related-region").show() - -showEventDescriptions = -> - if $("#agent_source_ids").val() - $.getJSON "/agents/event_descriptions", { ids: $("#agent_source_ids").val().join(",") }, (json) => - if json.description_html? - $(".event-descriptions").show().html(json.description_html) - else - $(".event-descriptions").hide() - else - $(".event-descriptions").html("").hide() - -$(document).ready -> - $('.navbar .dropdown.dropdown-hover').hover \ - -> $(this).addClass('open'), - -> $(this).removeClass('open') - - # JSON Editor - window.jsonEditor = setupJsonEditor()[0] - - # Flash - if $(".flash").length - setTimeout((-> $(".flash").slideUp(-> $(".flash").remove())), 5000) - - # Help popovers - $('.hover-help').popover(trigger: 'hover', html: true) - - # Agent Navigation - $agentNavigate = $('#agent-navigate') - - # initialize typeahead listener - $agentNavigate.bind "typeahead:selected", (event, object, name) -> - item = object['value'] - $agentNavigate.typeahead('val', '') - if agentPaths[item] - $(".spinner").show() - navigationData = agentPaths[item] - if !(navigationData instanceof Object) || !navigationData.method || navigationData.method == 'GET' - window.location = navigationData.url || navigationData - else - $("").appendTo($("body")).click() - - # substring matcher for typeahead - substringMatcher = (strings)-> - findMatches = (query, callback) -> - matches = [] - substrRegex = new RegExp(query, "i") - $.each strings, (i, str) -> - matches.push value: str if substrRegex.test(str) - callback(matches.slice(0,6)) - - $agentNavigate.typeahead - minLength: 1, - highlight: true, - , - source: substringMatcher(agentNames) - - - # Pressing '/' selects the search box. - $("body").on "keypress", (e) -> - if e.keyCode == 47 # The '/' key - if e.target.nodeName == "BODY" - e.preventDefault() - $agentNavigate.focus() - - # Agent Show - fetchLogs = (e) -> - agentId = $(e.target).closest("[data-agent-id]").data("agent-id") - e.preventDefault() - $("#logs .spinner").show() - $("#logs .refresh, #logs .clear").hide() - $.get "/agents/#{agentId}/logs", (html) => - $("#logs .logs").html html - $("#logs .spinner").stop(true, true).fadeOut -> - $("#logs .refresh, #logs .clear").show() - - clearLogs = (e) -> - if confirm("Are you sure you want to clear all logs for this Agent?") - agentId = $(e.target).closest("[data-agent-id]").data("agent-id") - e.preventDefault() - $("#logs .spinner").show() - $("#logs .refresh, #logs .clear").hide() - $.post "/agents/#{agentId}/logs/clear", { "_method": "DELETE" }, (html) => - $("#logs .logs").html html - $("#show-tabs li a.recent-errors").removeClass 'recent-errors' - $("#logs .spinner").stop(true, true).fadeOut -> - $("#logs .refresh, #logs .clear").show() - - $(".agent-show #show-tabs a[href='#logs'], #logs .refresh").on "click", fetchLogs - $(".agent-show #logs .clear").on "click", clearLogs - - if tab = window.location.href.match(/tab=(\w+)\b/i)?[1] - if tab in ["details", "logs"] - $(".agent-show .nav-pills li a[href='##{tab}']").click() - - # Editing Agents - $("#agent_source_ids").on "change", showEventDescriptions - - $("#agent_type").on "change", -> - if window.jsonEditor? - $("#agent-spinner").fadeIn(); - $("#agent_source_ids").select2("val", {}); - $(".event-descriptions").html("").hide() - $.getJSON "/agents/type_details", { type: $(@).val() }, (json) => - if json.can_be_scheduled - showSchedule(json.default_schedule) - else - hideSchedule() - - if json.can_receive_events - showLinks() - else - hideLinks() - - if json.can_control_other_agents - showControlLinks() - else - hideControlLinks() - - if json.can_create_events - showEventCreation() - else - hideEventCreation() - - $(".description").html(json.description_html) if json.description_html? - - $('.oauthable-form').html(json.form) if json.form? - - if $("#agent_options").hasClass("showing-default") || $("#agent_options").val().match(/\A\s*(\{\s*\}|)\s*\Z/g) - window.jsonEditor.json = json.options - window.jsonEditor.rebuild() - - $("#agent-spinner").stop(true, true).fadeOut(); - - $("#agent_type").change() if $("#agent_type").length - - # Select2 Selects - $(".select2").select2(width: 'resolve') - - if $(".schedule-region") - if $(".schedule-region").data("can-be-scheduled") == true - showSchedule() - else - hideSchedule() - - if $(".link-region") - if $(".link-region").data("can-receive-events") == true - showLinks() - else - hideLinks() - - if $(".control-link-region") - if $(".control-link-region").data("can-control-other-agents") == true - showControlLinks() - else - hideControlLinks() - - if $(".event-related-region") - if $(".event-related-region").data("can-create-events") == true - showEventCreation() - else - hideEventCreation() - - $('.selectable-text').each -> - $(this).click -> - range = document.createRange() - range.setStartBefore(this.firstChild) - range.setEndAfter(this.lastChild) - sel = window.getSelection() - sel.removeAllRanges(); - sel.addRange(range) +#= require_tree ./components +#= require_tree ./pages +#= require_self \ No newline at end of file diff --git a/app/assets/javascripts/components/core.js.coffee b/app/assets/javascripts/components/core.js.coffee new file mode 100644 index 00000000..30e83c97 --- /dev/null +++ b/app/assets/javascripts/components/core.js.coffee @@ -0,0 +1,30 @@ +$ -> + # Flash + if $(".flash").length + setTimeout((-> $(".flash").slideUp(-> $(".flash").remove())), 5000) + + # Help popovers + $('.hover-help').popover(trigger: 'hover', html: true) + + # Pressing '/' selects the search box. + $("body").on "keypress", (e) -> + if e.keyCode == 47 # The '/' key + if e.target.nodeName == "BODY" + e.preventDefault() + $agentNavigate.focus() + + # Select2 Selects + $(".select2").select2(width: 'resolve') + + # Helper for selecting text when clicked + $('.selectable-text').each -> + $(this).click -> + range = document.createRange() + range.setStartBefore(this.firstChild) + range.setEndAfter(this.lastChild) + sel = window.getSelection() + sel.removeAllRanges(); + sel.addRange(range) + + # Agent navbar dropdown + $('.navbar .dropdown.dropdown-hover').hover (-> $(this).addClass('open')), (-> $(this).removeClass('open')) \ No newline at end of file diff --git a/app/assets/javascripts/components/json-editor.js.coffee.erb b/app/assets/javascripts/components/json-editor.js.coffee.erb new file mode 100644 index 00000000..c9a10cb0 --- /dev/null +++ b/app/assets/javascripts/components/json-editor.js.coffee.erb @@ -0,0 +1,14 @@ +window.setupJsonEditor = ($editors = $(".live-json-editor")) -> + JSONEditor.prototype.ADD_IMG = '<%= image_path 'json-editor/add.png' %>' + JSONEditor.prototype.DELETE_IMG = '<%= image_path 'json-editor/delete.png' %>' + editors = [] + $editors.each -> + $editor = $(this) + jsonEditor = new JSONEditor($editor, $editor.data('width') || 400, $editor.data('height') || 500) + jsonEditor.doTruncation true + jsonEditor.showFunctionButtons() + editors.push jsonEditor + return editors + +$ -> + window.jsonEditor = setupJsonEditor()[0] diff --git a/app/assets/javascripts/components/search.js.coffee b/app/assets/javascripts/components/search.js.coffee new file mode 100644 index 00000000..18892b06 --- /dev/null +++ b/app/assets/javascripts/components/search.js.coffee @@ -0,0 +1,29 @@ +$ -> + $agentNavigate = $('#agent-navigate') + + # initialize typeahead listener + $agentNavigate.bind "typeahead:selected", (event, object, name) -> + item = object['value'] + $agentNavigate.typeahead('val', '') + if window.agentPaths[item] + $(".spinner").show() + navigationData = window.agentPaths[item] + if !(navigationData instanceof Object) || !navigationData.method || navigationData.method == 'GET' + window.location = navigationData.url || navigationData + else + $("").appendTo($("body")).click() + + # substring matcher for typeahead + substringMatcher = (strings) -> + findMatches = (query, callback) -> + matches = [] + substrRegex = new RegExp(query, "i") + $.each strings, (i, str) -> + matches.push value: str if substrRegex.test(str) + callback(matches.slice(0,6)) + + $agentNavigate.typeahead + minLength: 1, + highlight: true, + , + source: substringMatcher(window.agentNames) diff --git a/app/assets/javascripts/components/utils.js.coffee b/app/assets/javascripts/components/utils.js.coffee new file mode 100644 index 00000000..644e0f4d --- /dev/null +++ b/app/assets/javascripts/components/utils.js.coffee @@ -0,0 +1,14 @@ +class @Utils + @navigatePath: (path) -> + path = "/" + path unless path.match(/^\//) + window.location.href = path + + @currentPath: -> + window.location.href.replace(/https?:\/\/.*?\//g, '') + + @registerPage: (klass, options = {}) -> + if options.forPathsMatching? + if Utils.currentPath().match(options.forPathsMatching) + window.currentPage = new klass() + else + new klass() diff --git a/app/assets/javascripts/worker-checker.js.coffee b/app/assets/javascripts/components/worker-checker.js.coffee similarity index 100% rename from app/assets/javascripts/worker-checker.js.coffee rename to app/assets/javascripts/components/worker-checker.js.coffee diff --git a/app/assets/javascripts/diagram.js.coffee b/app/assets/javascripts/diagram.js.coffee index 1782ff72..2b541958 100644 --- a/app/assets/javascripts/diagram.js.coffee +++ b/app/assets/javascripts/diagram.js.coffee @@ -1,3 +1,5 @@ +# This is not included in the core application.js bundle. + $ -> svg = document.querySelector('.agent-diagram svg.diagram') overlay = document.querySelector('.agent-diagram .overlay') diff --git a/app/assets/javascripts/graphing.js.coffee b/app/assets/javascripts/graphing.js.coffee index 7ed2510d..21aac672 100644 --- a/app/assets/javascripts/graphing.js.coffee +++ b/app/assets/javascripts/graphing.js.coffee @@ -2,6 +2,8 @@ #= require rickshaw #= require_self +# This is not included in the core application.js bundle. + window.renderGraph = ($chart, data, peaks, name) -> graph = new Rickshaw.Graph element: $chart.find(".chart").get(0) diff --git a/app/assets/javascripts/pages/agent-edit-page.js.coffee b/app/assets/javascripts/pages/agent-edit-page.js.coffee new file mode 100644 index 00000000..6b88ad6d --- /dev/null +++ b/app/assets/javascripts/pages/agent-edit-page.js.coffee @@ -0,0 +1,126 @@ +class @AgentEditPage + constructor: -> + $("#agent_source_ids").on "change", @showEventDescriptions + @showCorrectRegionsOnStartup() + + # The type selector is only available on the new agent form. + if $("#agent_type").length + $("#agent_type").on "change", => @handleTypeChange(false) + @handleTypeChange(true) + + handleTypeChange: (firstTime) -> + $(".event-descriptions").html("").hide() + type = $('#agent_type').val() + + if type == 'Agent' + $(".agent-settings").hide() + $(".description").hide() + else + $(".agent-settings").show() + $("#agent-spinner").fadeIn() + $("#agent_source_ids").select2("val", {}) + $(".model-errors").hide() unless firstTime + $.getJSON "/agents/type_details", { type: type }, (json) => + if json.can_be_scheduled + if firstTime + @showSchedule() + else + @showSchedule(json.default_schedule) + else + @hideSchedule() + + if json.can_receive_events + @showLinks() + else + @hideLinks() + + if json.can_control_other_agents + @showControlLinks() + else + @hideControlLinks() + + if json.can_create_events + @showEventCreation() + else + @hideEventCreation() + + $(".description").show().html(json.description_html) if json.description_html? + + $('.oauthable-form').html(json.form) if json.form? + + unless firstTime + window.jsonEditor.json = json.options + window.jsonEditor.rebuild() + + $("#agent-spinner").stop(true, true).fadeOut(); + + hideSchedule: -> + $(".schedule-region .can-be-scheduled").hide() + $(".schedule-region .cannot-be-scheduled").show() + + showSchedule: (defaultSchedule = null) -> + if defaultSchedule? + $(".schedule-region select").val(defaultSchedule).change() + $(".schedule-region .can-be-scheduled").show() + $(".schedule-region .cannot-be-scheduled").hide() + + hideLinks: -> + $(".link-region .select2-container").hide() + $(".link-region .propagate-immediately").hide() + $(".link-region .cannot-receive-events").show() + + showLinks: -> + $(".link-region .select2-container").show() + $(".link-region .propagate-immediately").show() + $(".link-region .cannot-receive-events").hide() + @showEventDescriptions() + + hideControlLinks: -> + $(".control-link-region").hide() + + showControlLinks: -> + $(".control-link-region").show() + + hideEventCreation: -> + $(".event-related-region").hide() + + showEventCreation: -> + $(".event-related-region").show() + + showEventDescriptions: -> + if $("#agent_source_ids").val() + $.getJSON "/agents/event_descriptions", { ids: $("#agent_source_ids").val().join(",") }, (json) => + if json.description_html? + $(".event-descriptions").show().html(json.description_html) + else + $(".event-descriptions").hide() + else + $(".event-descriptions").html("").hide() + + showCorrectRegionsOnStartup: -> + if $(".schedule-region") + if $(".schedule-region").data("can-be-scheduled") == true + @showSchedule() + else + @hideSchedule() + + if $(".link-region") + if $(".link-region").data("can-receive-events") == true + @showLinks() + else + @hideLinks() + + if $(".control-link-region") + if $(".control-link-region").data("can-control-other-agents") == true + @showControlLinks() + else + @hideControlLinks() + + if $(".event-related-region") + if $(".event-related-region").data("can-create-events") == true + @showEventCreation() + else + @hideEventCreation() + +$ -> + Utils.registerPage(AgentEditPage, forPathsMatching: /^agents/) diff --git a/app/assets/javascripts/pages/agent-show-page.js.coffee b/app/assets/javascripts/pages/agent-show-page.js.coffee new file mode 100644 index 00000000..18cf52a2 --- /dev/null +++ b/app/assets/javascripts/pages/agent-show-page.js.coffee @@ -0,0 +1,35 @@ +class @AgentShowPage + constructor: -> + $(".agent-show #show-tabs a[href='#logs'], #logs .refresh").on "click", @fetchLogs + $(".agent-show #logs .clear").on "click", @clearLogs + + # Trigger tabs when navigated to. + if tab = window.location.href.match(/tab=(\w+)\b/i)?[1] + if tab in ["details", "logs"] + $(".agent-show .nav-pills li a[href='##{tab}']").click() + + fetchLogs: (e) -> + agentId = $(e.target).closest("[data-agent-id]").data("agent-id") + e.preventDefault() + $("#logs .spinner").show() + $("#logs .refresh, #logs .clear").hide() + $.get "/agents/#{agentId}/logs", (html) => + $("#logs .logs").html html + $("#logs .spinner").stop(true, true).fadeOut -> + $("#logs .refresh, #logs .clear").show() + + clearLogs: (e) -> + if confirm("Are you sure you want to clear all logs for this Agent?") + agentId = $(e.target).closest("[data-agent-id]").data("agent-id") + e.preventDefault() + $("#logs .spinner").show() + $("#logs .refresh, #logs .clear").hide() + $.post "/agents/#{agentId}/logs/clear", { "_method": "DELETE" }, (html) => + $("#logs .logs").html html + $("#show-tabs li a.recent-errors").removeClass 'recent-errors' + $("#logs .spinner").stop(true, true).fadeOut -> + $("#logs .refresh, #logs .clear").show() + +$ -> + Utils.registerPage(AgentShowPage, forPathsMatching: /^agents\/\d+/) + diff --git a/app/assets/javascripts/user_credentials.js.coffee b/app/assets/javascripts/user_credentials.js.coffee index bad5812e..c27a2bcb 100644 --- a/app/assets/javascripts/user_credentials.js.coffee +++ b/app/assets/javascripts/user_credentials.js.coffee @@ -3,6 +3,8 @@ #= require ace/mode-markdown.js #= require_self +# This is not included in the core application.js bundle. + $ -> editor = ace.edit("ace-credential-value") editor.getSession().setTabSize(2) diff --git a/app/models/agents/adioso_agent.rb b/app/models/agents/adioso_agent.rb index c560784d..58d01faa 100644 --- a/app/models/agents/adioso_agent.rb +++ b/app/models/agents/adioso_agent.rb @@ -1,6 +1,5 @@ module Agents class AdiosoAgent < Agent - cannot_receive_events! default_schedule "every_1d" diff --git a/app/views/agents/_form.html.erb b/app/views/agents/_form.html.erb index 59204d16..31fa8e7d 100644 --- a/app/views/agents/_form.html.erb +++ b/app/views/agents/_form.html.erb @@ -1,5 +1,5 @@ <% if @agent.errors.any? %> -
+

<%= pluralize(@agent.errors.count, "error") %> prohibited this Agent from being saved:

<% @agent.errors.full_messages.each do |msg| %>

<%= msg %>

@@ -21,99 +21,103 @@ <% if @agent.new_record? %>
<%= f.label :type %> - <%= f.select :type, options_for_select(Agent.types.map(&:to_s).sort.map {|type| [type.gsub(/^.*::/, ''), type] }, @agent.type), {}, :class => 'select2 form-control' %> + <%= f.select :type, options_for_select([['Select an Agent Type', 'Agent']] + Agent.types.map(&:to_s).sort.map {|type| [type.gsub(/^.*::/, ''), type] }, @agent.type), {}, :class => 'select2 form-control' %>
<% end %> - -
- <%= f.label :name %> - <%= f.text_field :name, :class => 'form-control' %> -
- -
- <%= render partial: 'oauth_dropdown', locals: { agent: @agent } %> -
- -
- <%= f.label :schedule, :class => 'control-label' %> -
-
- <%= f.select :schedule, options_for_select(Agent::SCHEDULES.map {|s| [s.humanize.titleize, s] }, @agent.schedule), {}, :class => 'form-control' %> -
- This type of Agent cannot be scheduled. -
-
- -
-
- <%= f.label :controllers %> - -
- <%= agent_controllers(@agent) || 'None' %> -
-
-
- - - - - -
- <%= f.label :sources %> - -
- - <% if current_user.scenario_count > 0 %> -
- <%= f.label :scenarios %> - - <%= f.select(:scenario_ids, - options_for_select(current_user.scenarios.pluck(:name, :id), @agent.scenario_ids), - {}, { :multiple => true, :size => 5, :class => 'select2 form-control' }) %> -
- <% end %> -
- -
-
- <%= f.label :options %> - - +
+
+
+ <%= f.label :name %> + <%= f.text_field :name, :class => 'form-control' %> +
+ +
+ <%= render partial: 'oauth_dropdown', locals: { agent: @agent } %> +
+ +
+ <%= f.label :schedule, :class => 'control-label' %> +
+
+ <%= f.select :schedule, options_for_select(Agent::SCHEDULES.map {|s| [s.humanize.titleize, s] }, @agent.schedule), {}, :class => 'form-control' %> +
+ This type of Agent cannot be scheduled. +
+
+ +
+
+ <%= f.label :controllers %> + +
+ <%= agent_controllers(@agent) || 'None' %> +
+
+
+ + + + + +
+ <%= f.label :sources %> + +
+ + <% if current_user.scenario_count > 0 %> +
+ <%= f.label :scenarios %> + + <%= f.select(:scenario_ids, + options_for_select(current_user.scenarios.pluck(:name, :id), @agent.scenario_ids), + {}, { :multiple => true, :size => 5, :class => 'select2 form-control' }) %> +
+ <% end %> +
-
- <%= f.submit "Save", :class => "btn btn-primary" %> + +
+
+ <%= f.label :options %> + + +
+ +
+ <%= f.submit "Save", :class => "btn btn-primary" %> +
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index dd79e596..c669523b 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -35,22 +35,21 @@
From 7dc8296a6f64e9268f9274285641f3bb7f152c4f Mon Sep 17 00:00:00 2001 From: Andrew Cantino Date: Wed, 17 Sep 2014 23:29:04 -0700 Subject: [PATCH 3/3] application.js no longer needs to be erb --- .../{application.js.coffee.erb => application.js.coffee} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename app/assets/javascripts/{application.js.coffee.erb => application.js.coffee} (100%) diff --git a/app/assets/javascripts/application.js.coffee.erb b/app/assets/javascripts/application.js.coffee similarity index 100% rename from app/assets/javascripts/application.js.coffee.erb rename to app/assets/javascripts/application.js.coffee