1
0
Fork 0
mirror of https://github.com/portainer/portainer.git synced 2025-07-20 22:09:41 +02:00
portainer/app/react/components/form-components/FileUpload/FileUploadField.tsx
Ali d38085a560
Some checks are pending
ci / build_images (map[arch:amd64 platform:linux version:]) (push) Waiting to run
ci / build_images (map[arch:amd64 platform:windows version:1809]) (push) Waiting to run
ci / build_images (map[arch:amd64 platform:windows version:ltsc2022]) (push) Waiting to run
ci / build_images (map[arch:arm platform:linux version:]) (push) Waiting to run
ci / build_images (map[arch:arm64 platform:linux version:]) (push) Waiting to run
ci / build_images (map[arch:ppc64le platform:linux version:]) (push) Waiting to run
ci / build_images (map[arch:s390x platform:linux version:]) (push) Waiting to run
ci / build_manifests (push) Blocked by required conditions
/ triage (push) Waiting to run
Lint / Run linters (push) Waiting to run
Test / test-client (push) Waiting to run
Test / test-server (map[arch:amd64 platform:linux]) (push) Waiting to run
Test / test-server (map[arch:amd64 platform:windows version:1809]) (push) Waiting to run
Test / test-server (map[arch:amd64 platform:windows version:ltsc2022]) (push) Waiting to run
Test / test-server (map[arch:arm64 platform:linux]) (push) Waiting to run
chore(data-cy): require data-cy attributes [EE-6880] (#11453)
2024-04-11 12:11:38 +12:00

76 lines
1.7 KiB
TypeScript

import { ChangeEvent, ComponentProps, createRef } from 'react';
import { Upload, XCircle } from 'lucide-react';
import { AutomationTestingProps } from '@/types';
import { Button } from '@@/buttons';
import { Icon } from '@@/Icon';
import styles from './FileUploadField.module.css';
export interface Props extends AutomationTestingProps {
onChange(value: File): void;
value?: File | null;
accept?: string;
title?: string;
required?: boolean;
inputId: string;
color?: ComponentProps<typeof Button>['color'];
name?: string;
}
export function FileUploadField({
onChange,
value,
accept,
title = 'Select a file',
required = false,
inputId,
color = 'primary',
name,
'data-cy': dataCy,
}: Props) {
const fileRef = createRef<HTMLInputElement>();
return (
<div className="file-upload-field flex gap-2">
<input
id={inputId}
ref={fileRef}
type="file"
accept={accept}
required={required}
className={styles.fileInput}
onChange={changeHandler}
aria-label="file-input"
name={name}
/>
<Button
size="small"
color={color}
onClick={handleButtonClick}
className={styles.fileButton}
data-cy={dataCy}
icon={Upload}
>
{title}
</Button>
<span className="vertical-center">
{value ? value.name : required && <Icon icon={XCircle} mode="danger" />}
</span>
</div>
);
function handleButtonClick() {
if (fileRef && fileRef.current) {
fileRef.current.click();
}
}
function changeHandler(event: ChangeEvent<HTMLInputElement>) {
if (event.target && event.target.files && event.target.files.length > 0) {
onChange(event.target.files[0]);
}
}
}