chef-server-webui 0.9.18 → 0.10.0.beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. data/README.rdoc +0 -4
  2. data/Rakefile +10 -0
  3. data/app/controllers/application.rb +34 -6
  4. data/app/controllers/cookbooks.rb +125 -35
  5. data/app/controllers/environments.rb +235 -0
  6. data/app/controllers/nodes.rb +26 -19
  7. data/app/controllers/roles.rb +37 -44
  8. data/app/controllers/search.rb +13 -13
  9. data/app/helpers/application_helper.rb +34 -0
  10. data/app/views/cookbooks/_cookbook_content.html.haml +7 -0
  11. data/app/views/cookbooks/index.html.haml +22 -7
  12. data/app/views/cookbooks/show.html.haml +8 -50
  13. data/app/views/environments/_form.html.erb +91 -0
  14. data/app/views/environments/_navigation.html.haml +9 -0
  15. data/app/views/environments/_version_selector.html.erb +8 -0
  16. data/app/views/environments/edit.html.erb +17 -0
  17. data/app/views/environments/index.html.haml +26 -0
  18. data/app/views/environments/new.html.erb +17 -0
  19. data/app/views/environments/show.html.haml +31 -0
  20. data/app/views/layout/application.html.haml +22 -13
  21. data/app/views/layout/login.html.haml +2 -2
  22. data/app/views/nodes/_form.html.erb +69 -0
  23. data/app/views/nodes/index.html.haml +6 -2
  24. data/app/views/nodes/show.html.haml +4 -1
  25. data/app/views/roles/_form.html.erb +92 -0
  26. data/app/views/roles/_run_lists.html.erb +26 -0
  27. data/app/views/roles/edit.html.haml +1 -1
  28. data/app/views/roles/new.html.haml +1 -1
  29. data/app/views/roles/show.html.haml +10 -7
  30. data/app/views/status/index.html.haml +2 -1
  31. data/bin/chef-server-webui +1 -0
  32. data/config/router.rb +14 -8
  33. data/lib/chef-server-webui/version.rb +1 -1
  34. data/public/javascripts/chef.js +206 -49
  35. data/public/javascripts/cookbook_constraint_ctrl.js +191 -0
  36. data/public/javascripts/cookbook_versions.js +75 -0
  37. data/public/javascripts/jquery-1.4.4.min.js +167 -0
  38. data/public/javascripts/jquery.suggest.js +250 -0
  39. data/public/stylesheets/base.css +30 -24
  40. data/public/stylesheets/chef.css +212 -45
  41. data/public/stylesheets/jquery.suggest.css +28 -0
  42. data/public/stylesheets/jsonedit_main.css +26 -10
  43. data/public/stylesheets/themes/djime-cerulean/style.css +31 -18
  44. metadata +22 -29
  45. data/app/controllers/cookbook_attributes.rb +0 -41
  46. data/app/controllers/cookbook_definitions.rb +0 -41
  47. data/app/controllers/cookbook_files.rb +0 -39
  48. data/app/controllers/cookbook_libraries.rb +0 -41
  49. data/app/controllers/cookbook_recipes.rb +0 -40
  50. data/app/controllers/cookbook_templates.rb +0 -57
  51. data/app/helpers/cookbook_attributes_helper.rb +0 -7
  52. data/app/helpers/cookbook_definitions_helper.rb +0 -8
  53. data/app/helpers/cookbook_files_helper.rb +0 -8
  54. data/app/helpers/cookbook_libraries_helper.rb +0 -7
  55. data/app/helpers/cookbook_recipes_helper.rb +0 -8
  56. data/app/helpers/cookbook_templates_helper.rb +0 -8
  57. data/app/helpers/exceptions_helper.rb +0 -6
  58. data/app/helpers/global_helpers.rb +0 -39
  59. data/app/helpers/nodes_helper.rb +0 -43
  60. data/app/helpers/openid_consumer_helper.rb +0 -8
  61. data/app/helpers/openid_register_helper.rb +0 -8
  62. data/app/helpers/openid_server_helper.rb +0 -6
  63. data/app/helpers/openid_server_helpers.rb +0 -32
  64. data/app/helpers/roles_helper.rb +0 -5
  65. data/app/helpers/search_entries_helper.rb +0 -8
  66. data/app/helpers/search_helper.rb +0 -44
  67. data/app/views/nodes/_form.html.haml +0 -52
  68. data/app/views/roles/_form.html.haml +0 -52
