Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
lib
react-ag-qeditor
Commits
d13af7f4
Commit
d13af7f4
authored
Aug 28, 2026
by
Яков
Browse files
update
parent
09f46ddf
Changes
2
Show whitespace changes
Inline
Side-by-side
src/QEditor.jsx
View file @
d13af7f4
...
@@ -38,6 +38,7 @@ import TableExtension from './extensions/TableExtension'
...
@@ -38,6 +38,7 @@ import TableExtension from './extensions/TableExtension'
import
ToggleBlock
from
'
./extensions/ToggleBlock
'
import
ToggleBlock
from
'
./extensions/ToggleBlock
'
import
InteractiveImage
from
'
./extensions/InteractiveImage
'
import
InteractiveImage
from
'
./extensions/InteractiveImage
'
import
FontSize
from
'
./extensions/FontSize
'
import
FontSize
from
'
./extensions/FontSize
'
import
BlockId
from
'
./extensions/BlockId
'
import
ButtonLinkExtension
from
'
./extensions/ButtonLink
'
import
ButtonLinkExtension
from
'
./extensions/ButtonLink
'
// import Image from '@tiptap/extension-image'
// import Image from '@tiptap/extension-image'
...
@@ -826,6 +827,7 @@ const QEditor = ({
...
@@ -826,6 +827,7 @@ const QEditor = ({
}),
}),
TextStyle
,
TextStyle
,
FontSize
,
FontSize
,
BlockId
,
ButtonLinkExtension
,
ButtonLinkExtension
,
Color
.
configure
({
Color
.
configure
({
types
:
[
'
textStyle
'
]
types
:
[
'
textStyle
'
]
...
...
src/extensions/BlockId.js
0 → 100644
View file @
d13af7f4
import
{
Extension
}
from
'
@tiptap/core
'
/**
* Стабильный идентификатор блока.
*
* Зачем. На blockId завязаны прогресс по обязательным блокам, аналитика
* и сравнение ревизий документа. Он обязан пережить цикл
* «сохранили → закрыли → открыли снова», иначе прогресс учащегося переедет
* на другой блок при первом же сохранении урока автором.
*
* Проставляет идентификаторы СЕРВЕР — источников документа два (редактор
* и MCP-агент), и гарантия должна быть в одном месте. Задача этого расширения
* другая: не потерять то, что сервер уже проставил.
*
* Без него цепочка рвалась так:
* 1. сервер проставил blockId и собрал HTML с data-block-id;
* 2. редактор при следующем открытии разобрал HTML — и выбросил атрибут,
* потому что в схеме его нет;
* 3. на сохранении сервер увидел документ без идентификаторов и выдал новые;
* 4. хеш документа изменился, появилась лишняя ревизия — при том, что автор
* ничего не правил.
*
* Поймано сквозной проверкой: два сохранения подряд без единой правки давали
* две ревизии вместо одной.
*/
const
BLOCK_TYPES
=
[
'
paragraph
'
,
'
heading
'
,
'
bulletList
'
,
'
orderedList
'
,
'
blockquote
'
,
'
codeBlock
'
,
'
horizontalRule
'
,
'
image
'
,
'
video
'
,
'
audio
'
,
'
iframe
'
,
'
interactiveImage
'
,
'
toggleBlock
'
,
'
buttonLink
'
,
'
table
'
,
]
const
BlockId
=
Extension
.
create
({
name
:
'
blockId
'
,
addGlobalAttributes
()
{
return
[
{
types
:
BLOCK_TYPES
,
attributes
:
{
blockId
:
{
default
:
null
,
// Редактор сам идентификаторы не придумывает: пустой
// blockId — нормальное состояние нового блока, его
// заполнит сервер при сохранении.
parseHTML
:
(
element
)
=>
element
.
getAttribute
(
'
data-block-id
'
)
||
null
,
renderHTML
:
(
attributes
)
=>
attributes
.
blockId
?
{
'
data-block-id
'
:
attributes
.
blockId
}
:
{},
},
},
},
]
},
})
export
default
BlockId
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment