Fix failing test
by Matt Wagner
This fixes a failing rspec test that I somehow overlooked. Sorry about that!
12 years, 10 months
[PATCH conductor] Issue #1657: create basic structure for cli image tool.
by Jason Guiditta
This patch sets up the cli config parsing with tests, as well
as adding the basic structure for the library. New specs should
be added per Command class as things are implemented.
---
services/image_factory/aeolus-image/Rakefile | 46 +++++
.../image_factory/aeolus-image/bin/aeolus-image.rb | 6 +
.../image_factory/aeolus-image/lib/base_command.rb | 24 +++
.../aeolus-image/lib/build_command.rb | 9 +
.../aeolus-image/lib/config_parser.rb | 191 ++++++++++++++++++++
.../aeolus-image/lib/delete_command.rb | 9 +
.../aeolus-image/lib/import_command.rb | 9 +
.../image_factory/aeolus-image/lib/list_command.rb | 9 +
.../image_factory/aeolus-image/lib/push_command.rb | 9 +
.../aeolus-image/spec/config_parser_spec.rb | 52 ++++++
services/image_factory/aeolus-image/spec/spec.opts | 3 +
.../image_factory/aeolus-image/spec/spec_helper.rb | 27 +++
12 files changed, 394 insertions(+), 0 deletions(-)
create mode 100644 services/image_factory/aeolus-image/Rakefile
create mode 100755 services/image_factory/aeolus-image/bin/aeolus-image.rb
create mode 100644 services/image_factory/aeolus-image/lib/base_command.rb
create mode 100644 services/image_factory/aeolus-image/lib/build_command.rb
create mode 100644 services/image_factory/aeolus-image/lib/config_parser.rb
create mode 100644 services/image_factory/aeolus-image/lib/delete_command.rb
create mode 100644 services/image_factory/aeolus-image/lib/import_command.rb
create mode 100644 services/image_factory/aeolus-image/lib/list_command.rb
create mode 100644 services/image_factory/aeolus-image/lib/push_command.rb
create mode 100644 services/image_factory/aeolus-image/spec/config_parser_spec.rb
create mode 100644 services/image_factory/aeolus-image/spec/spec.opts
create mode 100644 services/image_factory/aeolus-image/spec/spec_helper.rb
diff --git a/services/image_factory/aeolus-image/Rakefile b/services/image_factory/aeolus-image/Rakefile
new file mode 100644
index 0000000..d518ccf
--- /dev/null
+++ b/services/image_factory/aeolus-image/Rakefile
@@ -0,0 +1,46 @@
+require 'rubygems'
+require 'rake'
+require 'rake/clean'
+require 'rake/gempackagetask'
+require 'rake/rdoctask'
+require 'rake/testtask'
+require 'spec/rake/spectask'
+
+spec = Gem::Specification.new do |s|
+ s.name = 'aeolus-image'
+ s.version = '0.0.1'
+ s.has_rdoc = true
+ s.extra_rdoc_files = ['README', 'LICENSE']
+ s.summary = 'Your summary here'
+ s.description = s.summary
+ s.author = ''
+ s.email = ''
+ # s.executables = ['your_executable_here']
+ s.files = %w(LICENSE README Rakefile) + Dir.glob("{bin,lib,spec}/**/*")
+ s.require_path = "lib"
+ s.bindir = "bin"
+end
+
+Rake::GemPackageTask.new(spec) do |p|
+ p.gem_spec = spec
+ p.need_tar = true
+ p.need_zip = true
+end
+
+Rake::RDocTask.new do |rdoc|
+ files =['README', 'LICENSE', 'lib/**/*.rb']
+ rdoc.rdoc_files.add(files)
+ rdoc.main = "README" # page to start on
+ rdoc.title = "aeolus-image Docs"
+ rdoc.rdoc_dir = 'doc/rdoc' # rdoc output folder
+ rdoc.options << '--line-numbers'
+end
+
+Rake::TestTask.new do |t|
+ t.test_files = FileList['test/**/*.rb']
+end
+
+Spec::Rake::SpecTask.new do |t|
+ t.spec_files = FileList['spec/**/*.rb']
+ t.libs << Dir["lib"]
+end
\ No newline at end of file
diff --git a/services/image_factory/aeolus-image/bin/aeolus-image.rb b/services/image_factory/aeolus-image/bin/aeolus-image.rb
new file mode 100755
index 0000000..9c8c4ff
--- /dev/null
+++ b/services/image_factory/aeolus-image/bin/aeolus-image.rb
@@ -0,0 +1,6 @@
+#!/usr/bin/env ruby
+
+$: << File.expand_path(File.dirname(__FILE__) + '/../lib')
+require 'config_parser.rb'
+parser = Aeolus::Image::ConfigParser.new(ARGV)
+puts parser.process
diff --git a/services/image_factory/aeolus-image/lib/base_command.rb b/services/image_factory/aeolus-image/lib/base_command.rb
new file mode 100644
index 0000000..4d4fa42
--- /dev/null
+++ b/services/image_factory/aeolus-image/lib/base_command.rb
@@ -0,0 +1,24 @@
+module Aeolus
+ module Image
+ #This will house some methods that multiple Command classes need to use.
+ class BaseCommand
+ attr_accessor :options
+ def initialize(opts={}, logger=nil)
+ logger(logger)
+ @options = opts
+ end
+
+ protected
+ def logger(logger=nil)
+ @logger ||= logger
+ unless @logger
+ @logger = Logger.new(STDOUT)
+ @logger.level = Logger::INFO
+ @logger.datetime_format = "%Y-%m-%d %H:%M:%S"
+ end
+ return @logger
+ end
+
+ end
+ end
+end
diff --git a/services/image_factory/aeolus-image/lib/build_command.rb b/services/image_factory/aeolus-image/lib/build_command.rb
new file mode 100644
index 0000000..c000e64
--- /dev/null
+++ b/services/image_factory/aeolus-image/lib/build_command.rb
@@ -0,0 +1,9 @@
+module Aeolus
+ module Image
+ class BuildCommand < BaseCommand
+ def initialize(opts={}, logger=nil)
+ super(opts={}, logger=nil)
+ end
+ end
+ end
+end
diff --git a/services/image_factory/aeolus-image/lib/config_parser.rb b/services/image_factory/aeolus-image/lib/config_parser.rb
new file mode 100644
index 0000000..2f3fcc2
--- /dev/null
+++ b/services/image_factory/aeolus-image/lib/config_parser.rb
@@ -0,0 +1,191 @@
+require 'optparse'
+require 'logger'
+require 'base_command'
+require 'list_command'
+require 'build_command'
+require 'push_command'
+require 'import_command'
+require 'delete_command'
+
+module Aeolus
+ module Image
+ class ConfigParser
+ COMMANDS = %w(list build push import delete)
+ attr_accessor :options, :command, :args
+
+ def initialize(argv)
+ @args = argv
+ # Default options
+ @options = {}
+ parse
+ end
+
+ def process
+ # Check for command, then call appropriate Optionparser and initiate
+ # call to that class.
+ @command = @args.shift
+ # Eventually get the config file from user dir if it exists.
+ # File.expand_path("~")
+ if COMMANDS.include?(@command)
+ self.send((a)command.to_sym)
+ else
+ @args << "-h"
+ puts "Valid command required: \n\n"
+ parse
+ end
+ end
+
+ private
+ def parse
+ @optparse ||= OptionParser.new do|opts|
+ opts.banner = "Usage: aeolus-image [#{COMMANDS.join('|')}] [general options] [command options]"
+
+ opts.separator ""
+ opts.separator "General options:"
+ opts.on('-u', '--user USERNAME', 'Conductor username') do |user|
+ @options[:user] = user
+ end
+ opts.on('-w', '--password PASSWORD', 'Conductor password') do |pw|
+ @options[:password] = pw
+ end
+ opts.on('-d', '--id ID', 'id for a given object') do |id|
+ @options[:id] = id
+ end
+ opts.on('-r', '--provider NAME', 'name of specific provider (ie ec2-us-east1)') do |name|
+ @options[:provider] = name
+ end
+ opts.on('-d', '--daemon', 'run as a background process') do
+ @options[:subcommand] = :images
+ end
+ opts.on( '-h', '--help', 'Get usage information for this tool') do
+ puts opts
+ exit(0)
+ end
+
+ opts.separator ""
+ opts.separator "List options:"
+ opts.on('-i', '--images', 'Retrieve a list of images') do
+ @options[:subcommand] = :images
+ end
+ opts.on('-b', '--builds ID', 'Retrieve the builds of an image') do |id|
+ @options[:subcommand] = :builds
+ @options[:id] = id
+ end
+ opts.on('-t', '--targetimages ID', 'Retrieve the target images from a build') do |id|
+ @options[:subcommand] = :targetimages
+ @options[:id] = id
+ end
+ opts.on('-P', '--providerimages ID', 'Retrieve the provider images from a target image') do |id|
+ @options[:subcommand] = :targetimages
+ @options[:id] = id
+ end
+ opts.on('-g', '--targets', 'Retrieve the values available for the --target parameter') do
+ @options[:subcommand] = :targets
+ end
+ opts.on('-p', '--providers', 'Retrieve the values available for the --provider parameter') do
+ @options[:subcommand] = :providers
+ end
+ opts.on('-a', '--accounts', 'Retrieve the values available for the --account parameter') do
+ @options[:subcommand] = :accounts
+ end
+
+ opts.separator ""
+ opts.separator "Build options:"
+ opts.on('-T', '--target TARGET1,TARGET2', Array, 'provider type (ec2, rackspace, rhevm, etc)') do |name|
+ @options[:target] = name
+ end
+ opts.on('-e', '--template FILE', 'path to file that contains template xml') do |file|
+ @options[:template] = file
+ end
+ opts.on('-I', '--image ID', 'image to rebuild. When specified w/o template and target, rebuilds from latest build') do |id|
+ @options[:image] = id
+ end
+
+ opts.separator ""
+ opts.separator "Push options:"
+ opts.on('-B', '--build ID', 'push all target images for a build, to same providers as previously') do |id|
+ @options[:build] = id
+ end
+ opts.on('-I', '--image ID', 'push all the target images for the latest build') do |id|
+ @options[:image] = id
+ end
+ opts.on('-A', '--account NAME', 'name of specific provider account to use for push') do |name|
+ @options[:account] = name
+ end
+
+ opts.separator ""
+ opts.separator "Delete options:"
+ opts.on('-m', '--targetimage ID', 'delete target image and its provider images') do |id|
+ @options[:targetimage] = id
+ end
+ opts.on('-D', '--providerimage ID', 'delete provider image') do |id|
+ @options[:providerimage] = id
+ end
+
+ opts.separator ""
+ opts.separator "List Examples:"
+ opts.separator "aeolus-image list --images # list available images"
+ opts.separator "aeolus-image list --builds $image_id # list the builds of an image"
+ opts.separator "aeolus-image list --targetimages $build_id # list the target images from a build"
+ opts.separator "aeolus-image list --targets # list the values available for the --target parameter"
+ opts.separator "aeolus-image list --providers # list the values available for the --provider parameter"
+ opts.separator "aeolus-image list --accounts # list the values available for the --account parameter"
+
+ opts.separator ""
+ opts.separator "Build examples:"
+ opts.separator "aeolus-image build --target ec2 --template my.tmpl # build a new image for ec2 from the template"
+ opts.separator "aeolus-image build --image $image_id # rebuild the image template and targets from latest build"
+ opts.separator %q{aeolus-image build --target ec2,rackspace \ # rebuild the image with a new template and set of targets
+ --image $image_i \
+ --template my.tmpl}
+
+ opts.separator ""
+ opts.separator "Push examples:"
+ opts.separator "aeolus-image push --provider ec2-us-east-1 --id $target_image_id # push the target image to the specified provider"
+ opts.separator "aeolus-image push --build $build_id # push all target images for a build, to same providers as previously"
+ opts.separator "aeolus-image push --account $provider_account --build $build_id # ditto, using a specific provider account"
+ opts.separator "aeolus-image push --image $image_id # push all the target images for the latest build"
+
+ opts.separator ""
+ opts.separator "Import examples:"
+ opts.separator "aeolus-image import --provider ec2-us-east-1 --id $ami_id # import an AMI from the specified provider"
+
+ opts.separator ""
+ opts.separator "Delete examples:"
+ opts.separator "aeolus-image delete --build $build_id # deletes a build, updating latest/parent references as appropriate"
+ opts.separator "aeolus-image delete --targetimage $target_image # deletes a target image and its provider images"
+ opts.separator "aeolus-image delete --providerimage $provider_image # deletes a provider image"
+ end
+ @optparse.parse!(@args)
+ end
+
+ # TODO: Remove all this boilerplate and replace with some metaprogramming,
+ # perhaps method_missing
+ def list
+ # TODO: Instantiate and call object matching command type, for example:
+ # l = ListCommand.new(@options)
+ # Each Command will call it's own internal method depending on the contents of the hash.
+ # For the list example above, that object would call a method 'images' based on the item
+ # @options[:subcommand] being :images, so internally that class may do something like:
+ # self.send(@options[:subcommand])
+ "Not implemented"
+ end
+
+ def build
+ "Not implemented"
+ end
+
+ def push
+ "Not implemented"
+ end
+
+ def import
+ "Not implemented"
+ end
+
+ def delete
+ "Not implemented"
+ end
+ end
+ end
+end
diff --git a/services/image_factory/aeolus-image/lib/delete_command.rb b/services/image_factory/aeolus-image/lib/delete_command.rb
new file mode 100644
index 0000000..261563b
--- /dev/null
+++ b/services/image_factory/aeolus-image/lib/delete_command.rb
@@ -0,0 +1,9 @@
+module Aeolus
+ module Image
+ class DeleteCommand < BaseCommand
+ def initialize(opts={}, logger=nil)
+ super(opts={}, logger=nil)
+ end
+ end
+ end
+end
diff --git a/services/image_factory/aeolus-image/lib/import_command.rb b/services/image_factory/aeolus-image/lib/import_command.rb
new file mode 100644
index 0000000..e60498d
--- /dev/null
+++ b/services/image_factory/aeolus-image/lib/import_command.rb
@@ -0,0 +1,9 @@
+module Aeolus
+ module Image
+ class ImportCommand < BaseCommand
+ def initialize(opts={}, logger=nil)
+ super(opts={}, logger=nil)
+ end
+ end
+ end
+end
diff --git a/services/image_factory/aeolus-image/lib/list_command.rb b/services/image_factory/aeolus-image/lib/list_command.rb
new file mode 100644
index 0000000..5b19e77
--- /dev/null
+++ b/services/image_factory/aeolus-image/lib/list_command.rb
@@ -0,0 +1,9 @@
+module Aeolus
+ module Image
+ class ListCommand < BaseCommand
+ def initialize(opts={}, logger=nil)
+ super(opts={}, logger=nil)
+ end
+ end
+ end
+end
diff --git a/services/image_factory/aeolus-image/lib/push_command.rb b/services/image_factory/aeolus-image/lib/push_command.rb
new file mode 100644
index 0000000..f3e4b51
--- /dev/null
+++ b/services/image_factory/aeolus-image/lib/push_command.rb
@@ -0,0 +1,9 @@
+module Aeolus
+ module Image
+ class PushCommand < BaseCommand
+ def initialize(opts={}, logger=nil)
+ super(opts={}, logger=nil)
+ end
+ end
+ end
+end
diff --git a/services/image_factory/aeolus-image/spec/config_parser_spec.rb b/services/image_factory/aeolus-image/spec/config_parser_spec.rb
new file mode 100644
index 0000000..0b93409
--- /dev/null
+++ b/services/image_factory/aeolus-image/spec/config_parser_spec.rb
@@ -0,0 +1,52 @@
+require 'spec_helper'
+
+module Aeolus
+ module Image
+ describe ConfigParser do
+ it "should parse the specified command" do
+ config_parser = ConfigParser.new(%w(list))
+ config_parser.process
+ config_parser.command.should == 'list'
+ end
+
+ it "should notify the user of an invalid command" do
+ config_parser = ConfigParser.new(%w(sparkle))
+ config_parser.should_receive(:exit).with(0)
+ silence_stream(STDOUT) do
+ config_parser.process
+ end
+ end
+
+ it "should set options hash for valid general options" do
+ config_parser = ConfigParser.new(%w(list --user joe --password cloud --images))
+ config_parser.options[:user].should == 'joe'
+ config_parser.options[:password].should == 'cloud'
+ config_parser.options[:subcommand].should == :images
+ end
+
+ it "should set options hash for valid list options" do
+ config_parser = ConfigParser.new(%w(list --builds 12345))
+ config_parser.options[:subcommand].should == :builds
+ config_parser.options[:id].should == '12345'
+ end
+
+ it "should set options hash for valid build options" do
+ config_parser = ConfigParser.new(%w(build --target ec2,rackspace --image 12345 --template my.tmpl))
+ config_parser.options[:target].should == ['ec2','rackspace']
+ config_parser.options[:image].should == '12345'
+ config_parser.options[:template].should == 'my.tmpl'
+ end
+
+ it "should set options hash for valid push options" do
+ config_parser = ConfigParser.new(%w(push --provider ec2-us-east1 --id 12345))
+ config_parser.options[:provider].should == 'ec2-us-east1'
+ config_parser.options[:id].should == '12345'
+ end
+
+ it "should set options hash for valid delete options" do
+ config_parser = ConfigParser.new(%w(delete --build 12345))
+ config_parser.options[:build].should == '12345'
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/services/image_factory/aeolus-image/spec/spec.opts b/services/image_factory/aeolus-image/spec/spec.opts
new file mode 100644
index 0000000..4154052
--- /dev/null
+++ b/services/image_factory/aeolus-image/spec/spec.opts
@@ -0,0 +1,3 @@
+--color
+--format specdoc
+--diff
\ No newline at end of file
diff --git a/services/image_factory/aeolus-image/spec/spec_helper.rb b/services/image_factory/aeolus-image/spec/spec_helper.rb
new file mode 100644
index 0000000..52f5553
--- /dev/null
+++ b/services/image_factory/aeolus-image/spec/spec_helper.rb
@@ -0,0 +1,27 @@
+$: << File.expand_path(File.join(File.dirname(__FILE__), "../lib"))
+require 'rubygems'
+require 'config_parser'
+
+module Helpers
+ # Silences any stream for the duration of the block.
+ #
+ # silence_stream(STDOUT) do
+ # puts 'This will never be seen'
+ # end
+ #
+ # puts 'But this will'
+ #
+ # (Taken from ActiveSupport)
+ def silence_stream(stream)
+ old_stream = stream.dup
+ stream.reopen(RUBY_PLATFORM =~ /mswin/ ? 'NUL:' : '/dev/null')
+ stream.sync = true
+ yield
+ ensure
+ stream.reopen(old_stream)
+ end
+end
+
+Spec::Runner.configure do |config|
+ config.include Helpers
+end
--
1.7.4.4
12 years, 10 months
[PATCH 1/3] Upgraded "flash" message display. Fixed headers and object-level controls.
by Kenneth Keiter
Upgraded "flash" message display. Fixed headers and
object-level controls.
---
src/app/stylesheets/layout.scss | 188 +++++++++++++++--------
src/app/views/layouts/_new_notification.haml | 53 +++++++
src/app/views/layouts/application.haml | 7 +-
src/app/views/pools/_header_index.haml | 4 -
src/app/views/pools/_header_show.haml | 11 +-
src/app/views/pools/index.haml | 6 +-
src/public/images/flash_error_icon.png | Bin 0 -> 342 bytes
src/public/images/flash_notice_icon.png | Bin 0 -> 477 bytes
src/public/images/flash_warning_icon.png | Bin 0 -> 404 bytes
src/public/images/header_icon_section-index.png | Bin 0 -> 462 bytes
10 files changed, 186 insertions(+), 83 deletions(-)
create mode 100644 src/app/views/layouts/_new_notification.haml
create mode 100644 src/public/images/flash_error_icon.png
create mode 100644 src/public/images/flash_notice_icon.png
create mode 100644 src/public/images/flash_warning_icon.png
create mode 100644 src/public/images/header_icon_section-index.png
diff --git a/src/app/stylesheets/layout.scss b/src/app/stylesheets/layout.scss
index 2c4628d..310b7fe 100644
--- a/src/app/stylesheets/layout.scss
+++ b/src/app/stylesheets/layout.scss
@@ -1,6 +1,6 @@
/* ###########################################################################
Generated SCSS for Aeolus UI [aeolus_ui]
-Compiled on Fri May 20 10:40:30 +0200 2011
+Compiled on 2011-06-05 21:07:09 -0700
########################################################################### */
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -164,18 +164,9 @@ table {
border-spacing: 0;
}
-thead {
- background: #eee;
-}
-
-th {
- padding-left: 10px;
-}
-
th,
td,
caption {
- padding-left: 10px;
font-weight: normal;
vertical-align: top;
text-align: left;
@@ -188,6 +179,10 @@ svg {
overflow: hidden;
}
+form{
+ display: inline;
+}
+
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Page Layout -- v.0.0.2 [layout] (960.css)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
@@ -640,14 +635,14 @@ Page Layout -- v.0.0.2 [layout] (layout.scss)
$width: 960px;
$font-family-base: "Lucida Sans Unicode", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
$font-family-em: "Lucida Sans", "Lucida Sans Unicode", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
-$font-family-primary: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
+$font-family-primary: Helvetica, Arial, "Lucida Grande", sans-serif;
/* body */
html, body{ height: 100%; }
body{
- background: url('../../images/body-bg.png');
+ background: url('/../../images/body-bg.png');
font-family: $font-family-base;
font-size: 12px; /* 12px base */
color: #333;
@@ -661,30 +656,6 @@ strong, em, b, i{ font-family: $font-family-em; }
margin-bottom: -40px;
}
-/* typography */
-
-.label{
- font-family: $font-family-base;
- font-size: 12px;
-}
-
-.label.micro{ font-size: 9px; }
-.label.small{ font-size: 11px; }
-
-.label.light{
- font-weight: normal;
- color: #666;
-}
-
-.label.strong{
- font-weight: bold;
- color: #333;
-}
-
-.label.caps{
- text-transform: uppercase;
-}
-
/* Content */
$contentpadding: 7px;
@@ -806,7 +777,7 @@ http://github.com/necolas/css3-github-buttons
width: 12px;
height: 12px;
margin: 0 0.75em 0 -0.25em;
- background: url(../../images/button-icons.png) 0 99px no-repeat;
+ background: url(/../../images/button-icons.png) 0 99px no-repeat;
}
.button.arrowup.icon:before { background-position: 0 0; }
@@ -1146,15 +1117,15 @@ div.query-input input[type="text"]{
div.query-input input[type="submit"]{
display:inline;
- background: transparent url('../../images/button-search.png') no-repeat left center;
+ background: transparent url('/../../images/button-search.png') no-repeat left center;
color: transparent;
border: 0px;
width: 25px; height: 25px;
margin-left: -25px;
outline: none;
cursor: pointer;
- &:hover{ background: transparent url('../../images/button-search-over.png') no-repeat left center; }
- &:active{ background: transparent url('../../images/button-search-down.png') no-repeat left center; }
+ &:hover{ background: transparent url('/../../images/button-search-over.png') no-repeat left center; }
+ &:active{ background: transparent url('/../../images/button-search-down.png') no-repeat left center; }
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -1164,9 +1135,8 @@ App Masthead -- v.0.0.2 [masthead] (masthead.scss)
header#masthead{
height: 49px;
background-color: #E7E7E7;
- background: url('../../images/masthead-bg.png') repeat-x;
+ background: url('/../../images/masthead-bg.png') repeat-x;
position: relative;
- margin-bottom: 22px;
img#logo{
position: absolute;
@@ -1182,9 +1152,9 @@ header#masthead{
a.user-dropdown{
border: 1px solid #ccc;
- background: url('../../images/button-userdrop.png') no-repeat center center;
- background: url('../../images/button-userdrop.png') no-repeat center center, -moz-linear-gradient(top, rgba(239,239,239,0), rgba(204,204,204,0));
- background: url('../../images/button-userdrop.png') no-repeat center center, -webkit-gradient(linear,left top,left bottom,color-stop(0, rgb(239,239,239)),color-stop(1, rgb(204,204,204)));
+ background: url('/../../images/button-userdrop.png') no-repeat center center;
+ background: url('/../../images/button-userdrop.png') no-repeat center center, -moz-linear-gradient(top, rgba(239,239,239,0), rgba(204,204,204,0));
+ background: url('/../../images/button-userdrop.png') no-repeat center center, -webkit-gradient(linear,left top,left bottom,color-stop(0, rgb(239,239,239)),color-stop(1, rgb(204,204,204)));
width: 46px;
margin-left: 4px;
padding: 5px 2px 5px 2px;
@@ -1192,9 +1162,9 @@ header#masthead{
font-size: 12px; /* match the font-size of the query box, for proper valign */
&:active{
- background: url('../../images/button-userdrop.png') no-repeat center center;
- background: url('../../images/button-userdrop.png') no-repeat center center, -moz-linear-gradient(top, rgba(232,232,232,0), rgba(210,210,210,0));
- background: url('../../images/button-userdrop.png') no-repeat center center, -webkit-gradient(linear,left top,left bottom,color-stop(0, rgb(232,232,232)),color-stop(1, rgb(210,210,210)));
+ background: url('/../../images/button-userdrop.png') no-repeat center center;
+ background: url('/../../images/button-userdrop.png') no-repeat center center, -moz-linear-gradient(top, rgba(232,232,232,0), rgba(210,210,210,0));
+ background: url('/../../images/button-userdrop.png') no-repeat center center, -webkit-gradient(linear,left top,left bottom,color-stop(0, rgb(232,232,232)),color-stop(1, rgb(210,210,210)));
}
}
@@ -1207,7 +1177,7 @@ header#masthead{
li{ display: inline; }
li + li{ margin-left: 10px; }
li.separator{
- background: url('../../images/masthead-nav-separator.gif') no-repeat left top;
+ background: url('/../../images/masthead-nav-separator.gif') no-repeat left top;
padding: 8px 1px 8px 1px;
}
}
@@ -1216,6 +1186,61 @@ header#masthead{
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Alert Flash -- v.0.0.1 [flash] (flash.scss)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+#flash-hud{
+ width: 944px;
+ margin: 0 auto;
+ background-color: #ddd;
+ -webkit-border-radius: 0px 0px 7px 7px;
+ -moz-border-radius: 0px 0px 7px 7px;
+ border-radius: 0px 0px 7px 7px;
+ border: 1px solid #999;
+ padding: 8px;
+ margin-top: -4px;
+
+ a.control{
+ float: right;
+ color: #999;
+ font-size: 11px;
+ }
+
+ .flash-group{
+ display: table;
+ }
+
+ .flash-subset{
+ display: table-row;
+
+ div.heading{
+ display: table-cell;
+ text-align: right;
+ border-right: 1px solid #ccc;
+ padding-right: 8px;
+ width: 20px;
+ }
+
+ ul{
+ display: table-cell;
+ font-size: 12px;
+ padding-left: 8px;
+ list-style: none;
+
+ li + li{
+ margin-top: 6px;
+ }
+ }
+
+ }
+
+ .flash-group + .flash-group{
+ margin-top: 10px;
+ }
+
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Primary Tab Navigation -- v.0.0.2 [nav_primary] (nav_primary.scss)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
@@ -1224,6 +1249,8 @@ $font-family-nav-primary: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", s
nav#primary {
+ margin-top: 22px;
+
ul.container{
width: 950px;
margin: 0 auto;
@@ -1234,13 +1261,13 @@ nav#primary {
float: left;
position: relative;
display: inline-block;
- background: url('../../images/tab-inactive-right.png') no-repeat right top;
+ background: url('/../../images/tab-inactive-right.png') no-repeat right top;
height: 34px;
margin-right: 6px;
z-index: 1;
a{
display: block;
- background:url('../../images/tab-inactive-left.png') no-repeat left top;
+ background:url('/../../images/tab-inactive-left.png') no-repeat left top;
padding: 10px 16px 14px 16px;
margin-left: -11px;
font-family: $font-family-nav-primary;
@@ -1255,11 +1282,11 @@ nav#primary {
}
li.active{
margin-top: -5px;
- background: url('../../images/tab-active-right.png') no-repeat right top;
+ background: url('/../../images/tab-active-right.png') no-repeat right top;
z-index: 1000;
height: 43px;
a{
- background:url('../../images/tab-active-left.png') no-repeat left top;
+ background:url('/../../images/tab-active-left.png') no-repeat left top;
padding: 12px 20px 12px 20px;
font-size: 16px;
color: #666;
@@ -1320,7 +1347,7 @@ div#content .page-header{
padding: 6px;
position: relative;
z-index: 900;
- background: transparent url('../../images/header_bg.png') repeat-x top center;
+ background: transparent url('/../../images/header_bg.png') repeat-x top center;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.40);
-moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.40);
@@ -1334,11 +1361,36 @@ div#content .page-header{
color: #333;
text-shadow: 1px 1px 0 #fff;
display: inline-block;
+ padding: 6px 7px 7px 54px;
}
h1.pools{
- background: transparent url('../../images/header_icon_pools.png') no-repeat 8px center;
- padding: 6px 7px 7px 54px;
+ background: transparent url('/../../images/header_icon_pools.png') no-repeat 8px center;
+ }
+
+ h1.section-index{
+ background: transparent url('/../../images/header_icon_section-index.png') no-repeat 8px center;
+ }
+
+ h1.users{
+ background: transparent url('/../../images/header_icon_users.png') no-repeat 8px center;
+ }
+
+ h1.roles{
+ background: transparent url('/../../images/header_icon_roles.png') no-repeat 8px center;
+ }
+
+ h1.providers{
+ background: transparent url('/../../images/header_icon_providers.png') no-repeat 8px center;
+ }
+
+ h1.provider-accounts{
+ background: transparent url('/../../images/header_icon_provider-accounts.png') no-repeat 8px center;
+ padding: 6px 7px 7px 60px;
+ }
+
+ h1.settings{
+ background: transparent url('/../../images/header_icon_settings.png') no-repeat 8px center;
}
#obj_actions{
@@ -1350,7 +1402,7 @@ div#content .page-header{
}
.corner{
- background: transparent url('../../images/header_corner.png') no-repeat top center;
+ background: transparent url('/../../images/header_corner.png') no-repeat top center;
width: 10px;
height: 10px;
position: absolute;
@@ -1388,7 +1440,7 @@ $dd_icon_padding_right: 4px;
margin: 0px;
}
ul.groups > li + li{
- background: transparent url('../../images/sb_separator.png') repeat-y 0px 0px;
+ background: transparent url('/../../images/sb_separator.png') repeat-y 0px 0px;
padding-left: 2px;
margin-left: -6px;
}
@@ -1423,52 +1475,52 @@ $dd_icon_padding_right: 4px;
/* icons */
dd.pool{
- background: transparent url('../../images/sb_icon_pool.png') no-repeat $dd_padding 4px;
+ background: transparent url('/../../images/sb_icon_pool.png') no-repeat $dd_padding 4px;
padding-left: ($dd_padding + $dd_icon_padding_right) + 15px;
}
dd.pool.partial{
- background: transparent url('../../images/sb_icon_poolsemi.png') no-repeat $dd_padding 4px;
+ background: transparent url('/../../images/sb_icon_poolsemi.png') no-repeat $dd_padding 4px;
padding-left: ($dd_padding + $dd_icon_padding_right) + 15px;
}
dd.provider{
- background: transparent url('../../images/sb_icon_provider.png') no-repeat $dd_padding 4px;
+ background: transparent url('/../../images/sb_icon_provider.png') no-repeat $dd_padding 4px;
padding-left: ($dd_padding + $dd_icon_padding_right) + 22px;
}
dd.deployment{
- background: transparent url('../../images/sb_icon_deployment.png') no-repeat $dd_padding 4px;
+ background: transparent url('/../../images/sb_icon_deployment.png') no-repeat $dd_padding 4px;
padding-left: ($dd_padding + $dd_icon_padding_right) + 23px;
}
dd.instance{
- background: transparent url('../../images/sb_icon_instance.png') no-repeat $dd_padding 4px;
+ background: transparent url('/../../images/sb_icon_instance.png') no-repeat $dd_padding 4px;
padding-left: ($dd_padding + $dd_icon_padding_right) + 14px;
}
dd.instance.pending{
- background: transparent url('../../images/sb_icon_instance_pending.png') no-repeat $dd_padding 4px;
+ background: transparent url('/../../images/sb_icon_instance_pending.png') no-repeat $dd_padding 4px;
padding-left: ($dd_padding + $dd_icon_padding_right) + 15px;
}
dd.instance.failure{
- background: transparent url('../../images/sb_icon_instance_failure.png') no-repeat $dd_padding 4px;
+ background: transparent url('/../../images/sb_icon_instance_failure.png') no-repeat $dd_padding 4px;
padding-left: ($dd_padding + $dd_icon_padding_right) + 16px;
}
dd.alert{
- background: transparent url('../../images/sb_icon_alert.png') no-repeat $dd_padding 4px;
+ background: transparent url('/../../images/sb_icon_alert.png') no-repeat $dd_padding 4px;
padding-left: ($dd_padding + $dd_icon_padding_right) + 29px;
}
dd.update{
- background: transparent url('../../images/sb_icon_update.png') no-repeat $dd_padding 4px;
+ background: transparent url('/../../images/sb_icon_update.png') no-repeat $dd_padding 4px;
padding-left: ($dd_padding + $dd_icon_padding_right) + 14px;
}
dd.quota{
- background: transparent url('../../images/sb_icon_quota.png') no-repeat $dd_padding 4px;
+ background: transparent url('/../../images/sb_icon_quota.png') no-repeat $dd_padding 4px;
padding-left: ($dd_padding + $dd_icon_padding_right) + 16px;
}
diff --git a/src/app/views/layouts/_new_notification.haml b/src/app/views/layouts/_new_notification.haml
new file mode 100644
index 0000000..7c2f1c5
--- /dev/null
+++ b/src/app/views/layouts/_new_notification.haml
@@ -0,0 +1,53 @@
+#flash-hud
+ %a.control{:href => '#'} Close
+ -if flash[:success]
+ .notice.flash-group
+ .flash-subset
+ %div.heading
+ =image_tag 'flash_notice_icon.png', :alt => 'Notices'
+ %ul.flashes
+ %li= flash[:success]
+
+ -if flash[:notice]
+ .notice.flash-group
+ .flash-subset
+ %div.heading
+ =image_tag 'flash_notice_icon.png', :alt => 'Notices'
+ %ul.flashes
+ %li= flash[:notice]
+
+ -if flash[:warning]
+ .warning.flash-group
+ .flash-subset
+ %div.heading
+ =image_tag 'flash_warning_icon.png', :alt => 'Warnings'
+ %ul.flashes
+ %li= flash[:warning]
+
+ -if flash[:error]
+ -if !flash[:error][:successes].nil? && !flash[:error][:successes].empty?
+ .notice.flash-group
+ .flash-subset
+ %div.heading
+ =image_tag 'flash_notice_icon.png', :alt => 'Notices'
+ %ul.flashes
+ - flash[:error][:successes].each do |k, v|
+ %li= "#{k}: #{v}"
+ .error.flash-group
+ .flash-subset
+ %div.heading
+ =image_tag 'flash_warning_icon.png', :alt => 'Warnings'
+ %ul.flashes
+ %li= flash[:error][:summary]
+ .flash-subset
+ %div.heading
+ =image_tag 'flash_error_icon.png', :alt => 'Errors'
+ %ul.flashes
+ -if flash[:error].kind_of?(String)
+ %li= flash[:error]
+ -elsif !flash[:error][:failures].nil? && !flash[:error][:failures].empty?
+ -flash[:error][:failures].each do |k, v|
+ %li= [k, ': ', v]
+ -else
+ -flash[:error].each do |e|
+ %li= e
\ No newline at end of file
diff --git a/src/app/views/layouts/application.haml b/src/app/views/layouts/application.haml
index 63228ec..7000c7e 100644
--- a/src/app/views/layouts/application.haml
+++ b/src/app/views/layouts/application.haml
@@ -9,7 +9,7 @@
= stylesheet_link_tag '/stylesheets/compiled/layout.css'
= stylesheet_link_tag 'jquery.ui-1.8.1/jquery-ui-1.8.1.custom.css'
/[if lt IE 9]
- = stylesheet_link_tag 'http://html5shiv.googlecode.com/svn/trunk/html5.js'
+ = javascript_include_tag 'http://html5shiv.googlecode.com/svn/trunk/html5.js'
= stylesheet_link_tag '/stylesheets/layout_ie.css'
= stylesheet_link_tag '/stylesheets/compiled/custom.css'
@@ -25,7 +25,9 @@
%header#masthead
= render :partial => 'layouts/masthead'
-
+
+ = render :partial => '/layouts/new_notification' unless flash.empty?
+
%nav#primary
%ul.container
- # NOTE this is a hack to implement switching between the top-level
@@ -41,7 +43,6 @@
#content
-# works with any 960 container (.container_16 or .container_24)
= render :partial => 'layouts/nav_history'
- = render :partial => '/layouts/notification'
= yield
%footer.standard
diff --git a/src/app/views/pools/_header_index.haml b/src/app/views/pools/_header_index.haml
index d2a1b1b..e69de29 100644
--- a/src/app/views/pools/_header_index.haml
+++ b/src/app/views/pools/_header_index.haml
@@ -1,4 +0,0 @@
-%header.page-header
- %h1.pools Overview
- -# Insert appropriate controls here, or ommit %ul.controls
- .corner
\ No newline at end of file
diff --git a/src/app/views/pools/_header_show.haml b/src/app/views/pools/_header_show.haml
index 2ea3cac..1bed938 100644
--- a/src/app/views/pools/_header_show.haml
+++ b/src/app/views/pools/_header_show.haml
@@ -1,13 +1,10 @@
%header.page-header
%h1.pools
- = @pool.name
- Pool
- -# Insert appropriate controls here, or ommit %ul.controls
+ = [@pool.name, "Pool"].join(' ')
#obj_actions.button-container
= link_to 'New Deployment', launch_new_deployments_path, :class => 'button primary', :id => 'new_deployment_button'
- .button-group
+ -# ditch form_for since it doesn't allow specification of a CSS class.
+ %form.button-group{:action => pool_url(@pool), :method => 'POST'}
= link_to 'Edit', edit_pool_path(@pool), :class => 'button pill', :id => 'edit_pool_button'
- - form_tag do
- = hidden_field(@pool, :id)
- = restful_submit_tag('Delete', 'destroy', pool_url(@pool), 'DELETE', :class => "button pill danger")
+ = restful_submit_tag('Delete', 'destroy', pool_url(@pool), 'DELETE', :class => "button pill danger")
.corner
diff --git a/src/app/views/pools/index.haml b/src/app/views/pools/index.haml
index 99cb71d..a89b180 100644
--- a/src/app/views/pools/index.haml
+++ b/src/app/views/pools/index.haml
@@ -1,4 +1,8 @@
-= render :partial => 'header_index'
+%header.page-header
+ %h1.section-index Overview
+ -# Insert appropriate controls here, or ommit %ul.controls
+ .corner
+
= render :partial => 'scoreboard_index'
= render :partial => 'alerts_index'
= pretty_filter_toggle(pools_path(:view => 'pretty'), pools_path(:view => 'filter'))
diff --git a/src/public/images/flash_error_icon.png b/src/public/images/flash_error_icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..f2667d5fb1a0a6a54eeea02efb6ef2590ef85b53
GIT binary patch
literal 342
zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|mSQK*5Dp-y;YjHK@;M7UB8wRq
zxPc0}g%~g0t@{HMlqqqIC<)F_D=AMbN@Z|N$xljEaLX)8Ezd8?E>>_3HZ9!x*bJyn
z1f<TnC^fMpGe1uuBr`Xa!A##w-_X#zK*kj)zroYRF~p*G?UjqXhZICwAId*s$a~~0
z$)J8Pu!O~YgS15x^M^~myAFO`IzviOukrJhg4z1)PT4n94+&N<s(+d(8}p4@iK!vi
zfx)T8Jug9ef>N6H3E3T)2GN<HN(!!;Y-V+tyrI1<MWSTInOc_hjXo?dGmSbWR^-2Z
zb0EWk`;2Vsv@Zz^+kOlD+Z*ffM`hD8w;cH-@6D_q_^xgFV7Zv>4g1fgDG_3f1~2O`
e%}zA`&AY18kdw!I-fW=T89ZJ6T-G@yGywqBMt92q
literal 0
HcmV?d00001
diff --git a/src/public/images/flash_notice_icon.png b/src/public/images/flash_notice_icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..d0b17db9b834aabb024831be36194e0f839f4088
GIT binary patch
literal 477
zcmV<30V4j1P)<h;3K|Lk000e1NJLTq000sI000vR1^@s6oswPh00004b3#c}2nYxW
zd<bNS00009a7bBm000XT000XT0n*)m`~Uy|9CSrkbW?9;ba!ELWdK2BZ(?O2Mrm?o
zcW-iQb09-gHF34$HUIzs6m&&cbVG7wVRUJ4ZXi@?ZDjy9FE%eRF-ve9MF0Q+H%UZ6
zR5*>5l)ZU_Fc5}c@~96RgbgUH-fR%OfoW)yOc0L%rByKknIH^6;Sm@?8<2v-mO=dF
zYjm9M-se8)K|$a5j0%E)y~<lcpavo!Rl7Uqx&TLsKLephz<Eb=VKg>xNq}D`e^Q?0
zl1hPuK;`7?>!Gg|P>c!Swg!^50^TIHKn9?I7{F*wTO;KyDe&&3vg@I@054n34rFG@
zXzKApd5SMGa$z*q*{*<BiSL$1O(!}7AHX-z2-s^$4nAE1bxs@$ESgv<ji#PjeFBMR
zcjVY;I>%DSU>%;V&JWvYDi@Zw^v-tXoSSRae``~is5F|!SHB4Iz-~M&dA0h}3anbI
z*_`OVQa}SFc}pYl9woBg>lN_D@b@2iyf1rXr5AwlJqj7FGujF1fFGl=;|u!--^yZT
TXV2Oy00000NkvXXu0mjfC7!&Q
literal 0
HcmV?d00001
diff --git a/src/public/images/flash_warning_icon.png b/src/public/images/flash_warning_icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..4dc710819d051fbd0a8e796e5b2cadb5d4cb17f2
GIT binary patch
literal 404
zcmeAS@N?(olHy`uVBq!ia0vp^f<P?5!3HEh7*2@?QY^(zo*^7SP{WbZ0pxQQctjR6
zFmMZjFyp1Wb$@_@G9|7NCBgY=CFO}lsSJ)O`AMk?Zka`?<@rU~#R|^BriEJ{n*r5{
zfYdn`r6!hS=I1GdWag$anCYA88yb2S$hZRK-+8(?hFJ72opdnpuz`T<{i+@9d`VUb
zZmbqB6=Yi`pL@q}kx}NN=1LV!g;|`U4x9^{o*uAz%&9GO!v5y!yU*1lom8a`Get16
zCn)ZGbJs3(7T1Go48jRqHrMUgeh4fuKQO^BxnhSzlGxtMv;QScaud@(Fxl4Ml#Rb{
zPQ;c2zgL({kJ%>GeCxOR1uwn!$34XxLQ_w(q_1}GI99-~bKZfW%J?7W!!!9d8$BO4
z%{a<)!-DznLOZMM@=2%LR~03<J~6r4*1o1e(jj^Jiq$6PRK-`WDc#0AD_%#>lWD?5
q*&p$7<(C-p!xgUGSF4)KaX?(n*!iJT=x$IjGkCiCxvX<aXaWG2%9BR`
literal 0
HcmV?d00001
diff --git a/src/public/images/header_icon_section-index.png b/src/public/images/header_icon_section-index.png
new file mode 100644
index 0000000000000000000000000000000000000000..de3c1fc5ed501735f7273ce2bdc7cf5d88462682
GIT binary patch
literal 462
zcmeAS@N?(olHy`uVBq!ia0vp^azL!c!3HEROKK+pDVAa<&kznEsNqQI0P;BtJR*x3
z7`TN%nDNrxx<5ccnG)BClHmNblJdl&R0hYC{G?O`x6Go{^8BLgVg=`5)55Kf&4B7e
zK<b=}QWHxu^Yau!GILWI%=FFl4Gp~uWLy~-7&Say977^n-(I_z+iW0k>|_0^ebad_
z<vEyT>|nekc#HQCThD~N3pp29`7EU`@V;Ps$MS{I-IY(#i)9)AKNb5QI$x|6lQ#!k
zZQH-b^@u^@tYuH%Epuu6l>cDuDz)MR(hI__o|KNLn7w+o{DaH9%1UKCA9n0)OR&H1
z@b+qt`FaNK2*H)dn)1(1&px(eCu0uB4*lPjcIw<Y&l^7LoX*L(krMfhG0|U-dylNT
z;=^*mmClE!c8J_{(y;i>z3@Sa-j0B)$1NYQCz!K5-@^V^<mQT3r!98~O%(lb>ZPxV
zTUlzPTCD+t(kAhV>ItsDyUuug5Yl+?C2G%)=`YPrZc5i=6*3Q6|17<>K6HPBb?vKp
zOAqf%w>m2)UAa$cpX%H+{*U{u4hi-Zv?$jY?tk|!U32<|Mb^MDW$<+Mb6Mw<&;$VG
C{I%}@
literal 0
HcmV?d00001
--
1.7.4.4
12 years, 10 months
in-progress changes to support launching via new XML deployable format
by Scott Seago
Initial support to launch with the new xml-backed Deployble format. This is a work in progress -- it's not tested yet (beyond the UI form) due to ongoing debugging in the IWHD client backend, but I wanted to get this out here with my progress to date.
There are only 3 patches -- patch 1/4 is the IWHD client patch for tsk 1601 that's already on the list (and must be applied before these 3)
12 years, 10 months
#1605 - New deployment UI (v2)
by Matt Wagner
Hi,
This is only partially for review; I suspect Scott will want to build on it a bit before we commit, since right now it doesn't actually have the ability to *launch* a deployment, only to collect the requisite information and then render an error message.
This go-around should be "less savage" than the previous one which broke all the old deployment code on the understanding that it was deprecated. That was mostly correct, but we weren't ready to actually break it all just yet.
Some notes:
* I fixed the failing tests. Some of the tests around authentication started failing because there are no logout or edit profile links. They contain the step "Given I am on the homepage", which maps to a URL of / (relative to your path, at least; /conductor for most of us). Bizarrely, this gets treated as Deployments#index, maybe because it's first in routes? I cheated here and just changed these references from "the homepage" to "the legacy assemblies page" which still uses the old UI. (We do, however, need to add links to log out and edit your profile at some point!)
* All of Deployments was dragged kicking and screaming into the new UI. Mostly it went well, but I cheated slightly on #show, knowing that we're going to want to change this very soon anyway. It was using details_tab which doesn't work with this layout; I instead just render the :properties partial which seems to have enough information to be useful and get tests passing.
* On the first page, you input the URL containing a deployable definition and you name your deployment. Then you're taken to a second page before you save. I pass these parameters through as hidden form fields. This makes some sense, but one of those hidden form fields is now a blob of XML, which feels slightly crazy. Scott and I talked briefly about this; long-term (perhaps next week), I think we want a way to store this stuff server-side as a temporary object rather than passing all the data back and forth. It seems that the page state might be doing something similar that we could adapt.
* The silly little AJAX check if your pool name is available has a potential race condition that tsedovic spotted -- since we do a GET in the background for each keystroke and then update when we get a response, there's really no guarantee that they'll come back in order. For now I've put a comment in that this needs fixing. I suspect we'll want to do this sort of thing in many places, so we might want to build a nifty little method in application.js that would wait until perhaps ~250ms after typing ceased, and then go off and hit a URL to validate the field, and return something including the field name so we can tell if it's still valid, e.g., {'name' => 'foo', 'valid' => 'true'}. This would probably imply building an array of these values so that replies arriving out of order wouldn't matter. But for today, this is insanely too much work -- worst case, we tell you a name is available when it's not, and you have to change it on the next page, which would happen anyway if w!
e didn't do AJAX validation and you used an existing name.
Anyway, enjoy the weekend!
-- Matt
12 years, 10 months
[PATCH 3/3] Improved breadcrumb slightly by allowing clear. Tidied up administer section, and applied example treatment to Users controller.
by Kenneth Keiter
Improved breadcrumb slightly by allowing clear. Tidied
up administer section, and applied example treatment to
Users controller.
---
src/app/controllers/application_controller.rb | 10 ++-
src/app/controllers/pools_controller.rb | 5 +-
src/app/controllers/users_controller.rb | 3 +
src/app/stylesheets/layout.scss | 6 +-
src/app/views/layouts/_admin_header.haml | 40 +++++-
src/app/views/users/_list.haml | 57 ++++----
src/app/views/users/_properties.haml | 187 ++++++++++++-------------
src/app/views/users/_section_header.haml | 5 +
src/app/views/users/edit.haml | 27 +++-
src/app/views/users/index.haml | 4 +-
src/app/views/users/new.haml | 19 ++-
src/app/views/users/show.haml | 19 +++-
12 files changed, 233 insertions(+), 149 deletions(-)
create mode 100644 src/app/views/users/_section_header.haml
diff --git a/src/app/controllers/application_controller.rb b/src/app/controllers/application_controller.rb
index cb4a1d3..a5ed6af 100644
--- a/src/app/controllers/application_controller.rb
+++ b/src/app/controllers/application_controller.rb
@@ -234,13 +234,21 @@ class ApplicationController < ActionController::Base
session[:return_to] = nil
end
+ ############################################################################
+ # Breadcrumb-Related functionality
+ ############################################################################
+
+ def clear_breadcrumbs
+ session[:breadcrumbs] = []
+ end
+
def shift_breadcrumbs
session[:breadcrumbs] ||= []
shifted_breadcrumb = session[:breadcrumbs].shift unless session[:breadcrumbs].length < 3 || request.request_uri == session[:breadcrumbs].last[:path]
#TODO waiting for the ViewState to be implemented
#ViewState.find(shifted_breadcrumb[:viewstate]).mark_for_deletion if shifted_breadcrumb[:viewstate]
end
-
+
def save_breadcrumb(path, name = controller_name)
session[:breadcrumbs] ||= []
breadcrumbs = session[:breadcrumbs]
diff --git a/src/app/controllers/pools_controller.rb b/src/app/controllers/pools_controller.rb
index 2aee5ff..2108fd8 100644
--- a/src/app/controllers/pools_controller.rb
+++ b/src/app/controllers/pools_controller.rb
@@ -14,7 +14,7 @@ class PoolsController < ApplicationController
end
def index
- save_breadcrumb(pools_path(:viewstate => @viewstate ? @viewstate.id : nil))
+ clear_breadcrumbs
@user_pools = Pool.list_for_user(current_user, Privilege::VIEW)
if filter_view?
@@ -45,12 +45,12 @@ class PoolsController < ApplicationController
format.html
format.json { render :json => @pools }
end
+ save_breadcrumb(pools_path(:viewstate => @viewstate ? @viewstate.id : nil))
end
def show
@pool = Pool.find(params[:id])
require_privilege(Privilege::VIEW, @pool)
- save_breadcrumb(pool_path(@pool), @pool.name)
@statistics = @pool.statistics
@view = params[:view] == 'filter' ? 'deployments/filter_view' : 'deployments/pretty_view'
respond_to do |format|
@@ -58,6 +58,7 @@ class PoolsController < ApplicationController
format.html { render :action => :show}
format.json { render :json => @pool }
end
+ save_breadcrumb(pool_path(@pool), @pool.name)
end
def new
diff --git a/src/app/controllers/users_controller.rb b/src/app/controllers/users_controller.rb
index 3cfbbc5..0a37468 100644
--- a/src/app/controllers/users_controller.rb
+++ b/src/app/controllers/users_controller.rb
@@ -8,7 +8,9 @@ class UsersController < ApplicationController
end
def index
+ clear_breadcrumbs
require_privilege(Privilege::VIEW, User)
+ save_breadcrumb(users_path, "Users")
@params = params
@search_term = params[:q]
if @search_term.blank?
@@ -68,6 +70,7 @@ class UsersController < ApplicationController
end
format.html
end
+ save_breadcrumb(user_path(@user), [@user.first_name, @user.last_name].join(' ').titlecase)
end
def edit
diff --git a/src/app/stylesheets/layout.scss b/src/app/stylesheets/layout.scss
index 466e101..a4a9be9 100644
--- a/src/app/stylesheets/layout.scss
+++ b/src/app/stylesheets/layout.scss
@@ -1,6 +1,6 @@
/* ###########################################################################
Generated SCSS for Aeolus UI [aeolus_ui]
-Compiled on 2011-06-06 20:38:44 -0700
+Compiled on 2011-06-06 21:29:07 -0700
########################################################################### */
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -1836,6 +1836,10 @@ section.content-section{
}
+header.page-header + section.content-section{
+ margin-top: 36px;
+}
+
section.content-section + section.content-section {
margin-top: 36px;
}
diff --git a/src/app/views/layouts/_admin_header.haml b/src/app/views/layouts/_admin_header.haml
index 2989e44..3b5c935 100644
--- a/src/app/views/layouts/_admin_header.haml
+++ b/src/app/views/layouts/_admin_header.haml
@@ -1,7 +1,33 @@
-%nav#admin_subsections
- = render_navigation({:expand_all => true, :level => 2})
-%header.page-header
- %h1{:class => controller_name}
- = controller_name.titleize
- -# Insert appropriate controls here, or ommit %ul.controls
- .corner
+-#We'll figure out a better way to deal with this later.
+%noscript
+ %nav#admin_subsections
+ = render_navigation({:expand_all => true, :level => 2})
+
+-# TODO: Actually design nav for the Administer section.
+-# Ugly hack to avoid moving files around for the moment.. Abs position the nav :/
+#tab_actions{:style => "float: right; position: absolute; top: 10px; right: 10px;"}
+ %span.label.small Control Panels
+ %select#admin-section-select
+ %option{:value => users_path} Choose section...
+ %option{:value => users_path} Users
+ %option{:value => roles_path} Roles
+ %option{:value => providers_path} Providers
+ %option{:value => provider_accounts_path} Provider Accounts
+ %option{:value => hardware_profiles_path} Hardware Profiles
+ %option{:value => realms_path} Realms
+ %option{:value => pool_families_path} Pool Families
+ %option{:value => settings_path} Settings
+
+- unless controller.controller_name == 'users'
+ %header.page-header
+ %h1{:class => controller.controller_name}= controller.controller_name.titlecase
+ -##obj_actions.button-group
+ -#= link_to 'New Object', new_object_url, :class => 'button primary', :id => 'new_object_button'
+ .corner
+
+:javascript
+ $(document).ready(function() {
+ $('select#admin-section-select').change(function() {
+ window.location = $(this).val();
+ });
+ });
\ No newline at end of file
diff --git a/src/app/views/users/_list.haml b/src/app/views/users/_list.haml
index 08282aa..f7e6475 100644
--- a/src/app/views/users/_list.haml
+++ b/src/app/views/users/_list.haml
@@ -1,29 +1,34 @@
-- form_tag do
- = link_to "Create", new_user_url, :class => 'button'
- = restful_submit_tag "Delete", 'destroy', multi_destroy_users_path, 'DELETE', :id => 'delete_button', :class => 'button'
+%section.content-section.users
+ %header
+ %h2 Enabled Users
+ %span.label.badge.dark.count= @users.length
- %table#users_table
- %thead
- %tr
- %th
- %th= link_to "User ID", users_url(:sort_by => "login")
- %th= link_to "Last Name", users_url(:sort_by => "last_name")
- %th= link_to "First Name", users_url(:sort_by => "first_name")
- %th= link_to "% Quota Used", users_url(:sort_by => "percentage_quota_used")
- %th
- =link_to "Quota", users_url(:sort_by => "quota")
- %span (Instances)
- %th= link_to "e-mail", users_url(:sort_by => "email")
- -(a)users.each do |user|
- %tr
- %td
- %input{:name => "user_selected[]", :type => "checkbox", :value => user.id, :id => "user_checkbox_#{user.id}" }
- %td= link_to user.login, user_path(user)
- %td= user.last_name
- %td= user.first_name
- %td= sprintf("%.2f", user.quota.percentage_used)
- %td= Quota.no_limit(user.quota.maximum_running_instances) ? "Unlimited" : user.quota.maximum_running_instances
- %td= user.email
+ .content
+ - form_tag do
+ = restful_submit_tag "Delete", 'destroy', multi_destroy_users_path, 'DELETE', :id => 'delete_button', :class => 'button'
+
+ %table#users_table
+ %thead
+ %tr
+ %th.ignore
+ %th= link_to "User ID", users_url(:sort_by => "login")
+ %th= link_to "Last Name", users_url(:sort_by => "last_name")
+ %th= link_to "First Name", users_url(:sort_by => "first_name")
+ %th= link_to "% Quota Used", users_url(:sort_by => "percentage_quota_used")
+ %th
+ =link_to "Quota", users_url(:sort_by => "quota")
+ %span (Instances)
+ %th= link_to "e-mail", users_url(:sort_by => "email")
+ -(a)users.each do |user|
+ %tr{:class => cycle('stripe')}
+ %td
+ %input{:name => "user_selected[]", :type => "checkbox", :value => user.id, :id => "user_checkbox_#{user.id}" }
+ %td= link_to user.login, user_path(user)
+ %td= user.last_name
+ %td= user.first_name
+ %td= sprintf("%.2f", user.quota.percentage_used)
+ %td= Quota.no_limit(user.quota.maximum_running_instances) ? "Unlimited" : user.quota.maximum_running_instances
+ %td= user.email
:javascript
$(document).ready(function () {
@@ -37,4 +42,4 @@
}
}
});
- });
+ });
\ No newline at end of file
diff --git a/src/app/views/users/_properties.haml b/src/app/views/users/_properties.haml
index 33799be..c0ebc58 100644
--- a/src/app/views/users/_properties.haml
+++ b/src/app/views/users/_properties.haml
@@ -1,98 +1,93 @@
-.grid_13
- %h2 #{(a)user.first_name} #{(a)user.last_name} (#{(a)user.login})
+%table
+ %thead
+ %tr
+ %th.show
+ Personal Details
+ %th.show
+ %tbody
+ %tr
+ %td
+ %label Username
+ %td
+ = @user.login
+ %tr
+ %td
+ %label First Name
+ %td
+ = @user.first_name
+ %tr
+ %td
+ %label Last Name
+ %td
+ = @user.last_name
+ %tr
+ %td
+ %label e-mail
+ %td
+ = @user.email
- = link_to 'Edit', edit_user_path(@user), :class => 'button'
+%table
+ %thead
+ %tr
+ %th.show
+ Quota Status
+ %th.show
+ %tbody
+ %tr
+ %td
+ %label Maximum
+ %td
+ = @quota_resources["running_instances"].max
+ %tr
+ %td
+ %label Used
+ %td
+ = @quota_resources["running_instances"].used
+ %tr
+ %td
+ %label Available
+ %td
+ = @quota_resources["running_instances"].available
- %table
- %thead
- %tr
- %th.show
- Personal Details
- %th.show
- %tbody
- %tr
- %td
- %label Username
- %td
- = @user.login
- %tr
- %td
- %label First Name
- %td
- = @user.first_name
- %tr
- %td
- %label Last Name
- %td
- = @user.last_name
- %tr
- %td
- %label e-mail
- %td
- = @user.email
-
- %table
- %thead
- %tr
- %th.show
- Quota Status
- %th.show
- %tbody
- %tr
- %td
- %label Maximum
- %td
- = @quota_resources["running_instances"].max
- %tr
- %td
- %label Used
- %td
- = @quota_resources["running_instances"].used
- %tr
- %td
- %label Available
- %td
- = @quota_resources["running_instances"].available
-
- %table
- %thead
- %tr
- %th.show
- Login Information
- %th.show
- %tbody
- %tr
- %td
- %label Current Login IP
- %td
- = @user.current_login_ip
- %tr
- %td
- %label Current Login at
- %td
- = @user.current_login_at
- %tr
- %td
- %label Last Login IP
- %td
- = @user.last_login_ip
- %tr
- %td
- %label Last Login at
- %td
- = @user.last_login_at
- %tr
- %td
- %label Login Count
- %td
- = @user.login_count
- %tr
- %td
- %label Failed Login Count
- %td
- = @user.login_count
- %tr
- %td
- %label Last Request at
- %td
- = @user.last_request_at
+%table
+ %thead
+ %tr
+ %th.show
+ Login Information
+ %th.show
+ %tbody
+ %tr
+ %td
+ %label Current Login IP
+ %td
+ = @user.current_login_ip
+ %tr
+ %td
+ %label Current Login at
+ %td
+ = @user.current_login_at
+ %tr
+ %td
+ %label Last Login IP
+ %td
+ = @user.last_login_ip
+ %tr
+ %td
+ %label Last Login at
+ %td
+ = @user.last_login_at
+ %tr
+ %td
+ %label Login Count
+ %td
+ = @user.login_count
+ %tr
+ %td
+ %label Failed Login Count
+ %td
+ = @user.login_count
+ %tr
+ %td
+ %label Last Request at
+ %td
+ = @user.last_request_at
diff --git a/src/app/views/users/_section_header.haml b/src/app/views/users/_section_header.haml
new file mode 100644
index 0000000..aae9613
--- /dev/null
+++ b/src/app/views/users/_section_header.haml
@@ -0,0 +1,5 @@
+%header.page-header
+ %h1{:class => controller.controller_name} Users
+ #obj_actions.button-group
+ = link_to 'New User', new_user_url, :class => 'button primary', :id => 'new_user_button'
+ .corner
\ No newline at end of file
diff --git a/src/app/views/users/edit.haml b/src/app/views/users/edit.haml
index b3d0dc2..4f4173b 100644
--- a/src/app/views/users/edit.haml
+++ b/src/app/views/users/edit.haml
@@ -1,7 +1,22 @@
-- if check_privilege(Privilege::MODIFY, User)
- %h2 Editing User: #{(a)user.first_name} #{(a)user.last_name}
-- else
- %h2 Editing Account
+= render :partial => 'layouts/admin_header'
-- form_for @user, :url => user_path(@user), :html => { :method => :put } do |f|
- = render :partial => "form", :locals => { :form => f, :cancel_path => users_path }
+%header.page-header
+ %h1{:class => controller.controller_name}= [@user.first_name, @user.last_name].join(' ').titlecase
+ #obj_actions.button-container
+ = link_to 'New User', new_user_url, :class => 'button primary', :id => 'new_user_button'
+ %div.button-group
+ = link_to 'Cancel Editing', user_path(@user), :class => 'button pill danger', :id => 'new_user_button'
+ .corner
+
+%section.content-section.user
+ %header
+ %h2 Properties
+
+ .content
+ - if check_privilege(Privilege::MODIFY, User)
+ %h2 Editing User: #{(a)user.first_name} #{(a)user.last_name}
+ - else
+ %h2 Editing Account
+
+ - form_for @user, :url => user_path(@user), :html => { :method => :put } do |f|
+ = render :partial => "form", :locals => { :form => f, :cancel_path => users_path }
diff --git a/src/app/views/users/index.haml b/src/app/views/users/index.haml
index acfa09b..55fac46 100644
--- a/src/app/views/users/index.haml
+++ b/src/app/views/users/index.haml
@@ -1,3 +1,3 @@
= render :partial => 'layouts/admin_header'
-%div#view
- = render :partial => 'list'
+= render :partial => 'section_header'
+= render :partial => 'list'
diff --git a/src/app/views/users/new.haml b/src/app/views/users/new.haml
index 976f130..26befe6 100644
--- a/src/app/views/users/new.haml
+++ b/src/app/views/users/new.haml
@@ -1,6 +1,13 @@
-%h2 New Account
-- form_for @user, :url => users_path do |f|
- -if current_user
- = render :partial => "form", :locals => { :form => f, :cancel_path => users_path }
- -else
- = render :partial => "form", :locals => { :form => f, :cancel_path => login_path }
+= render :partial => 'layouts/admin_header'
+= render :partial => 'section_header'
+
+%section.content-section.users
+ %header
+ %h2 New Account
+
+ .content
+ - form_for @user, :url => users_path do |f|
+ -if current_user
+ = render :partial => "form", :locals => { :form => f, :cancel_path => users_path }
+ -else
+ = render :partial => "form", :locals => { :form => f, :cancel_path => login_path }
diff --git a/src/app/views/users/show.haml b/src/app/views/users/show.haml
index 2eadbfd..e99ea79 100644
--- a/src/app/views/users/show.haml
+++ b/src/app/views/users/show.haml
@@ -1,3 +1,18 @@
= render :partial => 'layouts/admin_header'
-%div#view
- = render :partial => 'properties'
+%header.page-header
+ %h1{:class => controller.controller_name}= [@user.first_name, @user.last_name].join(' ').titlecase
+ #obj_actions.button-container
+ = link_to 'New User', new_user_url, :class => 'button primary', :id => 'new_user_button'
+ %form.button-group{:action => user_url(@user), :method => 'POST'}
+ = link_to 'Edit', edit_user_path(@user), :class => 'button pill'
+ %input{:name => "user_selected[]", :type => "hidden", :value => @user.id}
+ = restful_submit_tag('Delete', 'destroy', multi_destroy_users_path, 'DELETE', :class => "button pill danger")
+ .corner
+
+%section.content-section.user
+ %header
+ %h2 Properties
+
+ .content
+ %div#view
+ = render :partial => 'properties'
\ No newline at end of file
--
1.7.4.4
12 years, 10 months
PATCH 2/3] Implemented expandable pool "pretty view" bar. Fixed alerting on the pools pretty page.
by Kenneth Keiter
Implemented expandable pool "pretty view" bar. Fixed
alerting on the pools pretty page.
---
src/app/stylesheets/layout.scss | 709 ++++++++++++++++++-
src/app/views/pools/_alerts_index.haml | 20 +-
src/app/views/pools/_pretty_list.haml | 75 ++-
src/app/views/pools/index.haml | 11 +-
src/public/images/alert_icon_critical.png | Bin 0 -> 337 bytes
src/public/images/alert_icon_warn.png | Bin 0 -> 364 bytes
src/public/images/alert_icon_warn_white.png | Bin 0 -> 329 bytes
.../images/header_icon_provider-accounts.png | Bin 0 -> 662 bytes
src/public/images/header_icon_provider.png | Bin 0 -> 505 bytes
src/public/images/header_icon_providers.png | Bin 0 -> 505 bytes
src/public/images/header_icon_roles.png | Bin 0 -> 1274 bytes
src/public/images/header_icon_settings.png | Bin 0 -> 666 bytes
src/public/images/header_icon_users.png | Bin 0 -> 649 bytes
src/public/images/pool_bar_expand-btn.png | Bin 0 -> 2799 bytes
src/public/images/pool_bar_icon-normal.png | Bin 0 -> 386 bytes
src/public/images/pool_bar_name-bg-alert.png | Bin 0 -> 842 bytes
src/public/images/pool_bar_name-bg-normal.png | Bin 0 -> 750 bytes
src/public/images/pool_bar_prop-gradient.png | Bin 0 -> 229 bytes
src/public/images/section-border.png | Bin 0 -> 193 bytes
19 files changed, 731 insertions(+), 84 deletions(-)
create mode 100644 src/public/images/alert_icon_critical.png
create mode 100644 src/public/images/alert_icon_warn.png
create mode 100644 src/public/images/alert_icon_warn_white.png
create mode 100644 src/public/images/header_icon_provider-accounts.png
create mode 100644 src/public/images/header_icon_provider.png
create mode 100644 src/public/images/header_icon_providers.png
create mode 100644 src/public/images/header_icon_roles.png
create mode 100644 src/public/images/header_icon_settings.png
create mode 100644 src/public/images/header_icon_users.png
create mode 100644 src/public/images/pool_bar_expand-btn.png
create mode 100644 src/public/images/pool_bar_icon-normal.png
create mode 100644 src/public/images/pool_bar_name-bg-alert.png
create mode 100644 src/public/images/pool_bar_name-bg-normal.png
create mode 100644 src/public/images/pool_bar_prop-gradient.png
create mode 100644 src/public/images/section-border.png
diff --git a/src/app/stylesheets/layout.scss b/src/app/stylesheets/layout.scss
index 310b7fe..466e101 100644
--- a/src/app/stylesheets/layout.scss
+++ b/src/app/stylesheets/layout.scss
@@ -1,6 +1,6 @@
/* ###########################################################################
Generated SCSS for Aeolus UI [aeolus_ui]
-Compiled on 2011-06-05 21:07:09 -0700
+Compiled on 2011-06-06 20:38:44 -0700
########################################################################### */
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -642,7 +642,7 @@ $font-family-primary: Helvetica, Arial, "Lucida Grande", sans-serif;
html, body{ height: 100%; }
body{
- background: url('/../../images/body-bg.png');
+ background: url('/images/body-bg.png');
font-family: $font-family-base;
font-size: 12px; /* 12px base */
color: #333;
@@ -777,7 +777,7 @@ http://github.com/necolas/css3-github-buttons
width: 12px;
height: 12px;
margin: 0 0.75em 0 -0.25em;
- background: url(/../../images/button-icons.png) 0 99px no-repeat;
+ background: url(/images/button-icons.png) 0 99px no-repeat;
}
.button.arrowup.icon:before { background-position: 0 0; }
@@ -1117,15 +1117,75 @@ div.query-input input[type="text"]{
div.query-input input[type="submit"]{
display:inline;
- background: transparent url('/../../images/button-search.png') no-repeat left center;
+ background: transparent url('/images/button-search.png') no-repeat left center;
color: transparent;
border: 0px;
width: 25px; height: 25px;
margin-left: -25px;
outline: none;
cursor: pointer;
- &:hover{ background: transparent url('/../../images/button-search-over.png') no-repeat left center; }
- &:active{ background: transparent url('/../../images/button-search-down.png') no-repeat left center; }
+ &:hover{ background: transparent url('/images/button-search-over.png') no-repeat left center; }
+ &:active{ background: transparent url('/images/button-search-down.png') no-repeat left center; }
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Textual Labels -- v.0.0.1 [label] (label.scss)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+$font-family-base: "Lucida Sans Unicode", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
+$font-family-em: "Lucida Sans", "Lucida Sans Unicode", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
+$font-family-primary: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
+
+.label{
+ font-family: $font-family-base;
+ font-size: 12px;
+}
+
+.label.micro{ font-size: 9px; }
+.label.small{ font-size: 11px; }
+
+.label.invert{
+ color: #fff;
+}
+
+.label.light{
+ font-weight: normal;
+ color: #666;
+}
+
+.label.strong{
+ font-weight: bold;
+ color: #333;
+}
+
+.label.caps{
+ text-transform: uppercase;
+}
+
+.label.badge{
+ display: inline-block;
+ -webkit-border-radius: 8px; -moz-border-radius: 8px; border-radius: 8px;
+ background-color: #efefef;
+ border: 1px solid transparent;
+ padding: 0px 4px 0px 4px;
+ min-width: 10px;
+ font-size: 11px;
+ color: #000;
+ font-family: $font-family-primary;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.50);
+ -moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.50);
+ -webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.50);
+ text-align: center;
+}
+
+.label.badge.alert{
+ background-color: #c00;
+ color: #fff;
+}
+
+.label.badge.dark{
+ color: #fff;
+ background: #333;
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -1135,7 +1195,7 @@ App Masthead -- v.0.0.2 [masthead] (masthead.scss)
header#masthead{
height: 49px;
background-color: #E7E7E7;
- background: url('/../../images/masthead-bg.png') repeat-x;
+ background: url('/images/masthead-bg.png') repeat-x;
position: relative;
img#logo{
@@ -1152,9 +1212,9 @@ header#masthead{
a.user-dropdown{
border: 1px solid #ccc;
- background: url('/../../images/button-userdrop.png') no-repeat center center;
- background: url('/../../images/button-userdrop.png') no-repeat center center, -moz-linear-gradient(top, rgba(239,239,239,0), rgba(204,204,204,0));
- background: url('/../../images/button-userdrop.png') no-repeat center center, -webkit-gradient(linear,left top,left bottom,color-stop(0, rgb(239,239,239)),color-stop(1, rgb(204,204,204)));
+ background: url('/images/button-userdrop.png') no-repeat center center;
+ background: url('/images/button-userdrop.png') no-repeat center center, -moz-linear-gradient(top, rgba(239,239,239,0), rgba(204,204,204,0));
+ background: url('/images/button-userdrop.png') no-repeat center center, -webkit-gradient(linear,left top,left bottom,color-stop(0, rgb(239,239,239)),color-stop(1, rgb(204,204,204)));
width: 46px;
margin-left: 4px;
padding: 5px 2px 5px 2px;
@@ -1162,9 +1222,9 @@ header#masthead{
font-size: 12px; /* match the font-size of the query box, for proper valign */
&:active{
- background: url('/../../images/button-userdrop.png') no-repeat center center;
- background: url('/../../images/button-userdrop.png') no-repeat center center, -moz-linear-gradient(top, rgba(232,232,232,0), rgba(210,210,210,0));
- background: url('/../../images/button-userdrop.png') no-repeat center center, -webkit-gradient(linear,left top,left bottom,color-stop(0, rgb(232,232,232)),color-stop(1, rgb(210,210,210)));
+ background: url('/images/button-userdrop.png') no-repeat center center;
+ background: url('/images/button-userdrop.png') no-repeat center center, -moz-linear-gradient(top, rgba(232,232,232,0), rgba(210,210,210,0));
+ background: url('/images/button-userdrop.png') no-repeat center center, -webkit-gradient(linear,left top,left bottom,color-stop(0, rgb(232,232,232)),color-stop(1, rgb(210,210,210)));
}
}
@@ -1177,7 +1237,7 @@ header#masthead{
li{ display: inline; }
li + li{ margin-left: 10px; }
li.separator{
- background: url('/../../images/masthead-nav-separator.gif') no-repeat left top;
+ background: url('/images/masthead-nav-separator.gif') no-repeat left top;
padding: 8px 1px 8px 1px;
}
}
@@ -1261,13 +1321,13 @@ nav#primary {
float: left;
position: relative;
display: inline-block;
- background: url('/../../images/tab-inactive-right.png') no-repeat right top;
+ background: url('/images/tab-inactive-right.png') no-repeat right top;
height: 34px;
margin-right: 6px;
z-index: 1;
a{
display: block;
- background:url('/../../images/tab-inactive-left.png') no-repeat left top;
+ background:url('/images/tab-inactive-left.png') no-repeat left top;
padding: 10px 16px 14px 16px;
margin-left: -11px;
font-family: $font-family-nav-primary;
@@ -1282,11 +1342,11 @@ nav#primary {
}
li.active{
margin-top: -5px;
- background: url('/../../images/tab-active-right.png') no-repeat right top;
+ background: url('/images/tab-active-right.png') no-repeat right top;
z-index: 1000;
height: 43px;
a{
- background:url('/../../images/tab-active-left.png') no-repeat left top;
+ background:url('/images/tab-active-left.png') no-repeat left top;
padding: 12px 20px 12px 20px;
font-size: 16px;
color: #666;
@@ -1347,7 +1407,7 @@ div#content .page-header{
padding: 6px;
position: relative;
z-index: 900;
- background: transparent url('/../../images/header_bg.png') repeat-x top center;
+ background: transparent url('/images/header_bg.png') repeat-x top center;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.40);
-moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.40);
@@ -1365,32 +1425,32 @@ div#content .page-header{
}
h1.pools{
- background: transparent url('/../../images/header_icon_pools.png') no-repeat 8px center;
+ background: transparent url('/images/header_icon_pools.png') no-repeat 8px center;
}
h1.section-index{
- background: transparent url('/../../images/header_icon_section-index.png') no-repeat 8px center;
+ background: transparent url('/images/header_icon_section-index.png') no-repeat 8px center;
}
h1.users{
- background: transparent url('/../../images/header_icon_users.png') no-repeat 8px center;
+ background: transparent url('/images/header_icon_users.png') no-repeat 8px center;
}
h1.roles{
- background: transparent url('/../../images/header_icon_roles.png') no-repeat 8px center;
+ background: transparent url('/images/header_icon_roles.png') no-repeat 8px center;
}
h1.providers{
- background: transparent url('/../../images/header_icon_providers.png') no-repeat 8px center;
+ background: transparent url('/images/header_icon_providers.png') no-repeat 8px center;
}
h1.provider-accounts{
- background: transparent url('/../../images/header_icon_provider-accounts.png') no-repeat 8px center;
+ background: transparent url('/images/header_icon_provider-accounts.png') no-repeat 8px center;
padding: 6px 7px 7px 60px;
}
h1.settings{
- background: transparent url('/../../images/header_icon_settings.png') no-repeat 8px center;
+ background: transparent url('/images/header_icon_settings.png') no-repeat 8px center;
}
#obj_actions{
@@ -1402,7 +1462,7 @@ div#content .page-header{
}
.corner{
- background: transparent url('/../../images/header_corner.png') no-repeat top center;
+ background: transparent url('/images/header_corner.png') no-repeat top center;
width: 10px;
height: 10px;
position: absolute;
@@ -1440,7 +1500,7 @@ $dd_icon_padding_right: 4px;
margin: 0px;
}
ul.groups > li + li{
- background: transparent url('/../../images/sb_separator.png') repeat-y 0px 0px;
+ background: transparent url('/images/sb_separator.png') repeat-y 0px 0px;
padding-left: 2px;
margin-left: -6px;
}
@@ -1475,58 +1535,631 @@ $dd_icon_padding_right: 4px;
/* icons */
dd.pool{
- background: transparent url('/../../images/sb_icon_pool.png') no-repeat $dd_padding 4px;
+ background: transparent url('/images/sb_icon_pool.png') no-repeat $dd_padding 4px;
padding-left: ($dd_padding + $dd_icon_padding_right) + 15px;
}
dd.pool.partial{
- background: transparent url('/../../images/sb_icon_poolsemi.png') no-repeat $dd_padding 4px;
+ background: transparent url('/images/sb_icon_poolsemi.png') no-repeat $dd_padding 4px;
padding-left: ($dd_padding + $dd_icon_padding_right) + 15px;
}
dd.provider{
- background: transparent url('/../../images/sb_icon_provider.png') no-repeat $dd_padding 4px;
+ background: transparent url('/images/sb_icon_provider.png') no-repeat $dd_padding 4px;
padding-left: ($dd_padding + $dd_icon_padding_right) + 22px;
}
dd.deployment{
- background: transparent url('/../../images/sb_icon_deployment.png') no-repeat $dd_padding 4px;
+ background: transparent url('/images/sb_icon_deployment.png') no-repeat $dd_padding 4px;
padding-left: ($dd_padding + $dd_icon_padding_right) + 23px;
}
dd.instance{
- background: transparent url('/../../images/sb_icon_instance.png') no-repeat $dd_padding 4px;
+ background: transparent url('/images/sb_icon_instance.png') no-repeat $dd_padding 4px;
padding-left: ($dd_padding + $dd_icon_padding_right) + 14px;
}
dd.instance.pending{
- background: transparent url('/../../images/sb_icon_instance_pending.png') no-repeat $dd_padding 4px;
+ background: transparent url('/images/sb_icon_instance_pending.png') no-repeat $dd_padding 4px;
padding-left: ($dd_padding + $dd_icon_padding_right) + 15px;
}
dd.instance.failure{
- background: transparent url('/../../images/sb_icon_instance_failure.png') no-repeat $dd_padding 4px;
+ background: transparent url('/images/sb_icon_instance_failure.png') no-repeat $dd_padding 4px;
padding-left: ($dd_padding + $dd_icon_padding_right) + 16px;
}
dd.alert{
- background: transparent url('/../../images/sb_icon_alert.png') no-repeat $dd_padding 4px;
+ background: transparent url('/images/sb_icon_alert.png') no-repeat $dd_padding 4px;
padding-left: ($dd_padding + $dd_icon_padding_right) + 29px;
}
dd.update{
- background: transparent url('/../../images/sb_icon_update.png') no-repeat $dd_padding 4px;
+ background: transparent url('/images/sb_icon_update.png') no-repeat $dd_padding 4px;
padding-left: ($dd_padding + $dd_icon_padding_right) + 14px;
}
dd.quota{
- background: transparent url('/../../images/sb_icon_quota.png') no-repeat $dd_padding 4px;
+ background: transparent url('/images/sb_icon_quota.png') no-repeat $dd_padding 4px;
padding-left: ($dd_padding + $dd_icon_padding_right) + 16px;
}
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Content Section Container -- v.0.0.1 [section] (section.scss)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+$font-family-base: "Lucida Sans Unicode", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
+$font-family-em: "Lucida Sans", "Lucida Sans Unicode", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
+$font-family-primary: Helvetica, Arial, "Lucida Grande", sans-serif;
+
+header.page-header + section.content-section{ margin-bottom: 36px; }
+#scoreboard + section.content-section{ margin-top: 36px; }
+section.content-section + section.content-section{ margin-top: 36px; }
+
+section.content-section{
+ padding: 4px;
+ margin-bottom: 36px;
+
+ /* Header code */
+ header{
+ background: transparent url('/images/section-border.png') repeat-x bottom left;
+ position: relative;
+ h2{
+ font-family: $font-family-primary;
+ font-size: 21px;
+ font-weight: 200;
+ display: inline-block;
+ margin-bottom: 4px;
+ }
+ .badge{
+ vertical-align: 2px;
+ bottom: 4px;
+ }
+ .section-controls{
+ position: absolute;
+ right: 0px;
+ bottom: 4px;
+ display: inline-block;
+ font-size: 11px;
+
+ a.collapse{
+ text-decoration: none;
+ color: #666;
+ }
+ }
+
+ /* nav */
+ nav.faceted{
+ ul{ list-style: none; display: inline-block; font-family: $font-family-primary; }
+ li{ display: inline-block; margin-bottom: 1px; }
+ li + li{ margin-left: 40px; }
+ a{
+ display: inline-block;
+ padding-bottom: 6px;
+ text-decoration: none;
+ color: #666;
+ font-weight: 200;
+ }
+ a.active{
+ border-bottom: 4px solid #0084b7;
+ font-weight: bold;
+ color: #000;
+ }
+ }
+ }
+
+ /* Content */
+
+ .content{
+ margin-top: 10px;
+ }
+
+ .content.tight{
+ margin-top: 0px;
+ }
+
+ /* Deployment Array */
+
+ ul.deployable-cards{
+ margin-top: 16px;
+ list-style: none;
+ }
+
+ ul.deployable-cards > li{
+ display: inline-block;
+ }
+
+ ul.deployable-cards > li + li{
+ margin-left: 26px;
+ }
+
+ div.deployable{
+ background-color: #e5e5e5;
+ -webkit-border-radius: 7px; -moz-border-radius: 7px; border-radius: 7px;
+ border: 1px solid #ccc;
+ width: 154px;
+ height: 154px;
+ font-family: $font-family-primary;
+
+ h3{
+ font-size: 13px;
+ font-weight: 200;
+ color: #333;
+ padding: 6px;
+ display: block;
+ }
+
+ hr{
+ background-image: url('/images/deploy_separator_dark.png') repeat-x bottom left;
+ display: block;
+ height: 2px;
+ }
+
+ span.alert{
+ display: block;
+ margin: 10px;
+ font-size: 13px;
+ font-weight: 200;
+ color: #fff;
+ }
+
+ span.alert.warn{
+ padding-left: 24px;
+ background: transparent url('/images/alert_icon_warn_white.png') no-repeat 6px 0px;
+ }
+
+ ul.statistics{
+ list-style: none;
+ margin: 8px;
+ li{
+ display: block;
+
+ span.uptime{
+ display: inline-block;
+ font-size: 14px;
+ height: 16px;
+ padding: 2px;
+ padding-left: 24px;
+ color: #fff;
+ background: transparent url('/images/deploy_icon_uptime.png') no-repeat 6px 0px;
+ }
+
+ span.instance{
+ display: inline-block;
+ height: 16px;
+ padding: 2px;
+ padding-left: 24px;
+ font-size: 14px;
+ color: #fff;
+ background: transparent url('/images/deploy_icon_instance.png') no-repeat 6px 0px;
+ }
+
+ }
+ li + li{
+ margin-top: 6px;
+ }
+ }
+
+ span.provider{
+ display: block;
+ margin: 10px;
+ font-size: 13px;
+ font-weight: 200;
+ color: #fff;
+ padding-left: 34px;
+ background: transparent url('/images/deploy_icon_provider.png') no-repeat 6px 0px;
+ }
+ }
+
+ div.deployable.alert{
+ background-image: -moz-linear-gradient(top, rgba(174,4,4,1), rgba(136,0,0, 1));
+ background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(174,4,4,1)), to(rgba(136,0,0, 1)));
+ -webkit-border-radius: 7px; -moz-border-radius: 7px; border-radius: 7px;
+ border: 1px solid #990000;
+ width: 154px;
+ height: 154px;
+ font-family: $font-family-primary;
+
+ h3{
+ font-size: 13px;
+ font-weight: 200;
+ color: #fff;
+ padding: 6px;
+ display: block;
+ background-color: #A10303;
+ }
+
+ hr{
+ background-image: url('/images/deploy_separator_dark.png') repeat-x bottom left;
+ display: block;
+ height: 2px;
+ }
+
+ span.alert{
+ display: block;
+ margin: 10px;
+ font-size: 13px;
+ font-weight: 200;
+ color: #fff;
+ }
+
+ span.alert.warn{
+ padding-left: 24px;
+ background: transparent url('/images/alert_icon_warn_white.png') no-repeat 6px 0px;
+ }
+
+ ul.statistics{
+ list-style: none;
+ margin: 8px;
+ li{
+ display: block;
+
+ span.uptime{
+ display: inline-block;
+ font-size: 14px;
+ height: 16px;
+ padding: 2px;
+ padding-left: 24px;
+ color: #fff;
+ background: transparent url('/images/deploy_icon_uptime.png') no-repeat 6px 0px;
+ }
+
+ span.instance{
+ display: inline-block;
+ height: 16px;
+ padding: 2px;
+ padding-left: 24px;
+ font-size: 14px;
+ color: #fff;
+ background: transparent url('/images/deploy_icon_instance.png') no-repeat 6px 0px;
+ }
+
+ }
+ li + li{
+ margin-top: 6px;
+ }
+ }
+
+ span.provider{
+ display: block;
+ margin: 10px;
+ font-size: 13px;
+ font-weight: 200;
+ color: #fff;
+ padding-left: 34px;
+ background: transparent url('/images/deploy_icon_provider.png') no-repeat 6px 0px;
+ }
+
+ }
+
+}
+
+section.content-section + section.content-section {
+ margin-top: 36px;
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Alert Components -- v.0.0.1 [alert] (alert.scss)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+$font-family-base: "Lucida Sans Unicode", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
+$font-family-em: "Lucida Sans", "Lucida Sans Unicode", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
+$font-family-primary: Helvetica, Arial, "Lucida Grande", sans-serif;
+
+.content.closed{
+ border-bottom: 1px solid #efefef;
+}
+
+$alert_padding: 8px;
+
+/* Alerts list */
+dl.alerts{
+
+ font-family: $font-family-base;
+
+ ul{
+ list-style: none;
+ display: table;
+ width: 100%;
+ }
+
+ li.alert{
+
+ display: table-row;
+ height: 14px;
+ width: 100%;
+
+ dt{
+ display: table-cell;
+ padding: $alert_padding;
+ }
+
+ dt.subject{
+ font-family: $font-family-primary;
+ font-size: 13px;
+ color: #333;
+ }
+
+ dt.subject.warn{
+ padding-left: $alert_padding*2 + 14px;
+ background: transparent url('/images/alert_icon_warn.png') no-repeat $alert_padding 8px;
+ }
+
+ dt.subject.critical{
+ padding-left: $alert_padding*2 + 16px;
+ background: transparent url('/images/alert_icon_critical.png') no-repeat $alert_padding 7px;
+ }
+
+ dd{
+ display: table-cell;
+ padding: $alert_padding;
+ }
+
+ dd.type{
+ font-family: $font-family-primary;
+ font-size: 13px;
+ font-weight: 200;
+ color: #666;
+ padding-left: 10px;
+ }
+
+ dd.desc{
+ font-family: $font-family-base;
+ font-size: 11px;
+ color: #999;
+ padding-left: 10px;
+ }
+
+ }
+
+ li.alert + li.alert{
+ dt{border-top: 1px solid #efefef;}
+ dd{border-top: 1px solid #efefef;}
+ }
+
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Pool Components -- v.0.0.1 [pool] (pool.scss)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+$font-family-primary: Helvetica, Arial, "Lucida Grande", sans-serif;
+$dd_padding: 10px;
+$dd_icon_padding_right: 4px;
+$bar_height: 37px;
+
+div.pool.overview{
+
+ header{
+ position: relative;
+ height: $bar_height;
+ width: 100%;
+ background-color: #e5e5e5;
+ -webkit-border-radius: 7px; -moz-border-radius: 7px; border-radius: 7px;
+ border: 1px solid #bcbcbc;
+
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.20);
+ -moz-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.20);
+ -webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.20);
+
+ h3.name{
+ display: block;
+ float: left;
+ width: 230px;
+ height: $bar_height;
+ background: transparent url('/images/pool_bar_name-bg-normal.png') no-repeat 0px 0px;
+ border-right: 1px solid #a9a9a9;
+ vertical-align: top;
+
+ a{
+ display: block;
+ text-decoration: none;
+ padding: 9px;
+ padding-left: 30px;
+ font-family: $font-family-primary;
+ font-size: 17px;
+ color: #666;
+ &:hover{color: #333;}
+ }
+ /* text-shadow: -1px -1px 1px rgba(0,0,0,0.3); */
+ }
+
+ a.control{
+ display: block;
+ float: right;
+ position: absolute;
+ outline: 0;
+ top: 0;
+ right: 0;
+ text-align: left;
+ margin: 5px 5px;
+ float: right;
+ font-size: 11px;
+ color: transparent;
+ height: 28px;
+ width: 28px;
+ background: transparent url('/images/pool_bar_expand-btn.png') no-repeat 0px -56px;
+ &:active{
+ background-position: 0px -84px;
+ };
+
+ span{
+ position: absolute;
+ top: -999em;
+ }
+ }
+
+ dl.statistics{
+ display: inline-block;
+ height: $bar_height;
+ background: transparent url('/images/pool_bar_prop-gradient.png') repeat-y 0px 0px;
+ }
+
+ /* statistic group list */
+ ul.groups{ list-style: none; padding: 7px; }
+ ul.groups > li{
+ display: inline-block;
+ text-align: center;
+ margin: 0px;
+ }
+ ul.groups > li + li{
+ background: transparent url('/images/sb_separator.png') repeat-y 0px 0px;
+ padding-left: $dd_padding;
+ margin-left: -6px;
+ }
+
+ /* statistic sub-group list */
+ ul.subgroup{ list-style: none; }
+ ul.subgroup > li{ display: inline-block; text-align: center; }
+ ul.subgroup > li + li{ margin-left: -$dd_padding; }
+
+ dt{
+ display: inline;
+ font-size: 11px;
+ font-weight: normal;
+ color: #999;
+ text-transform: uppercase;
+ padding: 0px 0px 0px 0px;
+ }
+
+ dd{
+ display: inline;
+ padding: 0px $dd_padding 0px $dd_padding;
+ font-size: 20px;
+ color: #999;
+ font-family: $font-family-primary;
+ vertical-align: middle;
+ }
+
+ dd + dd{
+ margin-left: -$dd_padding; /* compensate for padding-right */
+ }
+
+ /* icons */
+
+ $icon_y: 2px;
+
+ dd.pool{
+ background: transparent url('/images/sb_icon_pool.png') no-repeat $dd_padding $icon_y;
+ padding-left: ($dd_padding + $dd_icon_padding_right) + 15px;
+ }
+
+ dd.pool.partial{
+ background: transparent url('/images/sb_icon_poolsemi.png') no-repeat $dd_padding $icon_y;
+ padding-left: ($dd_padding + $dd_icon_padding_right) + 15px;
+ }
+
+ dd.provider{
+ background: transparent url('/images/sb_icon_provider.png') no-repeat $dd_padding $icon_y;
+ padding-left: ($dd_padding + $dd_icon_padding_right) + 22px;
+ }
+
+ dd.deployment{
+ background: transparent url('/images/sb_icon_deployment.png') no-repeat $dd_padding $icon_y;
+ padding-left: ($dd_padding + $dd_icon_padding_right) + 23px;
+ }
+
+ dd.instance{
+ background: transparent url('/images/sb_icon_instance.png') no-repeat $dd_padding $icon_y;
+ padding-left: ($dd_padding + $dd_icon_padding_right) + 14px;
+ }
+
+ dd.instance.pending{
+ background: transparent url('/images/sb_icon_instance_pending.png') no-repeat $dd_padding $icon_y;
+ padding-left: ($dd_padding + $dd_icon_padding_right) + 15px;
+ }
+
+ dd.instance.failure{
+ background: transparent url('/images/sb_icon_instance_failure.png') no-repeat $dd_padding $icon_y;
+ padding-left: ($dd_padding + $dd_icon_padding_right) + 16px;
+ }
+
+ dd.alert{
+ background: transparent url('/images/sb_icon_alert.png') no-repeat $dd_padding $icon_y;
+ padding-left: ($dd_padding + $dd_icon_padding_right) + 29px;
+ }
+
+ dd.update{
+ background: transparent url('/images/sb_icon_update.png') no-repeat $dd_padding $icon_y;
+ padding-left: ($dd_padding + $dd_icon_padding_right) + 14px;
+ }
+
+ dd.quota{
+ background: transparent url('/images/sb_icon_quota.png') no-repeat $dd_padding $icon_y;
+ padding-left: ($dd_padding + $dd_icon_padding_right) + 16px;
+ }
+
+ }
+
+ ul.actions{
+ list-style: none;
+ display: block;
+ text-align: right;
+ width: 100%;
+ margin: 10px 0px 0px 0px;
+ font-size: 11px;
+
+ li{
+ display: inline-block;
+ }
+ li + li{
+ margin-left: 14px;
+ }
+ }
+
+}
+
+div.pool.overview.alert{
+ header{
+ h3.name{ background: transparent url('/images/pool_bar_name-bg-alert.png') no-repeat 0px 0px; }
+ h3.name a{
+ color: #FF6666;
+ &:hover{ color: #ff0000;};
+ }
+ }
+}
+
+div.pool.overview.collapsed{
+
+ header{
+ box-shadow: none;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ border: 1px solid #ccc;
+
+ a.control{
+ background-position: 0px -0px;
+ &:active{background-position: 0px -28px;}
+ &:hover{color: #333;}
+ }
+
+ }
+ .content{ display: none; }
+}
+
+div.pool.overview + div.pool.overview{
+ margin-top: 28px;
+}
+
+div.pool.overview + div.pool.overview.collapsed{
+ margin-top: 28px;
+}
+
+div.pool.overview.collapsed + div.pool.overview.collapsed{
+ margin-top: 6px;
+}
+
+div.pool.overview.collapsed + div.pool.overview{
+ margin-top: 6px;
+}
+
+header + div.pool.overview{
+ margin-top: 16px;
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Page Footer -- v.0.0.1 [footer] (footer.scss)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
diff --git a/src/app/views/pools/_alerts_index.haml b/src/app/views/pools/_alerts_index.haml
index 631f381..58f4656 100644
--- a/src/app/views/pools/_alerts_index.haml
+++ b/src/app/views/pools/_alerts_index.haml
@@ -1,7 +1,15 @@
- if @failed_instances.count > 0
- %div.alerts
- Alerts
- %ul
- - @failed_instances.each do |i|
- %li
- = "#{i.name}: #{i.last_error.blank? ? i.state : i.last_error}"
+ %section.content-section.alerts
+ %header
+ %h2 Alerts
+ %span.label.badge.alert.count= @failed_instances.length
+ .section-controls
+ %a.collapse{'href'=>'#'} Collapse
+ .content.collapsible.closed
+ %dl.alerts
+ %ul
+ - @failed_instances.each do |inst|
+ %li.alert
+ %dt.subject.critical= inst
+ %dd.type Instance Failure
+ %dd.desc= "#{i.last_error.blank? ? i.state : i.last_error}"
\ No newline at end of file
diff --git a/src/app/views/pools/_pretty_list.haml b/src/app/views/pools/_pretty_list.haml
index ffe6db1..11f7390 100644
--- a/src/app/views/pools/_pretty_list.haml
+++ b/src/app/views/pools/_pretty_list.haml
@@ -1,38 +1,45 @@
-= link_to "expand all", "#", :class => "reveal_all"
-= link_to "New Pool", new_pool_path
-%table#pools_pretty_view
- - @pools.each do |pool|
- %tr
- %td
- = link_to pool.name, pool_path(pool)
- %td
- Deployments:
- = pool.deployments.count
- %td
- Instances:
- = pool.instances.count
- %td
- Pending:
- = pool.instances.select {|i| i.state == Instance::STATE_PENDING }.length
- %td
- Failed:
- = pool.instances.select {|i| i.state == Instance::STATE_ERROR }.length
- %td
- Instance quota usage:
- = pool.quota ? pool.quota.percentage_used.to_s + "%" : 'unlimited'
- %td
- = link_to "+", "#", :class => "toggle"
- %tr
- %td{:colspan => 7}
- = render :partial => 'deployments', :locals => {:deployments => pool.deployments}
+%section.content-section.pools
+ %header
+ %h2 Your Pools
+ %span.label.badge.dark.count= @pools.length
+
+ .content
+ - @pools.each do |pool|
+ %div.pool.overview{:id => ['pool', pool.id]}
+ %header
+ %h3.name
+ %a{:href => pool_path(pool)}= pool.name
+ %dl.statistics
+ %ul.groups
+ %li
+ %dt Deployments
+ %dd.count.deployment= pool.deployments.count
+ %li
+ %dt Instances
+ %dd.count.instance= pool.instances.count
+ %dd.count.instance.pending= pool.instances.select {|i| i.state == Instance::STATE_PENDING }.length
+ %dd.count.instance.failure= pool.instances.select {|i| i.state == Instance::STATE_ERROR }.length
+ %li
+ %dt Quota Used
+ %dd.percentage.quota= pool.quota ? pool.quota.percentage_used.to_s + "%" : 'unlimited'
+ %a.control{:href => '#'}
+ %span Expand/Collapse
+ %div.content.deployment-array
+ = render :partial => 'deployments', :locals => {:deployments => pool.deployments}
+ %ul.content.actions
+ %li
+ %a{:href => pool_path(pool)}= "#{pool.name} Pool details »"
+ %li
+ = link_to 'New Deployment', launch_new_deployments_path, :class => 'button primary', :id => 'new_deployment_button'
:javascript
$(document).ready(function() {
- $('ul.deployments_list').hide()
- $('a.toggle').click( function() {
- $(this).closest('tr').next().find('ul').toggle();
- });
- $('a.reveal_all').click( function() {
- $('#pools_pretty_view').find('tr td ul').toggle();
- });
+ $('div.pool').each(function(){
+ var this_pool = this;
+ $(this).addClass('collapsed');
+ $(this).find('header a.control').click(function(){
+ $(this_pool).toggleClass('collapsed');
+ return false;
+ });
+ })
});
diff --git a/src/app/views/pools/index.haml b/src/app/views/pools/index.haml
index a89b180..f188428 100644
--- a/src/app/views/pools/index.haml
+++ b/src/app/views/pools/index.haml
@@ -1,13 +1,12 @@
%header.page-header
%h1.section-index Overview
-# Insert appropriate controls here, or ommit %ul.controls
+ = pretty_filter_toggle(pools_path(:view => 'pretty'), pools_path(:view => 'filter'))
.corner
= render :partial => 'scoreboard_index'
= render :partial => 'alerts_index'
-= pretty_filter_toggle(pools_path(:view => 'pretty'), pools_path(:view => 'filter'))
-%div#view
- - if params[:view] == 'filter'
- = render :partial => 'layouts/tabpanel'
- - else
- = render :partial => 'pretty_list'
+- if params[:view] == 'filter'
+ = render :partial => 'layouts/tabpanel'
+- else
+ = render :partial => 'pretty_list'
diff --git a/src/public/images/alert_icon_critical.png b/src/public/images/alert_icon_critical.png
new file mode 100644
index 0000000000000000000000000000000000000000..aa412d130645d4e305dc179e6759502534c6815f
GIT binary patch
literal 337
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf<Z~8yL>4nJ
za0`Jj<E6WGe}IBAC9V-A!TD(=<%vb942~)JNvR5MnMJAP`9;~q3eLf%g<Bt+0o93u
z)HxTWCYEI8=P86_=B6^3>Khs88yd!U$43Dbtnzem46*24I(ehuAp;)Q_#C!`Rv(9V
zdm3h{ghVliEeM^OGhtdEYs>~t<qJ>e?3OtCJl^a3yd_SukuFbo_B3+;o*DXens^N>
zk3oyTuPK){3CgsTtKMsve}KC~wbNKlf7LIIFK&V}?;PCfEg8$q<FNTb%9q6*N5l@^
zy>-Cq;i^@0RcEZ#tpD_q!6k+1Sd>JEoWjyAEdo^uD;h(;?zRhVO=(s9eXMyBFV6?&
YYAJ`Pc>T>2fv#roboFyt=akR{0D(Dp>i_@%
literal 0
HcmV?d00001
diff --git a/src/public/images/alert_icon_warn.png b/src/public/images/alert_icon_warn.png
new file mode 100644
index 0000000000000000000000000000000000000000..0e64c05f4ff797c82a1d66d7a3c112a9fbb43dd9
GIT binary patch
literal 364
zcmeAS@N?(olHy`uVBq!ia0vp^d>}Rl8<3oNC%zs?u@pObhHwBu4M$1`kk47*5n0T@
zz%2yAjF;}#{Q(Nfl(<He1m~xflqVLYGB~E>C#5R5WfrBD=NDxcD>w(67H)lP22>{s
zQs-Qhnpl#VpQjL#nVZUBs&8bVZ)h0b9Ulc$aMaVqF+^ix?WDb;O%4Jr_BBs#FqS;n
z%(R8sdP0VW=0PEkg`D0SSl>EWU*IxGs9d+h;^dvX_uicOtHLs&gyGx)?i*ig>*r=2
zHelG$)#8vnXXi)px|T^=3gzBQRU^c_qO9B53udcEl;r5hIiwah!~{JyS2NzeTlihC
z{xSUpFLu4NEYF#%;q*+X$H|km;E(dG3s*{G8J3*O?aR<*_H&r(aqFXH`|*;+vlndh
zUF$4y+9K=LGKZZCJoP;beI(_r_`3p+aBesEovLkE+++S4=phDAS3j3^P6<r_hR}kg
literal 0
HcmV?d00001
diff --git a/src/public/images/alert_icon_warn_white.png b/src/public/images/alert_icon_warn_white.png
new file mode 100644
index 0000000000000000000000000000000000000000..04011d5c7f6af63c501a902b55ebe99ec8ce34d6
GIT binary patch
literal 329
zcmeAS@N?(olHy`uVBq!ia0vp^d>}Rl8<3oNC%zs?u@pObhHwBu4M$1`kk47*5n0T@
zz%2yAjF;}#{Q(Nfl(<He1m~xflqVLYGB~E>C#5R5WfrBD=NDxcD>w(67H)lP22>{s
zQs-Qhnpl#VpQjL#nVZUBs&8bVZ)h0b9Ulc$u*lQJF+^ix@1#V*Lk1$v#ykzo&l)@(
z4yh<43QcHWQBhbZ)W)oG=HT)Ey-w>>q<6mFTAmqKl&Q+RApICiiKzO4lPV96ioeuX
zEO;pXca?yJi_M|ZGtYG&ZY{7peoA7^hN9v_n(sI+tTWi-dF%JCB@f!HlCrs0%5Kj7
z-N|LsQ=oH7vyffIxYV2D0;dP}lI~d(r6PXWR~@S>N;&*z$MLCVZ!efX(&?$0)YfGS
PbS;CYtDnm{r-UW|iI#O5
literal 0
HcmV?d00001
diff --git a/src/public/images/header_icon_provider-accounts.png b/src/public/images/header_icon_provider-accounts.png
new file mode 100644
index 0000000000000000000000000000000000000000..7dfd4cf9d836c5ecaf84ec628e7ab4dee5ca4971
GIT binary patch
literal 662
zcmV;H0%`q;P)<h;3K|Lk000e1NJLTq001ih000>X1^@s6sPETi00004b3#c}2nYxW
zd<bNS00009a7bBm000XT000XT0n*)m`~Uy|9CSrkbW?9;ba!ELWdK2BZ(?O2Mrm?o
zcW-iQb09-gHF34$HUIzs6m&&cbVG7wVRUJ4ZXi@?ZDjy9FE%eRF-ve9MF0Q+@JU2L
zR9J<*m*IJ$KoEvsdGbHG3bX_5K*AIdQ^AoAEWr}E3PLK#S-=?5fvMoMgQNoQ$1cwS
z!Z8b)_aE*u^D#SoBNGBp)jMDfq`(yT0t#R)A_q&1)9DnFvc|-^(F-krdCT$_5R1sZ
zFU}aTQNZ3c?Lq-=f!~8w7zq{oKc=d>8Y89;lUP-aan<W%F-lDj*2>-)_r(Ksn6Qey
zYQ?PF825c%D&cOon*keOMZL8?fJ{X4<~^l@SS#CWNtS)8ngV}-pPat~bKqH3_o~`@
zl2)+?<GxO@Ug)zS#vCZTuh%fOfruPbbx(iq7GBs2XLX-Ij(dpAlFL*2c3k~2#Ako?
ztiM!7?iyGE55TKWY_Yy7%Vs;6#kMtmgX#pEHP*T&Umvw06H-}#_pSvIsfwKj#_b}m
zUWAIZ@`!7j<H$G*Ro#>qm-^QQ@Iyq-{Me7`6lYgMc}bEa?G>x4GulnOH7L&5&n(Qx
z$#5^-5S}{4R_tdvAn-eox4o3!Z!^N(;aC&vpFZW^m%vz#IG@d{UlP7G-a>;-{LKs8
zQ4c*L3tM1Qwuq|c1om;{t66Yeq4@ZP&j+sJK}5KUhW5`;ZhbyPqzJrs8_}2&-@wp(
wS;Y5MwPZ-XrzA;=YfZ3Au?6mvB*_8(0{Hfrb{bKxW&i*H07*qoM6N<$f>j0~x&QzG
literal 0
HcmV?d00001
diff --git a/src/public/images/header_icon_provider.png b/src/public/images/header_icon_provider.png
new file mode 100644
index 0000000000000000000000000000000000000000..b68807646e6e0f767e05682b78f7ba52e0b143a7
GIT binary patch
literal 505
zcmeAS@N?(olHy`uVBq!ia0vp^ia;#E!3HEtCQboKuoOFahHwBu4M$1`kk47*5n0T@
zz%2yAjF;}#{Q(Nfl(<He1m~xflqVLYGB~E>C#5R5WfrBD=NDxcD>w(67H)lP22>{k
zQs-Qhnpl#VpQjL#nVZUBrf;TiXy{!a<I2Fm80_id7~;`+blTnALk1#l{43tSW%E^U
z;FWqQyn=K$LU-d&6@*-9F;Q&~1K<}e6fXurYX>X&kY|GDNg-RD1^-Fw}$L)dsW
zlePluJ?+c&4tg)2&$D$e-}8s}M8o=yr|t==nb&8wSl9CHIksm1!{|%PwzhO1c*xk8
zF|qK7+HNr>hHUYZ$5qbgu-Zj)R7eS%{;)ig!>Dp#$_|&Fht8K2O#;O`St80c7*aji
zJ5P45^T<+-c`^T##0@r=vICVGofBuq-uWC9^h`a<WQ7`60)NV+PZL}`R2KG}TH-8t
zUOzS4K2*3kJ5AcYKy_-+yan0McKi$MJ#sbZ(joqs*XLfUE1ljYG<SC7GxkY-U&JSd
z2G5_dbIu19lPgu+YNbNy3SV=#E%(|fH0cA=Z$%a-p=NG|<I$bz91JOOk0O~`mz>?9
t^<W0CV#Drx@k~s$!2$PVukT-5za+c0Y>HJu7%=!5JYD@<);T3K0RT{c!4Cic
literal 0
HcmV?d00001
diff --git a/src/public/images/header_icon_providers.png b/src/public/images/header_icon_providers.png
new file mode 100644
index 0000000000000000000000000000000000000000..b68807646e6e0f767e05682b78f7ba52e0b143a7
GIT binary patch
literal 505
zcmeAS@N?(olHy`uVBq!ia0vp^ia;#E!3HEtCQboKuoOFahHwBu4M$1`kk47*5n0T@
zz%2yAjF;}#{Q(Nfl(<He1m~xflqVLYGB~E>C#5R5WfrBD=NDxcD>w(67H)lP22>{k
zQs-Qhnpl#VpQjL#nVZUBrf;TiXy{!a<I2Fm80_id7~;`+blTnALk1#l{43tSW%E^U
z;FWqQyn=K$LU-d&6@*-9F;Q&~1K<}e6fXurYX>X&kY|GDNg-RD1^-Fw}$L)dsW
zlePluJ?+c&4tg)2&$D$e-}8s}M8o=yr|t==nb&8wSl9CHIksm1!{|%PwzhO1c*xk8
zF|qK7+HNr>hHUYZ$5qbgu-Zj)R7eS%{;)ig!>Dp#$_|&Fht8K2O#;O`St80c7*aji
zJ5P45^T<+-c`^T##0@r=vICVGofBuq-uWC9^h`a<WQ7`60)NV+PZL}`R2KG}TH-8t
zUOzS4K2*3kJ5AcYKy_-+yan0McKi$MJ#sbZ(joqs*XLfUE1ljYG<SC7GxkY-U&JSd
z2G5_dbIu19lPgu+YNbNy3SV=#E%(|fH0cA=Z$%a-p=NG|<I$bz91JOOk0O~`mz>?9
t^<W0CV#Drx@k~s$!2$PVukT-5za+c0Y>HJu7%=!5JYD@<);T3K0RT{c!4Cic
literal 0
HcmV?d00001
diff --git a/src/public/images/header_icon_roles.png b/src/public/images/header_icon_roles.png
new file mode 100644
index 0000000000000000000000000000000000000000..6c7f392467bfda8c8916bdc397dcb3db2b721f65
GIT binary patch
literal 1274
zcmV<W1O@wvP)<h;3K|Lk000e1NJLTq0015U0015c1^@s6J20-I00004b3#c}2nYxW
zd<bNS00009a7bBm000XT000XT0n*)m`~Uy|9CSrkbW?9;ba!ELWdK2BZ(?O2Mrm?o
zcW-iQb09-gHF34$HUIzs6m&&cbVG7wVRUJ4ZXi@?ZDjy9FE%eRF-ve9MF0Q<R7pfZ
zR7i=vmtSmDRS?F17cPZX%GwRqHM9*rRGaDpniOpy5t|qiFhI3u3~H)kS|TwiDrnFb
zG=&h+m?8)Uqta+g=BPA{M#BSvl=>&Mkq4vI!Xj2FYj8`uxW#tE`p~=0b!E#|ij&;r
z?3tPGJ9Ey=oU=|cnIs!=949L~09Bm}lo?}=X0ma!M$3+H>FDTa{ovqW<@D*(zX7f-
zv8p~6kH@$4_4VbpwY3FZ*QL6;dSD`-X;VRb{`~ptfZ)!ZJA)k^9R!0xLZQ%C6B0X)
zL;7c}ooTJjO&M8hUr^OqUUV~5b-5p;zP|pgyu7?M4Gj&06%`c}6&3vf^k%@$v)1M~
zs`@an0(eP8PO54E*bEFCV_x)#w*!U1THpy_xrp4KB39KLU_Wps8jUV?9A|bxK|vL;
z8Ylr8MWkO<OMusawrRjez+qsEs#XHqfmtb1PhJLwfCIpNKttNjZ36~@4Z&b=Q9(gL
zr!nRipb6*)-dEL|fgM1HF{Wj_MpShv&<=D0D~vH0QaZ<RP}O<BN#Kx(Ec5xT1R6x7
z%D<9iGC5v?s@ec-1r8Wv9)*7<*J|KH;8&p0S{w9%-{9@US|F^dyS(|^fk%L6$snp4
z0xEz#z%*;^25W7upZI4HSp%&1elPavHUVJ~+2@gLRMpwQd%&k6ay%2UCr3r(Ibb8O
z2q<xVooll<j{3+`au}}}h{y;qqN=X~Uoy5!mlY51EU?EL{{~c#E3^6hqN*!Z_0U8i
zUI}l~4aCdNHTcd|Rm)X%q2JD0dylntNhX~C(lR##pQoK`5%9RGeg;@zA@DS?D-+11
zB39L>fMVbS|GbDC1YQB21eyT_nv5}rubSAq>Xre|i^zp^y@>PxjlcrN>iz6Qc$0~^
z0yrZgT^SY@U@Y2oz&>EBwf4?TV3RrHTp%x#GLc9OxvqPghztUUR5c8o%Vh6l`vUQ9
zt9OBR5ox`W{grUDCiePuIj{xj0CtE-;(s9qP}M@91^6D=BqD#NY+71c9M^Sk1nvT6
zGFEo6%W+J)fr!ZOz$)MZ@UeHR0pPmsy5ZsBpSrrb-adBhSW`3_{n5L<{vF8GyfRhw
zZs2+m`9f76>gnm(*52Mezr4Jh-ripN`}?V@tLrT-Eq%Zk^PS%}>#WYOz^_w-cs%}k
zXJ_ZU+S=N0L!r<ou~_WE*4EZr!r^dfadGi8j5U{WnUcqzs@@ujM4UNu<`4>n-V~9>
z{QUfy+S*#m%F0M4lS|Tlri2)n8;iwe3=9l#@#4ihyt#A9Wb#rV5Fn9A^j$0Ba7jst
z+uhyGsZ*zFnwy*77#SI9I&tE}rPHTR$Mf^^x2HQy)jx@d>$(SPYHC*P-o5*#%F4?1
zLqkIZgF&jQs*V6h(jBtS>WL(k@q72~eP?uZR3eecUxkH*Gjnoseh35t_Znm3*OVAQ
kRTlvB8GFMWhs#&Q-$ph6?P@Lh(EtDd07*qoM6N<$g6xk@P5=M^
literal 0
HcmV?d00001
diff --git a/src/public/images/header_icon_settings.png b/src/public/images/header_icon_settings.png
new file mode 100644
index 0000000000000000000000000000000000000000..e85061e5bc0b5f7a65f66b997e25c37cc97af43f
GIT binary patch
literal 666
zcmV;L0%iS)P)<h;3K|Lk000e1NJLTq000{R000~a1^@s6kkQ2L00004b3#c}2nYxW
zd<bNS00009a7bBm000XT000XT0n*)m`~Uy|9CSrkbW?9;ba!ELWdK2BZ(?O2Mrm?o
zcW-iQb09-gHF34$HUIzs6m&&cbVG7wVRUJ4ZXi@?ZDjy9FE%eRF-ve9MF0Q+^hrcP
zR7i=vmG5oaFc8ImGW@;Xpz;J!HW2g%NHRe(LN}<rfk$XIum_;(PEcurIvY3>xF1ZS
z^qG_t)a?TV=*T-h-d`3>fOBpOJa};@=`p8!I-RoT%%+e5i|D_cXmf=k7MybnVDAsC
zC3ViZ8u)JP){<7vxeC|<N3VYz^30NTz}>`)_C~jtRDC3ji=<W>_EP1TfhEf(p0g+Y
zz<&K9GD%(Hz#XuZR7t9UrC%dqI|!Sz74S7C%9Xik2Y@F@+tC8?h9%c|SV}r%$V%Xs
zS?+;D(=^Eo&V2bkB#8PP5rE&bA;06&+e@<C#=pSKCw52TmOfNT_`R!WkSLyjIY20a
z#I)FuZ-<SM*OFF~Cx|Ds+B@J&$e;IU!)0!I-xh;|*p_|;{LJWvFz3eEy`*l4Y;NRz
zR&#u2?im?(wi*vc9vV*;)^?Pv_5|;o!%_k3gx!;*0=Ng>yiE;I6a{VDmTlXXMR8dY
zR|S%Sd3t_Gsz>xs0FsJ0hc;(993rygz=gu&8`idM+m--L(^T`J>WOgCYq5<9)o0*2
zl0$p+aNBWpi2h&w7tjF|6Ftkqhp7WT1tLi=0M5B@{PFbtzYgNR_AKPgco9Mv<XzJ=
zk5j903aaS;+3b~Y`}fQ~F|VAP9=Kr`W8|9pHv_QGvknM^XaE2J07*qoM6N<$f?$Ov
AmH+?%
literal 0
HcmV?d00001
diff --git a/src/public/images/header_icon_users.png b/src/public/images/header_icon_users.png
new file mode 100644
index 0000000000000000000000000000000000000000..0df6625550494a62b599b3e76378ee3f058c02b2
GIT binary patch
literal 649
zcmV;40(Sk0P)<h;3K|Lk000e1NJLTq001EX000&U1^@s6PMh_500004b3#c}2nYxW
zd<bNS00009a7bBm000XT000XT0n*)m`~Uy|9CSrkbW?9;ba!ELWdK2BZ(?O2Mrm?o
zcW-iQb09-gHF34$HUIzs6m&&cbVG7wVRUJ4ZXi@?ZDjy9FE%eRF-ve9MF0Q+<4Ht8
zR7i=%mceb}Koo{QgN0?;Qqlo*01e<I6>Ls(-IS6NwgmR-Q?`OlUIQT=kPd=0*2u^(
zdx&8jGd9@CYJUj{y*K{mv&Rer|2fuL{5}_^X*vV$fp2B$1-MsAJ@nyuJp?X+6>#Bb
z-zcRXyYQ^F47y72{sdeC06%*0nk7VJCL-64)@=)Knx^UGOisImh%A6-;J1h@Ywd9x
z5I9Jj;518!$PD;iDNRMB?e3lF!f`!`OGj<iRiX>$T#0H{C;D$^a#|%^lT_F9sfD*v
zO6|v<;xtPnNwTaBeoK<1x(O{>Bz|__G)t8ERr&r>ZIqkQs^Pl2U?ZnhqI|2bE2T+U
ztLD`OQ%W7=&g206{qGQwJKzqus*M=~&m!^!ERrNyxImxbc;#;PK=W37$acHM7?W$Q
z3m~fZ<2cU4Fbsyn;VBfr8n~U$=Z`+`>)0x=*=#VzV2l9>%Fj`>)`8ZVFboO9kkM$=
zhP^1~p7=Cu!@J#%JkQCpjG`z`+|<YHg?-;AiXws_U@&n02F8H<JfXEF%QCFBohGlR
zC<@l=HJ;}YMG<ivJI5XA8Dr2|e_Eg#Yb{#q{c;}V=unfU=@OWJnZd`rDy1gXLert<
jUkO0N``71W_2u~k<0jBLq`Y~j00000NkvXXu0mjfekLAP
literal 0
HcmV?d00001
diff --git a/src/public/images/pool_bar_expand-btn.png b/src/public/images/pool_bar_expand-btn.png
new file mode 100644
index 0000000000000000000000000000000000000000..a065effec72e83178b5aa1c17ff6b90681e624b1
GIT binary patch
literal 2799
zcmV<L3J~>)P)<h;3K|Lk000e1NJLTq000~S003|Z1^@s64LcCE00004b3#c}2nYxW
zd<bNS00009a7bBm000XT000XT0n*)m`~Uy|9CSrkbW?9;ba!ELWdK2BZ(?O2Mrm?o
zcW-iQb09-gHF34$HUIzs6m&&cbVG7wVRUJ4ZXi@?ZDjy9FE=kSG4srOAOHXgNl8RO
zRA_<inoVpQ#}&taGrLPtB*i7y`idl5l4T{9ZCObyL4q0=GHMhE8Z?$Ky)<#Jy`@g?
zmXTa~aFFC)pg!~##D)(6Qsf}iMlMFH*mBaqhyd66Xe5PSq6AUo?oJOBX==Hoq|`tT
z)dS|BH^ceQdpkS({_~e$51XBxjRTi<+9Y6lhGc;m;5Kmkl~-QLG@4J;>-g%cuj0Um
zz?Hog<*}Q<J1@WdvM;bN;DZMbE&+d`Hk$of7Wm!p@bGPKhx9rgK72SWgt#SyFoh8O
z$Yu&5ZasYXaJpfHb8~akz%}n6+qOw2ldP|=W7{@LsnU;yz%UGAu^91qoIoJp7wz?-
zp`i+J1#oU|?h<gzJ9>3>l}si>M@I+!{r$AJx9{p-Sy^Fzex9|pHB8gQvMi*mN!--X
z(9rD);G;*6;=mKCo>`$#V0n3&U@*vQuf0Yv81!3x#kRM%xp(g##bS}p&Q5e)ukOwQ
zy=Tsx$;h45d|3U=lu|4&FB6SMxp3hEhGF2kZo_661{W?|ARG>}w6x^+Og{t=-+c2;
z97uc9WZO2Alamdjs%JAZGw8ZrlYSr}g%FpjS7X~Y>2#X0v9Ud)x_0fFuYYW8jC4AU
z>$=`ZFVz74@WT(ZwY3ol1W-!VZPU}!#9}euzCa*ATU#5cRLU1{vf7!+Wa#PXX&Bk{
z>(?<&lhdb9*B#T-(?cec@d8fjLWo_biEZ0hmQ{Jzy!PIE?-7s3Ieq#xK;3bcWl<;;
z5MtM>Zt5NfN-12|^_}GX_unUxNL0Xpx?{_I-uY_)8?E~6*|WrAv3-p#n|FTcJqM+f
zbvMczZ@f{n)f;UrDP_$$t5Z4!D$g+x2#`*vF-`vu#lXM-N-0)XSAqH|&1SQHr&Cr6
zA!e#qU|AN6i;E3cJ}@vqTU%Sh2p1O@X=!QkMmQsd5VxzHt*x!Bt*ucg6dJx7{r&y4
zwzm5A6$%BC$)q3PZSmyElbWOL>C>ka3I&FThZ}B)diLPK1H$1jot>TDu7vFE?ac@w
zZdR|PySp3Pwt4jE(VoYfw|)Kf*8sG)w|k?z+1uNj5jzppe4bp_<-6~`1K{Mzlitrw
zjoG%%x8Ht?l#;%_J~U0M?#=?e$BrG#R9=#Wg@u|Aux;BcFE5i!Cb2Aw_V#w7(daIq
zjg1Yy|NeWD$t3OV?R0l{`>ki{=+UFkKEP#LTwI*Sr^MLa-ezrWjbt)OKA*>RU6fL2
znnpMrrlqBY*4EZ~S-9Ta-926Yqvn`dT3Yf2{gHOPtE+3e+TmL!E-fuRmol-dt84Ev
z5nyLvFQuaPpmr1J^#g+jm3P^emX;1w>UVW@H7xZT?{%o0na|4(xy4VzEmElzpMU;2
z3kwUCI;H%j4+ewu_4P3^G2wSu!$G;lC!c)6)2C1A@9(FptBZI%UO6Wn$03zUvAn#@
z;^HDlj~?aX#fwBD5$`m6bBm>=CGOn0LrY5w0|NtCmPITUBN~lX0Bzf5b90kSCPO-%
z=JDgl<Z?MKU%rfGS=E4zxyAPOHlKa=8OM$tV`OB6<HwKF*49Qi9NtwFNht}3!?d@z
z)7RI>$jAsC9UXl7>8A(d7PoHQLQ2Wmvu8;p5`;pbN<rjj<<c^r&y!3hnVXwKDaF*(
zly_(?w^&_WC6!7sI5<c=9<P9vC$4TcZrrGB9w{ZEPzcMiICbh2sZ@$wF1I(gxOeX!
z0|NuQ7_Hxz{l<+OWHOmuJ}6avi9~`ECr<F?mtXG9EpoXWEiEk=hEW&ngAYC+o6XYE
z(NWU}pzAtEjvQfib#-rU5s5^I$K#df<*lqg`sgFp*VpOj=<w~|*@T#;NhlQBn_DzB
zHPO`6gb<>p$o=@^kICh76|iy!`~bt@upeM8w~$g+cBFUpot>Rzv)Ns~dJ*cnj$s)4
z;}-Qwz^SPzPMkQgYl3=X9mm-px6pN+LZN`BX@1uqOiWCmlwy8<zHUlg*TuGNZ>b1=
z+@iU;nN%uOxd8HO6B85k_xD#)>TTtF0?V@Y<`yr$_#!JSD>#mW<2ZFwHa<Si@#DvR
zQ)$~atE;OF4i4^*Tim^SmvA_YX_|g%X=sk)kjZ2y6bejCOnAHfxy8A2=g8%9Y;JDi
zI8H<AR^1%OVPj*1t*tGFhK3HtE%Nz1_wU~)91atSL@Gb@vohf3<|g@kp5ftPFD2L?
zx5#F*JbwI`d_Iq9n&`T|3)s6!!r?HZqoaOnIvBTDTU%pcVS&xf&6-0&DMfR0Gktx1
zH5U#$cE~LbxyAoxhuq?);TDIw1sv)Y6-($sh)dO;VzEd%o#x`ji#V>!R?%Uz=wiDr
zZk^j^DL|K!h#_e*G{(lp_~MH%Xl-rvRt%SF0L!|C5eSgY7g^u7$rc>8iVkj_`)w%%
zO@@XU(1-<fV!>y+MfoDP8gR1OlgVTl9UWz>V3XS}lH4ki&fDZ|w;^Cim)MSuKw${z
z>FHs1cGjEL`nttN!C~7jrSwmKy~WI<dH;NtXFAi*wYM*`ZD<r7_u#sP6bfB{A>rz8
zevNy4fxj>AF7wOw^KO%?qen3$=mMlrmEF51w<v=Kq#$BQijI!sD&8F_-Gh2Tf8K5K
z?npOgP$M4Di5QZA6uVBNhJa<=0w8Kgl+r52($$eJ6mWM3^nAC;)sZgDpoSIHF@qXW
zLxNJMow;fN*+aL8=mIw&ag~PaD*o_lCxX&~-g&i?n4ysfYQzGPh%QjBi=w`6p$j2q
zfH%vYvTjjbfmKHeia(y~D)|E%R;ctkR7VEv(k-fNf4YToT_U<5W=O1{#*t8|SwW4M
z@hr0Eu3IP|Z@c835=9GXl8`QIzT(eKw@|K2P=aYlOhXcs?27DAw}3<4;*eXE?2udR
z4fy}ZEe>^yL*1gvYPrSA$_lAeiu32sW5(lP1j*W9yAJjKb4CKX6a<YRi5=bI?%liO
zayjqqR4unC>lS7_PEi_c6<juKMcz>j$xKKSM0G)vG>BK}7O%hldJW)YwI`R$aq{Fz
z&<wV0MW*PoZY#DO)iA=KCa@g=hM-B7bc@;9S?^=0uUj}kQI#V5^PRtO|6h%{#pqx^
zzkl<W6m<v)4z63+2sB5b3&q>N`UP&hgMU2vk1yD{-WPcLXQ$DHLIVsb2p&|o2naz)
zDVjBKT)~xzQvfxf=Xzh@%ET$6nxI*Okc5CHK?+~p!WXd2dYUA-n!;5IrQogcL6m}j
z{<{SFYR?P2H9kmGgP5*}XwW1<xjPJOKitBrTQo^<r78itinqpJs&I?nj=w}yD`g=f
zpMg0Ibc-5pQPwRIi9|(V3u~0hZUrd8mGP51eu1e&vsNBc;uc=rqRRHCTPW8hBoz^<
zi0KM*r^WP=FC<l^0^duwr~&Nk?4-H5xpK`_UFL_RBBm)4da1><-C$)2XnlRXaw}B>
zco5wJr3eT`RD-An0a5ZD>J}X87KhxzGvq+r;=dVtqyWZu1xEk?002ovPDHLkV1hMS
BT(<xK
literal 0
HcmV?d00001
diff --git a/src/public/images/pool_bar_icon-normal.png b/src/public/images/pool_bar_icon-normal.png
new file mode 100644
index 0000000000000000000000000000000000000000..8703caeb7ea921240d8313ba2167095b081b8d94
GIT binary patch
literal 386
zcmeAS@N?(olHy`uVBq!ia0vp^f<P?H!3HGDmOlFkq*#ibJVQ8upoSx*1IXtr@Q5sC
zVBi)4Va7{$>;3=*WlCHlN`mv#O3D+9QW+dm@{>{(+%k(&%kzt}ixr%MO$)a^HUp{?
z0jYB?N=+=u%+FH@$;?e<Fw-~FH#GDvkZ}dd-|=*D46*1vdugv8tD^|RgZ!H=i*{^n
zaawsr^L?$zthv(zDww~9>}iNg&oA`ubdTWd{N$#n(sF3RNujc^$06#Ii}zW64n8WO
zZ*Vx5Bk}Zs4#Rs1!nsq$;x-;gTou_Su&&NA%4hbnm9KL49y57*{fFR5W%qf8=gVgC
zzCAmU)32cY^CZTiC!EtOWEg7JKV*&7yx@Lq<NQwx-G4RNJjgktq8+*K+26}=rz!na
zfA^=od+q~`r?P&>6~0RbiTpgeE=gLt-tpB&kN>x~FLjW=srlybn*R=b1wDJ2QfB_z
a!>G5(@SuCG=SHAE89ZJ6T-G@yGywo~4w+8?
literal 0
HcmV?d00001
diff --git a/src/public/images/pool_bar_name-bg-alert.png b/src/public/images/pool_bar_name-bg-alert.png
new file mode 100644
index 0000000000000000000000000000000000000000..30f2341c63c661c5f4ee40fd69bfcab556563e48
GIT binary patch
literal 842
zcmV-Q1GW5#P)<h;3K|Lk000e1NJLTq00Arj001Qj1^@s6_yyDn00004b3#c}2nYxW
zd<bNS00009a7bBm000XT000XT0n*)m`~Uy|9CSrkbW?9;ba!ELWdK2BZ(?O2Mrm?o
zcW-iQb09-gHF34$HUIzs6m&&cbVG7wVRUJ4ZXi@?ZDjy9FE%eRF-ve9MF0Q-q)9|U
zRCt{2-M?!SVI0Tt&o$Q{1e#U^TS>t<2<_w~E<!H|{sYcRQ|SNE!BOby){Y`}mBuCM
zDi$*7Qt*l?M2K?s=cOb)hk7DPbI;KSt_Sbeas-}xp6~SG`#g8y9R20v^77iq*w`~?
zbo8bG;F@tH>8&(<cV(qDGBI%{>w*B_GL9s@o1OhMJ~g$Fbuj=ijQd7f4ZGciUbmZd
zEdVf-^I8fdO=VpO03>lE!U{l6xKY*>0DvI^3qWoVSO9XvJx>_$q|wlf=jmjBUz>At
z#uGnnw^b~c^{v^|`)c)SRRVwvI;?uNs^?LpBj4AI=Sh;zf<Ql7t)cfF?(V8sE~`#h
z0kFh)OE}`Xy0y3{Njl!!)AxkHim~McV2g2Jo%j3dY;XVh9d}!oaa>mtfd#-G<G>m%
zmGo$RU8kLn+FM(R;|VMPwiyT3px0A(XGeoDOtk=k1;CcXr-ZTd!9a(;Z#;1vRHpL-
zKoa8)%PkglZ)r)AblU0YtHHKVqQe4Uk8xo2Pfqk@b2Ie<1Qq~Wj03AMKCauIr?VhX
z*YK4FiNFG2kNFu^zpn$|*B}gyLWnag0JfRGhn4csJw}HGz!u}c8Y`9bV0BfJbm;r~
zys=?)AAtqH7URG=J2=pX-+`3|fd#-8<G^wX1x;2e8ib*aJDtSw(LYxJxGLjAcgJ-#
zS*fTO1UfPZtQd#x0BlM1*PM2<nR)>_EC99`2iA@G`BW3f;|VMPwipFgy;hUAwx-#K
z4~-}81%c|d8i57C8s{ZV5P+QEBNPB~!}uv70A!603qWqTk@Qo1t{y-R6dp?xlDw=7
z0e~cqB)yPYlI~|*3jhq|N>X&uVKqf)0l3BrlGKpGhV-g>ah|mxX*%1o0N{VW09IVg
Uy<77hNB{r;07*qoM6N<$f`aO6EC2ui
literal 0
HcmV?d00001
diff --git a/src/public/images/pool_bar_name-bg-normal.png b/src/public/images/pool_bar_name-bg-normal.png
new file mode 100644
index 0000000000000000000000000000000000000000..c8b3a40c8518ceb20618db984cb015a207b34784
GIT binary patch
literal 750
zcmV<K0ulX*P)<h;3K|Lk000e1NJLTq00Arj001Qj1^@s6_yyDn00004b3#c}2nYxW
zd<bNS00009a7bBm000XT000XT0n*)m`~Uy|9CSrkbW?9;ba!ELWdK2BZ(?O2Mrm?o
zcW-iQb09-gHF34$HUIzs6m&&cbVG7wVRUJ4ZXi@?ZDjy9FE%eRF-ve9MF0Q-NJ&IN
zRCt{2-LY=sKoo`HgBh@i5`_dAN*emCWcs{H-ei+E+4o3AAEY$&Udf0KibzpFf!QL<
z7AwVEb_Y3@{;xwCU)}2H&Uj=R`fWa+-%GlaG!y`QK@CYNisD()O~t(cK&hxGihB`O
z0BXQ_@9(N^0st(W_ntE=0JRWR-2ebsIq!YdJph0Sfd!y8*b)M$jnWD0>FG(!<x+7R
z>-P56Ty!#-XuV$R`ubYq@i;`E08k!SS(fSX@ll;lN6Y2%;{oS%adA;v^z7_R>-Ab$
zmWeGVfKZ%ek@sG!)k>0-B+0?R0)SI69lAFf4RyQSKfm|W)@SxLnXUkYWD2bJ_jk=^
zGsSVNUaxm>{cg9DL|_33%d{noqDWU)SBfHDDgvmE`5so1B$AGsnwYQvgk%b=?RKlh
zVj)Rtx7(&|p+sN-2+Oo3Y&M(f_xq>r1prE!Cam3Vr`2jD=bX;Z&&|b|umFT)zSfW=
z$<c@I1QvjhOk2WzU;#jt%=fVJJeTzGws0^Ql&<IED1cKi1y-}!)NpwGhe-)603n$U
zrM&lgdwbJnvpID?0Prc(gtZSW=bT!tmbo|+7J!gUffYrOE-x>SE>2(p2+0&!udlC1
z72U5VumFT~@LI!YG*X`DdU<)V7j;gf(dfS#1AxCBoUqa~Rhp*%RGbM5KuG*+4uIO=
z16KfQg9!^jZ4g)hY9o^Lv+5=Qz`}X&e@OaXbt3?9NJEmQ)9JIMn~Hk@fKrhpWm)!3
g(u3F@0{Fsy0gk}h-4wirIRF3v07*qoM6N<$f;etPu>b%7
literal 0
HcmV?d00001
diff --git a/src/public/images/pool_bar_prop-gradient.png b/src/public/images/pool_bar_prop-gradient.png
new file mode 100644
index 0000000000000000000000000000000000000000..6c7eb7009642ed24e788d92c3cce9d4d1d460060
GIT binary patch
literal 229
zcmeAS@N?(olHy`uVBq!ia0vp^B0#Ll!3HFq)}LerQY^(zo*^7SP{WbZ0pxQQctjR6
zFmMZjFyp1Wb$@_@G9|7NCBgY=CFO}lsSJ)O`AMk?Zka`?<@rU~#R|^BriEJ{n*r5{
zfYdn`r6!hS=I1GdWag$anCYA88yb2S$hZRK?LA!_Lp(a)p4rIBpupo2SpO|v_p%Ce
zL`Gs_=5v0T#>W*YX^gUhymMB1U$2gyp7;0T4;EG!uxD3)#V*DiZa(uN&?p8^S3j3^
HP6<r_Q$9ae
literal 0
HcmV?d00001
diff --git a/src/public/images/section-border.png b/src/public/images/section-border.png
new file mode 100644
index 0000000000000000000000000000000000000000..91e6f415ff00a81595cbf31d4ce4e33e41de82cf
GIT binary patch
literal 193
zcmeAS@N?(olHy`uVBq!ia0vp^Od!m`1|*BN@u~nRmSQK*5Dp-y;YjHK@;M7UB8wRq
zxP?HN@zUM8KR`j564!{5;QX|b^2DN42FH~Aq*MjB%%art{G#k)1?OPX!mW?Zfa*j+
z>YR&G6H7Al^Atidb5j{i^^FYl4GrVF<D-BIq&!_5LpWx#9%N)>VBk2c@FxE4T(vvf
c9;|x6=;z9wWUKV28>ouG)78&qol`;+0GF#X!2kdN
literal 0
HcmV?d00001
--
1.7.4.4
12 years, 10 months
Quick check script for dependent services
by Matt Wagner
Hi,
This is a quick script I cobbled together for my own use, but I'd like to get it ACK'ed and into the util/ directory, as it seems like it's widely useful. I got sick of having to check individual services to see if any had failed, so I wrote this to iterate over all the relevant services, check their status, and to ensure that the right ports were up.
-- Matt
12 years, 10 months
[PATCH aeolus] Return 401 on unauthorized xml request
by Martyn Taylor
From: Martyn Taylor <mtaylor(a)redhat.com>
---
src/app/controllers/application_controller.rb | 11 ++++++++---
1 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/src/app/controllers/application_controller.rb b/src/app/controllers/application_controller.rb
index cb4a1d3..5fdaa8e 100644
--- a/src/app/controllers/application_controller.rb
+++ b/src/app/controllers/application_controller.rb
@@ -213,9 +213,14 @@ class ApplicationController < ActionController::Base
def require_user
return if current_user
- store_location
- flash[:notice] = "You must be logged in to access this page"
- redirect_to login_url
+ respond_to do |format|
+ format.html do
+ store_location
+ flash[:notice] = "You must be logged in to access this page"
+ redirect_to login_url
+ end
+ format.xml { head :unauthorized }
+ end
end
def require_no_user
--
1.7.4
12 years, 10 months