From: Jan Provaznik <[email protected]>
las view (summary page) is not complete yet - TBD: Finish button, polling
build_status
---
src/app/controllers/image_descriptor_controller.rb | 84 +++++++++++++++
src/app/helpers/image_descriptor_helper.rb | 23 ++++
src/app/views/image_descriptor/_basics.haml | 16 +++
src/app/views/image_descriptor/_nav.haml | 15 +++
src/app/views/image_descriptor/_services.haml | 32 ++++++
src/app/views/image_descriptor/_software.haml | 77 ++++++++++++++
src/app/views/image_descriptor/_summary.haml | 61 +++++++++++
src/app/views/image_descriptor/new.haml | 9 ++
.../image_descriptor/repository_packages.haml | 4 +
.../repository_packages_by_group.haml | 5 +
src/public/stylesheets/components.css | 110 ++++++++++++++++++++
11 files changed, 436 insertions(+), 0 deletions(-)
create mode 100644 src/app/controllers/image_descriptor_controller.rb
create mode 100644 src/app/helpers/image_descriptor_helper.rb
create mode 100644 src/app/views/image_descriptor/_basics.haml
create mode 100644 src/app/views/image_descriptor/_nav.haml
create mode 100644 src/app/views/image_descriptor/_services.haml
create mode 100644 src/app/views/image_descriptor/_software.haml
create mode 100644 src/app/views/image_descriptor/_summary.haml
create mode 100644 src/app/views/image_descriptor/new.haml
create mode 100644 src/app/views/image_descriptor/repository_packages.haml
create mode 100644
src/app/views/image_descriptor/repository_packages_by_group.haml
diff --git a/src/app/controllers/image_descriptor_controller.rb
b/src/app/controllers/image_descriptor_controller.rb
new file mode 100644
index 0000000..b4b9eb5
--- /dev/null
+++ b/src/app/controllers/image_descriptor_controller.rb
@@ -0,0 +1,84 @@
+class ImageDescriptorController < ApplicationController
+ layout :layout
+ before_filter :require_user
+
+ TABS = %w(basics services software summary)
+
+ def layout
+ return "aggregator" unless ajax?
+ end
+
+ def ajax?
+ return params[:ajax] == "true"
+ end
+
+ def new
+ # FIXME: check permission, something like IMAGE_CREATE
+ if params[:commit] == 'Cancel'
+ redirect_to :controller => "image", :action => 'show'
+ return
+ elsif params[:commit] == 'Build'
+ @tab = 'summary'
+ if params[:targets]
+ params[:targets].each do |target|
+ ImageDescriptorTarget.new_if_not_exists(:name => target,
:image_descriptor_id => params[:image_descriptor][:id], :status => "waiting")
+ end
+ end
+ end
+
+ unless @tab
+ @old_tab = TABS.index(params[:tab]) || nil
+ next_idx = @old_tab ? @old_tab + (params[:commit] == 'Back' ? -1 : 1) : 0
+ @tab = (next_idx < 0 || next_idx > TABS.size) ? TABS[0] : TABS[next_idx]
+ end
+
+ @image_descriptor = params[:image_descriptor] &&
params[:image_descriptor][:id] ?
ImageDescriptor.find(params[:image_descriptor][:id]) : ImageDescriptor.new
+ @image_descriptor.update_xml_attributes!(params[:xml] || {})
+
+ if @tab == 'summary'
+ @image_descriptor.complete = true
+ @image_descriptor.save!
+ end
+
+ if @tab == 'software'
+ @repositories = RepositoryManager.new.repositories
+ elsif @tab == 'summary'
+ @all_targets = ImageDescriptorTarget.available_targets
+ end
+ end
+
+ def create
+ if params[:commit] == 'Cancel'
+ redirect_to :controller => "image", :action => 'show'
+ return
+ end
+ redirect_to :action => 'images', :tab => 'show'
+ end
+
+ def selected_packages
+ data = ImageDescriptor.find(params[:id]).xml.packages
+ end
+
+ def repository_packages
+ @packages = []
+ rmanager = RepositoryManager.new
+ rmanager.repositories.keys.each do |repid|
+ next if params[:repository] and params[:repository] != 'all' and repid
!= params[:repository]
+ rep = rmanager.get_repository(repid)
+ @packages += rep.get_packages
+ end
+ end
+
+ def repository_packages_by_group
+ @packages = {}
+ rmanager = RepositoryManager.new
+ rmanager.repositories.keys.each do |repid|
+ next if params[:repository] and params[:repository] != 'all' and repid
!= params[:repository]
+ rep = rmanager.get_repository(repid)
+ rep.get_packages_by_group.each do |group, pkgs|
+ @packages[group] ||= []
+ @packages[group] += pkgs
+ end
+ end
+ end
+end
diff --git a/src/app/helpers/image_descriptor_helper.rb
b/src/app/helpers/image_descriptor_helper.rb
new file mode 100644
index 0000000..ee3fd97
--- /dev/null
+++ b/src/app/helpers/image_descriptor_helper.rb
@@ -0,0 +1,23 @@
+module ImageDescriptorHelper
+ def tree_list(domid, data, action_name, action_callback)
+ list = data.map do |group, pkgs|
+ package_list(pkgs, action_name, action_callback)
+ end
+ return "<ul id='#{domid}' class='filetree'><li>" + list.join("</li><li>")
+ "</li></ul>"
+ end
+
+ def package_list(pkgs, action_name, action_callback)
+ list = pkgs.map do |pkg|
+ "<span class='pkgname'>#{pkg[:name]}</span><span style='float:right'
onclick='#{action_callback}'>#{action_name}</span>"
+ end
+ return "<li>" + list.join("</li><li>") + "</li>"
+ end
+
+ def js_add_group_cmd(group, pkgs)
+ "select_group({group: '#{group}', pkgs: ['#{pkgs.map {|p|
p[:name]}.join("','")}']});"
+ end
+
+ def select_repository_tag(repositories)
+ select_tag("repository", ["<option value='all'
selected='selected'>All</option>"] + repositories.map{|repid, rep| "<option
value=\"#{repid}\">#{rep['name']}</option>"}, {:onchange =>
"get_repository(event)"})
+ end
+end
diff --git a/src/app/views/image_descriptor/_basics.haml
b/src/app/views/image_descriptor/_basics.haml
new file mode 100644
index 0000000..b89970d
--- /dev/null
+++ b/src/app/views/image_descriptor/_basics.haml
@@ -0,0 +1,16 @@
+%ul
+ %li
+ %label Name
+ = text_field_tag 'xml[name]', @image_descriptor.xml.name
+ %span Provide a unique name for template master. Users will see this name
when they choose this image to instantiate.
+ %li
+ %label Platform
+ = select_tag("xml[platform]", @image_descriptor.xml.platforms.map{|repid,
rep| "<option value=\"#{repid}\" selected=\"#{repid ==
@image_descriptor.xml.platform ? 'selected' : ''}\">#{rep['name']}</option>"})
+ %span Choose the software operating system.
+ %li
+ %label Description
+ = text_area_tag("xml[description]", @image_descriptor.xml.description,
:rows => 4)
+ %span Provide a description of your template master. Be descriptive to
help users to identify the images created with this master.
+.submit
+ = submit_tag "Cancel"
+ = submit_tag "Next"
diff --git a/src/app/views/image_descriptor/_nav.haml
b/src/app/views/image_descriptor/_nav.haml
new file mode 100644
index 0000000..c923baf
--- /dev/null
+++ b/src/app/views/image_descriptor/_nav.haml
@@ -0,0 +1,15 @@
+#image_descriptor_nav
+ %h2 Create a New Template Master
+ %ul{:class => 'nav'}
+ %li{:class => @tab == 'basics' ? 'selected' : nil}
+ %h4 BASICS
+ %p Basic RHEL LAMP
+ %li{:class => @tab == 'services' ? 'selected' : nil}
+ %h4 SERVICES
+ %p Add services
+ %li{:class => @tab == 'software' ? 'selected' : nil}
+ %h4 SOFTWARE
+ %p Add software
+ %li{:class => @tab == 'summary' ? 'selected' : nil}
+ %h4 SUMMARY
+ %p Create images
diff --git a/src/app/views/image_descriptor/_services.haml
b/src/app/views/image_descriptor/_services.haml
new file mode 100644
index 0000000..88cd38a
--- /dev/null
+++ b/src/app/views/image_descriptor/_services.haml
@@ -0,0 +1,32 @@
+%ul
+ %li
+ %label Storage
+ = check_box_tag 'xml[services][amazon3_storage]', '1',
@image_descriptor.xml.services.include?('amazon3_storage')
+ = label_tag 'xml[services][amazon3_storage]', 'Enable Amazon S3 storage'
+ %span Provides cloud avare table storage.
+ %li
+ %label Inter-node Messaging
+ = check_box_tag 'xml[services][inter_node_messaging]', '1',
@image_descriptor.xml.services.include?('inter_node_messaging')
+ = label_tag 'xml[services][inter_node_messaging]', 'Enable inter-node
messaging'
+ %span Provides cloud avare messaging.
+ %li
+ %label Availbility
+ = check_box_tag 'xml[services][availbility]', '1',
@image_descriptor.xml.services.include?('availbility')
+ = label_tag 'xml[services][availbility]', 'Enable high availbility
services'
+ %span
+ %li
+ %label JBoss
+ = check_box_tag 'xml[services][jboss]', '1',
@image_descriptor.xml.services.include?('jboss')
+ = label_tag 'xml[services][jboss]', 'Enable JBoss infrastructure'
+ %span
+ %li
+ %label Cooling Tower
+ = check_box_tag 'xml[services][cooling_tower]', '1',
@image_descriptor.xml.services.include?('cooling_tower')
+ = label_tag 'xml[services][cooling_tower]', 'Enable Cooling Tower'
+ %span
+
+
+.submit
+ = submit_tag "Cancel"
+ = submit_tag "Back"
+ = submit_tag "Next"
diff --git a/src/app/views/image_descriptor/_software.haml
b/src/app/views/image_descriptor/_software.haml
new file mode 100644
index 0000000..57245c1
--- /dev/null
+++ b/src/app/views/image_descriptor/_software.haml
@@ -0,0 +1,77 @@
+- content_for :scripts do
+ :javascript
+ $(document).ready(function() {
+ $("#dashboard-tabs > ul > li > a").each(function(index) {
+ var link = $(this).attr("href") + "?ajax=true";
+ $(this).attr("href", link);
+ });
+ $("#dashboard-tabs").tabs({spinner: "Loading..."});
+
+ // when JS is enabled, hide the Dashboard content -- it'll be loaded
+ // by jquery UI tab using ajax
+ $("#dashboard-content").hide();
+ $("#selected_packages").treeview({collapsed: true});
+ #...@image_descriptor.xml.packages.map {|group, pkgs|
js_add_group_cmd(group, pkgs)}.join("\n")}
+ });
+ function remove_group(ev) {
+ $(ev.target).parent().remove();
+ };
+ function get_repository(ev) {
+ var rep = $(ev.target).val();
+ $("#dashboard-tabs > ul > li > a").each(function(index) {
+ var link = $(this).data('load.tabs');
+ if (link.search(/repository=[^$&]*/) == -1) {
+ link = link + "&repository=" + rep;
+ } else {
+ link = link.replace(/repository=[^$&]*/, "repository="+rep);
+ }
+ $("#dashboard-tabs").tabs('url', index, link);
+ });
+ $("#dashboard-tabs").tabs('load', $("#dashboard-tabs").tabs('option',
'selected'));
+ };
+ function select_package(group, pkgname, parent) {
+ if (!parent) parent = $("#selected_packages");
+ if (parent.find(".pkgname").filter(function() {return $(this).text() ==
pkgname}).length == 0) {
+ var node = $("<li><input type=checkbox name='xml[packages][]' value='"
+ group + '#' + pkgname + "' checked=true><span class='pkgname'>" + pkgname +
"</span></li>").appendTo(parent);
+ $("#selected_packages").treeview({add: node});
+ }
+ };
+ function add_group(name) {
+ var group = $("<li><span class='group'>" + name + "</span><span
class='select'
onclick='remove_group(event)'>Remove</span><ul></ul></li>").appendTo("#selected_packages");
+ $("#selected_packages").treeview({add: group});
+ return group.find("ul");
+ };
+ function select_group(opts) {
+ var groups = $("#selected_packages li .group").filter(function() {return
$(this).text() == opts.group});
+ //FIXME: if group exists, we abort adding group again, merging is not
supported yet
+ if (groups.length > 0) return;
+ var group = add_group(opts.group);
+ for (var i = 0; i < opts.pkgs.length; i++) {
+ select_package(opts.group, opts.pkgs[i], group);
+ }
+ };
+
+- menu = [ { :text => "Groups", :action => "repository_packages_by_group" }, |
+ { :text => "Packages", :action => "repository_packages" }, ] |
+
+.pkglist_wrapper
+ %div
+ Packages from repository
+ = select_repository_tag(@repositories)
+ .pkglist
+ #dashboard-tabs{ :class => "ui-tabs ui-widget ui-widget-content
ui-corner-all" }
+ %ul{ :class => "ui-tabs ui-widget ui-widget-content ui-corner-all
ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header" }
+ - menu.each do |item|
+ - selection_style = "ui-tabs-selected ui-state-active" if
item[:action] == controller.action_name
+ %li{ :class => "#{selection_style} ui-state-default ui-corner-top",
:style => 'clear: none' }
+ = "<a href=\"#{url_for :controller => "image_descriptor", :action
=> item[:action] }\"><span>#{item[:text]}</span></a>"
+
+ .pkglist{:style => "margin-left: 30px"}
+ %div{:class => "ui-tabs ui-widget ui-widget-content ui-corner-all
ui-helper-reset ui-helper-clearfix ui-widget-header"}
+ Selected packages
+ %ul{:id => "selected_packages"}
+
+.submit
+ = submit_tag "Cancel"
+ = submit_tag "Back"
+ = submit_tag "Next"
diff --git a/src/app/views/image_descriptor/_summary.haml
b/src/app/views/image_descriptor/_summary.haml
new file mode 100644
index 0000000..1f3cde6
--- /dev/null
+++ b/src/app/views/image_descriptor/_summary.haml
@@ -0,0 +1,61 @@
+- content_for :scripts do
+ :javascript
+ function toggle_build_form_visibility(ev) {
+ if ($("#image_build_form").css('display') == 'none') {
+ $("#image_build_form").css('display', 'block');
+ $(ev.target).val('Cancel');
+ } else {
+ $("#image_build_form").css('display', 'none');
+ $(ev.target).val('Build Images');
+ }
+ }
+
+%ul{:class => 'summary_side_panel'}
+ %li
+ BASICS
+ %label
+ = @image_descriptor.xml.name
+ %label
+ = @image_descriptor.xml.platform
+ %label
+ = @image_descriptor.xml.description
+ %li
+ SERVICES
+ - @image_descriptor.xml.services.each do |service|
+ %label
+ = service
+ //FIXME: software could take realy long space
+ //%li
+ // SOFTWARE
+
+%ul{:class => 'summary_main_panel'}
+ .image_build_panel
+ %h3
+ Images
+ %input{:type => 'button', :value => "Build Images", :style =>
'float:right', :onclick => 'toggle_build_form_visibility(event)'}
+ #image_build_form
+ %ul
+ %li
+ %label Image formats
+ %ul
+ - @all_targets.each do |target_id, target|
+ %li
+ = check_box_tag 'targets[]', target_id, false
+ %span
+ = target['name']
+ = submit_tag "Build"
+ %ul{:class => 'target_list'}
+ - @image_descriptor.image_descriptor_targets.each do |target|
+ %li
+ %span{:style => 'float:right'}
+ = target.status
+ = @all_targets[target.name]['name']
+ %p
+ = target.created_at
+ //%span{:style => 'float:right'}
+ // Cancel
+
+.submit
+ = submit_tag "Cancel"
+ = submit_tag "Back"
+ = submit_tag "Finish"
diff --git a/src/app/views/image_descriptor/new.haml
b/src/app/views/image_descriptor/new.haml
new file mode 100644
index 0000000..e6f4a3e
--- /dev/null
+++ b/src/app/views/image_descriptor/new.haml
@@ -0,0 +1,9 @@
+= render :partial => "nav", :locals => {:tab => params[:tab]}
+
+#image_descriptor_form{:class => 'dcloud_form'}
+ = error_messages_for 'image_descriptor'
+
+ - form_tag :action => 'new' do
+ %input{:type => 'hidden', :name => 'tab', :value => @tab}
+ = hidden_field :image_descriptor, :id
+ = render :partial => @tab
diff --git a/src/app/views/image_descriptor/repository_packages.haml
b/src/app/views/image_descriptor/repository_packages.haml
new file mode 100644
index 0000000..9414b85
--- /dev/null
+++ b/src/app/views/image_descriptor/repository_packages.haml
@@ -0,0 +1,4 @@
+%ul
+ - @packages.each do |pkg|
+ %li
+ = "#{pkg[:name]}<span class='select' onclick=\"select_group({group:
'#{pkg[:group]}', pkgs: ['#{pkg[:name]}']})\">Select</span>"
diff --git a/src/app/views/image_descriptor/repository_packages_by_group.haml
b/src/app/views/image_descriptor/repository_packages_by_group.haml
new file mode 100644
index 0000000..2f2b704
--- /dev/null
+++ b/src/app/views/image_descriptor/repository_packages_by_group.haml
@@ -0,0 +1,5 @@
+%ul
+ - @packages.keys.map {|group| group.to_s}.sort.each do |group|
+ %li
+ - pkgs = @packages[group].map {|p| p[:name]}.join("','")
+ = "#{group}<span class='select' onclick=\"select_group({group:
'#{group}', pkgs: ['#{pkgs}']})\">Select</span>"
diff --git a/src/public/stylesheets/components.css
b/src/public/stylesheets/components.css
index 5b25cd4..d38ab1e 100644
--- a/src/public/stylesheets/components.css
+++ b/src/public/stylesheets/components.css
@@ -136,3 +136,113 @@ ul.nav li.selected {
color: blue;
text-decoration: underline;
}
+
+#image_descriptor_form {
+ width: 800px;
+ margin: 20px;
+ display: inline-block;
+}
+
+
+#image_descriptor_form ul li textarea {
+ width: 302px;
+}
+
+#image_descriptor_form ul li select {
+ width: 302px;
+}
+
+#image_descriptor_form ul li input {
+ width: 302px;
+}
+
+#image_descriptor_form .pkglist {
+ float:left;
+ width:380px;
+ height:300px;
+ overflow:auto;
+ background-color: white;
+}
+
+#image_descriptor_form .pkglist .select {
+ float:right;
+ cursor: pointer;
+ color: blue;
+}
+
+#image_descriptor_form .pkglist_wrapper {
+ width:800px;
+}
+
+#image_descriptor_form .pkglist ul {
+ background-color: white;
+}
+
+#image_descriptor_nav {
+ margin: 20px;
+ width: 900px;
+}
+
+#image_descriptor_nav ul {
+ width: 100%;
+}
+
+#image_descriptor_nav ul li {
+ display: inline;
+ float: left;
+ width: 200px;
+ border: 1px solid black;
+ padding-left: 10px;
+ clear: none;
+ font-size: 1em;
+}
+
+#image_descriptor_form .summary_side_panel label {
+ float: none;
+ font-size: 1em;
+ padding: 5px;
+}
+
+#image_descriptor_form .submit {
+ padding-top: 20px;
+}
+
+#image_descriptor_form .summary_side_panel {
+ width: 150px;
+ float: left;
+ border: 1px solid #000;
+ margin: 5px;
+ padding: 10px;
+}
+
+#image_descriptor_form .summary_main_panel {
+ width: 600px;
+ float: left;
+ border: 1px solid #000;
+ margin: 5px;
+}
+
+#image_descriptor_form .summary_main_panel .image_build_panel {
+ border: 1px solid #000;
+ margin: 5px;
+ padding: 10px;
+}
+
+#image_descriptor_form .summary_main_panel .image_build_panel input {
+ font-size: 1em;
+}
+
+#image_build_form {
+ display: none;
+}
+
+#image_descriptor_form .summary_side_panel li {
+ padding-bottom: 20px;
+}
+
+#image_descriptor_form .target_list li {
+ border: 1px solid #bbb;
+ width: 400px;
+ margin: 20px;
+ padding: 5px;
+}
--
1.7.0.1
_______________________________________________
deltacloud-devel mailing list
[email protected]
https://fedorahosted.org/mailman/listinfo/deltacloud-devel