Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Adeed stuff to gitignore list, got nested forms working again.

  • Loading branch information...
commit a161283b03ca8b723206ae1f1c98b61cb4b81e93 1 parent d80f3cc
Robert Brandin authored
2  .gitignore
View
@@ -2,3 +2,5 @@
db/*.sqlite3
log/*.log
tmp/
+public/javascripts/
+public/stylesheets/
1  Gemfile
View
@@ -10,6 +10,7 @@ gem 'simple_form'
gem 'nested_form'
gem 'cocoon'
gem 'decent_exposure'
+gem 'dynamic_form'
group :development do
gem 'hpricot'
4 Gemfile.lock
View
@@ -50,7 +50,7 @@ GEM
celerity (0.8.8)
childprocess (0.1.7)
ffi (~> 0.6.3)
- cocoon (1.0.1)
+ cocoon (1.0.0)
configuration (1.2.0)
cucumber (0.10.0)
builder (>= 2.1.2)
@@ -67,6 +67,7 @@ GEM
bcrypt-ruby (~> 2.1.2)
warden (~> 1.0.2)
diff-lcs (1.1.2)
+ dynamic_form (1.1.4)
erubis (2.6.6)
abstract (>= 1.0.0)
factory_girl (1.3.3)
@@ -178,6 +179,7 @@ DEPENDENCIES
database_cleaner
decent_exposure
devise
+ dynamic_form
factory_girl_rails
haml
hpricot
4 app/views/devise/sessions/new.html.haml
View
@@ -1,8 +1,8 @@
- title "Sign in"
= header('Sign In') do
- = simple_form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f|
- %p
+ = simple_form_for(resource, :as => resource_name, :url => session_path(resource_name), :html => {:class => 'form'}) do |f|
+ .clearfix
= f.label :email
= f.text_field :email
%p
18 app/views/instruments/_analytical_method_fields.html.haml
View
@@ -1,10 +1,10 @@
-.nested-fields
- = f.label 'Method'
- = f.text_field :name
- = link_to_remove_association image_tag('minus.png', :height => '20', :class => 'minus'), f
- = f.simple_fields_for :analytes do |analyte|
- = render 'analyte_fields', :f => analyte
- = f.error :analytes
- .links{ :id => 'analyte-links' }
- = link_to_add_association 'Add analyte', f, :analytes
+/ .nested-fields
+/ = f.label 'Method'
+/ = f.text_field :name
+/ = link_to_remove_association image_tag('minus.png', :height => '20', :class => 'minus'), f
+/ = f.simple_fields_for :analytes do |analyte|
+/ = render 'analyte_fields', :f => analyte
+/ = f.error :analytes
+/ .links{ :id => 'analyte-links' }
+/ = link_to_add_association 'Add analyte', f, :analytes
35 app/views/instruments/_instrument_form.html.haml
View
@@ -1,12 +1,29 @@
-= simple_form_for @instrument do |f|
- = f.input :name
- %p
- = f.simple_fields_for :analytical_methods do |analytical_method|
- = render 'analytical_method_fields', :f => analytical_method
- = f.error :analytical_methods
- %div{:id=>"new-methods"}
- .links
- =link_to_add_association 'Add method', f, :analytical_methods
+= nested_form_for @instrument do |f|
+ = f.label :name
+ = f.text_field :name
+ / = f.input :name
+
+ = f.fields_for :analytical_methods do |analytical_method|
+ = analytical_method.text_field :name
+ = analytical_method.link_to_remove "Remove this method"
+ = analytical_method.fields_for :analytes do |analyte|
+ = analyte.text_field :name
+ = analyte.link_to_remove "Remove this analyte"
+ = analytical_method.link_to_add "Add an analyte", :analytes
+ = f.link_to_add "Add an analytical method", :analytical_methods
+ / #analytical_methods
+ / = f.simple_fields_for :analytical_methods do |analytical_method|
+ / = render 'analytical_method_fields', :f => analytical_method
+ / = f.error :analytical_methods
+ / .links
+ / =link_to_add_association 'Add method', f, :analytical_methods
+ / %p
+ / = f.simple_fields_for :analytical_methods do |analytical_method|
+ / = render 'analytical_method_fields', :f => analytical_method
+ / = f.error :analytical_methods
+ / %div{:id=>"new-methods"}
+ / .links
+ / =link_to_add_association 'Add method', f, :analytical_methods
= f.submit @instrument.new_record? ? 'Create instrument' : 'Update Instrument', :disable_with => "Submitting..."
2  app/views/instruments/new.html.haml
View
@@ -1,5 +1,5 @@
- title "New Instrument"
= header('New Instrument') do
- = render :partial => 'instruments/instrument_form'
+ = render :partial => 'instrument_form'
3  app/views/layouts/_javascript.html.haml
View
@@ -13,7 +13,8 @@
= javascript_include_tag "jquery.tables"
= javascript_include_tag "jquery.flot"
= javascript_include_tag "global-mod"
-= javascript_include_tag "cocoon"
+= javascript_include_tag "nested_form"
+/ = javascript_include_tag :cocoon
/[if lt IE 9]
= javascript_include_tag "ie"
2  app/views/layouts/_nav_bar.html.haml
View
@@ -3,7 +3,7 @@
%nav
%ul{ :class => "clearfix" }
%li
- %a{ :href => root_path } <strong>Chromalog</strong>
+ %a{ :href => root_path, :class => "logo" } <strong>Chromalog</strong>
- if anybody_signed_in?
%li
%a{ :href => "#", :class => "arrow-down" } Log
2  app/views/run_logs/_run_log_form.html.haml
View
@@ -10,7 +10,7 @@
%bigtext @
= f.text_field :flow_rate, :as => :string, :size => 3
%bigtext mL/min
-
+
= render :partial => 'run_log_level', :collection => @levels, :as => :level, :locals => { :f => f }
2  app/views/run_logs/intro.html.haml
View
@@ -2,7 +2,7 @@
= header('Log a Run') do
.ajaxy_intro
- - form_tag new_run_log_path, :method => 'get' do
+ = form_tag new_run_log_path, :method => 'get' do
%p
= label_tag(:instrument, "Instrument")
= select_tag :instrument, options_for_select([["Select one", ""]] + instruments.collect{ |i| [i.name, i.id] }), :class => "dynamic_select"
16 features/manage_instruments.feature
View
@@ -0,0 +1,16 @@
+Feature: Manage users
+ In order to keep track of instruments
+ As a user
+ I would like to be able to manage instruments in Chromalog
+
+ @javascript
+ Scenario: Editing an instrument
+ Given I am an authenticated user
+ And the database is seeded with a test instrument, method, and column
+ And I visit the instruments index
+ And I follow "Edit"
+ And I wait for 3 seconds
+ And I fill in "Name" with "Test Name 2"
+ And I press "Update Instrument"
+ Then I should be on the instrument index
+ And I should see "Instrument successfully edited."
3  features/manage_run_logs.feature
View
@@ -18,4 +18,5 @@ Feature: Manage users
And I fill in "Std_Conc" with "3"
And I fill it "Analyte" with "3"
And I press "Create Run log"
- Then I should be on the homepage
+ Then I should be on the homepage
+
5 features/step_definitions/user_steps.rb
View
@@ -47,6 +47,11 @@
visit('/analytical_standards/intro')
end
+Given /^I visit the instruments index$/ do
+ visit instruments_path
+end
+
+
2  features/support/paths.rb
View
@@ -12,6 +12,8 @@ def path_to(page_name)
'/'
when /the new user page/
new_user_registration_path
+ when /the instrument index/
+ instruments_path
# Add more mappings here.
42 public/javascripts/application.js
View
@@ -1,20 +1,39 @@
$(document).ready(function() {
- $("span.editlink a").click( function() {
+ // AJAX and slide in edit window
+ var first_run = true
+ $("span.editlink a").live( 'click', function() {
var edit_url = $(this).attr("href");
- $(".main-content.grid_2.alpha").animate({
- width: "0%"
- }, 200, function() {
- $(this).remove();
- });
- $(".main-content.grid_4").addClass("alpha");
- var new_div = $(".main-content.grid_2").removeClass('grid_2 omega').addClass('grid_4 omega');
- $.get(edit_url + ".js", function(data) {
- new_div.html("<header><h2>Edit Instrument</h2></header><section class='clearfix'>" + data + "</section>").toggle().slideDown(200);
- });
+ if(first_run) {
+ $(".main-content.grid_2.alpha").animate({
+ width: "0%"
+ }, 200, function() {
+ $(this).remove();
+ });
+ $(".main-content.grid_4").addClass("alpha");
+ var new_div = $(".main-content.grid_2").removeClass('grid_2 omega').addClass('grid_4 omega');
+ $.get(edit_url + ".js", function(data) {
+ new_div.html("<header><h2>Edit Instrument</h2></header><section class='clearfix' id='ajaxed_in'>" + data + "</section>").toggle().slideDown(200);
+ });
+ first_run = false
+ } else {
+ $("section#ajaxed_in").slideUp('fast', function() {
+ $.get(edit_url + ".js", function(data) {
+ $("section#ajaxed_in").html(data).slideDown(200);
+ });
+ });
+ };
return false
});
+ // Fade out flash messages
+ setTimeout(function() {
+ $("div.message").fadeOut('slow', function(){
+ $(this).remove();
+ });
+ }, 2000);
+
+ // AJAX in intro-dependent form and tabulate form
$(".ajaxy_intro form").live("submit", function(){
var queryString = $(this).serialize();
var url = $(this).attr("action");
@@ -48,6 +67,7 @@ $(document).ready(function() {
return false;
});
+ // Dynamic selects
$("p .dynamic_select").change(function(){
var next_select = $(this).parent().next().children('select');
var next_select_id = $(next_select).attr('id');
34 public/javascripts/cocoon.js
View
@@ -1,41 +1,61 @@
$(document).ready(function() {
- $('.add_fields').live('click', function() {
+ function replace_in_content(content, regexp_str, with_str) {
+ reg_exp = new RegExp(regexp_str);
+ content.replace(reg_exp, with_str)
+ }
+
+
+ $('add_fields').live('click', function() {
var assoc = $(this).attr('data-association');
- var content = $(this).siblings('#' + assoc + '_fields_template').html();
+ var assocs = $(this).attr('data-associations');
+ var content = $(this).attr('data-template');
var insertionPosition = $(this).attr('data-association-insertion-position');
var insertionNode = $(this).attr('data-association-insertion-node');
+ var insertionCallback = $(this).data('insertion-callback');
var regexp_braced = new RegExp('\\[new_' + assoc + '\\]', 'g');
+ var regexp_underscord = new RegExp('_new_' + assoc + '_', 'g');
var new_id = new Date().getTime();
+ var newcontent_braced = '[' + new_id + ']';
+ var newcontent_underscord = '_' + new_id + '_';
var new_content = content.replace(regexp_braced, '[' + new_id + ']');
if (new_content == content) {
- regexp_braced = new RegExp('\\[new_' + assoc + 's\\]', 'g');
+ regexp_braced = new RegExp('\\[new_' + assocs + '\\]', 'g');
+ regexp_underscord = new RegExp('_new_' + assocs + '_', 'g');
new_content = content.replace(regexp_braced, '[' + new_id + ']');
}
+ new_content = new_content.replace(regexp_underscord, newcontent_underscord);
+
if (insertionNode) {
insertionNode = $(insertionNode);
}
else {
insertionNode = $(this).parent();
}
+
+ var contentNode = $(new_content);
if (insertionPosition == 'after'){
- insertionNode.after(new_content);
+ insertionNode.after(contentNode);
} else {
- insertionNode.before(new_content);
+ insertionNode.before(contentNode);
+ }
+
+ if(insertionCallback){
+ insertionCallback.call(contentNode);
}
return false;
});
$('.remove_fields.dynamic').live('click', function() {
- $(this).closest(".nested-fields").slideUp(200, this.remove);
+ $(this).closest(".nested-fields").remove();
return false;
});
$('.remove_fields.existing').live('click', function() {
$(this).prev("input[type=hidden]").val("1");
- $(this).closest(".nested-fields").slideUp(200, this.hide);
+ $(this).closest(".nested-fields").hide();
return false;
});
274 public/javascripts/global-mod.js
View
@@ -75,48 +75,48 @@ $(document).ready(function() {
/**
* Skin file input elements
*/
- $(':file').each(function(){
- var file = this;
- $(this).attr('size', 25).wrap('<span class="ui-file" />')
- .before('<span class="ui-file-value">No file chosen</span><button class="ui-file-button button button-gray">Browse...</button>')
- .change(function(){
- $(file).parent().find('.ui-file-value').html($(this).val()? $(this).val() : 'No file chosen');
- })
- .hover(
- function(){ $(file).prev().addClass('hover');},
- function(){ $(file).prev().removeClass('hover');}
- ).mousedown(function(){$(file).prev().addClass('active');})
- .bind('mouseup mouseleave', function(){$(file).prev().removeClass('active');})
- .parent().disableSelection();
- });
+ // $(':file').each(function(){
+ // var file = this;
+ // $(this).attr('size', 25).wrap('<span class="ui-file" />')
+ // .before('<span class="ui-file-value">No file chosen</span><button class="ui-file-button button button-gray">Browse...</button>')
+ // .change(function(){
+ // $(file).parent().find('.ui-file-value').html($(this).val()? $(this).val() : 'No file chosen');
+ // })
+ // .hover(
+ // function(){ $(file).prev().addClass('hover');},
+ // function(){ $(file).prev().removeClass('hover');}
+ // ).mousedown(function(){$(file).prev().addClass('active');})
+ // .bind('mouseup mouseleave', function(){$(file).prev().removeClass('active');})
+ // .parent().disableSelection();
+ // });
/**
* Setup tooltips
*/
- $('[title]').tooltip({
- effect: 'slide', offset: [-14, 0], position: 'top center', layout: '<div><em/></div>',
- onBeforeShow: function() {
- this.getTip().each(function(){
- if ($.browser.msie) {
- PIE.attach(this);
- }
- });
- },
- onHide: function() {
- this.getTip().each(function(){
- if ($.browser.msie) {
- PIE.detach(this);
- }
- });
- }
- }).dynamic({
- bottom: { direction: 'down', bounce: true }
- });
+ // $('[title]').tooltip({
+ // effect: 'slide', offset: [-14, 0], position: 'top center', layout: '<div><em/></div>',
+ // onBeforeShow: function() {
+ // this.getTip().each(function(){
+ // if ($.browser.msie) {
+ // PIE.attach(this);
+ // }
+ // });
+ // },
+ // onHide: function() {
+ // this.getTip().each(function(){
+ // if ($.browser.msie) {
+ // PIE.detach(this);
+ // }
+ // });
+ // }
+ // }).dynamic({
+ // bottom: { direction: 'down', bounce: true }
+ // });
/**
* Setup the Accordions
*/
- $(".accordion").tabs(".accordion section", {tabs: 'header', effect: 'slide', initialIndex: null});
+ // $(".accordion").tabs(".accordion section", {tabs: 'header', effect: 'slide', initialIndex: null});
/**
* Setup the Tabs
@@ -126,146 +126,146 @@ $(document).ready(function() {
/**
* Setup the Sidebar tabs
*/
- $("ul.sidebar-tabs").tabs("div.panes > section");
+ // $("ul.sidebar-tabs").tabs("div.panes > section");
/**
* Textbox Placeholder
*/
- $('input[placeholder]').placeholder();
+ // $('input[placeholder]').placeholder();
/**
* attach calendar to date inputs
*/
- $(":date")
- .wrap('<span class="ui-date" />')
- .dateinput({trigger: true, format: 'mm/dd/yyyy', selectors: true})
- .focus(function(){$(this).parent().addClass('ui-focused'); return false;})
- .blur(function(){$(this).parent().removeClass('ui-focused'); return false;});
+ // $(":date")
+ // .wrap('<span class="ui-date" />')
+ // .dateinput({trigger: true, format: 'mm/dd/yyyy', selectors: true})
+ // .focus(function(){$(this).parent().addClass('ui-focused'); return false;})
+ // .blur(function(){$(this).parent().removeClass('ui-focused'); return false;});
/**
* add close buttons to closeable message boxes
*/
- $(".message.closeable").prepend('<span class="message-close"></span>')
- .find('.message-close')
- .click(function(){
- $(this).parent().fadeOut(function(){$(this).remove();});
- });
+ // $(".message.closeable").prepend('<span class="message-close"></span>')
+ // .find('.message-close')
+ // .click(function(){
+ // $(this).parent().fadeOut(function(){$(this).remove();});
+ // });
/**
* setup popup balloons (add contact / add task)
*/
- $('.has-popupballoon').click(function(){
- // close all open popup balloons
- $('.popupballoon').fadeOut();
- $(this).next().fadeIn();
- return false;
- });
-
- $('.popupballoon .close').click(function(){
- $(this).parents('.popupballoon').fadeOut();
- });
+ // $('.has-popupballoon').click(function(){
+ // // close all open popup balloons
+ // $('.popupballoon').fadeOut();
+ // $(this).next().fadeIn();
+ // return false;
+ // });
+ //
+ // $('.popupballoon .close').click(function(){
+ // $(this).parents('.popupballoon').fadeOut();
+ // });
/**
* floating menu
*/
- if ($('#wrapper > header').length>0) { menuYloc = parseInt($('#wrapper > header').css("top").substring(0,$('#wrapper > header').css("top").indexOf("px")), 10); }
- $(window).scroll(function () {
- var offset = 0;
- if ($('#wrapper > header').length>0) {
- offset = menuYloc+$(document).scrollTop();
- if (!$.browser.msie) { $('#wrapper > header').animate({opacity: ($(document).scrollTop()<=10? 1 : 0.8)}); }
- }
- });
-
- if (!$.browser.msie) {
- $('#wrapper > header').hover(
- function(){$(this).animate({opacity: 1});},
- function(){$(this).animate({opacity: ($(document).scrollTop()<=10? 1 : 0.8)});}
- );
- }
+ // if ($('#wrapper > header').length>0) { menuYloc = parseInt($('#wrapper > header').css("top").substring(0,$('#wrapper > header').css("top").indexOf("px")), 10); }
+ // $(window).scroll(function () {
+ // var offset = 0;
+ // if ($('#wrapper > header').length>0) {
+ // offset = menuYloc+$(document).scrollTop();
+ // if (!$.browser.msie) { $('#wrapper > header').animate({opacity: ($(document).scrollTop()<=10? 1 : 0.8)}); }
+ // }
+ // });
+ //
+ // if (!$.browser.msie) {
+ // $('#wrapper > header').hover(
+ // function(){$(this).animate({opacity: 1});},
+ // function(){$(this).animate({opacity: ($(document).scrollTop()<=10? 1 : 0.8)});}
+ // );
+ // }
/**
* html element for the help popup
*/
- $('body').append('<div class="apple_overlay black" id="overlay"><iframe class="contentWrap" style="width: 100%; height: 500px"></iframe></div>');
+ // $('body').append('<div class="apple_overlay black" id="overlay"><iframe class="contentWrap" style="width: 100%; height: 500px"></iframe></div>');
/**
* this is the help popup
*/
- $("a.help[rel]").overlay({
-
- effect: 'apple',
-
- onBeforeLoad: function() {
-
- // grab wrapper element inside content
- var wrap = this.getOverlay().find(".contentWrap");
-
- // load the page specified in the trigger
- wrap.attr('src', this.getTrigger().attr("href"));
- }
-
- });
+ // $("a.help[rel]").overlay({
+ //
+ // effect: 'apple',
+ //
+ // onBeforeLoad: function() {
+ //
+ // // grab wrapper element inside content
+ // var wrap = this.getOverlay().find(".contentWrap");
+ //
+ // // load the page specified in the trigger
+ // wrap.attr('src', this.getTrigger().attr("href"));
+ // }
+ //
+ // });
/**
* Form Validators
*/
// Regular Expression to test whether the value is valid
- $.tools.validator.fn("[type=time]", "Please supply a valid time", function(input, value) {
- return (/^\d\d:\d\d$/).test(value);
- });
-
- $.tools.validator.fn("[data-equals]", "Value not equal with the $1 field", function(input) {
- var name = input.attr("data-equals"),
- field = this.getInputs().filter("[name=" + name + "]");
- return input.val() === field.val() ? true : [name];
- });
-
- $.tools.validator.fn("[minlength]", function(input, value) {
- var min = input.attr("minlength");
-
- return value.length >= min ? true : {
- en: "Please provide at least " +min+ " character" + (min > 1 ? "s" : "")
- };
- });
-
- $.tools.validator.localizeFn("[type=time]", {
- en: 'Please supply a valid time'
- });
+ // $.tools.validator.fn("[type=time]", "Please supply a valid time", function(input, value) {
+ // return (/^\d\d:\d\d$/).test(value);
+ // });
+ //
+ // $.tools.validator.fn("[data-equals]", "Value not equal with the $1 field", function(input) {
+ // var name = input.attr("data-equals"),
+ // field = this.getInputs().filter("[name=" + name + "]");
+ // return input.val() === field.val() ? true : [name];
+ // });
+ //
+ // $.tools.validator.fn("[minlength]", function(input, value) {
+ // var min = input.attr("minlength");
+ //
+ // return value.length >= min ? true : {
+ // en: "Please provide at least " +min+ " character" + (min > 1 ? "s" : "")
+ // };
+ // });
+ //
+ // $.tools.validator.localizeFn("[type=time]", {
+ // en: 'Please supply a valid time'
+ // });
/**
* setup the validators
*/
- $(".form").validator({
- position: 'bottom left',
- offset: [5, 0],
- messageClass:'form-error',
- message: '<div><em/></div>' // em element is the arrow
- }).attr('novalidate', 'novalidate');
-
- if ($(sortableName).sortable) {
- $(sortableName).sortable({
- cursor: 'move',
- revert: 500,
- opacity: 0.7,
- appendTo: 'body',
- handle: 'header',
- items: '.widget-container[draggable=true]',
- placeholder: 'widget-placeholder grid_2',
- forcePlaceholderSize: true,
- start: function(event, ui) {
- ui.item.addClass('start-drag');
- },
- stop: function(event, ui) {
- ui.item.removeClass('start-drag');
- },
- update: function(event, ui) {
- if ($.cookie) {
- $.cookie(sortableCookie, $(this).sortable("toArray"), { expires: sortableCookieExpiry, path: "/" });
- }
- }
- }).disableSelection();
- }
+ // $(".form").validator({
+ // position: 'bottom left',
+ // offset: [5, 0],
+ // messageClass:'form-error',
+ // message: '<div><em/></div>' // em element is the arrow
+ // }).attr('novalidate', 'novalidate');
+ //
+ // if ($(sortableName).sortable) {
+ // $(sortableName).sortable({
+ // cursor: 'move',
+ // revert: 500,
+ // opacity: 0.7,
+ // appendTo: 'body',
+ // handle: 'header',
+ // items: '.widget-container[draggable=true]',
+ // placeholder: 'widget-placeholder grid_2',
+ // forcePlaceholderSize: true,
+ // start: function(event, ui) {
+ // ui.item.addClass('start-drag');
+ // },
+ // stop: function(event, ui) {
+ // ui.item.removeClass('start-drag');
+ // },
+ // update: function(event, ui) {
+ // if ($.cookie) {
+ // $.cookie(sortableCookie, $(this).sortable("toArray"), { expires: sortableCookieExpiry, path: "/" });
+ // }
+ // }
+ // }).disableSelection();
+ // }
/**
* restore the order of sortable widgets
3  public/stylesheets/messages.css
View
@@ -5,6 +5,9 @@
border-left: 1px solid rgba(100,100,100,0.1) !important;
padding: 5px;
height: 27px;
+ margin-right: 15px;
+ padding-right: 10px;
+ padding-left: 10px;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
-khtml-border-radius: 5px;
32 public/stylesheets/style.css
View
@@ -604,3 +604,35 @@ body > footer {
background-image:url(../images/overlay/transparent.png);
color:#fff;
}
+
+/*Logo styling*/
+
+.logo strong {
+ font-size: 110%;
+}
+
+.display-none {
+display:none;
+}
+
+.polaroid-border {
+ width: 350px;
+ margin-left: auto;
+ margin-right: auto;
+ margin-bottom: 5px;
+ padding: 25px 19px 87px;
+ -moz-box-shadow: 0 0 5px #888;
+ -webkit-box-shadow: 0 0 5px#888;
+ box-shadow: 0 0 5px #888;
+}
+
+.polaroid-block {
+ background: #EDEDED;
+ padding: 13px;
+ padding-bottom: 60px;
+ min-height: 240px;
+ -moz-box-shadow: inset 0 0 2px #888;
+ -webkit-box-shadow: inset 0 0 2px#888;
+ box-shadow: inner 0 0 2px #888;
+ position: relative;
+}
Please sign in to comment.
Something went wrong with that request. Please try again.