Files
Investidor-V2/resources/js/lib/desk-field-visibility.ts
T

41 lines
1.2 KiB
TypeScript

type ConditionalField = {
when?: { field: string; equals: string; operator?: 'equals' | 'contains' };
};
export function deskFieldApplies(
key: string,
fields: Record<string, ConditionalField>,
payload: Record<string, unknown>,
ancestors: ReadonlySet<string> = new Set(),
): boolean {
const field = fields[key];
if (!field || ancestors.has(key)) return false;
if (!field.when) return true;
const value = payload[field.when.field];
if (field.when.operator === 'contains') {
if (
!Array.isArray(value) ||
!value.some(
(v) => typeof v === 'string' && v === field.when!.equals,
)
)
return false;
return deskFieldApplies(
field.when.field,
fields,
payload,
new Set([...ancestors, key]),
);
}
if (!['string', 'number', 'boolean'].includes(typeof value)) return false;
const answer =
typeof value === 'boolean' ? (value ? '1' : '') : String(value);
if (answer !== field.when.equals) return false;
return deskFieldApplies(
field.when.field,
fields,
payload,
new Set([...ancestors, key]),
);
}