Input.tsx 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import React from "react";
  2. import InputRow from "../../values-form/InputRow";
  3. import useFormField from "../hooks/useFormField";
  4. import {
  5. GenericInputField,
  6. GetFinalVariablesFunction,
  7. InputField,
  8. StringInputFieldState,
  9. } from "../types";
  10. interface Props extends InputField {
  11. id: string;
  12. }
  13. const Input: React.FC<Props> = ({
  14. id,
  15. variable,
  16. label,
  17. required,
  18. placeholder,
  19. info,
  20. settings,
  21. isReadOnly,
  22. }) => {
  23. const {
  24. state,
  25. variables,
  26. setVars,
  27. setValidation,
  28. } = useFormField<StringInputFieldState>(id, {
  29. initValidation: {
  30. validated: settings?.default != undefined,
  31. },
  32. initVars: {
  33. [variable]: settings?.default,
  34. },
  35. });
  36. if (state == undefined) {
  37. return <></>;
  38. }
  39. const curValue =
  40. settings?.type == "number"
  41. ? !isNaN(parseFloat(variables[variable]))
  42. ? parseFloat(variables[variable])
  43. : ""
  44. : variables[variable] || "";
  45. return (
  46. <InputRow
  47. width="100%"
  48. type={settings?.type || "text"}
  49. value={curValue}
  50. unit={settings?.unit}
  51. setValue={(x: string | number) => {
  52. setVars((vars) => {
  53. return {
  54. ...vars,
  55. [variable]: x,
  56. };
  57. });
  58. setValidation((prev) => {
  59. return {
  60. ...prev,
  61. validated:
  62. settings?.type == "number"
  63. ? !isNaN(x as number)
  64. : !!(x as string).trim(),
  65. };
  66. });
  67. }}
  68. label={label}
  69. isRequired={required}
  70. placeholder={placeholder}
  71. info={info}
  72. disabled={isReadOnly}
  73. />
  74. );
  75. };
  76. export const getFinalVariablesForStringInput: GetFinalVariablesFunction = (
  77. vars,
  78. props: InputField
  79. ) => {
  80. if (vars[props.variable])
  81. return {
  82. [props.variable]:
  83. props.settings?.unit && !props.settings?.omitUnitFromValue
  84. ? vars[props.variable] + props.settings.unit
  85. : vars[props.variable],
  86. };
  87. return {
  88. [props.variable]: props.settings?.default,
  89. };
  90. };
  91. export default Input;