This commit is contained in:
Dawid Wysokiński 2021-03-13 16:57:18 +01:00
parent 7b7aef9a1f
commit 5721ebc869
6 changed files with 218 additions and 149 deletions

View File

@ -9,3 +9,4 @@ generates:
skipTypename: true skipTypename: true
scalars: scalars:
ID: number ID: number
Time: Date | string

View File

@ -16,6 +16,7 @@ import {
Group as GroupIcon, Group as GroupIcon,
Work as WorkIcon, Work as WorkIcon,
Description as DescriptionIcon, Description as DescriptionIcon,
QuestionAnswer as QuestionAnswerIcon,
} from '@material-ui/icons'; } from '@material-ui/icons';
import Nav from './components/Nav/Nav'; import Nav from './components/Nav/Nav';
import CurrentUser from './components/CurrentUser/CurrentUser'; import CurrentUser from './components/CurrentUser/CurrentUser';
@ -51,6 +52,12 @@ const Sidebar = ({ className, open, variant, onClose, onOpen }: Props) => {
exact: true, exact: true,
Icon: <DescriptionIcon color="inherit" />, Icon: <DescriptionIcon color="inherit" />,
}, },
{
name: 'Pytania',
to: Route.QuestionsPage,
exact: true,
Icon: <QuestionAnswerIcon color="inherit" />,
},
]; ];
useEffect(() => { useEffect(() => {

View File

@ -1,7 +1,6 @@
import { useForm } from 'react-hook-form'; import { useForm, Controller } from 'react-hook-form';
import { pick } from 'lodash'; import { pick } from 'lodash';
import { MAX_NAME_LENGTH } from './constants'; import { QuestionInput, Question, Maybe, Answer } from 'libs/graphql/types';
import { QuestionInput, Question } from 'libs/graphql/types';
import { makeStyles } from '@material-ui/core/styles'; import { makeStyles } from '@material-ui/core/styles';
import { import {
@ -11,9 +10,11 @@ import {
DialogContent, DialogContent,
DialogProps, DialogProps,
DialogTitle, DialogTitle,
MenuItem,
TextField, TextField,
} from '@material-ui/core'; } from '@material-ui/core';
import { Maybe } from 'graphql/jsutils/Maybe';
const ANSWERS = Object.keys(Answer);
export interface FormDialogProps extends Pick<DialogProps, 'open'> { export interface FormDialogProps extends Pick<DialogProps, 'open'> {
question?: Maybe<Question>; question?: Maybe<Question>;
@ -27,6 +28,7 @@ const FormDialog = ({ open, onClose, question, onSubmit }: FormDialogProps) => {
register, register,
handleSubmit, handleSubmit,
errors, errors,
control,
formState: { isSubmitting }, formState: { isSubmitting },
} = useForm<QuestionInput>({}); } = useForm<QuestionInput>({});
const classes = useStyles(); const classes = useStyles();
@ -59,18 +61,73 @@ const FormDialog = ({ open, onClose, question, onSubmit }: FormDialogProps) => {
<TextField <TextField
fullWidth fullWidth
label="Treść pytania" label="Treść pytania"
name="name" name="content"
multiline
defaultValue={question?.content} defaultValue={question?.content}
inputRef={register({ inputRef={register({
required: 'Te pole jest wymagane.', required: 'Te pole jest wymagane.',
maxLength: {
value: MAX_NAME_LENGTH,
message: `Maksymalna długość nazwy zawodu to ${MAX_NAME_LENGTH} znaki.`,
},
})} })}
error={!!errors.content} error={!!errors.content}
helperText={errors.content?.message ?? ''} helperText={errors.content?.message ?? ''}
/> />
<TextField
fullWidth
label="Z"
name="from"
defaultValue={question?.from}
inputRef={register({
required: 'Te pole jest wymagane.',
})}
error={!!errors.from}
helperText={errors.from?.message ?? ''}
/>
<TextField
fullWidth
label="Wyjaśnienie"
name="explanation"
multiline
defaultValue={question?.explanation}
inputRef={register}
error={!!errors.explanation}
helperText={errors.explanation?.message ?? ''}
/>
<Controller
name="correctAnswer"
defaultValue={question?.correctAnswer ?? ANSWERS[0]}
control={control}
as={
<TextField select fullWidth label="Poprawna odpowiedź">
{ANSWERS.map(answer => (
<MenuItem key={answer} value={answer}>
{answer}
</MenuItem>
))}
</TextField>
}
/>
{ANSWERS.map(answer => {
const upper = answer.toUpperCase();
return (
//(question as any)[`answer${upper}`]
<TextField
fullWidth
key={upper}
label={`Odpowiedź ${upper}`}
name={`answer${upper}`}
multiline
defaultValue={
question ? question[`answer${upper}` as keyof Question] : ''
}
inputRef={register({
required: 'Te pole jest wymagane.',
})}
error={!!errors[`answer${upper}` as keyof QuestionInput]}
helperText={
errors[`answer${upper}` as keyof QuestionInput]?.message ?? ''
}
/>
);
})}
</DialogContent> </DialogContent>
<DialogActions> <DialogActions>
<Button <Button

View File

@ -1 +0,0 @@
export const MAX_NAME_LENGTH = 100;

View File

@ -9,6 +9,11 @@ export const COLUMNS: Column<Question>[] = [
sortable: true, sortable: true,
label: 'ID', label: 'ID',
}, },
{
field: 'from',
sortable: true,
label: 'Z',
},
{ {
field: 'content', field: 'content',
sortable: true, sortable: true,
@ -16,7 +21,7 @@ export const COLUMNS: Column<Question>[] = [
}, },
{ {
field: 'qualification', field: 'qualification',
sortable: true, sortable: false,
label: 'Kwalifikacja', label: 'Kwalifikacja',
valueFormatter: v => { valueFormatter: v => {
return `${v.qualification?.code ?? '-'} (ID: ${ return `${v.qualification?.code ?? '-'} (ID: ${

View File

@ -9,33 +9,48 @@ export type Scalars = {
Boolean: boolean; Boolean: boolean;
Int: number; Int: number;
Float: number; Float: number;
Time: any;
Upload: any; Upload: any;
Time: Date | string;
}; };
export type UserWithToken = {
token: Scalars['String'];
user: User;
};
export type ProfessionInput = { export type ProfessionInput = {
name?: Maybe<Scalars['String']>; name?: Maybe<Scalars['String']>;
description?: Maybe<Scalars['String']>; description?: Maybe<Scalars['String']>;
}; };
export type QualificationList = {
export type UserList = {
total: Scalars['Int']; total: Scalars['Int'];
items?: Maybe<Array<Qualification>>; items?: Maybe<Array<User>>;
}; };
export type UserInput = {
displayName?: Maybe<Scalars['String']>;
password?: Maybe<Scalars['String']>;
email?: Maybe<Scalars['String']>;
role?: Maybe<Role>;
activated?: Maybe<Scalars['Boolean']>;
};
export type QuestionFilter = {
id?: Maybe<Array<Scalars['ID']>>;
idNEQ?: Maybe<Array<Scalars['ID']>>;
from?: Maybe<Array<Scalars['String']>>;
contentIEQ?: Maybe<Scalars['String']>;
contentMATCH?: Maybe<Scalars['String']>;
qualificationID?: Maybe<Array<Scalars['Int']>>;
qualificationIDNEQ?: Maybe<Array<Scalars['Int']>>;
qualificationFilter?: Maybe<QualificationFilter>;
createdAt?: Maybe<Scalars['Time']>;
createdAtGT?: Maybe<Scalars['Time']>;
createdAtGTE?: Maybe<Scalars['Time']>;
createdAtLT?: Maybe<Scalars['Time']>;
createdAtLTE?: Maybe<Scalars['Time']>;
};
export enum Role {
Admin = 'admin',
User = 'user'
}
export type User = { export type User = {
id: Scalars['ID']; id: Scalars['ID'];
@ -53,6 +68,25 @@ export type UserFilterOr = {
emailMATCH?: Maybe<Scalars['String']>; emailMATCH?: Maybe<Scalars['String']>;
}; };
export type ProfessionFilter = {
id?: Maybe<Array<Scalars['ID']>>;
idNEQ?: Maybe<Array<Scalars['ID']>>;
slug?: Maybe<Array<Scalars['String']>>;
slugNEQ?: Maybe<Array<Scalars['String']>>;
name?: Maybe<Array<Scalars['String']>>;
nameNEQ?: Maybe<Array<Scalars['String']>>;
nameIEQ?: Maybe<Scalars['String']>;
nameMATCH?: Maybe<Scalars['String']>;
descriptionIEQ?: Maybe<Scalars['String']>;
descriptionMATCH?: Maybe<Scalars['String']>;
qualificationID?: Maybe<Array<Scalars['ID']>>;
createdAt?: Maybe<Scalars['Time']>;
createdAtGT?: Maybe<Scalars['Time']>;
createdAtGTE?: Maybe<Scalars['Time']>;
createdAtLT?: Maybe<Scalars['Time']>;
createdAtLTE?: Maybe<Scalars['Time']>;
};
export type Qualification = { export type Qualification = {
id: Scalars['ID']; id: Scalars['ID'];
slug: Scalars['String']; slug: Scalars['String'];
@ -63,12 +97,17 @@ export type Qualification = {
createdAt: Scalars['Time']; createdAt: Scalars['Time'];
}; };
export enum Answer { export type QualificationFilterOr = {
A = 'a', nameMatch?: Maybe<Scalars['String']>;
B = 'b', nameIEQ?: Maybe<Scalars['String']>;
C = 'c', codeMatch?: Maybe<Scalars['String']>;
D = 'd' codeIEQ?: Maybe<Scalars['String']>;
} };
export type QuestionList = {
total: Scalars['Int'];
items?: Maybe<Array<Question>>;
};
export type QuestionInput = { export type QuestionInput = {
content?: Maybe<Scalars['String']>; content?: Maybe<Scalars['String']>;
@ -78,78 +117,45 @@ export type QuestionInput = {
qualificationID?: Maybe<Scalars['Int']>; qualificationID?: Maybe<Scalars['Int']>;
image?: Maybe<Scalars['Upload']>; image?: Maybe<Scalars['Upload']>;
deleteImage?: Maybe<Scalars['Boolean']>; deleteImage?: Maybe<Scalars['Boolean']>;
answerA?: Maybe<Answer>; answerA?: Maybe<Scalars['String']>;
answerAImage?: Maybe<Scalars['Upload']>; answerAImage?: Maybe<Scalars['Upload']>;
deleteAnswerAImage?: Maybe<Scalars['Boolean']>; deleteAnswerAImage?: Maybe<Scalars['Boolean']>;
answerB?: Maybe<Answer>; answerB?: Maybe<Scalars['String']>;
answerBImage?: Maybe<Scalars['Upload']>; answerBImage?: Maybe<Scalars['Upload']>;
deleteAnswerBImage?: Maybe<Scalars['Boolean']>; deleteAnswerBImage?: Maybe<Scalars['Boolean']>;
answerC?: Maybe<Answer>; answerC?: Maybe<Scalars['String']>;
answerCImage?: Maybe<Scalars['Upload']>; answerCImage?: Maybe<Scalars['Upload']>;
deleteAnswerCImage?: Maybe<Scalars['Boolean']>; deleteAnswerCImage?: Maybe<Scalars['Boolean']>;
answerD?: Maybe<Answer>; answerD?: Maybe<Scalars['String']>;
answerDImage?: Maybe<Scalars['Upload']>; answerDImage?: Maybe<Scalars['Upload']>;
deleteAnswerDImage?: Maybe<Scalars['Boolean']>; deleteAnswerDImage?: Maybe<Scalars['Boolean']>;
}; };
export type Question = { export type UpdateManyUsersInput = {
id: Scalars['ID']; role?: Maybe<Role>;
from?: Maybe<Scalars['String']>; activated?: Maybe<Scalars['Boolean']>;
content: Scalars['String'];
explanation?: Maybe<Scalars['String']>;
correctAnswer: Answer;
image?: Maybe<Scalars['String']>;
answerA?: Maybe<Answer>;
answerAImage?: Maybe<Scalars['String']>;
answerB?: Maybe<Answer>;
answerBImage?: Maybe<Scalars['String']>;
answerC?: Maybe<Answer>;
answerCImage?: Maybe<Scalars['String']>;
answerD?: Maybe<Answer>;
answerDImage?: Maybe<Scalars['String']>;
qualification?: Maybe<Qualification>;
createdAt: Scalars['Time'];
updatedAt: Scalars['Time'];
}; };
export type ProfessionList = { export type UserFilter = {
total: Scalars['Int'];
items?: Maybe<Array<Profession>>;
};
export type QualificationInput = {
name?: Maybe<Scalars['String']>;
description?: Maybe<Scalars['String']>;
code?: Maybe<Scalars['String']>;
formula?: Maybe<Scalars['String']>;
associateProfession?: Maybe<Array<Scalars['Int']>>;
dissociateProfession?: Maybe<Array<Scalars['Int']>>;
};
export type QualificationFilter = {
id?: Maybe<Array<Scalars['ID']>>; id?: Maybe<Array<Scalars['ID']>>;
idNEQ?: Maybe<Array<Scalars['ID']>>; idNEQ?: Maybe<Array<Scalars['ID']>>;
slug?: Maybe<Array<Scalars['String']>>; activated?: Maybe<Scalars['Boolean']>;
slugNEQ?: Maybe<Array<Scalars['String']>>; displayName?: Maybe<Array<Scalars['String']>>;
formula?: Maybe<Array<Scalars['String']>>; displayNameNEQ?: Maybe<Array<Scalars['String']>>;
formulaNEQ?: Maybe<Array<Scalars['String']>>; displayNameIEQ?: Maybe<Scalars['String']>;
name?: Maybe<Array<Scalars['String']>>; displayNameMATCH?: Maybe<Scalars['String']>;
nameNEQ?: Maybe<Array<Scalars['String']>>; email?: Maybe<Array<Scalars['String']>>;
nameIEQ?: Maybe<Scalars['String']>; emailNEQ?: Maybe<Array<Scalars['String']>>;
nameMATCH?: Maybe<Scalars['String']>; emailIEQ?: Maybe<Scalars['String']>;
code?: Maybe<Array<Scalars['String']>>; emailMATCH?: Maybe<Scalars['String']>;
codeNEQ?: Maybe<Array<Scalars['String']>>; role?: Maybe<Array<Role>>;
codeIEQ?: Maybe<Scalars['String']>; roleNEQ?: Maybe<Array<Role>>;
codeMATCH?: Maybe<Scalars['String']>;
descriptionIEQ?: Maybe<Scalars['String']>;
descriptionMATCH?: Maybe<Scalars['String']>;
professionID?: Maybe<Array<Scalars['Int']>>;
createdAt?: Maybe<Scalars['Time']>; createdAt?: Maybe<Scalars['Time']>;
createdAtGT?: Maybe<Scalars['Time']>; createdAtGT?: Maybe<Scalars['Time']>;
createdAtGTE?: Maybe<Scalars['Time']>; createdAtGTE?: Maybe<Scalars['Time']>;
createdAtLT?: Maybe<Scalars['Time']>; createdAtLT?: Maybe<Scalars['Time']>;
createdAtLTE?: Maybe<Scalars['Time']>; createdAtLTE?: Maybe<Scalars['Time']>;
or?: Maybe<QualificationFilterOr>; or?: Maybe<UserFilterOr>;
}; };
export type Mutation = { export type Mutation = {
@ -246,52 +252,17 @@ export type MutationSignInArgs = {
staySignedIn?: Maybe<Scalars['Boolean']>; staySignedIn?: Maybe<Scalars['Boolean']>;
}; };
export type UserFilter = { export enum Role {
id?: Maybe<Array<Scalars['ID']>>; Admin = 'admin',
idNEQ?: Maybe<Array<Scalars['ID']>>; User = 'user'
activated?: Maybe<Scalars['Boolean']>; }
displayName?: Maybe<Array<Scalars['String']>>;
displayNameNEQ?: Maybe<Array<Scalars['String']>>;
displayNameIEQ?: Maybe<Scalars['String']>;
displayNameMATCH?: Maybe<Scalars['String']>;
email?: Maybe<Array<Scalars['String']>>;
emailNEQ?: Maybe<Array<Scalars['String']>>;
emailIEQ?: Maybe<Scalars['String']>;
emailMATCH?: Maybe<Scalars['String']>;
role?: Maybe<Array<Role>>;
roleNEQ?: Maybe<Array<Role>>;
createdAt?: Maybe<Scalars['Time']>;
createdAtGT?: Maybe<Scalars['Time']>;
createdAtGTE?: Maybe<Scalars['Time']>;
createdAtLT?: Maybe<Scalars['Time']>;
createdAtLTE?: Maybe<Scalars['Time']>;
or?: Maybe<UserFilterOr>;
};
export type Profession = { export enum Answer {
id: Scalars['ID']; A = 'a',
slug: Scalars['String']; B = 'b',
name: Scalars['String']; C = 'c',
description?: Maybe<Scalars['String']>; D = 'd'
createdAt: Scalars['Time']; }
};
export type QuestionFilter = {
id?: Maybe<Array<Scalars['ID']>>;
idNEQ?: Maybe<Array<Scalars['ID']>>;
from?: Maybe<Array<Scalars['String']>>;
contentIEQ?: Maybe<Scalars['String']>;
contentMATCH?: Maybe<Scalars['String']>;
qualificationID?: Maybe<Array<Scalars['Int']>>;
qualificationIDNEQ?: Maybe<Array<Scalars['Int']>>;
qualificationFilter?: Maybe<QualificationFilter>;
createdAt?: Maybe<Scalars['Time']>;
createdAtGT?: Maybe<Scalars['Time']>;
createdAtGTE?: Maybe<Scalars['Time']>;
createdAtLT?: Maybe<Scalars['Time']>;
createdAtLTE?: Maybe<Scalars['Time']>;
};
export type Query = { export type Query = {
professions: ProfessionList; professions: ProfessionList;
@ -360,51 +331,80 @@ export type QueryUserArgs = {
id: Scalars['Int']; id: Scalars['Int'];
}; };
export type ProfessionFilter = { export type Profession = {
id: Scalars['ID'];
slug: Scalars['String'];
name: Scalars['String'];
description?: Maybe<Scalars['String']>;
createdAt: Scalars['Time'];
};
export type QualificationInput = {
name?: Maybe<Scalars['String']>;
description?: Maybe<Scalars['String']>;
code?: Maybe<Scalars['String']>;
formula?: Maybe<Scalars['String']>;
associateProfession?: Maybe<Array<Scalars['Int']>>;
dissociateProfession?: Maybe<Array<Scalars['Int']>>;
};
export type QualificationFilter = {
id?: Maybe<Array<Scalars['ID']>>; id?: Maybe<Array<Scalars['ID']>>;
idNEQ?: Maybe<Array<Scalars['ID']>>; idNEQ?: Maybe<Array<Scalars['ID']>>;
slug?: Maybe<Array<Scalars['String']>>; slug?: Maybe<Array<Scalars['String']>>;
slugNEQ?: Maybe<Array<Scalars['String']>>; slugNEQ?: Maybe<Array<Scalars['String']>>;
formula?: Maybe<Array<Scalars['String']>>;
formulaNEQ?: Maybe<Array<Scalars['String']>>;
name?: Maybe<Array<Scalars['String']>>; name?: Maybe<Array<Scalars['String']>>;
nameNEQ?: Maybe<Array<Scalars['String']>>; nameNEQ?: Maybe<Array<Scalars['String']>>;
nameIEQ?: Maybe<Scalars['String']>; nameIEQ?: Maybe<Scalars['String']>;
nameMATCH?: Maybe<Scalars['String']>; nameMATCH?: Maybe<Scalars['String']>;
code?: Maybe<Array<Scalars['String']>>;
codeNEQ?: Maybe<Array<Scalars['String']>>;
codeIEQ?: Maybe<Scalars['String']>;
codeMATCH?: Maybe<Scalars['String']>;
descriptionIEQ?: Maybe<Scalars['String']>; descriptionIEQ?: Maybe<Scalars['String']>;
descriptionMATCH?: Maybe<Scalars['String']>; descriptionMATCH?: Maybe<Scalars['String']>;
qualificationID?: Maybe<Array<Scalars['ID']>>; professionID?: Maybe<Array<Scalars['Int']>>;
createdAt?: Maybe<Scalars['Time']>; createdAt?: Maybe<Scalars['Time']>;
createdAtGT?: Maybe<Scalars['Time']>; createdAtGT?: Maybe<Scalars['Time']>;
createdAtGTE?: Maybe<Scalars['Time']>; createdAtGTE?: Maybe<Scalars['Time']>;
createdAtLT?: Maybe<Scalars['Time']>; createdAtLT?: Maybe<Scalars['Time']>;
createdAtLTE?: Maybe<Scalars['Time']>; createdAtLTE?: Maybe<Scalars['Time']>;
or?: Maybe<QualificationFilterOr>;
}; };
export type QualificationFilterOr = { export type UserWithToken = {
nameMatch?: Maybe<Scalars['String']>; token: Scalars['String'];
nameIEQ?: Maybe<Scalars['String']>; user: User;
codeMatch?: Maybe<Scalars['String']>;
codeIEQ?: Maybe<Scalars['String']>;
}; };
export type UserInput = { export type ProfessionList = {
displayName?: Maybe<Scalars['String']>;
password?: Maybe<Scalars['String']>;
email?: Maybe<Scalars['String']>;
role?: Maybe<Role>;
activated?: Maybe<Scalars['Boolean']>;
};
export type QuestionList = {
total: Scalars['Int']; total: Scalars['Int'];
items?: Maybe<Array<Question>>; items?: Maybe<Array<Profession>>;
}; };
export type UserList = { export type QualificationList = {
total: Scalars['Int']; total: Scalars['Int'];
items?: Maybe<Array<User>>; items?: Maybe<Array<Qualification>>;
}; };
export type UpdateManyUsersInput = { export type Question = {
role?: Maybe<Role>; id: Scalars['ID'];
activated?: Maybe<Scalars['Boolean']>; from?: Maybe<Scalars['String']>;
content: Scalars['String'];
explanation?: Maybe<Scalars['String']>;
correctAnswer: Answer;
image?: Maybe<Scalars['String']>;
answerA?: Maybe<Scalars['String']>;
answerAImage?: Maybe<Scalars['String']>;
answerB?: Maybe<Scalars['String']>;
answerBImage?: Maybe<Scalars['String']>;
answerC?: Maybe<Scalars['String']>;
answerCImage?: Maybe<Scalars['String']>;
answerD?: Maybe<Scalars['String']>;
answerDImage?: Maybe<Scalars['String']>;
qualification?: Maybe<Qualification>;
createdAt: Scalars['Time'];
updatedAt: Scalars['Time'];
}; };