Merge pull request #5398 from CatoTH/bugfix-non-paragraph-based-amendments

Bugfix non paragraph based amendments
This commit is contained in:
Emanuel Schütze 2020-06-09 20:53:03 +02:00 committed by GitHub
commit e1345cb808
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 63 additions and 41 deletions

View File

@ -324,7 +324,7 @@ export class MotionRepositoryService extends BaseIsAgendaItemAndListOfSpeakersCo
type: 'custom', type: 'custom',
ownKey: 'diffLines', ownKey: 'diffLines',
get: (motion: Motion, viewMotion: ViewMotion) => { get: (motion: Motion, viewMotion: ViewMotion) => {
if (viewMotion.parent) { if (viewMotion.parent && viewMotion.isParagraphBasedAmendment()) {
const changeRecos = viewMotion.changeRecommendations.filter(changeReco => const changeRecos = viewMotion.changeRecommendations.filter(changeReco =>
changeReco.showInFinalView() changeReco.showInFinalView()
); );
@ -335,6 +335,8 @@ export class MotionRepositoryService extends BaseIsAgendaItemAndListOfSpeakersCo
changeRecos, changeRecos,
false false
); );
} else {
return [];
} }
}, },
getCacheObjectToCheck: (viewMotion: ViewMotion) => viewMotion.parent getCacheObjectToCheck: (viewMotion: ViewMotion) => viewMotion.parent
@ -835,7 +837,9 @@ export class MotionRepositoryService extends BaseIsAgendaItemAndListOfSpeakersCo
} }
/** /**
* Returns all paragraph lines that are affected by the given amendment in diff-format, including context * Returns all paragraph lines that are affected by the given amendment in diff-format, including context.
*
* Should only be called for paragraph-based amendments.
* *
* @param {ViewMotion} amendment * @param {ViewMotion} amendment
* @param {number} lineLength * @param {number} lineLength

View File

@ -377,22 +377,27 @@ export class LinenumberingService {
* @returns {LineNumberRange} * @returns {LineNumberRange}
*/ */
public getLineNumberRange(html: string): LineNumberRange { public getLineNumberRange(html: string): LineNumberRange {
const fragment = this.htmlToFragment(html); const cacheKey = this.djb2hash(html);
const range = { let range = this.lineNumberCache.get(cacheKey);
from: null, if (!range) {
to: null const fragment = this.htmlToFragment(html);
}; range = {
const lineNumbers = fragment.querySelectorAll('.os-line-number'); from: null,
for (let i = 0; i < lineNumbers.length; i++) { to: null
const node = lineNumbers.item(i); };
const number = parseInt(node.getAttribute('data-line-number'), 10); const lineNumbers = fragment.querySelectorAll('.os-line-number');
if (range.from === null || number < range.from) { for (let i = 0; i < lineNumbers.length; i++) {
range.from = number; const node = lineNumbers.item(i);
} const number = parseInt(node.getAttribute('data-line-number'), 10);
if (range.to === null || number + 1 > range.to) { if (range.from === null || number < range.from) {
range.to = number + 1; range.from = number;
}
if (range.to === null || number + 1 > range.to) {
range.to = number + 1;
}
} }
} }
this.lineNumberCache.put(cacheKey, range);
return range; return range;
} }
@ -482,10 +487,17 @@ export class LinenumberingService {
* @return {string[]} * @return {string[]}
*/ */
public splitToParagraphs(html: string): string[] { public splitToParagraphs(html: string): string[] {
const fragment = this.htmlToFragment(html); const cacheKey = this.djb2hash(html);
return this.splitNodeToParagraphs(fragment).map((node: Element): string => { let cachedParagraphs = this.lineNumberCache.get(cacheKey);
return node.outerHTML; if (!cachedParagraphs) {
}); const fragment = this.htmlToFragment(html);
cachedParagraphs = this.splitNodeToParagraphs(fragment).map((node: Element): string => {
return node.outerHTML;
});
this.lineNumberCache.put(cacheKey, cachedParagraphs);
}
return cachedParagraphs;
} }
/** /**

View File

@ -322,11 +322,6 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit,
*/ */
public showAmendmentContext = false; public showAmendmentContext = false;
/**
* Sets the current amendment text mode from the settings
*/
private amendmentTextMode: string;
/** /**
* Show all amendments in the text, not only the ones with the apropriate state * Show all amendments in the text, not only the ones with the apropriate state
*/ */
@ -540,9 +535,6 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit,
this.configService this.configService
.get<boolean>('motions_show_sequential_numbers') .get<boolean>('motions_show_sequential_numbers')
.subscribe(shown => (this.showSequential = shown)); .subscribe(shown => (this.showSequential = shown));
this.configService
.get<string>('motions_amendments_text_mode')
.subscribe(amendmentTextMode => (this.amendmentTextMode = amendmentTextMode));
// Update statute paragraphs // Update statute paragraphs
this.statuteRepo.getViewModelListObservable().subscribe(newViewStatuteParagraphs => { this.statuteRepo.getViewModelListObservable().subscribe(newViewStatuteParagraphs => {
@ -649,17 +641,19 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit,
}); });
} }
if (this.amendments) { if (this.amendments) {
this.amendments.forEach((amendment: ViewMotion): void => { this.amendments
const toApplyChanges = (this.amendmentChangeRecos[amendment.id] || []).filter( .filter(amendment => amendment.isParagraphBasedAmendment())
// The rejected change recommendations for amendments should not be considered .forEach((amendment: ViewMotion): void => {
change => change.showInFinalView() const toApplyChanges = (this.amendmentChangeRecos[amendment.id] || []).filter(
); // The rejected change recommendations for amendments should not be considered
this.repo change => change.showInFinalView()
.getAmendmentAmendedParagraphs(amendment, this.lineLength, toApplyChanges) );
.forEach((change: ViewUnifiedChange): void => { this.repo
this.allChangingObjects.push(change); .getAmendmentAmendedParagraphs(amendment, this.lineLength, toApplyChanges)
}); .forEach((change: ViewUnifiedChange): void => {
}); this.allChangingObjects.push(change);
});
});
} }
this.allChangingObjects.sort((a: ViewUnifiedChange, b: ViewUnifiedChange) => { this.allChangingObjects.sort((a: ViewUnifiedChange, b: ViewUnifiedChange) => {
if (a.getLineFrom() < b.getLineFrom()) { if (a.getLineFrom() < b.getLineFrom()) {
@ -750,7 +744,8 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit,
tags_id: parentMotion.tags_id tags_id: parentMotion.tags_id
}); });
if (this.amendmentTextMode === 'fulltext') { const amendmentTextMode = this.configService.instant<string>('motions_amendments_text_mode');
if (amendmentTextMode === 'fulltext') {
defaultMotion.text = parentMotion.text; defaultMotion.text = parentMotion.text;
this.contentForm.patchValue({ text: defaultMotion.text }); this.contentForm.patchValue({ text: defaultMotion.text });
} }
@ -1219,7 +1214,8 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit,
* Goes to the amendment creation wizard. Executed via click. * Goes to the amendment creation wizard. Executed via click.
*/ */
public createAmendment(): void { public createAmendment(): void {
if (this.amendmentTextMode === 'paragraph') { const amendmentTextMode = this.configService.instant<string>('motions_amendments_text_mode');
if (amendmentTextMode === 'paragraph') {
this.router.navigate(['./create-amendment'], { relativeTo: this.route }); this.router.navigate(['./create-amendment'], { relativeTo: this.route });
} else { } else {
this.router.navigate(['./motions/new-amendment'], { this.router.navigate(['./motions/new-amendment'], {
@ -1551,6 +1547,16 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit,
* a change reco. The autoupdate has to come "after" this routine * a change reco. The autoupdate has to come "after" this routine
*/ */
return ChangeRecoMode.Original; return ChangeRecoMode.Original;
} else if (
mode === ChangeRecoMode.Diff &&
!this.changeRecommendations?.length &&
this.motion?.isParagraphBasedAmendment()
) {
/**
* The Diff view for paragraph-based amendments is only relevant for change recommendations;
* the regular amendment changes are shown in the "original" view.
*/
return ChangeRecoMode.Original;
} }
return mode; return mode;
} }