Merge pull request #4925 from FinnStutzenstein/errorhandling

Added missing error handling
This commit is contained in:
Sean 2019-08-19 14:31:50 +02:00 committed by GitHub
commit bbe294a1ad
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 99 additions and 83 deletions

View File

@ -422,7 +422,7 @@ export class MotionRepositoryService extends BaseIsAgendaItemAndListOfSpeakersCo
} }
] ]
}; };
this.httpService.post('/rest/motions/motion/manage_multiple_submitters/', requestData); await this.httpService.post('/rest/motions/motion/manage_multiple_submitters/', requestData);
} }
/** /**

View File

@ -58,7 +58,7 @@ export class PersonalNoteService {
} }
pnObject.notes[model.collectionString][model.id] = content; pnObject.notes[model.collectionString][model.id] = content;
this.savePersonalNoteObject(pnObject); await this.savePersonalNoteObject(pnObject);
} }
/** /**

View File

@ -200,7 +200,7 @@ export class AgendaListComponent extends BaseListViewComponent<ViewItem> impleme
} else { } else {
result.duration = 0; result.duration = 0;
} }
this.repo.update(result, item); this.repo.update(result, item).catch(this.raiseError);
} }
}); });
} }
@ -262,12 +262,16 @@ export class AgendaListComponent extends BaseListViewComponent<ViewItem> impleme
const title = this.translate.instant('Are you sure you want to remove all selected items from the agenda?'); const title = this.translate.instant('Are you sure you want to remove all selected items from the agenda?');
const content = this.translate.instant("All topics will be deleted and won't be accessible afterwards."); const content = this.translate.instant("All topics will be deleted and won't be accessible afterwards.");
if (await this.promptService.open(title, content)) { if (await this.promptService.open(title, content)) {
for (const item of this.selectedRows) { try {
if (item.contentObject instanceof ViewTopic) { for (const item of this.selectedRows) {
await this.topicRepo.delete(item.contentObject); if (item.contentObject instanceof ViewTopic) {
} else { await this.topicRepo.delete(item.contentObject);
await this.repo.removeFromAgenda(item); } else {
await this.repo.removeFromAgenda(item);
}
} }
} catch (e) {
this.raiseError(e);
} }
} }
} }
@ -279,8 +283,12 @@ export class AgendaListComponent extends BaseListViewComponent<ViewItem> impleme
* @param closed true if the item is to be considered done * @param closed true if the item is to be considered done
*/ */
public async setClosedSelected(closed: boolean): Promise<void> { public async setClosedSelected(closed: boolean): Promise<void> {
for (const item of this.selectedRows) { try {
await this.repo.update({ closed: closed }, item); for (const item of this.selectedRows) {
await this.repo.update({ closed: closed }, item);
}
} catch (e) {
this.raiseError(e);
} }
} }
@ -291,8 +299,12 @@ export class AgendaListComponent extends BaseListViewComponent<ViewItem> impleme
* @param visible true if the item is to be shown * @param visible true if the item is to be shown
*/ */
public async setAgendaType(agendaType: number): Promise<void> { public async setAgendaType(agendaType: number): Promise<void> {
for (const item of this.selectedRows) { try {
await this.repo.update({ type: agendaType }, item).then(null, this.raiseError); for (const item of this.selectedRows) {
await this.repo.update({ type: agendaType }, item).then(null, this.raiseError);
}
} catch (e) {
this.raiseError(e);
} }
} }

View File

@ -261,10 +261,18 @@ export class HistoryListComponent extends BaseViewComponent implements OnInit {
* Sets the data source to the requested element id. * Sets the data source to the requested element id.
*/ */
private async queryByElementId(elementId: string): Promise<void> { private async queryByElementId(elementId: string): Promise<void> {
const historyData = await this.http.get<History[]>(`${environment.urlPrefix}/core/history/information/`, null, { try {
type: 'element', const historyData = await this.http.get<History[]>(
value: elementId `${environment.urlPrefix}/core/history/information/`,
}); null,
this.dataSource.data = historyData.map(data => new History(data)); {
type: 'element',
value: elementId
}
);
this.dataSource.data = historyData.map(data => new History(data));
} catch (e) {
this.raiseError(e);
}
} }
} }

View File

@ -1304,10 +1304,9 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit,
*/ */
public setCategory(id: number): void { public setCategory(id: number): void {
if (id === this.motion.category_id) { if (id === this.motion.category_id) {
this.repo.setCatetory(this.motion, null); id = null;
} else {
this.repo.setCatetory(this.motion, id);
} }
this.repo.setCatetory(this.motion, id).catch(this.raiseError);
} }
/** /**
@ -1317,7 +1316,7 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit,
*/ */
public setTag(event: MouseEvent, id: number): void { public setTag(event: MouseEvent, id: number): void {
event.stopPropagation(); event.stopPropagation();
this.repo.setTag(this.motion, id); this.repo.setTag(this.motion, id).catch(this.raiseError);
} }
/** /**
@ -1327,10 +1326,9 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit,
*/ */
public setBlock(id: number): void { public setBlock(id: number): void {
if (id === this.motion.motion_block_id) { if (id === this.motion.motion_block_id) {
this.repo.setBlock(this.motion, null); id = null;
} else {
this.repo.setBlock(this.motion, id);
} }
this.repo.setBlock(this.motion, id).catch(this.raiseError);
} }
/** /**
@ -1373,8 +1371,8 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit,
/** /**
* Handler for creating a poll * Handler for creating a poll
*/ */
public async createPoll(): Promise<void> { public createPoll(): void {
await this.repo.createPoll(this.motion); this.repo.createPoll(this.motion).catch(this.raiseError);
} }
/** /**

View File

@ -1,5 +1,7 @@
import { Component, Input, OnInit } from '@angular/core'; import { Component, Input, OnInit } from '@angular/core';
import { MatSnackBar } from '@angular/material';
import { MatDialog } from '@angular/material/dialog'; import { MatDialog } from '@angular/material/dialog';
import { Title } from '@angular/platform-browser';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
@ -9,6 +11,7 @@ import { CalculablePollKey } from 'app/core/ui-services/poll.service';
import { PromptService } from 'app/core/ui-services/prompt.service'; import { PromptService } from 'app/core/ui-services/prompt.service';
import { MotionPoll } from 'app/shared/models/motions/motion-poll'; import { MotionPoll } from 'app/shared/models/motions/motion-poll';
import { infoDialogSettings } from 'app/shared/utils/dialog-settings'; import { infoDialogSettings } from 'app/shared/utils/dialog-settings';
import { BaseViewComponent } from 'app/site/base/base-view';
import { LocalPermissionsService } from 'app/site/motions/services/local-permissions.service'; import { LocalPermissionsService } from 'app/site/motions/services/local-permissions.service';
import { MotionPollPdfService } from 'app/site/motions/services/motion-poll-pdf.service'; import { MotionPollPdfService } from 'app/site/motions/services/motion-poll-pdf.service';
import { MotionPollService } from 'app/site/motions/services/motion-poll.service'; import { MotionPollService } from 'app/site/motions/services/motion-poll.service';
@ -22,7 +25,7 @@ import { MotionPollDialogComponent } from './motion-poll-dialog.component';
templateUrl: './motion-poll.component.html', templateUrl: './motion-poll.component.html',
styleUrls: ['./motion-poll.component.scss'] styleUrls: ['./motion-poll.component.scss']
}) })
export class MotionPollComponent implements OnInit { export class MotionPollComponent extends BaseViewComponent implements OnInit {
/** /**
* A representation of all values of the current poll. * A representation of all values of the current poll.
*/ */
@ -77,24 +80,29 @@ export class MotionPollComponent implements OnInit {
/** /**
* Constructor. Subscribes to the constants and settings for motion polls * Constructor. Subscribes to the constants and settings for motion polls
* *
* @param title
* @param translate TranslateService
* @param matSnackbar
* @param dialog Dialog Service for entering poll data * @param dialog Dialog Service for entering poll data
* @param pollService MotionPollService * @param pollService MotionPollService
* @param motionRepo Subscribing to the motion to update poll from the server * @param motionRepo Subscribing to the motion to update poll from the server
* @param constants ConstantsService * @param constants ConstantsService
* @param config ConfigService * @param config ConfigService
* @param translate TranslateService
* @param perms LocalPermissionService * @param perms LocalPermissionService
*/ */
public constructor( public constructor(
title: Title,
translate: TranslateService,
matSnackBar: MatSnackBar,
public dialog: MatDialog, public dialog: MatDialog,
public pollService: MotionPollService, public pollService: MotionPollService,
private motionRepo: MotionRepositoryService, private motionRepo: MotionRepositoryService,
private constants: ConstantsService, private constants: ConstantsService,
private translate: TranslateService,
private promptService: PromptService, private promptService: PromptService,
public perms: LocalPermissionsService, public perms: LocalPermissionsService,
private pdfService: MotionPollPdfService private pdfService: MotionPollPdfService
) { ) {
super(title, translate, matSnackBar);
this.pollValues = this.pollService.pollValues; this.pollValues = this.pollService.pollValues;
this.majorityChoice = this.pollService.defaultMajorityMethod; this.majorityChoice = this.pollService.defaultMajorityMethod;
this.subscribeMajorityChoices(); this.subscribeMajorityChoices();
@ -121,7 +129,7 @@ export class MotionPollComponent implements OnInit {
public async deletePoll(): Promise<void> { public async deletePoll(): Promise<void> {
const title = this.translate.instant('Are you sure you want to delete this vote?'); const title = this.translate.instant('Are you sure you want to delete this vote?');
if (await this.promptService.open(title)) { if (await this.promptService.open(title)) {
this.motionRepo.deletePoll(this.poll); this.motionRepo.deletePoll(this.poll).catch(this.raiseError);
} }
} }
@ -189,8 +197,7 @@ export class MotionPollComponent implements OnInit {
}); });
dialogRef.afterClosed().subscribe(result => { dialogRef.afterClosed().subscribe(result => {
if (result) { if (result) {
this.motionRepo.updatePoll(result); this.motionRepo.updatePoll(result).catch(this.raiseError);
// TODO error handling
} }
}); });
} }

View File

@ -1,12 +1,13 @@
import { Component, Input } from '@angular/core'; import { Component, Input } from '@angular/core';
import { FormBuilder, FormGroup } from '@angular/forms'; import { FormBuilder, FormGroup } from '@angular/forms';
import { MatSnackBar } from '@angular/material';
import { DomSanitizer, SafeHtml, Title } from '@angular/platform-browser'; import { DomSanitizer, SafeHtml, Title } from '@angular/platform-browser';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { BaseComponent } from 'app/base.component';
import { PersonalNoteService } from 'app/core/ui-services/personal-note.service'; import { PersonalNoteService } from 'app/core/ui-services/personal-note.service';
import { PersonalNoteContent } from 'app/shared/models/users/personal-note'; import { PersonalNoteContent } from 'app/shared/models/users/personal-note';
import { BaseViewComponent } from 'app/site/base/base-view';
import { ViewMotion } from 'app/site/motions/models/view-motion'; import { ViewMotion } from 'app/site/motions/models/view-motion';
import { MotionPdfExportService } from 'app/site/motions/services/motion-pdf-export.service'; import { MotionPdfExportService } from 'app/site/motions/services/motion-pdf-export.service';
@ -18,7 +19,7 @@ import { MotionPdfExportService } from 'app/site/motions/services/motion-pdf-exp
templateUrl: './personal-note.component.html', templateUrl: './personal-note.component.html',
styleUrls: ['./personal-note.component.scss'] styleUrls: ['./personal-note.component.scss']
}) })
export class PersonalNoteComponent extends BaseComponent { export class PersonalNoteComponent extends BaseViewComponent {
/** /**
* The motion, which the personal note belong to. * The motion, which the personal note belong to.
*/ */
@ -50,12 +51,13 @@ export class PersonalNoteComponent extends BaseComponent {
public constructor( public constructor(
title: Title, title: Title,
translate: TranslateService, translate: TranslateService,
matSnackBar: MatSnackBar,
private personalNoteService: PersonalNoteService, private personalNoteService: PersonalNoteService,
formBuilder: FormBuilder, formBuilder: FormBuilder,
private pdfService: MotionPdfExportService, private pdfService: MotionPdfExportService,
private sanitizer: DomSanitizer private sanitizer: DomSanitizer
) { ) {
super(title, translate); super(title, translate, matSnackBar);
this.personalNoteForm = formBuilder.group({ this.personalNoteForm = formBuilder.group({
note: [''] note: ['']
}); });
@ -90,7 +92,7 @@ export class PersonalNoteComponent extends BaseComponent {
await this.personalNoteService.savePersonalNote(this.motion.motion, content); await this.personalNoteService.savePersonalNote(this.motion.motion, content);
this.isEditMode = false; this.isEditMode = false;
} catch (e) { } catch (e) {
console.log(e); this.raiseError(e);
} }
} }

View File

@ -381,7 +381,7 @@
mat-menu-item mat-menu-item
class="red-warning-text" class="red-warning-text"
[disabled]="!selectedRows.length" [disabled]="!selectedRows.length"
(click)="multiselectService.delete(selectedRows); toggleMultiSelect()" (click)="multiselectWrapper(multiselectService.delete(selectedRows)); toggleMultiSelect()"
> >
<mat-icon>delete</mat-icon> <mat-icon>delete</mat-icon>
<span translate>Delete</span> <span translate>Delete</span>

View File

@ -15,6 +15,7 @@ import { WorkflowRepositoryService } from 'app/core/repositories/motions/workflo
import { TagRepositoryService } from 'app/core/repositories/tags/tag-repository.service'; import { TagRepositoryService } from 'app/core/repositories/tags/tag-repository.service';
import { OsFilterOptionCondition } from 'app/core/ui-services/base-filter-list.service'; import { OsFilterOptionCondition } from 'app/core/ui-services/base-filter-list.service';
import { ConfigService } from 'app/core/ui-services/config.service'; import { ConfigService } from 'app/core/ui-services/config.service';
import { SpinnerService } from 'app/core/ui-services/spinner.service';
import { ColumnRestriction } from 'app/shared/components/list-view-table/list-view-table.component'; import { ColumnRestriction } from 'app/shared/components/list-view-table/list-view-table.component';
import { infoDialogSettings, largeDialogSettings } from 'app/shared/utils/dialog-settings'; import { infoDialogSettings, largeDialogSettings } from 'app/shared/utils/dialog-settings';
import { BaseListViewComponent } from 'app/site/base/base-list-view'; import { BaseListViewComponent } from 'app/site/base/base-list-view';
@ -204,7 +205,8 @@ export class MotionListComponent extends BaseListViewComponent<ViewMotion> imple
private dialog: MatDialog, private dialog: MatDialog,
public multiselectService: MotionMultiselectService, public multiselectService: MotionMultiselectService,
public perms: LocalPermissionsService, public perms: LocalPermissionsService,
private motionExport: MotionExportService private motionExport: MotionExportService,
private spinnerService: SpinnerService
) { ) {
super(titleService, translate, matSnackBar, storage); super(titleService, translate, matSnackBar, storage);
this.canMultiSelect = true; this.canMultiSelect = true;
@ -369,6 +371,8 @@ export class MotionListComponent extends BaseListViewComponent<ViewMotion> imple
await multiselectPromise; await multiselectPromise;
} catch (e) { } catch (e) {
this.raiseError(e); this.raiseError(e);
} finally {
this.spinnerService.setVisibility(false);
} }
} }

View File

@ -119,11 +119,7 @@ export class MotionMultiselectService {
if (selectedChoice) { if (selectedChoice) {
const message = `${motions.length} ` + this.translate.instant(this.messageForSpinner); const message = `${motions.length} ` + this.translate.instant(this.messageForSpinner);
this.spinnerService.setVisibility(true, message); this.spinnerService.setVisibility(true, message);
await this.repo.setMultiState(motions, selectedChoice.items as number).catch(error => { await this.repo.setMultiState(motions, selectedChoice.items as number);
this.spinnerService.setVisibility(false);
throw error;
});
this.spinnerService.setVisibility(false);
} }
} }
@ -151,15 +147,9 @@ export class MotionMultiselectService {
const message = `${motions.length} ` + this.translate.instant(this.messageForSpinner); const message = `${motions.length} ` + this.translate.instant(this.messageForSpinner);
this.spinnerService.setVisibility(true, message); this.spinnerService.setVisibility(true, message);
await this.httpService await this.httpService.post('/rest/motions/motion/manage_multiple_recommendation/', {
.post('/rest/motions/motion/manage_multiple_recommendation/', { motions: requestData
motions: requestData });
})
.catch(error => {
this.spinnerService.setVisibility(false);
throw error;
});
this.spinnerService.setVisibility(false);
} }
} }
@ -181,11 +171,7 @@ export class MotionMultiselectService {
if (selectedChoice) { if (selectedChoice) {
const message = this.translate.instant(this.messageForSpinner); const message = this.translate.instant(this.messageForSpinner);
this.spinnerService.setVisibility(true, message); this.spinnerService.setVisibility(true, message);
await this.repo.setMultiCategory(motions, selectedChoice.items as number).catch(error => { await this.repo.setMultiCategory(motions, selectedChoice.items as number);
this.spinnerService.setVisibility(false);
throw error;
});
this.spinnerService.setVisibility(false);
} }
} }
@ -226,7 +212,6 @@ export class MotionMultiselectService {
const message = `${motions.length} ` + this.translate.instant(this.messageForSpinner); const message = `${motions.length} ` + this.translate.instant(this.messageForSpinner);
this.spinnerService.setVisibility(true, message); this.spinnerService.setVisibility(true, message);
await this.httpService.post('/rest/motions/motion/manage_multiple_submitters/', { motions: requestData }); await this.httpService.post('/rest/motions/motion/manage_multiple_submitters/', { motions: requestData });
this.spinnerService.setVisibility(false);
} }
} }
@ -277,7 +262,6 @@ export class MotionMultiselectService {
const message = `${motions.length} ` + this.translate.instant(this.messageForSpinner); const message = `${motions.length} ` + this.translate.instant(this.messageForSpinner);
this.spinnerService.setVisibility(true, message); this.spinnerService.setVisibility(true, message);
await this.httpService.post('/rest/motions/motion/manage_multiple_tags/', { motions: requestData }); await this.httpService.post('/rest/motions/motion/manage_multiple_tags/', { motions: requestData });
this.spinnerService.setVisibility(false);
} }
} }
@ -300,11 +284,7 @@ export class MotionMultiselectService {
const message = this.translate.instant(this.messageForSpinner); const message = this.translate.instant(this.messageForSpinner);
this.spinnerService.setVisibility(true, message); this.spinnerService.setVisibility(true, message);
const blockId = selectedChoice.action ? null : (selectedChoice.items as number); const blockId = selectedChoice.action ? null : (selectedChoice.items as number);
await this.repo.setMultiMotionBlock(motions, blockId).catch(error => { await this.repo.setMultiMotionBlock(motions, blockId);
this.spinnerService.setVisibility(false);
throw error;
});
this.spinnerService.setVisibility(false);
} }
} }
@ -338,7 +318,7 @@ export class MotionMultiselectService {
itemsToMove, itemsToMove,
selectedChoice.items as number selectedChoice.items as number
); );
this.repo.sortMotions(this.treeService.stripTree(sortedChildTree)); await this.repo.sortMotions(this.treeService.stripTree(sortedChildTree));
} else if (selectedChoice.action === options[1]) { } else if (selectedChoice.action === options[1]) {
const sortedSiblingTree = this.treeService.insertBranchesIntoTree( const sortedSiblingTree = this.treeService.insertBranchesIntoTree(
partialTree, partialTree,
@ -346,7 +326,7 @@ export class MotionMultiselectService {
this.repo.getViewModel(selectedChoice.items as number).parent_id, this.repo.getViewModel(selectedChoice.items as number).parent_id,
selectedChoice.items as number selectedChoice.items as number
); );
this.repo.sortMotions(this.treeService.stripTree(sortedSiblingTree)); await this.repo.sortMotions(this.treeService.stripTree(sortedSiblingTree));
} }
} }
} }
@ -369,7 +349,6 @@ export class MotionMultiselectService {
const star = (selectedChoice.items as number) === choices[0].id; const star = (selectedChoice.items as number) === choices[0].id;
this.spinnerService.setVisibility(true, message); this.spinnerService.setVisibility(true, message);
await this.personalNoteService.bulkSetStar(motions, star); await this.personalNoteService.bulkSetStar(motions, star);
this.spinnerService.setVisibility(false);
} }
} }
} }

View File

@ -114,15 +114,19 @@ export class TopicDetailComponent extends BaseViewComponent {
return; return;
} }
if (this.newTopic) { try {
if (!this.topicForm.value.agenda_parent_id) { if (this.newTopic) {
delete this.topicForm.value.agenda_parent_id; if (!this.topicForm.value.agenda_parent_id) {
delete this.topicForm.value.agenda_parent_id;
}
await this.repo.create(new CreateTopic(this.topicForm.value));
this.router.navigate([`/agenda/`]);
} else {
await this.repo.update(this.topicForm.value, this.topic);
this.setEditMode(false);
} }
await this.repo.create(new CreateTopic(this.topicForm.value)); } catch (e) {
this.router.navigate([`/agenda/`]); this.raiseError(e);
} else {
this.setEditMode(false);
await this.repo.update(this.topicForm.value, this.topic);
} }
} }

View File

@ -283,7 +283,7 @@ export class UserListComponent extends BaseListViewComponent<ViewUser> implement
public async deleteSelected(): Promise<void> { public async deleteSelected(): Promise<void> {
const title = this.translate.instant('Are you sure you want to delete all selected participants?'); const title = this.translate.instant('Are you sure you want to delete all selected participants?');
if (await this.promptService.open(title)) { if (await this.promptService.open(title)) {
await this.repo.bulkDelete(this.selectedRows); this.repo.bulkDelete(this.selectedRows).catch(this.raiseError);
} }
} }
@ -299,7 +299,9 @@ export class UserListComponent extends BaseListViewComponent<ViewUser> implement
const selectedChoice = await this.choiceService.open(content, this.groupRepo.getViewModelList(), true, choices); const selectedChoice = await this.choiceService.open(content, this.groupRepo.getViewModelList(), true, choices);
if (selectedChoice) { if (selectedChoice) {
const action = selectedChoice.action === choices[0] ? 'add' : 'remove'; const action = selectedChoice.action === choices[0] ? 'add' : 'remove';
await this.repo.bulkAlterGroups(this.selectedRows, action, selectedChoice.items as number[]); this.repo
.bulkAlterGroups(this.selectedRows, action, selectedChoice.items as number[])
.catch(this.raiseError);
} }
} }
@ -329,7 +331,7 @@ export class UserListComponent extends BaseListViewComponent<ViewUser> implement
const selectedChoice = await this.choiceService.open(content, null, false, options); const selectedChoice = await this.choiceService.open(content, null, false, options);
if (selectedChoice) { if (selectedChoice) {
const value = selectedChoice.action === options[0]; const value = selectedChoice.action === options[0];
await this.repo.bulkSetState(this.selectedRows, field, value); this.repo.bulkSetState(this.selectedRows, field, value).catch(this.raiseError);
} }
} }
@ -341,7 +343,7 @@ export class UserListComponent extends BaseListViewComponent<ViewUser> implement
const title = this.translate.instant('Are you sure you want to send emails to all selected participants?'); const title = this.translate.instant('Are you sure you want to send emails to all selected participants?');
const content = this.selectedRows.length + ' ' + this.translate.instant('emails'); const content = this.selectedRows.length + ' ' + this.translate.instant('emails');
if (await this.promptService.open(title, content)) { if (await this.promptService.open(title, content)) {
await this.repo.bulkSendInvitationEmail(this.selectedRows); this.repo.bulkSendInvitationEmail(this.selectedRows).catch(this.raiseError);
} }
} }
@ -374,7 +376,7 @@ export class UserListComponent extends BaseListViewComponent<ViewUser> implement
) )
); );
} }
this.repo.bulkResetPasswordsToDefault(this.selectedRows).then(null, this.raiseError); this.repo.bulkResetPasswordsToDefault(this.selectedRows).catch(this.raiseError);
} }
/** /**
@ -398,7 +400,7 @@ export class UserListComponent extends BaseListViewComponent<ViewUser> implement
) )
); );
} }
this.repo.bulkGenerateNewPasswords(this.selectedRows).then(null, this.raiseError); this.repo.bulkGenerateNewPasswords(this.selectedRows).catch(this.raiseError);
} }
/** /**
@ -407,8 +409,8 @@ export class UserListComponent extends BaseListViewComponent<ViewUser> implement
* @param viewUser the viewUser Object * @param viewUser the viewUser Object
* @param event the mouse event (to prevent propagaton to row triggers) * @param event the mouse event (to prevent propagaton to row triggers)
*/ */
public async setPresent(viewUser: ViewUser): Promise<void> { public setPresent(viewUser: ViewUser): void {
viewUser.user.is_present = !viewUser.user.is_present; viewUser.user.is_present = !viewUser.user.is_present;
await this.repo.update(viewUser.user, viewUser); this.repo.update(viewUser.user, viewUser).catch(this.raiseError);
} }
} }