From d1cf396cb2afd3adee8e26110f2e818933438eef Mon Sep 17 00:00:00 2001 From: aaronm-2112 Date: Tue, 11 Feb 2025 15:42:50 -0800 Subject: [PATCH] chore: move guided mode generate code to separate script --- src/renderer/src/main.js | 2 + .../treePreview.js | 266 ++ .../guided-mode/generateDataset/generate.js | 2156 ++++++++++++ .../generateDataset/uploadProgressBar.js | 39 + .../guided-mode/guided-curate-dataset.js | 3020 ++--------------- .../scripts/guided-mode/manifests/manifest.js | 34 + .../pages/generateDataset/openPage.js | 97 + .../pages/generateDataset/pageActions.js | 99 + .../pages/generateDataset/savePage.js | 0 .../src/scripts/guided-mode/pages/navigate.js | 7 +- .../src/scripts/guided-mode/pages/openPage.js | 96 - .../scripts/guided-mode/pages/pageSkipping.js | 4 + .../src/scripts/guided-mode/pennsieveUtils.js | 44 +- .../scripts/guided-mode/utils/sodaJSONObj.js | 35 + .../guided-mode/workspaces/workspaces.js | 13 + 15 files changed, 2970 insertions(+), 2942 deletions(-) create mode 100644 src/renderer/src/scripts/guided-mode/datasetStructureTreePreview/treePreview.js create mode 100644 src/renderer/src/scripts/guided-mode/generateDataset/generate.js create mode 100644 src/renderer/src/scripts/guided-mode/generateDataset/uploadProgressBar.js create mode 100644 src/renderer/src/scripts/guided-mode/manifests/manifest.js create mode 100644 src/renderer/src/scripts/guided-mode/pages/generateDataset/openPage.js create mode 100644 src/renderer/src/scripts/guided-mode/pages/generateDataset/pageActions.js create mode 100644 src/renderer/src/scripts/guided-mode/pages/generateDataset/savePage.js create mode 100644 src/renderer/src/scripts/guided-mode/utils/sodaJSONObj.js create mode 100644 src/renderer/src/scripts/guided-mode/workspaces/workspaces.js diff --git a/src/renderer/src/main.js b/src/renderer/src/main.js index a59d39390..aeb1c3266 100644 --- a/src/renderer/src/main.js +++ b/src/renderer/src/main.js @@ -10,9 +10,11 @@ import "./scripts/globals"; import "./scripts/guided-mode/buttons/radioButtons"; import "./scripts/guided-mode/pages/pageLoading"; import "./scripts/guided-mode/pages/curationPreparation/openPage"; +import "./scripts/guided-mode/pages/generateDataset/openPage"; import "./scripts/guided-mode/pages/openPage"; import "./scripts/guided-mode/guided-curate-dataset"; import "./scripts/guided-mode/pages/navigate"; +import "./scripts/guided-mode/generateDataset/generate"; import "./scripts/others/renderer"; import "./scripts/metadata-files/submission"; import "./scripts/manage-dataset/manage-dataset"; diff --git a/src/renderer/src/scripts/guided-mode/datasetStructureTreePreview/treePreview.js b/src/renderer/src/scripts/guided-mode/datasetStructureTreePreview/treePreview.js new file mode 100644 index 000000000..42d233657 --- /dev/null +++ b/src/renderer/src/scripts/guided-mode/datasetStructureTreePreview/treePreview.js @@ -0,0 +1,266 @@ +import fileTxt from "/img/txt-file.png"; +import filePng from "/img/png-file.png"; +import filePdf from "/img/pdf-file.png"; +import fileCsv from "/img/csv-file.png"; +import fileDoc from "/img/doc-file.png"; +import fileXlsx from "/img/excel-file.png"; +import fileJpeg from "/img/jpeg-file.png"; +import fileOther from "/img/other-file.png"; +import "jstree"; + +while (!window.baseHtmlLoaded) { + await new Promise((resolve) => setTimeout(resolve, 100)); +} + +let guidedJstreePreview = document.getElementById("guided-div-dataset-tree-preview"); + +$(guidedJstreePreview).jstree({ + core: { + check_callback: true, + data: {}, + }, + plugins: ["types", "sort"], + sort: function (a, b) { + let a1 = this.get_node(a); + let b1 = this.get_node(b); + + if (a1.icon == b1.icon || (a1.icon.includes("assets") && b1.icon.includes("assets"))) { + //if the word assets is included in the icon then we can assume it is a file + //folder icons are under font awesome meanwhile files come from the assets folder + return a1.text > b1.text ? 1 : -1; + } else { + return a1.icon < b1.icon ? 1 : -1; + } + }, + types: { + folder: { + icon: "fas fa-folder fa-fw", + }, + "folder open": { + icon: "fas fa-folder-open fa-fw", + }, + "folder closed": { + icon: "fas fa-folder fa-fw", + }, + "file xlsx": { + icon: fileXlsx, + }, + "file xls": { + icon: fileXlsx, + }, + "file png": { + icon: filePng, + }, + "file PNG": { + icon: filePng, + }, + "file pdf": { + icon: filePdf, + }, + "file txt": { + icon: fileTxt, + }, + "file csv": { + icon: fileCsv, + }, + "file CSV": { + icon: fileCsv, + }, + "file DOC": { + icon: fileDoc, + }, + "file DOCX": { + icon: fileDoc, + }, + "file docx": { + icon: fileDoc, + }, + "file doc": { + icon: fileDoc, + }, + "file jpeg": { + icon: fileJpeg, + }, + "file JPEG": { + icon: fileJpeg, + }, + "file other": { + icon: fileOther, + }, + }, +}); + +$(guidedJstreePreview).on("open_node.jstree", function (event, data) { + data.instance.set_type(data.node, "folder open"); +}); +$(guidedJstreePreview).on("close_node.jstree", function (event, data) { + data.instance.set_type(data.node, "folder closed"); +}); + +export const guidedShowTreePreview = (new_dataset_name, targetElementId) => { + const folderStructurePreview = document.getElementById(targetElementId); + $(folderStructurePreview).jstree({ + core: { + check_callback: true, + data: {}, + }, + plugins: ["types", "sort"], + sort: function (a, b) { + let a1 = this.get_node(a); + let b1 = this.get_node(b); + + if (a1.icon == b1.icon || (a1.icon.includes("assets") && b1.icon.includes("assets"))) { + //if the word assets is included in the icon then we can assume it is a file + //folder icons are under font awesome meanwhile files come from the assets folder + return a1.text > b1.text ? 1 : -1; + } else { + return a1.icon < b1.icon ? 1 : -1; + } + }, + types: { + folder: { + icon: "fas fa-folder fa-fw", + }, + "folder open": { + icon: "fas fa-folder-open fa-fw", + }, + "folder closed": { + icon: "fas fa-folder fa-fw", + }, + "file xlsx": { + icon: fileXlsx, + }, + "file xls": { + icon: fileXlsx, + }, + "file png": { + icon: filePng, + }, + "file PNG": { + icon: filePng, + }, + "file pdf": { + icon: filePdf, + }, + "file txt": { + icon: fileTxt, + }, + "file csv": { + icon: fileCsv, + }, + "file CSV": { + icon: fileCsv, + }, + "file DOC": { + icon: fileDoc, + }, + "file DOCX": { + icon: fileDoc, + }, + "file docx": { + icon: fileDoc, + }, + "file doc": { + icon: fileDoc, + }, + "file jpeg": { + icon: fileJpeg, + }, + "file JPEG": { + icon: fileJpeg, + }, + "file other": { + icon: fileOther, + }, + }, + }); + $(folderStructurePreview).on("open_node.jstree", function (event, data) { + data.instance.set_type(data.node, "folder open"); + }); + $(folderStructurePreview).on("close_node.jstree", function (event, data) { + data.instance.set_type(data.node, "folder closed"); + }); + const dsJsonObjCopy = JSON.parse(JSON.stringify(window.datasetStructureJSONObj)); + + //Add the code_description metadata file to the preview if the code_description path has been declared + if (window.sodaJSONObj["dataset-metadata"]["code-metadata"]["code_description"]) { + dsJsonObjCopy["files"]["code_description.xlsx"] = { + action: ["new"], + path: "", + type: "local", + }; + } + + //Add the dataset_description metadata file to the preview if the dataset_description page has been completed + if (window.sodaJSONObj["completed-tabs"].includes("guided-create-description-metadata-tab")) { + dsJsonObjCopy["files"]["dataset_description.xlsx"] = { + action: ["new"], + path: "", + type: "local", + }; + } + + //Add the manifest files that have been created to the preview + for (const manifestFileKey of Object.keys(window.sodaJSONObj["guided-manifest-file-data"])) { + const hlfStillExistsForManifestFile = Object.keys(dsJsonObjCopy["folders"]).includes( + manifestFileKey + ); + if (hlfStillExistsForManifestFile) { + dsJsonObjCopy["folders"][manifestFileKey]["files"]["manifest.xlsx"] = { + action: ["new"], + path: "", + type: "local", + }; + } + } + + //Add the Readme file to the preview if it exists in JSON + if (window.sodaJSONObj["dataset-metadata"]["README"]) { + dsJsonObjCopy["files"]["README.txt"] = { + action: ["new"], + path: "", + type: "local", + }; + } + + //Add the Samples metadata file to the preview if at least one sample has been added + if (window.samplesTableData.length > 0) { + dsJsonObjCopy["files"]["samples.xlsx"] = { + action: ["new"], + path: "", + type: "local", + }; + } + + //Add the Subjects metadata file to the preview if at least one subject has been added + if (window.subjectsTableData.length > 0) { + dsJsonObjCopy["files"]["subjects.xlsx"] = { + action: ["new"], + path: "", + type: "local", + }; + } + + //Add the submission metadata file to the preview if the submission metadata page has been completed + if (window.sodaJSONObj["completed-tabs"].includes("guided-create-submission-metadata-tab")) { + dsJsonObjCopy["files"]["submission.xlsx"] = { + action: ["new"], + path: "", + type: "local", + }; + } + + const guidedJsTreePreviewData = window.create_child_node( + dsJsonObjCopy, + new_dataset_name, + "folder", + "", + new_dataset_name, + false, + false, + "", + "preview" + ); + $(folderStructurePreview).jstree(true).settings.core.data = guidedJsTreePreviewData; + $(folderStructurePreview).jstree(true).refresh(); +}; diff --git a/src/renderer/src/scripts/guided-mode/generateDataset/generate.js b/src/renderer/src/scripts/guided-mode/generateDataset/generate.js new file mode 100644 index 000000000..7306b532d --- /dev/null +++ b/src/renderer/src/scripts/guided-mode/generateDataset/generate.js @@ -0,0 +1,2156 @@ +import { setGuidedProgressBarValue, updateDatasetUploadProgressTable } from "./uploadProgressBar"; +import { guidedCreateManifestFilesAndAddToDatasetStructure } from "../manifests/manifest"; +import { guidedSetNavLoadingState } from "../pages/pageLoading"; +import { clientError, userErrorMessage } from "../../others/http-error-handler/error-handler"; +import { guidedTransitionToHome, scrollToBottomOfGuidedBody } from "../pages/navigate"; +import { savePageChanges, guidedSaveProgress } from "../pages/savePageChanges"; +import client from "../../client"; +import { checkIfDatasetExistsOnPennsieve } from "../pennsieveUtils"; +import { successCheck, errorMark } from "../../../assets/lotties/lotties"; +import { + guidedGetDatasetName, + guidedGetDatasetId, + datasetIsSparcFunded, + guidedGetDatasetOrigin, +} from "../utils/sodaJSONObj"; +import datasetUploadSession from "../../analytics/upload-session-tracker"; +import { pageIsSkipped } from "../pages/pageSkipping"; +import kombuchaEnums from "../../analytics/analytics-enums"; +import Swal from "sweetalert2"; +import lottie from "lottie-web"; + +while (!window.baseHtmlLoaded) { + await new Promise((resolve) => setTimeout(resolve, 100)); +} + +/** + * + * @returns {Promise} + * @description This function is called when the user clicks the "Generate Dataset" button in the guided mode. It will create the dataset on Pennsieve and upload the dataset files. + */ +export const guidedPennsieveDatasetUpload = async () => { + guidedSetNavLoadingState(true); + try { + const guidedBfAccount = window.defaultBfAccount; + const guidedDatasetName = window.sodaJSONObj["digital-metadata"]["name"]; + const guidedDatasetSubtitle = window.sodaJSONObj["digital-metadata"]["subtitle"]; + const guidedUsers = window.sodaJSONObj["digital-metadata"]["user-permissions"]; + //const guidedPIOwner = window.sodaJSONObj["digital-metadata"]["pi-owner"]; + const guidedTeams = window.sodaJSONObj["digital-metadata"]["team-permissions"]; + + const guidedPennsieveStudyPurpose = + window.sodaJSONObj["digital-metadata"]["description"]["study-purpose"]; + const guidedPennsieveDataCollection = + window.sodaJSONObj["digital-metadata"]["description"]["data-collection"]; + const guidedPennsievePrimaryConclusion = + window.sodaJSONObj["digital-metadata"]["description"]["primary-conclusion"]; + const guidedTags = window.sodaJSONObj["digital-metadata"]["dataset-tags"]; + const guidedLicense = window.sodaJSONObj["digital-metadata"]["license"]; + const guidedBannerImagePath = window.sodaJSONObj["digital-metadata"]?.["banner-image-path"]; + + //Hide the upload tables + document.querySelectorAll(".guided-upload-table").forEach((table) => { + table.classList.add("hidden"); + }); + + //Remove any permissions rows from the UI that may have been added from a previous upload + const pennsieveMetadataUploadTable = document.getElementById( + "guided-tbody-pennsieve-metadata-upload" + ); + const pennsieveMetadataUploadTableRows = pennsieveMetadataUploadTable.children; + for (const row of pennsieveMetadataUploadTableRows) { + if (row.classList.contains("permissions-upload-tr")) { + //delete the row to reset permissions UI + row.remove(); + } else { + row.classList.add("hidden"); + } + } + + //Display the Pennsieve metadata upload table + window.unHideAndSmoothScrollToElement( + "guided-div-pennsieve-metadata-pennsieve-genration-status-table" + ); + + // 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); + await guidedAddUserPermissions(guidedBfAccount, guidedDatasetName, guidedUsers); + await guidedAddTeamPermissions(guidedBfAccount, guidedDatasetName, guidedTeams); + + hideDatasetMetadataGenerationTableRows("pennsieve"); + + window.unHideAndSmoothScrollToElement( + "guided-div-dataset-metadata-pennsieve-genration-status-table" + ); + + await guidedGenerateSubjectsMetadata("Pennsieve"); + await guidedGenerateSamplesMetadata("Pennsieve"); + await guidedGenerateSubmissionMetadata("Pennsieve"); + await guidedGenerateDatasetDescriptionMetadata("Pennsieve"); + await guidedGenerateReadmeMetadata("Pennsieve"); + await guidedGenerateChangesMetadata("Pennsieve"); + + await guidedGenerateCodeDescriptionMetadata("Pennsieve"); + + //Reset Upload Progress Bar and then scroll to it + setGuidedProgressBarValue("pennsieve", 0); + + updateDatasetUploadProgressTable("pennsieve", { + "Upload status": `Preparing dataset for upload`, + }); + window.unHideAndSmoothScrollToElement("guided-div-dataset-upload-status-table"); + + await guidedCreateManifestFilesAndAddToDatasetStructure(); + + //Upload the dataset files + await guidedUploadDatasetToPennsieve(); + } catch (error) { + clientError(error); + let emessage = userErrorMessage(error); + //make an unclosable sweet alert that forces the user to close out of the app + let res = await Swal.fire({ + allowOutsideClick: false, + allowEscapeKey: false, + backdrop: "rgba(0,0,0, 0.4)", + heightAuto: false, + icon: "error", + title: "An error occurred during your upload", + html: ` +

Error message: ${emessage}

+

+ You may retry the upload now or save and exit. + If you choose to save and exit you will be able to resume your upload by returning to Guided Mode and clicking the "Resume Upload" + button on your dataset's progress card. +

+ `, + showCancelButton: true, + cancelButtonText: "Save and Exit", + confirmButtonText: "Retry Upload", + showClass: { + popup: "animate__animated animate__zoomIn animate__faster", + }, + hideClass: { + popup: "animate__animated animate__zoomOut animate__faster", + }, + }); + + if (res.isConfirmed) { + window.retryGuidedMode = true; //set the retry flag to true + let supplementary_checks = await window.run_pre_flight_checks( + "guided-mode-pre-generate-pennsieve-agent-check" + ); + if (!supplementary_checks) { + console.error("Failed supplementary checks"); + return; + } + + // check if the user made it to the last step + if ( + !document + .querySelector("#guided-div-dataset-upload-status-table") + .classList.contains("hidden") + ) { + // scroll to the upload status table + window.unHideAndSmoothScrollToElement("guided-div-dataset-upload-status-table"); + // upload on the last step + await guidedUploadDatasetToPennsieve(); + } else { + // restart the whole process + await guidedPennsieveDatasetUpload(); + return; + } + } + + const currentPageID = window.CURRENT_PAGE.id; + try { + await savePageChanges(currentPageID); + } catch (error) { + window.log.error("Error saving page changes", error); + } + guidedTransitionToHome(); + } + guidedSetNavLoadingState(false); +}; + +const guidedCreateOrRenameDataset = async (bfAccount, datasetName) => { + document.getElementById("guided-dataset-name-upload-tr").classList.remove("hidden"); + const datasetNameUploadText = document.getElementById("guided-dataset-name-upload-text"); + + datasetNameUploadText.innerHTML = "Creating dataset..."; + guidedUploadStatusIcon("guided-dataset-name-upload-status", "loading"); + + //If the dataset has already been created in Guided Mode, we should have an ID for the + //dataset. If a dataset with the ID still exists on Pennsieve, we will upload to that dataset. + if (window.sodaJSONObj["digital-metadata"]["pennsieve-dataset-id"]) { + const existingDatasetNameOnPennsieve = await checkIfDatasetExistsOnPennsieve( + window.sodaJSONObj["digital-metadata"]["pennsieve-dataset-id"] + ); + if (existingDatasetNameOnPennsieve) { + // If the name entered in the input matches the dataset name on Pennsieve, we will upload to that dataset + if (existingDatasetNameOnPennsieve === datasetName) { + datasetNameUploadText.innerHTML = "Dataset already exists on Pennsieve"; + guidedUploadStatusIcon("guided-dataset-name-upload-status", "success"); + return window.sodaJSONObj["digital-metadata"]["pennsieve-dataset-id"]; + } else { + // If the name entered in the input does not match the dataset name on Pennsieve, we will change + // the name of the dataset on Pennsieve to match the name entered in the input + try { + await client.put( + `/manage_datasets/ps_rename_dataset`, + { + input_new_name: datasetName, + }, + { + params: { + selected_account: bfAccount, + selected_dataset: existingDatasetNameOnPennsieve, + }, + } + ); + datasetNameUploadText.innerHTML = `Changed dataset name from ${existingDatasetNameOnPennsieve} to ${datasetName}`; + guidedUploadStatusIcon("guided-dataset-name-upload-status", "success"); + return window.sodaJSONObj["digital-metadata"]["pennsieve-dataset-id"]; + } catch (error) { + const emessage = userErrorMessage(error); + datasetNameUploadText.innerHTML = emessage; + guidedUploadStatusIcon("guided-dataset-name-upload-status", "error"); + throw new Error(emessage); + } + } + } else { + // if the previously uploaded dataset does not exist, wipe out the previously uploaded metadata + // so new metadata can be uploaded to the newly created dataset + // (This would happen if the user deleted the dataset on Pennsieve) + window.sodaJSONObj["previously-uploaded-data"] = {}; + await guidedSaveProgress(); + } + } + + try { + let bf_new_dataset = await client.post( + `/manage_datasets/datasets`, + { + input_dataset_name: datasetName, + }, + { + params: { + selected_account: bfAccount, + }, + } + ); + let createdDatasetsID = bf_new_dataset.data.id; + let createdDatasetIntId = bf_new_dataset.data.int_id; + + // set the global dataset id and dataset int id for reference in future events + window.defaultBfDatasetId = createdDatasetsID; + window.defaultBfDatasetIntId = createdDatasetIntId; + + datasetNameUploadText.innerHTML = `Successfully created dataset with name: ${datasetName}`; + const kombuchaEventData = { + value: 1, + dataset_id: createdDatasetsID, + dataset_name: datasetName, + dataset_int_id: window.defaultBfDatasetIntId, + }; + + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.CREATE_NEW_DATASET, + datasetName, + kombuchaEnums.Status.SUCCCESS, + kombuchaEventData + ); + + window.electron.ipcRenderer.send( + "track-event", + "Dataset ID to Dataset Name Map", + createdDatasetsID, + datasetName + ); + guidedUploadStatusIcon("guided-dataset-name-upload-status", "success"); + window.refreshDatasetList(); + window.addNewDatasetToList(datasetName); + + //Save the dataset ID generated by pennsieve so the dataset is not re-uploaded when the user + //resumes progress after failing an upload + window.sodaJSONObj["digital-metadata"]["pennsieve-dataset-id"] = createdDatasetsID; + await guidedSaveProgress(); + + return createdDatasetsID; + } catch (error) { + console.error(error); + let emessage = userErrorMessage(error); + + datasetNameUploadText.innerHTML = "Failed to create a new dataset."; + + if (emessage == "Dataset name already exists") { + datasetNameUploadText.innerHTML = `A dataset with the name ${datasetName} already exists on Pennsieve.
+ Please rename your dataset and try again.`; + document.getElementById("guided-dataset-name-upload-status").innerHTML = ` + + `; + //add an on-click handler to the added button + $("#guided-button-rename-dataset").on("click", () => { + openGuidedDatasetRenameSwal(); + }); + } + + throw new Error(userErrorMessage(error)); + } +}; + +const guidedAddDatasetSubtitle = async (bfAccount, datasetName, datasetSubtitle) => { + document.getElementById("guided-dataset-subtitle-upload-tr").classList.remove("hidden"); + const datasetSubtitleUploadText = document.getElementById("guided-dataset-subtitle-upload-text"); + datasetSubtitleUploadText.innerHTML = "Adding dataset subtitle..."; + guidedUploadStatusIcon("guided-dataset-subtitle-upload-status", "loading"); + + const previousUploadSubtitle = window.sodaJSONObj["previously-uploaded-data"]["subtitle"]; + + if (previousUploadSubtitle === datasetSubtitle) { + datasetSubtitleUploadText.innerHTML = "Dataset subtitle already added on Pennsieve"; + guidedUploadStatusIcon("guided-dataset-subtitle-upload-status", "success"); + return; + } + + try { + await client.put( + `/manage_datasets/bf_dataset_subtitle`, + { + input_subtitle: datasetSubtitle, + }, + { + params: { + selected_account: bfAccount, + selected_dataset: datasetName, + }, + } + ); + + datasetSubtitleUploadText.innerHTML = `Successfully added dataset subtitle: ${datasetSubtitle}`; + guidedUploadStatusIcon("guided-dataset-subtitle-upload-status", "success"); + window.sodaJSONObj["previously-uploaded-data"]["subtitle"] = datasetSubtitle; + await guidedSaveProgress(); + + // Send successful dataset subtitle upload event to Kombucha + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.ADD_EDIT_DATASET_METADATA, + kombuchaEnums.Label.SUBTITLE, + kombuchaEnums.Status.SUCCESS, + { + value: 1, + dataset_name: guidedGetDatasetName(window.sodaJSONObj), + dataset_id: guidedGetDatasetId(window.sodaJSONObj), + dataset_int_id: window.defaultBfDatasetIntId, + } + ); + } catch (error) { + // Send failed dataset subtitle upload event to Kombucha + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.ADD_EDIT_DATASET_METADATA, + kombuchaEnums.Label.SUBTITLE, + kombuchaEnums.Status.FAIL, + { + value: 1, + dataset_name: guidedGetDatasetName(window.sodaJSONObj), + dataset_id: guidedGetDatasetId(window.sodaJSONObj), + dataset_int_id: window.defaultBfDatasetIntId, + } + ); + window.electron.ipcRenderer.send( + "track-event", + "Error", + kombuchaEnums.Action.ADD_EDIT_DATASET_METADATA, + guidedGetDatasetId(window.sodaJSONObj) + ); + console.error(error); + let emessage = userErrorMessage(error); + datasetSubtitleUploadText.innerHTML = "Failed to add a dataset subtitle."; + guidedUploadStatusIcon("guided-dataset-subtitle-upload-status", "error"); + throw new Error(emessage); + } +}; + +const guidedAddDatasetDescription = async ( + bfAccount, + datasetName, + studyPurpose, + dataCollection, + dataConclusion +) => { + document.getElementById("guided-dataset-description-upload-tr").classList.remove("hidden"); + const datasetDescriptionUploadText = document.getElementById( + "guided-dataset-description-upload-text" + ); + datasetDescriptionUploadText.innerHTML = "Adding dataset description..."; + guidedUploadStatusIcon("guided-dataset-description-upload-status", "loading"); + + let descriptionArray = []; + + descriptionArray.push("**Study Purpose:** " + studyPurpose + "\n\n"); + descriptionArray.push("**Data Collection:** " + dataCollection + "\n\n"); + descriptionArray.push("**Primary Conclusion:** " + dataConclusion + "\n\n"); + + const description = descriptionArray.join(""); + + const previouslyUploadedDescription = + window.sodaJSONObj["previously-uploaded-data"]["description"]; + + if (previouslyUploadedDescription === description) { + datasetDescriptionUploadText.innerHTML = "Dataset description already added on Pennsieve"; + guidedUploadStatusIcon("guided-dataset-description-upload-status", "success"); + return; + } + + try { + await client.put( + `/manage_datasets/datasets/${datasetName}/readme`, + { updated_readme: description }, + { params: { selected_account: bfAccount } } + ); + + datasetDescriptionUploadText.innerHTML = `Successfully added dataset description!`; + guidedUploadStatusIcon("guided-dataset-description-upload-status", "success"); + window.sodaJSONObj["previously-uploaded-data"]["description"] = description; + await guidedSaveProgress(); + + // Send successful dataset description upload event to Kombucha + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.ADD_EDIT_DATASET_METADATA, + kombuchaEnums.Label.README_TXT, + kombuchaEnums.Status.SUCCESS, + { + value: 1, + dataset_name: guidedGetDatasetName(window.sodaJSONObj), + dataset_id: guidedGetDatasetId(window.sodaJSONObj), + dataset_int_id: window.defaultBfDatasetIntId, + } + ); + } catch (error) { + // Send failed dataset description upload event to Kombucha + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.ADD_EDIT_DATASET_METADATA, + kombuchaEnums.Label.README_TXT, + kombuchaEnums.Status.FAIL, + { + value: 1, + dataset_name: guidedGetDatasetName(window.sodaJSONObj), + dataset_id: guidedGetDatasetId(window.sodaJSONObj), + dataset_int_id: window.defaultBfDatasetIntId, + } + ); + window.electron.ipcRenderer.send( + "track-event", + "Error", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.ADD_EDIT_DATASET_METADATA, + kombuchaEnums.Label.README_TXT, + kombuchaEnums.Status.FAIL, + { + value: 1, + dataset_name: guidedGetDatasetName(window.sodaJSONObj), + dataset_id: guidedGetDatasetId(window.sodaJSONObj), + dataset_int_id: window.defaultBfDatasetIntId, + } + ); + + datasetDescriptionUploadText.innerHTML = "Failed to add a dataset description."; + guidedUploadStatusIcon("guided-dataset-description-upload-status", "error"); + throw new Error(userErrorMessage(error)); + } +}; + +const guidedAddDatasetBannerImage = async (bfAccount, datasetName, bannerImagePath) => { + if (!bannerImagePath) { + skipBannerImageUpload(); + return; + } + + await uploadValidBannerImage(bfAccount, datasetName, bannerImagePath); +}; +const guidedAddDatasetLicense = async (bfAccount, datasetName, datasetLicense) => { + document.getElementById("guided-dataset-license-upload-tr").classList.remove("hidden"); + const datasetLicenseUploadText = document.getElementById("guided-dataset-license-upload-text"); + datasetLicenseUploadText.innerHTML = "Adding dataset license..."; + guidedUploadStatusIcon("guided-dataset-license-upload-status", "loading"); + + const previouslyUploadedLicense = window.sodaJSONObj["previously-uploaded-data"]["license"]; + + if (previouslyUploadedLicense === datasetLicense) { + datasetLicenseUploadText.innerHTML = "Dataset license already added on Pennsieve"; + guidedUploadStatusIcon("guided-dataset-license-upload-status", "success"); + return; + } + + try { + await client.put( + `/manage_datasets/bf_license`, + { + input_license: datasetLicense, + }, + { + params: { + selected_account: bfAccount, + selected_dataset: datasetName, + }, + } + ); + datasetLicenseUploadText.innerHTML = `Successfully added dataset license: ${datasetLicense}`; + guidedUploadStatusIcon("guided-dataset-license-upload-status", "success"); + window.sodaJSONObj["previously-uploaded-data"]["license"] = datasetLicense; + await guidedSaveProgress(); + + // Send successful license upload event to Kombucha + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.ADD_EDIT_DATASET_METADATA, + kombuchaEnums.Label.LICENSE, + kombuchaEnums.Status.SUCCESS, + { + value: 1, + dataset_name: guidedGetDatasetName(window.sodaJSONObj), + dataset_id: guidedGetDatasetId(window.sodaJSONObj), + dataset_int_id: window.defaultBfDatasetIntId, + } + ); + } catch (error) { + console.error(error); + datasetLicenseUploadText.innerHTML = "Failed to add a dataset license."; + guidedUploadStatusIcon("guided-dataset-license-upload-status", "error"); + + // Send failed license upload event to Kombucha + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.ADD_EDIT_DATASET_METADATA, + kombuchaEnums.Label.LICENSE, + kombuchaEnums.Status.FAIL, + { + value: 1, + dataset_name: guidedGetDatasetName(window.sodaJSONObj), + dataset_id: guidedGetDatasetId(window.sodaJSONObj), + dataset_int_id: window.defaultBfDatasetIntId, + } + ); + throw new Error(userErrorMessage(error)); + } +}; + +const guidedAddDatasetTags = async (bfAccount, datasetName, tags) => { + document.getElementById("guided-dataset-tags-upload-tr").classList.remove("hidden"); + const datasetTagsUploadText = document.getElementById("guided-dataset-tags-upload-text"); + datasetTagsUploadText.innerHTML = "Adding dataset tags..."; + guidedUploadStatusIcon("guided-dataset-tags-upload-status", "loading"); + + const previouslyUploadedTags = window.sodaJSONObj["previously-uploaded-data"]["tags"]; + + if (JSON.stringify(previouslyUploadedTags) === JSON.stringify(tags)) { + datasetTagsUploadText.innerHTML = "Dataset tags already added on Pennsieve"; + guidedUploadStatusIcon("guided-dataset-tags-upload-status", "success"); + return; + } + + try { + await client.put( + `/manage_datasets/datasets/${datasetName}/tags`, + { tags }, + { + params: { + selected_account: bfAccount, + }, + } + ); + + datasetTagsUploadText.innerHTML = `Successfully added dataset tags: ${tags.join(", ")}`; + guidedUploadStatusIcon("guided-dataset-tags-upload-status", "success"); + window.sodaJSONObj["previously-uploaded-data"]["tags"] = tags; + await guidedSaveProgress(); + + // Send successful tags upload event to Kombucha + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.ADD_EDIT_DATASET_METADATA, + kombuchaEnums.Label.TAGS, + kombuchaEnums.Status.SUCCESS, + { + value: 1, + dataset_name: guidedGetDatasetName(window.sodaJSONObj), + dataset_id: guidedGetDatasetId(window.sodaJSONObj), + dataset_int_id: window.defaultBfDatasetIntId, + } + ); + } catch (error) { + datasetTagsUploadText.innerHTML = "Failed to add dataset tags."; + guidedUploadStatusIcon("guided-dataset-tags-upload-status", "error"); + + // Send failed tags upload event to Kombucha + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.ADD_EDIT_DATASET_METADATA, + kombuchaEnums.Label.TAGS, + kombuchaEnums.Status.FAIL, + { + value: 1, + dataset_name: guidedGetDatasetName(window.sodaJSONObj), + dataset_id: guidedGetDatasetId(window.sodaJSONObj), + dataset_int_id: window.defaultBfDatasetIntId, + } + ); + throw new Error(userErrorMessage(error)); + } +}; + +const guidedAddUserPermissions = async (bfAccount, datasetName, userPermissionsArray) => { + //filter user permissions with loggedInUser key + const promises = userPermissionsArray.map((userPermission) => { + if (userPermission?.["deleteFromPennsieve"] === true) { + return guidedGrantUserPermission( + bfAccount, + datasetName, + userPermission.userName, + userPermission.UUID, + "remove current permissions" + ); + } else { + return guidedGrantUserPermission( + bfAccount, + datasetName, + userPermission.userName, + userPermission.UUID, + userPermission.permission + ); + } + }); + await Promise.allSettled(promises); +}; + +const guidedAddTeamPermissions = async (bfAccount, datasetName, teamPermissionsArray) => { + const promises = teamPermissionsArray.map((teamPermission) => { + if (teamPermission?.["deleteFromPennsieve"] === true) { + return guidedGrantTeamPermission( + bfAccount, + datasetName, + teamPermission.UUID, + teamPermission.teamString, + "remove current permissions" + ); + } else { + return guidedGrantTeamPermission( + bfAccount, + datasetName, + teamPermission.UUID, + teamPermission.teamString, + teamPermission.permission + ); + } + }); + await Promise.allSettled(promises); +}; + +const guidedGenerateSubjectsMetadata = async (destination) => { + // Early return if subjects metadata table is empty or the tab is skipped + if ( + window.subjectsTableData.length === 0 || + pageIsSkipped("guided-create-subjects-metadata-tab") + ) { + return; + } + + const generationDestination = destination === "Pennsieve" ? "Pennsieve" : "local"; + + // Prepare UI elements for Pennsieve upload (if applicable) + const subjectsMetadataGenerationText = document.getElementById( + `guided-subjects-metadata-pennsieve-genration-text` + ); + if (generationDestination === "Pennsieve") { + document + .getElementById(`guided-subjects-metadata-pennsieve-genration-tr`) + .classList.remove("hidden"); + subjectsMetadataGenerationText.innerHTML = "Uploading subjects metadata..."; + guidedUploadStatusIcon(`guided-subjects-metadata-pennsieve-genration-status`, "loading"); + } + + try { + // Generate the subjects metadata file + await client.post( + `/prepare_metadata/subjects_file`, + { + filepath: generationDestination === "Pennsieve" ? "" : destination, + selected_account: window.defaultBfAccount, + selected_dataset: + generationDestination === "Pennsieve" ? guidedGetDatasetName(window.sodaJSONObj) : "", + subjects_header_row: window.subjectsTableData, + }, + { + params: { + upload_boolean: generationDestination === "Pennsieve", + }, + } + ); + + // Update UI for successful generation (Pennsieve) and send success event + if (generationDestination === "Pennsieve") { + guidedUploadStatusIcon(`guided-subjects-metadata-pennsieve-genration-status`, "success"); + subjectsMetadataGenerationText.innerHTML = `Subjects metadata successfully generated`; + } + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.GENERATE_METADATA, + kombuchaEnums.Label.SUBJECTS_XLSX, + kombuchaEnums.Status.SUCCESS, + guidedCreateEventDataPrepareMetadata(generationDestination, 1) + ); + } catch (error) { + const emessage = userErrorMessage(error); + userErrorMessage(error); + userErrorMessage(error); + userErrorMessage(error); + // Update UI for generation failure (Pennsieve) and send failure event + if (generationDestination === "Pennsieve") { + guidedUploadStatusIcon(`guided-subjects-metadata-pennsieve-genration-status`, "error"); + subjectsMetadataGenerationText.innerHTML = `Failed to generate subjects metadata`; + } + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.GENERATE_METADATA, + kombuchaEnums.Label.SUBJECTS_XLSX, + kombuchaEnums.Status.FAIL, + guidedCreateEventDataPrepareMetadata(generationDestination, 1) + ); + throw new Error(emessage); // Re-throw for further handling + } +}; + +const guidedGenerateSamplesMetadata = async (destination) => { + // Early return if samples metadata table is empty or the tab is skipped + if (window.samplesTableData.length === 0 || pageIsSkipped("guided-create-samples-metadata-tab")) { + return; + } + + const generationDestination = destination === "Pennsieve" ? "Pennsieve" : "local"; + + // Prepare UI elements for Pennsieve upload (if applicable) + const samplesMetadataUploadText = document.getElementById( + "guided-samples-metadata-pennsieve-genration-text" + ); + + if (generationDestination === "Pennsieve") { + document + .getElementById("guided-samples-metadata-pennsieve-genration-tr") + .classList.remove("hidden"); + + samplesMetadataUploadText.innerHTML = "Uploading samples metadata..."; + guidedUploadStatusIcon("guided-samples-metadata-pennsieve-genration-status", "loading"); + } + + try { + await client.post( + `/prepare_metadata/samples_file`, + { + filepath: generationDestination === "Pennsieve" ? "" : destination, + selected_account: window.defaultBfAccount, + selected_dataset: + generationDestination === "Pennsieve" ? guidedGetDatasetName(window.sodaJSONObj) : "", + samples_str: window.samplesTableData, + }, + { + params: { + upload_boolean: generationDestination === "Pennsieve", + }, + } + ); + // Update UI for successful generation (Pennsieve) and send success event + if (generationDestination === "Pennsieve") { + guidedUploadStatusIcon("guided-samples-metadata-pennsieve-genration-status", "success"); + samplesMetadataUploadText.innerHTML = `Samples metadata successfully uploaded`; + } + + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.GENERATE_METADATA, + kombuchaEnums.Label.SAMPLES_XLSX, + kombuchaEnums.Status.SUCCESS, + guidedCreateEventDataPrepareMetadata(generationDestination, 1) + ); + } catch (error) { + const emessage = userErrorMessage(error); + // Update UI for generation failure (Pennsieve) and send failure event + if (generationDestination === "Pennsieve") { + guidedUploadStatusIcon("guided-samples-metadata-pennsieve-genration-status", "error"); + samplesMetadataUploadText.innerHTML = `Failed to upload samples metadata`; + } + // Send failed samples metadata generation event to Kombucha + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.GENERATE_METADATA, + kombuchaEnums.Label.SAMPLES_XLSX, + kombuchaEnums.Status.FAIL, + guidedCreateEventDataPrepareMetadata(generationDestination, 1) + ); + throw new Error(emessage); // Re-throw for further handling + } +}; + +const guidedGenerateSubmissionMetadata = async (destination) => { + // Build the submission metadata array + const guidedMilestones = + window.sodaJSONObj["dataset-metadata"]["submission-metadata"]["milestones"]; + const submissionMetadataArray = []; + submissionMetadataArray.push({ + fundingConsortium: + window.sodaJSONObj["dataset-metadata"]["submission-metadata"]["funding-consortium"], + consortiumDataStandard: + window.sodaJSONObj["dataset-metadata"]["submission-metadata"]["consortium-data-standard"], + award: window.sodaJSONObj["dataset-metadata"]["shared-metadata"]["sparc-award"], + date: window.sodaJSONObj["dataset-metadata"]["submission-metadata"]["completion-date"] || "N/A", + milestone: guidedMilestones[0] || "N/A", + }); + if (window.sodaJSONObj["dataset-metadata"]["submission-metadata"]["milestones"].length > 1) { + for (let i = 1; i < guidedMilestones.length; i++) { + submissionMetadataArray.push({ + fundingConsortium: "", + consortiumDataStandard: "", + award: "", + date: "", + milestone: guidedMilestones[i], + }); + } + } + + const generationDestination = destination === "Pennsieve" ? "Pennsieve" : "local"; + + // Prepare UI elements for Pennsieve upload (if applicable) + const submissionMetadataUploadText = document.getElementById( + "guided-submission-metadata-pennsieve-genration-text" + ); + if (generationDestination === "Pennsieve") { + document + .getElementById("guided-submission-metadata-pennsieve-genration-tr") + .classList.remove("hidden"); + submissionMetadataUploadText.innerHTML = "Uploading submission metadata..."; + guidedUploadStatusIcon("guided-submission-metadata-pennsieve-genration-status", "loading"); + } + + try { + await client.post( + `/prepare_metadata/submission_file`, + { + submission_file_rows: submissionMetadataArray, + filepath: generationDestination === "Pennsieve" ? "" : destination, + upload_boolean: generationDestination === "Pennsieve", + }, + { + params: { + selected_account: window.defaultBfAccount, + selected_dataset: guidedGetDatasetName(window.sodaJSONObj), + }, + } + ); + // Update UI for successful generation (Pennsieve) and send success event + if (generationDestination === "Pennsieve") { + guidedUploadStatusIcon("guided-submission-metadata-pennsieve-genration-status", "success"); + submissionMetadataUploadText.innerHTML = `Submission metadata successfully uploaded`; + } + + // Send successful submission metadata generation event to Kombucha + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.GENERATE_METADATA, + kombuchaEnums.Label.SUBMISSION_XLSX, + kombuchaEnums.Status.SUCCESS, + guidedCreateEventDataPrepareMetadata(generationDestination, 1) + ); + } catch (error) { + const emessage = userErrorMessage(error); + // Update UI for generation failure (Pennsieve) and send failure event + if (generationDestination === "Pennsieve") { + guidedUploadStatusIcon("guided-submission-metadata-pennsieve-genration-status", "error"); + submissionMetadataUploadText.innerHTML = `Failed to upload submission metadata`; + } + + // Send failed submission metadata generation event to Kombucha + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.GENERATE_METADATA, + kombuchaEnums.Label.SUBMISSION_XLSX, + kombuchaEnums.Status.FAIL, + guidedCreateEventDataPrepareMetadata(generationDestination, 1) + ); + throw new Error(emessage); // Re-throw for further handling + } +}; + +const guidedGenerateDatasetDescriptionMetadata = async (destination) => { + const guidedDatasetInformation = + window.sodaJSONObj["dataset-metadata"]["description-metadata"]["dataset-information"]; + const guidedStudyInformation = + window.sodaJSONObj["dataset-metadata"]["description-metadata"]["study-information"]; + + const guidedContributorInformation = guidedGetContributorInformation(); + const datasetLinks = guidedGetDatasetLinks(); + const generationDestination = destination === "Pennsieve" ? "Pennsieve" : "local"; + + // Prepare UI elements for Pennsieve upload (if applicable) + const datasetDescriptionMetadataUploadText = document.getElementById( + "guided-dataset-description-metadata-pennsieve-genration-text" + ); + if (generationDestination === "Pennsieve") { + document + .getElementById("guided-dataset-description-metadata-pennsieve-genration-tr") + .classList.remove("hidden"); + + datasetDescriptionMetadataUploadText.innerHTML = "Uploading dataset description metadata..."; + guidedUploadStatusIcon( + "guided-dataset-description-metadata-pennsieve-genration-status", + "loading" + ); + } + + try { + await client.post( + `/prepare_metadata/dataset_description_file`, + { + selected_account: window.defaultBfAccount, + selected_dataset: guidedGetDatasetName(window.sodaJSONObj), + filepath: generationDestination === "Pennsieve" ? "" : destination, + dataset_str: guidedDatasetInformation, + study_str: guidedStudyInformation, + contributor_str: guidedContributorInformation, + related_info_str: datasetLinks, + }, + { + params: { + upload_boolean: generationDestination === "Pennsieve", + }, + } + ); + + // Update UI for successful generation (Pennsieve) and send success event + if (generationDestination === "Pennsieve") { + guidedUploadStatusIcon( + "guided-dataset-description-metadata-pennsieve-genration-status", + "success" + ); + datasetDescriptionMetadataUploadText.innerHTML = + "Dataset description metadata successfully uploaded"; + } + + // Send successful dataset_description metadata generation event to Kombucha + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.GENERATE_METADATA, + kombuchaEnums.Label.DATASET_DESCRIPTION_XLSX, + kombuchaEnums.Status.SUCCESS, + guidedCreateEventDataPrepareMetadata(generationDestination, 1) + ); + } catch (error) { + const emessage = userErrorMessage(error); + + // Update UI for generation failure (Pennsieve) and send failure event + if (generationDestination === "Pennsieve") { + guidedUploadStatusIcon( + "guided-dataset-description-metadata-pennsieve-genration-status", + "error" + ); + datasetDescriptionMetadataUploadText.innerHTML = `Failed to upload dataset description metadata`; + } + + // Send failed dataset_description metadata generation event to Kombucha + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.GENERATE_METADATA, + kombuchaEnums.Label.DATASET_DESCRIPTION_XLSX, + kombuchaEnums.Status.FAIL, + guidedCreateEventDataPrepareMetadata(generationDestination, 1) + ); + + throw new Error(emessage); // Re-throw for further handling + } +}; + +const guidedGenerateReadmeMetadata = async (destination) => { + const guidedReadMeMetadata = window.sodaJSONObj["dataset-metadata"]["README"]; + + const generationDestination = destination === "Pennsieve" ? "Pennsieve" : "local"; + + // Prepare UI elements for Pennsieve upload (if applicable) + const readmeMetadataUploadText = document.getElementById( + "guided-readme-metadata-pennsieve-genration-text" + ); + if (generationDestination === "Pennsieve") { + document + .getElementById("guided-readme-metadata-pennsieve-genration-tr") + .classList.remove("hidden"); + readmeMetadataUploadText.innerHTML = "Uploading README metadata..."; + guidedUploadStatusIcon("guided-readme-metadata-pennsieve-genration-status", "loading"); + } + + try { + if (generationDestination === "Pennsieve") { + await client.post( + `/prepare_metadata/readme_changes_file`, + { + text: guidedReadMeMetadata, + }, + { + params: { + file_type: "README.txt", + selected_account: window.defaultBfAccount, + selected_dataset: guidedGetDatasetName(window.sodaJSONObj), + }, + } + ); + } else { + await window.fs.writeFileAsync(destination, guidedReadMeMetadata); + } + + // Update UI for successful generation (Pennsieve) and send success event + if (generationDestination === "Pennsieve") { + guidedUploadStatusIcon("guided-readme-metadata-pennsieve-genration-status", "success"); + readmeMetadataUploadText.innerHTML = "README metadata successfully uploaded"; + } + + // Send successful README metadata generation event to Kombucha + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.GENERATE_METADATA, + kombuchaEnums.Label.README_TXT, + kombuchaEnums.Status.SUCCESS, + guidedCreateEventDataPrepareMetadata(generationDestination, 1) + ); + } catch (error) { + const emessage = userErrorMessage(error); + console.error("Error generating README metadata: ", emessage); + // Update UI for generation failure (Pennsieve) and send failure event + if (generationDestination === "Pennsieve") { + guidedUploadStatusIcon("guided-readme-metadata-pennsieve-genration-status", "error"); + readmeMetadataUploadText.innerHTML = "Failed to upload README metadata"; + } + + // Send failed README metadata generation event to Kombucha + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.GENERATE_METADATA, + kombuchaEnums.Label.README_TXT, + kombuchaEnums.Status.FAIL, + guidedCreateEventDataPrepareMetadata(generationDestination, 1) + ); + throw new Error(emessage); // Re-throw for further handling + } +}; +const guidedGenerateChangesMetadata = async (destination) => { + // Early return if changes metadata table is empty or the tab is skipped + if (pageIsSkipped("guided-create-changes-metadata-tab")) { + return; + } + const guidedChangesMetadata = window.sodaJSONObj["dataset-metadata"]["CHANGES"]; + + const generationDestination = destination === "Pennsieve" ? "Pennsieve" : "local"; + + // Prepare UI elements for Pennsieve upload (if applicable) + const changesMetadataUploadText = document.getElementById( + "guided-changes-metadata-pennsieve-genration-text" + ); + if (generationDestination === "Pennsieve") { + document + .getElementById("guided-changes-metadata-pennsieve-genration-tr") + .classList.remove("hidden"); + changesMetadataUploadText.innerHTML = "Uploading CHANGES metadata..."; + guidedUploadStatusIcon("guided-changes-metadata-pennsieve-genration-status", "loading"); + } + + try { + if (generationDestination === "Pennsieve") { + await client.post( + `/prepare_metadata/readme_changes_file`, + { + text: guidedChangesMetadata, + }, + { + params: { + file_type: "CHANGES.txt", + selected_account: window.defaultBfAccount, + selected_dataset: guidedGetDatasetName(window.sodaJSONObj), + }, + } + ); + } else { + await window.fs.writeFileAsync(destination, guidedChangesMetadata); + } + + // Update UI for successful generation (Pennsieve) and send success event + if (generationDestination === "Pennsieve") { + guidedUploadStatusIcon("guided-changes-metadata-pennsieve-genration-status", "success"); + changesMetadataUploadText.innerHTML = "CHANGES metadata successfully uploaded"; + } + + // Send successful CHANGES metadata generation event to Kombucha + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.GENERATE_METADATA, + kombuchaEnums.Label.CHANGES_TXT, + kombuchaEnums.Status.SUCCESS, + guidedCreateEventDataPrepareMetadata(generationDestination, 1) + ); + } catch (error) { + const emessage = userErrorMessage(error); + // Update UI for generation failure (Pennsieve) and send failure event + if (generationDestination === "Pennsieve") { + guidedUploadStatusIcon("guided-changes-metadata-pennsieve-genration-status", "error"); + changesMetadataUploadText.innerHTML = "Failed to upload CHANGES metadata"; + } + + // Send failed CHANGES metadata generation event to Kombucha + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.GENERATE_METADATA, + kombuchaEnums.Label.CHANGES_TXT, + kombuchaEnums.Status.FAIL, + guidedCreateEventDataPrepareMetadata(generationDestination, 1) + ); + throw new Error(emessage); // Re-throw for further handling + } +}; + +const guidedGenerateCodeDescriptionMetadata = async (destination) => { + if (pageIsSkipped("guided-add-code-metadata-tab")) { + return; + } + const codeDescriptionFilePath = + window.sodaJSONObj["dataset-metadata"]?.["code-metadata"]?.["code_description"]; + if (!codeDescriptionFilePath) { + return; + } + + const generationDestination = destination === "Pennsieve" ? "Pennsieve" : "local"; + + // Prepare UI elements for Pennsieve upload (if applicable) + const codeDescriptionMetadataUploadText = document.getElementById( + "guided-code-description-metadata-pennsieve-genration-text" + ); + if (generationDestination === "Pennsieve") { + document + .getElementById("guided-code-description-metadata-pennsieve-genration-tr") + .classList.remove("hidden"); + + codeDescriptionMetadataUploadText.innerHTML = "Uploading code description metadata..."; + guidedUploadStatusIcon( + "guided-code-description-metadata-pennsieve-genration-status", + "loading" + ); + } + try { + if (generationDestination === "Pennsieve") { + await client.post("/prepare_metadata/code_description_file", { + filepath: codeDescriptionFilePath, + selected_account: window.defaultBfAccount, + selected_dataset: guidedGetDatasetName(window.sodaJSONObj), + }); + } else { + await window.fs.copyFile(codeDescriptionFilePath, destination); + } + + // Update UI for successful generation (Pennsieve) and send success event + if (generationDestination === "Pennsieve") { + guidedUploadStatusIcon( + "guided-code-description-metadata-pennsieve-genration-status", + "success" + ); + codeDescriptionMetadataUploadText.innerHTML = "Code description metadata added to Pennsieve"; + } + + // Send successful code_description metadata generation event to Kombucha + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.GENERATE_METADATA, + kombuchaEnums.Label.CODE_DESCRIPTION_XLSX, + kombuchaEnums.Status.SUCCESS, + guidedCreateEventDataPrepareMetadata(generationDestination, 1) + ); + } catch (error) { + const emessage = userErrorMessage(error); + if (generationDestination === "Pennsieve") { + guidedUploadStatusIcon( + "guided-code-description-metadata-pennsieve-genration-status", + "error" + ); + codeDescriptionMetadataUploadText.innerHTML = `Failed to upload code description metadata`; + } + // Send failed code_description metadata generation event to Kombucha + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.GENERATE_METADATA, + kombuchaEnums.Label.CODE_DESCRIPTION_XLSX, + kombuchaEnums.Status.FAIL, + guidedCreateEventDataPrepareMetadata(generationDestination, 1) + ); + throw new Error(emessage); + } +}; + +const guidedUploadDatasetToPennsieve = async () => { + window.updateJSONStructureDSstructure(); + + // Initiate curation by calling Python function + let main_curate_status = "Solving"; + let main_total_generate_dataset_size; + + // track the amount of files that have been uploaded/generated + let uploadedFiles = 0; + let dataset_name; + let dataset_destination; + + if (window.sodaJSONObj["generate-dataset"]["destination"] == "bf") { + //Replace files and folders since guided mode always uploads to an existing Pennsieve dataset + window.sodaJSONObj["generate-dataset"]["if-existing"] = "merge"; + window.sodaJSONObj["generate-dataset"]["if-existing-files"] = "skip"; + dataset_name = window.sodaJSONObj["digital-metadata"]["name"]; + window.sodaJSONObj["bf-dataset-selected"] = {}; + window.sodaJSONObj["bf-dataset-selected"]["dataset-name"] = dataset_name; + window.sodaJSONObj["bf-account-selected"]["account-name"] = window.defaultBfAccount; + dataset_destination = "Pennsieve"; + } + + // if uploading to Pennsieve start a tracking session for the dataset upload + if (dataset_destination == "Pennsieve") { + // create a dataset upload session + datasetUploadSession.startSession(); + } + guidedSetNavLoadingState(true); + client + .post( + `/curate_datasets/curation`, + { + soda_json_structure: window.sodaJSONObj, + resume: !!window.retryGuidedMode, + }, + { timeout: 0 } + ) + .then(async (curationRes) => { + // if the upload succeeds reset the retry guided mode flag + window.retryGuidedMode = false; + guidedSetNavLoadingState(false); + + let { data } = curationRes; + window.pennsieveManifestId = data["origin_manifest_id"]; + window.totalFilesCount = data["main_curation_total_files"]; + + $("#sidebarCollapse").prop("disabled", false); + window.log.info("Completed curate function"); + + // log that a dataset upload was successful + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.GENERATE_DATASET, + kombuchaEnums.Label.TOTAL_UPLOADS, + kombuchaEnums.Status.SUCCCESS, + { + value: 1, + dataset_id: guidedGetDatasetId(window.sodaJSONObj), + dataset_name: guidedGetDatasetName(window.sodaJSONObj), + origin: guidedGetDatasetOrigin(window.sodaJSONObj), + destination: "Pennsieve", + dataset_int_id: window.defaultBfDatasetIntId, + } + ); + + // log the difference again to Google Analytics + let finalFilesCount = uploadedFiles - filesOnPreviousLogPage; + if (finalFilesCount > 0) { + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.GENERATE_DATASET, + kombuchaEnums.Label.FILES, + kombuchaEnums.Status.SUCCCESS, + { + value: finalFilesCount, + dataset_id: guidedGetDatasetId(window.sodaJSONObj), + dataset_name: guidedGetDatasetName(window.sodaJSONObj), + origin: guidedGetDatasetOrigin(window.sodaJSONObj), + destination: "Pennsieve", + upload_session: datasetUploadSession.id, + dataset_int_id: window.defaultBfDatasetIntId, + } + ); + } + + window.electron.ipcRenderer.send( + "track-event", + "Success", + "Guided Mode - Generate - Dataset - Number of Files", + `${datasetUploadSession.id}`, + finalFilesCount + ); + + let differenceInBytes = main_total_generate_dataset_size - bytesOnPreviousLogPage; + + if (differenceInBytes > 0) { + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.GENERATE_DATASET, + kombuchaEnums.Label.SIZE, + kombuchaEnums.Status.SUCCCESS, + { + value: differenceInBytes, + dataset_id: guidedGetDatasetId(window.sodaJSONObj), + dataset_name: guidedGetDatasetName(window.sodaJSONObj), + origin: guidedGetDatasetOrigin(window.sodaJSONObj), + destination: "Pennsieve", + upload_session: datasetUploadSession.id, + dataset_int_id: window.defaultBfDatasetIntId, + } + ); + } + + window.electron.ipcRenderer.send( + "track-event", + "Success", + "Guided Mode - Generate - Dataset - Size", + `${datasetUploadSession.id}`, + differenceInBytes + ); + + updateDatasetUploadProgressTable("pennsieve", { + "Upload status": "Dataset successfully uploaded to Pennsieve!", + }); + + // Clear the saved upload progress data because the dataset has been successfully + // uploaded to Pennsieve, and any future uploads will upload using new data + window.sodaJSONObj["previously-uploaded-data"] = {}; + + window.sodaJSONObj["previous-guided-upload-dataset-name"] = + window.sodaJSONObj["digital-metadata"]["name"]; + + // Save the window.sodaJSONObj after a successful upload + await guidedSaveProgress(); + + //Display the click next text + document.getElementById("guided--verify-files").classList.remove("hidden"); + + // enable the verify files button + document.querySelector("#guided--verify-files-button").disabled = false; + document.querySelector("#guided--skip-verify-btn").disabled = false; + + scrollToBottomOfGuidedBody(); + + //Show the next button + $("#guided-next-button").css("visibility", "visible"); + + try { + let responseObject = await client.get(`manage_datasets/bf_dataset_account`, { + params: { + selected_account: window.defaultBfAccount, + }, + }); + window.datasetList = []; + window.datasetList = responseObject.data.datasets; + } catch (error) { + clientError(error); + } + }) + .catch(async (error) => { + guidedSetNavLoadingState(false); + clientError(error); + + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.GENERATE_DATASET, + kombuchaEnums.Label.TOTAL_UPLOADS, + kombuchaEnums.Status.FAIL, + { + value: 1, + dataset_id: guidedGetDatasetId(window.sodaJSONObj), + dataset_name: guidedGetDatasetName(window.sodaJSONObj), + origin: guidedGetDatasetOrigin(window.sodaJSONObj), + destination: "Pennsieve", + dataset_int_id: window.defaultBfDatasetIntId, + } + ); + + // log the difference again to Google Analytics + let finalFilesCount = uploadedFiles - filesOnPreviousLogPage; + + if (finalFilesCount > 0) { + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.GENERATE_DATASET, + kombuchaEnums.Label.FILES, + kombuchaEnums.Status.SUCCCESS, + { + value: finalFilesCount, + dataset_id: guidedGetDatasetId(window.sodaJSONObj), + dataset_name: guidedGetDatasetName(window.sodaJSONObj), + origin: guidedGetDatasetOrigin(window.sodaJSONObj), + destination: "Pennsieve", + upload_session: datasetUploadSession.id, + dataset_int_id: window.defaultBfDatasetIntId, + } + ); + } + + window.electron.ipcRenderer.send( + "track-event", + "Success", + "Guided Mode - Generate - Dataset - Number of Files", + `${datasetUploadSession.id}`, + finalFilesCount + ); + + let differenceInBytes = main_total_generate_dataset_size - bytesOnPreviousLogPage; + + if (differenceInBytes > 0) { + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.GENERATE_DATASET, + kombuchaEnums.Label.SIZE, + kombuchaEnums.Status.SUCCCESS, + { + value: differenceInBytes, + dataset_id: guidedGetDatasetId(window.sodaJSONObj), + dataset_name: guidedGetDatasetName(window.sodaJSONObj), + origin: guidedGetDatasetOrigin(window.sodaJSONObj), + destination: "Pennsieve", + upload_session: datasetUploadSession.id, + dataset_int_id: window.defaultBfDatasetIntId, + } + ); + } + + window.electron.ipcRenderer.send( + "track-event", + "Success", + "Guided Mode - Generate - Dataset - Size", + `${datasetUploadSession.id}`, + differenceInBytes + ); + + // log the amount of files we attempted to upload -- good for knowing if a certain file amount poses the agent/our own code problems + if (uploadedFiles > 0) { + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.GENERATE_DATASET, + kombuchaEnums.Label.FILES, + kombuchaEnums.Status.FAIL, + { + value: uploadedFiles, + dataset_id: guidedGetDatasetId(window.sodaJSONObj), + dataset_name: guidedGetDatasetName(window.sodaJSONObj), + origin: guidedGetDatasetOrigin(window.sodaJSONObj), + destination: "Pennsieve", + upload_session: datasetUploadSession.id, + dataset_int_id: window.defaultBfDatasetIntId, + } + ); + } + + // log the size of the dataset we attempted to upload + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.GENERATE_DATASET, + kombuchaEnums.Label.SIZE, + kombuchaEnums.Status.FAIL, + { + value: main_total_generate_dataset_size, + dataset_id: guidedGetDatasetId(window.sodaJSONObj), + dataset_name: guidedGetDatasetName(window.sodaJSONObj), + origin: guidedGetDatasetOrigin(window.sodaJSONObj), + destination: "Pennsieve", + upload_session: datasetUploadSession.id, + dataset_int_id: window.defaultBfDatasetIntId, + } + ); + + let emessage = userErrorMessage(error); + try { + let responseObject = await client.get(`manage_datasets/bf_dataset_account`, { + params: { + selected_account: window.defaultBfAccount, + }, + }); + window.datasetList = []; + window.datasetList = responseObject.data.datasets; + } catch (error) { + clientError(error); + } + + //make an unclosable sweet alert that forces the user to close out of the app + let res = await Swal.fire({ + allowOutsideClick: false, + allowEscapeKey: false, + backdrop: "rgba(0,0,0, 0.4)", + heightAuto: false, + icon: "error", + title: "An error occurred during your upload", + html: ` +

Error message: ${emessage}

+

+ You may retry the upload now or save and exit. + If you choose to save and exit you will be able to resume your upload by returning to Guided Mode and clicking the "Resume Upload" + button on your dataset's progress card. +

+ `, + showCancelButton: true, + cancelButtonText: "Save and Exit", + confirmButtonText: "Retry Upload", + showClass: { + popup: "animate__animated animate__zoomIn animate__faster", + }, + hideClass: { + popup: "animate__animated animate__zoomOut animate__faster", + }, + }); + + if (res.isConfirmed) { + window.retryGuidedMode = true; //set the retry flag to true + let supplementary_checks = await window.run_pre_flight_checks( + "guided-mode-pre-generate-pennsieve-agent-check" + ); + if (!supplementary_checks) { + return; + } + + // check if the user made it to the last step + if ( + !document + .querySelector("#guided-div-dataset-upload-status-table") + .classList.contains("hidden") + ) { + // scroll to the upload status table + window.unHideAndSmoothScrollToElement("guided-div-dataset-upload-status-table"); + // upload on the last step + await guidedUploadDatasetToPennsieve(); + return; + } else { + // restart the whole process + await guidedPennsieveDatasetUpload(); + return; + } + } + + const currentPageID = window.CURRENT_PAGE.id; + try { + await savePageChanges(currentPageID); + } catch (error) { + window.log.error("Error saving page changes", error); + } + guidedTransitionToHome(); + }); + + const guidedUpdateUploadStatus = async () => { + let mainCurationProgressResponse; + try { + mainCurationProgressResponse = await client.get(`/curate_datasets/curation/progress`); + } catch (error) { + const emessage = userErrorMessage(error); + console.error("Error getting curation progress", emessage); + clearInterval(timerProgress); + throw emessage; + } + + let { data } = mainCurationProgressResponse; + + main_curate_status = data["main_curate_status"]; + const start_generate = data["start_generate"]; + const main_curate_progress_message = data["main_curate_progress_message"]; + main_total_generate_dataset_size = data["main_total_generate_dataset_size"]; + const main_generated_dataset_size = data["main_generated_dataset_size"]; + const elapsed_time_formatted = data["elapsed_time_formatted"]; + const totalUploadedFiles = data["total_files_uploaded"]; + uploadedFiles = totalUploadedFiles; + + if (start_generate === 1) { + $("#guided-progress-bar-new-curate").css("display", "block"); + //Case when the dataset upload is complete + if (main_curate_progress_message.includes("Success: COMPLETED!")) { + setGuidedProgressBarValue("pennsieve", 100); + } else { + const percentOfDatasetUploaded = + (main_generated_dataset_size / main_total_generate_dataset_size) * 100; + setGuidedProgressBarValue("pennsieve", percentOfDatasetUploaded); + + if (main_curate_progress_message.includes("Renaming files...")) { + updateDatasetUploadProgressTable("pennsieve", { + "Upload status": `${main_curate_progress_message}`, + "Percent uploaded": `${percentOfDatasetUploaded.toFixed(2)}%`, + "Elapsed time": `${elapsed_time_formatted}`, + "Files Renamed": `${main_generated_dataset_size} of ${main_total_generate_dataset_size}`, + }); + } else { + updateDatasetUploadProgressTable("pennsieve", { + "Upload status": `${main_curate_progress_message}`, + "Percent uploaded": `${percentOfDatasetUploaded.toFixed(2)}%`, + "Elapsed time": `${elapsed_time_formatted}`, + "Files Uploaded": `${totalUploadedFiles}`, + }); + } + } + } else { + updateDatasetUploadProgressTable("pennsieve", { + "Upload status": `${main_curate_progress_message}`, + "Elapsed time": `${elapsed_time_formatted}`, + }); + } + + //If the curate function is complete, clear the interval + if (main_curate_status === "Done") { + $("#sidebarCollapse").prop("disabled", false); + window.log.info("Done curate track"); + // then show the sidebar again + // forceActionSidebar("show"); + clearInterval(timerProgress); + // electron.powerSaveBlocker.stop(prevent_sleep_id) + } + }; + + // Progress tracking function for main curate + let timerProgress = setInterval(() => guidedUpdateUploadStatus(), 1000); + + let bytesOnPreviousLogPage = 0; + let filesOnPreviousLogPage = 0; +}; + +const hideDatasetMetadataGenerationTableRows = (destination) => { + let tableIdToHide = ""; + if (destination === "pennsieve") { + tableIdToHide = "guided-tbody-pennsieve-dataset-metadata-generation"; + } + if (destination === "local") { + tableIdToHide = "guided-tbody-local-dataset-metadata-generation"; + } + const tableToHide = document.getElementById(tableIdToHide); + const tableRowsToHide = tableToHide.children; + for (const row of tableRowsToHide) { + row.classList.add("hidden"); + } +}; + +//Add spinner to element +export const guidedUploadStatusIcon = (elementID, status) => { + let statusElement = document.getElementById(`${elementID}`); + statusElement.innerHTML = ``; + let spinner = ` +
`; + + if (status === "loading") { + statusElement.innerHTML = spinner; + } + if (status === "success") { + lottie.loadAnimation({ + container: statusElement, + animationData: successCheck, + renderer: "svg", + loop: false, + autoplay: true, + }); + } + if (status === "error") { + lottie.loadAnimation({ + container: statusElement, + animationData: errorMark, + renderer: "svg", + loop: false, + autoplay: true, + }); + } + if (status === "info") { + lottie.loadAnimation({ + container: statusElement, + animationData: infoMark, + renderer: "svg", + loop: false, + autoplay: true, + }); + } +}; + +const openGuidedDatasetRenameSwal = async () => { + const currentDatasetUploadName = window.sodaJSONObj["digital-metadata"]["name"]; + + const { value: newDatasetName } = await Swal.fire({ + allowOutsideClick: false, + allowEscapeKey: false, + backdrop: "rgba(0,0,0, 0.4)", + heightAuto: false, + title: "Rename your dataset", + html: `Current dataset name: ${currentDatasetUploadName}

Enter a new name for your dataset below:`, + input: "text", + inputPlaceholder: "Enter a new name for your dataset", + inputAttributes: { + autocapitalize: "off", + }, + inputValue: currentDatasetUploadName, + showCancelButton: true, + confirmButtonText: "Rename", + confirmButtonColor: "#3085d6 !important", + showClass: { + popup: "animate__animated animate__zoomIn animate__faster", + }, + hideClass: { + popup: "animate__animated animate__zoomOut animate__faster", + }, + preConfirm: (inputValue) => { + if (inputValue === "") { + Swal.showValidationMessage("Please enter a name for your dataset!"); + return false; + } + if (inputValue === currentDatasetUploadName) { + Swal.showValidationMessage("Please enter a new name for your dataset!"); + return false; + } + }, + }); + if (newDatasetName) { + window.sodaJSONObj["digital-metadata"]["name"] = newDatasetName; + + guidedPennsieveDatasetUpload(); + } +}; + +const skipBannerImageUpload = () => { + document.getElementById("guided-dataset-banner-image-upload-tr").classList.remove("hidden"); + const datasetBannerImageUploadText = document.getElementById( + "guided-dataset-banner-image-upload-text" + ); + datasetBannerImageUploadText.innerHTML = "Skipped optional banner image..."; + guidedUploadStatusIcon("guided-dataset-banner-image-upload-status", "success"); +}; + +const uploadValidBannerImage = async (bfAccount, datasetName, bannerImagePath) => { + document.getElementById("guided-dataset-banner-image-upload-tr").classList.remove("hidden"); + const datasetBannerImageUploadText = document.getElementById( + "guided-dataset-banner-image-upload-text" + ); + datasetBannerImageUploadText.innerHTML = "Adding dataset banner image..."; + guidedUploadStatusIcon("guided-dataset-banner-image-upload-status", "loading"); + + const previouslyUploadedBannerImagePath = + window.sodaJSONObj["previously-uploaded-data"]["banner-image-path"]; + + if (previouslyUploadedBannerImagePath === bannerImagePath) { + datasetBannerImageUploadText.innerHTML = "Dataset banner image already added on Pennsieve"; + guidedUploadStatusIcon("guided-dataset-banner-image-upload-status", "success"); + return; + } + + // Get the banner image size for Kombucha + // If there is an error getting the banner image size, "Unable to retrieve size" + // will be sent to Kombucha + let bannerImageSize; + try { + bannerImageSize = window.fs.statSync(bannerImagePath).size; + } catch (error) { + bannerImageSize = "Unable to retrieve size"; + } + + try { + await client.put( + `/manage_datasets/bf_banner_image`, + { + input_banner_image_path: bannerImagePath, + }, + { + params: { + selected_account: bfAccount, + selected_dataset: datasetName, + }, + } + ); + datasetBannerImageUploadText.innerHTML = `Successfully added dataset banner image!`; + guidedUploadStatusIcon("guided-dataset-banner-image-upload-status", "success"); + window.sodaJSONObj["previously-uploaded-data"]["banner-image-path"] = bannerImagePath; + await guidedSaveProgress(); + + // Send successful banner image upload event to Kombucha + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.ADD_EDIT_DATASET_METADATA, + kombuchaEnums.Label.BANNER_SIZE, + kombuchaEnums.Status.SUCCESS, + { + value: bannerImageSize, + dataset_name: guidedGetDatasetName(window.sodaJSONObj), + dataset_id: guidedGetDatasetId(window.sodaJSONObj), + dataset_int_id: window.defaultBfDatasetIntId, + } + ); + } catch (error) { + console.error(error); + datasetBannerImageUploadText.innerHTML = "Failed to add a dataset banner image."; + guidedUploadStatusIcon("guided-dataset-banner-image-upload-status", "error"); + + // Send failed banner image upload event to Kombucha + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.ADD_EDIT_DATASET_METADATA, + kombuchaEnums.Label.BANNER_SIZE, + kombuchaEnums.Status.FAIL, + { + value: bannerImageSize, + dataset_name: guidedGetDatasetName(window.sodaJSONObj), + dataset_id: guidedGetDatasetId(window.sodaJSONObj), + dataset_int_id: window.defaultBfDatasetIntId, + } + ); + + throw new Error(userErrorMessage(error)); + } +}; + +const guidedGrantUserPermission = async ( + bfAccount, + datasetName, + userName, + userUUID, + selectedRole +) => { + let userPermissionUploadElement = ""; + if (selectedRole === "remove current permissions") { + window.log.info("Removing a permission for a user on a dataset"); + userPermissionUploadElement = ` + + + Removing permissions for: ${userName} + + +
+ + + `; + } else { + window.log.info("Adding a permission for a user on a dataset"); + userPermissionUploadElement = ` + + + Granting ${userName} ${selectedRole} permissions... + + +
+ + `; + } + + //apend the upload element to the end of the table body + document + .getElementById("guided-tbody-pennsieve-metadata-upload") + .insertAdjacentHTML("beforeend", userPermissionUploadElement); + + const userPermissionUploadStatusText = document.getElementById( + `guided-dataset-${userUUID}-permissions-upload-text` + ); + + guidedUploadStatusIcon(`guided-dataset-${userUUID}-permissions-upload-status`, "loading"); + + try { + await client.patch( + `/manage_datasets/bf_dataset_permissions`, + { + input_role: selectedRole, + }, + { + params: { + selected_account: bfAccount, + selected_dataset: datasetName, + scope: "user", + name: userUUID, + }, + } + ); + + if (selectedRole === "remove current permissions") { + guidedUploadStatusIcon(`guided-dataset-${userUUID}-permissions-upload-status`, "success"); + userPermissionUploadStatusText.innerHTML = `${selectedRole} permissions removed for user: ${userName}`; + window.log.info(`${selectedRole} permissions granted to ${userName}`); + } else { + guidedUploadStatusIcon(`guided-dataset-${userUUID}-permissions-upload-status`, "success"); + userPermissionUploadStatusText.innerHTML = `${selectedRole} permissions granted to user: ${userName}`; + window.log.info(`${selectedRole} permissions granted to ${userName}`); + } + + // Send successful user permissions modification event to Kombucha + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.ADD_EDIT_DATASET_METADATA, + kombuchaEnums.Label.USER_PERMISSIONS, + kombuchaEnums.Status.SUCCESS, + { + value: 1, + dataset_name: guidedGetDatasetName(window.sodaJSONObj), + dataset_id: guidedGetDatasetId(window.sodaJSONObj), + dataset_int_id: window.defaultBfDatasetIntId, + } + ); + } catch (error) { + guidedUploadStatusIcon(`guided-dataset-${userUUID}-permissions-upload-status`, "error"); + if (selectedRole === "remove current permissions") { + userPermissionUploadStatusText.innerHTML = `Failed to remove permissions for ${userName}`; + } else { + userPermissionUploadStatusText.innerHTML = `Failed to grant ${selectedRole} permissions to ${userName}`; + } + let emessage = userErrorMessage(error); + window.log.error(emessage); + + // Send failed user permissions modification event to Kombucha + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.ADD_EDIT_DATASET_METADATA, + kombuchaEnums.Label.USER_PERMISSIONS, + kombuchaEnums.Status.FAIL, + { + value: 1, + dataset_name: guidedGetDatasetName(window.sodaJSONObj), + dataset_id: guidedGetDatasetId(window.sodaJSONObj), + dataset_int_id: window.defaultBfDatasetIntId, + } + ); + window.electron.ipcRenderer.send( + "track-event", + "Error", + ManageDatasetsAnalyticsPrefix.MANAGE_DATASETS_ADD_EDIT_PERMISSIONS, + guidedGetDatasetId(window.sodaJSONObj) + ); + throw emessage; + } +}; + +const guidedGrantTeamPermission = async ( + bfAccount, + datasetName, + teamUUID, + teamString, + selectedRole +) => { + let teamPermissionUploadElement = ""; + if (selectedRole === "remove current permissions") { + teamPermissionUploadElement = ` + + + Remove permissions from: ${teamString}. + + +
+ + + `; + } else { + teamPermissionUploadElement = ` + + + Granting ${teamString} ${selectedRole} permissions. + + +
+ + + `; + } + + //apend the upload element to the end of the table body + document + .getElementById("guided-tbody-pennsieve-metadata-upload") + .insertAdjacentHTML("beforeend", teamPermissionUploadElement); + + const teamPermissionUploadStatusText = document.getElementById( + `guided-dataset-${teamString}-permissions-upload-text` + ); + guidedUploadStatusIcon(`guided-dataset-${teamString}-permissions-upload-status`, "loading"); + + try { + await client.patch( + `/manage_datasets/bf_dataset_permissions`, + { + input_role: selectedRole, + }, + { + params: { + selected_account: bfAccount, + selected_dataset: datasetName, + scope: "team", + name: teamUUID, + }, + } + ); + guidedUploadStatusIcon(`guided-dataset-${teamString}-permissions-upload-status`, "success"); + if (selectedRole === "remove current permissions") { + teamPermissionUploadStatusText.innerHTML = `Permissions removed from team: ${teamString}`; + window.log.info(`Permissions remove from: ${teamString}`); + } else { + teamPermissionUploadStatusText.innerHTML = `${selectedRole} permissions granted to team: ${teamString}`; + window.log.info(`${selectedRole} permissions granted to ${teamString}`); + } + + // Send successful team permissions modification event to Kombucha + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.ADD_EDIT_DATASET_METADATA, + kombuchaEnums.Label.TEAM_PERMISSIONS, + kombuchaEnums.Status.SUCCESS, + { + value: 1, + dataset_name: guidedGetDatasetName(window.sodaJSONObj), + dataset_id: guidedGetDatasetId(window.sodaJSONObj), + dataset_int_id: window.defaultBfDatasetIntId, + } + ); + } catch (error) { + if (selectedRole === "remove current permissions") { + teamPermissionUploadStatusText.innerHTML = `Failed to remove permissions for ${teamString}`; + } else { + teamPermissionUploadStatusText.innerHTML = `Failed to grant ${selectedRole} permissions to ${teamString}`; + } + guidedUploadStatusIcon(`guided-dataset-${teamString}-permissions-upload-status`, "error"); + let emessage = userErrorMessage(error); + window.log.error(emessage); + + // Send failed team permissions modification event to Kombucha + window.electron.ipcRenderer.send( + "track-kombucha", + kombuchaEnums.Category.GUIDED_MODE, + kombuchaEnums.Action.ADD_EDIT_DATASET_METADATA, + kombuchaEnums.Label.TEAM_PERMISSIONS, + kombuchaEnums.Status.FAIL, + { + value: 1, + dataset_name: guidedGetDatasetName(window.sodaJSONObj), + dataset_id: guidedGetDatasetId(window.sodaJSONObj), + dataset_int_id: window.defaultBfDatasetIntId, + } + ); + window.electron.ipcRenderer.send( + "track-event", + "Error", + ManageDatasetsAnalyticsPrefix.MANAGE_DATASETS_ADD_EDIT_PERMISSIONS, + guidedGetDatasetId(window.sodaJSONObj) + ); + throw emessage; + } +}; + +const guidedCreateEventDataPrepareMetadata = (destination, value) => { + if (destination === "Pennsieve") { + return { + value, + destination: "Pennsieve", + dataset_name: guidedGetDatasetName(window.sodaJSONObj), + dataset_id: guidedGetDatasetId(window.sodaJSONObj), + dataset_int_id: window.defaultBfDatasetIntId, + }; + } + + return { + value, + destination, + }; +}; + +const guidedGetContributorInformation = () => { + let guidedContributorInformation = { + ...window.sodaJSONObj["dataset-metadata"]["description-metadata"]["contributor-information"], + }; + const guidedSparcAward = window.sodaJSONObj["dataset-metadata"]["shared-metadata"]["sparc-award"]; + if (datasetIsSparcFunded()) { + // Move the SPARC award to the front of the funding array + guidedContributorInformation["funding"] = guidedContributorInformation["funding"].filter( + (funding) => funding !== guidedSparcAward + ); + guidedContributorInformation["funding"].unshift(guidedSparcAward); + } + + const guidedContributorsArray = window.sodaJSONObj["dataset-metadata"]["description-metadata"][ + "contributors" + ].map((contributor) => { + return { + conAffliation: contributor["conAffliation"].join(", "), + conID: contributor["conID"], + conName: contributor["conName"], + conRole: contributor["conRole"].join(", "), + contributorFirstName: contributor["contributorFirstName"], + contributorLastName: contributor["contributorLastName"], + }; + }); + guidedContributorInformation["contributors"] = guidedContributorsArray; + + return guidedContributorInformation; +}; + +const guidedGetDatasetLinks = () => { + return [ + ...window.sodaJSONObj["dataset-metadata"]["description-metadata"]["additional-links"], + ...window.sodaJSONObj["dataset-metadata"]["description-metadata"]["protocols"], + ]; +}; diff --git a/src/renderer/src/scripts/guided-mode/generateDataset/uploadProgressBar.js b/src/renderer/src/scripts/guided-mode/generateDataset/uploadProgressBar.js new file mode 100644 index 000000000..f71c00919 --- /dev/null +++ b/src/renderer/src/scripts/guided-mode/generateDataset/uploadProgressBar.js @@ -0,0 +1,39 @@ +export function setGuidedProgressBarValue(destination, value) { + const progressBar = document.querySelector(`#guided-progress-bar-${destination}-generation`); + if (progressBar) { + progressBar.setAttribute("value", value); + } else { + console.error(`Could not find progress bar for ${destination}`); + } +} + +export const updateDatasetUploadProgressTable = (destination, progressObject) => { + const datasetUploadTableBody = document.getElementById( + `guided-tbody-${destination}-generation-status` + ); + //delete datasetUPloadTableBody children with class "generation-status-tr" + const uploadStatusTRs = datasetUploadTableBody.querySelectorAll(".generation-status-tr"); + for (const uploadStatusTR of uploadStatusTRs) { + datasetUploadTableBody.removeChild(uploadStatusTR); + } + //remove dtasetUploadTableBody children that don't have the id guided-tr-progress-bar + for (const child of datasetUploadTableBody.children) { + if (!child.classList.contains("guided-tr-progress-bar")) { + datasetUploadTableBody.removeChild(child); + } + } + let uploadStatusElement = ""; + for (const [uploadStatusKey, uploadStatusValue] of Object.entries(progressObject)) + uploadStatusElement += ` + + + ${uploadStatusKey}: + + ${uploadStatusValue} + + `; + + //insert adjustStatusElement at the end of datasetUploadTablebody + datasetUploadTableBody.insertAdjacentHTML("beforeend", uploadStatusElement); +}; 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 ca6f675c1..fbfe2481d 100644 --- a/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js +++ b/src/renderer/src/scripts/guided-mode/guided-curate-dataset.js @@ -13,10 +13,8 @@ import { import { resetLazyLoading, guidedUnLockSideBar } from "../../assets/nav"; import determineDatasetLocation from "../analytics/analytics-utils"; import { clientError, userErrorMessage } from "../others/http-error-handler/error-handler"; -import datasetUploadSession from "../analytics/upload-session-tracker"; import api from "../others/api/api"; import lottie from "lottie-web"; -import { successCheck, errorMark } from "../../assets/lotties/lotties"; import kombuchaEnums from "../analytics/analytics-enums"; import Swal from "sweetalert2"; import Tagify from "@yaireo/tagify/dist/tagify.esm.js"; @@ -42,16 +40,6 @@ import { setTreeViewDatasetStructure } from "../../stores/slices/datasetTreeView import "bootstrap-select"; import Cropper from "cropperjs"; -import "jstree"; - -import fileTxt from "/img/txt-file.png"; -import filePng from "/img/png-file.png"; -import filePdf from "/img/pdf-file.png"; -import fileCsv from "/img/csv-file.png"; -import fileDoc from "/img/doc-file.png"; -import fileXlsx from "/img/excel-file.png"; -import fileJpeg from "/img/jpeg-file.png"; -import fileOther from "/img/other-file.png"; import hasConnectedAccountWithPennsieve from "../others/authentication/auth"; while (!window.baseHtmlLoaded) { @@ -62,87 +50,17 @@ window.returnToGuided = () => { document.getElementById("guided_mode_view").click(); }; -const guidedGetDatasetId = (sodaJSON) => { - let datasetId = sodaJSON?.["digital-metadata"]?.["pennsieve-dataset-id"]; - if (datasetId != undefined) { - return datasetId; - } - - return "None"; -}; - -const guidedGetDatasetName = (sodaJSON) => { - let datasetName = sodaJSON?.["digital-metadata"]?.["name"]; - if (datasetName != undefined) { - return datasetName; - } - - return "None"; -}; - const guidedGetDatasetType = () => { // Returns the dataset type (e.g. "computational" or "experimental") return window.sodaJSONObj?.["dataset-type"]; }; -const guidedGetDatasetOrigin = (sodaJSON) => { - let datasetOrigin = sodaJSON?.["generate-dataset"]?.["generate-option"]; - if (datasetOrigin === "existing-bf") { - // Dataset origin is from Pennsieve - return "Pennsieve"; - } - - // Otherwise origin is new dataset - return "New"; -}; - -const guidedCreateEventDataPrepareMetadata = (destination, value) => { - if (destination === "Pennsieve") { - return { - value, - destination: "Pennsieve", - dataset_name: guidedGetDatasetName(window.sodaJSONObj), - dataset_id: guidedGetDatasetId(window.sodaJSONObj), - dataset_int_id: window.defaultBfDatasetIntId, - }; - } - - return { - value, - destination, - }; -}; - document .getElementById("guided-button-resume-pennsieve-dataset") .addEventListener("click", async () => { renderGuidedResumePennsieveDatasetSelectionDropdown(); }); -window.handleGuidedModeOrgSwitch = async (buttonClicked) => { - const clickedButtonId = buttonClicked.id; - if (clickedButtonId === "guided-button-change-workspace-dataset-import") { - renderGuidedResumePennsieveDatasetSelectionDropdown(); - } - if (buttonClicked.classList.contains("guided--progress-button-switch-workspace")) { - await guidedRenderProgressCards(); - } -}; - -const guidedGetCurrentUserWorkSpace = () => { - // Returns null if the user has not selected a workspace - const workSpaceFromUI = document.getElementById( - "guided-pennsive-selected-organization" - ).innerHTML; - if ( - workSpaceFromUI.includes("Click here to select workspace") || - workSpaceFromUI.includes("None") - ) { - return null; - } - return workSpaceFromUI; -}; - window.verifyProfile = async () => { const accountValid = await window.check_api_key(); @@ -220,13 +138,6 @@ const guidedMovePennsieveFolder = (movedFolderName, folderJSONPath, newFolderJSO newFolderJSONPath["folders"][movedFolderName] = folderJSONPath; }; -// Returns a boolean that indicates whether or not the user selected that the dataset is SPARC funded -const datasetIsSparcFunded = () => { - return ( - window.sodaJSONObj["dataset-metadata"]["submission-metadata"]["funding-consortium"] === "SPARC" - ); -}; - /* document.getElementById("guided-button-dataset-contains-code").addEventListener("click", () => { const codeFolder = window.datasetStructureJSONObj["folders"]["code"]; @@ -271,37 +182,6 @@ const objectsHaveSameKeys = (...objects) => { window.getDatasetEntityObj = getDatasetEntityObj; -const updateDatasetUploadProgressTable = (destination, progressObject) => { - const datasetUploadTableBody = document.getElementById( - `guided-tbody-${destination}-generation-status` - ); - //delete datasetUPloadTableBody children with class "generation-status-tr" - const uploadStatusTRs = datasetUploadTableBody.querySelectorAll(".generation-status-tr"); - for (const uploadStatusTR of uploadStatusTRs) { - datasetUploadTableBody.removeChild(uploadStatusTR); - } - //remove dtasetUploadTableBody children that don't have the id guided-tr-progress-bar - for (const child of datasetUploadTableBody.children) { - if (!child.classList.contains("guided-tr-progress-bar")) { - datasetUploadTableBody.removeChild(child); - } - } - let uploadStatusElement = ""; - for (const [uploadStatusKey, uploadStatusValue] of Object.entries(progressObject)) - uploadStatusElement += ` - - - ${uploadStatusKey}: - - ${uploadStatusValue} - - `; - - //insert adjustStatusElement at the end of datasetUploadTablebody - datasetUploadTableBody.insertAdjacentHTML("beforeend", uploadStatusElement); -}; - const createGuidedStructureFromSubSamMetadata = (subjectsMetadataRows, samplesMetadataRows) => { const poolSubSamStructure = { pools: {}, @@ -485,18 +365,6 @@ window.guidedModifyCurationTeamAccess = async (action) => { } }; -const checkIfDatasetExistsOnPennsieve = async (datasetNameOrID) => { - let datasetName = null; - const datasetList = await api.getDatasetsForAccount(); - for (const dataset of datasetList) { - if (dataset.name === datasetNameOrID || dataset.id === datasetNameOrID) { - datasetName = dataset.name; - break; - } - } - return datasetName; -}; - // Adds the click handlers to the info drop downs in Guided Mode // The selectors also append the info icon before the label depending on data attributes // passed in the HTML @@ -569,11 +437,6 @@ document.querySelectorAll(".pass-button-click-to-next-button").forEach((element) }); }); -const scrollToBottomOfGuidedBody = () => { - const elementToScrollTo = document.querySelector(".guided--body"); - elementToScrollTo.scrollTop = elementToScrollTo.scrollHeight; -}; - const guidedTransitionFromHome = async () => { //Hide the home screen document.getElementById("guided-home").classList.add("hidden"); @@ -966,41 +829,6 @@ const renderManifestCards = () => { window.smoothScrollToElement(manifestFilesCardsContainer); }; -const guidedCreateManifestFilesAndAddToDatasetStructure = async () => { - // First, empty the guided_manifest_files so we can add the new manifest files - window.fs.emptyDirSync(window.guidedManifestFilePath); - - const guidedManifestData = window.sodaJSONObj["guided-manifest-file-data"]; - for (const [highLevelFolder, _] of Object.entries(guidedManifestData)) { - let manifestJSON = window.processManifestInfo( - guidedManifestData[highLevelFolder]["headers"], - guidedManifestData[highLevelFolder]["data"] - ); - - let jsonManifest = JSON.stringify(manifestJSON); - - const manifestPath = window.path.join( - window.guidedManifestFilePath, - highLevelFolder, - "manifest.xlsx" - ); - - window.fs.mkdirSync(window.path.join(window.guidedManifestFilePath, highLevelFolder), { - recursive: true, - }); - - await window.convertJSONToXlsx(JSON.parse(jsonManifest), manifestPath); - window.datasetStructureJSONObj["folders"][highLevelFolder]["files"]["manifest.xlsx"] = { - action: ["new"], - path: manifestPath, - type: "local", - }; - } - - // wait for the manifest files to be created before continuing - await new Promise((resolve) => setTimeout(resolve, 1000)); -}; - window.guidedOpenManifestEditSwal = async () => { const existingManifestData = window.sodaJSONObj["guided-manifest-file-data"]; //send manifest data to main.js to then send to child window @@ -1433,6 +1261,16 @@ document guidedSetNavLoadingState(false); }); +window.handleGuidedModeOrgSwitch = async (buttonClicked) => { + const clickedButtonId = buttonClicked.id; + if (clickedButtonId === "guided-button-change-workspace-dataset-import") { + renderGuidedResumePennsieveDatasetSelectionDropdown(); + } + if (buttonClicked.classList.contains("guided--progress-button-switch-workspace")) { + await guidedRenderProgressCards(); + } +}; + $("#guided-select-pennsieve-dataset-to-resume").selectpicker(); const renderGuidedResumePennsieveDatasetSelectionDropdown = async () => { // First hide the error div if it is showing @@ -1549,174 +1387,6 @@ window.guidedPrepareHomeScreen = async () => { guidedUnLockSideBar(); }; -const guidedShowTreePreview = (new_dataset_name, targetElementId) => { - const folderStructurePreview = document.getElementById(targetElementId); - $(folderStructurePreview).jstree({ - core: { - check_callback: true, - data: {}, - }, - plugins: ["types", "sort"], - sort: function (a, b) { - let a1 = this.get_node(a); - let b1 = this.get_node(b); - - if (a1.icon == b1.icon || (a1.icon.includes("assets") && b1.icon.includes("assets"))) { - //if the word assets is included in the icon then we can assume it is a file - //folder icons are under font awesome meanwhile files come from the assets folder - return a1.text > b1.text ? 1 : -1; - } else { - return a1.icon < b1.icon ? 1 : -1; - } - }, - types: { - folder: { - icon: "fas fa-folder fa-fw", - }, - "folder open": { - icon: "fas fa-folder-open fa-fw", - }, - "folder closed": { - icon: "fas fa-folder fa-fw", - }, - "file xlsx": { - icon: fileXlsx, - }, - "file xls": { - icon: fileXlsx, - }, - "file png": { - icon: filePng, - }, - "file PNG": { - icon: filePng, - }, - "file pdf": { - icon: filePdf, - }, - "file txt": { - icon: fileTxt, - }, - "file csv": { - icon: fileCsv, - }, - "file CSV": { - icon: fileCsv, - }, - "file DOC": { - icon: fileDoc, - }, - "file DOCX": { - icon: fileDoc, - }, - "file docx": { - icon: fileDoc, - }, - "file doc": { - icon: fileDoc, - }, - "file jpeg": { - icon: fileJpeg, - }, - "file JPEG": { - icon: fileJpeg, - }, - "file other": { - icon: fileOther, - }, - }, - }); - $(folderStructurePreview).on("open_node.jstree", function (event, data) { - data.instance.set_type(data.node, "folder open"); - }); - $(folderStructurePreview).on("close_node.jstree", function (event, data) { - data.instance.set_type(data.node, "folder closed"); - }); - const dsJsonObjCopy = JSON.parse(JSON.stringify(window.datasetStructureJSONObj)); - - //Add the code_description metadata file to the preview if the code_description path has been declared - if (window.sodaJSONObj["dataset-metadata"]["code-metadata"]["code_description"]) { - dsJsonObjCopy["files"]["code_description.xlsx"] = { - action: ["new"], - path: "", - type: "local", - }; - } - - //Add the dataset_description metadata file to the preview if the dataset_description page has been completed - if (window.sodaJSONObj["completed-tabs"].includes("guided-create-description-metadata-tab")) { - dsJsonObjCopy["files"]["dataset_description.xlsx"] = { - action: ["new"], - path: "", - type: "local", - }; - } - - //Add the manifest files that have been created to the preview - for (const manifestFileKey of Object.keys(window.sodaJSONObj["guided-manifest-file-data"])) { - const hlfStillExistsForManifestFile = Object.keys(dsJsonObjCopy["folders"]).includes( - manifestFileKey - ); - if (hlfStillExistsForManifestFile) { - dsJsonObjCopy["folders"][manifestFileKey]["files"]["manifest.xlsx"] = { - action: ["new"], - path: "", - type: "local", - }; - } - } - - //Add the Readme file to the preview if it exists in JSON - if (window.sodaJSONObj["dataset-metadata"]["README"]) { - dsJsonObjCopy["files"]["README.txt"] = { - action: ["new"], - path: "", - type: "local", - }; - } - - //Add the Samples metadata file to the preview if at least one sample has been added - if (window.samplesTableData.length > 0) { - dsJsonObjCopy["files"]["samples.xlsx"] = { - action: ["new"], - path: "", - type: "local", - }; - } - - //Add the Subjects metadata file to the preview if at least one subject has been added - if (window.subjectsTableData.length > 0) { - dsJsonObjCopy["files"]["subjects.xlsx"] = { - action: ["new"], - path: "", - type: "local", - }; - } - - //Add the submission metadata file to the preview if the submission metadata page has been completed - if (window.sodaJSONObj["completed-tabs"].includes("guided-create-submission-metadata-tab")) { - dsJsonObjCopy["files"]["submission.xlsx"] = { - action: ["new"], - path: "", - type: "local", - }; - } - - const guidedJsTreePreviewData = window.create_child_node( - dsJsonObjCopy, - new_dataset_name, - "folder", - "", - new_dataset_name, - false, - false, - "", - "preview" - ); - $(folderStructurePreview).jstree(true).settings.core.data = guidedJsTreePreviewData; - $(folderStructurePreview).jstree(true).refresh(); -}; - const guidedUpdateFolderStructure = (highLevelFolder, subjectsOrSamples) => { //add high level folder if it does not exist /* @@ -1815,10 +1485,6 @@ const guidedUpdateFolderStructure = (highLevelFolder, subjectsOrSamples) => { } }; -const pageIsSkipped = (pageId) => { - return window.sodaJSONObj["skipped-pages"].includes(pageId); -}; - const folderIsEmpty = (folder) => { if (!folder) { return true; @@ -2275,15 +1941,6 @@ const renderSamplesTable = () => { }); }; -function setGuidedProgressBarValue(destination, value) { - const progressBar = document.querySelector(`#guided-progress-bar-${destination}-generation`); - if (progressBar) { - progressBar.setAttribute("value", value); - } else { - console.error(`Could not find progress bar for ${destination}`); - } -} - const generateAlertElement = (alertType, warningMessageText) => { return `