Merge pull request #4803 from tsiegleauq/sorted-next-motion

Enhance surrounding motion detection
This commit is contained in:
Sean 2019-06-24 16:29:00 +02:00 committed by GitHub
commit 582be687eb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 48 additions and 34 deletions

View File

@ -145,4 +145,4 @@ matrix:
install: install:
- npm install - npm install
script: script:
- npm run ng-high-memory build --prod - npm run ng-high-memory -- build --prod --aot

View File

@ -90,7 +90,7 @@ export class MotionBlockListComponent extends ListViewBaseComponent<ViewMotionBl
translate: TranslateService, translate: TranslateService,
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
storage: StorageService, storage: StorageService,
private repo: MotionBlockRepositoryService, public repo: MotionBlockRepositoryService,
private formBuilder: FormBuilder, private formBuilder: FormBuilder,
private itemRepo: ItemRepositoryService, private itemRepo: ItemRepositoryService,
private operator: OperatorService, private operator: OperatorService,

View File

@ -324,7 +324,7 @@
<!-- Category --> <!-- Category -->
<!-- Disabled during "new motion" since changing has no effect --> <!-- Disabled during "new motion" since changing has no effect -->
<div *ngIf="!editMotion && categoryObserver.value.length > 0"> <div *ngIf="!editMotion && categoryObserver.value.length">
<h4 *ngIf="perms.isAllowed('change_metadata', motion) || motion.category" translate>Category</h4> <h4 *ngIf="perms.isAllowed('change_metadata', motion) || motion.category" translate>Category</h4>
<mat-menu #categoryMenu="matMenu"> <mat-menu #categoryMenu="matMenu">
<button <button
@ -342,7 +342,7 @@
class="grey" class="grey"
disableRipple disableRipple
> >
{{ motion.category.prefixedNameWithParents || '' }} {{ motion.category ? motion.category.prefixedNameWithParents : '' }}
</mat-basic-chip> </mat-basic-chip>
<mat-basic-chip <mat-basic-chip
*ngIf="!perms.isAllowed('change_metadata', motion) && motion.category" *ngIf="!perms.isAllowed('change_metadata', motion) && motion.category"

View File

