mirror of
https://github.com/hcengineering/platform.git
synced 2025-04-23 00:37:47 +00:00
Improved editor indent plugin related behaviour, added x-scroll to code blocks (#7520)
Some checks failed
CI / build (push) Has been cancelled
CI / uitest (push) Has been cancelled
CI / uitest-pg (push) Has been cancelled
CI / uitest-qms (push) Has been cancelled
CI / svelte-check (push) Has been cancelled
CI / formatting (push) Has been cancelled
CI / test (push) Has been cancelled
CI / docker-build (push) Has been cancelled
CI / dist-build (push) Has been cancelled
Some checks failed
CI / build (push) Has been cancelled
CI / uitest (push) Has been cancelled
CI / uitest-pg (push) Has been cancelled
CI / uitest-qms (push) Has been cancelled
CI / svelte-check (push) Has been cancelled
CI / formatting (push) Has been cancelled
CI / test (push) Has been cancelled
CI / docker-build (push) Has been cancelled
CI / dist-build (push) Has been cancelled
Signed-off-by: Victor Ilyushchenko <alt13ri@gmail.com>
This commit is contained in:
parent
6c9cb78493
commit
4159c3f761
@ -386,6 +386,7 @@ table.proseTable {
|
|||||||
background-color: var(--theme-button-default);
|
background-color: var(--theme-button-default);
|
||||||
border: 1px solid var(--theme-button-border);
|
border: 1px solid var(--theme-button-border);
|
||||||
border-radius: .25rem;
|
border-radius: .25rem;
|
||||||
|
font-size: 0.875rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.proseCodeBlock {
|
.proseCodeBlock {
|
||||||
@ -397,13 +398,19 @@ table.proseTable {
|
|||||||
padding: .5rem;
|
padding: .5rem;
|
||||||
user-select: text;
|
user-select: text;
|
||||||
cursor: auto;
|
cursor: auto;
|
||||||
|
|
||||||
|
code {
|
||||||
|
display: block;
|
||||||
|
overflow-x: auto;
|
||||||
|
white-space: pre;
|
||||||
|
word-wrap: nowrap;
|
||||||
|
scrollbar-width: auto;
|
||||||
|
font-size: 0.875rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pre.proseCodeBlock {
|
pre.proseCodeBlock {
|
||||||
position: relative;
|
position: relative;
|
||||||
white-space: pre-wrap;
|
|
||||||
word-wrap: break-word;
|
|
||||||
word-break: normal;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pre.proseCodeBlock {
|
pre.proseCodeBlock {
|
||||||
@ -496,6 +503,11 @@ pre.proseCodeBlock>pre.proseCode {
|
|||||||
|
|
||||||
font-size: 0.875rem;
|
font-size: 0.875rem;
|
||||||
line-height: 1.5em;
|
line-height: 1.5em;
|
||||||
|
|
||||||
|
overflow-x: auto;
|
||||||
|
white-space: pre;
|
||||||
|
word-wrap: nowrap;
|
||||||
|
scrollbar-width: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mermaidPreviewContainer {
|
.mermaidPreviewContainer {
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
import { Extension } from '@tiptap/core'
|
import { Extension } from '@tiptap/core'
|
||||||
import { type Node } from '@tiptap/pm/model'
|
import { type Node } from '@tiptap/pm/model'
|
||||||
import { type EditorState, TextSelection, type Transaction } from '@tiptap/pm/state'
|
import { type EditorState, Plugin, TextSelection, type Transaction } from '@tiptap/pm/state'
|
||||||
|
|
||||||
export interface IndendOptions {
|
export interface IndendOptions {
|
||||||
indentUnit: string
|
indentUnit: string
|
||||||
@ -44,9 +44,35 @@ export const IndentExtension = Extension.create<IndendOptions>({
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
addProseMirrorPlugins () {
|
||||||
|
return [...(this.parent?.() ?? []), IndentTabFocusFixer(this.options)]
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
function IndentTabFocusFixer (options: IndendOptions): Plugin {
|
||||||
|
return new Plugin({
|
||||||
|
props: {
|
||||||
|
handleKeyDown: (view, event) => {
|
||||||
|
const selection = view.state.selection
|
||||||
|
if (event.key !== 'Tab' || !(selection instanceof TextSelection)) return false
|
||||||
|
|
||||||
|
const lines = getLinesInSelection(view.state, selection)
|
||||||
|
const haveForbiddenNode = lines.some((line) => !options.allowedNodes.some((n) => n === line.node.type.name))
|
||||||
|
|
||||||
|
const shouldBlockEvent = lines.length > 0 && !haveForbiddenNode
|
||||||
|
if (shouldBlockEvent) {
|
||||||
|
event.preventDefault()
|
||||||
|
event.stopPropagation()
|
||||||
|
}
|
||||||
|
|
||||||
|
return shouldBlockEvent
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export function adjustIndent (state: EditorState, direction: -1 | 1, options: IndendOptions): Transaction | undefined {
|
export function adjustIndent (state: EditorState, direction: -1 | 1, options: IndendOptions): Transaction | undefined {
|
||||||
const { selection } = state
|
const { selection } = state
|
||||||
if (selection instanceof TextSelection) {
|
if (selection instanceof TextSelection) {
|
||||||
@ -80,14 +106,24 @@ export function adjustSelectionIndent (
|
|||||||
if (ranges.length === 1) {
|
if (ranges.length === 1) {
|
||||||
const range = ranges[0]
|
const range = ranges[0]
|
||||||
const withinIndent = selection.from >= range.from && selection.to <= range.from + range.indent && range.indent > 0
|
const withinIndent = selection.from >= range.from && selection.to <= range.from + range.indent && range.indent > 0
|
||||||
if (!withinIndent && direction > 0) {
|
const containsLine = selection.from <= range.from && selection.to >= range.to
|
||||||
|
if (!withinIndent && !containsLine && direction > 0) {
|
||||||
const indentOffset = indentLevelOffset(selection.from - range.from, direction)
|
const indentOffset = indentLevelOffset(selection.from - range.from, direction)
|
||||||
tr.insertText(indentUnit.slice(0, indentOffset), selection.from, selection.to)
|
tr.insertText(indentUnit.slice(0, indentOffset), selection.from, selection.to)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const isSelectionCollapsed = selection.from === selection.to
|
||||||
|
const affectedFromIndentStart = selection.from <= ranges[0].from + ranges[0].indent
|
||||||
|
const affectedFrom =
|
||||||
|
affectedFromIndentStart && !isSelectionCollapsed
|
||||||
|
? selection.from
|
||||||
|
: selection.from + indentLevelOffset(ranges[0].indent, direction)
|
||||||
|
let affectedTo = selection.to
|
||||||
|
|
||||||
let insertionOffset = 0
|
let insertionOffset = 0
|
||||||
|
|
||||||
for (const range of ranges) {
|
for (const range of ranges) {
|
||||||
if (direction > 0 ? range.text === '' : range.indent === 0) {
|
if (direction > 0 ? range.text === '' : range.indent === 0) {
|
||||||
continue
|
continue
|
||||||
@ -99,10 +135,13 @@ export function adjustSelectionIndent (
|
|||||||
} else {
|
} else {
|
||||||
tr.insertText('', from, from - indentOffset)
|
tr.insertText('', from, from - indentOffset)
|
||||||
}
|
}
|
||||||
|
|
||||||
insertionOffset += indentOffset
|
insertionOffset += indentOffset
|
||||||
|
affectedTo = selection.to + insertionOffset
|
||||||
}
|
}
|
||||||
|
|
||||||
tr.setSelection(selection.map(tr.doc, tr.mapping))
|
const newSelection = new TextSelection(tr.doc.resolve(affectedFrom), tr.doc.resolve(affectedTo))
|
||||||
|
tr.setSelection(newSelection)
|
||||||
|
|
||||||
return tr
|
return tr
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user