@@ -0,0 +1,91 @@
1
+ <div class="content environmentFormContainer">
2
+ <%= form(:action => form_url, :method => (method || :post), :id => form_id, :class => 'form') do -%>
3
+ <% unless form_for == 'edit' %>
4
+ <div class="group form">
5
+ <label class="label" for="environment_name">Name</label>
6
+ <% if !@environment.invalid_fields[:name].nil? && @environment.invalid_fields[:name].size != 0 %>
7
+ <span class="inline_error_message">The environment name contains illegal characters. The following characters are allowed: a-z, A-Z, 0-9, _, and -.</span>
8
+ <% end %>
9
+
10
+ <%= text_field :id => "environment_name", :name => "name", :class => "text_field", :value => params.has_key?(:name) ? h(params[:name]) : @environment.name %>
11
+ <span class="description">The name of the Environment</span>
12
+ </div>
13
+ <% end %>
14
+
15
+ <div class="group form">
16
+ <label class="label" for="environment_description">Description</label>
17
+ <%= text_area(params.has_key?(:description) ? h(params[:description]) : @environment.description, :name => "description", :class => "text_area", :id => "environment_description") %>
18
+ <span class="description">A description of this Environment</span>
19
+ </div>
20
+
21
+ <div class="group form cbVerPicker" id=<%=form_for%>>
22
+ <label class="label" for="cookbook_version_constraints">Cookbook Version Constraints</label>
23
+ <% if !@environment.invalid_fields[:cookbook_version].nil? && !@environment.invalid_fields[:cookbook_version].empty? %>
24
+ <span class="inline_error_message" id='error'>There was a problem in one of your constraints. Please enter version constraints in acceptable formats (e.g. 0.0.0). </span>
25
+ <% end %>
26
+ <table class="table" id="cbVerPickerTable">
27
+ <tbody>
28
+ <tr>
29
+ <th class = "first" id="CookbookVersionConstraints">Name</th>
30
+ <th class="operator" id="CookbookVersionConstraints">Operator</th>
31
+ <th class="version" id="CookbookVersionConstraints">Version</th>
32
+ <th class="last" id="CookbookVersionConstraints">&nbsp;</th>
33
+ </tr>
34
+ <tr id="cbVerAddRow">
35
+ <td>
36
+ <select size="1" name="cookbook_selector"
37
+ id="cookbook_name_0000"
38
+ onchange="jQuerySuggest('0000')"
39
+ onfocus="clearCookbookError()">
40
+ <option value=""></option>
41
+ <% @cookbooks.each do |book| %>
42
+ <option value="<%= book %>"><%= book %></option>
43
+ <% end %>
44
+ </select>
45
+ </td>
46
+ <td>
47
+ <select size="1" name="cookbook_operator_selector"
48
+ id="cookbook_operator_selector">
49
+ <% constraint_operators.each do |op| %>
50
+ <option value="<%= op %>"><%= op %></option>
51
+ <% end %>
52
+ </select>
53
+ </td>
54
+ <td>
55
+ <input id="cookbook_version_0000"
56
+ class="text" name="cookbook_version_selector"
57
+ onfocus="clearVersionBox(this, '0000')"
58
+ onblur="validateVersionBoxValue(this, '0000')"
59
+ value="0.0.0">
60
+ </td>
61
+ <td>
62
+ <a href="javascript:void(0)"
63
+ onclick="addTableRow0000()">Add</a>
64
+ </td>
65
+ </tr>
66
+ </tbody>
67
+ </table>
68
+ </div>
69
+
70
+ <div class="group form attrEditor">
71
+ <label class="label">Environment Attributes</label>
72
+ <%= partial 'layout/jsonedit', :json => @environment.attributes.to_json%>
73
+ <span class="description">
74
+ A JSON hash for attributes of this environment. These attributes will be applied according to the attribute precedence rules.
75
+ </span>
76
+ </div>
77
+
78
+ <div class="group">
79
+ <div class="actions-bar">
80
+ <%= submit(submit_name, :id => submit_id, :class => 'button') -%>
81
+ </div>
82
+ </div>
83
+ <% end =%>
84
+ </div>
85
+
86
+ <script type='text/javascript'>
87
+ function cookbook_versions() {
88
+ return <%= cookbook_version_constraints.to_json %>;
89
+ }
90
+ </script>
91
+ <script type='text/javascript' charset="utf-8" src="/javascripts/cookbook_constraint_ctrl.js"></script>
@@ -0,0 +1,9 @@
1
+ .secondary-navigation
2
+ %ul
3
+ %li{ :class => "first #{active == 'index' ? "active" : ''}"}= link_to('List', url(:environments))
4
+ %li{ :class => (active == 'create' ? "active" : '')}= link_to('Create', url(:new_environment))
5
+ - if active != 'create' && active != 'index'
6
+ %li{ :class => (active == 'show' ? "active" : '')}= link_to('Show', url(:environment, @environment.name))
7
+ %li{ :class => (active == 'edit' ? "active" : '')}= link_to('Edit', url(:edit_environment, @environment.name))
8
+ %li= link_to('Delete', url(:environment, @environment.name), :method => "delete", :confirm => "Really delete Environment #{@environment.name}? There is no undo.")
9
+ .clear
@@ -0,0 +1,8 @@
1
+ <div class="cookbook_version_constraint_control_container">
2
+ <span class="label">
3
+ <label for="cookbook_version[<%= cookbook_version_index -%>]">cookbook version constraint:</label>
4
+ </span>
5
+ <span>
6
+ <%= text_field(:name => "cookbook_version[#{cookbook_version_index}]", :value => "#{cookbook_name} #{constraint}")%>
7
+ </span>
8
+ </div>
@@ -0,0 +1,17 @@
1
+ <div id="block-tables" class="block">
2
+ <div class="content">
3
+ <h2 class="title">Environment <%= params[:id] %></h2>
4
+ <div class="inner">
5
+ <%= partial "environments/navigation", :environment => @environment, :active => 'edit'%>
6
+ </div>
7
+ <%= partial 'environments/form', :environment => @environment,
8
+ :route => :environments,
9
+ :method => :put,
10
+ :form_url => url(:environment, @environment.name),
11
+ :form_id => 'edit_environment',
12
+ :form_for => 'edit',
13
+ :submit_name => "Update Environment",
14
+ :submit_id => "edit_environment_button",
15
+ :new_object => true %>
16
+ </div>
17
+ </div>
@@ -0,0 +1,26 @@
1
+ .block#block-tables
2
+ .content
3
+ %h2.title Environments
4
+ .inner
5
+ = partial('navigation', :active => 'index')
6
+ .content
7
+ .inner
8
+ %table.table
9
+ %tr
10
+ %th.first{:colspan => 2} Name
11
+ %th &nbsp;
12
+ %th.last &nbsp;
13
+ - even = false;
14
+ - @environment_list.each do |env|
15
+ %tr{ :class => even ? "even" : "odd" }
16
+ %td{:colspan => 2}= link_to(env[0], url(:environment, env[0]))
17
+ %td
18
+ - if session[:environment] != env[0]
19
+ = link_to('Select', url(:environment_select, env[0]))
20
+ - else
21
+ Select
22
+ |
23
+ = link_to('Edit', url(:edit_environment, env[0]))
24
+ |
25
+ = link_to('Delete', url(:environment, env[0]), :method => "delete", :confirm => "Really delete Environment #{env[0]}? there is no undo.")
26
+ - even = (not even)
@@ -0,0 +1,17 @@
1
+ <div id="block-tables" class="block">
2
+ <div class="content">
3
+ <h2 class="title">Environment <%= params[:id] %></h2>
4
+ <div class="inner">
5
+ <%= partial "environments/navigation", :environment => @environment, :active => 'create'%>
6
+ </div>
7
+ <%= partial 'environments/form', :environment => @environment,
8
+ :route => :environments,
9
+ :method => :post,
10
+ :form_url => url(:environments),
11
+ :form_id => 'create_environment',
12
+ :form_for => 'create',
13
+ :submit_name => "Create Environment",
14
+ :submit_id => "create_environment_button",
15
+ :new_object => true %>
16
+ </div>
17
+ </div>
@@ -0,0 +1,31 @@
1
+ .block#block-tables
2
+ .content
3
+ %h2.title= "Environment #{h @environment.name}"
4
+ .inner
5
+ = partial("navigation", :active => "show")
6
+ .content
7
+ .inner
8
+ .left
9
+ %h3 Name
10
+ = @environment.name
11
+ .left
12
+ %h3 Description
13
+ = @environment.description
14
+ .left
15
+ %h3 Cookbook Version Constraints
16
+ %table.table
17
+ %tr
18
+ %th.first Name
19
+ %th.last Version Constraints
20
+ - if @environment.cookbook_versions.empty?
21
+ %tr
22
+ %td{:colspan => 2} This environment does not include any cookbook version constraints.
23
+ - else
24
+ - @environment.cookbook_versions.keys.sort.each do |name|
25
+ - versions = @environment.cookbook_versions[name]
26
+ %tr
27
+ %td= name
28
+ %td= versions
29
+ .left
30
+ %h3 Attributes
31
+ = build_tree('attrs', @environment.attributes)
@@ -1,22 +1,30 @@
1
- !!! XML
2
- !!!
1
+ !!! 5
3
2
  %html
