src/app/features/public-form/edit-public-form-related-entities/edit-public-form-related-entities.component.ts

Extends

CustomFormControlDirective<string[]>

Implements

EditComponent

Metadata

Relationships

Used by

No results matching.

Depends on

Index

Properties
Methods
Inputs
Outputs
Accessors

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

clearSelectedEntities
clearSelectedEntities()
Returns : void
onSelectionChange
onSelectionChange(selectedIds: string[])
Parameters :
Name Type Optional
selectedIds string[] 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

Readonly relatedRefFields
Type : unknown
Default value : computed<FormFieldConfig[]>(() => { const entity = this.entity(); if (!entity?.["entity"]) return []; const entityConstructor = this.entities.get(entity["entity"]); if (!entityConstructor) return []; return Array.from(entityConstructor.schema.entries()) .filter(([_, schema]) => schema.dataType === EntityDatatype.dataType) .map(([id, schema]) => ({ id, label: schema.label, additional: schema.additional, })); })
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.

Accessors

selectedFieldIds
getselectedFieldIds()
import { EditComponent } from "#src/app/core/entity/entity-field-edit/dynamic-edit/edit-component.interface";
import {
  ChangeDetectionStrategy,
  Component,
  computed,
  inject,
  input,
} from "@angular/core";
import { ReactiveFormsModule } from "@angular/forms";
import { MatButtonModule } from "@angular/material/button";
import { MatOptionModule } from "@angular/material/core";
import { MatFormFieldControl } from "@angular/material/form-field";
import { MatSelectModule } from "@angular/material/select";
import { MatTooltipModule } from "@angular/material/tooltip";
import { FontAwesomeModule } from "@fortawesome/angular-fontawesome";
import { EntityDatatype } from "app/core/basic-datatypes/entity/entity.datatype";
import { CustomFormControlDirective } from "app/core/common-components/basic-autocomplete/custom-form-control.directive";
import { FormFieldConfig } from "app/core/common-components/entity-form/FormConfig";
import { DynamicComponent } from "app/core/config/dynamic-components/dynamic-component.decorator";
import { EntityRegistry } from "app/core/entity/database-entity.decorator";
import { Entity, EntityConstructor } from "app/core/entity/model/entity";

@DynamicComponent("EditPublicFormRelatedEntitiesComponent")
@Component({
  selector: "app-edit-public-form-related-entities",
  imports: [
    ReactiveFormsModule,
    MatSelectModule,
    MatOptionModule,
    MatButtonModule,
    FontAwesomeModule,
    MatTooltipModule,
  ],
  templateUrl: "./edit-public-form-related-entities.component.html",
  styleUrls: ["./edit-public-form-related-entities.component.scss"],
  changeDetection: ChangeDetectionStrategy.OnPush,
  providers: [
    {
      provide: MatFormFieldControl,
      useExisting: EditPublicFormRelatedEntitiesComponent,
    },
  ],
})
export class EditPublicFormRelatedEntitiesComponent
  extends CustomFormControlDirective<string[]>
  implements EditComponent
{
  formFieldConfig = input<FormFieldConfig>();
  entity = input<Entity>();

  private entities = inject(EntityRegistry);

  get selectedFieldIds(): string[] {
    return this.formControl.value || [];
  }

  readonly relatedRefFields = computed<FormFieldConfig[]>(() => {
    const entity = this.entity();
    if (!entity?.["entity"]) return [];
    const entityConstructor = this.entities.get(entity["entity"]);
    if (!entityConstructor) return [];

    return Array.from(entityConstructor.schema.entries())
      .filter(([_, schema]) => schema.dataType === EntityDatatype.dataType)
      .map(([id, schema]) => ({
        id,
        label: schema.label,
        additional: schema.additional,
      }));
  });

  onSelectionChange(selectedIds: string[]): void {
    this.formControl.patchValue(selectedIds);
    this.formControl.markAsDirty();
  }

  clearSelectedEntities() {
    this.formControl.setValue([]);
    this.formControl.markAsDirty();
  }
}
<div class="flex-row align-center gap-small">
  <mat-select
    [value]="selectedFieldIds"
    (selectionChange)="onSelectionChange($event.value)"
    [disabled]="!enabled()"
    multiple
    class="flex-grow"
  >
    @for (field of relatedRefFields(); track field.id) {
      <mat-option [value]="field.id">
        {{ field.label || field.additional }}
      </mat-option>
    } @empty {
      <mat-option disabled i18n>
        This record type does not have any fields that link to another record.
      </mat-option>
    }
  </mat-select>

  <button
    mat-icon-button
    [disabled]="!enabled()"
    (click)="clearSelectedEntities()"
    matTooltip="Clear selected entities"
    i18n-matTooltip
  >
    <fa-icon icon="times"></fa-icon>
  </button>
</div>

./edit-public-form-related-entities.component.scss


Legend
Html element
Component
Html element with directive

results matching ""

    No results matching ""