import React from 'react'; import { ExtensionManifest, ContextIdentifierProvider, } from '@atlaskit/editor-common'; import { FieldDefinition, isFieldset, Parameters, TabField, } from '@atlaskit/editor-common/extensions'; import ColorPicker from './Fields/ColorPicker'; import Boolean from './Fields/Boolean'; import CustomSelect from './Fields/CustomSelect'; import Date from './Fields/Date'; import DateRange from './Fields/DateRange'; import Enum from './Fields/Enum'; // eslint-disable-next-line import/no-cycle import Fieldset from './Fields/Fieldset'; import Number from './Fields/Number'; import String from './Fields/String'; import UnhandledType from './Fields/UnhandledType'; import UserSelect from './Fields/UserSelect'; import Expand from './Fields/Expand'; import TabGroup from './Fields/TabGroup'; import RemovableField from './NestedForms/RemovableField'; import { OnFieldChange } from './types'; import { getSafeParentedName } from './utils'; import { FormErrorBoundary } from './FormErrorBoundary'; export interface FieldComponentProps { field: FieldDefinition; parameters: Parameters; parentName?: string; extensionManifest: ExtensionManifest; firstVisibleFieldName?: string; onFieldChange: OnFieldChange; } export function FieldComponent({ field, parameters, parentName, extensionManifest, firstVisibleFieldName, onFieldChange, }: FieldComponentProps) { const { name, type } = field; const autoFocus = name === firstVisibleFieldName; const defaultValue = parameters[name]; const error = parameters.errors?.[name]; const parentedName = getSafeParentedName(name, parentName); const fieldDefaultValue = field.type === 'enum' ? field.defaultValue : undefined; if (name in parameters && !isFieldset(field)) { field = { ...field, defaultValue }; } switch (field.type) { case 'string': return ( ); case 'number': return ( ); case 'boolean': return ( ); case 'color': return ( ); case 'date': return ( ); case 'date-range': return ( ); case 'enum': return ( ); case 'custom': return ( ); case 'fieldset': return (
); case 'user': return ( ); case 'expand': // if expand is under a tab. const resolvedParentName = parentName ? `${parentName}.${field.name}` : field.name; return ( ); case 'tab-group': const renderPanel = (tabField: TabField) => { const tabParameters = parameters[field.name] || {}; return ( ); }; return ; default: return ( ); } } function Hidden({ children }: { children: React.ReactNode }) { return
{children}
; } export default function FormContent({ fields, parentName, parameters, extensionManifest, canRemoveFields, onClickRemove, onFieldChange, firstVisibleFieldName, contextIdentifierProvider, }: { fields: FieldDefinition[]; parentName?: string; parameters?: Parameters; extensionManifest: ExtensionManifest; canRemoveFields?: boolean; onClickRemove?: (fieldName: string) => void; onFieldChange: OnFieldChange; firstVisibleFieldName?: string; contextIdentifierProvider?: ContextIdentifierProvider; }) { return ( {fields.map((field: FieldDefinition) => { let fieldElement = ( ); // only to be supported by String fields at this time if ('isHidden' in field && field.isHidden) { fieldElement = {fieldElement}; } const { name, type } = field; return ( {fieldElement} ); })} ); }