jsegd-bpm 0.1.0 → 0.1.2

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.
@@ -1,892 +0,0 @@
1
- import { ICache } from 'jsegd';
2
- import { Alpine } from 'alpinejs';
3
-
4
- /**
5
- * Resposta de sucesso retornada pelo endpoint `/dataset/api/v2/dataset-handle/search` (HTTP 200).
6
- */
7
- interface DatasetResponse {
8
- /** Nomes dos campos retornados pelo dataset. */
9
- columns: string[];
10
- /** Linhas de dados retornadas pelo dataset. */
11
- values: DatasetRow[];
12
- }
13
- /** Uma linha do dataset — chaves são os nomes dos campos retornados. */
14
- type DatasetRow = Record<string, unknown>;
15
- /**
16
- * Resposta de erro retornada pela API Fluig (HTTP 400, 401, 500).
17
- */
18
- interface DatasetError {
19
- /** Código de erro. */
20
- code: string;
21
- /** Mensagem resumida do erro. */
22
- message: string;
23
- /** Mensagem detalhada do erro. */
24
- detailedMessage: string;
25
- /** URL de ajuda, quando disponível. */
26
- helpUrl?: string;
27
- /** Detalhes adicionais do erro, quando presentes. */
28
- details?: unknown[];
29
- }
30
-
31
- declare enum ConstraintsType {
32
- MUST = "MUST",
33
- MUST_NOT = "MUST_NOT",
34
- SHOULD = "SHOULD"
35
- }
36
- interface SearchParams {
37
- /** Código do dataset — obrigatório. */
38
- datasetId: string;
39
- /** Campos a retornar; omitir para retornar todos os campos. */
40
- field?: string[];
41
- /** Registros a ignorar — usado para paginação (padrão: 0). */
42
- offset?: number;
43
- /** Máximo de registros a retornar (padrão: 300; 0 = todos). */
44
- limit?: number;
45
- /** Nome do campo para ordenação, opcionalmente sufixado com _ASC ou _DESC. */
46
- orderby?: string;
47
- constraintsField?: string[];
48
- constraintsInitialValue?: string[];
49
- constraintsFinalValue?: string[];
50
- constraintsType?: ConstraintsType[];
51
- /** Quando verdadeiro, o curinga % é aceito no valor inicial/final correspondente. */
52
- constraintsLikeSearch?: boolean[];
53
- }
54
-
55
- /**
56
- * Promise cancelável retornada por {@link WorkerManager.query}.
57
- */
58
- type CancelablePromise<T> = {
59
- /** Promise que resolve com o resultado da consulta. */
60
- promise: Promise<T>;
61
- /** Função para cancelar a requisição e liberar o worker. */
62
- cancel: () => void;
63
- };
64
-
65
- type CacheOptions = {
66
- storeName: string;
67
- cacheExpirationMs: number;
68
- };
69
- interface WorkerManagerOptions {
70
- poolSize?: number;
71
- /** Injeta uma instância existente de ICache (compartilhada entre componentes). */
72
- cache?: ICache;
73
- /** Cria um LocalCache interno com as opções fornecidas. */
74
- cacheOptions?: CacheOptions;
75
- }
76
- /**
77
- * Gerencia um pool de Web Workers para executar consultas à API de Datasets do Fluig fora da thread principal.
78
- * Suporta deduplicacão de requisições, cache em IndexedDB e cancelamento HTTP real via AbortController.
79
- *
80
- * @example
81
- * ```typescript
82
- * import { WorkerManager, ConstraintsType } from 'jsegd-fluig'
83
- *
84
- * const manager = new WorkerManager({
85
- * poolSize: 4,
86
- * cacheOptions: { storeName: 'datasetCache', cacheExpirationMs: 24 * 60 * 60 * 1000 }
87
- * })
88
- *
89
- * const { promise, cancel } = manager.query('https://tenant.fluig.com', {
90
- * datasetId: 'dsColaboradores',
91
- * field: ['nome', 'email'],
92
- * constraintsField: ['ativo'],
93
- * constraintsInitialValue: ['true'],
94
- * constraintsType: [ConstraintsType.MUST],
95
- * })
96
- *
97
- * // Cancelar se necessário:
98
- * // cancel()
99
- *
100
- * const result = await promise
101
- * console.log(result.columns) // ['nome', 'email']
102
- * console.log(result.values) // [{ nome: 'João', email: 'joao@co.com' }, ...]
103
- * ```
104
- */
105
- declare class WorkerManager {
106
- private pool;
107
- private workerMeta;
108
- private taskQueue;
109
- private inFlight;
110
- private cache;
111
- private nextRequestId;
112
- constructor(options?: WorkerManagerOptions);
113
- /**
114
- * Consulta a API de Datasets do Fluig. Retorna uma CancelablePromise.
115
- * Chame `cancel()` para abortar a requisição HTTP e liberar o worker imediatamente.
116
- */
117
- query(baseUrl: string, params: SearchParams): CancelablePromise<DatasetResponse>;
118
- /**
119
- * Encerra todos os workers do pool. Chame quando o gerenciador não for mais necessário
120
- * para evitar vazamentos de memória e workers zumbis.
121
- */
122
- terminate(): void;
123
- private deduplicateOrEnqueue;
124
- private enqueueRequest;
125
- private scheduleNext;
126
- private abortRequest;
127
- private handleResponse;
128
- private buildUrl;
129
- }
130
-
131
- type UploadStatus = 'success' | 'error' | 'reset';
132
- interface UploadEventDetail {
133
- status: UploadStatus;
134
- }
135
- declare global {
136
- interface WindowEventMap {
137
- 'jsegd:upload:success': CustomEvent<UploadEventDetail>;
138
- 'jsegd:upload:error': CustomEvent<UploadEventDetail>;
139
- 'jsegd:upload:reset': CustomEvent<UploadEventDetail>;
140
- 'jsegd:attachment:download': CustomEvent<{
141
- documentId: number;
142
- }>;
143
- }
144
- }
145
-
146
- /** Origem do upload de um anexo */
147
- type AttachmentSource = 'button' | 'toolbar' | 'drag-drop';
148
- /**
149
- * Metadados associados a um único documento anexado ao processo.
150
- * Persiste informações que o ECM não armazena nativamente.
151
- */
152
- interface AttachmentRecord {
153
- /** ID do documento no ECM */
154
- documentId: number;
155
- /** Mecanismo pelo qual o arquivo foi adicionado */
156
- source: AttachmentSource;
157
- /**
158
- * Descrição base do `AttachButton` que originou o upload.
159
- * Presente apenas quando `source === 'button'`.
160
- */
161
- buttonDescription?: string;
162
- /** Filtro de tipos de arquivo ativo no momento do upload (`null` = qualquer tipo) */
163
- accept: string | null;
164
- /** Número de sequência da movimentação do processo em que foi anexado */
165
- workflowSequence: number;
166
- /** Data e hora do upload em ISO 8601 */
167
- uploadedAt: string;
168
- /**
169
- * Metadados arbitrários adicionados pelo consumidor da biblioteca.
170
- * Nunca interpretado internamente — apenas serializado/desserializado.
171
- */
172
- custom?: Record<string, unknown>;
173
- }
174
-
175
- /**
176
- * Implementa um botão para gerenciar anexos
177
- * @hideconstructor
178
- * @example
179
- * ```html
180
- * <attachment-button description="CONTRATO"></attachment-button>
181
- * ```
182
- */
183
- declare class AttachButton extends HTMLElement {
184
- /**
185
- * Descrição do tipo de anexo gerenciado pelo botão.
186
- * Quando vazio, um modal é exibido para o usuário informar a descrição no momento do upload.
187
- * @defaultValue `''`
188
- */
189
- description: string;
190
- /**
191
- * Filtro de tipos de arquivo aceitos pelo seletor nativo (ex: `".pdf,.docx"`).
192
- * `null` aceita qualquer tipo de arquivo.
193
- */
194
- accept: string | null;
195
- noaddbutton: string | null;
196
- noviewbutton: string | null;
197
- noeditbutton: string | null;
198
- nodeletebutton: string | null;
199
- private handleSuccess;
200
- private handleError;
201
- private handleDefault;
202
- constructor();
203
- static get observedAttributes(): string[];
204
- attributeChangedCallback(name: string, _oldValue: string, newValue: string): void;
205
- disconnectedCallback(): void;
206
- /**
207
- * @internal
208
- */
209
- connectedCallback(): void;
210
- private displayButtons;
211
- private addButton;
212
- private viewButton;
213
- private editButton;
214
- private removeButton;
215
- private showModal;
216
- }
217
-
218
- /**
219
- * Modo de operação da tabela de anexos.
220
- * - `buttons-only` — somente download por linha; uploads exclusivamente via `AttachButton` externos
221
- * - `self-managed` — gerencia seu próprio ciclo de upload; exibe ações completas por linha;
222
- * aceita `AttachButton` externos cujos atributos são herdados pela linha do anexo
223
- */
224
- type AttachmentsTableMode = 'buttons-only' | 'self-managed';
225
- /** Opções de configuração de `AttachmentsTable` */
226
- interface AttachmentsTableOptions {
227
- /** Modo de operação. Obrigatório — sem valor padrão. */
228
- mode: AttachmentsTableMode;
229
- /**
230
- * Tipos de arquivo aceitos nos uploads avulsos do modo `self-managed`.
231
- * Ex: `".pdf,.docx"`. `null` aceita qualquer tipo.
232
- */
233
- accept?: string | null;
234
- }
235
- /**
236
- * Registro de um `AttachButton` na `AttachmentsTable`.
237
- * Armazenado para associar anexos existentes ao botão que os originou.
238
- */
239
- interface AttachButtonRegistration {
240
- /** Descrição base usada pelo botão (sem sufixo `_V\d+`). */
241
- description: string;
242
- /** Filtro de tipos de arquivo definido no botão. */
243
- accept: string | null;
244
- }
245
- /**
246
- * Cria e gerencia uma tabela de anexos customizada no frame pai,
247
- * mantendo a tabela nativa do Fluig oculta.
248
- * @hideconstructor
249
- */
250
- declare class AttachmentsTable {
251
- private static instance;
252
- private static options;
253
- private static attachInstance;
254
- private static buttonRegistry;
255
- private constructor();
256
- /**
257
- * Retorna a instância singleton da tabela de anexos.
258
- * Deve ser chamado uma única vez durante a inicialização do form.
259
- *
260
- * @param options Configuração obrigatória de modo e accept
261
- */
262
- static getInstance(options: AttachmentsTableOptions): AttachmentsTable;
263
- /**
264
- * Registra um `AttachButton` para que seus metadados sejam associados
265
- * às linhas de anexo originadas por aquele botão.
266
- * Só tem efeito no modo `self-managed`.
267
- * @internal Chamado por `AttachButton` durante sua inicialização.
268
- */
269
- static registerButton(registration: AttachButtonRegistration): void;
270
- private static resolveButtonRegistration;
271
- private static start;
272
- private static render;
273
- private static hydrateFromMetadata;
274
- private static persistMetadata;
275
- private static openNameInputModal;
276
- private static getRows;
277
- private static setOrder;
278
- private static sortBy;
279
- private static getCellValue;
280
- }
281
-
282
- /** Entrada de um arquivo para upload em lote via drag-and-drop */
283
- type DragDropEntry = {
284
- file: File;
285
- name: string;
286
- };
287
-
288
- type FieldError = {
289
- field?: HTMLElement | null;
290
- errorMessage: string;
291
- };
292
- declare class BeforeSendValidate {
293
- private static clearAllErrors;
294
- static throwValidationError(fields: FieldError[]): never;
295
- }
296
-
297
- /**
298
- * Override de `sendRequestEvent()` do widget de processo.
299
- * Executa os hooks `beforeValidate` e `afterValidate` em sequência antes de enviar a solicitação.
300
- * Reabilita os botões de ação em caso de erro ou quando a validação falha.
301
- */
302
- declare function sendRequestEvent(this: ECM_WKFView): Promise<void>;
303
-
304
- /**
305
- * Contrato dos hooks customizáveis do widget de processo.
306
- * Estas funções são registradas pelo `WorkflowViewPatcher` e executadas em `send-request.ts`.
307
- */
308
- interface IWorkflowViewHooks {
309
- /**
310
- * Executado ANTES da validação principal do widget.
311
- * Se lançar exceção (sync ou async), o envio é cancelado e os botões são reabilitados.
312
- */
313
- beforeValidate?: () => void | Promise<void>;
314
- /**
315
- * Executado APÓS `beforeSendValidate` retornar `true`, mas ANTES do envio efetivo.
316
- * Se lançar exceção (sync ou async), o envio é cancelado e os botões são reabilitados.
317
- */
318
- afterValidate?: () => void | Promise<void>;
319
- /**
320
- * Executado quando a movimentação do processo é concluída com sucesso.
321
- */
322
- onMoveSuccess?: () => void | Promise<void>;
323
- /**
324
- * Executado quando ocorre erro na movimentação do processo.
325
- */
326
- onMoveError?: () => void | Promise<void>;
327
- /**
328
- * Executado para manipular os links exibidos na página de conclusão da movimentação.
329
- *
330
- * @param message - Objeto de mensagem de conclusão do processo.
331
- */
332
- onCompletionLinkAdd?: (message: ProcessCompletionMessage) => void | Promise<void>;
333
- }
334
- /**
335
- * Shape do objeto de mensagem de conclusão do processo.
336
- * Passado como parâmetro para o hook `onCompletionLinkAdd`.
337
- */
338
- interface ProcessCompletionMessage {
339
- links: ProcessCompletionLink[];
340
- [key: string]: unknown;
341
- }
342
- /**
343
- * Shape de um link na página de conclusão da movimentação.
344
- */
345
- interface ProcessCompletionLink {
346
- description: string;
347
- href?: string;
348
- bind?: string;
349
- }
350
-
351
- type HooksMap = {
352
- beforeValidate: Array<() => void | Promise<void>>;
353
- afterValidate: Array<() => void | Promise<void>>;
354
- onMoveSuccess: Array<() => void | Promise<void>>;
355
- onMoveError: Array<() => void | Promise<void>>;
356
- onCompletionLinkAdd: Array<(message: ProcessCompletionMessage) => void | Promise<void>>;
357
- };
358
-
359
- /**
360
- * Mapa de substituições que serão aplicadas ao widget nativo de processo.
361
- */
362
- declare const overrides: {
363
- sendRequestEvent: typeof sendRequestEvent;
364
- };
365
- /**
366
- * Tipo do mapa de substituições.
367
- */
368
- type OverrideMap = typeof overrides;
369
- /**
370
- * Classe utilitária para substituir métodos no widget nativo de processo.
371
- *
372
- * Preserva os métodos originais para permitir reversão via `restore()`.
373
- *
374
- * @example
375
- * ```typescript
376
- * // Aguardar inicialização do widget de processo
377
- * await WorkflowViewPatcher.init()
378
- *
379
- * // Aplicar todos os patches registrados
380
- * WorkflowViewPatcher.patchAll()
381
- *
382
- * // Registrar hooks
383
- * WorkflowViewPatcher.addBeforeValidate(async () => {
384
- * console.log('Antes da validação')
385
- * })
386
- *
387
- * WorkflowViewPatcher.addAfterValidate(async () => {
388
- * console.log('Após a validação')
389
- * })
390
- * ```
391
- */
392
- declare class WorkflowViewPatcher {
393
- private static isInitialized;
394
- private static isInitializing;
395
- private static originalMethods;
396
- /**
397
- * Inicializa o patcher aguardando o carregamento do widget de processo no frame pai.
398
- *
399
- * Chamadas repetidas retornam imediatamente se já inicializado.
400
- *
401
- * @param timeout - Tempo máximo de espera em ms (padrão: 5000ms)
402
- * @returns Promise<void>
403
- *
404
- * @throws {Error} Se outra chamada a `init()` já estiver em progresso
405
- * @throws {Error} Se o widget `ECM_WKFView` não estiver disponível após o timeout
406
- *
407
- * @example
408
- * ```typescript
409
- * await WorkflowViewPatcher.init()
410
- * WorkflowViewPatcher.patchAll()
411
- * ```
412
- */
413
- static init(timeout?: number): Promise<void>;
414
- /**
415
- * Aplica o patch de um override específico no widget de processo.
416
- *
417
- * Salva o método original antes de sobrescrever, permitindo reversão via `restore()`.
418
- *
419
- * @param attr - Nome do método a ser substituído
420
- * @throws {Error} Se `init()` não tiver sido chamado antes
421
- * @throws {Error} Se o override não estiver registrado no mapa de substituições
422
- */
423
- static patch(attr: keyof OverrideMap): void;
424
- /**
425
- * Aplica patches para múltiplos métodos do widget de processo.
426
- *
427
- * @param attrs - Array com nomes dos métodos a serem substituídos
428
- * @throws {Error} Se `init()` não tiver sido chamado antes
429
- */
430
- static patchMany(attrs: (keyof OverrideMap)[]): void;
431
- /**
432
- * Aplica todos os patches registrados no mapa de substituições.
433
- * @throws {Error} Se `init()` não tiver sido chamado antes
434
- */
435
- static patchAll(): void;
436
- /**
437
- * Restaura todos os métodos do widget para as implementações originais.
438
- *
439
- * Deve ser chamado ao desmontar o componente em SPAs, para evitar que os patches
440
- * persistam além do ciclo de vida do formulário. Também zera os flags de estado
441
- * interno, permitindo reinicialização via `init()`.
442
- *
443
- * @example
444
- * ```typescript
445
- * // Ao desmontar o formulário
446
- * WorkflowViewPatcher.restore()
447
- * ```
448
- */
449
- static restore(): void;
450
- /**
451
- * Acessa a lista interna de hooks para um tipo específico.
452
- * Usado por `sendRequestEvent` para executar os hooks em sequência.
453
- *
454
- * @internal
455
- */
456
- static getHooks<K extends keyof HooksMap>(key: K): HooksMap[K];
457
- /**
458
- * Registra uma função executada ANTES da validação principal do widget.
459
- *
460
- * Múltiplas chamadas acumulam handlers — nenhuma sobrescreve a anterior.
461
- * Se o handler lançar exceção (sync ou async), o envio é cancelado e os botões são reabilitados.
462
- *
463
- * @param fn - Função a ser executada (pode ser async).
464
- *
465
- * @example
466
- * ```typescript
467
- * WorkflowViewPatcher.addBeforeValidate(async () => {
468
- * const value = getValue('campo_obrigatorio')
469
- * if (!value) {
470
- * throw new Error('Campo obrigatório não preenchido')
471
- * }
472
- * })
473
- * ```
474
- */
475
- static addBeforeValidate(fn: () => void | Promise<void>): void;
476
- /**
477
- * Registra uma função executada APÓS `beforeSendValidate` retornar `true`,
478
- * mas ANTES do envio efetivo da solicitação.
479
- *
480
- * Múltiplas chamadas acumulam handlers — nenhuma sobrescreve a anterior.
481
- * Se o handler lançar exceção (sync ou async), o envio é cancelado e os botões são reabilitados.
482
- *
483
- * @param fn - Função a ser executada (pode ser async).
484
- *
485
- * @example
486
- * ```typescript
487
- * WorkflowViewPatcher.addAfterValidate(async () => {
488
- * console.log('Validação concluída, preparando envio...')
489
- * await salvarDadosLocais()
490
- * })
491
- * ```
492
- */
493
- static addAfterValidate(fn: () => void | Promise<void>): void;
494
- /**
495
- * Registra uma função executada quando a movimentação do processo é concluída com sucesso.
496
- *
497
- * Múltiplas chamadas acumulam handlers — nenhuma sobrescreve a anterior.
498
- *
499
- * @param fn - Função callback executada em caso de sucesso (pode ser async).
500
- *
501
- * @example
502
- * ```typescript
503
- * WorkflowViewPatcher.addOnMoveSuccess(() => {
504
- * console.log('Processo movimentado com sucesso')
505
- * })
506
- * ```
507
- */
508
- static addOnMoveSuccess(fn: () => void | Promise<void>): void;
509
- /**
510
- * Registra uma função executada quando ocorre erro na movimentação do processo.
511
- *
512
- * Múltiplas chamadas acumulam handlers — nenhuma sobrescreve a anterior.
513
- *
514
- * @param fn - Função callback executada em caso de erro (pode ser async).
515
- *
516
- * @example
517
- * ```typescript
518
- * WorkflowViewPatcher.addOnMoveError(() => {
519
- * console.error('Erro ao movimentar processo')
520
- * })
521
- * ```
522
- */
523
- static addOnMoveError(fn: () => void | Promise<void>): void;
524
- /**
525
- * Registra uma função para manipular os links da página de conclusão da movimentação.
526
- *
527
- * Múltiplas chamadas acumulam handlers — nenhuma sobrescreve a anterior.
528
- *
529
- * @param fn - Função que recebe o objeto de conclusão e pode adicionar ou modificar links (pode ser async).
530
- *
531
- * @example
532
- * ```typescript
533
- * WorkflowViewPatcher.addOnCompletionLinkAdd((message: ProcessCompletionMessage) => {
534
- * message.links.push({ description: 'Voltar ao início', href: '/inicio' })
535
- * })
536
- * ```
537
- */
538
- static addOnCompletionLinkAdd(fn: (message: ProcessCompletionMessage) => void | Promise<void>): void;
539
- }
540
-
541
- /**
542
- * Contrato agnóstico ao Fluig para acesso a dados do formulário e tabelas filhas.
543
- * Implementado por `FluigFormRepository` (produção) e `MockFormRepository` (testes).
544
- */
545
- interface IFormRepository {
546
- /**
547
- * Lê campos do formulário cujo `name` começa com o prefixo informado.
548
- *
549
- * @param section Prefixo dos campos no formulário Fluig
550
- * @returns Objeto parcial com os valores lidos
551
- */
552
- load<T>(section: string): Partial<T>;
553
- /**
554
- * Lê todas as linhas visíveis de uma tabela filha do formulário.
555
- * Cada linha corresponde a um `<tr>` visível da tabela com o `tablename` informado.
556
- *
557
- * @param tableName Valor do atributo `tablename` na `<table>` do formulário Fluig
558
- * @returns Array de objetos com os valores dos campos de cada linha
559
- */
560
- loadTable<T>(tableName: string): T[];
561
- /**
562
- * Escreve valores no DOM do formulário para os campos com o prefixo informado.
563
- *
564
- * @param section Prefixo dos campos no formulário Fluig
565
- * @param data Objeto com os valores a persistir
566
- */
567
- save<T>(section: string, data: Partial<T>): void;
568
- /**
569
- * Substitui as linhas de uma tabela filha, removendo as existentes e
570
- * recriando via `wdkAddChild`. Encapsula toda a interação com o DOM.
571
- *
572
- * @param tableName Valor do atributo `tablename` na `<table>` do formulário Fluig
573
- * @param rows Array de objetos a persistir como linhas da tabela
574
- */
575
- saveTable<T>(tableName: string, rows: T[]): void;
576
- }
577
-
578
- /**
579
- * Adapter de produção que isola o acesso ao DOM do formulário Fluig e às
580
- * funções globais `wdkAddChild`/`fnWdkRemoveChild` (definidas em `wdkdetail.js`).
581
- *
582
- * Segue o mesmo padrão de fronteira estabelecido por `process-context/` —
583
- * este é o único arquivo autorizado a referenciar as globais do formulário Fluig.
584
- */
585
- declare class FluigFormRepository implements IFormRepository {
586
- load<T>(section: string): Partial<T>;
587
- loadTable<T>(tableName: string): T[];
588
- save<T>(section: string, data: Partial<T>): void;
589
- saveTable<T>(tableName: string, rows: T[]): void;
590
- }
591
-
592
- /**
593
- * Implementação em memória de `IFormRepository` para uso em testes unitários.
594
- * Não depende de DOM, jQuery ou Fluig — permite testar Presenters em isolamento.
595
- *
596
- * @example
597
- * const repo = new MockFormRepository()
598
- * repo.save('vigencia', { prazo: '12', tipoDePrazo: 'Meses' })
599
- * const data = repo.load<Vigencia>('vigencia')
600
- * // data.prazo === '12'
601
- */
602
- declare class MockFormRepository implements IFormRepository {
603
- private readonly sections;
604
- private readonly tables;
605
- load<T>(section: string): Partial<T>;
606
- loadTable<T>(tableName: string): T[];
607
- save<T>(section: string, data: Partial<T>): void;
608
- saveTable<T>(tableName: string, rows: T[]): void;
609
- /**
610
- * Limpa todo o estado interno — seções e tabelas.
611
- * Ideal para uso em `beforeEach` nos testes.
612
- */
613
- reset(): void;
614
- }
615
-
616
- /** Categoria de uma atividade — determina o comportamento na barra de progresso */
617
- type ActivityKind =
618
- /** Ação de usuário — estágio atual destacado na barra */
619
- 'human'
620
- /** Aguardando retorno externo (webhook) — exibe spinner no estágio atual */
621
- | 'system'
622
- /** Suporte transversal — sobrepõe banner de alerta; não avança a barra */
623
- | 'support'
624
- /** Roteamento interno do motor BPM — invisível na barra */
625
- | 'routing';
626
- /** Definição de um módulo (aba/seção) do formulário Fluig */
627
- interface WorkflowModuleDefinition {
628
- /** Identificador único do módulo — usado como chave nas políticas de atividade */
629
- moduleId: string;
630
- /** Rótulo exibido na navegação */
631
- label: string;
632
- /** Nome do ícone exibido junto ao rótulo */
633
- icon: string;
634
- /** Posição na ordem de exibição — menor valor aparece primeiro */
635
- order: number;
636
- /** Exibe o módulo na barra de navegação lateral/superior */
637
- showInNavigation: boolean;
638
- /** Renderiza o conteúdo do módulo no DOM quando visível */
639
- renderContent: boolean;
640
- /** Caminho do arquivo HTML incluído como conteúdo do módulo */
641
- contentIncludePath: string;
642
- }
643
- /**
644
- * Políticas de visibilidade e editabilidade dos módulos para uma atividade.
645
- * `TModuleId` é inferido automaticamente por `defineWorkflowConfig`.
646
- */
647
- interface ActivityModulePolicy<TModuleId extends string = string> {
648
- /** Módulos visíveis nesta atividade */
649
- visible: readonly TModuleId[];
650
- /** Módulos editáveis nesta atividade (subconjunto de `visible`) */
651
- editable: readonly TModuleId[];
652
- /** Módulo ativo (tab selecionada) ao abrir o formulário nesta atividade */
653
- active?: TModuleId;
654
- }
655
- /** Definição de uma atividade do workflow com suas políticas de módulo */
656
- interface WorkflowActivityDefinition<TModuleId extends string = string> {
657
- /** Número de sequência da atividade no motor BPM Fluig */
658
- sequence: number;
659
- /** Descrição legível da atividade para fins de diagnóstico */
660
- description: string;
661
- /** Categoria da atividade — controla comportamento na barra de progresso */
662
- kind: ActivityKind;
663
- /**
664
- * Estágio de negócio representado por esta atividade na barra de progresso.
665
- * Obrigatório para `'human'` e `'system'`. Omitido para `'routing'`.
666
- * Para `'support'`: identifica o estágio que está sendo interrompido.
667
- */
668
- stage?: string;
669
- /** Políticas de visibilidade e editabilidade dos módulos */
670
- modules?: ActivityModulePolicy<TModuleId>;
671
- }
672
- /**
673
- * Configuração tipada de um workflow Fluig — retornada por `defineWorkflowConfig`.
674
- * `TModuleId` é inferido automaticamente do array de módulos.
675
- */
676
- interface WorkflowConfig<TModules extends readonly WorkflowModuleDefinition[], TModuleId extends string = TModules[number]['moduleId']> {
677
- readonly modules: TModules;
678
- readonly activities: readonly WorkflowActivityDefinition<TModuleId>[];
679
- }
680
-
681
- /**
682
- * Define a configuração de workflow de um projeto Fluig a partir de uma
683
- * declaração única de módulos e atividades. O tipo `ModuleId` é inferido
684
- * automaticamente do array de módulos — nenhum type alias manual é necessário.
685
- *
686
- * @param config Objeto com `modules` (definições de módulo) e `activities` (políticas por atividade)
687
- * @returns Configuração tipada pronta para uso em `resolveWorkflowScreen` e `extractCompletedStages`
688
- *
689
- * @example
690
- * const workflowConfig = defineWorkflowConfig({
691
- * modules: [
692
- * { moduleId: 'solicitante', label: 'Dados Iniciais', icon: 'file', order: 1,
693
- * showInNavigation: true, renderContent: true, contentIncludePath: 'solicitante.html' },
694
- * { moduleId: 'juridico', label: 'Jurídico', icon: 'gavel', order: 2,
695
- * showInNavigation: true, renderContent: true, contentIncludePath: 'juridico.html' },
696
- * ],
697
- * activities: [
698
- * { sequence: 9, description: 'Solicitação inicial', kind: 'human', stage: 'solicitacao',
699
- * modules: { visible: ['solicitante'], editable: ['solicitante'], active: 'solicitante' } },
700
- * { sequence: 88, description: 'Roteamento', kind: 'routing' },
701
- * ]
702
- * } as const)
703
- * // Tipo de ModuleId inferido automaticamente: 'solicitante' | 'juridico'
704
- */
705
- declare function defineWorkflowConfig<const M extends readonly (WorkflowModuleDefinition & {
706
- moduleId: string;
707
- })[]>(config: {
708
- modules: M;
709
- activities: readonly WorkflowActivityDefinition<M[number]['moduleId']>[];
710
- }): WorkflowConfig<M, M[number]['moduleId']>;
711
-
712
- /**
713
- * Entrada do histórico do processo Fluig retornada por
714
- * `parent.ECM.workflowView.processDefinition.urlHistory`.
715
- * As chaves do objeto pai são arbitrárias — usar apenas `movementDate` e
716
- * `movementHour` para determinar a ordem cronológica real.
717
- */
718
- interface FluigHistoryEntry {
719
- /** `null` = ação de usuário; `'SYSTEM'` = tarefa de sistema; `'OBSERVATION'`/`'ATTACHMENT'` = ignorar */
720
- historyType: 'SYSTEM' | 'OBSERVATION' | 'ATTACHMENT' | null;
721
- /** Equivalente a `WorkflowActivityDefinition.sequence` */
722
- stateSequence: number;
723
- /** `0` = atividade de usuário/sistema | `1` = gateway/decisão automática */
724
- stateType: number;
725
- /** Timestamp numérico para ordenação — `null` em sub-registros sem posição cronológica */
726
- movementDate: number | null;
727
- /** Hora no formato `"HH:mm:ss"` — desempate na ordenação quando `movementDate` é igual */
728
- movementHour: string | null;
729
- /** Rótulo da atividade no motor BPM */
730
- labelActivity: string | null;
731
- }
732
- /** Mapa bruto retornado por `urlHistory` — chaves são arbitrárias, ignorar na ordenação */
733
- type FluigHistoryMap = Record<string, FluigHistoryEntry>;
734
- /** Histórico processado — alimenta `ScreenContext` para construir a barra de progresso */
735
- interface ProcessHistory {
736
- /** Estágios concluídos em ordem cronológica real; deduplica estágios repetidos */
737
- completedStages: string[];
738
- /** Estágio atual com seu status; `null` se a atividade atual não tiver stage mapeado */
739
- currentStage: {
740
- stage: string;
741
- status: 'current' | 'waiting';
742
- } | null;
743
- }
744
- /**
745
- * Extrai os estágios concluídos do histórico Fluig na ordem cronológica real.
746
- * Ignora gateways (`stateType === 1`), entradas `SYSTEM`, `OBSERVATION` e `ATTACHMENT`,
747
- * e sub-registros sem `movementDate`. Deduplica estágios — a primeira ocorrência
748
- * cronológica define a posição na barra de progresso.
749
- *
750
- * @param history Mapa bruto retornado por `urlHistory` do processo Fluig
751
- * @param activities Array de definições de atividade do `WorkflowConfig`
752
- * @returns Array de stage IDs na ordem em que ocorreram no processo
753
- */
754
- declare function extractCompletedStages(history: FluigHistoryMap, activities: readonly WorkflowActivityDefinition[]): string[];
755
- /**
756
- * Determina o estágio atual e seu status (`'current'` ou `'waiting'`).
757
- * Retorna `null` se a sequência atual não tiver um `stage` mapeado na configuração.
758
- *
759
- * @param currentSequence Número de sequência da atividade atual do processo
760
- * @param currentHistoryType `historyType` da entrada atual — `null` para ação humana, `'SYSTEM'` para espera
761
- * @param activities Array de definições de atividade do `WorkflowConfig`
762
- * @returns Objeto com `stage` e `status`, ou `null`
763
- */
764
- declare function extractCurrentStage(currentSequence: number, currentHistoryType: 'SYSTEM' | null, activities: readonly WorkflowActivityDefinition[]): {
765
- stage: string;
766
- status: 'current' | 'waiting';
767
- } | null;
768
-
769
- /** Módulo com políticas de visibilidade e editabilidade resolvidas para a atividade atual */
770
- interface ResolvedModule {
771
- moduleId: string;
772
- label: string;
773
- icon: string;
774
- order: number;
775
- showInNavigation: boolean;
776
- renderContent: boolean;
777
- contentIncludePath: string;
778
- isVisible: boolean;
779
- isEditable: boolean;
780
- isActive: boolean;
781
- }
782
- /**
783
- * Contexto de tela para uma atividade de workflow.
784
- * Consultado por Presenters para decidir visibilidade/editabilidade
785
- * sem conhecer números de sequência.
786
- *
787
- * @hideconstructor
788
- */
789
- declare class ScreenContext {
790
- private readonly activity;
791
- private readonly resolvedModules;
792
- private readonly history;
793
- constructor(activity: WorkflowActivityDefinition, resolvedModules: readonly ResolvedModule[], history: ProcessHistory);
794
- /**
795
- * Retorna `true` se o módulo é visível na atividade atual.
796
- *
797
- * @param moduleId Identificador do módulo
798
- */
799
- isVisible(moduleId: string): boolean;
800
- /**
801
- * Retorna `true` se o módulo é editável na atividade atual.
802
- *
803
- * @param moduleId Identificador do módulo
804
- */
805
- isEditable(moduleId: string): boolean;
806
- /**
807
- * Retorna `true` se o módulo é o ativo (tab selecionada) na atividade atual.
808
- *
809
- * @param moduleId Identificador do módulo
810
- */
811
- isActive(moduleId: string): boolean;
812
- /**
813
- * Retorna `true` se a atividade atual está aguardando um sistema externo
814
- * (`kind === 'system'` ou `currentStage.status === 'waiting'`).
815
- */
816
- isAwaitingSystem(): boolean;
817
- /**
818
- * Retorna `true` se a atividade atual é uma atividade de suporte transversal.
819
- */
820
- isInSupport(): boolean;
821
- /**
822
- * Retorna os estágios para renderizar na barra de progresso.
823
- * Inclui os estágios concluídos do histórico (`'done'`) e o estágio atual
824
- * (`'current'` ou `'waiting'`), sem duplicar.
825
- */
826
- getProgressBarStages(): Array<{
827
- stage: string;
828
- status: 'done' | 'current' | 'waiting';
829
- }>;
830
- /**
831
- * Retorna todos os módulos resolvidos, incluindo os não-visíveis.
832
- */
833
- getModules(): readonly ResolvedModule[];
834
- /**
835
- * Retorna apenas os módulos visíveis, ordenados por `order` ascendente.
836
- */
837
- getVisibleModules(): readonly ResolvedModule[];
838
- /**
839
- * Retorna os módulos que aparecem na navegação (`showInNavigation && isVisible`),
840
- * ordenados por `order` ascendente.
841
- */
842
- getNavigationModules(): readonly ResolvedModule[];
843
- }
844
-
845
- /**
846
- * Resolve a tela para a sequência informada, cruzando a configuração do workflow
847
- * com o histórico do processo para produzir um `ScreenContext`.
848
- *
849
- * @param config Configuração gerada por `defineWorkflowConfig`
850
- * @param sequence Número de sequência da atividade atual no processo Fluig
851
- * @param history Histórico processado via `extractCompletedStages` e `extractCurrentStage`
852
- * @returns `ScreenContext` pronto para consulta pelos Presenters
853
- *
854
- * @throws {Error} Se a sequência não estiver mapeada na configuração
855
- *
856
- * @example
857
- * const screen = resolveWorkflowScreen(workflowConfig, 53, processHistory)
858
- * screen.isVisible('juridico') // true
859
- * screen.isEditable('juridico') // true
860
- * screen.isInSupport() // false
861
- */
862
- declare function resolveWorkflowScreen(config: WorkflowConfig<readonly WorkflowModuleDefinition[]>, sequence: number, history: ProcessHistory): ScreenContext;
863
-
864
- /** Mapa de stores: chave = nome do store, valor = objeto do store */
865
- type StoreMap = Record<string, object>;
866
- /**
867
- * Tipo utilitário que gera um proxy com getters tipados para cada store registrado.
868
- * Permite `stores.contador` ao invés de `Alpine.store('contador') as ContadorStore`.
869
- */
870
- type StoreProxy<T extends StoreMap> = {
871
- readonly [K in keyof T]: T[K];
872
- };
873
- /**
874
- * Registra múltiplos Alpine stores e retorna um proxy tipado para acesso direto.
875
- * Deve ser chamado no ponto de inicialização da aplicação, antes de `Alpine.start()`.
876
- *
877
- * @param alpine Instância Alpine — aceita `Pick<Alpine, 'store'>` para facilitar mock em testes
878
- * @param storeMap Objeto com pares `{ nomeDoStore: objetoInicial }`
879
- * @returns Proxy tipado para leitura dos stores sem casting manual
880
- *
881
- * @example
882
- * const stores = registerStores(Alpine, {
883
- * usuario: { nome: '', perfil: '' as PerfilId },
884
- * ui: { carregando: false, erro: null as string | null }
885
- * })
886
- * // stores.usuario.nome está tipado como string
887
- * // Internamente: Alpine.store('usuario', { nome: '', perfil: '' })
888
- */
889
- declare function registerStores<T extends StoreMap>(alpine: Pick<Alpine, 'store'>, storeMap: T): StoreProxy<T>;
890
-
891
- export { AttachButton, AttachmentsTable, BeforeSendValidate, ConstraintsType, FluigFormRepository, MockFormRepository, ScreenContext, WorkerManager, WorkflowViewPatcher, defineWorkflowConfig, extractCompletedStages, extractCurrentStage, registerStores, resolveWorkflowScreen, sendRequestEvent };
892
- export type { ActivityKind, ActivityModulePolicy, AttachButtonRegistration, AttachmentRecord, AttachmentSource, AttachmentsTableMode, AttachmentsTableOptions, CacheOptions, CancelablePromise, DatasetError, DatasetResponse, DatasetRow, DragDropEntry, FieldError, FluigHistoryEntry, FluigHistoryMap, IFormRepository, IWorkflowViewHooks, ProcessCompletionLink, ProcessCompletionMessage, ProcessHistory, ResolvedModule, SearchParams, StoreMap, StoreProxy, WorkerManagerOptions, WorkflowActivityDefinition, WorkflowConfig, WorkflowModuleDefinition };