41 lines
1.2 KiB
TypeScript
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]),
|
|
);
|
|
}
|