|
explanation
|
Type : string
|
Default value : $localize`:dashboard widget explanation:Tasks that are beyond their deadline`
|
|
|
|
subtitle
|
Type : string
|
Default value : $localize`:dashboard widget subtitle:Tasks due`
|
|
|
Methods
|
Static
getRequiredEntities
|
getRequiredEntities()
|
|
|
|
|
|
openEntity
|
openEntity(entity: Todo)
|
|
|
Parameters :
| Name |
Type |
Optional |
| entity |
Todo
|
No
|
|
|
dataMapper
|
Type : function
|
Default value : () => {...}
|
|
|
|
filterEntries
|
Type : unknown
|
Default value : () => {...}
|
|
|
|
sortEntries
|
Type : unknown
|
Default value : () => {...}
|
|
|
|
startDateLabel
|
Type : string
|
Default value : Todo.schema.get("startDate").label
|
|
|
import {
ChangeDetectionStrategy,
Component,
inject,
input,
} from "@angular/core";
import { DynamicComponent } from "../../../core/config/dynamic-components/dynamic-component.decorator";
import { Todo } from "../model/todo";
import { FormDialogService } from "../../../core/form-dialog/form-dialog.service";
import moment from "moment";
import { DashboardListWidgetComponent } from "../../../core/dashboard/dashboard-list-widget/dashboard-list-widget.component";
import { NgStyle } from "@angular/common";
import { CustomDatePipe } from "../../../core/basic-datatypes/date/custom-date.pipe";
import { MatTableModule } from "@angular/material/table";
import { MatTooltipModule } from "@angular/material/tooltip";
import { CurrentUserSubject } from "../../../core/session/current-user-subject";
@DynamicComponent("TodosDashboard")
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
selector: "app-todos-dashboard",
templateUrl: "./todos-dashboard.component.html",
styleUrls: ["./todos-dashboard.component.scss"],
imports: [
DashboardListWidgetComponent,
NgStyle,
MatTableModule,
MatTooltipModule,
CustomDatePipe,
],
})
export class TodosDashboardComponent {
private formDialog = inject(FormDialogService);
private currentUser = inject(CurrentUserSubject);
static getRequiredEntities() {
return Todo.ENTITY_TYPE;
}
dataMapper: (data: Todo[]) => Todo[] = (data) =>
data.filter(this.filterEntries).sort(this.sortEntries);
startDateLabel: string = Todo.schema.get("startDate").label;
subtitle = input<string>($localize`:dashboard widget subtitle:Tasks due`);
explanation = input<string>(
$localize`:dashboard widget explanation:Tasks that are beyond their deadline`,
);
filterEntries = (todo: Todo) => {
return (
!todo.completed &&
!todo.inactive &&
todo.assignedTo.includes(this.currentUser.value?.getId()) &&
moment(todo.startDate).isSameOrBefore(moment(), "days")
);
};
sortEntries = (a: Todo, b: Todo) => {
// list overdue todos first
if (a.isOverdue && b.isOverdue) {
return a.deadline?.getTime() - b.deadline?.getTime();
} else if (a.isOverdue) {
return -1; // a first
} else if (b.isOverdue) {
return 1; // b first
}
return (
(a.startDate ?? a.deadline)?.getTime() -
(b.startDate ?? b.deadline)?.getTime()
);
};
openEntity(entity: Todo) {
this.formDialog.openView(entity);
}
}
<app-dashboard-list-widget
icon="tasks"
[subtitle]="subtitle()"
[explanation]="explanation()"
theme="note"
entityType="Todo"
[dataMapper]="dataMapper"
>
<table mat-table i18n-aria-label aria-label="Tasks needing follow-up">
<!-- Table header only for assistive technologies like screen readers -->
<tr class="visually-hidden">
<th scope="col" i18n="Column header for the subject of a task">
Subject
</th>
<th scope="col" i18n="Column header for the deadline of a task">
Deadline
</th>
</tr>
<ng-container matColumnDef="subject">
<td *matCellDef="let todo" class="subject-cell row-indicator">
{{ todo.subject }}
</td>
</ng-container>
<ng-container matColumnDef="deadline">
<td
*matCellDef="let todo"
class="deadline"
matTooltip="{{ startDateLabel }}: {{ todo.startDate | customDate }}"
[matTooltipDisabled]="!todo.startDate"
>
{{ todo.deadline | customDate: "shortDate" }}
</td>
</ng-container>
<tr
mat-row
*matRowDef="let row; columns: ['subject', 'deadline']"
class="dashboard-table-row row-view"
(click)="openEntity(row)"
[ngStyle]="{ '--row-indicator-color': row.isOverdue ? 'red' : '' }"
></tr>
</table>
</app-dashboard-list-widget>
@use "../../../core/dashboard/dashboard-widget-base";
@use "variables/sizes";
.row-view {
cursor: pointer;
position: relative;
& > td:first-child {
padding-left: 2 * sizes.$small;
}
& > td:last-child {
padding-right: sizes.$small;
}
}
Legend
Html element with directive