function create_studysheet_entry(title, username, term_count, created, modified, sheet_id, author_id, is_private) {
// convert viewership to boolean
// 1 = public, 0 = private
icon_name = "Public"
if (is_private) {
icon_name = "Lock"
}
let html = `
${title}
${username}
${term_count}
Created: ${created}
Modified: ${modified}
`
let obj = htmlToObj(html);
obj.querySelector(".studysheet-user-container").addEventListener("click", function(event) {
event.stopPropagation();
// blurOutPage(`/user/${author_id}`)
window.location.href = `/user/${author_id}`
})
obj.addEventListener("click", function(event) {
blurOutPage(`/studysheet/${sheet_id}/view`)
})
return obj;
}
class TermComponent {
static draggedTerms = [];
static termMap = {}
static getById(id) {
return TermComponent.termMap[id];
}
static fromTermJSON(term) {
let termElem = new TermComponent(term.id)
termElem.setTerm(term.term)
termElem.setAnswer(term.answer)
if ("image-term" in term) {
termElem.setTermImage(term["image-term"])
}
if ("image-answer" in term) {
termElem.setAnswerImage(term["image-answer"])
}
if ("note" in term) {
termElem.setNoteVisibile(true)
termElem.setNote(term.note)
}
if ("subterms" in term && term.subterms.length > 0) {
for (let k = 0; k
`
this.isMultiHead = false;
this.isMulti = false;
this.parentId = null;
this.hasNote = false;
this.obj = htmlToObj(html_data);
this.obj.querySelectorAll("textarea").forEach(textarea => {
textarea.addEventListener("input", () => { textarea_resize(textarea) })
})
this.id = id;
this.multiChildren = [];
TermComponent.termMap[id] = this;
this.hasTermImage = false;
this.hasAnswerImage = false;
this.updateImageDisplay();
this.isBeingDragged = false;
}
enableTextAreaEditing() {
this.obj.querySelectorAll("textarea").forEach(textarea => {
textarea.removeAttribute("readonly");
})
}
enableEditing() {
this.obj.querySelector(".star").remove();
this.obj.querySelector(".left-options").style.display = "flex";
this.obj.querySelectorAll("textarea").forEach(textarea => {
textarea.removeAttribute("readonly");
textarea.style.borderBottom = "2px solid white";
textarea.style.transition = "border-bottom 0.25s";
})
let dragHandle = this.obj.querySelector("#drag-handle")
dragHandle.style.display = "inline-block";
}
addDragBeginHandler(callback) {
let dragHandle = this.obj.querySelector("#drag-handle")
dragHandle.addEventListener("mousedown", (event) => {
this.isBeingDragged = true;
TermComponent.draggedTerm = this;
callback(event, this);
})
}
makeMulti(parentId) {
this.obj.classList.add("multi");
this.obj.setAttribute("data-parent-id", parentId);
this.obj.querySelector(".term-img-btn").style.display = "none";
this.obj.querySelector(".add-multi-btn").style.display = "none";
// hide the drag handle
this.obj.querySelector("#drag-handle").style.display = "none";
this.isMulti = true;
this.parentId = parentId;
}
promoteMultiChildren() {
this.multiChildren.forEach(child => {
this.obj.after(child.getObj());
child.obj.classList.remove("multi");
child.obj.removeAttribute("data-parent-id");
child.obj.querySelector(".term-img-btn").style.display = "unset";
child.obj.querySelector(".add-multi-btn").style.display = "unset";
child.isMulti = false;
})
}
setWarning(warning) {
console.log("Setting warning: " + warning)
let warningElem = this.obj.querySelector(".term-warning");
if (warning == null || warning == "") {
warningElem.style.display = "none";
warningElem.textContent = "";
} else {
warningElem.style.display = "block";
warningElem.textContent = warning;
}
}
makeMultiHead(child) {
console.log(child)
this.multiChildren.push(child);
this.obj.appendChild(child.getObj());
console.log("Making multi head for term " + this.id + " with child " + child.id);
if (this.isMultiHead) {
return;
}
this.isMultiHead = true;
this.obj.querySelector(".definition").style.display = "none";
this.obj.querySelector(".answer-img-btn").style.display = "none";
}
getChildren() {
return this.multiChildren;
}
addDeleteCallback(callback) { this.obj.querySelector(".delete-btn").addEventListener("click", callback); }
addMultiCallback(callback) { this.obj.querySelector(".add-multi-btn").addEventListener("click", callback); }
addNoteCallback(callback) { this.obj.querySelector(".notes-btn").addEventListener("click", callback); }
addStarCallback(callback) {
this.obj.querySelector('.star').style.display = "block";
this.obj.querySelector(".star").addEventListener("click", callback);
}
addImageCallback(callback) {
this.obj.querySelector(".term-img-btn").addEventListener("click", () => { callback("term") });
this.obj.querySelector(".answer-img-btn").addEventListener("click", () => { callback("answer") });
}
addImageClickCallback(callback) {
this.obj.querySelector(".image-term").addEventListener("click", () => { callback("term") });
this.obj.querySelector(".image-answer").addEventListener("click", () => { callback("answer") });
this.obj.querySelector(".image-term").classList.add("clickable-image");
this.obj.querySelector(".image-answer").classList.add("clickable-image");
}
addTermCallbacks(onFocusIn, onFocusOut, onChange) {
let term = this.obj.querySelector(".term");
term.addEventListener("focusin", onFocusIn);
term.addEventListener("focusout", onFocusOut);
term.addEventListener("input", onChange);
}
addAnswerCallbacks(onFocusIn, onFocusOut, onChange) {
let answer = this.obj.querySelector(".definition");
if (answer != null) {
answer.addEventListener("focusin", onFocusIn);
answer.addEventListener("focusout", onFocusOut);
answer.addEventListener("input", onChange);
}
}
addNoteCallbacks(onFocusIn, onFocusOut, onChange) {
let note = this.obj.querySelector(".comment");
if (note != null) {
note.addEventListener("focusin", onFocusIn);
note.addEventListener("focusout", onFocusOut);
note.addEventListener("input", onChange);
}
}
applyTextAreaResize() {
this.obj.querySelectorAll("textarea").forEach(textarea => {
textarea_resize(textarea)
})
}
setTerm(text) {
let termTextArea = this.obj.querySelector(".term");
termTextArea.value = text;
textarea_resize(termTextArea);
}
setAnswer(text) {
let answerTextArea = this.obj.querySelector(".definition");
answerTextArea.value = text;
textarea_resize(answerTextArea);
}
noteIsVisible() {
let noteContainer = this.obj.querySelector(".comment-container");
return noteContainer.style.display != "none";
}
setNoteVisibile(visible) {
let noteContainer = this.obj.querySelector(".comment-container");
let commentTextArea = this.obj.querySelector(".comment");
let displayType = "none"
if (visible) {
displayType = "flex"
}
noteContainer.style.display = displayType;
textarea_resize(commentTextArea)
// commentTextArea.value = ""
}
setDisabled(toggle) {
// hide all children that don't have the term-component class (set their opacty to 0.5)
if (toggle) {
for (let child of this.obj.children) {
if (!child.classList.contains("term-component")) {
child.style.opacity = "0.5";
}
}
} else {
for (let child of this.obj.children) {
if (!child.classList.contains("term-component")) {
child.style.opacity = "1.0";
}
}
}
}
setNote(text) {
let noteTextArea = this.obj.querySelector(".comment");
noteTextArea.value = text;
textarea_resize(noteTextArea);
}
setTermImage(imageId) {
if (imageId == null || imageId == "") {
this.hasTermImage = false;
} else {
this.hasTermImage = true;
let img = this.obj.querySelector(".image-term");
img.src = imageUrlForId(imageId);
}
this.updateImageDisplay();
}
setAnswerImage(imageId) {
if (imageId == null || imageId == "") {
this.hasAnswerImage = false;
} else {
this.hasAnswerImage = true;
let img = this.obj.querySelector(".image-answer");
img.src = imageUrlForId(imageId);
}
this.updateImageDisplay();
}
updateImageDisplay() {
if (!this.hasTermImage && !this.hasAnswerImage) {
this.obj.querySelector(".image-container").style.display = "none";
} else {
this.obj.querySelector(".image-container").style.display = "flex";
}
if (this.hasTermImage) {
this.obj.querySelector(".image-term").style.display = "block";
} else {
this.obj.querySelector(".image-term").style.display = "none";
}
if (this.hasAnswerImage) {
this.obj.querySelector(".image-answer").style.display = "block";
} else {
this.obj.querySelector(".image-answer").style.display = "none";
}
}
getTerm() {
return this.obj.querySelector(".term").value;
}
getAnswer() {
let answer = this.obj.querySelector(".definition");
if (answer != null) {
return answer.value;
}
return null;
}
getNote() {
return this.obj.querySelector(".comment").value;
}
getObj() {
return this.obj;
}
toggleStar() {
let starElem = this.obj.querySelector('.star');
if (starElem.classList.contains("selected")) {
starElem.classList.remove("selected");
} else {
starElem.classList.add("selected");
}
}
lockField(field) {
let textArea = this.getFieldTextArea(field);
textArea.setAttribute("readonly", "");
textArea.style.opacity = "0.5";
}
unlockField(field) {
let textArea = this.getFieldTextArea(field);
textArea.removeAttribute("readonly");
textArea.style.opacity = "1.0";
}
getFieldTextArea(field) {
if (field == "term") {
return this.obj.querySelector(".term");
} else if (field == "answer") {
return this.obj.querySelector(".definition");
} else if (field == "note") {
return this.obj.querySelector(".comment");
}
return null;
}
setAnswerBlurred(toggle) {
let answer = this.obj.querySelector(".definition");
// answer.classList.toggle("blurred-answer");
if (toggle) {
answer.classList.add("blurred-answer");
} else {
answer.classList.remove("blurred-answer");
}
}
}
const originalAppend = Element.prototype.append;
Element.prototype.append = function (...args) {
originalAppend.apply(this, args);
args[0].querySelectorAll("textarea").forEach(textarea => {
textarea_resize(textarea)
})
};
function textarea_resize(area){
area.style.height = "0";
area.style.height = (area.scrollHeight + window.getComputedStyle(area).borderBottomWidth.replace("px", "") * 1) + "px";
if (area.parentNode.className.includes("term-container")) {
let textareas = area.parentNode.querySelectorAll("textarea")
let tallestHeight = 0;
textareas.forEach(textarea => {
let height = textarea.style.height.replace("px", "") * 1;
if (height > tallestHeight) {
tallestHeight = height;
}
});
textareas.forEach(textarea => {
textarea.style.height = tallestHeight + "px";
});
}
}
async function getFileFromPicker(type) {
return new Promise((resolve) => {
const input = document.createElement("input");
input.accept = type
input.type = "file";
input.onchange = () => resolve(input.files[0] || null);
input.click();
});
}