4
3
  %head
5
4
  %meta{ "http-equiv" => "content-type", :content => "text/html; charset=utf-8" }
6
5
  %title Chef Server
7
- = css_include_tag "base", "themes/djime-cerulean/style", "chef", "/facebox/facebox.css", "jquery-ui-1.7.1.custom", "jquery.treeTable", "jsonedit_main.css"
8
- = js_include_tag "jquery-1.3.2.min", "jquery.jeditable.mini", "jquery.livequery", "jquery.localscroll", "jquery.scrollTo", "jquery.tools.min"
6
+ = css_include_tag "base", "themes/djime-cerulean/style", "chef", "/facebox/facebox.css", "jquery-ui-1.7.1.custom", "jquery.treeTable", "jsonedit_main.css", "jquery.suggest.css"
7
+ = js_include_tag "jquery-1.4.4.min", "jquery.jeditable.mini", "jquery.livequery", "jquery.localscroll", "jquery.scrollTo", "jquery.tools.min"
9
8
  = js_include_tag "/facebox/facebox.js"
10
9
  = js_include_tag "jquery-ui-1.7.1.custom.min"
11
10
  = js_include_tag "jquery.treeTable.min"
12
11
  = js_include_tag "chef"
12
+ = js_include_tag "drop_down_menu"
13
+ = js_include_tag "jquery.suggest"
13
14
 
