diff --git a/client/galaxy/scripts/admin.toolshed.js b/client/galaxy/scripts/admin.toolshed.js new file mode 100644 index 00000000000..a1baed3aa77 --- /dev/null +++ b/client/galaxy/scripts/admin.toolshed.js @@ -0,0 +1,128 @@ +define(["mvc/toolshed/shed-list-view", + "mvc/toolshed/categories-view", + "mvc/toolshed/repositories-view", + "mvc/toolshed/repository-view", + "mvc/toolshed/repository-queue-view", + "mvc/toolshed/repo-status-view", + "mvc/toolshed/workflows-view"], + function(mod_shed_list_view, + mod_categories_view, + mod_repositories_view, + mod_repository_view, + mod_repoqueue_view, + mod_repo_status_view, + mod_workflows_view) { + + var AdminToolshedRouter = Backbone.Router.extend({ + + initialize: function() { + this.routesHit = 0; + // keep count of number of routes handled by the application + Backbone.history.on( 'route', function() { this.routesHit++; }, this ); + this.bind( 'route', this.trackPageview ); + }, + + routes: { + "" : "toolsheds", + "sheds" : "toolsheds", + "queue" : "queue", + "workflows" : "workflows", + "status/r/:repositories" : "status", + "status" : "status", + "categories/s/:tool_shed" : "categories", + "category/s/:tool_shed/c/:cateory_id" : "repositories", + "repository/s/:tool_shed/r/:repository_id" : "repository", + }, + + /** + * If more than one route has been hit the user did not land on current + * page directly so we can go back safely. Otherwise go to the home page. + * Use replaceState if available so the navigation doesn't create an + * extra history entry + */ + back: function() { + if( this.routesHit > 1 ) { + window.history.back(); + } else { + this.navigate( '#', { trigger:true, replace:true } ); + } + } + + }); + + var GalaxyAdminToolshedApp = Backbone.View.extend({ + + app_config: { + known_views: ['toolsheds', 'queue', 'status', 'categories', 'repositories', 'repoository'] + }, + + initialize: function() { + Galaxy.admintoolshedapp = this; + this.admin_toolshed_router = new AdminToolshedRouter(); + + this.admin_toolshed_router.on('route:queue', function() { + if (Galaxy.admintoolshedapp.adminRepoQueueView) { + Galaxy.admintoolshedapp.adminRepoQueueView.reDraw(); + } + else { + Galaxy.admintoolshedapp.adminRepoQueueView = new mod_repoqueue_view.RepoQueueView(); + } + }); + this.admin_toolshed_router.on('route:toolsheds', function() { + if (Galaxy.admintoolshedapp.adminShedListView) { + Galaxy.admintoolshedapp.adminShedListView.reDraw(); + } + else { + Galaxy.admintoolshedapp.adminShedListView = new mod_shed_list_view.ShedListView(); + } + }); + this.admin_toolshed_router.on('route:categories', function(tool_shed) { + if (Galaxy.admintoolshedapp.adminShedCategoriesView) { + Galaxy.admintoolshedapp.adminShedCategoriesView.reDraw({tool_shed: tool_shed.replace(/\//g, '%2f')}); + } + else { + Galaxy.admintoolshedapp.adminShedCategoriesView = new mod_categories_view.CategoryView({tool_shed: tool_shed.replace(/\//g, '%2f')}); + } + }); + this.admin_toolshed_router.on('route:repositories', function(tool_shed, category_id) { + if (Galaxy.admintoolshedapp.adminShedCategoryView) { + Galaxy.admintoolshedapp.adminShedCategoryView.reDraw({tool_shed: tool_shed.replace(/\//g, '%2f'), category_id: category_id}); + } + else { + Galaxy.admintoolshedapp.adminShedCategoryView = new mod_repositories_view.Category({tool_shed: tool_shed.replace(/\//g, '%2f'), category_id: category_id}); + } + }); + this.admin_toolshed_router.on('route:repository', function(tool_shed, repository_id) { + if (Galaxy.admintoolshedapp.adminRepositoryView) { + Galaxy.admintoolshedapp.adminRepositoryView.reDraw({tool_shed: tool_shed.replace(/\//g, '%2f'), repository_id: repository_id}); + } + else { + Galaxy.admintoolshedapp.adminRepositoryView = new mod_repository_view.RepoDetails({tool_shed: tool_shed.replace(/\//g, '%2f'), repository_id: repository_id}); + } + }); + this.admin_toolshed_router.on('route:status', function(repositories) { + if (Galaxy.admintoolshedapp.adminRepoStatusView) { + Galaxy.admintoolshedapp.adminRepoStatusView.reDraw({repositories: repositories.split('|')}); + } + else { + Galaxy.admintoolshedapp.adminRepoStatusView = new mod_repo_status_view.RepoStatus({repositories: repositories.split('|')}); + } + }); + this.admin_toolshed_router.on('route:workflows', function() { + if (Galaxy.admintoolshedapp.adminWorkflowsView) { + Galaxy.admintoolshedapp.adminWorkflowsView.reDraw(); + } + else { + Galaxy.admintoolshedapp.adminWorkflowsView = new mod_workflows_view.Workflows(); + } + }); + + Backbone.history.start({pushState: false}); + }, + }); + + return { + GalaxyApp: GalaxyAdminToolshedApp + }; + +}); \ No newline at end of file diff --git a/client/galaxy/scripts/mvc/toolshed/categories-view.js b/client/galaxy/scripts/mvc/toolshed/categories-view.js new file mode 100644 index 00000000000..b914e55fe3a --- /dev/null +++ b/client/galaxy/scripts/mvc/toolshed/categories-view.js @@ -0,0 +1,107 @@ +define(['mvc/toolshed/toolshed-model', 'mvc/toolshed/util'], function(toolshed_model, toolshed_util) { + + var ToolShedCategories = Backbone.View.extend({ + + el: '#center', + + defaults: { + tool_shed: "https://toolshed.g2.bx.psu.edu/" + }, + + initialize: function(options) { + var self = this; + var shed = options.tool_shed.replace(/\//g, '%2f'); + this.options = _.defaults(this.options || options, this.defaults); + this.model = new toolshed_model.Categories(); + this.listenTo(this.model, 'sync', this.render); + this.model.url = this.model.url + '?tool_shed_url=' + this.options.tool_shed; + this.model.tool_shed = shed; + this.model.fetch(); + }, + + render: function(options) { + this.options = _.extend(this.options, options); + this.options.categories = this.model.models; + this.options.queue = toolshed_util.queueLength(); + var category_list_template = this.templateCategoryList; + this.$el.html(category_list_template(this.options)); + $("#center").css('overflow', 'auto'); + this.bindEvents(); + }, + + bindEvents: function() { + var that = this; + require(['libs/jquery/jquery-ui'], function() { + $("#search_box").autocomplete({ + source: function(request, response) { + var shed_url = that.model.tool_shed.replace(/%2f/g, '/'); + var base_url = Galaxy.root + 'api/tool_shed/search'; + var params = {term: request.term, tool_shed_url: shed_url}; + $.post(base_url, params, function(data) { + console.log(data); + result_list = toolshed_util.shedParser(data); + response(result_list); + }); + }, + minLength: 3, + select: function(event, ui) { + var tsr_id = ui.item.value; + var api_url = Galaxy.root + 'api/tool_shed/repository'; + var params = {"tool_shed_url": that.model.tool_shed, "tsr_id": tsr_id}; + var new_route = 'repository/s/' + that.model.tool_shed + '/r/' + tsr_id; + Backbone.history.navigate(new_route, {trigger: true, replace:true}); + }, + }); + }); + }, + + reDraw: function(options) { + this.$el.empty(); + this.model.url = this.model.url + '?tool_shed_url=' + this.options.tool_shed; + this.initialize(options); + }, + + templateCategoryList: _.template([ + '', + '
', + '
Categories in <%= tool_shed.replace(/%2f/g, "/") %>
', + '
Repository Queue (<%= queue %>)
', + '
', + '
', + '', + '
', + '', + '', + '', + '', + '', + '', + '', + '', + '<% _.each(categories, function(category) { %>', + '', + '', + '', + '', + '', + '<% }); %>', + '
NameDescriptionRepositories
', + '"><%= category.get("name") %>', + '<%= category.get("description") %><%= category.get("repositories") %>
', + '
', + '
', + ].join('')) + }); + + return { + CategoryView: ToolShedCategories, + }; + +}); \ No newline at end of file diff --git a/client/galaxy/scripts/mvc/toolshed/repo-queue-view.js b/client/galaxy/scripts/mvc/toolshed/repo-queue-view.js new file mode 100644 index 00000000000..bccc87fda59 --- /dev/null +++ b/client/galaxy/scripts/mvc/toolshed/repo-queue-view.js @@ -0,0 +1,104 @@ +define(['toolshed/repository-queue-model'], function() { + + var ToolShedRepositoryQueue = Backbone.View.extend({ + + el: '#category_list', + + render: function(options) { + this.options = _.extend(this.options, options); + var repository_queue_template = this.templateRepoQueue(); + this.$el.html(repository_queue_template({repository: this.model})); + }, + + templateRepoQueueTab: _.template([ + '', + ].join('')), + + templateRepoQueue: _.template([ + '
', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '<\% _.each(repositories, function(repository) { \%>', + '', + '', + '', + '', + '', + '', + '', + '', + '<\% }); \%>', + '', + '
ToolShedNameOwnerRevision
', + '', + '', + '', + '<\%= repository.tool_shed_url \%><\%= repository.name \%><\%= repository.owner \%><\%= repository.changeset \%>
', + '', + '
', + ].join('')), + + workflows_missing_tools: _.template([ + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '<\% _.each(Object.keys(workflows), function(workflow_key) { \%>', + '<\% var workflow_details = workflow_key.split("/"); \%>', + '<\% var workflow = workflows[workflow_key]; \%>', + '', + '', + '', + '', + '', + '', + '', + '', + '<\% }); \%>', + '', + '', + ].join('')) + }); + + return { + RepoQueue: ToolShedRepositoryQueue, + }; + +}); diff --git a/client/galaxy/scripts/mvc/toolshed/repo-status-view.js b/client/galaxy/scripts/mvc/toolshed/repo-status-view.js new file mode 100644 index 00000000000..183de64a53d --- /dev/null +++ b/client/galaxy/scripts/mvc/toolshed/repo-status-view.js @@ -0,0 +1,134 @@ +define(['mvc/toolshed/toolshed-model', 'mvc/toolshed/util'], function(toolshed_model, toolshed_util) { + + var ToolShedRepoStatusView = Backbone.View.extend({ + + el: '#center', + + initialize: function(options) { + var self = this; + this.options = _.defaults(this.options || [{}], options, this.defaults); + this.model = new toolshed_model.RepoStatus(); + this.listenTo(this.model, 'sync', this.render); + this.model.url += '?repositories=' + this.options.repositories.join('|'); + this.model.fetch(); + this.timer = setInterval(function(self) { + var terminal_states = ['installed', 'error']; + var all_done = true; + _.some(self.model.models, function(repository) { + repo_id = repository.get('id'); + repo_status = repository.get('status').toLowerCase(); + if (terminal_states.indexOf(repo_status) === -1) { + all_done = false; + return true; + } + }); + if (all_done) { + clearInterval(self.timer); + } + else { + self.model.fetch(); + } + }, 2000, this); + }, + + close: function() { + clearInterval(this.timer); + }, + + render: function(options) { + this.options = _.extend(this.options, options); + var repo_status_template = this.templateRepoStatus; + this.$el.html(repo_status_template({title: 'Repository Status', repositories: this.model.models, queue: toolshed_util.queueLength()})); + $("#center").css('overflow', 'auto'); + this.bindEvents(); + }, + + bindEvents: function() { + var that = this; + }, + + reDraw: function(options){ + this.$el.empty(); + this.initialize(options); + }, + + templateRepoStatus: _.template([ + '
', + '
<%= title %>
', + '
Repository Queue (<%= queue %>)
', + '
', + '', + '
WorkflowsTool IDsShedNameOwnerActions
', + '
    ', + '<\% _.each(workflow.workflows.sort(), function(wf) { \%>', + '
  • <\%= wf \%>
  • ', + '<\% }); \%>', + '
', + '
', + '
    ', + '<\% _.each(workflow.tools.sort(), function(tool) { \%>', + '
  • <\%= tool \%>
  • ', + '<\% }); \%>', + '
', + '
<\%= workflow_details[0] \%><\%= workflow_details[2] \%><\%= workflow_details[1] \%>', + '
    ', + '
  • " value="Preview" />
  • ', + '
  • " value="Add to queue" />
  • ', + '
', + '
', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '<% _.each(repositories, function(repository) { %>', + '', + '', + '', + '', + '', + '', + '', + '<% }); %>', + '', + '', + '
NameDescriptionOwnerRevisionInstallation Status
', + '
', + '', + '
', + '
', + '
', + '', + '
', + '
', + '
', + '', + '
', + '
', + '
', + '', + '
', + '
', + '
', + '', + '
', + '
' + ].join('')) + }); + + return { + RepoStatus: ToolShedRepoStatusView, + }; + +}); \ No newline at end of file diff --git a/client/galaxy/scripts/mvc/toolshed/repositories-view.js b/client/galaxy/scripts/mvc/toolshed/repositories-view.js new file mode 100644 index 00000000000..795adfa0471 --- /dev/null +++ b/client/galaxy/scripts/mvc/toolshed/repositories-view.js @@ -0,0 +1,101 @@ +define(['mvc/toolshed/toolshed-model', 'mvc/toolshed/util'], function(toolshed_model, toolshed_util) { + + var ToolShedCategoryContentsView = Backbone.View.extend({ + + el: '#center', + + initialize: function(params) { + var self = this; + this.model = new toolshed_model.CategoryCollection(); + this.listenTo(this.model, 'sync', this.render); + var shed = params.tool_shed.replace(/\//g, '%2f'); + this.model.url += '?tool_shed_url=' + shed + '&category_id=' + params.category_id; + this.model.tool_shed = shed; + this.model.category = params.category_id; + this.model.fetch(); + }, + + render: function(options) { + this.options = _.extend(this.options, options); + var category_contents_template = this.templateCategoryContents; + this.$el.html(category_contents_template({category: this.model.models[0], tool_shed: this.model.tool_shed, queue: toolshed_util.queueLength()})); + $("#center").css('overflow', 'auto'); + this.bindEvents(); + }, + + bindEvents: function() { + var that = this; + require(['libs/jquery/jquery-ui'], function() { + $("#search_box").autocomplete({ + source: function(request, response) { + var shed_url = that.model.tool_shed.replace(/%2f/g, '/'); + var base_url = Galaxy.root + 'api/tool_shed/search'; + var params = {term: request.term, tool_shed_url: shed_url}; + $.post(base_url, params, function(data) { + result_list = toolshed_util.shedParser(data); + response(result_list); + }); + }, + minLength: 3, + select: function(event, ui) { + var tsr_id = ui.item.value; + var new_route = 'repository/s/' + that.model.tool_shed + '/r/' + tsr_id; + Backbone.history.navigate(new_route, {trigger: true, replace:true}); + }, + }); + }); + }, + + reDraw: function(options){ + this.$el.empty(); + this.initialize(options); + }, + + templateCategoryContents: _.template([ + '', + '
', + '
Repositories in <%= category.get("name") %>
', + '
Repository Queue (<%= queue %>)
', + '
', + '
', + '', + '
', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '<% _.each(category.get("repositories"), function(repository) { %>', + '', + '', + '', + '', + '', + '', + '<% }); %>', + '
OwnerNameSynopsisType
<%= repository.owner %>', + '', + '<%= repository.description %><%= repository.type %>
', + '
', + '
' + ].join('')) + }); + + return { + Category: ToolShedCategoryContentsView, + }; + +}); \ No newline at end of file diff --git a/client/galaxy/scripts/mvc/toolshed/repository-queue-view.js b/client/galaxy/scripts/mvc/toolshed/repository-queue-view.js new file mode 100644 index 00000000000..24193a63d2b --- /dev/null +++ b/client/galaxy/scripts/mvc/toolshed/repository-queue-view.js @@ -0,0 +1,142 @@ +define(['mvc/toolshed/toolshed-model', 'mvc/toolshed/util'], function(toolshed_model, toolshed_util) { + + var View = Backbone.View.extend({ + + el: '#center', + + defaults: [{}], + + initialize: function(options) { + var that = this; + this.model = new toolshed_model.RepoQueue(); + this.listenTo(this.model, 'sync', this.render); + this.model.fetch(); + that.render(); + }, + + render: function(options) { + var that = this; + var repo_queue_template = that.templateRepoQueue; + var repositories = that.model.models; + that.$el.html(repo_queue_template({title: 'Repository Installation Queue', repositories: repositories, queue: toolshed_util.queueLength()})); + $("#center").css('overflow', 'auto'); + that.bindEvents(); + }, + + bindEvents: function() { + var that = this; + $('.install_one').on('click', function() { + var repository_metadata = that.loadFromQueue($(this).attr('data-repokey')); + that.installFromQueue(repository_metadata, $(this).attr('data-repokey')); + }); + $('.remove_one').on('click', function() { + var queue_key = $(this).attr('data-repokey'); + var repo_queue = JSON.parse(localStorage.repositories); + if (repo_queue.hasOwnProperty(queue_key)) { + var repository_id = repo_queue[queue_key].repository.id; + delete repo_queue[queue_key]; + $('#queued_repository_' + repository_id).remove(); + } + localStorage.repositories = JSON.stringify(repo_queue); + }); + $('#clear_queue').on('click', function() { + localStorage.repositories = "{}"; + }); + $('#from_workflow').on('click', function() { Backbone.history.navigate('workflows', {trigger: true, replace:true}); }); + }, + + installFromQueue: function(repository_metadata, queue_key) { + var that = this; + var params = Object(); + params.install_tool_dependencies = repository_metadata.install_tool_dependencies; + params.install_repository_dependencies = repository_metadata.install_repository_dependencies; + params.install_resolver_dependencies = repository_metadata.install_resolver_dependencies; + params.tool_panel_section = repository_metadata.tool_panel_section; + params.shed_tool_conf = repository_metadata.shed_tool_conf; + params.repositories = JSON.stringify([[repository_metadata.repository.id, repository_metadata.changeset_revision]]); + params.tool_shed_repository_ids = JSON.stringify([repository_metadata.repository.id]); + params.tool_shed_url = queue_key.split('|')[0]; + params.changeset = repository_metadata.changeset_revision; + var url = Galaxy.root + 'api/tool_shed_repositories/install?async=True'; + $('#queued_repository_' + repository_metadata.repository.id).remove(); + if (localStorage.repositories) { + if (queue_key === undefined) { + queue_key = toolshed_util.queueKey(repository_metadata); + } + repository_queue = JSON.parse(localStorage.repositories); + if (repository_queue.hasOwnProperty(queue_key)) { + delete repository_queue[queue_key]; + localStorage.repositories = JSON.stringify(repository_queue); + } + } + + $.post(url, params, function(data) { + var iri_params = JSON.parse(data); + var repositories = iri_params.repositories; + var new_route = 'status/r/' + repositories.join('|'); + $.post(Galaxy.root + 'admin_toolshed/manage_repositories', iri_params, function(data) { + console.log( "Initializing repository installation succeeded" ); + }); + Backbone.history.navigate(new_route, {trigger: true, replace:true}); + }); + }, + + loadFromQueue: function(queue_key) { + repository_queue = JSON.parse(localStorage.repositories); + if (repository_queue.hasOwnProperty(queue_key)) { + return repository_queue[queue_key]; + } + return undefined; + }, + + reDraw: function(options) { + this.$el.empty(); + this.initialize(options); + this.model.fetch(); + this.render(options); + }, + + templateRepoQueue: _.template([ + '
', + '
<%= title %>
', + '
Repository Queue (<%= queue %>)
', + '
', + '
', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '<% _.each(repositories, function(repository) { %>', + '">', + '', + '', + '', + '', + '', + '', + '', + '<% }); %>', + '', + '
NameOwnerRevisionToolShedInstall
<%= repository.get("repository").name %><%= repository.get("repository").owner %><%= repository.get("changeset_revision") %><%= repository.get("tool_shed_url") %>', + '" type="submit" id="install_repository_<%= repository.get("id") %>" name="install_repository" value="Install now" />', + '', + '" type="submit" id="unqueue_repository_<%= repository.get("id") %>" name="unqueue_repository" value="Remove from queue" />', + '
', + '', + '
', + ].join('')) + }); + + return { + RepoQueueView: View, + }; + +}); \ No newline at end of file diff --git a/client/galaxy/scripts/mvc/toolshed/repository-view.js b/client/galaxy/scripts/mvc/toolshed/repository-view.js new file mode 100644 index 00000000000..27403c54d02 --- /dev/null +++ b/client/galaxy/scripts/mvc/toolshed/repository-view.js @@ -0,0 +1,487 @@ +define(['mvc/toolshed/toolshed-model', + 'libs/jquery/jstree', + 'utils/utils', + 'mvc/ui/ui-modal', + 'mvc/form/form-view', + 'mvc/toolshed/util'], function(toolshed_model, + jstree, + Utils, + Modal, + FormView, + toolshed_util) { + + var ToolShedRepositoryView = Backbone.View.extend({ + + el: '#center', + + initialize: function(params) { + var self = this; + this.options = _.defaults(this.options || {}, this.defaults); + this.model = new toolshed_model.RepositoryCollection(); + this.listenTo(this.model, 'sync', this.render); + shed = params.tool_shed.replace(/\//g, '%2f'); + this.model.url += '?tool_shed_url=' + shed + '&repository_id=' + params.repository_id; + this.model.tool_shed_url = params.tool_shed.replace(/%2f/g, '/'); + this.model.tool_shed = shed; + this.model.category = params.repository_id; + this.model.fetch(); + }, + + render: function(options) { + var repo_details_template = this.templateRepoDetails; + var models = this.model.models[0]; + this.options = { + repository: models.get('repository'), + tool_shed: this.model.tool_shed, + queue: toolshed_util.queueLength(), + } + var changesets = Object.keys(this.options.repository.metadata); + this.options.current_changeset = (this.options.current_changeset || changesets[changesets.length - 1]); + this.options.current_metadata = this.options.repository.metadata[this.options.current_changeset]; + this.options.current_metadata.tool_shed_url = this.model.tool_shed_url; + this.options.tools = this.options.current_metadata.tools; + this.options.repository_dependencies_template = this.templateRepoDependencies; + this.options.repository_dependency_template = this.templateRepoDependency; + this.options.tps_template_global_select = this.templateGlobalSectionSelect; + this.options.tps_template_tool_select = this.templateToolSectionSelect; + this.options.tps_select_options = this.templatePanelSelectOptions; + this.options.tool_dependencies = models.get('tool_dependencies'); + this.options.shed_tool_conf = this.templateShedToolConf({'stc_html': models.get('shed_conf')}); + this.options.panel_section_dict = models.get('panel_section_dict'); + this.options.api_url = Galaxy.root + 'api/tool_shed_repositories/install?async=True'; + this.options = _.extend(this.options, options); + this.$el.html(repo_details_template(this.options)); + this.checkInstalled(this.options.current_metadata); + this.bindEvents(); + $("#center").css('overflow', 'auto'); + }, + + bindEvents: function(){ + var that = this; + $('#changeset').on('change', function () { + that.options.current_changeset = $('#changeset').find("option:selected").text(); + that.options.current_metadata = that.options.repository.metadata[that.options.current_changeset]; + that.checkInstalled(that.options.current_metadata); + that.reDraw(); + }); + $('#tool_panel_section_select').on('change', function() { + that.tpsSelection(); + }); + $('#install_repository').on('click', function(ev) { + var form = $('#repository_installation'); + ev.preventDefault(); + var params = {}; + params.repositories = JSON.stringify([[$('#install_repository').attr('data-tsrid'), $('#changeset').find("option:selected").val()]]); + params.tool_shed_repository_ids = JSON.stringify([$('#install_repository').attr('data-tsrid')]); + params.tool_shed_url = that.model.tool_shed_url; + params.install_tool_dependencies = $("#install_tool_dependencies").val(); + params.install_repository_dependencies = $("#install_repository_dependencies").val(); + params.install_resolver_dependencies = $("#install_resolver_dependencies").val(); + var tps = that.panelSelect(params); + params.tool_panel_section = JSON.stringify(that.panelSelect(params)); + params.shed_tool_conf = $("select[name='shed_tool_conf']").find('option:selected').val() + params.changeset = $('#changeset').find("option:selected").val(); + url = $('#repository_installation').attr('action'); + that.prepareInstall(params, url); + }); + $('#queue_install').on('click', function(ev) { + that.options.current_changeset = $('#changeset').find("option:selected").text(); + that.options.current_metadata = that.options.repository.metadata[that.options.current_changeset]; + var changeset = that.options.current_changeset; + var repository_metadata = {}; + _.each(Object.keys(that.options.current_metadata), function(key) { + if (!repository_metadata[key]) { + repository_metadata[key] = that.options.current_metadata[key]; + } + }); + repository_metadata.install_tool_dependencies = $("#install_tool_dependencies").val(); + repository_metadata.install_repository_dependencies = $("#install_repository_dependencies").val(); + repository_metadata.install_resolver_dependencies = $("#install_resolver_dependencies").val(); + repository_metadata.tool_panel_section = JSON.stringify(that.panelSelect({})); + repository_metadata.shed_tool_conf = $("select[name='shed_tool_conf']").find('option:selected').val() + repository_metadata.tool_shed_url = that.model.tool_shed_url; + if (repository_metadata.tool_shed_url.substr(-1) == '/') { + repository_metadata.tool_shed_url = repository_metadata.tool_shed_url.substr(0, repository_metadata.tool_shed_url.length - 1); + } + toolshed_util.addToQueue(repository_metadata); + that.checkInstalled(repository_metadata); + }); + $('.tool_panel_section_picker').on('change', function() { + new_value = $(this).find('option:selected').val(); + default_tps = $('#tool_panel_section_select').find('option:selected').val(); + if (new_value == default_tps) { + $(this).attr('default', 'active'); + } + else { + $(this).removeAttr('default'); + } + }); + $(function() { $('#repository_dependencies').jstree(); }); + $('.tool_form').on('click', function() { + var guid = $(this).attr('data-guid'); + var clean = $(this).attr('data-clean'); + var name = $(this).attr('data-name'); + var desc = $(this).attr('data-desc'); + var tool_shed_url = that.model.tool_shed_url; + var tsr_id = $('#repository_details').attr('data-tsrid'); + var changeset = $('#changeset').find("option:selected").val(); + var api_url = Galaxy.root + 'api/tool_shed/tool_json'; + var params = {'guid': guid, 'tool_shed_url': tool_shed_url, 'tsr_id': tsr_id, 'changeset': changeset}; + $.get(api_url, params, function(data) { + data.cls = 'ui-portlet-plain'; + var toolform = new FormView(data); + Utils.deepeach(data.inputs, function( input ) { + if (input.type) { + if (['data', 'data_collection'].indexOf(input.type) != -1) { + input.type = 'hidden'; + input.info = 'Data input \'' + input.name + '\' (' + Utils.textify(input.extensions) + ')'; + } + } + }); + var modal = new Modal.View(); + var modal_title = '' + name + ' ' + desc; + modal.show({'closing_events': true, + 'title': modal_title, + 'body': toolform.$el, + 'buttons': { 'Close': function() { modal.hide(); }}}); + }); + }); + }, + + checkInstalled: function(metadata) { + var that = this; + var params = {name: metadata.name, owner: metadata.owner}; + var already_installed = false; + var queued = that.repoQueued(metadata); + $.get(Galaxy.root + 'api/tool_shed_repositories', params, function(data) { + for (var index = 0; index < data.length; index++) { + var repository = data[index]; + var installed = !repository.deleted && !repository.uninstalled; + var changeset_match = repository.changeset_revision == metadata.changeset_revision || + repository.installed_changeset_revision == metadata.changeset_revision; + if (repository.name == metadata.repository.name && repository.owner == metadata.repository.owner && installed && changeset_match) { + already_installed = true; + } + if (already_installed) { + $('#install_repository').prop('disabled', true); + $('#install_repository').val('This revision is already installed'); + } + else { + $('#install_repository').prop('disabled', false); + $('#install_repository').val('Install this revision'); + } + } + if (that.repoQueued(metadata) || already_installed) { + $('#queue_install').hide(); + $('#queue_install').val('This revision is already in the queue'); + } + else { + $('#queue_install').show(); + $('#queue_install').val('Install this revision later'); + } + }); + }, + + panelSelect: function(params) { + var tool_panel_section = {}; + if ($('#tool_panel_section_select').length) { + params.tool_panel_section_id = $('#tool_panel_section_select').find("option:selected").val(); + } + else { + params.new_tool_panel_section = $("#new_tool_panel_section").val(); + } + $('.tool_panel_section_picker').each(function() { + element_name = $(this).attr('name'); + tool_guid = $(this).attr('data-toolguid'); + if (element_name === 'tool_panel_section_id') { + tool_panel_section[tool_guid] = { tool_panel_section: $(this).find("option:selected").val(), action: 'append' } + } + else { + tool_panel_section[tool_guid] = { tool_panel_section: $(this).val(), action: 'create' } + } + }); + return tool_panel_section; + }, + + reDraw: function(options) { + this.$el.empty(); + this.initialize(options); + }, + + repoQueued: function(metadata) { + var that = this; + if (!localStorage.repositories) { + return; + } + var repository_queue = JSON.parse(localStorage.repositories); + var changeset = metadata.changeset_revision; + var queue_key = that.queueKey(metadata); + if (localStorage.repositories) { + queued_repos = JSON.parse(localStorage.repositories); + } + if (queued_repos.hasOwnProperty(queue_key)) { + return true; + } + return false; + }, + + queueKey: function (metadata) { + var shed_url = this.model.tool_shed_url; + // Make sure there is never a trailing slash on the shed URL. + if (shed_url.substr(-1) == '/') { + shed_url = shed_url.substr(0, shed_url.length - 1); + } + return shed_url + '|' + metadata.repository_id + '|' + metadata.changeset_revision; + }, + + tpsSelection: function() { + new_tps = $('#tool_panel_section_select').find('option:selected').val(); + $('.tool_panel_section_picker[default="active"]').each(function() { + $(this).val(new_tps); + }); + }, + + prepareInstall: function(params, api_url) { + var that = this; + $.post(api_url, params, function(data) { + iri_parameters = JSON.parse(data); + that.doInstall(iri_parameters); + }); + }, + + doInstall: function(params) { + controller_url = Galaxy.root + 'admin_toolshed/manage_repositories'; + var repositories = params.repositories; + var new_route = 'status/r/' + repositories.join('|'); + $.post(controller_url, params, function(data) { + console.log( "Initializing repository installation succeeded" ); + }) + Backbone.history.navigate(new_route, {trigger: true, replace:true}); + }, + + templateRepoDetails: _.template([ + '
', + '
Repository information for <%= repository.name %> from <%= repository.owner %>
', + '
Repository Queue (<%= queue %>)
', + '
', + '
', + '
', + '', + '', + '
', + '
Changeset
', + '
', + '', + '', + '', + '
Please select a revision and review the settings below before installing.
', + '
', + '
', + '<%= shed_tool_conf %>', + '<% if (current_metadata.has_repository_dependencies) { %>', + '
Repository dependencies for <%= current_changeset %>
', + '
', + '

', + '', + '', + '

', + '<% current_metadata.repository_dependency_template = repository_dependency_template; %>', + '
', + '', + '<%= repository_dependencies_template(current_metadata) %>', + '
', + '
', + '<% } %>', + '<% if (current_metadata.includes_tool_dependencies) { %>', + '
Tool dependencies
', + '
', + '

', + '', + '', + '

', + '

', + '', + '', + '

', + '
', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '<% _.each(tool_dependencies[current_changeset], function(dependency) { %>', + '', + '', + '', + '', + '', + '<% }); %>', + '', + '
NameVersionType
', + '<%= dependency.name %><%= dependency.version %><%= dependency.type %>
', + '
', + '
', + '<% } %>', + '<% if (current_metadata.includes_tools_for_display_in_tool_panel) { %>', + '
Tools – click the name to preview the tool and use the pop-up menu to inspect all metadata
', + '
', + '
', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '<% _.each(current_metadata.tools, function(tool) { %>', + '', + '', + '', + '', + '', + '', + '<% }); %>', + '', + '
NameDescriptionVersion<%= tps_template_global_select({tps: panel_section_dict, tps_select_options: tps_select_options}) %>
', + '', + '<%= tool.description %><%= tool.version %>', + '<%= tps_template_tool_select({tool: tool, tps: panel_section_dict, tps_select_options: tps_select_options}) %>', + '
', + '
', + '
', + '<% } %>', + '
', + '
', + ].join('')), + + templateRepoDependencies: _.template([ + '
Repository Dependencies
', + '
', + '', + '
'].join('')), + + templateRepoDependency: _.template([ + '
  • ', + 'Repository <%= repository.name %> revision <%= changeset_revision %> owned by <%= repository.owner %>', + '<% if (has_repository_dependencies) { %>', + '', + '<% } %>', + '
  • ', + ].join('')), + + templateShedToolConf: _.template([ + '
    Shed tool configuration file:
    ', + '
    ', + '
    ', + '<%= stc_html %>', + '
    Select the file whose tool_path setting you want used for installing repositories.
    ', + '
    ', + '
    ', + ].join('')), + + templateToolDependency: _.template([ + '<% if (has_repository_dependencies) { %>', + '<% _.each(repository_dependencies, function(dependency) { %>', + '<% if (dependency.includes_tool_dependencies) { %>', + '<% dependency.tool_dependency_template = tool_dependency_template %>', + '<%= tool_dependency_template(dependency) %>', + '<% } %>', + '<% }); %>', + '<% } %>', + ].join('')), + + templateGlobalSectionCreate: _.template([ + '
    ', + '
    ', + '', + '', + '
    ', + 'Add a new tool panel section to contain the installed tools (optional).', + '
    ', + '
    ', + '
    ', + ].join('')), + + templateGlobalSectionSelect: _.template([ + '
    ', + '
    Tool Panel Section
    ', + '
    ', + '
    ', + '', + '', + '
    ', + 'Select an existing tool panel section to contain the installed tools (optional).', + '
    ', + '
    ', + '
    ', + '
    ', + ].join('')), + + templateToolSectionCreate: _.template([ + '
    ', + '', + '', + '
    ', + ].join('')), + + templateToolSectionSelect: _.template([ + '
    ', + '', + '', + '
    ', + '
    ', + ].join('')), + + templatePanelSelectOptions: _.template([ + '<% _.each(sections, function(section) { %>', + '', + '<% }); %>', + ].join('')) + }); + + return { + RepoDetails: ToolShedRepositoryView, + }; + +}); + diff --git a/client/galaxy/scripts/mvc/toolshed/shed-list-view.js b/client/galaxy/scripts/mvc/toolshed/shed-list-view.js new file mode 100644 index 00000000000..d11f27adc7d --- /dev/null +++ b/client/galaxy/scripts/mvc/toolshed/shed-list-view.js @@ -0,0 +1,59 @@ +define(['mvc/toolshed/toolshed-model', 'mvc/toolshed/util'], function(toolshed_model, toolshed_util) { + + var View = Backbone.View.extend({ + + defaults: { + tool_sheds: [{"url": "https://toolshed.g2.bx.psu.edu/", "name": "Galaxy Main Tool Shed"}] + }, + + initialize: function(options) { + var self = this; + this.options = _.defaults(this.options || {}, this.defaults); + this.model = new toolshed_model.ShedsCollection(); + this.listenTo(this.model, 'sync', this.render); + this.model.fetch(); + }, + + el: '#center', + + render: function(options) { + this.options = _.defaults(this.options || {}, options, this.defaults); + var toolshed_list_template = this.templateToolshedList; + this.$el.html(toolshed_list_template({title: 'Configured Galaxy Tool Sheds', tool_sheds: this.model.models, queue: toolshed_util.queueLength()})); + }, + + reDraw: function(options){ + this.$el.empty(); + this.render(options); + }, + + templateToolshedList: _.template([ + '
    ', + '
    <%= title %>
    ', + '
    Repository Queue (<%= queue %>)
    ', + '
    ', + '
    ', + '
    ', + '', + '<% _.each(tool_sheds, function(shed) { %>', + '', + '', + '', + '<% }); %>', + '
    ', + '', + '
    ', + '
    ', + '
    ', + '
    ', + ].join('')) + + }); + + return { + ShedListView: View, + }; + +}); \ No newline at end of file diff --git a/client/galaxy/scripts/mvc/toolshed/toolshed-model.js b/client/galaxy/scripts/mvc/toolshed/toolshed-model.js new file mode 100644 index 00000000000..fe1ab6a57cd --- /dev/null +++ b/client/galaxy/scripts/mvc/toolshed/toolshed-model.js @@ -0,0 +1,99 @@ +define([], function() { + + var ToolShedModel = Backbone.Model.extend({ + defaults: {"url": "https://toolshed.g2.bx.psu.edu/", "name": "Galaxy Main Tool Shed"}, + urlRoot: Galaxy.root + 'api/tool_shed', + }); + + var ToolShedsCollection = Backbone.Collection.extend({ + url: Galaxy.root + 'api/tool_shed', + model: ToolShedModel + }); + + var ToolShedCategoriesModel = Backbone.Model.extend({ + defaults: [{}], + urlRoot: Galaxy.root + 'api/tool_shed/contents', + }); + + var ToolShedCategoriesCollection = Backbone.Collection.extend({ + url: Galaxy.root + 'api/tool_shed/contents', + model: ToolShedCategoriesModel + }); + + var ToolShedCategoryModel = Backbone.Model.extend({ + defaults: [{}], + urlRoot: Galaxy.root + 'api/tool_shed/category', + }); + + var ToolShedCategoryCollection = Backbone.Collection.extend({ + url: Galaxy.root + 'api/tool_shed/category', + model: ToolShedCategoryModel + }); + + var ToolShedRepositoryModel = Backbone.Model.extend({ + defaults: [{}], + urlRoot: Galaxy.root + 'api/tool_shed/repository', + }); + + var ToolShedRepositoryCollection = Backbone.Collection.extend({ + url: Galaxy.root + 'api/tool_shed/repository', + model: ToolShedRepositoryModel + }); + + var RepoQueueModel = Backbone.Model.extend({ + url: '#', + }); + + var RepoQueueCollection = Backbone.Collection.extend({ + url: '#', + model: RepoQueueModel, + fetch: function() { + var collection = this; + var repositories = Array(); + var repositories_enc = JSON.parse(localStorage.repositories); + var queue_keys = Object.keys(repositories_enc); + _.each(queue_keys, function(key) { + var repo = repositories_enc[key]; + repo.queue_key = key; + repositories.push(repo); + }); + collection.reset(repositories); + return Backbone.Collection.prototype.fetch.call(this); + }, + }); + + var RepoStatusModel = Backbone.Model.extend({ + defaults: [{}], + urlRoot: Galaxy.root + 'api/tool_shed/status', + }); + + var RepoStatusCollection = Backbone.Collection.extend({ + url: Galaxy.root + 'api/tool_shed/status', + model: RepoStatusModel + }); + + var WorkflowToolsModel = Backbone.Model.extend({ + defaults: [{}], + urlRoot: Galaxy.root + 'api/workflows?missing_tools=True', + }); + + var WorkflowToolsCollection = Backbone.Collection.extend({ + url: Galaxy.root + 'api/workflows?missing_tools=True', + model: WorkflowToolsModel + }); + + return { + ShedModel: ToolShedModel, + ShedsCollection: ToolShedsCollection, + Category: ToolShedCategoriesModel, + Categories: ToolShedCategoriesCollection, + CategoryModel: ToolShedCategoryModel, + CategoryCollection: ToolShedCategoryCollection, + RepositoryModel: ToolShedRepositoryModel, + RepositoryCollection: ToolShedRepositoryCollection, + RepoQueue: RepoQueueCollection, + RepoStatus: RepoStatusCollection, + WorkflowTools: WorkflowToolsCollection + }; + +}); diff --git a/client/galaxy/scripts/mvc/toolshed/util.js b/client/galaxy/scripts/mvc/toolshed/util.js new file mode 100644 index 00000000000..ed052ecb8e8 --- /dev/null +++ b/client/galaxy/scripts/mvc/toolshed/util.js @@ -0,0 +1,50 @@ +define([], function() { + var searchShed = function(request, response) { + var that = this; + var shed_url = this.shed_url; + var base_url = Galaxy.root + 'api/tool_shed/search'; + $.get(base_url, {term: request.term, tool_shed_url: shed_url}, function(data) { + result_list = that.shedParser(data); + response(result_list); + }); + + }; + + var shedParser = function(jsondata) { + var results = []; + var hits = jsondata.hits; + $.each(hits, function(hit) { + var record = hits[hit]; + var label = record.repository.name + ' by ' + record.repository.repo_owner_username + ': ' + record.repository.description; + result = {value: record.repository.id, label: label}; + results.push(result); + }); + return results; + }; + + var addToQueue = function(metadata) { + if (metadata.tool_shed_url.substr(-1) == '/') { + metadata.tool_shed_url = metadata.tool_shed_url.substr(0, metadata.tool_shed_url.length - 1); + } + var key = metadata.tool_shed_url + '|' + metadata.repository_id + '|' + metadata.changeset_revision; + var queued_repos = new Object(); + if (localStorage.repositories) { + queued_repos = JSON.parse(localStorage.repositories); + } + queued_repos[key] = metadata; + localStorage.repositories = JSON.stringify(queued_repos); + } + + var queueLength = function() { + if (localStorage.hasOwnProperty('repositories')) { + repo_queue = JSON.parse(localStorage.repositories); + queue_length = Object.keys(repo_queue).length; + return queue_length; + } + else { + return 0; + } + } + + return {searchShed: searchShed, shedParser: shedParser, addToQueue: addToQueue, queueLength: queueLength}; +}); diff --git a/client/galaxy/scripts/mvc/toolshed/workflows-view.js b/client/galaxy/scripts/mvc/toolshed/workflows-view.js new file mode 100644 index 00000000000..bb47d9ba65a --- /dev/null +++ b/client/galaxy/scripts/mvc/toolshed/workflows-view.js @@ -0,0 +1,122 @@ +define(['mvc/toolshed/toolshed-model', 'mvc/toolshed/util'], function(toolshed_model, toolshed_util) { + + var View = Backbone.View.extend({ + + el: '#center', + + defaults: [{}], + + initialize: function(options) { + var that = this; + this.model = new toolshed_model.WorkflowTools(); + this.listenTo(this.model, 'sync', this.render); + this.model.fetch(); + that.render(); + }, + + render: function(options) { + var that = this; + var workflows_missing_tools = that.templateWorkflows; + var workflows = that.model.models; + that.$el.html(workflows_missing_tools({title: 'Workflows Missing Tools', workflows: workflows, queue: toolshed_util.queueLength()})); + $("#center").css('overflow', 'auto'); + that.bindEvents(); + }, + + bindEvents: function() { + var that = this; + $('.show_wf_repo').on('click', function() { + var tool_ids = $(this).attr('data-toolids'); + var toolshed = $(this).attr('data-shed'); + var api_url = Galaxy.root + 'api/tool_shed/repository' + var params = {'tool_ids': tool_ids}; + $.get(api_url, params, function(data) { + repository_id = data.repository.id; + var new_route = 'repository/s/' + toolshed.replace(/:/g, '%3a').replace(/\//g, '%2f') + '/r/' + data.repository.id; + Backbone.history.navigate(new_route, {trigger: true, replace:true}); + }); + }); + $('.queue_wf_repo').on('click', function() { + var elem = $(this); + var tool_ids = elem.attr('data-toolids'); + var toolshed = elem.attr('data-shed'); + var api_url = Galaxy.root + 'api/tool_shed/repository' + var params = {'tool_ids': tool_ids}; + $.get(api_url, params, function(data) { + repository_id = data.repository.id; + params = {tool_shed_url: toolshed, repository_id: repository_id}; + $.get(api_url, params, function(data) { + var changesets = Object.keys(data.repository.metadata); + var current_changeset = changesets[0]; + var current_metadata = data.repository.metadata[current_changeset]; + current_metadata.tool_shed_url = toolshed; + toolshed_util.addToQueue(current_metadata); + elem.remove(); + }); + }); + }); + $('#from_workflow').on('click', that.loadWorkflows); + }, + + reDraw: function(options) { + this.$el.empty(); + this.initialize(options); + }, + + templateWorkflows: _.template([ + '
    ', + '
    <%= title %>
    ', + '
    Repository Queue (<%= queue %>)
    ', + '
    ', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '<% _.each(workflows, function(workflow) { %>', + '', + '', + '', + '', + '', + '', + '', + '', + '<% }); %>', + '', + '', + ].join('')) + }); + + return { + Workflows: View, + }; + +}); \ No newline at end of file diff --git a/config/galaxy.ini.sample b/config/galaxy.ini.sample index 5720c826698..1be56ca42a1 100644 --- a/config/galaxy.ini.sample +++ b/config/galaxy.ini.sample @@ -1077,7 +1077,7 @@ use_interactive = True # Enable the new interface for installing tools from Tool Shed # via the API. Admin menu will list both if enabled. -#enable_beta_ts_api_install = False +#enable_beta_ts_api_install = True # Enable the new container interface for Interactive Environments #enable_beta_containers_interface = False diff --git a/lib/galaxy/config.py b/lib/galaxy/config.py index ab91f0d64af..83ab02a901a 100644 --- a/lib/galaxy/config.py +++ b/lib/galaxy/config.py @@ -308,7 +308,7 @@ class Configuration( object ): # Enable new interface for API installations from TS. # Admin menu will list both if enabled. - self.enable_beta_ts_api_install = string_as_bool( kwargs.get( 'enable_beta_ts_api_install', 'False' ) ) + self.enable_beta_ts_api_install = string_as_bool( kwargs.get( 'enable_beta_ts_api_install', 'True' ) ) # The transfer manager and deferred job queue self.enable_beta_job_managers = string_as_bool( kwargs.get( 'enable_beta_job_managers', 'False' ) ) # These workflow modules should not be considered part of Galaxy's diff --git a/lib/galaxy/tools/__init__.py b/lib/galaxy/tools/__init__.py index 16ac5a2c385..38b2f41aa65 100755 --- a/lib/galaxy/tools/__init__.py +++ b/lib/galaxy/tools/__init__.py @@ -1858,8 +1858,8 @@ class Tool( object, Dictifiable ): # create tool model tool_model = self.to_dict( request_context ) - tool_model[ 'inputs' ] = [] - populate_model( self.inputs, state_inputs, tool_model[ 'inputs' ] ) + tool_model[ 'inputs' ] = {} + self.populate_model( request_context, self.inputs, state_inputs, tool_model[ 'inputs' ] ) # create tool help tool_help = '' @@ -1897,6 +1897,43 @@ class Tool( object, Dictifiable ): }) return tool_model + # populates model from state + def populate_model( self, request_context, inputs, state_inputs, group_inputs, other_values=None ): + other_values = ExpressionContext( state_inputs, other_values ) + for input_index, input in enumerate( inputs.itervalues() ): + tool_dict = None + group_state = state_inputs.get( input.name, {} ) + if input.type == 'repeat': + tool_dict = input.to_dict( request_context ) + group_cache = tool_dict[ 'cache' ] = {} + for i in range( len( group_state ) ): + group_cache[ i ] = {} + self.populate_model( request_context, input.inputs, group_state[ i ], group_cache[ i ], other_values ) + elif input.type == 'conditional': + tool_dict = input.to_dict( request_context ) + if 'test_param' in tool_dict: + test_param = tool_dict[ 'test_param' ] + test_param[ 'value' ] = input.test_param.value_to_basic( group_state.get( test_param[ 'name' ], input.test_param.get_initial_value( request_context, other_values ) ), self.app ) + test_param[ 'text_value' ] = input.test_param.value_to_display_text( test_param[ 'value' ] ) + for i in range( len( tool_dict['cases'] ) ): + current_state = {} + if i == group_state.get( '__current_case__' ): + current_state = group_state + self.populate_model( request_context, input.cases[ i ].inputs, current_state, tool_dict[ 'cases' ][ i ][ 'inputs' ], other_values ) + elif input.type == 'section': + tool_dict = input.to_dict( request_context ) + self.populate_model( request_context, input.inputs, group_state, tool_dict[ 'inputs' ], other_values ) + else: + try: + tool_dict = input.to_dict( request_context, other_values=other_values ) + tool_dict[ 'value' ] = input.value_to_basic( state_inputs.get( input.name, input.get_initial_value( request_context, other_values ) ), self.app, use_security=True ) + tool_dict[ 'text_value' ] = input.value_to_display_text( tool_dict[ 'value' ] ) + except Exception as e: + tool_dict = input.to_dict( request_context ) + log.exception('tools::to_json() - Skipping parameter expansion \'%s\': %s.' % ( input.name, e ) ) + pass + group_inputs[ input_index ] = tool_dict + def _get_job_remap( self, job): if job: if job.state == job.states.ERROR: diff --git a/lib/galaxy/tools/toolbox/base.py b/lib/galaxy/tools/toolbox/base.py index 1fb4edd4678..12c08e38d7a 100644 --- a/lib/galaxy/tools/toolbox/base.py +++ b/lib/galaxy/tools/toolbox/base.py @@ -460,9 +460,23 @@ class AbstractToolBox( Dictifiable, ManagesIntegratedToolPanelMixin, object ): def has_tool( self, tool_id, tool_version=None, exact=False ): return self.get_tool( tool_id, tool_version=tool_version, exact=exact ) is not None + def is_missing_shed_tool( self, tool_id ): + """Confirm that the tool ID does reference a shed tool and is not installed.""" + if tool_id is None: + # This is not a tool ID. + return False + if 'repos' not in tool_id: + # This is not a shed tool. + return False + # This is a valid tool, and it is from a toolshed. Check if it's + # missing from the toolbox. + if tool_id not in self._tools_by_id: + return True + return False + def get_tool_id( self, tool_id ): - """ Take a tool id (potentially from a different Galaxy instance or that - is no longer loaded - and find the closest match to the currently loaded + """ Take a tool id - potentially from a different Galaxy instance or that + is no longer loaded - and find the closest match to the currently loaded tools (using get_tool for inexact matches which currently returns the oldest tool shed installed tool with the same short id). """ diff --git a/lib/galaxy/webapps/galaxy/api/tool_shed_repositories.py b/lib/galaxy/webapps/galaxy/api/tool_shed_repositories.py index d3ae2386ae3..9bb66b3e31a 100644 --- a/lib/galaxy/webapps/galaxy/api/tool_shed_repositories.py +++ b/lib/galaxy/webapps/galaxy/api/tool_shed_repositories.py @@ -5,10 +5,12 @@ from time import strftime from paste.httpexceptions import HTTPBadRequest, HTTPForbidden +from sqlalchemy import and_ import tool_shed.util.shed_util_common as suc from galaxy import util from galaxy import web from galaxy import exceptions + from galaxy.web import _future_expose_api as expose_api from galaxy.web.base.controller import BaseAPIController @@ -18,11 +20,10 @@ from tool_shed.galaxy_install.repair_repository_manager import RepairRepositoryM from tool_shed.util import common_util from tool_shed.util import encoding_util from tool_shed.util import hg_util -from tool_shed.util import workflow_util -from tool_shed.util import tool_util from tool_shed.util import repository_util +from tool_shed.util import tool_util +from tool_shed.util import workflow_util -from sqlalchemy import and_ log = logging.getLogger( __name__ ) @@ -191,26 +192,6 @@ class ToolShedRepositoriesController( BaseAPIController ): return changeset_revisions[ -1 ] return hg_util.INITIAL_CHANGELOG_HASH - @expose_api - @web.require_admin - def shed_categories( self, trans, **kwd ): - """ - GET /api/tool_shed_repositories/shed_categories - - Display a list of categories in the selected toolshed. - - :param tool_shed_url: the url of the toolshed to get categories from - """ - tool_shed_url = kwd.get( 'tool_shed_url', '' ) - tool_shed_url = common_util.get_tool_shed_url_from_tool_shed_registry( trans.app, tool_shed_url ) - url = util.build_url( tool_shed_url, pathspec=[ 'api', 'categories' ] ) - categories = json.loads( util.url_get( url ) ) - repositories = [] - url = util.build_url( tool_shed_url, pathspec=[ 'api', 'repositories' ] ) - for repo in json.loads( util.url_get( url ) ): - repositories.append( dict( value=repo[ 'id' ], label='%s/%s' % ( repo[ 'owner' ], repo[ 'name' ] ) ) ) - return { 'categories': categories, 'repositories': repositories } - @expose_api @web.require_admin def shed_category( self, trans, **kwd ): @@ -224,8 +205,9 @@ class ToolShedRepositoriesController( BaseAPIController ): """ tool_shed_url = kwd.get( 'tool_shed_url', '' ) category_id = kwd.get( 'category_id', '' ) + params = dict( installable=True ) tool_shed_url = common_util.get_tool_shed_url_from_tool_shed_registry( trans.app, tool_shed_url ) - url = util.build_url( tool_shed_url, pathspec=[ 'api', 'categories', category_id, 'repositories' ] ) + url = util.build_url( tool_shed_url, pathspec=[ 'api', 'categories', category_id, 'repositories' ], params=params ) category = json.loads( util.url_get( url ) ) return category @@ -237,12 +219,22 @@ class ToolShedRepositoriesController( BaseAPIController ): Get details about the specified repository from its shed. - :param tsr_id: the tool_shed_repository_id + :param tsr_id: the tool_shed_repository_id + :param tsr_id: str + + :param tool_shed_url: the URL of the toolshed whence to retrieve repository details + :param tool_shed_url: str + + :param tool_ids: (optional) comma-separated list of tool IDs + :param tool_ids: str """ tool_dependencies = dict() tools = dict() tool_shed_url = kwd.get( 'tool_shed_url', '' ) - tsr_id = kwd.get( 'tsr_id', '' ) + tsr_id = kwd.get( 'tsr_id', None ) + tool_ids = kwd.get( 'tool_ids', None ) + if tool_ids is not None: + tool_ids = util.listify( tool_ids ) tool_panel_section_select_field = tool_util.build_tool_panel_section_select_field( trans.app ) tool_panel_section_dict = { 'name': tool_panel_section_select_field.name, 'id': tool_panel_section_select_field.field_id, @@ -250,8 +242,22 @@ class ToolShedRepositoriesController( BaseAPIController ): for name, id, _ in tool_panel_section_select_field.options: tool_panel_section_dict['sections'].append( dict( id=id, name=name ) ) repository_data = dict() - repository_data[ 'repository' ] = json.loads( util.url_get( tool_shed_url, pathspec=[ 'api', 'repositories', tsr_id ] ) ) - repository_data[ 'repository' ][ 'metadata' ] = json.loads( util.url_get( tool_shed_url, pathspec=[ 'api', 'repositories', tsr_id, 'metadata' ] ) ) + if tool_ids is not None: + if len( tool_shed_url ) == 0: + # By design, this list should always be from the same toolshed. If + # this is ever not the case, this code will need to be updated. + tool_shed_url = common_util.get_tool_shed_url_from_tool_shed_registry( self.app, tool_ids[ 0 ].split( '/' )[ 0 ] ) + found_repository = json.loads( util.url_get( tool_shed_url, params=dict( tool_ids=','.join( tool_ids ) ), pathspec=[ 'api', 'repositories' ] ) ) + fr_keys = found_repository.keys() + tsr_id = found_repository[ fr_keys[0] ][ 'repository_id' ] + repository_data[ 'current_changeset' ] = found_repository[ 'current_changeset' ] + repository_data[ 'repository' ] = json.loads( util.url_get( tool_shed_url, pathspec=[ 'api', 'repositories', tsr_id ] ) ) + del found_repository[ 'current_changeset' ] + repository_data[ 'repository' ][ 'metadata' ] = found_repository + repository_data[ 'tool_shed_url' ] = tool_shed_url + else: + repository_data[ 'repository' ] = json.loads( util.url_get( tool_shed_url, pathspec=[ 'api', 'repositories', tsr_id ] ) ) + repository_data[ 'repository' ][ 'metadata' ] = json.loads( util.url_get( tool_shed_url, pathspec=[ 'api', 'repositories', tsr_id, 'metadata' ] ) ) repository_data[ 'shed_conf' ] = tool_util.build_shed_tool_conf_select_field( trans.app ).get_html().replace('\n', '') repository_data[ 'panel_section_html' ] = tool_panel_section_select_field.get_html( extra_attr={ 'style': 'width: 30em;' } ).replace( '\n', '' ) repository_data[ 'panel_section_dict' ] = tool_panel_section_dict @@ -278,13 +284,33 @@ class ToolShedRepositoriesController( BaseAPIController ): del( dependency_dict[ 'readme' ] ) if dependency_dict not in tool_dependencies[ changeset ]: tool_dependencies[ changeset ].append( dependency_dict ) - # log.debug(tool_dependencies) if metadata[ 'has_repository_dependencies' ]: for repository_dependency in metadata[ 'repository_dependencies' ]: tool_dependencies[ changeset ] = self.__get_tool_dependencies( repository_dependency, tool_dependencies[ changeset ] ) repository_data[ 'tool_dependencies' ] = tool_dependencies return repository_data + @expose_api + @web.require_admin + def shed_search( self, trans, **kwd ): + """ + GET /api/tool_shed_repositories/shed_search + + Search for a specific repository in the toolshed. + + :param q: the query string to search for + :param q: str + + :param tool_shed_url: the URL of the toolshed to search + :param tool_shed_url: str + """ + tool_shed_url = kwd.get( 'tool_shed_url', None ) + q = kwd.get( 'term', None ) + if None in [ q, tool_shed_url ]: + return {} + response = json.loads( util.url_get( tool_shed_url, params=dict( q=q ), pathspec=[ 'api', 'repositories' ] ) ) + return response + @expose_api def import_workflow( self, trans, payload, **kwd ): """ diff --git a/lib/galaxy/webapps/galaxy/api/toolshed.py b/lib/galaxy/webapps/galaxy/api/toolshed.py new file mode 100644 index 00000000000..f399de513f5 --- /dev/null +++ b/lib/galaxy/webapps/galaxy/api/toolshed.py @@ -0,0 +1,297 @@ +import json +import logging +import re +from six.moves.urllib.parse import quote as urlquote +from six.moves.urllib.parse import unquote as urlunquote + +from galaxy import util +from galaxy import web + +from galaxy.web import _future_expose_api as expose_api +from galaxy.web.base.controller import BaseAPIController + +from tool_shed.util import common_util +from tool_shed.util import repository_util +from tool_shed.util import tool_util + +log = logging.getLogger( __name__ ) + + +class ToolShedController( BaseAPIController ): + """RESTful controller for interactions with tool sheds.""" + + def __get_repo_dict_by_id( self, id ): + tool_shed_repository = repository_util.get_tool_shed_repository_by_id( self.app, id ) + if tool_shed_repository is None: + log.debug( "Unable to locate tool_shed_repository record for id %s." % ( str( id ) ) ) + return {} + tool_shed_repository_dict = tool_shed_repository.as_dict( value_mapper=self.__get_value_mapper( tool_shed_repository ) ) + tool_shed_repository_dict[ 'url' ] = web.url_for( controller='tool_shed_repositories', + action='show', + id=self.app.security.encode_id( tool_shed_repository.id ) ) + tool_shed_repository_dict[ 'repository_dependencies' ] = self.__flatten_repository_dependency_list( tool_shed_repository ) + return tool_shed_repository_dict + + def __get_tool_dependencies( self, metadata, tool_dependencies=None ): + if tool_dependencies is None: + tool_dependencies = [] + for key, dependency_dict in metadata[ 'tool_dependencies' ].items(): + if 'readme' in dependency_dict: + del( dependency_dict[ 'readme' ] ) + if dependency_dict not in tool_dependencies: + tool_dependencies.append( dependency_dict ) + if metadata[ 'has_repository_dependencies' ]: + for dependency in metadata[ 'repository_dependencies' ]: + tool_dependencies = self.__get_tool_dependencies( dependency, tool_dependencies ) + return tool_dependencies + + def __flatten_repository_dependency_list( self, tool_shed_repository ): + ''' + Return a recursive exclusive flattened list of all tool_shed_repository's dependencies. + ''' + dependencies = [] + for dependency in tool_shed_repository.repository_dependencies: + if len( dependency.repository_dependencies ) > 0: + sub_dependencies = self.__flatten_repository_dependency_list( dependency ) + for sub_dependency in sub_dependencies: + if sub_dependency not in dependencies: + dependencies.append( sub_dependency ) + if dependency not in dependencies: + dependencies.append( dependency.as_dict( value_mapper=self.__get_value_mapper( tool_shed_repository ) ) ) + return dependencies + + def __get_value_mapper( self, tool_shed_repository ): + value_mapper = { 'id': self.app.security.encode_id( tool_shed_repository.id ), + 'error_message': tool_shed_repository.error_message or '' } + return value_mapper + + def __get_tools( self, metadata, tools=None ): + if tools is None: + tools = [] + if metadata[ 'includes_tools_for_display_in_tool_panel' ]: + for key, tool_dict in metadata[ 'tools' ]: + tool_info = dict( clean=re.sub( '[^a-zA-Z0-9]+', '_', tool_dict[ 'name' ] ).lower(), + name=tool_dict[ 'name' ], + version=tool_dict[ 'version' ], + description=tool_dict[ 'description' ] ) + if tool_info not in tools: + tools.append( tool_info ) + if metadata[ 'has_repository_dependencies' ]: + for dependency in metadata[ 'repository_dependencies' ]: + tools = self.__get_tools( dependency, tools ) + return tools + + @expose_api + def index( self, trans, **kwd ): + """ + GET /api/tool_shed + Interact with this galaxy instance's toolshed registry. + """ + sheds = [] + for name, url in trans.app.tool_shed_registry.tool_sheds.items(): + # api_url = web.url_for( controller='api/tool_shed', + # action='contents', + # tool_shed_url=urlquote( url, '' ), + # qualified=True ) + sheds.append( dict( name=name, url=urlquote( url, '' ) ) ) + return sheds + + @expose_api + @web.require_admin + def status( self, trans, **kwd ): + """ + GET /api/tool_shed_repositories/{id}/status + Display a dictionary containing information about a specified repository's installation + status and a list of its dependencies and the status of each. + + :param id: the repository's encoded id + """ + repository_ids = kwd.get( 'repositories', None ) + repositories = [] + if repository_ids is not None: + for repository_id in repository_ids.split( '|' ): + tool_shed_repository_dict = self.__get_repo_dict_by_id( repository_id ) + repositories.append( tool_shed_repository_dict ) + return repositories + else: + return [] + # return tool_shed_repository_dict + + @expose_api + @web.require_admin + def tool_json( self, trans, **kwd ): + """ + GET /api/tool_shed_repositories/shed_tool_json + + Get the tool form JSON for a tool in a toolshed repository. + + :param guid: the GUID of the tool + :param guid: str + + :param tsr_id: the ID of the repository + :param tsr_id: str + + :param changeset: the changeset at which to load the tool json + :param changeset: str + + :param tool_shed_url: the URL of the toolshed to load from + :param tool_shed_url: str + """ + tool_shed_url = kwd.get( 'tool_shed_url', None ) + tsr_id = kwd.get( 'tsr_id', None ) + guid = kwd.get( 'guid', None ) + changeset = kwd.get( 'changeset', None ) + if None in [ tool_shed_url, tsr_id, guid, changeset ]: + message = 'Tool shed URL, changeset, repository ID, and tool GUID are all required parameters.' + trans.response.status = 400 + return { 'status': 'error', 'message': message } + response = json.loads( util.url_get( tool_shed_url, params=dict( tsr_id=tsr_id, guid=guid, changeset=changeset.split( ':' )[ -1 ] ), pathspec=[ 'api', 'tools', 'json' ] ) ) + return response + + @expose_api + def show( self, trans, **kwd ): + """ + GET /api/tool_shed/contents + + Display a list of categories in the selected toolshed. + + :param tool_shed_url: the url of the toolshed to get categories from + """ + tool_shed_url = urlunquote( kwd.get( 'tool_shed_url', '' ) ) + tool_shed_url = common_util.get_tool_shed_url_from_tool_shed_registry( trans.app, tool_shed_url ) + url = util.build_url( tool_shed_url, pathspec=[ 'api', 'categories' ] ) + categories = [] + for category in json.loads( util.url_get( url ) ): + api_url = web.url_for( controller='api/tool_shed', + action='category', + tool_shed_url=urlquote( tool_shed_url ), + category_id=category[ 'id' ], + qualified=True ) + category[ 'url' ] = api_url + categories.append( category ) + return categories + + @expose_api + @web.require_admin + def category( self, trans, **kwd ): + """ + GET /api/tool_shed/category + + Display a list of repositories in the selected category. + + :param tool_shed_url: the url of the toolshed to get repositories from + :param category_id: the category to get repositories from + """ + tool_shed_url = urlunquote( kwd.get( 'tool_shed_url', '' ) ) + category_id = kwd.get( 'category_id', '' ) + params = dict( installable=True ) + tool_shed_url = common_util.get_tool_shed_url_from_tool_shed_registry( trans.app, tool_shed_url ) + url = util.build_url( tool_shed_url, pathspec=[ 'api', 'categories', category_id, 'repositories' ], params=params ) + repositories = [] + return_json = json.loads( util.url_get( url ) ) + for repository in return_json[ 'repositories' ]: + api_url = web.url_for( controller='api/tool_shed', + action='repository', + tool_shed_url=urlquote( tool_shed_url ), + repository_id=repository[ 'id' ], + qualified=True ) + repository[ 'url' ] = api_url + repositories.append( repository ) + return_json[ 'repositories' ] = repositories + return return_json + + @expose_api + def repository( self, trans, **kwd ): + """ + GET /api/tool_shed/repository + + Get details about the specified repository from its shed. + + :param repository_id: the tool_shed_repository_id + :param repository_id: str + + :param tool_shed_url: the URL of the toolshed whence to retrieve repository details + :param tool_shed_url: str + + :param tool_ids: (optional) comma-separated list of tool IDs + :param tool_ids: str + """ + tool_dependencies = dict() + tools = dict() + tool_shed_url = urlunquote( kwd.get( 'tool_shed_url', '' ) ) + log.debug( tool_shed_url ) + repository_id = kwd.get( 'repository_id', None ) + tool_ids = kwd.get( 'tool_ids', None ) + if tool_ids is not None: + tool_ids = util.listify( tool_ids ) + tool_panel_section_select_field = tool_util.build_tool_panel_section_select_field( trans.app ) + tool_panel_section_dict = { 'name': tool_panel_section_select_field.name, + 'id': tool_panel_section_select_field.field_id, + 'sections': [] } + for name, id, _ in tool_panel_section_select_field.options: + tool_panel_section_dict['sections'].append( dict( id=id, name=name ) ) + repository_data = dict() + if tool_ids is not None: + if len( tool_shed_url ) == 0: + # By design, this list should always be from the same toolshed. If + # this is ever not the case, this code will need to be updated. + tool_shed_url = common_util.get_tool_shed_url_from_tool_shed_registry( self.app, tool_ids[ 0 ].split( '/' )[ 0 ] ) + found_repository = json.loads( util.url_get( tool_shed_url, params=dict( tool_ids=','.join( tool_ids ) ), pathspec=[ 'api', 'repositories' ] ) ) + fr_keys = found_repository.keys() + repository_id = found_repository[ fr_keys[0] ][ 'repository_id' ] + repository_data[ 'current_changeset' ] = found_repository[ 'current_changeset' ] + repository_data[ 'repository' ] = json.loads( util.url_get( tool_shed_url, pathspec=[ 'api', 'repositories', repository_id ] ) ) + del found_repository[ 'current_changeset' ] + repository_data[ 'tool_shed_url' ] = tool_shed_url + else: + repository_data[ 'repository' ] = json.loads( util.url_get( tool_shed_url, pathspec=[ 'api', 'repositories', repository_id ] ) ) + repository_data[ 'repository' ][ 'metadata' ] = json.loads( util.url_get( tool_shed_url, pathspec=[ 'api', 'repositories', repository_id, 'metadata' ] ) ) + repository_data[ 'shed_conf' ] = tool_util.build_shed_tool_conf_select_field( trans.app ).get_html().replace('\n', '') + repository_data[ 'panel_section_html' ] = tool_panel_section_select_field.get_html( extra_attr={ 'style': 'width: 30em;' } ).replace( '\n', '' ) + repository_data[ 'panel_section_dict' ] = tool_panel_section_dict + for changeset, metadata in repository_data[ 'repository' ][ 'metadata' ].items(): + if changeset not in tool_dependencies: + tool_dependencies[ changeset ] = [] + if metadata[ 'includes_tools_for_display_in_tool_panel' ]: + if changeset not in tools: + tools[ changeset ] = [] + for tool_dict in metadata[ 'tools' ]: + tool_info = dict( clean=re.sub( '[^a-zA-Z0-9]+', '_', tool_dict[ 'name' ] ).lower(), + guid=tool_dict[ 'guid' ], + name=tool_dict[ 'name' ], + version=tool_dict[ 'version' ], + description=tool_dict[ 'description' ] ) + if tool_info not in tools[ changeset ]: + tools[ changeset ].append( tool_info ) + if metadata[ 'has_repository_dependencies' ]: + for repository_dependency in metadata[ 'repository_dependencies' ]: + tools[ changeset ] = self.__get_tools( repository_dependency, tools[ changeset ] ) + repository_data[ 'tools' ] = tools + for key, dependency_dict in metadata[ 'tool_dependencies' ].items(): + if 'readme' in dependency_dict: + del( dependency_dict[ 'readme' ] ) + if dependency_dict not in tool_dependencies[ changeset ]: + tool_dependencies[ changeset ].append( dependency_dict ) + if metadata[ 'has_repository_dependencies' ]: + for repository_dependency in metadata[ 'repository_dependencies' ]: + tool_dependencies[ changeset ] = self.__get_tool_dependencies( repository_dependency, tool_dependencies[ changeset ] ) + repository_data[ 'tool_dependencies' ] = tool_dependencies + return repository_data + + @expose_api + @web.require_admin + def search( self, trans, **kwd ): + """ + GET /api/tool_shed/search + Search for a specific repository in the toolshed. + :param q: the query string to search for + :param q: str + :param tool_shed_url: the URL of the toolshed to search + :param tool_shed_url: str + """ + tool_shed_url = kwd.get( 'tool_shed_url', None ) + q = kwd.get( 'term', None ) + if None in [ q, tool_shed_url ]: + return {} + response = json.loads( util.url_get( tool_shed_url, params=dict( q=q ), pathspec=[ 'api', 'repositories' ] ) ) + return response diff --git a/lib/galaxy/webapps/galaxy/api/workflows.py b/lib/galaxy/webapps/galaxy/api/workflows.py index beb8bc6cd25..96c5b2b65c5 100644 --- a/lib/galaxy/webapps/galaxy/api/workflows.py +++ b/lib/galaxy/webapps/galaxy/api/workflows.py @@ -43,6 +43,12 @@ class WorkflowsAPIController(BaseAPIController, UsesStoredWorkflowMixin, UsesAnn self.workflow_manager = workflows.WorkflowsManager( app ) self.workflow_contents_manager = workflows.WorkflowContentsManager( app ) + def __get_full_shed_url( self, url ): + for name, shed_url in self.app.tool_shed_registry.tool_sheds.items(): + if url in shed_url: + return shed_url + return None + @expose_api def index(self, trans, **kwd): """ @@ -52,8 +58,11 @@ class WorkflowsAPIController(BaseAPIController, UsesStoredWorkflowMixin, UsesAnn :param show_published: if True, show also published workflows :type show_published: boolean + :param missing_tools: if True, include a list of missing tools per workflow + :type missing_tools: boolean """ show_published = util.string_as_bool( kwd.get( 'show_published', 'False' ) ) + missing_tools = util.string_as_bool( kwd.get( 'missing_tools', 'False' ) ) rval = [] filter1 = ( trans.app.model.StoredWorkflow.user == trans.user ) if show_published: @@ -78,6 +87,39 @@ class WorkflowsAPIController(BaseAPIController, UsesStoredWorkflowMixin, UsesAnn item['number_of_steps'] = len( wf_sa.stored_workflow.latest_workflow.steps ) item['slug'] = wf_sa.stored_workflow.slug rval.append(item) + if missing_tools: + workflows_missing_tools = [] + workflows = [] + workflows_by_toolshed = dict() + for key, value in enumerate(rval): + tool_ids = [] + workflow_details = self.workflow_contents_manager.workflow_to_dict( trans, self.__get_stored_workflow( trans, value[ 'id' ] ), style='instance' ) + if 'steps' in workflow_details: + for step in workflow_details[ 'steps' ]: + tool_id = workflow_details[ 'steps' ][ step ][ 'tool_id' ] + if tool_id not in tool_ids and self.app.toolbox.is_missing_shed_tool( tool_id ): + tool_ids.append( tool_id ) + if len( tool_ids ) > 0: + value[ 'missing_tools' ] = tool_ids + workflows_missing_tools.append( value ) + for workflow in workflows_missing_tools: + for tool_id in workflow[ 'missing_tools' ]: + toolshed, _, owner, name, tool, version = tool_id.split( '/' ) + shed_url = self.__get_full_shed_url( toolshed ) + repo_identifier = '/'.join( [ toolshed, owner, name ] ) + if repo_identifier not in workflows_by_toolshed: + workflows_by_toolshed[ repo_identifier ] = dict( shed=shed_url.rstrip('/'), repository=name, owner=owner, tools=[ tool_id ], workflows=[ workflow[ 'name' ] ] ) + else: + if tool_id not in workflows_by_toolshed[ repo_identifier ][ 'tools' ]: + workflows_by_toolshed[ repo_identifier ][ 'tools' ].append( tool_id ) + if workflow[ 'name' ] not in workflows_by_toolshed[ repo_identifier ][ 'workflows' ]: + workflows_by_toolshed[ repo_identifier ][ 'workflows' ].append( workflow[ 'name' ] ) + for repo_tag in workflows_by_toolshed: + workflows.append( workflows_by_toolshed[ repo_tag ] ) + return workflows + # import json + # log.debug(json.dumps(workflows_by_toolshed, indent=2)) + # return workflows_by_toolshed return rval @expose_api diff --git a/lib/galaxy/webapps/galaxy/buildapp.py b/lib/galaxy/webapps/galaxy/buildapp.py index 6ee41a6fde3..2f03513447d 100644 --- a/lib/galaxy/webapps/galaxy/buildapp.py +++ b/lib/galaxy/webapps/galaxy/buildapp.py @@ -763,22 +763,46 @@ def populate_api_routes( webapp, app ): repository_id=None, image_file=None ) - webapp.mapper.connect( 'shed_category', - '/api/tool_shed_repositories/shed_category', - controller='tool_shed_repositories', - action='shed_category', + webapp.mapper.connect( 'tool_shed_contents', + '/api/tool_shed/contents', + controller='toolshed', + action='show', conditions=dict( method=[ "GET" ] ) ) - webapp.mapper.connect( 'shed_repository', - '/api/tool_shed_repositories/shed_repository', - controller='tool_shed_repositories', - action='shed_repository', + webapp.mapper.connect( 'tool_shed_category_contents', + '/api/tool_shed/category', + controller='toolshed', + action='category', conditions=dict( method=[ "GET" ] ) ) - webapp.mapper.connect( 'shed_categories', - '/api/tool_shed_repositories/shed_categories', - controller='tool_shed_repositories', - action='shed_categories', + webapp.mapper.connect( 'tool_shed_repository_details', + '/api/tool_shed/repository', + controller='toolshed', + action='repository', + conditions=dict( method=[ "GET" ] ) ) + + webapp.mapper.connect( 'tool_sheds', + '/api/tool_shed', + controller='toolshed', + action='index', + conditions=dict( method=[ "GET" ] ) ) + + webapp.mapper.connect( 'tool_shed_search', + '/api/tool_shed/search', + controller='toolshed', + action='search', + conditions=dict( method=[ "GET", "POST" ] ) ) + + webapp.mapper.connect( 'tool_shed_status', + '/api/tool_shed/status', + controller='toolshed', + action='status', + conditions=dict( method=[ "GET", "POST" ] ) ) + + webapp.mapper.connect( 'shed_tool_json', + '/api/tool_shed/tool_json', + controller='toolshed', + action='tool_json', conditions=dict( method=[ "GET" ] ) ) webapp.mapper.connect( 'tool_shed_repository', diff --git a/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py b/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py index 769e1c47d2c..b02553419a5 100644 --- a/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py +++ b/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py @@ -3,11 +3,11 @@ import logging import os import shutil +from admin import AdminGalaxy from six import string_types from sqlalchemy import or_ import tool_shed.repository_types.util as rt_util -from admin import AdminGalaxy from galaxy import util, web from galaxy.tools.deps import views from galaxy.web.form_builder import CheckboxField @@ -195,10 +195,13 @@ class AdminToolshed( AdminGalaxy ): @web.expose @web.require_admin def browse_toolsheds( self, trans, **kwd ): - message = escape( kwd.get( 'message', '' ) ) - return trans.fill_template( '/admin/tool_shed_repository/browse_toolsheds.mako', - message=message, - status='error' ) + app = { + 'jscript': "admin.toolshed" + } + return trans.fill_template( 'galaxy.panels.mako', + config={ + 'title': 'Galaxy Tool Sheds', + 'app': app } ) @web.expose @web.require_admin diff --git a/lib/galaxy/webapps/tool_shed/api/categories.py b/lib/galaxy/webapps/tool_shed/api/categories.py index 4b5ab860fc7..31e07645dad 100644 --- a/lib/galaxy/webapps/tool_shed/api/categories.py +++ b/lib/galaxy/webapps/tool_shed/api/categories.py @@ -72,6 +72,7 @@ class CategoriesController( BaseAPIController ): Example: GET localhost:9009/api/categories/f9cad7b01a472135/repositories """ + installable = util.asbool( kwd.get( 'installable', 'false' ) ) category = suc.get_category( self.app, category_id ) if category is None: category_dict = dict( message='Unable to locate category record for id %s.' % ( str( id ) ), @@ -82,7 +83,7 @@ class CategoriesController( BaseAPIController ): category_dict[ 'url' ] = web.url_for( controller='categories', action='show', id=trans.security.encode_id( category.id ) ) - repositories = repository_util.get_repositories_by_category( self.app, category.id ) + repositories = repository_util.get_repositories_by_category( self.app, category.id, installable=installable ) category_dict[ 'repositories' ] = repositories return category_dict diff --git a/lib/galaxy/webapps/tool_shed/api/repositories.py b/lib/galaxy/webapps/tool_shed/api/repositories.py index 2f3dbc2cf15..57f0c00eb71 100644 --- a/lib/galaxy/webapps/tool_shed/api/repositories.py +++ b/lib/galaxy/webapps/tool_shed/api/repositories.py @@ -382,6 +382,9 @@ class RepositoriesController( BaseAPIController ): :param name: (optional)the repository name. :type name: str + :param tool_ids: (optional) a tool GUID to find the repository for + :param tool_ids: str + :returns dict: object containing list of results Examples: @@ -407,6 +410,47 @@ class RepositoriesController( BaseAPIController ): else: response = json.dumps( search_results ) return response + tool_ids = kwd.get( 'tool_ids', None ) + if tool_ids is not None: + tool_ids = util.listify( tool_ids ) + repository_found = [] + all_metadata = dict() + for tool_id in tool_ids: + # A valid GUID looks like toolshed.g2.bx.psu.edu/repos/bgruening/deeptools/deeptools_computeMatrix/1.1.0 + shed, _, owner, name, tool, version = tool_id.split( '/' ) + clause_list = [ and_( self.app.model.Repository.table.c.deprecated == false(), + self.app.model.Repository.table.c.deleted == false(), + self.app.model.Repository.table.c.name == name, + self.app.model.User.table.c.username == owner, + self.app.model.Repository.table.c.user_id == self.app.model.User.table.c.id ) ] + repository = trans.sa_session.query( self.app.model.Repository ).filter( *clause_list ).first() + for changeset, changehash in repository.installable_revisions( self.app ): + metadata = metadata_util.get_current_repository_metadata_for_changeset_revision( self.app, repository, changehash ) + tools = metadata.metadata[ 'tools' ] + for tool in tools: + if tool[ 'guid' ] in tool_ids: + repository_found.append( '%d:%s' % ( int( changeset ), changehash ) ) + metadata = metadata_util.get_current_repository_metadata_for_changeset_revision( self.app, repository, changehash ) + if metadata is None: + continue + metadata_dict = metadata.to_dict( value_mapper={ 'id': self.app.security.encode_id, 'repository_id': self.app.security.encode_id } ) + metadata_dict[ 'repository' ] = repository.to_dict( value_mapper={ 'id': self.app.security.encode_id } ) + if metadata.has_repository_dependencies: + metadata_dict[ 'repository_dependencies' ] = metadata_util.get_all_dependencies( self.app, metadata, processed_dependency_links=[] ) + else: + metadata_dict[ 'repository_dependencies' ] = [] + if metadata.includes_tool_dependencies: + metadata_dict[ 'tool_dependencies' ] = repository.get_tool_dependencies( self.app, changehash ) + else: + metadata_dict[ 'tool_dependencies' ] = {} + if metadata.includes_tools: + metadata_dict[ 'tools' ] = metadata.metadata[ 'tools' ] + all_metadata[ '%s:%s' % ( int( changeset ), changehash ) ] = metadata_dict + if repository_found is not None: + all_metadata[ 'current_changeset' ] = repository_found[ 0 ] + # all_metadata[ 'found_changesets' ] = repository_found + return json.dumps( all_metadata ) + return '{}' clause_list = [ and_( self.app.model.Repository.table.c.deprecated == false(), self.app.model.Repository.table.c.deleted == deleted ) ] diff --git a/lib/galaxy/webapps/tool_shed/api/tools.py b/lib/galaxy/webapps/tool_shed/api/tools.py index d13f29336c6..784fd3bbecc 100644 --- a/lib/galaxy/webapps/tool_shed/api/tools.py +++ b/lib/galaxy/webapps/tool_shed/api/tools.py @@ -3,12 +3,20 @@ import logging from collections import namedtuple from galaxy import web from galaxy import util +from galaxy.tools.parameters import params_to_strings from galaxy.web import _future_expose_api_raw_anonymous_and_sessionless as expose_api_raw_anonymous_and_sessionless from galaxy.web.base.controller import BaseAPIController from galaxy.webapps.tool_shed.search.tool_search import ToolSearch from galaxy.exceptions import NotImplemented from galaxy.exceptions import RequestParameterInvalidException from galaxy.exceptions import ConfigDoesNotAllowException +from tool_shed.dependencies.repository import relation_builder +from tool_shed.tools import tool_validator +from tool_shed.utility_containers import ToolShedUtilityContainerManager +from tool_shed.util import common_util +from tool_shed.util import repository_util +from tool_shed.util import shed_util_common as suc +from tool_shed.util import metadata_util log = logging.getLogger( __name__ ) @@ -99,3 +107,78 @@ class ToolsController( BaseAPIController ): boosts ) results[ 'hostname' ] = web.url_for( '/', qualified=True ) return results + + @expose_api_raw_anonymous_and_sessionless + def json( self, trans, **kwd ): + """ + GET /api/tools/json + + Get the tool form JSON for a tool in a repository. + + :param guid: the GUID of the tool + :param guid: str + + :param tsr_id: the ID of the repository + :param tsr_id: str + + :param changeset: the changeset at which to load the tool json + :param changeset: str + """ + guid = kwd.get( 'guid', None ) + tsr_id = kwd.get( 'tsr_id', None ) + changeset = kwd.get( 'changeset', None ) + if None in [ changeset, tsr_id, guid ]: + message = 'Changeset, repository ID, and tool GUID are all required parameters.' + trans.response.status = 400 + return { 'status': 'error', 'message': message } + tsucm = ToolShedUtilityContainerManager( trans.app ) + repository = repository_util.get_repository_in_tool_shed( self.app, tsr_id ) + repository_clone_url = common_util.generate_clone_url_for_repository_in_tool_shed( repository.user, repository ) + repository_metadata = metadata_util.get_repository_metadata_by_changeset_revision( trans.app, tsr_id, changeset ) + toolshed_base_url = str( web.url_for( '/', qualified=True ) ).rstrip( '/' ) + rb = relation_builder.RelationBuilder( trans.app, repository, repository_metadata, toolshed_base_url ) + repository_dependencies = rb.get_repository_dependencies_for_changeset_revision() + containers_dict = tsucm.build_repository_containers( repository, + changeset, + repository_dependencies, + repository_metadata ) + found_tool = None + for folder in containers_dict[ 'valid_tools' ].folders: + if hasattr( folder, 'valid_tools' ): + for tool in folder.valid_tools: + tool.id = tool.tool_id + tool_guid = suc.generate_tool_guid( repository_clone_url, tool ) + if tool_guid == guid: + found_tool = tool + break + if found_tool is None: + message = 'Unable to find tool with guid %s in repository %s.' % ( guid, repository.name ) + trans.response.status = 404 + return { 'status': 'error', 'message': message } + + tv = tool_validator.ToolValidator( trans.app ) + repository, tool, message = tv.load_tool_from_changeset_revision( tsr_id, + changeset, + found_tool.tool_config ) + if message: + status = 'error' + return dict( message=message, status=status ) + tool_help = '' + if tool.help: + tool_help = tool.help.render( static_path=web.url_for( '/static' ), host_url=web.url_for( '/', qualified=True ) ) + tool_help = util.unicodify( tool_help, 'utf-8' ) + tool_dict = tool.to_dict( trans ) + tool_dict[ 'inputs' ] = {} + tool.populate_model( trans, tool.inputs, {}, tool_dict[ 'inputs' ] ) + tool_dict.update({ + 'help' : tool_help, + 'citations' : bool( tool.citations ), + 'biostar_url' : trans.app.config.biostar_url, + 'requirements' : [ { 'name' : r.name, 'version' : r.version } for r in tool.requirements ], + 'state_inputs' : params_to_strings( tool.inputs, {}, trans.app ), + 'display' : tool.display_interface, + 'action' : web.url_for( tool.action ), + 'method' : tool.method, + 'enctype' : tool.enctype + }) + return json.dumps( tool_dict ) diff --git a/lib/galaxy/webapps/tool_shed/buildapp.py b/lib/galaxy/webapps/tool_shed/buildapp.py index 32f710308d4..220a02073f9 100644 --- a/lib/galaxy/webapps/tool_shed/buildapp.py +++ b/lib/galaxy/webapps/tool_shed/buildapp.py @@ -185,6 +185,11 @@ def app_factory( global_conf, **kwargs ): controller='tools', action='index', conditions=dict( method=[ "GET" ] ) ) + webapp.mapper.connect( 'json', + '/api/tools/json', + controller='tools', + action='json', + conditions=dict( method=[ "GET" ] ) ) webapp.mapper.connect( "version", "/api/version", controller="configuration", action="version", conditions=dict( method=[ "GET" ] ) ) webapp.finalize_config() diff --git a/lib/tool_shed/util/repository_util.py b/lib/tool_shed/util/repository_util.py index bba83e0e6cc..63fc07edab9 100644 --- a/lib/tool_shed/util/repository_util.py +++ b/lib/tool_shed/util/repository_util.py @@ -510,7 +510,7 @@ def get_repo_info_tuple_contents( repo_info_tuple ): return description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_dependencies, tool_dependencies -def get_repositories_by_category( app, category_id ): +def get_repositories_by_category( app, category_id, installable=False ): sa_session = app.model.context.current resultset = sa_session.query( app.model.Category ).get( category_id ) repositories = [] @@ -522,7 +522,11 @@ def get_repositories_by_category( app, category_id ): encoded_id = app.security.encode_id( row.repository.id ) metadata = metadata_util.get_repository_metadata_by_changeset_revision( app, encoded_id, changehash ) repository_dict[ 'metadata' ][ '%s:%s' % ( changeset, changehash ) ] = metadata.to_dict( value_mapper=default_value_mapper ) - repositories.append( repository_dict ) + if installable: + if len( row.repository.installable_revisions( app ) ): + repositories.append( repository_dict ) + else: + repositories.append( repository_dict ) return repositories diff --git a/static/maps/admin.toolshed.js.map b/static/maps/admin.toolshed.js.map new file mode 100644 index 00000000000..746301acf8d --- /dev/null +++ b/static/maps/admin.toolshed.js.map @@ -0,0 +1 @@ +{"version":3,"file":"admin.toolshed.js","sources":["../src/admin.toolshed.js"],"names":["define","mod_shed_list_view","mod_categories_view","mod_repositories_view","mod_repository_view","mod_repoqueue_view","mod_repo_status_view","mod_workflows_view","AdminToolshedRouter","Backbone","Router","extend","initialize","this","routesHit","history","on","bind","trackPageview","routes","sheds","queue","workflows","status/r/:repositories","status","categories/s/:tool_shed","category/s/:tool_shed/c/:cateory_id","repository/s/:tool_shed/r/:repository_id","back","window","navigate","trigger","replace","GalaxyAdminToolshedApp","View","app_config","known_views","Galaxy","admintoolshedapp","admin_toolshed_router","adminRepoQueueView","reDraw","RepoQueueView","adminShedListView","ShedListView","tool_shed","adminShedCategoriesView","CategoryView","category_id","adminShedCategoryView","Category","repository_id","adminRepositoryView","RepoDetails","repositories","adminRepoStatusView","split","RepoStatus","adminWorkflowsView","Workflows","start","pushState","GalaxyApp"],"mappings":"AAAAA,QAAQ,8BACA,+BACA,iCACA,+BACA,qCACA,gCACA,+BACA,SAASC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,GAEb,GAAIC,GAAsBC,SAASC,OAAOC,QAEtCC,WAAY,WACRC,KAAKC,UAAY,EAEjBL,SAASM,QAAQC,GAAI,QAAS,WAAaH,KAAKC,aAAgBD,MAChEA,KAAKI,KAAM,QAASJ,KAAKK,gBAG7BC,QACI,GAA+C,YAC/CC,MAA+C,YAC/CC,MAA+C,QAC/CC,UAA+C,YAC/CC,yBAA+C,SAC/CC,OAA+C,SAC/CC,0BAA+C,aAC/CC,sCAA+C,eAC/CC,2CAA+C,cASnDC,KAAM,WACEf,KAAKC,UAAY,EACjBe,OAAOd,QAAQa,OAEff,KAAKiB,SAAU,KAAOC,SAAQ,EAAMC,SAAQ,OAMpDC,EAAyBxB,SAASyB,KAAKvB,QAEvCwB,YACIC,aAAc,YAAa,QAAS,SAAU,aAAc,eAAgB,gBAGhFxB,WAAY,WACRyB,OAAOC,iBAAmBzB,KAC1BA,KAAK0B,sBAAwB,GAAI/B,GAEjCK,KAAK0B,sBAAsBvB,GAAG,cAAe,WACrCqB,OAAOC,iBAAiBE,mBACxBH,OAAOC,iBAAiBE,mBAAmBC,SAG3CJ,OAAOC,iBAAiBE,mBAAqB,GAAInC,GAAmBqC,gBAG5E7B,KAAK0B,sBAAsBvB,GAAG,kBAAmB,WACzCqB,OAAOC,iBAAiBK,kBACxBN,OAAOC,iBAAiBK,kBAAkBF,SAG1CJ,OAAOC,iBAAiBK,kBAAoB,GAAI1C,GAAmB2C,eAG3E/B,KAAK0B,sBAAsBvB,GAAG,mBAAoB,SAAS6B,GACnDR,OAAOC,iBAAiBQ,wBACxBT,OAAOC,iBAAiBQ,wBAAwBL,QAAQI,UAAWA,EAAUb,QAAQ,MAAO,SAG5FK,OAAOC,iBAAiBQ,wBAA0B,GAAI5C,GAAoB6C,cAAcF,UAAWA,EAAUb,QAAQ,MAAO,WAGpInB,KAAK0B,sBAAsBvB,GAAG,qBAAsB,SAAS6B,EAAWG,GAChEX,OAAOC,iBAAiBW,sBACxBZ,OAAOC,iBAAiBW,sBAAsBR,QAAQI,UAAWA,EAAUb,QAAQ,MAAO,OAAQgB,YAAaA,IAG/GX,OAAOC,iBAAiBW,sBAAwB,GAAI9C,GAAsB+C,UAAUL,UAAWA,EAAUb,QAAQ,MAAO,OAAQgB,YAAaA,MAGrJnC,KAAK0B,sBAAsBvB,GAAG,mBAAoB,SAAS6B,EAAWM,GAC9Dd,OAAOC,iBAAiBc,oBACxBf,OAAOC,iBAAiBc,oBAAoBX,QAAQI,UAAWA,EAAUb,QAAQ,MAAO,OAAQmB,cAAeA,IAG/Gd,OAAOC,iBAAiBc,oBAAsB,GAAIhD,GAAoBiD,aAAaR,UAAWA,EAAUb,QAAQ,MAAO,OAAQmB,cAAeA,MAGtJtC,KAAK0B,sBAAsBvB,GAAG,eAAgB,SAASsC,GAC/CjB,OAAOC,iBAAiBiB,oBACxBlB,OAAOC,iBAAiBiB,oBAAoBd,QAAQa,aAAcA,EAAaE,MAAM,OAGrFnB,OAAOC,iBAAiBiB,oBAAsB,GAAIjD,GAAqBmD,YAAYH,aAAcA,EAAaE,MAAM,SAG5H3C,KAAK0B,sBAAsBvB,GAAG,kBAAmB,WACzCqB,OAAOC,iBAAiBoB,mBACxBrB,OAAOC,iBAAiBoB,mBAAmBjB,SAG3CJ,OAAOC,iBAAiBoB,mBAAqB,GAAInD,GAAmBoD,YAI5ElD,SAASM,QAAQ6C,OAAOC,WAAW,MAI3C,QACIC,UAAW7B"} \ No newline at end of file diff --git a/static/maps/mvc/toolshed/categories-view.js.map b/static/maps/mvc/toolshed/categories-view.js.map new file mode 100644 index 00000000000..5af120bd0ad --- /dev/null +++ b/static/maps/mvc/toolshed/categories-view.js.map @@ -0,0 +1 @@ +{"version":3,"file":"categories-view.js","sources":["../../../src/mvc/toolshed/categories-view.js"],"names":["define","toolshed_model","toolshed_util","ToolShedCategories","Backbone","View","extend","el","defaults","tool_shed","initialize","options","shed","replace","this","_","model","Categories","listenTo","render","url","fetch","categories","models","queue","queueLength","category_list_template","templateCategoryList","$el","html","$","css","bindEvents","that","require","autocomplete","source","request","response","shed_url","base_url","Galaxy","root","params","term","tool_shed_url","post","data","console","log","result_list","shedParser","minLength","select","event","ui","tsr_id","item","value","new_route","history","navigate","trigger","reDraw","empty","template","join","CategoryView"],"mappings":"AAAAA,QAAQ,8BAA+B,qBAAsB,SAASC,EAAgBC,GAElF,GAAIC,GAAqBC,SAASC,KAAKC,QAEnCC,GAAI,UAEJC,UACIC,UAAW,mCAGfC,WAAY,SAASC,GACjB,GACIC,GAAOD,EAAQF,UAAUI,QAAQ,MAAO,MAC5CC,MAAKH,QAAUI,EAAEP,SAASM,KAAKH,SAAWA,EAASG,KAAKN,UACxDM,KAAKE,MAAQ,GAAIf,GAAegB,WAChCH,KAAKI,SAASJ,KAAKE,MAAO,OAAQF,KAAKK,QACvCL,KAAKE,MAAMI,IAAMN,KAAKE,MAAMI,IAAM,kBAAoBN,KAAKH,QAAQF,UACnEK,KAAKE,MAAMP,UAAYG,EACvBE,KAAKE,MAAMK,SAGfF,OAAQ,SAASR,GACbG,KAAKH,QAAUI,EAAET,OAAOQ,KAAKH,QAASA,GACtCG,KAAKH,QAAQW,WAAaR,KAAKE,MAAMO,OACrCT,KAAKH,QAAQa,MAAQtB,EAAcuB,aACnC,IAAIC,GAAyBZ,KAAKa,oBAClCb,MAAKc,IAAIC,KAAKH,EAAuBZ,KAAKH,UAC1CmB,EAAE,WAAWC,IAAI,WAAY,QAC7BjB,KAAKkB,cAGTA,WAAY,WACR,GAAIC,GAAOnB,IACXoB,UAAS,yBAA0B,WAC/BJ,EAAE,eAAeK,cACbC,OAAQ,SAASC,EAASC,GACtB,GAAIC,GAAWN,EAAKjB,MAAMP,UAAUI,QAAQ,OAAQ,KAChD2B,EAAWC,OAAOC,KAAO,uBACzBC,GAAUC,KAAMP,EAAQO,KAAMC,cAAeN,EACjDT,GAAEgB,KAAKN,EAAUG,EAAQ,SAASI,GAC9BC,QAAQC,IAAIF,GACZG,YAAchD,EAAciD,WAAWJ,GACvCT,EAASY,gBAGjBE,UAAW,EACXC,OAAQ,SAASC,EAAOC,GACpB,GAAIC,GAASD,EAAGE,KAAKC,MAGjBC,GAFUlB,OAAOC,KAAO,4BACdG,cAAiBZ,EAAKjB,MAAMP,UAAW+C,OAAUA,GAC/C,gBAAkBvB,EAAKjB,MAAMP,UAAY,MAAQ+C,EACjEpD,UAASwD,QAAQC,SAASF,GAAYG,SAAS,EAAMjD,SAAQ,UAM7EkD,OAAQ,SAASpD,GACbG,KAAKc,IAAIoC,QACTlD,KAAKE,MAAMI,IAAMN,KAAKE,MAAMI,IAAM,kBAAoBN,KAAKH,QAAQF,UACnEK,KAAKJ,WAAWC,IAGpBgB,qBAAsBZ,EAAEkD,UACpB,0BACI,+CACA,6CACJ,WACA,yEACI,4HACA,wJACJ,SACA,wDACI,+DACI,4BACI,8LACJ,UACJ,SACA,8CACI,uBACI,iCACI,OACI,gBACA,uBACA,wBACJ,QACJ,WACA,gDACI,OACI,OACI,sGACJ,QACA,8CACA,+CACJ,QACJ,YACJ,WACJ,SACJ,UACFC,KAAK,MAGX,QACIC,aAAchE"} \ No newline at end of file diff --git a/static/maps/mvc/toolshed/repo-queue-view.js.map b/static/maps/mvc/toolshed/repo-queue-view.js.map new file mode 100644 index 00000000000..521b022fe62 --- /dev/null +++ b/static/maps/mvc/toolshed/repo-queue-view.js.map @@ -0,0 +1 @@ +{"version":3,"file":"repo-queue-view.js","sources":["../../../src/mvc/toolshed/repo-queue-view.js"],"names":["define","ToolShedRepositoryQueue","Backbone","View","extend","el","render","options","this","_","repository_queue_template","templateRepoQueue","$el","html","repository","model","templateRepoQueueTab","template","join","workflows_missing_tools","RepoQueue"],"mappings":"AAAAA,QAAQ,mCAAoC,WAExC,GAAIC,GAA0BC,SAASC,KAAKC,QAExCC,GAAI,iBAEJC,OAAQ,SAASC,GACbC,KAAKD,QAAUE,EAAEL,OAAOI,KAAKD,QAASA,EACtC,IAAIG,GAA4BF,KAAKG,mBACrCH,MAAKI,IAAIC,KAAKH,GAA2BI,WAAYN,KAAKO,UAG9DC,qBAAsBP,EAAEQ,UACpB,8EACI,kFACJ,SACFC,KAAK,KAEPP,kBAAmBF,EAAEQ,UACjB,+CACI,wGACI,iCACI,OACI,sIACA,sIACA,uCACA,mCACA,oCACA,uCACJ,QACJ,WACA,UACI,oDACI,mDACI,0BACI,oMACJ,QACA,0BACI,yMACJ,QACA,8DACA,qDACA,sDACA,0DACJ,QACJ,YACJ,WACJ,WACA,+FACJ,UACFC,KAAK,KAEPC,wBAAyBV,EAAEQ,UACvB,4GACI,iCACI,OACI,wCACA,uCACA,mCACA,mCACA,oCACA,sCACJ,QACJ,WACA,UACI,gEACI,wDACA,gDACA,OACI,0BACI,8BACI,yDACI,4CACJ,YACJ,QACJ,QACA,0BACI,8BACI,uDACI,8CACJ,YACJ,QACJ,QACA,yDACA,yDACA,yDACA,0BACI,8BACI,oRACA,mQACJ,QACJ,QACJ,QACJ,YACJ,QACJ,UACFC,KAAK,MAGX,QACIE,UAAWnB"} \ No newline at end of file diff --git a/static/maps/mvc/toolshed/repo-status-view.js.map b/static/maps/mvc/toolshed/repo-status-view.js.map new file mode 100644 index 00000000000..f3a6929e275 --- /dev/null +++ b/static/maps/mvc/toolshed/repo-status-view.js.map @@ -0,0 +1 @@ +{"version":3,"file":"repo-status-view.js","sources":["../../../src/mvc/toolshed/repo-status-view.js"],"names":["define","toolshed_model","toolshed_util","ToolShedRepoStatusView","Backbone","View","extend","el","initialize","options","this","_","defaults","model","RepoStatus","listenTo","render","url","repositories","join","fetch","timer","setInterval","self","terminal_states","all_done","some","models","repository","repo_id","get","repo_status","toLowerCase","indexOf","clearInterval","close","repo_status_template","templateRepoStatus","$el","html","title","queue","queueLength","$","css","bindEvents","reDraw","empty","template"],"mappings":"AAAAA,QAAQ,8BAA+B,qBAAsB,SAASC,EAAgBC,GAElF,GAAIC,GAAyBC,SAASC,KAAKC,QAEvCC,GAAI,UAEJC,WAAY,SAASC,GAEjBC,KAAKD,QAAUE,EAAEC,SAASF,KAAKD,cAAiBA,EAASC,KAAKE,UAC9DF,KAAKG,MAAQ,GAAIZ,GAAea,WAChCJ,KAAKK,SAASL,KAAKG,MAAO,OAAQH,KAAKM,QACvCN,KAAKG,MAAMI,KAAO,iBAAmBP,KAAKD,QAAQS,aAAaC,KAAK,KACpET,KAAKG,MAAMO,QACXV,KAAKW,MAAQC,YAAY,SAASC,GAC9B,GAAIC,IAAmB,YAAa,SAChCC,GAAW,CACfd,GAAEe,KAAKH,EAAKV,MAAMc,OAAQ,SAASC,GAG/B,MAFAC,SAAUD,EAAWE,IAAI,MACzBC,YAAcH,EAAWE,IAAI,UAAUE,cACM,KAAzCR,EAAgBS,QAAQF,cACxBN,GAAW,GACJ,GAFX,SAKAA,EACAS,cAAcX,EAAKF,OAGnBE,EAAKV,MAAMO,SAEhB,IAAMV,OAGbyB,MAAO,WACHD,cAAcxB,KAAKW,QAGvBL,OAAQ,SAASP,GACbC,KAAKD,QAAUE,EAAEL,OAAOI,KAAKD,QAASA,EACtC,IAAI2B,GAAuB1B,KAAK2B,kBAChC3B,MAAK4B,IAAIC,KAAKH,GAAsBI,MAAO,oBAAqBtB,aAAcR,KAAKG,MAAMc,OAAQc,MAAOvC,EAAcwC,iBACtHC,EAAE,WAAWC,IAAI,WAAY,QAC7BlC,KAAKmC,cAGTA,WAAY,aAIZC,OAAQ,SAASrC,GACbC,KAAK4B,IAAIS,QACTrC,KAAKF,WAAWC,IAGpB4B,mBAAoB1B,EAAEqC,UAClB,yEACI,6DACA,wJACJ,SACA,0BACI,oBACA,4BACA,qEACA,wBACA,sCACA,mDACA,6CACA,0FACA,sEACA,kEACJ,WACA,uCACI,iCACI,OACI,iEACA,wEACA,kEACA,qEACA,gFACJ,QACJ,WACA,+BACI,oDACI,OACI,OACI,uBACI,uFACI,gCACJ,WACJ,SACJ,QACA,OACI,uBACI,uFACI,uCACJ,WACJ,SACJ,QACA,OACI,uBACI,uFACI,iCACJ,WACJ,SACJ,QACA,OACI,uBACI,4FACI,8CACJ,WACJ,SACJ,QACA,OACI,uBACI,8FACI,qKACI,kCACJ,SACJ,WACJ,SACJ,QACJ,QACJ,YACJ,WACA,yCACJ,YACF7B,KAAK,MAGX,QACIL,WAAYX"} \ No newline at end of file diff --git a/static/maps/mvc/toolshed/repositories-view.js.map b/static/maps/mvc/toolshed/repositories-view.js.map new file mode 100644 index 00000000000..577f9800bdb --- /dev/null +++ b/static/maps/mvc/toolshed/repositories-view.js.map @@ -0,0 +1 @@ +{"version":3,"file":"repositories-view.js","sources":["../../../src/mvc/toolshed/repositories-view.js"],"names":["define","toolshed_model","toolshed_util","ToolShedCategoryContentsView","Backbone","View","extend","el","initialize","params","this","model","CategoryCollection","listenTo","render","shed","tool_shed","replace","url","category_id","category","fetch","options","_","category_contents_template","templateCategoryContents","$el","html","models","queue","queueLength","$","css","bindEvents","that","require","autocomplete","source","request","response","shed_url","base_url","Galaxy","root","term","tool_shed_url","post","data","result_list","shedParser","minLength","select","event","ui","tsr_id","item","value","new_route","history","navigate","trigger","reDraw","empty","template","join","Category"],"mappings":"AAAAA,QAAQ,8BAA+B,qBAAsB,SAASC,EAAgBC,GAElF,GAAIC,GAA+BC,SAASC,KAAKC,QAE7CC,GAAI,UAEJC,WAAY,SAASC,GAEjBC,KAAKC,MAAQ,GAAIV,GAAeW,mBAChCF,KAAKG,SAASH,KAAKC,MAAO,OAAQD,KAAKI,OACvC,IAAIC,GAAON,EAAOO,UAAUC,QAAQ,MAAO,MAC3CP,MAAKC,MAAMO,KAAO,kBAAoBH,EAAO,gBAAkBN,EAAOU,YACtET,KAAKC,MAAMK,UAAYD,EACvBL,KAAKC,MAAMS,SAAWX,EAAOU,YAC7BT,KAAKC,MAAMU,SAGfP,OAAQ,SAASQ,GACbZ,KAAKY,QAAUC,EAAEjB,OAAOI,KAAKY,QAASA,EACtC,IAAIE,GAA6Bd,KAAKe,wBACtCf,MAAKgB,IAAIC,KAAKH,GAA4BJ,SAAUV,KAAKC,MAAMiB,OAAO,GAAIZ,UAAWN,KAAKC,MAAMK,UAAWa,MAAO3B,EAAc4B,iBAChIC,EAAE,WAAWC,IAAI,WAAY,QAC7BtB,KAAKuB,cAGTA,WAAY,WACR,GAAIC,GAAOxB,IACXyB,UAAS,yBAA0B,WAC/BJ,EAAE,eAAeK,cACbC,OAAQ,SAASC,EAASC,GACtB,GAAIC,GAAWN,EAAKvB,MAAMK,UAAUC,QAAQ,OAAQ,KAChDwB,EAAWC,OAAOC,KAAO,uBACzBlC,GAAUmC,KAAMN,EAAQM,KAAMC,cAAeL,EACjDT,GAAEe,KAAKL,EAAUhC,EAAQ,SAASsC,GAC9BC,YAAc9C,EAAc+C,WAAWF,GACvCR,EAASS,gBAGjBE,UAAW,EACXC,OAAQ,SAASC,EAAOC,GACpB,GAAIC,GAASD,EAAGE,KAAKC,MACjBC,EAAY,gBAAkBvB,EAAKvB,MAAMK,UAAY,MAAQsC,CACjElD,UAASsD,QAAQC,SAASF,GAAYG,SAAS,EAAM3C,SAAQ,UAM7E4C,OAAQ,SAASvC,GACbZ,KAAKgB,IAAIoC,QACTpD,KAAKF,WAAWc,IAGpBG,yBAA0BF,EAAEwC,UACxB,0BACI,+CACA,6CACJ,WACA,yEACI,4FACA,wJACJ,SACA,0DACI,+DACI,4BACI,8LACJ,UACJ,SACA,8CACI,uBACI,iCACI,OACI,qCACA,oCACA,oBACA,oCACJ,QACJ,WACA,oEACI,OACI,mCACA,OACI,wEACI,8FACJ,SACJ,QACA,yCACA,kCACJ,QACJ,YACJ,WACJ,SACJ,UACFC,KAAK,MAGX,QACIC,SAAU9D"} \ No newline at end of file diff --git a/static/maps/mvc/toolshed/repository-queue-view.js.map b/static/maps/mvc/toolshed/repository-queue-view.js.map new file mode 100644 index 00000000000..57f2fded2ff --- /dev/null +++ b/static/maps/mvc/toolshed/repository-queue-view.js.map @@ -0,0 +1 @@ +{"version":3,"file":"repository-queue-view.js","sources":["../../../src/mvc/toolshed/repository-queue-view.js"],"names":["define","toolshed_model","toolshed_util","View","Backbone","extend","el","defaults","initialize","that","this","model","RepoQueue","listenTo","render","fetch","repo_queue_template","templateRepoQueue","repositories","models","$el","html","title","queue","queueLength","$","css","bindEvents","on","repository_metadata","loadFromQueue","attr","installFromQueue","queue_key","repo_queue","JSON","parse","localStorage","hasOwnProperty","repository_id","repository","id","remove","stringify","history","navigate","trigger","replace","params","Object","install_tool_dependencies","install_repository_dependencies","install_resolver_dependencies","tool_panel_section","shed_tool_conf","changeset_revision","tool_shed_repository_ids","tool_shed_url","split","changeset","url","Galaxy","root","undefined","queueKey","repository_queue","post","data","iri_params","new_route","join","console","log","reDraw","options","empty","_","template","RepoQueueView"],"mappings":"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"} \ No newline at end of file diff --git a/static/maps/mvc/toolshed/repository-view.js.map b/static/maps/mvc/toolshed/repository-view.js.map new file mode 100644 index 00000000000..7d4adf38ae7 --- /dev/null +++ b/static/maps/mvc/toolshed/repository-view.js.map @@ -0,0 +1 @@ +{"version":3,"file":"repository-view.js","sources":["../../../src/mvc/toolshed/repository-view.js"],"names":["define","toolshed_model","jstree","Utils","Modal","FormView","toolshed_util","ToolShedRepositoryView","Backbone","View","extend","el","initialize","params","this","options","_","defaults","model","RepositoryCollection","listenTo","render","shed","tool_shed","replace","url","repository_id","tool_shed_url","category","fetch","repo_details_template","templateRepoDetails","models","repository","get","queue","queueLength","changesets","Object","keys","metadata","current_changeset","length","current_metadata","tools","repository_dependencies_template","templateRepoDependencies","repository_dependency_template","templateRepoDependency","tps_template_global_select","templateGlobalSectionSelect","tps_template_tool_select","templateToolSectionSelect","tps_select_options","templatePanelSelectOptions","tool_dependencies","shed_tool_conf","templateShedToolConf","stc_html","panel_section_dict","api_url","Galaxy","root","$el","html","checkInstalled","bindEvents","$","css","that","on","find","text","reDraw","tpsSelection","ev","preventDefault","repositories","JSON","stringify","attr","val","tool_shed_repository_ids","install_tool_dependencies","install_repository_dependencies","install_resolver_dependencies","panelSelect","tool_panel_section","changeset","prepareInstall","repository_metadata","each","key","substr","addToQueue","new_value","default_tps","removeAttr","guid","name","desc","tsr_id","data","cls","toolform","deepeach","inputs","input","type","indexOf","info","textify","extensions","modal","modal_title","show","closing_events","title","body","buttons","Close","hide","owner","already_installed","repoQueued","index","installed","deleted","uninstalled","changeset_match","changeset_revision","installed_changeset_revision","prop","tool_panel_section_id","new_tool_panel_section","element_name","tool_guid","action","empty","localStorage","queue_key","parse","queueKey","queued_repos","hasOwnProperty","shed_url","new_tps","post","iri_parameters","doInstall","controller_url","new_route","join","console","log","history","navigate","trigger","template","templateToolDependency","templateGlobalSectionCreate","templateToolSectionCreate","RepoDetails"],"mappings":"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,yEACI,iKACA,wJACJ,SACA,6FACI,sGACI,mFACA,2FACA,yBACI,6CACA,uCACI,gEACI,uEACI,wGACA,0FACJ,YACJ,YACA,wMACA,6IACA,kIACJ,SACJ,SACA,wBACA,4DACI,gIACA,6BACI,oDACI,yEACA,uFACJ,OACA,0FACA,oEACI,2BACI,wEACI,qGACJ,OACJ,SACA,4DACJ,SACJ,SACJ,UACA,2DACI,qDACA,6BACI,kDACI,uEACA,mFACJ,OACA,8CACI,mEACA,2EACJ,OACA,8DACI,2BACI,kEACI,6FACJ,OACJ,SACA,8HACI,UACI,sGACI,4CACA,mBACA,gBACJ,QACJ,WACA,yBACI,4EACI,0EACI,mCACA,8BACA,qCACA,kCACJ,QACJ,YACJ,WACJ,WACJ,SACJ,SACJ,UACA,yEACI,6IACA,6BACI,yDACI,kHACI,UACI,sGACI,4CACA,uBACA,mBACA,gHACR,WACA,6BACQ,wDACI,0GACI,mCACI,wFACI,gPACJ,SACJ,QACA,mCACA,kDACA,0DACI,iHACJ,QACJ,QACJ,YACR,WACJ,WACJ,SACJ,SACJ,UACJ,UACJ,UACFN,KAAK,KAEP1G,yBAA0B9B,EAAE8I,UACxB,2DACA,iFACI,OACI,qDACI,2CACI,+DACI,oFACA,oDACJ,YACJ,UACJ,QACJ,QACJ,UAAUN,KAAK,KAEnBxG,uBAAwBhC,EAAE8I,UACtB,4EACI,6HACA,2CACI,kCACI,+DACI,oFACA,oDACJ,YACJ,QACJ,UACJ,SACFN,KAAK,KAEP/F,qBAAsBzC,EAAE8I,UACpB,iEACA,6BACI,yBACI,kBACA,kJACJ,SACJ,UACFN,KAAK,KAEPO,uBAAwB/I,EAAE8I,UACtB,2CACI,+DACI,qDACI,uEACA,8CACJ,UACJ,YACJ,WACFN,KAAK,KAEPQ,4BAA6BhJ,EAAE8I,UAC3B,gCACI,sCACI,yGACA,+FACA,mDACI,0EACJ,SACJ,SACJ,UACFN,KAAK,KAEPtG,4BAA6BlC,EAAE8I,UAC3B,gCACI,sDACA,6BACI,yCACI,iDACI,sDACJ,YACA,qFACA,mDACI,mFACJ,SACJ,SACJ,SACJ,UACFN,KAAK,KAEPS,0BAA2BjJ,EAAE8I,UACzB,uFACI,+KACA,uLACJ,UACFN,KAAK,KAEPpG,0BAA2BpC,EAAE8I,UACzB,6FACI,kMACI,sDACJ,YACA,8NACA,yDACJ,UACFN,KAAK,KAEPlG,2BAA4BtC,EAAE8I,UAC1B,6CACI,iEACJ,aACFN,KAAK,MAGX,QACIU,YAAa3J"} \ No newline at end of file diff --git a/static/maps/mvc/toolshed/shed-category-view.js.map b/static/maps/mvc/toolshed/shed-category-view.js.map new file mode 100644 index 00000000000..463afa7dd0a --- /dev/null +++ b/static/maps/mvc/toolshed/shed-category-view.js.map @@ -0,0 +1 @@ +{"version":3,"file":"shed-category-view.js","sources":["../../../src/mvc/toolshed/shed-category-view.js"],"names":["define","Backbone","View","extend","el","render","options","this","_","category_list_template","templateCategoryList","$el","html","categories","model","template","join","ToolShedCategoriesView","ToolShedCategories"],"mappings":"AAAAA,QAAQ,gCAAiC,WAERC,SAASC,KAAKC,QAEvCC,GAAI,iBAEJC,OAAQ,SAASC,GACbC,KAAKD,QAAUE,EAAEL,OAAOI,KAAKD,QAASA,EACtC,IAAIG,GAAyBF,KAAKG,sBAClCH,MAAKI,IAAIC,KAAKH,GAAwBI,WAAYN,KAAKO,UAG3DJ,qBAAsBF,EAAEO,UACpB,8CACI,+DACI,4BACI,gJACJ,UACJ,SACA,8CACI,oCACA,uBACI,iCACI,OACI,gBACA,uBACA,wBACJ,QACJ,WACA,gDACI,OACI,OACI,uGACJ,QACA,uCACA,wCACJ,QACJ,YACJ,WACJ,SACJ,UACFC,KAAK,MAGX,QACIC,uBAAwBC"} \ No newline at end of file diff --git a/static/maps/mvc/toolshed/shed-list-view.js.map b/static/maps/mvc/toolshed/shed-list-view.js.map new file mode 100644 index 00000000000..da8cb38d3ea --- /dev/null +++ b/static/maps/mvc/toolshed/shed-list-view.js.map @@ -0,0 +1 @@ +{"version":3,"file":"shed-list-view.js","sources":["../../../src/mvc/toolshed/shed-list-view.js"],"names":["define","toolshed_model","toolshed_util","View","Backbone","extend","defaults","tool_sheds","url","name","initialize","this","options","_","model","ShedsCollection","listenTo","render","fetch","el","toolshed_list_template","templateToolshedList","$el","html","title","models","queue","queueLength","reDraw","empty","template","join","ShedListView"],"mappings":"AAAAA,QAAQ,8BAA+B,qBAAsB,SAASC,EAAgBC,GAElF,GAAIC,GAAOC,SAASD,KAAKE,QAErBC,UACIC,aAAcC,IAAO,kCAAmCC,KAAQ,2BAGpEC,WAAY,WAERC,KAAKC,QAAUC,EAAEP,SAASK,KAAKC,YAAeD,KAAKL,UACnDK,KAAKG,MAAQ,GAAIb,GAAec,gBAChCJ,KAAKK,SAASL,KAAKG,MAAO,OAAQH,KAAKM,QACvCN,KAAKG,MAAMI,SAGfC,GAAI,UAEJF,OAAQ,SAASL,GACbD,KAAKC,QAAUC,EAAEP,SAASK,KAAKC,YAAeA,EAASD,KAAKL,SAC5D,IAAIc,GAAyBT,KAAKU,oBAClCV,MAAKW,IAAIC,KAAKH,GAAwBI,MAAO,+BAAgCjB,WAAYI,KAAKG,MAAMW,OAAQC,MAAOxB,EAAcyB,kBAGrIC,OAAQ,SAAShB,GACbD,KAAKW,IAAIO,QACTlB,KAAKM,OAAOL,IAGhBS,qBAAsBR,EAAEiB,UACpB,yEACI,6DACA,wJACJ,SACA,uDACI,yBACI,uBACI,4CACI,4BACI,OACI,wEACI,8GACJ,SACJ,QACJ,QACJ,YACJ,WACJ,SACA,kCACJ,UACFC,KAAK,MAIX,QACIC,aAAc7B"} \ No newline at end of file diff --git a/static/maps/mvc/toolshed/shed-repo-details-view.js.map b/static/maps/mvc/toolshed/shed-repo-details-view.js.map new file mode 100644 index 00000000000..e45fadbccd3 --- /dev/null +++ b/static/maps/mvc/toolshed/shed-repo-details-view.js.map @@ -0,0 +1 @@ +{"version":3,"file":"shed-repo-details-view.js","sources":["../../../src/mvc/toolshed/shed-repo-details-view.js"],"names":["define","ToolShedRepositoryView","Backbone","View","extend","el","render","options","this","_","repository_details_template","templateRepoDetails","$el","html","repositories","model","template","join","templateRepoDependencies","templateRepoDependency","templateShedToolConf","templateToolDependency","templateGlobalSectionCreate","templateGlobalSectionselect","templateToolSectionCreate","templatePanelSelectOptions","RepoDetails"],"mappings":"AAAAA,QAAQ,qCAAsC,WAE1C,GAAIC,GAAyBC,SAASC,KAAKC,QAEvCC,GAAI,iBAEJC,OAAQ,SAASC,GACbC,KAAKD,QAAUE,EAAEL,OAAOI,KAAKD,QAASA,EACtC,IAAIG,GAA8BF,KAAKG,qBACvCH,MAAKI,IAAIC,KAAKH,GAA6BI,aAAcN,KAAKO,UAGlEJ,oBAAqBF,EAAEO,UACnB,wIACI,yJACA,wFACI,oGACA,+FACA,yBACI,6CACA,uCACI,gEACI,uEACI,wGACA,4HACJ,YACJ,YACA,wMACA,6IACA,kIACJ,SACJ,SACA,wBACA,gJACA,6BACI,4DACI,oDACI,yEACA,uFACJ,OACA,0FACA,oEACI,2BACI,wEACI,qGACJ,OACJ,SACA,4DACJ,SACJ,UACA,2DACI,kDACI,uEACA,mFACJ,OACA,8CACI,mEACA,2EACJ,OACA,8DACI,2BACI,kEACI,6FACJ,OACJ,SACA,8HACI,UACI,sGACI,4CACA,mBACA,gBACJ,QACJ,WACA,yBACI,4EACI,0EACI,mCACA,8BACA,qCACA,kCACJ,QACJ,YACJ,WACJ,WACJ,SACJ,UACA,yEACI,yDACI,2BACI,sDACI,kHACJ,OACJ,SACA,kHACI,UACI,sGACI,4CACA,uBACA,mBACA,wEACR,WACA,6BACQ,0DACI,0GACI,mCACI,wFACI,gPACJ,SACJ,QACA,mCACA,kDACA,0DACI,yEACJ,QACJ,QACJ,YACR,WACJ,WACJ,SACJ,UACJ,SACJ,UACJ,UACFC,KAAK,KAEPC,yBAA0BT,EAAEO,UACxB,0EACI,wGACA,4BACI,2CACI,+DACI,oFACA,oDACJ,YACJ,UACJ,QACJ,UAAUC,KAAK,KAEnBE,uBAAwBV,EAAEO,UACtB,wGACI,6HACJ,QACA,2CACI,+DACI,oFACA,sCACI,oDACJ,QACJ,YACJ,WACFC,KAAK,KAEPG,qBAAsBX,EAAEO,UACpB,iEACA,6BACA,yBACI,kBACA,kJACJ,UACFC,KAAK,KAEPI,uBAAwBZ,EAAEO,UACtB,2CACI,+DACI,qDACI,uEACA,8CACJ,UACJ,YACJ,WACFC,KAAK,KAEPK,4BAA6Bb,EAAEO,UAC3B,gCACI,sDACA,6BACI,sCACI,yGACA,+FACA,mDACI,0EACJ,SACJ,SACJ,SACJ,UACFC,KAAK,KAEPM,4BAA6Bd,EAAEO,UAC3B,gCACI,sDACA,6BACI,yCACI,iDACI,sDACJ,YACA,qFACA,mDACI,mFACJ,SACJ,SACJ,SACJ,UACFC,KAAK,KAEPO,0BAA2Bf,EAAEO,UACzB,uFACI,+KACA,uLACJ,UACFC,KAAK,KAEPO,0BAA2Bf,EAAEO,UACzB,6FACI,kMACI,sDACJ,YACA,8NACA,yDACJ,UACFC,KAAK,KAEPQ,2BAA4BhB,EAAEO,UAC1B,6CACI,iEACJ,aACFC,KAAK,MAGX,QACIS,YAAazB"} \ No newline at end of file diff --git a/static/maps/mvc/toolshed/shed-repo-list-view.js.map b/static/maps/mvc/toolshed/shed-repo-list-view.js.map new file mode 100644 index 00000000000..80262a57319 --- /dev/null +++ b/static/maps/mvc/toolshed/shed-repo-list-view.js.map @@ -0,0 +1 @@ +{"version":3,"file":"shed-repo-list-view.js","sources":["../../../src/mvc/toolshed/shed-repo-list-view.js"],"names":["define","Backbone","View","extend","el","render","options","this","_","repository_list_template","templateRepoList","$el","html","repositories","model","template","join","ToolShedRepositoriesView","ToolShedRepositories"],"mappings":"AAAAA,QAAQ,kCAAmC,WAEVC,SAASC,KAAKC,QAEvCC,GAAI,iBAEJC,OAAQ,SAASC,GACbC,KAAKD,QAAUE,EAAEL,OAAOI,KAAKD,QAASA,EACtC,IAAIG,GAA2BF,KAAKG,kBACpCH,MAAKI,IAAIC,KAAKH,GAA0BI,aAAcN,KAAKO,UAG/DJ,iBAAkBF,EAAEO,UAChB,gDACI,+DACI,4BACI,8IACJ,UACJ,SACA,8CACI,uCACA,uBACI,iCACI,OACI,qCACA,oCACA,oBACA,oCACA,wCACJ,QACJ,WACA,oDACI,OACI,mCACA,OACI,wGACJ,QACA,yCACA,kCACA,iEACJ,QACJ,YACJ,WACJ,SACJ,UACFC,KAAK,MAGX,QACIC,yBAA0BC"} \ No newline at end of file diff --git a/static/maps/mvc/toolshed/sheds-list-view.js.map b/static/maps/mvc/toolshed/sheds-list-view.js.map new file mode 100644 index 00000000000..db37b675637 --- /dev/null +++ b/static/maps/mvc/toolshed/sheds-list-view.js.map @@ -0,0 +1 @@ +{"version":3,"file":"sheds-list-view.js","sources":["../../../src/mvc/toolshed/sheds-list-view.js"],"names":["define","toolshed_model","View","Backbone","extend","defaults","tool_sheds","url","name","initialize","this","model","Sheds","listenTo","render","fetch","el","options","_","toolshed_list_template","templateToolshedList","$el","html","template","join"],"mappings":"AAAAA,QAAQ,+BAAgC,SAASC,GAE7C,GAAIC,GAAOC,SAASD,KAAKE,QAErBC,UACIC,aAAcC,IAAO,kCAAmCC,KAAQ,2BAGpEC,WAAY,WAERC,KAAKC,MAAQ,GAAIV,GAAeW,MAChCF,KAAKG,SAASH,KAAKC,MAAO,OAAQD,KAAKI,QACvCJ,KAAKC,MAAMI,SAGfC,GAAI,kBAEJF,OAAQ,SAASG,GACbP,KAAKO,QAAUC,EAAEb,SAASK,KAAKO,YAAeA,EAASP,KAAKL,SAC5D,IAAIc,GAAyBT,KAAKU,oBAClCV,MAAKW,IAAIC,KAAKH,EAAuBT,KAAKC,SAG9CS,qBAAsBF,EAAEK,UACpB,6CACI,gEACA,6BACI,yBACI,uBACI,wCACI,4BACI,OACI,wEACI,gHACJ,SACJ,QACJ,QACJ,YACJ,WACJ,SACA,kCACJ,SACJ,UACFC,KAAK,MAIX,QACItB,KAAMA"} \ No newline at end of file diff --git a/static/maps/mvc/toolshed/toolshed-model.js.map b/static/maps/mvc/toolshed/toolshed-model.js.map new file mode 100644 index 00000000000..45a38638412 --- /dev/null +++ b/static/maps/mvc/toolshed/toolshed-model.js.map @@ -0,0 +1 @@ +{"version":3,"file":"toolshed-model.js","sources":["../../../src/mvc/toolshed/toolshed-model.js"],"names":["define","ToolShedModel","Backbone","Model","extend","defaults","url","name","urlRoot","Galaxy","root","ToolShedsCollection","Collection","model","ToolShedCategoriesModel","ToolShedCategoriesCollection","ToolShedCategoryModel","ToolShedCategoryCollection","ToolShedRepositoryModel","ToolShedRepositoryCollection","RepoQueueModel","RepoQueueCollection","fetch","collection","this","repositories","Array","repositories_enc","JSON","parse","localStorage","queue_keys","Object","keys","_","each","key","repo","queue_key","push","reset","prototype","call","RepoStatusModel","RepoStatusCollection","WorkflowToolsModel","WorkflowToolsCollection","ShedModel","ShedsCollection","Category","Categories","CategoryModel","CategoryCollection","RepositoryModel","RepositoryCollection","RepoQueue","RepoStatus","WorkflowTools"],"mappings":"AAAAA,UAAW,WAEP,GAAIC,GAAgBC,SAASC,MAAMC,QAC/BC,UAAWC,IAAO,kCAAmCC,KAAQ,yBAC7DC,QAASC,OAAOC,KAAO,kBAGvBC,EAAsBT,SAASU,WAAWR,QAC1CE,IAAKG,OAAOC,KAAO,gBACnBG,MAAOZ,IAGPa,EAA0BZ,SAASC,MAAMC,QACzCC,cACAG,QAASC,OAAOC,KAAO,2BAGvBK,EAA+Bb,SAASU,WAAWR,QACnDE,IAAKG,OAAOC,KAAO,yBACnBG,MAAOC,IAGPE,EAAwBd,SAASC,MAAMC,QACvCC,cACAG,QAASC,OAAOC,KAAO,2BAGvBO,EAA6Bf,SAASU,WAAWR,QACjDE,IAAKG,OAAOC,KAAO,yBACnBG,MAAOG,IAGPE,EAA0BhB,SAASC,MAAMC,QACzCC,cACAG,QAASC,OAAOC,KAAO,6BAGvBS,EAA+BjB,SAASU,WAAWR,QACnDE,IAAKG,OAAOC,KAAO,2BACnBG,MAAOK,IAGPE,EAAiBlB,SAASC,MAAMC,QAChCE,IAAK,MAGLe,EAAsBnB,SAASU,WAAWR,QAC1CE,IAAK,IACLO,MAAOO,EACPE,MAAO,WACH,GAAIC,GAAaC,KACbC,EAAeC,QACfC,EAAmBC,KAAKC,MAAMC,aAAaL,cAC3CM,EAAaC,OAAOC,KAAKN,EAO7B,OANAO,GAAEC,KAAKJ,EAAY,SAASK,GACxB,GAAIC,GAAOV,EAAiBS,EAC5BC,GAAKC,UAAYF,EACjBX,EAAac,KAAKF,KAEtBd,EAAWiB,MAAMf,GACVvB,SAASU,WAAW6B,UAAUnB,MAAMoB,KAAKlB,SAIpDmB,EAAkBzC,SAASC,MAAMC,QACjCC,cACAG,QAASC,OAAOC,KAAO,yBAGvBkC,EAAuB1C,SAASU,WAAWR,QAC3CE,IAAKG,OAAOC,KAAO,uBACnBG,MAAO8B,IAGPE,EAAqB3C,SAASC,MAAMC,QACpCC,cACAG,QAASC,OAAOC,KAAO,qCAGvBoC,EAA0B5C,SAASU,WAAWR,QAC9CE,IAAKG,OAAOC,KAAO,mCACnBG,MAAOgC,GAGX,QACIE,UAAW9C,EACX+C,gBAAiBrC,EACjBsC,SAAUnC,EACVoC,WAAYnC,EACZoC,cAAenC,EACfoC,mBAAoBnC,EACpBoC,gBAAiBnC,EACjBoC,qBAAsBnC,EACtBoC,UAAWlC,EACXmC,WAAYZ,EACZa,cAAeX"} \ No newline at end of file diff --git a/static/maps/mvc/toolshed/util.js.map b/static/maps/mvc/toolshed/util.js.map new file mode 100644 index 00000000000..cee7d3ae237 --- /dev/null +++ b/static/maps/mvc/toolshed/util.js.map @@ -0,0 +1 @@ +{"version":3,"file":"util.js","sources":["../../../src/mvc/toolshed/util.js"],"names":["define","searchShed","request","response","that","this","shed_url","base_url","Galaxy","root","$","get","term","tool_shed_url","data","result_list","shedParser","jsondata","results","hits","each","hit","record","label","repository","name","repo_owner_username","description","result","value","id","push","addToQueue","metadata","substr","length","key","repository_id","changeset_revision","queued_repos","Object","localStorage","repositories","JSON","parse","stringify","queueLength","hasOwnProperty","repo_queue","queue_length","keys"],"mappings":"AAAAA,UAAW,WACP,GAAIC,GAAa,SAASC,EAASC,GAC/B,GAAIC,GAAOC,KACPC,EAAWD,KAAKC,SAChBC,EAAWC,OAAOC,KAAO,sBAC7BC,GAAEC,IAAIJ,GAAWK,KAAMV,EAAQU,KAAMC,cAAeP,GAAW,SAASQ,GACpEC,YAAcX,EAAKY,WAAWF,GAC9BX,EAASY,gBAKbC,EAAa,SAASC,GACtB,GAAIC,MACAC,EAAOF,EAASE,IAOpB,OANAT,GAAEU,KAAKD,EAAM,SAASE,GAClB,GAAIC,GAASH,EAAKE,GACdE,EAAQD,EAAOE,WAAWC,KAAO,OAASH,EAAOE,WAAWE,oBAAsB,KAAOJ,EAAOE,WAAWG,WAC/GC,SAAUC,MAAOP,EAAOE,WAAWM,GAAIP,MAAOA,GAC9CL,EAAQa,KAAKH,UAEVV,GAGPc,EAAa,SAASC,GACmB,KAArCA,EAASpB,cAAcqB,OAAO,MAC9BD,EAASpB,cAAgBoB,EAASpB,cAAcqB,OAAO,EAAGD,EAASpB,cAAcsB,OAAS,GAE9F,IAAIC,GAAMH,EAASpB,cAAgB,IAAMoB,EAASI,cAAgB,IAAMJ,EAASK,mBAC7EC,EAAe,GAAIC,OACnBC,cAAaC,eACbH,EAAeI,KAAKC,MAAMH,aAAaC,eAE3CH,EAAaH,GAAOH,EACpBQ,aAAaC,aAAeC,KAAKE,UAAUN,IAG3CO,EAAc,WACd,MAAIL,cAAaM,eAAe,iBAC5BC,WAAaL,KAAKC,MAAMH,aAAaC,cACrCO,aAAeT,OAAOU,KAAKF,YAAYb,OAChCc,cAGA,EAIf,QAAQhD,WAAYA,EAAYe,WAAYA,EAAYgB,WAAYA,EAAYc,YAAaA"} \ No newline at end of file diff --git a/static/maps/mvc/toolshed/workflows-view.js.map b/static/maps/mvc/toolshed/workflows-view.js.map new file mode 100644 index 00000000000..82719ad13fc --- /dev/null +++ b/static/maps/mvc/toolshed/workflows-view.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workflows-view.js","sources":["../../../src/mvc/toolshed/workflows-view.js"],"names":["define","toolshed_model","toolshed_util","View","Backbone","extend","el","defaults","initialize","that","this","model","WorkflowTools","listenTo","render","fetch","workflows_missing_tools","templateWorkflows","workflows","models","$el","html","title","queue","queueLength","$","css","bindEvents","on","tool_ids","attr","toolshed","api_url","Galaxy","root","params","get","data","repository_id","repository","id","new_route","replace","history","navigate","trigger","elem","tool_shed_url","changesets","Object","keys","metadata","current_changeset","current_metadata","addToQueue","remove","loadWorkflows","reDraw","options","empty","_","template","join","Workflows"],"mappings":"AAAAA,QAAQ,8BAA+B,qBAAsB,SAASC,EAAgBC,GAElF,GAAIC,GAAOC,SAASD,KAAKE,QAErBC,GAAI,UAEJC,cAEAC,WAAY,WACR,GAAIC,GAAOC,IACXA,MAAKC,MAAQ,GAAIV,GAAeW,cAChCF,KAAKG,SAASH,KAAKC,MAAO,OAAQD,KAAKI,QACvCJ,KAAKC,MAAMI,QACXN,EAAKK,UAGTA,OAAQ,WACJ,GAAIL,GAAOC,KACPM,EAA0BP,EAAKQ,kBAC/BC,EAAYT,EAAKE,MAAMQ,MAC3BV,GAAKW,IAAIC,KAAKL,GAAyBM,MAAO,0BAA2BJ,UAAWA,EAAWK,MAAOrB,EAAcsB,iBACpHC,EAAE,WAAWC,IAAI,WAAY,QAC7BjB,EAAKkB,cAGTA,WAAY,WACR,GAAIlB,GAAOC,IACXe,GAAE,iBAAiBG,GAAG,QAAS,WAC3B,GAAIC,GAAWJ,EAAEf,MAAMoB,KAAK,gBACxBC,EAAWN,EAAEf,MAAMoB,KAAK,aACxBE,EAAUC,OAAOC,KAAO,2BACxBC,GAAUN,SAAYA,EAC1BJ,GAAEW,IAAIJ,EAASG,EAAQ,SAASE,GAC5BC,cAAgBD,EAAKE,WAAWC,EAChC,IAAIC,GAAY,gBAAkBV,EAASW,QAAQ,KAAM,OAAOA,QAAQ,MAAO,OAAS,MAAQL,EAAKE,WAAWC,EAChHpC,UAASuC,QAAQC,SAASH,GAAYI,SAAS,EAAMH,SAAQ,QAGrEjB,EAAE,kBAAkBG,GAAG,QAAS,WAC5B,GAAIkB,GAAOrB,EAAEf,MACTmB,EAAWiB,EAAKhB,KAAK,gBACrBC,EAAWe,EAAKhB,KAAK,aACrBE,EAAUC,OAAOC,KAAO,2BACxBC,GAAUN,SAAYA,EAC1BJ,GAAEW,IAAIJ,EAASG,EAAQ,SAASE,GAC5BC,cAAgBD,EAAKE,WAAWC,GAChCL,GAAUY,cAAehB,EAAUO,cAAeA,eAClDb,EAAEW,IAAIJ,EAASG,EAAQ,SAASE,GAC5B,GAAIW,GAAaC,OAAOC,KAAKb,EAAKE,WAAWY,UACzCC,EAAoBJ,EAAW,GAC/BK,EAAmBhB,EAAKE,WAAWY,SAASC,EAChDC,GAAiBN,cAAgBhB,EACjC7B,EAAcoD,WAAWD,GACzBP,EAAKS,eAIjB9B,EAAE,kBAAkBG,GAAG,QAASnB,EAAK+C,gBAGzCC,OAAQ,SAASC,GACbhD,KAAKU,IAAIuC,QACTjD,KAAKF,WAAWkD,IAGpBzC,kBAAmB2C,EAAEC,UACjB,yEACI,6DACA,wJACJ,SACA,0BACI,2HACJ,WACA,4GACI,iCACI,OACI,wCACA,uCACA,mCACA,mCACA,oCACA,sCACJ,QACJ,WACA,UACI,+CACI,OACI,0BACI,8BACI,2DACI,8CACJ,YACJ,QACJ,QACA,0BACI,8BACI,uDACI,8CACJ,YACJ,QACJ,QACA,0DACA,gEACA,2DACA,0BACI,8BACI,8BACI,kRACR,QACJ,QACJ,QACJ,YACJ,QACJ,UACEC,KAAK,MAGf,QACIC,UAAW5D"} \ No newline at end of file diff --git a/static/scripts/admin.toolshed.js b/static/scripts/admin.toolshed.js new file mode 100644 index 00000000000..5f4ff41eddc --- /dev/null +++ b/static/scripts/admin.toolshed.js @@ -0,0 +1,2 @@ +define(["mvc/toolshed/shed-list-view","mvc/toolshed/categories-view","mvc/toolshed/repositories-view","mvc/toolshed/repository-view","mvc/toolshed/repository-queue-view","mvc/toolshed/repo-status-view","mvc/toolshed/workflows-view"],function(a,b,c,d,e,f,g){var h=Backbone.Router.extend({initialize:function(){this.routesHit=0,Backbone.history.on("route",function(){this.routesHit++},this),this.bind("route",this.trackPageview)},routes:{"":"toolsheds",sheds:"toolsheds",queue:"queue",workflows:"workflows","status/r/:repositories":"status",status:"status","categories/s/:tool_shed":"categories","category/s/:tool_shed/c/:cateory_id":"repositories","repository/s/:tool_shed/r/:repository_id":"repository"},back:function(){this.routesHit>1?window.history.back():this.navigate("#",{trigger:!0,replace:!0})}}),i=Backbone.View.extend({app_config:{known_views:["toolsheds","queue","status","categories","repositories","repoository"]},initialize:function(){Galaxy.admintoolshedapp=this,this.admin_toolshed_router=new h,this.admin_toolshed_router.on("route:queue",function(){Galaxy.admintoolshedapp.adminRepoQueueView?Galaxy.admintoolshedapp.adminRepoQueueView.reDraw():Galaxy.admintoolshedapp.adminRepoQueueView=new e.RepoQueueView}),this.admin_toolshed_router.on("route:toolsheds",function(){Galaxy.admintoolshedapp.adminShedListView?Galaxy.admintoolshedapp.adminShedListView.reDraw():Galaxy.admintoolshedapp.adminShedListView=new a.ShedListView}),this.admin_toolshed_router.on("route:categories",function(a){Galaxy.admintoolshedapp.adminShedCategoriesView?Galaxy.admintoolshedapp.adminShedCategoriesView.reDraw({tool_shed:a.replace(/\//g,"%2f")}):Galaxy.admintoolshedapp.adminShedCategoriesView=new b.CategoryView({tool_shed:a.replace(/\//g,"%2f")})}),this.admin_toolshed_router.on("route:repositories",function(a,b){Galaxy.admintoolshedapp.adminShedCategoryView?Galaxy.admintoolshedapp.adminShedCategoryView.reDraw({tool_shed:a.replace(/\//g,"%2f"),category_id:b}):Galaxy.admintoolshedapp.adminShedCategoryView=new c.Category({tool_shed:a.replace(/\//g,"%2f"),category_id:b})}),this.admin_toolshed_router.on("route:repository",function(a,b){Galaxy.admintoolshedapp.adminRepositoryView?Galaxy.admintoolshedapp.adminRepositoryView.reDraw({tool_shed:a.replace(/\//g,"%2f"),repository_id:b}):Galaxy.admintoolshedapp.adminRepositoryView=new d.RepoDetails({tool_shed:a.replace(/\//g,"%2f"),repository_id:b})}),this.admin_toolshed_router.on("route:status",function(a){Galaxy.admintoolshedapp.adminRepoStatusView?Galaxy.admintoolshedapp.adminRepoStatusView.reDraw({repositories:a.split("|")}):Galaxy.admintoolshedapp.adminRepoStatusView=new f.RepoStatus({repositories:a.split("|")})}),this.admin_toolshed_router.on("route:workflows",function(){Galaxy.admintoolshedapp.adminWorkflowsView?Galaxy.admintoolshedapp.adminWorkflowsView.reDraw():Galaxy.admintoolshedapp.adminWorkflowsView=new g.Workflows}),Backbone.history.start({pushState:!1})}});return{GalaxyApp:i}}); +//# sourceMappingURL=../maps/admin.toolshed.js.map \ No newline at end of file diff --git a/static/scripts/mvc/toolshed/categories-view.js b/static/scripts/mvc/toolshed/categories-view.js new file mode 100644 index 00000000000..51e235576c5 --- /dev/null +++ b/static/scripts/mvc/toolshed/categories-view.js @@ -0,0 +1,2 @@ +define(["mvc/toolshed/toolshed-model","mvc/toolshed/util"],function(a,b){var c=Backbone.View.extend({el:"#center",defaults:{tool_shed:"https://toolshed.g2.bx.psu.edu/"},initialize:function(b){var c=b.tool_shed.replace(/\//g,"%2f");this.options=_.defaults(this.options||b,this.defaults),this.model=new a.Categories,this.listenTo(this.model,"sync",this.render),this.model.url=this.model.url+"?tool_shed_url="+this.options.tool_shed,this.model.tool_shed=c,this.model.fetch()},render:function(a){this.options=_.extend(this.options,a),this.options.categories=this.model.models,this.options.queue=b.queueLength();var c=this.templateCategoryList;this.$el.html(c(this.options)),$("#center").css("overflow","auto"),this.bindEvents()},bindEvents:function(){var a=this;require(["libs/jquery/jquery-ui"],function(){$("#search_box").autocomplete({source:function(c,d){var e=a.model.tool_shed.replace(/%2f/g,"/"),f=Galaxy.root+"api/tool_shed/search",g={term:c.term,tool_shed_url:e};$.post(f,g,function(a){console.log(a),result_list=b.shedParser(a),d(result_list)})},minLength:3,select:function(b,c){var d=c.item.value,e=(Galaxy.root+"api/tool_shed/repository",{tool_shed_url:a.model.tool_shed,tsr_id:d},"repository/s/"+a.model.tool_shed+"/r/"+d);Backbone.history.navigate(e,{trigger:!0,replace:!0})}})})},reDraw:function(a){this.$el.empty(),this.model.url=this.model.url+"?tool_shed_url="+this.options.tool_shed,this.initialize(a)},templateCategoryList:_.template(['",'
    ','
    Categories in <%= tool_shed.replace(/%2f/g, "/") %>
    ','
    Repository Queue (<%= queue %>)
    ',"
    ",'
    ','",'
    ','
    WorkflowsTool IDsShedNameOwnerActions
    ', + '
      ', + '<% _.each(workflow.get("workflows"), function(name) { %>', + '
    • <%= name %>
    • ', + '<% }); %>', + '
    ', + '
    ', + '
      ', + '<% _.each(workflow.get("tools"), function(tool) { %>', + '
    • <%= tool %>
    • ', + '<% }); %>', + '
    ', + '
    <%= workflow.get("shed") %><%= workflow.get("repository") %><%= workflow.get("owner") %>', + '
      ', + '
    • ', + '" data-owner="<%= workflow.get("owner") %>" data-repo="<%= workflow.get("repository") %>" data-toolids="<%= workflow.get("tools").join(",") %>" value="Show Repository" />
    • ', + '
    ', + '
    ','',"","","","","","","<% _.each(categories, function(category) { %>","","",'','',"","<% }); %>","
    NameDescriptionRepositories
    ",'"><%= category.get("name") %>',"<%= category.get("description") %><%= category.get("repositories") %>
    ","",""].join(""))});return{CategoryView:c}}); +//# sourceMappingURL=../../../maps/mvc/toolshed/categories-view.js.map \ No newline at end of file diff --git a/static/scripts/mvc/toolshed/repo-queue-view.js b/static/scripts/mvc/toolshed/repo-queue-view.js new file mode 100644 index 00000000000..34d8c60a71d --- /dev/null +++ b/static/scripts/mvc/toolshed/repo-queue-view.js @@ -0,0 +1,2 @@ +define(["toolshed/repository-queue-model"],function(){var a=Backbone.View.extend({el:"#category_list",render:function(a){this.options=_.extend(this.options,a);var b=this.templateRepoQueue();this.$el.html(b({repository:this.model}))},templateRepoQueueTab:_.template(['"].join("")),templateRepoQueue:_.template(['
    ','','',"",'','','','','','',"","","","<% _.each(repositories, function(repository) { %>",'','",'",'','','','',"","<% }); %>","","
    ToolShedNameOwnerRevision
    ','',"','',"<%= repository.tool_shed_url %><%= repository.name %><%= repository.owner %><%= repository.changeset %>
    ",'',"
    "].join("")),workflows_missing_tools:_.template(['','',"",'','','','','','',"","","","<% _.each(Object.keys(workflows), function(workflow_key) { %>",'<% var workflow_details = workflow_key.split("/"); %>',"<% var workflow = workflows[workflow_key]; %>","",'",'",'','','','","","<% }); %>","",""].join(""))});return{RepoQueue:a}}); +//# sourceMappingURL=../../../maps/mvc/toolshed/repo-queue-view.js.map \ No newline at end of file diff --git a/static/scripts/mvc/toolshed/repo-status-view.js b/static/scripts/mvc/toolshed/repo-status-view.js new file mode 100644 index 00000000000..84f99de3d90 --- /dev/null +++ b/static/scripts/mvc/toolshed/repo-status-view.js @@ -0,0 +1,2 @@ +define(["mvc/toolshed/toolshed-model","mvc/toolshed/util"],function(a,b){var c=Backbone.View.extend({el:"#center",initialize:function(b){this.options=_.defaults(this.options||[{}],b,this.defaults),this.model=new a.RepoStatus,this.listenTo(this.model,"sync",this.render),this.model.url+="?repositories="+this.options.repositories.join("|"),this.model.fetch(),this.timer=setInterval(function(a){var b=["installed","error"],c=!0;_.some(a.model.models,function(a){return repo_id=a.get("id"),repo_status=a.get("status").toLowerCase(),-1===b.indexOf(repo_status)?(c=!1,!0):void 0}),c?clearInterval(a.timer):a.model.fetch()},2e3,this)},close:function(){clearInterval(this.timer)},render:function(a){this.options=_.extend(this.options,a);var c=this.templateRepoStatus;this.$el.html(c({title:"Repository Status",repositories:this.model.models,queue:b.queueLength()})),$("#center").css("overflow","auto"),this.bindEvents()},bindEvents:function(){},reDraw:function(a){this.$el.empty(),this.initialize(a)},templateRepoStatus:_.template(['
    ','
    <%= title %>
    ','
    Repository Queue (<%= queue %>)
    ',"
    ",'",'
    WorkflowsTool IDsShedNameOwnerActions
    ','
      ',"<% _.each(workflow.workflows.sort(), function(wf) { %>",'
    • <%= wf %>
    • ',"<% }); %>","
    ","
    ','
      ',"<% _.each(workflow.tools.sort(), function(tool) { %>",'
    • <%= tool %>
    • ',"<% }); %>","
    ","
    <%= workflow_details[0] %><%= workflow_details[2] %><%= workflow_details[1] %>','
      ','
    • " value="Preview" />
    • ','
    • " value="Add to queue" />
    • ',"
    ","
    ','',"",'','','','','',"","",'',"<% _.each(repositories, function(repository) { %>","","","","","","","","<% }); %>","",'',"
    NameDescriptionOwnerRevisionInstallation Status
    ",'
    ','","
    ","
    ",'
    ','","
    ","
    ",'
    ','","
    ","
    ",'
    ','","
    ","
    ",'
    ','","
    ","
    "].join(""))});return{RepoStatus:c}}); +//# sourceMappingURL=../../../maps/mvc/toolshed/repo-status-view.js.map \ No newline at end of file diff --git a/static/scripts/mvc/toolshed/repositories-view.js b/static/scripts/mvc/toolshed/repositories-view.js new file mode 100644 index 00000000000..1cffda041be --- /dev/null +++ b/static/scripts/mvc/toolshed/repositories-view.js @@ -0,0 +1,2 @@ +define(["mvc/toolshed/toolshed-model","mvc/toolshed/util"],function(a,b){var c=Backbone.View.extend({el:"#center",initialize:function(b){this.model=new a.CategoryCollection,this.listenTo(this.model,"sync",this.render);var c=b.tool_shed.replace(/\//g,"%2f");this.model.url+="?tool_shed_url="+c+"&category_id="+b.category_id,this.model.tool_shed=c,this.model.category=b.category_id,this.model.fetch()},render:function(a){this.options=_.extend(this.options,a);var c=this.templateCategoryContents;this.$el.html(c({category:this.model.models[0],tool_shed:this.model.tool_shed,queue:b.queueLength()})),$("#center").css("overflow","auto"),this.bindEvents()},bindEvents:function(){var a=this;require(["libs/jquery/jquery-ui"],function(){$("#search_box").autocomplete({source:function(c,d){var e=a.model.tool_shed.replace(/%2f/g,"/"),f=Galaxy.root+"api/tool_shed/search",g={term:c.term,tool_shed_url:e};$.post(f,g,function(a){result_list=b.shedParser(a),d(result_list)})},minLength:3,select:function(b,c){var d=c.item.value,e="repository/s/"+a.model.tool_shed+"/r/"+d;Backbone.history.navigate(e,{trigger:!0,replace:!0})}})})},reDraw:function(a){this.$el.empty(),this.initialize(a)},templateCategoryContents:_.template(['",'
    ','
    Repositories in <%= category.get("name") %>
    ','
    Repository Queue (<%= queue %>)
    ',"
    ",'
    ','",'
    ','','',"",'','',"",'',"","",'<% _.each(category.get("repositories"), function(repository) { %>',"","","","","","","<% }); %>","
    OwnerNameSynopsisType
    <%= repository.owner %>",'","<%= repository.description %><%= repository.type %>
    ","
    ","
    "].join(""))});return{Category:c}}); +//# sourceMappingURL=../../../maps/mvc/toolshed/repositories-view.js.map \ No newline at end of file diff --git a/static/scripts/mvc/toolshed/repository-queue-view.js b/static/scripts/mvc/toolshed/repository-queue-view.js new file mode 100644 index 00000000000..466de6bae86 --- /dev/null +++ b/static/scripts/mvc/toolshed/repository-queue-view.js @@ -0,0 +1,2 @@ +define(["mvc/toolshed/toolshed-model","mvc/toolshed/util"],function(a,b){var c=Backbone.View.extend({el:"#center",defaults:[{}],initialize:function(){var b=this;this.model=new a.RepoQueue,this.listenTo(this.model,"sync",this.render),this.model.fetch(),b.render()},render:function(){var a=this,c=a.templateRepoQueue,d=a.model.models;a.$el.html(c({title:"Repository Installation Queue",repositories:d,queue:b.queueLength()})),$("#center").css("overflow","auto"),a.bindEvents()},bindEvents:function(){var a=this;$(".install_one").on("click",function(){var b=a.loadFromQueue($(this).attr("data-repokey"));a.installFromQueue(b,$(this).attr("data-repokey"))}),$(".remove_one").on("click",function(){var a=$(this).attr("data-repokey"),b=JSON.parse(localStorage.repositories);if(b.hasOwnProperty(a)){var c=b[a].repository.id;delete b[a],$("#queued_repository_"+c).remove()}localStorage.repositories=JSON.stringify(b)}),$("#clear_queue").on("click",function(){localStorage.repositories="{}"}),$("#from_workflow").on("click",function(){Backbone.history.navigate("workflows",{trigger:!0,replace:!0})})},installFromQueue:function(a,c){var d=Object();d.install_tool_dependencies=a.install_tool_dependencies,d.install_repository_dependencies=a.install_repository_dependencies,d.install_resolver_dependencies=a.install_resolver_dependencies,d.tool_panel_section=a.tool_panel_section,d.shed_tool_conf=a.shed_tool_conf,d.repositories=JSON.stringify([[a.repository.id,a.changeset_revision]]),d.tool_shed_repository_ids=JSON.stringify([a.repository.id]),d.tool_shed_url=c.split("|")[0],d.changeset=a.changeset_revision;var e=Galaxy.root+"api/tool_shed_repositories/install?async=True";$("#queued_repository_"+a.repository.id).remove(),localStorage.repositories&&(void 0===c&&(c=b.queueKey(a)),repository_queue=JSON.parse(localStorage.repositories),repository_queue.hasOwnProperty(c)&&(delete repository_queue[c],localStorage.repositories=JSON.stringify(repository_queue))),$.post(e,d,function(a){var b=JSON.parse(a),c=b.repositories,d="status/r/"+c.join("|");$.post(Galaxy.root+"admin_toolshed/manage_repositories",b,function(){console.log("Initializing repository installation succeeded")}),Backbone.history.navigate(d,{trigger:!0,replace:!0})})},loadFromQueue:function(a){return repository_queue=JSON.parse(localStorage.repositories),repository_queue.hasOwnProperty(a)?repository_queue[a]:void 0},reDraw:function(a){this.$el.empty(),this.initialize(a),this.model.fetch(),this.render(a)},templateRepoQueue:_.template(['
    ','
    <%= title %>
    ','
    Repository Queue (<%= queue %>)
    ',"
    ",'
    ','','',"",'','','','','','',"","","","<% _.each(repositories, function(repository) { %>",'">','','','','','",'","","<% }); %>","","
    NameOwnerRevisionToolShedInstall
    <%= repository.get("repository").name %><%= repository.get("repository").owner %><%= repository.get("changeset_revision") %><%= repository.get("tool_shed_url") %>','" type="submit" id="install_repository_<%= repository.get("id") %>" name="install_repository" value="Install now" />',"','" type="submit" id="unqueue_repository_<%= repository.get("id") %>" name="unqueue_repository" value="Remove from queue" />',"
    ",'',"
    "].join(""))});return{RepoQueueView:c}}); +//# sourceMappingURL=../../../maps/mvc/toolshed/repository-queue-view.js.map \ No newline at end of file diff --git a/static/scripts/mvc/toolshed/repository-view.js b/static/scripts/mvc/toolshed/repository-view.js new file mode 100644 index 00000000000..49550e01c5b --- /dev/null +++ b/static/scripts/mvc/toolshed/repository-view.js @@ -0,0 +1,2 @@ +define(["mvc/toolshed/toolshed-model","libs/jquery/jstree","utils/utils","mvc/ui/ui-modal","mvc/form/form-view","mvc/toolshed/util"],function(a,b,c,d,e,f){var g=Backbone.View.extend({el:"#center",initialize:function(b){this.options=_.defaults(this.options||{},this.defaults),this.model=new a.RepositoryCollection,this.listenTo(this.model,"sync",this.render),shed=b.tool_shed.replace(/\//g,"%2f"),this.model.url+="?tool_shed_url="+shed+"&repository_id="+b.repository_id,this.model.tool_shed_url=b.tool_shed.replace(/%2f/g,"/"),this.model.tool_shed=shed,this.model.category=b.repository_id,this.model.fetch()},render:function(a){var b=this.templateRepoDetails,c=this.model.models[0];this.options={repository:c.get("repository"),tool_shed:this.model.tool_shed,queue:f.queueLength()};var d=Object.keys(this.options.repository.metadata);this.options.current_changeset=this.options.current_changeset||d[d.length-1],this.options.current_metadata=this.options.repository.metadata[this.options.current_changeset],this.options.current_metadata.tool_shed_url=this.model.tool_shed_url,this.options.tools=this.options.current_metadata.tools,this.options.repository_dependencies_template=this.templateRepoDependencies,this.options.repository_dependency_template=this.templateRepoDependency,this.options.tps_template_global_select=this.templateGlobalSectionSelect,this.options.tps_template_tool_select=this.templateToolSectionSelect,this.options.tps_select_options=this.templatePanelSelectOptions,this.options.tool_dependencies=c.get("tool_dependencies"),this.options.shed_tool_conf=this.templateShedToolConf({stc_html:c.get("shed_conf")}),this.options.panel_section_dict=c.get("panel_section_dict"),this.options.api_url=Galaxy.root+"api/tool_shed_repositories/install?async=True",this.options=_.extend(this.options,a),this.$el.html(b(this.options)),this.checkInstalled(this.options.current_metadata),this.bindEvents(),$("#center").css("overflow","auto")},bindEvents:function(){var a=this;$("#changeset").on("change",function(){a.options.current_changeset=$("#changeset").find("option:selected").text(),a.options.current_metadata=a.options.repository.metadata[a.options.current_changeset],a.checkInstalled(a.options.current_metadata),a.reDraw()}),$("#tool_panel_section_select").on("change",function(){a.tpsSelection()}),$("#install_repository").on("click",function(b){$("#repository_installation");b.preventDefault();var c={};c.repositories=JSON.stringify([[$("#install_repository").attr("data-tsrid"),$("#changeset").find("option:selected").val()]]),c.tool_shed_repository_ids=JSON.stringify([$("#install_repository").attr("data-tsrid")]),c.tool_shed_url=a.model.tool_shed_url,c.install_tool_dependencies=$("#install_tool_dependencies").val(),c.install_repository_dependencies=$("#install_repository_dependencies").val(),c.install_resolver_dependencies=$("#install_resolver_dependencies").val();a.panelSelect(c);c.tool_panel_section=JSON.stringify(a.panelSelect(c)),c.shed_tool_conf=$("select[name='shed_tool_conf']").find("option:selected").val(),c.changeset=$("#changeset").find("option:selected").val(),url=$("#repository_installation").attr("action"),a.prepareInstall(c,url)}),$("#queue_install").on("click",function(){a.options.current_changeset=$("#changeset").find("option:selected").text(),a.options.current_metadata=a.options.repository.metadata[a.options.current_changeset];var b=(a.options.current_changeset,{});_.each(Object.keys(a.options.current_metadata),function(c){b[c]||(b[c]=a.options.current_metadata[c])}),b.install_tool_dependencies=$("#install_tool_dependencies").val(),b.install_repository_dependencies=$("#install_repository_dependencies").val(),b.install_resolver_dependencies=$("#install_resolver_dependencies").val(),b.tool_panel_section=JSON.stringify(a.panelSelect({})),b.shed_tool_conf=$("select[name='shed_tool_conf']").find("option:selected").val(),b.tool_shed_url=a.model.tool_shed_url,"/"==b.tool_shed_url.substr(-1)&&(b.tool_shed_url=b.tool_shed_url.substr(0,b.tool_shed_url.length-1)),f.addToQueue(b),a.checkInstalled(b)}),$(".tool_panel_section_picker").on("change",function(){new_value=$(this).find("option:selected").val(),default_tps=$("#tool_panel_section_select").find("option:selected").val(),new_value==default_tps?$(this).attr("default","active"):$(this).removeAttr("default")}),$(function(){$("#repository_dependencies").jstree()}),$(".tool_form").on("click",function(){var b=$(this).attr("data-guid"),f=($(this).attr("data-clean"),$(this).attr("data-name")),g=$(this).attr("data-desc"),h=a.model.tool_shed_url,i=$("#repository_details").attr("data-tsrid"),j=$("#changeset").find("option:selected").val(),k=Galaxy.root+"api/tool_shed/tool_json",l={guid:b,tool_shed_url:h,tsr_id:i,changeset:j};$.get(k,l,function(a){a.cls="ui-portlet-plain";var b=new e(a);c.deepeach(a.inputs,function(a){a.type&&-1!=["data","data_collection"].indexOf(a.type)&&(a.type="hidden",a.info="Data input '"+a.name+"' ("+c.textify(a.extensions)+")")});var h=new d.View,i=""+f+" "+g;h.show({closing_events:!0,title:i,body:b.$el,buttons:{Close:function(){h.hide()}}})})})},checkInstalled:function(a){{var b=this,c={name:a.name,owner:a.owner},d=!1;b.repoQueued(a)}$.get(Galaxy.root+"api/tool_shed_repositories",c,function(c){for(var e=0;e','
    Repository information for <%= repository.name %> from <%= repository.owner %>
    ','
    Repository Queue (<%= queue %>)
    ',"",'
    ','
    ','','','
    ','
    Changeset
    ','
    ','",'','','
    Please select a revision and review the settings below before installing.
    ',"
    ","
    ","<%= shed_tool_conf %>","<% if (current_metadata.has_repository_dependencies) { %>",'
    Repository dependencies for <%= current_changeset %>
    ','
    ','

    ','','',"

    ","<% current_metadata.repository_dependency_template = repository_dependency_template; %>",'
    ','","<%= repository_dependencies_template(current_metadata) %>","
    ","
    ","<% } %>","<% if (current_metadata.includes_tool_dependencies) { %>",'
    Tool dependencies
    ','
    ','

    ','','',"

    ",'

    ','','',"

    ",'
    ','",'',"",'','',"","","","",'',"<% _.each(tool_dependencies[current_changeset], function(dependency) { %>",'','","","","","<% }); %>","","
    NameVersionType
    ',"<%= dependency.name %><%= dependency.version %><%= dependency.type %>
    ","
    ","
    ","<% } %>","<% if (current_metadata.includes_tools_for_display_in_tool_panel) { %>",'
    Tools – click the name to preview the tool and use the pop-up menu to inspect all metadata
    ','
    ','
    ','',"",'','',"","","","",'',"<% _.each(current_metadata.tools, function(tool) { %>",'','","",'','","","<% }); %>","","
    NameDescriptionVersion<%= tps_template_global_select({tps: panel_section_dict, tps_select_options: tps_select_options}) %>
    ','","<%= tool.description %><%= tool.version %>',"<%= tps_template_tool_select({tool: tool, tps: panel_section_dict, tps_select_options: tps_select_options}) %>","
    ","
    ","
    ","<% } %>","
    ","
    "].join("")),templateRepoDependencies:_.template(['
    Repository Dependencies
    ','
    ',"","
    "].join("")),templateRepoDependency:_.template(['
  • ',"Repository <%= repository.name %> revision <%= changeset_revision %> owned by <%= repository.owner %>","<% if (has_repository_dependencies) { %>",'","<% } %>","
  • "].join("")),templateShedToolConf:_.template(['
    Shed tool configuration file:
    ','
    ','
    ',"<%= stc_html %>",'
    Select the file whose tool_path setting you want used for installing repositories.
    ',"
    ","
    "].join("")),templateToolDependency:_.template(["<% if (has_repository_dependencies) { %>","<% _.each(repository_dependencies, function(dependency) { %>","<% if (dependency.includes_tool_dependencies) { %>","<% dependency.tool_dependency_template = tool_dependency_template %>","<%= tool_dependency_template(dependency) %>","<% } %>","<% }); %>","<% } %>"].join("")),templateGlobalSectionCreate:_.template(['
    ','
    ','','','
    ',"Add a new tool panel section to contain the installed tools (optional).","
    ","
    ","
    "].join("")),templateGlobalSectionSelect:_.template(['
    ','
    Tool Panel Section
    ','
    ','
    ','",'','
    ',"Select an existing tool panel section to contain the installed tools (optional).","
    ","
    ","
    ","
    "].join("")),templateToolSectionCreate:_.template(['
    ','','',"
    "].join("")),templateToolSectionSelect:_.template(['
    ','",'','
    ',"
    "].join("")),templatePanelSelectOptions:_.template(["<% _.each(sections, function(section) { %>",'',"<% }); %>"].join(""))});return{RepoDetails:g}}); +//# sourceMappingURL=../../../maps/mvc/toolshed/repository-view.js.map \ No newline at end of file diff --git a/static/scripts/mvc/toolshed/shed-category-view.js b/static/scripts/mvc/toolshed/shed-category-view.js new file mode 100644 index 00000000000..2c1e6b9ca44 --- /dev/null +++ b/static/scripts/mvc/toolshed/shed-category-view.js @@ -0,0 +1,23 @@ +define([ "mvc/toolshed/toolshed-model" ], function(toolshed_model) { + var ToolShedCategories = Backbone.View.extend({ + el: "#center", + initialize: function(shed) { + console.log(arguments); + this.model = new toolshed_model.Categories(), this.listenTo(this.model, "sync", this.render), + this.model.url += "?tool_shed_url=" + shed, this.model.tool_shed = shed.replace(/\//g, "%2f"), + this.model.fetch(); + }, + render: function(options) { + console.log("render cat"), this.options = _.extend(this.options, options); + var category_list_template = this.templateCategoryList; + console.log(this.model), this.$el.html(category_list_template({ + categories: this.model.models, + tool_shed: this.model.tool_shed + })), $("#center").css("overflow", "auto"); + }, + templateCategoryList: _.template([ "<% console.log(arguments); %>", '
    ', '", '
    ', "

    Repositories by Category

    ", '', '', "", "", "", "", "", "", "<% _.each(categories, function(category) { %>", "", "", '', '', "", "<% }); %>", "
    NameDescriptionRepositories
    ", '"><%= category.get("name") %>', "<%= category.get("description") %><%= category.get("repositories") %>
    ", "
    ", "
    " ].join("")) + }); + return { + CategoryView: ToolShedCategories + }; +}); \ No newline at end of file diff --git a/static/scripts/mvc/toolshed/shed-list-view.js b/static/scripts/mvc/toolshed/shed-list-view.js new file mode 100644 index 00000000000..ff61669b3fc --- /dev/null +++ b/static/scripts/mvc/toolshed/shed-list-view.js @@ -0,0 +1,2 @@ +define(["mvc/toolshed/toolshed-model","mvc/toolshed/util"],function(a,b){var c=Backbone.View.extend({defaults:{tool_sheds:[{url:"https://toolshed.g2.bx.psu.edu/",name:"Galaxy Main Tool Shed"}]},initialize:function(){this.options=_.defaults(this.options||{},this.defaults),this.model=new a.ShedsCollection,this.listenTo(this.model,"sync",this.render),this.model.fetch()},el:"#center",render:function(a){this.options=_.defaults(this.options||{},a,this.defaults);var c=this.templateToolshedList;this.$el.html(c({title:"Configured Galaxy Tool Sheds",tool_sheds:this.model.models,queue:b.queueLength()}))},reDraw:function(a){this.$el.empty(),this.render(a)},templateToolshedList:_.template(['
    ','
    <%= title %>
    ','',"
    ",'
    ','
    ','',"<% _.each(tool_sheds, function(shed) { %>",'',"","","<% }); %>","
    ",'","
    ","
    ",'
    ',"
    "].join(""))});return{ShedListView:c}}); +//# sourceMappingURL=../../../maps/mvc/toolshed/shed-list-view.js.map \ No newline at end of file diff --git a/static/scripts/mvc/toolshed/shed-repo-details-view.js b/static/scripts/mvc/toolshed/shed-repo-details-view.js new file mode 100644 index 00000000000..a6cfdce385e --- /dev/null +++ b/static/scripts/mvc/toolshed/shed-repo-details-view.js @@ -0,0 +1,32 @@ +define([ "toolshed/repository-details-model" ], function() { + var ToolShedRepositoryView = Backbone.View.extend({ + el: "#center", + initialize: function(shed, repository) { + console.log(arguments); + this.model = new toolshed_model.RepositoryCollection(), this.listenTo(this.model, "sync", this.render), + shed = shed.replace(/\//g, "%2f"), this.model.url += "?tool_shed_url=" + shed + "&repository_id=" + repository, + this.model.tool_shed = shed, this.model.category = repository, this.model.fetch(); + }, + render: function(options) { + console.log("render cat"), this.options = _.extend(this.options, options); + var repo_details_template = this.templateRepoDetails; + console.log(this.model.models), this.$el.html(repo_details_template({ + category: this.model.models[0], + tool_shed: this.model.tool_shed + })), $("#center").css("overflow", "auto"); + }, + templateRepoDetails: _.template([ '
    ', '

    Repository information for <%= repository.name %> from <%= repository.owner %>

    ', '
    ', '', '', '
    ', '
    Changeset
    ', '
    ', '", '', '', '
    Please select a revision and review the settings below before installing.
    ', "
    ", "
    ", "<%= shed_tool_conf %>", '
    Dependencies of this repository at revision <%= current_changeset %>
    ', '
    ', "<% if (current_metadata.has_repository_dependencies) { %>", '

    ', '', '', "

    ", "<% current_metadata.repository_dependency_template = repository_dependency_template; %>", '
    ', '", "<%= repository_dependencies_template(current_metadata) %>", "
    ", "<% } %>", "<% if (current_metadata.includes_tool_dependencies) { %>", '

    ', '', '', "

    ", '

    ', '', '', "

    ", '
    ', '", '', "", '', '', "", "", "", "", '', "<% _.each(tool_dependencies[current_changeset], function(dependency) { %>", '', '", "", "", "", "<% }); %>", "", "
    NameVersionType
    ', "<%= dependency.name %><%= dependency.version %><%= dependency.type %>
    ", "
    ", "<% } %>", "<% if (current_metadata.includes_tools_for_display_in_tool_panel) { %>", '
    ', '", '', "", '', '', "", "", "", "", '', "<% _.each(tools[current_changeset], function(tool) { %>", '', '", "", '', '", "", "<% }); %>", "", "
    NameDescriptionVersion<%= tps_template_global_select({tps: panel_section_dict}) %>
    ', '", "<%= tool.description %><%= tool.version %>', "<%= tps_template_tool_select({tool: tool, tps: panel_section_dict}) %>", "
    ", "
    ", "<% } %>", "
    ", "
    ", "
    " ].join("")), + templateRepoDependencies: _.template([ '
    ', '

    Repository installation requires the following:

    ', '", "
    " ].join("")), + templateRepoDependency: _.template([ '
  • ', "Repository <%= repository.name %> revision <%= changeset_revision %> owned by <%= repository.owner %>", "
  • ", "<% if (has_repository_dependencies) { %>", "<% _.each(repository_dependencies, function(dependency) { %>", "<% dependency.repository_dependency_template = repository_dependency_template; %>", '
  • ', "<%= repository_dependency_template(dependency) %>", "
  • ", "<% }); %>", "<% } %>" ].join("")), + templateShedToolConf: _.template([ '
    Shed tool configuration file:
    ', '
    ', '
    ', "<%= stc_html %>", '
    Select the file whose tool_path setting you want used for installing repositories.
    ', "
    " ].join("")), + templateToolDependency: _.template([ "<% if (has_repository_dependencies) { %>", "<% _.each(repository_dependencies, function(dependency) { %>", "<% if (dependency.includes_tool_dependencies) { %>", "<% dependency.tool_dependency_template = tool_dependency_template %>", "<%= tool_dependency_template(dependency) %>", "<% } %>", "<% }); %>", "<% } %>" ].join("")), + templateGlobalSectionCreate: _.template([ '
    ', '
    Tool Panel Section
    ', '
    ', '
    ', '', '', '
    ', "Add a new tool panel section to contain the installed tools (optional).", "
    ", "
    ", "
    ", "
    " ].join("")), + templateGlobalSectionselect: _.template([ '
    ', '
    Tool Panel Section
    ', '
    ', '
    ', '", '', '
    ', "Select an existing tool panel section to contain the installed tools (optional).", "
    ", "
    ", "
    ", "
    " ].join("")), + templateToolSectionCreate: _.template([ '
    ', '', '', "
    " ].join("")), + templateToolSectionCreate: _.template([ '
    ', '", '', '
    ', "
    " ].join("")), + templatePanelSelectOptions: _.template([ "<% _.each(sections, function(section) { %>", '', "<% }); %>" ].join("")) + }); + return { + RepoDetails: ToolShedRepositoryView + }; +}); \ No newline at end of file diff --git a/static/scripts/mvc/toolshed/shed-repo-list-view.js b/static/scripts/mvc/toolshed/shed-repo-list-view.js new file mode 100644 index 00000000000..545463ff575 --- /dev/null +++ b/static/scripts/mvc/toolshed/shed-repo-list-view.js @@ -0,0 +1,23 @@ +define([ "mvc/toolshed/toolshed-model" ], function(toolshed_model) { + var ToolShedCategoryContentsView = Backbone.View.extend({ + el: "#center", + initialize: function(shed, category) { + console.log(arguments); + this.model = new toolshed_model.CategoryCollection(), this.listenTo(this.model, "sync", this.render), + this.model.url += "?tool_shed_url=" + shed + "&category_id=" + category, this.model.tool_shed = shed, + this.model.category = category, this.model.fetch(); + }, + render: function(options) { + console.log("render cat"), this.options = _.extend(this.options, options); + var category_contents_template = this.templateCategoryContents; + console.log(this.model.models), this.$el.html(category_contents_template({ + category: this.model.models[0], + tool_shed: this.model.tool_shed + })), $("#center").css("overflow", "auto"); + }, + templateCategoryContents: _.template([ '
    ', '", '
    ', '

    Repositories in <%= category.get("name") %>

    ', '', '', "", '', '', "", '', "", "", '<% _.each(category.get("repositories"), function(repository) { %>', "", "", "", "", "", "", "<% }); %>", "
    OwnerNameSynopsisType
    <%= repository.owner %>", '<%= repository.name %>', "<%= repository.description %><%= repository.type %>
    ", "
    ", "
    " ].join("")) + }); + return { + Category: ToolShedCategoryContentsView + }; +}); \ No newline at end of file diff --git a/static/scripts/mvc/toolshed/sheds-list-view.js b/static/scripts/mvc/toolshed/sheds-list-view.js new file mode 100644 index 00000000000..6bbc9fb1a4d --- /dev/null +++ b/static/scripts/mvc/toolshed/sheds-list-view.js @@ -0,0 +1,27 @@ +define([ "mvc/toolshed/toolshed-model" ], function(toolshed_model) { + var View = Backbone.View.extend({ + defaults: { + tool_sheds: [ { + url: "https://toolshed.g2.bx.psu.edu/", + name: "Galaxy Main Tool Shed" + } ] + }, + initialize: function() { + console.log("init"); + this.model = new toolshed_model.ShedsCollection(), this.listenTo(this.model, "sync", this.render), + this.model.fetch(); + }, + el: "#center", + render: function(options) { + this.options = _.defaults(this.options || {}, options, this.defaults); + var toolshed_list_template = this.templateToolshedList; + this.$el.html(toolshed_list_template({ + tool_sheds: this.model.models + })); + }, + templateToolshedList: _.template([ '
    ', '
    Accessible Galaxy tool sheds
    ', '
    ', '
    ', '', "<% _.each(tool_sheds, function(shed) { %>", '', "", "", "<% }); %>", "
    ", '", "
    ", "
    ", '
    ', "
    ", "
    " ].join("")) + }); + return { + ShedListView: View + }; +}); \ No newline at end of file diff --git a/static/scripts/mvc/toolshed/toolshed-model.js b/static/scripts/mvc/toolshed/toolshed-model.js new file mode 100644 index 00000000000..2c46d4d6b85 --- /dev/null +++ b/static/scripts/mvc/toolshed/toolshed-model.js @@ -0,0 +1,2 @@ +define([],function(){var a=Backbone.Model.extend({defaults:{url:"https://toolshed.g2.bx.psu.edu/",name:"Galaxy Main Tool Shed"},urlRoot:Galaxy.root+"api/tool_shed"}),b=Backbone.Collection.extend({url:Galaxy.root+"api/tool_shed",model:a}),c=Backbone.Model.extend({defaults:[{}],urlRoot:Galaxy.root+"api/tool_shed/contents"}),d=Backbone.Collection.extend({url:Galaxy.root+"api/tool_shed/contents",model:c}),e=Backbone.Model.extend({defaults:[{}],urlRoot:Galaxy.root+"api/tool_shed/category"}),f=Backbone.Collection.extend({url:Galaxy.root+"api/tool_shed/category",model:e}),g=Backbone.Model.extend({defaults:[{}],urlRoot:Galaxy.root+"api/tool_shed/repository"}),h=Backbone.Collection.extend({url:Galaxy.root+"api/tool_shed/repository",model:g}),i=Backbone.Model.extend({url:"#"}),j=Backbone.Collection.extend({url:"#",model:i,fetch:function(){var a=this,b=Array(),c=JSON.parse(localStorage.repositories),d=Object.keys(c);return _.each(d,function(a){var d=c[a];d.queue_key=a,b.push(d)}),a.reset(b),Backbone.Collection.prototype.fetch.call(this)}}),k=Backbone.Model.extend({defaults:[{}],urlRoot:Galaxy.root+"api/tool_shed/status"}),l=Backbone.Collection.extend({url:Galaxy.root+"api/tool_shed/status",model:k}),m=Backbone.Model.extend({defaults:[{}],urlRoot:Galaxy.root+"api/workflows?missing_tools=True"}),n=Backbone.Collection.extend({url:Galaxy.root+"api/workflows?missing_tools=True",model:m});return{ShedModel:a,ShedsCollection:b,Category:c,Categories:d,CategoryModel:e,CategoryCollection:f,RepositoryModel:g,RepositoryCollection:h,RepoQueue:j,RepoStatus:l,WorkflowTools:n}}); +//# sourceMappingURL=../../../maps/mvc/toolshed/toolshed-model.js.map \ No newline at end of file diff --git a/static/scripts/mvc/toolshed/util.js b/static/scripts/mvc/toolshed/util.js new file mode 100644 index 00000000000..14252c8765c --- /dev/null +++ b/static/scripts/mvc/toolshed/util.js @@ -0,0 +1,2 @@ +define([],function(){var a=function(a,b){var c=this,d=this.shed_url,e=Galaxy.root+"api/tool_shed/search";$.get(e,{term:a.term,tool_shed_url:d},function(a){result_list=c.shedParser(a),b(result_list)})},b=function(a){var b=[],c=a.hits;return $.each(c,function(a){var d=c[a],e=d.repository.name+" by "+d.repository.repo_owner_username+": "+d.repository.description;result={value:d.repository.id,label:e},b.push(result)}),b},c=function(a){"/"==a.tool_shed_url.substr(-1)&&(a.tool_shed_url=a.tool_shed_url.substr(0,a.tool_shed_url.length-1));var b=a.tool_shed_url+"|"+a.repository_id+"|"+a.changeset_revision,c=new Object;localStorage.repositories&&(c=JSON.parse(localStorage.repositories)),c[b]=a,localStorage.repositories=JSON.stringify(c)},d=function(){return localStorage.hasOwnProperty("repositories")?(repo_queue=JSON.parse(localStorage.repositories),queue_length=Object.keys(repo_queue).length,queue_length):0};return{searchShed:a,shedParser:b,addToQueue:c,queueLength:d}}); +//# sourceMappingURL=../../../maps/mvc/toolshed/util.js.map \ No newline at end of file diff --git a/static/scripts/mvc/toolshed/workflows-view.js b/static/scripts/mvc/toolshed/workflows-view.js new file mode 100644 index 00000000000..b7a14b157bf --- /dev/null +++ b/static/scripts/mvc/toolshed/workflows-view.js @@ -0,0 +1,2 @@ +define(["mvc/toolshed/toolshed-model","mvc/toolshed/util"],function(a,b){var c=Backbone.View.extend({el:"#center",defaults:[{}],initialize:function(){var b=this;this.model=new a.WorkflowTools,this.listenTo(this.model,"sync",this.render),this.model.fetch(),b.render()},render:function(){var a=this,c=a.templateWorkflows,d=a.model.models;a.$el.html(c({title:"Workflows Missing Tools",workflows:d,queue:b.queueLength()})),$("#center").css("overflow","auto"),a.bindEvents()},bindEvents:function(){var a=this;$(".show_wf_repo").on("click",function(){var a=$(this).attr("data-toolids"),b=$(this).attr("data-shed"),c=Galaxy.root+"api/tool_shed/repository",d={tool_ids:a};$.get(c,d,function(a){repository_id=a.repository.id;var c="repository/s/"+b.replace(/:/g,"%3a").replace(/\//g,"%2f")+"/r/"+a.repository.id;Backbone.history.navigate(c,{trigger:!0,replace:!0})})}),$(".queue_wf_repo").on("click",function(){var a=$(this),c=a.attr("data-toolids"),d=a.attr("data-shed"),e=Galaxy.root+"api/tool_shed/repository",f={tool_ids:c};$.get(e,f,function(c){repository_id=c.repository.id,f={tool_shed_url:d,repository_id:repository_id},$.get(e,f,function(c){var e=Object.keys(c.repository.metadata),f=e[0],g=c.repository.metadata[f];g.tool_shed_url=d,b.addToQueue(g),a.remove()})})}),$("#from_workflow").on("click",a.loadWorkflows)},reDraw:function(a){this.$el.empty(),this.initialize(a)},templateWorkflows:_.template(['
    ','
    <%= title %>
    ','',"
    ",'",'','',"",'','','','','','',"","","","<% _.each(workflows, function(workflow) { %>","",'",'",'','','','","","<% }); %>","",""].join(""))});return{Workflows:c}}); +//# sourceMappingURL=../../../maps/mvc/toolshed/workflows-view.js.map \ No newline at end of file diff --git a/templates/admin/tool_shed_repository/browse_toolsheds.mako b/templates/admin/tool_shed_repository/browse_toolsheds.mako deleted file mode 100644 index 036c1a9d71a..00000000000 --- a/templates/admin/tool_shed_repository/browse_toolsheds.mako +++ /dev/null @@ -1,918 +0,0 @@ -<%inherit file="/base.mako"/> -<%namespace file="/message.mako" import="render_msg" /> -<%namespace file="/admin/tool_shed_repository/common.mako" import="*" /> -<%namespace file="/admin/tool_shed_repository/repository_actions_menu.mako" import="*" /> - -<%def name="stylesheets()"> - ${parent.stylesheets()} - ${h.css( "dynatree_skin/ui.dynatree" )} - - -<%def name="javascripts()"> - ${parent.javascripts()} - - -
    WorkflowsTool IDsShedNameOwnerActions
    ','
      ','<% _.each(workflow.get("workflows"), function(name) { %>','
    • <%= name %>
    • ',"<% }); %>","
    ","
    ','
      ','<% _.each(workflow.get("tools"), function(tool) { %>','
    • <%= tool %>
    • ',"<% }); %>","
    ","
    <%= workflow.get("shed") %><%= workflow.get("repository") %><%= workflow.get("owner") %>','
      ','
    • ','" data-owner="<%= workflow.get("owner") %>" data-repo="<%= workflow.get("repository") %>" data-toolids="<%= workflow.get("tools").join(",") %>" value="Show Repository" />
    • ',"
    ","