Add more motion modules

Seperates the previously large motion module in various smaller
and very small feature modules.
Motion Detail, and all direct dependancies to Motion Detail
is now an own module.
This significantly increases the response time of openslides 3
This commit is contained in:
Sean Engelhardt 2019-03-08 10:43:54 +01:00
parent 70191ce455
commit 6a421f8f6b
126 changed files with 628 additions and 323 deletions

View File

@ -16,7 +16,7 @@ const routes: Routes = [
path: 'login', path: 'login',
component: LoginWrapperComponent, component: LoginWrapperComponent,
children: [ children: [
{ path: '', component: LoginMaskComponent }, { path: '', component: LoginMaskComponent, pathMatch: 'full' },
{ path: 'reset-password', component: ResetPasswordComponent }, { path: 'reset-password', component: ResetPasswordComponent },
{ path: 'reset-password-confirm', component: ResetPasswordConfirmComponent }, { path: 'reset-password-confirm', component: ResetPasswordConfirmComponent },
{ path: 'legalnotice', component: LoginLegalNoticeComponent }, { path: 'legalnotice', component: LoginLegalNoticeComponent },

View File

@ -61,14 +61,12 @@ export class AppComponent {
// change default JS functions // change default JS functions
this.overloadArrayToString(); this.overloadArrayToString();
appRef.isStable.subscribe(s => console.log('is stable', s));
appRef.isStable appRef.isStable
.pipe( .pipe(
filter(s => s), filter(s => s),
take(1) take(1)
) )
.subscribe(() => { .subscribe(() => {
console.log('start scheduler');
servertimeService.startScheduler(); servertimeService.startScheduler();
}); });
} }

View File

@ -6,7 +6,8 @@ import { FullscreenProjectorComponent } from './fullscreen-projector/fullscreen-
const routes: Routes = [ const routes: Routes = [
{ {
path: '', path: '',
component: FullscreenProjectorComponent component: FullscreenProjectorComponent,
pathMatch: 'full'
}, },
{ {
path: ':id', path: ':id',

View File

@ -16,6 +16,7 @@ import { MainMenuService } from 'app/core/core-services/main-menu.service';
* *
* ```html * ```html
* <os-head-bar * <os-head-bar
* prevUrl="../.."
* [nav]="false" * [nav]="false"
* [goBack]="true" * [goBack]="true"
* [mainButton]="opCanEdit()" * [mainButton]="opCanEdit()"
@ -89,6 +90,15 @@ export class HeadBarComponent {
@Input() @Input()
public goBack = false; public goBack = false;
/**
* Determine the back URL. Default is ".." (previous parent page)
* Lazy Loaded modules sometimes have different routing events or require
* special "back" logic.
* Has only an effect if goBack is set to false
*/
@Input()
public prevUrl = '../';
/** /**
* Emit a signal to the parent component if the main button was clicked * Emit a signal to the parent component if the main button was clicked
*/ */
@ -141,7 +151,7 @@ export class HeadBarComponent {
if (this.goBack) { if (this.goBack) {
this.location.back(); this.location.back();
} else { } else {
this.router.navigate(['../'], { relativeTo: this.route }); this.router.navigate([this.prevUrl], { relativeTo: this.route });
} }
} }
} }

View File

@ -1,4 +1,4 @@
@import '../../../../assets/styles/drag.scss'; @import '~assets/styles/drag.scss';
.box { .box {
width: 100%; width: 100%;

View File

@ -8,7 +8,7 @@ import { ListOfSpeakersComponent } from './components/list-of-speakers/list-of-s
import { TopicDetailComponent } from './components/topic-detail/topic-detail.component'; import { TopicDetailComponent } from './components/topic-detail/topic-detail.component';
const routes: Routes = [ const routes: Routes = [
{ path: '', component: AgendaListComponent }, { path: '', component: AgendaListComponent, pathMatch: 'full' },
{ path: 'import', component: AgendaImportListComponent }, { path: 'import', component: AgendaImportListComponent },
{ path: 'topics/new', component: TopicDetailComponent }, { path: 'topics/new', component: TopicDetailComponent },
{ path: 'sort-agenda', component: AgendaSortComponent }, { path: 'sort-agenda', component: AgendaSortComponent },

View File

@ -2,7 +2,7 @@ import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router'; import { Routes, RouterModule } from '@angular/router';
import { AssignmentListComponent } from './assignment-list/assignment-list.component'; import { AssignmentListComponent } from './assignment-list/assignment-list.component';
const routes: Routes = [{ path: '', component: AssignmentListComponent }]; const routes: Routes = [{ path: '', component: AssignmentListComponent, pathMatch: 'full' }];
@NgModule({ @NgModule({
imports: [RouterModule.forChild(routes)], imports: [RouterModule.forChild(routes)],

View File

@ -9,7 +9,8 @@ import { SearchComponent } from './components/search/search.component';
const routes: Routes = [ const routes: Routes = [
{ {
path: '', path: '',
component: StartComponent component: StartComponent,
pathMatch: 'full'
}, },
{ {
path: 'legalnotice', path: 'legalnotice',

View File

@ -2,7 +2,7 @@ import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router'; import { Routes, RouterModule } from '@angular/router';
import { ConfigListComponent } from './components/config-list/config-list.component'; import { ConfigListComponent } from './components/config-list/config-list.component';
const routes: Routes = [{ path: '', component: ConfigListComponent }]; const routes: Routes = [{ path: '', component: ConfigListComponent, pathMatch: 'full' }];
@NgModule({ @NgModule({
imports: [RouterModule.forChild(routes)], imports: [RouterModule.forChild(routes)],

View File

@ -5,7 +5,7 @@ import { HistoryListComponent } from './components/history-list/history-list.com
/** /**
* Define the routes for the history module * Define the routes for the history module
*/ */
const routes: Routes = [{ path: '', component: HistoryListComponent }]; const routes: Routes = [{ path: '', component: HistoryListComponent, pathMatch: 'full' }];
/** /**
* Define the routing component and setup the routes * Define the routing component and setup the routes

View File

@ -4,7 +4,7 @@ import { MediafileListComponent } from './components/mediafile-list/mediafile-li
import { MediaUploadComponent } from './components/media-upload/media-upload.component'; import { MediaUploadComponent } from './components/media-upload/media-upload.component';
const routes: Routes = [ const routes: Routes = [
{ path: '', component: MediafileListComponent }, { path: '', component: MediafileListComponent, pathMatch: 'full' },
{ path: 'upload', component: MediaUploadComponent } { path: 'upload', component: MediaUploadComponent }
]; ];

View File

@ -1,27 +0,0 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { MotionDetailComponent } from './motion-detail.component';
import { E2EImportsModule } from '../../../../../e2e-imports.module';
import { MotionsModule } from '../../motions.module';
describe('MotionDetailComponent', () => {
let component: MotionDetailComponent;
let fixture: ComponentFixture<MotionDetailComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [E2EImportsModule, MotionsModule],
declarations: []
}).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(MotionDetailComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -0,0 +1,12 @@
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { CallListComponent } from './call-list.component';
const routes: Routes = [{ path: '', component: CallListComponent, pathMatch: 'full' }];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class CallListRoutingModule {}

View File

@ -1,4 +1,4 @@
<os-head-bar [nav]="false"> <os-head-bar prevUrl="../.." [nav]="false">
<!-- Title --> <!-- Title -->
<div class="title-slot"> <div class="title-slot">
<h2 translate>Call list</h2> <h2 translate>Call list</h2>

View File

@ -5,12 +5,13 @@ import { MatSnackBar } from '@angular/material';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { BaseViewComponent } from '../../../base/base-view';
import { MotionRepositoryService } from 'app/core/repositories/motions/motion-repository.service'; import { MotionRepositoryService } from 'app/core/repositories/motions/motion-repository.service';
import { MotionCsvExportService } from '../../services/motion-csv-export.service';
import { MotionPdfExportService } from '../../services/motion-pdf-export.service'; import { BaseViewComponent } from 'app/site/base/base-view';
import { ViewMotion } from '../../models/view-motion'; import { MotionCsvExportService } from 'app/site/motions/services/motion-csv-export.service';
import { MotionPdfExportService } from 'app/site/motions/services/motion-pdf-export.service';
import { OSTreeSortEvent } from 'app/shared/components/sorting-tree/sorting-tree.component'; import { OSTreeSortEvent } from 'app/shared/components/sorting-tree/sorting-tree.component';
import { ViewMotion } from 'app/site/motions/models/view-motion';
/** /**
* Sort view for the call list. * Sort view for the call list.

View File

@ -0,0 +1,12 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { CallListRoutingModule } from './call-list-routing.module';
import { CallListComponent } from './call-list.component';
import { SharedModule } from 'app/shared/shared.module';
@NgModule({
declarations: [CallListComponent],
imports: [CommonModule, CallListRoutingModule, SharedModule]
})
export class CallListModule {}

View File

@ -0,0 +1,15 @@
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { CategoryListComponent } from './components/category-list/category-list.component';
import { CategorySortComponent } from './components/category-sort/category-sort.component';
const routes: Routes = [
{ path: '', component: CategoryListComponent, pathMatch: 'full' },
{ path: ':id', component: CategorySortComponent }
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class CategoryRoutingModule {}

View File

@ -0,0 +1,13 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { CategoryRoutingModule } from './category-routing.module';
import { SharedModule } from 'app/shared/shared.module';
import { CategoryListComponent } from './components/category-list/category-list.component';
import { CategorySortComponent } from './components/category-sort/category-sort.component';
@NgModule({
declarations: [CategoryListComponent, CategorySortComponent],
imports: [CommonModule, CategoryRoutingModule, SharedModule]
})
export class CategoryModule {}

View File

@ -1,4 +1,4 @@
<os-head-bar [nav]="false" [mainButton]="true" (mainEvent)="onPlusButton()"> <os-head-bar prevUrl="../.." [nav]="false" [mainButton]="true" (mainEvent)="onPlusButton()">
<!-- Title --> <!-- Title -->
<div class="title-slot"> <div class="title-slot">
<h2 translate>Categories</h2> <h2 translate>Categories</h2>

View File

@ -1,7 +1,7 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { CategoryListComponent } from './category-list.component'; import { CategoryListComponent } from './category-list.component';
import { E2EImportsModule } from '../../../../../e2e-imports.module'; import { E2EImportsModule } from 'e2e-imports.module';
describe('CategoryListComponent', () => { describe('CategoryListComponent', () => {
let component: CategoryListComponent; let component: CategoryListComponent;

View File

@ -5,13 +5,13 @@ import { Title } from '@angular/platform-browser';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { BaseViewComponent } from '../../../base/base-view'; import { BaseViewComponent } from 'app/site/base/base-view';
import { Category } from 'app/shared/models/motions/category'; import { Category } from 'app/shared/models/motions/category';
import { CategoryRepositoryService } from 'app/core/repositories/motions/category-repository.service'; import { CategoryRepositoryService } from 'app/core/repositories/motions/category-repository.service';
import { MotionRepositoryService } from 'app/core/repositories/motions/motion-repository.service'; import { MotionRepositoryService } from 'app/core/repositories/motions/motion-repository.service';
import { PromptService } from 'app/core/ui-services/prompt.service'; import { PromptService } from 'app/core/ui-services/prompt.service';
import { ViewCategory } from '../../models/view-category'; import { ViewCategory } from 'app/site/motions/models/view-category';
import { ViewMotion } from '../../models/view-motion'; import { ViewMotion } from 'app/site/motions/models/view-motion';
/** /**
* List view for the categories. * List view for the categories.

View File

@ -10,8 +10,8 @@ import { MatSnackBar } from '@angular/material';
import { MotionRepositoryService } from 'app/core/repositories/motions/motion-repository.service'; import { MotionRepositoryService } from 'app/core/repositories/motions/motion-repository.service';
import { PromptService } from 'app/core/ui-services/prompt.service'; import { PromptService } from 'app/core/ui-services/prompt.service';
import { SortingListComponent } from 'app/shared/components/sorting-list/sorting-list.component'; import { SortingListComponent } from 'app/shared/components/sorting-list/sorting-list.component';
import { ViewCategory } from '../../models/view-category'; import { ViewCategory } from 'app/site/motions/models/view-category';
import { ViewMotion } from '../../models/view-motion'; import { ViewMotion } from 'app/site/motions/models/view-motion';
/** /**
* View for rearranging and renumbering the motions of a category. The {@link onNumberMotions} * View for rearranging and renumbering the motions of a category. The {@link onNumberMotions}

View File

@ -24,6 +24,7 @@
.chip-container { .chip-container {
display: block; display: block;
min-height: 0; // default is inherit, will appear on the top edge of the cell
} }
.os-headed-listview-table { .os-headed-listview-table {

View File

@ -10,10 +10,10 @@ import { ListViewBaseComponent } from 'app/site/base/list-view-base';
import { MotionBlock } from 'app/shared/models/motions/motion-block'; import { MotionBlock } from 'app/shared/models/motions/motion-block';
import { MotionBlockRepositoryService } from 'app/core/repositories/motions/motion-block-repository.service'; import { MotionBlockRepositoryService } from 'app/core/repositories/motions/motion-block-repository.service';
import { MotionRepositoryService } from 'app/core/repositories/motions/motion-repository.service'; import { MotionRepositoryService } from 'app/core/repositories/motions/motion-repository.service';
import { ViewMotionBlock } from '../../models/view-motion-block'; import { OperatorService } from 'app/core/core-services/operator.service';
import { PromptService } from 'app/core/ui-services/prompt.service'; import { PromptService } from 'app/core/ui-services/prompt.service';
import { ViewMotion } from '../../models/view-motion'; import { ViewMotion } from 'app/site/motions/models/view-motion';
import { OperatorService } from '../../../../core/core-services/operator.service'; import { ViewMotionBlock } from 'app/site/motions/models/view-motion-block';
/** /**
* Detail component to display one motion block * Detail component to display one motion block

View File

@ -1,4 +1,4 @@
<os-head-bar [nav]="false" [mainButton]="canEdit" (mainEvent)="onPlusButton()"> <os-head-bar prevUrl="../.." [nav]="false" [mainButton]="canEdit" (mainEvent)="onPlusButton()">
<!-- Title --> <!-- Title -->
<div class="title-slot"><h2 translate>Motion blocks</h2></div> <div class="title-slot"><h2 translate>Motion blocks</h2></div>
</os-head-bar> </os-head-bar>

View File

@ -15,7 +15,7 @@ import { MotionBlockRepositoryService } from 'app/core/repositories/motions/moti
import { OperatorService } from 'app/core/core-services/operator.service'; import { OperatorService } from 'app/core/core-services/operator.service';
import { PromptService } from 'app/core/ui-services/prompt.service'; import { PromptService } from 'app/core/ui-services/prompt.service';
import { ViewItem } from 'app/site/agenda/models/view-item'; import { ViewItem } from 'app/site/agenda/models/view-item';
import { ViewMotionBlock } from '../../models/view-motion-block'; import { ViewMotionBlock } from 'app/site/motions/models/view-motion-block';
/** /**
* Table for the motion blocks * Table for the motion blocks

View File

@ -0,0 +1,15 @@
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { MotionBlockDetailComponent } from './components/motion-block-detail/motion-block-detail.component';
import { MotionBlockListComponent } from './components/motion-block-list/motion-block-list.component';
const routes: Routes = [
{ path: '', component: MotionBlockListComponent, pathMatch: 'full' },
{ path: ':id', component: MotionBlockDetailComponent }
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class MotionBlockRoutingModule {}

View File

@ -0,0 +1,13 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { MotionBlockRoutingModule } from './motion-block-routing.module';
import { MotionBlockListComponent } from './components/motion-block-list/motion-block-list.component';
import { MotionBlockDetailComponent } from './components/motion-block-detail/motion-block-detail.component';
import { SharedModule } from 'app/shared/shared.module';
@NgModule({
declarations: [MotionBlockListComponent, MotionBlockDetailComponent],
imports: [CommonModule, MotionBlockRoutingModule, SharedModule]
})
export class MotionBlockModule {}

View File

@ -1,4 +1,4 @@
<os-head-bar [nav]="false" [mainButton]="true" (mainEvent)="onPlusButton()"> <os-head-bar prevUrl="../.." [nav]="false" [mainButton]="true" (mainEvent)="onPlusButton()">
<!-- Title --> <!-- Title -->
<div class="title-slot"> <div class="title-slot">
<h2 translate>Comment fields</h2> <h2 translate>Comment fields</h2>
@ -12,19 +12,31 @@
<form [formGroup]="createForm" (keydown)="keyDownFunction($event)"> <form [formGroup]="createForm" (keydown)="keyDownFunction($event)">
<p> <p>
<mat-form-field> <mat-form-field>
<input formControlName="name" matInput placeholder="{{'Name' | translate}}" required> <input formControlName="name" matInput placeholder="{{ 'Name' | translate }}" required />
<mat-hint *ngIf="!createForm.controls.name.valid"> <mat-hint *ngIf="!createForm.controls.name.valid">
<span translate>Required</span> <span translate>Required</span>
</mat-hint> </mat-hint>
</mat-form-field> </mat-form-field>
</p> </p>
<p> <p>
<os-search-value-selector ngDefaultControl [form]="createForm" [formControl]="this.createForm.get('read_groups_id')" <os-search-value-selector
[multiple]="true" listname="Groups with read permissions" [InputListValues]="this.groups"></os-search-value-selector> ngDefaultControl
[form]="createForm"
[formControl]="this.createForm.get('read_groups_id')"
[multiple]="true"
listname="Groups with read permissions"
[InputListValues]="this.groups"
></os-search-value-selector>
</p> </p>
<p> <p>
<os-search-value-selector ngDefaultControl [form]="createForm" [formControl]="this.createForm.get('write_groups_id')" <os-search-value-selector
[multiple]="true" listname="Groups with write permissions" [InputListValues]="this.groups"></os-search-value-selector> ngDefaultControl
[form]="createForm"
[formControl]="this.createForm.get('write_groups_id')"
[multiple]="true"
listname="Groups with write permissions"
[InputListValues]="this.groups"
></os-search-value-selector>
</p> </p>
</form> </form>
</mat-card-content> </mat-card-content>
@ -38,8 +50,13 @@
</mat-card-actions> </mat-card-actions>
</mat-card> </mat-card>
<mat-accordion class="os-card"> <mat-accordion class="os-card">
<mat-expansion-panel *ngFor="let section of this.commentSections" (opened)="openId = section.id" (closed)="panelClosed(section)" <mat-expansion-panel
[expanded]="openId === section.id" multiple="false"> *ngFor="let section of this.commentSections"
(opened)="openId = section.id"
(closed)="panelClosed(section)"
[expanded]="openId === section.id"
multiple="false"
>
<mat-expansion-panel-header> <mat-expansion-panel-header>
<mat-panel-title> <mat-panel-title>
<div class="header-container"> <div class="header-container">
@ -67,19 +84,31 @@
<span translate>Edit comment field:</span> <span translate>Edit comment field:</span>
<p> <p>
<mat-form-field> <mat-form-field>
<input formControlName="name" matInput placeholder="{{'Name' | translate}}" required> <input formControlName="name" matInput placeholder="{{ 'Name' | translate }}" required />
<mat-hint *ngIf="!updateForm.controls.name.valid"> <mat-hint *ngIf="!updateForm.controls.name.valid">
<span translate>Required</span> <span translate>Required</span>
</mat-hint> </mat-hint>
</mat-form-field> </mat-form-field>
</p> </p>
<p> <p>
<os-search-value-selector ngDefaultControl [form]="updateForm" [formControl]="this.updateForm.get('read_groups_id')" <os-search-value-selector
[multiple]="true" listname="Groups with read permissions" [InputListValues]="this.groups"></os-search-value-selector> ngDefaultControl
[form]="updateForm"
[formControl]="this.updateForm.get('read_groups_id')"
[multiple]="true"
listname="Groups with read permissions"
[InputListValues]="this.groups"
></os-search-value-selector>
</p> </p>
<p> <p>
<os-search-value-selector ngDefaultControl [form]="updateForm" [formControl]="this.updateForm.get('write_groups_id')" <os-search-value-selector
[multiple]="true" listname="Groups with write permissions" [InputListValues]="this.groups"></os-search-value-selector> ngDefaultControl
[form]="updateForm"
[formControl]="this.updateForm.get('write_groups_id')"
[multiple]="true"
listname="Groups with write permissions"
[InputListValues]="this.groups"
></os-search-value-selector>
</p> </p>
</form> </form>
<ng-container *ngIf="editId !== section.id"> <ng-container *ngIf="editId !== section.id">
@ -97,19 +126,34 @@
<div class="spacer-left" *ngIf="section.write_groups.length === 0" translate>No groups selected</div> <div class="spacer-left" *ngIf="section.write_groups.length === 0" translate>No groups selected</div>
</ng-container> </ng-container>
<mat-action-row> <mat-action-row>
<button *ngIf="editId !== section.id" mat-button class="on-transition-fade" (click)="onEditButton(section)" <button
mat-icon-button> *ngIf="editId !== section.id"
mat-button
class="on-transition-fade"
(click)="onEditButton(section)"
mat-icon-button
>
<mat-icon>edit</mat-icon> <mat-icon>edit</mat-icon>
</button> </button>
<button *ngIf="editId === section.id" mat-button class="on-transition-fade" (click)="editId = null" <button
mat-icon-button> *ngIf="editId === section.id"
mat-button
class="on-transition-fade"
(click)="editId = null"
mat-icon-button
>
<mat-icon>cancel</mat-icon> <mat-icon>cancel</mat-icon>
</button> </button>
<button *ngIf="editId === section.id" mat-button class="on-transition-fade" (click)="onSaveButton(section)" <button
mat-icon-button> *ngIf="editId === section.id"
mat-button
class="on-transition-fade"
(click)="onSaveButton(section)"
mat-icon-button
>
<mat-icon>save</mat-icon> <mat-icon>save</mat-icon>
</button> </button>
<button mat-button class='on-transition-fade' (click)=onDeleteButton(section) mat-icon-button> <button mat-button class="on-transition-fade" (click)="onDeleteButton(section)" mat-icon-button>
<mat-icon>delete</mat-icon> <mat-icon>delete</mat-icon>
</button> </button>
</mat-action-row> </mat-action-row>

View File

@ -7,12 +7,13 @@ import { BehaviorSubject } from 'rxjs';
import { FormGroup, FormBuilder, Validators } from '@angular/forms'; import { FormGroup, FormBuilder, Validators } from '@angular/forms';
import { MotionCommentSection } from 'app/shared/models/motions/motion-comment-section'; import { MotionCommentSection } from 'app/shared/models/motions/motion-comment-section';
import { ViewMotionCommentSection } from '../../models/view-motion-comment-section'; import { BaseViewComponent } from 'app/site/base/base-view';
import { MotionCommentSectionRepositoryService } from 'app/core/repositories/motions/motion-comment-section-repository.service'; import { MotionCommentSectionRepositoryService } from 'app/core/repositories/motions/motion-comment-section-repository.service';
import { PromptService } from 'app/core/ui-services/prompt.service'; import { PromptService } from 'app/core/ui-services/prompt.service';
import { BaseViewComponent } from '../../../base/base-view';
import { ViewGroup } from 'app/site/users/models/view-group'; import { ViewGroup } from 'app/site/users/models/view-group';
import { GroupRepositoryService } from 'app/core/repositories/users/group-repository.service'; import { GroupRepositoryService } from 'app/core/repositories/users/group-repository.service';
import { ViewMotionCommentSection } from 'app/site/motions/models/view-motion-comment-section';
/** /**
* List view for the comment sections. * List view for the comment sections.

View File

@ -0,0 +1,12 @@
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { MotionCommentSectionListComponent } from './motion-comment-section-list.component';
const routes: Routes = [{ path: '', component: MotionCommentSectionListComponent, pathMatch: 'full' }];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class MotionCommentSectionRoutingModule {}

View File

@ -0,0 +1,12 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { MotionCommentSectionRoutingModule } from './motion-comment-section-routing.module';
import { SharedModule } from 'app/shared/shared.module';
import { MotionCommentSectionListComponent } from './motion-comment-section-list.component';
@NgModule({
declarations: [MotionCommentSectionListComponent],
imports: [CommonModule, MotionCommentSectionRoutingModule, SharedModule]
})
export class MotionCommentSectionModule {}

View File

@ -1,7 +1,7 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { AmendmentCreateWizardComponent } from './amendment-create-wizard.component'; import { AmendmentCreateWizardComponent } from './amendment-create-wizard.component';
import { E2EImportsModule } from '../../../../../e2e-imports.module'; import { E2EImportsModule } from 'e2e-imports.module';
describe('AmendmentCreateWizardComponent', () => { describe('AmendmentCreateWizardComponent', () => {
let component: AmendmentCreateWizardComponent; let component: AmendmentCreateWizardComponent;

View File

@ -5,13 +5,13 @@ import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { MatSnackBar } from '@angular/material'; import { MatSnackBar } from '@angular/material';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { ConfigService } from 'app/core/ui-services/config.service';
import { MotionRepositoryService } from 'app/core/repositories/motions/motion-repository.service'; import { BaseViewComponent } from 'app/site/base/base-view';
import { ViewMotion } from '../../models/view-motion'; import { ConfigService } from 'app/core/ui-services/config.service';
import { CreateMotion } from 'app/site/motions/models/create-motion';
import { LinenumberingService } from 'app/core/ui-services/linenumbering.service'; import { LinenumberingService } from 'app/core/ui-services/linenumbering.service';
import { BaseViewComponent } from '../../../base/base-view'; import { MotionRepositoryService } from 'app/core/repositories/motions/motion-repository.service';
import { CreateMotion } from '../../models/create-motion'; import { ViewMotion } from 'app/site/motions/models/view-motion';
/** /**
* Describes the single paragraphs from the base motion. * Describes the single paragraphs from the base motion.

View File

@ -3,7 +3,8 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ManageSubmittersComponent } from './manage-submitters.component'; import { ManageSubmittersComponent } from './manage-submitters.component';
import { E2EImportsModule } from 'e2e-imports.module'; import { E2EImportsModule } from 'e2e-imports.module';
import { ViewChild, Component } from '@angular/core'; import { ViewChild, Component } from '@angular/core';
import { ViewMotion } from '../../models/view-motion';
import { ViewMotion } from 'app/site/motions/models/view-motion';
import { Motion } from 'app/shared/models/motions/motion'; import { Motion } from 'app/shared/models/motions/motion';
describe('ManageSubmittersComponent', () => { describe('ManageSubmittersComponent', () => {

View File

@ -2,18 +2,18 @@ import { Component, Input } from '@angular/core';
import { FormGroup, FormControl } from '@angular/forms'; import { FormGroup, FormControl } from '@angular/forms';
import { MatSnackBar } from '@angular/material'; import { MatSnackBar } from '@angular/material';
import { Title } from '@angular/platform-browser'; import { Title } from '@angular/platform-browser';
import { TranslateService } from '@ngx-translate/core';
import { BehaviorSubject, Observable } from 'rxjs'; import { BehaviorSubject, Observable } from 'rxjs';
import { TranslateService } from '@ngx-translate/core';
import { BaseViewComponent } from 'app/site/base/base-view'; import { BaseViewComponent } from 'app/site/base/base-view';
import { LocalPermissionsService } from '../../services/local-permissions.service'; import { LocalPermissionsService } from 'app/site/motions/services/local-permissions.service';
import { MotionRepositoryService } from 'app/core/repositories/motions/motion-repository.service'; import { MotionRepositoryService } from 'app/core/repositories/motions/motion-repository.service';
import { User } from 'app/shared/models/users/user'; import { User } from 'app/shared/models/users/user';
import { ViewMotion } from '../../models/view-motion';
import { ViewUser } from 'app/site/users/models/view-user'; import { ViewUser } from 'app/site/users/models/view-user';
import { ViewModelStoreService } from 'app/core/core-services/view-model-store.service'; import { ViewModelStoreService } from 'app/core/core-services/view-model-store.service';
import { UserRepositoryService } from 'app/core/repositories/users/user-repository.service'; import { UserRepositoryService } from 'app/core/repositories/users/user-repository.service';
import { ViewMotion } from 'app/site/motions/models/view-motion';
/** /**
* Component for the motion comments view * Component for the motion comments view

View File

@ -4,10 +4,11 @@ import {
MotionChangeRecommendationComponent, MotionChangeRecommendationComponent,
MotionChangeRecommendationComponentData MotionChangeRecommendationComponentData
} from './motion-change-recommendation.component'; } from './motion-change-recommendation.component';
import { E2EImportsModule } from '../../../../../e2e-imports.module';
import { E2EImportsModule } from 'e2e-imports.module';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material';
import { ModificationType } from 'app/core/ui-services/diff.service'; import { ModificationType } from 'app/core/ui-services/diff.service';
import { ViewMotionChangeRecommendation } from '../../models/view-change-recommendation'; import { ViewMotionChangeRecommendation } from 'app/site/motions/models/view-change-recommendation';
describe('MotionChangeRecommendationComponent', () => { describe('MotionChangeRecommendationComponent', () => {
let component: MotionChangeRecommendationComponent; let component: MotionChangeRecommendationComponent;

View File

@ -5,10 +5,10 @@ import { Title } from '@angular/platform-browser';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { LineRange, ModificationType } from 'app/core/ui-services/diff.service'; import { BaseViewComponent } from 'app/site/base/base-view';
import { ChangeRecommendationRepositoryService } from 'app/core/repositories/motions/change-recommendation-repository.service'; import { ChangeRecommendationRepositoryService } from 'app/core/repositories/motions/change-recommendation-repository.service';
import { ViewMotionChangeRecommendation } from '../../models/view-change-recommendation'; import { LineRange, ModificationType } from 'app/core/ui-services/diff.service';
import { BaseViewComponent } from '../../../base/base-view'; import { ViewMotionChangeRecommendation } from 'app/site/motions/models/view-change-recommendation';
/** /**
* Data that needs to be provided to the MotionChangeRecommendationComponent dialog * Data that needs to be provided to the MotionChangeRecommendationComponent dialog

View File

@ -1,7 +1,7 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { MotionCommentsComponent } from './motion-comments.component'; import { MotionCommentsComponent } from './motion-comments.component';
import { E2EImportsModule } from '../../../../../e2e-imports.module'; import { E2EImportsModule } from 'e2e-imports.module';
describe('MotionCommentsComponent', () => { describe('MotionCommentsComponent', () => {
let component: MotionCommentsComponent; let component: MotionCommentsComponent;

View File

@ -5,13 +5,13 @@ import { FormGroup, FormBuilder } from '@angular/forms';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { MotionCommentSectionRepositoryService } from 'app/core/repositories/motions/motion-comment-section-repository.service';
import { ViewMotionCommentSection } from '../../models/view-motion-comment-section';
import { OperatorService } from 'app/core/core-services/operator.service';
import { ViewMotion } from '../../models/view-motion';
import { BaseViewComponent } from 'app/site/base/base-view'; import { BaseViewComponent } from 'app/site/base/base-view';
import { MotionPdfExportService } from '../../services/motion-pdf-export.service';
import { MotionComment } from 'app/shared/models/motions/motion'; import { MotionComment } from 'app/shared/models/motions/motion';
import { MotionCommentSectionRepositoryService } from 'app/core/repositories/motions/motion-comment-section-repository.service';
import { MotionPdfExportService } from 'app/site/motions/services/motion-pdf-export.service';
import { OperatorService } from 'app/core/core-services/operator.service';
import { ViewMotion } from 'app/site/motions/models/view-motion';
import { ViewMotionCommentSection } from 'app/site/motions/models/view-motion-comment-section';
/** /**
* Component for the motion comments view * Component for the motion comments view

View File

@ -1,13 +1,13 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { E2EImportsModule } from '../../../../../e2e-imports.module';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { LineNumberingMode, ViewMotion } from '../../models/view-motion';
import { MotionDetailDiffComponent } from './motion-detail-diff.component'; import { MotionDetailDiffComponent } from './motion-detail-diff.component';
import { MotionDetailOriginalChangeRecommendationsComponent } from '../motion-detail-original-change-recommendations/motion-detail-original-change-recommendations.component'; import { MotionDetailOriginalChangeRecommendationsComponent } from '../motion-detail-original-change-recommendations/motion-detail-original-change-recommendations.component';
import { ViewUnifiedChange } from '../../../../shared/models/motions/view-unified-change';
import { Motion } from 'app/shared/models/motions/motion'; import { Motion } from 'app/shared/models/motions/motion';
import { ViewMotionChangeRecommendation } from '../../models/view-change-recommendation'; import { ViewMotion, LineNumberingMode } from 'app/site/motions/models/view-motion';
import { ViewMotionChangeRecommendation } from 'app/site/motions/models/view-change-recommendation';
import { ViewUnifiedChange } from 'app/shared/models/motions/view-unified-change';
import { E2EImportsModule } from 'e2e-imports.module';
@Component({ @Component({
template: ` template: `

View File

@ -4,19 +4,19 @@ import { DomSanitizer, SafeHtml, Title } from '@angular/platform-browser';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { BaseViewComponent } from '../../../base/base-view'; import { BaseViewComponent } from 'app/site/base/base-view';
import { ConfigService } from 'app/core/ui-services/config.service'; import { ConfigService } from 'app/core/ui-services/config.service';
import { ChangeRecommendationRepositoryService } from 'app/core/repositories/motions/change-recommendation-repository.service'; import { ChangeRecommendationRepositoryService } from 'app/core/repositories/motions/change-recommendation-repository.service';
import { DiffService, LineRange, ModificationType } from 'app/core/ui-services/diff.service'; import { DiffService, LineRange, ModificationType } from 'app/core/ui-services/diff.service';
import { LineNumberingMode, ViewMotion } from '../../models/view-motion';
import { import {
MotionChangeRecommendationComponent, MotionChangeRecommendationComponent,
MotionChangeRecommendationComponentData MotionChangeRecommendationComponentData
} from '../motion-change-recommendation/motion-change-recommendation.component'; } from '../motion-change-recommendation/motion-change-recommendation.component';
import { MotionRepositoryService } from 'app/core/repositories/motions/motion-repository.service'; import { MotionRepositoryService } from 'app/core/repositories/motions/motion-repository.service';
import { PromptService } from 'app/core/ui-services/prompt.service'; import { PromptService } from 'app/core/ui-services/prompt.service';
import { ViewUnifiedChange, ViewUnifiedChangeType } from '../../../../shared/models/motions/view-unified-change'; import { ViewMotion, LineNumberingMode } from 'app/site/motions/models/view-motion';
import { ViewMotionChangeRecommendation } from '../../models/view-change-recommendation'; import { ViewUnifiedChange, ViewUnifiedChangeType } from 'app/shared/models/motions/view-unified-change';
import { ViewMotionChangeRecommendation } from 'app/site/motions/models/view-change-recommendation';
/** /**
* This component displays the original motion text with the change blocks inside. * This component displays the original motion text with the change blocks inside.

View File

@ -1,7 +1,7 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { MotionDetailOriginalChangeRecommendationsComponent } from './motion-detail-original-change-recommendations.component'; import { MotionDetailOriginalChangeRecommendationsComponent } from './motion-detail-original-change-recommendations.component';
import { E2EImportsModule } from '../../../../../e2e-imports.module'; import { E2EImportsModule } from 'e2e-imports.module';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
@Component({ @Component({

View File

@ -11,8 +11,8 @@ import {
} from '@angular/core'; } from '@angular/core';
import { LineRange, ModificationType } from 'app/core/ui-services/diff.service'; import { LineRange, ModificationType } from 'app/core/ui-services/diff.service';
import { ViewMotionChangeRecommendation } from '../../models/view-change-recommendation';
import { OperatorService } from 'app/core/core-services/operator.service'; import { OperatorService } from 'app/core/core-services/operator.service';
import { ViewMotionChangeRecommendation } from 'app/site/motions/models/view-change-recommendation';
/** /**
* This component displays the original motion text with annotated change commendations * This component displays the original motion text with annotated change commendations

View File

@ -1,6 +1,7 @@
<os-head-bar <os-head-bar
[mainButton]="perms.isAllowed('update', motion)" [mainButton]="perms.isAllowed('update', motion)"
mainButtonIcon="edit" mainButtonIcon="edit"
prevUrl="../.."
[nav]="false" [nav]="false"
[editMode]="editMotion" [editMode]="editMotion"
(mainEvent)="setEditMode(!editMotion)" (mainEvent)="setEditMode(!editMotion)"

View File

@ -1,4 +1,4 @@
@import '../../../../../assets/styles/motion-styles-common'; @import '~assets/styles/motion-styles-common';
span { span {
margin: 0; margin: 0;

View File

@ -0,0 +1,40 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { MotionDetailComponent } from './motion-detail.component';
import { E2EImportsModule } from 'e2e-imports.module';
import { MotionCommentsComponent } from '../motion-comments/motion-comments.component';
import { PersonalNoteComponent } from '../personal-note/personal-note.component';
import { ManageSubmittersComponent } from '../manage-submitters/manage-submitters.component';
import { MotionPollComponent } from '../motion-poll/motion-poll.component';
import { MotionDetailOriginalChangeRecommendationsComponent } from '../motion-detail-original-change-recommendations/motion-detail-original-change-recommendations.component';
import { MotionDetailDiffComponent } from '../motion-detail-diff/motion-detail-diff.component';
describe('MotionDetailComponent', () => {
let component: MotionDetailComponent;
let fixture: ComponentFixture<MotionDetailComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [E2EImportsModule],
declarations: [
MotionDetailComponent,
MotionCommentsComponent,
PersonalNoteComponent,
ManageSubmittersComponent,
MotionPollComponent,
MotionDetailOriginalChangeRecommendationsComponent,
MotionDetailDiffComponent
]
}).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(MotionDetailComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -7,28 +7,26 @@ import { MatDialog, MatSnackBar, MatCheckboxChange, ErrorStateMatcher } from '@a
import { BehaviorSubject, Subscription } from 'rxjs'; import { BehaviorSubject, Subscription } from 'rxjs';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { BaseViewComponent } from '../../../base/base-view'; import { BaseViewComponent } from 'app/site/base/base-view';
import { CategoryRepositoryService } from 'app/core/repositories/motions/category-repository.service'; import { CategoryRepositoryService } from 'app/core/repositories/motions/category-repository.service';
import { ChangeRecommendationRepositoryService } from 'app/core/repositories/motions/change-recommendation-repository.service'; import { ChangeRecommendationRepositoryService } from 'app/core/repositories/motions/change-recommendation-repository.service';
import { ChangeRecoMode, LineNumberingMode, ViewMotion } from '../../models/view-motion'; import { CreateMotion } from 'app/site/motions/models/create-motion';
import { CreateMotion } from '../../models/create-motion';
import { ConfigService } from 'app/core/ui-services/config.service'; import { ConfigService } from 'app/core/ui-services/config.service';
import { DataStoreService } from 'app/core/core-services/data-store.service'; import { DataStoreService } from 'app/core/core-services/data-store.service';
import { DiffLinesInParagraph, LineRange } from 'app/core/ui-services/diff.service'; import { DiffLinesInParagraph, LineRange } from 'app/core/ui-services/diff.service';
import { ItemRepositoryService } from 'app/core/repositories/agenda/item-repository.service'; import { ItemRepositoryService } from 'app/core/repositories/agenda/item-repository.service';
import { itemVisibilityChoices, Item } from 'app/shared/models/agenda/item'; import { itemVisibilityChoices, Item } from 'app/shared/models/agenda/item';
import { LinenumberingService } from 'app/core/ui-services/linenumbering.service'; import { LinenumberingService } from 'app/core/ui-services/linenumbering.service';
import { LocalPermissionsService } from '../../services/local-permissions.service'; import { LocalPermissionsService } from 'app/site/motions/services/local-permissions.service';
import { Mediafile } from 'app/shared/models/mediafiles/mediafile'; import { Mediafile } from 'app/shared/models/mediafiles/mediafile';
import { Motion } from 'app/shared/models/motions/motion'; import { Motion } from 'app/shared/models/motions/motion';
import { MotionBlock } from 'app/shared/models/motions/motion-block'; import { MotionBlock } from 'app/shared/models/motions/motion-block';
import { import {
MotionChangeRecommendationComponent, MotionChangeRecommendationComponentData,
MotionChangeRecommendationComponentData MotionChangeRecommendationComponent
} from '../motion-change-recommendation/motion-change-recommendation.component'; } from '../motion-change-recommendation/motion-change-recommendation.component';
import { MotionPdfExportService } from '../../services/motion-pdf-export.service'; import { MotionPdfExportService } from 'app/site/motions/services/motion-pdf-export.service';
import { MotionRepositoryService } from 'app/core/repositories/motions/motion-repository.service'; import { MotionRepositoryService } from 'app/core/repositories/motions/motion-repository.service';
import { NotifyService } from 'app/core/core-services/notify.service'; import { NotifyService } from 'app/core/core-services/notify.service';
import { OperatorService } from 'app/core/core-services/operator.service'; import { OperatorService } from 'app/core/core-services/operator.service';
import { PersonalNoteContent } from 'app/shared/models/users/personal-note'; import { PersonalNoteContent } from 'app/shared/models/users/personal-note';
@ -37,18 +35,22 @@ import { PromptService } from 'app/core/ui-services/prompt.service';
import { StatuteParagraphRepositoryService } from 'app/core/repositories/motions/statute-paragraph-repository.service'; import { StatuteParagraphRepositoryService } from 'app/core/repositories/motions/statute-paragraph-repository.service';
import { Tag } from 'app/shared/models/core/tag'; import { Tag } from 'app/shared/models/core/tag';
import { UserRepositoryService } from 'app/core/repositories/users/user-repository.service'; import { UserRepositoryService } from 'app/core/repositories/users/user-repository.service';
import { ViewMotionBlock } from '../../models/view-motion-block'; import { ViewMotionBlock } from 'app/site/motions/models/view-motion-block';
import { ViewWorkflow } from '../../models/view-workflow'; import { ViewWorkflow } from 'app/site/motions/models/view-workflow';
import { ViewUser } from 'app/site/users/models/view-user'; import { ViewUser } from 'app/site/users/models/view-user';
import { ViewCategory } from '../../models/view-category'; import { ViewCategory } from 'app/site/motions/models/view-category';
import { ViewCreateMotion } from '../../models/view-create-motion'; import { ViewCreateMotion } from 'app/site/motions/models/view-create-motion';
import { ViewItem } from 'app/site/agenda/models/view-item'; import { ViewItem } from 'app/site/agenda/models/view-item';
import { ViewportService } from 'app/core/ui-services/viewport.service'; import { ViewportService } from 'app/core/ui-services/viewport.service';
import { ViewMediafile } from 'app/site/mediafiles/models/view-mediafile'; import { ViewMediafile } from 'app/site/mediafiles/models/view-mediafile';
import { ViewModelStoreService } from 'app/core/core-services/view-model-store.service'; import { ViewModelStoreService } from 'app/core/core-services/view-model-store.service';
import { ViewMotionChangeRecommendation } from '../../models/view-change-recommendation'; import { ViewMotionChangeRecommendation } from 'app/site/motions/models/view-change-recommendation';
import { ViewMotionNotificationEditMotion, TypeOfNotificationViewMotion } from '../../models/view-motion-notify'; import {
import { ViewStatuteParagraph } from '../../models/view-statute-paragraph'; ViewMotionNotificationEditMotion,
TypeOfNotificationViewMotion
} from 'app/site/motions/models/view-motion-notify';
import { ViewMotion, ChangeRecoMode, LineNumberingMode } from 'app/site/motions/models/view-motion';
import { ViewStatuteParagraph } from 'app/site/motions/models/view-statute-paragraph';
import { ViewTag } from 'app/site/tags/models/view-tag'; import { ViewTag } from 'app/site/tags/models/view-tag';
import { ViewUnifiedChange } from 'app/shared/models/motions/view-unified-change'; import { ViewUnifiedChange } from 'app/shared/models/motions/view-unified-change';
import { Workflow } from 'app/shared/models/motions/workflow'; import { Workflow } from 'app/shared/models/motions/workflow';
@ -342,7 +344,7 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit,
private editNotificationSubscription: Subscription; private editNotificationSubscription: Subscription;
/** /**
* Constuct the detail view. * Constructs the detail view.
* *
* @param title * @param title
* @param translate * @param translate
@ -552,7 +554,33 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit,
* determine the motion to display using the URL * determine the motion to display using the URL
*/ */
public getMotionByUrl(): void { public getMotionByUrl(): void {
if (this.route.snapshot.url[0] && this.route.snapshot.url[0].path === 'new') { this.route.params.subscribe(params => {
if (Object.keys(params).length > 0) {
// load existing motion
const motionId: number = +params.id;
this.repo.getViewModelObservable(motionId).subscribe(newViewMotion => {
if (newViewMotion) {
this.motion = newViewMotion;
this.newStateExtension = this.motion.stateExtension;
this.personalNoteService.getPersonalNoteObserver(this.motion.motion).subscribe(pn => {
this.personalNoteContent = pn;
});
this.patchForm(this.motion);
}
});
this.repo.amendmentsTo(motionId).subscribe(
(amendments: ViewMotion[]): void => {
this.amendments = amendments;
this.recalcUnifiedChanges();
}
);
this.changeRecoRepo
.getChangeRecosOfMotionObservable(motionId)
.subscribe((recos: ViewMotionChangeRecommendation[]) => {
this.changeRecommendations = recos;
this.recalcUnifiedChanges();
});
} else {
// creates a new motion // creates a new motion
this.newMotion = true; this.newMotion = true;
this.editMotion = true; this.editMotion = true;
@ -586,34 +614,8 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit,
} }
this.motion = new ViewCreateMotion(new CreateMotion(defaultMotion)); this.motion = new ViewCreateMotion(new CreateMotion(defaultMotion));
this.motionCopy = new ViewCreateMotion(new CreateMotion(defaultMotion)); this.motionCopy = new ViewCreateMotion(new CreateMotion(defaultMotion));
} else {
// load existing motion
this.route.params.subscribe(params => {
const motionId: number = parseInt(params.id, 10);
this.repo.getViewModelObservable(motionId).subscribe(newViewMotion => {
if (newViewMotion) {
this.motion = newViewMotion;
this.newStateExtension = this.motion.stateExtension;
this.personalNoteService.getPersonalNoteObserver(this.motion.motion).subscribe(pn => {
this.personalNoteContent = pn;
});
this.patchForm(this.motion);
} }
}); });
this.repo.amendmentsTo(motionId).subscribe(
(amendments: ViewMotion[]): void => {
this.amendments = amendments;
this.recalcUnifiedChanges();
}
);
this.changeRecoRepo
.getChangeRecosOfMotionObservable(motionId)
.subscribe((recos: ViewMotionChangeRecommendation[]) => {
this.changeRecommendations = recos;
this.recalcUnifiedChanges();
});
});
}
} }
/** /**
@ -1080,7 +1082,7 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit,
*/ */
public navigateToMotion(motion: ViewMotion): void { public navigateToMotion(motion: ViewMotion): void {
if (motion) { if (motion) {
this.router.navigate(['../' + motion.id], { relativeTo: this.route }); this.router.navigate(['../contacts'], { relativeTo: this.route.parent });
// update the current motion // update the current motion
this.motion = motion; this.motion = motion;
this.setSurroundingMotions(); this.setSurroundingMotions();

View File

@ -3,7 +3,7 @@ import { MatDialogRef, MAT_DIALOG_DATA, MatSnackBar } from '@angular/material';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { MotionPoll } from 'app/shared/models/motions/motion-poll'; import { MotionPoll } from 'app/shared/models/motions/motion-poll';
import { MotionPollService, CalculablePollKey } from '../../services/motion-poll.service'; import { MotionPollService, CalculablePollKey } from 'app/site/motions/services/motion-poll.service';
/** /**
* A dialog for updating the values of a poll. * A dialog for updating the values of a poll.

View File

@ -5,13 +5,13 @@ import { TranslateService } from '@ngx-translate/core';
import { CalculablePollKey } from 'app/core/ui-services/poll.service'; import { CalculablePollKey } from 'app/core/ui-services/poll.service';
import { ConstantsService } from 'app/core/ui-services/constants.service'; import { ConstantsService } from 'app/core/ui-services/constants.service';
import { LocalPermissionsService } from '../../services/local-permissions.service'; import { LocalPermissionsService } from 'app/site/motions/services/local-permissions.service';
import { MotionPoll } from 'app/shared/models/motions/motion-poll'; import { MotionPoll } from 'app/shared/models/motions/motion-poll';
import { MotionPollService } from '../../services/motion-poll.service';
import { MotionPollDialogComponent } from './motion-poll-dialog.component'; import { MotionPollDialogComponent } from './motion-poll-dialog.component';
import { MotionPollPdfService } from 'app/site/motions/services/motion-poll-pdf.service';
import { MotionPollService } from 'app/site/motions/services/motion-poll.service';
import { MotionRepositoryService } from 'app/core/repositories/motions/motion-repository.service'; import { MotionRepositoryService } from 'app/core/repositories/motions/motion-repository.service';
import { PromptService } from 'app/core/ui-services/prompt.service'; import { PromptService } from 'app/core/ui-services/prompt.service';
import { MotionPollPdfService } from '../../services/motion-poll-pdf.service';
/** /**
* A component used to display and edit polls of a motion. * A component used to display and edit polls of a motion.

View File

@ -3,11 +3,11 @@ import { FormBuilder, FormGroup } from '@angular/forms';
import { Subscription } from 'rxjs'; import { Subscription } from 'rxjs';
import { BaseComponent } from '../../../../base.component'; import { BaseComponent } from 'app/base.component';
import { MotionPdfExportService } from '../../services/motion-pdf-export.service'; import { MotionPdfExportService } from 'app/site/motions/services/motion-pdf-export.service';
import { PersonalNoteContent } from 'app/shared/models/users/personal-note'; import { PersonalNoteContent } from 'app/shared/models/users/personal-note';
import { PersonalNoteService } from 'app/core/ui-services/personal-note.service'; import { PersonalNoteService } from 'app/core/ui-services/personal-note.service';
import { ViewMotion } from '../../models/view-motion'; import { ViewMotion } from 'app/site/motions/models/view-motion';
/** /**
* Component for the motion comments view * Component for the motion comments view

View File

@ -0,0 +1,16 @@
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { MotionDetailComponent } from './components/motion-detail/motion-detail.component';
import { AmendmentCreateWizardComponent } from './components/amendment-create-wizard/amendment-create-wizard.component';
const routes: Routes = [
{ path: '', component: MotionDetailComponent, pathMatch: 'full' },
{ path: 'create-amendment', component: AmendmentCreateWizardComponent }
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class MotionDetailRoutingModule {}

View File

@ -0,0 +1,39 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { MotionDetailRoutingModule } from './motion-detail-routing.module';
import { SharedModule } from 'app/shared/shared.module';
import { MotionDetailComponent } from './components/motion-detail/motion-detail.component';
import { AmendmentCreateWizardComponent } from './components/amendment-create-wizard/amendment-create-wizard.component';
import { MotionCommentsComponent } from './components/motion-comments/motion-comments.component';
import { PersonalNoteComponent } from './components/personal-note/personal-note.component';
import { ManageSubmittersComponent } from './components/manage-submitters/manage-submitters.component';
import { MotionPollDialogComponent } from './components/motion-poll/motion-poll-dialog.component';
import { MotionPollComponent } from './components/motion-poll/motion-poll.component';
import { MotionDetailOriginalChangeRecommendationsComponent } from './components/motion-detail-original-change-recommendations/motion-detail-original-change-recommendations.component';
import { MotionDetailDiffComponent } from './components/motion-detail-diff/motion-detail-diff.component';
import { MotionChangeRecommendationComponent } from './components/motion-change-recommendation/motion-change-recommendation.component';
@NgModule({
imports: [CommonModule, MotionDetailRoutingModule, SharedModule],
declarations: [
MotionDetailComponent,
AmendmentCreateWizardComponent,
MotionCommentsComponent,
PersonalNoteComponent,
ManageSubmittersComponent,
MotionPollComponent,
MotionPollDialogComponent,
MotionDetailDiffComponent,
MotionDetailOriginalChangeRecommendationsComponent,
MotionChangeRecommendationComponent
],
entryComponents: [
MotionCommentsComponent,
PersonalNoteComponent,
ManageSubmittersComponent,
MotionPollDialogComponent,
MotionChangeRecommendationComponent
]
})
export class MotionDetailModule {}

View File

@ -1,4 +1,4 @@
<os-head-bar [nav]="false"> <os-head-bar prevUrl="../.." [nav]="false">
<!-- Title --> <!-- Title -->
<div class="title-slot"><h2 translate>Import motions</h2></div> <div class="title-slot"><h2 translate>Import motions</h2></div>
@ -48,7 +48,7 @@
</mat-form-field> </mat-form-field>
<mat-form-field> <mat-form-field>
<mat-label translate>Text separator</mat-label> <mat-label translate>Text separator</mat-label>
<mat-select class="selection" (selectionChange)="selectTextSep($event)" value="&quot;"> <mat-select class="selection" (selectionChange)="selectTextSep($event)" value='"'>
<mat-option *ngFor="let option of textSeparators" [value]="option.value"> <mat-option *ngFor="let option of textSeparators" [value]="option.value">
{{ option.label | translate }} {{ option.label | translate }}
</mat-option> </mat-option>
@ -107,7 +107,6 @@
</div> </div>
<div class="table-container"> <div class="table-container">
<table mat-table class="on-transition-fade" [dataSource]="dataSource" matSort> <table mat-table class="on-transition-fade" [dataSource]="dataSource" matSort>
<!-- Status column --> <!-- Status column -->
<ng-container matColumnDef="status" sticky> <ng-container matColumnDef="status" sticky>
<mat-header-cell *matHeaderCellDef class="first-column"></mat-header-cell> <mat-header-cell *matHeaderCellDef class="first-column"></mat-header-cell>

View File

@ -5,9 +5,9 @@ import { Title } from '@angular/platform-browser';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { BaseImportListComponent } from 'app/site/base/base-import-list'; import { BaseImportListComponent } from 'app/site/base/base-import-list';
import { MotionCsvExportService } from '../../services/motion-csv-export.service'; import { MotionCsvExportService } from 'app/site/motions/services/motion-csv-export.service';
import { MotionImportService } from '../../services/motion-import.service'; import { MotionImportService } from 'app/site/motions/services/motion-import.service';
import { ViewMotion } from '../../models/view-motion'; import { ViewMotion } from 'app/site/motions/models/view-motion';
/** /**
* Component for the motion import list view. * Component for the motion import list view.

View File

@ -0,0 +1,12 @@
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { MotionImportListComponent } from './motion-import-list.component';
const routes: Routes = [{ path: '', component: MotionImportListComponent, pathMatch: 'full' }];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class MotionImportRoutingModule {}

View File

@ -0,0 +1,12 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { MotionImportListComponent } from './motion-import-list.component';
import { MotionImportRoutingModule } from './motion-import-routing.module';
import { SharedModule } from 'app/shared/shared.module';
@NgModule({
declarations: [MotionImportListComponent],
imports: [CommonModule, MotionImportRoutingModule, SharedModule]
})
export class MotionImportModule {}

View File

@ -3,10 +3,10 @@ import { FormGroup, FormBuilder } from '@angular/forms';
import { MatDialogRef, MatButtonToggle } from '@angular/material'; import { MatDialogRef, MatButtonToggle } from '@angular/material';
import { ConfigService } from 'app/core/ui-services/config.service'; import { ConfigService } from 'app/core/ui-services/config.service';
import { LineNumberingMode, ChangeRecoMode } from '../../models/view-motion';
import { InfoToExport } from '../../services/motion-pdf.service';
import { MotionCommentSectionRepositoryService } from 'app/core/repositories/motions/motion-comment-section-repository.service'; import { MotionCommentSectionRepositoryService } from 'app/core/repositories/motions/motion-comment-section-repository.service';
import { ViewMotionCommentSection } from '../../models/view-motion-comment-section'; import { LineNumberingMode, ChangeRecoMode } from 'app/site/motions/models/view-motion';
import { InfoToExport } from 'app/site/motions/services/motion-pdf.service';
import { ViewMotionCommentSection } from 'app/site/motions/models/view-motion-comment-section';
/** /**
* Dialog component to determine exporting. * Dialog component to determine exporting.

View File

@ -1,7 +1,7 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { MotionListComponent } from './motion-list.component'; import { MotionListComponent } from './motion-list.component';
import { E2EImportsModule } from '../../../../../e2e-imports.module'; import { E2EImportsModule } from 'e2e-imports.module';
describe('MotionListComponent', () => { describe('MotionListComponent', () => {
let component: MotionListComponent; let component: MotionListComponent;

View File

@ -7,27 +7,27 @@ import { TranslateService } from '@ngx-translate/core';
import { CategoryRepositoryService } from 'app/core/repositories/motions/category-repository.service'; import { CategoryRepositoryService } from 'app/core/repositories/motions/category-repository.service';
import { ConfigService } from 'app/core/ui-services/config.service'; import { ConfigService } from 'app/core/ui-services/config.service';
import { ListViewBaseComponent } from '../../../base/list-view-base'; import { ListViewBaseComponent } from 'app/site/base/list-view-base';
import { LocalPermissionsService } from '../../services/local-permissions.service';
import { MotionBlockRepositoryService } from 'app/core/repositories/motions/motion-block-repository.service'; import { MotionBlockRepositoryService } from 'app/core/repositories/motions/motion-block-repository.service';
import { MotionCsvExportService } from '../../services/motion-csv-export.service';
import { MotionFilterListService } from '../../services/motion-filter-list.service';
import { MotionMultiselectService } from '../../services/motion-multiselect.service';
import { MotionRepositoryService } from 'app/core/repositories/motions/motion-repository.service'; import { MotionRepositoryService } from 'app/core/repositories/motions/motion-repository.service';
import { MotionSortListService } from '../../services/motion-sort-list.service';
import { TagRepositoryService } from 'app/core/repositories/tags/tag-repository.service'; import { TagRepositoryService } from 'app/core/repositories/tags/tag-repository.service';
import { ViewCategory } from '../../models/view-category';
import { ViewMotion, LineNumberingMode, ChangeRecoMode } from '../../models/view-motion';
import { ViewMotionBlock } from '../../models/view-motion-block';
import { ViewTag } from 'app/site/tags/models/view-tag'; import { ViewTag } from 'app/site/tags/models/view-tag';
import { ViewWorkflow } from '../../models/view-workflow';
import { WorkflowState } from 'app/shared/models/motions/workflow-state'; import { WorkflowState } from 'app/shared/models/motions/workflow-state';
import { WorkflowRepositoryService } from 'app/core/repositories/motions/workflow-repository.service'; import { WorkflowRepositoryService } from 'app/core/repositories/motions/workflow-repository.service';
import { MotionPdfExportService } from '../../services/motion-pdf-export.service';
import { MotionExportDialogComponent } from '../motion-export-dialog/motion-export-dialog.component'; import { MotionExportDialogComponent } from '../motion-export-dialog/motion-export-dialog.component';
import { OperatorService } from 'app/core/core-services/operator.service'; import { OperatorService } from 'app/core/core-services/operator.service';
import { ViewportService } from 'app/core/ui-services/viewport.service'; import { ViewportService } from 'app/core/ui-services/viewport.service';
import { Motion } from 'app/shared/models/motions/motion'; import { Motion } from 'app/shared/models/motions/motion';
import { ViewMotion, LineNumberingMode, ChangeRecoMode } from 'app/site/motions/models/view-motion';
import { ViewWorkflow } from 'app/site/motions/models/view-workflow';
import { ViewCategory } from 'app/site/motions/models/view-category';
import { ViewMotionBlock } from 'app/site/motions/models/view-motion-block';
import { MotionSortListService } from 'app/site/motions/services/motion-sort-list.service';
import { MotionFilterListService } from 'app/site/motions/services/motion-filter-list.service';
import { MotionCsvExportService } from 'app/site/motions/services/motion-csv-export.service';
import { MotionPdfExportService } from 'app/site/motions/services/motion-pdf-export.service';
import { MotionMultiselectService } from 'app/site/motions/services/motion-multiselect.service';
import { LocalPermissionsService } from 'app/site/motions/services/local-permissions.service';
/** /**
* Component that displays all the motions in a Table using DataSource. * Component that displays all the motions in a Table using DataSource.

View File

@ -0,0 +1,11 @@
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { MotionListComponent } from './components/motion-list/motion-list.component';
const routes: Routes = [{ path: '', component: MotionListComponent, pathMatch: 'full' }];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class MotionListRoutingModule {}

View File

@ -0,0 +1,14 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { MotionListRoutingModule } from './motion-list-routing.module';
import { SharedModule } from 'app/shared/shared.module';
import { MotionExportDialogComponent } from './components/motion-export-dialog/motion-export-dialog.component';
import { MotionListComponent } from './components/motion-list/motion-list.component';
@NgModule({
imports: [CommonModule, MotionListRoutingModule, SharedModule],
declarations: [MotionListComponent, MotionExportDialogComponent],
entryComponents: [MotionExportDialogComponent]
})
export class MotionListModule {}

Some files were not shown because too many files have changed in this diff Show More