* Add handlePaste function and integrate it with options fields * Prevents function running if user does not paste a list, allows list items to be pasted without deleting following items * Subs useState for rhf useWatch to fix issues with multiple form fields * Sets options array as optional property in zod schema * Assigns default value to options array to fix possibly undefined type errors * Sets placedholder property as optional * maps selectText to options on mount * Removes comma & semicolon delimiting for pasted lists (new line only) & defines regex as a constant * Sets default value of placeholder to empty string, provides default fallback for component text field if placeholder is omitted. * Fix type error on placeholder * Extracts handlePaste to service function & tests thoroughly * Some improvements and tests arent needed * More fixes * Fix reporting as well * TS fixes * Do transforms to and fro from label * Add unit tests * Unit test reporting * Test Improvements * Self review feedback addressed --------- Co-authored-by: Hariom Balhara <hariombalhara@gmail.com> Co-authored-by: Anik Dhabal Babu <81948346+anikdhabal@users.noreply.github.com>
52 lines
1.3 KiB
TypeScript
52 lines
1.3 KiB
TypeScript
/**
|
|
* @fileoverview
|
|
*
|
|
* This file holds the utilities to build the options to render in the select field and it could be loaded on client side as well.
|
|
*/
|
|
import type { z } from "zod";
|
|
|
|
import type { zodFieldView } from "../zod";
|
|
|
|
type Field = z.infer<typeof zodFieldView>;
|
|
|
|
const buildOptionsFromLegacySelectText = ({ legacySelectText }: { legacySelectText: string }) => {
|
|
return legacySelectText
|
|
.trim()
|
|
.split("\n")
|
|
.map((fieldValue) => ({
|
|
label: fieldValue,
|
|
id: null,
|
|
}));
|
|
};
|
|
|
|
export const getFieldWithOptions = <T extends Field>(field: T) => {
|
|
const legacySelectText = field.selectText;
|
|
if (field.options) {
|
|
return {
|
|
...field,
|
|
options: field.options,
|
|
};
|
|
} else if (legacySelectText) {
|
|
const options = buildOptionsFromLegacySelectText({ legacySelectText });
|
|
return {
|
|
...field,
|
|
options,
|
|
};
|
|
}
|
|
return {
|
|
...field,
|
|
};
|
|
};
|
|
|
|
export function getUIOptionsForSelect(field: Field) {
|
|
return getFieldWithOptions(field).options?.map((option) => {
|
|
// We prefer option.id as that doesn't change when we change the option text/label.
|
|
// Fallback to option.label for fields saved in DB in old format which didn't have `options`
|
|
const value = option.id ?? option.label;
|
|
return {
|
|
value,
|
|
title: option.label,
|
|
};
|
|
});
|
|
}
|