From c21efc1f18ad037c7b95e7e7dcc15f1c1e942d22 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 30 May 2025 13:49:02 -0400 Subject: [PATCH 1/4] add lock detection --- src/js/fileupload2.js | 135 ++++++++++++++++++++++++++++-------------- src/js/lang.js | 6 ++ 2 files changed, 96 insertions(+), 45 deletions(-) diff --git a/src/js/fileupload2.js b/src/js/fileupload2.js index 19b0767..a6a8742 100644 --- a/src/js/fileupload2.js +++ b/src/js/fileupload2.js @@ -266,52 +266,98 @@ async function populatePageMetadata(data) { } async function retrieveDatasetInfo() { - $.ajax({ - url: siteUrl + '/api/datasets/:persistentId/versions/:latest?persistentId=' + datasetPid, - headers: { "X-Dataverse-key": apiKey }, - type: 'GET', - context: this, - cache: false, - dataType: "json", - processData: false, - success: function(body, statusText, jqXHR) { - console.log(body); - let data = body.data; - console.log(data); - populatePageMetadata(data); - if (data.files !== null) { - existingFiles = {}; - convertedFileNameMap = {}; - for (let i = 0; i < data.files.length; i++) { - let entry = data.files[i]; - let df = entry.dataFile; - let convertedFile = false; - if (("originalFileFormat" in df) - && (!df.contentType === df.originalFileFormat)) { - console.log("The file named " + df.getString("filename") - + " on the server was created by Dataverse's ingest process from an original uploaded file"); - convertedFile = true; - } - let filepath = df.filename; - if ('directoryLabel' in entry) { - filepath = entry.directoryLabel + '/' + filepath; - } - console.log("Storing: " + filepath); - existingFiles[filepath] = df.checksum; - if (convertedFile) { - convertedFileNameMap[removeExtension(filepath)] = filepath; - } + try { + // First, check for dataset locks + const locksResponse = await $.ajax({ + url: siteUrl + '/api/datasets/:persistentId/locks?persistentId=' + datasetPid, + headers: { "X-Dataverse-key": apiKey }, + type: 'GET', + cache: false, + dataType: "json" + }); + + let isLockedInReview = false; + if (locksResponse.data && locksResponse.data.length > 0) { + isLockedInReview = locksResponse.data.some(lock => lock.lockType === "InReview"); + } + + // If locked but not InReview, disable upload + if (locksResponse.data && locksResponse.data.length > 0 && !isLockedInReview) { + addMessage('error', 'msgDatasetLocked'); + disableUploadFunctionality(); + return; + } + + // If locked InReview, check user permissions + if (isLockedInReview) { + const permissionsResponse = await $.ajax({ + url: siteUrl + '/api/datasets/:persistentId/userPermissions?persistentId=' + datasetPid, + headers: { "X-Dataverse-key": apiKey }, + type: 'GET', + cache: false, + dataType: "json" + }); + + if (!permissionsResponse.data || !permissionsResponse.data.canPublishDataset) { + addMessage('error', 'msgDatasetLockedInReview'); + disableUploadFunctionality(); + return; + } + } + + // If not locked or user has permission, proceed with retrieving dataset info + const datasetResponse = await $.ajax({ + url: siteUrl + '/api/datasets/:persistentId/versions/:latest?persistentId=' + datasetPid, + headers: { "X-Dataverse-key": apiKey }, + type: 'GET', + cache: false, + dataType: "json" + }); + + console.log(datasetResponse); + let data = datasetResponse.data; + console.log(data); + + populatePageMetadata(data); + if (data.files !== null) { + existingFiles = {}; + convertedFileNameMap = {}; + for (let i = 0; i < data.files.length; i++) { + let entry = data.files[i]; + let df = entry.dataFile; + let convertedFile = false; + if (("originalFileFormat" in df) + && (!df.contentType === df.originalFileFormat)) { + console.log("The file named " + df.getString("filename") + + " on the server was created by Dataverse's ingest process from an original uploaded file"); + convertedFile = true; + } + let filepath = df.filename; + if ('directoryLabel' in entry) { + filepath = entry.directoryLabel + '/' + filepath; + } + console.log("Storing: " + filepath); + existingFiles[filepath] = df.checksum; + if (convertedFile) { + convertedFileNameMap[removeExtension(filepath)] = filepath; } } - $('#files').prop('disabled', false); - addMessage('info', 'msgReadyToStart'); - }, - error: function(jqXHR, textStatus, errorThrown) { - console.log('Failure: ' + jqXHR.status); - console.log('Failure: ' + errorThrown); } - }); + $('#files').prop('disabled', false); + addMessage('info', 'msgReadyToStart'); + } catch (error) { + console.log('Error:', error); + addMessage('error', 'msgErrorRetrievingDataset'); + } +} + +function disableUploadFunctionality() { + $('#files').prop('disabled', true); + $('.file-selection-buttons').hide(); + $('label.button').hide(); + // Disable any other relevant UI elements } + //Not used in dvwebloader function setupDirectUpload(enabled) { if (enabled) { @@ -867,7 +913,6 @@ async function uploadFileDirectly(urls, storageId, filesize) { - function removeErrors() { var errors = document.getElementsByClassName("ui-fileupload-error"); for (let i = errors.length - 1; i >= 0; i--) { @@ -1136,7 +1181,7 @@ function getChecksum(blob, cbProgress) { checksumAlg = CryptoJS.algo.SHA512.create(); break; default: - console.log('$(checksumAlgName) is not supported, using MD5 as the checksumAlg checksum Algorithm'); + console.log('$(checksumAlgName) is not supported, using MD5 as the checksum Algorithm'); checksumAlg = CryptoJS.algo.MD5.create(); } readChunked(blob, (chunk, offs, total) => { @@ -1155,4 +1200,4 @@ function getChecksum(blob, cbProgress) { } }); }); -} +} \ No newline at end of file diff --git a/src/js/lang.js b/src/js/lang.js index a08b24f..2d52694 100644 --- a/src/js/lang.js +++ b/src/js/lang.js @@ -23,6 +23,9 @@ const translations = { msgDeselectAll: "Deselect all", msgMaxFilesExceeded: "Maximum number of files exceeded. Uncheck some files to enable upload.", msgMaxFilesReached: "Maximum number of files reached. Uncheck some files before selecting more.", + msgDatasetLocked: "This dataset is currently locked. File uploads are not allowed at this time.", + msgDatasetLockedInReview: "This dataset is currently In Review. You are not allowed to upload files at this time.", + msgErrorRetrievingDataset: "An error occurred while retrieving dataset information." }, fr: { title: "Envoi d'un dossier", @@ -47,6 +50,9 @@ const translations = { msgDeselectAll: "Tout désélectionner", msgMaxFilesExceeded: "Nombre maximal de fichiers dépassé. Décochez certains fichiers pour activer le transfert.", msgMaxFilesReached: "Nombre maximal de fichiers atteint. Décochez certains fichiers avant d'en sélectionner d'autres.", + msgDatasetLocked: "Ce jeu de données est actuellement verrouillé. Les envois de fichiers ne sont pas autorisés pour le moment.", + msgDatasetLockedInReview: "Ce jeu de données est actuellement en cours de révision. Vous n'êtes pas autorisé à télécharger des fichiers pour le moment.", + msgErrorRetrievingDataset: "Une erreur s'est produite lors de la récupération des informations du jeu de données." }, }; From 9b63f420b249139db8733fa866a08654a3282a0f Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 30 May 2025 14:14:25 -0400 Subject: [PATCH 2/4] fix orig file detection --- src/js/fileupload2.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/js/fileupload2.js b/src/js/fileupload2.js index a6a8742..f6fa2f4 100644 --- a/src/js/fileupload2.js +++ b/src/js/fileupload2.js @@ -327,8 +327,8 @@ async function retrieveDatasetInfo() { let df = entry.dataFile; let convertedFile = false; if (("originalFileFormat" in df) - && (!df.contentType === df.originalFileFormat)) { - console.log("The file named " + df.getString("filename") + && (!(df.contentType === df.originalFileFormat))) { + console.log("The file named " + df.filename + " on the server was created by Dataverse's ingest process from an original uploaded file"); convertedFile = true; } @@ -745,7 +745,7 @@ var fileUpload = class fileUploadClass { } ; function removeExtension(name) { - let extIndex = name.indexOf("."); + let extIndex = name.lastIndexOf("."); let sepIndex = name.indexOf('/'); if (extIndex > sepIndex) { return name.substring(0, extIndex); From ef87a41983933a0d423a2c02be09873f9240a9fc Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Wed, 4 Jun 2025 12:54:49 -0400 Subject: [PATCH 3/4] add content warning to separate panel --- src/css/dvwebloader.css | 6 ++++++ src/dvwebloader.html | 1 + src/js/fileupload2.js | 19 +++++++++++++++---- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/css/dvwebloader.css b/src/css/dvwebloader.css index a4de1ac..944e8b4 100644 --- a/src/css/dvwebloader.css +++ b/src/css/dvwebloader.css @@ -98,3 +98,9 @@ h1 { background-color: bisque; padding: 10px; } +#content-warnings div.warn { + margin: 10px; + border-color: chocolate; + border-width: 2px; + border-style: solid; +} diff --git a/src/dvwebloader.html b/src/dvwebloader.html index a4446e2..44dc84e 100644 --- a/src/dvwebloader.html +++ b/src/dvwebloader.html @@ -23,6 +23,7 @@

Folder Upload

+
diff --git a/src/js/fileupload2.js b/src/js/fileupload2.js index f6fa2f4..310b86a 100644 --- a/src/js/fileupload2.js +++ b/src/js/fileupload2.js @@ -238,6 +238,17 @@ function addMessage(type, key, ...keyArgs) { $('#messages').html('') .append($('
').addClass(type).html(msg)); } +function addContentWarning(key, ...keyArgs) { + let msg = getLocalizedString(dvLocale, key); + + if(keyArgs && Array.isArray(keyArgs)) { + for (var i = 0; i < keyArgs.length; i++) { + msg = msg.replaceAll('{'+i+'}',keyArgs[i]); + } + } + $('#content-warnings').html('') + .append($('
').addClass('warn').html(msg)); +} async function populatePageMetadata(data) { var mdFields = data.metadataBlocks.citation.fields; @@ -765,8 +776,8 @@ function queueFileForDirectUpload(file) { let path =origPath.substring(0, origPath.length - file.name.length); let badPath = (path.match(/^[\w\-\.\\\/ ]*$/)===null); if(badPath) { - if($('.warn').length==0) { - addMessage('warn', 'msgRequiredPathOrFileNameChange'); + if($('#content-warnings.warn').length==0) { + addContentWarning('msgRequiredPathOrFileNameChange'); } //Munge path according to rules path = path.replace(/[^\w\-\.\\\/ ]+/g,'_'); @@ -799,8 +810,8 @@ function queueFileForDirectUpload(file) { } let badChars = !(fUpload.file.name.match(/[:<>;#\/"*|?\\]/)===null); if(badChars) { - if($('.warn').length==0) { - addMessage('warn', 'msgRequiredPathOrFileNameChange'); + if($('#content-warnings.warn').length==0) { + addContentWarning('msgRequiredPathOrFileNameChange'); } } row.append($('').prop('type', 'checkbox').prop('id', 'file_' + fUpload.id).prop('checked', send)); From f9b16ce6626db1034ae37b33669dc54cda718f13 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Wed, 4 Jun 2025 13:14:09 -0400 Subject: [PATCH 4/4] cleanup --- src/dvwebloader.html | 2 +- src/js/fileupload2.js | 19 ++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/dvwebloader.html b/src/dvwebloader.html index 44dc84e..fc39f9f 100644 --- a/src/dvwebloader.html +++ b/src/dvwebloader.html @@ -27,7 +27,7 @@

Folder Upload

- DVWebloader v0.3 + DVWebloader v0.4alpha1