@@ -1095,11 +1095,15 @@ const savePageChanges = async (pageBeingLeftID) => {
1095
1095
message: "Please enter a dataset name.",
1096
1096
});
1097
1097
}
1098
- if (check_forbidden_characters_ps(datasetNameInput)) {
1098
+
1099
+ const datasetNameContainsForbiddenCharacters = window.evaluateStringAgainstSdsRequirements(
1100
+ datasetNameInput,
1101
+ "string-contains-forbidden-characters"
1102
+ );
1103
+ if (datasetNameContainsForbiddenCharacters) {
1099
1104
errorArray.push({
1100
1105
type: "notyf",
1101
- message:
1102
- "A Pennsieve dataset name cannot contain any of the following characters: /:*?'<>.",
1106
+ message: `A Pennsieve dataset name cannot contain any of the following characters: @#$%^&*()+=/\|"'~;:<>{}[]?`,
1103
1107
});
1104
1108
}
1105
1109
if (!datasetSubtitleInput) {
@@ -2101,12 +2105,14 @@ const savePageChanges = async (pageBeingLeftID) => {
2101
2105
}
2102
2106
}
2103
2107
2104
- // Save the current version of SODA as the user should be taken back to the first page when the app is updated
2105
- const currentAppVersion = document.getElementById("version").innerHTML;
2106
- window.sodaJSONObj["last-version-of-soda-used"] = currentAppVersion;
2107
-
2108
2108
// Stop any animations that need to be stopped
2109
2109
startOrStopAnimationsInContainer(pageBeingLeftID, "stop");
2110
+
2111
+ try {
2112
+ await guidedSaveProgress();
2113
+ } catch (error) {
2114
+ log.error(error);
2115
+ }
2110
2116
} catch (error) {
2111
2117
guidedSetNavLoadingState(false);
2112
2118
console.log(error);
@@ -3000,9 +3006,14 @@ const guidedTransitionFromDatasetNameSubtitlePage = () => {
3000
3006
$("#guided-footer-div").css("display", "flex");
3001
3007
};
3002
3008
3003
- const saveGuidedProgress = async (guidedProgressFileName) => {
3009
+ const guidedSaveProgress = async () => {
3010
+ const guidedProgressFileName = window.sodaJSONObj?.["digital-metadata"]?.["name"];
3004
3011
//return if guidedProgressFileName is not a strnig greater than 0
3005
- if (typeof guidedProgressFileName !== "string" || guidedProgressFileName.length === 0) {
3012
+ if (
3013
+ !guidedProgressFileName ||
3014
+ typeof guidedProgressFileName !== "string" ||
3015
+ guidedProgressFileName.length === 0
3016
+ ) {
3006
3017
return;
3007
3018
}
3008
3019
//Destination: HOMEDIR/SODA/Guided-Progress
@@ -3026,6 +3037,10 @@ const saveGuidedProgress = async (guidedProgressFileName) => {
3026
3037
window.sodaJSONObj["subjects-table-data"] = window.subjectsTableData;
3027
3038
window.sodaJSONObj["samples-table-data"] = window.samplesTableData;
3028
3039
3040
+ // Save the current version of SODA as the user should be taken back to the first page when the app is updated
3041
+ const currentAppVersion = document.getElementById("version").innerHTML;
3042
+ window.sodaJSONObj["last-version-of-soda-used"] = currentAppVersion;
3043
+
3029
3044
window.fs.writeFileSync(guidedFilePath, JSON.stringify(window.sodaJSONObj, null, 2));
3030
3045
};
3031
3046
@@ -3466,7 +3481,7 @@ window.guidedOpenManifestEditSwal = async (highLevelFolderName) => {
3466
3481
//spreadsheet reply contained results
3467
3482
await updateManifestJson(highLevelFolderName, result);
3468
3483
window.electron.ipcRenderer.removeAllListeners("spreadsheet-reply");
3469
- await saveGuidedProgress(window.sodaJSONObj["digital-metadata"]["name"] );
3484
+ await guidedSaveProgress( );
3470
3485
renderManifestCards();
3471
3486
}
3472
3487
});
@@ -6815,7 +6830,7 @@ window.openPage = async (targetPageID) => {
6815
6830
6816
6831
// Set the last opened page and save it
6817
6832
window.sodaJSONObj["page-before-exit"] = targetPageID;
6818
- await saveGuidedProgress(window.sodaJSONObj["digital-metadata"]["name"] );
6833
+ await guidedSaveProgress( );
6819
6834
} catch (error) {
6820
6835
const eMessage = userErrorMessage(error);
6821
6836
Swal.fire({
@@ -7537,7 +7552,7 @@ const guidedCheckIfUserNeedsToReconfirmAccountDetails = () => {
7537
7552
return false;
7538
7553
};
7539
7554
7540
- const guidedGetPageToReturnTo = (sodaJSONObj) => {
7555
+ const guidedGetPageToReturnTo = async (sodaJSONObj) => {
7541
7556
// Set by window.openPage function
7542
7557
const usersPageBeforeExit = window.sodaJSONObj["page-before-exit"];
7543
7558
@@ -7553,7 +7568,11 @@ const guidedGetPageToReturnTo = (sodaJSONObj) => {
7553
7568
const lastVersionOfSodaUsedOnProgressFile = window.sodaJSONObj["last-version-of-soda-used"];
7554
7569
7555
7570
if (lastVersionOfSodaUsedOnProgressFile != currentSodaVersion) {
7556
- // If the last time the user worked on the progress file was in a previous version of SODA, then force the user to restart from the first page
7571
+ // If the progress file was last edited in a previous SODA version, reset to the first page
7572
+ await swalShowInfo(
7573
+ "SODA has been updated since you last worked on this dataset.",
7574
+ "You'll be taken to the first page to ensure compatibility with the latest workflow. Your previous work is saved and accessible."
7575
+ );
7557
7576
return firstPageID;
7558
7577
}
7559
7578
@@ -7876,7 +7895,7 @@ window.guidedResumeProgress = async (datasetNameToResume) => {
7876
7895
hideSubNavAndShowMainNav(false);
7877
7896
7878
7897
// pageToReturnTo will be set to the page the user will return to
7879
- const pageToReturnTo = guidedGetPageToReturnTo(window.sodaJSONObj);
7898
+ const pageToReturnTo = await guidedGetPageToReturnTo(window.sodaJSONObj);
7880
7899
7881
7900
await window.openPage(pageToReturnTo);
7882
7901
@@ -10546,7 +10565,7 @@ window.openCopySubjectMetadataPopup = async () => {
10546
10565
window.populateForms(currentSubjectOpenInView, "", "guided");
10547
10566
}
10548
10567
10549
- await saveGuidedProgress(window.sodaJSONObj["digital-metadata"]["name"] );
10568
+ await guidedSaveProgress( );
10550
10569
}
10551
10570
});
10552
10571
};
@@ -10644,7 +10663,7 @@ window.openCopySampleMetadataPopup = async () => {
10644
10663
if (currentSampleOpenInView) {
10645
10664
openModifySampleMetadataPage(currentSampleOpenInView, currentSampleSubjectOpenInView);
10646
10665
}
10647
- await saveGuidedProgress(window.sodaJSONObj["digital-metadata"]["name"] );
10666
+ await guidedSaveProgress( );
10648
10667
}
10649
10668
});
10650
10669
};
@@ -12866,7 +12885,7 @@ const renderSubjectsMetadataAsideItems = async () => {
12866
12885
//check to see if previousSubject is empty
12867
12886
if (previousSubject) {
12868
12887
window.addSubject("guided");
12869
- await saveGuidedProgress(window.sodaJSONObj["digital-metadata"]["name"] );
12888
+ await guidedSaveProgress( );
12870
12889
}
12871
12890
12872
12891
window.clearAllSubjectFormFields(window.guidedSubjectsFormDiv);
@@ -12884,7 +12903,7 @@ const renderSubjectsMetadataAsideItems = async () => {
12884
12903
12885
12904
document.getElementById("guided-bootbox-subject-id").value = e.target.innerText;
12886
12905
12887
- await saveGuidedProgress(window.sodaJSONObj["digital-metadata"]["name"] );
12906
+ await guidedSaveProgress( );
12888
12907
});
12889
12908
});
12890
12909
};
@@ -13011,7 +13030,7 @@ const renderSamplesMetadataAsideItems = async () => {
13011
13030
//check to see if previousSample is empty
13012
13031
if (previousSample) {
13013
13032
window.addSample("guided");
13014
- await saveGuidedProgress(window.sodaJSONObj["digital-metadata"]["name"] );
13033
+ await guidedSaveProgress( );
13015
13034
}
13016
13035
13017
13036
//add selected class to clicked element
@@ -13031,7 +13050,7 @@ const renderSamplesMetadataAsideItems = async () => {
13031
13050
e.target.innerText.split("/")[0]
13032
13051
);
13033
13052
13034
- await saveGuidedProgress(window.sodaJSONObj["digital-metadata"]["name"] );
13053
+ await guidedSaveProgress( );
13035
13054
});
13036
13055
});
13037
13056
};
@@ -13711,7 +13730,7 @@ const guidedCreateOrRenameDataset = async (bfAccount, datasetName) => {
13711
13730
// so new metadata can be uploaded to the newly created dataset
13712
13731
// (This would happen if the user deleted the dataset on Pennsieve)
13713
13732
window.sodaJSONObj["previously-uploaded-data"] = {};
13714
- await saveGuidedProgress(window.sodaJSONObj["digital-metadata"]["name"] );
13733
+ await guidedSaveProgress( );
13715
13734
}
13716
13735
}
13717
13736
@@ -13764,7 +13783,7 @@ const guidedCreateOrRenameDataset = async (bfAccount, datasetName) => {
13764
13783
//Save the dataset ID generated by pennsieve so the dataset is not re-uploaded when the user
13765
13784
//resumes progress after failing an upload
13766
13785
window.sodaJSONObj["digital-metadata"]["pennsieve-dataset-id"] = createdDatasetsID;
13767
- await saveGuidedProgress(window.sodaJSONObj["digital-metadata"]["name"] );
13786
+ await guidedSaveProgress( );
13768
13787
13769
13788
return createdDatasetsID;
13770
13789
} catch (error) {
@@ -13830,7 +13849,7 @@ const guidedAddDatasetSubtitle = async (bfAccount, datasetName, datasetSubtitle)
13830
13849
datasetSubtitleUploadText.innerHTML = `Successfully added dataset subtitle: ${datasetSubtitle}`;
13831
13850
guidedUploadStatusIcon("guided-dataset-subtitle-upload-status", "success");
13832
13851
window.sodaJSONObj["previously-uploaded-data"]["subtitle"] = datasetSubtitle;
13833
- await saveGuidedProgress(window.sodaJSONObj["digital-metadata"]["name"] );
13852
+ await guidedSaveProgress( );
13834
13853
13835
13854
// Send successful dataset subtitle upload event to Kombucha
13836
13855
window.electron.ipcRenderer.send(
@@ -13916,7 +13935,7 @@ const guidedAddDatasetDescription = async (
13916
13935
datasetDescriptionUploadText.innerHTML = `Successfully added dataset description!`;
13917
13936
guidedUploadStatusIcon("guided-dataset-description-upload-status", "success");
13918
13937
window.sodaJSONObj["previously-uploaded-data"]["description"] = description;
13919
- await saveGuidedProgress(window.sodaJSONObj["digital-metadata"]["name"] );
13938
+ await guidedSaveProgress( );
13920
13939
13921
13940
// Send successful dataset description upload event to Kombucha
13922
13941
window.electron.ipcRenderer.send(
@@ -14003,7 +14022,7 @@ const uploadValidBannerImage = async (bfAccount, datasetName, bannerImagePath) =
14003
14022
datasetBannerImageUploadText.innerHTML = `Successfully added dataset banner image!`;
14004
14023
guidedUploadStatusIcon("guided-dataset-banner-image-upload-status", "success");
14005
14024
window.sodaJSONObj["previously-uploaded-data"]["banner-image-path"] = bannerImagePath;
14006
- await saveGuidedProgress(window.sodaJSONObj["digital-metadata"]["name"] );
14025
+ await guidedSaveProgress( );
14007
14026
14008
14027
// Send successful banner image upload event to Kombucha
14009
14028
window.electron.ipcRenderer.send(
@@ -14096,7 +14115,7 @@ const guidedAddDatasetLicense = async (bfAccount, datasetName, datasetLicense) =
14096
14115
datasetLicenseUploadText.innerHTML = `Successfully added dataset license: ${datasetLicense}`;
14097
14116
guidedUploadStatusIcon("guided-dataset-license-upload-status", "success");
14098
14117
window.sodaJSONObj["previously-uploaded-data"]["license"] = datasetLicense;
14099
- await saveGuidedProgress(window.sodaJSONObj["digital-metadata"]["name"] );
14118
+ await guidedSaveProgress( );
14100
14119
14101
14120
// Send successful license upload event to Kombucha
14102
14121
window.electron.ipcRenderer.send(
@@ -14169,7 +14188,7 @@ const guidedAddDatasetTags = async (bfAccount, datasetName, tags) => {
14169
14188
datasetTagsUploadText.innerHTML = `Successfully added dataset tags: ${tags.join(", ")}`;
14170
14189
guidedUploadStatusIcon("guided-dataset-tags-upload-status", "success");
14171
14190
window.sodaJSONObj["previously-uploaded-data"]["tags"] = tags;
14172
- await saveGuidedProgress(window.sodaJSONObj["digital-metadata"]["name"] );
14191
+ await guidedSaveProgress( );
14173
14192
14174
14193
// Send successful tags upload event to Kombucha
14175
14194
window.electron.ipcRenderer.send(
@@ -15688,7 +15707,7 @@ const guidedUploadDatasetToPennsieve = async () => {
15688
15707
window.sodaJSONObj["digital-metadata"]["name"];
15689
15708
15690
15709
// Save the window.sodaJSONObj after a successful upload
15691
- await saveGuidedProgress(window.sodaJSONObj["digital-metadata"]["name"] );
15710
+ await guidedSaveProgress( );
15692
15711
15693
15712
//Display the click next text
15694
15713
document.getElementById("guided--verify-files").classList.remove("hidden");
@@ -16493,8 +16512,6 @@ $("#guided-next-button").on("click", async function () {
16493
16512
16494
16513
try {
16495
16514
await savePageChanges(window.pageBeingLeftID);
16496
- //Save progress onto local storage with the dataset name as the key
16497
- await saveGuidedProgress(window.sodaJSONObj["digital-metadata"]["name"]);
16498
16515
16499
16516
//Mark page as completed in JSONObj so we know what pages to load when loading local saves
16500
16517
//(if it hasn't already been marked complete)
@@ -17087,7 +17104,7 @@ const saveSubPageChanges = async (openSubPageID) => {
17087
17104
"import";
17088
17105
}
17089
17106
17090
- await saveGuidedProgress(window.sodaJSONObj["digital-metadata"]["name"] );
17107
+ await guidedSaveProgress( );
17091
17108
} catch (error) {
17092
17109
guidedSetNavLoadingState(false);
17093
17110
throw error;
0 commit comments