Skip to content

Commit 2278785

Browse files
fix: undo/redo de exclusão de agrupador de artigo, em alteração de norma
Refs #847
1 parent 6e24adc commit 2278785

File tree

5 files changed

+54
-6
lines changed

5 files changed

+54
-6
lines changed

src/model/elemento/elemento.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,5 @@ export class Elemento extends Referencia {
4343
artigoDefinido?: string;
4444
elementoAnteriorNaSequenciaDeLeitura?: Referencia;
4545
revisao?: Revisao;
46+
ultimoFilhoDireto?: Referencia;
4647
}

src/model/elemento/elementoUtil.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,8 @@ export const createElemento = (dispositivo: Dispositivo, acoes = true, procurarE
134134
tiposAgrupadoresQuePodemSerInseridosDepois: getTiposAgrupadoresQuePodemSerInseridosDepois(dispositivo),
135135
artigoDefinido: dispositivo.artigoDefinido,
136136
elementoAnteriorNaSequenciaDeLeitura,
137+
ultimoFilhoDireto:
138+
isAgrupador(dispositivo) && isDispositivoAlteracao(dispositivo) && dispositivo.filhos.length ? createElemento(dispositivo.filhos[dispositivo.filhos.length - 1]) : undefined,
137139
};
138140
};
139141

src/redux/elemento/reducer/redo.ts

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
import { ajustarAtributosAgrupadorIncluidoPorUndoRedo, isUndoRedoInclusaoExclusaoAgrupador, processarRestaurados } from './../util/undoRedoReducerUtil';
1+
import {
2+
ajustarAtributosAgrupadorIncluidoPorUndoRedo,
3+
ajustarHierarquivoAgrupadorIncluidoPorUndoRedo,
4+
isUndoRedoInclusaoExclusaoAgrupador,
5+
processarRestaurados,
6+
} from './../util/undoRedoReducerUtil';
27
import { DispositivoSuprimido } from '../../../model/lexml/situacao/dispositivoSuprimido';
38
import { State, StateEvent, StateType } from '../../state';
49
import { Eventos } from '../evento/eventos';
@@ -44,16 +49,21 @@ export const redo = (state: any): State => {
4449
tempState.present = [];
4550
tempState.future = [];
4651

47-
if (eventos[0].stateType === StateType.ElementoIncluido) {
48-
const ref = eventos.find((ev: StateEvent) => ev.stateType === StateType.ElementoReferenciado)!.elementos[0];
49-
const elementoASerIncluido = eventos[0].elementos[0];
52+
const listaSemEventosDeRevisao = eventos.filter(
53+
(se: StateEvent) => ![StateType.RevisaoAceita, StateType.RevisaoRejeitada, StateType.RevisaoAdicionalRejeitada].includes(se.stateType)
54+
);
55+
56+
if (listaSemEventosDeRevisao[0].stateType === StateType.ElementoIncluido) {
57+
const ref = listaSemEventosDeRevisao.find((ev: StateEvent) => ev.stateType === StateType.ElementoReferenciado)!.elementos[0];
58+
const elementoASerIncluido = listaSemEventosDeRevisao[0].elementos[0];
5059
tempState = agrupaElemento(tempState, {
5160
atual: ref,
5261
novo: { tipo: elementoASerIncluido.tipo, uuid: elementoASerIncluido.uuid, posicao: 'antes', manterNoMesmoGrupoDeAspas: elementoASerIncluido.manterNoMesmoGrupoDeAspas },
5362
});
54-
ajustarAtributosAgrupadorIncluidoPorUndoRedo(state.articulacao, eventos, tempState.ui!.events);
63+
ajustarAtributosAgrupadorIncluidoPorUndoRedo(state.articulacao, listaSemEventosDeRevisao, tempState.ui!.events);
64+
ajustarHierarquivoAgrupadorIncluidoPorUndoRedo(state.articulacao, listaSemEventosDeRevisao, tempState.ui!.events);
5565
} else {
56-
tempState = removeElemento(tempState, { atual: eventos[0].elementos[0] });
66+
tempState = removeElemento(tempState, { atual: listaSemEventosDeRevisao[0].elementos[0] });
5767
}
5868

5969
const eventosRevisao = getEventosDeRevisao(eventos);

src/redux/elemento/reducer/undo.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
processarRestaurados,
88
processarSuprimidos,
99
processarRevisoesAceitasOuRejeitadas,
10+
ajustarHierarquivoAgrupadorIncluidoPorUndoRedo,
1011
} from './../util/undoRedoReducerUtil';
1112
import { State, StateEvent, StateType } from '../../state';
1213
import { Eventos } from '../evento/eventos';
@@ -61,6 +62,7 @@ export const undo = (state: any): State => {
6162
novo: { tipo: elementoASerIncluido.tipo, uuid: elementoASerIncluido.uuid, posicao: 'antes', manterNoMesmoGrupoDeAspas: elementoASerIncluido.manterNoMesmoGrupoDeAspas },
6263
});
6364
ajustarAtributosAgrupadorIncluidoPorUndoRedo(state.articulacao, eventosFiltrados, tempState.ui!.events);
65+
ajustarHierarquivoAgrupadorIncluidoPorUndoRedo(state.articulacao, eventosFiltrados, tempState.ui!.events);
6466
}
6567