14
15
  = catch_content :header_content
15
16
 
16
17
  %body
17
18
  #container
18
19
  #header
19
- %h1= link_to "Chef Server", url(:top)
20
+ %h1
21
+ = link_to "Chef Server", url(:top)
22
+ %label{:for => 'environment-select'} Environment:
23
+ %select{:name => 'environment-select', :onchange => 'jump(this)', :size => 1, :class => 'title-select'}
24
+ - current_env = session[:environment]
25
+ %option{:value => url(:environment_select, :environment_id => '_none'), :selected => current_env == nil} None
26
+ - @environments.each do |env|
27
+ %option{:value => url(:environment_select, :environment_id => env), :selected => current_env == env}= env
20
28
  #user-navigation
21
29
  %ul
22
30
  - if session[:user]
@@ -27,14 +35,15 @@
27
35
  .clear
28
36
  #main-navigation
29
37
  %ul
30
- %li= link_to "Search", url(:searches)
31
- %li= link_to "Status", url(:status)
32
- %li= link_to "Roles", url(:roles)
33
- %li= link_to "Nodes", url(:nodes)
34
- %li= link_to "Cookbooks", url(:cookbooks)
35
- %li= link_to "Databags", url(:databags)
36
- %li= link_to "Clients", url(:clients)
37
- %li= link_to "Users", url(:users)
38
+ = nav_link_item("Environments", :environments)
39
+ = nav_link_item("Search", :searches)
40
+ = nav_link_item("Status", :status)
41
+ = nav_link_item("Roles", :roles)
42
+ = nav_link_item("Nodes", :nodes)
43
+ = nav_link_item("Cookbooks", :cookbooks)
44
+ = nav_link_item("Databags", :databags)
45
+ = nav_link_item("Clients", :clients)
46
+ = nav_link_item("Users", :users)
38
47
  .clear
