mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-23 10:26:22 +00:00
Merge branch 'rails' of 0xacab.org:sutty/sutty into rails
This commit is contained in:
commit
86bee68b8a
2 changed files with 22 additions and 24 deletions
|
@ -259,7 +259,6 @@ const typesWithProperties = {
|
||||||
|
|
||||||
const file = imgFileEl.files[0]
|
const file = imgFileEl.files[0]
|
||||||
|
|
||||||
imgEl.src = URL.createObjectURL(file)
|
|
||||||
imgEl.dataset.editorLoading = true
|
imgEl.dataset.editorLoading = true
|
||||||
uploadFile(file)
|
uploadFile(file)
|
||||||
.then(url => {
|
.then(url => {
|
||||||
|
@ -321,7 +320,6 @@ const typesWithProperties = {
|
||||||
|
|
||||||
const audioEl = figureEl.querySelector('audio')
|
const audioEl = figureEl.querySelector('audio')
|
||||||
|
|
||||||
audioEl.src = URL.createObjectURL(file)
|
|
||||||
audioEl.dataset.editorLoading = true
|
audioEl.dataset.editorLoading = true
|
||||||
uploadFile(file)
|
uploadFile(file)
|
||||||
.then(url => {
|
.then(url => {
|
||||||
|
@ -361,7 +359,6 @@ const typesWithProperties = {
|
||||||
const file = videoFileEl.files[0]
|
const file = videoFileEl.files[0]
|
||||||
|
|
||||||
videoEl.poster = ""
|
videoEl.poster = ""
|
||||||
videoEl.src = URL.createObjectURL(file)
|
|
||||||
videoEl.dataset.editorLoading = true
|
videoEl.dataset.editorLoading = true
|
||||||
uploadFile(file)
|
uploadFile(file)
|
||||||
.then(url => {
|
.then(url => {
|
||||||
|
@ -401,7 +398,6 @@ const typesWithProperties = {
|
||||||
const file = pdfFileEl.files[0]
|
const file = pdfFileEl.files[0]
|
||||||
const pdfEl = figureEl.children[0]
|
const pdfEl = figureEl.children[0]
|
||||||
|
|
||||||
pdfEl.src = URL.createObjectURL(file)
|
|
||||||
pdfEl.dataset.editorLoading = true
|
pdfEl.dataset.editorLoading = true
|
||||||
uploadFile(file)
|
uploadFile(file)
|
||||||
.then(url => {
|
.then(url => {
|
||||||
|
|
|
@ -25,6 +25,17 @@ const restoreContent = (editorEl, contentEl) => {
|
||||||
contentEl.innerHTML = content
|
contentEl.innerHTML = content
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* getRangeAt puede fallar si no hay una selección
|
||||||
|
*/
|
||||||
|
function safeGetRangeAt (num) {
|
||||||
|
try {
|
||||||
|
return window.getSelection().getRangeAt(num)
|
||||||
|
} catch (error) {
|
||||||
|
console.warn("No hay una selección!")
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function uploadFile (file) {
|
function uploadFile (file) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const upload = new ActiveStorage.DirectUpload(
|
const upload = new ActiveStorage.DirectUpload(
|
||||||
|
@ -108,7 +119,8 @@ function setupMarkButton (button, mark, contentEl) {
|
||||||
let parentEl = getElementParent(sel.anchorNode)
|
let parentEl = getElementParent(sel.anchorNode)
|
||||||
//if (sel.anchorNode == parentEl) parentEl = parentEl.firstChild
|
//if (sel.anchorNode == parentEl) parentEl = parentEl.firstChild
|
||||||
|
|
||||||
const range = sel.getRangeAt(0)
|
const range = safeGetRangeAt(0)
|
||||||
|
if (!range) return
|
||||||
|
|
||||||
if (parentEl.matches(mark.selector)) {
|
if (parentEl.matches(mark.selector)) {
|
||||||
const [left, right] = splitNode(parentEl, range)
|
const [left, right] = splitNode(parentEl, range)
|
||||||
|
@ -169,7 +181,8 @@ function setupBlockButton (button, block, contentEl, editorEl) {
|
||||||
|| sel.focusNode == contentEl
|
|| sel.focusNode == contentEl
|
||||||
) return
|
) return
|
||||||
|
|
||||||
const range = sel.getRangeAt(0)
|
const range = safeGetRangeAt(0)
|
||||||
|
if (!range) return
|
||||||
|
|
||||||
let parentEl = sel.anchorNode
|
let parentEl = sel.anchorNode
|
||||||
while (!isDirectChild(contentEl, parentEl)) parentEl = parentEl.parentElement
|
while (!isDirectChild(contentEl, parentEl)) parentEl = parentEl.parentElement
|
||||||
|
@ -202,7 +215,8 @@ function setupParentBlockButton (button, parentBlock, contentEl) {
|
||||||
|| sel.focusNode == contentEl
|
|| sel.focusNode == contentEl
|
||||||
) return
|
) return
|
||||||
|
|
||||||
const range = sel.getRangeAt(0)
|
const range = safeGetRangeAt(0)
|
||||||
|
if (!range) return
|
||||||
|
|
||||||
let parentEl = sel.anchorNode
|
let parentEl = sel.anchorNode
|
||||||
while (!isDirectChild(contentEl, parentEl)) parentEl = parentEl.parentElement
|
while (!isDirectChild(contentEl, parentEl)) parentEl = parentEl.parentElement
|
||||||
|
@ -242,7 +256,8 @@ function hasContent (element) {
|
||||||
if (element.tagName === "IMG"
|
if (element.tagName === "IMG"
|
||||||
|| element.tagName === "AUDIO"
|
|| element.tagName === "AUDIO"
|
||||||
|| element.tagName === "VIDEO"
|
|| element.tagName === "VIDEO"
|
||||||
|| element.tagName === "IFRAME") return true
|
|| element.tagName === "IFRAME"
|
||||||
|
|| element.tagName === "BR") return true
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -264,13 +279,9 @@ function cleanContent (contentEl) {
|
||||||
child.tagName = "P"
|
child.tagName = "P"
|
||||||
}
|
}
|
||||||
} else if (child.nodeType === Node.TEXT_NODE) {
|
} else if (child.nodeType === Node.TEXT_NODE) {
|
||||||
const wasSelected = sel.getRangeAt(0).intersectsNode(child)
|
|
||||||
|
|
||||||
const el = document.createElement("p")
|
const el = document.createElement("p")
|
||||||
el.appendChild(child)
|
|
||||||
contentEl.insertBefore(el, child.nextSibling)
|
contentEl.insertBefore(el, child.nextSibling)
|
||||||
|
el.appendChild(child)
|
||||||
if (wasSelected) sel.collapse(el, child.data.length)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -319,7 +330,8 @@ function cleanNode (node, contentEl) {
|
||||||
child.parentNode.removeChild(child.nextSibling)
|
child.parentNode.removeChild(child.nextSibling)
|
||||||
}
|
}
|
||||||
} else if (child.nodeType === Node.ELEMENT_NODE) {
|
} else if (child.nodeType === Node.ELEMENT_NODE) {
|
||||||
if (!hasContent(child) && !window.getSelection().getRangeAt(0).intersectsNode(child))
|
const range = safeGetRangeAt(0)
|
||||||
|
if (!hasContent(child) && (!range || !range.intersectsNode(child)))
|
||||||
child.parentNode.removeChild(child)
|
child.parentNode.removeChild(child)
|
||||||
|
|
||||||
for (const mark of Object.values(marks)) {
|
for (const mark of Object.values(marks)) {
|
||||||
|
@ -433,16 +445,6 @@ function setupEditor (editorEl) {
|
||||||
|
|
||||||
const contentEl = editorEl.querySelector(".editor-content")
|
const contentEl = editorEl.querySelector(".editor-content")
|
||||||
|
|
||||||
contentEl.addEventListener("keydown", event => {
|
|
||||||
if (event.keyCode === 32) { // Espacio
|
|
||||||
event.preventDefault()
|
|
||||||
const sel = window.getSelection()
|
|
||||||
const range = sel.getRangeAt(0)
|
|
||||||
range.insertNode(document.createTextNode("\xa0"))
|
|
||||||
cleanContent(contentEl)
|
|
||||||
range.collapse()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
contentEl.addEventListener("paste", event => {
|
contentEl.addEventListener("paste", event => {
|
||||||
editorEl.querySelector(".editor-aviso-word").style.display = "block"
|
editorEl.querySelector(".editor-aviso-word").style.display = "block"
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in a new issue