1301 Add format modes (#1842)

Signed-off-by: Denis Bunakalya <denis.bunakalya@xored.com>
This commit is contained in:
Denis Bunakalya 2022-05-23 17:29:12 +03:00 committed by GitHub
parent 54918c8fc6
commit 37abd77e44
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 99 additions and 25 deletions

View File

@ -20,7 +20,7 @@
import { createEventDispatcher } from 'svelte' import { createEventDispatcher } from 'svelte'
import { Completion } from '../Completion' import { Completion } from '../Completion'
import textEditorPlugin from '../plugin' import textEditorPlugin from '../plugin'
import { RefInputAction, RefInputActionItem, TextEditorHandler } from '../types' import { RefInputAction, RefInputActionItem, TextEditorHandler, FORMAT_MODES, FormatMode } from '../types'
import Attach from './icons/Attach.svelte' import Attach from './icons/Attach.svelte'
import Bold from './icons/Bold.svelte' import Bold from './icons/Bold.svelte'
import Italic from './icons/Italic.svelte' import Italic from './icons/Italic.svelte'
@ -46,8 +46,7 @@
let textEditor: TextEditor let textEditor: TextEditor
let isFormatting = false let isFormatting = false
let isBold = false let activeModes = new Set<FormatMode>()
let isItalic = false
export let categories: ObjectSearchCategory[] = [] export let categories: ObjectSearchCategory[] = []
@ -173,20 +172,15 @@
} }
function updateFormattingState () { function updateFormattingState () {
isBold = textEditor.checkIsActive('bold') activeModes = new Set(FORMAT_MODES.filter(textEditor.checkIsActive))
isItalic = textEditor.checkIsActive('italic')
} }
function toggleBold () { function getToggler (toggle: () => void) {
textEditor.toggleBold() return () => {
toggle()
textEditor.focus() textEditor.focus()
isBold = !isBold updateFormattingState()
} }
function toggleItalic () {
textEditor.toggleItalic()
textEditor.focus()
isItalic = !isItalic
} }
</script> </script>
@ -194,31 +188,79 @@
{#if isFormatting} {#if isFormatting}
<div class="formatPanel buttons-group xsmall-gap" class:withoutTopBorder> <div class="formatPanel buttons-group xsmall-gap" class:withoutTopBorder>
<Tooltip label={textEditorPlugin.string.Bold}> <Tooltip label={textEditorPlugin.string.Bold}>
<Button icon={Bold} kind={'transparent'} size={'small'} selected={isBold} on:click={toggleBold} /> <Button
icon={Bold}
kind={'transparent'}
size={'small'}
selected={activeModes.has('bold')}
on:click={getToggler(textEditor.toggleBold)}
/>
</Tooltip> </Tooltip>
<Tooltip label={textEditorPlugin.string.Italic}> <Tooltip label={textEditorPlugin.string.Italic}>
<Button icon={Italic} kind={'transparent'} size={'small'} selected={isItalic} on:click={toggleItalic} /> <Button
icon={Italic}
kind={'transparent'}
size={'small'}
selected={activeModes.has('italic')}
on:click={getToggler(textEditor.toggleItalic)}
/>
</Tooltip> </Tooltip>
<Tooltip label={textEditorPlugin.string.Strikethrough}> <Tooltip label={textEditorPlugin.string.Strikethrough}>
<Button icon={Strikethrough} kind={'transparent'} size={'small'} selected={undefined} on:click={() => {}} /> <Button
icon={Strikethrough}
kind={'transparent'}
size={'small'}
selected={activeModes.has('strike')}
on:click={getToggler(textEditor.toggleStrike)}
/>
</Tooltip> </Tooltip>
<div class="buttons-divider" /> <div class="buttons-divider" />
<Tooltip label={textEditorPlugin.string.OrderedList}> <Tooltip label={textEditorPlugin.string.OrderedList}>
<Button icon={ListNumber} kind={'transparent'} size={'small'} selected={undefined} on:click={() => {}} /> <Button
icon={ListNumber}
kind={'transparent'}
size={'small'}
selected={activeModes.has('orderedList')}
on:click={getToggler(textEditor.toggleOrderedList)}
/>
</Tooltip> </Tooltip>
<Tooltip label={textEditorPlugin.string.BulletedList}> <Tooltip label={textEditorPlugin.string.BulletedList}>
<Button icon={ListBullet} kind={'transparent'} size={'small'} selected={undefined} on:click={() => {}} /> <Button
icon={ListBullet}
kind={'transparent'}
size={'small'}
selected={activeModes.has('bulletList')}
on:click={getToggler(textEditor.toggleBulletList)}
/>
</Tooltip> </Tooltip>
<div class="buttons-divider" /> <div class="buttons-divider" />
<Tooltip label={textEditorPlugin.string.Blockquote}> <Tooltip label={textEditorPlugin.string.Blockquote}>
<Button icon={Quote} kind={'transparent'} size={'small'} selected={undefined} on:click={() => {}} /> <Button
icon={Quote}
kind={'transparent'}
size={'small'}
selected={activeModes.has('blockquote')}
on:click={getToggler(textEditor.toggleBlockquote)}
/>
</Tooltip> </Tooltip>
<div class="buttons-divider" /> <div class="buttons-divider" />
<Tooltip label={textEditorPlugin.string.Code}> <Tooltip label={textEditorPlugin.string.Code}>
<Button icon={Code} kind={'transparent'} size={'small'} selected={undefined} on:click={() => {}} /> <Button
icon={Code}
kind={'transparent'}
size={'small'}
selected={activeModes.has('code')}
on:click={getToggler(textEditor.toggleCode)}
/>
</Tooltip> </Tooltip>
<Tooltip label={textEditorPlugin.string.CodeBlock}> <Tooltip label={textEditorPlugin.string.CodeBlock}>
<Button icon={CodeBlock} kind={'transparent'} size={'small'} selected={undefined} on:click={() => {}} /> <Button
icon={CodeBlock}
kind={'transparent'}
size={'small'}
selected={activeModes.has('codeBlock')}
on:click={getToggler(textEditor.toggleCodeBlock)}
/>
</Tooltip> </Tooltip>
</div> </div>
{/if} {/if}

View File

@ -24,6 +24,7 @@
import StarterKit from '@tiptap/starter-kit' import StarterKit from '@tiptap/starter-kit'
import { createEventDispatcher, onDestroy, onMount } from 'svelte' import { createEventDispatcher, onDestroy, onMount } from 'svelte'
import textEditorPlugin from '../plugin' import textEditorPlugin from '../plugin'
import { FormatMode } from '../types'
export let content: string = '' export let content: string = ''
export let placeholder: IntlString = textEditorPlugin.string.EditorPlaceholder export let placeholder: IntlString = textEditorPlugin.string.EditorPlaceholder
@ -53,8 +54,8 @@
export function insertText (text: string): void { export function insertText (text: string): void {
editor.commands.insertContent(text as HTMLContent) editor.commands.insertContent(text as HTMLContent)
} }
export function checkIsActive (markName: string) { export function checkIsActive (formatMode: FormatMode) {
return editor.isActive(markName) return editor.isActive(formatMode)
} }
export function toggleBold () { export function toggleBold () {
editor.commands.toggleBold() editor.commands.toggleBold()
@ -62,6 +63,24 @@
export function toggleItalic () { export function toggleItalic () {
editor.commands.toggleItalic() editor.commands.toggleItalic()
} }
export function toggleStrike () {
editor.commands.toggleStrike()
}
export function toggleOrderedList () {
editor.commands.toggleOrderedList()
}
export function toggleBulletList () {
editor.commands.toggleBulletList()
}
export function toggleBlockquote () {
editor.commands.toggleBlockquote()
}
export function toggleCode () {
editor.commands.toggleCode()
}
export function toggleCodeBlock () {
editor.commands.toggleCodeBlock()
}
let needFocus = false let needFocus = false
export function focus (): void { export function focus (): void {
needFocus = true needFocus = true

View File

@ -24,3 +24,16 @@ export interface RefInputActionItem extends Doc {
order?: number order?: number
} }
export const FORMAT_MODES = [
'bold',
'italic',
'strike',
'orderedList',
'bulletList',
'blockquote',
'code',
'codeBlock'
] as const
export type FormatMode = typeof FORMAT_MODES[number]