39
48
  #wrapper
40
49
  #main
@@ -1,5 +1,5 @@
1
1
  !!! XML
2
- !!!
2
+ !!! 5
3
3
  %html
4
4
  %head
5
5
  %meta{ "http-equiv" => "content-type", :content => "text/html; charset=utf-8" }
@@ -16,7 +16,7 @@
16
16
  #header
17
17
  %h1= link_to "Chef Server", url(:top)
18
18
  #wrapper
19
- #main
19
+ #main.loginPage
20
20
  - unless message.empty?
21
21
  .block#block-messages
22
22
  .content
@@ -0,0 +1,69 @@
1
+ <div class="content nodeFormContainer">
2
+ <%= form(:action => form_url, :method => :post, :id => form_id, :class => 'form') do -%>
3
+ <% unless form_for == 'edit' %>
4
+ <div class="group form">
5
+ <label class="label" for="node_name">Name</label>
6
+ <%= text_field :id => "node_name", :name => "name", :class => "text_field", :value => params.has_key?(:name) ? h(params[:name]) : @node.name %>
7
+ <span class="description">The name of the Node</span>
8
+ </div>
9
+ <% end %>
10
+
11
+ <div>
12
+ <label class="label" for="nodeEnvironment">Environment:</label>
13
+ <%= select :chef_environment, :collection => @environments, :id => 'nodeEnvironment', :selected => @env %>
14
+ <br />
15
+ <span class="description">The node's environment</span>
16
+ </div>
17
+
18
+ <div class="group form" id="run_list_editor_container">
19
+ <div id="availableRunListItemContainer" class="runListEditorColumn">
20
+ <div id="available_roles_container" class="runListItemListContainer">
21
+ <div class="runListEditorLabel">Available Roles</div>
22
+ <div class="sortable runListAvailableItemContainer">
23
+ <ul id="node_available_roles" class="connectedSortable runListAvailableItemList">
24
+ <% @available_roles.each do |role| %>
25
+ <li id="role[<%=h(role) -%>]" class="ui-state-highlight runListItem"><%= h(role) -%></li>
26
+ <% end %>
27
+ </ul>
28
+ </div>
29
+ </div>
30
+ <div id="available_recipes_container" class="runListItemListContainer">
31
+ <div class="runListEditorLabel">Available Recipes</div>
32
+ <div class="sortable runListAvailableItemContainer">
33
+ <ul id="node_available_recipes" class="connectedSortable runListAvailableItemList availableRecipes">
34
+ <% @available_recipes.each do |recipe| %>
35
+ <li id="recipe[<%= h(recipe) -%>]" class="ui-state-default runListItem"><%= h(recipe) -%></li>
36
+ <% end %>
37
+ </ul>
38
+ </div>
39
+ </div>
40
+ </div>
41
+ <div id="run_list_container" class="runListEditorColumn">
42
+ <div class="runListItemListContainer">
43
+ <div class="runListEditorLabel">Run List</div>
44
+ <div class="sortable runListContainer runListContainerForNode">
45
+ <ul class="ui-sortable connectedSortable runListItemList" id="for_node">
46
+ <% @run_list.each do |entry| %>
47
+ <li id="<%=h(entry)%>" class="<%= class_for_run_list_item(entry) -%> runListItem"><%=h(entry.name) -%></li>
48
+ <% end %>
49
+ </ul>
50
+ </div>
51
+ </div>
52
+ </div>
53
+ </div>
54
+
55
+ <div class="group form attrEditor">
56
+ <label class="label">Attributes</label>
57
+ <%= partial 'layout/jsonedit', :json => @node.normal_attrs.to_json %>
58
+ <span class="description">
59
+ A JSON hash for default attributes for nodes of this node. These attributes will only be applied if the node does not already have a value for the attributes.
60
+ </span>
61
+ </div>
62
+
63
+ <div class="group">
64
+ <div class="actions-bar">
65
+ <%= submit(submit_name, :id => submit_id, :class => 'button') -%>
66
+ </div>
67
+ </div>
68
+ <% end =%>
69
+ </div>
@@ -1,6 +1,7 @@
1
1
  .block#block-tables
