-
+
+
+ {{ title }}
+
+
+
+
-
-
+
+
+
+
+
+
+
diff --git a/client/src/components/LibraryFolder/LibraryFolderPermissions/services.js b/client/src/components/LibraryFolder/LibraryFolderPermissions/services.js
index a7781482066..89700478c55 100644
--- a/client/src/components/LibraryFolder/LibraryFolderPermissions/services.js
+++ b/client/src/components/LibraryFolder/LibraryFolderPermissions/services.js
@@ -16,6 +16,24 @@ export class Services {
rethrowSimple(e);
}
}
+ async getDatasetPermissions(id) {
+ const url = `${this.root}api/libraries/datasets/${id}/permissions?scope=current`;
+ try {
+ const response = await axios.get(url);
+ return response.data;
+ } catch (e) {
+ rethrowSimple(e);
+ }
+ }
+ async getDataset(id) {
+ const url = `${this.root}api/libraries/datasets/${id}`;
+ 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 {
@@ -25,9 +43,9 @@ export class Services {
rethrowSimple(e);
}
}
- async getSelectOptions(id, is_library_access, page, page_limit, searchQuery) {
+ async getSelectOptions(apiRootUrl, id, is_library_access, page, page_limit, searchQuery) {
searchQuery = searchQuery ? `&q=${searchQuery}` : "";
- const url = `${this.root}api/folders/${id}/permissions?scope=available&is_library_access=${is_library_access}&page_limit=${page_limit}&page=${page}${searchQuery}`;
+ const url = `${apiRootUrl}/${id}/permissions?scope=available&is_library_access=${is_library_access}&page_limit=${page_limit}&page=${page}${searchQuery}`;
try {
const response = await axios.get(url);
return response.data;
@@ -35,24 +53,19 @@ export class Services {
rethrowSimple(e);
}
}
- async setPermissions(id, add_ids, manage_ids, modify_ids, onSuccess, onError) {
+
+ async setPermissions(apiRootUrl, id, new_roles_ids, onSuccess, onError) {
var formData = new FormData();
- formData.append(
- "add_ids[]",
- add_ids.map((a) => a.id)
- );
- formData.append(
- "manage_ids[]",
- manage_ids.map((a) => a.id)
- );
- formData.append(
- "modify_ids[]",
- modify_ids.map((a) => a.id)
- );
+ new_roles_ids.forEach((permissionType) => {
+ Object.keys(permissionType).map(function (k) {
+ const ids = permissionType[k].map((a) => a.id);
+ formData.append(k, ids);
+ });
+ });
axios({
method: "post",
- url: `${getAppRoot()}api/folders/${id}/permissions?action=set_permissions`,
+ url: `${apiRootUrl}/${id}/permissions?action=set_permissions`,
data: formData,
headers: { "Content-Type": "multipart/form-data" },
})
@@ -63,4 +76,18 @@ export class Services {
onError(response);
});
}
+ async toggleDatasetPrivacy(id, isMakePrivate, onSuccess, onError) {
+ await axios
+ .post(
+ `${getAppRoot()}api/libraries/datasets/${id}/permissions?action=${
+ isMakePrivate ? "make_private" : "remove_restrictions"
+ }`
+ )
+ .then((fetched_permissions) => {
+ onSuccess(fetched_permissions.data);
+ })
+ .catch((response) => {
+ onError(response);
+ });
+ }
}
diff --git a/client/src/components/LibraryFolder/LibraryFolderPermissions/utils.js b/client/src/components/LibraryFolder/LibraryFolderPermissions/utils.js
new file mode 100644
index 00000000000..692c1db1b51
--- /dev/null
+++ b/client/src/components/LibraryFolder/LibraryFolderPermissions/utils.js
@@ -0,0 +1,9 @@
+// legacy code
+export function extractRoles(role_list) {
+ const selected_roles = [];
+ role_list.forEach((item) => {
+ selected_roles.push({ name: item[0], id: item[1] });
+ });
+
+ return selected_roles;
+}
diff --git a/client/src/components/LibraryFolder/LibraryFolderRouter.vue b/client/src/components/LibraryFolder/LibraryFolderRouter.vue
index 7de34fcdf67..f3bd91063a2 100644
--- a/client/src/components/LibraryFolder/LibraryFolderRouter.vue
+++ b/client/src/components/LibraryFolder/LibraryFolderRouter.vue
@@ -2,8 +2,9 @@
import { getAppRoot } from "onload/loadConfig";
import Vue from "vue";
import VueRouter from "vue-router";
-import LibraryFolderPermissions from "./LibraryFolderPermissions/LibraryFolderPermissions.vue";
+import LibraryFolderPermissions from "components/LibraryFolder/LibraryFolderPermissions/LibraryFolderPermissions.vue";
import LibraryFolder from "components/LibraryFolder/LibraryFolder.vue";
+import LibraryFolderDatasetPermissions from "components/LibraryFolder/LibraryFolderPermissions/LibraryFolderDatasetPermissions.vue";
Vue.use(VueRouter);
@@ -23,6 +24,12 @@ export default new VueRouter({
component: LibraryFolderPermissions,
props: true,
},
+ {
+ path: "/permissions/:folder_id/dataset/:dataset_id",
+ name: "LibraryFolder",
+ component: LibraryFolderDatasetPermissions,
+ props: true,
+ },
],
});
diff --git a/client/src/components/LibraryFolder/icons.js b/client/src/components/LibraryFolder/icons.js
index 3255459ffe5..5e4b08504d8 100644
--- a/client/src/components/LibraryFolder/icons.js
+++ b/client/src/components/LibraryFolder/icons.js
@@ -38,7 +38,7 @@ const tableIcons = [
faMinusSquare,
];
-const manageIcons = [faAngleDoubleLeft, faSave];
+const manageIcons = [faAngleDoubleLeft, faSave, faFile];
const topBarIcons = [faHome, faPlus, faInfoCircle, faTrash, faDownload, faBook];
export function initFolderTableIcons() {
@@ -47,7 +47,7 @@ export function initFolderTableIcons() {
});
}
-export function initManageFolderIcons() {
+export function initPermissionsIcons() {
manageIcons.forEach((icon) => {
library.add(icon);
});
diff --git a/client/src/entry/analysis/AnalysisRouter.js b/client/src/entry/analysis/AnalysisRouter.js
index f38c044cdef..21e7e4430e0 100644
--- a/client/src/entry/analysis/AnalysisRouter.js
+++ b/client/src/entry/analysis/AnalysisRouter.js
@@ -101,6 +101,7 @@ export const getAnalysisRouter = (Galaxy) => {
"(/)interactivetool_entry_points(/)list": "show_interactivetool_list",
"(/)library/folders(/)(:folder_id)": "show_library_folder",
"(/)library/folders/permissions(/)(:folder_id)": "show_library_folder",
+ "(/)library/folders/permissions(/)(:folder_id)(/)dataset(/)(:dataset_id)": "show_library_folder",
},
require_login: ["show_user", "show_user_form", "show_workflows", "show_cloud_auth", "show_external_ids"],
diff --git a/client/src/mvc/library/library-dataset-view.js b/client/src/mvc/library/library-dataset-view.js
index a2a4b84c1a4..6d4aa0f09d1 100644
--- a/client/src/mvc/library/library-dataset-view.js
+++ b/client/src/mvc/library/library-dataset-view.js
@@ -27,9 +27,6 @@ var LibraryDatasetView = Backbone.View.extend({
"click .toolbtn-download-dataset": "downloadDataset",
"click .toolbtn-import-dataset": "importIntoHistory",
"click .copy-link-to-clipboard": "copyToClipboard",
- "click .make-private": "makeDatasetPrivate",
- "click .remove-restrictions": "removeDatasetRestrictions",
- "click .toolbtn_save_permissions": "savePermissions",
"click .toolbtn_save_modifications": "saveModifications",
"click .toolbtn_detect_datatype": "detectDatatype",
},
@@ -76,9 +73,7 @@ var LibraryDatasetView = Backbone.View.extend({
var self = this;
this.model.fetch({
success: function () {
- if (self.options.show_permissions) {
- self.showPermissions();
- } else if (self.options.show_version) {
+ if (self.options.show_version) {
self.fetchVersion();
} else {
self.render();
@@ -298,122 +293,6 @@ var LibraryDatasetView = Backbone.View.extend({
);
},
- showPermissions: function (options) {
- const Galaxy = getGalaxyInstance();
- var template = this.templateDatasetPermissions();
- var self = this;
- this.options = _.extend(this.options, options);
- $(".tooltip").remove();
- if (this.options.fetched_permissions !== undefined) {
- if (this.options.fetched_permissions.access_dataset_roles.length === 0) {
- this.model.set({ is_unrestricted: true });
- } else {
- this.model.set({ is_unrestricted: false });
- }
- }
- this.$el.html(
- template({
- item: this.model,
- is_admin: Galaxy.config.is_admin_user,
- rootPath: getAppRoot(),
- })
- );
- $.get(`${getAppRoot()}api/libraries/datasets/${self.id}/permissions?scope=current`)
- .done((fetched_permissions) => {
- self.prepareSelectBoxes({
- fetched_permissions: fetched_permissions,
- is_admin: Galaxy.config.is_admin_user,
- });
- })
- .fail(() => {
- Toast.error("An error occurred while attempting to fetch dataset permissions.");
- });
- $('#center [data-toggle="tooltip"]').tooltip({ trigger: "hover" });
- $("#center").css("overflow", "auto");
- },
-
- _serializeRoles: function (role_list) {
- var selected_roles = [];
- for (var i = 0; i < role_list.length; i++) {
- // Replace the : and , in role's name since these are select2 separators for initialData
- selected_roles.push(`${role_list[i][1]}:${role_list[i][0].replace(":", " ").replace(",", " &")}`);
- }
- return selected_roles;
- },
-
- prepareSelectBoxes: function (options) {
- this.options = _.extend(this.options, options);
- this.accessSelectObject = new mod_select.View(
- this._generate_select_options({
- selector: "access_perm",
- initialData: this._serializeRoles(this.options.fetched_permissions.access_dataset_roles),
- })
- );
- this.modifySelectObject = new mod_select.View(
- this._generate_select_options({
- selector: "modify_perm",
- initialData: this._serializeRoles(this.options.fetched_permissions.modify_item_roles),
- })
- );
- this.manageSelectObject = new mod_select.View(
- this._generate_select_options({
- selector: "manage_perm",
- initialData: this._serializeRoles(this.options.fetched_permissions.manage_dataset_roles),
- })
- );
- },
-
- _generate_select_options: function (options) {
- var select_options = {
- minimumInputLength: 0,
- multiple: true,
- placeholder: "Click to select a role",
- formatResult: function roleFormatResult(role) {
- return `${role.name} type: ${role.type}`;
- },
- formatSelection: function roleFormatSelection(role) {
- return role.name;
- },
- initSelection: function (element, callback) {
- // the input tag has a value attribute preloaded that points to a preselected role's id
- // this function resolves that id attribute to an object that select2 can render
- // using its formatResult renderer - that way the role name is shown preselected
- var data = [];
- $(element.val().split(",")).each(function () {
- var item = this.split(":");
- data.push({
- id: item[0],
- name: item[1],
- });
- });
- callback(data);
- },
- dropdownCssClass: "bigdrop", // apply css that makes the dropdown taller
- };
- select_options.container = this.$el.find(`#${options.selector}`);
- select_options.css = options.selector;
- select_options.initialData = options.initialData.join(",");
- select_options.ajax = {
- url: `${getAppRoot()}api/libraries/datasets/${this.id}/permissions?scope=available`,
- dataType: "json",
- quietMillis: 100,
- data: function (term, page) {
- // page is the one-based page number tracked by Select2
- return {
- q: term, //search term
- page_limit: 10, // page size, should be same as used in 'more' variable below
- page: page, // page number
- };
- },
- results: function (data, page) {
- var more = page * 10 < data.total; // whether or not there are more results available
- // notice we return the value of more so Select2 knows if more results can be loaded
- return { results: data.roles, more: more };
- },
- };
- return select_options;
- },
-
detectDatatype: function (options) {
const ld = this.model;
ld.set("file_ext", "auto");
@@ -490,36 +369,6 @@ var LibraryDatasetView = Backbone.View.extend({
window.prompt("Copy to clipboard: Ctrl+C, Enter", href);
},
- makeDatasetPrivate: function () {
- var self = this;
- $.post(`${getAppRoot()}api/libraries/datasets/${self.id}/permissions?action=make_private`)
- .done((fetched_permissions) => {
- self.model.set({ is_unrestricted: false });
- self.showPermissions({
- fetched_permissions: fetched_permissions,
- });
- Toast.success("The dataset is now private to you.");
- })
- .fail(() => {
- Toast.error("An error occurred while attempting to make dataset private.");
- });
- },
-
- removeDatasetRestrictions: function () {
- var self = this;
- $.post(`${getAppRoot()}api/libraries/datasets/${self.id}/permissions?action=remove_restrictions`)
- .done((fetched_permissions) => {
- self.model.set({ is_unrestricted: true });
- self.showPermissions({
- fetched_permissions: fetched_permissions,
- });
- Toast.success("Access to this dataset is now unrestricted.");
- })
- .fail(() => {
- Toast.error("An error occurred while attempting to make dataset unrestricted.");
- });
- },
-
/**
* Extract the role ids from Select2 elements's 'data'
*/
@@ -531,30 +380,6 @@ var LibraryDatasetView = Backbone.View.extend({
return ids_list;
},
- /**
- * Save the permissions for roles entered in the select boxes.
- */
- savePermissions: function (event) {
- var self = this;
- var access_ids = this._extractIds(this.accessSelectObject.$el.select2("data"));
- var manage_ids = this._extractIds(this.manageSelectObject.$el.select2("data"));
- var modify_ids = this._extractIds(this.modifySelectObject.$el.select2("data"));
- $.post(`${getAppRoot()}api/libraries/datasets/${self.id}/permissions?action=set_permissions`, {
- "access_ids[]": access_ids,
- "manage_ids[]": manage_ids,
- "modify_ids[]": modify_ids,
- })
- .done((fetched_permissions) => {
- self.showPermissions({
- fetched_permissions: fetched_permissions,
- });
- Toast.success("Permissions saved.");
- })
- .fail(() => {
- Toast.error("An error occurred while attempting to set dataset permissions.");
- });
- },
-
/**
* If needed request all extensions and/or genomes from Galaxy
* and save them in sorted arrays.
@@ -653,7 +478,7 @@ var LibraryDatasetView = Backbone.View.extend({
<% } %>
<% if (item.get("can_user_manage")) { %>
-
/datasets/<%- item.id %>/permissions">
+ /dataset/<%- item.id %>">
@@ -1110,101 +935,6 @@ var LibraryDatasetView = Backbone.View.extend({
`
);
},
-
- templateDatasetPermissions: function () {
- return _.template(
- `
-
diff --git a/lib/galaxy/webapps/galaxy/buildapp.py b/lib/galaxy/webapps/galaxy/buildapp.py
index 59f4c42b8fe..2c3453eca69 100644
--- a/lib/galaxy/webapps/galaxy/buildapp.py
+++ b/lib/galaxy/webapps/galaxy/buildapp.py
@@ -193,6 +193,7 @@ def app_pair(global_conf, load_app_kwds=None, wsgi_preflight=True, **kwargs):
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}')
+ webapp.add_client_route('/library/folders/permissions/{folder_id}/dataset/{dataset_id}')
# ==== Done
# Indicate that all configuration settings have been provided