diff --git a/client/package.json b/client/package.json index 04561397485..44eaae21e1a 100644 --- a/client/package.json +++ b/client/package.json @@ -82,7 +82,8 @@ "vueisotope": "^3.1.2", "vuex": "^3.4.0", "vuex-cache": "^3.2.0", - "vuex-persist": "^3.1.3" + "vuex-persist": "^3.1.3", + "vue-observe-visibility": "^1.0.0" }, "scripts": { "watch": "gulp && yarn run save-build-hash && yarn run webpack-watch", diff --git a/client/src/components/LibraryFolder/LibraryFolderPermissions/LibraryFolderPermissions.vue b/client/src/components/LibraryFolder/LibraryFolderPermissions/LibraryFolderPermissions.vue new file mode 100644 index 00000000000..c4fae4d6d27 --- /dev/null +++ b/client/src/components/LibraryFolder/LibraryFolderPermissions/LibraryFolderPermissions.vue @@ -0,0 +1,143 @@ + + + diff --git a/client/src/components/LibraryFolder/LibraryFolderPermissions/services.js b/client/src/components/LibraryFolder/LibraryFolderPermissions/services.js new file mode 100644 index 00000000000..7ef7f581279 --- /dev/null +++ b/client/src/components/LibraryFolder/LibraryFolderPermissions/services.js @@ -0,0 +1,38 @@ +import axios from "axios"; +import { rethrowSimple } from "utils/simple-error"; +import { getAppRoot } from "onload/loadConfig"; + +export class Services { + constructor(options = {}) { + this.root = options.root || getAppRoot(); + } + + async getFolderPermissions(id) { + const url = `${this.root}api/folders/${id}/permissions?scope=current`; + try { + const response = await axios.get(url); + return response.data; + } catch (e) { + rethrowSimple(e); + } + } + async getFolder(id) { + const url = `${this.root}api/folders/${id}`; + try { + const response = await axios.get(url); + return response.data; + } catch (e) { + rethrowSimple(e); + } + } + async getSelectOptions(id, is_library_access, page, query) { + const page_limit = 10; + const url = `${this.root}api/folders/${id}/permissions?scope=available&is_library_access=${is_library_access}&page_limit=${page_limit}&page=${page}`; + try { + const response = await axios.get(url); + return response.data; + } catch (e) { + rethrowSimple(e); + } + } +} diff --git a/client/src/entry/analysis/AnalysisRouter.js b/client/src/entry/analysis/AnalysisRouter.js index 57b307aecb4..bbc21f1386f 100644 --- a/client/src/entry/analysis/AnalysisRouter.js +++ b/client/src/entry/analysis/AnalysisRouter.js @@ -30,6 +30,7 @@ import TrsImport from "components/Workflow/TrsImport.vue"; import TrsSearch from "components/Workflow/TrsSearch.vue"; import InteractiveTools from "components/InteractiveTools/InteractiveTools.vue"; import LibraryFolder from "components/LibraryFolder/LibraryFolder.vue"; +import LibraryFolderPermissions from "components/LibraryFolder/LibraryFolderPermissions/LibraryFolderPermissions.vue"; import WorkflowList from "components/Workflow/WorkflowList.vue"; import HistoryImport from "components/HistoryImport.vue"; import { HistoryExport } from "components/HistoryExport/index"; @@ -99,6 +100,7 @@ export const getAnalysisRouter = (Galaxy) => "(/)datasets/error": "show_dataset_error", "(/)interactivetool_entry_points(/)list": "show_interactivetool_list", "(/)library/folders(/)(:folder_id)": "show_library_folder", + "(/)library/folders-permissions(/)(:folder_id)": "manage_library_folder", }, require_login: ["show_user", "show_user_form", "show_workflows", "show_cloud_auth", "show_external_ids"], @@ -155,6 +157,12 @@ export const getAnalysisRouter = (Galaxy) => this._display_vue_helper(LibraryFolder, { folder_id: folder_id }); }, + manage_library_folder: function (folder_id) { + this.page.toolPanel?.component.hide(0); + this.page.panels.right.hide(); + this._display_vue_helper(LibraryFolderPermissions, { folder_id: folder_id }); + }, + show_cloud_auth: function () { this._display_vue_helper(CloudAuth); }, diff --git a/client/yarn.lock b/client/yarn.lock index b013e24e90e..cfabc39cf9c 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -15291,6 +15291,11 @@ vue-multiselect@^2.1.0: resolved "https://registry.yarnpkg.com/vue-multiselect/-/vue-multiselect-2.1.6.tgz#5be5d811a224804a15c43a4edbb7485028a89c7f" integrity sha512-s7jmZPlm9FeueJg1RwJtnE9KNPtME/7C8uRWSfp9/yEN4M8XcS/d+bddoyVwVnvFyRh9msFo0HWeW0vTL8Qv+w== +vue-observe-visibility@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/vue-observe-visibility/-/vue-observe-visibility-1.0.0.tgz#17cf1b2caf74022f0f3c95371468ddf2b9573152" + integrity sha512-s5TFh3s3h3Mhd3jaz3zGzkVHKHnc/0C/gNr30olO99+yw2hl3WBhK3ng3/f9OF+qkW4+l7GkmwfAzDAcY3lCFg== + vue-router@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.3.1.tgz#7d0545dd8ebf4f45494ca185b7eccb38d67689c1" diff --git a/lib/galaxy/webapps/galaxy/buildapp.py b/lib/galaxy/webapps/galaxy/buildapp.py index 411679e1cf6..181646c95a1 100644 --- a/lib/galaxy/webapps/galaxy/buildapp.py +++ b/lib/galaxy/webapps/galaxy/buildapp.py @@ -192,6 +192,7 @@ def app_pair(global_conf, load_app_kwds=None, wsgi_preflight=True, **kwargs): webapp.add_client_route('/custom_builds') webapp.add_client_route('/interactivetool_entry_points/list') webapp.add_client_route('/library/folders/{folder_id}') + webapp.add_client_route('/library/folders-permissions/{folder_id}') # ==== Done # Indicate that all configuration settings have been provided