Skip to content

Commit

Permalink
Merge pull request #1209 from gchq/BAI-1133/disable-create-buttons-if…
Browse files Browse the repository at this point in the history
…-error

Disable create and edit buttons on failure

Former-commit-id: 22bb031
  • Loading branch information
GB27247 authored May 1, 2024
2 parents ebab656 + 6d92e66 commit bb575c0
Show file tree
Hide file tree
Showing 8 changed files with 64 additions and 10 deletions.
8 changes: 6 additions & 2 deletions frontend/pages/model/[modelId]/inference/new.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { Stack } from '@mui/system'
import { CreateInferenceParams, postInference } from 'actions/inferencing'
import { useGetModel } from 'actions/model'
import { useRouter } from 'next/router'
import { FormEvent, useState } from 'react'
import { FormEvent, useCallback, useState } from 'react'
import Loading from 'src/common/Loading'
import Title from 'src/common/Title'
import InferenceForm from 'src/entry/model/inferencing/InferenceForm'
Expand All @@ -20,6 +20,7 @@ export default function NewInference() {
const [port, setPort] = useState('')
const [processorType, setProcessorType] = useState('cpu')
const [memory, setMemory] = useState(2)
const [isRegistryError, setIsRegistryError] = useState(false)
const [errorMessage, setErrorMessage] = useState('')
const [loading, setLoading] = useState(false)

Expand All @@ -31,6 +32,8 @@ export default function NewInference() {

const { model, isModelLoading, isModelError } = useGetModel(modelId)

const handleRegistryError = useCallback((value: boolean) => setIsRegistryError(value), [])

if (isModelError) {
return <MessageAlert message={isModelError.info.message} severity='error' />
}
Expand Down Expand Up @@ -101,6 +104,7 @@ export default function NewInference() {
formData={{ image, description, memory, port, processorType }}
onImageChange={(value) => setImage(value)}
onDescriptionChange={(value) => setDescription(value)}
onRegistryError={handleRegistryError}
onProcessorTypeChange={(value) => setProcessorType(value)}
onMemoryChange={(value) => setMemory(value)}
onPortChange={(value) => setPort(value)}
Expand All @@ -110,7 +114,7 @@ export default function NewInference() {
<LoadingButton
variant='contained'
type='submit'
disabled={!(image && description && port)}
disabled={!(image && description && port && !isRegistryError)}
loading={loading}
>
Create Inferencing Service
Expand Down
8 changes: 6 additions & 2 deletions frontend/pages/model/[modelId]/release/new.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { useGetModel } from 'actions/model'
import { CreateReleaseParams, postRelease, postSimpleFileForRelease } from 'actions/release'
import { AxiosProgressEvent } from 'axios'
import { useRouter } from 'next/router'
import { FormEvent, useState } from 'react'
import { FormEvent, useCallback, useState } from 'react'
import Loading from 'src/common/Loading'
import Title from 'src/common/Title'
import ReleaseForm from 'src/entry/model/releases/ReleaseForm'
Expand All @@ -26,6 +26,7 @@ export default function NewRelease() {
const [imageList, setImageList] = useState<FlattenedModelImage[]>([])
const [errorMessage, setErrorMessage] = useState('')
const [loading, setLoading] = useState(false)
const [isRegistryError, setIsRegistryError] = useState(false)
const [currentFileUploadProgress, setCurrentFileUploadProgress] = useState<FileUploadProgress | undefined>(undefined)
const [uploadedFiles, setUploadedFiles] = useState<string[]>([])
const router = useRouter()
Expand All @@ -34,6 +35,8 @@ export default function NewRelease() {
const { modelId }: { modelId?: string } = router.query
const { model, isModelLoading, isModelError } = useGetModel(modelId)

const handleRegistryError = useCallback((value: boolean) => setIsRegistryError(value), [])

const handleSubmit = async (event: FormEvent<HTMLFormElement>) => {
event.preventDefault()

Expand Down Expand Up @@ -156,6 +159,7 @@ export default function NewRelease() {
filesMetadata={filesMetadata}
onFilesMetadataChange={(value) => setFilesMetadata(value)}
onImageListChange={(value) => setImageList(value)}
onRegistryError={handleRegistryError}
currentFileUploadProgress={currentFileUploadProgress}
uploadedFiles={uploadedFiles}
filesToUploadCount={files.length}
Expand All @@ -165,7 +169,7 @@ export default function NewRelease() {
variant='contained'
loading={loading}
type='submit'
disabled={!semver || !releaseNotes || !isValidSemver(semver)}
disabled={!(semver && releaseNotes && isValidSemver(semver) && !isRegistryError)}
sx={{ width: 'fit-content' }}
data-test='createReleaseButton'
>
Expand Down
20 changes: 17 additions & 3 deletions frontend/src/Form/EditableFormHeading.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ type EditableFormHeadingProps = {
onEdit: () => void
onCancel: () => void
onSubmit: () => void
isRegistryError?: boolean
onDelete?: () => void
errorMessage?: string
deleteButtonText?: string
Expand All @@ -29,6 +30,7 @@ export default function EditableFormHeading({
errorMessage = '',
deleteButtonText = 'Delete',
showDeleteButton = false,
isRegistryError = false,
}: EditableFormHeadingProps) {
return (
<Stack sx={{ pb: 2 }}>
Expand All @@ -41,11 +43,17 @@ export default function EditableFormHeading({
{heading}
{!isEdit && (
<Stack direction='row' spacing={1} justifyContent='flex-end' alignItems='center' sx={{ mb: { xs: 2 } }}>
<Button variant='outlined' onClick={onEdit} data-test='editFormButton'>
<Button variant='outlined' onClick={onEdit} data-test='editFormButton' disabled={isRegistryError}>
{editButtonText}
</Button>
{showDeleteButton && (
<Button variant='contained' color='secondary' onClick={onDelete} data-test='deleteFormButton'>
<Button
variant='contained'
color='secondary'
onClick={onDelete}
data-test='deleteFormButton'
disabled={isRegistryError}
>
{deleteButtonText}
</Button>
)}
Expand All @@ -56,7 +64,13 @@ export default function EditableFormHeading({
<Button variant='outlined' onClick={onCancel} data-test='cancelEditFormButton'>
Cancel
</Button>
<LoadingButton variant='contained' loading={isLoading} onClick={onSubmit} data-test='saveEditFormButton'>
<LoadingButton
variant='contained'
loading={isLoading}
onClick={onSubmit}
data-test='saveEditFormButton'
disabled={isRegistryError}
>
Save
</LoadingButton>
</Stack>
Expand Down
16 changes: 14 additions & 2 deletions frontend/src/entry/model/ModelImageList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Typography } from '@mui/material'
import Autocomplete, { AutocompleteRenderInputParams } from '@mui/material/Autocomplete'
import TextField from '@mui/material/TextField'
import { useGetModelImages } from 'actions/model'
import { SyntheticEvent, useMemo } from 'react'
import { SyntheticEvent, useEffect, useMemo } from 'react'
import Loading from 'src/common/Loading'
import MessageAlert from 'src/MessageAlert'
import { EntryInterface, FlattenedModelImage } from 'types/types'
Expand All @@ -22,12 +22,24 @@ type PartialModelImageListProps =

type ModelImageListProps = {
model: EntryInterface
onRegistryError: (value: boolean) => void
readOnly?: boolean
} & PartialModelImageListProps

export default function ModelImageList({ model, value, onChange, readOnly = false, multiple }: ModelImageListProps) {
export default function ModelImageList({
model,
value,
onChange,
onRegistryError,
readOnly = false,
multiple,
}: ModelImageListProps) {
const { modelImages, isModelImagesLoading, isModelImagesError } = useGetModelImages(model.id)

useEffect(() => {
onRegistryError(!!isModelImagesError)
}, [isModelImagesError, onRegistryError])

const sortedImageList = useMemo(() => {
const flattenedImageList: FlattenedModelImage[] = []

Expand Down
5 changes: 5 additions & 0 deletions frontend/src/entry/model/inferencing/EditableInference.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ export default function EditableInference({ inference }: EditableInferenceProps)
const [processorType, setProcessorType] = useState(inference.settings.processorType)
const [memory, setMemory] = useState(inference.settings.memory)
const [errorMessage, setErrorMessage] = useState('')
const [isRegistryError, setIsRegistryError] = useState(false)
const [isLoading, setIsLoading] = useState(false)
const [isEdit, onIsEditChange] = useState(false)

Expand All @@ -41,6 +42,8 @@ export default function EditableInference({ inference }: EditableInferenceProps)
setMemory(inference.settings.memory)
}, [setDescription, setPort, setProcessorType, setMemory, inference])

const handleRegistryError = useCallback((value: boolean) => setIsRegistryError(value), [])

useEffect(() => {
resetForm()
}, [resetForm])
Expand Down Expand Up @@ -108,6 +111,7 @@ export default function EditableInference({ inference }: EditableInferenceProps)
onCancel={handleCancel}
onSubmit={handleSubmit}
errorMessage={errorMessage}
isRegistryError={isRegistryError}
editButtonText='Edit Settings'
/>
<InferenceForm
Expand All @@ -117,6 +121,7 @@ export default function EditableInference({ inference }: EditableInferenceProps)
formData={{ image, description, port, processorType, memory }}
onImageChange={(value) => setImage(value)}
onDescriptionChange={(value) => setDescription(value)}
onRegistryError={handleRegistryError}
onProcessorTypeChange={(value) => setProcessorType(value)}
onMemoryChange={(value) => setMemory(value)}
onPortChange={(value) => setPort(value)}
Expand Down
9 changes: 8 additions & 1 deletion frontend/src/entry/model/inferencing/InferenceForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ type InferenceFormProps = {
onDescriptionChange: (value: string) => void
onPortChange: (value: string) => void
onProcessorTypeChange: (value: string) => void
onRegistryError: (value: boolean) => void
onMemoryChange: (value: number) => void
} & EditableInferenceFormProps

Expand All @@ -44,6 +45,7 @@ export default function InferenceForm({
onPortChange,
onProcessorTypeChange,
onMemoryChange,
onRegistryError,
editable = false,
isEdit = false,
}: InferenceFormProps) {
Expand Down Expand Up @@ -91,7 +93,12 @@ export default function InferenceForm({
Image
{!isReadOnly && <span style={{ color: theme.palette.error.main }}>*</span>}
</Typography>
<ModelImageList model={model} value={formData.image} onChange={handleImageChange} />
<ModelImageList
model={model}
value={formData.image}
onChange={handleImageChange}
onRegistryError={onRegistryError}
/>
</>
)}
<Stack>
Expand Down
5 changes: 5 additions & 0 deletions frontend/src/entry/model/releases/EditableRelease.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ export default function EditableRelease({ release, isEdit, onIsEditChange }: Edi
const [imageList, setImageList] = useState<FlattenedModelImage[]>(release.images)
const [errorMessage, setErrorMessage] = useState('')
const [isLoading, setIsLoading] = useState(false)
const [isRegistryError, setIsRegistryError] = useState(false)
const [currentFileUploadProgress, setCurrentFileUploadProgress] = useState<FileUploadProgress | undefined>(undefined)
const [uploadedFiles, setUploadedFiles] = useState<string[]>([])
const [open, setOpen] = useState(false)
Expand All @@ -57,6 +58,8 @@ export default function EditableRelease({ release, isEdit, onIsEditChange }: Edi
const { setUnsavedChanges } = useContext(UnsavedChangesContext)
const router = useRouter()

const handleRegistryError = useCallback((value: boolean) => setIsRegistryError(value), [])

const handleDeleteConfirm = useCallback(async () => {
setErrorMessage('')
if (model) {
Expand Down Expand Up @@ -195,6 +198,7 @@ export default function EditableRelease({ release, isEdit, onIsEditChange }: Edi
onSubmit={handleSubmit}
onDelete={() => setOpen(true)}
errorMessage={errorMessage}
isRegistryError={isRegistryError}
/>
<ReleaseForm
editable
Expand All @@ -214,6 +218,7 @@ export default function EditableRelease({ release, isEdit, onIsEditChange }: Edi
onFilesChange={(value) => setFiles(value)}
onFilesMetadataChange={(value) => setFilesMetadata(value)}
onImageListChange={(value) => setImageList(value)}
onRegistryError={handleRegistryError}
currentFileUploadProgress={currentFileUploadProgress}
uploadedFiles={uploadedFiles}
filesToUploadCount={filesToUploadCount}
Expand Down
3 changes: 3 additions & 0 deletions frontend/src/entry/model/releases/ReleaseForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ type ReleaseFormProps = {
filesMetadata: FileWithMetadata[]
onFilesMetadataChange: (value: FileWithMetadata[]) => void
onImageListChange: (value: FlattenedModelImage[]) => void
onRegistryError: (value: boolean) => void
currentFileUploadProgress?: FileUploadProgress
uploadedFiles: string[]
filesToUploadCount: number
Expand All @@ -56,6 +57,7 @@ export default function ReleaseForm({
filesMetadata,
onFilesMetadataChange,
onImageListChange,
onRegistryError,
editable = false,
isEdit = false,
currentFileUploadProgress,
Expand Down Expand Up @@ -222,6 +224,7 @@ export default function ReleaseForm({
value={formData.imageList}
readOnly={isReadOnly}
onChange={onImageListChange}
onRegistryError={onRegistryError}
/>
{isReadOnly && formData.imageList.length === 0 && <ReadOnlyAnswer value='No images' />}
</Stack>
Expand Down

0 comments on commit bb575c0

Please sign in to comment.