import { Type } from '@angular/core'; import { AbstractControl, UntypedFormGroup } from '@angular/forms'; import { ActivatedRoute, ResolveFn, Router } from '@angular/router'; import { ResultOf, TypedDocumentNode } from '@graphql-typed-document-node/core'; import { Observable, Subject } from 'rxjs'; import { DataService } from '../data/providers/data.service'; import { ServerConfigService } from '../data/server-config'; import { BreadcrumbValue } from '../providers/breadcrumb/breadcrumb.service'; import { PermissionsService } from '../providers/permissions/permissions.service'; import { DeactivateAware } from './deactivate-aware'; import { CustomFieldConfig, CustomFields, LanguageCode } from './generated-types'; import { TranslationOf } from './utilities/find-translation'; /** * @description * A base class for entity detail views. It should be used in conjunction with the * {@link BaseEntityResolver}. * * @example * ```ts * \@Component({ * selector: 'app-my-entity', * templateUrl: './my-entity.component.html', * styleUrls: ['./my-entity.component.scss'], * changeDetection: ChangeDetectionStrategy.OnPush, * }) * export class GlobalSettingsComponent extends BaseDetailComponent implements OnInit { * detailForm: FormGroup; * * constructor( * router: Router, * route: ActivatedRoute, * serverConfigService: ServerConfigService, * protected dataService: DataService, * private formBuilder: FormBuilder, * ) { * super(route, router, serverConfigService, dataService); * this.detailForm = this.formBuilder.group({ * name: [''], * }); * } * * protected setFormValues(entity: MyEntityFragment, languageCode: LanguageCode): void { * this.detailForm.patchValue({ * name: entity.name, * }); * } * } * ``` * * @docsCategory list-detail-views */ export declare abstract class BaseDetailComponent implements DeactivateAware { protected route: ActivatedRoute; protected router: Router; protected serverConfigService: ServerConfigService; protected dataService: DataService; protected permissionsService: PermissionsService; entity$: Observable; availableLanguages$: Observable; languageCode$: Observable; languageCode: LanguageCode; isNew$: Observable; id: string; abstract detailForm: UntypedFormGroup; protected destroy$: Subject; protected constructor(route: ActivatedRoute, router: Router, serverConfigService: ServerConfigService, dataService: DataService, permissionsService: PermissionsService); init(): void; protected setUpStreams(): void; destroy(): void; setLanguage(code: LanguageCode): void; canDeactivate(): boolean; protected abstract setFormValues(entity: Entity, languageCode: LanguageCode): void; protected setCustomFieldFormValues(customFields: CustomFieldConfig[], formGroup: AbstractControl | null, entity: T, currentTranslation?: TranslationOf): void; protected getCustomFieldConfig(key: Exclude): CustomFieldConfig[]; protected setQueryParam(key: string, value: any): void; } /** * @description * A version of the {@link BaseDetailComponent} which is designed to be used with a * [TypedDocumentNode](https://the-guild.dev/graphql/codegen/plugins/typescript/typed-document-node). * * @docsCategory list-detail-views */ export declare abstract class TypedBaseDetailComponent, Field extends keyof ResultOf> extends BaseDetailComponent[Field]>> { protected result$: Observable>; protected entity: ResultOf[Field]; protected constructor(); init(): void; } /** * @description * A helper function for creating tabs that point to a {@link TypedBaseDetailComponent}. This takes * care of the route resolver parts so that the detail component automatically has access to the * correct resolved detail data. * * @example * ```ts * \@NgModule({ * imports: [ReviewsSharedModule], * declarations: [/* ... *\/], * providers: [ * registerPageTab({ * location: 'product-detail', * tab: 'Specs', * route: 'specs', * component: detailComponentWithResolver({ * component: ProductSpecDetailComponent, * query: GetProductSpecsDocument, * entityKey: 'spec', * }), * }), * ], * }) * export class ProductSpecsUiExtensionModule {} * ``` * @docsCategory list-detail-views */ export declare function detailComponentWithResolver, Field extends keyof ResultOf, R extends Field>(config: { component: Type>; query: T; entityKey: R; getBreadcrumbs?: (entity: ResultOf[R]) => BreadcrumbValue; variables?: T extends TypedDocumentNode ? Omit : never; }): { resolveFn: ResolveFn<{ entity: Observable[keyof ResultOf] | null>; result?: ResultOf | undefined; }>; breadcrumbFn: (result: any) => string | import("../providers/breadcrumb/breadcrumb.service").BreadcrumbLabelLinkPair | BreadcrumbValue[]; component: Type>; }; export declare function createBaseDetailResolveFn, Field extends keyof ResultOf, R extends Field>(config: { query: T; entityKey: R | string; variables?: T extends TypedDocumentNode ? Omit : never; }): ResolveFn<{ entity: Observable[Field] | null>; result?: ResultOf; }>;