src/app/core/basic-datatypes/month/edit-month/edit-month.component.ts

Extends

CustomFormControlDirective<Date>

Implements

EditComponent

Metadata

Relationships

Depends on

Index

Properties
Methods
Inputs
Outputs

Inputs

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

setMonthAndYear
setMonthAndYear(date: Moment, datepicker: MatDatepicker)
Parameters :
Name Type Optional
date Moment No
datepicker MatDatepicker<Moment> No
Returns : void
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,
  input,
  ViewEncapsulation,
} from "@angular/core";
import { ReactiveFormsModule } from "@angular/forms";
import {
  MAT_MOMENT_DATE_ADAPTER_OPTIONS,
  MomentDateAdapter,
} from "@angular/material-moment-adapter";
import {
  DateAdapter,
  MAT_DATE_FORMATS,
  MAT_DATE_LOCALE,
} from "@angular/material/core";
import {
  MatDatepicker,
  MatDatepickerModule,
} from "@angular/material/datepicker";
import { MatFormFieldControl } from "@angular/material/form-field";
import { MatInputModule } from "@angular/material/input";
import { FontAwesomeModule } from "@fortawesome/angular-fontawesome";
import { Moment } from "moment";
import { CustomFormControlDirective } from "../../../common-components/basic-autocomplete/custom-form-control.directive";
import { FormFieldConfig } from "../../../common-components/entity-form/FormConfig";
import { EditComponent } from "../../../entity/entity-field-edit/dynamic-edit/edit-component.interface";

export const MY_FORMATS = {
  parse: {
    dateInput: "YYYY-MM",
  },
  display: {
    dateInput: "YYYY-MM",
    monthYearLabel: "YYYY MMM",
    dateA11yLabel: "LL",
    monthYearA11yLabel: "YYYY MMMM",
  },
};

@Component({
  selector: "app-edit-month",
  imports: [
    MatInputModule,
    MatDatepickerModule,
    ReactiveFormsModule,
    FontAwesomeModule,
  ],
  templateUrl: "./edit-month.component.html",
  styleUrls: [
    "./edit-month.component.scss",
    "../../../entity/entity-field-edit/dynamic-edit/dynamic-edit.component.scss",
  ],
  changeDetection: ChangeDetectionStrategy.OnPush,
  providers: [
    { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS },
    {
      provide: DateAdapter,
      useClass: MomentDateAdapter,
      deps: [MAT_DATE_LOCALE, MAT_MOMENT_DATE_ADAPTER_OPTIONS],
    },
    { provide: MatFormFieldControl, useExisting: EditMonthComponent },
  ],
  encapsulation: ViewEncapsulation.None,
})
export class EditMonthComponent
  extends CustomFormControlDirective<Date>
  implements EditComponent
{
  formFieldConfig = input<FormFieldConfig>();

  setMonthAndYear(date: Moment, datepicker: MatDatepicker<Moment>) {
    this.formControl.markAsDirty();
    this.formControl.setValue(date.toDate());
    datepicker.close();
  }
}
<div class="flex-row">
  <input
    matInput
    [formControl]="formControl"
    [matDatepicker]="datepickerComp"
  />

  <mat-datepicker-toggle
    [for]="datepickerComp"
    class="input-action-button"
  ></mat-datepicker-toggle>
  <mat-datepicker
    #datepickerComp
    startView="multi-year"
    (monthSelected)="setMonthAndYear($event, datepickerComp)"
    panelClass="month-picker"
  ></mat-datepicker>
</div>

./edit-month.component.scss

.month-picker .mat-calendar-period-button {
  pointer-events: none;
}

.month-picker .mat-calendar-arrow {
  display: none;
}

../../../entity/entity-field-edit/dynamic-edit/dynamic-edit.component.scss

.input-action-button {
  margin: -12px;
}
Legend
Html element
Component
Html element with directive

results matching ""

    No results matching ""