From ab4db8925cc895e90972de8b22f1919d25423a12 Mon Sep 17 00:00:00 2001 From: Evgeny Anatskiy Date: Fri, 10 Nov 2017 23:47:36 +0100 Subject: [PATCH 1/5] rewrite Admin/DataTables with Vue --- client/galaxy/scripts/apps/admin.js | 16 ++- .../galaxy/scripts/apps/panels/admin-panel.js | 3 +- .../scripts/components/admin/base-grid.vue | 43 +++++++ .../components/admin/data-manager-grid.vue | 47 +++++++ .../components/admin/data-tables-grid.vue | 53 ++++++++ .../scripts/components/admin/data-tables.vue | 117 ++++++++++++++++++ client/galaxy/scripts/components/message.vue | 20 +++ lib/galaxy/webapps/galaxy/buildapp.py | 1 + .../webapps/galaxy/controllers/admin.py | 33 +++-- .../galaxy/controllers/data_manager.py | 54 ++++++++ 10 files changed, 375 insertions(+), 12 deletions(-) create mode 100644 client/galaxy/scripts/components/admin/base-grid.vue create mode 100644 client/galaxy/scripts/components/admin/data-manager-grid.vue create mode 100644 client/galaxy/scripts/components/admin/data-tables-grid.vue create mode 100644 client/galaxy/scripts/components/admin/data-tables.vue create mode 100644 client/galaxy/scripts/components/message.vue diff --git a/client/galaxy/scripts/apps/admin.js b/client/galaxy/scripts/apps/admin.js index 6d6f745e0f4..f78da9609eb 100644 --- a/client/galaxy/scripts/apps/admin.js +++ b/client/galaxy/scripts/apps/admin.js @@ -12,6 +12,7 @@ import Utils from "utils/utils"; import Page from "layout/page"; import Vue from "libs/vue"; import UserAPIKeys from "components/UserAPIKeys.vue"; +import DataTables from "components/admin/data-tables.vue"; window.app = function app(options, bootstrapped) { window.Galaxy = new GalaxyApp.GalaxyApp(options, bootstrapped); @@ -28,7 +29,8 @@ window.app = function app(options, bootstrapped) { "(/)admin(/)repositories": "show_repositories", "(/)admin(/)forms": "show_forms", "(/)admin(/)form(/)(:form_id)": "show_form", - "(/)admin/api_keys": "show_user_api_keys" + "(/)admin/api_keys": "show_user_api_keys", + "(/)admin/data_tables": "show_data_tables" }, authenticate: function(args, name) { @@ -96,9 +98,15 @@ window.app = function app(options, bootstrapped) { }, show_user_api_keys: function() { - var vuemount = document.createElement("div"); - this.page.display(vuemount); - new Vue(UserAPIKeys).$mount(vuemount); + var vueMount = document.createElement('div'); + this.page.display(vueMount); + new Vue(UserAPIKeys).$mount(vueMount); + }, + + show_data_tables: function() { + var vueMount = document.createElement('div'); + this.page.display(vueMount); + new Vue(DataTables).$mount(vueMount); }, show_forms: function() { diff --git a/client/galaxy/scripts/apps/panels/admin-panel.js b/client/galaxy/scripts/apps/panels/admin-panel.js index 86ee64fd9ea..de90612c750 100644 --- a/client/galaxy/scripts/apps/panels/admin-panel.js +++ b/client/galaxy/scripts/apps/panels/admin-panel.js @@ -22,7 +22,8 @@ var AdminPanel = Backbone.View.extend({ }, { title: _l("Data tables"), - url: "admin/view_tool_data_tables" + url: "admin/data_tables", + target: "__use_router__" }, { title: _l("Display applications"), diff --git a/client/galaxy/scripts/components/admin/base-grid.vue b/client/galaxy/scripts/components/admin/base-grid.vue new file mode 100644 index 00000000000..d0dc0bc69c2 --- /dev/null +++ b/client/galaxy/scripts/components/admin/base-grid.vue @@ -0,0 +1,43 @@ + + + diff --git a/client/galaxy/scripts/components/admin/data-manager-grid.vue b/client/galaxy/scripts/components/admin/data-manager-grid.vue new file mode 100644 index 00000000000..50ce7e74c4c --- /dev/null +++ b/client/galaxy/scripts/components/admin/data-manager-grid.vue @@ -0,0 +1,47 @@ + + + diff --git a/client/galaxy/scripts/components/admin/data-tables-grid.vue b/client/galaxy/scripts/components/admin/data-tables-grid.vue new file mode 100644 index 00000000000..f567627631a --- /dev/null +++ b/client/galaxy/scripts/components/admin/data-tables-grid.vue @@ -0,0 +1,53 @@ + + + diff --git a/client/galaxy/scripts/components/admin/data-tables.vue b/client/galaxy/scripts/components/admin/data-tables.vue new file mode 100644 index 00000000000..6be6f1e396f --- /dev/null +++ b/client/galaxy/scripts/components/admin/data-tables.vue @@ -0,0 +1,117 @@ + + + diff --git a/client/galaxy/scripts/components/message.vue b/client/galaxy/scripts/components/message.vue new file mode 100644 index 00000000000..dced6c62e5c --- /dev/null +++ b/client/galaxy/scripts/components/message.vue @@ -0,0 +1,20 @@ + + + + diff --git a/lib/galaxy/webapps/galaxy/buildapp.py b/lib/galaxy/webapps/galaxy/buildapp.py index 04f56c0fd5f..8210e277d91 100644 --- a/lib/galaxy/webapps/galaxy/buildapp.py +++ b/lib/galaxy/webapps/galaxy/buildapp.py @@ -93,6 +93,7 @@ def app_factory(global_conf, load_app_kwds={}, **kwargs): # The following routes don't bootstrap any information, simply provide the # base analysis interface at which point the application takes over. + webapp.add_client_route('/admin/data_tables', 'admin') webapp.add_client_route('/admin/users', 'admin') webapp.add_client_route('/admin/roles', 'admin') webapp.add_client_route('/admin/forms', 'admin') diff --git a/lib/galaxy/webapps/galaxy/controllers/admin.py b/lib/galaxy/webapps/galaxy/controllers/admin.py index cc72def5d57..4daf889afea 100644 --- a/lib/galaxy/webapps/galaxy/controllers/admin.py +++ b/lib/galaxy/webapps/galaxy/controllers/admin.py @@ -529,6 +529,32 @@ class AdminGalaxy(controller.JSAppLauncher, AdminActions, UsesQuotaMixin, QuotaP } return self.template(trans, 'admin', settings=settings, message=message, status=status) + @web.expose + @web.json + @web.require_admin + def data_tables_list(self, trans, **kwd): + data = [] + message = kwd.get('message', '') + status = kwd.get('status', 'done') + sorted_data_tables = sorted( + trans.app.tool_data_tables.get_tables().items() + ) + + for data_table_elem_name, data_table in sorted_data_tables: + for filename, file_dict in data_table.filenames.iteritems(): + file_missing = ['file missing'] \ + if not file_dict.get('found') else [] + data.append({ + 'name': data_table.name, + 'filename': filename, + 'tool_data_path': file_dict.get('tool_data_path'), + 'errors': ', '.join(file_missing + [ + error for error in file_dict.get('errors', []) + ]), + }) + + return {'data': data, 'message': message, 'status': status} + @web.expose @web.json @web.require_admin @@ -856,13 +882,6 @@ class AdminGalaxy(controller.JSAppLauncher, AdminActions, UsesQuotaMixin, QuotaP status = util.restore_text(kwd.get('status', 'done')) return trans.fill_template('admin/view_datatypes_registry.mako', message=message, status=status) - @web.expose - @web.require_admin - def view_tool_data_tables(self, trans, **kwd): - message = escape(util.restore_text(kwd.get('message', ''))) - status = util.restore_text(kwd.get('status', 'done')) - return trans.fill_template('admin/view_data_tables_registry.mako', message=message, status=status) - @web.expose @web.require_admin def display_applications(self, trans, **kwd): diff --git a/lib/galaxy/webapps/galaxy/controllers/data_manager.py b/lib/galaxy/webapps/galaxy/controllers/data_manager.py index 9229842d289..439758e73bf 100644 --- a/lib/galaxy/webapps/galaxy/controllers/data_manager.py +++ b/lib/galaxy/webapps/galaxy/controllers/data_manager.py @@ -116,3 +116,57 @@ class DataManager(BaseUIController): message=message, status=status) return trans.response.send_redirect(redirect_url) + + @web.expose + @web.json + @web.require_admin + def tool_data_table_items(self, trans, **kwd): + data = {'columns': [], 'items': []} + message = kwd.get('message', '') + status = kwd.get('status', 'info') + table_name = kwd.get('table_name', None) + + if not table_name: + return { + 'data': data, + 'message': 'No Data table name provided.', + 'status': 'warning', + } + + data_table = trans.app.tool_data_tables.get(table_name, None) + + if data_table is None: + return { + 'data': data, + 'message': 'Invalid Data table (%s) was requested' % table_name, + 'status': 'error' + } + + columns = data_table.get_column_name_list() + rows = [dict(zip(columns, table_row)) for table_row in data_table.data] + data['columns'] = columns + data['items'] = rows + + return {'data': data, 'message': message, 'status': status} + + @web.expose + @web.json + @web.require_admin + def reload_tool_data_table(self, trans, **kwd): + table_name = kwd.get('table_name', None) + + if not table_name: + return { + 'message': 'No data table has been reloaded.', + 'status': 'error', + } + + redirect_url = web.url_for( + controller='data_manager', + action='tool_data_table_items', + table_name=table_name, + message='The data table "%s" has been reloaded.' % table_name, + status='done', + ) + + return trans.response.send_redirect(redirect_url) From 4516958e9d56ae78fbb606dbeb7664f57cf242b6 Mon Sep 17 00:00:00 2001 From: Dannon Baker Date: Thu, 7 Dec 2017 14:39:04 -0500 Subject: [PATCH 2/5] Minor formatting. --- client/galaxy/scripts/apps/admin.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/galaxy/scripts/apps/admin.js b/client/galaxy/scripts/apps/admin.js index f78da9609eb..be8d3c12244 100644 --- a/client/galaxy/scripts/apps/admin.js +++ b/client/galaxy/scripts/apps/admin.js @@ -98,13 +98,13 @@ window.app = function app(options, bootstrapped) { }, show_user_api_keys: function() { - var vueMount = document.createElement('div'); + var vueMount = document.createElement("div"); this.page.display(vueMount); new Vue(UserAPIKeys).$mount(vueMount); }, show_data_tables: function() { - var vueMount = document.createElement('div'); + var vueMount = document.createElement("div"); this.page.display(vueMount); new Vue(DataTables).$mount(vueMount); }, From 44a1c0bcbcf51dff72d3132f36e2ab106a121ad0 Mon Sep 17 00:00:00 2001 From: Dannon Baker Date: Thu, 7 Dec 2017 15:30:19 -0500 Subject: [PATCH 3/5] Rename new .vue components. --- client/galaxy/scripts/apps/admin.js | 5 ++--- .../galaxy/scripts/components/{message.vue => Message.vue} | 0 .../components/admin/{base-grid.vue => BaseGrid.vue} | 0 .../admin/{data-manager-grid.vue => DataManagerGrid.vue} | 0 .../components/admin/{data-tables.vue => DataTables.vue} | 6 +++--- .../admin/{data-tables-grid.vue => DataTablesGrid.vue} | 2 +- 6 files changed, 6 insertions(+), 7 deletions(-) rename client/galaxy/scripts/components/{message.vue => Message.vue} (100%) rename client/galaxy/scripts/components/admin/{base-grid.vue => BaseGrid.vue} (100%) rename client/galaxy/scripts/components/admin/{data-manager-grid.vue => DataManagerGrid.vue} (100%) rename client/galaxy/scripts/components/admin/{data-tables.vue => DataTables.vue} (95%) rename client/galaxy/scripts/components/admin/{data-tables-grid.vue => DataTablesGrid.vue} (96%) diff --git a/client/galaxy/scripts/apps/admin.js b/client/galaxy/scripts/apps/admin.js index be8d3c12244..66a50affc3d 100644 --- a/client/galaxy/scripts/apps/admin.js +++ b/client/galaxy/scripts/apps/admin.js @@ -5,14 +5,13 @@ import GalaxyApp from "galaxy"; import AdminPanel from "./panels/admin-panel"; import FormWrapper from "mvc/form/form-wrapper"; import GridView from "mvc/grid/grid-view"; -import Ui from "mvc/ui/ui-misc"; import QueryStringParsing from "utils/query-string-parsing"; import Router from "layout/router"; import Utils from "utils/utils"; import Page from "layout/page"; import Vue from "libs/vue"; import UserAPIKeys from "components/UserAPIKeys.vue"; -import DataTables from "components/admin/data-tables.vue"; +import DataTables from "components/admin/DataTables.vue"; window.app = function app(options, bootstrapped) { window.Galaxy = new GalaxyApp.GalaxyApp(options, bootstrapped); @@ -33,7 +32,7 @@ window.app = function app(options, bootstrapped) { "(/)admin/data_tables": "show_data_tables" }, - authenticate: function(args, name) { + authenticate: function() { return Galaxy.user && Galaxy.user.id && Galaxy.user.get("is_admin"); }, diff --git a/client/galaxy/scripts/components/message.vue b/client/galaxy/scripts/components/Message.vue similarity index 100% rename from client/galaxy/scripts/components/message.vue rename to client/galaxy/scripts/components/Message.vue diff --git a/client/galaxy/scripts/components/admin/base-grid.vue b/client/galaxy/scripts/components/admin/BaseGrid.vue similarity index 100% rename from client/galaxy/scripts/components/admin/base-grid.vue rename to client/galaxy/scripts/components/admin/BaseGrid.vue diff --git a/client/galaxy/scripts/components/admin/data-manager-grid.vue b/client/galaxy/scripts/components/admin/DataManagerGrid.vue similarity index 100% rename from client/galaxy/scripts/components/admin/data-manager-grid.vue rename to client/galaxy/scripts/components/admin/DataManagerGrid.vue diff --git a/client/galaxy/scripts/components/admin/data-tables.vue b/client/galaxy/scripts/components/admin/DataTables.vue similarity index 95% rename from client/galaxy/scripts/components/admin/data-tables.vue rename to client/galaxy/scripts/components/admin/DataTables.vue index 6be6f1e396f..02c1fd6b76b 100644 --- a/client/galaxy/scripts/components/admin/data-tables.vue +++ b/client/galaxy/scripts/components/admin/DataTables.vue @@ -13,9 +13,9 @@