getName()}"); } /** * The input fields. * * @return InputField[] */ public function fields(): array { $fields = []; $baseType = $this->type; $fields[] = collect($baseType->fields()) ->filter(fn (Field $field) => $field instanceof BindableField) ->map(fn (Field&BindableField $field) => new InputField($field->getName(), $field->type()->__toString().'!')) ->toArray(); $fields[] = collect($baseType->fields()) ->filter(fn (Field $field) => $field instanceof UpdatableField) // and reportable field? ->map( fn (Field&UpdatableField $field) => new InputField($field->getName(), $field->type().($field instanceof RequiredOnUpdate ? '!' : '')) ) ->toArray(); if ($baseType instanceof HasRelations) { $fields[] = collect($baseType->relations()) ->mapWithKeys(function (Relation $relation) { $baseType = $relation->getBaseType(); if (! $baseType instanceof EloquentType) { return []; } return match (true) { $relation instanceof BelongsToRelation => [$relation->getName() => new UpdateBelongsToInput($baseType)], $relation instanceof HasManyRelation => [$relation->getName() => new UpdateHasManyInput($baseType)], $relation instanceof BelongsToManyRelation => [$relation->getName() => new UpdateBelongsToManyInput($relation->getEdgeType()->getPivotType())], default => [], }; }) ->map(fn (Input $input, string $name) => new InputField($name, $input->getName())) ->toArray(); } return Arr::flatten($fields); } }