2
2
  .content
3
- %h2.title Node List
3
+ %h2.title
4
+ Node List
4
5
  .inner
5
6
  = partial('navigation', :active => 'index')
6
7
  .content
@@ -12,7 +13,10 @@
12
13
  %th.last &nbsp;
13
14
  - even = false
14
15
  - if @node_list.empty?
15
- %td{:colspan => 4}= "You appear to have no nodes - try connecting one, or creating or editing a #{link_to('client', url(:clients))}"
16
+ - if session[:environment]
17
+ %td{:colspan => 4}= "The environment #{session[:environment]} has no nodes"
18
+ - else
19
+ %td{:colspan => 4}= "You have no nodes - try connecting one, or creating or editing a #{link_to('node', url(:nodes))}"
16
20
  - else
17
21
  - @node_list.each do |node|
18
22
  %tr{:class => even ? "even": "odd" }
@@ -7,12 +7,14 @@
7
7
  .content
8
8
  .inner
9
9
  .left
10
+ %h3 Environment: #{@node.chef_environment}
10
11
  %h3 Run List
11
12
  %table.table
12
13
  %thead
13
14
  %tr
14
15
  %th.first Position
15
16
  %th Name
17
+ %th Version
16
18
  %th.last Type
17
19
  %tbody
18
20
  - if @node.run_list.empty?
@@ -23,10 +25,11 @@
23
25
  %tr
24
26
  %td.position= i
25
27
  %td= run_list_item.name
28
+ %td= run_list_item.version
26
29
  %td= run_list_item.type
27
30
  .left.accordion
28
31
  %h3.head= link_to("Recipes", "#")
29
- - recipes = @node.run_list.expand('server').recipes
32
+ - recipes = @node.run_list.expand(@node.chef_environment, 'server').recipes
30
33
  %div
31
34
  %span.description.form.help
32
35
  This is the list of recipes, fully expanded, as they will be applied to the node in question.
