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(); }); }