Merge pull request #4524 from GabrielInTheWorld/util-fixes

Adds listener to the pagination
This commit is contained in:
Sean 2019-03-25 10:09:01 +01:00 committed by GitHub
commit 279b8b1d25
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 94 additions and 21 deletions

View File

@ -20,6 +20,7 @@ import { ViewportService } from 'app/core/ui-services/viewport.service';
import { ViewItem } from '../../models/view-item'; import { ViewItem } from '../../models/view-item';
import { ProjectorElementBuildDeskriptor } from 'app/site/base/projectable'; import { ProjectorElementBuildDeskriptor } from 'app/site/base/projectable';
import { _ } from 'app/core/translate/translation-marker'; import { _ } from 'app/core/translate/translation-marker';
import { StorageService } from 'app/core/core-services/storage.service';
/** /**
* List view for the agenda. * List view for the agenda.
@ -90,8 +91,9 @@ export class AgendaListComponent extends ListViewBaseComponent<ViewItem, Item> i
titleService: Title, titleService: Title,
protected translate: TranslateService, // protected required for ng-translate-extract protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
storage: StorageService,
private operator: OperatorService, private operator: OperatorService,
private route: ActivatedRoute, protected route: ActivatedRoute,
private router: Router, private router: Router,
private repo: ItemRepositoryService, private repo: ItemRepositoryService,
private promptService: PromptService, private promptService: PromptService,
@ -104,7 +106,7 @@ export class AgendaListComponent extends ListViewBaseComponent<ViewItem, Item> i
private agendaPdfService: AgendaPdfService, private agendaPdfService: AgendaPdfService,
private pdfService: PdfDocumentService private pdfService: PdfDocumentService
) { ) {
super(titleService, translate, matSnackBar, filterService); super(titleService, translate, matSnackBar, route, storage, filterService);
// activate multiSelect mode for this listview // activate multiSelect mode for this listview
this.canMultiSelect = true; this.canMultiSelect = true;

View File

@ -10,6 +10,8 @@ import { AssignmentRepositoryService } from 'app/core/repositories/assignments/a
import { ListViewBaseComponent } from '../../base/list-view-base'; import { ListViewBaseComponent } from '../../base/list-view-base';
import { PromptService } from 'app/core/ui-services/prompt.service'; import { PromptService } from 'app/core/ui-services/prompt.service';
import { ViewAssignment } from '../models/view-assignment'; import { ViewAssignment } from '../models/view-assignment';
import { StorageService } from 'app/core/core-services/storage.service';
import { ActivatedRoute } from '@angular/router';
/** /**
* Listview for the assignments * Listview for the assignments
@ -33,6 +35,8 @@ export class AssignmentListComponent extends ListViewBaseComponent<ViewAssignmen
*/ */
public constructor( public constructor(
titleService: Title, titleService: Title,
storage: StorageService,
route: ActivatedRoute,
protected translate: TranslateService, // protected required for ng-translate-extract protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
public repo: AssignmentRepositoryService, public repo: AssignmentRepositoryService,
@ -40,7 +44,7 @@ export class AssignmentListComponent extends ListViewBaseComponent<ViewAssignmen
public filterService: AssignmentFilterListService, public filterService: AssignmentFilterListService,
public sortService: AssignmentSortListService public sortService: AssignmentSortListService
) { ) {
super(titleService, translate, matSnackBar, filterService, sortService); super(titleService, translate, matSnackBar, route, storage, filterService, sortService);
// activate multiSelect mode for this listview // activate multiSelect mode for this listview
this.canMultiSelect = true; this.canMultiSelect = true;
} }

View File

