This commit is contained in:
parent
fddb7a8e72
commit
a655a02ce4
6 changed files with 107 additions and 33 deletions
|
@ -278,7 +278,7 @@ export const openEmojiPanel = (id: string, type: "doc" | "notebook" | "av", posi
|
|||
if (event.key.indexOf("Arrow") === -1 && event.key !== "Enter") {
|
||||
return;
|
||||
}
|
||||
const currentElement = dialog.element.querySelector(".emojis__item--current");
|
||||
const currentElement: HTMLElement = dialog.element.querySelector(".emojis__item--current");
|
||||
if (!currentElement) {
|
||||
return;
|
||||
}
|
||||
|
@ -311,7 +311,7 @@ export const openEmojiPanel = (id: string, type: "doc" | "notebook" | "av", posi
|
|||
return;
|
||||
}
|
||||
let newCurrentElement: HTMLElement;
|
||||
if (event.key === "ArrowLeft" || event.key === "ArrowUp") {
|
||||
if (event.key === "ArrowLeft") {
|
||||
if (currentElement.previousElementSibling) {
|
||||
currentElement.classList.remove("emojis__item--current");
|
||||
newCurrentElement = currentElement.previousElementSibling as HTMLElement;
|
||||
|
@ -323,7 +323,7 @@ export const openEmojiPanel = (id: string, type: "doc" | "notebook" | "av", posi
|
|||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
}
|
||||
} else if (event.key === "ArrowRight" || event.key === "ArrowDown") {
|
||||
} else if (event.key === "ArrowRight") {
|
||||
if (currentElement.nextElementSibling) {
|
||||
currentElement.classList.remove("emojis__item--current");
|
||||
newCurrentElement = currentElement.nextElementSibling as HTMLElement;
|
||||
|
@ -335,12 +335,48 @@ export const openEmojiPanel = (id: string, type: "doc" | "notebook" | "av", posi
|
|||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
}
|
||||
} else if (event.key === "ArrowDown") {
|
||||
if (!currentElement.nextElementSibling) {
|
||||
const nextContentElement = currentElement.parentElement.nextElementSibling?.nextElementSibling;
|
||||
if (nextContentElement) {
|
||||
newCurrentElement = nextContentElement.firstElementChild as HTMLElement;
|
||||
currentElement.classList.remove("emojis__item--current");
|
||||
}
|
||||
} else {
|
||||
currentElement.classList.remove("emojis__item--current");
|
||||
let counter = Math.floor(currentElement.parentElement.clientWidth / (currentElement.clientWidth + 2));
|
||||
newCurrentElement = currentElement;
|
||||
while (newCurrentElement.nextElementSibling && counter > 0) {
|
||||
newCurrentElement = newCurrentElement.nextElementSibling as HTMLElement;
|
||||
counter--;
|
||||
}
|
||||
}
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
} else if (event.key === "ArrowUp") {
|
||||
if (!currentElement.previousElementSibling) {
|
||||
const prevContentElement = currentElement.parentElement.previousElementSibling?.previousElementSibling;
|
||||
if (prevContentElement) {
|
||||
newCurrentElement = prevContentElement.lastElementChild as HTMLElement;
|
||||
currentElement.classList.remove("emojis__item--current");
|
||||
}
|
||||
} else {
|
||||
currentElement.classList.remove("emojis__item--current");
|
||||
let counter = Math.floor(currentElement.parentElement.clientWidth / (currentElement.clientWidth + 2));
|
||||
newCurrentElement = currentElement;
|
||||
while (newCurrentElement.previousElementSibling && counter > 0) {
|
||||
newCurrentElement = newCurrentElement.previousElementSibling as HTMLElement;
|
||||
counter--;
|
||||
}
|
||||
}
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
}
|
||||
if (newCurrentElement) {
|
||||
newCurrentElement.classList.add("emojis__item--current");
|
||||
const inputHeight = inputElement.clientHeight + 6;
|
||||
if (newCurrentElement.offsetTop - inputHeight < emojisContentElement.scrollTop) {
|
||||
emojisContentElement.scrollTop = newCurrentElement.offsetTop - inputHeight;
|
||||
emojisContentElement.scrollTop = newCurrentElement.offsetTop - inputHeight - 6;
|
||||
} else if (newCurrentElement.offsetTop - inputHeight - emojisContentElement.clientHeight + newCurrentElement.clientHeight > emojisContentElement.scrollTop) {
|
||||
emojisContentElement.scrollTop = newCurrentElement.offsetTop - inputHeight - emojisContentElement.clientHeight + newCurrentElement.clientHeight;
|
||||
}
|
||||
|
|
|
@ -41,7 +41,7 @@ export class Breadcrumb {
|
|||
constructor(protyle: IProtyle) {
|
||||
const element = document.createElement("div");
|
||||
element.className = "protyle-breadcrumb";
|
||||
let padHTML = ""
|
||||
let padHTML = "";
|
||||
/// #if BROWSER
|
||||
if (isIPad() || isInAndroid()) {
|
||||
padHTML = `<button class="block__icon fn__flex-center ariaLabel" disabled aria-label="${window.siyuan.languages.undo}" data-type="undo"><svg><use xlink:href="#iconUndo"></use></svg></button>
|
||||
|
|
|
@ -357,7 +357,7 @@ ${genHintItemHTML(item)}
|
|||
}
|
||||
lazyLoadEmojiImg(panelElement);
|
||||
} else {
|
||||
this.element.innerHTML = `<div style="padding: 0;${value ? "" : "height:402px"}" class="emojis">
|
||||
this.element.innerHTML = `<div style="padding: 0;max-height:402px" class="emojis">
|
||||
<div class="emojis__panel">${filterEmoji(value, 256)}</div>
|
||||
<div class="fn__flex${value ? " fn__none" : ""}">
|
||||
<button data-type="0" class="emojis__type ariaLabel" aria-label="${window.siyuan.languages.recentEmoji}">${unicode2Emoji("2b50")}</button>
|
||||
|
@ -835,12 +835,12 @@ ${genHintItemHTML(item)}
|
|||
return true;
|
||||
}
|
||||
if (isEmojiPanel) {
|
||||
const currentElement = this.element.querySelector(".emojis__item--current");
|
||||
const currentElement: HTMLElement = this.element.querySelector(".emojis__item--current");
|
||||
if (!currentElement) {
|
||||
return false;
|
||||
}
|
||||
let newCurrentElement: HTMLElement;
|
||||
if (event.key === "ArrowLeft" || event.key === "ArrowUp") {
|
||||
if (event.key === "ArrowLeft") {
|
||||
if (currentElement.previousElementSibling) {
|
||||
currentElement.classList.remove("emojis__item--current");
|
||||
newCurrentElement = currentElement.previousElementSibling as HTMLElement;
|
||||
|
@ -848,7 +848,7 @@ ${genHintItemHTML(item)}
|
|||
currentElement.classList.remove("emojis__item--current");
|
||||
newCurrentElement = currentElement.parentElement.previousElementSibling.previousElementSibling.lastElementChild as HTMLElement;
|
||||
}
|
||||
} else if (event.key === "ArrowRight" || event.key === "ArrowDown") {
|
||||
} else if (event.key === "ArrowRight") {
|
||||
if (currentElement.nextElementSibling) {
|
||||
currentElement.classList.remove("emojis__item--current");
|
||||
newCurrentElement = currentElement.nextElementSibling as HTMLElement;
|
||||
|
@ -856,15 +856,53 @@ ${genHintItemHTML(item)}
|
|||
currentElement.classList.remove("emojis__item--current");
|
||||
newCurrentElement = currentElement.parentElement.nextElementSibling.nextElementSibling.firstElementChild as HTMLElement;
|
||||
}
|
||||
} else if (event.key === "ArrowDown") {
|
||||
if (!currentElement.nextElementSibling) {
|
||||
const nextContentElement = currentElement.parentElement.nextElementSibling?.nextElementSibling;
|
||||
if (nextContentElement) {
|
||||
newCurrentElement = nextContentElement.firstElementChild as HTMLElement;
|
||||
currentElement.classList.remove("emojis__item--current");
|
||||
}
|
||||
} else {
|
||||
currentElement.classList.remove("emojis__item--current");
|
||||
let counter = Math.floor(currentElement.parentElement.clientWidth / (currentElement.clientWidth + 2));
|
||||
newCurrentElement = currentElement;
|
||||
while (newCurrentElement.nextElementSibling && counter > 0) {
|
||||
newCurrentElement = newCurrentElement.nextElementSibling as HTMLElement;
|
||||
counter--;
|
||||
}
|
||||
}
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
} else if (event.key === "ArrowUp") {
|
||||
if (!currentElement.previousElementSibling) {
|
||||
const prevContentElement = currentElement.parentElement.previousElementSibling?.previousElementSibling;
|
||||
if (prevContentElement) {
|
||||
newCurrentElement = prevContentElement.lastElementChild as HTMLElement;
|
||||
currentElement.classList.remove("emojis__item--current");
|
||||
}
|
||||
} else {
|
||||
currentElement.classList.remove("emojis__item--current");
|
||||
let counter = Math.floor(currentElement.parentElement.clientWidth / (currentElement.clientWidth + 2));
|
||||
newCurrentElement = currentElement;
|
||||
while (newCurrentElement.previousElementSibling && counter > 0) {
|
||||
newCurrentElement = newCurrentElement.previousElementSibling as HTMLElement;
|
||||
counter--;
|
||||
}
|
||||
}
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
}
|
||||
if (newCurrentElement) {
|
||||
newCurrentElement.classList.add("emojis__item--current");
|
||||
const topHeight = 4;
|
||||
const emojisContentElement = this.element.querySelector(".emojis__panel");
|
||||
if (newCurrentElement.offsetTop - topHeight < emojisContentElement.scrollTop) {
|
||||
emojisContentElement.scrollTop = newCurrentElement.offsetTop - topHeight;
|
||||
} else if (newCurrentElement.offsetTop - topHeight - emojisContentElement.clientHeight + newCurrentElement.clientHeight > emojisContentElement.scrollTop) {
|
||||
emojisContentElement.scrollTop = newCurrentElement.offsetTop - topHeight - emojisContentElement.clientHeight + newCurrentElement.clientHeight;
|
||||
if (newCurrentElement.offsetTop - 8 < emojisContentElement.scrollTop) {
|
||||
emojisContentElement.scrollTop = newCurrentElement.offsetTop - 8;
|
||||
} else {
|
||||
const topHeight = emojisContentElement.nextElementSibling.classList.contains("fn__none") ? 8 : 36;
|
||||
if (newCurrentElement.offsetTop + topHeight - this.element.clientHeight + newCurrentElement.clientHeight > emojisContentElement.scrollTop) {
|
||||
emojisContentElement.scrollTop = newCurrentElement.offsetTop + topHeight - this.element.clientHeight + newCurrentElement.clientHeight;
|
||||
}
|
||||
}
|
||||
}
|
||||
event.preventDefault();
|
||||
|
|
|
@ -33,7 +33,7 @@ export class Undo {
|
|||
this.hasUndo = true;
|
||||
this.redoStack.push(state);
|
||||
if (protyle.breadcrumb) {
|
||||
const undoElement = protyle.breadcrumb.element.parentElement.querySelector('[data-type="undo"]')
|
||||
const undoElement = protyle.breadcrumb.element.parentElement.querySelector('[data-type="undo"]');
|
||||
if (undoElement) {
|
||||
if (this.undoStack.length === 0) {
|
||||
undoElement.setAttribute("disabled", "true");
|
||||
|
@ -54,7 +54,7 @@ export class Undo {
|
|||
this.render(protyle, state, true);
|
||||
this.undoStack.push(state);
|
||||
if (protyle.breadcrumb) {
|
||||
const redoElement = protyle.breadcrumb.element.parentElement.querySelector('[data-type="redo"]')
|
||||
const redoElement = protyle.breadcrumb.element.parentElement.querySelector('[data-type="redo"]');
|
||||
if (redoElement) {
|
||||
protyle.breadcrumb.element.parentElement.querySelector('[data-type="undo"]').removeAttribute("disabled");
|
||||
if (this.redoStack.length === 0) {
|
||||
|
@ -89,7 +89,7 @@ export class Undo {
|
|||
this.redoStack = [];
|
||||
this.hasUndo = false;
|
||||
if (protyle.breadcrumb) {
|
||||
const redoElement = protyle.breadcrumb.element.parentElement.querySelector('[data-type="redo"]')
|
||||
const redoElement = protyle.breadcrumb.element.parentElement.querySelector('[data-type="redo"]');
|
||||
if (redoElement) {
|
||||
redoElement.setAttribute("disabled", "true");
|
||||
}
|
||||
|
@ -110,7 +110,7 @@ export class Undo {
|
|||
this.hasUndo = false;
|
||||
}
|
||||
if (protyle.breadcrumb) {
|
||||
const undoElement = protyle.breadcrumb.element.parentElement.querySelector('[data-type="undo"]')
|
||||
const undoElement = protyle.breadcrumb.element.parentElement.querySelector('[data-type="undo"]');
|
||||
if (undoElement) {
|
||||
undoElement.removeAttribute("disabled");
|
||||
}
|
||||
|
|
|
@ -314,12 +314,12 @@ export const disabledProtyle = (protyle: IProtyle) => {
|
|||
if (protyle.breadcrumb) {
|
||||
protyle.breadcrumb.element.parentElement.querySelector('[data-type="readonly"] use').setAttribute("xlink:href", "#iconLock");
|
||||
protyle.breadcrumb.element.parentElement.querySelector('[data-type="readonly"]').setAttribute("aria-label", window.siyuan.config.editor.readOnly ? window.siyuan.languages.tempUnlock : window.siyuan.languages.unlockEdit);
|
||||
const undoElement = protyle.breadcrumb.element.parentElement.querySelector('[data-type="undo"]')
|
||||
const undoElement = protyle.breadcrumb.element.parentElement.querySelector('[data-type="undo"]');
|
||||
if (undoElement && !undoElement.classList.contains("fn__none")) {
|
||||
undoElement.classList.add("fn__none")
|
||||
protyle.breadcrumb.element.parentElement.querySelector('[data-type="redo"]').classList.add("fn__none")
|
||||
protyle.breadcrumb.element.parentElement.querySelector('[data-type="indent"]').classList.add("fn__none")
|
||||
protyle.breadcrumb.element.parentElement.querySelector('[data-type="outdent"]').classList.add("fn__none")
|
||||
undoElement.classList.add("fn__none");
|
||||
protyle.breadcrumb.element.parentElement.querySelector('[data-type="redo"]').classList.add("fn__none");
|
||||
protyle.breadcrumb.element.parentElement.querySelector('[data-type="indent"]').classList.add("fn__none");
|
||||
protyle.breadcrumb.element.parentElement.querySelector('[data-type="outdent"]').classList.add("fn__none");
|
||||
}
|
||||
}
|
||||
hideTooltip();
|
||||
|
@ -364,12 +364,12 @@ export const enableProtyle = (protyle: IProtyle) => {
|
|||
if (protyle.breadcrumb) {
|
||||
protyle.breadcrumb.element.parentElement.querySelector('[data-type="readonly"] use').setAttribute("xlink:href", "#iconUnlock");
|
||||
protyle.breadcrumb.element.parentElement.querySelector('[data-type="readonly"]').setAttribute("aria-label", window.siyuan.config.editor.readOnly ? window.siyuan.languages.cancelTempUnlock : window.siyuan.languages.lockEdit);
|
||||
const undoElement = protyle.breadcrumb.element.parentElement.querySelector('[data-type="undo"]')
|
||||
const undoElement = protyle.breadcrumb.element.parentElement.querySelector('[data-type="undo"]');
|
||||
if (undoElement && undoElement.classList.contains("fn__none")) {
|
||||
undoElement.classList.remove("fn__none")
|
||||
protyle.breadcrumb.element.parentElement.querySelector('[data-type="redo"]').classList.remove("fn__none")
|
||||
protyle.breadcrumb.element.parentElement.querySelector('[data-type="indent"]').classList.remove("fn__none")
|
||||
protyle.breadcrumb.element.parentElement.querySelector('[data-type="outdent"]').classList.remove("fn__none")
|
||||
undoElement.classList.remove("fn__none");
|
||||
protyle.breadcrumb.element.parentElement.querySelector('[data-type="redo"]').classList.remove("fn__none");
|
||||
protyle.breadcrumb.element.parentElement.querySelector('[data-type="indent"]').classList.remove("fn__none");
|
||||
protyle.breadcrumb.element.parentElement.querySelector('[data-type="outdent"]').classList.remove("fn__none");
|
||||
}
|
||||
}
|
||||
hideTooltip();
|
||||
|
|
|
@ -1609,13 +1609,13 @@ export class WYSIWYG {
|
|||
}
|
||||
/// #if BROWSER && !MOBILE
|
||||
if (protyle.breadcrumb) {
|
||||
const indentElement = protyle.breadcrumb.element.parentElement.querySelector('[data-type="indent"]')
|
||||
const indentElement = protyle.breadcrumb.element.parentElement.querySelector('[data-type="indent"]');
|
||||
if (indentElement && getSelection().rangeCount > 0) {
|
||||
setTimeout(() => {
|
||||
const newRange = getSelection().getRangeAt(0);
|
||||
const blockElement = hasClosestBlock(newRange.startContainer);
|
||||
if (!blockElement) {
|
||||
return
|
||||
return;
|
||||
}
|
||||
const outdentElement = protyle.breadcrumb.element.parentElement.querySelector('[data-type="outdent"]');
|
||||
if (blockElement.parentElement.classList.contains("li")) {
|
||||
|
@ -1847,7 +1847,7 @@ export class WYSIWYG {
|
|||
countSelectWord(range, protyle.block.rootID);
|
||||
}
|
||||
if (protyle.breadcrumb) {
|
||||
const indentElement = protyle.breadcrumb.element.parentElement.querySelector('[data-type="indent"]')
|
||||
const indentElement = protyle.breadcrumb.element.parentElement.querySelector('[data-type="indent"]');
|
||||
if (indentElement) {
|
||||
const outdentElement = protyle.breadcrumb.element.parentElement.querySelector('[data-type="outdent"]');
|
||||
if (nodeElement.parentElement.classList.contains("li")) {
|
||||
|
@ -2327,14 +2327,14 @@ export class WYSIWYG {
|
|||
if (!event.shiftKey && !ctrlIsPressed && emojiElement) {
|
||||
const nodeElement = hasClosestBlock(emojiElement);
|
||||
if (nodeElement) {
|
||||
const emojiRect = emojiElement.getBoundingClientRect()
|
||||
const emojiRect = emojiElement.getBoundingClientRect();
|
||||
openEmojiPanel("", "av", {
|
||||
x: emojiRect.left,
|
||||
y: emojiRect.bottom,
|
||||
h: emojiRect.height,
|
||||
w: emojiRect.width
|
||||
}, (unicode) => {
|
||||
emojiElement.insertAdjacentHTML("afterend", "<wbr>")
|
||||
emojiElement.insertAdjacentHTML("afterend", "<wbr>");
|
||||
const oldHTML = nodeElement.outerHTML;
|
||||
let emojiHTML;
|
||||
if (unicode.indexOf(".") > -1) {
|
||||
|
|
Loading…
Add table
Reference in a new issue