├── .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 | 
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 | 
22 |
23 | 
--------------------------------------------------------------------------------
/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 |
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 |
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 |
63 |
64 |
65 |
66 |
67 |
68 |
69 | );
70 | },
71 |
72 | clearAddObject: function() {
73 |
74 | this.state.addObject.id = '';
75 | this.state.addObject.name = '';
76 | this.state.addObject.surname = '';
77 | this.state.addObject.salary = '';
78 | this.state.addObject.departmentId = '';
79 | },
80 |
81 | //Input changes
82 | onAddEmployeeNameChange: function(event) {
83 | this.state.addObject.name = event.target.value;
84 | this.forceUpdate();
85 | },
86 |
87 | onAddEmployeeSurnameChange: function(event) {
88 | this.state.addObject.surname = event.target.value;
89 | this.forceUpdate();
90 | },
91 |
92 | onAddEmployeeSalaryChange: function(event) {
93 | this.state.addObject.salary = event.target.value;
94 | this.forceUpdate();
95 | },
96 |
97 | onAddEmployeeDepartmentChange: function(selection) {
98 |
99 | if(selection === null) {
100 | this.state.addObject.departmentId = null;
101 | }else {
102 | this.state.addObject.departmentId = selection.value;
103 | }
104 |
105 | this.forceUpdate();
106 | },
107 |
108 | onAddBtnClicked: function() {
109 |
110 | //Save employee
111 | axios.post('http://localhost:8080/employees/', this.state.addObject)
112 | .then(function (response) {
113 | this.props.parent.closeAddModal();
114 | this.props.parent.refreshTable();
115 | console.log(response);
116 | }.bind(this))
117 | .catch(function (error) {
118 | console.log(error);
119 | });
120 | }
121 | });
122 |
123 | export default AddEmployee;
--------------------------------------------------------------------------------
/meeting-client/src/pages/Employees/Employees.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 AddEmployeeModal from './AddEmployee';
8 | import UpdateEmployeeModal from './UpdateEmployee';
9 |
10 | var Employees = React.createClass({
11 |
12 | getInitialState: function() {
13 |
14 | return {
15 | data: null,
16 | departments: null,
17 | selectedEmployeeId: null,
18 | showAddModal: false,
19 | showUpdateModal: false
20 | }
21 | },
22 |
23 | componentDidMount: function() {
24 | this.refreshTable();
25 | },
26 |
27 | render: function() {
28 |
29 | var selectRowProp = {
30 | mode: "radio",
31 | clickToSelect: true,
32 | className: "selected-row",
33 | bgColor: 'rgb(101, 148, 255)',
34 | onSelect: this.onRowSelect
35 | };
36 |
37 | if(!this.state.data){
38 | return ();
39 | }
40 |
41 | return (
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
55 | Employee ID
56 | First Name
57 | Last Name
58 | Salary
59 | Depertment
60 |
61 |
62 |
63 |
64 |
65 |
66 | );
67 | },
68 |
69 | // Keep selected row
70 | onRowSelect: function(row, isSelected) {
71 | if(isSelected) {
72 | this.setState({ selectedEmployeeId: row.id });
73 | }else {
74 | this.setState({ selectedEmployeeId: null });
75 | }
76 | },
77 |
78 | // Department list for Select component
79 | getDepartmentOptions: function() {
80 | var options = [];
81 |
82 | options = this.state.departments.map(function(obj){
83 | var rObj = {};
84 | rObj['value'] = obj['id'];
85 | rObj['label'] = obj['name'];
86 | return rObj;
87 | });
88 |
89 | return options;
90 | },
91 |
92 | //Add modal open/close
93 | closeAddModal: function() {
94 | this.setState({ showAddModal: false });
95 | this.refs.addEmployee.clearAddObject();
96 | },
97 | openAddModal: function() {
98 | this.refs.addEmployee.clearAddObject();
99 | this.setState({ showAddModal: true });
100 | },
101 |
102 | //Update modal open/close
103 | closeUpdateModal: function() {
104 | this.setState({showUpdateModal: false});
105 | this.refs.updateEmployee.clearUpdateObject();
106 | },
107 | openUpdateModal: function() {
108 | this.refs.updateEmployee.fillUpdateObject();
109 | this.setState({showUpdateModal: true});
110 | },
111 |
112 | //BEGIN: Delete Employee
113 | onDeleteBtnClicked: function() {
114 |
115 | axios.delete('http://localhost:8080/employees/' + this.state.selectedEmployeeId)
116 | .then(function (response) {
117 | this.refreshTable();
118 | }.bind(this))
119 | .catch(function (error) {
120 | console.log(error);
121 | });
122 | },
123 | //END: Delete Employee
124 |
125 | priceFormatter: function(cell, row){
126 | return ' ' + cell;
127 | },
128 |
129 | departmentFormatter: function(cell, row) {
130 | return this.getDepartmentName(row.departmentId);
131 | },
132 |
133 | getDepartmentName: function(departmentId) {
134 |
135 | for(var i in this.state.departments) {
136 | if(this.state.departments[i].id === departmentId) {
137 | return this.state.departments[i].name;
138 | }
139 | }
140 | return '';
141 | },
142 |
143 | getEmployeeById: function(id) {
144 | for(var i in this.state.data) {
145 | if(this.state.data[i].id === id) {
146 | return this.state.data[i];
147 | }
148 | }
149 | return '';
150 | },
151 |
152 | getEmployees: function() {
153 | return axios.get('http://localhost:8080/employees');
154 | },
155 |
156 | getDepartments: function() {
157 | return axios.get('http://localhost:8080/departments');
158 | },
159 |
160 | //Get table data and update the state to render
161 | refreshTable: function() {
162 |
163 | axios.all([this.getEmployees(), this.getDepartments()])
164 | .then(axios.spread(function (employees, departments) {
165 | this.setState({data: employees.data,
166 | departments: departments.data});
167 | }.bind(this)));
168 | }
169 | });
170 |
171 | export default Employees;
--------------------------------------------------------------------------------
/meeting-client/src/pages/Employees/UpdateEmployee.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 UpdateEmployee = React.createClass({
7 |
8 | getInitialState: function() {
9 |
10 | return {
11 | updateObject: {
12 | id: '',
13 | name: '',
14 | surname: '',
15 | salary: '',
16 | departmentId: ''
17 | }
18 | }
19 | },
20 |
21 | shouldComponentUpdate: function() {
22 | //console.log('EU:shouldComponentUpdate');
23 | //return this.props.parent.state.showUpdateModal;
24 | return true;
25 | },
26 |
27 | render: function() {
28 |
29 | return (
30 |
31 |
32 | Update Employee
33 |
34 |
35 |
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 |
59 |
60 |
61 |
62 |
63 |
64 |
65 | );
66 | },
67 |
68 | clearAddObject: function() {
69 |
70 | this.state.addObject.id = '';
71 | this.state.addObject.name = '';
72 | this.state.addObject.description = '';
73 | },
74 |
75 | //Input changes
76 | onAddMeetingNameChange: function(event) {
77 | this.state.addObject.name = event.target.value;
78 | this.forceUpdate();
79 | },
80 |
81 | onAddMeetingDescriptionChange: function(event) {
82 | this.state.addObject.description = event.target.value;
83 | this.forceUpdate();
84 | },
85 |
86 | onAddMeetingDepartmentChange: function(selection) {
87 |
88 | if (selection === null) {
89 | this.state.updateObject.departments = null;
90 | } else {
91 | var departments = selection.map(function(obj){
92 | var rObj = {};
93 | rObj['id'] = obj['value'];
94 | rObj['name'] = obj['label'];
95 | return rObj;
96 | });
97 |
98 | this.state.addObject.departments = departments;
99 | }
100 |
101 | this.forceUpdate();
102 | },
103 |
104 | onAddBtnClicked: function() {
105 |
106 | //Save meeting
107 | axios.post('http://localhost:8080/meetings/', this.state.addObject)
108 | .then(function (response) {
109 | this.props.parent.closeAddModal();
110 | this.props.parent.refreshTable();
111 | console.log(response);
112 | }.bind(this))
113 | .catch(function (error) {
114 | console.log(error);
115 | });
116 | }
117 | });
118 |
119 | export default AddMeeting;
--------------------------------------------------------------------------------
/meeting-client/src/pages/Meetings/Meetings.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 AddMeetingModal from './AddMeeting';
8 | import UpdateMeetingModal from './UpdateMeeting';
9 |
10 | var Meetings = React.createClass({
11 |
12 | getInitialState: function() {
13 |
14 | return {
15 | data: null,
16 | departments: null,
17 | selectedMeetingId: null,
18 | showAddModal: false,
19 | showUpdateModal: false
20 | }
21 | },
22 |
23 | componentDidMount: function() {
24 | this.refreshTable();
25 | },
26 |
27 | render: function() {
28 |
29 | var selectRowProp = {
30 | mode: "radio",
31 | clickToSelect: true,
32 | className: "selected-row",
33 | bgColor: 'rgb(101, 148, 255)',
34 | onSelect: this.onRowSelect
35 | };
36 |
37 | if(!this.state.data){
38 | return ();
39 | }
40 |
41 | return (
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
55 | Meeting ID
56 | Name
57 | Description
58 |
59 |
60 |
61 |
62 |
63 |
64 | );
65 | },
66 |
67 | // Keep selected row
68 | onRowSelect: function(row, isSelected) {
69 | if(isSelected) {
70 | this.setState({ selectedMeetingId: row.id });
71 | }else {
72 | this.setState({ selectedMeetingId: null });
73 | }
74 | },
75 |
76 | // Department list for Select component
77 | getDepartmentOptions: function(departments) {
78 | var options = [];
79 |
80 | if(!departments) {
81 | return options;
82 | }
83 |
84 | options = departments.map(function(obj){
85 | var rObj = {};
86 | rObj['value'] = obj['id'];
87 | rObj['label'] = obj['name'];
88 | return rObj;
89 | });
90 |
91 | return options;
92 | },
93 |
94 | //Add modal open/close
95 | closeAddModal: function() {
96 | this.setState({ showAddModal: false });
97 | this.refs.addMeeting.clearAddObject();
98 | },
99 |
100 | openAddModal: function() {
101 | this.refs.addMeeting.clearAddObject();
102 | this.setState({ showAddModal: true });
103 | },
104 |
105 | //Update modal open/close
106 | closeUpdateModal: function() {
107 | this.setState({showUpdateModal: false});
108 | this.refs.updateMeeting.clearUpdateObject();
109 | },
110 |
111 | openUpdateModal: function() {
112 | this.refs.updateMeeting.fillUpdateObject();
113 | this.setState({showUpdateModal: true});
114 | },
115 |
116 | //BEGIN: Delete Meeting
117 | onDeleteBtnClicked: function() {
118 |
119 | axios.delete('http://localhost:8080/meetings/' + this.state.selectedMeetingId)
120 | .then(function (response) {
121 | this.refreshTable();
122 | }.bind(this))
123 | .catch(function (error) {
124 | console.log(error);
125 | });
126 | },
127 | //END: Delete Meeting
128 |
129 | getMeetingById: function(id) {
130 |
131 | for(var i in this.state.data) {
132 | if(this.state.data[i].id === id) {
133 | return this.state.data[i];
134 | }
135 | }
136 | return '';
137 | },
138 |
139 |
140 | getMeetings: function() {
141 | return axios.get('http://localhost:8080/meetings');
142 | },
143 |
144 | getDepartments: function() {
145 | return axios.get('http://localhost:8080/departments');
146 | },
147 |
148 | //Get table data and update the state to render
149 | refreshTable: function() {
150 |
151 | axios.all([this.getMeetings(), this.getDepartments()])
152 | .then(axios.spread(function (meetings, departments) {
153 | this.setState({data: meetings.data,
154 | departments: departments.data});
155 | }.bind(this)));
156 | }
157 | });
158 |
159 | export default Meetings;
--------------------------------------------------------------------------------
/meeting-client/src/pages/Meetings/UpdateMeeting.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 UpdateMeeting = React.createClass({
7 |
8 | getInitialState: function() {
9 |
10 | return {
11 | updateObject: {
12 | id: '',
13 | name: '',
14 | description: '',
15 | departments: ''
16 | }
17 | }
18 | },
19 |
20 | render: function() {
21 |
22 | if(this.props.parent.state.showUpdateModal === false){
23 | return ();
24 | }
25 |
26 | return (
27 |
28 |
29 | Update Meeting
30 |
31 |
32 |
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 |
--------------------------------------------------------------------------------