Files
neo/frontend/types/field-types.ts
2026-01-05 07:48:22 +01:00

161 lines
3.4 KiB
TypeScript

/**
* Field Type System inspired by Laravel Nova
* Defines all available field types and their configurations
*/
export enum FieldType {
// Text fields
TEXT = 'text',
TEXTAREA = 'textarea',
PASSWORD = 'password',
EMAIL = 'email',
// Numeric fields
NUMBER = 'number',
CURRENCY = 'currency',
// Selection fields
SELECT = 'select',
MULTI_SELECT = 'multiSelect',
BOOLEAN = 'boolean',
// Date/Time fields
DATE = 'date',
DATETIME = 'datetime',
TIME = 'time',
// Relationship fields
BELONGS_TO = 'belongsTo',
HAS_MANY = 'hasMany',
MANY_TO_MANY = 'manyToMany',
// Rich content
MARKDOWN = 'markdown',
CODE = 'code',
// File fields
FILE = 'file',
IMAGE = 'image',
// Other
URL = 'url',
COLOR = 'color',
JSON = 'json',
}
export enum ViewMode {
LIST = 'list',
DETAIL = 'detail',
EDIT = 'edit',
}
export interface FieldOption {
label: string;
value: string | number | boolean;
}
export interface FieldValidationRule {
type: 'required' | 'min' | 'max' | 'email' | 'url' | 'pattern' | 'custom';
value?: any;
message?: string;
}
export interface FieldConfig {
// Basic field properties
id: string;
apiName: string;
label: string;
type: FieldType;
// Display properties
placeholder?: string;
helpText?: string;
defaultValue?: any;
// Validation
isRequired?: boolean;
isReadOnly?: boolean;
validationRules?: FieldValidationRule[];
// View-specific options
showOnList?: boolean;
showOnDetail?: boolean;
showOnEdit?: boolean;
sortable?: boolean;
// Field type specific options
options?: FieldOption[]; // For select, multi-select
rows?: number; // For textarea
min?: number; // For number, date
max?: number; // For number, date
step?: number; // For number
accept?: string; // For file/image
relationObject?: string; // For relationship fields
relationDisplayField?: string; // Which field to display for relations
// Formatting
format?: string; // Date format, number format, etc.
prefix?: string; // Currency symbol, etc.
suffix?: string;
// Advanced
dependsOn?: string[]; // Field dependencies
computedValue?: string; // Formula for computed fields
}
export interface ViewConfig {
objectApiName: string;
fields: FieldConfig[];
mode: ViewMode;
}
export interface ListViewConfig extends ViewConfig {
mode: ViewMode.LIST;
pageSize?: number;
searchable?: boolean;
filterable?: boolean;
exportable?: boolean;
actions?: ViewAction[];
}
export interface RelatedListConfig {
title: string;
relationName: string;
objectApiName: string;
fields: FieldConfig[];
canCreate?: boolean;
createRoute?: string;
}
export interface DetailViewConfig extends ViewConfig {
mode: ViewMode.DETAIL;
sections?: FieldSection[];
actions?: ViewAction[];
relatedLists?: RelatedListConfig[];
}
export interface EditViewConfig extends ViewConfig {
mode: ViewMode.EDIT;
sections?: FieldSection[];
submitLabel?: string;
cancelLabel?: string;
}
export interface FieldSection {
title?: string;
description?: string;
fields: string[]; // Field API names
collapsible?: boolean;
defaultCollapsed?: boolean;
}
export interface ViewAction {
id: string;
label: string;
icon?: string;
variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';
confirmation?: string;
endpoint?: string;
handler?: () => void | Promise<void>;
}