@ -13,6 +13,7 @@ import { ChangeRecommendationRepositoryService } from 'app/core/repositories/mot
import { CreateMotion } from 'app/site/motions/models/create-motion'; import { CreateMotion } from 'app/site/motions/models/create-motion';
import { ConfigService } from 'app/core/ui-services/config.service'; import { ConfigService } from 'app/core/ui-services/config.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 { LinenumberingService } from 'app/core/ui-services/linenumbering.service'; import { LinenumberingService } from 'app/core/ui-services/linenumbering.service';
import { LocalPermissionsService } from 'app/site/motions/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';
@ -23,39 +24,39 @@ import {
MotionChangeRecommendationComponent MotionChangeRecommendationComponent
} from '../motion-change-recommendation/motion-change-recommendation.component'; } from '../motion-change-recommendation/motion-change-recommendation.component';
import { MotionPdfExportService } from 'app/site/motions/services/motion-pdf-export.service'; import { MotionPdfExportService } from 'app/site/motions/services/motion-pdf-export.service';
import { MotionBlockRepositoryService } from 'app/core/repositories/motions/motion-block-repository.service';
import { MotionFilterListService } from 'app/site/motions/services/motion-filter-list.service';
import { MotionRepositoryService, ParagraphToChoose } from 'app/core/repositories/motions/motion-repository.service'; import { MotionRepositoryService, ParagraphToChoose } from 'app/core/repositories/motions/motion-repository.service';
import { MotionSortListService } from 'app/site/motions/services/motion-sort-list.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 { PersonalNoteService } from 'app/core/ui-services/personal-note.service'; import { PersonalNoteService } from 'app/core/ui-services/personal-note.service';
import { PromptService } from 'app/core/ui-services/prompt.service'; 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 { TagRepositoryService } from 'app/core/repositories/tags/tag-repository.service';
import { UserRepositoryService } from 'app/core/repositories/users/user-repository.service'; import { UserRepositoryService } from 'app/core/repositories/users/user-repository.service';
import { ViewMotionBlock } from 'app/site/motions/models/view-motion-block';
import { ViewWorkflow } from 'app/site/motions/models/view-workflow';
import { ViewUser } from 'app/site/users/models/view-user';
import { ViewCategory } from 'app/site/motions/models/view-category';
import { ViewCreateMotion } from 'app/site/motions/models/view-create-motion';
import { ViewportService } from 'app/core/ui-services/viewport.service';
import { ViewMediafile } from 'app/site/mediafiles/models/view-mediafile';
import { ViewMotionChangeRecommendation } from 'app/site/motions/models/view-motion-change-recommendation';
import {
ViewMotionNotificationEditMotion,
TypeOfNotificationViewMotion
} from 'app/site/motions/models/view-motion-notify';
import { import {
ViewMotion, ViewMotion,
ChangeRecoMode, ChangeRecoMode,
LineNumberingMode, LineNumberingMode,
verboseChangeRecoMode verboseChangeRecoMode
} from 'app/site/motions/models/view-motion'; } from 'app/site/motions/models/view-motion';
import {
ViewMotionNotificationEditMotion,
TypeOfNotificationViewMotion
} from 'app/site/motions/models/view-motion-notify';
import { ViewMotionBlock } from 'app/site/motions/models/view-motion-block';
import { ViewCategory } from 'app/site/motions/models/view-category';
import { ViewCreateMotion } from 'app/site/motions/models/view-create-motion';
import { ViewportService } from 'app/core/ui-services/viewport.service';
import { ViewMediafile } from 'app/site/mediafiles/models/view-mediafile';
import { ViewMotionChangeRecommendation } from 'app/site/motions/models/view-motion-change-recommendation';
import { ViewStatuteParagraph } from 'app/site/motions/models/view-statute-paragraph'; 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 { TagRepositoryService } from 'app/core/repositories/tags/tag-repository.service'; import { ViewUser } from 'app/site/users/models/view-user';
import { ViewWorkflow } from 'app/site/motions/models/view-workflow';
import { WorkflowRepositoryService } from 'app/core/repositories/motions/workflow-repository.service'; import { WorkflowRepositoryService } from 'app/core/repositories/motions/workflow-repository.service';
import { MotionBlockRepositoryService } from 'app/core/repositories/motions/motion-block-repository.service';
import { MotionSortListService } from 'app/site/motions/services/motion-sort-list.service';
import { ItemRepositoryService } from 'app/core/repositories/agenda/item-repository.service';
/** /**
* Component for the motion detail view * Component for the motion detail view
@ -262,6 +263,13 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit,
*/ */
public motionObserver: BehaviorSubject<ViewMotion[]>; public motionObserver: BehaviorSubject<ViewMotion[]>;
/**
* List of presorted motions. Filles by sort service
* and filter service.
* To navigate back and forth
*/
private sortedMotions: ViewMotion[];
/** /**
* Determine if the name of supporters are visible * Determine if the name of supporters are visible
*/ */
@ -399,6 +407,7 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit,
* @param blockRepo * @param blockRepo
* @param itemRepo * @param itemRepo
* @param motionSortService * @param motionSortService
* @param motionFilterListService
*/ */
public constructor( public constructor(
title: Title, title: Title,
@ -428,8 +437,9 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit,
private mediaFilerepo: MediafileRepositoryService, private mediaFilerepo: MediafileRepositoryService,
private workflowRepo: WorkflowRepositoryService, private workflowRepo: WorkflowRepositoryService,
private blockRepo: MotionBlockRepositoryService, private blockRepo: MotionBlockRepositoryService,
private itemRepo: ItemRepositoryService,
private motionSortService: MotionSortListService, private motionSortService: MotionSortListService,
private itemRepo: ItemRepositoryService private motionFilterService: MotionFilterListService
) { ) {
super(title, translate, matSnackBar); super(title, translate, matSnackBar);
} }
@ -452,7 +462,6 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit,
this.createForm(); this.createForm();
this.observeRoute(); this.observeRoute();
this.getMotionByUrl(); this.getMotionByUrl();
this.setSurroundingMotions();
// load config variables // load config variables
this.configService this.configService
@ -498,12 +507,18 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit,
this.statuteParagraphs = newViewStatuteParagraphs; this.statuteParagraphs = newViewStatuteParagraphs;
}); });
// Observe motion changes to trigger surrounding motions // use the filter and the search service to get the current sorting
this.motionObserver.subscribe(motionChanges => { this.motionFilterService.initFilters(this.motionObserver);
if (motionChanges) { this.motionSortService.initSorting(this.motionFilterService.outputObservable);
this.subscriptions.push(
this.motionSortService.outputObservable.subscribe(motions => {
if (motions) {
this.sortedMotions = motions;
this.setSurroundingMotions(); this.setSurroundingMotions();
} }
}); })
);
} }
/** /**
@ -515,6 +530,7 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit,
if (this.navigationSubscription) { if (this.navigationSubscription) {
this.navigationSubscription.unsubscribe(); this.navigationSubscription.unsubscribe();
} }
super.ngOnDestroy();
} }
/** /**
@ -1172,19 +1188,17 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit,
* in the {@link MotionSortListService} * in the {@link MotionSortListService}
*/ */
public setSurroundingMotions(): void { public setSurroundingMotions(): void {
const sortedMotions = this.motionSortService.sortSync(this.motionObserver.value); const indexOfCurrent = this.sortedMotions.findIndex(motion => {
const indexOfCurrent = sortedMotions.findIndex(motion => {
return motion === this.motion; return motion === this.motion;
}); });
if (indexOfCurrent > -1) { if (indexOfCurrent > -1) {
if (indexOfCurrent > 0) { if (indexOfCurrent > 0) {
this.previousMotion = sortedMotions[indexOfCurrent - 1]; this.previousMotion = this.sortedMotions[indexOfCurrent - 1];
} else { } else {
this.previousMotion = null; this.previousMotion = null;
} }
if (indexOfCurrent < this.sortedMotions.length - 1) {
if (indexOfCurrent < sortedMotions.length - 1) { this.nextMotion = this.sortedMotions[indexOfCurrent + 1];
this.nextMotion = sortedMotions[indexOfCurrent + 1];
} else { } else {
this.nextMotion = null; this.nextMotion = null;
} }