in karavan-app/src/main/webui/src/project/files/CreateFileModal.tsx [38:123]
export function CreateFileModal() {
const [project] = useProjectStore((s) => [s.project], shallow);
const [operation, setFile] = useFileStore((s) => [s.operation, s.setFile], shallow);
const [isReset, setReset] = React.useState(false);
const [backendError, setBackendError] = React.useState<string>();
const formContext = useForm<ProjectFile>({mode: "all"});
const {getTextField} = useFormUtil(formContext);
const {
formState: {errors},
handleSubmit,
reset,
trigger
} = formContext;
useEffect(() => {
reset(new ProjectFile('', project.projectId, '', 0));
setBackendError(undefined);
setReset(true);
}, [reset, operation]);
React.useEffect(() => {
isReset && trigger();
}, [trigger, isReset]);
function closeModal() {
setFile("none");
}
const onSubmit: SubmitHandler<ProjectFile> = (data) => {
data.projectId = project.projectId;
data.code = CodeUtils.getCodeForNewFile(data.name, getProjectFileTypeName(data));
KaravanApi.saveProjectFile(data, (result, file) => {
if (result) {
onSuccess(file);
} else {
setBackendError(file?.response?.data);
}
})
}
function onSuccess (file: ProjectFile) {
EventBus.sendAlert( "Success", "File successfully created", "success");
ProjectService.refreshProjectData(project.projectId);
setFile('select', file);
}
function onKeyDown(event: React.KeyboardEvent<HTMLDivElement>): void {
if (event.key === 'Enter') {
event.preventDefault();
event.stopPropagation();
handleSubmit(onSubmit)();
}
}
return (
<Modal
title="Create file"
variant={ModalVariant.small}
isOpen={["create"].includes(operation)}
onClose={closeModal}
onKeyDown={onKeyDown}
actions={[
<Button key="confirm" variant="primary" onClick={handleSubmit(onSubmit)}
isDisabled={Object.getOwnPropertyNames(errors).length > 0}
>
Save
</Button>,
<Button key="cancel" variant="secondary" onClick={closeModal}>Cancel</Button>
]}
>
<Form autoComplete="off" isHorizontal className="create-file-form">
{getTextField('name', 'Name', {
regex: v => isValidFileName(v) || 'Not a valid filename',
length: v => v.length > 5 || 'File name should be longer that 5 characters',
name: v => !RESERVED_WORDS.includes(v) || "Reserved word",
})}
{backendError &&
<FormAlert>
<Alert variant="danger" title={backendError} aria-live="polite" isInline />
</FormAlert>
}
</Form>
</Modal>
)
}