@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 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,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meistrari/minuta-react",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Componente React do editor de minuta do defesa.ai — casca fina sobre @meistrari/minuta-editor",
5
5
  "repository": {
6
6
  "type": "git",