From e328d0fe10eebb5571f5a777dcf0b48b5e8360f0 Mon Sep 17 00:00:00 2001 From: aaronm-2112 Date: Mon, 2 Dec 2024 15:23:01 -0800 Subject: [PATCH 01/37] chore: remove console logs --- src/renderer/src/scripts/others/api/api.js | 1 - src/renderer/src/scripts/others/renderer.js | 1 - 2 files changed, 2 deletions(-) diff --git a/src/renderer/src/scripts/others/api/api.js b/src/renderer/src/scripts/others/api/api.js index 57e21ed504..5b971de49c 100644 --- a/src/renderer/src/scripts/others/api/api.js +++ b/src/renderer/src/scripts/others/api/api.js @@ -539,7 +539,6 @@ const getLocalRemoteComparisonResults = async (datasetId, localDatasetPath) => { const response = await client.get( `/datasets/${datasetId}/comparison_results?local_dataset_path=${localDatasetPath}` ); - console.log(response.data); return response.data; }; diff --git a/src/renderer/src/scripts/others/renderer.js b/src/renderer/src/scripts/others/renderer.js index 88be44000f..d8c5354c66 100644 --- a/src/renderer/src/scripts/others/renderer.js +++ b/src/renderer/src/scripts/others/renderer.js @@ -545,7 +545,6 @@ const initializeSODARenderer = async () => { initializeSODARenderer(); const abortPennsieveAgentCheck = (pennsieveAgentStatusDivId) => { - console.log("CHange for build"); setPennsieveAgentCheckSuccessful(false); if (!pennsieveAgentStatusDivId) { return; From 9b86897de9925cfccc9c62f5c13bc740951bbb87 Mon Sep 17 00:00:00 2001 From: aaronm-2112 Date: Mon, 2 Dec 2024 15:46:04 -0800 Subject: [PATCH 02/37] chore: update changelog for 15.3.0 --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 40551b6760..ea68a03b01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,14 @@ All notable changes to SODA will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## v15.3.0 - 2024-12-03 + +## Feature Additions: + +- SODA will notify users if it is determined that a network setting may be preventing communication to the Pennsieve platform. +- The `Prepare Dataset Step-by-Step` feature allows users to resume curating a dataset even when that dataset saved files that have since been deleted from the computer. + + ## v15.2.3 - 2024-11-20 ## Bug Fixes: From 0342b6c1087a3ae5a880607ee0a439a0e6f69b40 Mon Sep 17 00:00:00 2001 From: aaronm-2112 Date: Mon, 2 Dec 2024 15:50:31 -0800 Subject: [PATCH 03/37] chore: update announcements for 15.3.0 release --- src/renderer/src/scripts/meta/announcements.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/renderer/src/scripts/meta/announcements.json b/src/renderer/src/scripts/meta/announcements.json index fa389013e1..1aa20f2a4f 100644 --- a/src/renderer/src/scripts/meta/announcements.json +++ b/src/renderer/src/scripts/meta/announcements.json @@ -1,4 +1,12 @@ { + "15.3.0": { + "announcements": { + "bug-fixes": [ + ], + "features": ["SODA will notify users if it is determined that a network setting may be preventing communication to the Pennsieve platform.", + "The `Prepare Dataset Step-by-Step` feature allows users to resume curating a dataset even when that dataset saved files that have since been deleted from the computer."] + } + }, "15.2.2": { "announcements": { "bug-fixes": [ From 281532d0c719a35e5dc5832a3fdd8a6ac2ab9115 Mon Sep 17 00:00:00 2001 From: aaronm-2112 Date: Wed, 4 Dec 2024 11:18:17 -0800 Subject: [PATCH 04/37] refactor: PLP change to only exclude viewers --- src/pyflask/manageDatasets/manage_datasets.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pyflask/manageDatasets/manage_datasets.py b/src/pyflask/manageDatasets/manage_datasets.py index eb88ae6a59..45ddca589e 100644 --- a/src/pyflask/manageDatasets/manage_datasets.py +++ b/src/pyflask/manageDatasets/manage_datasets.py @@ -337,7 +337,8 @@ def filter_dataset(datasets_list, store=None): r = requests.get(f"{PENNSIEVE_URL}/datasets/{str(selected_dataset_id)}/role", headers=create_request_headers(get_access_token())) r.raise_for_status() user_role = r.json()["role"] - if user_role not in ["viewer", "editor"]: + namespace_logger.info(f"User role: {user_role}") + if user_role not in ["viewer"]: store.append( {"id": selected_dataset_id, "name": dataset['name'], "role": user_role, "intId": dataset["intId"]} ) @@ -358,6 +359,7 @@ def filter_dataset(datasets_list, store=None): [t.join() for t in threads] sorted_bf_datasets = sorted(store, key=lambda k: k["name"].upper()) + namespace_logger.info(f"Sorted datasets: {sorted_bf_datasets}") return {"datasets": sorted_bf_datasets} def get_username(accountname): From 710b575e4e0daf3321d4973951991bb7f0d1afaf Mon Sep 17 00:00:00 2001 From: fairdataihub-bot Date: Wed, 4 Dec 2024 19:20:04 +0000 Subject: [PATCH 05/37] =?UTF-8?q?style:=20=F0=9F=8E=A8=20fix=20code=20styl?= =?UTF-8?q?e=20issues=20with=20Prettier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 5 ++--- src/renderer/src/scripts/meta/announcements.json | 9 +++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea68a03b01..0fbfd5d9b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,9 +9,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## Feature Additions: -- SODA will notify users if it is determined that a network setting may be preventing communication to the Pennsieve platform. -- The `Prepare Dataset Step-by-Step` feature allows users to resume curating a dataset even when that dataset saved files that have since been deleted from the computer. - +- SODA will notify users if it is determined that a network setting may be preventing communication to the Pennsieve platform. +- The `Prepare Dataset Step-by-Step` feature allows users to resume curating a dataset even when that dataset saved files that have since been deleted from the computer. ## v15.2.3 - 2024-11-20 diff --git a/src/renderer/src/scripts/meta/announcements.json b/src/renderer/src/scripts/meta/announcements.json index 1aa20f2a4f..427a671c8f 100644 --- a/src/renderer/src/scripts/meta/announcements.json +++ b/src/renderer/src/scripts/meta/announcements.json @@ -1,10 +1,11 @@ { "15.3.0": { "announcements": { - "bug-fixes": [ - ], - "features": ["SODA will notify users if it is determined that a network setting may be preventing communication to the Pennsieve platform.", - "The `Prepare Dataset Step-by-Step` feature allows users to resume curating a dataset even when that dataset saved files that have since been deleted from the computer."] + "bug-fixes": [], + "features": [ + "SODA will notify users if it is determined that a network setting may be preventing communication to the Pennsieve platform.", + "The `Prepare Dataset Step-by-Step` feature allows users to resume curating a dataset even when that dataset saved files that have since been deleted from the computer." + ] } }, "15.2.2": { From 6b4f3caba22ef80f77b161fde6c0219b927a0c05 Mon Sep 17 00:00:00 2001 From: aaronm-2112 Date: Wed, 4 Dec 2024 14:36:32 -0800 Subject: [PATCH 06/37] feat: check if a user is a guest in their active workspace --- src/renderer/src/scripts/globals.js | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/renderer/src/scripts/globals.js b/src/renderer/src/scripts/globals.js index 549f4c096c..e4e2a90bc7 100644 --- a/src/renderer/src/scripts/globals.js +++ b/src/renderer/src/scripts/globals.js @@ -2187,6 +2187,27 @@ const get_api_key = (login, password, key_name) => { }); }; +window.isWorkspaceGuest = async () => { + let userInfo = await api.getUserInformation(); + let currentWorkspace = userInfo["preferredOrganization"]; + + let orgResponse; + try { + orgResponse = await client.get(`user/organizations`, { + params: { + selected_account: window.defaultBfAccount, + }, + }); + } catch (error) { + clientError(error); + // TODO: Handle error here + } + + // get the current workspace by matching the id + let currentWorkspaceObj = orgResponse.data.organizations.filter(org => org.organization.id === currentWorkspace)[0] + return currentWorkspaceObj.isGuest +} + export { currentConTable, showHideDropdownButtons, @@ -2194,5 +2215,5 @@ export { initializeBootstrapSelect, updateDatasetList, bfAccountOptions, - get_api_key, + get_api_key }; From ac1b85f3b5fd4b280a1b2811648d475d861fb70d Mon Sep 17 00:00:00 2001 From: fairdataihub-bot Date: Wed, 4 Dec 2024 22:37:47 +0000 Subject: [PATCH 07/37] =?UTF-8?q?style:=20=F0=9F=8E=A8=20fix=20code=20styl?= =?UTF-8?q?e=20issues=20with=20Prettier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/src/scripts/globals.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/renderer/src/scripts/globals.js b/src/renderer/src/scripts/globals.js index e4e2a90bc7..39d287c61f 100644 --- a/src/renderer/src/scripts/globals.js +++ b/src/renderer/src/scripts/globals.js @@ -2187,11 +2187,11 @@ const get_api_key = (login, password, key_name) => { }); }; -window.isWorkspaceGuest = async () => { +window.isWorkspaceGuest = async () => { let userInfo = await api.getUserInformation(); let currentWorkspace = userInfo["preferredOrganization"]; - let orgResponse; + let orgResponse; try { orgResponse = await client.get(`user/organizations`, { params: { @@ -2204,9 +2204,11 @@ window.isWorkspaceGuest = async () => { } // get the current workspace by matching the id - let currentWorkspaceObj = orgResponse.data.organizations.filter(org => org.organization.id === currentWorkspace)[0] - return currentWorkspaceObj.isGuest -} + let currentWorkspaceObj = orgResponse.data.organizations.filter( + (org) => org.organization.id === currentWorkspace + )[0]; + return currentWorkspaceObj.isGuest; +}; export { currentConTable, @@ -2215,5 +2217,5 @@ export { initializeBootstrapSelect, updateDatasetList, bfAccountOptions, - get_api_key + get_api_key, }; From 2e27b821b5f7ceb751d6ab5c07bec5c1a338fb33 Mon Sep 17 00:00:00 2001 From: aaronm-2112 Date: Thu, 5 Dec 2024 09:21:47 -0800 Subject: [PATCH 08/37] test: workaround for guest users to upload --- .../src/scripts/guided-mode/guided-curate-dataset.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js index 8fe01a9a4a..4b16883c67 100644 --- a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js +++ b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js @@ -423,6 +423,10 @@ document.getElementById("guided-button-has-docs-data").addEventListener("click", }); const checkIfChangesMetadataPageShouldBeShown = async (pennsieveDatasetID) => { + // TODO: Brioader support for guests who are editing a changed dataset. + + let isGuest = await window.isWorkspaceGuest(); + if (isGuest) return { shouldShow: false }; try { const changesRes = await client.get(`/prepare_metadata/readme_changes_file`, { params: { @@ -6285,6 +6289,8 @@ window.openPage = async (targetPageID) => { } if (targetPageID === "guided-designate-permissions-tab") { + let isGuest = await window.isWorkspaceGuest(); + if (isGuest) return; // Get the users that can be granted permissions const usersReq = await client.get( `manage_datasets/ps_get_users?selected_account=${window.defaultBfAccount}` From 603a31ace483b500ed8dc58508a3c312cc48ae3b Mon Sep 17 00:00:00 2001 From: aaronm-2112 Date: Thu, 5 Dec 2024 12:41:04 -0800 Subject: [PATCH 09/37] test: workaround ofr guest user uploads --- src/pyflask/permissions/permissions.py | 2 +- .../scripts/guided-mode/guided-curate-dataset.js | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/pyflask/permissions/permissions.py b/src/pyflask/permissions/permissions.py index 66fb63f249..eaaf1dde53 100644 --- a/src/pyflask/permissions/permissions.py +++ b/src/pyflask/permissions/permissions.py @@ -29,4 +29,4 @@ def has_edit_permissions(ps_or_token, selected_dataset_id): except Exception as e: abort(500, "Could not get permissions for this dataset.") - return role in ["owner", "manager"] + return role in ["owner", "manager", "editor"] diff --git a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js index 4b16883c67..4a078d9e3f 100644 --- a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js +++ b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js @@ -6289,8 +6289,9 @@ window.openPage = async (targetPageID) => { } if (targetPageID === "guided-designate-permissions-tab") { + console.log("In permissions tab") let isGuest = await window.isWorkspaceGuest(); - if (isGuest) return; + if (!isGuest) { // Get the users that can be granted permissions const usersReq = await client.get( `manage_datasets/ps_get_users?selected_account=${window.defaultBfAccount}` @@ -6440,6 +6441,7 @@ window.openPage = async (targetPageID) => { renderPermissionsTable(); guidedResetUserTeamPermissionsDropdowns(); + } } if (targetPageID === "guided-assign-license-tab") { @@ -6961,6 +6963,7 @@ window.openPage = async (targetPageID) => { // Set the last opened page and save it window.sodaJSONObj["page-before-exit"] = targetPageID; + console.log("About to save progress") await guidedSaveProgress(); } catch (error) { const eMessage = userErrorMessage(error); @@ -13950,6 +13953,8 @@ const guidedCreateOrRenameDataset = async (bfAccount, datasetName) => { }; const guidedAddDatasetSubtitle = async (bfAccount, datasetName, datasetSubtitle) => { + let isGuest = await window.isWorkspaceGuest() + if (isGuest) return; document.getElementById("guided-dataset-subtitle-upload-tr").classList.remove("hidden"); const datasetSubtitleUploadText = document.getElementById("guided-dataset-subtitle-upload-text"); datasetSubtitleUploadText.innerHTML = "Adding dataset subtitle..."; @@ -14032,6 +14037,8 @@ const guidedAddDatasetDescription = async ( dataCollection, dataConclusion ) => { + let isGuest = await window.isWorkspaceGuest() + if (isGuest) return; document.getElementById("guided-dataset-description-upload-tr").classList.remove("hidden"); const datasetDescriptionUploadText = document.getElementById( "guided-dataset-description-upload-text" @@ -14111,6 +14118,8 @@ const guidedAddDatasetDescription = async ( }; const uploadValidBannerImage = async (bfAccount, datasetName, bannerImagePath) => { + let isGuest = await window.isWorkspaceGuest() + if (isGuest) return; document.getElementById("guided-dataset-banner-image-upload-tr").classList.remove("hidden"); const datasetBannerImageUploadText = document.getElementById( "guided-dataset-banner-image-upload-text" @@ -14217,6 +14226,8 @@ const guidedAddDatasetBannerImage = async (bfAccount, datasetName, bannerImagePa await uploadValidBannerImage(bfAccount, datasetName, bannerImagePath); }; const guidedAddDatasetLicense = async (bfAccount, datasetName, datasetLicense) => { + let isGuest = await window.isWorkspaceGuest() + if (isGuest) return; document.getElementById("guided-dataset-license-upload-tr").classList.remove("hidden"); const datasetLicenseUploadText = document.getElementById("guided-dataset-license-upload-text"); datasetLicenseUploadText.innerHTML = "Adding dataset license..."; @@ -14292,6 +14303,8 @@ const guidedAddDatasetLicense = async (bfAccount, datasetName, datasetLicense) = }; const guidedAddDatasetTags = async (bfAccount, datasetName, tags) => { + let isGuest = await window.isWorkspaceGuest() + if (isGuest) return; document.getElementById("guided-dataset-tags-upload-tr").classList.remove("hidden"); const datasetTagsUploadText = document.getElementById("guided-dataset-tags-upload-text"); datasetTagsUploadText.innerHTML = "Adding dataset tags..."; From ad1720359c8434bc0517d4e15a7550e1975d8689 Mon Sep 17 00:00:00 2001 From: fairdataihub-bot Date: Thu, 5 Dec 2024 20:42:09 +0000 Subject: [PATCH 10/37] =?UTF-8?q?style:=20=F0=9F=8E=A8=20fix=20code=20styl?= =?UTF-8?q?e=20issues=20with=20Prettier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../guided-mode/guided-curate-dataset.js | 282 +++++++++--------- 1 file changed, 141 insertions(+), 141 deletions(-) diff --git a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js index 4a078d9e3f..43bcb315c3 100644 --- a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js +++ b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js @@ -6289,158 +6289,158 @@ window.openPage = async (targetPageID) => { } if (targetPageID === "guided-designate-permissions-tab") { - console.log("In permissions tab") + console.log("In permissions tab"); let isGuest = await window.isWorkspaceGuest(); if (!isGuest) { - // Get the users that can be granted permissions - const usersReq = await client.get( - `manage_datasets/ps_get_users?selected_account=${window.defaultBfAccount}` - ); - const usersThatCanBeGrantedPermissions = usersReq.data.users; - - // Get the teams that can be granted permissions - // Note: This is in a try catch because guest accounts do not have access to the teams endpoint - // so the request will fail and teamsThatCanBeGrantedPermissions will remain an empty array - let teamsThatCanBeGrantedPermissions = []; - try { - const teamsReq = await client.get( - `manage_datasets/ps_get_teams?selected_account=${window.defaultBfAccount}` + // Get the users that can be granted permissions + const usersReq = await client.get( + `manage_datasets/ps_get_users?selected_account=${window.defaultBfAccount}` ); - teamsThatCanBeGrantedPermissions = window.getSortedTeamStrings(teamsReq.data.teams); - } catch (error) { - const emessage = userErrorMessage(error); - } + const usersThatCanBeGrantedPermissions = usersReq.data.users; - // Reset the dropdown with the new users and teams - guidedAddUsersAndTeamsToDropdown( - usersThatCanBeGrantedPermissions, - teamsThatCanBeGrantedPermissions - ); - - if (pageNeedsUpdateFromPennsieve("guided-designate-permissions-tab")) { - // Show the loading page while the page's data is being fetched from Pennsieve - setPageLoadingState(true); + // Get the teams that can be granted permissions + // Note: This is in a try catch because guest accounts do not have access to the teams endpoint + // so the request will fail and teamsThatCanBeGrantedPermissions will remain an empty array + let teamsThatCanBeGrantedPermissions = []; try { - let sparcUsersDivided = []; + const teamsReq = await client.get( + `manage_datasets/ps_get_teams?selected_account=${window.defaultBfAccount}` + ); + teamsThatCanBeGrantedPermissions = window.getSortedTeamStrings(teamsReq.data.teams); + } catch (error) { + const emessage = userErrorMessage(error); + } - //sparc users results needs to be formatted - usersThatCanBeGrantedPermissions.forEach((element) => { - //first two elements of this array will just be an email with no name - sparcUsersDivided.push(element.split(" !|**|!")); - }); + // Reset the dropdown with the new users and teams + guidedAddUsersAndTeamsToDropdown( + usersThatCanBeGrantedPermissions, + teamsThatCanBeGrantedPermissions + ); - const permissions = await api.getDatasetPermissions( - window.defaultBfAccount, - window.sodaJSONObj["digital-metadata"]["pennsieve-dataset-id"], - false - ); + if (pageNeedsUpdateFromPennsieve("guided-designate-permissions-tab")) { + // Show the loading page while the page's data is being fetched from Pennsieve + setPageLoadingState(true); + try { + let sparcUsersDivided = []; - //Filter out the integration user - const filteredPermissions = permissions.filter((permission) => { - return !permission.includes("Integration User"); - }); + //sparc users results needs to be formatted + usersThatCanBeGrantedPermissions.forEach((element) => { + //first two elements of this array will just be an email with no name + sparcUsersDivided.push(element.split(" !|**|!")); + }); - let partialUserDetails = []; - let finalTeamPermissions = []; - let piOwner = []; - - //so check for PI owner as well - for (const userPermission of filteredPermissions) { - // Will include teams and users - let userRoleSplit = userPermission.split(","); - // Will look like: - // ['User: John Doe ', ' role: owner'] - // need to split above - let nameSplit = userRoleSplit[0].split(":"); // will appear as ['Team', ' DRC Team'] - let roleSplit = userRoleSplit[1].split(":"); // will appear as [' role', ' Viewer'] - let userName = nameSplit[1].trim(); - let userPermiss = roleSplit[1].trim(); - let teamOrUser = nameSplit[0].trim().toLowerCase(); - - if (teamOrUser === "team") { - finalTeamPermissions.push({ - UUID: userName, - permission: userPermiss, - teamString: userName, - permissionSource: "Pennsieve", - deleteFromPennsieve: false, - }); - } else { - partialUserDetails.push({ - permission: userPermiss, - userName: userName, - }); + const permissions = await api.getDatasetPermissions( + window.defaultBfAccount, + window.sodaJSONObj["digital-metadata"]["pennsieve-dataset-id"], + false + ); + + //Filter out the integration user + const filteredPermissions = permissions.filter((permission) => { + return !permission.includes("Integration User"); + }); + + let partialUserDetails = []; + let finalTeamPermissions = []; + let piOwner = []; + + //so check for PI owner as well + for (const userPermission of filteredPermissions) { + // Will include teams and users + let userRoleSplit = userPermission.split(","); + // Will look like: + // ['User: John Doe ', ' role: owner'] + // need to split above + let nameSplit = userRoleSplit[0].split(":"); // will appear as ['Team', ' DRC Team'] + let roleSplit = userRoleSplit[1].split(":"); // will appear as [' role', ' Viewer'] + let userName = nameSplit[1].trim(); + let userPermiss = roleSplit[1].trim(); + let teamOrUser = nameSplit[0].trim().toLowerCase(); + + if (teamOrUser === "team") { + finalTeamPermissions.push({ + UUID: userName, + permission: userPermiss, + teamString: userName, + permissionSource: "Pennsieve", + deleteFromPennsieve: false, + }); + } else { + partialUserDetails.push({ + permission: userPermiss, + userName: userName, + }); + } } - } - // After loop use the array of objects to find the UUID and email - let finalUserPermissions = []; - - partialUserDetails.map((object) => { - sparcUsersDivided.forEach((element) => { - if (element[0].includes(object["userName"])) { - // name was found now get UUID - let userEmailSplit = element[0].split(" ("); - if (object["permission"] === "owner") { - //set for pi owner - piOwner.push({ - UUID: object.permission, - name: userEmailSplit[0], - userString: element[0], - permissionSource: "Pennsieve", - deleteFromPennsieve: false, - }); - //update PI owner key - } else { - finalUserPermissions.push({ - UUID: element[1], - permission: object.permission, - userName: userEmailSplit[0], - userString: element[0], - permissonSource: "Pennsieve", - deleteFromPennsieve: false, - }); + // After loop use the array of objects to find the UUID and email + let finalUserPermissions = []; + + partialUserDetails.map((object) => { + sparcUsersDivided.forEach((element) => { + if (element[0].includes(object["userName"])) { + // name was found now get UUID + let userEmailSplit = element[0].split(" ("); + if (object["permission"] === "owner") { + //set for pi owner + piOwner.push({ + UUID: object.permission, + name: userEmailSplit[0], + userString: element[0], + permissionSource: "Pennsieve", + deleteFromPennsieve: false, + }); + //update PI owner key + } else { + finalUserPermissions.push({ + UUID: element[1], + permission: object.permission, + userName: userEmailSplit[0], + userString: element[0], + permissonSource: "Pennsieve", + deleteFromPennsieve: false, + }); + } } - } + }); }); - }); - window.sodaJSONObj["digital-metadata"]["team-permissions"] = finalTeamPermissions; - window.sodaJSONObj["digital-metadata"]["user-permissions"] = finalUserPermissions; - window.sodaJSONObj["digital-metadata"]["pi-owner"] = piOwner[0]; + window.sodaJSONObj["digital-metadata"]["team-permissions"] = finalTeamPermissions; + window.sodaJSONObj["digital-metadata"]["user-permissions"] = finalUserPermissions; + window.sodaJSONObj["digital-metadata"]["pi-owner"] = piOwner[0]; - window.sodaJSONObj["pages-fetched-from-pennsieve"].push( - "guided-designate-permissions-tab" - ); - } catch (error) { - clientError(error); - const emessage = error.response.data.message; - await guidedShowOptionalRetrySwal(emessage, "guided-designate-permissions-tab"); - // If the user chooses not to retry re-fetching the page data, mark the page as fetched - // so the the fetch does not occur again - window.sodaJSONObj["pages-fetched-from-pennsieve"].push( - "guided-designate-permissions-tab" - ); + window.sodaJSONObj["pages-fetched-from-pennsieve"].push( + "guided-designate-permissions-tab" + ); + } catch (error) { + clientError(error); + const emessage = error.response.data.message; + await guidedShowOptionalRetrySwal(emessage, "guided-designate-permissions-tab"); + // If the user chooses not to retry re-fetching the page data, mark the page as fetched + // so the the fetch does not occur again + window.sodaJSONObj["pages-fetched-from-pennsieve"].push( + "guided-designate-permissions-tab" + ); + } } - } - - //If the PI owner is empty, set the PI owner to the user that is currently curating - if (Object.keys(window.sodaJSONObj["digital-metadata"]["pi-owner"]).length === 0) { - //Get the user information of the user that is currently curating - const user = await api.getUserInformation(); - const loggedInUserString = `${user["firstName"]} ${user["lastName"]} (${user["email"]})`; - const loggedInUserUUID = user["id"]; - const loggedInUserName = `${user["firstName"]} ${user["lastName"]}`; - const loggedInUserPiObj = { - userString: loggedInUserString, - UUID: loggedInUserUUID, - name: loggedInUserName, - }; - setGuidedDatasetPiOwner(loggedInUserPiObj); - } + //If the PI owner is empty, set the PI owner to the user that is currently curating + if (Object.keys(window.sodaJSONObj["digital-metadata"]["pi-owner"]).length === 0) { + //Get the user information of the user that is currently curating + const user = await api.getUserInformation(); + + const loggedInUserString = `${user["firstName"]} ${user["lastName"]} (${user["email"]})`; + const loggedInUserUUID = user["id"]; + const loggedInUserName = `${user["firstName"]} ${user["lastName"]}`; + const loggedInUserPiObj = { + userString: loggedInUserString, + UUID: loggedInUserUUID, + name: loggedInUserName, + }; + setGuidedDatasetPiOwner(loggedInUserPiObj); + } - renderPermissionsTable(); - guidedResetUserTeamPermissionsDropdowns(); + renderPermissionsTable(); + guidedResetUserTeamPermissionsDropdowns(); } } @@ -6963,7 +6963,7 @@ window.openPage = async (targetPageID) => { // Set the last opened page and save it window.sodaJSONObj["page-before-exit"] = targetPageID; - console.log("About to save progress") + console.log("About to save progress"); await guidedSaveProgress(); } catch (error) { const eMessage = userErrorMessage(error); @@ -13953,7 +13953,7 @@ const guidedCreateOrRenameDataset = async (bfAccount, datasetName) => { }; const guidedAddDatasetSubtitle = async (bfAccount, datasetName, datasetSubtitle) => { - let isGuest = await window.isWorkspaceGuest() + let isGuest = await window.isWorkspaceGuest(); if (isGuest) return; document.getElementById("guided-dataset-subtitle-upload-tr").classList.remove("hidden"); const datasetSubtitleUploadText = document.getElementById("guided-dataset-subtitle-upload-text"); @@ -14037,7 +14037,7 @@ const guidedAddDatasetDescription = async ( dataCollection, dataConclusion ) => { - let isGuest = await window.isWorkspaceGuest() + let isGuest = await window.isWorkspaceGuest(); if (isGuest) return; document.getElementById("guided-dataset-description-upload-tr").classList.remove("hidden"); const datasetDescriptionUploadText = document.getElementById( @@ -14118,7 +14118,7 @@ const guidedAddDatasetDescription = async ( }; const uploadValidBannerImage = async (bfAccount, datasetName, bannerImagePath) => { - let isGuest = await window.isWorkspaceGuest() + let isGuest = await window.isWorkspaceGuest(); if (isGuest) return; document.getElementById("guided-dataset-banner-image-upload-tr").classList.remove("hidden"); const datasetBannerImageUploadText = document.getElementById( @@ -14226,7 +14226,7 @@ const guidedAddDatasetBannerImage = async (bfAccount, datasetName, bannerImagePa await uploadValidBannerImage(bfAccount, datasetName, bannerImagePath); }; const guidedAddDatasetLicense = async (bfAccount, datasetName, datasetLicense) => { - let isGuest = await window.isWorkspaceGuest() + let isGuest = await window.isWorkspaceGuest(); if (isGuest) return; document.getElementById("guided-dataset-license-upload-tr").classList.remove("hidden"); const datasetLicenseUploadText = document.getElementById("guided-dataset-license-upload-text"); @@ -14303,7 +14303,7 @@ const guidedAddDatasetLicense = async (bfAccount, datasetName, datasetLicense) = }; const guidedAddDatasetTags = async (bfAccount, datasetName, tags) => { - let isGuest = await window.isWorkspaceGuest() + let isGuest = await window.isWorkspaceGuest(); if (isGuest) return; document.getElementById("guided-dataset-tags-upload-tr").classList.remove("hidden"); const datasetTagsUploadText = document.getElementById("guided-dataset-tags-upload-text"); From 9f307b33732d88c95b1c451532f325a961202158 Mon Sep 17 00:00:00 2001 From: aaronm-2112 Date: Thu, 5 Dec 2024 12:42:38 -0800 Subject: [PATCH 11/37] build: spawn windows builds form guest workaroun --- .github/workflows/Build-and-deploy-win.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Build-and-deploy-win.yml b/.github/workflows/Build-and-deploy-win.yml index 86181d1fe1..28297b92cc 100644 --- a/.github/workflows/Build-and-deploy-win.yml +++ b/.github/workflows/Build-and-deploy-win.yml @@ -7,7 +7,7 @@ on: - main - staging - pre-staging - - folder-build + - guest-contributor-fixes jobs: deploy-on-windows: From 08419f10c46304d20f6170db3f96ca9f5b11304b Mon Sep 17 00:00:00 2001 From: aaronm-2112 Date: Thu, 5 Dec 2024 12:43:17 -0800 Subject: [PATCH 12/37] build: spawn linux builds form guest workaroun --- .github/workflows/Build-and-deploy-linux.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Build-and-deploy-linux.yml b/.github/workflows/Build-and-deploy-linux.yml index 5383c1728d..7856223469 100644 --- a/.github/workflows/Build-and-deploy-linux.yml +++ b/.github/workflows/Build-and-deploy-linux.yml @@ -7,7 +7,7 @@ on: - main - staging - pre-staging - - folder-build + - guest-contributor-fixes jobs: deploy-on-linux: From 81709ee8922dc17cd2551bbd189979fb99c35a83 Mon Sep 17 00:00:00 2001 From: aaronm-2112 Date: Thu, 5 Dec 2024 14:53:55 -0800 Subject: [PATCH 13/37] refactor: guest can upload metadata if they are a manager --- .../guided-mode/guided-curate-dataset.js | 79 ++++++++++++++++--- src/renderer/src/scripts/others/api/api.js | 2 +- 2 files changed, 68 insertions(+), 13 deletions(-) diff --git a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js index 43bcb315c3..f8b4a682ce 100644 --- a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js +++ b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js @@ -425,8 +425,17 @@ document.getElementById("guided-button-has-docs-data").addEventListener("click", const checkIfChangesMetadataPageShouldBeShown = async (pennsieveDatasetID) => { // TODO: Brioader support for guests who are editing a changed dataset. - let isGuest = await window.isWorkspaceGuest(); - if (isGuest) return { shouldShow: false }; + // let isGuest = await window.isWorkspaceGuest(); + let existingDataset = window.sodaJSONObj?.["starting-point"]?.["type"] === "bf"; + let ineligible = false; + if(existingDataset) { + let role = await api.getDatasetRole(window.sodaJSONObj["bf-dataset-selected"]["dataset-name"]); + if(role === "editor") { + ineligible = true; + } + } + + if (ineligible) return { shouldShow: false }; try { const changesRes = await client.get(`/prepare_metadata/readme_changes_file`, { params: { @@ -697,6 +706,8 @@ const savePageChanges = async (pageBeingLeftID) => { window.defaultBfAccount, selectedPennsieveDataset ); + + console.log("datasetIsLocked", datasetIsLocked); if (datasetIsLocked) { errorArray.push({ type: "swal", @@ -13953,8 +13964,18 @@ const guidedCreateOrRenameDataset = async (bfAccount, datasetName) => { }; const guidedAddDatasetSubtitle = async (bfAccount, datasetName, datasetSubtitle) => { - let isGuest = await window.isWorkspaceGuest(); - if (isGuest) return; + let existingDataset = window.sodaJSONObj?.["starting-point"]?.["type"] === "bf"; + + let ineligible = false; + if(existingDataset) { + let role = await api.getDatasetRole(window.sodaJSONObj["bf-dataset-selected"]["dataset-name"]); + if(role === "editor") { + ineligible = true; + } + } + + if (ineligible) return + document.getElementById("guided-dataset-subtitle-upload-tr").classList.remove("hidden"); const datasetSubtitleUploadText = document.getElementById("guided-dataset-subtitle-upload-text"); datasetSubtitleUploadText.innerHTML = "Adding dataset subtitle..."; @@ -14037,8 +14058,17 @@ const guidedAddDatasetDescription = async ( dataCollection, dataConclusion ) => { - let isGuest = await window.isWorkspaceGuest(); - if (isGuest) return; + let existingDataset = window.sodaJSONObj?.["starting-point"]?.["type"] === "bf"; + + let ineligible = false; + if(existingDataset) { + let role = await api.getDatasetRole(window.sodaJSONObj["bf-dataset-selected"]["dataset-name"]); + if(role === "editor") { + ineligible = true; + } + } + + if (ineligible) return document.getElementById("guided-dataset-description-upload-tr").classList.remove("hidden"); const datasetDescriptionUploadText = document.getElementById( "guided-dataset-description-upload-text" @@ -14118,8 +14148,17 @@ const guidedAddDatasetDescription = async ( }; const uploadValidBannerImage = async (bfAccount, datasetName, bannerImagePath) => { - let isGuest = await window.isWorkspaceGuest(); - if (isGuest) return; + let existingDataset = window.sodaJSONObj?.["starting-point"]?.["type"] === "bf"; + + let ineligible = false; + if(existingDataset) { + let role = await api.getDatasetRole(window.sodaJSONObj["bf-dataset-selected"]["dataset-name"]); + if(role === "editor") { + ineligible = true; + } + } + + if (ineligible) return document.getElementById("guided-dataset-banner-image-upload-tr").classList.remove("hidden"); const datasetBannerImageUploadText = document.getElementById( "guided-dataset-banner-image-upload-text" @@ -14226,8 +14265,16 @@ const guidedAddDatasetBannerImage = async (bfAccount, datasetName, bannerImagePa await uploadValidBannerImage(bfAccount, datasetName, bannerImagePath); }; const guidedAddDatasetLicense = async (bfAccount, datasetName, datasetLicense) => { - let isGuest = await window.isWorkspaceGuest(); - if (isGuest) return; + let existingDataset = window.sodaJSONObj?.["starting-point"]?.["type"] === "bf"; + let ineligible = false; + if(existingDataset) { + let role = await api.getDatasetRole(window.sodaJSONObj["bf-dataset-selected"]["dataset-name"]); + if(role === "editor") { + ineligible = true; + } + } + + if (ineligible) return document.getElementById("guided-dataset-license-upload-tr").classList.remove("hidden"); const datasetLicenseUploadText = document.getElementById("guided-dataset-license-upload-text"); datasetLicenseUploadText.innerHTML = "Adding dataset license..."; @@ -14303,8 +14350,16 @@ const guidedAddDatasetLicense = async (bfAccount, datasetName, datasetLicense) = }; const guidedAddDatasetTags = async (bfAccount, datasetName, tags) => { - let isGuest = await window.isWorkspaceGuest(); - if (isGuest) return; + let existingDataset = window.sodaJSONObj?.["starting-point"]?.["type"] === "bf"; + let ineligible = false; + if(existingDataset) { + let role = await api.getDatasetRole(window.sodaJSONObj["bf-dataset-selected"]["dataset-name"]); + if(role === "editor") { + ineligible = true; + } + } + + if (ineligible) return document.getElementById("guided-dataset-tags-upload-tr").classList.remove("hidden"); const datasetTagsUploadText = document.getElementById("guided-dataset-tags-upload-text"); datasetTagsUploadText.innerHTML = "Adding dataset tags..."; diff --git a/src/renderer/src/scripts/others/api/api.js b/src/renderer/src/scripts/others/api/api.js index 5b971de49c..7a9acfde80 100644 --- a/src/renderer/src/scripts/others/api/api.js +++ b/src/renderer/src/scripts/others/api/api.js @@ -53,7 +53,7 @@ const isDatasetLocked = async (account, datasetNameOrId) => { ); teamsInCurrentUsersOrganization = teamsReq.data.teams; } catch (error) { - userErrorMessage(error); + clientError(error); } // Get the team with the name "Publishers" (if it exists) From 7b13c9c04eb185c931af44c581a411723fd3d366 Mon Sep 17 00:00:00 2001 From: fairdataihub-bot Date: Thu, 5 Dec 2024 22:55:01 +0000 Subject: [PATCH 14/37] =?UTF-8?q?style:=20=F0=9F=8E=A8=20fix=20code=20styl?= =?UTF-8?q?e=20issues=20with=20Prettier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../guided-mode/guided-curate-dataset.js | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js index f8b4a682ce..d377a4f2e1 100644 --- a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js +++ b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js @@ -428,11 +428,11 @@ const checkIfChangesMetadataPageShouldBeShown = async (pennsieveDatasetID) => { // let isGuest = await window.isWorkspaceGuest(); let existingDataset = window.sodaJSONObj?.["starting-point"]?.["type"] === "bf"; let ineligible = false; - if(existingDataset) { + if (existingDataset) { let role = await api.getDatasetRole(window.sodaJSONObj["bf-dataset-selected"]["dataset-name"]); - if(role === "editor") { + if (role === "editor") { ineligible = true; - } + } } if (ineligible) return { shouldShow: false }; @@ -13967,14 +13967,14 @@ const guidedAddDatasetSubtitle = async (bfAccount, datasetName, datasetSubtitle) let existingDataset = window.sodaJSONObj?.["starting-point"]?.["type"] === "bf"; let ineligible = false; - if(existingDataset) { + if (existingDataset) { let role = await api.getDatasetRole(window.sodaJSONObj["bf-dataset-selected"]["dataset-name"]); - if(role === "editor") { + if (role === "editor") { ineligible = true; - } + } } - if (ineligible) return + if (ineligible) return; document.getElementById("guided-dataset-subtitle-upload-tr").classList.remove("hidden"); const datasetSubtitleUploadText = document.getElementById("guided-dataset-subtitle-upload-text"); @@ -14061,14 +14061,14 @@ const guidedAddDatasetDescription = async ( let existingDataset = window.sodaJSONObj?.["starting-point"]?.["type"] === "bf"; let ineligible = false; - if(existingDataset) { + if (existingDataset) { let role = await api.getDatasetRole(window.sodaJSONObj["bf-dataset-selected"]["dataset-name"]); - if(role === "editor") { + if (role === "editor") { ineligible = true; - } + } } - if (ineligible) return + if (ineligible) return; document.getElementById("guided-dataset-description-upload-tr").classList.remove("hidden"); const datasetDescriptionUploadText = document.getElementById( "guided-dataset-description-upload-text" @@ -14151,14 +14151,14 @@ const uploadValidBannerImage = async (bfAccount, datasetName, bannerImagePath) = let existingDataset = window.sodaJSONObj?.["starting-point"]?.["type"] === "bf"; let ineligible = false; - if(existingDataset) { + if (existingDataset) { let role = await api.getDatasetRole(window.sodaJSONObj["bf-dataset-selected"]["dataset-name"]); - if(role === "editor") { + if (role === "editor") { ineligible = true; - } + } } - if (ineligible) return + if (ineligible) return; document.getElementById("guided-dataset-banner-image-upload-tr").classList.remove("hidden"); const datasetBannerImageUploadText = document.getElementById( "guided-dataset-banner-image-upload-text" @@ -14267,14 +14267,14 @@ const guidedAddDatasetBannerImage = async (bfAccount, datasetName, bannerImagePa const guidedAddDatasetLicense = async (bfAccount, datasetName, datasetLicense) => { let existingDataset = window.sodaJSONObj?.["starting-point"]?.["type"] === "bf"; let ineligible = false; - if(existingDataset) { + if (existingDataset) { let role = await api.getDatasetRole(window.sodaJSONObj["bf-dataset-selected"]["dataset-name"]); - if(role === "editor") { + if (role === "editor") { ineligible = true; - } + } } - if (ineligible) return + if (ineligible) return; document.getElementById("guided-dataset-license-upload-tr").classList.remove("hidden"); const datasetLicenseUploadText = document.getElementById("guided-dataset-license-upload-text"); datasetLicenseUploadText.innerHTML = "Adding dataset license..."; @@ -14352,14 +14352,14 @@ const guidedAddDatasetLicense = async (bfAccount, datasetName, datasetLicense) = const guidedAddDatasetTags = async (bfAccount, datasetName, tags) => { let existingDataset = window.sodaJSONObj?.["starting-point"]?.["type"] === "bf"; let ineligible = false; - if(existingDataset) { + if (existingDataset) { let role = await api.getDatasetRole(window.sodaJSONObj["bf-dataset-selected"]["dataset-name"]); - if(role === "editor") { + if (role === "editor") { ineligible = true; - } + } } - if (ineligible) return + if (ineligible) return; document.getElementById("guided-dataset-tags-upload-tr").classList.remove("hidden"); const datasetTagsUploadText = document.getElementById("guided-dataset-tags-upload-text"); datasetTagsUploadText.innerHTML = "Adding dataset tags..."; From 8c1da1a50b94acf4c40585c3cfc36109e0aee458 Mon Sep 17 00:00:00 2001 From: aaronm-2112 Date: Mon, 9 Dec 2024 12:34:10 -0800 Subject: [PATCH 15/37] refactor: use dataset id for import and metadata files --- src/pyflask/organizeDatasets/organize_datasets.py | 15 +++++++++------ .../scripts/guided-mode/guided-curate-dataset.js | 5 +++-- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/pyflask/organizeDatasets/organize_datasets.py b/src/pyflask/organizeDatasets/organize_datasets.py index 454cf2d939..24655365e6 100644 --- a/src/pyflask/organizeDatasets/organize_datasets.py +++ b/src/pyflask/organizeDatasets/organize_datasets.py @@ -1157,13 +1157,16 @@ def createFolderStructure(subfolder_json, manifest): # START start = timer() - # check that the Pennsieve dataset is valid - try: - bf_dataset_name = soda_json_structure["bf-dataset-selected"]["dataset-name"] - except Exception as e: - raise e + if "digital-metadata" in soda_json_structure and "pennsieve-dataset-id" in soda_json_structure["digital-metadata"]: + selected_dataset_id = soda_json_structure["digital-metadata"]["pennsieve-dataset-id"] + else: + # check that the Pennsieve dataset is valid + try: + bf_dataset_name = soda_json_structure["bf-dataset-selected"]["dataset-name"] + except Exception as e: + raise e - selected_dataset_id = get_dataset_id(bf_dataset_name) + selected_dataset_id = get_dataset_id(bf_dataset_name) # check that the user has permission to edit this dataset try: diff --git a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js index 4b16883c67..ac350c1efc 100644 --- a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js +++ b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js @@ -5838,7 +5838,7 @@ window.openPage = async (targetPageID) => { let metadata_import = await client.get(`/prepare_metadata/import_metadata_file`, { params: { selected_account: window.defaultBfAccount, - selected_dataset: window.sodaJSONObj["bf-dataset-selected"]["dataset-name"], + selected_dataset: window.sodaJSONObj["digital-metadata"]["pennsieve-dataset-id"], file_type: "dataset_description.xlsx", }, }); @@ -13428,7 +13428,8 @@ const handleMultipleSubSectionDisplay = async (controlledSectionID) => { { params: { selected_account: window.defaultBfAccount, - selected_dataset: window.sodaJSONObj["bf-dataset-selected"]["dataset-name"], + selected_dataset: + window.sodaJSONObj["bf-dataset-selected"]["pennsieve-dataset-id"], file_type: "dataset_description.xlsx", }, } From d49f1ae46915ba43fd1fc3937084408705fd4917 Mon Sep 17 00:00:00 2001 From: aaronm-2112 Date: Mon, 9 Dec 2024 13:38:08 -0800 Subject: [PATCH 16/37] feat: reconcile dataset name if diffs local vs remote --- .../src/scripts/guided-mode/guided-curate-dataset.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js index ad80592702..640401d2f6 100644 --- a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js +++ b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js @@ -5231,7 +5231,19 @@ window.openPage = async (targetPageID) => { if (pageNeedsUpdateFromPennsieve("guided-name-subtitle-tab")) { // Show the loading page while the page's data is being fetched from Pennsieve setPageLoadingState(true); + try { + // get the dataset name from Pennsieve + const datasetResponse = await api.getDatasetInformation( + window.defaultBfAccount, + window.sodaJSONObj["digital-metadata"]["pennsieve-dataset-id"] + ); + console.log(datasetResponse); + let datasetName = datasetResponse["content"]["name"]; + // Save the dataset name to the JSON and add it to the input + window.sodaJSONObj["digital-metadata"]["name"] = datasetName; + setGuidedDatasetName(datasetName); + //Try to get the dataset name from Pennsieve //If the request fails, the subtitle input will remain blank const datasetSubtitle = await api.getDatasetSubtitle( From 2cc724b00a017c924c4b1837c236f4db7ff8fdb6 Mon Sep 17 00:00:00 2001 From: aaronm-2112 Date: Tue, 10 Dec 2024 10:28:51 -0800 Subject: [PATCH 17/37] feat: skip permissions page if guest pulling pennsieve dataset --- .../src/scripts/guided-mode/guided-curate-dataset.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js index 640401d2f6..1b467feec0 100644 --- a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js +++ b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js @@ -981,6 +981,12 @@ const savePageChanges = async (pageBeingLeftID) => { window.sodaJSONObj["digital-metadata"]["dataset-workspace"] = guidedGetCurrentUserWorkSpace(); guidedSkipPage("guided-pennsieve-intro-tab"); + + // check if user is a guest in the worksapce + let guest = await window.isWorkspaceGuest(); + if (guest) { + guidedSkipPage("guided-designate-permissions-tab"); + } } //Skip this page becausae we should not come back to it From 821abf8c8f98420799608f49412c7c30241655e7 Mon Sep 17 00:00:00 2001 From: aaronm-2112 Date: Tue, 10 Dec 2024 12:26:50 -0800 Subject: [PATCH 18/37] feat: unskip permissions on resume if non-guest + remove old skip logic --- .../guided-mode/guided-curate-dataset.js | 280 +++++++++--------- 1 file changed, 142 insertions(+), 138 deletions(-) diff --git a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js index 1b467feec0..6a6a386c01 100644 --- a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js +++ b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js @@ -423,9 +423,6 @@ document.getElementById("guided-button-has-docs-data").addEventListener("click", }); const checkIfChangesMetadataPageShouldBeShown = async (pennsieveDatasetID) => { - // TODO: Brioader support for guests who are editing a changed dataset. - - // let isGuest = await window.isWorkspaceGuest(); let existingDataset = window.sodaJSONObj?.["starting-point"]?.["type"] === "bf"; let ineligible = false; if (existingDataset) { @@ -4417,6 +4414,7 @@ const guidedUnSkipPage = (pageId) => { const subPagesCapsule = `${pageId}-capsule`; document.getElementById(subPagesCapsule).classList.remove("hidden"); } + // remove the page from window.sodaJSONObj array if it is there if (window.sodaJSONObj["skipped-pages"].includes(pageId)) { window.sodaJSONObj["skipped-pages"].splice( @@ -6319,158 +6317,156 @@ window.openPage = async (targetPageID) => { if (targetPageID === "guided-designate-permissions-tab") { console.log("In permissions tab"); - let isGuest = await window.isWorkspaceGuest(); - if (!isGuest) { - // Get the users that can be granted permissions - const usersReq = await client.get( - `manage_datasets/ps_get_users?selected_account=${window.defaultBfAccount}` - ); - const usersThatCanBeGrantedPermissions = usersReq.data.users; - // Get the teams that can be granted permissions - // Note: This is in a try catch because guest accounts do not have access to the teams endpoint - // so the request will fail and teamsThatCanBeGrantedPermissions will remain an empty array - let teamsThatCanBeGrantedPermissions = []; - try { - const teamsReq = await client.get( - `manage_datasets/ps_get_teams?selected_account=${window.defaultBfAccount}` - ); - teamsThatCanBeGrantedPermissions = window.getSortedTeamStrings(teamsReq.data.teams); - } catch (error) { - const emessage = userErrorMessage(error); - } + // Get the users that can be granted permissions + const usersReq = await client.get( + `manage_datasets/ps_get_users?selected_account=${window.defaultBfAccount}` + ); + const usersThatCanBeGrantedPermissions = usersReq.data.users; - // Reset the dropdown with the new users and teams - guidedAddUsersAndTeamsToDropdown( - usersThatCanBeGrantedPermissions, - teamsThatCanBeGrantedPermissions + // Get the teams that can be granted permissions + // Note: This is in a try catch because guest accounts do not have access to the teams endpoint + // so the request will fail and teamsThatCanBeGrantedPermissions will remain an empty array + let teamsThatCanBeGrantedPermissions = []; + try { + const teamsReq = await client.get( + `manage_datasets/ps_get_teams?selected_account=${window.defaultBfAccount}` ); + teamsThatCanBeGrantedPermissions = window.getSortedTeamStrings(teamsReq.data.teams); + } catch (error) { + const emessage = userErrorMessage(error); + } - if (pageNeedsUpdateFromPennsieve("guided-designate-permissions-tab")) { - // Show the loading page while the page's data is being fetched from Pennsieve - setPageLoadingState(true); - try { - let sparcUsersDivided = []; + // Reset the dropdown with the new users and teams + guidedAddUsersAndTeamsToDropdown( + usersThatCanBeGrantedPermissions, + teamsThatCanBeGrantedPermissions + ); - //sparc users results needs to be formatted - usersThatCanBeGrantedPermissions.forEach((element) => { - //first two elements of this array will just be an email with no name - sparcUsersDivided.push(element.split(" !|**|!")); - }); + if (pageNeedsUpdateFromPennsieve("guided-designate-permissions-tab")) { + // Show the loading page while the page's data is being fetched from Pennsieve + setPageLoadingState(true); + try { + let sparcUsersDivided = []; - const permissions = await api.getDatasetPermissions( - window.defaultBfAccount, - window.sodaJSONObj["digital-metadata"]["pennsieve-dataset-id"], - false - ); + //sparc users results needs to be formatted + usersThatCanBeGrantedPermissions.forEach((element) => { + //first two elements of this array will just be an email with no name + sparcUsersDivided.push(element.split(" !|**|!")); + }); - //Filter out the integration user - const filteredPermissions = permissions.filter((permission) => { - return !permission.includes("Integration User"); - }); + const permissions = await api.getDatasetPermissions( + window.defaultBfAccount, + window.sodaJSONObj["digital-metadata"]["pennsieve-dataset-id"], + false + ); - let partialUserDetails = []; - let finalTeamPermissions = []; - let piOwner = []; - - //so check for PI owner as well - for (const userPermission of filteredPermissions) { - // Will include teams and users - let userRoleSplit = userPermission.split(","); - // Will look like: - // ['User: John Doe ', ' role: owner'] - // need to split above - let nameSplit = userRoleSplit[0].split(":"); // will appear as ['Team', ' DRC Team'] - let roleSplit = userRoleSplit[1].split(":"); // will appear as [' role', ' Viewer'] - let userName = nameSplit[1].trim(); - let userPermiss = roleSplit[1].trim(); - let teamOrUser = nameSplit[0].trim().toLowerCase(); - - if (teamOrUser === "team") { - finalTeamPermissions.push({ - UUID: userName, - permission: userPermiss, - teamString: userName, - permissionSource: "Pennsieve", - deleteFromPennsieve: false, - }); - } else { - partialUserDetails.push({ - permission: userPermiss, - userName: userName, - }); - } + //Filter out the integration user + const filteredPermissions = permissions.filter((permission) => { + return !permission.includes("Integration User"); + }); + + let partialUserDetails = []; + let finalTeamPermissions = []; + let piOwner = []; + + //so check for PI owner as well + for (const userPermission of filteredPermissions) { + // Will include teams and users + let userRoleSplit = userPermission.split(","); + // Will look like: + // ['User: John Doe ', ' role: owner'] + // need to split above + let nameSplit = userRoleSplit[0].split(":"); // will appear as ['Team', ' DRC Team'] + let roleSplit = userRoleSplit[1].split(":"); // will appear as [' role', ' Viewer'] + let userName = nameSplit[1].trim(); + let userPermiss = roleSplit[1].trim(); + let teamOrUser = nameSplit[0].trim().toLowerCase(); + + if (teamOrUser === "team") { + finalTeamPermissions.push({ + UUID: userName, + permission: userPermiss, + teamString: userName, + permissionSource: "Pennsieve", + deleteFromPennsieve: false, + }); + } else { + partialUserDetails.push({ + permission: userPermiss, + userName: userName, + }); } - // After loop use the array of objects to find the UUID and email - let finalUserPermissions = []; - - partialUserDetails.map((object) => { - sparcUsersDivided.forEach((element) => { - if (element[0].includes(object["userName"])) { - // name was found now get UUID - let userEmailSplit = element[0].split(" ("); - if (object["permission"] === "owner") { - //set for pi owner - piOwner.push({ - UUID: object.permission, - name: userEmailSplit[0], - userString: element[0], - permissionSource: "Pennsieve", - deleteFromPennsieve: false, - }); - //update PI owner key - } else { - finalUserPermissions.push({ - UUID: element[1], - permission: object.permission, - userName: userEmailSplit[0], - userString: element[0], - permissonSource: "Pennsieve", - deleteFromPennsieve: false, - }); - } + } + // After loop use the array of objects to find the UUID and email + let finalUserPermissions = []; + + partialUserDetails.map((object) => { + sparcUsersDivided.forEach((element) => { + if (element[0].includes(object["userName"])) { + // name was found now get UUID + let userEmailSplit = element[0].split(" ("); + if (object["permission"] === "owner") { + //set for pi owner + piOwner.push({ + UUID: object.permission, + name: userEmailSplit[0], + userString: element[0], + permissionSource: "Pennsieve", + deleteFromPennsieve: false, + }); + //update PI owner key + } else { + finalUserPermissions.push({ + UUID: element[1], + permission: object.permission, + userName: userEmailSplit[0], + userString: element[0], + permissonSource: "Pennsieve", + deleteFromPennsieve: false, + }); } - }); + } }); + }); - window.sodaJSONObj["digital-metadata"]["team-permissions"] = finalTeamPermissions; - window.sodaJSONObj["digital-metadata"]["user-permissions"] = finalUserPermissions; - window.sodaJSONObj["digital-metadata"]["pi-owner"] = piOwner[0]; + window.sodaJSONObj["digital-metadata"]["team-permissions"] = finalTeamPermissions; + window.sodaJSONObj["digital-metadata"]["user-permissions"] = finalUserPermissions; + window.sodaJSONObj["digital-metadata"]["pi-owner"] = piOwner[0]; - window.sodaJSONObj["pages-fetched-from-pennsieve"].push( - "guided-designate-permissions-tab" - ); - } catch (error) { - clientError(error); - const emessage = error.response.data.message; - await guidedShowOptionalRetrySwal(emessage, "guided-designate-permissions-tab"); - // If the user chooses not to retry re-fetching the page data, mark the page as fetched - // so the the fetch does not occur again - window.sodaJSONObj["pages-fetched-from-pennsieve"].push( - "guided-designate-permissions-tab" - ); - } + window.sodaJSONObj["pages-fetched-from-pennsieve"].push( + "guided-designate-permissions-tab" + ); + } catch (error) { + clientError(error); + const emessage = error.response.data.message; + await guidedShowOptionalRetrySwal(emessage, "guided-designate-permissions-tab"); + // If the user chooses not to retry re-fetching the page data, mark the page as fetched + // so the the fetch does not occur again + window.sodaJSONObj["pages-fetched-from-pennsieve"].push( + "guided-designate-permissions-tab" + ); } + } - //If the PI owner is empty, set the PI owner to the user that is currently curating - if (Object.keys(window.sodaJSONObj["digital-metadata"]["pi-owner"]).length === 0) { - //Get the user information of the user that is currently curating - const user = await api.getUserInformation(); - - const loggedInUserString = `${user["firstName"]} ${user["lastName"]} (${user["email"]})`; - const loggedInUserUUID = user["id"]; - const loggedInUserName = `${user["firstName"]} ${user["lastName"]}`; - const loggedInUserPiObj = { - userString: loggedInUserString, - UUID: loggedInUserUUID, - name: loggedInUserName, - }; - setGuidedDatasetPiOwner(loggedInUserPiObj); - } + //If the PI owner is empty, set the PI owner to the user that is currently curating + if (Object.keys(window.sodaJSONObj["digital-metadata"]["pi-owner"]).length === 0) { + //Get the user information of the user that is currently curating + const user = await api.getUserInformation(); - renderPermissionsTable(); - guidedResetUserTeamPermissionsDropdowns(); + const loggedInUserString = `${user["firstName"]} ${user["lastName"]} (${user["email"]})`; + const loggedInUserUUID = user["id"]; + const loggedInUserName = `${user["firstName"]} ${user["lastName"]}`; + const loggedInUserPiObj = { + userString: loggedInUserString, + UUID: loggedInUserUUID, + name: loggedInUserName, + }; + setGuidedDatasetPiOwner(loggedInUserPiObj); } + + renderPermissionsTable(); + guidedResetUserTeamPermissionsDropdowns(); } if (targetPageID === "guided-assign-license-tab") { @@ -7968,8 +7964,11 @@ window.guidedResumeProgress = async (datasetNameToResume) => { } if (!datasetHasAlreadyBeenSuccessfullyUploaded) { + console.log("DOing this resume logic"); // If the dataset is being edited on Pensieve, check to make sure the folders and files are still the same. if (datasetResumeJsonObj["starting-point"]?.["type"] === "bf") { + console.log("DOing this resume logic inner"); + // Check to make sure the dataset is not locked const datasetIsLocked = await api.isDatasetLocked( window.defaultBfAccount, @@ -8049,6 +8048,11 @@ window.guidedResumeProgress = async (datasetNameToResume) => { guidedSkipPage(pageID); } + let guest = await window.isWorkspaceGuest(); + if (!guest) { + guidedUnSkipPage("guided-designate-permissions-tab"); + } + // Skip this page incase it was not skipped in a previous session guidedSkipPage("guided-select-starting-point-tab"); From 436b58e01bd9e272f79d312e476c57df76f3f18b Mon Sep 17 00:00:00 2001 From: aaronm-2112 Date: Fri, 13 Dec 2024 09:34:53 -0800 Subject: [PATCH 19/37] chore: spawn new builds --- package.json | 2 +- src/pyflask/startup/minimumApiVersion.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 4612e1c4ff..a450fd44f4 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "soda-for-sparc", "procductName": "SODA for SPARC", - "version": "15.2.4-beta", + "version": "15.3.0-beta", "description": "Keep Calm and Curate", "main": "./out/main/index.js", "author": "SODA Team", diff --git a/src/pyflask/startup/minimumApiVersion.py b/src/pyflask/startup/minimumApiVersion.py index ff271d0e4f..2ce46b352b 100644 --- a/src/pyflask/startup/minimumApiVersion.py +++ b/src/pyflask/startup/minimumApiVersion.py @@ -8,7 +8,7 @@ def get_api_version(): """ - return {'version': os.getenv('API_VERSION', "15.2.4-beta")} + return {'version': os.getenv('API_VERSION', "15.3.0-beta")} From 8cc537d14e032509b8e5cee0b014d27b4c4feab3 Mon Sep 17 00:00:00 2001 From: aaronm-2112 Date: Fri, 13 Dec 2024 11:16:05 -0800 Subject: [PATCH 20/37] fix: if resuming as guest and next page permissions save code doesnt skip permissions page --- src/renderer/src/scripts/guided-mode/guided-curate-dataset.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js index 6a6a386c01..1020854f21 100644 --- a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js +++ b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js @@ -8051,6 +8051,8 @@ window.guidedResumeProgress = async (datasetNameToResume) => { let guest = await window.isWorkspaceGuest(); if (!guest) { guidedUnSkipPage("guided-designate-permissions-tab"); + } else { + guidedSkipPage("guided-designate-permissions-tab"); } // Skip this page incase it was not skipped in a previous session From fa5422d9b0f0c7bda350dcd9777fdb9c7eec6844 Mon Sep 17 00:00:00 2001 From: aaronm-2112 Date: Fri, 13 Dec 2024 12:15:43 -0800 Subject: [PATCH 21/37] fix: main user sets permissions then guest takes over their upload fails --- .../src/scripts/guided-mode/guided-curate-dataset.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js index 1020854f21..a1a687f937 100644 --- a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js +++ b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js @@ -15609,6 +15609,8 @@ const guidedPennsieveDatasetUpload = async () => { "guided-div-pennsieve-metadata-pennsieve-genration-status-table" ); + let guest = await window.isWorkspaceGuest(); + // Create the dataset on Pennsieve await guidedCreateOrRenameDataset(guidedBfAccount, guidedDatasetName); @@ -15623,8 +15625,10 @@ const guidedPennsieveDatasetUpload = async () => { await guidedAddDatasetBannerImage(guidedBfAccount, guidedDatasetName, guidedBannerImagePath); await guidedAddDatasetLicense(guidedBfAccount, guidedDatasetName, guidedLicense); await guidedAddDatasetTags(guidedBfAccount, guidedDatasetName, guidedTags); - await guidedAddUserPermissions(guidedBfAccount, guidedDatasetName, guidedUsers); - await guidedAddTeamPermissions(guidedBfAccount, guidedDatasetName, guidedTeams); + if (!guest) { + await guidedAddUserPermissions(guidedBfAccount, guidedDatasetName, guidedUsers); + await guidedAddTeamPermissions(guidedBfAccount, guidedDatasetName, guidedTeams); + } hideDatasetMetadataGenerationTableRows("pennsieve"); From 8dd6b5c8bcf74a6ebc850f960278e5fe1355c7f0 Mon Sep 17 00:00:00 2001 From: aaronm-2112 Date: Mon, 16 Dec 2024 09:29:11 -0800 Subject: [PATCH 22/37] wip: skip pennsieve metadata for editors --- .../guided-mode/guided-curate-dataset.js | 68 ++++++++++++------- 1 file changed, 45 insertions(+), 23 deletions(-) diff --git a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js index a1a687f937..90e8964b7a 100644 --- a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js +++ b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js @@ -8055,6 +8055,23 @@ window.guidedResumeProgress = async (datasetNameToResume) => { guidedSkipPage("guided-designate-permissions-tab"); } + // check if the user is an editor + let userDatasetRole = await api.getDatasetRole( + window.sodaJSONObj["bf-dataset-selected"]["dataset-name"] + ); + + if (userDatasetRole === "editor") { + guidedSkipPage("guided-banner-image-tab"); + guidedSkipPage("guided-designate-permissions-tab"); + guidedSkipPage("guided-assign-license-tab"); + } else { + guidedUnSkipPage("guided-banner-image-tab"); + if (!guest) { + guidedUnSkipPage("guided-designate-permissions-tab"); + } + guidedUnSkipPage("guided-assign-license-tab"); + } + // Skip this page incase it was not skipped in a previous session guidedSkipPage("guided-select-starting-point-tab"); @@ -13989,18 +14006,6 @@ const guidedCreateOrRenameDataset = async (bfAccount, datasetName) => { }; const guidedAddDatasetSubtitle = async (bfAccount, datasetName, datasetSubtitle) => { - let existingDataset = window.sodaJSONObj?.["starting-point"]?.["type"] === "bf"; - - let ineligible = false; - if (existingDataset) { - let role = await api.getDatasetRole(window.sodaJSONObj["bf-dataset-selected"]["dataset-name"]); - if (role === "editor") { - ineligible = true; - } - } - - if (ineligible) return; - document.getElementById("guided-dataset-subtitle-upload-tr").classList.remove("hidden"); const datasetSubtitleUploadText = document.getElementById("guided-dataset-subtitle-upload-text"); datasetSubtitleUploadText.innerHTML = "Adding dataset subtitle..."; @@ -15565,6 +15570,32 @@ const hideDatasetMetadataGenerationTableRows = (destination) => { } }; +const editPennsieveMetadata = async () => { + let editingExistingDataset = window.sodaJSONObj?.["starting-point"]?.["type"] === "bf"; + let userDatasetRole = undefined; + if (editingExistingDataset) { + userDatasetRole = await api.getDatasetRole( + window.sodaJSONObj["bf-dataset-selected"]["dataset-name"] + ); + } + + if (userDatasetRole === "editor" || userDatasetRole === "viewer") { + return; + } + + await guidedAddDatasetSubtitle(guidedBfAccount, guidedDatasetName, guidedDatasetSubtitle); + await guidedAddDatasetDescription( + guidedBfAccount, + guidedDatasetName, + guidedPennsieveStudyPurpose, + guidedPennsieveDataCollection, + guidedPennsievePrimaryConclusion + ); + await guidedAddDatasetBannerImage(guidedBfAccount, guidedDatasetName, guidedBannerImagePath); + await guidedAddDatasetLicense(guidedBfAccount, guidedDatasetName, guidedLicense); + await guidedAddDatasetTags(guidedBfAccount, guidedDatasetName, guidedTags); +}; + const guidedPennsieveDatasetUpload = async () => { guidedSetNavLoadingState(true); try { @@ -15609,22 +15640,13 @@ const guidedPennsieveDatasetUpload = async () => { "guided-div-pennsieve-metadata-pennsieve-genration-status-table" ); + await editPennsieveMetadata(); + let guest = await window.isWorkspaceGuest(); // Create the dataset on Pennsieve await guidedCreateOrRenameDataset(guidedBfAccount, guidedDatasetName); - await guidedAddDatasetSubtitle(guidedBfAccount, guidedDatasetName, guidedDatasetSubtitle); - await guidedAddDatasetDescription( - guidedBfAccount, - guidedDatasetName, - guidedPennsieveStudyPurpose, - guidedPennsieveDataCollection, - guidedPennsievePrimaryConclusion - ); - await guidedAddDatasetBannerImage(guidedBfAccount, guidedDatasetName, guidedBannerImagePath); - await guidedAddDatasetLicense(guidedBfAccount, guidedDatasetName, guidedLicense); - await guidedAddDatasetTags(guidedBfAccount, guidedDatasetName, guidedTags); if (!guest) { await guidedAddUserPermissions(guidedBfAccount, guidedDatasetName, guidedUsers); await guidedAddTeamPermissions(guidedBfAccount, guidedDatasetName, guidedTeams); From bb71fcaec6b0af7b3dfa19d64f5b4ae28cd38c74 Mon Sep 17 00:00:00 2001 From: aaronm-2112 Date: Mon, 16 Dec 2024 10:13:06 -0800 Subject: [PATCH 23/37] refactor: remove redundnact guest check logic --- .../guided-mode/guided-curate-dataset.js | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js index 90e8964b7a..259cbd36af 100644 --- a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js +++ b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js @@ -8048,13 +8048,6 @@ window.guidedResumeProgress = async (datasetNameToResume) => { guidedSkipPage(pageID); } - let guest = await window.isWorkspaceGuest(); - if (!guest) { - guidedUnSkipPage("guided-designate-permissions-tab"); - } else { - guidedSkipPage("guided-designate-permissions-tab"); - } - // check if the user is an editor let userDatasetRole = await api.getDatasetRole( window.sodaJSONObj["bf-dataset-selected"]["dataset-name"] @@ -8066,12 +8059,17 @@ window.guidedResumeProgress = async (datasetNameToResume) => { guidedSkipPage("guided-assign-license-tab"); } else { guidedUnSkipPage("guided-banner-image-tab"); - if (!guest) { - guidedUnSkipPage("guided-designate-permissions-tab"); - } + guidedUnSkipPage("guided-designate-permissions-tab"); guidedUnSkipPage("guided-assign-license-tab"); } + let guest = await window.isWorkspaceGuest(); + if (!guest) { + guidedUnSkipPage("guided-designate-permissions-tab"); + } else { + guidedSkipPage("guided-designate-permissions-tab"); + } + // Skip this page incase it was not skipped in a previous session guidedSkipPage("guided-select-starting-point-tab"); From b80dd429d5eef9448f2ba1e98a003937711dc844 Mon Sep 17 00:00:00 2001 From: aaronm-2112 Date: Mon, 16 Dec 2024 12:40:25 -0800 Subject: [PATCH 24/37] refactor: check if PS acct before guest check + move editor to pennsieve ds flow --- .../guided-mode/guided-curate-dataset.js | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js index 259cbd36af..42f3a4b31b 100644 --- a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js +++ b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js @@ -7983,6 +7983,21 @@ window.guidedResumeProgress = async (datasetNameToResume) => { `); } + // check if the user is an editor + let userDatasetRole = await api.getDatasetRole( + window.sodaJSONObj["digital-metadata"]["name"] + ); + + if (userDatasetRole === "editor") { + guidedSkipPage("guided-banner-image-tab"); + guidedSkipPage("guided-designate-permissions-tab"); + guidedSkipPage("guided-assign-license-tab"); + } else { + guidedUnSkipPage("guided-banner-image-tab"); + guidedUnSkipPage("guided-designate-permissions-tab"); + guidedUnSkipPage("guided-assign-license-tab"); + } + if (Object.keys(datasetResumeJsonObj["previously-uploaded-data"]).length > 0) { await Swal.fire({ icon: "info", @@ -8048,26 +8063,13 @@ window.guidedResumeProgress = async (datasetNameToResume) => { guidedSkipPage(pageID); } - // check if the user is an editor - let userDatasetRole = await api.getDatasetRole( - window.sodaJSONObj["bf-dataset-selected"]["dataset-name"] - ); - - if (userDatasetRole === "editor") { - guidedSkipPage("guided-banner-image-tab"); - guidedSkipPage("guided-designate-permissions-tab"); - guidedSkipPage("guided-assign-license-tab"); - } else { - guidedUnSkipPage("guided-banner-image-tab"); - guidedUnSkipPage("guided-designate-permissions-tab"); - guidedUnSkipPage("guided-assign-license-tab"); - } - - let guest = await window.isWorkspaceGuest(); - if (!guest) { - guidedUnSkipPage("guided-designate-permissions-tab"); - } else { - guidedSkipPage("guided-designate-permissions-tab"); + if (hasConnectedAccountWithPennsieve()) { + let guest = await window.isWorkspaceGuest(); + if (!guest) { + guidedUnSkipPage("guided-designate-permissions-tab"); + } else { + guidedSkipPage("guided-designate-permissions-tab"); + } } // Skip this page incase it was not skipped in a previous session From 11e7b33d1e665a66c636feeeea68ccfda62582b0 Mon Sep 17 00:00:00 2001 From: JacobiClark Date: Mon, 16 Dec 2024 15:08:12 -0800 Subject: [PATCH 25/37] wip: Move logic for banner image page --- .../guided-mode/guided-curate-dataset.js | 29 +- .../guided_mode/guided_curate_dataset.html | 271 ++++++++---------- 2 files changed, 149 insertions(+), 151 deletions(-) diff --git a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js index 42f3a4b31b..61e3e9c799 100644 --- a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js +++ b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js @@ -6205,6 +6205,16 @@ window.openPage = async (targetPageID) => { } if (targetPageID === "guided-banner-image-tab") { + // If the user does not have manage permissions, they cannot edit a banner image + if (window.sodaJSONObj?.["starting-point"]?.["type"] === "bf") { + const loggedInUsersRole = await api.getDatasetRole( + window.sodaJSONObj["digital-metadata"]["name"] + ); + console.log("logged in user role: ", loggedInUsersRole); + if (loggedInUsersRole === "editor") { + } + } + if (pageNeedsUpdateFromPennsieve("guided-banner-image-tab")) { // Show the loading page while the page's data is being fetched from Pennsieve setPageLoadingState(true); @@ -7982,11 +7992,18 @@ window.guidedResumeProgress = async (datasetNameToResume) => { If you would like to make changes to this dataset, please reach out to the SPARC curation team at curation@sparc.science. `); } - - // check if the user is an editor - let userDatasetRole = await api.getDatasetRole( - window.sodaJSONObj["digital-metadata"]["name"] - ); + let userDatasetRole; + try { + // check if the user is an editor + userDatasetRole = await api.getDatasetRole( + window.sodaJSONObj["digital-metadata"]["name"] + ); + } catch (error) { + console.error(error); + throw new Error( + `An error occurred while trying to check if you have the correct permissions to edit this dataset. Please try again later.` + ); + } if (userDatasetRole === "editor") { guidedSkipPage("guided-banner-image-tab"); @@ -8044,6 +8061,8 @@ window.guidedResumeProgress = async (datasetNameToResume) => { } } } + + console.log("here"); window.sodaJSONObj = datasetResumeJsonObj; attachGuidedMethodsToSodaJSONObj(); diff --git a/src/renderer/src/sections/guided_mode/guided_curate_dataset.html b/src/renderer/src/sections/guided_mode/guided_curate_dataset.html index 7ddb660208..89a752e287 100644 --- a/src/renderer/src/sections/guided_mode/guided_curate_dataset.html +++ b/src/renderer/src/sections/guided_mode/guided_curate_dataset.html @@ -4806,164 +4806,143 @@

Banner image

>
- - -