@ -1,15 +1,18 @@
import { MatTableDataSource, MatTable, MatSort, MatPaginator, MatSnackBar } from '@angular/material'; import { MatTableDataSource, MatTable, MatSort, MatPaginator, MatSnackBar, PageEvent } from '@angular/material';
import { Title } from '@angular/platform-browser'; import { Title } from '@angular/platform-browser';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { ViewChild } from '@angular/core'; import { ViewChild, Type, OnDestroy } from '@angular/core';
import { BaseViewComponent } from './base-view'; import { BaseViewComponent } from './base-view';
import { BaseViewModel } from './base-view-model'; import { BaseViewModel } from './base-view-model';
import { BaseSortListService } from 'app/core/ui-services/base-sort-list.service'; import { BaseSortListService } from 'app/core/ui-services/base-sort-list.service';
import { BaseFilterListService } from 'app/core/ui-services/base-filter-list.service'; import { BaseFilterListService } from 'app/core/ui-services/base-filter-list.service';
import { BaseModel } from 'app/shared/models/base/base-model'; import { BaseModel } from 'app/shared/models/base/base-model';
import { ActivatedRoute } from '@angular/router';
import { StorageService } from 'app/core/core-services/storage.service';
export abstract class ListViewBaseComponent<V extends BaseViewModel, M extends BaseModel> extends BaseViewComponent { export abstract class ListViewBaseComponent<V extends BaseViewModel, M extends BaseModel> extends BaseViewComponent
implements OnDestroy {
/** /**
* The data source for a table. Requires to be initialized with a BaseViewModel * The data source for a table. Requires to be initialized with a BaseViewModel
*/ */
@ -31,6 +34,17 @@ export abstract class ListViewBaseComponent<V extends BaseViewModel, M extends B
*/ */
public selectedRows: V[]; public selectedRows: V[];
/**
* Holds the key for the storage.
* This is by default the component's name.
*/
private storageKey: string;
/**
* Holds the value from local storage with the 'Paginator' key.
*/
private storageObject = {};
/** /**
* The table itself * The table itself
*/ */
@ -68,11 +82,18 @@ export abstract class ListViewBaseComponent<V extends BaseViewModel, M extends B
titleService: Title, titleService: Title,
translate: TranslateService, translate: TranslateService,
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
protected route: ActivatedRoute,
private storage: StorageService,
public filterService?: BaseFilterListService<M, V>, public filterService?: BaseFilterListService<M, V>,
public sortService?: BaseSortListService<V> public sortService?: BaseSortListService<V>
) { ) {
super(titleService, translate, matSnackBar); super(titleService, translate, matSnackBar);
this.selectedRows = []; this.selectedRows = [];
try {
this.storageKey = (<Type<any>>route.component).name;
} catch (e) {
this.storageKey = '';
}
} }
/** /**
@ -80,10 +101,12 @@ export abstract class ListViewBaseComponent<V extends BaseViewModel, M extends B
* Calling these three functions in the constructor of this class * Calling these three functions in the constructor of this class
* would be too early, resulting in non-paginated tables * would be too early, resulting in non-paginated tables
*/ */
public initTable(): void { public async initTable(): Promise<void> {
this.dataSource = new MatTableDataSource(); this.dataSource = new MatTableDataSource();
this.dataSource.paginator = this.paginator; this.dataSource.paginator = this.paginator;
// Set the initial page settings.
if (this.dataSource.paginator) { if (this.dataSource.paginator) {
this.initializePagination();
this.dataSource.paginator._intl.itemsPerPageLabel = this.translate.instant('items per page'); this.dataSource.paginator._intl.itemsPerPageLabel = this.translate.instant('items per page');
} }
if (this.filterService) { if (this.filterService) {
@ -144,6 +167,34 @@ export abstract class ListViewBaseComponent<V extends BaseViewModel, M extends B
this.dataSource.filter = event; this.dataSource.filter = event;
} }
/**
* Initialize the settings for the paginator in every list view.
*/
private async initializePagination(): Promise<void> {
// If the storage is not available - like in history mode - do nothing.
if (this.storage) {
this.storageObject = (await this.storage.get('Pagination')) || {};
// Set the number of items per page -- by default to 25.
this.paginator.pageSize = this.storageObject[this.storageKey] || 25;
// Subscription to page change events, like size, index.
this.subscriptions.push(
this.paginator.page.subscribe(async (event: PageEvent) => {
await this.setPageSettings(event.pageSize);
})
);
}
}
/**
* Function to set the new selected page size in the browser's local storage.
*
* @param size is the new page size.
*/
public async setPageSettings(size: number): Promise<void> {
this.storageObject[this.storageKey] = size;
await this.storage.set('Pagination', this.storageObject);
}
/** /**
* Default click action on selecting an item. In multiselect modus, * Default click action on selecting an item. In multiselect modus,
* this just adds/removes from a selection, else it performs a {@link singleSelectAction} * this just adds/removes from a selection, else it performs a {@link singleSelectAction}

View File

@ -51,7 +51,7 @@ export class HistoryListComponent extends ListViewBaseComponent<ViewHistory, His
private router: Router, private router: Router,
private operator: OperatorService private operator: OperatorService
) { ) {
super(titleService, translate, matSnackBar); super(titleService, translate, matSnackBar, null, null);
} }
/** /**

View File

@ -16,6 +16,7 @@ import { MediafileFilterListService } from '../../services/mediafile-filter.serv
import { MediafilesSortListService } from '../../services/mediafiles-sort-list.service'; import { MediafilesSortListService } from '../../services/mediafiles-sort-list.service';
import { ViewportService } from 'app/core/ui-services/viewport.service'; import { ViewportService } from 'app/core/ui-services/viewport.service';
import { OperatorService } from 'app/core/core-services/operator.service'; import { OperatorService } from 'app/core/core-services/operator.service';
import { StorageService } from 'app/core/core-services/storage.service';
/** /**
* Lists all the uploaded files. * Lists all the uploaded files.
@ -88,9 +89,10 @@ export class MediafileListComponent extends ListViewBaseComponent<ViewMediafile,
public constructor( public constructor(
titleService: Title, titleService: Title,
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
storage: StorageService,
protected translate: TranslateService, protected translate: TranslateService,
private router: Router, private router: Router,
private route: ActivatedRoute, protected route: ActivatedRoute,
private repo: MediafileRepositoryService, private repo: MediafileRepositoryService,
private mediaManage: MediaManageService, private mediaManage: MediaManageService,
private promptService: PromptService, private promptService: PromptService,
@ -99,7 +101,7 @@ export class MediafileListComponent extends ListViewBaseComponent<ViewMediafile,
public sortService: MediafilesSortListService, public sortService: MediafilesSortListService,
private operator: OperatorService private operator: OperatorService
) { ) {
super(titleService, translate, matSnackBar, filterService, sortService); super(titleService, translate, matSnackBar, route, storage, filterService, sortService);
// enables multiSelection for this listView // enables multiSelection for this listView
this.canMultiSelect = true; this.canMultiSelect = true;

View File

@ -14,6 +14,7 @@ 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 'app/site/motions/models/view-motion'; import { ViewMotion } from 'app/site/motions/models/view-motion';
import { ViewMotionBlock } from 'app/site/motions/models/view-motion-block'; import { ViewMotionBlock } from 'app/site/motions/models/view-motion-block';
import { StorageService } from 'app/core/core-services/storage.service';
/** /**
* Detail component to display one motion block * Detail component to display one motion block
@ -62,14 +63,15 @@ export class MotionBlockDetailComponent extends ListViewBaseComponent<ViewMotion
titleService: Title, titleService: Title,
protected translate: TranslateService, protected translate: TranslateService,
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
storage: StorageService,
private operator: OperatorService, private operator: OperatorService,
private router: Router, private router: Router,
private route: ActivatedRoute, protected route: ActivatedRoute,
private repo: MotionBlockRepositoryService, private repo: MotionBlockRepositoryService,
private motionRepo: MotionRepositoryService, private motionRepo: MotionRepositoryService,
private promptService: PromptService private promptService: PromptService
) { ) {
super(titleService, translate, matSnackBar); super(titleService, translate, matSnackBar, route, storage);
} }
/** /**

View File

@ -16,6 +16,7 @@ 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 'app/site/motions/models/view-motion-block'; import { ViewMotionBlock } from 'app/site/motions/models/view-motion-block';
import { StorageService } from 'app/core/core-services/storage.service';
/** /**
* Table for the motion blocks * Table for the motion blocks
@ -80,8 +81,9 @@ export class MotionBlockListComponent extends ListViewBaseComponent<ViewMotionBl
titleService: Title, titleService: Title,
translate: TranslateService, translate: TranslateService,
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
storage: StorageService,
private router: Router, private router: Router,
private route: ActivatedRoute, protected route: ActivatedRoute,
private repo: MotionBlockRepositoryService, private repo: MotionBlockRepositoryService,
private agendaRepo: ItemRepositoryService, private agendaRepo: ItemRepositoryService,
private formBuilder: FormBuilder, private formBuilder: FormBuilder,
@ -89,7 +91,7 @@ export class MotionBlockListComponent extends ListViewBaseComponent<ViewMotionBl
private itemRepo: ItemRepositoryService, private itemRepo: ItemRepositoryService,
private operator: OperatorService private operator: OperatorService
) { ) {
super(titleService, translate, matSnackBar); super(titleService, translate, matSnackBar, route, storage);
this.createBlockForm = this.formBuilder.group({ this.createBlockForm = this.formBuilder.group({
title: ['', Validators.required], title: ['', Validators.required],

View File

@ -28,6 +28,7 @@ import { MotionCsvExportService } from 'app/site/motions/services/motion-csv-exp
import { MotionPdfExportService } from 'app/site/motions/services/motion-pdf-export.service'; import { MotionPdfExportService } from 'app/site/motions/services/motion-pdf-export.service';
import { MotionMultiselectService } from 'app/site/motions/services/motion-multiselect.service'; import { MotionMultiselectService } from 'app/site/motions/services/motion-multiselect.service';
import { LocalPermissionsService } from 'app/site/motions/services/local-permissions.service'; import { LocalPermissionsService } from 'app/site/motions/services/local-permissions.service';
import { StorageService } from 'app/core/core-services/storage.service';
/** /**
* Component that displays all the motions in a Table using DataSource. * Component that displays all the motions in a Table using DataSource.
@ -90,8 +91,9 @@ export class MotionListComponent extends ListViewBaseComponent<ViewMotion, Motio
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
sortService: MotionSortListService, sortService: MotionSortListService,
filterService: MotionFilterListService, filterService: MotionFilterListService,
storage: StorageService,
private router: Router, private router: Router,
private route: ActivatedRoute, protected route: ActivatedRoute,
private configService: ConfigService, private configService: ConfigService,
private tagRepo: TagRepositoryService, private tagRepo: TagRepositoryService,
private motionBlockRepo: MotionBlockRepositoryService, private motionBlockRepo: MotionBlockRepositoryService,
@ -106,7 +108,7 @@ export class MotionListComponent extends ListViewBaseComponent<ViewMotion, Motio
public multiselectService: MotionMultiselectService, public multiselectService: MotionMultiselectService,
public perms: LocalPermissionsService public perms: LocalPermissionsService
) { ) {
super(titleService, translate, matSnackBar, filterService, sortService); super(titleService, translate, matSnackBar, route, storage, filterService, sortService);
// enable multiSelect for this listView // enable multiSelect for this listView
this.canMultiSelect = true; this.canMultiSelect = true;

View File

@ -10,6 +10,7 @@ import { Router, ActivatedRoute } from '@angular/router';
import { ViewWorkflow } from 'app/site/motions/models/view-workflow'; 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 { Workflow } from 'app/shared/models/motions/workflow'; import { Workflow } from 'app/shared/models/motions/workflow';
import { StorageService } from 'app/core/core-services/storage.service';
/** /**
* List view for workflows * List view for workflows
@ -45,14 +46,15 @@ export class WorkflowListComponent extends ListViewBaseComponent<ViewWorkflow, W
public constructor( public constructor(
titleService: Title, titleService: Title,
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
storage: StorageService,
protected translate: TranslateService, protected translate: TranslateService,
private dialog: MatDialog, private dialog: MatDialog,
private router: Router, private router: Router,
private route: ActivatedRoute, protected route: ActivatedRoute,
private workflowRepo: WorkflowRepositoryService, private workflowRepo: WorkflowRepositoryService,
private promptService: PromptService private promptService: PromptService
) { ) {
super(titleService, translate, matSnackBar); super(titleService, translate, matSnackBar, route, storage);
} }
/** /**

View File

@ -8,6 +8,8 @@ import { ViewTag } from '../../models/view-tag';
import { FormGroup, FormControl, Validators } from '@angular/forms'; import { FormGroup, FormControl, Validators } from '@angular/forms';
import { PromptService } from 'app/core/ui-services/prompt.service'; import { PromptService } from 'app/core/ui-services/prompt.service';
import { MatSnackBar } from '@angular/material'; import { MatSnackBar } from '@angular/material';
import { StorageService } from 'app/core/core-services/storage.service';
import { ActivatedRoute } from '@angular/router';
/** /**
* Listview for the complete lsit of available Tags * Listview for the complete lsit of available Tags
@ -41,10 +43,12 @@ export class TagListComponent extends ListViewBaseComponent<ViewTag, Tag> implem
titleService: Title, titleService: Title,
protected translate: TranslateService, // protected required for ng-translate-extract protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
storage: StorageService,
route: ActivatedRoute,
private repo: TagRepositoryService, private repo: TagRepositoryService,
private promptService: PromptService private promptService: PromptService
) { ) {
super(titleService, translate, matSnackBar); super(titleService, translate, matSnackBar, route, storage);
} }
/** /**

View File

@ -20,6 +20,7 @@ import { ViewUser } from '../../models/view-user';
import { ViewGroup } from '../../models/view-group'; import { ViewGroup } from '../../models/view-group';
import { genders, User } from 'app/shared/models/users/user'; import { genders, User } from 'app/shared/models/users/user';
import { _ } from 'app/core/translate/translation-marker'; import { _ } from 'app/core/translate/translation-marker';
import { StorageService } from 'app/core/core-services/storage.service';
/** /**
* Interface for the short editing dialog. * Interface for the short editing dialog.
@ -133,11 +134,12 @@ export class UserListComponent extends ListViewBaseComponent<ViewUser, User> imp
titleService: Title, titleService: Title,
protected translate: TranslateService, // protected required for ng-translate-extract protected translate: TranslateService, // protected required for ng-translate-extract
matSnackBar: MatSnackBar, matSnackBar: MatSnackBar,
storage: StorageService,
private repo: UserRepositoryService, private repo: UserRepositoryService,
private groupRepo: GroupRepositoryService, private groupRepo: GroupRepositoryService,
private choiceService: ChoiceService, private choiceService: ChoiceService,
private router: Router, private router: Router,
private route: ActivatedRoute, protected route: ActivatedRoute,
private operator: OperatorService, private operator: OperatorService,
private vp: ViewportService, private vp: ViewportService,
protected csvExport: CsvExportService, protected csvExport: CsvExportService,
@ -148,7 +150,7 @@ export class UserListComponent extends ListViewBaseComponent<ViewUser, User> imp
private userPdf: UserPdfExportService, private userPdf: UserPdfExportService,
private dialog: MatDialog private dialog: MatDialog
) { ) {
super(titleService, translate, matSnackBar, filterService, sortService); super(titleService, translate, matSnackBar, route, storage, filterService, sortService);
// enable multiSelect for this listView // enable multiSelect for this listView
this.canMultiSelect = true; this.canMultiSelect = true;