Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/css/dvwebloader.css
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
3 changes: 2 additions & 1 deletion src/dvwebloader.html
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,11 @@ <h1><span id="title-text">Folder Upload</span></h1>
<div id="top">
<label for='files' class='button'><span id="select-dir-text">Select a Directory</span><input type="file" id="files" name="files[]" multiple webkitdirectory style="display: none" /></label>
<div id='messages'></div>
<div id='content-warnings'></div>
</div>
<div id="filelist"></div>
<div id="credit">
<a href='https://github.com/gdcc/dvwebloader' target='_blank'>DVWebloader v0.3</a><span id="sponsor-text">, development sponsored by UiT/DataverseNO</span>
<a href='https://github.com/gdcc/dvwebloader' target='_blank'>DVWebloader v0.4alpha1</a><span id="sponsor-text">, development sponsored by UiT/DataverseNO</span>
</div>
<script>
var input = document
Expand Down
161 changes: 109 additions & 52 deletions src/js/fileupload2.js
Original file line number Diff line number Diff line change
Expand Up @@ -227,18 +227,30 @@ function initTranslation() {
function initSpanTxt(htmlId, key) {
$('#'+htmlId).text(getLocalizedString(dvLocale, key));
}
function addMessage(type, key, ...keyArgs) {

function formatMessage(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]);
msg = msg.replaceAll('{'+i+'}', keyArgs[i]);
}
}
return msg;
}

function addMessage(type, key, ...keyArgs) {
let msg = formatMessage(key, keyArgs);
$('#messages').html('')
.append($('<div/>').addClass(type).html(msg));
}

function addContentWarning(key, ...keyArgs) {
let msg = formatMessage(key, keyArgs);
$('#content-warnings').html('')
.append($('<div/>').addClass('warn').html(msg));
}

async function populatePageMetadata(data) {
var mdFields = data.metadataBlocks.citation.fields;
var title = "";
Expand Down Expand Up @@ -266,52 +278,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.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) {
Expand Down Expand Up @@ -699,7 +757,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);
Expand All @@ -719,8 +777,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,'_');
Expand Down Expand Up @@ -753,8 +811,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($('<input/>').prop('type', 'checkbox').prop('id', 'file_' + fUpload.id).prop('checked', send));
Expand Down Expand Up @@ -867,7 +925,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--) {
Expand Down Expand Up @@ -1136,7 +1193,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) => {
Expand All @@ -1155,4 +1212,4 @@ function getChecksum(blob, cbProgress) {
}
});
});
}
}
6 changes: 6 additions & 0 deletions src/js/lang.js
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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."
},
};

Expand Down