update
This commit is contained in:
+37
-20
@@ -116,18 +116,21 @@
|
||||
].filter((layout) => layout.chars.length > 0);
|
||||
}
|
||||
|
||||
function setGematriaInputValue(nextValue) {
|
||||
function setGematriaInputValue(nextValue, options = {}) {
|
||||
const { inputEl } = getElements();
|
||||
if (!(inputEl instanceof HTMLTextAreaElement)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const shouldFocus = options?.focus !== false;
|
||||
inputEl.value = String(nextValue || "");
|
||||
inputEl.dispatchEvent(new Event("input", { bubbles: true }));
|
||||
inputEl.focus({ preventScroll: true });
|
||||
if (shouldFocus) {
|
||||
inputEl.focus({ preventScroll: true });
|
||||
}
|
||||
}
|
||||
|
||||
function insertGematriaText(insertValue) {
|
||||
function insertGematriaText(insertValue, options = {}) {
|
||||
const { inputEl } = getElements();
|
||||
if (!(inputEl instanceof HTMLTextAreaElement)) {
|
||||
return;
|
||||
@@ -138,23 +141,29 @@
|
||||
return;
|
||||
}
|
||||
|
||||
const start = Number.isFinite(inputEl.selectionStart) ? inputEl.selectionStart : inputEl.value.length;
|
||||
const end = Number.isFinite(inputEl.selectionEnd) ? inputEl.selectionEnd : start;
|
||||
const isInputFocused = document.activeElement === inputEl;
|
||||
const useSelection = options?.preserveSelection !== false && isInputFocused;
|
||||
const start = useSelection && Number.isFinite(inputEl.selectionStart) ? inputEl.selectionStart : inputEl.value.length;
|
||||
const end = useSelection && Number.isFinite(inputEl.selectionEnd) ? inputEl.selectionEnd : start;
|
||||
const nextValue = `${inputEl.value.slice(0, start)}${text}${inputEl.value.slice(end)}`;
|
||||
setGematriaInputValue(nextValue);
|
||||
setGematriaInputValue(nextValue, { focus: options?.focus });
|
||||
|
||||
const nextCaret = start + text.length;
|
||||
inputEl.setSelectionRange(nextCaret, nextCaret);
|
||||
if (useSelection) {
|
||||
inputEl.setSelectionRange(nextCaret, nextCaret);
|
||||
}
|
||||
}
|
||||
|
||||
function backspaceGematriaText() {
|
||||
function backspaceGematriaText(options = {}) {
|
||||
const { inputEl } = getElements();
|
||||
if (!(inputEl instanceof HTMLTextAreaElement)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const start = Number.isFinite(inputEl.selectionStart) ? inputEl.selectionStart : inputEl.value.length;
|
||||
const end = Number.isFinite(inputEl.selectionEnd) ? inputEl.selectionEnd : start;
|
||||
const isInputFocused = document.activeElement === inputEl;
|
||||
const useSelection = options?.preserveSelection !== false && isInputFocused;
|
||||
const start = useSelection && Number.isFinite(inputEl.selectionStart) ? inputEl.selectionStart : inputEl.value.length;
|
||||
const end = useSelection && Number.isFinite(inputEl.selectionEnd) ? inputEl.selectionEnd : start;
|
||||
if (start === 0 && end === 0) {
|
||||
return;
|
||||
}
|
||||
@@ -166,8 +175,10 @@
|
||||
}
|
||||
|
||||
const nextValue = `${inputEl.value.slice(0, nextStart)}${inputEl.value.slice(nextEnd)}`;
|
||||
setGematriaInputValue(nextValue);
|
||||
inputEl.setSelectionRange(nextStart, nextStart);
|
||||
setGematriaInputValue(nextValue, { focus: options?.focus });
|
||||
if (useSelection) {
|
||||
inputEl.setSelectionRange(nextStart, nextStart);
|
||||
}
|
||||
}
|
||||
|
||||
function renderKeyboardLayout() {
|
||||
@@ -209,34 +220,34 @@
|
||||
keyboardGridEl.setAttribute("lang", state.keyboardScriptId);
|
||||
}
|
||||
|
||||
function handleKeyboardAction(action) {
|
||||
function handleKeyboardAction(action, options = {}) {
|
||||
const normalizedAction = String(action || "").trim().toLowerCase();
|
||||
if (!normalizedAction) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (normalizedAction === "backspace") {
|
||||
backspaceGematriaText();
|
||||
backspaceGematriaText(options);
|
||||
return;
|
||||
}
|
||||
|
||||
if (normalizedAction === "space") {
|
||||
insertGematriaText(" ");
|
||||
insertGematriaText(" ", options);
|
||||
return;
|
||||
}
|
||||
|
||||
if (normalizedAction === "star") {
|
||||
insertGematriaText("*");
|
||||
insertGematriaText("*", options);
|
||||
return;
|
||||
}
|
||||
|
||||
if (normalizedAction === "question") {
|
||||
insertGematriaText("?");
|
||||
insertGematriaText("?", options);
|
||||
return;
|
||||
}
|
||||
|
||||
if (normalizedAction === "clear") {
|
||||
setGematriaInputValue("");
|
||||
setGematriaInputValue("", { focus: options?.focus });
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1345,7 +1356,10 @@
|
||||
return;
|
||||
}
|
||||
|
||||
insertGematriaText(String(keyButton.dataset.keyboardInsert || ""));
|
||||
insertGematriaText(String(keyButton.dataset.keyboardInsert || ""), {
|
||||
focus: false,
|
||||
preserveSelection: false
|
||||
});
|
||||
});
|
||||
|
||||
keyboardActionsEl?.addEventListener("click", (event) => {
|
||||
@@ -1359,7 +1373,10 @@
|
||||
return;
|
||||
}
|
||||
|
||||
handleKeyboardAction(actionButton.dataset.keyboardAction);
|
||||
handleKeyboardAction(actionButton.dataset.keyboardAction, {
|
||||
focus: false,
|
||||
preserveSelection: false
|
||||
});
|
||||
});
|
||||
|
||||
state.listenersBound = true;
|
||||
|
||||
Reference in New Issue
Block a user