fixes
This commit is contained in:
@@ -80,9 +80,9 @@ export default function GenericForm({
|
|||||||
const queryResult = queries[index];
|
const queryResult = queries[index];
|
||||||
const dataArray = queryResult?.data && Array.isArray(queryResult.data) ? queryResult.data : (queryResult?.data?.data ?? []);
|
const dataArray = queryResult?.data && Array.isArray(queryResult.data) ? queryResult.data : (queryResult?.data?.data ?? []);
|
||||||
console.log('Relation query result for', relName, 'raw:', queryResult?.data);
|
console.log('Relation query result for', relName, 'raw:', queryResult?.data);
|
||||||
map[relName] = dataArray;
|
console.log('Relation data for', relName, ':', dataArray.slice(0, 1));
|
||||||
});
|
map[relName] = dataArray;
|
||||||
console.log('Final relationDataMap:', map);
|
});
|
||||||
return map;
|
return map;
|
||||||
}, [allRelations, queries]);
|
}, [allRelations, queries]);
|
||||||
|
|
||||||
|
|||||||
@@ -3,14 +3,17 @@ import { getFieldOptions } from '../../utils/options';
|
|||||||
import { FieldComponentProps } from '../../types/overrides';
|
import { FieldComponentProps } from '../../types/overrides';
|
||||||
|
|
||||||
export default function RelationField({ field, value, onChange, disabled, relationDataMap = {} }: FieldComponentProps) {
|
export default function RelationField({ field, value, onChange, disabled, relationDataMap = {} }: FieldComponentProps) {
|
||||||
|
console.log('RelationField render', field.label, 'enumOption:', field.enumOption, 'value prop:', value);
|
||||||
const relationName = field.relation ?? (field as any).refers;
|
const relationName = field.relation ?? (field as any).refers;
|
||||||
if (!relationName || !relationDataMap[relationName]) {
|
if (!relationName || !relationDataMap[relationName]) {
|
||||||
throw new Error(`Relation data for "${relationName}" is missing – cannot render options for field "${field.label}"`);
|
throw new Error(`Relation data for "${relationName}" is missing – cannot render options for field "${field.label}"`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const relationData = relationDataMap[relationName];
|
const relationData = relationDataMap[relationName];
|
||||||
const isArrayRelation = field.type === 'array';
|
const isArrayRelation = field.type === 'array';
|
||||||
const options = getFieldOptions(field, relationData);
|
const options = getFieldOptions(field, relationData);
|
||||||
|
console.log('Options for', field.label, 'keys:', options.map(o=>o.key));
|
||||||
if (options.length === 0) {
|
if (options.length === 0) {
|
||||||
throw new Error(`No selectable options available for field "${field.label}" (relation "${relationName}")`);
|
throw new Error(`No selectable options available for field "${field.label}" (relation "${relationName}")`);
|
||||||
}
|
}
|
||||||
@@ -19,12 +22,18 @@ export default function RelationField({ field, value, onChange, disabled, relati
|
|||||||
|
|
||||||
const normalizedValue = (() => {
|
const normalizedValue = (() => {
|
||||||
if (isArrayRelation && Array.isArray(value)) {
|
if (isArrayRelation && Array.isArray(value)) {
|
||||||
return value.map((v: any) => (v != null && typeof v === 'object' ? String(v[keyField] ?? '') : String(v)));
|
return value.map((v: any) => {
|
||||||
|
if (v != null && typeof v === 'object') {
|
||||||
|
return String(v[keyField] ?? '');
|
||||||
|
}
|
||||||
|
return String(v);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
if (value != null && typeof value === 'object') {
|
if (value != null && typeof value === 'object') {
|
||||||
return String(value[keyField] ?? '');
|
return String(value[keyField] ?? '');
|
||||||
}
|
}
|
||||||
return value ?? (isArrayRelation ? [] : "");
|
// Primitive (number/string) – coerce to string for Select compatibility
|
||||||
|
return value != null ? String(value) : (isArrayRelation ? [] : "");
|
||||||
})();
|
})();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -38,10 +47,13 @@ export default function RelationField({ field, value, onChange, disabled, relati
|
|||||||
onChange={(e) => onChange(e.target.value)}
|
onChange={(e) => onChange(e.target.value)}
|
||||||
disabled={disabled}
|
disabled={disabled}
|
||||||
renderValue={(selected: any) => {
|
renderValue={(selected: any) => {
|
||||||
|
console.log('Select renderValue for', field.label, 'selected:', selected);
|
||||||
if (isArrayRelation) {
|
if (isArrayRelation) {
|
||||||
return (selected as string[]).map(k => options.find(o => o.key === k)?.value ?? k).join(', ');
|
return (selected as string[]).map(k => options.find(o => o.key === k)?.value ?? k).join(', ');
|
||||||
}
|
}
|
||||||
return options.find(o => o.key === selected)?.value ?? selected;
|
const display = options.find(o => o.key === selected)?.value ?? selected;
|
||||||
|
console.log('Display value for', field.label, ':', display);
|
||||||
|
return display;
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{options.map((opt) => (
|
{options.map((opt) => (
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ export function resolveTemplate(template: string, item: any): string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function getFieldOptions(field: ResourceField, relationData?: any[]): SelectOption[] {
|
export function getFieldOptions(field: ResourceField, relationData?: any[]): SelectOption[] {
|
||||||
|
console.log('getFieldOptions called for field', field.label, 'type', field.type, 'enumOption', field.enumOption);
|
||||||
if (field.type === 'enum') {
|
if (field.type === 'enum') {
|
||||||
return (field.options ?? []).map(opt => ({
|
return (field.options ?? []).map(opt => ({
|
||||||
key: opt,
|
key: opt,
|
||||||
@@ -28,11 +29,12 @@ export function getFieldOptions(field: ResourceField, relationData?: any[]): Sel
|
|||||||
`Define referenceOptions.enumOption in the configuration for resource "${field.relation}".`
|
`Define referenceOptions.enumOption in the configuration for resource "${field.relation}".`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
const result = data.map(item => ({
|
||||||
return data.map(item => ({
|
key: String(item[enumOption.key] ?? item.id ?? item._id),
|
||||||
key: String(item[enumOption.key]),
|
|
||||||
value: resolveTemplate(enumOption.value, item),
|
value: resolveTemplate(enumOption.value, item),
|
||||||
}));
|
}));
|
||||||
|
console.log('Option map for', field.relation, 'first entry:', data[0], 'result key:', result[0]?.key);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
return [];
|
return [];
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ export const configuration: Record<string, ResourceOverride> = {
|
|||||||
accounts: {
|
accounts: {
|
||||||
referenceOptions: {
|
referenceOptions: {
|
||||||
enumOption: {
|
enumOption: {
|
||||||
key: 'id',
|
key: '_id',
|
||||||
value: '{name} - XX{number}',
|
value: '{name} - XX{number}',
|
||||||
},
|
},
|
||||||
autoComplete: true,
|
autoComplete: true,
|
||||||
@@ -86,7 +86,7 @@ export const configuration: Record<string, ResourceOverride> = {
|
|||||||
tags: {
|
tags: {
|
||||||
referenceOptions: {
|
referenceOptions: {
|
||||||
enumOption: {
|
enumOption: {
|
||||||
key: 'id',
|
key: '_id',
|
||||||
value: '{icon} {name}',
|
value: '{icon} {name}',
|
||||||
},
|
},
|
||||||
autoComplete: true,
|
autoComplete: true,
|
||||||
|
|||||||
Reference in New Issue
Block a user