import { type AvonRequest } from '../Http/Requests'; import { Collection } from 'collect.js'; import type Field from '../Fields/Field'; import { type Model } from '../Models'; import Relation from '../Fields/Relation'; export default class FieldCollection< TItem extends Field = Field, > extends Collection { /** * Find a given field by its attribute. */ public findFieldByAttribute( attribute: string, defaultValue?: any, ): TItem | undefined { return this.first( (field) => field.attribute === attribute, defaultValue, ); } /** * Resolve value of fields. */ public resolve(resource: Model): FieldCollection { return new FieldCollection( this.each((field) => field.resolve(resource)), ); } /** * Resolve value of fields for display. */ public resolveForDisplay(resource: Model): FieldCollection { return new FieldCollection( this.each((field) => field.resolveForDisplay(resource)), ); } /** * Remove non-creation fields from the collection. */ public onlyCreateFields(request: AvonRequest): FieldCollection { return new FieldCollection( this.filter((field) => field.isShownOnCreation(request)), ); } /** * Remove non-update fields from the collection. */ public onlyUpdateFields( request: AvonRequest, resource: Model, ): FieldCollection { return new FieldCollection( this.filter((field) => field.isShownOnUpdate(request, resource)), ); } /** * Filter fields for showing on index. */ public filterForIndex( request: AvonRequest, resource: Model, ): FieldCollection { return new FieldCollection( this.filter((field) => field.isShownOnIndex(request, resource)).values(), ); } /** * Filter fields for showing on detail. */ public filterForDetail( request: AvonRequest, resource: Model, ): FieldCollection { return new FieldCollection( this.filter((field) => field.isShownOnDetail(request, resource)).values(), ); } /** * Reject if the field supports Filterable Field. */ public withOnlyFilterableFields(): FieldCollection { return new FieldCollection( this.filter((field) => field.isFilterable()).values(), ); } /** * Reject if the field supports Orderable Field. */ public withOnlyOrderableFields(): FieldCollection { return new FieldCollection( this.filter((field) => field.isOrderable()).values(), ); } /** * Reject if the field supports Relatable Field. */ public withOnlyRelatableFields(): FieldCollection { return new FieldCollection( this.filter( (field) => field instanceof Relation && field.isLoaded(), ).values(), ); } /** * Reject if the field is rellatable Field. */ public withoutRelatableFields(): FieldCollection { return new FieldCollection( this.reject((field) => field instanceof Relation).values(), ); } /** * Reject if the field is rellatable Field. */ public withoutUnfillableFields(): FieldCollection { return new FieldCollection( this.filter((field) => field.fillable()).values(), ); } /** * Reject if the field is rellatable Field. */ public withoutUnresolvableFields(): FieldCollection { return new FieldCollection( this.filter((field) => field.resolvable()).values(), ); } /** * Filter elements should be displayed for the given request. */ public authorized(request: AvonRequest): FieldCollection { return new FieldCollection( this.filter((field) => field.authorize(request)).values(), ); } }