├── .gitignore ├── README.md ├── files ├── MeetingER.png ├── db_meeting.sql ├── meeting.mwb ├── scr_1.JPG └── scr_2.JPG ├── meeting-client ├── README.md ├── index.html ├── package.json └── src │ ├── index.js │ ├── pages │ ├── Departments │ │ ├── AddDepartment.js │ │ ├── Departments.js │ │ ├── UpdateDepartment.js │ │ └── package.json │ ├── Employees │ │ ├── AddEmployee.js │ │ ├── Employees.js │ │ ├── UpdateEmployee.js │ │ └── package.json │ ├── Header │ │ ├── Header.js │ │ └── package.json │ ├── MainTemplate │ │ ├── MainTemplate.js │ │ └── package.json │ └── Meetings │ │ ├── AddMeeting.js │ │ ├── Meetings.js │ │ ├── UpdateMeeting.js │ │ └── package.json │ └── styles │ ├── bootstrap-3.3.6 │ └── dist │ │ ├── css │ │ ├── bootstrap-theme.css │ │ ├── bootstrap-theme.css.map │ │ ├── bootstrap-theme.min.css │ │ ├── bootstrap-theme.min.css.map │ │ ├── bootstrap.css │ │ ├── bootstrap.css.map │ │ ├── bootstrap.min.css │ │ └── bootstrap.min.css.map │ │ └── fonts │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ ├── glyphicons-halflings-regular.woff │ │ └── glyphicons-halflings-regular.woff2 │ ├── index.css │ ├── react-bootstrap-table │ └── dist │ │ ├── react-bootstrap-table-all.min.css │ │ └── react-bootstrap-table.min.css │ └── react-select │ └── dist │ ├── react-select.css │ ├── react-select.js │ ├── react-select.min.css │ └── react-select.min.js └── meeting-server ├── README.md ├── pom.xml └── src ├── main ├── java │ └── tr │ │ └── com │ │ └── example │ │ └── meeting │ │ ├── Application.java │ │ ├── configuration │ │ ├── HibernateConfiguration.java │ │ └── WebConfiguration.java │ │ ├── controller │ │ ├── DepartmentController.java │ │ ├── EmployeeController.java │ │ └── MeetingController.java │ │ ├── dao │ │ ├── AbstractDao.java │ │ ├── DepartmentDAO.java │ │ ├── EmployeeDAO.java │ │ └── MeetingDAO.java │ │ ├── domain │ │ ├── Department.java │ │ ├── Employee.java │ │ └── Meeting.java │ │ └── service │ │ ├── DepartmentService.java │ │ ├── EmployeeService.java │ │ └── MeetingService.java └── resources │ └── application.properties └── test └── java └── tr └── com └── example └── meeting └── controller ├── DepartmentControllerTest.java ├── EmployeeControllerTest.java └── MeetingControllerTest.java /.gitignore: -------------------------------------------------------------------------------- 1 | #=====CLIENT APP IGNORES===== 2 | 3 | # See http://help.github.com/ignore-files/ for more about ignoring files. 4 | 5 | # dependencies 6 | meeting-client/node_modules 7 | 8 | # testing 9 | meeting-client/coverage 10 | 11 | # production 12 | meeting-client/build 13 | 14 | # misc 15 | meeting-client/.DS_Store 16 | meeting-client/npm-debug.log 17 | 18 | 19 | #=====SERVER APP IGNORES===== 20 | 21 | # Eclipse 22 | meeting-server/.classpath 23 | meeting-server/.project 24 | meeting-server/.settings/ 25 | 26 | # Intellij 27 | meeting-server/.idea/ 28 | meeting-server/*.iml 29 | meeting-server/*.iws 30 | 31 | # Mac 32 | meeting-server/.DS_Store 33 | 34 | # Maven 35 | meeting-server/log/ 36 | meeting-server/target/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Spring Boot & React - Example RESTful Application 2 | --- 3 | 4 | **Application Name:** Meeting 5 | 6 | Meeting is an example RESTful application that uses React for client and Spring Boot as backend service. 7 | Demonstrates CRUD operations for Employee, Department and Meeting entities. Client and server applications are formed as separate projects. 8 | 9 | **Client Application:** [meeting-client](meeting-client) 10 | 11 | **Server Application:** [meeting-server](meeting-server) 12 | 13 | **MySQL create script with initial data:** [db_meeting.sql](files/db_meeting.sql) 14 | 15 | **MySQL Workbench project file:** [meeting.mwb](files/meeting.mwb) 16 | 17 | **Meeting ER Diagram:** 18 | 19 | ![Meeting ER](/files/MeetingER.png?raw=true "Meeting ER") 20 | 21 | **TODO:** 22 | * Add Pagination(Lazy loading) 23 | * Add Authentication & Authorization 24 | * Add client side input validation, toast notification and loader effect 25 | * Add RESTful fail checks both for client and server side 26 | * May add service interfaces 27 | * Add client tests -------------------------------------------------------------------------------- /files/MeetingER.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aecavac/spring-react-restful-example/62dd6a28a200464c5528359977a9942854f03ed8/files/MeetingER.png -------------------------------------------------------------------------------- /files/db_meeting.sql: -------------------------------------------------------------------------------- 1 | -- phpMyAdmin SQL Dump 2 | -- version 4.1.14 3 | -- http://www.phpmyadmin.net 4 | -- 5 | -- Host: 127.0.0.1 6 | -- Generation Time: Sep 18, 2016 at 02:04 PM 7 | -- Server version: 5.6.17 8 | -- PHP Version: 5.5.12 9 | 10 | SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; 11 | SET time_zone = "+00:00"; 12 | 13 | 14 | /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; 15 | /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; 16 | /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; 17 | /*!40101 SET NAMES utf8 */; 18 | 19 | -- 20 | -- DATABASE: `DB_MEETING` 21 | -- 22 | 23 | -- -------------------------------------------------------- 24 | 25 | -- 26 | -- TABLE STRUCTURE FOR TABLE `DEPARTMENT` 27 | -- 28 | 29 | CREATE TABLE IF NOT EXISTS `DEPARTMENT` ( 30 | `DEPARTMENT_ID` INT(11) NOT NULL AUTO_INCREMENT, 31 | `NAME` VARCHAR(45) NOT NULL, 32 | `DESCRIPTION` VARCHAR(45) DEFAULT NULL, 33 | PRIMARY KEY (`DEPARTMENT_ID`) 34 | ) ENGINE=INNODB DEFAULT CHARSET=UTF8 AUTO_INCREMENT=6 ; 35 | 36 | -- 37 | -- DUMPING DATA FOR TABLE `DEPARTMENT` 38 | -- 39 | 40 | INSERT INTO `DEPARTMENT` (`DEPARTMENT_ID`, `NAME`, `DESCRIPTION`) VALUES 41 | (2, 'DESIGN', 'DESIGN DEPARTMENT'), 42 | (4, 'ENGINEERING', 'ENGINEERING DEPARTMENT'); 43 | 44 | -- -------------------------------------------------------- 45 | 46 | -- 47 | -- TABLE STRUCTURE FOR TABLE `DEPARTMENT_MEETING` 48 | -- 49 | 50 | CREATE TABLE IF NOT EXISTS `DEPARTMENT_MEETING` ( 51 | `MEETING_ID` INT(11) NOT NULL AUTO_INCREMENT, 52 | `DEPARTMENT_ID` INT(11) NOT NULL, 53 | KEY `FK_MEETING_DEPARTMENT_IDX` (`DEPARTMENT_ID`), 54 | KEY `FK_DEPARTMENTMEETING_MEETING_IDX` (`MEETING_ID`) 55 | ) ENGINE=INNODB DEFAULT CHARSET=UTF8 AUTO_INCREMENT=7 ; 56 | 57 | -- 58 | -- DUMPING DATA FOR TABLE `DEPARTMENT_MEETING` 59 | -- 60 | 61 | INSERT INTO `DEPARTMENT_MEETING` (`MEETING_ID`, `DEPARTMENT_ID`) VALUES 62 | (5, 2), 63 | (5, 4); 64 | 65 | -- -------------------------------------------------------- 66 | 67 | -- 68 | -- TABLE STRUCTURE FOR TABLE `EMPLOYEE` 69 | -- 70 | 71 | CREATE TABLE IF NOT EXISTS `EMPLOYEE` ( 72 | `EMPLOYEE_ID` INT(11) NOT NULL AUTO_INCREMENT, 73 | `NAME` VARCHAR(45) NOT NULL, 74 | `SURNAME` VARCHAR(45) NOT NULL, 75 | `SALARY` INT(11) NOT NULL, 76 | `DEPARTMENT_ID` INT(11) DEFAULT NULL, 77 | PRIMARY KEY (`EMPLOYEE_ID`), 78 | KEY `FK_EMPLOYEE_DEPARTMENT_IDX` (`DEPARTMENT_ID`) 79 | ) ENGINE=INNODB DEFAULT CHARSET=UTF8 AUTO_INCREMENT=28 ; 80 | 81 | -- 82 | -- DUMPING DATA FOR TABLE `EMPLOYEE` 83 | -- 84 | 85 | INSERT INTO `EMPLOYEE` (`EMPLOYEE_ID`, `NAME`, `SURNAME`, `SALARY`, `DEPARTMENT_ID`) VALUES 86 | (25, 'ALI EMRE', 'CAVAÇ', 12000, 4), 87 | (26, 'BEYZA NUR', 'CAVAÇ', 10000, 2); 88 | 89 | -- -------------------------------------------------------- 90 | 91 | -- 92 | -- TABLE STRUCTURE FOR TABLE `MEETING` 93 | -- 94 | 95 | CREATE TABLE IF NOT EXISTS `MEETING` ( 96 | `MEETING_ID` INT(11) NOT NULL AUTO_INCREMENT, 97 | `NAME` VARCHAR(45) NOT NULL, 98 | `DESCRIPTION` VARCHAR(45) DEFAULT NULL, 99 | PRIMARY KEY (`MEETING_ID`) 100 | ) ENGINE=INNODB DEFAULT CHARSET=UTF8 AUTO_INCREMENT=7 ; 101 | 102 | -- 103 | -- DUMPING DATA FOR TABLE `MEETING` 104 | -- 105 | 106 | INSERT INTO `MEETING` (`MEETING_ID`, `NAME`, `DESCRIPTION`) VALUES 107 | (5, 'REVISION', 'WEEKLY REVISION'); 108 | 109 | -- 110 | -- CONSTRAINTS FOR DUMPED TABLES 111 | -- 112 | 113 | -- 114 | -- CONSTRAINTS FOR TABLE `DEPARTMENT_MEETING` 115 | -- 116 | ALTER TABLE `DEPARTMENT_MEETING` 117 | ADD CONSTRAINT `FK_DEPARTMENTMEETING_DEPARTMENT` FOREIGN KEY (`DEPARTMENT_ID`) REFERENCES `DEPARTMENT` (`DEPARTMENT_ID`) ON DELETE NO ACTION ON UPDATE NO ACTION, 118 | ADD CONSTRAINT `FK_DEPARTMENTMEETING_MEETING` FOREIGN KEY (`MEETING_ID`) REFERENCES `MEETING` (`MEETING_ID`) ON DELETE NO ACTION ON UPDATE NO ACTION; 119 | 120 | -- 121 | -- CONSTRAINTS FOR TABLE `EMPLOYEE` 122 | -- 123 | ALTER TABLE `EMPLOYEE` 124 | ADD CONSTRAINT `FK_EMPLOYEE_DEPARTMENT` FOREIGN KEY (`DEPARTMENT_ID`) REFERENCES `DEPARTMENT` (`DEPARTMENT_ID`) ON DELETE NO ACTION ON UPDATE NO ACTION; 125 | 126 | /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; 127 | /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; 128 | /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; 129 | -------------------------------------------------------------------------------- /files/meeting.mwb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aecavac/spring-react-restful-example/62dd6a28a200464c5528359977a9942854f03ed8/files/meeting.mwb -------------------------------------------------------------------------------- /files/scr_1.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aecavac/spring-react-restful-example/62dd6a28a200464c5528359977a9942854f03ed8/files/scr_1.JPG -------------------------------------------------------------------------------- /files/scr_2.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aecavac/spring-react-restful-example/62dd6a28a200464c5528359977a9942854f03ed8/files/scr_2.JPG -------------------------------------------------------------------------------- /meeting-client/README.md: -------------------------------------------------------------------------------- 1 | ## Client Application 2 | 3 | This project template was built with [Create React App](https://github.com/facebookincubator/create-react-app). (**requires Node**) 4 | 5 | **Techs:** React, react-bootstrap, axios for http requests, and several react components. 6 | 7 | **Installing dependencies** 8 | 9 | run `npm install` in the client application root directory. 10 | 11 | **Scripts** 12 | 13 | `npm start` : Runs the app in development mode. 14 | 15 | `npm run build` : Builds the app for production to the build folder. 16 | 17 | **App URL:** http://localhost:3000 18 | 19 | **App Screenshots** 20 | 21 | ![Employees](../files/scr_1.JPG?raw=true) 22 | 23 | ![Update Meeting](../files/scr_2.JPG?raw=true) -------------------------------------------------------------------------------- /meeting-client/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | React App 7 | 8 | 9 |
10 | 11 | 12 | -------------------------------------------------------------------------------- /meeting-client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "meeting-react-client", 3 | "version": "0.1.0", 4 | "private": true, 5 | "devDependencies": { 6 | "react-scripts": "0.4.1" 7 | }, 8 | "dependencies": { 9 | "axios": "^0.16.2", 10 | "react": "^15.3.1", 11 | "react-bootstrap": "^0.30.3", 12 | "react-bootstrap-table": "^2.5.2", 13 | "react-dom": "^15.3.1", 14 | "react-router": "^2.8.0", 15 | "react-select": "^1.0.0-rc.1" 16 | }, 17 | "scripts": { 18 | "start": "react-scripts start", 19 | "build": "react-scripts build", 20 | "test": "react-scripts test --env=jsdom", 21 | "eject": "react-scripts eject" 22 | }, 23 | "eslintConfig": { 24 | "extends": "./node_modules/react-scripts/config/eslint.js" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /meeting-client/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import { Router, Route, browserHistory } from 'react-router' 4 | 5 | import MainTemplate from './pages/MainTemplate'; 6 | import Employees from './pages/Employees'; 7 | import Departments from './pages/Departments'; 8 | import Meetings from './pages/Meetings'; 9 | 10 | ReactDOM.render( 11 | 12 | 13 | 14 | 15 | 16 | 17 | , 18 | document.getElementById('root') 19 | ); 20 | -------------------------------------------------------------------------------- /meeting-client/src/pages/Departments/AddDepartment.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Select from 'react-select'; 3 | import axios from 'axios'; 4 | import { Button, Modal, FormGroup, ControlLabel, FormControl } from 'react-bootstrap'; 5 | 6 | var AddDepartment = React.createClass({ 7 | 8 | getInitialState: function() { 9 | 10 | return { 11 | addObject: { 12 | id: '', 13 | name: '', 14 | description: '' 15 | } 16 | } 17 | }, 18 | 19 | render: function() { 20 | 21 | return ( 22 | 23 | 24 | Add Department 25 | 26 | 27 |
28 | 29 | Department name 30 | 35 |
36 | 37 | Department description 38 | 43 |
44 |
45 |
46 |
47 | 48 | 49 | 50 | 51 |
52 | ); 53 | }, 54 | 55 | clearAddObject: function() { 56 | 57 | this.state.addObject.id = ''; 58 | this.state.addObject.name = ''; 59 | this.state.addObject.description = ''; 60 | }, 61 | 62 | //Input changes 63 | onAddDepartmentNameChange: function(event) { 64 | this.state.addObject.name = event.target.value; 65 | this.forceUpdate(); 66 | }, 67 | 68 | onAddDepartmentDescriptionChange: function(event) { 69 | this.state.addObject.description = event.target.value; 70 | this.forceUpdate(); 71 | }, 72 | 73 | onAddBtnClicked: function() { 74 | 75 | //Save department 76 | axios.post('http://localhost:8080/departments/', this.state.addObject) 77 | .then(function (response) { 78 | this.props.parent.closeAddModal(); 79 | this.props.parent.refreshTable(); 80 | console.log(response); 81 | }.bind(this)) 82 | .catch(function (error) { 83 | console.log(error); 84 | }); 85 | } 86 | }); 87 | 88 | export default AddDepartment; -------------------------------------------------------------------------------- /meeting-client/src/pages/Departments/Departments.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Select from 'react-select'; 3 | import axios from 'axios'; 4 | import { ButtonGroup, Button, Modal, Glyphicon, FormGroup, ControlLabel, FormControl } from 'react-bootstrap'; 5 | import { BootstrapTable, TableHeaderColumn } from 'react-bootstrap-table'; 6 | 7 | import AddDepartmentModal from './AddDepartment'; 8 | import UpdateDepartmentModal from './UpdateDepartment'; 9 | 10 | var Departments = React.createClass({ 11 | 12 | getInitialState: function() { 13 | 14 | return { 15 | data: null, 16 | selectedDepartmentId: null, 17 | showAddModal: false, 18 | showUpdateModal: false 19 | } 20 | }, 21 | 22 | componentDidMount: function() { 23 | this.refreshTable(); 24 | }, 25 | 26 | render: function() { 27 | 28 | var selectRowProp = { 29 | mode: "radio", 30 | clickToSelect: true, 31 | className: "selected-row", 32 | bgColor: 'rgb(101, 148, 255)', 33 | onSelect: this.onRowSelect 34 | }; 35 | 36 | if(!this.state.data){ 37 | return (
); 38 | } 39 | 40 | return ( 41 |
42 | 43 | 44 | 45 | 46 | 47 | 48 | 54 | Department ID 55 | Name 56 | Description 57 | 58 | 59 | 60 | 61 | 62 |
63 | ); 64 | }, 65 | 66 | // Keep selected row 67 | onRowSelect: function(row, isSelected) { 68 | 69 | if(isSelected) { 70 | this.setState({ selectedDepartmentId: row.id }); 71 | }else { 72 | this.setState({ selectedDepartmentId: null }); 73 | } 74 | }, 75 | 76 | //Add modal open/close 77 | closeAddModal: function() { 78 | this.setState({ showAddModal: false }); 79 | this.refs.addDepartment.clearAddObject(); 80 | }, 81 | 82 | openAddModal: function() { 83 | this.refs.addDepartment.clearAddObject(); 84 | this.setState({ showAddModal: true }); 85 | }, 86 | 87 | //Update modal open/close 88 | closeUpdateModal: function() { 89 | this.setState({showUpdateModal: false}); 90 | this.refs.updateDepartment.clearUpdateObject(); 91 | }, 92 | 93 | openUpdateModal: function() { 94 | this.refs.updateDepartment.fillUpdateObject(); 95 | this.setState({showUpdateModal: true}); 96 | }, 97 | 98 | //BEGIN: Delete Department 99 | onDeleteBtnClicked: function() { 100 | 101 | axios.delete('http://localhost:8080/departments/' + this.state.selectedDepartmentId) 102 | .then(function (response) { 103 | this.refreshTable(); 104 | }.bind(this)) 105 | .catch(function (error) { 106 | console.log(error); 107 | }); 108 | }, 109 | //END: Delete Department 110 | 111 | getDepartmentById: function(id) { 112 | 113 | for(var i in this.state.data) { 114 | if(this.state.data[i].id === id) { 115 | return this.state.data[i]; 116 | } 117 | } 118 | return ''; 119 | }, 120 | 121 | //Get table data and update the state to render 122 | refreshTable: function() { 123 | 124 | axios.get('http://localhost:8080/departments') 125 | .then(function (departments) { 126 | this.setState({data: departments.data}); 127 | }.bind(this)); 128 | } 129 | }); 130 | 131 | export default Departments; -------------------------------------------------------------------------------- /meeting-client/src/pages/Departments/UpdateDepartment.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Select from 'react-select'; 3 | import axios from 'axios'; 4 | import { Button, Modal, FormGroup, ControlLabel, FormControl } from 'react-bootstrap'; 5 | 6 | var UpdateDepartment = React.createClass({ 7 | 8 | getInitialState: function() { 9 | return { 10 | updateObject: { 11 | id: '', 12 | name: '', 13 | description: '' 14 | } 15 | } 16 | }, 17 | 18 | render: function() { 19 | 20 | return ( 21 | 22 | 23 | Update Department 24 | 25 | 26 |
27 | 28 | Department name 29 | 34 |
35 | 36 | Department description 37 | 42 |
43 |
44 |
45 |
46 | 47 | 48 | 49 | 50 |
51 | ); 52 | }, 53 | 54 | fillUpdateObject: function() { 55 | var selectedDepartment = this.props.parent.getDepartmentById(this.props.parent.state.selectedDepartmentId); 56 | 57 | this.state.updateObject = { 58 | id: selectedDepartment.id, 59 | name: selectedDepartment.name, 60 | description: selectedDepartment.description 61 | } 62 | }, 63 | clearUpdateObject: function() { 64 | this.state.updateObject.id = ''; 65 | this.state.updateObject.name = ''; 66 | this.state.updateObject.description = ''; 67 | }, 68 | 69 | //Input changes 70 | onUpdateDepartmentNameChange: function(event) { 71 | this.state.updateObject.name = event.target.value; 72 | this.forceUpdate(); 73 | }, 74 | onUpdateDepartmentDescriptionChange: function(event) { 75 | this.state.updateObject.description = event.target.value; 76 | this.forceUpdate(); 77 | }, 78 | onUpdateBtnClicked: function() { 79 | 80 | //Update Department 81 | axios.put('http://localhost:8080/departments/' + this.state.updateObject.id, this.state.updateObject) 82 | .then(function (response) { 83 | this.props.parent.closeUpdateModal(); 84 | this.props.parent.refreshTable(); 85 | console.log(response); 86 | }.bind(this)) 87 | .catch(function (error) { 88 | console.log(error); 89 | }); 90 | } 91 | }); 92 | 93 | export default UpdateDepartment; -------------------------------------------------------------------------------- /meeting-client/src/pages/Departments/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Departments", 3 | "version": "0.0.0", 4 | "private": true, 5 | "main": "./Departments.js" 6 | } 7 | -------------------------------------------------------------------------------- /meeting-client/src/pages/Employees/AddEmployee.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Select from 'react-select'; 3 | import axios from 'axios'; 4 | import { Button, Modal, FormGroup, ControlLabel, FormControl } from 'react-bootstrap'; 5 | 6 | var AddEmployee = React.createClass({ 7 | 8 | getInitialState: function() { 9 | 10 | return { 11 | addObject: { 12 | id: '', 13 | name: '', 14 | surname: '', 15 | salary: '', 16 | departmentId: '' 17 | } 18 | } 19 | }, 20 | 21 | render: function() { 22 | 23 | return ( 24 | 25 | 26 | Add Employee 27 | 28 | 29 |
30 | 31 | Employee name 32 | 37 |
38 | 39 | Employee surname 40 | 45 |
46 | 47 | Employee salary 48 | 53 |
54 | 55 | Employee department 56 | 67 |
68 |
69 |
70 | 71 | 72 | 73 | 74 |
75 | ); 76 | }, 77 | 78 | fillUpdateObject: function() { 79 | 80 | var selectedEmployee = this.props.parent.getEmployeeById(this.props.parent.state.selectedEmployeeId); 81 | 82 | this.state.updateObject = { 83 | id: selectedEmployee.id, 84 | name: selectedEmployee.name, 85 | surname: selectedEmployee.surname, 86 | salary: selectedEmployee.salary, 87 | departmentId: selectedEmployee.departmentId 88 | } 89 | }, 90 | 91 | clearUpdateObject: function() { 92 | 93 | this.state.updateObject.id = ''; 94 | this.state.updateObject.name = ''; 95 | this.state.updateObject.surname = ''; 96 | this.state.updateObject.salary = ''; 97 | this.state.updateObject.departmentId = ''; 98 | }, 99 | 100 | //Input changes 101 | onUpdateEmployeeNameChange: function(event) { 102 | this.state.updateObject.name = event.target.value; 103 | this.forceUpdate(); 104 | }, 105 | 106 | onUpdateEmployeeSurnameChange: function(event) { 107 | this.state.updateObject.surname = event.target.value; 108 | this.forceUpdate(); 109 | }, 110 | 111 | onUpdateEmployeeSalaryChange: function(event) { 112 | this.state.updateObject.salary = event.target.value; 113 | this.forceUpdate(); 114 | }, 115 | 116 | onUpdateEmployeeDepartmentChange: function(selection) { 117 | 118 | if(selection === null) { 119 | this.state.updateObject.departmentId = null; 120 | }else { 121 | this.state.updateObject.departmentId = selection.value; 122 | } 123 | 124 | this.forceUpdate(); 125 | }, 126 | 127 | onUpdateBtnClicked: function() { 128 | 129 | //Update employee 130 | axios.put('http://localhost:8080/employees/' + this.state.updateObject.id, this.state.updateObject) 131 | .then(function (response) { 132 | this.props.parent.closeUpdateModal(); 133 | this.props.parent.refreshTable(); 134 | console.log(response); 135 | }.bind(this)) 136 | .catch(function (error) { 137 | console.log(error); 138 | }); 139 | } 140 | }); 141 | 142 | export default UpdateEmployee; -------------------------------------------------------------------------------- /meeting-client/src/pages/Employees/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Employees", 3 | "version": "0.0.0", 4 | "private": true, 5 | "main": "./Employees.js" 6 | } 7 | -------------------------------------------------------------------------------- /meeting-client/src/pages/Header/Header.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Link } from 'react-router'; 3 | 4 | var Header = React.createClass({ 5 | render: function() { 6 | 7 | return ( 8 |
9 |

