{"version":3,"file":"Input.mjs","sources":["../../../../../../../../../web/src/adminPortal/shared/components/Input.tsx"],"sourcesContent":["import { OutlinedInput, OutlinedInputProps, styled, SxProps, Theme } from '@mui/material';\nimport React, { ChangeEventHandler, useEffect, useState } from 'react';\n\nimport { useUniqueId } from '../../../utils/uniqueId';\nimport { InjectedComponents } from './componentInjection';\nimport { DEFAULT_GRID_COLUMN_WIDTH, DEFAULT_MAX_ITEM_WIDTH } from './constants';\n\nconst InputContainer = styled('div')<{\n  isMultiline?: boolean;\n  isReadOnly?: boolean;\n  fullWidth?: boolean;\n}>(({ isMultiline, isReadOnly, fullWidth, theme }) => [\n  {\n    [theme.breakpoints.down('md')]: {\n      width: '100%',\n      minWidth: 'unset',\n      flex: 1,\n    },\n    width: DEFAULT_GRID_COLUMN_WIDTH,\n    minWidth: DEFAULT_GRID_COLUMN_WIDTH,\n    display: 'flex',\n    flexDirection: 'column',\n    gap: theme.spacing(0.5),\n  },\n  isMultiline && {\n    width: '100%',\n    maxWidth: DEFAULT_MAX_ITEM_WIDTH,\n  },\n  isReadOnly && {\n    // Need this to wrap text and ellipsis after two lines\n    display: '-webkit-box',\n    '-webkit-line-clamp': '2',\n    '-webkit-box-orient': 'vertical',\n    overflow: 'hidden',\n    overflowWrap: 'break-word',\n  },\n  fullWidth && {\n    width: '100%',\n  },\n]);\n\nconst FileUploadContainer = styled('label')(({ theme }) => ({\n  alignItems: 'center',\n  display: 'flex',\n  marginBottom: theme.spacing(0.5),\n  gap: theme.spacing(0.5),\n}));\n\nconst FileUploadHidden = styled('input')({ display: 'none' });\n\nexport type InputCoreProps = {\n  caption?: string;\n  copyable?: boolean;\n  disabled?: boolean;\n  error?: string;\n  fileUpload?: boolean;\n  fullWidth?: boolean;\n  id?: string;\n  inputProps?: OutlinedInputProps['inputProps'];\n  inputRef?: OutlinedInputProps['inputRef'];\n  label?: string;\n  multiline?: boolean;\n  onBlur?: () => void;\n  onChange?: (value: string) => void;\n  onFocus?: () => void;\n  onKeyDown?: OutlinedInputProps['onKeyDown'];\n  placeholder?: string;\n  readOnly?: boolean;\n  readOnlyConcealed?: boolean;\n  required?: boolean;\n  type?: OutlinedInputProps['type'];\n  value?: string;\n  inputSx?: SxProps<Theme>;\n};\n\nconst FILE_UPLOAD_ID = 'file-upload';\ntype FileReaderProps = Pick<InputCoreProps, 'onChange' | 'readOnly'> & {\n  filename: string | null;\n  setFilename: (fileName: string | null) => void;\n};\n\nconst FileUpload = ({\n  onChange,\n  readOnly,\n  filename,\n  setFilename,\n  ButtonComponent: Button,\n  TypographyComponent: Typography,\n}: FileReaderProps & InjectedComponents<'Button' | 'Typography'>): JSX.Element => {\n  const [fileReader] = useState(new FileReader());\n  // Need random id to map between multiple fileInputs with potentially the same value.\n  const fileInputKey = Math.floor(Math.random() * 10000);\n\n  useEffect(() => {\n    const onLoad = () => {\n      if (typeof fileReader.result === 'string') {\n        onChange?.(fileReader.result);\n      }\n    };\n    fileReader.addEventListener('load', onLoad);\n    return () => fileReader.removeEventListener('load', onLoad);\n  }, [fileReader, onChange]);\n\n  useEffect(() => {\n    setFilename(null);\n  }, [readOnly, setFilename]);\n\n  const onFileUpload: React.ChangeEventHandler<HTMLInputElement> = (event) => {\n    const file = event.target.files ? event.target.files[0] : null;\n    const filename = file?.name ? file.name.replace('C:\\\\fakepath\\\\', '') : null;\n    setFilename(filename);\n    if (file) {\n      fileReader.readAsText(file);\n    }\n  };\n\n  // The file input onChange handler won't get called if the user tries to upload the same file again.\n  // This method resets the file value to be empty so that the same file can be read again.\n  const resetFileUpload = () => {\n    const inputElement = document.querySelector('input[type=file]') as HTMLInputElement;\n    if (inputElement) {\n      inputElement.value = '';\n    }\n  };\n\n  // The input value always starts with C:\\\\fakepath\\\\, so remove it from filename\n  const uploadedFilename = filename ?? 'No file chosen';\n  const fileInputId = `${FILE_UPLOAD_ID}-${fileInputKey}`;\n\n  return (\n    <FileUploadContainer htmlFor={fileInputId}>\n      <FileUploadHidden id={fileInputId} onChange={onFileUpload} onClick={resetFileUpload} type=\"file\" />\n      {/* The above input is set to display: none so we can use custom component styling below */}\n      {/* Button must be set to component=\"span\" for this to work */}\n      <Button compact component=\"span\" variant=\"ghost\">\n        Choose file\n      </Button>\n      <Typography>{uploadedFilename}</Typography>\n    </FileUploadContainer>\n  );\n};\n\nexport const InputCore = ({\n  caption,\n  copyable,\n  disabled,\n  error,\n  fileUpload,\n  fullWidth,\n  id,\n  inputProps,\n  inputRef,\n  label,\n  multiline,\n  onBlur,\n  onChange,\n  onFocus,\n  onKeyDown,\n  placeholder,\n  readOnly,\n  readOnlyConcealed,\n  required,\n  type,\n  value,\n  inputSx,\n  ButtonComponent,\n  CopyableTextComponent: CopyableText,\n  LabelComponent: Label,\n  TypographyComponent: Typography,\n}: InputCoreProps & InjectedComponents<'Button' | 'CopyableText' | 'Label' | 'Typography'>): JSX.Element => {\n  const inputId = useUniqueId(id);\n  const [filename, setFilename] = useState<string | null>(null);\n\n  const handleOnChange: ChangeEventHandler<HTMLInputElement> = (e) => {\n    onChange?.(e.target.value);\n\n    if (fileUpload && filename) {\n      setFilename(null);\n    }\n  };\n  const showCaption = !!caption && !error;\n  const concealedValue = value?.length ? '•'.repeat(Math.min(25, value.length)) : '';\n  const visibleValue = readOnlyConcealed ? concealedValue : value;\n  const shouldDisable = disabled && !readOnly;\n  const showCopyableText = readOnly && copyable && !!visibleValue;\n  const showPlainText = readOnly && (!copyable || !visibleValue);\n  return (\n    <InputContainer fullWidth={fullWidth} isMultiline={multiline} isReadOnly={readOnly}>\n      {label && (\n        <Label variant=\"caption\" disabled={shouldDisable} htmlFor={inputId} required={required}>\n          {label}\n        </Label>\n      )}\n      {showPlainText && <Typography>{visibleValue || '–'}</Typography>}\n      {showCopyableText && <CopyableText textToCopy={value}>{visibleValue}</CopyableText>}\n      {!readOnly && (\n        <>\n          {fileUpload && (\n            <FileUpload\n              ButtonComponent={ButtonComponent}\n              TypographyComponent={Typography}\n              filename={filename}\n              onChange={onChange}\n              readOnly={shouldDisable}\n              setFilename={setFilename}\n            />\n          )}\n          <OutlinedInput\n            sx={inputSx}\n            disabled={shouldDisable}\n            error={!!error}\n            fullWidth\n            id={inputId}\n            inputProps={inputProps}\n            inputRef={inputRef}\n            multiline={multiline}\n            onBlur={onBlur}\n            onChange={handleOnChange}\n            onFocus={onFocus}\n            onKeyDown={onKeyDown}\n            placeholder={placeholder}\n            required={required}\n            rows={3}\n            type={type}\n            value={value}\n          />\n          {showCaption && (\n            <Typography disabled={shouldDisable} variant=\"caption\" color=\"secondary\">\n              {caption}\n            </Typography>\n          )}\n          {error && (\n            <Typography variant=\"caption\" color=\"error\">\n              {error}\n            </Typography>\n          )}\n        </>\n      )}\n    </InputContainer>\n  );\n};\n"],"names":["InputContainer","styled","isMultiline","isReadOnly","fullWidth","theme","breakpoints","down","width","minWidth","flex","DEFAULT_GRID_COLUMN_WIDTH","display","flexDirection","gap","spacing","maxWidth","DEFAULT_MAX_ITEM_WIDTH","overflow","overflowWrap","FileUploadContainer","alignItems","marginBottom","FileUploadHidden","FILE_UPLOAD_ID","FileUpload","onChange","readOnly","filename","setFilename","ButtonComponent","Button","TypographyComponent","Typography","fileReader","useState","FileReader","fileInputKey","Math","floor","random","useEffect","onLoad","result","addEventListener","removeEventListener","onFileUpload","event","file","target","files","name","replace","readAsText","resetFileUpload","inputElement","document","querySelector","value","uploadedFilename","fileInputId","React","htmlFor","id","onClick","type","compact","component","variant","InputCore","caption","copyable","disabled","error","fileUpload","inputProps","inputRef","label","multiline","onBlur","onFocus","onKeyDown","placeholder","readOnlyConcealed","required","inputSx","CopyableTextComponent","CopyableText","LabelComponent","Label","inputId","useUniqueId","handleOnChange","e","showCaption","concealedValue","length","repeat","min","visibleValue","shouldDisable","showCopyableText","showPlainText","textToCopy","OutlinedInput","sx","rows","color"],"mappings":"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"}