Skip to content

Commit fb01568

Browse files
authored
Add Delete File (#31)
* Add Delete File * Add Delete Confirm Options
1 parent f82dcd7 commit fb01568

File tree

4 files changed

+119
-9
lines changed

4 files changed

+119
-9
lines changed

src/html/options.html

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,15 @@ <h1>Django Files Options</h1>
8080
</span>
8181
</label>
8282
</div>
83+
<div class="form-check form-switch mb-2">
84+
<input class="form-check-input" id="deleteConfirm" type="checkbox" role="switch">
85+
<label class="form-check-label" for="deleteConfirm" aria-describedby="deleteConfirmHelp">
86+
Show Confirmation on Delete
87+
<span data-bs-toggle="tooltip" data-bs-title="Show a File Delete Confirmation Dialog.">
88+
<i class="fa-solid fa-circle-info ms-1"></i>
89+
</span>
90+
</label>
91+
</div>
8392
<div class="form-check form-switch mb-2">
8493
<input class="form-check-input" id="checkAuth" type="checkbox" role="switch">
8594
<label class="form-check-label" for="checkAuth" aria-describedby="checkAuthHelp">

src/html/popup.html

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,17 +58,34 @@ <h3 class="my-0">Django Files</h3>
5858

5959
<table id="files-table" class="d-none table table-striped table-hover table-sm small align-middle mb-0">
6060
<caption class="visually-hidden">Recent Uploads</caption>
61-
<thead class="visually-hidden"><tr><th>Options</th><th>File URL</th></tr></thead>
61+
<thead class="visually-hidden"><tr><th>Copy</th><th>File URL</th><th>Delete</th></tr></thead>
6262
<tbody></tbody>
6363
<tfoot class="d-none">
6464
<tr>
6565
<td colspan="align-middle" style="width: 20px;"><i class="fa-solid fa-spinner fa-spin"></i></td>
6666
<td class="placeholder-glow"><span class="placeholder" style="width: 100%;"></span></td>
67+
<td class="placeholder-glow" style="width: 20px;"><i class="fa-solid fa-circle-dot fa-xs"></i></td>
6768
</tr>
6869
</tfoot>
6970
</table>
7071
</div>
7172

73+
<div class="modal fade" id="delete-modal" tabindex="-1" aria-hidden="true">
74+
<div class="modal-dialog modal-dialog-centered">
75+
<div class="modal-content">
76+
<div class="modal-body text-center">
77+
<p>Are you sure you want to delete this file?</p>
78+
<p><kbd id="delete-name" class="text-break"></kbd></p>
79+
</div>
80+
<div class="modal-footer">
81+
<button type="button" class="btn btn-danger" id="confirm-delete">
82+
Delete <i class="fa-regular fa-trash-can ms-1"></i></button>
83+
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
84+
</div>
85+
</div> <!-- modal-content -->
86+
</div> <!-- modal-dialog -->
87+
</div> <!-- modal -->
88+
7289
<script type="text/javascript" src="../dist/polyfill/browser-polyfill.min.js"></script>
7390
<script type="text/javascript" src="../dist/jquery/jquery.min.js"></script>
7491
<script type="text/javascript" src="../dist/bootstrap/bootstrap.bundle.min.js"></script>

src/js/popup.js

Lines changed: 91 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
chrome.runtime.onMessage.addListener(onMessage)
44
document.addEventListener('DOMContentLoaded', initPopup)
5+
document
6+
.getElementById('confirm-delete')
7+
.addEventListener('click', deleteConfirm)
58
document
69
.querySelectorAll('a[href]')
710
.forEach((el) => el.addEventListener('click', popupLinks))
@@ -18,10 +21,12 @@ document
1821
const filesTable = document.getElementById('files-table')
1922
const errorAlert = document.getElementById('error-alert')
2023
const authButton = document.getElementById('auth-button')
21-
const mediaImage = document.getElementById('media-image')
22-
const mediaOuter = document.getElementById('media-outer')
2324
const alwaysAuth = document.getElementById('always-auth')
25+
const mediaOuter = document.getElementById('media-outer')
26+
const mediaImage = document.getElementById('media-image')
2427
const mediaError = document.getElementById('media-error')
28+
const deleteName = document.getElementById('delete-name')
29+
const deleteModal = bootstrap.Modal.getOrCreateInstance('#delete-modal')
2530

2631
const loadingImage = '../media/loading.gif'
2732
let authError = false
@@ -291,11 +296,10 @@ function updateTable(data) {
291296
const copy = document.createElement('a')
292297
copy.title = 'Copy'
293298
copy.setAttribute('role', 'button')
294-
copy.classList.add('clip')
295-
copy.dataset.clipboardText = value
299+
copy.classList.add('link-body-emphasis', 'clip')
296300
copy.innerHTML = '<i class="fa-regular fa-clipboard"></i>'
297-
copy.classList.add('link-body-emphasis')
298-
copy.onclick = clipClick
301+
copy.dataset.clipboardText = value
302+
copy.addEventListener('click', clipClick)
299303
const cell0 = row.cells[0]
300304
cell0.classList.add('align-middle')
301305
cell0.style.width = '20px'
@@ -310,9 +314,11 @@ function updateTable(data) {
310314
link.classList.add(
311315
'link-underline',
312316
'link-underline-opacity-0',
313-
'link-underline-opacity-75-hover'
317+
'link-underline-opacity-75-hover',
318+
'file-link'
314319
)
315320
link.target = '_blank'
321+
link.dataset.name = name
316322
link.dataset.raw =
317323
url.origin +
318324
url.pathname.replace(/^\/u\//, '/raw/') +
@@ -321,7 +327,84 @@ function updateTable(data) {
321327
cell1.classList.add('text-break')
322328
cell1.innerHTML = ''
323329
cell1.appendChild(link)
330+
331+
const del = document.createElement('a')
332+
del.title = 'Delete'
333+
del.setAttribute('role', 'button')
334+
del.classList.add('link-danger')
335+
del.innerHTML = '<i class="fa-regular fa-trash-can"></i>'
336+
del.addEventListener('click', deleteClick)
337+
const cell2 = row.cells[2]
338+
cell2.classList.add('align-middle')
339+
cell2.style.width = '20px'
340+
cell2.innerHTML = ''
341+
cell2.appendChild(del)
342+
}
343+
}
344+
345+
/**
346+
* Delete Click Callback
347+
* @function deleteClick
348+
* @param {MouseEvent} event
349+
*/
350+
async function deleteClick(event) {
351+
console.log('deleteClick:', event)
352+
const closest = event.target?.closest('tr').querySelector('.file-link')
353+
const name = closest.dataset?.name
354+
console.log('name:', name)
355+
if (!name) {
356+
return console.error('No name for: event, closest', event, closest)
357+
}
358+
deleteName.textContent = name
359+
const { options } = await chrome.storage.sync.get(['options'])
360+
if (options.deleteConfirm) {
361+
deleteModal.show()
362+
} else {
363+
await deleteConfirm(event)
364+
}
365+
}
366+
367+
/**
368+
* Confirm Delete Click Callback
369+
* @function deleteConfirm
370+
* @param {MouseEvent} event
371+
*/
372+
async function deleteConfirm(event) {
373+
console.log('deleteConfirm:', event)
374+
const name = deleteName.textContent
375+
console.log(`Deleting File: ${name}`)
376+
// TODO: Catch Error...
377+
const response = await deleteFile(name)
378+
console.log('response:', response)
379+
if (response.ok) {
380+
mediaOuter.classList.add('d-none')
381+
deleteModal.hide()
382+
await initPopup()
383+
} else {
384+
// TODO: Handle Error...
385+
console.error('Error Deleting File: name, response:', name, response)
386+
}
387+
}
388+
389+
/**
390+
* Post URL to endpoint
391+
* @function deleteFile
392+
* @param {String} name
393+
* @return {Response}
394+
*/
395+
async function deleteFile(name) {
396+
console.log(`deleteFile: ${name}`)
397+
const { options } = await chrome.storage.sync.get(['options'])
398+
console.log('options:', options)
399+
const headers = { Authorization: options.authToken }
400+
const opts = {
401+
method: 'DELETE',
402+
headers: headers,
324403
}
404+
const apiUrl = `${options.siteUrl}/api/delete/${name}`
405+
const response = await fetch(apiUrl, opts)
406+
console.log('response:', response)
407+
return response
325408
}
326409

327410
/**
@@ -389,7 +472,7 @@ function initPopupMouseover() {
389472
mediaError.classList.remove('d-none')
390473
mediaImage.src = '../media/loading.gif'
391474
})
392-
document.querySelectorAll('.link-underline').forEach((el) => {
475+
document.querySelectorAll('.file-link').forEach((el) => {
393476
el.addEventListener('mouseover', onMouseOver)
394477
el.addEventListener('mouseout', onMouseOut)
395478
})

src/js/service-worker.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ async function onInstalled(details) {
2121
popupTimeout: 3,
2222
contextMenu: true,
2323
popupPreview: true,
24+
deleteConfirm: true,
2425
checkAuth: true,
2526
showUpdate: false,
2627
})

0 commit comments

Comments
 (0)