ComunicWeb/assets/js/pages/settings/sections/emojis.js
2020-04-29 17:01:26 +02:00

222 lines
4.3 KiB
JavaScript

/**
* Emojies settings sections
*
* @author Pierre Hubert
*/
class EmojiesSection {
static Open(args, target) {
//Create a box
const box = createElem2({
appendTo: target,
type: "div",
class: "box box-primary box-emojis-settings"
});
//Add box header
const boxHead = createElem2({
appendTo: box,
type: "div",
class: "box-header",
});
const boxTitle = createElem2({
appendTo: boxHead,
type: "h3",
class: "box-title",
innerHTML: "Custom emojis settings"
});
//Create box body
const boxBody = createElem2({
appendTo: box,
type: "div",
class: "box-body"
});
const emojiesList = createElem2({
appendTo: boxBody,
type: "table",
class: "table table-hover",
innerHTML: "<tbody />"
})
const refreshFunction = () => this.RefreshList(emojiesList.querySelector("tbody"))
refreshFunction();
// Add create form
this.AddUploadForm(target, refreshFunction)
}
/**
* @param {HTMLElement} target
*/
static async RefreshList(target) {
try {
target.innerHTML = "";
const emojies = (await userInfo(userID(), true)).customEmojis;
if(emojies.length == 0) {
target.innerHTML = "<tr><td>There is no custom emojis yet</td></tr>"
}
for(const e of emojies) {
const line = createElem2({
type: "tr",
appendTo: target,
})
line.innerHTML += "<td><img class='e' src='"+e.url+"' /></td>" +
"<td>"+e.shortcut+"</td><td></td>"
// Add delete button
const deleteBtnTarget = line.querySelector("td:last-of-type")
const deleteButtonLink = createElem2({
appendTo: deleteBtnTarget,
type: "a",
innerHTML: "<i class='fa fa-trash'></i>"
});
deleteButtonLink.addEventListener("click", () => {
ComunicWeb.common.messages.confirm("Do you really want to delete this emoji ?", async (confirm) => {
if(!confirm)
return;
try {
await SettingsInterface.deleteEmoji(e.id)
this.RefreshList(target);
} catch(e) {
console.error(e);
notify("Could not delete emoji!", "danger")
}
})
})
}
} catch (error) {
console.error(error)
target.appendChild(ComunicWeb.common.messages.createCalloutElem(
"Error",
"Could not refresh the list of emojis!",
"danger"
))
}
}
/**
* Add a form to upload new custom emojies
*
* @param {HTMLElment} target The target for the form
* @param cb Callback function to call in case of success
*/
static AddUploadForm(target, cb) {
//Create a box
const box = createElem2({
appendTo: target,
type: "div",
class: "box box-primary box-emojis-settings"
});
// Create the form
const form = createElem2({
appendTo: box,
type: "form",
});
//Add box header
const boxHead = createElem2({
appendTo: form,
type: "div",
class: "box-header",
});
const boxTitle = createElem2({
appendTo: boxHead,
type: "h3",
class: "box-title",
innerHTML: "Add a new custom emoji"
});
//Create box body
const boxBody = createElem2({
appendTo: form,
type: "div",
class: "box-body"
});
const shortcutInput = createFormGroup({
target: boxBody,
label: "Shortcut (starting and ending with a semicolon)",
placeholder: ":myEmoticon:",
type: "text",
name: "shortcut"
})
const associatedImage = createFormGroup({
target: boxBody,
label: "Associated image",
type: "file"
})
// Create box footer
const boxFooter = createElem2({
appendTo: form,
type: "div",
class: "box-footer"
})
const submitButton = createElem2({
appendTo: boxFooter,
type: "input",
elemType: "submit",
value: "Upload custom emoji",
class: "btn btn-primary"
})
form.addEventListener("submit", async (e) => {
e.preventDefault();
try {
const shortcut = shortcutInput.value
if(!checkEmojiCode(shortcut)) {
return notify("Invalid shortcut!", "danger");
}
if(associatedImage.files.length != 1) {
return notify("Please specify a file to upload!", "danger")
}
const fd = new FormData()
fd.append("shortcut", shortcut)
fd.append("image", associatedImage.files[0])
await SettingsInterface.uploadEmoji(fd)
cb()
// Recreate form
box.remove();
this.AddUploadForm(target, cb);
} catch(e) {
console.error(e);
notify("Could not upload new emoji!", "danger");
}
})
}
}