OpenSlides/client/src/app/site/motions/motion-detail/motion-detail.component.ts

204 lines
6.1 KiB
TypeScript
Raw Normal View History

2018-08-16 17:03:39 +02:00
import { Component, OnInit, ViewChild } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { BaseComponent } from '../../../base.component';
import { Motion } from '../../../shared/models/motions/motion';
2018-08-16 17:03:39 +02:00
import { Category } from '../../../shared/models/motions/category';
2018-08-24 12:21:56 +02:00
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
2018-08-16 17:03:39 +02:00
import { MatExpansionPanel } from '@angular/material';
2018-08-22 16:03:49 +02:00
import { DataSendService } from '../../../core/services/data-send.service';
/**
* Component for the motion detail view
*/
@Component({
selector: 'os-motion-detail',
templateUrl: './motion-detail.component.html',
styleUrls: ['./motion-detail.component.scss']
})
2018-08-22 16:03:49 +02:00
export class MotionDetailComponent extends BaseComponent implements OnInit {
/**
* MatExpansionPanel for the meta info
*/
2018-08-29 13:21:25 +02:00
@ViewChild('metaInfoPanel') public metaInfoPanel: MatExpansionPanel;
/**
* MatExpansionPanel for the content panel
*/
2018-08-29 13:21:25 +02:00
@ViewChild('contentPanel') public contentPanel: MatExpansionPanel;
2018-08-16 17:03:39 +02:00
/**
* Target motion. Might be new or old
*/
2018-08-29 13:21:25 +02:00
public motion: Motion;
2018-08-24 12:21:56 +02:00
/**
* Copy of the motion that the user might edit
*/
2018-08-29 13:21:25 +02:00
public motionCopy: Motion;
2018-08-24 12:21:56 +02:00
/**
* Motions meta-info
*/
2018-08-29 13:21:25 +02:00
public metaInfoForm: FormGroup;
/**
* Motion content. Can be a new version
*/
2018-08-29 13:21:25 +02:00
public contentForm: FormGroup;
/**
* Determine if the motion is edited
*/
2018-08-29 13:21:25 +02:00
public editMotion = false;
/**
* Determine if the motion is new
*/
2018-08-29 13:21:25 +02:00
public newMotion = false;
2018-08-16 17:03:39 +02:00
2018-08-21 14:56:26 +02:00
/**
* Constuct the detail view.
*
2018-08-21 14:56:26 +02:00
*
* @param route determine if this is a new or an existing motion
* @param formBuilder For reactive forms. Form Group and Form Control
*/
2018-08-29 13:21:25 +02:00
public constructor(
private router: Router,
private route: ActivatedRoute,
private formBuilder: FormBuilder,
2018-08-22 16:03:49 +02:00
private dataSend: DataSendService
) {
2018-08-22 16:03:49 +02:00
super();
2018-08-16 17:03:39 +02:00
this.createForm();
2018-08-21 14:56:26 +02:00
if (route.snapshot.url[0].path === 'new') {
this.newMotion = true;
this.editMotion = true;
2018-08-24 12:21:56 +02:00
// Both are (temporarily) necessary until submitter and supporters are implemented
2018-08-21 14:56:26 +02:00
this.motion = new Motion();
2018-08-24 12:21:56 +02:00
this.motionCopy = new Motion();
2018-08-21 14:56:26 +02:00
} else {
// load existing motion
this.route.params.subscribe(params => {
// has the motion of the DataStore was initialized before.
2018-08-22 16:03:49 +02:00
this.motion = this.DS.get(Motion, params.id) as Motion;
2018-08-21 14:56:26 +02:00
// Observe motion to get the motion in the parameter and also get the changes
2018-08-22 16:03:49 +02:00
this.DS.getObservable().subscribe(newModel => {
2018-08-21 14:56:26 +02:00
if (newModel instanceof Motion) {
if (newModel.id === +params.id) {
this.motion = newModel as Motion;
}
}
2018-08-21 14:56:26 +02:00
});
});
2018-08-21 14:56:26 +02:00
}
}
2018-08-21 14:56:26 +02:00
/**
* Async load the values of the motion in the Form.
*/
2018-08-29 13:21:25 +02:00
public patchForm(formMotion: Motion) {
2018-08-24 12:21:56 +02:00
console.log('Motion: ', this.motion);
console.log('category_id: ', formMotion);
this.metaInfoForm.patchValue({
2018-08-24 12:21:56 +02:00
category_id: formMotion.category.id,
state_id: formMotion.state.id,
recommendation_id: formMotion.recommendation.id,
identifier: formMotion.identifier,
origin: formMotion.origin
});
this.contentForm.patchValue({
2018-08-24 12:21:56 +02:00
currentTitle: formMotion.currentTitle,
currentText: formMotion.currentText,
currentReason: formMotion.currentReason
});
2018-08-16 17:03:39 +02:00
}
2018-08-21 14:56:26 +02:00
/**
* Creates the forms for the Motion and the MotionVersion
*
* TODO: Build a custom form validator
*/
2018-08-29 13:21:25 +02:00
public createForm() {
2018-08-16 17:03:39 +02:00
this.metaInfoForm = this.formBuilder.group({
identifier: [''],
category_id: [''],
state_id: [''],
recommendation_id: [''],
origin: ['']
});
this.contentForm = this.formBuilder.group({
2018-08-24 12:21:56 +02:00
currentTitle: ['', Validators.required],
currentText: ['', Validators.required],
currentReason: ['']
2018-08-16 17:03:39 +02:00
});
}
2018-08-21 14:56:26 +02:00
/**
* Save a motion. Calls the "patchValues" function in the MotionObject
*
* http:post the motion to the server.
* The AutoUpdate-Service should see a change once it arrives and show it
* in the list view automatically
2018-08-23 10:35:05 +02:00
*
* TODO: state is not yet saved. Need a special "put" command
2018-08-21 14:56:26 +02:00
*/
2018-08-29 13:21:25 +02:00
public saveMotion() {
const newMotionValues = { ...this.metaInfoForm.value, ...this.contentForm.value };
2018-08-24 12:21:56 +02:00
this.motionCopy.patchValues(newMotionValues);
2018-08-21 14:56:26 +02:00
// TODO: This is DRAFT. Reads out Motion version directly. Potentially insecure.
2018-08-24 12:21:56 +02:00
this.motionCopy.title = this.motionCopy.currentTitle;
this.motionCopy.text = this.motionCopy.currentText;
2018-08-21 14:56:26 +02:00
2018-08-24 12:21:56 +02:00
// TODO: send to normal motion to verify
this.dataSend.saveModel(this.motionCopy).subscribe(answer => {
if (answer && answer.id && this.newMotion) {
this.router.navigate(['./motions/' + answer.id]);
}
2018-08-21 14:56:26 +02:00
});
2018-08-16 17:03:39 +02:00
}
2018-08-21 14:56:26 +02:00
/**
* return all Categories.
*/
2018-08-29 13:21:25 +02:00
public getMotionCategories(): Category[] {
return this.DS.getAll<Category>(Category);
2018-08-16 17:03:39 +02:00
}
2018-08-21 14:56:26 +02:00
/**
* Click on the edit button (pen-symbol)
*/
2018-08-29 13:21:25 +02:00
public editMotionButton() {
2018-08-16 17:03:39 +02:00
this.editMotion ? (this.editMotion = false) : (this.editMotion = true);
if (this.editMotion) {
2018-08-24 12:21:56 +02:00
// copy the motion
this.motionCopy = new Motion();
this.motionCopy.patchValues(this.motion);
this.patchForm(this.motionCopy);
2018-08-16 17:03:39 +02:00
this.metaInfoPanel.open();
this.contentPanel.open();
2018-08-20 12:28:43 +02:00
} else {
this.saveMotion();
2018-08-16 17:03:39 +02:00
}
}
2018-08-21 14:56:26 +02:00
/**
2018-08-22 16:03:49 +02:00
* Trigger to delete the motion
2018-08-21 14:56:26 +02:00
*/
2018-08-29 13:21:25 +02:00
public deleteMotionButton() {
2018-08-22 16:03:49 +02:00
this.dataSend.delete(this.motion).subscribe(answer => {
this.router.navigate(['./motions/']);
});
}
2018-08-21 14:56:26 +02:00
/**
2018-08-22 16:03:49 +02:00
* Init. Does nothing here.
2018-08-21 14:56:26 +02:00
*/
2018-08-29 13:21:25 +02:00
public ngOnInit() {}
}