diff --git a/codegen.yml b/codegen.yml index e8ba0d3..9e3af2d 100644 --- a/codegen.yml +++ b/codegen.yml @@ -6,4 +6,6 @@ generates: - "typescript" - "typescript-operations" config: - skipTypename: true \ No newline at end of file + skipTypename: true + scalars: + ID: number diff --git a/src/features/UsersPage/UsersPage.tsx b/src/features/UsersPage/UsersPage.tsx index 9d66abf..5d11f93 100644 --- a/src/features/UsersPage/UsersPage.tsx +++ b/src/features/UsersPage/UsersPage.tsx @@ -7,7 +7,13 @@ import { } from 'use-query-params'; import SortParam, { decodeSort } from 'libs/serialize-query-params/SortParam'; import useUsers from './UsersPage.useUsers'; -import { MutationCreateUserArgs, UserInput } from 'libs/graphql/types'; +import { + Maybe, + MutationCreateUserArgs, + MutationUpdateUserArgs, + User, + UserInput, +} from 'libs/graphql/types'; import { validateRowsPerPage } from 'common/Table/helpers'; import { COLUMNS, DEFAULT_SORT, DialogType } from './constants'; @@ -17,7 +23,7 @@ import Table from 'common/Table/Table'; import TableToolbar from './components/TableToolbar/TableToolbar'; import FormDialog from './components/FormDialog/FormDialog'; import { ApolloError, useMutation } from '@apollo/client'; -import { MUTATION_CREATE_USER } from './mutations'; +import { MUTATION_CREATE_USER, MUTATION_UPDATE_USER } from './mutations'; import { useSnackbar } from 'material-ui-snackbar-provider'; const UsersPage = () => { @@ -25,7 +31,12 @@ const UsersPage = () => { MUTATION_CREATE_USER, { ignoreResults: true } ); + const [updateUserMutation] = useMutation( + MUTATION_UPDATE_USER, + { ignoreResults: true } + ); const [dialogType, setDialogType] = useState(DialogType.None); + const [userBeingEdited, setUserBeingEdited] = useState>(null); const snackbar = useSnackbar(); const [{ page, sort, search, ...rest }, setQueryParams] = useQueryParams({ limit: NumberParam, @@ -41,9 +52,15 @@ const UsersPage = () => { search ); - const handleCreateUser = async (input: UserInput) => { + const handleFormDialogSubmit = async (input: UserInput) => { try { - await createUserMutation({ variables: { input } }); + if (dialogType === DialogType.Create) { + await createUserMutation({ variables: { input } }); + } else { + await updateUserMutation({ + variables: { input, id: userBeingEdited?.id ?? -1 }, + }); + } await refetch(); return true; } catch (e) { @@ -61,7 +78,10 @@ const UsersPage = () => { setDialogType(DialogType.Create)} + onClickCreateUser={() => { + setUserBeingEdited(null); + setDialogType(DialogType.Create); + }} onChangeSearchValue={val => { setQueryParams({ page: 0, search: val }); }} @@ -74,7 +94,12 @@ const UsersPage = () => { { icon: row => { return ( - + { + setUserBeingEdited(row); + setDialogType(DialogType.Edit); + }} + > ); @@ -108,7 +133,8 @@ const UsersPage = () => { open={ dialogType === DialogType.Create || dialogType === DialogType.Edit } - onSubmit={handleCreateUser} + user={userBeingEdited as UserInput} + onSubmit={handleFormDialogSubmit} onClose={() => setDialogType(DialogType.None)} /> diff --git a/src/features/UsersPage/components/FormDialog/FormDialog.tsx b/src/features/UsersPage/components/FormDialog/FormDialog.tsx index 8bd4694..32b49d8 100644 --- a/src/features/UsersPage/components/FormDialog/FormDialog.tsx +++ b/src/features/UsersPage/components/FormDialog/FormDialog.tsx @@ -37,9 +37,7 @@ export interface FormDialogProps extends Pick { const FormDialog = ({ open, onClose, user, onSubmit }: FormDialogProps) => { const editMode = Boolean(user); - const { register, handleSubmit, errors } = useForm({ - defaultValues: user, - }); + const { register, handleSubmit, errors } = useForm({}); const [isSubmitting, setIsSubmitting] = useState(false); const classes = useStyles(); @@ -52,10 +50,9 @@ const FormDialog = ({ open, onClose, user, onSubmit }: FormDialogProps) => { ) : data; const success = await onSubmit(filtered); + setIsSubmitting(false); if (success) { onClose(); - } else { - setIsSubmitting(false); } }; @@ -75,6 +72,7 @@ const FormDialog = ({ open, onClose, user, onSubmit }: FormDialogProps) => { fullWidth label="Nazwa użytkownika" name="displayName" + defaultValue={user?.displayName} inputRef={register({ required: 'Te pole jest wymagane.', minLength: { @@ -93,6 +91,7 @@ const FormDialog = ({ open, onClose, user, onSubmit }: FormDialogProps) => { fullWidth label="Adres e-mail" name="email" + defaultValue={user?.email} inputRef={register({ required: 'Te pole jest wymagane.', validate: (email: string) => { @@ -110,7 +109,7 @@ const FormDialog = ({ open, onClose, user, onSubmit }: FormDialogProps) => { type="password" name="password" inputRef={register({ - required: 'Te pole jest wymagane.', + required: editMode ? false : 'Te pole jest wymagane.', minLength: { value: MIN_PASSWORD_LENGTH, message: `Hasło musi zawierać co najmniej ${MIN_PASSWORD_LENGTH} znaków.`, @@ -125,7 +124,7 @@ const FormDialog = ({ open, onClose, user, onSubmit }: FormDialogProps) => { /> Rola - + {[Role.Admin, Role.User].map(role => { return ( { } + control={ + + } label="Aktywowany" /> diff --git a/src/features/UsersPage/mutations.ts b/src/features/UsersPage/mutations.ts index e169a73..8c9551d 100644 --- a/src/features/UsersPage/mutations.ts +++ b/src/features/UsersPage/mutations.ts @@ -7,3 +7,11 @@ export const MUTATION_CREATE_USER = gql` } } `; + +export const MUTATION_UPDATE_USER = gql` + mutation updateUser($id: ID!, $input: UserInput!) { + updateUser(id: $id, input: $input) { + id + } + } +`; diff --git a/src/libs/graphql/types.ts b/src/libs/graphql/types.ts index 9a5c456..04c4bc8 100644 --- a/src/libs/graphql/types.ts +++ b/src/libs/graphql/types.ts @@ -4,7 +4,7 @@ export type MakeOptional = Omit & { [SubKey in K]?: export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; /** All built-in and custom scalars, mapped to their actual values */ export type Scalars = { - ID: string; + ID: number; String: string; Boolean: boolean; Int: number; @@ -16,6 +16,28 @@ export type Scalars = { +export type UpdateManyUsersInput = { + role?: Maybe; + activated?: Maybe; +}; + +export type QualificationFilterOr = { + nameMatch?: Maybe; + nameIEQ?: Maybe; + codeMatch?: Maybe; + codeIEQ?: Maybe; +}; + +export type QuestionList = { + total: Scalars['Int']; + items?: Maybe>; +}; + +export type ProfessionList = { + total: Scalars['Int']; + items?: Maybe>; +}; + export type QuestionInput = { content?: Maybe; from?: Maybe; @@ -38,173 +60,6 @@ export type QuestionInput = { deleteAnswerDImage?: Maybe; }; - -export type Profession = { - id: Scalars['ID']; - slug: Scalars['String']; - name: Scalars['String']; - description?: Maybe; - createdAt: Scalars['Time']; -}; - -export type ProfessionInput = { - name?: Maybe; - description?: Maybe; -}; - -export type ProfessionFilter = { - id?: Maybe>; - idNEQ?: Maybe>; - slug?: Maybe>; - slugNEQ?: Maybe>; - name?: Maybe>; - nameNEQ?: Maybe>; - nameIEQ?: Maybe; - nameMATCH?: Maybe; - descriptionIEQ?: Maybe; - descriptionMATCH?: Maybe; - createdAt?: Maybe; - createdAtGT?: Maybe; - createdAtGTE?: Maybe; - createdAtLT?: Maybe; - createdAtLTE?: Maybe; -}; - -export type Question = { - id: Scalars['ID']; - from?: Maybe; - content: Scalars['String']; - explanation?: Maybe; - correctAnswer: Answer; - image?: Maybe; - answerA?: Maybe; - answerAImage?: Maybe; - answerB?: Maybe; - answerBImage?: Maybe; - answerC?: Maybe; - answerCImage?: Maybe; - answerD?: Maybe; - answerDImage?: Maybe; - qualification?: Maybe; - createdAt: Scalars['Time']; - updatedAt: Scalars['Time']; -}; - - -export type QualificationList = { - total: Scalars['Int']; - items?: Maybe>; -}; - -export enum Role { - Admin = 'admin', - User = 'user' -} - -export type QualificationFilterOr = { - nameMatch?: Maybe; - nameIEQ?: Maybe; - codeMatch?: Maybe; - codeIEQ?: Maybe; -}; - -export type QualificationFilter = { - id?: Maybe>; - idNEQ?: Maybe>; - slug?: Maybe>; - slugNEQ?: Maybe>; - formula?: Maybe>; - formulaNEQ?: Maybe>; - name?: Maybe>; - nameNEQ?: Maybe>; - nameIEQ?: Maybe; - nameMATCH?: Maybe; - code?: Maybe>; - codeNEQ?: Maybe>; - codeIEQ?: Maybe; - codeMATCH?: Maybe; - descriptionIEQ?: Maybe; - descriptionMATCH?: Maybe; - professionID?: Maybe>; - createdAt?: Maybe; - createdAtGT?: Maybe; - createdAtGTE?: Maybe; - createdAtLT?: Maybe; - createdAtLTE?: Maybe; - or?: Maybe; -}; - -export type User = { - id: Scalars['ID']; - displayName: Scalars['String']; - role: Role; - email: Scalars['String']; - activated: Scalars['Boolean']; - createdAt: Scalars['Time']; -}; - -export type QualificationInput = { - name?: Maybe; - description?: Maybe; - code?: Maybe; - formula?: Maybe; - associateProfession?: Maybe>; - dissociateProfession?: Maybe>; -}; - -export type UserFilterOr = { - displayNameIEQ?: Maybe; - displayNameMATCH?: Maybe; - emailIEQ?: Maybe; - emailMATCH?: Maybe; -}; - -export type UserList = { - total: Scalars['Int']; - items?: Maybe>; -}; - -export type UserInput = { - displayName?: Maybe; - password?: Maybe; - email?: Maybe; - role?: Maybe; - activated?: Maybe; -}; - -export type ProfessionList = { - total: Scalars['Int']; - items?: Maybe>; -}; - -export enum Answer { - A = 'a', - B = 'b', - C = 'c', - D = 'd' -} - -export type QuestionList = { - total: Scalars['Int']; - items?: Maybe>; -}; - -export type QuestionFilter = { - id?: Maybe>; - idNEQ?: Maybe>; - from?: Maybe>; - contentIEQ?: Maybe; - contentMATCH?: Maybe; - qualificationID?: Maybe>; - qualificationIDNEQ?: Maybe>; - qualificationFilter?: Maybe; - createdAt?: Maybe; - createdAtGT?: Maybe; - createdAtGTE?: Maybe; - createdAtLT?: Maybe; - createdAtLTE?: Maybe; -}; - export type UserFilter = { id?: Maybe>; idNEQ?: Maybe>; @@ -227,11 +82,164 @@ export type UserFilter = { or?: Maybe; }; +export type Profession = { + id: Scalars['ID']; + slug: Scalars['String']; + name: Scalars['String']; + description?: Maybe; + createdAt: Scalars['Time']; +}; + +export enum Answer { + A = 'a', + B = 'b', + C = 'c', + D = 'd' +} + +export type QuestionFilter = { + id?: Maybe>; + idNEQ?: Maybe>; + from?: Maybe>; + contentIEQ?: Maybe; + contentMATCH?: Maybe; + qualificationID?: Maybe>; + qualificationIDNEQ?: Maybe>; + qualificationFilter?: Maybe; + createdAt?: Maybe; + createdAtGT?: Maybe; + createdAtGTE?: Maybe; + createdAtLT?: Maybe; + createdAtLTE?: Maybe; +}; + +export type UserFilterOr = { + displayNameIEQ?: Maybe; + displayNameMATCH?: Maybe; + emailIEQ?: Maybe; + emailMATCH?: Maybe; +}; + +export type ProfessionFilter = { + id?: Maybe>; + idNEQ?: Maybe>; + slug?: Maybe>; + slugNEQ?: Maybe>; + name?: Maybe>; + nameNEQ?: Maybe>; + nameIEQ?: Maybe; + nameMATCH?: Maybe; + descriptionIEQ?: Maybe; + descriptionMATCH?: Maybe; + createdAt?: Maybe; + createdAtGT?: Maybe; + createdAtGTE?: Maybe; + createdAtLT?: Maybe; + createdAtLTE?: Maybe; +}; + +export type QualificationList = { + total: Scalars['Int']; + items?: Maybe>; +}; + +export type Question = { + id: Scalars['ID']; + from?: Maybe; + content: Scalars['String']; + explanation?: Maybe; + correctAnswer: Answer; + image?: Maybe; + answerA?: Maybe; + answerAImage?: Maybe; + answerB?: Maybe; + answerBImage?: Maybe; + answerC?: Maybe; + answerCImage?: Maybe; + answerD?: Maybe; + answerDImage?: Maybe; + qualification?: Maybe; + createdAt: Scalars['Time']; + updatedAt: Scalars['Time']; +}; + +export type UserList = { + total: Scalars['Int']; + items?: Maybe>; +}; + export type UserWithToken = { token: Scalars['String']; user: User; }; +export type Query = { + professions: ProfessionList; + profession?: Maybe; + qualifications: QualificationList; + qualification?: Maybe; + questions: QuestionList; + generateTest?: Maybe>; + users: UserList; + user?: Maybe; + me?: Maybe; +}; + + +export type QueryProfessionsArgs = { + filter?: Maybe; + limit?: Maybe; + offset?: Maybe; + sort?: Maybe>; +}; + + +export type QueryProfessionArgs = { + id?: Maybe; + slug?: Maybe; +}; + + +export type QueryQualificationsArgs = { + filter?: Maybe; + limit?: Maybe; + offset?: Maybe; + sort?: Maybe>; +}; + + +export type QueryQualificationArgs = { + id?: Maybe; + slug?: Maybe; +}; + + +export type QueryQuestionsArgs = { + filter?: Maybe; + limit?: Maybe; + offset?: Maybe; + sort?: Maybe>; +}; + + +export type QueryGenerateTestArgs = { + qualificationIDs: Array; + limit?: Maybe; +}; + + +export type QueryUsersArgs = { + filter?: Maybe; + limit?: Maybe; + offset?: Maybe; + sort?: Maybe>; +}; + + +export type QueryUserArgs = { + id: Scalars['Int']; +}; + export type Mutation = { createProfession?: Maybe; updateProfession?: Maybe; @@ -326,6 +334,34 @@ export type MutationSignInArgs = { staySignedIn?: Maybe; }; +export type ProfessionInput = { + name?: Maybe; + description?: Maybe; +}; + +export type QualificationInput = { + name?: Maybe; + description?: Maybe; + code?: Maybe; + formula?: Maybe; + associateProfession?: Maybe>; + dissociateProfession?: Maybe>; +}; + + +export enum Role { + Admin = 'admin', + User = 'user' +} + +export type UserInput = { + displayName?: Maybe; + password?: Maybe; + email?: Maybe; + role?: Maybe; + activated?: Maybe; +}; + export type Qualification = { id: Scalars['ID']; slug: Scalars['String']; @@ -336,74 +372,38 @@ export type Qualification = { createdAt: Scalars['Time']; }; -export type UpdateManyUsersInput = { - role?: Maybe; - activated?: Maybe; -}; - -export type Query = { - professions: ProfessionList; - profession?: Maybe; - qualifications: QualificationList; - qualification?: Maybe; - questions: QuestionList; - generateTest?: Maybe>; - users: UserList; - user?: Maybe; - me?: Maybe; +export type QualificationFilter = { + id?: Maybe>; + idNEQ?: Maybe>; + slug?: Maybe>; + slugNEQ?: Maybe>; + formula?: Maybe>; + formulaNEQ?: Maybe>; + name?: Maybe>; + nameNEQ?: Maybe>; + nameIEQ?: Maybe; + nameMATCH?: Maybe; + code?: Maybe>; + codeNEQ?: Maybe>; + codeIEQ?: Maybe; + codeMATCH?: Maybe; + descriptionIEQ?: Maybe; + descriptionMATCH?: Maybe; + professionID?: Maybe>; + createdAt?: Maybe; + createdAtGT?: Maybe; + createdAtGTE?: Maybe; + createdAtLT?: Maybe; + createdAtLTE?: Maybe; + or?: Maybe; }; -export type QueryProfessionsArgs = { - filter?: Maybe; - limit?: Maybe; - offset?: Maybe; - sort?: Maybe>; -}; - - -export type QueryProfessionArgs = { - id?: Maybe; - slug?: Maybe; -}; - - -export type QueryQualificationsArgs = { - filter?: Maybe; - limit?: Maybe; - offset?: Maybe; - sort?: Maybe>; -}; - - -export type QueryQualificationArgs = { - id?: Maybe; - slug?: Maybe; -}; - - -export type QueryQuestionsArgs = { - filter?: Maybe; - limit?: Maybe; - offset?: Maybe; - sort?: Maybe>; -}; - - -export type QueryGenerateTestArgs = { - qualificationIDs: Array; - limit?: Maybe; -}; - - -export type QueryUsersArgs = { - filter?: Maybe; - limit?: Maybe; - offset?: Maybe; - sort?: Maybe>; -}; - - -export type QueryUserArgs = { - id: Scalars['Int']; +export type User = { + id: Scalars['ID']; + displayName: Scalars['String']; + role: Role; + email: Scalars['String']; + activated: Scalars['Boolean']; + createdAt: Scalars['Time']; };