@@ -0,0 +1,92 @@
1
+ <div class="content roleFormContainer">
2
+ <%= form(:action => form_url, :method => method, :id => form_id, :class => 'form roleForm') do -%>
3
+ <% unless form_for == 'edit' %>
4
+ <div class="group form">
5
+ <label class="label" for="role_name">Name</label>
6
+ <%= text_field :id => "role_name", :name => "name", :class => "text_field", :value => params.has_key?(:name) ? h(params[:name]) : @role.name %>
7
+ <span class="description">The name of the Role</span>
8
+ </div>
9
+ <% end %>
10
+
11
+ <div class="group form">
12
+ <label class="label" for="role_description">Description</label>
13
+ <%= text_area(params.has_key?(:description) ? h(params[:description]) : @role.description, :name => "description", :class => "text_area", :id => "role_description") %>
14
+ <span class="description">A description of this Role</span>
15
+ </div>
16
+
17
+ <div class="group form" id="run_list_editor_container">
18
+ <div id="availableRunListItemContainer" class="runListEditorColumn">
19
+ <div id="available_roles_container" class="runListItemListContainer">
20
+ <div class="runListEditorLabel">Available Roles</div>
21
+ <div class="sortable runListAvailableItemContainer">
22
+ <ul id="availableRoles" class="connectedSortable runListAvailableItemList" data-role-list='<%= @available_roles.to_json -%>'>
23
+ <% @available_roles.each do |role| %>
24
+ <li id="role[<%=h(role) -%>]" class="ui-state-highlight runListItem"><%= h(role) -%></li>
25
+ <% end %>
26
+ </ul>
27
+ </div>
28
+ </div>
29
+ <div id="available_recipes_container" class="runListItemListContainer">
30
+ <div class="runListEditorLabel">Available Recipes</div>
31
+ <div class="sortable runListAvailableItemContainer">
32
+ <div class="spinner">
33
+ <%= image_tag('indicator.gif') -%>
34
+ </div>
35
+ <ul id="role" class="connectedSortable runListAvailableItemList availableRecipes">
36
+ </ul>
37
+ </div>
38
+ </div>
39
+ </div>
40
+ <div id="run_list_container" class="runListEditorColumn">
41
+ <div class="runListItemListContainer">
42
+ <div id="environmentRunListSelector" data-initial-env="<%=h @current_env -%>">
43
+ <div class="runListEditorLabel">
44
+ <span id="selectedRunListEditorLabel">
45
+ <% if @current_env == '_default' -%>
46
+ Default Run List
47
+ <% else -%>
48
+ Run List for <%= @current_env -%>
49
+ <% end -%>
50
+ </span>
51
+ <span id="environment_run_list_selection_control">
52
+ <%= select :environment, :collection => [['noop','Other Environments']].concat(@environments.map {|e| [e,e]}), :id => 'activeEnvironment'%>
53
+ </span>
54
+ </div>
55
+ </div>
56
+ <% @run_lists.each do |environment, run_list| %>
57
+ <%= partial('run_lists', :environment => environment, :run_list => run_list)%>
58
+ <% end %>
59
+ </div>
60
+ </div>
61
+ <div id="current_run_list_display_container" class="runListEditorColumn">
62
+ <div class="runListItemListContainer">
63
+ <div class="runListEditorLabel activeRunListLabel">Active Run List for <%= h(@current_env) -%></div>
64
+ <div class="sortable activeRunListContainer">
65
+ <% if @current_env != "_default" && @role.env_run_lists[@current_env].nil? %>
66
+ <div id="activeRunListName">using <%= @role.active_run_list_for(@current_env).gsub('_default', 'default') -%> run list</div>
67
+ <% end %>
68
+ <ul class="runListItemList" id="active_run_list">
69
+ <% @role.run_list_for(@current_env).each do |item| %>
70
+ <li class="displayRunListItem"><%= h(item) -%></li>
71
+ <% end %>
72
+ </ul>
73
+ </div>
74
+ </div>
75
+ </div>
76
+ </div>
77
+
78
+ <div class="group form attrEditor">
79
+ <label class="label">Default and Override Attributes</label>
80
+ <%= partial 'layout/jsonedit', :json => { :defaults => @role.default_attributes, :overrides => @role.override_attributes }.to_json%>
81
+ <span class="description">
82
+ A JSON hash for default attributes for nodes of this role. These attributes will be applied according to the attribute precedence rules.
83
+ </span>
84
+ </div>
85
+
86
+ <div class="group">
87
+ <div class="actions-bar">
88
+ <%= submit(submit_name, :id => submit_id, :class => 'button') -%>
89
+ </div>
90
+ </div>
91
+ <% end =%>
92
+ </div>