├── .gitignore
├── README.md
├── package-lock.json
├── package.json
├── public
├── favicon.ico
├── index.html
├── logo192.png
├── logo512.png
├── manifest.json
└── robots.txt
├── src
├── App.css
├── App.js
├── App.test.js
├── components
│ └── admin-panel
│ │ ├── AdminSignedIn.jsx
│ │ ├── Login.css
│ │ ├── Login.jsx
│ │ ├── enables
│ │ ├── NewCandidate.jsx
│ │ ├── NewCompany.jsx
│ │ ├── NewJobPost.jsx
│ │ └── enables.css
│ │ ├── navbar
│ │ ├── Navbar.css
│ │ └── Navbar.jsx
│ │ └── sidebar
│ │ ├── Sidebar.css
│ │ └── Sidebar.jsx
├── db.json
├── index.css
├── index.js
├── layouts
│ ├── DashBoard.jsx
│ ├── Footer.jsx
│ ├── Navi.jsx
│ ├── Side.jsx
│ ├── SignedIn.jsx
│ └── SignedOut.jsx
├── logo.svg
├── pages
│ ├── AddJobPost.jsx
│ ├── CandidateFormSignUp.jsx
│ ├── CandidateList.jsx
│ ├── CompanyFormSignUp.jsx
│ ├── CompanyList.jsx
│ ├── CurriculumVitaeList.jsx
│ ├── FirstPage.jsx
│ ├── JobPostCompanyList.jsx
│ ├── JobPostList.jsx
│ ├── JobPostSortList.jsx
│ └── PositionList.jsx
├── reportWebVitals.js
├── routes.js
├── services
│ ├── authService.js
│ ├── candidateService.js
│ ├── cityService.js
│ ├── cloudinaryService.js
│ ├── companyService.js
│ ├── cvdetailService.js
│ ├── favoriteService.js
│ ├── jobExperienceService.js
│ ├── jobPostService.js
│ ├── jobTimeService.js
│ ├── jobTypeService.js
│ ├── languageService.js
│ ├── newPostService.js
│ ├── positionService.js
│ ├── technologyService.js
│ └── universityService.js
├── setupTests.js
├── store
│ ├── actions
│ │ └── favoriteActions.js
│ ├── configureStore.js
│ ├── initialValues
│ │ └── favoriteItems.js
│ ├── reducers
│ │ └── favoriteReducer.js
│ └── rootReducer.js
└── utilities
│ └── customFormControls
│ ├── JobPostTextInput.jsx
│ └── UserAddTextInput.jsx
└── umlDiagram.png
/.gitignore:
--------------------------------------------------------------------------------
1 | HELP.md
2 | target/
3 | !.mvn/wrapper/maven-wrapper.jar
4 | !**/src/main/**/target/
5 | !**/src/test/**/target/
6 |
7 | ### STS ###
8 | .apt_generated
9 | .classpath
10 | .factorypath
11 | .project
12 | .settings
13 | .springBeans
14 | .sts4-cache
15 |
16 | ### IntelliJ IDEA ###
17 | .idea
18 | *.iws
19 | *.iml
20 | *.ipr
21 |
22 | ### NetBeans ###
23 | /nbproject/private/
24 | /nbbuild/
25 | /dist/
26 | /nbdist/
27 | /.nb-gradle/
28 | build/
29 | !**/src/main/**/build/
30 | !**/src/test/**/build/
31 |
32 | ### VS Code ###
33 | .vscode/
34 | node_modules
35 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 
2 |
3 | # Getting Started with Create React App
4 |
5 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
6 |
7 | ## Available Scripts
8 |
9 | In the project directory, you can run:
10 |
11 | ### `npm start`
12 |
13 | Runs the app in the development mode.\
14 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
15 |
16 | The page will reload if you make edits.\
17 | You will also see any lint errors in the console.
18 |
19 | ### `npm test`
20 |
21 | Launches the test runner in the interactive watch mode.\
22 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
23 |
24 | ### `npm run build`
25 |
26 | Builds the app for production to the `build` folder.\
27 | It correctly bundles React in production mode and optimizes the build for the best performance.
28 |
29 | The build is minified and the filenames include the hashes.\
30 | Your app is ready to be deployed!
31 |
32 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
33 |
34 | ### `npm run eject`
35 |
36 | **Note: this is a one-way operation. Once you `eject`, you can’t go back!**
37 |
38 | If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
39 |
40 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.
41 |
42 | You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.
43 |
44 | ## Learn More
45 |
46 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
47 |
48 | To learn React, check out the [React documentation](https://reactjs.org/).
49 |
50 | ### Code Splitting
51 |
52 | This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting)
53 |
54 | ### Analyzing the Bundle Size
55 |
56 | This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size)
57 |
58 | ### Making a Progressive Web App
59 |
60 | This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app)
61 |
62 | ### Advanced Configuration
63 |
64 | This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration)
65 |
66 | ### Deployment
67 |
68 | This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment)
69 |
70 | ### `npm run build` fails to minify
71 |
72 | This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)
73 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "hrms-project",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@material-ui/core": "^4.11.4",
7 | "@testing-library/jest-dom": "^5.13.0",
8 | "@testing-library/react": "^11.2.7",
9 | "@testing-library/user-event": "^12.8.3",
10 | "axios": "^0.21.1",
11 | "formik": "^2.2.9",
12 | "formik-semantic-ui-react": "^2.0.0",
13 | "react": "^17.0.2",
14 | "react-dom": "^17.0.2",
15 | "react-redux": "^7.2.4",
16 | "react-router-dom": "^5.2.0",
17 | "react-scripts": "4.0.3",
18 | "react-toastify": "^7.0.4",
19 | "redux-devtools-extension": "^2.13.9",
20 | "semantic-ui-css": "^2.4.1",
21 | "semantic-ui-react": "^2.0.3",
22 | "sweetalert2": "^11.0.18",
23 | "web-vitals": "^1.1.2",
24 | "yup": "^0.32.9"
25 | },
26 | "scripts": {
27 | "start": "react-scripts start",
28 | "build": "react-scripts build",
29 | "test": "react-scripts test",
30 | "eject": "react-scripts eject"
31 | },
32 | "eslintConfig": {
33 | "extends": [
34 | "react-app",
35 | "react-app/jest"
36 | ]
37 | },
38 | "browserslist": {
39 | "production": [
40 | ">0.2%",
41 | "not dead",
42 | "not op_mini all"
43 | ],
44 | "development": [
45 | "last 1 chrome version",
46 | "last 1 firefox version",
47 | "last 1 safari version"
48 | ]
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iremcibal/Hrms-ReactProject/cc83462e00c28474ce301e50560f27b7e18bacf3/public/favicon.ico
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
17 |
18 |
27 | React App
28 |
29 |
30 | You need to enable JavaScript to run this app.
31 |
32 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iremcibal/Hrms-ReactProject/cc83462e00c28474ce301e50560f27b7e18bacf3/public/logo192.png
--------------------------------------------------------------------------------
/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iremcibal/Hrms-ReactProject/cc83462e00c28474ce301e50560f27b7e18bacf3/public/logo512.png
--------------------------------------------------------------------------------
/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/src/App.css:
--------------------------------------------------------------------------------
1 | .ui.card.cv{
2 | height:max-content;
3 | align-self: flex-end;
4 | }
5 | .ui.fluid.card.candidate-cv{
6 | margin-top: 1.5em;
7 | padding: 3em;
8 | }
9 | .ui.red.card{
10 | width: 10rem;
11 | }
12 | .ui.cards.candidate{
13 | margin-top: 0.8em;
14 | width: 98%;
15 | }
16 | .ui.cards.company{
17 | margin-top: 0.8em;
18 | width: 98%;
19 | }
20 |
21 | .ui.menu:not(.vertical) .item {
22 | padding: 0.45em;
23 | }
24 | .profil{
25 | margin: auto;
26 | padding-top: 0.3em;
27 | width: 5em;
28 | }
29 | .sidebar{
30 | height: auto;
31 | }
32 | .text-user{
33 | text-align: center;
34 | }
35 |
36 | /* Candidate Form*/
37 | .container-form {
38 | width: 80%;
39 | margin: 70px auto;
40 | display: flex;
41 | border-radius: 10px;
42 |
43 |
44 | }
45 | .input-feedback {
46 | color: red;
47 | margin-top: 0.02rem;
48 | font-size: 12px;
49 | text-align:right
50 | }
51 | .brand-box{
52 | flex: 1 50%;
53 | display: flex;
54 | flex-direction: column;
55 | justify-content: center;
56 | align-items: center;
57 | font-size: 25px;
58 |
59 | }
60 | .magic-form {
61 | flex: 1 50%;
62 | display: flex;
63 | flex-direction: column;
64 | padding: 40px 40px;
65 | font-size: 23px;
66 | border-top-right-radius: 10px;
67 | border-bottom-right-radius: 10px;
68 | }
69 | /*.....*/
70 |
71 | /*Job Post Formu*/
72 | .container-form2 {
73 | margin: auto;
74 | display: flex;
75 | border-radius: 10px;
76 | text:white;
77 | }
78 | .ui.form .field>label{
79 | color:white;
80 | }
81 | .ui.checkbox label, .ui.checkbox+label {
82 | color: white;
83 | }
84 | .ilan{
85 | text-align: center;
86 | margin-bottom: 0.5em;
87 | }
88 |
89 | .ui.vertical.menu{
90 | margin-top: 1.5em;
91 | height: 18rem;
92 | width: 18rem;
93 | }
94 | .ui.header:last-child{
95 | margin: auto;
96 | display: flex;
97 | margin-top: 0.3em;
98 | }
99 | /*Login buton*/
100 |
101 | button.ui.large.fluid.button.login-button{
102 | background-color: navy;
103 | color: white;
104 | }
105 |
106 | /*Başvur butonu*/
107 | button.ui.button.login-button{
108 | background-color: navy;
109 | color: white;
110 | }
111 | /*favori butonu*/
112 | button.ui.button.favorite-button{
113 | background-color:#42a3ce;
114 | color: white;
115 | }
116 | /*favorite redux navi*/
117 | .ui.menu .item>.label{
118 | background-color: navy;
119 | color: white;
120 | }
121 | i.heart.icon.f-navi {
122 | color: navy;
123 | }
124 |
125 | /*Navi*/
126 | button.ui.big.button {
127 | padding: 0.5em;
128 | margin-bottom: 0.5em;
129 | }
130 | .style-out{
131 | display: contents;
132 | }
133 |
134 |
135 | /* .div.center.aligned.header.textbaslik{
136 | height: max-content;
137 | text-align:center;
138 | font-size:xx-large;
139 |
140 | } */
141 |
142 | /* sp */
143 | img.ui.image.sp {
144 | display: block;
145 | margin: auto;
146 | }
147 | button.ui.button.sp {
148 | width: 50%;
149 | /* margin-right: auto; */
150 | display: block;
151 | margin: auto;
152 | margin-top: 5em;
153 | }
154 |
155 |
156 | /* FOOTER */
157 |
158 | .footer{
159 | color:black;
160 | }
--------------------------------------------------------------------------------
/src/App.js:
--------------------------------------------------------------------------------
1 | import { Container } from 'semantic-ui-react';
2 | import 'semantic-ui-css/semantic.min.css'
3 | import './App.css';
4 |
5 |
6 | import DashBoard from './layouts/DashBoard';
7 | import Footer from './layouts/Footer';
8 |
9 | function App() {
10 | return (
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 | );
21 | }
22 |
23 | export default App;
24 |
--------------------------------------------------------------------------------
/src/App.test.js:
--------------------------------------------------------------------------------
1 | import { render, screen } from '@testing-library/react';
2 | import App from './App';
3 |
4 | test('renders learn react link', () => {
5 | render( );
6 | const linkElement = screen.getByText(/learn react/i);
7 | expect(linkElement).toBeInTheDocument();
8 | });
9 |
--------------------------------------------------------------------------------
/src/components/admin-panel/AdminSignedIn.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | import {Dropdown, Image,Header } from 'semantic-ui-react'
4 | import { NavLink} from "react-router-dom";
5 |
6 |
7 | export default function AdminSignedIn({signOut}) {
8 | return (
9 |
10 |
11 |
12 |
13 |
14 |
15 | Bilgilerimi Güncelle
16 | Çıkış Yap
17 |
18 |
19 |
20 |
21 |
22 | )
23 | }
24 |
--------------------------------------------------------------------------------
/src/components/admin-panel/Login.css:
--------------------------------------------------------------------------------
1 | /*Ortaya almak için*/
2 | #loginform {
3 | border: 1px solid black;
4 | border-color: black;
5 | background: rgb(white, white, white,50%);
6 | padding: 30px 7em 38px;
7 | position: absolute;
8 | align-items: center;
9 | left: 27em;
10 | margin-top: 15em;
11 |
12 | }
13 | .login-panel{
14 | width: 320px;
15 | margin: auto;
16 | }
17 |
--------------------------------------------------------------------------------
/src/components/admin-panel/Login.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Form, Button } from 'semantic-ui-react'
3 | import { Link } from "react-router-dom";
4 |
5 | import './Login.css';
6 |
7 | export default function Login({signIn}){
8 |
9 | return (
10 |
11 |
19 | Şifre
20 |
25 | Giriş Yap
26 |
27 |
28 |
29 |
30 | )
31 | }
32 |
33 |
--------------------------------------------------------------------------------
/src/components/admin-panel/enables/NewCandidate.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Button, Checkbox, Icon, Table } from 'semantic-ui-react'
3 | import './enables.css'
4 |
5 | export default function NewCandidate() {
6 | return (
7 |
8 |
9 |
10 |
11 |
12 | Name
13 | Registration Date
14 | E-mail address
15 | Premium Plan
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 | John Lilki
25 | September 14, 2013
26 | jhlilk22@yahoo.com
27 | No
28 |
29 |
30 |
31 |
32 |
33 | Jamie Harington
34 | January 11, 2014
35 | jamieharingonton@yahoo.com
36 | Yes
37 |
38 |
39 |
40 |
41 |
42 | Jill Lewis
43 | May 11, 2014
44 | jilsewris22@yahoo.com
45 | Yes
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
60 | Add User
61 |
62 | Approve
63 |
64 | Approve All
65 |
66 |
67 |
68 |
69 |
70 |
71 | )
72 | }
73 |
--------------------------------------------------------------------------------
/src/components/admin-panel/enables/NewCompany.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Button, Checkbox, Icon, Table } from 'semantic-ui-react'
3 | export default function NewCompany() {
4 | return (
5 |
6 |
7 |
8 |
9 |
10 | Name
11 | Registration Date
12 | E-mail address
13 | Premium Plan
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 | John Lilki
23 | September 14, 2013
24 | jhlilk22@yahoo.com
25 | No
26 |
27 |
28 |
29 |
30 |
31 | Jamie Harington
32 | January 11, 2014
33 | jamieharingonton@yahoo.com
34 | Yes
35 |
36 |
37 |
38 |
39 |
40 | Jill Lewis
41 | May 11, 2014
42 | jilsewris22@yahoo.com
43 | Yes
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
58 | Add User
59 |
60 | Approve
61 |
62 | Approve All
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 | )
71 | }
72 |
--------------------------------------------------------------------------------
/src/components/admin-panel/enables/NewJobPost.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { useState } from 'react'
3 | import { useEffect } from 'react'
4 | import { Button, Checkbox,Table } from 'semantic-ui-react'
5 | import { JobPostService } from '../../../services/jobPostService'
6 | import Swal from 'sweetalert2'
7 |
8 | export default function NewJobPost() {
9 |
10 | const [jobPosts, setJobPosts] = useState([])
11 | let jobPostService = new JobPostService()
12 | useEffect(() => {
13 | jobPostService.getJobPostStatusFalse().then((result) => setJobPosts(result.data.data))
14 | }, [])
15 |
16 | const updateStatusTrue = (id) => {
17 | jobPostService.updateStatusJobPost(id).then(
18 | Swal.fire(
19 | 'Tebrikler',
20 | 'Sisteme Eklendi.',
21 | 'success'
22 | ).then(function () {
23 | window.location.reload();
24 | })
25 | );
26 | }
27 |
28 | const deleteJobPost = (jobPostId) => {
29 | jobPostService.deleteJobPost(jobPostId).then(
30 | Swal.fire(
31 | 'Tebrikler',
32 | 'Silindi.',
33 | 'success'
34 | ).then(function () {
35 | window.location.reload();
36 | })
37 | );
38 | }
39 |
40 | return (
41 |
42 |
43 |
44 |
45 |
46 | Şirket
47 | Pozisyon
48 | E-mail
49 | Çalışma Şekli
50 | Çalışma Süresi
51 |
52 |
53 |
54 |
55 |
56 | {jobPosts.map((jobPost) => (
57 |
58 |
59 | updateStatusTrue(jobPost.jobPostId)} />
60 |
61 | {jobPost.company?.companyName}
62 | {jobPost.positions?.positionName}
63 | {jobPost.company?.email}
64 | {jobPost.jobType?.typeName}
65 | {jobPost.jobTime?.timeName}
66 | deleteJobPost(jobPost.jobPostId)}>Sil
67 |
68 | ))}
69 |
70 |
71 | {/*
72 |
73 |
74 |
75 |
82 | Ekle
83 |
84 |
85 |
86 | */}
87 |
88 |
89 | )
90 | }
91 |
--------------------------------------------------------------------------------
/src/components/admin-panel/enables/enables.css:
--------------------------------------------------------------------------------
1 | /*Candidates*/
2 | .new {
3 | margin-top: 1.5em;
4 | width: max-content;
5 | }
--------------------------------------------------------------------------------
/src/components/admin-panel/navbar/Navbar.css:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iremcibal/Hrms-ReactProject/cc83462e00c28474ce301e50560f27b7e18bacf3/src/components/admin-panel/navbar/Navbar.css
--------------------------------------------------------------------------------
/src/components/admin-panel/navbar/Navbar.jsx:
--------------------------------------------------------------------------------
1 | import React,{useState} from 'react'
2 | import { Container, Menu } from 'semantic-ui-react'
3 | import { Input, Image } from 'semantic-ui-react'
4 | import { Link } from "react-router-dom";
5 | import AdminSignedIn from '../AdminSignedIn';
6 | import Login from '../Login';
7 | import './Navbar.css';
8 |
9 | export default function Navbar() {
10 | const [isAuthenticated, setIsAuthenticated] = useState(true)
11 |
12 | function handleSignOut(){
13 | setIsAuthenticated(false)
14 | }
15 | function handleSignIn(){
16 | setIsAuthenticated(true)
17 | }
18 |
19 | return (
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 | Menu
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 | {isAuthenticated?
37 | :}
38 |
39 |
40 |
41 |
42 |
43 |
44 | )
45 | }
46 |
--------------------------------------------------------------------------------
/src/components/admin-panel/sidebar/Sidebar.css:
--------------------------------------------------------------------------------
1 | .ui.vertical.menu{
2 | height: 30rem;
3 | width: 18rem;
4 | }
5 | .sidebar2{
6 | margin-top: 1.5em;
7 | height: 30rem;
8 | width: 18rem;
9 | }
--------------------------------------------------------------------------------
/src/components/admin-panel/sidebar/Sidebar.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { NavLink } from 'react-router-dom'
3 | import { Menu } from 'semantic-ui-react'
4 | import { Card, Header, Image } from 'semantic-ui-react'
5 | import './Sidebar.css'
6 |
7 | export default function Sidebar() {
8 | return (
9 |
10 |
11 |
12 |
13 |
14 |
15 | Kullanıcı ismi
16 |
17 |
18 |
19 |
22 |
25 | Yeni Aday Üyelikleri
26 |
27 |
28 | Yeni Şirket Üyelikleri
29 |
30 | Yeni İş İlanları
31 |
32 |
33 |
34 |
35 |
36 |
37 | )
38 | }
39 |
--------------------------------------------------------------------------------
/src/db.json:
--------------------------------------------------------------------------------
1 | {
2 | "users": [
3 | {
4 | "id": 1,
5 | "email": "iremcibal@gmail.com",
6 | "password": "12345"
7 | }
8 | ],
9 | "posts": [
10 | {
11 | "id": 1,
12 | "title": "json-server",
13 | "author": "typicode"
14 | }
15 | ],
16 | "comments": [
17 | {
18 | "id": 1,
19 | "body": "some comment",
20 | "postId": 1
21 | }
22 | ],
23 | "profile": {
24 | "name": "typicode"
25 | }
26 | }
--------------------------------------------------------------------------------
/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
5 | sans-serif;
6 | -webkit-font-smoothing: antialiased;
7 | -moz-osx-font-smoothing: grayscale;
8 | }
9 |
10 | code {
11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
12 | monospace;
13 | }
14 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import './index.css';
4 | import App from './App';
5 | import reportWebVitals from './reportWebVitals';
6 | import { BrowserRouter } from 'react-router-dom';
7 | import { configureStore } from './store/configureStore';
8 | import { Provider } from 'react-redux';
9 |
10 | const store= configureStore()
11 | ReactDOM.render(
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | ,
20 | document.getElementById('root')
21 | );
22 |
23 | // If you want to start measuring performance in your app, pass a function
24 | // to log results (for example: reportWebVitals(console.log))
25 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
26 | reportWebVitals();
27 |
--------------------------------------------------------------------------------
/src/layouts/DashBoard.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Grid } from 'semantic-ui-react'
3 | import CandidateList from '../pages/CandidateList'
4 | import JobPostList from '../pages/JobPostList'
5 | import CompanyList from '../pages/CompanyList'
6 | import PositionList from '../pages/PositionList'
7 | import CurriculumVitaeList from "../pages/CurriculumVitaeList";
8 | import { Route } from 'react-router-dom'
9 | import Side from './Side'
10 | import JobPostSortList from '../pages/JobPostSortList'
11 | import JobPostCompanyList from '../pages/JobPostCompanyList'
12 | import CandidateFormSignUp from '../pages/CandidateFormSignUp'
13 | import FirstPage from '../pages/FirstPage'
14 | import Navi from './Navi'
15 | import CompanyFormSignUp from '../pages/CompanyFormSignUp'
16 | import Navbar from '../components/admin-panel/navbar/Navbar'
17 | import Sidebar from '../components/admin-panel/sidebar/Sidebar'
18 | import NewCandidate from '../components/admin-panel/enables/NewCandidate'
19 | import NewCompany from '../components/admin-panel/enables/NewCompany'
20 | import NewJobPost from '../components/admin-panel/enables/NewJobPost'
21 | import Login from '../components/admin-panel/Login'
22 | import AddJobPost from '../pages/AddJobPost'
23 |
24 | export default function DashBoard() {
25 | return (
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 | )
60 | }
61 |
--------------------------------------------------------------------------------
/src/layouts/Footer.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import {
3 | Container,
4 | Divider,
5 | Grid,
6 | Header,
7 | Image,
8 | List,
9 | Segment,
10 | } from 'semantic-ui-react'
11 |
12 | export default function Footer() {
13 | return (
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 | Link One
24 | Link Two
25 | Link Three
26 | Link Four
27 |
28 |
29 |
30 |
31 |
32 | Link One
33 | Link Two
34 | Link Three
35 | Link Four
36 |
37 |
38 |
39 |
40 |
41 | Extra space for a call to action inside the footer that could help re-engage
42 | users.
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 | Site Map
52 |
53 |
54 | Contact Us
55 |
56 |
57 | Terms and Conditions
58 |
59 |
60 | Privacy Policy
61 |
62 |
63 |
64 |
65 |
66 | )
67 | }
68 |
--------------------------------------------------------------------------------
/src/layouts/Navi.jsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react'
2 | import { useSelector } from 'react-redux';
3 | import { Container, Menu } from 'semantic-ui-react'
4 | import { Input, Image, Icon, Label } from 'semantic-ui-react'
5 |
6 | import SignedIn from './SignedIn';
7 | import SignedOut from './SignedOut';
8 |
9 | export default function Navi() {
10 | const { favoriteItems } = useSelector(state => state.favorite)
11 | console.log(favoriteItems)
12 | const [isAuthenticated, setIsAuthenticated] = useState(true)
13 |
14 | function handleSignOut() {
15 | setIsAuthenticated(false)
16 | }
17 | function handleSignIn() {
18 | setIsAuthenticated(true)
19 | }
20 |
21 | return (
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 | Menu
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 | Favorilerim
42 |
43 | {favoriteItems.length}
44 |
45 |
46 |
47 |
48 | {isAuthenticated ?
49 | : }
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 | )
60 | }
61 |
--------------------------------------------------------------------------------
/src/layouts/Side.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { NavLink } from 'react-router-dom'
3 | import { Menu } from 'semantic-ui-react'
4 | import { Card, Header ,Image} from 'semantic-ui-react'
5 |
6 |
7 | export default function Side() {
8 |
9 | return (
10 |
11 |
12 |
13 |
14 |
15 |
16 | Kullanıcı ismi
17 |
18 |
19 |
20 |
23 |
24 | Adaylar
25 | Şirketler
26 | İş İlanları
27 | İlan Ver
28 |
29 |
30 | )
31 | }
32 |
--------------------------------------------------------------------------------
/src/layouts/SignedIn.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Dropdown, Image, Header } from 'semantic-ui-react'
3 | import { NavLink } from "react-router-dom";
4 |
5 |
6 | export default function SignedIn({ signOut }) {
7 | return (
8 |
9 |
10 |
11 |
12 | Bilgilerimi Güncelle
13 | Çıkış Yap
14 |
15 |
16 |
17 |
18 | )
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/src/layouts/SignedOut.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Button, Dropdown } from 'semantic-ui-react'
3 | import { Menu } from 'semantic-ui-react'
4 | import { Link } from "react-router-dom";
5 |
6 |
7 | export default function SignedOut({ signIn }) {
8 | return (
9 |
10 |
11 | Sign In
12 |
13 |
14 |
15 | For Individual
16 | For Company
17 |
18 |
19 |
20 |
21 |
22 | )
23 | }
24 |
--------------------------------------------------------------------------------
/src/logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/pages/AddJobPost.jsx:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState } from 'react'
2 |
3 | import { Formik, Field, useFormik } from 'formik'
4 | import { Form, Select } from 'formik-semantic-ui-react'
5 | import { Button, Header, Modal, Icon } from 'semantic-ui-react'
6 | import * as Yup from 'yup';
7 |
8 | import { NewPostService } from '../services/newPostService'
9 | import JobPostTextInput from '../utilities/customFormControls/JobPostTextInput'
10 |
11 |
12 | import { JobPostService } from '../services/jobPostService'
13 | import Swal from 'sweetalert2'
14 | import { useHistory } from 'react-router-dom'
15 |
16 |
17 | export default function AddJobPost() {
18 |
19 |
20 | let jobPostService = new JobPostService()
21 | const [open, setOpen] = React.useState(false)
22 |
23 | //const [company, setCompany] = useState([])
24 | const [position,setPositions] = useState([])
25 | const [cities, setCity] = useState([])
26 | const [jobTypes, setJobType] = useState([])
27 | const [jobTimes, setJobTime] = useState([])
28 |
29 | useEffect(() => {
30 | let newJobPostService = new NewPostService()
31 | //newJobPostService.getByCompanyList().then((result) => setCompany(result.data.data))
32 | newJobPostService.getPosition().then((result) => setPositions(result.data.data))
33 | newJobPostService.getCityList().then((result) => setCity(result.data.data))
34 | newJobPostService.getJobTimeList().then((result) => setJobTime(result.data.data))
35 | newJobPostService.getJobTypeList().then((result) => setJobType(result.data.data))
36 |
37 | }, [])
38 |
39 | const city = cities.map((city) => ({
40 | key: city.cityId,
41 | text: city.cityName,
42 | value: city.cityId
43 | }))
44 |
45 | const positions = position.map((positions) => ({
46 | key: positions.positionId,
47 | text: positions.positionName,
48 | value: positions.positionId
49 | }))
50 |
51 | const jobType = jobTypes.map((type) => ({
52 | key: type.jobtypeId,
53 | text: type.typeName,
54 | value: type.jobtypeId
55 | }))
56 |
57 |
58 | const jobTime = jobTimes.map((time) => ({
59 | key: time.jobtimeId,
60 | text: time.timeName,
61 | value: time.jobtimeId
62 | }))
63 |
64 |
65 | const history = useHistory()
66 |
67 |
68 | const formik = useFormik({
69 | initialValues: {
70 | cityId: "",
71 | positionId:"",
72 | positionTitle: "",
73 | positionQuota: "",
74 | createdAt: "",
75 | deadLine: "",
76 | maxSalary: "",
77 | minSalary: "",
78 | jobtypeId: "",
79 | jobtimeId: "",
80 | },
81 |
82 | })
83 |
84 | const handleChangeValue = (fieldName,value ) => {
85 | formik.setFieldValue( fieldName,value);
86 |
87 | }
88 |
89 |
90 | return (
91 |
92 | setOpen(false)}
95 | onOpen={() => setOpen(true)}
96 | open={open}
97 | size='small'
98 | trigger={İş İlanı Ver }
99 | >
100 |
101 | Bilgilerinizi Doldurunuz.
102 |
103 |
104 |
105 | {
122 | let newJobPost = {
123 | company: {id:1},
124 | city: { cityId: values.cityId },
125 | positions:{ positionId: values.positionId},
126 | positionTitle: values.positionTitle,
127 | positionQuota: values.positionQuota,
128 | createdAt: values.createdAt,
129 | deadLine: values.deadLine,
130 | maxSalary: values.maxSalary,
131 | minSalary: values.minSalary,
132 | jobType: { jobtypeId: values.jobtypeId },
133 | jobTime: { jobtimeId: values.jobtimeId },
134 | active: true,
135 | status:false,
136 |
137 | }
138 | console.log(newJobPost)
139 | jobPostService.postJobPost(newJobPost);
140 | Swal.fire(
141 | 'Tebrikler',
142 | 'Sistem onayından sonra eklenecektir.',
143 | 'success'
144 | )
145 | //history.push("/admin/enableNewJobPost")
146 |
147 | }}
148 |
149 | >
150 | {({
151 |
152 | dirty, isSubmitting, handleSubmit,
153 | }) => (
154 |
236 |
237 | )}
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
250 |
251 | )
252 | }
253 |
--------------------------------------------------------------------------------
/src/pages/CandidateFormSignUp.jsx:
--------------------------------------------------------------------------------
1 | import { Formik } from 'formik'
2 | import { Form, Button, Image } from 'semantic-ui-react'
3 | import * as Yup from 'yup';
4 | import React from 'react'
5 | import { AuthService } from '../services/authService';
6 | import UserAddTextInput from '../utilities/customFormControls/UserAddTextInput';
7 |
8 |
9 | export default function CandidateFormSignUp() {
10 |
11 |
12 | let authService = new AuthService();
13 |
14 | return (
15 |
16 |
17 |
Kayıt Formu
18 |
İş Dünyasına Bir Adım Kaldı
19 |
20 |
21 |
22 | {
57 | let newcandidate = {
58 | name: values.name,
59 | lastName: values.lastName,
60 | email: values.email,
61 | nationaltyNo: values.nationaltyNo,
62 | birthDate: values.birthDate,
63 | password: values.password,
64 | }
65 | /* await new Promise((r) => setTimeout(r, 500));
66 | alert(JSON.stringify(values, null, 2)); */
67 | console.log(newcandidate)
68 |
69 | authService.addRegisterCandidate(newcandidate);
70 |
71 |
72 | //toast.error(`{values.error}`)
73 |
74 |
75 | }}
76 |
77 |
78 |
79 | >
80 | {({
81 | dirty,
82 | isSubmitting,
83 | handleSubmit,
84 | }) => (
85 |
116 | )}
117 |
118 |
119 |
120 |
121 |
122 |
123 | )
124 | }
125 |
--------------------------------------------------------------------------------
/src/pages/CandidateList.jsx:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState } from 'react'
2 | import { Button, Card,} from 'semantic-ui-react'
3 | import { CandidateService } from '../services/candidateService'
4 | import { Link } from "react-router-dom";
5 |
6 |
7 | export default function CandidateList() {
8 | //let { candidatesId } = useParams();
9 |
10 | const [candidates, setCandidates] = useState([])
11 |
12 | useEffect(() => {
13 | let candidateService = new CandidateService()
14 | candidateService.getByCandidateList().then(result => setCandidates(result.data.data))
15 | }, [])
16 | /*
17 | useEffect(() => {
18 | let cvdetailService = new CvDetailService()
19 | cvdetailService.getDetailCandidateId(candidatesId).then(result => setCvDetails(result.data.data))
20 | }, [candidatesId])
21 | */
22 |
23 |
24 |
25 | return (
26 |
27 |
28 | {candidates.map((candidate) => (
29 |
30 |
31 | {candidate.name} {candidate.lastName}
32 | Bana buradan ulaşabilirsiniz:
33 | {candidate.email}
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 | Özgeçmişi Görüntüle
42 |
43 |
44 |
45 | Sil
46 |
47 |
48 |
49 |
50 |
51 | ))}
52 |
53 |
54 |
55 |
56 |
57 | )
58 | }
59 |
--------------------------------------------------------------------------------
/src/pages/CompanyFormSignUp.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Formik } from 'formik'
3 | import { Form, Button, Image } from 'semantic-ui-react'
4 | import * as Yup from 'yup';
5 | import { AuthService } from '../services/authService';
6 | import UserAddTextInput from '../utilities/customFormControls/UserAddTextInput';
7 |
8 |
9 | export default function CompanyFormSignUp() {
10 |
11 | let authService = new AuthService();
12 |
13 | return (
14 |
15 |
16 | {
46 | let newcompany = {
47 | companyName: values.companyName,
48 | webSite: values.webSite,
49 | email: values.email,
50 | telePhone:values.telePhone,
51 | password: values.password,
52 |
53 | }
54 | console.log(newcompany)
55 | authService.addRegisterCompany(newcompany);
56 | }}
57 |
58 | >
59 | {({
60 |
61 | dirty,
62 | isSubmitting,
63 | handleSubmit,
64 | }) => (
65 |
87 | )}
88 |
89 |
90 |
91 |
Kayıt Formu
92 |
İş Dünyasına Bir Adım Kaldı
93 |
94 |
95 |
96 | )
97 | }
98 |
--------------------------------------------------------------------------------
/src/pages/CompanyList.jsx:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState} from 'react'
2 | import { Button, Card, } from 'semantic-ui-react'
3 | import { CompanyService } from '../services/companyService'
4 | import { Link} from "react-router-dom";
5 |
6 |
7 | export default function CompanyList() {
8 | const [companys, setCompanys] = useState([])
9 |
10 | useEffect(() => {
11 | let companyService = new CompanyService()
12 | companyService.getByCompanyList().then(result => {
13 | setCompanys(result.data.data);
14 | console.log(result)
15 | })
16 | }, [])
17 |
18 | return (
19 |
20 |
21 |
22 | {companys.map((company) => (
23 |
24 |
25 | {company.companyName}
26 |
27 | Sitemiz :
28 | {company.webSite}
29 |
30 |
31 |
32 |
33 |
34 |
35 | İş İlanlarını Görüntüle
36 |
37 |
38 |
39 | Sil
40 |
41 |
42 |
43 |
44 |
45 | ))}
46 |
47 |
48 |
49 | )
50 | }
51 |
--------------------------------------------------------------------------------
/src/pages/CurriculumVitaeList.jsx:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState } from 'react'
2 | import { useParams } from 'react-router-dom'
3 | import { Card } from 'semantic-ui-react'
4 | import { CandidateService } from '../services/candidateService'
5 |
6 | export default function CurriculumVitaeList() {
7 | let { id } = useParams();
8 |
9 | const [candidates, setCandidates] = useState({})
10 | const [universities, setUniversities] = useState([])
11 | const [jobExperiences, setJobExperiences] = useState([])
12 | const [technologies, setTechnologies] = useState([])
13 | const [foreignLanguages, setLanguages] = useState([])
14 | const [cvDetails, setDetail] = useState([])
15 | const [image, setImage] = useState([])
16 |
17 | useEffect(() => {
18 | let candidateService = new CandidateService()
19 | candidateService.getCurriculumVitaeById(id).then(result => {
20 | setCandidates(result.data.data)
21 | setUniversities(result.data.data.universities)
22 | setJobExperiences(result.data.data.jobExperiences)
23 | setTechnologies(result.data.data.technologies)
24 | setLanguages(result.data.data.foreignLanguages)
25 | setDetail(result.data.data.cvDetails)
26 | setImage(result.data.data.image)
27 | ; console.log(result)
28 | })
29 | }, [id])
30 |
31 | return (
32 |
33 | {
34 | console.log(candidates)
35 | }
36 |
37 |
38 | {
39 | image.map((image) => (
40 |
41 | ))
42 | }
43 |
44 |
45 |
46 | {candidates.candidates?.name} {candidates.candidates?.lastName}
47 |
48 |
49 |
50 |
51 | Eğitim {
52 | universities.map((universities) => (
53 |
54 | {universities?.university_name} ({universities?.education}) / {universities?.division_name}
55 | ( {universities?.startAt}/{universities?.finishAt})
56 |
57 | ))
58 | }
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 | Tecrübeler
67 | {jobExperiences.map((jobExperiences) => (
68 |
69 | {jobExperiences?.companyName} / {jobExperiences?.positionName}
70 | ( {jobExperiences?.startAt}/{jobExperiences?.finishAt})
71 |
72 |
73 | ))
74 | }
75 |
76 |
77 |
78 |
79 | Beceriler
80 | {technologies.map((technologies) => (
81 | - {technologies?.technologyName} ({technologies?.level})
82 |
83 | ))
84 | }
85 |
86 |
87 |
88 |
89 | Yabancı Dil
90 | {
91 | foreignLanguages.map((foreignLanguages) => (
92 | - {foreignLanguages?.language} ({foreignLanguages?.level})
93 |
94 | ))
95 | }
96 |
97 |
98 |
99 |
100 | Ek Bilgiler
101 | {cvDetails.map((cvDetails) => (
102 |
103 | Github: {cvDetails?.gitHub} LinkedIn: {cvDetails?.linkedIn} [{cvDetails?.frontNote}]
104 |
105 | ))
106 | }
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 | )
115 | }
116 |
--------------------------------------------------------------------------------
/src/pages/FirstPage.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Button, Header,Image,Message , Form, Grid, Segment, Container } from 'semantic-ui-react'
3 | import { Link } from "react-router-dom";
4 |
5 |
6 | export default function FirstPage({ signIn }) {
7 | return (
8 |
9 |
10 |
11 |
12 |
13 | Hesabınıza Giriş Yapın
14 |
15 |
35 |
36 | Bireysel Kayıt Ol /
37 | Şirket İçin Kayıt Ol
38 |
39 |
40 |
41 |
42 |
43 | )
44 | }
45 |
--------------------------------------------------------------------------------
/src/pages/JobPostCompanyList.jsx:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState } from 'react'
2 | import {JobPostService} from '../services/jobPostService'
3 | import { useParams } from 'react-router-dom'
4 | import { Card, Divider,Grid ,Button,Icon} from 'semantic-ui-react'
5 |
6 |
7 | export default function JobPostCompanyList() {
8 | let { companyName } = useParams()
9 |
10 | const [jobPost, setJobPost] = useState([])
11 |
12 | useEffect(() => {
13 | let jobPostService = new JobPostService()
14 | jobPostService.getJobPostCompanyName(companyName).then(result => {
15 | setJobPost(result.data.data);
16 | console.log(result)
17 | })
18 | }, [companyName])
19 |
20 | return (
21 |
22 |
23 |
24 | {
25 | jobPost.map((jobPost) => (
26 |
27 | {/*
28 | {jobPost.company?.companyName}
29 | */}
30 |
31 |
32 |
33 |
34 | Pozisyon
35 | {jobPost.positions?.positionName}
36 | Şehir
37 | {jobPost.city?.cityName}
38 | Email
39 | {jobPost.company?.email}
40 | Yayınlanma Tarihi
41 | {jobPost.createdAt}
42 | Son Başvuru Günü
43 | {jobPost.deadLine}
44 |
45 |
46 |
47 |
48 | Çalışma Şekli
49 | {jobPost.jobType?.typeName}
50 | Çalışma Zamanı
51 | {jobPost.jobTime?.timeName}
52 | Maaş Bilgisi
53 | {jobPost.maxSalary} / {jobPost.minSalary}
54 | Pozisyon Kotası
55 | {jobPost.positionQuota}
56 | Ek Bilgi
57 | {jobPost.positionTitle}
58 |
59 | Başvur
60 |
61 |
62 | Favorilere Ekle
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 | ))
75 | }
76 |
77 |
78 |
79 |
80 | )
81 | }
82 |
--------------------------------------------------------------------------------
/src/pages/JobPostList.jsx:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState } from 'react'
2 | import { JobPostService } from '../services/jobPostService';
3 | import { Card, Divider, Grid, Button,Icon } from 'semantic-ui-react'
4 | import { addToFavorite } from '../store/actions/favoriteActions';
5 | import { useDispatch } from "react-redux";
6 |
7 | import { FavoriteService } from '../services/favoriteService';
8 |
9 | export default function JobPostList() {
10 | const [jobPosts, setjobPosts] = useState([])
11 |
12 | useEffect(() => {
13 | let jobPostService = new JobPostService()
14 | jobPostService.getJobPostStatusTrue().then(result => {
15 | setjobPosts(result.data.data);
16 | console.log(result)
17 | })
18 | }, [])
19 |
20 | const dispatch = useDispatch();
21 |
22 | const handleAddToFavorite= (jobPosts) =>{
23 | dispatch(addToFavorite(jobPosts));
24 | let favoriteService = new FavoriteService();
25 | let favorite = {job: {id: jobPosts.jobPostId},candidates: {id:1}}
26 | favoriteService.addFavorite(favorite);
27 | }
28 |
29 |
30 |
31 | return (
32 |
33 |
34 |
35 | {
36 | jobPosts.map((jobPost) => (
37 |
38 |
39 | {jobPost.company?.companyName}
40 |
41 |
42 |
43 |
44 |
45 | Pozisyon
46 | {jobPost.positions?.positionName}
47 | Şehir
48 | {jobPost.city?.cityName}
49 | Email
50 | {jobPost.company?.email}
51 | Yayınlanma Tarihi
52 | {jobPost.createdAt}
53 | Son Başvuru Günü
54 | {jobPost.deadLine}
55 |
56 |
57 |
58 |
59 | Çalışma Şekli
60 | {jobPost.jobType?.typeName}
61 | Çalışma Zamanı
62 | {jobPost.jobTime?.timeName}
63 | Maaş Bilgisi
64 | {jobPost.maxSalary} / {jobPost.minSalary}
65 | Pozisyon Kotası
66 | {jobPost.positionQuota}
67 | Ek Bilgi
68 | {jobPost.positionTitle}
69 |
70 | Başvur
71 |
72 |
73 | handleAddToFavorite(jobPosts)}
75 |
76 | >
77 |
78 | Favorilere Ekle
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 | ))
89 | }
90 |
91 |
92 |
93 | )
94 | }
95 |
--------------------------------------------------------------------------------
/src/pages/JobPostSortList.jsx:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState } from 'react'
2 | import { Checkbox, Table } from 'semantic-ui-react'
3 | import {JobPostService} from '../services/jobPostService';
4 |
5 |
6 | export default function JobPostSortList() {
7 | const [jobPostSort, setjobPostSort] = useState([])
8 |
9 | useEffect(() => {
10 | let jobPostService = new JobPostService()
11 | jobPostService.getJobPostSort().then(result => {
12 | setjobPostSort(result.data.data);
13 | console.log(result)
14 | })
15 | })
16 |
17 | return (
18 |
19 |
20 |
21 |
22 |
23 | Company
24 | Position Name
25 | City
26 | E-mail Address
27 | Created Date
28 | Dead Line
29 | Maximum Salary
30 | Minimum Salary
31 | Position Quota
32 | Position Title
33 |
34 |
35 |
36 |
37 | {jobPostSort.map((jobPostSort) => (
38 |
39 |
40 |
41 |
42 | {jobPostSort.company?.companyName}
43 | {jobPostSort.positions.positionName}
44 | {jobPostSort.city.cityName}
45 | {jobPostSort.company?.email}
46 | {jobPostSort.createdAt}
47 | {jobPostSort.deadLine}
48 | {jobPostSort.maxSalary}
49 | {jobPostSort.minSalary}
50 | {jobPostSort.positionQuota}
51 | {jobPostSort.positionTitle}
52 |
53 |
54 |
55 | ))}
56 |
57 |
58 |
59 |
60 |
61 | )
62 | }
63 |
--------------------------------------------------------------------------------
/src/pages/PositionList.jsx:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState } from 'react'
2 | import { Table } from 'semantic-ui-react'
3 | import { PositionService } from '../services/positionService'
4 |
5 |
6 | export default function PositionList() {
7 |
8 | const [positions, setPositions] = useState([])
9 |
10 | useEffect(() => {
11 | let positionService = new PositionService()
12 | positionService.getPosition().then(result => {
13 | setPositions(result.data.data);
14 | console.log(result)
15 | })
16 | })
17 |
18 | return (
19 |
20 |
21 |
22 |
23 | Positions
24 |
25 |
26 |
27 | {
28 | positions.map(position => (
29 |
30 | {position.positionName}
31 |
32 |
33 | ))
34 | }
35 |
36 |
37 |
38 | )
39 | }
40 |
--------------------------------------------------------------------------------
/src/reportWebVitals.js:
--------------------------------------------------------------------------------
1 | const reportWebVitals = onPerfEntry => {
2 | if (onPerfEntry && onPerfEntry instanceof Function) {
3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
4 | getCLS(onPerfEntry);
5 | getFID(onPerfEntry);
6 | getFCP(onPerfEntry);
7 | getLCP(onPerfEntry);
8 | getTTFB(onPerfEntry);
9 | });
10 | }
11 | };
12 |
13 | export default reportWebVitals;
14 |
--------------------------------------------------------------------------------
/src/routes.js:
--------------------------------------------------------------------------------
1 | export const routes ={
2 | Login:{
3 | path:"/login",
4 | title:"Login"
5 | },
6 | Admin:{
7 | path:"/admin",
8 | title:"Admin"
9 | }
10 | }
--------------------------------------------------------------------------------
/src/services/authService.js:
--------------------------------------------------------------------------------
1 | import axios from "axios";
2 |
3 |
4 | export class AuthService{
5 | addRegisterCandidate(newcandidate){
6 | return axios.post("http://localhost:8080/AuthController/candidateForRegisterDto",newcandidate)
7 | }
8 | addRegisterCompany(newcompany){
9 | return axios.post("http://localhost:8080/AuthController/companyForRegisterDto",newcompany)
10 | }
11 |
12 |
13 |
14 | }
--------------------------------------------------------------------------------
/src/services/candidateService.js:
--------------------------------------------------------------------------------
1 | import axios from "axios";
2 |
3 |
4 | export class CandidateService{
5 | getByCandidateList(){
6 | return axios.get("http://localhost:8080/candidates/getByCandidateList")
7 | }
8 | postCandidates(){
9 | return axios.post("http://localhost:8080/candidates/addCandidate")
10 | }
11 | deleteCandidates(nationaltyNo){
12 | return axios.delete("http://localhost:8080/candidates/delete?nationaltyNo="+nationaltyNo)
13 | }
14 | getCurriculumVitaeById(id){
15 | return axios.get("http://localhost:8080/candidates/cvList?id="+id)
16 | }
17 | }
--------------------------------------------------------------------------------
/src/services/cityService.js:
--------------------------------------------------------------------------------
1 | import axios from "axios";
2 |
3 | export class CityService{
4 | getCityList(){
5 | return axios.get("http://localhost:8080/city/cityList")
6 | }
7 |
8 | postCityList(){
9 | return axios.post("http://localhost:8080/city/cityPost")
10 | }
11 |
12 | }
--------------------------------------------------------------------------------
/src/services/cloudinaryService.js:
--------------------------------------------------------------------------------
1 | import axios from "axios";
2 |
3 |
4 | export class CloudinaryService{
5 | getlist(){
6 | return axios.get("http://localhost:8080/cloudinary/list")
7 | }
8 | postupload(){
9 | return axios.post("http://localhost:8080/cloudinary/upload")
10 | }
11 | deleteImage(imageId){
12 | return axios.delete("http://localhost:8080/cloudinary/delete?imageId="+imageId)
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/services/companyService.js:
--------------------------------------------------------------------------------
1 | import axios from "axios";
2 |
3 |
4 | export class CompanyService{
5 | getByCompanyList(){
6 | return axios.get("http://localhost:8080/employers/getByCompanyList")
7 | }
8 | postCompany(){
9 | return axios.post("http://localhost:8080/employers/addCompany")
10 | }
11 | deleteCompany(companyName){
12 | return axios.delete("http://localhost:8080/employers/delete?companyName="+companyName)
13 | }
14 |
15 | }
--------------------------------------------------------------------------------
/src/services/cvdetailService.js:
--------------------------------------------------------------------------------
1 | import axios from "axios";
2 |
3 |
4 | export class CvDetailService{
5 | getDetail(){
6 | return axios.get("http://localhost:8080/cv/list")
7 | }
8 | postDetail(){
9 | return axios.post("http://localhost:8080/cv/add")
10 | }
11 |
12 | getDetailCandidateId(candidatesId){
13 | return axios.get("http://localhost:8080/cv/candidatesIdList?candidatesId="+ candidatesId)
14 | }
15 | }
--------------------------------------------------------------------------------
/src/services/favoriteService.js:
--------------------------------------------------------------------------------
1 | import axios from "axios";
2 |
3 |
4 | export class FavoriteService{
5 | addFavorite(){
6 | return axios.post("http://localhost:8080/favorite/addFavorite")
7 | }
8 | deleteFavorite(favoriteId){
9 | return axios.delete("http://localhost:8080/favorite/deleteFavorite{favoriteId}?favoriteId="+favoriteId)
10 | }
11 |
12 | getFavorite(id){
13 | return axios.get("http://localhost:8080/favorite/getByCandidateIdFavList?id="+id)
14 | }
15 | }
--------------------------------------------------------------------------------
/src/services/jobExperienceService.js:
--------------------------------------------------------------------------------
1 | import axios from "axios";
2 |
3 |
4 | export class JobExperienceService{
5 | getByExperiencesList(){
6 | return axios.get("http://localhost:8080/jobexperience/List")
7 | }
8 | getAllsortedList(){
9 | return axios.get("http://localhost:8080/jobexperience/getAllsortedList")
10 | }
11 | postJobExperience(){
12 | return axios.post("http://localhost:8080/jobexperience/save")
13 | }
14 | deleteJobExperience(experiencesId){
15 | return axios.delete("http://localhost:8080/jobexperience/delete?experiencesId="+experiencesId)
16 | }
17 |
18 | }
--------------------------------------------------------------------------------
/src/services/jobPostService.js:
--------------------------------------------------------------------------------
1 | import axios from "axios";
2 |
3 |
4 | export class JobPostService{
5 | getJobPostAll(){
6 | return axios.get("http://localhost:8080/jobpost/getall")
7 | }
8 | getJobPostStatusTrue(){
9 | return axios.get("http://localhost:8080/jobpost/getByStatusTrue")
10 | }
11 | getJobPostStatusFalse(){
12 | return axios.get("http://localhost:8080/jobpost/getByStatusFalse")
13 | }
14 | updateStatusJobPost(id){
15 | return axios.get("http://localhost:8080/jobpost/updateStatusJobPost?id="+id)
16 | }
17 |
18 | deleteJobPost(jobPostId){
19 | return axios.delete("http://localhost:8080/jobpost/jobPostDelete"+jobPostId)
20 | }
21 |
22 | getJobPostActive(){
23 | return axios.get("http://localhost:8080/jobpost/getByJobPostList")
24 | }
25 | postJobPost(newJobPost){
26 | return axios.post("http://localhost:8080/jobpost/getByJobPostSave",newJobPost)
27 | }
28 | getJobPostCompanyName(companyName){
29 | return axios.get("http://localhost:8080/jobpost/getByCompanyNameList?companyName="+ companyName)
30 | }
31 | getJobPostSort(){
32 | return axios.get("http://localhost:8080/jobpost/getByJobPostSort")
33 | }
34 | getJobPostUpdateStatus(){
35 | return axios.get("http://localhost:8080/jobpost/updateStatusJobPost")
36 | }
37 |
38 |
39 | }
--------------------------------------------------------------------------------
/src/services/jobTimeService.js:
--------------------------------------------------------------------------------
1 | import axios from "axios";
2 |
3 | export class JobTimeService{
4 | getJobTimeList(){
5 | return axios.get("http://localhost:8080/jobtime/timeList")
6 | }
7 | }
--------------------------------------------------------------------------------
/src/services/jobTypeService.js:
--------------------------------------------------------------------------------
1 | import axios from "axios";
2 |
3 | export class JobTypeService{
4 | getJobTypeList(){
5 | return axios.get("http://localhost:8080/jobtype/typeList")
6 | }
7 | }
--------------------------------------------------------------------------------
/src/services/languageService.js:
--------------------------------------------------------------------------------
1 | import axios from "axios";
2 |
3 |
4 | export class LanguageService{
5 | getLanguage(){
6 | return axios.get("http://localhost:8080/language/getByForeignLanguageList")
7 | }
8 | postLanguage(){
9 | return axios.post("http://localhost:8080/language/getByForeignLanguageSave")
10 | }
11 | deleteLanguage(){
12 | return axios.delete("http://localhost:8080/language/getByForeignLanguageDelete")
13 | }
14 |
15 | }
--------------------------------------------------------------------------------
/src/services/newPostService.js:
--------------------------------------------------------------------------------
1 | import axios from "axios"
2 |
3 |
4 |
5 | export class NewPostService{
6 |
7 |
8 | getByCompanyList(){
9 | return axios.get("http://localhost:8080/employers/getByCompanyList")
10 | }
11 |
12 | getPosition(){
13 | return axios.get("http://localhost:8080/positions/getAll")
14 | }
15 |
16 | getCityList(){
17 | return axios.get("http://localhost:8080/city/cityList")
18 | }
19 |
20 | getJobTypeList(){
21 | return axios.get("http://localhost:8080/jobtype/typeList")
22 | }
23 |
24 | getJobTimeList(){
25 | return axios.get("http://localhost:8080/jobtime/timeList")
26 | }
27 |
28 |
29 |
30 |
31 |
32 |
33 | }
--------------------------------------------------------------------------------
/src/services/positionService.js:
--------------------------------------------------------------------------------
1 | import axios from "axios";
2 |
3 |
4 | export class PositionService{
5 | getPosition(){
6 | return axios.get("http://localhost:8080/positions/getAll")
7 | }
8 | postPosition(){
9 | return axios.post("http://localhost:8080/positions/add")
10 | }
11 | deletePosition(){
12 | return axios.delete("http://localhost:8080/positions/delete")
13 | }
14 | }
--------------------------------------------------------------------------------
/src/services/technologyService.js:
--------------------------------------------------------------------------------
1 | import axios from "axios";
2 |
3 |
4 | export class TechnologyService{
5 | getTechnology(){
6 | return axios.get("http://localhost:8080/technology/getByTechnologyList")
7 | }
8 | postTechnology(){
9 | return axios.post("http://localhost:8080/technology/getByTechnologySave")
10 | }
11 | deleteTechnology(){
12 | return axios.delete("http://localhost:8080/technology/getByTechnologyDelete")
13 | }
14 |
15 | }
--------------------------------------------------------------------------------
/src/services/universityService.js:
--------------------------------------------------------------------------------
1 | import axios from "axios";
2 |
3 |
4 | export class UniversityService{
5 | getUniversity(){
6 | return axios.get("http://localhost:8080/university/getByUniversityList")
7 | }
8 | getSortedUniversity(){
9 | return axios.get("http://localhost:8080/university/getAllsortedList")
10 | }
11 | postUniversity(){
12 | return axios.post("http://localhost:8080/university/save")
13 | }
14 | deleteUniversity(){
15 | return axios.delete("http://localhost:8080/university/delete")
16 | }
17 | }
--------------------------------------------------------------------------------
/src/setupTests.js:
--------------------------------------------------------------------------------
1 | // jest-dom adds custom jest matchers for asserting on DOM nodes.
2 | // allows you to do things like:
3 | // expect(element).toHaveTextContent(/react/i)
4 | // learn more: https://github.com/testing-library/jest-dom
5 | import '@testing-library/jest-dom';
6 |
--------------------------------------------------------------------------------
/src/store/actions/favoriteActions.js:
--------------------------------------------------------------------------------
1 |
2 | export const ADD_TO_FAVORITE = "ADD_TO_FAVORİTE"
3 | export const REMOVE_FROM_FAVORITE = "REMOVE_FROM_FAVORİTE"
4 |
5 | export function addToFavorite(jobPost){
6 | return{
7 | type: ADD_TO_FAVORITE,
8 |
9 | payload: jobPost
10 | }
11 | }
12 |
13 | export function removeFromFavorite(jobPost){
14 | return{
15 | type: REMOVE_FROM_FAVORITE,
16 | payload: jobPost
17 | }
18 | }
--------------------------------------------------------------------------------
/src/store/configureStore.js:
--------------------------------------------------------------------------------
1 | import { createStore } from "redux";
2 | import { devToolsEnhancer } from "redux-devtools-extension";
3 | import rootReducer from "./rootReducer"
4 |
5 | export function configureStore() {
6 | return createStore(rootReducer, devToolsEnhancer())
7 | }
--------------------------------------------------------------------------------
/src/store/initialValues/favoriteItems.js:
--------------------------------------------------------------------------------
1 | export const favoriteItems=[]
--------------------------------------------------------------------------------
/src/store/reducers/favoriteReducer.js:
--------------------------------------------------------------------------------
1 |
2 | import { ADD_TO_FAVORITE, REMOVE_FROM_FAVORITE } from '../actions/favoriteActions'
3 | import { favoriteItems } from '../initialValues/favoriteItems'
4 |
5 | const initialState = { favoriteItems: favoriteItems };
6 |
7 | export default function favoriteReducer(state = initialState, { type, payload }) {
8 | switch (type) {
9 | case ADD_TO_FAVORITE:
10 | let jobPost = state.favoriteItems.find(c => c.jobPost.jobPostId === payload.jobPostId)
11 | if(jobPost) {
12 | return {
13 | ...state,
14 | favoriteItems: state.favoriteItems.filter(c => c.jobPost.jobPostId !== payload.jobPostId)
15 | }
16 | }else {
17 | return {
18 | ...state,
19 | favoriteItems: [...state.favoriteItems, {jobPost: payload}]
20 | }
21 | }
22 | case REMOVE_FROM_FAVORITE:
23 | return {
24 | ...state,
25 | favoriteItems: state.favoriteItems.filter(c => c.jobPost.jobPostId !== payload.jobPostId)
26 | }
27 | default:
28 | return state;
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/src/store/rootReducer.js:
--------------------------------------------------------------------------------
1 | import favoriteReducer from "./reducers/favoriteReducer";
2 | import { combineReducers } from "redux";
3 |
4 | const rootReducer = combineReducers({
5 | favorite : favoriteReducer,
6 | })
7 |
8 | export default rootReducer;
--------------------------------------------------------------------------------
/src/utilities/customFormControls/JobPostTextInput.jsx:
--------------------------------------------------------------------------------
1 | import { useField } from 'formik'
2 | import React from 'react'
3 | import { FormField } from 'semantic-ui-react'
4 |
5 |
6 | export default function JobPostTextInput({...props}) {
7 |
8 | const[field,meta] = useField(props)
9 |
10 |
11 | return (
12 |
13 |
14 | {meta.touched && !!meta.error ? (
15 | {meta.error}
16 | ):null}
17 |
18 | )
19 | }
20 |
--------------------------------------------------------------------------------
/src/utilities/customFormControls/UserAddTextInput.jsx:
--------------------------------------------------------------------------------
1 | import { useField } from 'formik'
2 | import React from 'react'
3 | import { FormField } from 'semantic-ui-react'
4 |
5 |
6 | export default function UserAddTextInput({...props}) {
7 |
8 | const[field,meta] = useField(props);
9 |
10 |
11 | return (
12 |
13 |
14 | {meta.touched && !!meta.error ? (
15 | {meta.error}
16 | ):null}
17 |
18 | )
19 | }
20 |
--------------------------------------------------------------------------------
/umlDiagram.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iremcibal/Hrms-ReactProject/cc83462e00c28474ce301e50560f27b7e18bacf3/umlDiagram.png
--------------------------------------------------------------------------------