10 | Meeting React App 11 |

12 |
13 | Employees 14 | Departments 15 | Meetings 16 |
17 |
18 | 19 | ); 20 | } 21 | }); 22 | 23 | export default Header; -------------------------------------------------------------------------------- /meeting-client/src/pages/Header/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Header", 3 | "version": "0.0.0", 4 | "private": true, 5 | "main": "./Header.js" 6 | } 7 | -------------------------------------------------------------------------------- /meeting-client/src/pages/MainTemplate/MainTemplate.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Header from '../Header'; 3 | import '../../styles/bootstrap-3.3.6/dist/css/bootstrap.min.css'; 4 | import '../../styles/bootstrap-3.3.6/dist/css/bootstrap-theme.min.css'; 5 | import '../../styles/react-bootstrap-table/dist/react-bootstrap-table-all.min.css'; 6 | import '../../styles/react-select/dist/react-select.min.css'; 7 | import '../../styles/index.css'; 8 | 9 | var MainTemplate = React.createClass({ 10 | 11 | render: function() { 12 | 13 | const { main } = this.props; 14 | 15 | return ( 16 |
17 |
18 | 19 |
20 | {main} 21 |
22 |
23 | ); 24 | } 25 | }); 26 | 27 | export default MainTemplate; -------------------------------------------------------------------------------- /meeting-client/src/pages/MainTemplate/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "MainTemplate", 3 | "version": "0.0.0", 4 | "private": true, 5 | "main": "./MainTemplate.js" 6 | } 7 | -------------------------------------------------------------------------------- /meeting-client/src/pages/Meetings/AddMeeting.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Select from 'react-select'; 3 | import axios from 'axios'; 4 | import { Button, Modal, FormGroup, ControlLabel, FormControl } from 'react-bootstrap'; 5 | 6 | var AddMeeting = React.createClass({ 7 | 8 | getInitialState: function() { 9 | 10 | return { 11 | addObject: { 12 | id: '', 13 | name: '', 14 | description: '', 15 | departments: '' 16 | } 17 | } 18 | }, 19 | 20 | render: function() { 21 | 22 | if(this.props.parent.state.showAddModal === false){ 23 | return (
); 24 | } 25 | 26 | return ( 27 | 28 | 29 | Add Meeting 30 | 31 | 32 |
33 | 34 | Meeting name 35 | 40 |
41 | 42 | Meeting description 43 | 48 |
49 | 50 | Departments 51 | 57 |
58 |
59 |
60 | 61 | 62 | 63 | 64 |
65 | ); 66 | }, 67 | 68 | fillUpdateObject: function() { 69 | 70 | var selectedMeeting = this.props.parent.getMeetingById(this.props.parent.state.selectedMeetingId); 71 | 72 | this.state.updateObject = { 73 | id: selectedMeeting.id, 74 | name: selectedMeeting.name, 75 | description: selectedMeeting.description, 76 | departments: selectedMeeting.departments, 77 | } 78 | }, 79 | 80 | clearUpdateObject: function() { 81 | 82 | this.state.updateObject.id = ''; 83 | this.state.updateObject.name = ''; 84 | this.state.updateObject.description = ''; 85 | this.state.updateObject.departments = ''; 86 | }, 87 | 88 | //Input changes 89 | onUpdateMeetingNameChange: function(event) { 90 | this.state.updateObject.name = event.target.value; 91 | this.forceUpdate(); 92 | }, 93 | 94 | onUpdateMeetingDescriptionChange: function(event) { 95 | this.state.updateObject.description = event.target.value; 96 | this.forceUpdate(); 97 | }, 98 | 99 | onUpdateMeetingDepartmentChange: function(selection) { 100 | 101 | if (selection === null) { 102 | this.state.updateObject.departments = null; 103 | } else { 104 | var departments = selection.map(function(obj){ 105 | var rObj = {}; 106 | rObj['id'] = obj['value']; 107 | rObj['name'] = obj['label']; 108 | return rObj; 109 | }); 110 | 111 | this.state.updateObject.departments = departments; 112 | } 113 | 114 | this.forceUpdate(); 115 | }, 116 | 117 | onUpdateBtnClicked: function() { 118 | 119 | //Update Meeting 120 | axios.put('http://localhost:8080/meetings/' + this.state.updateObject.id, this.state.updateObject) 121 | .then(function (response) { 122 | this.props.parent.closeUpdateModal(); 123 | this.props.parent.refreshTable(); 124 | console.log(response); 125 | }.bind(this)) 126 | .catch(function (error) { 127 | console.log(error); 128 | }); 129 | } 130 | }); 131 | 132 | export default UpdateMeeting; -------------------------------------------------------------------------------- /meeting-client/src/pages/Meetings/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Meetings", 3 | "version": "0.0.0", 4 | "private": true, 5 | "main": "./Meetings.js" 6 | } 7 | -------------------------------------------------------------------------------- /meeting-client/src/styles/bootstrap-3.3.6/dist/css/bootstrap-theme.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.6 (http://getbootstrap.com) 3 | * Copyright 2011-2015 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | .btn-default, 7 | .btn-primary, 8 | .btn-success, 9 | .btn-info, 10 | .btn-warning, 11 | .btn-danger { 12 | text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); 13 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); 14 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); 15 | } 16 | .btn-default:active, 17 | .btn-primary:active, 18 | .btn-success:active, 19 | .btn-info:active, 20 | .btn-warning:active, 21 | .btn-danger:active, 22 | .btn-default.active, 23 | .btn-primary.active, 24 | .btn-success.active, 25 | .btn-info.active, 26 | .btn-warning.active, 27 | .btn-danger.active { 28 | -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); 29 | box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); 30 | } 31 | .btn-default.disabled, 32 | .btn-primary.disabled, 33 | .btn-success.disabled, 34 | .btn-info.disabled, 35 | .btn-warning.disabled, 36 | .btn-danger.disabled, 37 | .btn-default[disabled], 38 | .btn-primary[disabled], 39 | .btn-success[disabled], 40 | .btn-info[disabled], 41 | .btn-warning[disabled], 42 | .btn-danger[disabled], 43 | fieldset[disabled] .btn-default, 44 | fieldset[disabled] .btn-primary, 45 | fieldset[disabled] .btn-success, 46 | fieldset[disabled] .btn-info, 47 | fieldset[disabled] .btn-warning, 48 | fieldset[disabled] .btn-danger { 49 | -webkit-box-shadow: none; 50 | box-shadow: none; 51 | } 52 | .btn-default .badge, 53 | .btn-primary .badge, 54 | .btn-success .badge, 55 | .btn-info .badge, 56 | .btn-warning .badge, 57 | .btn-danger .badge { 58 | text-shadow: none; 59 | } 60 | .btn:active, 61 | .btn.active { 62 | background-image: none; 63 | } 64 | .btn-default { 65 | text-shadow: 0 1px 0 #fff; 66 | background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); 67 | background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); 68 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); 69 | background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); 70 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); 71 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 72 | background-repeat: repeat-x; 73 | border-color: #dbdbdb; 74 | border-color: #ccc; 75 | } 76 | .btn-default:hover, 77 | .btn-default:focus { 78 | background-color: #e0e0e0; 79 | background-position: 0 -15px; 80 | } 81 | .btn-default:active, 82 | .btn-default.active { 83 | background-color: #e0e0e0; 84 | border-color: #dbdbdb; 85 | } 86 | .btn-default.disabled, 87 | .btn-default[disabled], 88 | fieldset[disabled] .btn-default, 89 | .btn-default.disabled:hover, 90 | .btn-default[disabled]:hover, 91 | fieldset[disabled] .btn-default:hover, 92 | .btn-default.disabled:focus, 93 | .btn-default[disabled]:focus, 94 | fieldset[disabled] .btn-default:focus, 95 | .btn-default.disabled.focus, 96 | .btn-default[disabled].focus, 97 | fieldset[disabled] .btn-default.focus, 98 | .btn-default.disabled:active, 99 | .btn-default[disabled]:active, 100 | fieldset[disabled] .btn-default:active, 101 | .btn-default.disabled.active, 102 | .btn-default[disabled].active, 103 | fieldset[disabled] .btn-default.active { 104 | background-color: #e0e0e0; 105 | background-image: none; 106 | } 107 | .btn-primary { 108 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%); 109 | background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%); 110 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88)); 111 | background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%); 112 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0); 113 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 114 | background-repeat: repeat-x; 115 | border-color: #245580; 116 | } 117 | .btn-primary:hover, 118 | .btn-primary:focus { 119 | background-color: #265a88; 120 | background-position: 0 -15px; 121 | } 122 | .btn-primary:active, 123 | .btn-primary.active { 124 | background-color: #265a88; 125 | border-color: #245580; 126 | } 127 | .btn-primary.disabled, 128 | .btn-primary[disabled], 129 | fieldset[disabled] .btn-primary, 130 | .btn-primary.disabled:hover, 131 | .btn-primary[disabled]:hover, 132 | fieldset[disabled] .btn-primary:hover, 133 | .btn-primary.disabled:focus, 134 | .btn-primary[disabled]:focus, 135 | fieldset[disabled] .btn-primary:focus, 136 | .btn-primary.disabled.focus, 137 | .btn-primary[disabled].focus, 138 | fieldset[disabled] .btn-primary.focus, 139 | .btn-primary.disabled:active, 140 | .btn-primary[disabled]:active, 141 | fieldset[disabled] .btn-primary:active, 142 | .btn-primary.disabled.active, 143 | .btn-primary[disabled].active, 144 | fieldset[disabled] .btn-primary.active { 145 | background-color: #265a88; 146 | background-image: none; 147 | } 148 | .btn-success { 149 | background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); 150 | background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); 151 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); 152 | background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); 153 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); 154 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 155 | background-repeat: repeat-x; 156 | border-color: #3e8f3e; 157 | } 158 | .btn-success:hover, 159 | .btn-success:focus { 160 | background-color: #419641; 161 | background-position: 0 -15px; 162 | } 163 | .btn-success:active, 164 | .btn-success.active { 165 | background-color: #419641; 166 | border-color: #3e8f3e; 167 | } 168 | .btn-success.disabled, 169 | .btn-success[disabled], 170 | fieldset[disabled] .btn-success, 171 | .btn-success.disabled:hover, 172 | .btn-success[disabled]:hover, 173 | fieldset[disabled] .btn-success:hover, 174 | .btn-success.disabled:focus, 175 | .btn-success[disabled]:focus, 176 | fieldset[disabled] .btn-success:focus, 177 | .btn-success.disabled.focus, 178 | .btn-success[disabled].focus, 179 | fieldset[disabled] .btn-success.focus, 180 | .btn-success.disabled:active, 181 | .btn-success[disabled]:active, 182 | fieldset[disabled] .btn-success:active, 183 | .btn-success.disabled.active, 184 | .btn-success[disabled].active, 185 | fieldset[disabled] .btn-success.active { 186 | background-color: #419641; 187 | background-image: none; 188 | } 189 | .btn-info { 190 | background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); 191 | background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); 192 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); 193 | background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); 194 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); 195 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 196 | background-repeat: repeat-x; 197 | border-color: #28a4c9; 198 | } 199 | .btn-info:hover, 200 | .btn-info:focus { 201 | background-color: #2aabd2; 202 | background-position: 0 -15px; 203 | } 204 | .btn-info:active, 205 | .btn-info.active { 206 | background-color: #2aabd2; 207 | border-color: #28a4c9; 208 | } 209 | .btn-info.disabled, 210 | .btn-info[disabled], 211 | fieldset[disabled] .btn-info, 212 | .btn-info.disabled:hover, 213 | .btn-info[disabled]:hover, 214 | fieldset[disabled] .btn-info:hover, 215 | .btn-info.disabled:focus, 216 | .btn-info[disabled]:focus, 217 | fieldset[disabled] .btn-info:focus, 218 | .btn-info.disabled.focus, 219 | .btn-info[disabled].focus, 220 | fieldset[disabled] .btn-info.focus, 221 | .btn-info.disabled:active, 222 | .btn-info[disabled]:active, 223 | fieldset[disabled] .btn-info:active, 224 | .btn-info.disabled.active, 225 | .btn-info[disabled].active, 226 | fieldset[disabled] .btn-info.active { 227 | background-color: #2aabd2; 228 | background-image: none; 229 | } 230 | .btn-warning { 231 | background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); 232 | background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); 233 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); 234 | background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); 235 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); 236 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 237 | background-repeat: repeat-x; 238 | border-color: #e38d13; 239 | } 240 | .btn-warning:hover, 241 | .btn-warning:focus { 242 | background-color: #eb9316; 243 | background-position: 0 -15px; 244 | } 245 | .btn-warning:active, 246 | .btn-warning.active { 247 | background-color: #eb9316; 248 | border-color: #e38d13; 249 | } 250 | .btn-warning.disabled, 251 | .btn-warning[disabled], 252 | fieldset[disabled] .btn-warning, 253 | .btn-warning.disabled:hover, 254 | .btn-warning[disabled]:hover, 255 | fieldset[disabled] .btn-warning:hover, 256 | .btn-warning.disabled:focus, 257 | .btn-warning[disabled]:focus, 258 | fieldset[disabled] .btn-warning:focus, 259 | .btn-warning.disabled.focus, 260 | .btn-warning[disabled].focus, 261 | fieldset[disabled] .btn-warning.focus, 262 | .btn-warning.disabled:active, 263 | .btn-warning[disabled]:active, 264 | fieldset[disabled] .btn-warning:active, 265 | .btn-warning.disabled.active, 266 | .btn-warning[disabled].active, 267 | fieldset[disabled] .btn-warning.active { 268 | background-color: #eb9316; 269 | background-image: none; 270 | } 271 | .btn-danger { 272 | background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); 273 | background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); 274 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); 275 | background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); 276 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); 277 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 278 | background-repeat: repeat-x; 279 | border-color: #b92c28; 280 | } 281 | .btn-danger:hover, 282 | .btn-danger:focus { 283 | background-color: #c12e2a; 284 | background-position: 0 -15px; 285 | } 286 | .btn-danger:active, 287 | .btn-danger.active { 288 | background-color: #c12e2a; 289 | border-color: #b92c28; 290 | } 291 | .btn-danger.disabled, 292 | .btn-danger[disabled], 293 | fieldset[disabled] .btn-danger, 294 | .btn-danger.disabled:hover, 295 | .btn-danger[disabled]:hover, 296 | fieldset[disabled] .btn-danger:hover, 297 | .btn-danger.disabled:focus, 298 | .btn-danger[disabled]:focus, 299 | fieldset[disabled] .btn-danger:focus, 300 | .btn-danger.disabled.focus, 301 | .btn-danger[disabled].focus, 302 | fieldset[disabled] .btn-danger.focus, 303 | .btn-danger.disabled:active, 304 | .btn-danger[disabled]:active, 305 | fieldset[disabled] .btn-danger:active, 306 | .btn-danger.disabled.active, 307 | .btn-danger[disabled].active, 308 | fieldset[disabled] .btn-danger.active { 309 | background-color: #c12e2a; 310 | background-image: none; 311 | } 312 | .thumbnail, 313 | .img-thumbnail { 314 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 315 | box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 316 | } 317 | .dropdown-menu > li > a:hover, 318 | .dropdown-menu > li > a:focus { 319 | background-color: #e8e8e8; 320 | background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 321 | background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 322 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); 323 | background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); 324 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); 325 | background-repeat: repeat-x; 326 | } 327 | .dropdown-menu > .active > a, 328 | .dropdown-menu > .active > a:hover, 329 | .dropdown-menu > .active > a:focus { 330 | background-color: #2e6da4; 331 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 332 | background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 333 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); 334 | background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); 335 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); 336 | background-repeat: repeat-x; 337 | } 338 | .navbar-default { 339 | background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); 340 | background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); 341 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); 342 | background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); 343 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); 344 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 345 | background-repeat: repeat-x; 346 | border-radius: 4px; 347 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); 348 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); 349 | } 350 | .navbar-default .navbar-nav > .open > a, 351 | .navbar-default .navbar-nav > .active > a { 352 | background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); 353 | background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); 354 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); 355 | background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); 356 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); 357 | background-repeat: repeat-x; 358 | -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); 359 | box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); 360 | } 361 | .navbar-brand, 362 | .navbar-nav > li > a { 363 | text-shadow: 0 1px 0 rgba(255, 255, 255, .25); 364 | } 365 | .navbar-inverse { 366 | background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); 367 | background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); 368 | background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); 369 | background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); 370 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); 371 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 372 | background-repeat: repeat-x; 373 | border-radius: 4px; 374 | } 375 | .navbar-inverse .navbar-nav > .open > a, 376 | .navbar-inverse .navbar-nav > .active > a { 377 | background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); 378 | background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); 379 | background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); 380 | background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); 381 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); 382 | background-repeat: repeat-x; 383 | -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); 384 | box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); 385 | } 386 | .navbar-inverse .navbar-brand, 387 | .navbar-inverse .navbar-nav > li > a { 388 | text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); 389 | } 390 | .navbar-static-top, 391 | .navbar-fixed-top, 392 | .navbar-fixed-bottom { 393 | border-radius: 0; 394 | } 395 | @media (max-width: 767px) { 396 | .navbar .navbar-nav .open .dropdown-menu > .active > a, 397 | .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, 398 | .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { 399 | color: #fff; 400 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 401 | background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 402 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); 403 | background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); 404 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); 405 | background-repeat: repeat-x; 406 | } 407 | } 408 | .alert { 409 | text-shadow: 0 1px 0 rgba(255, 255, 255, .2); 410 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); 411 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); 412 | } 413 | .alert-success { 414 | background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); 415 | background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); 416 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); 417 | background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); 418 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); 419 | background-repeat: repeat-x; 420 | border-color: #b2dba1; 421 | } 422 | .alert-info { 423 | background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); 424 | background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); 425 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); 426 | background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); 427 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); 428 | background-repeat: repeat-x; 429 | border-color: #9acfea; 430 | } 431 | .alert-warning { 432 | background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); 433 | background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); 434 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); 435 | background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); 436 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); 437 | background-repeat: repeat-x; 438 | border-color: #f5e79e; 439 | } 440 | .alert-danger { 441 | background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); 442 | background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); 443 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); 444 | background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); 445 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); 446 | background-repeat: repeat-x; 447 | border-color: #dca7a7; 448 | } 449 | .progress { 450 | background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); 451 | background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); 452 | background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); 453 | background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); 454 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); 455 | background-repeat: repeat-x; 456 | } 457 | .progress-bar { 458 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%); 459 | background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%); 460 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090)); 461 | background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%); 462 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); 463 | background-repeat: repeat-x; 464 | } 465 | .progress-bar-success { 466 | background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); 467 | background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); 468 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); 469 | background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); 470 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); 471 | background-repeat: repeat-x; 472 | } 473 | .progress-bar-info { 474 | background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); 475 | background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); 476 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); 477 | background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); 478 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); 479 | background-repeat: repeat-x; 480 | } 481 | .progress-bar-warning { 482 | background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); 483 | background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); 484 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); 485 | background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); 486 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); 487 | background-repeat: repeat-x; 488 | } 489 | .progress-bar-danger { 490 | background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); 491 | background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); 492 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); 493 | background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); 494 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); 495 | background-repeat: repeat-x; 496 | } 497 | .progress-bar-striped { 498 | background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); 499 | background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); 500 | background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); 501 | } 502 | .list-group { 503 | border-radius: 4px; 504 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 505 | box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 506 | } 507 | .list-group-item.active, 508 | .list-group-item.active:hover, 509 | .list-group-item.active:focus { 510 | text-shadow: 0 -1px 0 #286090; 511 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%); 512 | background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%); 513 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a)); 514 | background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%); 515 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); 516 | background-repeat: repeat-x; 517 | border-color: #2b669a; 518 | } 519 | .list-group-item.active .badge, 520 | .list-group-item.active:hover .badge, 521 | .list-group-item.active:focus .badge { 522 | text-shadow: none; 523 | } 524 | .panel { 525 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); 526 | box-shadow: 0 1px 2px rgba(0, 0, 0, .05); 527 | } 528 | .panel-default > .panel-heading { 529 | background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 530 | background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 531 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); 532 | background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); 533 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); 534 | background-repeat: repeat-x; 535 | } 536 | .panel-primary > .panel-heading { 537 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 538 | background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 539 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); 540 | background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); 541 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); 542 | background-repeat: repeat-x; 543 | } 544 | .panel-success > .panel-heading { 545 | background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); 546 | background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); 547 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); 548 | background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); 549 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); 550 | background-repeat: repeat-x; 551 | } 552 | .panel-info > .panel-heading { 553 | background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); 554 | background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); 555 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); 556 | background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); 557 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); 558 | background-repeat: repeat-x; 559 | } 560 | .panel-warning > .panel-heading { 561 | background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); 562 | background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); 563 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); 564 | background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); 565 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); 566 | background-repeat: repeat-x; 567 | } 568 | .panel-danger > .panel-heading { 569 | background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); 570 | background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); 571 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); 572 | background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); 573 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); 574 | background-repeat: repeat-x; 575 | } 576 | .well { 577 | background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); 578 | background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); 579 | background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); 580 | background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); 581 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); 582 | background-repeat: repeat-x; 583 | border-color: #dcdcdc; 584 | -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); 585 | box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); 586 | } 587 | /*# sourceMappingURL=bootstrap-theme.css.map */ 588 | -------------------------------------------------------------------------------- /meeting-client/src/styles/bootstrap-3.3.6/dist/css/bootstrap-theme.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.6 (http://getbootstrap.com) 3 | * Copyright 2011-2015 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} 6 | /*# sourceMappingURL=bootstrap-theme.min.css.map */ -------------------------------------------------------------------------------- /meeting-client/src/styles/bootstrap-3.3.6/dist/css/bootstrap-theme.min.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":";;;;AAmBA,YAAA,aAAA,UAAA,aAAA,aAAA,aAME,YAAA,EAAA,KAAA,EAAA,eC2CA,mBAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBDvCR,mBAAA,mBAAA,oBAAA,oBAAA,iBAAA,iBAAA,oBAAA,oBAAA,oBAAA,oBAAA,oBAAA,oBCsCA,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBDlCR,qBAAA,sBAAA,sBAAA,uBAAA,mBAAA,oBAAA,sBAAA,uBAAA,sBAAA,uBAAA,sBAAA,uBAAA,+BAAA,gCAAA,6BAAA,gCAAA,gCAAA,gCCiCA,mBAAA,KACQ,WAAA,KDlDV,mBAAA,oBAAA,iBAAA,oBAAA,oBAAA,oBAuBI,YAAA,KAyCF,YAAA,YAEE,iBAAA,KAKJ,aErEI,YAAA,EAAA,IAAA,EAAA,KACA,iBAAA,iDACA,iBAAA,4CAAA,iBAAA,qEAEA,iBAAA,+CCnBF,OAAA,+GH4CA,OAAA,0DACA,kBAAA,SAuC2C,aAAA,QAA2B,aAAA,KArCtE,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAgBN,aEtEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAiBN,aEvEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAkBN,UExEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,gBAAA,gBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,iBAAA,iBAEE,iBAAA,QACA,aAAA,QAMA,mBAAA,0BAAA,yBAAA,0BAAA,yBAAA,yBAAA,oBAAA,2BAAA,0BAAA,2BAAA,0BAAA,0BAAA,6BAAA,oCAAA,mCAAA,oCAAA,mCAAA,mCAME,iBAAA,QACA,iBAAA,KAmBN,aEzEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAoBN,YE1EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,kBAAA,kBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,mBAAA,mBAEE,iBAAA,QACA,aAAA,QAMA,qBAAA,4BAAA,2BAAA,4BAAA,2BAAA,2BAAA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,+BAAA,sCAAA,qCAAA,sCAAA,qCAAA,qCAME,iBAAA,QACA,iBAAA,KA2BN,eAAA,WClCE,mBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,EAAA,IAAA,IAAA,iBD2CV,0BAAA,0BE3FI,iBAAA,QACA,iBAAA,oDACA,iBAAA,+CAAA,iBAAA,wEACA,iBAAA,kDACA,OAAA,+GF0FF,kBAAA,SAEF,yBAAA,+BAAA,+BEhGI,iBAAA,QACA,iBAAA,oDACA,iBAAA,+CAAA,iBAAA,wEACA,iBAAA,kDACA,OAAA,+GFgGF,kBAAA,SASF,gBE7GI,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GACA,OAAA,0DCnBF,kBAAA,SH+HA,cAAA,ICjEA,mBAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBD6DV,sCAAA,oCE7GI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SD2CF,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBD0EV,cAAA,iBAEE,YAAA,EAAA,IAAA,EAAA,sBAIF,gBEhII,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GACA,OAAA,0DCnBF,kBAAA,SHkJA,cAAA,IAHF,sCAAA,oCEhII,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SD2CF,mBAAA,MAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,gBDgFV,8BAAA,iCAYI,YAAA,EAAA,KAAA,EAAA,gBAKJ,qBAAA,kBAAA,mBAGE,cAAA,EAqBF,yBAfI,mDAAA,yDAAA,yDAGE,MAAA,KE7JF,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,UFqKJ,OACE,YAAA,EAAA,IAAA,EAAA,qBC3HA,mBAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,gBDsIV,eEtLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAKF,YEvLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAMF,eExLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAOF,cEzLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAeF,UEjMI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFuMJ,cE3MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFwMJ,sBE5MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFyMJ,mBE7MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF0MJ,sBE9MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF2MJ,qBE/MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF+MJ,sBElLI,iBAAA,yKACA,iBAAA,oKACA,iBAAA,iKFyLJ,YACE,cAAA,IC9KA,mBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,EAAA,IAAA,IAAA,iBDgLV,wBAAA,8BAAA,8BAGE,YAAA,EAAA,KAAA,EAAA,QEnOE,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFiOF,aAAA,QALF,+BAAA,qCAAA,qCAQI,YAAA,KAUJ,OCnME,mBAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,EAAA,IAAA,IAAA,gBD4MV,8BE5PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFyPJ,8BE7PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF0PJ,8BE9PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF2PJ,2BE/PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF4PJ,8BEhQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF6PJ,6BEjQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoQJ,MExQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFsQF,aAAA,QC3NA,mBAAA,MAAA,EAAA,IAAA,IAAA,gBAAA,EAAA,IAAA,EAAA,qBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,gBAAA,EAAA,IAAA,EAAA"} -------------------------------------------------------------------------------- /meeting-client/src/styles/bootstrap-3.3.6/dist/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aecavac/spring-react-restful-example/62dd6a28a200464c5528359977a9942854f03ed8/meeting-client/src/styles/bootstrap-3.3.6/dist/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /meeting-client/src/styles/bootstrap-3.3.6/dist/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aecavac/spring-react-restful-example/62dd6a28a200464c5528359977a9942854f03ed8/meeting-client/src/styles/bootstrap-3.3.6/dist/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /meeting-client/src/styles/bootstrap-3.3.6/dist/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aecavac/spring-react-restful-example/62dd6a28a200464c5528359977a9942854f03ed8/meeting-client/src/styles/bootstrap-3.3.6/dist/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /meeting-client/src/styles/bootstrap-3.3.6/dist/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aecavac/spring-react-restful-example/62dd6a28a200464c5528359977a9942854f03ed8/meeting-client/src/styles/bootstrap-3.3.6/dist/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /meeting-client/src/styles/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | padding: 0; 4 | font-family: sans-serif; 5 | } 6 | 7 | .header { 8 | text-align: center; 9 | } 10 | 11 | .header-info { 12 | font-size: large; 13 | font-weight: bold; 14 | padding: 16px 10px; 15 | background: #3d60af; 16 | color: #e6e6e6; 17 | } 18 | 19 | .menu { 20 | padding: 16px; 21 | } 22 | 23 | .menu-link-item { 24 | color: #5b7ecc; 25 | padding: 10px; 26 | font-weight: bold; 27 | text-decoration: none; 28 | } 29 | a.menu-link-item:focus, a.menu-link-item:hover { 30 | text-decoration: none; 31 | color: #5b7ecc; 32 | } 33 | .menu-link-item.active { 34 | border-bottom: 3px solid #3d60af; 35 | } 36 | 37 | .selected-row { 38 | color: white; 39 | } 40 | 41 | .m-10 { 42 | margin: 10px; 43 | } -------------------------------------------------------------------------------- /meeting-client/src/styles/react-bootstrap-table/dist/react-bootstrap-table-all.min.css: -------------------------------------------------------------------------------- 1 | .react-bs-table-container .react-bs-table-search-form{margin-bottom:0}.react-bs-table table{margin-bottom:0;table-layout:fixed}.react-bs-table table td,.react-bs-table table th{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.react-bs-table{border:1px solid #ddd;border-radius:5px;margin:5px 10px}.react-bs-table-pagination{margin:10px}.react-bs-table-tool-bar{margin:10px 10px 0}.react-bs-container-header{overflow:hidden;width:100%}.react-bs-container-body{overflow:auto;width:100%}.react-bs-table .table-bordered{border:0}.react-bs-table .table-bordered>thead>tr>td,.react-bs-table .table-bordered>thead>tr>th{border-bottom-width:2px}.react-bs-table .table-bordered>tfoot>tr>td,.react-bs-table .table-bordered>tfoot>tr>th{border-top-width:2px;border-bottom-width:0}.react-bs-table .table-bordered>tbody>tr>td:first-child,.react-bs-table .table-bordered>tbody>tr>th:first-child,.react-bs-table .table-bordered>tfoot>tr>td:first-child,.react-bs-table .table-bordered>tfoot>tr>th:first-child,.react-bs-table .table-bordered>thead>tr>td:first-child,.react-bs-table .table-bordered>thead>tr>th:first-child{border-left-width:0}.react-bs-table .table-bordered>tbody>tr>td:last-child,.react-bs-table .table-bordered>tbody>tr>th:last-child,.react-bs-table .table-bordered>tfoot>tr>td:last-child,.react-bs-table .table-bordered>tfoot>tr>th:last-child,.react-bs-table .table-bordered>thead>tr>td:last-child,.react-bs-table .table-bordered>thead>tr>th:last-child{border-right-width:0}.react-bs-table .table-bordered>thead>tr:first-child>td,.react-bs-table .table-bordered>thead>tr:first-child>th{border-top-width:0}.react-bs-table .table-bordered>tfoot>tr:last-child>td,.react-bs-table .table-bordered>tfoot>tr:last-child>th{border-bottom-width:0}.react-bs-table .react-bs-container-header>table>thead>tr>th{vertical-align:middle}.react-bs-table .react-bs-container-header>table>thead>tr>th .filter{font-weight:400}.react-bs-table .react-bs-container-header>table>thead>tr>th .filter::-webkit-input-placeholder,.react-bs-table .react-bs-container-header>table>thead>tr>th .number-filter-input::-webkit-input-placeholder,.react-bs-table .react-bs-container-header>table>thead>tr>th .select-filter option[value=''],.react-bs-table .react-bs-container-header>table>thead>tr>th .select-filter.placeholder-selected{color:#d3d3d3;font-style:italic}.react-bs-table .react-bs-container-header>table>thead>tr>th .select-filter.placeholder-selected option:not([value='']){color:initial;font-style:initial}.react-bs-table .react-bs-container-header>table>thead>tr>th .date-filter,.react-bs-table .react-bs-container-header>table>thead>tr>th .number-filter{display:flex}.react-bs-table .react-bs-container-header>table>thead>tr>th .date-filter-input,.react-bs-table .react-bs-container-header>table>thead>tr>th .number-filter-input{margin-left:5px;float:left;width:calc(100% - 67px - 5px)}.react-bs-table .react-bs-container-header>table>thead>tr>th .date-filter-comparator,.react-bs-table .react-bs-container-header>table>thead>tr>th .number-filter-comparator{width:67px;float:left}.react-bs-table .react-bs-container-header .sort-column{cursor:pointer}.react-bs-container .textarea-save-btn{position:absolute;z-index:100;right:0;top:-21px}.react-bs-table-no-data{text-align:center}.animated{animation-fill-mode:both}.animated.bounceIn,.animated.bounceOut{animation-duration:.75s}.animated.shake{animation-duration:.3s}@keyframes shake{from,to{transform:translate3d(0,0,0)}10%,50%,90%{transform:translate3d(-10px,0,0)}30%,70%{transform:translate3d(10px,0,0)}}.shake{animation-name:shake}@keyframes bounceIn{20%,40%,60%,80%,from,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:scale3d(.3,.3,.3)}20%{transform:scale3d(1.1,1.1,1.1)}40%{transform:scale3d(.9,.9,.9)}60%{opacity:1;transform:scale3d(1.03,1.03,1.03)}80%{transform:scale3d(.97,.97,.97)}to{opacity:1;transform:scale3d(1,1,1)}}.bounceIn{animation-name:bounceIn}@keyframes bounceOut{20%{transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;transform:scale3d(1.1,1.1,1.1)}to{opacity:0;transform:scale3d(.3,.3,.3)}}.bounceOut{animation-name:bounceOut}.toast-title{font-weight:700}.toast-message{-ms-word-wrap:break-word;word-wrap:break-word}.toast-message a,.toast-message label{color:#fff}.toast-message a:hover{color:#ccc;text-decoration:none}.toast-close-button{position:relative;right:-.3em;top:-.3em;float:right;font-size:20px;font-weight:700;color:#fff;-webkit-text-shadow:0 1px 0 #fff;text-shadow:0 1px 0 #fff;opacity:.8;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=80);filter:alpha(opacity=80)}.toast-top-center,.toast-top-full-width{top:0;right:0;width:100%}.toast-close-button:focus,.toast-close-button:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=40);filter:alpha(opacity=40)}button.toast-close-button{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.toast-bottom-center{bottom:0;right:0;width:100%}.toast-bottom-full-width{bottom:0;right:0;width:100%}.toast-top-left{top:12px;left:12px}.toast-top-right{top:12px;right:12px}.toast-bottom-right{right:12px;bottom:12px}.toast-bottom-left{bottom:12px;left:12px}#toast-container{position:fixed;z-index:999999}#toast-container *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#toast-container>div{position:relative;overflow:hidden;margin:0 0 6px;padding:15px 15px 15px 50px;width:300px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background-position:15px center;background-repeat:no-repeat;-moz-box-shadow:0 0 12px #999;-webkit-box-shadow:0 0 12px #999;box-shadow:0 0 12px #999;color:#fff;opacity:.8;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=80);filter:alpha(opacity=80)}#toast-container>:hover{-moz-box-shadow:0 0 12px #000;-webkit-box-shadow:0 0 12px #000;box-shadow:0 0 12px #000;opacity:1;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);filter:alpha(opacity=100);cursor:pointer}#toast-container>.toast-info{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=)!important}#toast-container>.toast-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=)!important}#toast-container>.toast-success{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==)!important}#toast-container>.toast-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=)!important}#toast-container.toast-bottom-center>div,#toast-container.toast-top-center>div{width:300px;margin:auto}#toast-container.toast-bottom-full-width>div,#toast-container.toast-top-full-width>div{width:96%;margin:auto}.toast{background-color:#030303}.toast-success{background-color:#51a351}.toast-error{background-color:#bd362f}.toast-info{background-color:#2f96b4}.toast-warning{background-color:#f89406}.toast-progress{position:absolute;left:0;bottom:0;height:4px;background-color:#000;opacity:.4;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=40);filter:alpha(opacity=40)}@media all and (max-width:240px){#toast-container>div{padding:8px 8px 8px 50px;width:11em}#toast-container .toast-close-button{right:-.2em;top:-.2em}}@media all and (min-width:241px) and (max-width:480px){#toast-container>div{padding:8px 8px 8px 50px;width:18em}#toast-container .toast-close-button{right:-.2em;top:-.2em}}@media all and (min-width:481px) and (max-width:768px){#toast-container>div{padding:15px 15px 15px 50px;width:25em}} -------------------------------------------------------------------------------- /meeting-client/src/styles/react-bootstrap-table/dist/react-bootstrap-table.min.css: -------------------------------------------------------------------------------- 1 | .react-bs-table-container .react-bs-table-search-form{margin-bottom:0}.react-bs-table table{margin-bottom:0;table-layout:fixed}.react-bs-table table td,.react-bs-table table th{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.react-bs-table{border:1px solid #ddd;border-radius:5px;margin:5px 10px}.react-bs-table-pagination{margin:10px}.react-bs-table-tool-bar{margin:10px 10px 0}.react-bs-container-header{overflow:hidden;width:100%}.react-bs-container-body{overflow:auto;width:100%}.react-bs-table .table-bordered{border:0}.react-bs-table .table-bordered>thead>tr>td,.react-bs-table .table-bordered>thead>tr>th{border-bottom-width:2px}.react-bs-table .table-bordered>tfoot>tr>td,.react-bs-table .table-bordered>tfoot>tr>th{border-top-width:2px;border-bottom-width:0}.react-bs-table .table-bordered>tbody>tr>td:first-child,.react-bs-table .table-bordered>tbody>tr>th:first-child,.react-bs-table .table-bordered>tfoot>tr>td:first-child,.react-bs-table .table-bordered>tfoot>tr>th:first-child,.react-bs-table .table-bordered>thead>tr>td:first-child,.react-bs-table .table-bordered>thead>tr>th:first-child{border-left-width:0}.react-bs-table .table-bordered>tbody>tr>td:last-child,.react-bs-table .table-bordered>tbody>tr>th:last-child,.react-bs-table .table-bordered>tfoot>tr>td:last-child,.react-bs-table .table-bordered>tfoot>tr>th:last-child,.react-bs-table .table-bordered>thead>tr>td:last-child,.react-bs-table .table-bordered>thead>tr>th:last-child{border-right-width:0}.react-bs-table .table-bordered>thead>tr:first-child>td,.react-bs-table .table-bordered>thead>tr:first-child>th{border-top-width:0}.react-bs-table .table-bordered>tfoot>tr:last-child>td,.react-bs-table .table-bordered>tfoot>tr:last-child>th{border-bottom-width:0}.react-bs-table .react-bs-container-header>table>thead>tr>th{vertical-align:middle}.react-bs-table .react-bs-container-header>table>thead>tr>th .filter{font-weight:400}.react-bs-table .react-bs-container-header>table>thead>tr>th .filter::-webkit-input-placeholder,.react-bs-table .react-bs-container-header>table>thead>tr>th .number-filter-input::-webkit-input-placeholder,.react-bs-table .react-bs-container-header>table>thead>tr>th .select-filter option[value=''],.react-bs-table .react-bs-container-header>table>thead>tr>th .select-filter.placeholder-selected{color:#d3d3d3;font-style:italic}.react-bs-table .react-bs-container-header>table>thead>tr>th .select-filter.placeholder-selected option:not([value='']){color:initial;font-style:initial}.react-bs-table .react-bs-container-header>table>thead>tr>th .date-filter,.react-bs-table .react-bs-container-header>table>thead>tr>th .number-filter{display:flex}.react-bs-table .react-bs-container-header>table>thead>tr>th .date-filter-input,.react-bs-table .react-bs-container-header>table>thead>tr>th .number-filter-input{margin-left:5px;float:left;width:calc(100% - 67px - 5px)}.react-bs-table .react-bs-container-header>table>thead>tr>th .date-filter-comparator,.react-bs-table .react-bs-container-header>table>thead>tr>th .number-filter-comparator{width:67px;float:left}.react-bs-table .react-bs-container-header .sort-column{cursor:pointer}.react-bs-container .textarea-save-btn{position:absolute;z-index:100;right:0;top:-21px}.react-bs-table-no-data{text-align:center}.animated{animation-fill-mode:both}.animated.bounceIn,.animated.bounceOut{animation-duration:.75s}.animated.shake{animation-duration:.3s}@keyframes shake{from,to{transform:translate3d(0,0,0)}10%,50%,90%{transform:translate3d(-10px,0,0)}30%,70%{transform:translate3d(10px,0,0)}}.shake{animation-name:shake}@keyframes bounceIn{20%,40%,60%,80%,from,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:scale3d(.3,.3,.3)}20%{transform:scale3d(1.1,1.1,1.1)}40%{transform:scale3d(.9,.9,.9)}60%{opacity:1;transform:scale3d(1.03,1.03,1.03)}80%{transform:scale3d(.97,.97,.97)}to{opacity:1;transform:scale3d(1,1,1)}}.bounceIn{animation-name:bounceIn}@keyframes bounceOut{20%{transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;transform:scale3d(1.1,1.1,1.1)}to{opacity:0;transform:scale3d(.3,.3,.3)}}.bounceOut{animation-name:bounceOut} -------------------------------------------------------------------------------- /meeting-client/src/styles/react-select/dist/react-select.css: -------------------------------------------------------------------------------- 1 | /** 2 | * React Select 3 | * ============ 4 | * Created by Jed Watson and Joss Mackison for KeystoneJS, http://www.keystonejs.com/ 5 | * https://twitter.com/jedwatson https://twitter.com/jossmackison https://twitter.com/keystonejs 6 | * MIT License: https://github.com/JedWatson/react-select 7 | */ 8 | .Select { 9 | position: relative; 10 | } 11 | .Select, 12 | .Select div, 13 | .Select input, 14 | .Select span { 15 | -webkit-box-sizing: border-box; 16 | -moz-box-sizing: border-box; 17 | box-sizing: border-box; 18 | } 19 | .Select.is-disabled > .Select-control { 20 | background-color: #f9f9f9; 21 | } 22 | .Select.is-disabled > .Select-control:hover { 23 | box-shadow: none; 24 | } 25 | .Select.is-disabled .Select-arrow-zone { 26 | cursor: default; 27 | pointer-events: none; 28 | opacity: 0.35; 29 | } 30 | .Select-control { 31 | background-color: #fff; 32 | border-color: #d9d9d9 #ccc #b3b3b3; 33 | border-radius: 4px; 34 | border: 1px solid #ccc; 35 | color: #333; 36 | cursor: default; 37 | display: table; 38 | border-spacing: 0; 39 | border-collapse: separate; 40 | height: 36px; 41 | outline: none; 42 | overflow: hidden; 43 | position: relative; 44 | width: 100%; 45 | } 46 | .Select-control:hover { 47 | box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06); 48 | } 49 | .Select-control .Select-input:focus { 50 | outline: none; 51 | } 52 | .is-searchable.is-open > .Select-control { 53 | cursor: text; 54 | } 55 | .is-open > .Select-control { 56 | border-bottom-right-radius: 0; 57 | border-bottom-left-radius: 0; 58 | background: #fff; 59 | border-color: #b3b3b3 #ccc #d9d9d9; 60 | } 61 | .is-open > .Select-control > .Select-arrow { 62 | border-color: transparent transparent #999; 63 | border-width: 0 5px 5px; 64 | } 65 | .is-searchable.is-focused:not(.is-open) > .Select-control { 66 | cursor: text; 67 | } 68 | .is-focused:not(.is-open) > .Select-control { 69 | border-color: #007eff; 70 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 3px rgba(0, 126, 255, 0.1); 71 | } 72 | .Select-placeholder, 73 | .Select--single > .Select-control .Select-value { 74 | bottom: 0; 75 | color: #aaa; 76 | left: 0; 77 | line-height: 34px; 78 | padding-left: 10px; 79 | padding-right: 10px; 80 | position: absolute; 81 | right: 0; 82 | top: 0; 83 | max-width: 100%; 84 | overflow: hidden; 85 | text-overflow: ellipsis; 86 | white-space: nowrap; 87 | } 88 | .has-value.Select--single > .Select-control .Select-value .Select-value-label, 89 | .has-value.is-pseudo-focused.Select--single > .Select-control .Select-value .Select-value-label { 90 | color: #333; 91 | } 92 | .has-value.Select--single > .Select-control .Select-value a.Select-value-label, 93 | .has-value.is-pseudo-focused.Select--single > .Select-control .Select-value a.Select-value-label { 94 | cursor: pointer; 95 | text-decoration: none; 96 | } 97 | .has-value.Select--single > .Select-control .Select-value a.Select-value-label:hover, 98 | .has-value.is-pseudo-focused.Select--single > .Select-control .Select-value a.Select-value-label:hover, 99 | .has-value.Select--single > .Select-control .Select-value a.Select-value-label:focus, 100 | .has-value.is-pseudo-focused.Select--single > .Select-control .Select-value a.Select-value-label:focus { 101 | color: #007eff; 102 | outline: none; 103 | text-decoration: underline; 104 | } 105 | .Select-input { 106 | height: 34px; 107 | padding-left: 10px; 108 | padding-right: 10px; 109 | vertical-align: middle; 110 | } 111 | .Select-input > input { 112 | width: 100%; 113 | background: none transparent; 114 | border: 0 none; 115 | box-shadow: none; 116 | cursor: default; 117 | display: inline-block; 118 | font-family: inherit; 119 | font-size: inherit; 120 | margin: 0; 121 | outline: none; 122 | line-height: 14px; 123 | /* For IE 8 compatibility */ 124 | padding: 8px 0 12px; 125 | /* For IE 8 compatibility */ 126 | -webkit-appearance: none; 127 | } 128 | .is-focused .Select-input > input { 129 | cursor: text; 130 | } 131 | .has-value.is-pseudo-focused .Select-input { 132 | opacity: 0; 133 | } 134 | .Select-control:not(.is-searchable) > .Select-input { 135 | outline: none; 136 | } 137 | .Select-loading-zone { 138 | cursor: pointer; 139 | display: table-cell; 140 | position: relative; 141 | text-align: center; 142 | vertical-align: middle; 143 | width: 16px; 144 | } 145 | .Select-loading { 146 | -webkit-animation: Select-animation-spin 400ms infinite linear; 147 | -o-animation: Select-animation-spin 400ms infinite linear; 148 | animation: Select-animation-spin 400ms infinite linear; 149 | width: 16px; 150 | height: 16px; 151 | box-sizing: border-box; 152 | border-radius: 50%; 153 | border: 2px solid #ccc; 154 | border-right-color: #333; 155 | display: inline-block; 156 | position: relative; 157 | vertical-align: middle; 158 | } 159 | .Select-clear-zone { 160 | -webkit-animation: Select-animation-fadeIn 200ms; 161 | -o-animation: Select-animation-fadeIn 200ms; 162 | animation: Select-animation-fadeIn 200ms; 163 | color: #999; 164 | cursor: pointer; 165 | display: table-cell; 166 | position: relative; 167 | text-align: center; 168 | vertical-align: middle; 169 | width: 17px; 170 | } 171 | .Select-clear-zone:hover { 172 | color: #D0021B; 173 | } 174 | .Select-clear { 175 | display: inline-block; 176 | font-size: 18px; 177 | line-height: 1; 178 | } 179 | .Select--multi .Select-clear-zone { 180 | width: 17px; 181 | } 182 | .Select-arrow-zone { 183 | cursor: pointer; 184 | display: table-cell; 185 | position: relative; 186 | text-align: center; 187 | vertical-align: middle; 188 | width: 25px; 189 | padding-right: 5px; 190 | } 191 | .Select-arrow { 192 | border-color: #999 transparent transparent; 193 | border-style: solid; 194 | border-width: 5px 5px 2.5px; 195 | display: inline-block; 196 | height: 0; 197 | width: 0; 198 | } 199 | .is-open .Select-arrow, 200 | .Select-arrow-zone:hover > .Select-arrow { 201 | border-top-color: #666; 202 | } 203 | .Select--multi .Select-multi-value-wrapper { 204 | display: inline-block; 205 | } 206 | .Select .Select-aria-only { 207 | display: inline-block; 208 | height: 1px; 209 | width: 1px; 210 | margin: -1px; 211 | clip: rect(0, 0, 0, 0); 212 | overflow: hidden; 213 | } 214 | @-webkit-keyframes Select-animation-fadeIn { 215 | from { 216 | opacity: 0; 217 | } 218 | to { 219 | opacity: 1; 220 | } 221 | } 222 | @keyframes Select-animation-fadeIn { 223 | from { 224 | opacity: 0; 225 | } 226 | to { 227 | opacity: 1; 228 | } 229 | } 230 | .Select-menu-outer { 231 | border-bottom-right-radius: 4px; 232 | border-bottom-left-radius: 4px; 233 | background-color: #fff; 234 | border: 1px solid #ccc; 235 | border-top-color: #e6e6e6; 236 | box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06); 237 | box-sizing: border-box; 238 | margin-top: -1px; 239 | max-height: 200px; 240 | position: absolute; 241 | top: 100%; 242 | width: 100%; 243 | z-index: 1; 244 | -webkit-overflow-scrolling: touch; 245 | } 246 | .Select-menu { 247 | max-height: 198px; 248 | overflow-y: auto; 249 | } 250 | .Select-option { 251 | box-sizing: border-box; 252 | background-color: #fff; 253 | color: #666666; 254 | cursor: pointer; 255 | display: block; 256 | padding: 8px 10px; 257 | } 258 | .Select-option:last-child { 259 | border-bottom-right-radius: 4px; 260 | border-bottom-left-radius: 4px; 261 | } 262 | .Select-option.is-selected { 263 | background-color: #f5faff; 264 | /* Fallback color for IE 8 */ 265 | background-color: rgba(0, 126, 255, 0.04); 266 | color: #333; 267 | } 268 | .Select-option.is-focused { 269 | background-color: #ebf5ff; 270 | /* Fallback color for IE 8 */ 271 | background-color: rgba(0, 126, 255, 0.08); 272 | color: #333; 273 | } 274 | .Select-option.is-disabled { 275 | color: #cccccc; 276 | cursor: default; 277 | } 278 | .Select-noresults { 279 | box-sizing: border-box; 280 | color: #999999; 281 | cursor: default; 282 | display: block; 283 | padding: 8px 10px; 284 | } 285 | .Select--multi .Select-input { 286 | vertical-align: middle; 287 | margin-left: 10px; 288 | padding: 0; 289 | } 290 | .Select--multi.has-value .Select-input { 291 | margin-left: 5px; 292 | } 293 | .Select--multi .Select-value { 294 | background-color: #ebf5ff; 295 | /* Fallback color for IE 8 */ 296 | background-color: rgba(0, 126, 255, 0.08); 297 | border-radius: 2px; 298 | border: 1px solid #c2e0ff; 299 | /* Fallback color for IE 8 */ 300 | border: 1px solid rgba(0, 126, 255, 0.24); 301 | color: #007eff; 302 | display: inline-block; 303 | font-size: 0.9em; 304 | line-height: 1.4; 305 | margin-left: 5px; 306 | margin-top: 5px; 307 | vertical-align: top; 308 | } 309 | .Select--multi .Select-value-icon, 310 | .Select--multi .Select-value-label { 311 | display: inline-block; 312 | vertical-align: middle; 313 | } 314 | .Select--multi .Select-value-label { 315 | border-bottom-right-radius: 2px; 316 | border-top-right-radius: 2px; 317 | cursor: default; 318 | padding: 2px 5px; 319 | } 320 | .Select--multi a.Select-value-label { 321 | color: #007eff; 322 | cursor: pointer; 323 | text-decoration: none; 324 | } 325 | .Select--multi a.Select-value-label:hover { 326 | text-decoration: underline; 327 | } 328 | .Select--multi .Select-value-icon { 329 | cursor: pointer; 330 | border-bottom-left-radius: 2px; 331 | border-top-left-radius: 2px; 332 | border-right: 1px solid #c2e0ff; 333 | /* Fallback color for IE 8 */ 334 | border-right: 1px solid rgba(0, 126, 255, 0.24); 335 | padding: 1px 5px 3px; 336 | } 337 | .Select--multi .Select-value-icon:hover, 338 | .Select--multi .Select-value-icon:focus { 339 | background-color: #d8eafd; 340 | /* Fallback color for IE 8 */ 341 | background-color: rgba(0, 113, 230, 0.08); 342 | color: #0071e6; 343 | } 344 | .Select--multi .Select-value-icon:active { 345 | background-color: #c2e0ff; 346 | /* Fallback color for IE 8 */ 347 | background-color: rgba(0, 126, 255, 0.24); 348 | } 349 | .Select--multi.is-disabled .Select-value { 350 | background-color: #fcfcfc; 351 | border: 1px solid #e3e3e3; 352 | color: #333; 353 | } 354 | .Select--multi.is-disabled .Select-value-icon { 355 | cursor: not-allowed; 356 | border-right: 1px solid #e3e3e3; 357 | } 358 | .Select--multi.is-disabled .Select-value-icon:hover, 359 | .Select--multi.is-disabled .Select-value-icon:focus, 360 | .Select--multi.is-disabled .Select-value-icon:active { 361 | background-color: #fcfcfc; 362 | } 363 | @keyframes Select-animation-spin { 364 | to { 365 | transform: rotate(1turn); 366 | } 367 | } 368 | @-webkit-keyframes Select-animation-spin { 369 | to { 370 | -webkit-transform: rotate(1turn); 371 | } 372 | } 373 | -------------------------------------------------------------------------------- /meeting-client/src/styles/react-select/dist/react-select.min.css: -------------------------------------------------------------------------------- 1 | .Select,.Select-control{position:relative}.Select,.Select div,.Select input,.Select span{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.Select.is-disabled>.Select-control{background-color:#f9f9f9}.Select.is-disabled>.Select-control:hover{box-shadow:none}.Select.is-disabled .Select-arrow-zone{cursor:default;pointer-events:none;opacity:.35}.Select-control{background-color:#fff;border-radius:4px;border:1px solid #ccc;color:#333;cursor:default;display:table;border-spacing:0;border-collapse:separate;height:36px;outline:0;overflow:hidden;width:100%}.is-searchable.is-focused:not(.is-open)>.Select-control,.is-searchable.is-open>.Select-control{cursor:text}.Select-control:hover{box-shadow:0 1px 0 rgba(0,0,0,.06)}.Select-control .Select-input:focus{outline:0}.is-open>.Select-control{border-bottom-right-radius:0;border-bottom-left-radius:0;background:#fff;border-color:#b3b3b3 #ccc #d9d9d9}.is-open>.Select-control>.Select-arrow{border-color:transparent transparent #999;border-width:0 5px 5px}.is-focused:not(.is-open)>.Select-control{border-color:#007eff;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 0 3px rgba(0,126,255,.1)}.Select--single>.Select-control .Select-value,.Select-placeholder{bottom:0;color:#aaa;left:0;line-height:34px;padding-left:10px;padding-right:10px;position:absolute;right:0;top:0;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.has-value.Select--single>.Select-control .Select-value .Select-value-label,.has-value.is-pseudo-focused.Select--single>.Select-control .Select-value .Select-value-label{color:#333}.has-value.Select--single>.Select-control .Select-value a.Select-value-label,.has-value.is-pseudo-focused.Select--single>.Select-control .Select-value a.Select-value-label{cursor:pointer;text-decoration:none}.has-value.Select--single>.Select-control .Select-value a.Select-value-label:focus,.has-value.Select--single>.Select-control .Select-value a.Select-value-label:hover,.has-value.is-pseudo-focused.Select--single>.Select-control .Select-value a.Select-value-label:focus,.has-value.is-pseudo-focused.Select--single>.Select-control .Select-value a.Select-value-label:hover{color:#007eff;outline:0;text-decoration:underline}.Select-input{height:34px;padding-left:10px;padding-right:10px;vertical-align:middle}.Select-input>input{width:100%;background:none;border:0;box-shadow:none;cursor:default;display:inline-block;font-family:inherit;font-size:inherit;margin:0;outline:0;line-height:14px;padding:8px 0 12px;-webkit-appearance:none}.Select-loading,.Select-loading-zone{width:16px;position:relative;vertical-align:middle}.is-focused .Select-input>input{cursor:text}.has-value.is-pseudo-focused .Select-input{opacity:0}.Select-control:not(.is-searchable)>.Select-input{outline:0}.Select-loading-zone{cursor:pointer;display:table-cell;text-align:center}.Select-loading{-webkit-animation:Select-animation-spin .4s infinite linear;-o-animation:Select-animation-spin .4s infinite linear;animation:Select-animation-spin .4s infinite linear;height:16px;box-sizing:border-box;border-radius:50%;border:2px solid #ccc;border-right-color:#333;display:inline-block}.Select-clear-zone{-webkit-animation:Select-animation-fadeIn .2s;-o-animation:Select-animation-fadeIn .2s;animation:Select-animation-fadeIn .2s;color:#999;cursor:pointer;display:table-cell;position:relative;text-align:center;vertical-align:middle;width:17px}.Select-clear-zone:hover{color:#D0021B}.Select-clear{display:inline-block;font-size:18px;line-height:1}.Select--multi .Select-clear-zone{width:17px}.Select-arrow-zone{cursor:pointer;display:table-cell;position:relative;text-align:center;vertical-align:middle;width:25px;padding-right:5px}.Select--multi .Select-multi-value-wrapper,.Select-arrow{display:inline-block}.Select-arrow{border-color:#999 transparent transparent;border-style:solid;border-width:5px 5px 2.5px;height:0;width:0}.Select-arrow-zone:hover>.Select-arrow,.is-open .Select-arrow{border-top-color:#666}.Select .Select-aria-only{display:inline-block;height:1px;width:1px;margin:-1px;clip:rect(0,0,0,0);overflow:hidden}.Select-noresults,.Select-option{box-sizing:border-box;display:block;padding:8px 10px}@-webkit-keyframes Select-animation-fadeIn{from{opacity:0}to{opacity:1}}@keyframes Select-animation-fadeIn{from{opacity:0}to{opacity:1}}.Select-menu-outer{border-bottom-right-radius:4px;border-bottom-left-radius:4px;background-color:#fff;border:1px solid #ccc;border-top-color:#e6e6e6;box-shadow:0 1px 0 rgba(0,0,0,.06);box-sizing:border-box;margin-top:-1px;max-height:200px;position:absolute;top:100%;width:100%;z-index:1;-webkit-overflow-scrolling:touch}.Select-menu{max-height:198px;overflow-y:auto}.Select-option{background-color:#fff;color:#666;cursor:pointer}.Select-option:last-child{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.Select-option.is-selected{background-color:#f5faff;background-color:rgba(0,126,255,.04);color:#333}.Select-option.is-focused{background-color:#ebf5ff;background-color:rgba(0,126,255,.08);color:#333}.Select-option.is-disabled{color:#ccc;cursor:default}.Select-noresults{color:#999;cursor:default}.Select--multi .Select-input{vertical-align:middle;margin-left:10px;padding:0}.Select--multi.has-value .Select-input{margin-left:5px}.Select--multi .Select-value{background-color:#ebf5ff;background-color:rgba(0,126,255,.08);border-radius:2px;border:1px solid #c2e0ff;border:1px solid rgba(0,126,255,.24);color:#007eff;display:inline-block;font-size:.9em;line-height:1.4;margin-left:5px;margin-top:5px;vertical-align:top}.Select--multi .Select-value-icon,.Select--multi .Select-value-label{display:inline-block;vertical-align:middle}.Select--multi .Select-value-label{border-bottom-right-radius:2px;border-top-right-radius:2px;cursor:default;padding:2px 5px}.Select--multi a.Select-value-label{color:#007eff;cursor:pointer;text-decoration:none}.Select--multi a.Select-value-label:hover{text-decoration:underline}.Select--multi .Select-value-icon{cursor:pointer;border-bottom-left-radius:2px;border-top-left-radius:2px;border-right:1px solid #c2e0ff;border-right:1px solid rgba(0,126,255,.24);padding:1px 5px 3px}.Select--multi .Select-value-icon:focus,.Select--multi .Select-value-icon:hover{background-color:#d8eafd;background-color:rgba(0,113,230,.08);color:#0071e6}.Select--multi .Select-value-icon:active{background-color:#c2e0ff;background-color:rgba(0,126,255,.24)}.Select--multi.is-disabled .Select-value{background-color:#fcfcfc;border:1px solid #e3e3e3;color:#333}.Select--multi.is-disabled .Select-value-icon{cursor:not-allowed;border-right:1px solid #e3e3e3}.Select--multi.is-disabled .Select-value-icon:active,.Select--multi.is-disabled .Select-value-icon:focus,.Select--multi.is-disabled .Select-value-icon:hover{background-color:#fcfcfc}@keyframes Select-animation-spin{to{transform:rotate(1turn)}}@-webkit-keyframes Select-animation-spin{to{-webkit-transform:rotate(1turn)}} -------------------------------------------------------------------------------- /meeting-server/README.md: -------------------------------------------------------------------------------- 1 | ## Server Application 2 | 3 | **Techs:** Spring Boot as RESTful backend, Maven, Hibernate, MySQL 4 | 5 | **RESTful API Address:** http://localhost:8080 6 | 7 | **Employee endpoints** 8 | * HTTP GET : "localhost:8080/employees" getting all employees. 9 | * HTTP GET : "localhost:8080/employees/{id}" get an employee by id. 10 | * HTTP POST : "localhost:8080/employees" create a new employee. 11 | * HTTP PUT : "localhost:8080/employees/{id}" update an existing employee. 12 | * HTTP DELETE : "localhost:8080/employees/{id}" delete an employee by id. 13 | 14 | _Department and Meeting endpoints are similar to Employee endpoints._ 15 | 16 | **Configuration Files** 17 | 18 | `WebConfiguration.java` : CORS methods("GET", "POST", "PUT", "DELETE") allowed for development. 19 | 20 | `HibernateConfiguration.java` : Hibernate configurations 21 | 22 | **Maven Run Configurations** 23 | 24 | `clean spring-boot:run`: clean and run Spring Boot application 25 | 26 | `clean test`: clean and run tests -------------------------------------------------------------------------------- /meeting-server/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4.0.0 4 | 5 | tr.com.example 6 | meeting 7 | 0.0.1-SNAPSHOT 8 | jar 9 | 10 | meeting 11 | http://maven.apache.org 12 | 13 | 14 | UTF-8 15 | 1.8 16 | 17 | 18 | 19 | org.springframework.boot 20 | spring-boot-starter-parent 21 | 1.4.0.RELEASE 22 | 23 | 24 | 25 | 26 | org.springframework 27 | spring-core 28 | 29 | 30 | org.springframework.boot 31 | spring-boot-starter-web 32 | 33 | 34 | org.springframework.boot 35 | spring-boot-starter-test 36 | test 37 | 38 | 39 | org.springframework 40 | spring-test 41 | 42 | 43 | org.springframework 44 | spring-orm 45 | 46 | 47 | org.hamcrest 48 | hamcrest-all 49 | 1.3 50 | test 51 | 52 | 53 | org.mockito 54 | mockito-core 55 | 56 | 57 | org.hamcrest 58 | hamcrest-core 59 | 60 | 61 | test 62 | 63 | 64 | org.hibernate 65 | hibernate-core 66 | 67 | 68 | mysql 69 | mysql-connector-java 70 | 71 | 72 | 73 | 74 | 75 | 76 | org.springframework.boot 77 | spring-boot-maven-plugin 78 | 79 | 80 | 81 | 82 | 83 | 84 | spring-releases 85 | https://repo.spring.io/libs-release 86 | 87 | 88 | 89 | 90 | spring-releases 91 | https://repo.spring.io/libs-release 92 | 93 | 94 | -------------------------------------------------------------------------------- /meeting-server/src/main/java/tr/com/example/meeting/Application.java: -------------------------------------------------------------------------------- 1 | package tr.com.example.meeting; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class Application { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(Application.class, args); 11 | } 12 | } -------------------------------------------------------------------------------- /meeting-server/src/main/java/tr/com/example/meeting/configuration/HibernateConfiguration.java: -------------------------------------------------------------------------------- 1 | package tr.com.example.meeting.configuration; 2 | 3 | import java.util.Properties; 4 | 5 | import javax.sql.DataSource; 6 | 7 | import org.hibernate.SessionFactory; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.context.annotation.Bean; 10 | import org.springframework.context.annotation.ComponentScan; 11 | import org.springframework.context.annotation.Configuration; 12 | import org.springframework.context.annotation.PropertySource; 13 | import org.springframework.core.env.Environment; 14 | import org.springframework.jdbc.datasource.DriverManagerDataSource; 15 | import org.springframework.orm.hibernate5.HibernateTransactionManager; 16 | import org.springframework.orm.hibernate5.LocalSessionFactoryBean; 17 | import org.springframework.transaction.annotation.EnableTransactionManagement; 18 | 19 | @Configuration 20 | @EnableTransactionManagement 21 | @ComponentScan({ "tr.com.example.meeting.configuration" }) 22 | @PropertySource(value = { "classpath:application.properties" }) 23 | public class HibernateConfiguration { 24 | 25 | @Autowired 26 | private Environment environment; 27 | 28 | @Bean 29 | public LocalSessionFactoryBean sessionFactory() { 30 | LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 31 | sessionFactory.setDataSource(dataSource()); 32 | sessionFactory.setPackagesToScan(new String[] { "tr.com.example.meeting.domain" }); 33 | sessionFactory.setHibernateProperties(hibernateProperties()); 34 | return sessionFactory; 35 | } 36 | 37 | @Bean 38 | public DataSource dataSource() { 39 | DriverManagerDataSource dataSource = new DriverManagerDataSource(); 40 | dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName")); 41 | dataSource.setUrl(environment.getRequiredProperty("jdbc.url")); 42 | dataSource.setUsername(environment.getRequiredProperty("jdbc.username")); 43 | dataSource.setPassword(environment.getRequiredProperty("jdbc.password")); 44 | return dataSource; 45 | } 46 | 47 | private Properties hibernateProperties() { 48 | Properties properties = new Properties(); 49 | properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect")); 50 | properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql")); 51 | properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql")); 52 | // properties.put("hibernate.connection.useUnicode", "true"); 53 | // properties.put("hibernate.connection.characterEncoding", "UTF-8"); 54 | // properties.put("hibernate.connection.charSet", "UTF-8"); 55 | return properties; 56 | } 57 | 58 | @Bean 59 | @Autowired 60 | public HibernateTransactionManager transactionManager(SessionFactory s) { 61 | HibernateTransactionManager txManager = new HibernateTransactionManager(); 62 | txManager.setSessionFactory(s); 63 | return txManager; 64 | } 65 | } -------------------------------------------------------------------------------- /meeting-server/src/main/java/tr/com/example/meeting/configuration/WebConfiguration.java: -------------------------------------------------------------------------------- 1 | package tr.com.example.meeting.configuration; 2 | 3 | import org.springframework.context.annotation.Configuration; 4 | import org.springframework.web.servlet.config.annotation.CorsRegistry; 5 | import org.springframework.web.servlet.config.annotation.EnableWebMvc; 6 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 7 | 8 | @Configuration 9 | @EnableWebMvc 10 | public class WebConfiguration extends WebMvcConfigurerAdapter { 11 | @Override 12 | public void addCorsMappings(CorsRegistry registry) { 13 | registry.addMapping("/**").allowedMethods("GET", "POST", "PUT", "DELETE"); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /meeting-server/src/main/java/tr/com/example/meeting/controller/DepartmentController.java: -------------------------------------------------------------------------------- 1 | package tr.com.example.meeting.controller; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.http.HttpStatus; 7 | import org.springframework.http.ResponseEntity; 8 | import org.springframework.web.bind.annotation.DeleteMapping; 9 | import org.springframework.web.bind.annotation.GetMapping; 10 | import org.springframework.web.bind.annotation.PathVariable; 11 | import org.springframework.web.bind.annotation.PostMapping; 12 | import org.springframework.web.bind.annotation.PutMapping; 13 | import org.springframework.web.bind.annotation.RequestBody; 14 | import org.springframework.web.bind.annotation.RestController; 15 | 16 | import tr.com.example.meeting.domain.Department; 17 | import tr.com.example.meeting.service.DepartmentService; 18 | 19 | /** 20 | * Department RESTful controller for CRUD operations. 21 | * 22 | * @author ali.cavac 23 | * 24 | */ 25 | @RestController 26 | public class DepartmentController { 27 | 28 | @Autowired 29 | private DepartmentService service; 30 | 31 | @GetMapping("/departments") 32 | public ResponseEntity> getDepartments() { 33 | List departments = this.service.list(); 34 | return new ResponseEntity>(departments, HttpStatus.OK); 35 | } 36 | 37 | @GetMapping(value = "/departments/{id}") 38 | public ResponseEntity getDepartmentById(@PathVariable("id") Integer id) { 39 | Department department = this.service.findById(id); 40 | 41 | if(department == null){ 42 | return new ResponseEntity(HttpStatus.NOT_FOUND); 43 | }else{ 44 | return new ResponseEntity(department, HttpStatus.OK); 45 | } 46 | } 47 | 48 | @PostMapping(value = "/departments") 49 | public ResponseEntity addDepartment(@RequestBody Department department) { 50 | this.service.saveDepartment(department); 51 | return new ResponseEntity(department, HttpStatus.CREATED); 52 | } 53 | 54 | @PutMapping(value = "/departments/{id}") 55 | public ResponseEntity updateDepartment(@PathVariable Long id, @RequestBody Department department) { 56 | this.service.updateDepartment(department); 57 | return new ResponseEntity(department, HttpStatus.OK); 58 | } 59 | 60 | @DeleteMapping(value = "/departments/{id}") 61 | public ResponseEntity deleteDepartment(@PathVariable("id") Integer id) { 62 | this.service.deleteById(id); 63 | return new ResponseEntity(HttpStatus.NO_CONTENT); 64 | } 65 | } -------------------------------------------------------------------------------- /meeting-server/src/main/java/tr/com/example/meeting/controller/EmployeeController.java: -------------------------------------------------------------------------------- 1 | package tr.com.example.meeting.controller; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.http.HttpStatus; 7 | import org.springframework.http.ResponseEntity; 8 | import org.springframework.web.bind.annotation.DeleteMapping; 9 | import org.springframework.web.bind.annotation.GetMapping; 10 | import org.springframework.web.bind.annotation.PathVariable; 11 | import org.springframework.web.bind.annotation.PostMapping; 12 | import org.springframework.web.bind.annotation.PutMapping; 13 | import org.springframework.web.bind.annotation.RequestBody; 14 | import org.springframework.web.bind.annotation.RestController; 15 | 16 | import tr.com.example.meeting.domain.Employee; 17 | import tr.com.example.meeting.service.EmployeeService; 18 | 19 | /** 20 | * Employee RESTful controller for CRUD operations. 21 | * 22 | * @author ali.cavac 23 | * 24 | */ 25 | @RestController 26 | public class EmployeeController { 27 | 28 | @Autowired 29 | private EmployeeService service; 30 | 31 | @GetMapping("/employees") 32 | public ResponseEntity> employee() { 33 | List employees = this.service.list(); 34 | return new ResponseEntity>(employees, HttpStatus.OK); 35 | } 36 | 37 | @GetMapping(value = "/employees/{id}") 38 | public ResponseEntity getEmployeeById(@PathVariable("id") Integer id) { 39 | Employee employee = this.service.findById(id); 40 | if(employee == null){ 41 | return new ResponseEntity(HttpStatus.NOT_FOUND); 42 | }else{ 43 | return new ResponseEntity(employee, HttpStatus.OK); 44 | } 45 | } 46 | 47 | @PostMapping(value = "/employees") 48 | public ResponseEntity addEmployee(@RequestBody Employee employee) { 49 | //TODO: check result 50 | this.service.saveEmployee(employee); 51 | return new ResponseEntity(employee, HttpStatus.CREATED); 52 | } 53 | 54 | @PutMapping(value = "/employees/{id}") 55 | public ResponseEntity updateEmployee(@PathVariable Integer id, @RequestBody Employee employee) { 56 | //TODO: check result 57 | this.service.updateEmployee(employee); 58 | return new ResponseEntity(employee, HttpStatus.OK); 59 | } 60 | 61 | @DeleteMapping(value = "/employees/{id}") 62 | public ResponseEntity deleteEmployee(@PathVariable("id") Integer id) { 63 | //TODO: check result 64 | this.service.deleteById(id); 65 | return new ResponseEntity(HttpStatus.NO_CONTENT); 66 | } 67 | } -------------------------------------------------------------------------------- /meeting-server/src/main/java/tr/com/example/meeting/controller/MeetingController.java: -------------------------------------------------------------------------------- 1 | package tr.com.example.meeting.controller; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.http.HttpStatus; 7 | import org.springframework.http.ResponseEntity; 8 | import org.springframework.web.bind.annotation.DeleteMapping; 9 | import org.springframework.web.bind.annotation.GetMapping; 10 | import org.springframework.web.bind.annotation.PathVariable; 11 | import org.springframework.web.bind.annotation.PostMapping; 12 | import org.springframework.web.bind.annotation.PutMapping; 13 | import org.springframework.web.bind.annotation.RequestBody; 14 | import org.springframework.web.bind.annotation.RestController; 15 | 16 | import tr.com.example.meeting.domain.Meeting; 17 | import tr.com.example.meeting.service.MeetingService; 18 | 19 | /** 20 | * Meeting RESTful controller for CRUD operations. 21 | * 22 | * @author ali.cavac 23 | * 24 | */ 25 | @RestController 26 | public class MeetingController { 27 | 28 | @Autowired 29 | private MeetingService service; 30 | 31 | @GetMapping("/meetings") 32 | public ResponseEntity> getMeetings() { 33 | List meetings = this.service.list(); 34 | return new ResponseEntity>(meetings, HttpStatus.OK); 35 | } 36 | 37 | @GetMapping(value = "/meetings/{id}") 38 | public ResponseEntity getMeetingById(@PathVariable("id") Integer id) { 39 | Meeting meeting = this.service.findById(id); 40 | 41 | if(meeting == null){ 42 | return new ResponseEntity(HttpStatus.NOT_FOUND); 43 | }else{ 44 | return new ResponseEntity(meeting, HttpStatus.OK); 45 | } 46 | } 47 | 48 | @PostMapping(value = "/meetings") 49 | public ResponseEntity addMeeting(@RequestBody Meeting meeting) { 50 | this.service.saveMeeting(meeting); 51 | return new ResponseEntity(meeting, HttpStatus.CREATED); 52 | } 53 | 54 | @PutMapping(value = "/meetings/{id}") 55 | public ResponseEntity updateMeeting(@PathVariable Long id, @RequestBody Meeting meeting) { 56 | this.service.updateMeeting(meeting); 57 | return new ResponseEntity(meeting, HttpStatus.OK); 58 | } 59 | 60 | @DeleteMapping(value = "/meetings/{id}") 61 | public ResponseEntity deleteMeeting(@PathVariable("id") Integer id) { 62 | this.service.deleteById(id); 63 | return new ResponseEntity(HttpStatus.NO_CONTENT); 64 | } 65 | } -------------------------------------------------------------------------------- /meeting-server/src/main/java/tr/com/example/meeting/dao/AbstractDao.java: -------------------------------------------------------------------------------- 1 | package tr.com.example.meeting.dao; 2 | 3 | import java.io.Serializable; 4 | import java.lang.reflect.ParameterizedType; 5 | import java.util.List; 6 | 7 | import org.hibernate.Criteria; 8 | import org.hibernate.HibernateException; 9 | import org.hibernate.Session; 10 | import org.hibernate.SessionFactory; 11 | import org.springframework.beans.factory.annotation.Autowired; 12 | 13 | /** 14 | * Abstract DAO. 15 | * 16 | * @author ali.cavac 17 | * 18 | */ 19 | public abstract class AbstractDao { 20 | 21 | private final Class persistentClass; 22 | 23 | @SuppressWarnings("unchecked") 24 | public AbstractDao(){ 25 | this.persistentClass =(Class) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[1]; 26 | } 27 | 28 | @Autowired 29 | private SessionFactory sessionFactory; 30 | 31 | protected Session getSession() { 32 | return sessionFactory.getCurrentSession(); 33 | } 34 | 35 | protected Criteria createEntityCriteria() { 36 | return getSession().createCriteria(this.persistentClass); 37 | } 38 | 39 | public T getByKey(PK key) { 40 | try { 41 | T result = (T) getSession().get(persistentClass, key); 42 | return result; 43 | } catch (HibernateException e) { 44 | return null; 45 | } 46 | } 47 | 48 | public Boolean persist(T entity) { 49 | try { 50 | getSession().persist(entity); 51 | return true; 52 | } catch (HibernateException e) { 53 | return false; 54 | } 55 | } 56 | 57 | public Boolean update(T entity) { 58 | try { 59 | getSession().update(entity); 60 | return true; 61 | } catch (HibernateException e) { 62 | return false; 63 | } 64 | } 65 | 66 | public Boolean delete(T entity) { 67 | try { 68 | getSession().delete(entity); 69 | return true; 70 | } catch (HibernateException e) { 71 | return false; 72 | } 73 | } 74 | 75 | public List list() { 76 | try { 77 | @SuppressWarnings("unchecked") 78 | List list = this.createEntityCriteria().list(); 79 | return list; 80 | } catch (HibernateException e) { 81 | return null; 82 | } 83 | } 84 | } -------------------------------------------------------------------------------- /meeting-server/src/main/java/tr/com/example/meeting/dao/DepartmentDAO.java: -------------------------------------------------------------------------------- 1 | package tr.com.example.meeting.dao; 2 | 3 | import org.springframework.stereotype.Repository; 4 | 5 | import tr.com.example.meeting.domain.Department; 6 | 7 | /** 8 | * Department DAO. 9 | * 10 | * @author ali.cavac 11 | * 12 | */ 13 | @Repository("departmentDAO") 14 | public class DepartmentDAO extends AbstractDao { 15 | 16 | public Department findById(Integer id) { 17 | Department department = getByKey(id); 18 | return department; 19 | } 20 | 21 | public Boolean save(Department department) { 22 | Boolean result = persist(department); 23 | return result; 24 | } 25 | } -------------------------------------------------------------------------------- /meeting-server/src/main/java/tr/com/example/meeting/dao/EmployeeDAO.java: -------------------------------------------------------------------------------- 1 | package tr.com.example.meeting.dao; 2 | 3 | import org.springframework.stereotype.Repository; 4 | 5 | import tr.com.example.meeting.domain.Employee; 6 | 7 | /** 8 | * Employee DAO. 9 | * 10 | * @author ali.cavac 11 | * 12 | */ 13 | @Repository("employeeDAO") 14 | public class EmployeeDAO extends AbstractDao { 15 | 16 | public Employee findById(Integer id) { 17 | Employee employee = getByKey(id); 18 | return employee; 19 | } 20 | 21 | public Boolean save(Employee employee) { 22 | Boolean result = persist(employee); 23 | return result; 24 | } 25 | } -------------------------------------------------------------------------------- /meeting-server/src/main/java/tr/com/example/meeting/dao/MeetingDAO.java: -------------------------------------------------------------------------------- 1 | package tr.com.example.meeting.dao; 2 | 3 | import org.springframework.stereotype.Repository; 4 | 5 | import tr.com.example.meeting.domain.Meeting; 6 | 7 | /** 8 | * Meeting DAO. 9 | * 10 | * @author ali.cavac 11 | * 12 | */ 13 | @Repository("meetingDAO") 14 | public class MeetingDAO extends AbstractDao { 15 | 16 | public Meeting findById(Integer id) { 17 | Meeting meeting = getByKey(id); 18 | return meeting; 19 | } 20 | 21 | public Boolean save(Meeting meeting) { 22 | Boolean result = persist(meeting); 23 | return result; 24 | } 25 | } -------------------------------------------------------------------------------- /meeting-server/src/main/java/tr/com/example/meeting/domain/Department.java: -------------------------------------------------------------------------------- 1 | package tr.com.example.meeting.domain; 2 | 3 | import java.io.Serializable; 4 | import java.util.List; 5 | 6 | import javax.persistence.Column; 7 | import javax.persistence.Entity; 8 | import javax.persistence.FetchType; 9 | import javax.persistence.GeneratedValue; 10 | import javax.persistence.GenerationType; 11 | import javax.persistence.Id; 12 | import javax.persistence.OneToMany; 13 | import javax.persistence.Table; 14 | 15 | import org.hibernate.annotations.Fetch; 16 | import org.hibernate.annotations.FetchMode; 17 | import org.hibernate.validator.constraints.NotEmpty; 18 | 19 | /** 20 | * Department Entity. 21 | * 22 | * @author ali.cavac 23 | * 24 | */ 25 | @Entity 26 | @Table(name = "DEPARTMENT") 27 | //@JsonIdentityInfo( 28 | // generator = ObjectIdGenerators.PropertyGenerator.class, 29 | // property = "id", scope = Department.class) 30 | public class Department implements Serializable { 31 | 32 | private static final long serialVersionUID = 1L; 33 | 34 | @Id 35 | @Column(name="DEPARTMENT_ID", unique = true, nullable = false) 36 | @GeneratedValue(strategy = GenerationType.IDENTITY) 37 | private Integer id; 38 | 39 | @NotEmpty 40 | @Column(name="NAME", nullable=false) 41 | private String name; 42 | 43 | @Column(name="DESCRIPTION") 44 | private String description; 45 | 46 | @OneToMany(/*cascade=CascadeType.ALL, */mappedBy = "departmentId", fetch = FetchType.EAGER) 47 | // @Fetch(value = FetchMode.SUBSELECT) 48 | @Fetch(value = FetchMode.SELECT) 49 | private List employees; 50 | 51 | // @JsonBackReference 52 | // @ManyToMany(/*cascade=CascadeType.ALL, */fetch = FetchType.LAZY) 53 | // @Fetch(value = FetchMode.SUBSELECT) 54 | // @JoinTable(name = "DEPARTMENT_MEETING", joinColumns = { @JoinColumn(name = "DEPARTMENT_ID") }, inverseJoinColumns = { @JoinColumn(name = "MEETING_ID") }) 55 | // private List meetings; 56 | 57 | public Department() {} 58 | 59 | public Department(Integer id, String name, String description) { 60 | this.id = id; 61 | this.name = name; 62 | this.description = description; 63 | } 64 | 65 | public Integer getId() { 66 | return id; 67 | } 68 | 69 | public void setId(Integer id) { 70 | this.id = id; 71 | } 72 | 73 | public String getName() { 74 | return name; 75 | } 76 | 77 | public void setName(String name) { 78 | this.name = name; 79 | } 80 | 81 | public String getDescription() { 82 | return description; 83 | } 84 | 85 | public void setDescription(String description) { 86 | this.description = description; 87 | } 88 | 89 | public List getEmployees() { 90 | return employees; 91 | } 92 | 93 | public void setEmployees(List employees) { 94 | this.employees = employees; 95 | } 96 | 97 | // public List getMeetings() { 98 | // return meetings; 99 | // } 100 | // 101 | // public void setMeetings(List meetings) { 102 | // this.meetings = meetings; 103 | // } 104 | 105 | @Override 106 | public int hashCode() { 107 | final int prime = 31; 108 | int result = 1; 109 | result = prime * result + ((description == null) ? 0 : description.hashCode()); 110 | result = prime * result + ((employees == null) ? 0 : employees.hashCode()); 111 | result = prime * result + ((id == null) ? 0 : id.hashCode()); 112 | result = prime * result + ((name == null) ? 0 : name.hashCode()); 113 | return result; 114 | } 115 | 116 | @Override 117 | public boolean equals(Object obj) { 118 | if (this == obj) 119 | return true; 120 | if (obj == null) 121 | return false; 122 | if (getClass() != obj.getClass()) 123 | return false; 124 | Department other = (Department) obj; 125 | if (description == null) { 126 | if (other.description != null) 127 | return false; 128 | } else if (!description.equals(other.description)) 129 | return false; 130 | if (employees == null) { 131 | if (other.employees != null) 132 | return false; 133 | } else if (!employees.equals(other.employees)) 134 | return false; 135 | if (id == null) { 136 | if (other.id != null) 137 | return false; 138 | } else if (!id.equals(other.id)) 139 | return false; 140 | if (name == null) { 141 | if (other.name != null) 142 | return false; 143 | } else if (!name.equals(other.name)) 144 | return false; 145 | return true; 146 | } 147 | } -------------------------------------------------------------------------------- /meeting-server/src/main/java/tr/com/example/meeting/domain/Employee.java: -------------------------------------------------------------------------------- 1 | package tr.com.example.meeting.domain; 2 | 3 | import java.io.Serializable; 4 | 5 | import javax.persistence.Column; 6 | import javax.persistence.Entity; 7 | import javax.persistence.GeneratedValue; 8 | import javax.persistence.GenerationType; 9 | import javax.persistence.Id; 10 | import javax.persistence.Table; 11 | import javax.validation.constraints.NotNull; 12 | 13 | import org.hibernate.validator.constraints.NotEmpty; 14 | 15 | /** 16 | * Employee Entity. 17 | * 18 | * @author ali.cavac 19 | * 20 | */ 21 | @Entity 22 | @Table(name = "EMPLOYEE") 23 | //@JsonIdentityInfo( 24 | // generator = ObjectIdGenerators.PropertyGenerator.class, 25 | // property = "id", scope = Employee.class) 26 | public class Employee implements Serializable { 27 | 28 | private static final long serialVersionUID = 1L; 29 | 30 | @Id 31 | @Column(name="EMPLOYEE_ID", unique = true, nullable = false) 32 | @GeneratedValue(strategy = GenerationType.IDENTITY) 33 | private Integer id; 34 | 35 | @NotEmpty 36 | @Column(name="NAME", nullable=false) 37 | private String name; 38 | 39 | @NotEmpty 40 | @Column(name="SURNAME", nullable=false) 41 | private String surname; 42 | 43 | @NotNull 44 | @Column(name="SALARY", nullable=false) 45 | private Integer salary; 46 | 47 | @Column(name="DEPARTMENT_ID") 48 | private Integer departmentId; 49 | 50 | /* 51 | @JsonIgnore 52 | @ManyToOne(fetch = FetchType.LAZY) 53 | @JoinColumn(name = "DEPARTMENT_ID", referencedColumnName = "DEPARTMENT_ID") 54 | private Department department; 55 | */ 56 | 57 | public Employee() {} 58 | 59 | public Employee(Integer id, String name, String surname, Integer salary, Integer departmentId) { 60 | super(); 61 | this.id = id; 62 | this.name = name; 63 | this.surname = surname; 64 | this.salary = salary; 65 | this.departmentId = departmentId; 66 | } 67 | 68 | 69 | 70 | public Integer getId() { 71 | return id; 72 | } 73 | 74 | public void setId(Integer id) { 75 | this.id = id; 76 | } 77 | 78 | public String getName() { 79 | return name; 80 | } 81 | 82 | public void setName(String name) { 83 | this.name = name; 84 | } 85 | 86 | public String getSurname() { 87 | return surname; 88 | } 89 | 90 | public void setSurname(String surname) { 91 | this.surname = surname; 92 | } 93 | 94 | public Integer getSalary() { 95 | return salary; 96 | } 97 | 98 | public void setSalary(Integer salary) { 99 | this.salary = salary; 100 | } 101 | 102 | public Integer getDepartmentId() { 103 | return departmentId; 104 | } 105 | 106 | public void setDepartmentId(Integer departmentId) { 107 | this.departmentId = departmentId; 108 | } 109 | 110 | // public Department getDepartment() { 111 | // return department; 112 | // } 113 | // 114 | // public void setDepartment(Department department) { 115 | // this.department = department; 116 | // } 117 | 118 | @Override 119 | public int hashCode() { 120 | final int prime = 31; 121 | int result = 1; 122 | result = prime * result + ((departmentId == null) ? 0 : departmentId.hashCode()); 123 | result = prime * result + ((id == null) ? 0 : id.hashCode()); 124 | result = prime * result + ((name == null) ? 0 : name.hashCode()); 125 | result = prime * result + ((salary == null) ? 0 : salary.hashCode()); 126 | result = prime * result + ((surname == null) ? 0 : surname.hashCode()); 127 | return result; 128 | } 129 | 130 | @Override 131 | public boolean equals(Object obj) { 132 | if (this == obj) 133 | return true; 134 | if (obj == null) 135 | return false; 136 | if (getClass() != obj.getClass()) 137 | return false; 138 | Employee other = (Employee) obj; 139 | if (departmentId == null) { 140 | if (other.departmentId != null) 141 | return false; 142 | } else if (!departmentId.equals(other.departmentId)) 143 | return false; 144 | if (id == null) { 145 | if (other.id != null) 146 | return false; 147 | } else if (!id.equals(other.id)) 148 | return false; 149 | if (name == null) { 150 | if (other.name != null) 151 | return false; 152 | } else if (!name.equals(other.name)) 153 | return false; 154 | if (salary == null) { 155 | if (other.salary != null) 156 | return false; 157 | } else if (!salary.equals(other.salary)) 158 | return false; 159 | if (surname == null) { 160 | if (other.surname != null) 161 | return false; 162 | } else if (!surname.equals(other.surname)) 163 | return false; 164 | return true; 165 | } 166 | } -------------------------------------------------------------------------------- /meeting-server/src/main/java/tr/com/example/meeting/domain/Meeting.java: -------------------------------------------------------------------------------- 1 | package tr.com.example.meeting.domain; 2 | 3 | import java.io.Serializable; 4 | import java.util.List; 5 | 6 | import javax.persistence.Column; 7 | import javax.persistence.Entity; 8 | import javax.persistence.FetchType; 9 | import javax.persistence.GeneratedValue; 10 | import javax.persistence.GenerationType; 11 | import javax.persistence.Id; 12 | import javax.persistence.JoinColumn; 13 | import javax.persistence.JoinTable; 14 | import javax.persistence.ManyToMany; 15 | import javax.persistence.Table; 16 | 17 | import org.hibernate.annotations.Fetch; 18 | import org.hibernate.annotations.FetchMode; 19 | import org.hibernate.validator.constraints.NotEmpty; 20 | 21 | /** 22 | * Meeting Entity. 23 | * 24 | * @author ali.cavac 25 | * 26 | */ 27 | @Entity 28 | @Table(name = "MEETING") 29 | //@JsonIdentityInfo( 30 | // generator = ObjectIdGenerators.PropertyGenerator.class, 31 | // property = "id", scope = Meeting.class) 32 | public class Meeting implements Serializable { 33 | 34 | private static final long serialVersionUID = 1L; 35 | 36 | @Id 37 | @Column(name="MEETING_ID", unique = true, nullable = false) 38 | @GeneratedValue(strategy = GenerationType.IDENTITY) 39 | private Integer id; 40 | 41 | @NotEmpty 42 | @Column(name="NAME", nullable=false) 43 | private String name; 44 | 45 | @Column(name="DESCRIPTION") 46 | private String description; 47 | 48 | // @JsonManagedReference 49 | @ManyToMany(fetch = FetchType.EAGER) 50 | @JoinTable(name = "DEPARTMENT_MEETING", joinColumns = { @JoinColumn(name = "MEETING_ID") }, inverseJoinColumns = { @JoinColumn(name = "DEPARTMENT_ID") }) 51 | @Fetch (FetchMode.SELECT) 52 | private List departments; 53 | 54 | public Meeting() {} 55 | 56 | public Meeting(Integer id, String name, String description, List departments) { 57 | this.id = id; 58 | this.name = name; 59 | this.description = description; 60 | this.departments = departments; 61 | } 62 | 63 | public Integer getId() { 64 | return id; 65 | } 66 | 67 | public void setId(Integer id) { 68 | this.id = id; 69 | } 70 | 71 | public String getName() { 72 | return name; 73 | } 74 | 75 | public void setName(String name) { 76 | this.name = name; 77 | } 78 | 79 | public String getDescription() { 80 | return description; 81 | } 82 | 83 | public void setDescription(String description) { 84 | this.description = description; 85 | } 86 | 87 | public List getDepartments() { 88 | return departments; 89 | } 90 | 91 | public void setDepartments(List departments) { 92 | this.departments = departments; 93 | } 94 | 95 | @Override 96 | public int hashCode() { 97 | final int prime = 31; 98 | int result = 1; 99 | result = prime * result + ((departments == null) ? 0 : departments.hashCode()); 100 | result = prime * result + ((description == null) ? 0 : description.hashCode()); 101 | result = prime * result + ((id == null) ? 0 : id.hashCode()); 102 | result = prime * result + ((name == null) ? 0 : name.hashCode()); 103 | return result; 104 | } 105 | 106 | @Override 107 | public boolean equals(Object obj) { 108 | if (this == obj) 109 | return true; 110 | if (obj == null) 111 | return false; 112 | if (getClass() != obj.getClass()) 113 | return false; 114 | Meeting other = (Meeting) obj; 115 | if (departments == null) { 116 | if (other.departments != null) 117 | return false; 118 | } else if (!departments.equals(other.departments)) 119 | return false; 120 | if (description == null) { 121 | if (other.description != null) 122 | return false; 123 | } else if (!description.equals(other.description)) 124 | return false; 125 | if (id == null) { 126 | if (other.id != null) 127 | return false; 128 | } else if (!id.equals(other.id)) 129 | return false; 130 | if (name == null) { 131 | if (other.name != null) 132 | return false; 133 | } else if (!name.equals(other.name)) 134 | return false; 135 | return true; 136 | } 137 | 138 | } -------------------------------------------------------------------------------- /meeting-server/src/main/java/tr/com/example/meeting/service/DepartmentService.java: -------------------------------------------------------------------------------- 1 | package tr.com.example.meeting.service; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.stereotype.Service; 7 | import org.springframework.transaction.annotation.Transactional; 8 | 9 | import tr.com.example.meeting.dao.DepartmentDAO; 10 | import tr.com.example.meeting.domain.Department; 11 | 12 | /** 13 | * Department service. 14 | * 15 | * @author ali.cavac 16 | * 17 | */ 18 | @Transactional 19 | @Service("departmentService") 20 | public class DepartmentService { 21 | 22 | @Autowired 23 | private DepartmentDAO dao; 24 | 25 | public List list() { 26 | return dao.list(); 27 | } 28 | 29 | public Department findById(Integer id) { 30 | return dao.findById(id); 31 | } 32 | 33 | public Boolean saveDepartment(Department department) { 34 | Boolean result = dao.save(department); 35 | return result; 36 | } 37 | 38 | public Boolean updateDepartment(Department department) { 39 | Department entity = dao.findById(department.getId()); 40 | if(entity != null){ 41 | entity.setName(department.getName()); 42 | entity.setDescription(department.getDescription()); 43 | entity.setEmployees(department.getEmployees()); 44 | // entity.setMeetings(department.getMeetings()); 45 | dao.update(entity); 46 | return true; 47 | }else{ 48 | return false; 49 | } 50 | } 51 | 52 | public Boolean deleteById(Integer id) { 53 | Department entity = dao.findById(id); 54 | if(entity != null){ 55 | dao.delete(entity); 56 | return true; 57 | }else{ 58 | return false; 59 | } 60 | } 61 | } -------------------------------------------------------------------------------- /meeting-server/src/main/java/tr/com/example/meeting/service/EmployeeService.java: -------------------------------------------------------------------------------- 1 | package tr.com.example.meeting.service; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.stereotype.Service; 7 | import org.springframework.transaction.annotation.Transactional; 8 | 9 | import tr.com.example.meeting.dao.EmployeeDAO; 10 | import tr.com.example.meeting.domain.Employee; 11 | 12 | /** 13 | * Employee service. 14 | * 15 | * @author ali.cavac 16 | * 17 | */ 18 | @Transactional 19 | @Service("employeeService") 20 | public class EmployeeService { 21 | 22 | @Autowired 23 | private EmployeeDAO dao; 24 | 25 | public List list() { 26 | return dao.list(); 27 | } 28 | 29 | public Employee findById(Integer id) { 30 | return dao.findById(id); 31 | } 32 | 33 | public Boolean saveEmployee(Employee employee) { 34 | Boolean result = dao.save(employee); 35 | return result; 36 | } 37 | 38 | public Boolean updateEmployee(Employee employee) { 39 | Employee entity = dao.findById(employee.getId()); 40 | if(entity != null){ 41 | entity.setName(employee.getName()); 42 | entity.setSurname(employee.getSurname()); 43 | entity.setSalary(employee.getSalary()); 44 | entity.setDepartmentId(employee.getDepartmentId()); 45 | dao.update(entity); 46 | return true; 47 | }else{ 48 | return false; 49 | } 50 | } 51 | 52 | public Boolean deleteById(Integer id) { 53 | Employee entity = dao.findById(id); 54 | if(entity != null){ 55 | dao.delete(entity); 56 | return true; 57 | }else{ 58 | return false; 59 | } 60 | } 61 | } -------------------------------------------------------------------------------- /meeting-server/src/main/java/tr/com/example/meeting/service/MeetingService.java: -------------------------------------------------------------------------------- 1 | package tr.com.example.meeting.service; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.stereotype.Service; 7 | import org.springframework.transaction.annotation.Transactional; 8 | 9 | import tr.com.example.meeting.dao.MeetingDAO; 10 | import tr.com.example.meeting.domain.Meeting; 11 | 12 | /** 13 | * Meeting service. 14 | * 15 | * @author ali.cavac 16 | * 17 | */ 18 | @Transactional 19 | @Service("meetingService") 20 | public class MeetingService { 21 | 22 | @Autowired 23 | private MeetingDAO dao; 24 | 25 | public List list() { 26 | return dao.list(); 27 | } 28 | 29 | public Meeting findById(Integer id) { 30 | return dao.findById(id); 31 | } 32 | 33 | public Boolean saveMeeting(Meeting meeting) { 34 | Boolean result = dao.save(meeting); 35 | return result; 36 | } 37 | 38 | public Boolean updateMeeting(Meeting meeting) { 39 | Meeting entity = dao.findById(meeting.getId()); 40 | if(entity != null){ 41 | entity.setName(meeting.getName()); 42 | entity.setDescription(meeting.getDescription()); 43 | entity.setDepartments(meeting.getDepartments()); 44 | dao.update(entity); 45 | return true; 46 | }else{ 47 | return false; 48 | } 49 | } 50 | 51 | public Boolean deleteById(Integer id) { 52 | Meeting entity = dao.findById(id); 53 | if(entity != null){ 54 | dao.delete(entity); 55 | return true; 56 | }else{ 57 | return false; 58 | } 59 | } 60 | } -------------------------------------------------------------------------------- /meeting-server/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | jdbc.driverClassName = com.mysql.jdbc.Driver 2 | jdbc.url = jdbc:mysql://127.0.0.1:3306/db_meeting?useUnicode=true&characterEncoding=UTF-8 3 | jdbc.username = root 4 | jdbc.password = 5 | hibernate.dialect = org.hibernate.dialect.MySQLDialect 6 | hibernate.show_sql = true 7 | hibernate.format_sql = true -------------------------------------------------------------------------------- /meeting-server/src/test/java/tr/com/example/meeting/controller/DepartmentControllerTest.java: -------------------------------------------------------------------------------- 1 | package tr.com.example.meeting.controller; 2 | 3 | import static org.hamcrest.Matchers.hasSize; 4 | import static org.hamcrest.Matchers.is; 5 | import static org.mockito.Mockito.times; 6 | import static org.mockito.Mockito.verify; 7 | import static org.mockito.Mockito.verifyNoMoreInteractions; 8 | import static org.mockito.Mockito.when; 9 | import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; 10 | import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; 11 | import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; 12 | import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; 13 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; 14 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; 15 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; 16 | 17 | import java.util.Arrays; 18 | import java.util.List; 19 | 20 | import org.junit.Before; 21 | import org.junit.Test; 22 | import org.junit.runner.RunWith; 23 | import org.mockito.InjectMocks; 24 | import org.mockito.Mock; 25 | import org.mockito.MockitoAnnotations; 26 | import org.springframework.boot.test.context.SpringBootTest; 27 | import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; 28 | import org.springframework.http.MediaType; 29 | import org.springframework.test.context.junit4.SpringRunner; 30 | import org.springframework.test.web.servlet.MockMvc; 31 | import org.springframework.test.web.servlet.setup.MockMvcBuilders; 32 | 33 | import com.fasterxml.jackson.databind.ObjectMapper; 34 | 35 | import tr.com.example.meeting.domain.Department; 36 | import tr.com.example.meeting.service.DepartmentService; 37 | 38 | /** 39 | * Tests for DepartmentController RESTful endpoints. 40 | * 41 | * @author ali.cavac 42 | * 43 | */ 44 | @RunWith(SpringRunner.class) 45 | @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) 46 | public class DepartmentControllerTest { 47 | 48 | private MockMvc mockMvc; 49 | 50 | @Mock 51 | private DepartmentService departmentService; 52 | 53 | @InjectMocks 54 | private DepartmentController departmentController; 55 | 56 | @Before 57 | public void setup() { 58 | MockitoAnnotations.initMocks(this); 59 | mockMvc = MockMvcBuilders 60 | .standaloneSetup(departmentController) 61 | .build(); 62 | } 63 | 64 | @Test 65 | public void test_get_all_success() throws Exception { 66 | List departments = Arrays.asList( 67 | new Department(1, "Engineering", "Engineering Department"), 68 | new Department(2, "Design", "Design Department")); 69 | 70 | when(departmentService.list()).thenReturn(departments); 71 | 72 | mockMvc.perform(get("/departments")) 73 | .andExpect(status().isOk()) 74 | .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)) 75 | .andExpect(jsonPath("$", hasSize(2))) 76 | .andExpect(jsonPath("$[0].id", is(1))) 77 | .andExpect(jsonPath("$[0].name", is("Engineering"))) 78 | .andExpect(jsonPath("$[1].id", is(2))) 79 | .andExpect(jsonPath("$[1].name", is("Design"))); 80 | 81 | verify(departmentService, times(1)).list(); 82 | verifyNoMoreInteractions(departmentService); 83 | } 84 | 85 | @Test 86 | public void test_get_by_id_success() throws Exception { 87 | Department department = new Department(1, "Design", "Design Department"); 88 | when(departmentService.findById(1)).thenReturn(department); 89 | 90 | mockMvc.perform(get("/departments/{id}", 1)) 91 | .andExpect(status().isOk()) 92 | .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)) 93 | .andExpect(jsonPath("$.id", is(1))) 94 | .andExpect(jsonPath("$.name", is("Design"))); 95 | 96 | verify(departmentService, times(1)).findById(1); 97 | verifyNoMoreInteractions(departmentService); 98 | } 99 | 100 | @Test 101 | public void test_get_by_id_fail_404_not_found() throws Exception { 102 | when(departmentService.findById(1)).thenReturn(null); 103 | 104 | mockMvc.perform(get("/departments/{id}", 1)) 105 | .andExpect(status().isNotFound()); 106 | 107 | verify(departmentService, times(1)).findById(1); 108 | verifyNoMoreInteractions(departmentService); 109 | } 110 | 111 | @Test 112 | public void test_create_success() throws Exception { 113 | Department department = new Department(2, "Design", "Design Department"); 114 | when(departmentService.saveDepartment(department)).thenReturn(Boolean.TRUE); 115 | 116 | mockMvc.perform(post("/departments") 117 | .contentType(MediaType.APPLICATION_JSON) 118 | .content(asJsonString(department))) 119 | .andExpect(status().isCreated()); 120 | 121 | verify(departmentService, times(1)).saveDepartment(department); 122 | verifyNoMoreInteractions(departmentService); 123 | } 124 | 125 | @Test 126 | public void test_update_success() throws Exception { 127 | Department department = new Department(2, "Design", "Design Department"); 128 | when(departmentService.updateDepartment(department)).thenReturn(Boolean.TRUE); 129 | 130 | mockMvc.perform( 131 | put("/departments/{id}", department.getId()) 132 | .contentType(MediaType.APPLICATION_JSON) 133 | .content(asJsonString(department))) 134 | .andExpect(status().isOk()); 135 | 136 | verify(departmentService, times(1)).updateDepartment(department); 137 | verifyNoMoreInteractions(departmentService); 138 | } 139 | 140 | @Test 141 | public void test_delete_success() throws Exception { 142 | Department department = new Department(1, "Design", "Design Department"); 143 | when(departmentService.deleteById(department.getId())).thenReturn(Boolean.TRUE); 144 | 145 | mockMvc.perform( 146 | delete("/departments/{id}", department.getId())) 147 | .andExpect(status().isNoContent()); 148 | 149 | verify(departmentService, times(1)).deleteById(department.getId()); 150 | verifyNoMoreInteractions(departmentService); 151 | } 152 | 153 | public static String asJsonString(final Object obj) { 154 | try { 155 | final ObjectMapper mapper = new ObjectMapper(); 156 | return mapper.writeValueAsString(obj); 157 | } catch (Exception e) { 158 | throw new RuntimeException(e); 159 | } 160 | } 161 | } 162 | -------------------------------------------------------------------------------- /meeting-server/src/test/java/tr/com/example/meeting/controller/EmployeeControllerTest.java: -------------------------------------------------------------------------------- 1 | package tr.com.example.meeting.controller; 2 | 3 | import static org.mockito.Mockito.*; 4 | import static org.hamcrest.Matchers.*; 5 | import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; 6 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; 7 | 8 | import java.util.Arrays; 9 | import java.util.List; 10 | 11 | import org.junit.Before; 12 | import org.junit.Test; 13 | import org.junit.runner.RunWith; 14 | import org.mockito.InjectMocks; 15 | import org.mockito.Mock; 16 | import org.mockito.MockitoAnnotations; 17 | import org.springframework.boot.test.context.SpringBootTest; 18 | import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; 19 | import org.springframework.http.MediaType; 20 | import org.springframework.test.context.junit4.SpringRunner; 21 | import org.springframework.test.web.servlet.MockMvc; 22 | import org.springframework.test.web.servlet.setup.MockMvcBuilders; 23 | 24 | import com.fasterxml.jackson.databind.ObjectMapper; 25 | 26 | import tr.com.example.meeting.domain.Employee; 27 | import tr.com.example.meeting.service.EmployeeService; 28 | 29 | /** 30 | * Tests for EmployeeController RESTful endpoints. 31 | * 32 | * @author ali.cavac 33 | * 34 | */ 35 | @RunWith(SpringRunner.class) 36 | @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) 37 | public class EmployeeControllerTest { 38 | 39 | private MockMvc mockMvc; 40 | 41 | @Mock 42 | private EmployeeService employeeService; 43 | 44 | @InjectMocks 45 | private EmployeeController employeeController; 46 | 47 | @Before 48 | public void setup() { 49 | MockitoAnnotations.initMocks(this); 50 | mockMvc = MockMvcBuilders 51 | .standaloneSetup(employeeController) 52 | .build(); 53 | } 54 | 55 | @Test 56 | public void test_get_all_success() throws Exception { 57 | List employees = Arrays.asList( 58 | new Employee(1, "Ali", "CAVAC", 12000, 1), 59 | new Employee(2, "Veli", "YILDIZ", 10000, 1)); 60 | 61 | when(employeeService.list()).thenReturn(employees); 62 | 63 | mockMvc.perform(get("/employees")) 64 | .andExpect(status().isOk()) 65 | .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)) 66 | .andExpect(jsonPath("$", hasSize(2))) 67 | .andExpect(jsonPath("$[0].id", is(1))) 68 | .andExpect(jsonPath("$[0].name", is("Ali"))) 69 | .andExpect(jsonPath("$[1].id", is(2))) 70 | .andExpect(jsonPath("$[1].name", is("Veli"))); 71 | 72 | verify(employeeService, times(1)).list(); 73 | verifyNoMoreInteractions(employeeService); 74 | } 75 | 76 | @Test 77 | public void test_get_by_id_success() throws Exception { 78 | Employee employee = new Employee(1, "Ali", "CAVAC", 12000, 1); 79 | when(employeeService.findById(1)).thenReturn(employee); 80 | 81 | mockMvc.perform(get("/employees/{id}", 1)) 82 | .andExpect(status().isOk()) 83 | .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)) 84 | .andExpect(jsonPath("$.id", is(1))) 85 | .andExpect(jsonPath("$.name", is("Ali"))); 86 | 87 | verify(employeeService, times(1)).findById(1); 88 | verifyNoMoreInteractions(employeeService); 89 | } 90 | 91 | @Test 92 | public void test_get_by_id_fail_404_not_found() throws Exception { 93 | when(employeeService.findById(1)).thenReturn(null); 94 | 95 | mockMvc.perform(get("/employees/{id}", 1)) 96 | .andExpect(status().isNotFound()); 97 | 98 | verify(employeeService, times(1)).findById(1); 99 | verifyNoMoreInteractions(employeeService); 100 | } 101 | 102 | @Test 103 | public void test_create_success() throws Exception { 104 | Employee employee = new Employee(1, "Ali", "CAVAC", 12000, 1); 105 | when(employeeService.saveEmployee(employee)).thenReturn(Boolean.TRUE); 106 | 107 | mockMvc.perform(post("/employees") 108 | .contentType(MediaType.APPLICATION_JSON) 109 | .content(asJsonString(employee))) 110 | .andExpect(status().isCreated()); 111 | 112 | verify(employeeService, times(1)).saveEmployee(employee); 113 | verifyNoMoreInteractions(employeeService); 114 | } 115 | 116 | @Test 117 | public void test_update_success() throws Exception { 118 | Employee employee = new Employee(1, "Ali", "CAVAC", 12000, 1); 119 | when(employeeService.updateEmployee(employee)).thenReturn(Boolean.TRUE); 120 | 121 | mockMvc.perform( 122 | put("/employees/{id}", employee.getId()) 123 | .contentType(MediaType.APPLICATION_JSON) 124 | .content(asJsonString(employee))) 125 | .andExpect(status().isOk()); 126 | 127 | verify(employeeService, times(1)).updateEmployee(employee); 128 | verifyNoMoreInteractions(employeeService); 129 | } 130 | 131 | @Test 132 | public void test_delete_success() throws Exception { 133 | Employee employee = new Employee(1, "Ali", "CAVAC", 12000, 1); 134 | when(employeeService.deleteById(employee.getId())).thenReturn(Boolean.TRUE); 135 | 136 | mockMvc.perform( 137 | delete("/employees/{id}", employee.getId())) 138 | .andExpect(status().isNoContent()); 139 | 140 | verify(employeeService, times(1)).deleteById(employee.getId()); 141 | verifyNoMoreInteractions(employeeService); 142 | } 143 | 144 | public static String asJsonString(final Object obj) { 145 | try { 146 | final ObjectMapper mapper = new ObjectMapper(); 147 | return mapper.writeValueAsString(obj); 148 | } catch (Exception e) { 149 | throw new RuntimeException(e); 150 | } 151 | } 152 | } 153 | -------------------------------------------------------------------------------- /meeting-server/src/test/java/tr/com/example/meeting/controller/MeetingControllerTest.java: -------------------------------------------------------------------------------- 1 | package tr.com.example.meeting.controller; 2 | 3 | import static org.hamcrest.Matchers.hasSize; 4 | import static org.hamcrest.Matchers.is; 5 | import static org.mockito.Mockito.times; 6 | import static org.mockito.Mockito.verify; 7 | import static org.mockito.Mockito.verifyNoMoreInteractions; 8 | import static org.mockito.Mockito.when; 9 | import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; 10 | import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; 11 | import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; 12 | import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; 13 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; 14 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; 15 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; 16 | 17 | import java.util.Arrays; 18 | import java.util.List; 19 | 20 | import org.junit.Before; 21 | import org.junit.Test; 22 | import org.junit.runner.RunWith; 23 | import org.mockito.InjectMocks; 24 | import org.mockito.Mock; 25 | import org.mockito.MockitoAnnotations; 26 | import org.springframework.boot.test.context.SpringBootTest; 27 | import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; 28 | import org.springframework.http.MediaType; 29 | import org.springframework.test.context.junit4.SpringRunner; 30 | import org.springframework.test.web.servlet.MockMvc; 31 | import org.springframework.test.web.servlet.setup.MockMvcBuilders; 32 | 33 | import com.fasterxml.jackson.databind.ObjectMapper; 34 | 35 | import tr.com.example.meeting.domain.Department; 36 | import tr.com.example.meeting.domain.Meeting; 37 | import tr.com.example.meeting.service.MeetingService; 38 | 39 | /** 40 | * Tests for MeetingController RESTful endpoints. 41 | * 42 | * @author ali.cavac 43 | * 44 | */ 45 | @RunWith(SpringRunner.class) 46 | @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) 47 | public class MeetingControllerTest { 48 | 49 | private MockMvc mockMvc; 50 | 51 | @Mock 52 | private MeetingService meetingService; 53 | 54 | @InjectMocks 55 | private MeetingController meetingController; 56 | 57 | @Before 58 | public void setup() { 59 | MockitoAnnotations.initMocks(this); 60 | mockMvc = MockMvcBuilders 61 | .standaloneSetup(meetingController) 62 | .build(); 63 | } 64 | 65 | @Test 66 | public void test_get_all_success() throws Exception { 67 | List departments = Arrays.asList( 68 | new Department(1, "Engineering", "Engineering Department"), 69 | new Department(2, "Design", "Design Department")); 70 | 71 | List meetings = Arrays.asList( 72 | new Meeting(1, "Revision", "Weekly Revision", departments), 73 | new Meeting(2, "Scrum", "Scrum Meeting", departments)); 74 | 75 | when(meetingService.list()).thenReturn(meetings); 76 | 77 | mockMvc.perform(get("/meetings")) 78 | .andExpect(status().isOk()) 79 | .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)) 80 | .andExpect(jsonPath("$", hasSize(2))) 81 | .andExpect(jsonPath("$[0].id", is(1))) 82 | .andExpect(jsonPath("$[0].name", is("Revision"))) 83 | .andExpect(jsonPath("$[1].id", is(2))) 84 | .andExpect(jsonPath("$[1].name", is("Scrum"))); 85 | 86 | verify(meetingService, times(1)).list(); 87 | verifyNoMoreInteractions(meetingService); 88 | } 89 | 90 | @Test 91 | public void test_get_by_id_success() throws Exception { 92 | List departments = Arrays.asList( 93 | new Department(1, "Engineering", "Engineering Department"), 94 | new Department(2, "Design", "Design Department")); 95 | Meeting meeting = new Meeting(1, "Revision", "Weekly Revision", departments); 96 | 97 | when(meetingService.findById(1)).thenReturn(meeting); 98 | 99 | mockMvc.perform(get("/meetings/{id}", 1)) 100 | .andExpect(status().isOk()) 101 | .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)) 102 | .andExpect(jsonPath("$.id", is(1))) 103 | .andExpect(jsonPath("$.name", is("Revision"))); 104 | 105 | verify(meetingService, times(1)).findById(1); 106 | verifyNoMoreInteractions(meetingService); 107 | } 108 | 109 | @Test 110 | public void test_get_by_id_fail_404_not_found() throws Exception { 111 | when(meetingService.findById(1)).thenReturn(null); 112 | 113 | mockMvc.perform(get("/meetings/{id}", 1)) 114 | .andExpect(status().isNotFound()); 115 | 116 | verify(meetingService, times(1)).findById(1); 117 | verifyNoMoreInteractions(meetingService); 118 | } 119 | 120 | @Test 121 | public void test_create_success() throws Exception { 122 | List departments = Arrays.asList( 123 | new Department(1, "Engineering", "Engineering Department"), 124 | new Department(2, "Design", "Design Department")); 125 | Meeting meeting = new Meeting(1, "Revision", "Weekly Revision", departments); 126 | 127 | when(meetingService.saveMeeting(meeting)).thenReturn(Boolean.TRUE); 128 | 129 | mockMvc.perform(post("/meetings") 130 | .contentType(MediaType.APPLICATION_JSON) 131 | .content(asJsonString(meeting))) 132 | .andExpect(status().isCreated()); 133 | 134 | verify(meetingService, times(1)).saveMeeting(meeting); 135 | verifyNoMoreInteractions(meetingService); 136 | } 137 | 138 | @Test 139 | public void test_update_success() throws Exception { 140 | List departments = Arrays.asList( 141 | new Department(1, "Engineering", "Engineering Department"), 142 | new Department(2, "Design", "Design Department")); 143 | Meeting meeting = new Meeting(1, "Revision", "Weekly Revision", departments); 144 | 145 | when(meetingService.updateMeeting(meeting)).thenReturn(Boolean.TRUE); 146 | 147 | mockMvc.perform( 148 | put("/meetings/{id}", meeting.getId()) 149 | .contentType(MediaType.APPLICATION_JSON) 150 | .content(asJsonString(meeting))) 151 | .andExpect(status().isOk()); 152 | 153 | verify(meetingService, times(1)).updateMeeting(meeting); 154 | verifyNoMoreInteractions(meetingService); 155 | } 156 | 157 | @Test 158 | public void test_delete_success() throws Exception { 159 | List departments = Arrays.asList( 160 | new Department(1, "Engineering", "Engineering Department"), 161 | new Department(2, "Design", "Design Department")); 162 | Meeting meeting = new Meeting(1, "Revision", "Weekly Revision", departments); 163 | 164 | when(meetingService.deleteById(meeting.getId())).thenReturn(Boolean.TRUE); 165 | 166 | mockMvc.perform( 167 | delete("/meetings/{id}", meeting.getId())) 168 | .andExpect(status().isNoContent()); 169 | 170 | verify(meetingService, times(1)).deleteById(meeting.getId()); 171 | verifyNoMoreInteractions(meetingService); 172 | } 173 | 174 | public static String asJsonString(final Object obj) { 175 | try { 176 | final ObjectMapper mapper = new ObjectMapper(); 177 | return mapper.writeValueAsString(obj); 178 | } catch (Exception e) { 179 | throw new RuntimeException(e); 180 | } 181 | } 182 | } 183 | --------------------------------------------------------------------------------