diff --git a/.ci/flake8_wrapper.sh b/.ci/flake8_wrapper.sh
index e606be9d1d0..63108bc4903 100755
--- a/.ci/flake8_wrapper.sh
+++ b/.ci/flake8_wrapper.sh
@@ -2,6 +2,11 @@
set -e
+# Run broad range of checks over specific white-listed files, this uses
+# the default checks defined in setup.cfg.
while read p; do
flake8 $(eval echo "$p")
done <.ci/pep8_sources.txt
+
+# Look for obviously broken stuff lots more places.
+flake8 --select=E901,E902,F821,F822,F823,F831 --exclude lib/galaxy/util/pastescript/serve.py lib/{galaxy,tool_shed} test/{api,unit}
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 7888a623415..4f1503dad1d 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -4,7 +4,7 @@ This document briefly describes how to contribute to the [core
galaxy project](https://github.com/galaxyproject/galaxy) -
also checkout our 2013 Galaxy Community
Conference presentation on the topic
-([video](http://vimeo.com/channels/581875/73486255),
+([video](https://vimeo.com/channels/581875/73486255),
[presentation](https://wiki.galaxyproject.org/Documents/Presentations/GCC2013?action=AttachFile&do=view&target=BakerContribute.pdf)). For
information on contributing more broadly to the Galaxy ecosystem and a
deeper discussion of some of these points - please see the
diff --git a/client/galaxy/scripts/mvc/dataset/dataset-model.js b/client/galaxy/scripts/mvc/dataset/dataset-model.js
index b563965cedf..6c38e09f54d 100644
--- a/client/galaxy/scripts/mvc/dataset/dataset-model.js
+++ b/client/galaxy/scripts/mvc/dataset/dataset-model.js
@@ -57,7 +57,7 @@ var DatasetAssociation = Backbone.Model.extend( BASE_MVC.LoggableMixin ).extend(
this._setUpListeners();
},
-
+
/** returns misc. web urls for rendering things like re-run, display, etc. */
_generateUrls : function(){
//TODO: would be nice if the API did this
@@ -251,6 +251,11 @@ var DatasetAssociationCollection = Backbone.Collection.extend( BASE_MVC.Loggable
urlRoot : (( window.galaxy_config && galaxy_config.root )?( galaxy_config.root ):( '/' ))
+ 'api/datasets',
+ /** url fn */
+ url : function(){
+ return this.urlRoot
+ },
+
// ........................................................................ common queries
/** Get the ids of every item in this collection
* @returns array of encoded ids
diff --git a/client/galaxy/scripts/mvc/form/form-data.js b/client/galaxy/scripts/mvc/form/form-data.js
index 5e1f23ce1fb..0562d97fbf9 100644
--- a/client/galaxy/scripts/mvc/form/form-data.js
+++ b/client/galaxy/scripts/mvc/form/form-data.js
@@ -96,9 +96,9 @@ return Backbone.Model.extend({
convert(job_input_id, head[input.id + '-section-' + selectedCase]);
}
break;
- // handle custom sub sections
+ // handle sections
case 'section':
- convert('', node);
+ convert(job_input_id, node);
break;
default:
// get field
@@ -191,6 +191,9 @@ return Backbone.Model.extend({
search (index, node.cases[selectedCase].inputs);
}
break;
+ case 'section':
+ search (index, node.inputs);
+ break;
default:
var input_id = self.map_dict[index];
if (input_id) {
diff --git a/client/galaxy/scripts/mvc/form/form-section.js b/client/galaxy/scripts/mvc/form/form-section.js
index f2f4a22785c..3c1c2092451 100644
--- a/client/galaxy/scripts/mvc/form/form-section.js
+++ b/client/galaxy/scripts/mvc/form/form-section.js
@@ -286,7 +286,7 @@ define(['utils/utils',
});
// show sub section if requested
- if (input_def.expand) {
+ if (input_def.expanded) {
portlet.$header.trigger('click');
}
diff --git a/client/galaxy/scripts/mvc/form/form-view.js b/client/galaxy/scripts/mvc/form/form-view.js
index 2eb5d9d2678..312d9e8c2b7 100644
--- a/client/galaxy/scripts/mvc/form/form-view.js
+++ b/client/galaxy/scripts/mvc/form/form-view.js
@@ -200,6 +200,13 @@ define(['utils/utils', 'mvc/ui/ui-portlet', 'mvc/ui/ui-misc',
inputs : this.options.inputs
});
+ // switch to classic tool form mako if the form definition is incompatible
+ if (this.incompatible) {
+ this.$el.hide();
+ $('#tool-form-classic').show();
+ return;
+ }
+
// create portlet
this.portlet = new Portlet.View({
icon : 'fa-wrench',
diff --git a/client/galaxy/scripts/mvc/history/history-panel-edit.js b/client/galaxy/scripts/mvc/history/history-panel-edit.js
index ae1de05ef56..7f68f324287 100644
--- a/client/galaxy/scripts/mvc/history/history-panel-edit.js
+++ b/client/galaxy/scripts/mvc/history/history-panel-edit.js
@@ -360,7 +360,7 @@ var HistoryPanelEdit = _super.extend(
* @param {Model} the item model to check
*/
_handleHdaVisibleChange : function( itemModel ){
- if( itemModel.hidden() && !this.storage.showHidden ){
+ if( itemModel.hidden() && !this.showHidden ){
this.removeItemView( itemModel );
}
this._renderCounts();
diff --git a/client/galaxy/scripts/mvc/history/multi-panel.js b/client/galaxy/scripts/mvc/history/multi-panel.js
index 0175267f6fa..cb030684db2 100644
--- a/client/galaxy/scripts/mvc/history/multi-panel.js
+++ b/client/galaxy/scripts/mvc/history/multi-panel.js
@@ -968,7 +968,9 @@ var MultiPanelColumns = Backbone.View.extend( baseMVC.LoggableMixin ).extend({
// when scrolling - check for histories now in view: they will fire 'in-view' and queueHdaLoading if necc.
//TODO:?? might be able to simplify and not use pub-sub
- var debouncedInView = _.debounce( _.bind( this.checkColumnsInView, this ), 100 );
+ var debouncedInView = _.debounce( function _debouncedInner(){
+ multipanel.checkColumnsInView();
+ }, 100 );
this.$( '.middle' ).parent().scroll( debouncedInView );
},
diff --git a/config/datatypes_conf.xml.sample b/config/datatypes_conf.xml.sample
index 726f231384c..42b874b46cc 100644
--- a/config/datatypes_conf.xml.sample
+++ b/config/datatypes_conf.xml.sample
@@ -186,6 +186,7 @@
+
@@ -285,6 +286,7 @@
+
diff --git a/config/galaxy.ini.sample b/config/galaxy.ini.sample
index 3ddf929677b..d0b176c842e 100644
--- a/config/galaxy.ini.sample
+++ b/config/galaxy.ini.sample
@@ -218,7 +218,7 @@ paste.app_factory = galaxy.web.buildapp:app_factory
#tool_data_path = tool-data
# Directory where Tool Data Table related files will be placed
-# when installed from a ToolShed. Defaults to tool_data_path
+# when installed from a ToolShed. Defaults to tool_data_path.
#shed_tool_data_path = tool-data
# File containing old-style genome builds
@@ -369,7 +369,7 @@ paste.app_factory = galaxy.web.buildapp:app_factory
# URL of the support resource for the galaxy instance. Used in activation
# emails.
-#instance_resource_url = http://wiki.galaxyproject.org/
+#instance_resource_url = https://wiki.galaxyproject.org/
# E-mail domains blacklist is used for filtering out users that are using
# disposable email address during the registration. If their address domain
@@ -465,7 +465,7 @@ nglims_config_file = tool-data/nglims.yaml
# Format string used when showing date and time information.
# The string may contain:
# - the directives used by Python time.strftime() function (see
-# http://docs.python.org/2/library/time.html#time.strftime ),
+# https://docs.python.org/2/library/time.html#time.strftime ),
# - $locale (complete format string for the server locale),
# - $iso8601 (complete format string as specified by ISO 8601 international
# standard).
@@ -476,6 +476,15 @@ nglims_config_file = tool-data/nglims.yaml
# IPython Docker container for communicating back with Galaxy via the API.
#galaxy_infrastructure_url = http://localhost:8080
+# If the above URL cannot be determined ahead of time in dynamic environments
+# but the port which should be used to access Galaxy can be - this should be
+# set to prevent Galaxy from having to guess. For example if Galaxy is sitting
+# behind a proxy with REMOTE_USER enabled - infrastructure shouldn't talk to
+# Python processes directly and this should be set to 80 or 443, etc... If
+# unset this file will be read for a server block defining a port corresponding
+# to the webapp.
+#galaxy_infrastructure_web_port = 8080
+
# The URL of the page to display in Galaxy's middle pane when loaded. This can
# be an absolute or relative URL.
#welcome_url = /static/welcome.html
@@ -484,22 +493,22 @@ nglims_config_file = tool-data/nglims.yaml
#logo_url = /
# The URL linked by the "Wiki" link in the "Help" menu.
-#wiki_url = http://wiki.galaxyproject.org/
+#wiki_url = https://wiki.galaxyproject.org/
# The URL linked by the "Support" link in the "Help" menu.
-#support_url = http://wiki.galaxyproject.org/Support
+#support_url = https://wiki.galaxyproject.org/Support
# The URL linked by the "How to Cite Galaxy" link in the "Help" menu.
-#citation_url = http://wiki.galaxyproject.org/CitingGalaxy
+#citation_url = https://wiki.galaxyproject.org/CitingGalaxy
#The URL linked by the "Search" link in the "Help" menu.
#search_url = http://galaxyproject.org/search/usegalaxy/
#The URL linked by the "Mailing Lists" link in the "Help" menu.
-#mailing_lists_url = http://wiki.galaxyproject.org/MailingLists
+#mailing_lists_url = https://wiki.galaxyproject.org/MailingLists
#The URL linked by the "Videos" link in the "Help" menu.
-#videos_url = http://vimeo.com/galaxyproject
+#screencasts_url = https://vimeo.com/galaxyproject
# The URL linked by the "Terms and Conditions" link in the "Help" menu, as well
# as on the user registration and login forms and in the activation emails.
@@ -576,6 +585,13 @@ nglims_config_file = tool-data/nglims.yaml
# requests.
#nginx_upload_path = False
+# Galaxy can also use nginx_upload_module to receive files staged out upon job
+# completion by remote job runners (i.e. Pulsar) that initiate staging
+# operations on the remote end. See the Galaxy nginx documentation for the
+# corresponding nginx configuration.
+#nginx_upload_job_files_store = False
+#nginx_upload_job_files_path = False
+
# Have Galaxy manage dynamic proxy component for routing requests to other
# services based on Galaxy's session cookie. It will attempt to do this by
# default though you do need to install node+npm and do an npm install from
@@ -603,7 +619,7 @@ nglims_config_file = tool-data/nglims.yaml
# -- Logging and Debugging
# Verbosity of console log messages. Acceptable values can be found here:
-# http://docs.python.org/library/logging.html#logging-levels
+# https://docs.python.org/2/library/logging.html#logging-levels
#log_level = DEBUG
# Print database operations to the server log (warning, quite verbose!).
@@ -716,16 +732,16 @@ use_interactive = True
# -- Toolbox Search
# The following boosts are used to customize this instance's toolbox search.
-# The higher the boost the more importance the scoring algorithm gives to the
-# given field. Section refers to the tool group in the tool panel. Rest of
+# The higher the boost, the more importance the scoring algorithm gives to the
+# given field. Section refers to the tool group in the tool panel. Rest of
# the fields are tool's attributes.
# tool_name_boost = 9
# tool_section_boost = 3
# tool_description_boost = 2
# tool_help_boost = 0.5
-# Limits the number of results in toolbox search. Can be used to tweak
-# how many results will appear.
+# Limits the number of results in toolbox search. Can be used to tweak how many
+# results will appear.
# tool_search_limit = 20
# -- Users and Security
@@ -805,11 +821,12 @@ use_interactive = True
# public.
#new_user_dataset_access_role_default_private = False
-# Expose user list. Setting this to true will expose the user list to authenticated users. This
-# makes sharing datasets in smaller galaxy instances much easier as they can type a name/email and
-# have the correct user show up. This makes less sense on large public galaxy instances where
-# that data shouldn't be exposed. For semi-public galaxies, it may make sense to expose just the
-# username and not email, or vice versa.
+# Expose user list. Setting this to True will expose the user list to
+# authenticated users. This makes sharing datasets in smaller galaxy instances
+# much easier as they can type a name/email and have the correct user show up.
+# This makes less sense on large public Galaxy instances where that data
+# shouldn't be exposed. For semi-public Galaxies, it may make sense to expose
+# just the username and not email, or vice versa.
#expose_user_name = False
#expose_user_email = False
@@ -856,8 +873,8 @@ use_interactive = True
#openid_consumer_cache_path = database/openid_consumer_cache
# XML config file that allows the use of different authentication providers
-# (e.g. Active Directory) instead or in addition to local authentication
-# (.sample is used if default does not exist).
+# (e.g. LDAP) instead or in addition to local authentication (.sample is used
+# if default does not exist).
#auth_config_file = config/auth_conf.xml
# Optional list of email addresses of API users who can make calls on behalf of
@@ -906,14 +923,14 @@ use_interactive = True
#expose_dataset_path = False
# Data manager configuration options
-# Allow non-admin users to view available Data Manager options
+# Allow non-admin users to view available Data Manager options.
#enable_data_manager_user_view = False
# File where Data Managers are configured (.sample used if default does not
-# exist)
+# exist).
#data_manager_config_file = config/data_manager_conf.xml
-# File where Tool Shed based Data Managers are configured
+# File where Tool Shed based Data Managers are configured.
#shed_data_manager_config_file = config/shed_data_manager_conf.xml
-# Directory to store Data Manager based tool-data; defaults to tool_data_path
+# Directory to store Data Manager based tool-data; defaults to tool_data_path.
#galaxy_data_manager_data_path = tool-data
# -- Job Execution
@@ -976,6 +993,17 @@ use_interactive = True
# always, onsuccess, never
#cleanup_job = always
+# For sites where all users in Galaxy match users on the system on which Galaxy
+# runs, the DRMAA job runner can be configured to submit jobs to the DRM as the
+# actual user instead of as the user running the Galaxy server process. For
+# details on these options, see the documentation at:
+#
+# https://wiki.galaxyproject.org/Admin/Config/Performance/Cluster
+#
+#drmaa_external_runjob_script = scripts/drmaa_external_runner.py
+#drmaa_external_killjob_script = scripts/drmaa_external_killer.py
+#external_chown_script = scripts/external_chown_script.py
+
# File to source to set up the environment when running jobs. By default, the
# environment in which the Galaxy server starts is used when running jobs
# locally, and the environment set up per the DRM's submission method and
@@ -987,7 +1015,6 @@ use_interactive = True
# individually.
#environment_setup_file = None
-
# Optional file containing job resource data entry fields definition.
# These fields will be presented to users in the tool forms and allow them to
# overwrite default job resources such as number of processors, memory and
diff --git a/config/job_conf.xml.sample_advanced b/config/job_conf.xml.sample_advanced
index 2290c5f1ad0..3b43e48fed4 100644
--- a/config/job_conf.xml.sample_advanced
+++ b/config/job_conf.xml.sample_advanced
@@ -252,10 +252,7 @@
-->
-
- scripts/drmaa_external_runner.py
- scripts/drmaa_external_killer.py
- scripts/external_chown_script.py
+
diff --git a/config/plugins/visualizations/scatterplot/src/scatterplot-display.js b/config/plugins/visualizations/scatterplot/src/scatterplot-display.js
index 7f36486e09f..0429f1472bb 100644
--- a/config/plugins/visualizations/scatterplot/src/scatterplot-display.js
+++ b/config/plugins/visualizations/scatterplot/src/scatterplot-display.js
@@ -20,7 +20,7 @@ var ScatterplotDisplay = Backbone.View.extend({
var view = this,
config = this.model.get( 'config' ),
//TODO: very tied to datasets - should be generalized eventually
- xhr = jQuery.getJSON( '/api/datasets/' + this.dataset.id, {
+ xhr = jQuery.getJSON(((typeof parent.galaxy_config.root == 'undefined') ? '/' : parent.galaxy_config.root) + 'api/datasets/' + this.dataset.id, {
data_type : 'raw_data',
provider : 'dataset-column',
limit : config.pagination.perPage,
diff --git a/config/plugins/visualizations/scatterplot/static/scatterplot-edit.js b/config/plugins/visualizations/scatterplot/static/scatterplot-edit.js
index fc44b025410..5ef5bdc44fc 100644
--- a/config/plugins/visualizations/scatterplot/static/scatterplot-edit.js
+++ b/config/plugins/visualizations/scatterplot/static/scatterplot-edit.js
@@ -1 +1 @@
-function scatterplot(a,b,c){function d(){var a={v:{},h:{}};return a.v.lines=p.selectAll("line.v-grid-line").data(m.x.ticks(q.x.fn.ticks()[0])),a.v.lines.enter().append("svg:line").classed("grid-line v-grid-line",!0),a.v.lines.attr("x1",m.x).attr("x2",m.x).attr("y1",0).attr("y2",b.height),a.v.lines.exit().remove(),a.h.lines=p.selectAll("line.h-grid-line").data(m.y.ticks(q.y.fn.ticks()[0])),a.h.lines.enter().append("svg:line").classed("grid-line h-grid-line",!0),a.h.lines.attr("x1",0).attr("x2",b.width).attr("y1",m.y).attr("y2",m.y),a.h.lines.exit().remove(),a}function e(){return t.attr("cx",function(a,b){return m.x(j(a,b))}).attr("cy",function(a,b){return m.y(k(a,b))}).style("display","block").filter(function(){var a=d3.select(this).attr("cx"),c=d3.select(this).attr("cy");return 0>a||a>b.width?!0:0>c||c>b.height?!0:!1}).style("display","none")}function f(){$(".chart-info-box").remove(),q.redraw(),e(),s=d(),$(o.node()).trigger("zoom.scatterplot",{scale:n.scale(),translate:n.translate()})}function g(a,c,d){return c+=8,$(['
\n Use the following controls to how the chart is displayed.\n The slide controls can be moved by the mouse or, if the \'handle\' is in focus, your keyboard\'s arrow keys.\n Move the focus between controls by using the tab or shift+tab keys on your keyboard.\n Use the \'Draw\' button to render (or re-render) the chart with the current settings.\n
\n Use the following control to change which columns are used by the chart. Click any cell\n from the last three rows of the table to select the column for the appropriate data.\n Use the \'Draw\' button to render (or re-render) the chart with the current settings.\n
\n\n
\n
X Column: which column values will be used for the x axis of the chart.
\n
Y Column: which column values will be used for the y axis of the chart.
\n
ID Column: an additional column value displayed when the user hovers over a data point.\n It may be useful to select unique or categorical identifiers here (such as gene ids).\n
\n Note: If it can be determined from the dataset\'s filetype that a column is not numeric,\n that column choice may be disabled for either the x or y axis.\n
\n Use the following controls to how the chart is displayed.\n The slide controls can be moved by the mouse or, if the \'handle\' is in focus, your keyboard\'s arrow keys.\n Move the focus between controls by using the tab or shift+tab keys on your keyboard.\n Use the \'Draw\' button to render (or re-render) the chart with the current settings.\n
\n Use the following control to change which columns are used by the chart. Click any cell\n from the last three rows of the table to select the column for the appropriate data.\n Use the \'Draw\' button to render (or re-render) the chart with the current settings.\n
\n\n
\n
X Column: which column values will be used for the x axis of the chart.
\n
Y Column: which column values will be used for the y axis of the chart.
\n
ID Column: an additional column value displayed when the user hovers over a data point.\n It may be useful to select unique or categorical identifiers here (such as gene ids).\n
\n Note: If it can be determined from the dataset\'s filetype that a column is not numeric,\n that column choice may be disabled for either the x or y axis.\n
"].join(""))},renderPanel:function(a){return a=void 0!==a?a:"fast",this.panel.setElement(this.$panel()).render(a),this.currentHistory&&this.panel.$list().before(this.panel._renderDropTargetHelp()),this},events:{"click .switch-to.btn":function(){this.model.setAsCurrent()},"click .delete-history":function(){var a=this;this.model._delete().fail(function(a,b,c){alert(_l("Could not delete the history")+":\n"+c)}).done(function(){a.render()})},"click .undelete-history":function(){var a=this;this.model.undelete().fail(function(a,b,c){alert(_l("Could not undelete the history")+":\n"+c)}).done(function(){a.render()})},"click .purge-history":function(){if(confirm(_l("This will permanently remove the data. Are you sure?"))){var a=this;this.model.purge().fail(function(a,b,c){alert(_l("Could not purge the history")+":\n"+c)}).done(function(){a.render()})}},"click .copy-history":"copy"},copy:function(){e(this.model)},controlsLeftTemplate:_.template(['
"].join(""),{variable:"view"})});return{MultiPanelColumns:g}});
+define(["mvc/history/history-model","mvc/history/history-panel-edit","mvc/base-mvc","utils/ajax-queue","ui/mode-button","ui/search-input"],function(a,b,c,d){function e(a,b){function c(a){if(!a){if(!Galaxy.modal.$("#invalid-title").size()){var b=$("").attr("id","invalid-title").css({color:"red","margin-top":"8px"}).addClass("bg-danger").text(_l("Please enter a valid history title"));Galaxy.modal.$(".modal-body").append(b)}return!1}return a}function d(b){var c=$('
Copying history...
').css("margin-top","8px");Galaxy.modal.$(".modal-body").append(c),a.copy(!0,b).fail(function(){alert(_l("History could not be copied. Please contact a Galaxy administrator"))}).always(function(){Galaxy.modal.hide()})}function e(){var a=Galaxy.modal.$("#copy-modal-title").val();c(a)&&d(a)}if(b=b||{},!Galaxy||!Galaxy.modal)return a.copy();var f=a.get("name"),g="Copy of '"+f+"'";Galaxy.modal.show(_.extend({title:_l("Copying history")+' "'+f+'"',body:$([' ",''].join("")),buttons:{Cancel:function(){Galaxy.modal.hide()},Copy:e}},b)),$("#copy-modal-title").focus().select(),$("#copy-modal-title").on("keydown",function(a){13===a.keyCode&&e()})}var f=Backbone.View.extend(c.LoggableMixin).extend({tagName:"div",className:"history-column flex-column flex-row-container",id:function(){return this.model?"history-column-"+this.model.get("id"):""},initialize:function(a){a=a||{},this.purgeAllowed=_.isUndefined(a.purgeAllowed)?!1:a.purgeAllowed,this.panel=a.panel||this.createPanel(a),this.setUpListeners()},createPanel:function(a){a=_.extend({model:this.model,purgeAllowed:this.purgeAllowed,dragItems:!0},a);var c=new b.HistoryPanelEdit(a);return c._renderEmptyMessage=this.__patch_renderEmptyMessage,c},__patch_renderEmptyMessage:function(a){var b=this,c=_.chain(this.model.get("state_ids")).values().flatten().value().length,d=b.$emptyMessage(a);return _.isEmpty(b.hdaViews)?c&&!this.model.contents.length?d.empty().append($(' loading datasets...')).show():b.searchFor?d.text(b.noneFoundMsg).show():d.text(b.emptyMsg).show():d.hide(),d},setUpListeners:function(){var a=this;this.once("rendered",function(){a.trigger("rendered:initial",a)}),this.setUpPanelListeners()},setUpPanelListeners:function(){var a=this;this.listenTo(this.panel,{rendered:function(){a.trigger("rendered",a)}},this)},inView:function(a,b){var c=this.$el.offset().left,d=c+this.$el.width();return a>d?!1:c>b?!1:!0},$panel:function(){return this.$(".history-panel")},render:function(a){a=void 0!==a?a:"fast";var b=this.model?this.model.toJSON():{};return this.$el.html(this.template(b)),this.renderPanel(a),this.setUpBehaviors(),this},setUpBehaviors:function(){},template:function(a){return a=_.extend(a||{},{isCurrentHistory:this.currentHistory}),$(['
"].join(""))},renderPanel:function(a){return a=void 0!==a?a:"fast",this.panel.setElement(this.$panel()).render(a),this.currentHistory&&this.panel.$list().before(this.panel._renderDropTargetHelp()),this},events:{"click .switch-to.btn":function(){this.model.setAsCurrent()},"click .delete-history":function(){var a=this;this.model._delete().fail(function(a,b,c){alert(_l("Could not delete the history")+":\n"+c)}).done(function(){a.render()})},"click .undelete-history":function(){var a=this;this.model.undelete().fail(function(a,b,c){alert(_l("Could not undelete the history")+":\n"+c)}).done(function(){a.render()})},"click .purge-history":function(){if(confirm(_l("This will permanently remove the data. Are you sure?"))){var a=this;this.model.purge().fail(function(a,b,c){alert(_l("Could not purge the history")+":\n"+c)}).done(function(){a.render()})}},"click .copy-history":"copy"},copy:function(){e(this.model)},controlsLeftTemplate:_.template(['
"].join(""),{variable:"view"})});return{MultiPanelColumns:g}});
//# sourceMappingURL=../../../maps/mvc/history/multi-panel.js.map
\ No newline at end of file
diff --git a/static/style/blue/base.css b/static/style/blue/base.css
index 207da8938da..27c0ed68afc 100644
--- a/static/style/blue/base.css
+++ b/static/style/blue/base.css
@@ -1442,7 +1442,7 @@ html[dir="rtl"] .select2-container-multi .select2-search-choice-close{left:auto;
.ui-portlet .portlet-backdrop,.ui-portlet-limited .portlet-backdrop,.ui-portlet-narrow .portlet-backdrop{display:none;z-index:10;position:absolute;top:0px;width:100%;height:100%;opacity:0.2;background:#fff;cursor:not-allowed}
.ui-portlet-repeat,.ui-portlet-section,.ui-portlet-section{border:none;border-left:solid 3px #ebd9b2;border-radius:5px;margin-bottom:5px}.ui-portlet-repeat .portlet-header,.ui-portlet-section .portlet-header{background:#ebd9b2;border-radius:5px;border-bottom-left-radius:0px;border-top-left-radius:0px;padding:0px 2px}.ui-portlet-repeat .portlet-header .portlet-title-text,.ui-portlet-section .portlet-header .portlet-title-text{vertical-align:middle;line-height:20px !important}
.ui-portlet-repeat .portlet-content,.ui-portlet-section .portlet-content{padding-right:0px}
-.ui-portlet-section{border-left:solid 3px #dfe5f9}.ui-portlet-section .portlet-header{background:#dfe5f9;border-bottom:solid #b4c2f1 1px}
+.ui-portlet-section{margin-top:5px;border-left:solid 3px #dfe5f9}.ui-portlet-section .portlet-header{background:#dfe5f9;border-bottom:solid #b4c2f1 1px}
.ui-portlet-narrow{border:none}.ui-portlet-narrow .portlet-header{border-radius:3px}.ui-portlet-narrow .portlet-header .portlet-operations .ui-button-icon{margin-left:3px}
.ui-portlet-narrow .ui-portlet-repeat .portlet-header,.ui-portlet-narrow .ui-portlet-section .portlet-header{border-radius:5px;border-bottom-left-radius:0px;border-top-left-radius:0px}
.ui-portlet-narrow .portlet-content{padding:0px}
diff --git a/static/style/src/less/ui.less b/static/style/src/less/ui.less
index ef8b2d0acb5..adf9a0fe5b2 100644
--- a/static/style/src/less/ui.less
+++ b/static/style/src/less/ui.less
@@ -272,6 +272,7 @@
.ui-portlet-section {
&:extend(.ui-portlet-repeat all);
+ margin-top: @ui-margin-vertical;
border-left: solid 3px @side-panel-bg;
.portlet-header {
background: @side-panel-bg;
diff --git a/templates/user/info.mako b/templates/user/info.mako
index 7447085a722..5ecc1847c7a 100644
--- a/templates/user/info.mako
+++ b/templates/user/info.mako
@@ -9,7 +9,7 @@
function validateString(test_string, type) {
var mail_re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
- var username_re = /^[a-z0-9\-]{4,255}$/;
+ var username_re = /^[a-z0-9\-]{3,255}$/;
if (type === 'email') {
return mail_re.test(test_string);
} else if (type === 'username'){
@@ -47,7 +47,7 @@
$( '#login_info' ).bind( 'submit', function( e ) {
var error_text_email= 'Please enter your valid email address.';
var error_text_email_long= 'Email cannot be more than 255 characters in length.';
- var error_text_username_characters = 'Public name must contain only lowercase letters, numbers and "-". It also has to be shorter than 255 characters but longer than 3.';
+ var error_text_username_characters = 'Public name must contain only lowercase letters, numbers and "-". It also has to be shorter than 255 characters but longer than 2.';
var email = $( '#email_input' ).val();
var name = $( '#name_input' ).val();
var validForm = true;
@@ -108,7 +108,7 @@
Your public name provides a means of identifying you publicly within this tool shed. Public
- names must be at least four characters in length and contain only lower-case letters, numbers,
+ names must be at least three characters in length and contain only lower-case letters, numbers,
and the '-' character. You cannot change your public name after you have created a repository
in this tool shed.
@@ -117,7 +117,7 @@
Your public name is an optional identifier that will be used to generate addresses for information
- you share publicly. Public names must be at least four characters in length and contain only lower-case
+ you share publicly. Public names must be at least three characters in length and contain only lower-case
letters, numbers, and the '-' character.