OpenSlides/client/src/app/site/motions/models/view-motion-amended-paragraph.ts
2019-07-30 09:53:14 +02:00

119 lines
3.8 KiB
TypeScript

import { LineRange } from 'app/core/ui-services/diff.service';
import { MergeAmendment } from 'app/shared/models/motions/state';
import { ViewMotion } from './view-motion';
import { ViewUnifiedChange, ViewUnifiedChangeType } from '../../../shared/models/motions/view-unified-change';
/**
* This represents the Unified Diff part of an amendments.
*
* Hint: As we will probably support multiple affected paragraphs in one amendment in the future,
* Amendments <-> ViewMotionAmendedParagraph is potentially a 1:n-relation
*/
export class ViewMotionAmendedParagraph implements ViewUnifiedChange {
public get stateName(): string {
return this.amendment.state.name;
}
public constructor(
private amendment: ViewMotion,
private paragraphNo: number,
private newText: string,
private lineRange: LineRange
) {}
public getChangeId(): string {
return 'amendment-' + this.amendment.id.toString(10) + '-' + this.paragraphNo.toString(10);
}
public getChangeType(): ViewUnifiedChangeType {
return ViewUnifiedChangeType.TYPE_AMENDMENT;
}
public getLineFrom(): number {
return this.lineRange.from;
}
public getLineTo(): number {
return this.lineRange.to;
}
public getChangeNewText(): string {
return this.newText;
}
/**
* The state and recommendation of this amendment is considered.
* The state takes precedence.
*
* HINT: This implementation should be consistent with get_amendment_merge_into_motion() in projector.py
*
* @returns {boolean}
*/
public isAccepted(): boolean {
const mergeState = this.amendment.state
? this.amendment.state.merge_amendment_into_final
: MergeAmendment.UNDEFINED;
switch (mergeState) {
case MergeAmendment.YES:
return true;
case MergeAmendment.NO:
return false;
default:
const mergeRecommendation = this.amendment.recommendation
? this.amendment.recommendation.merge_amendment_into_final
: MergeAmendment.UNDEFINED;
switch (mergeRecommendation) {
case MergeAmendment.YES:
return true;
case MergeAmendment.NO:
return false;
default:
return false;
}
}
}
/**
* @returns {boolean}
*/
public isRejected(): boolean {
return !this.isAccepted();
}
public getIdentifier(): string {
return this.amendment.identifier;
}
public showInDiffView(): boolean {
const mergeState = this.amendment.state
? this.amendment.state.merge_amendment_into_final
: MergeAmendment.UNDEFINED;
switch (mergeState) {
case MergeAmendment.YES:
return true;
case MergeAmendment.NO:
return false;
default:
const mergeRecommendation = this.amendment.recommendation
? this.amendment.recommendation.merge_amendment_into_final
: MergeAmendment.UNDEFINED;
switch (mergeRecommendation) {
case MergeAmendment.YES:
return true;
case MergeAmendment.NO:
return false;
default:
return false;
}
}
}
public showInFinalView(): boolean {
return this.amendment.state && this.amendment.state.merge_amendment_into_final === MergeAmendment.YES;
}
public isTitleChange(): boolean {
return false; // Not implemented for amendments
}
}