Changeset View
Changeset View
Standalone View
Standalone View
swh/web/assets/src/bundles/vault/vault-ui.js
/** | /** | ||||
* Copyright (C) 2018-2019 The Software Heritage developers | * Copyright (C) 2018-2019 The Software Heritage developers | ||||
* See the AUTHORS file at the top-level directory of this distribution | * See the AUTHORS file at the top-level directory of this distribution | ||||
* License: GNU Affero General Public License version 3, or any later version | * License: GNU Affero General Public License version 3, or any later version | ||||
* See top-level LICENSE file for more information | * See top-level LICENSE file for more information | ||||
*/ | */ | ||||
import {handleFetchError, handleFetchErrors, csrfPost} from 'utils/functions'; | import {handleFetchError, handleFetchErrors, csrfPost} from 'utils/functions'; | ||||
let progress = `<div class="progress"> | let progress = | ||||
`<div class="progress"> | |||||
<div class="progress-bar progress-bar-success progress-bar-striped" | <div class="progress-bar progress-bar-success progress-bar-striped" | ||||
role="progressbar" aria-valuenow="100" aria-valuemin="0" | role="progressbar" aria-valuenow="100" aria-valuemin="0" | ||||
aria-valuemax="100" style="width: 100%;height: 100%;"> | aria-valuemax="100" style="width: 100%;height: 100%;"> | ||||
</div> | </div> | ||||
</div>;`; | </div>;`; | ||||
let pollingInterval = 5000; | let pollingInterval = 5000; | ||||
let checkVaultId; | let checkVaultId; | ||||
function updateProgressBar(progressBar, cookingTask) { | function updateProgressBar(progressBar, cookingTask) { | ||||
if (cookingTask.status === 'new') { | if (cookingTask.status === 'new') { | ||||
progressBar.css('background-color', 'rgba(128, 128, 128, 0.5)'); | progressBar.css('background-color', 'rgba(128, 128, 128, 0.5)'); | ||||
} else if (cookingTask.status === 'pending') { | } else if (cookingTask.status === 'pending') { | ||||
▲ Show 20 Lines • Show All 104 Lines • ▼ Show 20 Lines | for (let i = 0; i < vaultCookingTasks.length; ++i) { | ||||
} else { | } else { | ||||
cookingUrl = Urls.api_1_vault_cook_revision_gitfast(cookingTask.object_id); | cookingUrl = Urls.api_1_vault_cook_revision_gitfast(cookingTask.object_id); | ||||
} | } | ||||
if (cookingTask.status !== 'done' && cookingTask.status !== 'failed') { | if (cookingTask.status !== 'done' && cookingTask.status !== 'failed') { | ||||
cookingTaskRequests.push(fetch(cookingUrl)); | cookingTaskRequests.push(fetch(cookingUrl)); | ||||
} | } | ||||
} | } | ||||
$('.swh-vault-table tbody tr').each((i, row) => { | $('.swh-vault-table tbody tr').each((i, row) => { | ||||
let objectId = $(row).find('.vault-object-id').data('object-id'); | let objectId = $(row).find('.vault-object-info').data('object-id'); | ||||
if ($.inArray(objectId, currentObjectIds) === -1) { | if ($.inArray(objectId, currentObjectIds) === -1) { | ||||
$(row).remove(); | $(row).remove(); | ||||
} | } | ||||
}); | }); | ||||
Promise.all(cookingTaskRequests) | Promise.all(cookingTaskRequests) | ||||
.then(handleFetchErrors) | .then(handleFetchErrors) | ||||
.then(responses => Promise.all(responses.map(r => r.json()))) | .then(responses => Promise.all(responses.map(r => r.json()))) | ||||
.then(cookingTasks => { | .then(cookingTasks => { | ||||
let table = $('#vault-cooking-tasks tbody'); | let table = $('#vault-cooking-tasks tbody'); | ||||
for (let i = 0; i < cookingTasks.length; ++i) { | for (let i = 0; i < cookingTasks.length; ++i) { | ||||
let cookingTask = tasks[cookingTasks[i].obj_id]; | let cookingTask = tasks[cookingTasks[i].obj_id]; | ||||
cookingTask.status = cookingTasks[i].status; | cookingTask.status = cookingTasks[i].status; | ||||
cookingTask.fetch_url = cookingTasks[i].fetch_url; | cookingTask.fetch_url = cookingTasks[i].fetch_url; | ||||
cookingTask.progress_message = cookingTasks[i].progress_message; | cookingTask.progress_message = cookingTasks[i].progress_message; | ||||
} | } | ||||
for (let i = 0; i < vaultCookingTasks.length; ++i) { | for (let i = 0; i < vaultCookingTasks.length; ++i) { | ||||
let cookingTask = vaultCookingTasks[i]; | let cookingTask = vaultCookingTasks[i]; | ||||
let rowTask = $('#vault-task-' + cookingTask.object_id); | let rowTask = $('#vault-task-' + cookingTask.object_id); | ||||
let downloadLinkWait = 'Waiting for download link to be available'; | |||||
if (!rowTask.length) { | if (!rowTask.length) { | ||||
let browseUrl; | let browseUrl = cookingTask.browse_url; | ||||
if (!browseUrl) { | |||||
if (cookingTask.object_type === 'directory') { | if (cookingTask.object_type === 'directory') { | ||||
browseUrl = Urls.browse_directory(cookingTask.object_id); | browseUrl = Urls.browse_directory(cookingTask.object_id); | ||||
} else { | } else { | ||||
browseUrl = Urls.browse_revision(cookingTask.object_id); | browseUrl = Urls.browse_revision(cookingTask.object_id); | ||||
} | } | ||||
} | |||||
let progressBar = $.parseHTML(progress)[0]; | let progressBar = $.parseHTML(progress)[0]; | ||||
let progressBarContent = $(progressBar).find('.progress-bar'); | let progressBarContent = $(progressBar).find('.progress-bar'); | ||||
updateProgressBar(progressBarContent, cookingTask); | updateProgressBar(progressBarContent, cookingTask); | ||||
let tableRow; | let tableRow; | ||||
if (cookingTask.object_type === 'directory') { | if (cookingTask.object_type === 'directory') { | ||||
tableRow = `<tr id="vault-task-${cookingTask.object_id}" title="Once downloaded, the directory can be extracted with the ` + | tableRow = | ||||
`<tr id="vault-task-${cookingTask.object_id}" ` + | |||||
`title="Once downloaded, the directory can be extracted with the ` + | |||||
`following command:\n\n$ tar xvzf ${cookingTask.object_id}.tar.gz">`; | `following command:\n\n$ tar xvzf ${cookingTask.object_id}.tar.gz">`; | ||||
} else { | } else { | ||||
tableRow = `<tr id="vault-task-${cookingTask.object_id}" title="Once downloaded, the git repository can be imported with the ` + | tableRow = | ||||
`following commands:\n\n$ git init\n$ zcat ${cookingTask.object_id}.gitfast.gz | git fast-import">`; | `<tr id="vault-task-${cookingTask.object_id}" ` + | ||||
'title="Once downloaded, the git repository can be imported with the ' + | |||||
`following commands:\n\n$ git init\n$ zcat ${cookingTask.object_id}.gitfast.gz | ` + | |||||
'git fast-import">'; | |||||
} | } | ||||
tableRow += '<td><div class="custom-control custom-checkbox">'; | tableRow += '<td><div class="custom-control custom-checkbox">'; | ||||
tableRow += `<input type="checkbox" class="custom-control-input vault-task-toggle-selection" id="vault-task-toggle-selection-${cookingTask.object_id}"/>`; | tableRow += | ||||
tableRow += `<label class="custom-control-label" for="vault-task-toggle-selection-${cookingTask.object_id}"></label></td>`; | '<input type="checkbox" class="custom-control-input vault-task-toggle-selection" ' + | ||||
tableRow += `<td style="width: 120px"><i class="${swh.webapp.getSwhObjectIcon(cookingTask.object_type)} mdi-fw"></i>${cookingTask.object_type}</td>`; | `id="vault-task-toggle-selection-${cookingTask.object_id}"/>`; | ||||
tableRow += `<td class="vault-object-id" data-object-id="${cookingTask.object_id}"><a href="${browseUrl}">${cookingTask.object_id}</a></td>`; | tableRow += | ||||
tableRow += `<td style="width: 350px">${progressBar.outerHTML}</td>`; | '<label class="custom-control-label" ' + | ||||
let downloadLink = downloadLinkWait; | `for="vault-task-toggle-selection-${cookingTask.object_id}"></label></td>`; | ||||
if (cookingTask.origin) { | |||||
tableRow += `<td class="vault-origin">` + | |||||
`<a href="${Urls.browse_origin()}?origin_url=${cookingTask.origin}">` + | |||||
`${cookingTask.origin}</a></td>`; | |||||
} else { | |||||
tableRow += `<td class="vault-origin">unknown</td>`; | |||||
} | |||||
tableRow += | |||||
`<td><i class="${swh.webapp.getSwhObjectIcon(cookingTask.object_type)} mdi-fw">` + | |||||
`</i>${cookingTask.object_type}</td>`; | |||||
tableRow += `<td class="vault-object-info" data-object-id="${cookingTask.object_id}">` + | |||||
`<b>id:</b> <a href="${browseUrl}">${cookingTask.object_id}</a>`; | |||||
if (cookingTask.path) { | |||||
tableRow += `<br/><b>path:</b> ${cookingTask.path}`; | |||||
} | |||||
tableRow += '</td>'; | |||||
tableRow += `<td>${progressBar.outerHTML}</td>`; | |||||
let downloadLink = ''; | |||||
if (cookingTask.status === 'done') { | if (cookingTask.status === 'done') { | ||||
downloadLink = `<button class="btn btn-default btn-sm" onclick="swh.vault.fetchCookedObject('${cookingTask.fetch_url}')` + | downloadLink = | ||||
'"><i class="mdi mdi-download mdi-fw" aria-hidden="true"></i>Download</button>'; | '<button class="btn btn-default btn-sm" ' + | ||||
} else if (cookingTask.status === 'failed') { | `onclick="swh.vault.fetchCookedObject('${cookingTask.fetch_url}')">` + | ||||
downloadLink = ''; | '<i class="mdi mdi-download mdi-fw" aria-hidden="true"></i>Download</button>'; | ||||
} | } | ||||
tableRow += `<td class="vault-dl-link" style="width: 320px">${downloadLink}</td>`; | tableRow += `<td class="vault-dl-link">${downloadLink}</td>`; | ||||
tableRow += '</tr>'; | tableRow += '</tr>'; | ||||
table.prepend(tableRow); | table.prepend(tableRow); | ||||
} else { | } else { | ||||
let progressBar = rowTask.find('.progress-bar'); | let progressBar = rowTask.find('.progress-bar'); | ||||
updateProgressBar(progressBar, cookingTask); | updateProgressBar(progressBar, cookingTask); | ||||
let downloadLink = rowTask.find('.vault-dl-link'); | let downloadLink = rowTask.find('.vault-dl-link'); | ||||
if (cookingTask.status === 'done') { | if (cookingTask.status === 'done') { | ||||
downloadLink[0].innerHTML = `<button class="btn btn-default btn-sm" onclick="swh.vault.fetchCookedObject('${cookingTask.fetch_url}')` + | downloadLink[0].innerHTML = | ||||
'"><i class="mdi mdi-download mdi-fw" aria-hidden="true"></i>Download</button>'; | '<button class="btn btn-default btn-sm" ' + | ||||
} else if (cookingTask.status === 'failed') { | `onclick="swh.vault.fetchCookedObject('${cookingTask.fetch_url}')">` + | ||||
'<i class="mdi mdi-download mdi-fw" aria-hidden="true"></i>Download</button>'; | |||||
} else { | |||||
downloadLink[0].innerHTML = ''; | downloadLink[0].innerHTML = ''; | ||||
} else if (cookingTask.status === 'new') { | |||||
downloadLink[0].innerHTML = downloadLinkWait; | |||||
} | } | ||||
} | } | ||||
} | } | ||||
localStorage.setItem('swh-vault-cooking-tasks', JSON.stringify(vaultCookingTasks)); | localStorage.setItem('swh-vault-cooking-tasks', JSON.stringify(vaultCookingTasks)); | ||||
checkVaultId = setTimeout(checkVaultCookingTasks, pollingInterval); | checkVaultId = setTimeout(checkVaultCookingTasks, pollingInterval); | ||||
}) | }) | ||||
.catch(() => {}); | .catch(() => {}); | ||||
} | } | ||||
Show All 16 Lines | export function initUi() { | ||||
}); | }); | ||||
$('#vault-remove-tasks').click(() => { | $('#vault-remove-tasks').click(() => { | ||||
clearTimeout(checkVaultId); | clearTimeout(checkVaultId); | ||||
let tasksToRemove = []; | let tasksToRemove = []; | ||||
$('.swh-vault-table tbody tr').each((i, row) => { | $('.swh-vault-table tbody tr').each((i, row) => { | ||||
let taskSelected = $(row).find('.vault-task-toggle-selection').prop('checked'); | let taskSelected = $(row).find('.vault-task-toggle-selection').prop('checked'); | ||||
if (taskSelected) { | if (taskSelected) { | ||||
let objectId = $(row).find('.vault-object-id').data('object-id'); | let objectId = $(row).find('.vault-object-info').data('object-id'); | ||||
tasksToRemove.push(objectId); | tasksToRemove.push(objectId); | ||||
$(row).remove(); | $(row).remove(); | ||||
} | } | ||||
}); | }); | ||||
removeCookingTaskInfo(tasksToRemove); | removeCookingTaskInfo(tasksToRemove); | ||||
$('#vault-tasks-toggle-selection').prop('checked', false); | $('#vault-tasks-toggle-selection').prop('checked', false); | ||||
checkVaultId = setTimeout(checkVaultCookingTasks, pollingInterval); | checkVaultId = setTimeout(checkVaultCookingTasks, pollingInterval); | ||||
}); | }); | ||||
Show All 9 Lines |