improved markdown editor: rendinging is now triggered by _oninput_ event, so copy and paste should work
Build Docker Image / Docker-Build (push) Successful in 1m20s
Build Docker Image / Clean-Registry (push) Successful in 6s

Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
This commit is contained in:
2026-11-10 22:33:25 +01:00
parent 9491815c1a
commit 3746149aa4
+30 -60
View File
@@ -38,16 +38,31 @@
} else applyEdit();
}
function resetEdit(){
editing = false;
editValue = {source:value.source,rendered:value.rendered};
function oncontextmenu(evt){
if (evt.target) {
evt.preventDefault();
evt.stopPropagation();
}
sheet = evt.sheet ? evt : null; // store position of activated cell to focus after editing starts
startEdit();
return false;
}
function startEdit(){
activeField.update((n) => n+1);
editing = editable;
function oninput(ev){
if (simple) {
value.source = editValue.source;
value.rendered = editValue.rendered;
}
if (timer) clearTimeout(timer);
timer = setTimeout(render,500);
}
function onkeyup(ev){
if (ev.keyCode == 13 && ev.ctrlKey) doSave();
if (ev.keyCode == 27) resetEdit();
}
async function render(){
const url = api('markdown/render');
const resp = await fetch(url,{
@@ -59,59 +74,9 @@
if (store_id) localStorage.setItem(store_id,editValue.source);
}
function typed(ev){
if (simple) {
value.source = editValue.source;
value.rendered = editValue.rendered;
}
if (ev.keyCode == 13 && ev.ctrlKey) doSave();
if (ev.keyCode == 27) resetEdit();
if (timer) clearTimeout(timer);
timer = setTimeout(render,500);
}
function measured(evt,duration){
if (duration < 500){
onclick(evt);
} else {
startEdit();
}
}
function oncontextmenu(evt){
if (evt.target) {
evt.preventDefault();
evt.stopPropagation();
}
sheet = evt.sheet ? evt : null; // store position of activated cell to focus after editing starts
startEdit();
return false;
}
function onmousedown(evt){
evt.preventDefault();
start = evt.timeStamp;
}
function onmouseup(evt){
evt.preventDefault();
measured(evt, evt.timeStamp - start);
}
function onresize(evt){
console.log('onresize()',evt);
}
function ontouchstart(evt){
evt.preventDefault();
start = evt.timeStamp;
}
function ontouchend(evt){
evt.preventDefault();
measured(evt, evt.timeStamp - start);
function resetEdit(){
editing = false;
editValue = {source:value.source,rendered:value.rendered};
}
function restore(ev){
@@ -120,6 +85,11 @@
render();
}
function startEdit(){
activeField.update((n) => n+1);
editing = editable;
}
activeField.subscribe((val) => resetEdit());
if (simple) startEdit();
</script>
@@ -145,7 +115,7 @@
{#if stored_source}
<span id="restore_markdown" onclick={restore} class="hint">{t('unsaved_content')}</span>
{/if}
<textarea bind:value={editValue.source} onkeyup={typed} onresize={onresize} data="test" autofocus={!simple}></textarea>
<textarea bind:value={editValue.source} {oninput} {onkeyup} autofocus={!simple}></textarea>
<Display classes="preview" bind:markdown={editValue} sheet={sheet} />
{#if !simple}
<div class="buttons">