diff --git a/pages/api/auth/[...nextauth].ts b/pages/api/auth/[...nextauth].ts index c4d36c81c3ff3aa9d0a05298c4e24f6453608f18..b8a6f9166acafc23e24405cd23724c8c03c4cbc9 100644 --- a/pages/api/auth/[...nextauth].ts +++ b/pages/api/auth/[...nextauth].ts @@ -1,6 +1,7 @@ import NextAuth from 'next-auth' import KeycloakProvider from 'next-auth/providers/keycloak' +const secretSessionKey = process.env.SECRET_SESSION_KEY || 'UItTuD1HcGXIj8ZfHUswhYdNd40Lc325R8VlxQPUoR0=' const clientId = 'gwdg-fdoman-test' const clientSecret = process.env.KEY_CLOAK_CLIENT_SECRET || '' const issuer = 'https://keycloak.sso.gwdg.de/auth/realms/academiccloud' @@ -101,7 +102,7 @@ export const authOptions = { } } - if (token.lastRefresh + 10000 > Date.now()) { + if (token.lastRefresh + 60000 > Date.now()) { // return if last refresh is 10 seconds or younger return token } @@ -110,6 +111,6 @@ export const authOptions = { return refreshAccessToken(token) } }, - secret: 'UItTuD1HcGXIj8ZfHUswhYdNd40Lc325R8VlxQPUoR0=' + secret: secretSessionKey } export default NextAuth(authOptions) diff --git a/pages/fdo/create/index.tsx b/pages/fdo/create/index.tsx index d7ca06451756338dbe34d5e3b670ca9bbf17e09c..dfd6827e2247e0015f1226c1891eb59791f4b5c0 100644 --- a/pages/fdo/create/index.tsx +++ b/pages/fdo/create/index.tsx @@ -6,10 +6,14 @@ import { GetServerSideProps } from 'next' import { serverSideTranslations } from 'next-i18next/serverSideTranslations' const CreateFDO = () => { + return <FdoCreate/> + /* return ( <Authenticated key="fdo-create"> <FdoCreate/> </Authenticated>) + + */ } export default CreateFDO diff --git a/src/components/fdos/create.tsx b/src/components/fdos/create.tsx index 227bdd51b47da8971844bc340a9a4d1aa98a8a9c..b5df2af7ed4e0fcb0ad3f16327f276aaa5c76cf2 100644 --- a/src/components/fdos/create.tsx +++ b/src/components/fdos/create.tsx @@ -1,5 +1,8 @@ +import { useState, useEffect } from 'react' import { useGo, IResourceComponentsProps, useList, HttpError, useGetIdentity } from '@refinedev/core' -import { Create, SaveButton } from '@refinedev/mui' +import { Create } from '@refinedev/mui' +import LoadingButton from '@mui/lab/LoadingButton' +import SaveIcon from '@mui/icons-material/Save' import { useTheme, styled } from '@mui/material/styles' import Skeleton from '@mui/material/Skeleton' @@ -112,14 +115,30 @@ const VisuallyHiddenInput = styled('input')({ width: 1 }) -const StepMetadata: React.FC<any> = ({ control, register, errors }) => { - return <FileUpload register={register} errors={errors} name="fdo_metadata" label="Upload metadata file"/> +const StepMetadata: React.FC<any> = ({ control, register, errors, setError }) => { + return <FileUpload register={register} errors={errors} name="fdo_metadata" validate={validate} label="Upload metadata file" setError={setError}/> } -const FileUpload: React.FC<any> = ({ register, errors, name, label }) => { +const FileUpload: React.FC<any> = ({ register, errors, name, label, setError }) => { + const validate = { lessThan10MB: files => files[0]?.size < 10000000 || 'Max 10MB' } + const accept = 'max 10MB' + const [files, setFiles] = useState([]) + const inputProps = register(name, { + required: 'This field is required.', + validate + }) + + console.log(inputProps) + const onChange = (e: any) => { + setFiles(e.target?.files) + inputProps.onChange(e) + } + return ( + <Stack> + {accept && <FormHelperText>Accepted: {accept}</FormHelperText>} <FormControl error={!!errors[name]} fullWidth> - <span> + <span> <Button component="label" role={undefined} @@ -128,11 +147,13 @@ const FileUpload: React.FC<any> = ({ register, errors, name, label }) => { startIcon={<CloudUploadIcon />} > {label} - <VisuallyHiddenInput {...register(name, { required: 'This field is required.' })} type="file"/> - </Button> + <VisuallyHiddenInput {...inputProps} accept={accept} onChange={onChange} type="file"/> + </Button> </span> + <FormHelperText>{files.length > 0 && files[0].name }</FormHelperText> <FormHelperText>{errors[name]?.message}</FormHelperText> </FormControl> + </Stack> ) } @@ -146,7 +167,9 @@ export const FdoCreate: React.FC<IResourceComponentsProps> = () => { console.log('accessToken: ', accessToken) const formRet = useStepsForm<any, HttpError, any>({ defaultValues: { repository: '', profile: '' }, refineCoreProps: { meta: { headers: { Authentication: `Bearer ${accessToken}` } } } }) + console.log('formRet', formRet) const { + setError, saveButtonProps, refineCore: { formLoading, onFinish, @@ -177,15 +200,15 @@ export const FdoCreate: React.FC<IResourceComponentsProps> = () => { switch (step) { case 0: return ( - <StepRepository control={control} register={register} errors={errors}/> + <StepRepository control={control} register={register} errors={errors} setError={setError}/> ) case 1: return ( - <StepMetadata control={control} register={register} errors={errors}/> + <StepMetadata control={control} register={register} errors={errors} setError={setError}/> ) case 2: return ( - <StepData control={control} register={register} errors={errors}/> + <StepData control={control} register={register} errors={errors} setError={setError}/> ) } } @@ -216,7 +239,15 @@ export const FdoCreate: React.FC<IResourceComponentsProps> = () => { </Button> )} {currentStep === stepTitles.length - 1 && ( - <SaveButton onClick={handleSubmit(onSubmit)} /> + <LoadingButton + loading={isLoading} + loadingPosition="start" + startIcon={<SaveIcon />} + variant="outlined" + onClick={handleSubmit(onSubmit)} + > + Save + </LoadingButton> )} </> } diff --git a/src/components/fdos/list.tsx b/src/components/fdos/list.tsx index f3dc4718c9ebb150fb063a4ff36bf152eeda2163..58697f2e9ea381da08d58cdcae87099e7d0027d1 100644 --- a/src/components/fdos/list.tsx +++ b/src/components/fdos/list.tsx @@ -26,7 +26,7 @@ const columns: Array<GridColDef<OperationsLogRecord>> = [ type: 'string', renderCell: (params): string => { console.log('params', params) - return '' + return <Link href={`/fdo/${params.id}`}>{params.id}</Link> } } ] diff --git a/src/providers/dataProvider.tsx b/src/providers/dataProvider.tsx index 2a905a747287a31cdee2e643f6ab282e62395a7d..ad9336c3ff689963788784e108d9cab37b8e00ee 100644 --- a/src/providers/dataProvider.tsx +++ b/src/providers/dataProvider.tsx @@ -94,7 +94,7 @@ const apiDataProvider = (apiUrl: string): DataProvider => { }, getList: async ({ resource, pagination, sorters, filters, meta }) => { const data = (await callOperation(resource, 'list', { pagination, sorters, filters, meta })).data - return { data, total: data.length } + return { data, total: data?.length || 0 } }, getApiUrl: () => apiUrl }