diff --git a/package.json b/package.json
index 290a8ba..d48b98e 100644
--- a/package.json
+++ b/package.json
@@ -4,13 +4,17 @@
"private": true,
"dependencies": {
"@material-ui/core": "^4.10.1",
+ "@material-ui/lab": "^4.0.0-alpha.55",
"@testing-library/jest-dom": "^4.2.4",
"@testing-library/react": "^9.3.2",
"@testing-library/user-event": "^7.1.2",
"@types/jest": "^24.0.0",
+ "@types/moment": "^2.13.0",
"@types/node": "^12.0.0",
"@types/react": "^16.9.0",
"@types/react-dom": "^16.9.0",
+ "formik": "^2.1.4",
+ "moment": "^2.26.0",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-scripts": "3.4.1",
diff --git a/src/App.css b/src/App.css
deleted file mode 100644
index 74b5e05..0000000
--- a/src/App.css
+++ /dev/null
@@ -1,38 +0,0 @@
-.App {
- text-align: center;
-}
-
-.App-logo {
- height: 40vmin;
- pointer-events: none;
-}
-
-@media (prefers-reduced-motion: no-preference) {
- .App-logo {
- animation: App-logo-spin infinite 20s linear;
- }
-}
-
-.App-header {
- background-color: #282c34;
- min-height: 100vh;
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- font-size: calc(10px + 2vmin);
- color: white;
-}
-
-.App-link {
- color: #61dafb;
-}
-
-@keyframes App-logo-spin {
- from {
- transform: rotate(0deg);
- }
- to {
- transform: rotate(360deg);
- }
-}
diff --git a/src/App.test.tsx b/src/App.test.tsx
deleted file mode 100644
index 4db7ebc..0000000
--- a/src/App.test.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-import React from 'react';
-import { render } from '@testing-library/react';
-import App from './App';
-
-test('renders learn react link', () => {
- const { getByText } = render();
- const linkElement = getByText(/learn react/i);
- expect(linkElement).toBeInTheDocument();
-});
diff --git a/src/App.tsx b/src/App.tsx
index d919f03..f6ed80e 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -1,24 +1,13 @@
import React from 'react';
-import logo from './logo.svg';
-import './App.css';
+import { Container } from "@material-ui/core";
+import { CompanyForm } from "./forms/company";
function App() {
return (
-
-
+
+
+
+
);
}
diff --git a/src/data/company.ts b/src/data/company.ts
new file mode 100644
index 0000000..c73333d
--- /dev/null
+++ b/src/data/company.ts
@@ -0,0 +1,27 @@
+export interface Address {
+ street: string;
+ building: string;
+ city: string;
+ postalCode: string;
+ country: string;
+}
+
+export interface Company {
+ name: string;
+ url?: string;
+ nip: string;
+ offices: BranchOffice[];
+}
+
+export interface BranchOffice {
+ address: Address;
+}
+
+export const emptyCompany: Company = {
+ offices: [],
+ url: "",
+ name: "",
+ nip: "",
+}
+
+export const formatAddress = ({ postalCode, building, street, city, country }: Address): string => `${street} ${building}, ${postalCode} ${city}, ${country}`
diff --git a/src/data/internship.ts b/src/data/internship.ts
new file mode 100644
index 0000000..03a557e
--- /dev/null
+++ b/src/data/internship.ts
@@ -0,0 +1,23 @@
+import { Moment } from "moment";
+import { Nullable } from "../helpers";
+
+export enum InternshipType { }
+export enum InternshipProgram { }
+
+export interface Internship {
+ type: InternshipType;
+ program: InternshipProgram;
+ startDate: Moment;
+ endDate: Moment;
+ isAccepted: boolean;
+ lengthInWeeks: number;
+}
+
+export const emptyInternship: Nullable
= {
+ endDate: null,
+ startDate: null,
+ type: null,
+ program: null,
+ isAccepted: false,
+ lengthInWeeks: 0,
+}
diff --git a/src/forms/Internship.tsx b/src/forms/Internship.tsx
new file mode 100644
index 0000000..e749b8d
--- /dev/null
+++ b/src/forms/Internship.tsx
@@ -0,0 +1,22 @@
+import React from "react";
+import { useFormik } from "formik";
+import { emptyInternship, Internship } from "../data/internship";
+import { Nullable } from "../helpers";
+import { TextField } from "@material-ui/core";
+
+export type InternshipFormProps = {
+
+}
+
+export const InternshipForm: React.FunctionComponent = props => {
+ const formik = useFormik>({ onSubmit: values => console.log(values), initialValues: emptyInternship });
+
+ const formikProps = (prop: keyof Internship) => ({ onChange: formik.handleChange, value: formik.values[prop], name: prop })
+
+ return (
+
+
+
+ )
+}
+
diff --git a/src/forms/company.tsx b/src/forms/company.tsx
new file mode 100644
index 0000000..4ff47bf
--- /dev/null
+++ b/src/forms/company.tsx
@@ -0,0 +1,69 @@
+import React, { HTMLProps, useState } from "react";
+import { useFormik } from "formik";
+import { Nullable } from "../helpers";
+import { formatAddress, Company, emptyCompany, BranchOffice } from "../data/company";
+import { sampleCompanies } from "../provider/company";
+import { Autocomplete } from "@material-ui/lab";
+import { Box, Grid, TextField, Typography } from "@material-ui/core";
+
+export type CompanyFormProps = {
+
+}
+
+export const CompanyItem = ({ company, ...props }: { company: Company } & HTMLProps) => (
+
+
{ company.name }
+
NIP: { company.nip }
+
+)
+
+export const OfficeItem = ({ office, ...props }: { office: BranchOffice } & HTMLProps) => (
+
+
{ office.address.city }, { office.address.street }
+
{ formatAddress(office.address) }
+
+)
+
+export const CompanyForm: React.FunctionComponent = props => {
+ const formik = useFormik>({ onSubmit: values => console.log(values), initialValues: emptyCompany });
+
+ const formikProps = (prop: keyof Company) => ({ onChange: formik.handleChange, value: formik.values[prop], name: prop })
+
+ const [company, setCompany] = useState(null);
+
+ return (
+
+
+ option.name }
+ renderOption={ company => }
+ renderInput={ props => }
+ onChange={ (ev, value: Company | null) => {
+ setCompany(value)
+
+ formik.setFieldValue("name", value?.name || "")
+ formik.setFieldValue("url", value?.url || "");
+ formik.setFieldValue("nip", value?.nip || "");
+ } }
+ />
+
+
+
+
+
+
+
+
+
+
+ office.address.city }
+ renderOption={ office => }
+ renderInput={ props => }
+ />
+
+
+ )
+}
+
diff --git a/src/helpers.ts b/src/helpers.ts
new file mode 100644
index 0000000..157ce58
--- /dev/null
+++ b/src/helpers.ts
@@ -0,0 +1 @@
+export type Nullable = { [P in keyof T]: T[P] | null }
diff --git a/src/index.css b/src/index.css
deleted file mode 100644
index ec2585e..0000000
--- a/src/index.css
+++ /dev/null
@@ -1,13 +0,0 @@
-body {
- margin: 0;
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
- 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
- sans-serif;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-code {
- font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
- monospace;
-}
diff --git a/src/index.tsx b/src/index.tsx
index f5185c1..4146d1d 100644
--- a/src/index.tsx
+++ b/src/index.tsx
@@ -1,6 +1,5 @@
import React from 'react';
import ReactDOM from 'react-dom';
-import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
diff --git a/src/logo.svg b/src/logo.svg
deleted file mode 100644
index 6b60c10..0000000
--- a/src/logo.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/src/provider/company.ts b/src/provider/company.ts
new file mode 100644
index 0000000..e0379f0
--- /dev/null
+++ b/src/provider/company.ts
@@ -0,0 +1,62 @@
+import { Company } from "../data/company";
+
+export const sampleCompanies: Company[] = [
+ {
+ name: "Intel",
+ url: "https://www.intel.com/content/www/us/en/jobs/locations/poland.html",
+ nip: "9570752316",
+ offices: [{
+ address: {
+ city: "Gdańsk",
+ street: "ul. Słowackiego",
+ building: "173",
+ postalCode: "80-298",
+ country: "Poland"
+ }
+ }]
+ },
+ {
+ name: "IHS Markit",
+ url: "http://ihsgdansk.com/",
+ nip: "5842068320",
+ offices: [{
+ address: {
+ city: "Gdańsk",
+ street: "ul. Marynarki Polskiej",
+ building: "163",
+ postalCode: "80-868",
+ country: "Poland"
+ }
+ }]
+ },
+ {
+ name: "Asseco Poland",
+ url: "http://pl.asseco.com/",
+ nip: "5842068320",
+ offices: [{
+ address: {
+ city: "Gdynia",
+ street: "ul. Podolska",
+ building: "21",
+ postalCode: "81-321",
+ country: "Poland"
+ }
+ }, {
+ address: {
+ city: "Łódź",
+ street: "al. Marszałka Józefa Piłsudskiego",
+ building: "85",
+ postalCode: "90-332",
+ country: "Poland"
+ }
+ }, {
+ address: {
+ city: "Wrocław",
+ street: "Traugutta",
+ building: "1/7",
+ postalCode: "50-449",
+ country: "Poland"
+ }
+ }]
+ }
+]
diff --git a/src/setupTests.ts b/src/setupTests.ts
deleted file mode 100644
index 74b1a27..0000000
--- a/src/setupTests.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-// jest-dom adds custom jest matchers for asserting on DOM nodes.
-// allows you to do things like:
-// expect(element).toHaveTextContent(/react/i)
-// learn more: https://github.com/testing-library/jest-dom
-import '@testing-library/jest-dom/extend-expect';
diff --git a/yarn.lock b/yarn.lock
index c32e217..b908545 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1309,6 +1309,17 @@
react-is "^16.8.0"
react-transition-group "^4.4.0"
+"@material-ui/lab@^4.0.0-alpha.55":
+ version "4.0.0-alpha.55"
+ resolved "https://registry.yarnpkg.com/@material-ui/lab/-/lab-4.0.0-alpha.55.tgz#82a850dc59654e04ee3a31be1b34eb3bf64d5585"
+ integrity sha512-mPHiS52Z1AT6NlWNp07xxTkoKGU3DZhoGdVtLKGy2+uMH5t4/UPtiZLRab7hR3hvuHvguxgV4tkBC9ww3xqUzA==
+ dependencies:
+ "@babel/runtime" "^7.4.4"
+ "@material-ui/utils" "^4.9.6"
+ clsx "^1.0.4"
+ prop-types "^15.7.2"
+ react-is "^16.8.0"
+
"@material-ui/styles@^4.10.0":
version "4.10.0"
resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.10.0.tgz#2406dc23aa358217aa8cc772e6237bd7f0544071"
@@ -1612,6 +1623,13 @@
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
+"@types/moment@^2.13.0":
+ version "2.13.0"
+ resolved "https://registry.yarnpkg.com/@types/moment/-/moment-2.13.0.tgz#604ebd189bc3bc34a1548689404e61a2a4aac896"
+ integrity sha1-YE69GJvDvDShVIaJQE5hoqSqyJY=
+ dependencies:
+ moment "*"
+
"@types/node@*":
version "13.9.2"
resolved "https://registry.yarnpkg.com/@types/node/-/node-13.9.2.tgz#ace1880c03594cc3e80206d96847157d8e7fa349"
@@ -3654,6 +3672,11 @@ deep-is@~0.1.3:
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
+deepmerge@^2.1.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.2.1.tgz#5d3ff22a01c00f645405a2fbc17d0778a1801170"
+ integrity sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==
+
default-gateway@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b"
@@ -4728,6 +4751,20 @@ form-data@~2.3.2:
combined-stream "^1.0.6"
mime-types "^2.1.12"
+formik@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/formik/-/formik-2.1.4.tgz#8deef07ec845ea98f75e03da4aad7aab4ac46570"
+ integrity sha512-oKz8S+yQBzuQVSEoxkqqJrKQS5XJASWGVn6mrs+oTWrBoHgByVwwI1qHiVc9GKDpZBU9vAxXYAKz2BvujlwunA==
+ dependencies:
+ deepmerge "^2.1.1"
+ hoist-non-react-statics "^3.3.0"
+ lodash "^4.17.14"
+ lodash-es "^4.17.14"
+ react-fast-compare "^2.0.1"
+ scheduler "^0.18.0"
+ tiny-warning "^1.0.2"
+ tslib "^1.10.0"
+
forwarded@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
@@ -5084,7 +5121,7 @@ hmac-drbg@^1.0.0:
minimalistic-assert "^1.0.0"
minimalistic-crypto-utils "^1.0.1"
-hoist-non-react-statics@^3.3.2:
+hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2:
version "3.3.2"
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
@@ -6657,6 +6694,11 @@ locate-path@^5.0.0:
dependencies:
p-locate "^4.1.0"
+lodash-es@^4.17.14:
+ version "4.17.15"
+ resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78"
+ integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==
+
lodash._reinterpolate@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
@@ -7017,6 +7059,11 @@ mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1:
dependencies:
minimist "^1.2.5"
+moment@*, moment@^2.26.0:
+ version "2.26.0"
+ resolved "https://registry.yarnpkg.com/moment/-/moment-2.26.0.tgz#5e1f82c6bafca6e83e808b30c8705eed0dcbd39a"
+ integrity sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw==
+
move-concurrently@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
@@ -8785,6 +8832,11 @@ react-error-overlay@^6.0.7:
resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.7.tgz#1dcfb459ab671d53f660a991513cb2f0a0553108"
integrity sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA==
+react-fast-compare@^2.0.1:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9"
+ integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==
+
react-is@^16.12.0, react-is@^16.7.0, react-is@^16.8.0, react-is@^16.8.1, react-is@^16.8.4:
version "16.13.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
@@ -9352,6 +9404,14 @@ saxes@^3.1.9:
dependencies:
xmlchars "^2.1.1"
+scheduler@^0.18.0:
+ version "0.18.0"
+ resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.18.0.tgz#5901ad6659bc1d8f3fdaf36eb7a67b0d6746b1c4"
+ integrity sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==
+ dependencies:
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+
scheduler@^0.19.1:
version "0.19.1"
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196"