|
1 | | -import React, {CSSProperties, useCallback, useEffect} from 'react'; |
| 1 | +import React, {CSSProperties, useCallback, useEffect, useState} from 'react'; |
2 | 2 |
|
3 | 3 | import sanitize from '@diplodoc/transform/lib/sanitize'; |
4 | 4 | import {Button, DropdownMenu} from '@gravity-ui/uikit'; |
|
8 | 8 | MarkdownEditorMode, |
9 | 9 | MarkdownEditorView, |
10 | 10 | MarkupString, |
| 11 | + NumberInput, |
11 | 12 | RenderPreview, |
12 | 13 | logger, |
13 | 14 | markupToolbarConfigs, |
@@ -220,64 +221,75 @@ export const Playground = React.memo<PlaygroundProps>((props) => { |
220 | 221 | Markdown Editor Playground |
221 | 222 | <span className={b('version')}>{VERSION}</span> |
222 | 223 | </div> |
223 | | - <DropdownMenu |
224 | | - size="s" |
225 | | - switcher={ |
226 | | - <Button size="s" view="flat"> |
227 | | - isEmpty: {String(mdEditor.isEmpty())} |
228 | | - </Button> |
229 | | - } |
230 | | - > |
231 | | - <DropdownMenu.Item |
232 | | - text="Clear" |
233 | | - action={() => { |
234 | | - mdEditor.clear(); |
235 | | - mdEditor.focus(); |
236 | | - }} |
237 | | - /> |
238 | | - <DropdownMenu.Item |
239 | | - text="Append" |
240 | | - action={() => { |
241 | | - mdEditor.append('> append'); |
242 | | - mdEditor.focus(); |
243 | | - }} |
244 | | - /> |
245 | | - <DropdownMenu.Item |
246 | | - text="Prepend" |
247 | | - action={() => { |
248 | | - mdEditor.prepend('> prepend'); |
249 | | - mdEditor.focus(); |
250 | | - }} |
251 | | - /> |
252 | | - <DropdownMenu.Item |
253 | | - text="Replace" |
254 | | - action={() => { |
255 | | - mdEditor.replace('> replace'); |
256 | | - mdEditor.focus(); |
257 | | - }} |
258 | | - /> |
259 | | - <DropdownMenu.Item |
260 | | - text="Move cursor to start" |
261 | | - action={() => { |
262 | | - mdEditor.moveCursor('start'); |
263 | | - mdEditor.focus(); |
264 | | - }} |
265 | | - /> |
266 | | - <DropdownMenu.Item |
267 | | - text="Move cursor to end" |
268 | | - action={() => { |
269 | | - mdEditor.moveCursor('end'); |
270 | | - mdEditor.focus(); |
271 | | - }} |
272 | | - /> |
273 | | - <DropdownMenu.Item |
274 | | - text="Move to line" |
275 | | - action={() => { |
276 | | - mdEditor.moveCursor({line: 115}); |
277 | | - mdEditor.focus(); |
278 | | - }} |
279 | | - /> |
280 | | - </DropdownMenu> |
| 224 | + <div className={b('actions')}> |
| 225 | + <DropdownMenu |
| 226 | + size="s" |
| 227 | + switcher={ |
| 228 | + <Button size="s" view="flat"> |
| 229 | + isEmpty: {String(mdEditor.isEmpty())} |
| 230 | + </Button> |
| 231 | + } |
| 232 | + > |
| 233 | + <DropdownMenu.Item |
| 234 | + text="Clear" |
| 235 | + action={() => { |
| 236 | + mdEditor.clear(); |
| 237 | + mdEditor.focus(); |
| 238 | + }} |
| 239 | + /> |
| 240 | + <DropdownMenu.Item |
| 241 | + text="Append" |
| 242 | + action={() => { |
| 243 | + mdEditor.append('> append'); |
| 244 | + mdEditor.focus(); |
| 245 | + }} |
| 246 | + /> |
| 247 | + <DropdownMenu.Item |
| 248 | + text="Prepend" |
| 249 | + action={() => { |
| 250 | + mdEditor.prepend('> prepend'); |
| 251 | + mdEditor.focus(); |
| 252 | + }} |
| 253 | + /> |
| 254 | + <DropdownMenu.Item |
| 255 | + text="Replace" |
| 256 | + action={() => { |
| 257 | + mdEditor.replace('> replace'); |
| 258 | + mdEditor.focus(); |
| 259 | + }} |
| 260 | + /> |
| 261 | + <DropdownMenu.Item |
| 262 | + text="Move cursor to start" |
| 263 | + action={() => { |
| 264 | + mdEditor.moveCursor('start'); |
| 265 | + mdEditor.focus(); |
| 266 | + }} |
| 267 | + /> |
| 268 | + <DropdownMenu.Item |
| 269 | + text="Move cursor to end" |
| 270 | + action={() => { |
| 271 | + mdEditor.moveCursor('end'); |
| 272 | + mdEditor.focus(); |
| 273 | + }} |
| 274 | + /> |
| 275 | + <DropdownMenu.Item |
| 276 | + text="Move to line" |
| 277 | + action={() => { |
| 278 | + mdEditor.moveCursor({line: 115}); |
| 279 | + mdEditor.focus(); |
| 280 | + }} |
| 281 | + /> |
| 282 | + </DropdownMenu> |
| 283 | + {mdEditor.currentMode === 'markup' && ( |
| 284 | + <MoveToLine |
| 285 | + onClick={(line) => { |
| 286 | + if (typeof line !== 'number' || Number.isNaN(line)) return; |
| 287 | + mdEditor.moveCursor({line}); |
| 288 | + mdEditor.focus(); |
| 289 | + }} |
| 290 | + /> |
| 291 | + )} |
| 292 | + </div> |
281 | 293 | <hr /> |
282 | 294 | <React.StrictMode> |
283 | 295 | <div className={b('editor')} style={{height: height ?? 'initial'}}> |
@@ -306,3 +318,22 @@ export const Playground = React.memo<PlaygroundProps>((props) => { |
306 | 318 | }); |
307 | 319 |
|
308 | 320 | Playground.displayName = 'Playground'; |
| 321 | + |
| 322 | +function MoveToLine({onClick}: {onClick: (value: number | undefined) => void}) { |
| 323 | + const [line, setLine] = useState<number | undefined>(0); |
| 324 | + |
| 325 | + return ( |
| 326 | + <div className={b('move-to-line')}> |
| 327 | + <NumberInput |
| 328 | + size="s" |
| 329 | + value={line} |
| 330 | + onUpdate={setLine} |
| 331 | + min={0} |
| 332 | + className={b('move-to-line-input')} |
| 333 | + /> |
| 334 | + <Button size="s" onClick={() => onClick(line)}> |
| 335 | + Move to line |
| 336 | + </Button> |
| 337 | + </div> |
| 338 | + ); |
| 339 | +} |
0 commit comments