You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by bf...@apache.org on 2013/07/08 20:33:58 UTC
[1/5] git commit: updated refs/heads/4.2 to 39d68b4
Updated Branches:
refs/heads/4.2 8c34f35a3 -> 39d68b40b
CLOUDSTACK-3170: Support editing ACL rule items
Conflicts:
ui/scripts/vpc.js
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/b48d99b5
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/b48d99b5
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/b48d99b5
Branch: refs/heads/4.2
Commit: b48d99b51821d8cbcb0a4e45ae7e3e42341ab775
Parents: 8c34f35
Author: Brian Federle <br...@citrix.com>
Authored: Wed Jun 26 12:07:52 2013 -0700
Committer: Brian Federle <br...@citrix.com>
Committed: Mon Jul 8 11:33:27 2013 -0700
----------------------------------------------------------------------
ui/scripts/ui/dialog.js | 4 +-
ui/scripts/ui/widgets/multiEdit.js | 5 +-
ui/scripts/vpc.js | 291 ++++++++++++++++++++++----------
3 files changed, 204 insertions(+), 96 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b48d99b5/ui/scripts/ui/dialog.js
----------------------------------------------------------------------
diff --git a/ui/scripts/ui/dialog.js b/ui/scripts/ui/dialog.js
index 6f05af2..e4ca389 100644
--- a/ui/scripts/ui/dialog.js
+++ b/ui/scripts/ui/dialog.js
@@ -236,7 +236,7 @@
response: {
success: function(args) {
$(args.data).each(function() {
- var id = this.id;
+ var id = this.id ? this.id : this.name;
var description = this.description;
if (args.descriptionField)
@@ -272,7 +272,7 @@
.appendTo($value);
// Pass form item to provider for additional manipulation
- $.extend(selectArgs, { $select: $input });
+ $.extend(selectArgs, { $select: $input, $form: $form, type: 'createForm' });
if (dependsOn) {
$dependsOn = $input.closest('form').find('input, select').filter(function() {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b48d99b5/ui/scripts/ui/widgets/multiEdit.js
----------------------------------------------------------------------
diff --git a/ui/scripts/ui/widgets/multiEdit.js b/ui/scripts/ui/widgets/multiEdit.js
index 37c5abf..08bd0bf 100755
--- a/ui/scripts/ui/widgets/multiEdit.js
+++ b/ui/scripts/ui/widgets/multiEdit.js
@@ -336,8 +336,7 @@
},
error: function(args) {
error(args);
- $loading.remove();
- $dataItem.show();
+ $multi.trigger('refresh');
return cloudStack.dialog.error;
}
@@ -402,6 +401,8 @@
var editableFields = {};
$.each(fields, function(key, field) {
+ field.isDisabled = false;
+
if (field && field.isEditable) editableFields[key] = $.extend(true, {}, field, {
defaultValue: data[key]
});
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b48d99b5/ui/scripts/vpc.js
----------------------------------------------------------------------
diff --git a/ui/scripts/vpc.js b/ui/scripts/vpc.js
index 4add0be..e31121e 100644
--- a/ui/scripts/vpc.js
+++ b/ui/scripts/vpc.js
@@ -62,13 +62,15 @@
'number':{
label:'Rule Number',
- edit:true
+ edit:true,
+ isEditable: true
},
- 'cidrlist': { edit: true, label: 'label.cidr' },
+ 'cidrlist': { edit: true, label: 'label.cidr', isEditable: true },
action: {
label: 'Action',
+ isEditable: true,
select: function(args) {
args.response.success({
data: [
@@ -80,67 +82,125 @@
},
'protocol': {
label: 'label.protocol',
+ isEditable: true,
select: function(args) {
+ var isEditDialog = args.type === 'createForm';
+
args.$select.change(function() {
- var $inputs = args.$form.find('input');
- var $icmpFields = $inputs.filter(function() {
- var name = $(this).attr('name');
-
- return $.inArray(name, [
- 'icmptype',
- 'icmpcode'
- ]) > -1;
- });
- var $otherFields = $inputs.filter(function() {
- var name = $(this).attr('name');
-
- return name != 'protocolnumber' &&
- name != 'icmptype' &&
- name != 'icmpcode' &&
- name != 'cidrlist' &&
- name != 'number';
- });
- var $portFields = $inputs.filter(function() {
- var name = $(this).attr('name');
- return $.inArray(name, [
- 'startport',
- 'endport'
- ]) > -1;
- });
+ var $inputs, $icmpFields, $otherFields, $portFields, $protocolFields, $protocolinput;
+
+ //
+ // Editing existing rules in createForm dialog
+ //
+ if (isEditDialog) {
+ $inputs = args.$form.find('.form-item');
+ $icmpFields = $inputs.filter(function() {
+ var name = $(this).attr('rel');
+
+ return $.inArray(name, [
+ 'icmptype',
+ 'icmpcode'
+ ]) > -1;
+ });
+ $otherFields = $inputs.filter(function() {
+ var name = $(this).attr('rel');
- var $protocolinput = args.$form.find('td input');
- var $protocolFields = $protocolinput.filter(function(){
- var name = $(this).attr('name');
+ return name != 'protocolnumber' &&
+ name != 'icmptype' &&
+ name != 'icmpcode' &&
+ name != 'cidrlist';
+ });
+ $portFields = $inputs.filter(function() {
+ var name = $(this).attr('rel');
+ return $.inArray(name, [
+ 'startport',
+ 'endport'
+ ]) > -1;
+ });
+ $protocolFields = $inputs.filter(function(){
+ var name = $(this).attr('rel');
- return $.inArray(name,['protocolnumber']) > -1;
- });
+ return $.inArray(name,['protocolnumber']) > -1;
+ });
- if ($(this).val() == 'protocolnumber' ){
- $icmpFields.hide();
- $otherFields.hide();
- $protocolFields.show().addClass('required');
- $portFields.show();
- } else if ($(this).val() == 'icmp') {
- $icmpFields.show();
- $icmpFields.attr('disabled', false);
- $protocolFields.hide().removeClass('required');
- $otherFields.attr('disabled', 'disabled');
- $otherFields.hide();
- $otherFields.parent().find('label.error').hide();
- }
- else if ($(this).val() == 'all'){
- $portFields.attr('disabled', 'disabled');
+ if ($(this).val() == 'protocolnumber' ){
+ $icmpFields.hide();
+ $portFields.show();
+ $protocolFields.show();
+ } else if ($(this).val() == 'icmp') {
+ $icmpFields.show();
+ $protocolFields.hide();
$portFields.hide();
- }
+ } else {
+ $otherFields.show();
+ $icmpFields.hide();
+ $protocolFields.hide();
+
+ if ($(this).val() == 'all') {
+ $portFields.hide();
+ }
+ }
+ } else {
+ //
+ // Add new form
+ //
+ $inputs = args.$form.find('input');
+ $icmpFields = $inputs.filter(function() {
+ var name = $(this).attr('name');
+
+ return $.inArray(name, [
+ 'icmptype',
+ 'icmpcode'
+ ]) > -1;
+ });
+ $otherFields = $inputs.filter(function() {
+ var name = $(this).attr('name');
+
+ return name != 'protocolnumber' &&
+ name != 'icmptype' &&
+ name != 'icmpcode' &&
+ name != 'cidrlist' &&
+ name != 'number';
+ });
+ $portFields = $inputs.filter(function() {
+ var name = $(this).attr('name');
+ return $.inArray(name, [
+ 'startport',
+ 'endport'
+ ]) > -1;
+ });
+
+ $protocolinput = args.$form.find('td input');
+ $protocolFields = $protocolinput.filter(function(){
+ var name = $(this).attr('name');
+
+ return $.inArray(name,['protocolnumber']) > -1;
+ });
- else {
- $otherFields.show();
- $otherFields.parent().find('label.error').hide();
- $otherFields.attr('disabled', false);
- $icmpFields.attr('disabled', 'disabled');
- $icmpFields.hide();
- $icmpFields.parent().find('label.error').hide();
- $protocolFields.hide().removeClass('required');
+ if ($(this).val() == 'protocolnumber' ){
+ $icmpFields.hide();
+ $otherFields.hide();
+ $protocolFields.show().addClass('required');
+ } else if ($(this).val() == 'icmp') {
+ $icmpFields.show();
+ $icmpFields.attr('disabled', false);
+ $protocolFields.hide().removeClass('required');
+ $otherFields.attr('disabled', 'disabled');
+ $otherFields.hide();
+ $otherFields.parent().find('label.error').hide();
+ } else {
+ $otherFields.show();
+ $otherFields.parent().find('label.error').hide();
+ $otherFields.attr('disabled', false);
+ $icmpFields.attr('disabled', 'disabled');
+ $icmpFields.hide();
+ $icmpFields.parent().find('label.error').hide();
+ $protocolFields.hide().removeClass('required');
+ if ($(this).val() == 'all'){
+ $portFields.attr('disabled', 'disabled');
+ $portFields.hide();
+ }
+ }
}
});
@@ -159,9 +219,9 @@
}
},
- 'protocolnumber': {label:'Protocol Number',edit:true},
- 'startport': { edit: true, label: 'label.start.port', isOptional: true },
- 'endport': { edit: true, label: 'label.end.port', isOptional: true },
+ 'protocolnumber': {label:'Protocol Number',edit:true, isEditable: true},
+ 'startport': { edit: true, label: 'label.start.port', isOptional: true, isEditable: true },
+ 'endport': { edit: true, label: 'label.end.port', isOptional: true, isEditable: true },
'networkid': {
label: 'Select Tier',
select: function(args) {
@@ -198,10 +258,11 @@
});
}
},
- 'icmptype': { edit: true, label: 'ICMP.type', isDisabled: true, desc:'Please specify -1 if you want to allow all ICMP types', defaultValue:'-1' },
- 'icmpcode': { edit: true, label: 'ICMP.code', isDisabled: true, desc:'Please specify -1 if you want to allow all ICMP codes', defaultValue:'-1' },
+ 'icmptype': { edit: true, label: 'ICMP.type', isDisabled: true, desc:'Please specify -1 if you want to allow all ICMP types', defaultValue:'-1', isEditable: true },
+ 'icmpcode': { edit: true, label: 'ICMP.code', isDisabled: true, desc:'Please specify -1 if you want to allow all ICMP codes', defaultValue:'-1', isEditable: true },
'traffictype' : {
label: 'label.traffic.type',
+ isEditable: true,
select: function(args) {
args.response.success({
data: [
@@ -225,54 +286,100 @@
var $multi = args.$multi;
//Support for Protocol Number between 0 to 255
if(args.data.protocol == 'protocolnumber'){
- $.extend(args.data,{protocol:args.data.protocolnumber});
- delete args.data.protocolnumber;
+ $.extend(args.data,{protocol:args.data.protocolnumber});
+ delete args.data.protocolnumber;
}
else
delete args.data.protocolnumber;
-
+
if((args.data.protocol == 'tcp' || args.data.protocol == 'udp') && (args.data.startport=="" || args.data.startport == undefined)){
- cloudStack.dialog.notice({message:_l('Start Port or End Port value should not be blank')});
+ cloudStack.dialog.notice({message:_l('Start Port or End Port value should not be blank')});
$(window).trigger('cloudStack.fullRefresh');
}
else if((args.data.protocol == 'tcp' || args.data.protocol == 'udp') && (args.data.endport=="" || args.data.endport == undefined)){
- cloudStack.dialog.notice({message:_l('Start Port or End Port value should not be blank')});
+ cloudStack.dialog.notice({message:_l('Start Port or End Port value should not be blank')});
$(window).trigger('cloudStack.fullRefresh');
}
- else{
- $.ajax({
- url: createURL('createNetworkACL'),
- data: $.extend(args.data, {
- aclid: args.context.aclLists[0].id
- }),
- dataType: 'json',
- success: function(data) {
- args.response.success({
- _custom: {
- jobId: data.createnetworkaclresponse.jobid,
- getUpdatedItem: function(json) {
- $(window).trigger('cloudStack.fullRefresh');
+ else{
+ $.ajax({
+ url: createURL('createNetworkACL'),
+ data: $.extend(args.data, {
+ aclid: args.context.aclLists[0].id
+ }),
+ dataType: 'json',
+ success: function(data) {
+ args.response.success({
+ _custom: {
+ jobId: data.createnetworkaclresponse.jobid,
+ getUpdatedItem: function(json) {
+ $(window).trigger('cloudStack.fullRefresh');
- return data;
+ return data;
+ }
+ },
+ notification: {
+ label: 'label.add.ACL',
+ poll: pollAsyncJobResult
}
- },
- notification: {
- label: 'label.add.ACL',
- poll: pollAsyncJobResult
- }
- });
- },
- error: function(data) {
- args.response.error(parseXMLHttpResponse(data));
- }
- });
- }
+ });
+ },
+ error: function(data) {
+ args.response.error(parseXMLHttpResponse(data));
+ }
+ });
+ }
}
},
actions: {
+ edit: {
+ label: 'label.edit',
+ action: function(args) {
+ var data = {
+ id: args.context.multiRule[0].id,
+ cidrlist: args.data.cidrlist,
+ number: args.data.number,
+ protocol: args.data.protocol,
+ traffictype: args.data.traffictype,
+ action: args.data.action
+ };
+
+ if (data.protocol === 'tcp' || data.protocol === 'udp') {
+ $.extend(data, {
+ startport: args.data.startport,
+ endport: args.data.endport
+ });
+ } else if (data.protocol === 'icmp') {
+ $.extend(data, {
+ icmptype: args.data.icmptype,
+ icmpcode: args.data.icmpcode
+ });
+ } else if (data.protocol === 'protocolnumber') {
+ $.extend(data, {
+ protocolnumber: args.data.protocolnumber
+ });
+ }
+
+ $.ajax({
+ url: createURL('updateNetworkACLItem'),
+ data: data,
+ success: function(json) {
+ args.response.success({
+ _custom: { jobId: json.createnetworkaclresponse.jobid }, // API response obj name needs to be fixed
+ notification: {
+ label: 'Edit ACL rule',
+ poll: pollAsyncJobResult
+ }
+ });
+ },
+ error: function(error) {
+ args.response.error(parseXMLHttpResponse(error));
+ }
+ });
+ }
+ },
destroy: {
label: 'label.remove.ACL',
action: function(args) {
[4/5] git commit: updated refs/heads/4.2 to 39d68b4
Posted by bf...@apache.org.
Region selector UI: Fix overlap issue with other dialogs
Remove z-index from region select button, to prevent overlap with other dialogs.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/39d68b40
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/39d68b40
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/39d68b40
Branch: refs/heads/4.2
Commit: 39d68b40b4e989378f7266b7a33fcde6303f587d
Parents: 2f3c9a0
Author: Brian Federle <br...@citrix.com>
Authored: Tue Jul 2 13:31:28 2013 -0700
Committer: Brian Federle <br...@citrix.com>
Committed: Mon Jul 8 11:33:28 2013 -0700
----------------------------------------------------------------------
ui/css/cloudstack3.css | 1 -
1 file changed, 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/39d68b40/ui/css/cloudstack3.css
----------------------------------------------------------------------
diff --git a/ui/css/cloudstack3.css b/ui/css/cloudstack3.css
index e4459a1..50a36f0 100644
--- a/ui/css/cloudstack3.css
+++ b/ui/css/cloudstack3.css
@@ -11624,7 +11624,6 @@ div.ui-dialog div.autoscaler div.field-group div.form-container form div.form-it
/*Regions*/
.region-switcher {
display: inline-block;
- z-index: 2002;
position: relative;
background: url(../images/bg-gradients.png) repeat-x 0px -867px;
border: 1px solid #5E5E5E;
[5/5] git commit: updated refs/heads/4.2 to 39d68b4
Posted by bf...@apache.org.
Multi-edit: edit rule UI: fix regression and restore functionality
Conflicts:
ui/scripts/ui/dialog.js
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/f2391366
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/f2391366
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/f2391366
Branch: refs/heads/4.2
Commit: f2391366053dda2a26ea8570269101bc1d828d78
Parents: b48d99b
Author: Brian Federle <br...@citrix.com>
Authored: Mon Jul 1 14:28:52 2013 -0700
Committer: Brian Federle <br...@citrix.com>
Committed: Mon Jul 8 11:33:28 2013 -0700
----------------------------------------------------------------------
ui/scripts/ui/dialog.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f2391366/ui/scripts/ui/dialog.js
----------------------------------------------------------------------
diff --git a/ui/scripts/ui/dialog.js b/ui/scripts/ui/dialog.js
index e4ca389..7f82eea 100644
--- a/ui/scripts/ui/dialog.js
+++ b/ui/scripts/ui/dialog.js
@@ -236,7 +236,7 @@
response: {
success: function(args) {
$(args.data).each(function() {
- var id = this.id ? this.id : this.name;
+ var id = this.id !== undefined ? this.id : this.name;
var description = this.description;
if (args.descriptionField)
[2/5] git commit: updated refs/heads/4.2 to 39d68b4
Posted by bf...@apache.org.
UI: Localize app name and 'about' window
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/33c144a4
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/33c144a4
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/33c144a4
Branch: refs/heads/4.2
Commit: 33c144a463090f0ab053023c61cc036ae62cca1d
Parents: f239136
Author: Brian Federle <br...@citrix.com>
Authored: Tue Jul 2 11:58:57 2013 -0700
Committer: Brian Federle <br...@citrix.com>
Committed: Mon Jul 8 11:33:28 2013 -0700
----------------------------------------------------------------------
client/WEB-INF/classes/resources/messages.properties | 3 +++
ui/dictionary.jsp | 3 +++
ui/scripts/cloudStack.js | 4 ++--
ui/scripts/ui/core.js | 8 ++++----
4 files changed, 12 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/33c144a4/client/WEB-INF/classes/resources/messages.properties
----------------------------------------------------------------------
diff --git a/client/WEB-INF/classes/resources/messages.properties b/client/WEB-INF/classes/resources/messages.properties
index b1a09b1..fab8dbd 100644
--- a/client/WEB-INF/classes/resources/messages.properties
+++ b/client/WEB-INF/classes/resources/messages.properties
@@ -14,6 +14,9 @@
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
+label.about=About
+label.app.name=CloudStack
+label.about.app=About CloudStack
label.custom.disk.iops=Custom IOPS
label.disk.iops.min=Min IOPS
label.disk.iops.max=Max IOPS
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/33c144a4/ui/dictionary.jsp
----------------------------------------------------------------------
diff --git a/ui/dictionary.jsp b/ui/dictionary.jsp
index af64228..748cc7d 100644
--- a/ui/dictionary.jsp
+++ b/ui/dictionary.jsp
@@ -25,6 +25,9 @@ under the License.
<% long now = System.currentTimeMillis(); %>
<script language="javascript">
dictionary = {
+'label.about': '<fmt:message key="label.about" />',
+'label.about.app': '<fmt:message key="label.about.app" />',
+'label.app.name': '<fmt:message key="label.app.name" />',
'label.custom.disk.iops': '<fmt:message key="label.custom.disk.iops" />',
'label.disk.iops.min': '<fmt:message key="label.disk.iops.min" />',
'label.disk.iops.max': '<fmt:message key="label.disk.iops.max" />',
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/33c144a4/ui/scripts/cloudStack.js
----------------------------------------------------------------------
diff --git a/ui/scripts/cloudStack.js b/ui/scripts/cloudStack.js
index b06cf5c..739ac7e 100644
--- a/ui/scripts/cloudStack.js
+++ b/ui/scripts/cloudStack.js
@@ -475,8 +475,6 @@
};
}
};
-
- document.title = 'CloudStack';
if ($.urlParam('loginUrl') != 0
||(window.name != null && window.name.indexOf("&domain=") != -1)) {
@@ -490,5 +488,7 @@
cloudStack.localizationFn = function(str) {
return dictionary[str];
};
+
+ document.title = _l('label.app.name');
});
})(cloudStack, jQuery);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/33c144a4/ui/scripts/ui/core.js
----------------------------------------------------------------------
diff --git a/ui/scripts/ui/core.js b/ui/scripts/ui/core.js
index de86e51..18c3363 100644
--- a/ui/scripts/ui/core.js
+++ b/ui/scripts/ui/core.js
@@ -275,7 +275,7 @@
var $options = $('<div>').attr({ id: 'user-options' })
.appendTo($('#header'));
- $(['label.logout', 'label.help', 'About']).each(function() {
+ $(['label.logout', 'label.help', 'label.about']).each(function() {
var $link = $('<a>')
.attr({ href: '#' })
.html(_l(this.toString()))
@@ -290,15 +290,15 @@
return false;
});
}
- if (this == 'About') {
+ if (this == 'label.about') {
$link.click(function() {
- var $logo = $('<div>').addClass('logo').html('CloudStack'),
+ var $logo = $('<div>').addClass('logo').html(_l('label.app.name')),
$version = $('<div>').addClass('version').html(g_cloudstackversion),
$about = $('<div>').addClass('about').append($logo).append($version);
$about.dialog({
modal: true,
width: 300,
- title: 'About CloudStack',
+ title: _l('label.about.app'),
closeOnEscape: false,
dialogClass: 'dialog-about',
buttons: {
[3/5] git commit: updated refs/heads/4.2 to 39d68b4
Posted by bf...@apache.org.
Project switcher: Fix select height
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/2f3c9a08
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/2f3c9a08
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/2f3c9a08
Branch: refs/heads/4.2
Commit: 2f3c9a085a284aea183355d987319833c1863d37
Parents: 33c144a
Author: Brian Federle <br...@citrix.com>
Authored: Tue Jul 2 12:49:30 2013 -0700
Committer: Brian Federle <br...@citrix.com>
Committed: Mon Jul 8 11:33:28 2013 -0700
----------------------------------------------------------------------
ui/css/cloudstack3.css | 1 +
1 file changed, 1 insertion(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2f3c9a08/ui/css/cloudstack3.css
----------------------------------------------------------------------
diff --git a/ui/css/cloudstack3.css b/ui/css/cloudstack3.css
index b994c8a..e4459a1 100644
--- a/ui/css/cloudstack3.css
+++ b/ui/css/cloudstack3.css
@@ -9155,6 +9155,7 @@ div.ui-dialog div.multi-edit-add-list div.view div.data-table table.body tbody t
margin-left: 53px;
background: url(../images/bg-gradients.png) 0px -867px;
padding: 5px;
+ height: 28px;
}
.project-switcher select:hover {