OpenSlides/client/src/app/site/motions/models/view-motion.ts

260 lines
7.0 KiB
TypeScript
Raw Normal View History

import { Motion } from '../../../shared/models/motions/motion';
import { Category } from '../../../shared/models/motions/category';
import { User } from '../../../shared/models/users/user';
import { Workflow } from '../../../shared/models/motions/workflow';
import { WorkflowState } from '../../../shared/models/motions/workflow-state';
import { BaseModel } from '../../../shared/models/base/base-model';
import { BaseViewModel } from '../../base/base-view-model';
import { ViewMotionCommentSection } from './view-motion-comment-section';
import { MotionComment } from '../../../shared/models/motions/motion-comment';
2018-09-28 15:10:48 +02:00
2018-09-30 18:43:20 +02:00
export enum LineNumberingMode {
2018-09-28 15:10:48 +02:00
None,
Inside,
Outside
}
2018-09-30 18:43:20 +02:00
export enum ChangeRecoMode {
2018-09-28 15:10:48 +02:00
Original,
2018-09-30 18:43:20 +02:00
Changed,
2018-09-28 15:10:48 +02:00
Diff,
Final
}
/**
* Motion class for the View
*
* Stores a motion including all (implicit) references
* Provides "safe" access to variables and functions in {@link Motion}
* @ignore
*/
2018-09-10 15:53:11 +02:00
export class ViewMotion extends BaseViewModel {
private _motion: Motion;
private _category: Category;
private _submitters: User[];
private _supporters: User[];
private _workflow: Workflow;
private _state: WorkflowState;
2018-09-28 15:10:48 +02:00
/**
2018-09-30 18:43:20 +02:00
* Indicates the LineNumberingMode Mode.
2018-09-28 15:10:48 +02:00
* Needs to be accessed from outside
*/
2018-09-30 18:43:20 +02:00
public lnMode: LineNumberingMode;
2018-09-28 15:10:48 +02:00
/**
* Indicates the Change reco Mode.
* Needs to be accessed from outside
*/
2018-09-30 18:43:20 +02:00
public crMode: ChangeRecoMode;
2018-09-28 15:10:48 +02:00
2018-09-09 18:52:47 +02:00
/**
* Indicates the maximum line length as defined in the configuration.
* Needs to be accessed from outside
*/
public lineLength: number;
/**
* Indicates the currently highlighted line, if any.
* Needs to be accessed from outside
*/
public highlightedLine: number;
public get motion(): Motion {
return this._motion;
}
public get id(): number {
return this.motion ? this.motion.id : null;
}
public get identifier(): string {
return this.motion ? this.motion.identifier : null;
}
public get title(): string {
return this.motion ? this.motion.title : null;
}
public get text(): string {
return this.motion ? this.motion.text : null;
}
public get reason(): string {
return this.motion ? this.motion.reason : null;
}
2018-11-08 17:38:44 +01:00
public get weight(): number {
return this.motion ? this.motion.weight : null;
}
public get sort_parent_id(): number {
return this.motion ? this.motion.sort_parent_id : null;
}
public get category(): Category {
return this._category;
}
public get agenda_item_id(): number {
return this.motion ? this.motion.agenda_item_id : null;
}
public get category_id(): number {
return this.motion && this.category ? this.motion.category_id : null;
}
public get submitters(): User[] {
return this._submitters;
}
public get submitters_id(): number[] {
return this.motion ? this.motion.submitters_id : null;
}
public get supporters(): User[] {
return this._supporters;
}
public get supporters_id(): number[] {
return this.motion ? this.motion.supporters_id : null;
}
public get workflow(): Workflow {
return this._workflow;
}
public get state(): WorkflowState {
return this._state;
}
public get state_id(): number {
return this.motion && this.motion.state_id ? this.motion.state_id : null;
}
public get recommendation_id(): number {
return this.motion && this.motion.recommendation_id ? this.motion.recommendation_id : null;
}
public get recommendation(): WorkflowState {
return this.recommendation_id && this.workflow ? this.workflow.getStateById(this.recommendation_id) : null;
}
2018-11-05 17:43:44 +01:00
public get possibleRecommendations(): WorkflowState[] {
2018-11-08 17:38:44 +01:00
return this.workflow
? this.workflow.states.filter(recommendation => recommendation.recommendation_label !== undefined)
: null;
2018-11-05 17:43:44 +01:00
}
public get origin(): string {
return this.motion ? this.motion.origin : null;
}
public get nextStates(): WorkflowState[] {
return this.state && this.workflow ? this.state.getNextStates(this.workflow) : null;
}
public set supporters(users: User[]) {
this._supporters = users;
this._motion.supporters_id = users.map(user => user.id);
}
public set submitters(users: User[]) {
this._submitters = users;
this._motion.submitters_id = users.map(user => user.id);
}
public constructor(
motion?: Motion,
category?: Category,
submitters?: User[],
supporters?: User[],
workflow?: Workflow,
state?: WorkflowState
) {
2018-09-10 15:53:11 +02:00
super();
this._motion = motion;
this._category = category;
this._submitters = submitters;
this._supporters = supporters;
this._workflow = workflow;
this._state = state;
2018-09-28 15:10:48 +02:00
// TODO: Should be set using a a config variable
2018-09-30 18:43:20 +02:00
this.lnMode = LineNumberingMode.Outside;
this.crMode = ChangeRecoMode.Original;
2018-09-09 18:52:47 +02:00
this.lineLength = 80;
this.highlightedLine = null;
}
2018-10-12 11:05:24 +02:00
public getTitle(): string {
2018-11-08 17:38:44 +01:00
if (this.identifier) {
return this.identifier + ' - ' + this.title;
}
2018-09-10 15:53:11 +02:00
return this.title;
}
/**
* Returns the motion comment for the given section. Null, if no comment exist.
* @param section The section to search the comment for.
*/
public getCommentForSection(section: ViewMotionCommentSection): MotionComment {
if (!this.motion) {
return null;
}
return this.motion.comments.find(comment => comment.section_id === section.id);
}
/**
* Updates the local objects if required
* @param update
*/
public updateValues(update: BaseModel): void {
if (update instanceof Workflow) {
this.updateWorkflow(update as Workflow);
} else if (update instanceof Category) {
this.updateCategory(update as Category);
}
// TODO: There is no way (yet) to add Submitters to a motion
// Thus, this feature could not be tested
}
/**
* Updates the Category
*/
public updateCategory(update: Category): void {
if (this.motion && update.id === this.motion.category_id) {
this._category = update as Category;
}
}
/**
* updates the Workflow
*/
public updateWorkflow(update: Workflow): void {
if (this.motion && update.id === this.motion.workflow_id) {
this._workflow = update as Workflow;
}
}
public hasSupporters(): boolean {
return !!(this.supporters && this.supporters.length > 0);
}
/**
* Duplicate this motion into a copy of itself
*/
public copy(): ViewMotion {
return new ViewMotion(
this._motion,
this._category,
this._submitters,
this._supporters,
this._workflow,
this._state
);
}
}