src/app/features/todos/todos-dashboard/todos-dashboard.component.ts

Metadata

Relationships

Used by

No results matching.

Depends on

Index

Properties
Methods
Inputs

Inputs

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()
Returns : any
openEntity
openEntity(entity: Todo)
Parameters :
Name Type Optional
entity Todo No
Returns : void

Properties

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>

./todos-dashboard.component.scss

@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
Component
Html element with directive

results matching ""

    No results matching ""