2018-09-04 14:55:07 +02:00
|
|
|
import { Injectable } from '@angular/core';
|
|
|
|
|
|
|
|
import { DataSendService } from '../../../core/services/data-send.service';
|
|
|
|
import { Motion } from '../../../shared/models/motions/motion';
|
|
|
|
import { User } from '../../../shared/models/users/user';
|
|
|
|
import { Category } from '../../../shared/models/motions/category';
|
|
|
|
import { Workflow } from '../../../shared/models/motions/workflow';
|
|
|
|
import { WorkflowState } from '../../../shared/models/motions/workflow-state';
|
|
|
|
import { ViewMotion } from '../models/view-motion';
|
2018-09-10 15:53:11 +02:00
|
|
|
import { Observable } from 'rxjs';
|
2018-09-11 16:38:23 +02:00
|
|
|
import { BaseRepository } from '../../base/base-repository';
|
2018-09-13 14:40:04 +02:00
|
|
|
import { DataStoreService } from '../../../core/services/data-store.service';
|
2018-09-04 14:55:07 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Repository Services for motions (and potentially categories)
|
|
|
|
*
|
|
|
|
* The repository is meant to process domain objects (those found under
|
|
|
|
* shared/models), so components can display them and interact with them.
|
|
|
|
*
|
|
|
|
* Rather than manipulating models directly, the repository is meant to
|
|
|
|
* inform the {@link DataSendService} about changes which will send
|
|
|
|
* them to the Server.
|
|
|
|
*/
|
|
|
|
@Injectable({
|
|
|
|
providedIn: 'root'
|
|
|
|
})
|
2018-09-10 15:53:11 +02:00
|
|
|
export class MotionRepositoryService extends BaseRepository<ViewMotion, Motion> {
|
2018-09-04 14:55:07 +02:00
|
|
|
/**
|
|
|
|
* Creates a MotionRepository
|
|
|
|
*
|
|
|
|
* Converts existing and incoming motions to ViewMotions
|
|
|
|
* Handles CRUD using an observer to the DataStore
|
|
|
|
* @param DataSend
|
|
|
|
*/
|
2018-09-13 14:40:04 +02:00
|
|
|
public constructor(DS: DataStoreService, private dataSend: DataSendService) {
|
|
|
|
super(DS, Motion, [Category, User, Workflow]);
|
2018-09-04 14:55:07 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Converts a motion to a ViewMotion and adds it to the store.
|
|
|
|
*
|
|
|
|
* Foreign references of the motion will be resolved (e.g submitters to users)
|
|
|
|
* Expandable to all (server side) changes that might occur on the motion object.
|
|
|
|
*
|
|
|
|
* @param motion blank motion domain object
|
|
|
|
*/
|
2018-09-10 15:53:11 +02:00
|
|
|
protected createViewModel(motion: Motion): ViewMotion {
|
2018-09-04 14:55:07 +02:00
|
|
|
const category = this.DS.get(Category, motion.category_id);
|
|
|
|
const submitters = this.DS.getMany(User, motion.submitterIds);
|
|
|
|
const supporters = this.DS.getMany(User, motion.supporters_id);
|
|
|
|
const workflow = this.DS.get(Workflow, motion.workflow_id);
|
|
|
|
let state: WorkflowState = null;
|
|
|
|
if (workflow) {
|
|
|
|
state = workflow.getStateById(motion.state_id);
|
|
|
|
}
|
2018-09-10 15:53:11 +02:00
|
|
|
return new ViewMotion(motion, category, submitters, supporters, workflow, state);
|
2018-09-04 14:55:07 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2018-09-13 07:57:38 +02:00
|
|
|
* Creates a motion
|
|
|
|
* Creates a (real) motion with patched data and delegate it
|
|
|
|
* to the {@link DataSendService}
|
|
|
|
*
|
|
|
|
* @param update the form data containing the update values
|
|
|
|
* @param viewMotion The View Motion. If not present, a new motion will be created
|
|
|
|
* TODO: Remove the viewMotion and make it actually distignuishable from save()
|
|
|
|
*/
|
2018-09-20 12:25:37 +02:00
|
|
|
public create(motion: Motion): Observable<any> {
|
2018-09-28 15:10:48 +02:00
|
|
|
if (!motion.supporters_id) {
|
|
|
|
delete motion.supporters_id;
|
|
|
|
}
|
2018-09-18 18:27:14 +02:00
|
|
|
return this.dataSend.createModel(motion);
|
2018-09-13 07:57:38 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* updates a motion
|
2018-09-04 14:55:07 +02:00
|
|
|
*
|
|
|
|
* Creates a (real) motion with patched data and delegate it
|
|
|
|
* to the {@link DataSendService}
|
|
|
|
*
|
|
|
|
* @param update the form data containing the update values
|
|
|
|
* @param viewMotion The View Motion. If not present, a new motion will be created
|
|
|
|
*/
|
2018-09-20 12:25:37 +02:00
|
|
|
public update(update: Partial<Motion>, viewMotion: ViewMotion): Observable<any> {
|
|
|
|
const motion = viewMotion.motion;
|
|
|
|
motion.patchValues(update);
|
2018-09-18 18:27:14 +02:00
|
|
|
return this.dataSend.updateModel(motion, 'patch');
|
2018-09-04 14:55:07 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Deleting a motion.
|
|
|
|
*
|
|
|
|
* Extract the motion out of the motionView and delegate
|
|
|
|
* to {@link DataSendService}
|
|
|
|
* @param viewMotion
|
|
|
|
*/
|
2018-09-13 07:57:38 +02:00
|
|
|
public delete(viewMotion: ViewMotion): Observable<any> {
|
2018-09-04 14:55:07 +02:00
|
|
|
return this.dataSend.delete(viewMotion.motion);
|
|
|
|
}
|
2018-09-28 15:10:48 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Format the motion text using the line numbering and change
|
|
|
|
* reco algorithm.
|
|
|
|
*
|
|
|
|
* TODO: Call DiffView and LineNumbering Service here.
|
|
|
|
*
|
|
|
|
* Can be called from detail view and exporter
|
|
|
|
* @param id Motion ID - will be pulled from the repository
|
|
|
|
* @param lnMode indicator for the line numbering mode
|
|
|
|
* @param crMode indicator for the change reco mode
|
|
|
|
*/
|
|
|
|
public formatMotion(id: number, lnMode: number, crMode: number): string {
|
|
|
|
const targetMotion = this.getViewModel(id);
|
|
|
|
|
|
|
|
if (targetMotion && targetMotion.text) {
|
|
|
|
let motionText = targetMotion.text;
|
|
|
|
|
|
|
|
// TODO : Use Line numbering service here
|
|
|
|
switch (lnMode) {
|
|
|
|
case 0: // no line numbers
|
|
|
|
break;
|
|
|
|
case 1: // line number inside
|
|
|
|
motionText = 'Get line numbers outside';
|
|
|
|
break;
|
|
|
|
case 2: // line number outside
|
|
|
|
motionText = 'Get line numbers inside';
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO : Use Diff Service here.
|
|
|
|
// this will(currently) append the previous changes.
|
|
|
|
// update
|
|
|
|
switch (crMode) {
|
|
|
|
case 0: // Original
|
|
|
|
break;
|
|
|
|
case 1: // Changed Version
|
|
|
|
motionText += ' and get changed version';
|
|
|
|
break;
|
|
|
|
case 2: // Diff Version
|
|
|
|
motionText += ' and get diff version';
|
|
|
|
break;
|
|
|
|
case 3: // Final Version
|
|
|
|
motionText += ' and final version';
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return motionText;
|
|
|
|
} else {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
2018-09-04 14:55:07 +02:00
|
|
|
}
|