public/js/comment.js (271 lines of code) (raw):
// Copyright (c) 2018 Chandan B N. All rights reserved.
async function sendComment(f) {
var comment = {
id: f.id.value,
text: f.commentarea.innerHTML,
plainText: domhtml(f.commentarea.innerHTML)
};
if (f.slug && f.slug.value) {
comment.slug = f.slug.value;
}
if (f.date && f.date.value) {
comment.date = f.date.value;
}
try {
var response = await fetch('comment/', {
method: 'POST',
credentials: 'include',
headers: {
'Accept': 'application/json, text/plain, */*',
'Content-Type': 'application/json',
'CSRF-Token': csrfToken
},
body: JSON.stringify(comment),
});
} catch (e) {
//console.log('fetch failed ' + e)
}
if (response.ok) {
try {
var json = await response.json();
if (json.ok) {
if(f.slug) {
//f.wys.destroy();
//f.remove();
} else {
f.wys.setValue('');
}
setComments(f.id.value, json.ret);
} else {
alert('Error adding comment: ' + json.msg);
}
} catch (e) {
alert('Error adding comment. Please reload the page and try again' + e + JSON.stringify(response));
}
} else {
alert('Failed to add comment. Please reload the page and try again');
}
}
async function setComments(id, cs) {
//var json = await getSubDocs('comment', id);
document.getElementById('comments').innerHTML = subdocRender({
ctemplate: 'comments',
docs: cs,
id: id,
username: userUsername
});
}
async function getFiles() {
var json = await getSubDocs('files', getDocID());
document.getElementById('fileList').innerHTML = subdocRender({
ctemplate: 'fileList',
files: json,
doc_id: getDocID()
});
}
function fileDelete(m) {
var fileLink = m.parentNode.parentNode.firstChild.firstChild;
var url = fileLink.getAttribute('href');
itemDelete(url, fileLink.textContent, getFiles);
}
function itemDelete(url, id, cb) {
if (confirm('Delete this ' + id + '?')) {
fetch(url, {
method: 'DELETE',
credentials: 'include',
redirect: 'error',
headers: {
'Accept': 'application/json, text/plain, */*',
'CSRF-Token': csrfToken
},
}).then(function (response) {
if (response.status == 200) {
infoMsg.textContent = "Deleted ";
errMsg.textContent = "";
} else {
errMsg.textContent = "Error " + response.statusText;
infoMsg.textContent = "";
}
cb();
}).catch(function(error) {
alert('Error Deleting file! Try reloading page!');
});
}
}
async function getChanges(id) {
var json = await getSubDocs('log', id);
changelog.innerHTML = subdocRender({
ctemplate: 'changes',
docs: json
});
}
async function getSubDocs(docType, id) {
try {
var response = await fetch(docType + '/' + id, {
method: 'GET',
credentials: 'include',
headers: {
'Accept': 'application/json, text/plain, */*',
'Content-Type': 'application/json',
'CSRF-Token': csrfToken
}
});
if (response.ok) {
var json = await response.json();
return json;
}
} catch (e) {
//console.log('Error loading comments');
}
}
function editPost(c) {
var text = c.nextSibling; // the div tag following dt tag
var slug = text.nextSibling;
var date = slug.nextSibling;
var nf = newCommentBox(text);
nf.appendChild(slug);
nf.appendChild(date);
nf.button.textContent = "Update";
var page = c.parentNode;
page.parentNode.replaceChild(nf, page);
}
function newCommentBox(div) {
var nc = document.getElementById("commentTemplate").cloneNode(true); // new comment
var nf = nc.firstElementChild;
nf.commentarea = nc.getElementsByClassName('wysihtml5-editor')[0];
if(div) {
if(!div.classList.contains('txt')){
div.classList.add('txt');
}
nf.replaceChild(div, nf.commentarea);
nf.commentarea = div;
}
document.getElementById("commentTemplate").insertAdjacentElement('afterend', nf)
var wys = new wysihtml5.Editor(nf.commentarea, {
toolbar: nf.getElementsByClassName('toolbar')[0],
parserRules: wysihtml5ParserRules
});
wys.on("load", function () {
//wys.setValue(div);
nf.button.disabled = wys.isEmpty();
wys.composer.doc.onkeyup = function () {
if(wys.currentView == 'source') {
nf.button.disabled = !(wys.sourceView.textarea.value);
} else {
nf.button.disabled = wys.isEmpty()
}
};
function preventDefault(event) {
event.preventDefault();
};
function alertFiles(event) {
var files = event.dataTransfer.files;
//console.log(files);
if(files && files.length > 0) {
event.preventDefault();
var i =0;
for(i = 0; i< files.length; i++) {
var reader = new FileReader();
reader.onload = function (e) {
//console.log(e.target.result);
wys.composer.commands.exec("insertHTML", '<img src="' + e.target.result+'"/>');
wys.composer.commands.exec('insertImage',e.target.result);
}
reader.readAsDataURL(files[i]);
}
}
};
wys.on("dragleave", preventDefault);
wys.on("drop", alertFiles);
});
nf.wys = wys;
return nf;
}
function preview(el, ev) {
var files = [];
for (var i = 0; i < el.files.length; i++) {
files.push({
'Selected File': el.files[i].name,
size: el.files[i].size
});
}
el.parentNode.lastChild.innerHTML = subdocRender({
ctemplate: 'filePreview',
docs: files,
columns: ['Selected File','size']
});
el.nextSibling.nextSibling.className = "btn icn indent save sfe"
}
function attach(el, event) {
event.preventDefault();
var pgb = el.nextElementSibling;
pgb.className = 'lbl';
var file = el.form.file1;
//console.log('Have'+JSON.stringify(file.files));
if (file.files.length > 0) {
el.setAttribute("disabled", "disabled");
upload(self.path, el.form.file1.files, el.form.comment.value, {
success: function (url) {
//pgb.className = 'hid';
//console.log('refresh file list');
getFiles();
el.removeAttribute("disabled");
el.form.reset();
el.form.lastChild.innerHTML="";
},
failure: function (error) {
pgb.className = 'hid';
el.removeAttribute("disabled");
},
updateProgress: function (progress) {
if (pgb) {
if (progress == 100) {
pgb.className = 'hid';
} else if (progress)
pgb.setAttribute('value', progress);
else
pgb.removeAttribute('value');
}
}
});
}
return false;
};
function upload (type, files, comment, cbs) {
var reader = new FileReader();
var xhr = new XMLHttpRequest();
var fd = new FormData();
fd.append('comment', comment);
for (var i = 0; i < files.length; i++) {
fd.append('file1', files[i]);
}
this.xhr = xhr;
var self = this;
this.xhr.upload.addEventListener("loadstart", function (e) {
cbs.updateProgress(0); //
}, false);
this.xhr.upload.addEventListener("progress", function (e) {
if (e.lengthComputable) {
var percentage = Math.round((e.loaded * 100) / e.total);
cbs.updateProgress(percentage)
//self.ctrl.update(percentage);
}
}, false);
xhr.upload.addEventListener("load", function (e) {
//self.ctrl.update(100);
cbs.updateProgress(100);
//var canvas = self.ctrl.ctx.canvas;
//canvas.parentNode.removeChild(canvas);
}, false);
var uf = function (e) {
cbs.failure('Upload failed:');
};
xhr.addEventListener("error", uf, false);
xhr.addEventListener("abort", uf, false);
xhr.upload.addEventListener("error", uf, false);
xhr.upload.addEventListener("abort", uf, false);
xhr.onreadystatechange = function (oEvent) {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
if (xhr.response == '{"ok":"1"}') {
//console.log(xhr.responseText);
cbs.success();
} else {
cbs.failure('Upload failed: ' + xhr.statusText);
}
} else if (xhr.status === 404) {
cbs.failure('Upload failed: ID Not found. Try saving document first!');
}
}
};
xhr.open("POST", window.location.pathname + '/file');
xhr.setRequestHeader('X-CSRF-Token', csrfToken)
xhr.overrideMimeType('text/plain; charset=x-user-defined-binary');
xhr.send(fd);
}