src/app/features/todos/todo-completion/edit-todo-completion/edit-todo-completion.component.ts

Extends

CustomFormControlDirective<TodoCompletion>

Implements

EditComponent

Metadata

Relationships

Used by

No results matching.

Index

Properties
Methods
Inputs
Outputs

Inputs

entity
Type : Entity
formFieldConfig
Type : FormFieldConfig
aria-describedby
Type : string
disabled
Type : boolean
ngControl
Type : any
Default value : inject(NgControl, { optional: true, self: true })
placeholder
Type : string
required
Type : boolean
value
Type : T

Outputs

valueChange
Type : EventEmitter

Methods

Async completeTodo
completeTodo()
Returns : any
Async uncompleteTodo
uncompleteTodo()
Returns : any
blur
blur()
Returns : void
focus
focus()
Returns : void
onContainerClick
onContainerClick(event: MouseEvent)
Parameters :
Name Type Optional
event MouseEvent No
Returns : void
registerOnChange
registerOnChange(fn: any)
Parameters :
Name Type Optional
fn any No
Returns : void
registerOnTouched
registerOnTouched(fn: any)
Parameters :
Name Type Optional
fn any No
Returns : void
setDescribedByIds
setDescribedByIds(ids: string[])
Parameters :
Name Type Optional
ids string[] No
Returns : void
setDisabledState
setDisabledState(isDisabled: boolean)
Parameters :
Name Type Optional
isDisabled boolean No
Returns : void
writeValue
writeValue(value: T, notifyFormControl: unknown)

Implementation for Angular ControlValueAccessor interface that links the form control value to the component value

Parameters :
Name Type Optional Default value Description
value T No

The new value to set

notifyFormControl unknown No false

Whether to notify the FormControl of this change (for internal updates)

Returns : void

Properties

controlType
Type : string
Default value : "custom-control"
elementRef
Type : unknown
Default value : inject<ElementRef<HTMLElement>>(ElementRef)
Readonly enabled
Type : Signal<boolean>
Default value : computed(() => !this._disabled())

Whether the control is currently enabled, as a signal (tracks disabled).

errorStateMatcher
Type : unknown
Default value : inject(ErrorStateMatcher)
id
Type : unknown
Default value : `custom-form-control-${CustomFormControlDirective.nextId++}`
Static nextId
Type : number
Default value : 0
onChange
Type : unknown
Default value : () => {...}
onTouched
Type : unknown
Default value : () => {...}
parentForm
Type : unknown
Default value : inject(NgForm, { optional: true })
parentFormGroup
Type : unknown
Default value : inject(FormGroupDirective, { optional: true })
stateChanges
Type : unknown
Default value : new Subject<void>()
Readonly valueSignal
Type : Signal<T>
Default value : computed(() => this._value())

The current value of the control as a signal. Authoritative in both modes: it reflects the bound FormControl (synced in ngDoCheck) as well as [(value)] / writeValue updates.

import {
  ChangeDetectionStrategy,
  Component,
  inject,
  input,
  InputSignal,
} from "@angular/core";
import { MatButtonModule } from "@angular/material/button";
import { MatDialogRef } from "@angular/material/dialog";
import { MatFormFieldControl } from "@angular/material/form-field";
import { MatTooltipModule } from "@angular/material/tooltip";
import { FontAwesomeModule } from "@fortawesome/angular-fontawesome";
import { CustomFormControlDirective } from "../../../../core/common-components/basic-autocomplete/custom-form-control.directive";
import { EntityFormService } from "../../../../core/common-components/entity-form/entity-form.service";
import { FormFieldConfig } from "../../../../core/common-components/entity-form/FormConfig";
import { DynamicComponent } from "../../../../core/config/dynamic-components/dynamic-component.decorator";
import { EditComponent } from "../../../../core/entity/entity-field-edit/dynamic-edit/edit-component.interface";
import { Entity } from "../../../../core/entity/model/entity";
import { Todo } from "../../model/todo";
import { TodoCompletion } from "../../model/todo-completion";
import { TodoService } from "../../todo.service";
import { DisplayTodoCompletionComponent } from "../display-todo-completion/display-todo-completion.component";
import { FaDynamicIconComponent } from "#src/app/core/common-components/fa-dynamic-icon/fa-dynamic-icon.component";

@DynamicComponent("EditTodoCompletion")
@Component({
  selector: "app-edit-todo-completion",
  templateUrl: "./edit-todo-completion.component.html",
  styleUrls: ["./edit-todo-completion.component.scss"],
  changeDetection: ChangeDetectionStrategy.OnPush,
  imports: [
    MatButtonModule,
    FontAwesomeModule,
    DisplayTodoCompletionComponent,
    MatTooltipModule,
    FaDynamicIconComponent,
  ],
  providers: [
    { provide: MatFormFieldControl, useExisting: EditTodoCompletionComponent },
  ],
})
export class EditTodoCompletionComponent
  extends CustomFormControlDirective<TodoCompletion>
  implements EditComponent
{
  formFieldConfig = input<FormFieldConfig>();
  entity = input<Entity>() as InputSignal<Todo>;

  private readonly entityFormService = inject(EntityFormService);
  private readonly todoService = inject(TodoService);
  private readonly dialogRef? = inject(MatDialogRef, { optional: true });

  async completeTodo() {
    if (this.formControl.parent?.dirty) {
      // we assume the user always wants to save pending changes rather than discard them
      await this.entityFormService.saveChanges(
        { formGroup: this.formControl.parent } as any,
        this.entity(),
      );
    }
    await this.todoService.completeTodo(this.entity());

    if (this.dialogRef) {
      this.dialogRef.close();
    }
  }

  async uncompleteTodo() {
    await this.todoService.uncompleteTodo(this.entity());
  }
}
@if (entity()?.isNew) {
  <!-- hide while creating new task -->
} @else if (!valueSignal()) {
  <button mat-raised-button color="accent" (click)="completeTodo()">
    <app-fa-dynamic-icon
      icon="check"
      class="margin-right-small"
    ></app-fa-dynamic-icon>
    <span i18n>Complete Task</span>
  </button>
} @else {
  <div class="flex-row align-center gap-regular">
    <app-display-todo-completion
      [value]="valueSignal()"
    ></app-display-todo-completion>

    <button
      mat-icon-button
      color="accent"
      (click)="uncompleteTodo()"
      matTooltip="mark as incomplete again"
      i18n-matTooltip="todo uncomplete button tooltip"
    >
      <app-fa-dynamic-icon icon="undo-alt"></app-fa-dynamic-icon>
    </button>
  </div>
}

./edit-todo-completion.component.scss

@use "variables/sizes";

:host {
  display: inline-block;
  padding: sizes.$regular;
}
Legend
Html element
Component
Html element with directive

results matching ""

    No results matching ""