├── .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 | ![UML Diagram](https://github.com/iremcibal/Hrms-ReactProject/blob/main/umlDiagram.png) 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 | 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 |
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 |
12 |

ADMİN GİRİŞİ


13 | 14 | 19 | 20 | 25 | 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 | 62 | 63 | 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 | 60 | 61 | 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 | 67 | 68 | ))} 69 | 70 | 71 | {/* 72 | 73 | 74 | 75 | 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 | 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 | 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={} 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 |
155 | 156 | 157 | 158 | { 165 | handleChangeValue("cityId", data.value) 166 | }} 167 | 168 | /> 169 | 170 | 171 | { 178 | handleChangeValue("positionId", data.value) 179 | }} 180 | 181 | /> 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | { 207 | handleChangeValue(event.jobtypeId,data.value) 208 | }} 209 | 210 | /> 211 | 212 | { 219 | handleChangeValue("jobtimeId", data.value) 220 | }} 221 | 222 | /> 223 | 226 | 227 | 234 | 235 | 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 |
86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 114 | 115 | 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 | 43 | 44 | 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 |
66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 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 | 37 | 38 | 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 |
16 | 17 | 18 | 25 | 26 | 27 | 32 | 33 | 34 |
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 | 60 | 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 | 71 | 72 | 73 | 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 --------------------------------------------------------------------------------