import React from 'react';
import Form from 'react-bootstrap-v5/lib/Form';
import Col from 'react-bootstrap-v5/lib/Col';
export function validateRequiredFields(component, fields) {
let updateState = {};
let failed = false;
for (let i = 0; i < fields.length; i++) {
const field = fields[i];
if (!component.state[field]) {
// explicitly set field to empty string, component triggers validation error UI.
updateState[field] = '';
failed = true;
}
}
if (failed) {
component.setState(updateState);
return false;
}
return true;
}
export function handleChange(event, valueGetter = x => x.value) {
let newState = { ...this.state };
let st = newState;
const parts = event.target.name.split(/\./);
for (let i = 0; i < parts.length - 1; i++) {
const part = parts[i];
if (st[part] === undefined) {
st[part] = {}
}
st = st[part]
}
const part = parts[parts.length - 1]
const v = valueGetter(event.target);
st[part] = v;
this.setState(newState);
}
export function stateProperty(component, name, defaultValue = "") {
let st = component.state;
const parts = name.split(/\./);
for (let i = 0; i < parts.length; i++) {
const part = parts[i];
if (st === undefined) {
return undefined;
}
if (part in st) {
st = st[part];
} else {
return defaultValue;
}
}
return st;
}
export function RequiredField(component, label, name, props = {}, helpText = null) {
return
{label}
{helpText && {helpText}}
{label} Is Required
}
export function OptionalField(component, label, name, props = {}, helpText = null, invalidFeedback = null) {
return {label}
{helpText && {helpText}}
{invalidFeedback && {invalidFeedback}}
}
function valueToNumber(t) {
if (t.value === "") {
return undefined;
}
const v = Number.parseInt(t.value);
if (isNaN(v)) {
return t.value + '';
}
return v;
}
function isInvalidNumber(v) {
if (v === undefined || v === '') {
return false
}
if (isNaN(Number.parseInt(v))) {
return true;
}
return false;
}
export function OptionalNumberField(component, label, name, props = {}) {
return {label} component.handleChange(e, valueToNumber)}
data-testid={'control-' + name}
{...props} />
Must be a valid number or empty
}
export function RequiredNumberField(component, label, name, props = {}) {
return {label} component.handleChange(e, valueToNumber)}
data-testid={'control-' + name}
{...props} />
Must be a valid number or empty
}
export function hasExactlyOneOf(component, names) {
let count = 0;
for (let i = 0; i < names.length; i++) {
if (stateProperty(component, names[i])) {
count++
}
}
return count === 1;
}
function checkedToBool(t) {
if (t.checked) {
return true;
}
return false;
}
export function RequiredBoolean(component, label, name, helpText) {
return component.handleChange(e, checkedToBool)}
data-testid={'control-' + name}
type="checkbox" />
{helpText && {helpText}}
}
function optionalBooleanValue(target) {
if (target.value === "true") {
return true;
}
if (target.value === "false") {
return false;
}
return undefined;
}
export function OptionalBoolean(component, label, name, defaultLabel) {
return {label} component.handleChange(e, optionalBooleanValue)}
as="select">
}
function listToMultilineString(v) {
if (v) {
return v.join("\n");
}
return "";
}
function multilineStringToList(target) {
const v = target.value;
if (v === "") {
return undefined;
}
return v.split(/\n/);
}
export function StringList(component, label, name, helpText) {
return {label} component.handleChange(e, multilineStringToList)}
as="textarea"
rows="5">
{helpText}
}