add eslint/graphql-codegen/.babelrc/typescript configuration

This commit is contained in:
Dawid Wysokiński 2021-03-17 05:04:50 +01:00
parent 292d2da3b1
commit a7420c5a8e
21 changed files with 5278 additions and 146 deletions

42
.babelrc Normal file
View File

@ -0,0 +1,42 @@
{
"presets": ["next/babel"],
"plugins": [
[
"babel-plugin-transform-imports",
{
"@material-ui/core": {
"transform": "@material-ui/core/${member}",
"preventFullImport": true
},
"@material-ui/core/styles": {
"transform": "@material-ui/core/styles/${member}",
"preventFullImport": true
},
"@material-ui/lab": {
"transform": "@material-ui/lab/${member}",
"preventFullImport": true
},
"@material-ui/icons": {
"transform": "@material-ui/icons/${member}",
"preventFullImport": true
},
"lodash": {
"transform": "lodash/${member}",
"preventFullImport": true
},
"date-fns": {
"transform": "date-fns/${member}",
"preventFullImport": true
},
"validator": {
"transform": "validator/lib/${member}",
"preventFullImport": true
},
"react-use": {
"transform": "react-use/lib/${member}",
"preventFullImport": true
}
}
]
]
}

2
.gitignore vendored
View File

@ -33,4 +33,6 @@ yarn-error.log*
# vercel
.vercel
remote-schema.graphql
.idea

15
.graphqlconfig Normal file
View File

@ -0,0 +1,15 @@
{
"name": "Zdam Egzamin Zawodowy",
"schemaPath": "remote-schema.graphql",
"extensions": {
"endpoints": {
"Default GraphQL Endpoint": {
"url": "http://localhost:8080/graphql",
"headers": {
"user-agent": "IDE"
},
"introspect": true
}
}
}
}

View File