6668
const eventosRevisao = [

src/redux/elemento/util/undoRedoReducerUtil.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ import { validaDispositivo } from '../../../model/lexml/dispositivo/dispositivoV
88
import {
99
buscaDispositivoById,
1010
findDispositivoByUuid,
11+
getDispositivoAndFilhosAsLista,
1112
getDispositivoAnterior,
1213
getTiposAgrupadorArtigoOrdenados,
1314
getUltimoFilho,
15+
isAdicionado,
1416
isArticulacaoAlteracao,
1517
isSuprimido,
1618
} from '../../../model/lexml/hierarquia/hierarquiaUtil';
@@ -313,6 +315,37 @@ export const ajustarAtributosAgrupadorIncluidoPorUndoRedo = (articulacao: Articu
313315
eventosResultantes[0].elementos!.push(createElemento(dispositivo));
314316
};
315317

318+
export const ajustarHierarquivoAgrupadorIncluidoPorUndoRedo = (articulacao: Articulacao, eventosFonte: StateEvent[], eventosResultantes: StateEvent[]): void => {
319+
const elAgrupador = eventosFonte[0].elementos![0];
320+
321+
if (!elAgrupador.dispositivoAlteracao || !elAgrupador.ultimoFilhoDireto) {
322+
return;
323+
}
324+
325+
const agrupador = getDispositivoFromElemento(articulacao, elAgrupador)!;
326+
const pai = agrupador.pai!;
327+
const ultimoFilhoDireto = getDispositivoFromElemento(articulacao, elAgrupador.ultimoFilhoDireto)!;
328+
329+
let index = pai.filhos.indexOf(agrupador) + 1;
330+
331+
while (index < pai.filhos.length) {
332+
const d = pai.filhos[index];
333+
if (isAdicionado(d)) {
334+
pai.removeFilho(d);
335+
d.pai = agrupador;
336+
agrupador.addFilho(d);
337+
338+
if (d.uuid === ultimoFilhoDireto.uuid) {
339+
break;
340+
}
341+
} else {
342+
index++;
343+
}
344+
}
345+
346+
eventosResultantes.push({ stateType: StateType.SituacaoElementoModificada, elementos: getDispositivoAndFilhosAsLista(agrupador).map(d => createElemento(d)) });
347+
};
348+
316349
export const processarRestaurados = (state: State, evento: StateEvent, acao: string): StateEvent => {
317350
const elementoDeReferencia = evento.elementos![acao === 'UNDO' ? 0 : 1];
318351
const d = getDispositivoFromElemento(state.articulacao!, elementoDeReferencia, true)!;

0 commit comments

Comments
 (0)