@meistrari/minuta-react 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -1
- package/dist/index.d.mts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.mjs +4 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -36,13 +36,16 @@ um `Blob` de `.docx`. Buscar o documento, persistir a edição e baixar o arquiv
|
|
|
36
36
|
| `variables` | — | catálogo `{ key, label, description?, group? }[]` → liga o modo template |
|
|
37
37
|
| `uploadImage` | — | `(file) => Promise<{ src, vaultSrc } \| null>` |
|
|
38
38
|
| `toolbar` | `true` | `false` = você monta a sua sobre `ref.current.tiptap` |
|
|
39
|
+
| `blockClickWhileEditing` | `false` | dispara `onBlockClick` também em edição (padrão: só em leitura) |
|
|
39
40
|
| `onChange` | — | `(html) => void`, a cada edição |
|
|
40
41
|
| `onTransaction` | — | qualquer transação, inclusive só de seleção — para toolbar própria |
|
|
41
42
|
| `onReady`, `onEditChrome`, `onBlockClick`, `onError` | — | |
|
|
42
43
|
|
|
43
44
|
O `ref` entrega a instância do editor: `getHTML()`, `exportDocx()` (→ `Blob`),
|
|
44
45
|
`usedVariables()`, `setEditable()`, `setChrome()`, `tiptap` (a instância do
|
|
45
|
-
Tiptap — escotilha de fuga), `root`/`container`/`sheet` (os elementos)
|
|
46
|
+
Tiptap — escotilha de fuga), `root`/`container`/`sheet` (os elementos) — e a
|
|
47
|
+
ponte formulário ↔ documento: `scrollToVariable()`, `setVariableValue()`,
|
|
48
|
+
`setVariableImage()`, `variablesInDocument()` (abaixo).
|
|
46
49
|
|
|
47
50
|
### Por que o `html` é lido uma vez
|
|
48
51
|
|
|
@@ -123,6 +126,34 @@ edição criada a partir de HTML já resolvido (sem marcas) a ponte não existe,
|
|
|
123
126
|
é melhor saber antes de montar a tela do que descobrir com
|
|
124
127
|
`variablesInDocument()` vazio.
|
|
125
128
|
|
|
129
|
+
### O que é marcado, e com que id
|
|
130
|
+
|
|
131
|
+
| no template | no HTML | id da marca |
|
|
132
|
+
|---|---|---|
|
|
133
|
+
| `<variable name="comarca">` | `<span data-variable-id data-parent-block-id>` (chip) | `comarca` |
|
|
134
|
+
| variável `compute` | idem — o valor é calculado antes do render | o id da compute |
|
|
135
|
+
| `<for item="c" in="contratos"> <variable name="c.numero">` | um chip por linha, com `data-variable-index` | `contratos[0].numero`, `contratos[1].numero`… |
|
|
136
|
+
| `<img variable="img_doc">` com valor | `<img data-variable-id data-parent-block-id>` | `img_doc` |
|
|
137
|
+
| `<img variable="img_doc">` sem valor | aviso `missing-image-warning` (nó `missingImage` no editor) | `img_doc` |
|
|
138
|
+
| cada bloco do template | `<div data-minuta-block data-block-id data-block-title>` | `data-block-id` = id do bloco no `templateSpec` |
|
|
139
|
+
|
|
140
|
+
Variável de texto **sem valor** sai como aviso (`data-invalid-variable`), não
|
|
141
|
+
como chip, e não entra em `markedVariables`. Booleans não viram marca: eles
|
|
142
|
+
decidem se um trecho ou bloco é emitido; a regra fica em `displayCondition` e
|
|
143
|
+
nos `<if condition>` do template (podem envolver várias variáveis).
|
|
144
|
+
|
|
145
|
+
```tsx
|
|
146
|
+
// array: uma linha de cada vez
|
|
147
|
+
editor.current!.setVariableValue('contratos[1].numero', '375586874')
|
|
148
|
+
|
|
149
|
+
// imagem: troca a existente, ou transforma o aviso de "faltando" em imagem
|
|
150
|
+
editor.current!.setVariableImage('img_doc', urlAssinada) // → nº de ocorrências
|
|
151
|
+
editor.current!.scrollToVariable('img_faltando') // acha o aviso também
|
|
152
|
+
|
|
153
|
+
// bloco: com blockClickWhileEditing o clique em edição também avisa
|
|
154
|
+
<MinutaEditor blockClickWhileEditing onBlockClick={id => openChecklistBlock(id)} … />
|
|
155
|
+
```
|
|
156
|
+
|
|
126
157
|
Sobre o fluxo de "enviar variáveis de volta": com uma edição viva o documento
|
|
127
158
|
**é** a edição — o `PATCH` de variáveis no case não re-renderiza a peça (senão
|
|
128
159
|
apagaria o texto do advogado). Ou o formulário trava quando a lapidação começa
|
package/dist/index.d.mts
CHANGED
|
@@ -35,6 +35,8 @@ interface MinutaEditorProps {
|
|
|
35
35
|
/** barra de formatação do pacote (default: true). `false` = monte a sua sobre `ref.tiptap` */
|
|
36
36
|
toolbar?: boolean;
|
|
37
37
|
showBlockOrigin?: boolean;
|
|
38
|
+
/** dispara `onBlockClick` também em edição (padrão: só em leitura) */
|
|
39
|
+
blockClickWhileEditing?: boolean;
|
|
38
40
|
onReady?: MinutaEditorOptions['onReady'];
|
|
39
41
|
/** o documento mudou por edição — recebe o HTML atual */
|
|
40
42
|
onChange?: (html: string) => void;
|
package/dist/index.d.ts
CHANGED
|
@@ -35,6 +35,8 @@ interface MinutaEditorProps {
|
|
|
35
35
|
/** barra de formatação do pacote (default: true). `false` = monte a sua sobre `ref.tiptap` */
|
|
36
36
|
toolbar?: boolean;
|
|
37
37
|
showBlockOrigin?: boolean;
|
|
38
|
+
/** dispara `onBlockClick` também em edição (padrão: só em leitura) */
|
|
39
|
+
blockClickWhileEditing?: boolean;
|
|
38
40
|
onReady?: MinutaEditorOptions['onReady'];
|
|
39
41
|
/** o documento mudou por edição — recebe o HTML atual */
|
|
40
42
|
onChange?: (html: string) => void;
|
package/dist/index.mjs
CHANGED
|
@@ -23,6 +23,7 @@ const MinutaEditor = forwardRef((props, ref) => {
|
|
|
23
23
|
uploadImage: (file) => callbacks.current.uploadImage ? callbacks.current.uploadImage(file) : Promise.resolve(null),
|
|
24
24
|
toolbar: props.toolbar,
|
|
25
25
|
showBlockOrigin: props.showBlockOrigin,
|
|
26
|
+
blockClickWhileEditing: props.blockClickWhileEditing,
|
|
26
27
|
onReady: (tiptap) => callbacks.current.onReady?.(tiptap),
|
|
27
28
|
onChange: () => callbacks.current.onChange?.(editor.getHTML()),
|
|
28
29
|
onTransaction: () => callbacks.current.onTransaction?.(),
|
|
@@ -60,6 +61,9 @@ const MinutaEditor = forwardRef((props, ref) => {
|
|
|
60
61
|
useEffect(() => {
|
|
61
62
|
instance.current?.setShowBlockOrigin(props.showBlockOrigin !== false);
|
|
62
63
|
}, [props.showBlockOrigin]);
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
instance.current?.setBlockClickWhileEditing(props.blockClickWhileEditing === true);
|
|
66
|
+
}, [props.blockClickWhileEditing]);
|
|
63
67
|
useImperativeHandle(ref, () => instance.current);
|
|
64
68
|
return createElement("div", {
|
|
65
69
|
ref: host,
|