diff --git a/client/src/components/Libraries/LibrariesList.vue b/client/src/components/Libraries/LibrariesList.vue index dc9db927fe7..df1e5a6d85e 100644 --- a/client/src/components/Libraries/LibrariesList.vue +++ b/client/src/components/Libraries/LibrariesList.vue @@ -9,7 +9,9 @@ Library - include deleted + + include deleted + exclude restricted @@ -158,6 +160,7 @@ id="paginationPerPage" autocomplete="off" type="number" + onkeyup="this.value|=0;if(this.value<1)this.value=1" v-model="perPage" /> diff --git a/client/src/components/Libraries/LibraryFolder/TopToolbar/FolderTopBar.vue b/client/src/components/Libraries/LibraryFolder/TopToolbar/FolderTopBar.vue index f269faafa4b..a9fddc56612 100644 --- a/client/src/components/Libraries/LibraryFolder/TopToolbar/FolderTopBar.vue +++ b/client/src/components/Libraries/LibraryFolder/TopToolbar/FolderTopBar.vue @@ -303,12 +303,13 @@ export default { // helper function to make legacy code compatible findCheckedItems: async function (idOnly = true) { const datasets = []; - const folder = []; + const folders = []; const selected = await this.getSelected(); selected.forEach((item) => { - item.type === "file" ? datasets.push(idOnly ? item.id : item) : idOnly ? item.id : item; + const selected_item = idOnly ? item.id : item; + item.type === "file" ? datasets.push(selected_item) : folders.push(selected_item); }); - return { datasets: datasets, folders: folder }; + return { datasets: datasets, folders: folders }; }, importToHistoryModal: function (isCollection) { this.findCheckedItems(!isCollection).then(({ datasets, folders }) => { diff --git a/client/src/components/Libraries/LibraryFolder/TopToolbar/import-to-history/import-dataset.js b/client/src/components/Libraries/LibraryFolder/TopToolbar/import-to-history/import-dataset.js index d57051a0f37..f9d17e703e7 100644 --- a/client/src/components/Libraries/LibraryFolder/TopToolbar/import-to-history/import-dataset.js +++ b/client/src/components/Libraries/LibraryFolder/TopToolbar/import-to-history/import-dataset.js @@ -79,13 +79,13 @@ var ImportDatasetModal = Backbone.View.extend({ Toast.error("An error occurred."); }) .always(() => { - this.modal.enableButton("Import"); + this.modal.disableButton("Import"); }); } else { var history_id = $("select[name=import_to_history] option:selected").val(); var history_name = $("select[name=import_to_history] option:selected").text(); this.processImportToHistory(history_id, history_name); - this.modal.enableButton("Import"); + this.modal.disableButton("Import"); } }, diff --git a/client/src/components/Libraries/library-utils.js b/client/src/components/Libraries/library-utils.js index 11b4b1af569..ac4ba93c5e3 100644 --- a/client/src/components/Libraries/library-utils.js +++ b/client/src/components/Libraries/library-utils.js @@ -13,9 +13,12 @@ export function onError(error) { // legacy code export function extractRoles(role_list) { const selected_roles = []; - role_list.forEach((item) => { - selected_roles.push({ name: item[0], id: item[1] }); - }); + + if (role_list) { + role_list.forEach((item) => { + selected_roles.push({ name: item[0], id: item[1] }); + }); + } return selected_roles; } diff --git a/client/src/components/Upload/Collection.vue b/client/src/components/Upload/Collection.vue index 9dc2f04474b..22b872a63fe 100644 --- a/client/src/components/Upload/Collection.vue +++ b/client/src/components/Upload/Collection.vue @@ -242,6 +242,7 @@ export default { file_mode: file.mode || "local", file_path: file.path, file_data: file, + file_uri: file.uri, extension: this.extension, genome: this.genome, }; diff --git a/client/src/components/Upload/Default.vue b/client/src/components/Upload/Default.vue index b73cefdf61e..b8cdfb00eb0 100644 --- a/client/src/components/Upload/Default.vue +++ b/client/src/components/Upload/Default.vue @@ -249,6 +249,7 @@ export default { file_size: file.size, file_mode: file.mode || "local", file_path: file.path, + file_uri: file.uri, file_data: file, }; }, diff --git a/client/src/components/Upload/UploadBoxMixin.js b/client/src/components/Upload/UploadBoxMixin.js index 97a9dc485ac..6b4c7cfed39 100644 --- a/client/src/components/Upload/UploadBoxMixin.js +++ b/client/src/components/Upload/UploadBoxMixin.js @@ -242,6 +242,7 @@ export default { name: ftp_file.path, size: ftp_file.size, path: ftp_file.path, + uri: ftp_file.uri, }, ]); }, diff --git a/client/src/components/Upload/UploadModalContent.vue b/client/src/components/Upload/UploadModalContent.vue index dad838fe24a..adb7a993247 100644 --- a/client/src/components/Upload/UploadModalContent.vue +++ b/client/src/components/Upload/UploadModalContent.vue @@ -292,24 +292,23 @@ export default { auto_decompress: true, }; - // Composite does not use the fetch API, so we can just - // index into the first element of items - const item = items[0]; - let urls; - if (item.get("file_mode") == "ftp") { - urls = [item.get("file_path")]; - } else { - urls = item.get("url_paste").split("\n"); - } - urls.forEach((url) => { - if (url != "") { - data.targets[0].elements.push({ - url: url.trim(), - src: "url", - dbkey: item.get("genome", "?"), - ext: item.get("extension", "auto"), - }); + items.forEach((item) => { + let urls; + if (item.get("file_mode") == "ftp") { + urls = [item.get("file_uri") || item.get("file_path")]; + } else { + urls = item.get("url_paste").split("\n"); } + urls.forEach((url) => { + if (url != "") { + data.targets[0].elements.push({ + url: url.trim(), + src: "url", + dbkey: item.get("genome", "?"), + ext: item.get("extension", "auto"), + }); + } + }); }); return data; }, diff --git a/client/src/components/Workflow/Editor/Index.vue b/client/src/components/Workflow/Editor/Index.vue index 23b31e6ea4c..2789c869b7c 100644 --- a/client/src/components/Workflow/Editor/Index.vue +++ b/client/src/components/Workflow/Editor/Index.vue @@ -469,7 +469,7 @@ export default { } }, onUpgrade() { - this.attemptRefactor([{ action_type: "upgrade_all_steps" }]); + this.onAttemptRefactor([{ action_type: "upgrade_all_steps" }]); }, onEdit() { this.isCanvas = true; diff --git a/client/src/components/Workflow/TrsImport.vue b/client/src/components/Workflow/TrsImport.vue index 04a22a1ec57..3ec341dbdba 100644 --- a/client/src/components/Workflow/TrsImport.vue +++ b/client/src/components/Workflow/TrsImport.vue @@ -105,9 +105,20 @@ export default { this.trsTool = tool; this.errorMessage = null; if (this.isAutoImport) { - const version = this.trsTool.versions.find((version) => version.id === this.queryTrsVersionId); + /* Resolve discrepancy between workflowhub, which sends an id as query parameter, + and dockstore, which uses the version name as the query parameter. + Should just be one of them eventually. */ + let versionField = "name"; + const version = this.trsTool.versions.find((version) => { + if (version.name === this.queryTrsVersionId) { + return true; + } else if (version.id === this.queryTrsVersionId) { + versionField = "id"; + return true; + } + }); if (version) { - this.importVersion(this.trsTool.id, version, this.isRun); + this.importVersion(this.trsTool.id, version[versionField], this.isRun); } else { Toast.warning(`Specified version: ${this.queryTrsVersionId} doesn't exist`); this.isAutoImport = false; diff --git a/client/src/components/Workflow/trsMixin.js b/client/src/components/Workflow/trsMixin.js index dfd944df435..32a9ab780f0 100644 --- a/client/src/components/Workflow/trsMixin.js +++ b/client/src/components/Workflow/trsMixin.js @@ -11,7 +11,7 @@ export default { methods: { importVersion(toolId, version, isRunFormRedirect = false) { this.services - .importTrsTool(this.trsSelection.id, toolId, version.name) + .importTrsTool(this.trsSelection.id, toolId, version) .then((response_data) => { redirectOnImport(getAppRoot(), response_data, isRunFormRedirect); }) diff --git a/client/src/mvc/library/library-dataset-view.js b/client/src/mvc/library/library-dataset-view.js index 0f326e6a8e2..931f013dc7e 100644 --- a/client/src/mvc/library/library-dataset-view.js +++ b/client/src/mvc/library/library-dataset-view.js @@ -492,12 +492,12 @@ var LibraryDatasetView = Backbone.View.extend({