Skip to content
Snippets Groups Projects
Commit 5752716f authored by Jerome Chauveau's avatar Jerome Chauveau
Browse files

delete collection feature

parent 8eee3562
No related branches found
No related tags found
No related merge requests found
......@@ -39,9 +39,9 @@ declare
%updating
%rest:path("/bundles/max-db/{$path=.+}")
function max-db:delete($path as xs:string){
if(db:exists($database:max-db, $path))
then db:delete($database:max-db, $path)
else fn:error(fn:QName('https://certic.unicaen.fr/max/max-db', 'err:source-not-found'), 'source file does not exist')
try {db:delete($database:max-db, $path)}
catch * { fn:error(fn:QName('https://certic.unicaen.fr/max/max-db', 'err:cannot-delete'), $path) }
};
......@@ -84,7 +84,7 @@ declare %private function max-db:max-collections() as xs:string*{
let $prefix := '/max/'
let $collections := distinct-values(for $i in collection('max/')
let $path := replace(replace(base-uri($i),tokenize(base-uri($i),'/')[last()],''),$prefix,'')
return if($path='')then() else $path)
return if($path='')then '/' else $path)
return $collections
};
#drop_zone.active{
#drop-zone.active{
background-color: #444;
color:#FFF;
}
header h3 em{
color: #888;
}
ul {
list-style-type: square;
margin-left:0;
......
......@@ -20,6 +20,23 @@ function deleteSource(source) {
}
function downloadSource(source){
alert('todo delete ' + source)
}
function deleteCurrentCollection(){
if (confirm(`Supprimer ${currentCollection} ?`)) {
fetch(`/bundles/max-db/${currentCollection}`, { method: 'DELETE' }).then((res) => {
if (res.status == 200){
window.location.href = '/bundles/max-db/';
}
else {
res.text().then((message) => alert(`Une erreur est survenue, suppression impossible. \n\n ${message}).`))
}
})
}
}
function openMoveSourceDialog(source) {
document.getElementById('modal-title').innerHTML=`Déplacer <em>${source}</em>`
if(!modal)
......@@ -30,9 +47,10 @@ function openMoveSourceDialog(source) {
function doMoveSource(){
const collection = document.getElementById('move-collection-select').value
console.debug('Move ' + currentSource + ' to '+ collection)
const path = currentCollection === '/' ? currentSource : `${currentCollection}/${currentSource}`
console.debug('Move ' + path + ' to '+ collection)
modal.hide()
fetch(`/bundles/max-db/move?sourcePath=${currentSource}&collection=${collection}`, {method: 'POST'}).then((res) => {
fetch(`/bundles/max-db/move?sourcePath=${path}&collection=${collection}`, {method: 'POST'}).then((res) => {
if(res.status == 200)
window.location.reload();
else {
......@@ -48,8 +66,12 @@ async function dropHandler(ev) {
const droppedFiles = await DirectoryDropReader.getFilesFromDropEvent(ev)
console.debug(droppedFiles)
const files = [...droppedFiles][0]
files.forEach((f)=> console.debug(f))
console.debug(files)
document.getElementById('drop-zone').classList.add('d-none')
document.getElementById('progress-wrapper').classList.remove('d-none')
const progressBar = document.getElementById('progress')
const step = Math.floor(100 / files.length)
let value = 0;
for(let i = 0; i < files.length; i++){
console.debug(files[i])
const f = files[i]
......@@ -61,17 +83,20 @@ async function dropHandler(ev) {
method: 'POST',
body: data,
})
value += step;
progressBar.value = value;
progressBar.textContent = `${value}%`;
}
window.location.reload(true);
}
function dragLeaveHandler(ev) {
ev.preventDefault();
document.getElementById("drop_zone").classList.remove('active');
document.getElementById("drop-zone").classList.remove('active');
}
function dragOverHandler(ev) {
ev.preventDefault();
document.getElementById("drop_zone").classList.add('active');
document.getElementById("drop-zone").classList.add('active');
}
/**
......
......@@ -14,27 +14,34 @@
</script>
</head>
<body>
<main class="container">
<main>
<sl-split-panel position="75">
<div
slot="start"
style="height: 100vh; display: flex; flex-direction:column; background: var(--sl-color-neutral-50); "
style="height: 100vh; display: flex; flex-direction:column; overflow-y:auto;"
>
<div>
<div class="m-5">
<header>
<h1 class="text-center">Gestion des sources XML de MaX</h1>
<h2>Collection <em>{$collection}</em></h2>
<h1 class="text-center mb-3">Gestion des sources XML de MaX</h1>
<h3 class="mt-3 d-flex justify-content-between">
<span>Collection <em>{$collection}</em></span>
<sl-icon-button name="trash" title="supprimer la collection" label="supprimer la collection" onclick="deleteCurrentCollection()">
</sl-icon-button>
</h3>
</header>
<section class="mt-3">
<div class="mt-5 mb-5 d-flex justify-content-center align-items-center"
id="drop_zone"
id="drop-zone"
ondrop="dropHandler(event);"
ondragleave="dragLeaveHandler(event)"
ondragover="dragOverHandler(event);"
style="min-height:100px;border: dashed 4px #ddd;">
Pour ajouter des sources, déposez un ou plusieurs fichiers XML dans cette zone
</div>
<div id="progress-wrapper" style="min-height:100px;" class="d-none">
<sl-progress-bar value="0" id="progress">0%</sl-progress-bar>
</div>
</section>
<section>
<h3>Sources XML (<span id="sources-count">{count($sources[@type='xml'])}</span>)</h3>
......@@ -57,8 +64,12 @@
<td>{string($source/@size)}</td>
<td>{string($source/@modified-date)}</td>
<td class="text-center">
<button title="supprimer" class="btn" onclick="deleteSource('{$source/data()}')">&#9747;</button>
<button title="déplacer" class="btn" onclick="openMoveSourceDialog('{$source/data()}')">&#x21ab;</button>
<sl-icon-button name="download" title="télécharger" onclick="downloadSource('{$source/data()}')">
</sl-icon-button>
<sl-icon-button name="hand-index" title="déplacer" onclick="openMoveSourceDialog('{$source/data()}')">
</sl-icon-button>
<sl-icon-button name="trash" title="supprimer" onclick="deleteSource('{$source/data()}')">
</sl-icon-button>
</td>
</tr>
else()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment