Merge pull request #4634 from MaximilianKrambach/lastEmailSent
last_email_sent display and resend email
This commit is contained in:
commit
652968add3
@ -339,4 +339,18 @@ export class UserRepositoryService extends BaseRepository<ViewUser, User> {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the date of the last invitation email.
|
||||||
|
*
|
||||||
|
* @param user
|
||||||
|
* @returns a localized string representation of the date/time the last email was sent;
|
||||||
|
* or an empty string
|
||||||
|
*/
|
||||||
|
public lastSentEmailTimeString(user: ViewUser): string {
|
||||||
|
if (!user.user || !user.user.last_email_send) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
return new Date(user.user.last_email_send).toLocaleString(this.translate.currentLang);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,7 @@ export class User extends BaseModel<User> {
|
|||||||
public is_present: boolean;
|
public is_present: boolean;
|
||||||
public is_committee: boolean;
|
public is_committee: boolean;
|
||||||
public email: string;
|
public email: string;
|
||||||
public last_email_send?: string;
|
public last_email_send?: string; // ISO datetime string
|
||||||
public comment: string;
|
public comment: string;
|
||||||
public is_active: boolean;
|
public is_active: boolean;
|
||||||
public default_password: string;
|
public default_password: string;
|
||||||
|
@ -31,11 +31,17 @@
|
|||||||
<mat-icon>security</mat-icon>
|
<mat-icon>security</mat-icon>
|
||||||
<span translate>Change password</span>
|
<span translate>Change password</span>
|
||||||
</button>
|
</button>
|
||||||
|
<!-- invitation email -->
|
||||||
|
<button mat-menu-item *ngIf="isAllowed('manage')" (click)="sendInvitationEmail()">
|
||||||
|
<mat-icon>mail</mat-icon>
|
||||||
|
<span translate>Send invitation email</span>
|
||||||
|
</button>
|
||||||
<!-- PDF -->
|
<!-- PDF -->
|
||||||
<button mat-menu-item *ngIf="isAllowed('manage')" (click)="onDownloadPdf()">
|
<button mat-menu-item *ngIf="isAllowed('manage')" (click)="onDownloadPdf()">
|
||||||
<mat-icon>picture_as_pdf</mat-icon>
|
<mat-icon>picture_as_pdf</mat-icon>
|
||||||
<span translate>PDF</span>
|
<span translate>PDF</span>
|
||||||
</button>
|
</button>
|
||||||
|
<!-- delete button -->
|
||||||
<div *ngIf="isAllowed('delete')">
|
<div *ngIf="isAllowed('delete')">
|
||||||
<mat-divider></mat-divider>
|
<mat-divider></mat-divider>
|
||||||
<button mat-menu-item class="red-warning-text" (click)="deleteUserButton()">
|
<button mat-menu-item class="red-warning-text" (click)="deleteUserButton()">
|
||||||
@ -315,4 +321,13 @@
|
|||||||
<span>{{ user.comment }}</span>
|
<span>{{ user.comment }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div *ngIf="isAllowed('seePersonal') && user.is_last_email_send">
|
||||||
|
<div>
|
||||||
|
<h4 translate>
|
||||||
|
Last email sent
|
||||||
|
</h4>
|
||||||
|
<span>{{ getEmailSentTime() }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
@ -430,4 +430,27 @@ export class UserDetailComponent extends BaseViewComponent implements OnInit {
|
|||||||
public sanitizedText(text: string): SafeHtml {
|
public sanitizedText(text: string): SafeHtml {
|
||||||
return this.sanitizer.bypassSecurityTrustHtml(text);
|
return this.sanitizer.bypassSecurityTrustHtml(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* (Re)- send an invitation email for this user after confirmation
|
||||||
|
*/
|
||||||
|
public async sendInvitationEmail(): Promise<void> {
|
||||||
|
const title = this.translate.instant('Sending an invitation email');
|
||||||
|
const content = this.translate.instant('Are you sure you want to send an invitation email to the user?');
|
||||||
|
if (await this.promptService.open(title, content)) {
|
||||||
|
this.repo.sendInvitationEmail([this.user]).then(this.raiseError, this.raiseError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetches a localized string for the time the last email was sent.
|
||||||
|
*
|
||||||
|
* @returns a translated string with either the localized date/time; of 'No email sent'
|
||||||
|
*/
|
||||||
|
public getEmailSentTime(): string {
|
||||||
|
if (!this.user.is_last_email_send) {
|
||||||
|
return this.translate.instant('No email sent');
|
||||||
|
}
|
||||||
|
return this.repo.lastSentEmailTimeString(this.user);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,7 @@
|
|||||||
<ng-container matColumnDef="name">
|
<ng-container matColumnDef="name">
|
||||||
<mat-header-cell *matHeaderCellDef mat-sort-header>Name</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef mat-sort-header>Name</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let user">
|
<mat-cell *matCellDef="let user">
|
||||||
{{ user.full_name }}
|
{{ user.short_name }}
|
||||||
</mat-cell>
|
</mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
@ -75,6 +75,19 @@
|
|||||||
</mat-cell>
|
</mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
|
<!-- Infos column -->
|
||||||
|
<ng-container matColumnDef="infos">
|
||||||
|
<mat-header-cell *matHeaderCellDef mat-sort-header></mat-header-cell>
|
||||||
|
<mat-cell *matCellDef="let user" class="infoCell">
|
||||||
|
<div>
|
||||||
|
<mat-icon inline *ngIf="user.is_last_email_send"
|
||||||
|
matTooltip="{{ 'Email sent' | translate }} ({{ getEmailSentTime(user) }})">
|
||||||
|
mail
|
||||||
|
</mat-icon>
|
||||||
|
</div>
|
||||||
|
</mat-cell>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
<!-- Presence column -->
|
<!-- Presence column -->
|
||||||
<ng-container matColumnDef="presence">
|
<ng-container matColumnDef="presence">
|
||||||
<mat-header-cell *matHeaderCellDef mat-sort-header>Presence</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef mat-sort-header>Presence</mat-header-cell>
|
||||||
|
@ -33,6 +33,10 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.infoCell {
|
||||||
|
max-width: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
.presentCell {
|
.presentCell {
|
||||||
align-content: left;
|
align-content: left;
|
||||||
padding-right: 50px;
|
padding-right: 50px;
|
||||||
|
@ -365,6 +365,19 @@ export class UserListComponent extends ListViewBaseComponent<ViewUser, User> imp
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get information about the last time an invitation email was sent to a user
|
||||||
|
*
|
||||||
|
* @param user
|
||||||
|
* @returns a string representation about the last time an email was sent to a user
|
||||||
|
*/
|
||||||
|
public getEmailSentTime(user: ViewUser): string {
|
||||||
|
if (!user.is_last_email_send) {
|
||||||
|
return this.translate.instant('No email sent');
|
||||||
|
}
|
||||||
|
return this.repo.lastSentEmailTimeString(user);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handler for bulk setting new passwords. Needs multiSelect mode.
|
* Handler for bulk setting new passwords. Needs multiSelect mode.
|
||||||
*/
|
*/
|
||||||
@ -393,7 +406,7 @@ export class UserListComponent extends ListViewBaseComponent<ViewUser, User> imp
|
|||||||
columns = ['projector'].concat(columns);
|
columns = ['projector'].concat(columns);
|
||||||
}
|
}
|
||||||
if (this.operator.hasPerms('users.can_manage')) {
|
if (this.operator.hasPerms('users.can_manage')) {
|
||||||
columns = columns.concat(['presence']);
|
columns = columns.concat(['infos', 'presence']);
|
||||||
}
|
}
|
||||||
if (this.isMultiSelect) {
|
if (this.isMultiSelect) {
|
||||||
columns = ['selector'].concat(columns);
|
columns = ['selector'].concat(columns);
|
||||||
|
Loading…
Reference in New Issue
Block a user