diff --git a/internal/models/field_types.go b/internal/models/field_types.go index 7032492..9904cd1 100644 --- a/internal/models/field_types.go +++ b/internal/models/field_types.go @@ -34,6 +34,7 @@ func IsValidFieldType(fieldType string) bool { } type Field struct { - Name string `json:"name"` - Type FieldType `json:"type"` + Name string `json:"name"` + Type FieldType `json:"type"` + Optional bool `json:"optional,omitempty"` } diff --git a/ui/src/components/modals/CreateCollectionModal.tsx b/ui/src/components/modals/CreateCollectionModal.tsx index 52648b8..6b50774 100644 --- a/ui/src/components/modals/CreateCollectionModal.tsx +++ b/ui/src/components/modals/CreateCollectionModal.tsx @@ -15,6 +15,7 @@ const CreateCollectionModal: React.FC = ({ const [fields, setFields] = useState([]); const [newFieldName, setNewFieldName] = useState(""); const [newFieldType, setNewFieldType] = useState(FieldType.STRING); + const [newFieldOptional, setNewFieldOptional] = useState(false) const [error, setError] = useState(null); const [fieldsError, setFieldsError] = useState(null); const { request, loading } = useApi(); @@ -30,6 +31,10 @@ const CreateCollectionModal: React.FC = ({ setNewFieldName(e.target.value); }; + const handleNewOptionalChange = (e: React.ChangeEvent) => { + setNewFieldOptional(e.target.checked) + } + const addField = () => { if (newFieldName.trim() === "") { setFieldsError("Field name cannot be empty."); @@ -48,6 +53,7 @@ const CreateCollectionModal: React.FC = ({ { name: newFieldName.trim().toLowerCase(), type: newFieldType, + optional: newFieldOptional }, ]); setNewFieldName(""); @@ -120,7 +126,7 @@ const CreateCollectionModal: React.FC = ({ {fields.map((field, index) => (

- {field.name} ({field.type}) + {field.name} ({field.type}{field.optional && ', optional'})

+ {fieldsError &&

{fieldsError}

}
diff --git a/ui/src/components/modals/CreateEntryModal.tsx b/ui/src/components/modals/CreateEntryModal.tsx index 551a285..b6bb650 100644 --- a/ui/src/components/modals/CreateEntryModal.tsx +++ b/ui/src/components/modals/CreateEntryModal.tsx @@ -48,13 +48,13 @@ const CreateEntryModal: React.FC = ({ const handleSubmit = async () => { console.log("fields", fields); - const hasEmptyFields = fields.some( - (field) => formState[field.name].trim() === "", + const hasRequiredFields = fields.some( + (field) => !field.optional && formState[field.name].trim() === "", ); - console.log("hasEmptyFields", hasEmptyFields); + console.log("hasEmptyFields", hasRequiredFields); - if (hasEmptyFields) { + if (hasRequiredFields) { setError("All fields are required."); return; } @@ -64,8 +64,10 @@ const CreateEntryModal: React.FC = ({ // Prepare data with types const dataWithTypes = fields.reduce( (acc, field) => { + let value = formState[field.name] + if (field.optional && value.trim() === "") value = null acc[field.name] = { - value: formState[field.name], + value, type: field.type, }; return acc; @@ -101,7 +103,7 @@ const CreateEntryModal: React.FC = ({ value={formState[field.name]} onChange={handleInputChange} className="input input-bordered w-full" - required + required={!field.optional} /> ); case FieldType.STRING: @@ -113,7 +115,7 @@ const CreateEntryModal: React.FC = ({ value={formState[field.name]} onChange={handleInputChange} className="input input-bordered w-full" - required + required={!field.optional} /> ); case FieldType.TEXT: @@ -124,7 +126,7 @@ const CreateEntryModal: React.FC = ({ value={formState[field.name]} onChange={handleInputChange} className="textarea textarea-bordered w-full" - required + required={!field.optional} /> ); case FieldType.NUMBER: @@ -136,7 +138,7 @@ const CreateEntryModal: React.FC = ({ value={formState[field.name]} onChange={handleInputChange} className="input input-bordered w-full" - required + required={!field.optional} /> ); case FieldType.BOOLEAN: @@ -147,7 +149,7 @@ const CreateEntryModal: React.FC = ({ value={formState[field.name]} onChange={handleInputChange} className="select select-bordered w-full" - required + required={!field.optional} >
diff --git a/ui/src/pages/collections/Detail.tsx b/ui/src/pages/collections/Detail.tsx index 7b9ee29..899213b 100644 --- a/ui/src/pages/collections/Detail.tsx +++ b/ui/src/pages/collections/Detail.tsx @@ -139,7 +139,7 @@ const CollectionDetailsPage: React.FC = () => {

{field.name}

-

{field.type}

+

{field.type}{field.optional && ', optional'}

))} diff --git a/ui/src/types/fields.ts b/ui/src/types/fields.ts index 64608c1..cd0cb3d 100644 --- a/ui/src/types/fields.ts +++ b/ui/src/types/fields.ts @@ -15,4 +15,5 @@ export const VALID_FIELD_TYPES = Object.values(FieldType); export interface Field { name: string; type: FieldType; -} \ No newline at end of file + optional?: boolean; +}