/* eslint-disable @typescript-eslint/no-unsafe-assignment */ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-unsafe-argument */ import { Collection, Field as SealiousField, FieldTypes as SealiousFieldTypes, RequiredField as SealiousRequiredField, } from "sealious"; import { Boolean as BooleanField } from "./boolean.js"; import { SimpleFormField, TextBasedSimpleField } from "./simple-form-field.js"; import { File } from "./file.js"; import { CollectionField } from "./collection-field.js"; import { StructuredArray as StructuredArrayField } from "./structured-array.js"; import { Color } from "./color.js"; import { DateField } from "./date.js"; import { DateTime } from "./datetime.js"; import { EmailField } from "./email.js"; import { Float } from "./float.js"; import { HTML } from "./html.js"; import { Int } from "./int.js"; import { JSONField } from "./json.js"; import { Password } from "./password.js"; import { Text } from "./text.js"; import { Markdown } from "./markdown.js"; import { DeepReverseSingleReferenceTable } from "./deep-reverse-single-reference-table.js"; import { DeepReverseSingleReferenceList } from "./deep-reverse-single-reference-list.js"; import { Coordinates } from "./coordinates.js"; import { SimpleInput } from "../controls/simple-input.js"; import { FormField } from "./field.js"; import { PickFromListSealious } from "./pick-from-list-sealious.js"; import { SingleReference } from "./single-reference.js"; import extract_fields_from_collection, { ExtractedFieldInfo, } from "../../utils/extract-fields-from-collection.js"; import { EnumMultipleSealious } from "./enum-multiple-sealious.js"; import { URLField } from "./url.js"; import { Image } from "./image.js"; import { PhoneNumberWithCountryCode } from "./phone-number-with-country-code.js"; import { ItemDraft } from "./item-draft.js"; export type SealiousToFormField = T extends SealiousFieldTypes.Boolean ? BooleanField : T extends SealiousFieldTypes.Color ? Color : T extends SealiousFieldTypes.ControlAccess ? SealiousToFormField : T extends SealiousFieldTypes.Date ? DateField : T extends SealiousFieldTypes.DateTime ? DateTime : T extends SealiousFieldTypes.DeepReverseSingleReference ? DeepReverseSingleReferenceList | DeepReverseSingleReferenceTable : T extends SealiousFieldTypes.DisallowUpdate ? SealiousToFormField : T extends SealiousFieldTypes.Email ? EmailField : T extends SealiousFieldTypes.Enum ? PickFromListSealious : T extends SealiousFieldTypes.EnumMultiple ? R extends string[] ? EnumMultipleSealious : TextBasedSimpleField : T extends SealiousFieldTypes.File ? File : T extends SealiousFieldTypes.Float ? Float : T extends SealiousFieldTypes.HTML ? HTML : T extends SealiousFieldTypes.Image ? Image : T extends SealiousFieldTypes.Int ? Int : T extends SealiousFieldTypes.ItemDraft ? ItemDraft : T extends SealiousFieldTypes.JsonObject ? JSONField : T extends SealiousFieldTypes.JDD ? TextBasedSimpleField : T extends SealiousFieldTypes.Password ? Password : T extends SealiousFieldTypes.PhoneNumber ? PhoneNumberWithCountryCode : T extends SealiousFieldTypes.ReverseSingleReference ? TextBasedSimpleField : T extends SealiousFieldTypes.SecretToken ? TextBasedSimpleField : T extends SealiousFieldTypes.SettableBy ? SealiousToFormField : T extends SealiousFieldTypes.SingleReference ? SingleReference : T extends SealiousFieldTypes.Text ? Text : T extends SealiousFieldTypes.Username ? CollectionField : T extends SealiousFieldTypes.ValueExistingInCollection ? SimpleFormField : T extends SealiousFieldTypes.ValueNotExistingInCollection ? SimpleFormField : T extends SealiousRequiredField ? SimpleFormField : T extends SealiousFieldTypes.Url ? URLField : T extends SealiousFieldTypes.Money ? SimpleFormField : T extends SealiousFieldTypes.Markdown ? Markdown : T extends SealiousFieldTypes.Coordinates ? Coordinates : T extends SealiousFieldTypes.StructuredArray ? StructuredArrayField : TextBasedSimpleField; export function sealiousToFormField>( sealious_field: SF ): SealiousToFormField { if (sealious_field instanceof SealiousFieldTypes.Boolean) { return new BooleanField( sealious_field.required ) as SealiousToFormField; } if (sealious_field instanceof SealiousFieldTypes.Color) { return new Color(sealious_field.required) as SealiousToFormField; } if (sealious_field instanceof SealiousFieldTypes.ControlAccess) { const target_field = sealious_field.virtual_field; return sealiousToFormField(target_field) as SealiousToFormField; } if (sealious_field instanceof SealiousFieldTypes.Date) { return new DateField( sealious_field.required ) as SealiousToFormField; } if (sealious_field instanceof SealiousFieldTypes.DateTime) { return new DateTime(sealious_field.required) as SealiousToFormField; } if ( sealious_field instanceof SealiousFieldTypes.DeepReverseSingleReference ) { const referencing_collection = sealious_field.collection.app.collections[ sealious_field.referencing_collection ]; if (!referencing_collection) { throw new Error( "Unknown collection: " + sealious_field.referencing_collection ); } if (Object.keys(referencing_collection.fields).length == 2) { return new DeepReverseSingleReferenceList( sealious_field ) as SealiousToFormField; } else { return new DeepReverseSingleReferenceTable( sealious_field ) as SealiousToFormField; } } if (sealious_field instanceof SealiousFieldTypes.DisallowUpdate) { return sealiousToFormField( sealious_field.virtual_field ) as SealiousToFormField; } if (sealious_field instanceof SealiousFieldTypes.Email) { return new EmailField( sealious_field.required ) as SealiousToFormField; } if (sealious_field instanceof SealiousFieldTypes.Enum) { return new PickFromListSealious( sealious_field ) as SealiousToFormField; } if (sealious_field instanceof SealiousFieldTypes.EnumMultiple) { return new EnumMultipleSealious( sealious_field ) as SealiousToFormField; } if (sealious_field instanceof SealiousFieldTypes.File) { return new File(sealious_field.required) as SealiousToFormField; } if (sealious_field instanceof SealiousFieldTypes.Float) { return new Float(sealious_field.required) as SealiousToFormField; } if (sealious_field instanceof SealiousFieldTypes.HTML) { return new HTML(sealious_field.required) as SealiousToFormField; } if (sealious_field instanceof SealiousFieldTypes.Image) { return new Image(sealious_field.required) as SealiousToFormField; } if (sealious_field instanceof SealiousFieldTypes.Int) { return new Int(sealious_field.required) as SealiousToFormField; } if (sealious_field instanceof SealiousFieldTypes.ItemDraft) { return new ItemDraft(sealious_field) as SealiousToFormField; } if (sealious_field instanceof SealiousFieldTypes.JsonObject) { return new JSONField( sealious_field.required ) as SealiousToFormField; } if (sealious_field instanceof SealiousFieldTypes.Password) { return new Password(sealious_field.required) as SealiousToFormField; } if (sealious_field instanceof SealiousFieldTypes.PhoneNumber) { return new PhoneNumberWithCountryCode( sealious_field.required ) as SealiousToFormField; } if (sealious_field instanceof SealiousFieldTypes.SettableBy) { return sealiousToFormField( sealious_field.virtual_field ) as SealiousToFormField; } if (sealious_field instanceof SealiousFieldTypes.SingleReference) { return new SingleReference( false, sealious_field ) as unknown as SealiousToFormField; } if (sealious_field instanceof SealiousFieldTypes.Text) { return new Text(sealious_field.required) as SealiousToFormField; } if (sealious_field instanceof SealiousFieldTypes.Username) { return new Text(sealious_field.required) as SealiousToFormField; } if (sealious_field instanceof SealiousFieldTypes.Url) { return new URLField(sealious_field.required) as SealiousToFormField; } if (sealious_field instanceof SealiousFieldTypes.Money) { return new Float(sealious_field.required) as SealiousToFormField; } if (sealious_field instanceof SealiousFieldTypes.Markdown) { return new Markdown(sealious_field.required) as SealiousToFormField; } if (sealious_field instanceof SealiousFieldTypes.Coordinates) { return new Coordinates( sealious_field.required ) as SealiousToFormField; } if (sealious_field instanceof SealiousFieldTypes.StructuredArray) { return new StructuredArrayField( sealious_field ) as SealiousToFormField; } return new TextBasedSimpleField(false) as SealiousToFormField; } export async function sealiousFieldInfoToFormField( field_info: ExtractedFieldInfo ): Promise { switch (field_info.type) { case "boolean": return new BooleanField(field_info.is_required); case "color": return new Color(field_info.is_required); case "date": return new DateField(field_info.is_required); case "datetime": return new DateTime(field_info.is_required); case "deep-reverse-single-reference": { const referencing_fields = await extract_fields_from_collection( field_info.referencing_collection as string ); if (referencing_fields.length == 2) { return new DeepReverseSingleReferenceList({} as any); } else { return new DeepReverseSingleReferenceTable({} as any); } } case "email": return new EmailField(field_info.is_required); case "enum": return new PickFromListSealious({} as any); case "enum-multiple": return new EnumMultipleSealious({} as any); case "file": return new File(field_info.is_required); case "float": return new Float(field_info.is_required); case "html": return new HTML(field_info.is_required); case "image": return new Image(field_info.is_required); case "int": return new Int(field_info.is_required); case "item-draft": return new ItemDraft({ target_collection: { fields: {} } } as any); case "json-object": return new JSONField(field_info.is_required); case "password": return new Password(field_info.is_required); case "phone-number": return new PhoneNumberWithCountryCode(field_info.is_required); case "single-reference": return new SingleReference(false, {} as any); case "text": return new Text(field_info.is_required); case "username": return new Text(field_info.is_required); case "url": return new URLField(field_info.is_required); case "money": return new Float(field_info.is_required); case "markdown": return new Markdown(field_info.is_required); case "coordinates": return new Coordinates(field_info.is_required); case "structured-array": // we don't need the full thing at this point, so we don't fill in the subfields return new StructuredArrayField( new SealiousFieldTypes.StructuredArray({}) ); default: return new TextBasedSimpleField(false); } }