296 lines
9.2 KiB
JavaScript
296 lines
9.2 KiB
JavaScript
// vim:set sw=4 ts=4 sts=4 ft=javascript expandtab:
|
|
// Add item to localStorage
|
|
function addItem(item) {
|
|
var files = localStorage.getItem(`${window.prefix}files`);
|
|
if (files === null) {
|
|
files = new Array();
|
|
} else {
|
|
files = JSON.parse(files);
|
|
}
|
|
files.push(item);
|
|
localStorage.setItem(`${window.prefix}files`, JSON.stringify(files));
|
|
}
|
|
|
|
function delItem(name) {
|
|
var files = localStorage.getItem(`${window.prefix}files`);
|
|
if (files === null) {
|
|
files = new Array();
|
|
} else {
|
|
files = JSON.parse(files);
|
|
}
|
|
var i;
|
|
for (i = 0; i < files.length; i++) {
|
|
if (files[i].short === name) {
|
|
files.splice(i, 1);
|
|
}
|
|
}
|
|
localStorage.setItem(`${window.prefix}files`, JSON.stringify(files));
|
|
}
|
|
|
|
function itemExists(name) {
|
|
var files = localStorage.getItem(`${window.prefix}files`);
|
|
if (files === null) {
|
|
return false;
|
|
} else {
|
|
files = JSON.parse(files);
|
|
var i;
|
|
for (i = 0; i < files.length; i++) {
|
|
if (files[i].short === name) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function invertSelection(event) {
|
|
event.preventDefault();
|
|
$('input[type="checkbox"]').each(function() {
|
|
var el = $(this);
|
|
el.click();
|
|
if (el.attr('data-checked') && el.attr('data-checked') === 'data-checked') {
|
|
el.attr('data-checked', null);
|
|
} else {
|
|
el.attr('data-checked', 'data-checked');
|
|
}
|
|
});
|
|
evaluateMassDelete();
|
|
}
|
|
|
|
function purgeExpired(event) {
|
|
event.preventDefault();
|
|
var files = JSON.parse(localStorage.getItem(`${window.prefix}files`));
|
|
|
|
files.forEach(function(element, index, array) {
|
|
$.ajax({
|
|
url: counterURL,
|
|
method: 'POST',
|
|
dataType: 'json',
|
|
data: {
|
|
short: element.short,
|
|
token: element.token
|
|
},
|
|
success: function(data, textStatus, jqXHR) {
|
|
if (data.success) {
|
|
if (data.deleted) {
|
|
$(`#count-${data.short}`).parent().remove();
|
|
delItem(data.short);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
function exportStorage(event) {
|
|
event.preventDefault();
|
|
var a = $('<a id="data-json">');
|
|
a.hide();
|
|
$('body').append(a);
|
|
|
|
var storageData = [localStorage.getItem(`${window.prefix}files`)];
|
|
var exportFile = new Blob(storageData, {type : 'application/json'});
|
|
var url = window.URL.createObjectURL(exportFile);
|
|
|
|
a.attr('href', url);
|
|
a.attr('download', 'data.json');
|
|
$('#data-json')[0].click();
|
|
$('#data-json').remove();
|
|
}
|
|
|
|
function importStorage(f) {
|
|
var reader = new FileReader();
|
|
reader.addEventListener("loadend", function() {
|
|
try {
|
|
var newFiles = JSON.parse(String.fromCharCode.apply(null, new Uint8Array(reader.result)));
|
|
var i;
|
|
var hasImported = 0;
|
|
for (i = 0; i < newFiles.length; i++) {
|
|
var item = newFiles[i];
|
|
if (validURL(item.url) && !itemExists(item.short)) {
|
|
addItem(item);
|
|
hasImported++;
|
|
}
|
|
}
|
|
populateFilesTable();
|
|
|
|
Materialize.toast(i18n.importProcessed);
|
|
} catch(err) {
|
|
alert(err);
|
|
}
|
|
});
|
|
reader.readAsArrayBuffer(f[0]);
|
|
}
|
|
|
|
function validURL(str) {
|
|
try {
|
|
var url = new URL(str);
|
|
if (url.host) {
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
} catch(e) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function delFile() {
|
|
var dlink = $(this).attr('data-dlink');
|
|
var short = $(this).attr('data-short');
|
|
$.ajax({
|
|
url: dlink,
|
|
method: 'GET',
|
|
data: {
|
|
_format: 'json'
|
|
},
|
|
success: function(data) {
|
|
if (data.success) {
|
|
$(`#row-${short}`).remove();
|
|
delItem(short);
|
|
} else {
|
|
alert(data.msg);
|
|
}
|
|
evaluateMassDelete();
|
|
},
|
|
error: function() {
|
|
},
|
|
complete: function() {
|
|
}
|
|
});
|
|
}
|
|
|
|
function evaluateMassDelete() {
|
|
if ($('input[data-checked="data-checked"]').length > 0) {
|
|
$('#mass-delete').removeAttr('disabled');
|
|
$('#mass-delete').removeClass('disabled');
|
|
} else {
|
|
$('#mass-delete').attr('disabled');
|
|
$('#mass-delete').addClass('disabled');
|
|
}
|
|
}
|
|
|
|
function massDelete(event) {
|
|
event.preventDefault();
|
|
$('input[data-checked="data-checked"]').each(delFile);
|
|
}
|
|
|
|
function populateFilesTable() {
|
|
$('#myfiles').empty();
|
|
|
|
var files = localStorage.getItem(`${window.prefix}files`);
|
|
if (files === null) {
|
|
var filesWithoutPrefix = localStorage.getItem('files');
|
|
if (filesWithoutPrefix !== null) {
|
|
if (window.confirm(i18n.importFilesWithoutPrefix)) {
|
|
localStorage.setItem(`${window.prefix}files`, filesWithoutPrefix);
|
|
files = JSON.parse(filesWithoutPrefix);
|
|
} else {
|
|
localStorage.setItem(`${window.prefix}files`, JSON.stringify([]));
|
|
files = new Array();
|
|
}
|
|
} else {
|
|
files = new Array();
|
|
}
|
|
} else {
|
|
files = JSON.parse(files);
|
|
}
|
|
files.sort(function(a, b) {
|
|
if (a.created_at < b.created_at) {
|
|
return -1;
|
|
} else if (a.created_at > b.created_at) {
|
|
return 1;
|
|
} else {
|
|
return 0
|
|
}
|
|
});
|
|
files.forEach(function(element, index, array) {
|
|
var del_view = (element.del_at_first_view) ? '<i class="small mdi-action-done"></i>' : '<i class="small mdi-navigation-close"></i>';
|
|
var dlink = `${actionURL}d/${element.short}/${element.token}`;
|
|
var limit = (element.delay === 0) ? i18n.noExpiration : formatDate(element.delay * 86400 + element.created_at);
|
|
var created_at = formatDate(element.created_at);
|
|
|
|
var tr = $(`<tr id="row-${element.short}">`);
|
|
tr.html(`<td class="center-align">
|
|
<input type="checkbox"
|
|
id="check-${element.short}"
|
|
data-short="${element.short}"
|
|
data-dlink="${dlink}"
|
|
data-checked="">
|
|
<label for="check-${element.short}"></label>
|
|
</td>
|
|
<td class="left-align">
|
|
${escapeHtml(element.name)}
|
|
</td>
|
|
<td class="center-align">
|
|
<a href="${element.url}"
|
|
class="classic">
|
|
<i class="small mdi-file-file-download"></i>
|
|
</a>
|
|
</td>
|
|
<td id="count-${element.short}" class="center-align">
|
|
</td>
|
|
<td class="center-align">
|
|
${del_view}
|
|
</td>
|
|
<td>
|
|
${created_at}
|
|
</td>
|
|
<td>
|
|
${limit}
|
|
</td>
|
|
<td class="center-align">
|
|
<a id="del-${element.short}"
|
|
data-short="${element.short}"
|
|
data-dlink="${dlink}"
|
|
href="#"
|
|
class="classic">
|
|
<i class="small mdi-action-delete"></i>
|
|
</a>
|
|
</td>
|
|
<td class="center-align">
|
|
<a href="${actionURL}m?links=["${element.short}"]"
|
|
class="classic"><i class="small mdi-communication-email"></i></a>
|
|
</td>`);
|
|
$('#myfiles').append(tr);
|
|
$(`#del-${element.short}`).on('click', delFile);
|
|
$(`label[for="check-${element.short}"]`).on('click', function(){
|
|
if ($(`#check-${element.short}`).attr('data-checked') && $(`#check-${element.short}`).attr('data-checked') === 'data-checked') {
|
|
$(`#check-${element.short}`).attr('data-checked', null);
|
|
} else {
|
|
$(`#check-${element.short}`).attr('data-checked', 'data-checked');
|
|
}
|
|
evaluateMassDelete();
|
|
});
|
|
|
|
$.ajax({
|
|
url: counterURL,
|
|
method: 'POST',
|
|
dataType: 'json',
|
|
data: {
|
|
short: element.short,
|
|
token: element.token
|
|
},
|
|
success: function(data, textStatus, jqXHR) {
|
|
if (data.success) {
|
|
$(`#count-${data.short}`).html(data.counter);
|
|
if (data.deleted) {
|
|
$(`#count-${data.short}`).parent().addClass('purple lighten-4');
|
|
}
|
|
} else {
|
|
alert(data.msg);
|
|
$(`#count-${data.short}`).parent().remove();
|
|
if (data.missing) {
|
|
delItem(data.short);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
function clickImport(event) {
|
|
event.preventDefault();
|
|
$('#import').click();
|
|
}
|