@ -1,34 +0,0 @@
This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
## Getting Started
First, run the development server:
```bash
npm run dev
# or
yarn dev
```
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
You can start editing the page by modifying `pages/index.js`. The page auto-updates as you edit the file.
[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.js`.
The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages.
## Learn More
To learn more about Next.js, take a look at the following resources:
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
## Deploy on Vercel
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.

12
codegen.yml Normal file
View File

@ -0,0 +1,12 @@
overwrite: true
schema: ${NEXT_PUBLIC_API_URI:http://localhost:8080/graphql}
generates:
src/libs/graphql/types.ts:
plugins:
- "typescript"
- "typescript-operations"
config:
skipTypename: true
scalars:
ID: number
Time: Date | string

3
eslintrc.json Normal file
View File

@ -0,0 +1,3 @@
{
"extends": "react-app"
}

View File

@ -5,16 +5,40 @@
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start"
"start": "next start",
"codegen": "graphql-codegen"
},
"dependencies": {
"@kichiyaki/roboto": "^1.0.0",
"@material-ui/core": "^4.11.3",
"@material-ui/icons": "^4.11.2",
"@material-ui/lab": "^4.0.0-alpha.57",
"clsx": "^1.1.1",
"date-fns": "^2.19.0",
"graphql": "^15.5.0",
"lodash": "^4.17.21",
"next": "10.0.9",
"react": "17.0.1",
"react-dom": "17.0.1"
},
"devDependencies": {
"@graphql-codegen/cli": "^1.21.3",
"@graphql-codegen/typescript": "^1.21.1",
"@graphql-codegen/typescript-operations": "^1.17.15",
"@types/lodash": "^4.14.168",
"@types/node": "^14.14.35",
"@types/react": "^17.0.3",
"@typescript-eslint/eslint-plugin": "^4.0.0",
"@typescript-eslint/parser": "^4.0.0",
"babel-eslint": "^10.0.0",
"babel-plugin-transform-imports": "^2.0.0",
"eslint": "^7.5.0",
"eslint-config-react-app": "^6.0.0",
"eslint-plugin-flowtype": "^5.2.0",
"eslint-plugin-import": "^2.22.0",
"eslint-plugin-jsx-a11y": "^6.3.1",
"eslint-plugin-react": "^7.20.3",
"eslint-plugin-react-hooks": "^4.0.8",
"prettier": "^2.2.1",
"typescript": "^4.2.3"
}

View File

@ -1,7 +0,0 @@
import '../styles/globals.css'
function MyApp({ Component, pageProps }) {
return <Component {...pageProps} />
}
export default MyApp

7
pages/_app.tsx Normal file
View File

@ -0,0 +1,7 @@
import { AppProps } from 'next/app';
function MyApp({ Component, pageProps }: AppProps) {
return <Component {...pageProps} />;
}
export default MyApp;

View File

@ -1,65 +0,0 @@
import Head from 'next/head';
import styles from '../styles/Home.module.css';
export default function Home() {
return (
<div className={styles.container}>
<Head>
<title>Create Next App</title>
<link rel="icon" href="/favicon.ico" />
</Head>
<main className={styles.main}>
<h1 className={styles.title}>
Welcome to <a href="https://nextjs.org">Next.js!</a>
</h1>
<p className={styles.description}>
Get started by editing{' '}
<code className={styles.code}>pages/index.js</code>
</p>
<div className={styles.grid}>
<a href="https://nextjs.org/docs" className={styles.card}>
<h3>Documentation &rarr;</h3>
<p>Find in-depth information about Next.js features and API.</p>
</a>
<a href="https://nextjs.org/learn" className={styles.card}>
<h3>Learn &rarr;</h3>
<p>Learn about Next.js in an interactive course with quizzes!</p>
</a>
<a
href="https://github.com/vercel/next.js/tree/master/examples"
className={styles.card}
>
<h3>Examples &rarr;</h3>
<p>Discover and deploy boilerplate example Next.js projects.</p>
</a>
<a
href="https://vercel.com/new?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app"
className={styles.card}
>
<h3>Deploy &rarr;</h3>
<p>
Instantly deploy your Next.js site to a public URL with Vercel.
</p>
</a>
</div>
</main>
<footer className={styles.footer}>
<a
href="https://vercel.com?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app"
target="_blank"
rel="noopener noreferrer"
>
Powered by{' '}
<img src="/vercel.svg" alt="Vercel Logo" className={styles.logo} />
</a>
</footer>
</div>
);
}

1
pages/index.tsx Normal file
View File

@ -0,0 +1 @@
export { default } from 'features/IndexPage/IndexPage';

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 361 KiB

1
public/logo.svg Normal file
View File

@ -0,0 +1 @@
<?xml version="1.0" ?><svg data-name="Layer 1" id="Layer_1" viewBox="0 0 140 140" xmlns="http://www.w3.org/2000/svg"><defs><style>.cls-1{fill:#f0dc6a;}.cls-2{fill:#525354;}.cls-3{fill:#fff;}.cls-4{fill:#d7dadb;}.cls-5{fill:#52b1b1;}</style></defs><title/><circle class="cls-1" cx="70" cy="70" r="64"/><rect class="cls-2" height="98" rx="1" ry="1" width="64" x="39" y="22"/><rect class="cls-3" height="98" rx="1" ry="1" width="64" x="38" y="21"/><rect class="cls-2" height="4" rx="1" ry="1" width="32" x="62.9" y="32.79"/><rect class="cls-2" height="4" rx="1" ry="1" width="20" x="62.9" y="41"/><rect class="cls-4" height="8" rx="1" ry="1" width="8" x="47.68" y="34.89"/><path class="cls-5" d="M49.38,38.74l-1.52-1.52a1.09,1.09,0,0,0-1.54,0l-.91.91a1.09,1.09,0,0,0,0,1.54l4,4a1.09,1.09,0,0,0,1.54,0L52.6,42l5.35-5.35a1.09,1.09,0,0,0,0-1.54L57,34.16a1.09,1.09,0,0,0-1.54,0l-4.58,4.58A1.09,1.09,0,0,1,49.38,38.74Z"/><rect class="cls-2" height="4" rx="1" ry="1" width="32" x="62.9" y="53.46"/><rect class="cls-2" height="4" rx="1" ry="1" width="20" x="62.9" y="61.67"/><rect class="cls-4" height="8" rx="1" ry="1" width="8" x="47.68" y="55.56"/><path class="cls-5" d="M49.38,59.4l-1.52-1.52a1.09,1.09,0,0,0-1.54,0l-.91.91a1.09,1.09,0,0,0,0,1.54l4,4a1.09,1.09,0,0,0,1.54,0l1.68-1.68,5.35-5.35a1.09,1.09,0,0,0,0-1.54L57,54.83a1.09,1.09,0,0,0-1.54,0L50.92,59.4A1.09,1.09,0,0,1,49.38,59.4Z"/><rect class="cls-2" height="4" rx="1" ry="1" width="32" x="62.9" y="74.12"/><rect class="cls-2" height="4" rx="1" ry="1" width="20" x="62.9" y="82.33"/><rect class="cls-4" height="8" rx="1" ry="1" width="8" x="47.68" y="76.23"/><path class="cls-5" d="M49.38,80.07l-1.52-1.52a1.09,1.09,0,0,0-1.54,0l-.91.91a1.09,1.09,0,0,0,0,1.54l4,4a1.09,1.09,0,0,0,1.54,0l1.68-1.68,5.35-5.35a1.09,1.09,0,0,0,0-1.54L57,75.49a1.09,1.09,0,0,0-1.54,0l-4.58,4.58A1.09,1.09,0,0,1,49.38,80.07Z"/><rect class="cls-2" height="4" rx="1" ry="1" width="32" x="62.9" y="94.79"/><rect class="cls-2" height="4" rx="1" ry="1" width="20" x="62.9" y="103"/><rect class="cls-4" height="8" rx="1" ry="1" width="8" x="47.68" y="96.89"/></svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -1,4 +0,0 @@
<svg width="283" height="64" viewBox="0 0 283 64" fill="none"
xmlns="http://www.w3.org/2000/svg">
<path d="M141.04 16c-11.04 0-19 7.2-19 18s8.96 18 20 18c6.67 0 12.55-2.64 16.19-7.09l-7.65-4.42c-2.02 2.21-5.09 3.5-8.54 3.5-4.79 0-8.86-2.5-10.37-6.5h28.02c.22-1.12.35-2.28.35-3.5 0-10.79-7.96-17.99-19-17.99zm-9.46 14.5c1.25-3.99 4.67-6.5 9.45-6.5 4.79 0 8.21 2.51 9.45 6.5h-18.9zM248.72 16c-11.04 0-19 7.2-19 18s8.96 18 20 18c6.67 0 12.55-2.64 16.19-7.09l-7.65-4.42c-2.02 2.21-5.09 3.5-8.54 3.5-4.79 0-8.86-2.5-10.37-6.5h28.02c.22-1.12.35-2.28.35-3.5 0-10.79-7.96-17.99-19-17.99zm-9.45 14.5c1.25-3.99 4.67-6.5 9.45-6.5 4.79 0 8.21 2.51 9.45 6.5h-18.9zM200.24 34c0 6 3.92 10 10 10 4.12 0 7.21-1.87 8.8-4.92l7.68 4.43c-3.18 5.3-9.14 8.49-16.48 8.49-11.05 0-19-7.2-19-18s7.96-18 19-18c7.34 0 13.29 3.19 16.48 8.49l-7.68 4.43c-1.59-3.05-4.68-4.92-8.8-4.92-6.07 0-10 4-10 10zm82.48-29v46h-9V5h9zM36.95 0L73.9 64H0L36.95 0zm92.38 5l-27.71 48L73.91 5H84.3l17.32 30 17.32-30h10.39zm58.91 12v9.69c-1-.29-2.06-.49-3.2-.49-5.81 0-10 4-10 10V51h-9V17h9v9.2c0-5.08 5.91-9.2 13.2-9.2z" fill="#000"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

270
remote-schema.graphql Normal file
View File

@ -0,0 +1,270 @@
# This file was generated based on ".graphqlconfig". Do not edit manually.
schema {
query: Query
mutation: Mutation
}
type Mutation {
createProfession(input: ProfessionInput!): Profession
createQualification(input: QualificationInput!): Qualification
createQuestion(input: QuestionInput!): Question
createUser(input: UserInput!): User
deleteProfessions(ids: [ID!]!): [Profession!]
deleteQualifications(ids: [ID!]!): [Qualification!]
deleteQuestions(ids: [ID!]!): [Question!]
deleteUsers(ids: [ID!]!): [User!]
signIn(email: String!, password: String!, staySignedIn: Boolean): UserWithToken
updateManyUsers(ids: [ID!]!, input: UpdateManyUsersInput!): [User!]
updateProfession(id: ID!, input: ProfessionInput!): Profession
updateQualification(id: ID!, input: QualificationInput!): Qualification
updateQuestion(id: ID!, input: QuestionInput!): Question
updateUser(id: ID!, input: UserInput!): User
}
type Profession {
createdAt: Time!
description: String
id: ID!
name: String!
slug: String!
}
type ProfessionList {
items: [Profession!]
total: Int!
}
type Qualification {
code: String!
createdAt: Time!
description: String
formula: String
id: ID!
name: String!
slug: String!
}
type QualificationList {
items: [Qualification!]
total: Int!
}
type Query {
generateTest(limit: Int, qualificationIDs: [ID!]!): [Question!]
me: User
profession(id: Int, slug: String): Profession
professions(filter: ProfessionFilter, limit: Int, offset: Int, sort: [String!]): ProfessionList!
qualification(id: Int, slug: String): Qualification
qualifications(filter: QualificationFilter, limit: Int, offset: Int, sort: [String!]): QualificationList!
questions(filter: QuestionFilter, limit: Int, offset: Int, sort: [String!]): QuestionList!
user(id: Int!): User
users(filter: UserFilter, limit: Int, offset: Int, sort: [String!]): UserList!
}
type Question {
answerA: String
answerAImage: String
answerB: String
answerBImage: String
answerC: String
answerCImage: String
answerD: String
answerDImage: String
content: String!
correctAnswer: Answer!
createdAt: Time!
explanation: String
from: String
id: ID!
image: String
qualification: Qualification
updatedAt: Time!
}
type QuestionList {
items: [Question!]
total: Int!
}
type User {
activated: Boolean!
createdAt: Time!
displayName: String!
email: String!
id: ID!
role: Role!
}
type UserList {
items: [User!]
total: Int!
}
type UserWithToken {
token: String!
user: User!
}
enum Answer {
a
b
c
d
}
enum Role {
admin
user
}
input ProfessionFilter {
createdAt: Time
createdAtGT: Time
createdAtGTE: Time
createdAtLT: Time
createdAtLTE: Time
descriptionIEQ: String
descriptionMATCH: String
id: [ID!]
idNEQ: [ID!]
name: [String!]
nameIEQ: String
nameMATCH: String
nameNEQ: [String!]
qualificationID: [ID!]
slug: [String!]
slugNEQ: [String!]
}
input ProfessionInput {
description: String
name: String
}
input QualificationFilter {
code: [String!]
codeIEQ: String
codeMATCH: String
codeNEQ: [String!]
createdAt: Time
createdAtGT: Time
createdAtGTE: Time
createdAtLT: Time
createdAtLTE: Time
descriptionIEQ: String
descriptionMATCH: String
formula: [String!]
formulaNEQ: [String!]
id: [ID!]
idNEQ: [ID!]
name: [String!]
nameIEQ: String
nameMATCH: String
nameNEQ: [String!]
or: QualificationFilterOr
professionID: [Int!]
slug: [String!]
slugNEQ: [String!]
}
input QualificationFilterOr {
codeIEQ: String
codeMatch: String
nameIEQ: String
nameMatch: String
}
input QualificationInput {
associateProfession: [Int!]
code: String
description: String
dissociateProfession: [Int!]
formula: String
name: String
}
input QuestionFilter {
contentIEQ: String
contentMATCH: String
createdAt: Time
createdAtGT: Time
createdAtGTE: Time
createdAtLT: Time
createdAtLTE: Time
from: [String!]
id: [ID!]
idNEQ: [ID!]
qualificationFilter: QualificationFilter
qualificationID: [Int!]
qualificationIDNEQ: [Int!]
}
input QuestionInput {
answerA: String
answerAImage: Upload
answerB: String
answerBImage: Upload
answerC: String
answerCImage: Upload
answerD: String
answerDImage: Upload
content: String
correctAnswer: Answer
deleteAnswerAImage: Boolean
deleteAnswerBImage: Boolean
deleteAnswerCImage: Boolean
deleteAnswerDImage: Boolean
deleteImage: Boolean
explanation: String
from: String
image: Upload
qualificationID: Int
}
input UpdateManyUsersInput {
activated: Boolean
role: Role
}
input UserFilter {
activated: Boolean
createdAt: Time
createdAtGT: Time
createdAtGTE: Time
createdAtLT: Time
createdAtLTE: Time
displayName: [String!]
displayNameIEQ: String
displayNameMATCH: String
displayNameNEQ: [String!]
email: [String!]
emailIEQ: String
emailMATCH: String
emailNEQ: [String!]
id: [ID!]
idNEQ: [ID!]
or: UserFilterOr
role: [Role!]
roleNEQ: [Role!]
}
input UserFilterOr {
displayNameIEQ: String
displayNameMATCH: String
emailIEQ: String
emailMATCH: String
}
input UserInput {
activated: Boolean
displayName: String
email: String
password: String
role: Role
}
scalar Upload
scalar Time

View File

@ -0,0 +1,5 @@
const IndexPage = () => {
return <div>hello?</div>;
};
export default IndexPage;

410
src/libs/graphql/types.ts Normal file
View File

@ -0,0 +1,410 @@
export type Maybe<T> = T | null;
export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };
export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };
export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };
/** All built-in and custom scalars, mapped to their actual values */
export type Scalars = {
ID: number;
String: string;
Boolean: boolean;
Int: number;
Float: number;
Time: Date | string;
Upload: any;
};
export type QuestionInput = {
content?: Maybe<Scalars['String']>;
from?: Maybe<Scalars['String']>;
explanation?: Maybe<Scalars['String']>;
correctAnswer?: Maybe<Answer>;
qualificationID?: Maybe<Scalars['Int']>;
image?: Maybe<Scalars['Upload']>;
deleteImage?: Maybe<Scalars['Boolean']>;
answerA?: Maybe<Scalars['String']>;
answerAImage?: Maybe<Scalars['Upload']>;
deleteAnswerAImage?: Maybe<Scalars['Boolean']>;
answerB?: Maybe<Scalars['String']>;
answerBImage?: Maybe<Scalars['Upload']>;
deleteAnswerBImage?: Maybe<Scalars['Boolean']>;
answerC?: Maybe<Scalars['String']>;
answerCImage?: Maybe<Scalars['Upload']>;
deleteAnswerCImage?: Maybe<Scalars['Boolean']>;
answerD?: Maybe<Scalars['String']>;
answerDImage?: Maybe<Scalars['Upload']>;
deleteAnswerDImage?: 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 type Mutation = {
createProfession?: Maybe<Profession>;
updateProfession?: Maybe<Profession>;
deleteProfessions?: Maybe<Array<Profession>>;
createQualification?: Maybe<Qualification>;
updateQualification?: Maybe<Qualification>;
deleteQualifications?: Maybe<Array<Qualification>>;
createQuestion?: Maybe<Question>;
updateQuestion?: Maybe<Question>;
deleteQuestions?: Maybe<Array<Question>>;
createUser?: Maybe<User>;
updateUser?: Maybe<User>;
updateManyUsers?: Maybe<Array<User>>;
deleteUsers?: Maybe<Array<User>>;
signIn?: Maybe<UserWithToken>;
};
export type MutationCreateProfessionArgs = {
input: ProfessionInput;
};
export type MutationUpdateProfessionArgs = {
id: Scalars['ID'];
input: ProfessionInput;
};
export type MutationDeleteProfessionsArgs = {
ids: Array<Scalars['ID']>;
};
export type MutationCreateQualificationArgs = {
input: QualificationInput;
};
export type MutationUpdateQualificationArgs = {
id: Scalars['ID'];
input: QualificationInput;
};
export type MutationDeleteQualificationsArgs = {
ids: Array<Scalars['ID']>;
};
export type MutationCreateQuestionArgs = {
input: QuestionInput;
};
export type MutationUpdateQuestionArgs = {
id: Scalars['ID'];
input: QuestionInput;
};
export type MutationDeleteQuestionsArgs = {
ids: Array<Scalars['ID']>;
};
export type MutationCreateUserArgs = {
input: UserInput;
};
export type MutationUpdateUserArgs = {
id: Scalars['ID'];
input: UserInput;
};
export type MutationUpdateManyUsersArgs = {
ids: Array<Scalars['ID']>;
input: UpdateManyUsersInput;
};
export type MutationDeleteUsersArgs = {
ids: Array<Scalars['ID']>;
};
export type MutationSignInArgs = {
email: Scalars['String'];
password: Scalars['String'];
staySignedIn?: Maybe<Scalars['Boolean']>;
};
export type ProfessionList = {
total: Scalars['Int'];
items?: Maybe<Array<Profession>>;
};
export type Profession = {
id: Scalars['ID'];
slug: Scalars['String'];
name: Scalars['String'];
description?: Maybe<Scalars['String']>;
createdAt: Scalars['Time'];
};
export enum Answer {
A = 'a',
B = 'b',
C = 'c',
D = 'd'
}
export type UserList = {
total: Scalars['Int'];
items?: Maybe<Array<User>>;
};
export type Question = {
id: Scalars['ID'];
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'];
};
export type UpdateManyUsersInput = {
role?: Maybe<Role>;
activated?: Maybe<Scalars['Boolean']>;
};
export type UserFilter = {
id?: Maybe<Array<Scalars['ID']>>;
idNEQ?: Maybe<Array<Scalars['ID']>>;
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 QualificationFilter = {
id?: Maybe<Array<Scalars['ID']>>;
idNEQ?: Maybe<Array<Scalars['ID']>>;
slug?: Maybe<Array<Scalars['String']>>;
slugNEQ?: Maybe<Array<Scalars['String']>>;
formula?: Maybe<Array<Scalars['String']>>;
formulaNEQ?: Maybe<Array<Scalars['String']>>;
name?: Maybe<Array<Scalars['String']>>;
nameNEQ?: Maybe<Array<Scalars['String']>>;
nameIEQ?: 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']>;
descriptionMATCH?: Maybe<Scalars['String']>;
professionID?: Maybe<Array<Scalars['Int']>>;
createdAt?: Maybe<Scalars['Time']>;
createdAtGT?: Maybe<Scalars['Time']>;
createdAtGTE?: Maybe<Scalars['Time']>;
createdAtLT?: Maybe<Scalars['Time']>;
createdAtLTE?: Maybe<Scalars['Time']>;
or?: Maybe<QualificationFilterOr>;
};
export type ProfessionInput = {
name?: Maybe<Scalars['String']>;
description?: 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 QuestionList = {
total: Scalars['Int'];
items?: Maybe<Array<Question>>;
};
export enum Role {
Admin = 'admin',
User = 'user'
}
export type UserWithToken = {
token: Scalars['String'];
user: 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 QualificationList = {
total: Scalars['Int'];
items?: Maybe<Array<Qualification>>;
};
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 QualificationFilterOr = {
nameMatch?: Maybe<Scalars['String']>;
nameIEQ?: Maybe<Scalars['String']>;
codeMatch?: Maybe<Scalars['String']>;
codeIEQ?: Maybe<Scalars['String']>;
};
export type User = {
id: Scalars['ID'];
displayName: Scalars['String'];
role: Role;
email: Scalars['String'];
activated: Scalars['Boolean'];
createdAt: Scalars['Time'];
};
export type UserFilterOr = {
displayNameIEQ?: Maybe<Scalars['String']>;
displayNameMATCH?: Maybe<Scalars['String']>;
emailIEQ?: Maybe<Scalars['String']>;
emailMATCH?: Maybe<Scalars['String']>;
};
export type Qualification = {
id: Scalars['ID'];
slug: Scalars['String'];
name: Scalars['String'];
code: Scalars['String'];
formula?: Maybe<Scalars['String']>;
description?: Maybe<Scalars['String']>;
createdAt: Scalars['Time'];
};
export type Query = {
professions: ProfessionList;
profession?: Maybe<Profession>;
qualifications: QualificationList;
qualification?: Maybe<Qualification>;
questions: QuestionList;
generateTest?: Maybe<Array<Question>>;
users: UserList;
user?: Maybe<User>;
me?: Maybe<User>;
};
export type QueryProfessionsArgs = {
filter?: Maybe<ProfessionFilter>;
limit?: Maybe<Scalars['Int']>;
offset?: Maybe<Scalars['Int']>;
sort?: Maybe<Array<Scalars['String']>>;
};
export type QueryProfessionArgs = {
id?: Maybe<Scalars['Int']>;
slug?: Maybe<Scalars['String']>;
};
export type QueryQualificationsArgs = {
filter?: Maybe<QualificationFilter>;
limit?: Maybe<Scalars['Int']>;
offset?: Maybe<Scalars['Int']>;
sort?: Maybe<Array<Scalars['String']>>;
};
export type QueryQualificationArgs = {
id?: Maybe<Scalars['Int']>;
slug?: Maybe<Scalars['String']>;
};
export type QueryQuestionsArgs = {
filter?: Maybe<QuestionFilter>;
limit?: Maybe<Scalars['Int']>;
offset?: Maybe<Scalars['Int']>;
sort?: Maybe<Array<Scalars['String']>>;
};
export type QueryGenerateTestArgs = {
qualificationIDs: Array<Scalars['ID']>;
limit?: Maybe<Scalars['Int']>;
};
export type QueryUsersArgs = {
filter?: Maybe<UserFilter>;
limit?: Maybe<Scalars['Int']>;
offset?: Maybe<Scalars['Int']>;
sort?: Maybe<Array<Scalars['String']>>;
};
export type QueryUserArgs = {
id: Scalars['Int'];
};

View File

@ -0,0 +1,18 @@
import { ThemeProvider as MuiThemeProvider } from '@material-ui/styles';
import { CssBaseline } from '@material-ui/core';
import createTheme from './createTheme';
interface ThemeProviderProps {
children?: React.ReactNode;
}
function ThemeProvider({ children }: ThemeProviderProps) {
return (
<MuiThemeProvider theme={createTheme()}>
{children}
<CssBaseline />
</MuiThemeProvider>
);
}
export default ThemeProvider;

View File

@ -0,0 +1,35 @@
import {
createMuiTheme,
responsiveFontSizes,
Theme,
} from '@material-ui/core/styles';
import { blue, pink } from '@material-ui/core/colors';
const createTheme = (): Theme => {
return responsiveFontSizes(
createMuiTheme({
palette: {
primary: {
main: blue['A200'],
},
secondary: {
main: pink['A200'],
},
},
overrides: {
MuiTableContainer: {
root: {
overflow: 'auto',
},
},
},
props: {
MuiLink: {
underline: 'none',
},
},
})
);
};
export default createTheme;

View File

@ -19,9 +19,12 @@
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx"
"jsx": "preserve"
},
"include": [
"src"
],
"exclude": [
"node_modules"
]
}

4462
yarn.lock

File diff suppressed because it is too large Load Diff