박선진

delete unnecessary codes from template code

Showing 415 changed files with 3539 additions and 16586 deletions
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
15 .env.development.local 15 .env.development.local
16 .env.test.local 16 .env.test.local
17 .env.production.local 17 .env.production.local
18 +.env
18 19
19 npm-debug.log* 20 npm-debug.log*
20 yarn-debug.log* 21 yarn-debug.log*
......
This diff could not be displayed because it is too large.
...@@ -61,14 +61,12 @@ ...@@ -61,14 +61,12 @@
61 "bootstrap_calendar": "https://github.com/xero/bootstrap_calendar.git#1.0.1", 61 "bootstrap_calendar": "https://github.com/xero/bootstrap_calendar.git#1.0.1",
62 "classnames": "^2.2.6", 62 "classnames": "^2.2.6",
63 "draft-js": "^0.10.5", 63 "draft-js": "^0.10.5",
64 - "easy-pie-chart": "^2.1.7",
65 "flot": "^0.8.0-alpha", 64 "flot": "^0.8.0-alpha",
66 "flot.dashes": "https://github.com/cquartier/flot.dashes.git", 65 "flot.dashes": "https://github.com/cquartier/flot.dashes.git",
67 "font-awesome": "4.7.0", 66 "font-awesome": "4.7.0",
68 "formsy-react": "0.19.5", 67 "formsy-react": "0.19.5",
69 "fullcalendar": "^3.9.0", 68 "fullcalendar": "^3.9.0",
70 "glyphicons-halflings": "^1.9.1", 69 "glyphicons-halflings": "^1.9.1",
71 - "govpredict-morris": "0.5.1",
72 "jasny-bootstrap": "^3.1.3", 70 "jasny-bootstrap": "^3.1.3",
73 "jquery": "^3.3.1", 71 "jquery": "^3.3.1",
74 "jquery-mapael": "^2.2.0", 72 "jquery-mapael": "^2.2.0",
...@@ -83,7 +81,10 @@ ...@@ -83,7 +81,10 @@
83 "messenger": "git+https://github.com/HubSpot/messenger.git#v1.4.2", 81 "messenger": "git+https://github.com/HubSpot/messenger.git#v1.4.2",
84 "metrojs": "0.9.77", 82 "metrojs": "0.9.77",
85 "moment": "^2.22.2", 83 "moment": "^2.22.2",
84 + "moment-timezone": "^0.5.26",
86 "nvd3": "1.8.6", 85 "nvd3": "1.8.6",
86 + "pretty": "^2.0.0",
87 + "prettysize": "^2.0.0",
87 "rc-color-picker": "^1.2.6", 88 "rc-color-picker": "^1.2.6",
88 "rc-hammerjs": "0.6.9", 89 "rc-hammerjs": "0.6.9",
89 "react": "^16.5.2", 90 "react": "^16.5.2",
...@@ -107,6 +108,7 @@ ...@@ -107,6 +108,7 @@
107 "react-router-dom": "^4.3.1", 108 "react-router-dom": "^4.3.1",
108 "react-router-hash-link": "^1.2.1", 109 "react-router-hash-link": "^1.2.1",
109 "react-scrollspy": "^3.3.5", 110 "react-scrollspy": "^3.3.5",
111 + "react-select": "^3.0.4",
110 "react-select2-wrapper": "^1.0.4-beta6", 112 "react-select2-wrapper": "^1.0.4-beta6",
111 "react-shuffle": "2.1.0", 113 "react-shuffle": "2.1.0",
112 "react-slick": "^0.23.1", 114 "react-slick": "^0.23.1",
...@@ -122,9 +124,11 @@ ...@@ -122,9 +124,11 @@
122 "redux": "^4.0.1", 124 "redux": "^4.0.1",
123 "redux-thunk": "^2.3.0", 125 "redux-thunk": "^2.3.0",
124 "rickshaw": "1.6.6", 126 "rickshaw": "1.6.6",
127 + "semantic-ui-react": "^0.87.3",
125 "showdown": "1.8.6", 128 "showdown": "1.8.6",
126 "skycons": "^1.0.0", 129 "skycons": "^1.0.0",
127 - "widgster": "^1.0.0" 130 + "widgster": "^1.0.0",
131 + "xlsx": "^0.14.4"
128 }, 132 },
129 "devDependencies": { 133 "devDependencies": {
130 "@babel/core": "7.4.4", 134 "@babel/core": "7.4.4",
...@@ -140,10 +144,10 @@ ...@@ -140,10 +144,10 @@
140 "bfj": "6.1.1", 144 "bfj": "6.1.1",
141 "bundle-loader": "0.5.6", 145 "bundle-loader": "0.5.6",
142 "case-sensitive-paths-webpack-plugin": "2.2.0", 146 "case-sensitive-paths-webpack-plugin": "2.2.0",
143 - "chalk": "2.4.2", 147 + "chalk": "^2.4.2",
144 "css-loader": "2.1.1", 148 "css-loader": "2.1.1",
145 - "dotenv": "8.0.0", 149 + "dotenv": "^8.2.0",
146 - "dotenv-expand": "5.1.0", 150 + "dotenv-expand": "^5.1.0",
147 "eslint": "5.16.0", 151 "eslint": "5.16.0",
148 "eslint-config-react-app": "4.0.1", 152 "eslint-config-react-app": "4.0.1",
149 "eslint-loader": "2.1.1", 153 "eslint-loader": "2.1.1",
...@@ -175,7 +179,7 @@ ...@@ -175,7 +179,7 @@
175 "style-loader": "0.23.0", 179 "style-loader": "0.23.0",
176 "terser-webpack-plugin": "1.2.3", 180 "terser-webpack-plugin": "1.2.3",
177 "url-loader": "1.1.2", 181 "url-loader": "1.1.2",
178 - "webpack": "4.31.0", 182 + "webpack": "^4.31.0",
179 "webpack-dev-server": "3.3.1", 183 "webpack-dev-server": "3.3.1",
180 "webpack-manifest-plugin": "2.0.4", 184 "webpack-manifest-plugin": "2.0.4",
181 "webpack-raphael": "2.1.4", 185 "webpack-raphael": "2.1.4",
......

10.4 KB | W: | H:

12 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
1 -<?php sleep(10) ?>
2 -<h3 class="text-center no-margin animated bounceInDown">Sign up, <del>it's <strong>free</strong></del> and get <strong>$50 now!</strong></h3>
3 -<p class="lead text-muted text-center">
4 - Faith makes it possible to achieve that which man's mind can conceive and believe.
5 -</p>
6 -<form>
7 -
8 - <div class="form-group">
9 - <label for="exampleInputEmail1"><i class="fa fa-circle text-warning"></i> &nbsp; Email address</label>
10 - <input type="email" class="form-control input-transparent" id="exampleInputEmail1"
11 - placeholder="Enter email">
12 - </div>
13 - <div class="form-group">
14 - <label for="pswd"><i class="fa fa-circle text-danger"></i> &nbsp; Password</label>
15 - <input class="form-control" id="pswd" type="text" placeholder="Min 8 characters">
16 - </div>
17 - <p>
18 - To make a widget automatically load it's content you just need to set
19 - <strong>data-widgster-autoload</strong> attribute and provide an url.
20 - </p>
21 - <pre><code>data-widgster-load="server/ajax_widget.php"
22 -data-widgster-autoload="true"</code></pre>
23 - <p>
24 - <strong>data-widgster-autoload</strong> may be set to an integer value. If set, for example, to
25 - 2000 will refresh widget every 2 seconds.
26 - </p>
27 - <div class="clearfix">
28 - <div class="btn-toolbar float-right">
29 - <button type="submit" class="btn btn-transparent">Cancel</button>
30 - <button type="submit" class="btn btn-success animated wobble">&nbsp;Submit&nbsp;</button>
31 - </div>
32 - </div>
33 -</form>
1 -<!-- demo latetency <?php sleep(2) ?> -->
2 -<p class="text-muted">Simulating latency with tiny php block on the server-side.</p>
3 -<p>A timestamp this widget was created: Apr 24, 19:07:07</p>
4 -<p>A timestamp this widget was updated: <?php echo date("M j, H:i:s") ?></p>
...\ No newline at end of file ...\ No newline at end of file
1 -<!-- <?php sleep(2) //just some delay to simulate latency ?> -->
2 -<ul class="news-list stretchable">
3 - <li class="animated fadeInDown bg-warning-light">
4 - <span class="icon bg-warning text-white">
5 - <i class="fa fa-lock"></i>
6 - </span>
7 - <div class="news-item-info">
8 - <h5 class="name no-margin mb-xs"><a href="#">Just now! Check update time</a></h5>
9 - <p class="fs-mini">
10 - Check this news item timestamp. There is a small server part that generates current timestamp so it
11 - would be easier for you to see ajax widgets in action
12 - </p>
13 - <time class="help-block"><?php echo date("M j, H:i:s")?></time>
14 - </div>
15 - </li>
16 - <li>
17 - <span class="icon bg-danger text-white">
18 - <i class="fa fa-star"></i>
19 - </span>
20 - <div class="news-item-info">
21 - <h5 class="name no-margin mb-xs"><a href="#">First Human Colony on Mars</a></h5>
22 - <p class="fs-mini">
23 - First 700 people will take part in building first human settlement outside of Earth.
24 - That's awesome, right?
25 - </p>
26 - <time class="help-block">Mar 20, 18:46</time>
27 - </div>
28 - </li>
29 - <li>
30 - <span class="icon bg-info text-white">
31 - <i class="fa fa-microphone"></i>
32 - </span>
33 - <div class="news-item-info">
34 - <h5 class="name no-margin mb-xs"><a href="#">Light Blue reached $300</a></h5>
35 - <p class="fs-mini">
36 - Light Blue Inc. shares just hit $300 price. "This was inevitable. It should
37 - have happen sooner or later" - says NYSE expert.
38 - </p>
39 - <time class="help-block">Sep 25, 11:59</time>
40 - </div>
41 - </li>
42 - <li>
43 - <span class="icon bg-success text-white">
44 - <i class="fa fa-eye"></i>
45 - </span>
46 - <div class="news-item-info">
47 - <h5 class="name no-margin mb-xs"><a href="#">No more spying</a></h5>
48 - <p class="fs-mini">
49 - Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
50 - incididunt ut labore et dolore magna aliqua.
51 - </p>
52 - <time class="help-block">Mar 20, 18:46</time>
53 - </div>
54 - </li>
55 -</ul>
1 -<?php sleep(2) ?>
2 -<div class="list-group list-group-lg">
3 - <a href="#" class="list-group-item animated fadeInDown bg-warning-light">
4 - <span class="thumb-sm mr">
5 - <img class="rounded-circle" src="/images/people/a6.jpg" alt="...">
6 - </span>
7 - <div>
8 - <h6 class="no-margin"><strong>Jenny Wilington</strong></h6>
9 - <small>just now</small>
10 - </div>
11 - <i class="fa fa-circle ml-auto text-success mt-sm"></i>
12 - </a>
13 - <a href="#" class="list-group-item ">
14 - <span class="thumb-sm mr">
15 - <img class="rounded-circle" src="/images/people/a1.jpg" alt="...">
16 - </span>
17 - <div>
18 - <h6 class="m-0">Maikel Basso</h6>
19 - <small class="text-muted">about 2 mins ago</small>
20 - </div>
21 - <i class="fa fa-circle ml-auto text-danger"></i>
22 - </a>
23 - <a href="#" class="list-group-item">
24 - <span class="thumb-sm mr">
25 - <img class="rounded-circle" src="/images/people/a2.jpg" alt="...">
26 - </span>
27 - <div>
28 - <h6 class="m-0">Ianus Arendse</h6>
29 - <small class="text-muted">about 42 mins ago</small>
30 - </div>
31 - <i class="fa fa-circle ml-auto text-info"></i>
32 - </a>
33 - <a href="#" class="list-group-item">
34 - <span class="thumb-sm mr">
35 - <img class="rounded-circle" src="/images/people/a3.jpg" alt="...">
36 - </span>
37 - <div>
38 - <h6 class="m-0">Valdemar Landau</h6>
39 - <small class="text-muted">one hour ago</small>
40 - </div>
41 - <i class="fa fa-circle ml-auto text-success"></i>
42 - </a>
43 - <a href="#" class="list-group-item mb-n-md">
44 - <span class="thumb-sm mr">
45 - <img class="rounded-circle" src="/images/people/a4.jpg" alt="...">
46 - </span>
47 - <div>
48 - <h6 class="m-0">Rick Teagan</h6>
49 - <small class="text-muted">3 hours ago</small>
50 - </div>
51 - <i class="fa fa-circle ml-auto text-warning"></i>
52 - </a>
53 -</div>

5.18 KB | W: | H:

12 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
19 work correctly both with client-side routing and a non-root public URL. 19 work correctly both with client-side routing and a non-root public URL.
20 Learn how to configure a non-root public URL by running `npm run build`. 20 Learn how to configure a non-root public URL by running `npm run build`.
21 --> 21 -->
22 - <title>Sing App React Dashboard - Admin Template built with React</title> 22 + <title>Video Emergency Detection</title>
23 <meta name="description" content="React Admin Dashboard Template built with Bootstrap, Redux and React Router by Flatlogic. Over 40 unique pages, hundreds of components and theme support."> 23 <meta name="description" content="React Admin Dashboard Template built with Bootstrap, Redux and React Router by Flatlogic. Over 40 unique pages, hundreds of components and theme support.">
24 <meta name="keywords" content="react admin, react dashboard, react admin template, react theme, react dashboard template, react dashboard template"> 24 <meta name="keywords" content="react admin, react dashboard, react admin template, react theme, react dashboard template, react dashboard template">
25 <meta name="author" content="Flatlogic LLC."> 25 <meta name="author" content="Flatlogic LLC.">
......
1 -export const DISMISS_ALERT = 'DISMISS_ALERT';
2 -
3 -export function dismissAlert(id) {
4 - return {
5 - type: DISMISS_ALERT,
6 - id,
7 - };
8 -}
1 -import axios from 'axios';
2 -
3 -export const RECEIVED_DATA_SUCCESS = 'RECEIVED_DATA_SUCCESS';
4 -export const RECEIVING_DATA = 'RECEIVING_DATA';
5 -
6 -export function receiveDataRequest() {
7 - return (dispatch) => {
8 - dispatch(receivingData());
9 - axios.get('/analytics').then(res => {
10 - dispatch(receiveDataSuccess(res.data));
11 - })
12 - };
13 -}
14 -
15 -export function receiveDataSuccess(payload) {
16 - return {
17 - type: RECEIVED_DATA_SUCCESS,
18 - payload
19 - }
20 -}
21 -
22 -export function receivingData() {
23 - return {
24 - type: RECEIVING_DATA
25 - }
26 -}
27 -
28 -
29 -
30 -
1 -import axios from 'axios';
2 -import { toast } from 'react-toastify';
3 -
4 -export const RECEIVED_PRODUCTS = 'RECEIVED_PRODUCTS';
5 -export const RECEIVING_PRODUCTS = 'RECEIVING_PRODUCTS';
6 -export const RECEIVED_PRODUCT = 'RECEIVED_PRODUCT';
7 -export const RECEIVING_PRODUCT = 'RECEIVING_PRODUCT';
8 -export const UPDATED_PRODUCT = 'UPDATED_PRODUCT';
9 -export const UPDATING_PRODUCT = 'UPDATING_PRODUCT';
10 -export const DELETED_PRODUCT = 'DELETED_PRODUCT';
11 -export const DELETING_PRODUCT = 'DELETING_PRODUCT';
12 -export const RECEIVED_IMAGES = 'RECEIVED_IMAGES';
13 -
14 -export function getProductsRequest() {
15 - return (dispatch) => {
16 - dispatch(receivingProducts());
17 - axios.get('/products').then(res => {
18 - dispatch(receiveProducts(res.data));
19 - })
20 - };
21 -}
22 -
23 -export function loadProductRequest(id) {
24 - return (dispatch) => {
25 - dispatch(receivingProduct());
26 - axios.get('/products/' + id).then(res => {
27 - dispatch(receiveProduct(res.data));
28 - })
29 - };
30 -}
31 -
32 -export function updateProductRequest(product) {
33 - return (dispatch) => {
34 - dispatch(updatingProduct());
35 - axios.put('/products/' + product.id, product).then(res => {
36 - dispatch(updateProduct(res.data));
37 - toast.success("Product has been Updated!");
38 - })
39 - };
40 -}
41 -
42 -export function createProductRequest(payload) {
43 - return (dispatch) => {
44 - dispatch(updatingProduct());
45 - axios.post('/products', payload.product).then(res => {
46 - dispatch(updateProduct(res.data));
47 - payload.history.push('/app/ecommerce/management');
48 - toast.success("Product has been Created!");
49 - })
50 - };
51 -}
52 -
53 -export function deleteProductRequest(payload) {
54 - return (dispatch) => {
55 - dispatch(deletingProduct(payload));
56 - axios.delete('/products/' + payload.id).then(res => {
57 - dispatch(deleteProduct({id: payload.id}));
58 - if (payload.history.location.pathname !== '/app/ecommerce/management') {
59 - payload.history.push('/app/ecommerce/management');
60 - }
61 - toast.success("Product has been Deleted!");
62 - })
63 - };
64 -}
65 -
66 -export function getProductsImagesRequest(payload) {
67 - return (dispatch) => {
68 - axios.get('/products/images-list').then(res => {
69 - dispatch(receiveProductImages(res.data));
70 - if (!payload.img && res.data.length) {
71 - dispatch(updateProduct({id: payload.id, img: res.data[0]}));
72 - }
73 - })
74 - };
75 -}
76 -
77 -export function receiveProductImages(payload) {
78 - return {
79 - type: RECEIVED_IMAGES,
80 - payload
81 - }
82 -}
83 -
84 -
85 -export function receiveProducts(payload) {
86 - return {
87 - type: RECEIVED_PRODUCTS,
88 - payload
89 - }
90 -}
91 -
92 -export function receivingProducts() {
93 - return {
94 - type: RECEIVING_PRODUCTS
95 - }
96 -}
97 -
98 -export function receiveProduct(payload) {
99 - return {
100 - type: RECEIVED_PRODUCT,
101 - payload
102 - }
103 -}
104 -
105 -export function receivingProduct() {
106 - return {
107 - type: RECEIVING_PRODUCT
108 - }
109 -}
110 -
111 -export function updateProduct(payload) {
112 - return {
113 - type: UPDATED_PRODUCT,
114 - payload
115 - }
116 -}
117 -
118 -export function updatingProduct() {
119 - return {
120 - type: UPDATING_PRODUCT
121 - }
122 -}
123 -
124 -export function deleteProduct(payload) {
125 - return {
126 - type: DELETED_PRODUCT,
127 - payload
128 - }
129 -}
130 -
131 -export function deletingProduct(payload) {
132 - return {
133 - type: DELETING_PRODUCT,
134 - payload
135 - }
136 -}
137 -
138 -
1 -import axios from 'axios';
2 -import { toast } from 'react-toastify';
3 -
4 -export const REGISTER_REQUEST = 'REGISTER_REQUEST';
5 -export const REGISTER_SUCCESS = 'REGISTER_SUCCESS';
6 -export const REGISTER_FAILURE = 'REGISTER_FAILURE';
7 -
8 -function requestRegister() {
9 - return {
10 - type: REGISTER_REQUEST,
11 - };
12 -}
13 -
14 -export function receiveRegister() {
15 - return {
16 - type: REGISTER_SUCCESS
17 - };
18 -}
19 -
20 -export function registerError(payload) {
21 - return {
22 - type: REGISTER_FAILURE,
23 - payload,
24 - };
25 -}
26 -
27 -export function registerUser(payload) {
28 - return (dispatch) => {
29 - dispatch(requestRegister());
30 - debugger;
31 - const creds = payload.creds;
32 - if (creds.email.length > 0 && creds.password.length > 0) {
33 - axios.post("/user/signup", creds).then(res => {
34 - dispatch(receiveRegister());
35 - toast.success("You've been registered successfully");
36 - payload.history.push('/login');
37 - }).catch(err => {
38 - dispatch(registerError(err.response.data));
39 - })
40 -
41 - } else {
42 - dispatch(registerError('Something was wrong. Try again'));
43 - }
44 - };
45 -}
1 -import axios from 'axios';
2 -import config from '../config';
3 -import jwt from "jsonwebtoken";
4 -
5 -export const LOGIN_REQUEST = 'LOGIN_REQUEST';
6 -export const LOGIN_SUCCESS = 'LOGIN_SUCCESS';
7 -export const LOGIN_FAILURE = 'LOGIN_FAILURE';
8 -export const LOGOUT_REQUEST = 'LOGOUT_REQUEST';
9 -export const LOGOUT_SUCCESS = 'LOGOUT_SUCCESS';
10 -export const LOGOUT_FAILURE = 'LOGOUT_FAILURE';
11 -
12 -function requestLogin() {
13 - return {
14 - type: LOGIN_REQUEST,
15 - };
16 -}
17 -
18 -export function receiveLogin() {
19 - return {
20 - type: LOGIN_SUCCESS
21 - };
22 -}
23 -
24 -function loginError(payload) {
25 - return {
26 - type: LOGIN_FAILURE,
27 - payload,
28 - };
29 -}
30 -
31 -function requestLogout() {
32 - return {
33 - type: LOGOUT_REQUEST,
34 - };
35 -}
36 -
37 -export function receiveLogout() {
38 - return {
39 - type: LOGOUT_SUCCESS,
40 - };
41 -}
42 -
43 -// Logs the user out
44 -export function logoutUser() {
45 - return (dispatch) => {
46 - dispatch(requestLogout());
47 - localStorage.removeItem('token');
48 - localStorage.removeItem('user');
49 - document.cookie = 'token=;expires=Thu, 01 Jan 1970 00:00:01 GMT;';
50 - axios.defaults.headers.common['Authorization'] = "";
51 - dispatch(receiveLogout());
52 - };
53 -}
54 -
55 -export function receiveToken(token) {
56 - return (dispatch) => {
57 - let user = jwt.decode(token).user;
58 - delete user.id;
59 - localStorage.setItem('token', token);
60 - localStorage.setItem('user', JSON.stringify(user));
61 - axios.defaults.headers.common['Authorization'] = "Bearer " + token;
62 - dispatch(receiveLogin());
63 - }
64 -}
65 -
66 -export function loginUser(creds) {
67 - return (dispatch) => {
68 - dispatch(requestLogin());
69 - if (creds.social) {
70 - window.location.href = config.baseURLApi + "/user/signin/" + creds.social + (process.env.NODE_ENV === "production" ? "?app=sing-app-react" : "");
71 - }
72 - else if (creds.email.length > 0 && creds.password.length > 0) {
73 - axios.post("/user/signin/local", creds).then(res => {
74 - const token = res.data.token;
75 - dispatch(receiveToken(token));
76 - }).catch(err => {
77 - dispatch(loginError(err.response.data));
78 - })
79 -
80 - } else {
81 - dispatch(loginError('Something was wrong. Try again'));
82 - }
83 - };
84 -}
...@@ -10,21 +10,6 @@ import ErrorPage from '../pages/error'; ...@@ -10,21 +10,6 @@ import ErrorPage from '../pages/error';
10 10
11 import '../styles/theme.scss'; 11 import '../styles/theme.scss';
12 import LayoutComponent from '../components/Layout'; 12 import LayoutComponent from '../components/Layout';
13 -import DocumentationLayoutComponent from '../documentation/DocumentationLayout';
14 -import Login from '../pages/login';
15 -import Register from '../pages/register';
16 -import { logoutUser } from '../actions/user';
17 -
18 -const PrivateRoute = ({dispatch, component, ...rest }) => {
19 - if (!Login.isAuthenticated(localStorage.getItem('token'))) {
20 - dispatch(logoutUser());
21 - return (<Redirect to="/login"/>)
22 - } else {
23 - return ( // eslint-disable-line
24 - <Route {...rest} render={props => (React.createElement(component, props))}/>
25 - );
26 - }
27 -};
28 13
29 const CloseButton = ({closeToast}) => <i onClick={closeToast} className="la la-close notifications-close"/> 14 const CloseButton = ({closeToast}) => <i onClick={closeToast} className="la la-close notifications-close"/>
30 15
...@@ -41,14 +26,9 @@ class App extends React.PureComponent { ...@@ -41,14 +26,9 @@ class App extends React.PureComponent {
41 <Switch> 26 <Switch>
42 <Route path="/" exact render={() => <Redirect to="/app/main"/>}/> 27 <Route path="/" exact render={() => <Redirect to="/app/main"/>}/>
43 <Route path="/app" exact render={() => <Redirect to="/app/main"/>}/> 28 <Route path="/app" exact render={() => <Redirect to="/app/main"/>}/>
44 - <PrivateRoute path="/app" dispatch={this.props.dispatch} component={LayoutComponent}/> 29 + <Route path="/app" component={LayoutComponent}/>
45 - <Route path="/documentation" exact
46 - render={() => <Redirect to="/documentation/getting-started/overview"/>}/>
47 - <Route path="/documentation" component={DocumentationLayoutComponent}/>
48 - <Route path="/register" exact component={Register}/>
49 - <Route path="/login" exact component={Login}/>
50 <Route path="/error" exact component={ErrorPage}/> 30 <Route path="/error" exact component={ErrorPage}/>
51 - <Redirect from="*" to="/app/main/analytics"/> 31 + <Redirect from="*" to="/app/main/"/>
52 </Switch> 32 </Switch>
53 </HashRouter> 33 </HashRouter>
54 </div> 34 </div>
...@@ -58,7 +38,6 @@ class App extends React.PureComponent { ...@@ -58,7 +38,6 @@ class App extends React.PureComponent {
58 } 38 }
59 39
60 const mapStateToProps = state => ({ 40 const mapStateToProps = state => ({
61 - isAuthenticated: state.auth.isAuthenticated,
62 }); 41 });
63 42
64 export default connect(mapStateToProps)(App); 43 export default connect(mapStateToProps)(App);
......
1 -import React from 'react';
2 -import PropTypes from 'prop-types';
3 -import { withRouter } from 'react-router-dom';
4 -import { ListGroup, ListGroupItem, InputGroup, InputGroupAddon, Input, InputGroupText } from 'reactstrap';
5 -import $ from 'jquery';
6 -
7 -import * as a1 from '../../images/people/a1.jpg';
8 -import * as a2 from '../../images/people/a2.jpg';
9 -import * as a3 from '../../images/people/a3.jpg';
10 -import * as a4 from '../../images/people/a4.jpg';
11 -import * as a5 from '../../images/people/a5.jpg';
12 -import * as a6 from '../../images/people/a6.jpg';
13 -import * as avatar from '../../images/avatar.png';
14 -
15 -import s from './Chat.module.scss';
16 -
17 -class Chat extends React.Component {
18 - static propTypes = {
19 - chatOpen: PropTypes.bool,
20 - };
21 -
22 - static defaultProps = {
23 - chatOpen: false,
24 - };
25 -
26 - constructor(props) {
27 - super(props);
28 -
29 - this.handleChangeContacts = this.handleChangeContacts.bind(this);
30 - this.openMessages = this.openMessages.bind(this);
31 - this.filterConversations = this.filterConversations.bind(this);
32 - this.filterMessages = this.filterMessages.bind(this);
33 - this.addMessage = this.addMessage.bind(this);
34 -
35 - this.state = {
36 - todayConversations: [{
37 - name: 'Chris Gray',
38 - status: 'success',
39 - lastMessage: 'Hey! What\'s up? So many times since we',
40 - image: a2,
41 - messages: [{
42 - id: 0,
43 - text: 'Hey! What\'s up?',
44 - }, {
45 - id: 1,
46 - text: 'Are you there?',
47 - }, {
48 - id: 2,
49 - text: 'Let me know when you come back.',
50 - }, {
51 - id: 3,
52 - text: 'I am here!',
53 - fromMe: true,
54 - }],
55 - }, {
56 - name: 'Jamey Brownlow',
57 - status: 'gray-light',
58 - lastMessage: 'Good news coming tonight. Seems they agreed to proceed',
59 - image: avatar,
60 - }, {
61 - name: 'Livia Walsh',
62 - status: 'danger',
63 - lastMessage: 'Check out my latest email plz!',
64 - image: a1,
65 - }, {
66 - name: 'Jaron Fitzroy',
67 - status: 'gray-light',
68 - lastMessage: 'What about summer break?',
69 - image: avatar,
70 - }, {
71 - name: 'Mike Lewis',
72 - status: 'success',
73 - lastMessage: 'Just ain\'t sure about the weekend now. 90% I\'ll make it.',
74 - image: a4,
75 - }],
76 - lastWeekConversations: [{
77 - name: 'Freda Edison',
78 - status: 'gray-light',
79 - lastMessage: 'Hey what\'s up? Me and Monica going for a lunch somewhere. Wanna join?',
80 - image: a6,
81 - }, {
82 - name: 'Livia Walsh',
83 - status: 'success',
84 - lastMessage: 'Check out my latest email plz!',
85 - image: a5,
86 - }, {
87 - name: 'Jaron Fitzroy',
88 - status: 'warning',
89 - lastMessage: 'What about summer break?',
90 - image: a3,
91 - }, {
92 - name: 'Mike Lewis',
93 - status: 'gray-light',
94 - lastMessage: 'Just ain\'t sure about the weekend now. 90% I\'ll make it.',
95 - image: avatar,
96 - }],
97 - chatMessageOpened: true,
98 - conversation: Object,
99 - searchValue: '',
100 - };
101 - }
102 -
103 - openMessages(conversation, e) {
104 - this.setState({
105 - conversation,
106 - chatMessageOpened: false,
107 - });
108 - $(e.currentTarget).removeClass('active').find('.badge').remove();
109 - }
110 -
111 - addMessage(e) {
112 - if (e.key === 'Enter') {
113 - const value = {
114 - text: e.target.value,
115 - fromMe: true,
116 - };
117 -
118 - this.setState({
119 - conversation: Object.assign({}, this.state.conversation, {
120 - messages: [
121 - ...this.state.conversation.messages || [],
122 - value,
123 - ],
124 - }),
125 - });
126 -
127 - e.target.value = ''; // eslint-disable-line
128 - }
129 - }
130 -
131 - handleChangeContacts(event) {
132 - this.setState({ searchValue: event.target.value });
133 - }
134 -
135 - filterConversations(item) {
136 - const isFindName = item.name.toLowerCase()
137 - .indexOf(this.state.searchValue.toLowerCase()) !== -1;
138 - const isFindMessage = item.lastMessage.toLowerCase()
139 - .indexOf(this.state.searchValue.toLowerCase()) !== -1;
140 - return isFindName || isFindMessage;
141 - }
142 -
143 - filterMessages(item) {
144 - return item.text.toLowerCase().indexOf(this.state.searchValue.toLowerCase()) !== -1;
145 - }
146 -
147 - render() {
148 - return (
149 - <aside className={[s.root, this.props.chatOpen ? s.chatOpen : ''].join(' ')}>
150 - <header className={s.chatHeader}>
151 - <h4 className={s.chatTitle}>Contacts</h4>
152 - <div className="input-group input-group-transparent">
153 - <InputGroup size="sm">
154 - <Input placeholder="Search..." value={this.state.searchValue} onChange={this.handleChangeContacts} />
155 - <InputGroupAddon addonType="append">
156 - <InputGroupText>
157 - <i className="fa fa-search"/>
158 - </InputGroupText>
159 - </InputGroupAddon>
160 - </InputGroup>
161 - </div>
162 - </header>
163 - <div className={[s.chatPanel, s.chatContacts, this.state.chatMessageOpened ? s.chatMessageOpen : ''].join(' ')}>
164 - <h5 className={s.navTitle}>TODAY</h5>
165 - <ListGroup id="chat-sidebar-user-group" className={s.chatSidebarUserGroup}>
166 - {this.state.todayConversations
167 - .filter(this.filterConversations)
168 - .map(item =>
169 - <ListGroupItem
170 - key={item.name}
171 - onClick={e => this.openMessages(item, e)}
172 - >
173 - <i className={['fa fa-circle float-right', `text-${item.status}`].join(' ')} />
174 - <span className="thumb-sm float-left mr">
175 - <img className="rounded-circle" src={item.image} alt="..." />
176 - </span>
177 - <div>
178 - <h6 className={s.messageSender}>{item.name}</h6>
179 - <p className={s.messagePreview}>{item.lastMessage}</p>
180 - </div>
181 - </ListGroupItem>,
182 - )}
183 - </ListGroup>
184 -
185 - <h5 className={s.navTitle}>LAST WEEK</h5>
186 - <ListGroup className={s.chatSidebarUserGroup}>
187 - {this.state.lastWeekConversations
188 - .filter(this.filterConversations)
189 - .map(item =>
190 - <ListGroupItem
191 - key={item.name}
192 - onClick={e => this.openMessages(item, e)}
193 - >
194 - <i className={['fa fa-circle float-right', `text-${item.status}`].join(' ')} />
195 - <span className="thumb-sm pull-left mr">
196 - <img className="rounded-circle" src={item.image} alt="..." />
197 - </span>
198 - <div>
199 - <h6 className={s.messageSender}>{item.name}</h6>
200 - <p className={s.messagePreview}>{item.lastMessage}</p>
201 - </div>
202 - </ListGroupItem>,
203 - )}
204 - </ListGroup>
205 - </div>
206 - <div className={[s.chatPanel, s.chatMessages, this.state.chatMessageOpened ? '' : s.chatMessageOpen].join(' ')}>
207 - <h6 className={s.messagesTitle}>
208 - {/* eslint-disable */}
209 - <a onClick={() => this.setState({ chatMessageOpened: true })}>
210 - <i className="fa fa-angle-left mr-xs" />
211 - {this.state.conversation.name}
212 - </a>
213 - {/* eslint-disable */}
214 - </h6>
215 - <ListGroup>
216 - {this.state.conversation.messages &&
217 - this.state.conversation.messages
218 - .filter(this.filterMessages)
219 - .map(item => <ListGroupItem key={item.id} className={[item.fromMe ? s.fromMe : '', s.messageItem]}>
220 - <span className="thumb-sm">
221 - <img className="rounded-circle"
222 - src={item.fromMe ? avatar : this.state.conversation.image} alt="..."/>
223 - </span>
224 - <div className={s.messageBody}>{item.text}</div>
225 - </ListGroupItem>,
226 - )}
227 - </ListGroup>
228 -
229 - <footer className={[s.chatFooter, 'form-group'].join(' ')}>
230 - <input className="form-control fs-mini" onKeyPress={this.addMessage} type="text"
231 - placeholder="Type your message"/>
232 - </footer>
233 - </div>
234 - </aside>
235 - );
236 - }
237 -}
238 -
239 -export default withRouter(Chat);
1 -@import '../../styles/app';
2 -
3 -.root {
4 - position: fixed;
5 - overflow: hidden;
6 - top: 0;
7 - bottom: 0;
8 - right: -$chat-sidebar-width-open;
9 - width: $chat-sidebar-width-open;
10 - border-left: $sidebar-border;
11 - background-color: var(--chat-sidebar-bg-color);
12 - color: #aaa;
13 - transition: right 0.3s ease-in-out;
14 -
15 - @include media-breakpoint-down(md) {
16 - right: -($chat-sidebar-width-open + 25px);
17 - width: $chat-sidebar-width-open + 25px;
18 - }
19 -
20 - &.chatOpen {
21 - right: 0;
22 - }
23 -
24 - .chatHeader {
25 - position: absolute;
26 - width: 100%;
27 - top: 0;
28 - z-index: 3;
29 - padding: 10px;
30 - background-color: var(--chat-sidebar-bg-color);
31 -
32 - input {
33 - padding: 0.6rem 0.85rem;
34 - line-height: 1.5;
35 - }
36 -
37 - .chatTitle {
38 - margin: 10px;
39 - text-transform: uppercase;
40 - font-size: 15px;
41 - font-weight: 400;
42 - }
43 - }
44 -
45 - .chatPanel {
46 - position: absolute;
47 - top: 0;
48 - bottom: 0;
49 - width: 100%;
50 -
51 - :global .list-group-item {
52 - border: 0;
53 - padding: 10px 20px;
54 - z-index: 1;
55 -
56 - .cirle {
57 - font-size: 11px;
58 - line-height: 37px;
59 - margin-left: auto;
60 - }
61 - }
62 -
63 - .navTitle {
64 - margin: 35px 10px 5px 20px;
65 - font-size: 14px;
66 - }
67 -
68 - .navTitle:first-child {
69 - margin-top: 0;
70 - }
71 -
72 - .messageSender {
73 - text-overflow: ellipsis;
74 - color: var(--sidebar-color);
75 - }
76 -
77 - .messagePreview {
78 - margin: 0;
79 - width: 100px;
80 - white-space: nowrap;
81 - overflow: hidden;
82 - text-overflow: ellipsis;
83 - font-size: 85%;
84 - color: #999;
85 - }
86 - }
87 -
88 - .chatContacts {
89 - padding-top: 105px;
90 - left: -100%;
91 - transition: left 0.2s ease-in-out;
92 -
93 - :global .list-group {
94 - margin-top: 10px;
95 -
96 - :global .list-group-item {
97 - cursor: pointer;
98 - }
99 - }
100 -
101 - &.chatMessageOpen {
102 - left: 0;
103 - overflow-y: auto;
104 -
105 - @include scroll-bar(rgba($white, 0.3));
106 - }
107 - }
108 -
109 - .chatMessages {
110 - padding-top: 100px;
111 - right: -100%;
112 - transition: right 0.2s ease-in-out;
113 - background-color: var(--sidebar-bg-color);
114 -
115 - :global .list-group {
116 - position: absolute;
117 - top: 134px; // header height
118 - bottom: 47px; // footer height
119 - width: 100%;
120 - padding-top: 0.5rem;
121 - overflow-y: auto;
122 -
123 - @include scroll-bar(rgba($white, 0.3));
124 -
125 - :global .list-group-item {
126 - align-items: flex-start;
127 - }
128 -
129 - :global .thumb-sm {
130 - float: left;
131 - }
132 - }
133 -
134 - .messageBody {
135 - position: relative;
136 - margin-left: 50px;
137 - padding: 10px;
138 - font-size: 13px;
139 - font-weight: $font-weight-normal;
140 - background-color: $gray-200;
141 - color: $text-color;
142 - border-radius: 0.25rem;
143 -
144 - &::before {
145 - right: 100%;
146 - top: 8px;
147 - content: '';
148 - height: 0;
149 - width: 0;
150 - position: absolute;
151 - border: 10px solid rgba(0, 0, 0, 0);
152 - border-right-color: $gray-200;
153 - }
154 - }
155 -
156 - .fromMe {
157 - flex-direction: row-reverse;
158 -
159 - :global .thumb-sm {
160 - float: right;
161 - }
162 -
163 - .messageBody {
164 - margin-left: 0;
165 - margin-right: 50px;
166 - background-color: theme-color('warning');
167 - color: $gray-800;
168 -
169 - &::before {
170 - right: auto;
171 - left: 100%;
172 - border-right-color: rgba(0, 0, 0, 0);
173 - border-left-color: theme-color('warning');
174 - }
175 - }
176 - }
177 -
178 - .chatFooter {
179 - position: absolute;
180 - z-index: 1;
181 - bottom: 0;
182 - width: 100%;
183 - margin-bottom: 0;
184 - padding: 10px;
185 - background-color: $white;
186 - }
187 -
188 - &.chatMessageOpen {
189 - right: 0;
190 - }
191 -
192 - .messagesTitle {
193 - margin-bottom: 0;
194 -
195 - a {
196 - display: block;
197 - margin-top: -7px;
198 - padding: 17px 16px;
199 - }
200 - }
201 - }
202 -
203 - .chatSidebarUserGroup {
204 - :global .list-group-item {
205 - transition: $transition-base;
206 - }
207 -
208 - :global .list-group-item.active {
209 - background: rgba($white, 0.1);
210 - }
211 -
212 - :global .list-group-item.active h6 {
213 - color: theme-color('warning');
214 - font-weight: $badge-font-weight;
215 - }
216 -
217 - :global .list-group-item:hover {
218 - background: var(--sidebar-action-bg);
219 - }
220 -
221 - :global .badge {
222 - margin: 8px 5px 0 0;
223 - padding: 3px 5px;
224 - }
225 -
226 - :global .fa {
227 - margin-top: 11px;
228 - }
229 - }
230 -
231 - .messageItem {
232 - &:hover {
233 - background: transparent;
234 - }
235 - }
236 -}
1 -import React from 'react';
2 -import { connect } from 'react-redux';
3 -import PropTypes from 'prop-types';
4 -import { withRouter } from 'react-router';
5 -import {
6 - Navbar,
7 - Nav,
8 - Dropdown,
9 - NavItem,
10 - NavLink,
11 - Badge,
12 - DropdownToggle,
13 - DropdownMenu,
14 - DropdownItem,
15 - UncontrolledTooltip,
16 - InputGroupAddon,
17 - InputGroup,
18 - Input,
19 - Form,
20 - FormGroup,
21 -} from 'reactstrap';
22 -import $ from 'jquery';
23 -
24 -import Notifications from '../Notifications';
25 -import { logoutUser } from '../../actions/user';
26 -import { toggleSidebar, openSidebar, closeSidebar, changeActiveSidebarItem } from '../../actions/navigation';
27 -
28 -import a5 from '../../images/people/a5.jpg';
29 -import a6 from '../../images/people/a6.jpg';
30 -
31 -import s from './Header.module.scss'; // eslint-disable-line css-modules/no-unused-class
32 -
33 -class Header extends React.Component {
34 - static propTypes = {
35 - sidebarOpened: PropTypes.bool.isRequired,
36 - sidebarStatic: PropTypes.bool.isRequired,
37 - chatToggle: PropTypes.func.isRequired,
38 - dispatch: PropTypes.func.isRequired,
39 - location: PropTypes.shape({
40 - pathname: PropTypes.string,
41 - }).isRequired,
42 - };
43 -
44 - constructor(props) {
45 - super(props);
46 -
47 - this.toggleMenu = this.toggleMenu.bind(this);
48 - this.switchSidebar = this.switchSidebar.bind(this);
49 - this.toggleNotifications = this.toggleNotifications.bind(this);
50 - this.toggleSidebar = this.toggleSidebar.bind(this);
51 - this.doLogout = this.doLogout.bind(this);
52 -
53 - this.state = {
54 - menuOpen: false,
55 - notificationsOpen: false,
56 - notificationsTabSelected: 1,
57 - };
58 - }
59 - componentDidMount() {
60 - if (window.innerWidth > 576) {
61 - setTimeout(() => {
62 - const $chatNotification = $('#chat-notification');
63 - $chatNotification.removeClass('hide').addClass('animated fadeIn')
64 - .one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', () => {
65 - $chatNotification.removeClass('animated fadeIn');
66 - setTimeout(() => {
67 - $chatNotification.addClass('animated fadeOut')
68 - .one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd' +
69 - ' oanimationend animationend', () => {
70 - $chatNotification.addClass('hide');
71 - });
72 - }, 6000);
73 - });
74 - $chatNotification.siblings('#toggle-chat')
75 - .append('<i class="chat-notification-sing animated bounceIn"></i>');
76 - }, 4000);
77 - }
78 -
79 - $('#search-input').on('blur focus', (e) => {
80 - $('#search-input').parents('.input-group')[e.type === 'focus' ? 'addClass' : 'removeClass']('focus');
81 - });
82 - }
83 -
84 - toggleNotifications() {
85 - this.setState({
86 - notificationsOpen: !this.state.notificationsOpen,
87 - });
88 - }
89 -
90 - doLogout() {
91 - this.props.dispatch(logoutUser());
92 - }
93 -
94 - // collapse/uncolappse
95 - switchSidebar() {
96 - if (this.props.sidebarOpened) {
97 - this.props.dispatch(closeSidebar());
98 - this.props.dispatch(changeActiveSidebarItem(null));
99 - } else {
100 - const paths = this.props.location.pathname.split('/');
101 - paths.pop();
102 - this.props.dispatch(openSidebar());
103 - this.props.dispatch(changeActiveSidebarItem(paths.join('/')));
104 - }
105 - }
106 -
107 - // static/non-static
108 - toggleSidebar() {
109 - this.props.dispatch(toggleSidebar());
110 - if (this.props.sidebarStatic) {
111 - localStorage.setItem('staticSidebar', 'false');
112 - this.props.dispatch(changeActiveSidebarItem(null));
113 - } else {
114 - localStorage.setItem('staticSidebar', 'true');
115 - const paths = this.props.location.pathname.split('/');
116 - paths.pop();
117 - this.props.dispatch(changeActiveSidebarItem(paths.join('/')));
118 - }
119 - }
120 -
121 - toggleMenu() {
122 - this.setState({
123 - menuOpen: !this.state.menuOpen,
124 - });
125 - }
126 - render() {
127 - const user = JSON.parse(localStorage.getItem('user') || {});
128 -
129 - const firstUserLetter = (user.name|| user.email || "P")[0].toUpperCase();
130 -
131 - return (
132 - <Navbar className={`${s.root} d-print-none`}>
133 - <Nav>
134 - <NavItem>
135 - <NavLink className="d-md-down-none ml-5" id="toggleSidebar" onClick={this.toggleSidebar}>
136 - <i className="la la-bars" />
137 - </NavLink>
138 - <UncontrolledTooltip placement="bottom" target="toggleSidebar">
139 - Turn on/off<br />sidebar<br />collapsing
140 - </UncontrolledTooltip>
141 - <NavLink className="fs-lg d-lg-none" onClick={this.switchSidebar}>
142 - <span className="rounded rounded-lg bg-gray text-white d-md-none"><i className="la la-bars" /></span>
143 - <i className="la la-bars ml-3 d-sm-down-none" />
144 - </NavLink>
145 - </NavItem>
146 - <NavItem className="d-sm-down-none">
147 - <NavLink className="px-2">
148 - <i className="la la-refresh" />
149 - </NavLink>
150 - </NavItem>
151 - <NavItem className="d-sm-down-none">
152 - <NavLink className="px-2">
153 - <i className="la la-times" />
154 - </NavLink>
155 - </NavItem>
156 -
157 - </Nav>
158 -
159 - <Form className="d-sm-down-none ml-5" inline>
160 - <FormGroup>
161 - <InputGroup className="input-group-no-border">
162 - <InputGroupAddon addonType="prepend">
163 - <i className="la la-search" />
164 - </InputGroupAddon>
165 - <Input id="search-input" placeholder="Search Dashboard" />
166 - </InputGroup>
167 - </FormGroup>
168 - </Form>
169 -
170 - <NavLink className={`${s.navbarBrand} d-md-none`}>
171 - <i className="fa fa-circle text-gray mr-n-sm" />
172 - <i className="fa fa-circle text-warning" />
173 - &nbsp;
174 - sing
175 - &nbsp;
176 - <i className="fa fa-circle text-warning mr-n-sm" />
177 - <i className="fa fa-circle text-gray" />
178 - </NavLink>
179 -
180 - <Nav className="ml-auto">
181 - <Dropdown nav isOpen={this.state.notificationsOpen} toggle={this.toggleNotifications} id="basic-nav-dropdown" className={`${s.notificationsMenu} d-sm-down-none`}>
182 - <DropdownToggle nav caret>
183 - <span className={`${s.avatar} rounded-circle thumb-sm float-left mr-2`}>
184 - {user.avatar || user.email === "admin@flatlogic.com" ? (
185 - <img src={user.avatar || a5} alt="..."/>
186 - ) : (
187 - <span>{firstUserLetter}</span>
188 - )}
189 - </span>
190 - <span className="small">{user.name || user.email || "Philip smith"}</span>
191 - <span className="ml-1 circle bg-warning text-white fw-bold">13</span>
192 - </DropdownToggle>
193 - <DropdownMenu right className={`${s.notificationsWrapper} py-0 animated animated-fast fadeInUp`}>
194 - <Notifications />
195 - </DropdownMenu>
196 - </Dropdown>
197 - <Dropdown nav isOpen={this.state.menuOpen} toggle={this.toggleMenu} className="d-sm-down-none">
198 - <DropdownToggle nav>
199 - <i className="la la-cog" />
200 - </DropdownToggle>
201 - <DropdownMenu right className="super-colors">
202 - <DropdownItem><i className="la la-user" /> My Account</DropdownItem>
203 - <DropdownItem divider />
204 - <DropdownItem href="/calendar">Calendar</DropdownItem>
205 - <DropdownItem href="/inbox">Inbox &nbsp;&nbsp;<Badge color="danger" pill className="animated bounceIn">9</Badge></DropdownItem>
206 - <DropdownItem divider />
207 - <DropdownItem onClick={this.doLogout}><i className="la la-sign-out" /> Log Out</DropdownItem>
208 - </DropdownMenu>
209 - </Dropdown>
210 - <NavItem>
211 - <NavLink className="d-sm-down-none mr-5" id="toggle-chat" onClick={this.props.chatToggle}>
212 - <i className="la la-globe" />
213 - </NavLink>
214 - <div id="chat-notification" className={`${s.chatNotification} hide `}>
215 - <div className={s.chatNotificationInner}>
216 - <h6 className={`${s.title} d-flex`}>
217 - <span className="thumb-xs">
218 - <img src={a6} alt="" className="rounded-circle mr-xs float-left" />
219 - </span>
220 - Jess Smith
221 - </h6>
222 - <p className={s.text}>Hi there! <br /> This is a completely new version of Sing App <br /> built with <strong className="text-primary">React JS</strong> </p>
223 - </div>
224 - </div>
225 - </NavItem>
226 - <NavItem className="fs-lg d-md-none">
227 - <NavLink href="#" onClick={this.props.chatToggle}>
228 - <span className="rounded rounded-lg bg-gray text-white"><i className="la la-globe" /></span>
229 - </NavLink>
230 - </NavItem>
231 - </Nav>
232 - </Navbar>
233 - );
234 - }
235 -}
236 -
237 -function mapStateToProps(store) {
238 - return {
239 - sidebarOpened: store.navigation.sidebarOpened,
240 - sidebarStatic: store.navigation.sidebarStatic,
241 - };
242 -}
243 -
244 -export default withRouter(connect(mapStateToProps)(Header));
245 -
1 -@import '../../styles/app';
2 -
3 -.root {
4 - z-index: 100;
5 - background: var(--navbar-bg);
6 - box-shadow: var(--navbar-shadow);
7 -
8 - @include media-breakpoint-down(sm) {
9 - padding: 7px 0;
10 - }
11 -
12 - :global {
13 - .input-group {
14 - overflow: hidden;
15 - }
16 -
17 - .input-group-prepend {
18 - background-color: #fff;
19 - transition: background-color ease-in-out 0.15s;
20 - border-top-left-radius: 0.3rem;
21 - border-bottom-left-radius: 0.3rem;
22 - display: flex;
23 - justify-content: center;
24 - align-items: center;
25 - width: 35px;
26 - }
27 -
28 - .focus .input-group-prepend {
29 - background: #f8f9fa;
30 - }
31 - }
32 -}
33 -
34 -.logo {
35 - font-size: 16px;
36 -}
37 -
38 -.navbarForm {
39 - padding: 6px 0 6px 1rem;
40 - margin-left: 10px;
41 - display: inline-block;
42 - top: 2px;
43 - width: auto;
44 -
45 - .inputAddon {
46 - position: relative;
47 - display: inline;
48 - border: none;
49 - background-color: #fff;
50 - transition: background-color ease-in-out 0.15s;
51 - }
52 -
53 - input {
54 - border: none;
55 - padding: 0.6rem 0.85rem 0.6rem 0;
56 - display: inline !important;
57 - width: 250px !important;
58 - top: 2px;
59 - }
60 -}
61 -
62 -.chatNotification {
63 - position: absolute;
64 - right: 35px;
65 - top: 50px;
66 - z-index: 20;
67 - margin-top: 3px;
68 - padding: 5px 0;
69 - cursor: pointer;
70 -
71 - &::before {
72 - content: ' ';
73 - position: absolute;
74 - top: 0;
75 - right: 18px;
76 - width: 0;
77 - height: 0;
78 - border-left: 5px solid transparent;
79 - border-right: 5px solid transparent;
80 - border-bottom: 5px solid $gray-800;
81 - }
82 -
83 - .chatNotificationInner {
84 - min-width: 120px;
85 - padding: 8px;
86 - font-size: 12px;
87 - border-radius: 0.25rem;
88 - text-decoration: none;
89 - background-color: $gray-800;
90 - color: #fff;
91 - }
92 -
93 - .text {
94 - margin-top: 5px;
95 - margin-bottom: 0;
96 - color: $gray-600;
97 - }
98 -
99 - .title {
100 - margin: 0;
101 - font-weight: 600;
102 - line-height: 28px;
103 - font-size: 0.875rem;
104 -
105 - span {
106 - margin-right: 7px;
107 - }
108 - }
109 -}
110 -
111 -.navbarBrand {
112 - position: absolute;
113 - left: 0;
114 - right: 0;
115 - top: 0;
116 - bottom: 0;
117 - display: flex;
118 - justify-content: center;
119 - align-items: center;
120 - font-weight: 700;
121 - font-size: 1.25rem;
122 - pointer-events: none;
123 -
124 - i {
125 - font-size: 10px;
126 - }
127 -}
128 -
129 -.notificationsMenu {
130 - :global .dropdown-menu {
131 - left: auto !important;
132 - right: 0 !important;
133 - top: $navbar-height !important;
134 - }
135 -}
136 -
137 -.notificationsWrapper {
138 - width: min-content;
139 -}
140 -
141 -.avatar {
142 - display: flex;
143 - align-items: center;
144 - justify-content: center;
145 - overflow: hidden;
146 - height: 40px;
147 - width: 40px;
148 - background: $warning;
149 - font-weight: 600;
150 - font-size: 18px;
151 -}
1 -import React, { Component } from 'react';
2 -import cx from 'classnames';
3 -import { Button } from 'reactstrap';
4 -import PropTypes from 'prop-types';
5 -import { connect } from 'react-redux';
6 -import { DashboardThemes } from '../../reducers/layout';
7 -import { changeTheme } from '../../actions/layout';
8 -
9 -import Widget from '../Widget';
10 -
11 -import s from './Helper.module.scss'; // eslint-disable-line
12 -import themeDark from '../../images/theme-dark.png';
13 -import themeLight from '../../images/theme-light.png';
14 -
15 -class Helper extends Component {
16 - static propTypes = {
17 - dispatch: PropTypes.func.isRequired,
18 - dashboardTheme: PropTypes.string
19 - };
20 -
21 - static defaultProps = {
22 - dashboardTheme: DashboardThemes.DARK
23 - };
24 -
25 - state = { isOpened: false };
26 -
27 - toggle = () => {
28 - this.setState(prevState => ({
29 - isOpened: !prevState.isOpened,
30 - }));
31 - };
32 -
33 - changeTheme = (state) => {
34 - this.props.dispatch(changeTheme(state));
35 - };
36 -
37 - render() {
38 - const { isOpened } = this.state;
39 - return (
40 - <div className={cx(s.themeHelper, { [s.themeHelperOpened]: isOpened })}>
41 - <Widget
42 - className={s.themeHelperContent}
43 - bodyClass="mt-3"
44 - title={
45 - <header className={cx(s.themeHelperHeader, 'd-flex p-0')}>
46 - <Button color="warning" className={s.themeHelperBtn} onClick={this.toggle}>
47 - <div className={cx(s.themeHelperSpinner, 'text-white')}>
48 - <i className="la la-cog" />
49 - <i className="la la-cog" />
50 - </div>
51 - </Button>
52 - <h6>Theme</h6>
53 - </header>
54 - }
55 - >
56 - <div className={s.themeSwitcher}>
57 - <div className={cx(s.theme, "mb-3")}>
58 - <input checked={this.props.dashboardTheme === DashboardThemes.LIGHT} onClick={() => this.changeTheme(DashboardThemes.LIGHT)} type="radio" id="css-light" value="option2" name="theme-variant" aria-label="Sing Light" readOnly/>
59 - <label htmlFor="css-light">
60 - <img className={s.themeImage} src={themeLight} alt="light theme"/>
61 - </label>
62 - </div>
63 - <div className={s.theme}>
64 - <input checked={this.props.dashboardTheme === DashboardThemes.DARK} onClick={() => this.changeTheme(DashboardThemes.DARK)} type="radio" id="css-dark" value="option1" name="theme-variant" aria-label="Single Dark" readOnly/>
65 - <label htmlFor="css-dark">
66 - <img className={s.themeImage} src={themeDark} alt="dark theme"/>
67 - </label>
68 - </div>
69 - </div>
70 - <div className="mt-4">
71 - <Button
72 - href="https://flatlogic.com/admin-dashboards/sing-app-react"
73 - target="_blank"
74 - className="btn-rounded-f btn-block fs-mini"
75 - color="warning"
76 - >
77 - <span className="text-white">Purchase</span>
78 - </Button>
79 - <Button
80 - href="http://demo.flatlogic.com/sing-app/documentation/"
81 - target="_blank"
82 - className="btn-rounded-f btn-block fs-mini text-white"
83 - >
84 - Documentation
85 - </Button>
86 - </div>
87 - <div className="d-flex justify-content-between mt-lg">
88 - <Button
89 - href="https://flatlogic.com/contact"
90 - target="_blank"
91 - className="btn-outline-default btn-rounded-f fs-mini text-muted px-2"
92 - >
93 - <i className="glyphicon glyphicon-headphones mr-xs" />
94 - Support
95 - </Button>
96 - <Button
97 - href="https://github.com/flatlogic/sing-app"
98 - target="_blank"
99 - className="btn-outline-default btn-rounded-f fs-mini text-muted px-2"
100 - >
101 - <i className="fa fa-github mr-xs" />
102 - Github
103 - </Button>
104 - </div>
105 - <div className="mt-lg d-flex flex-column align-items-center theme-helper__sharing">
106 - <span className="fs-sm">
107 - Thank you for sharing!
108 - </span>
109 - <div className="d-flex justify-content-center text-light mt-2">
110 - <a
111 - target="_blank"
112 - rel="noopener noreferrer"
113 - href="https://twitter.com/intent/tweet?text=Amazing%20dashboard%20built%20with%20NodeJS,%20React%20and%20Bootstrap!&url=https://github.com/flatlogic/react-dashboard&via=flatlogic"
114 - >
115 - <i className="fa fa-twitter pr-1" />
116 - </a>
117 - <a
118 - href="https://www.facebook.com/search/top/?q=flatlogic%20llc"
119 - target="_blank"
120 - rel="noopener noreferrer"
121 - >
122 - <i className="fa fa-facebook pl-1" />
123 - </a>
124 - </div>
125 - </div>
126 - </Widget>
127 - </div>
128 - );
129 - }
130 -}
131 -
132 -function mapStateToProps(store) {
133 - return {
134 - dashboardTheme: store.layout.dashboardTheme,
135 - };
136 -}
137 -
138 -export default connect(mapStateToProps)(Helper);
1 -@import '../../styles/app';
2 -
3 -.themeHelper {
4 - width: $sidebar-width-open;
5 - position: fixed;
6 - right: -$sidebar-width-open;
7 - top: $navbar-height * 1.5;
8 - z-index: 100;
9 -
10 - @include transition(right $sidebar-transition-time ease-in-out);
11 -
12 - & :global {
13 - .abc-radio-secondary input[type="radio"]:not(:checked)+label::before {
14 - background-color: #798892;
15 - }
16 -
17 - .abc-radio-warning input[type="radio"]:not(:checked)+label::before {
18 - background-color: theme-color('warning');
19 - }
20 - }
21 -
22 - .themeSwitcher {
23 - display: flex;
24 - flex-direction: column;
25 - align-items: center;
26 -
27 - .theme {
28 - position: relative;
29 -
30 - &,
31 - & > label {
32 - width: 100%;
33 - height: max-content;
34 - }
35 -
36 - & > input {
37 - position: absolute;
38 - width: 0;
39 - height: 0;
40 - padding: 0;
41 - margin: 0;
42 - pointer-events: none;
43 - opacity: 0;
44 - }
45 -
46 - & > label {
47 - margin: 0;
48 - border: 1px solid $input-border-color;
49 - padding: 3px;
50 - border-radius: $border-radius;
51 - transition: background-color .2s ease-in-out;
52 - cursor: pointer;
53 - display: block;
54 -
55 - &:hover {
56 - background-color: $gray-200;
57 - }
58 - }
59 -
60 - & > input:checked + label {
61 - background-color: $gray-300;
62 - }
63 -
64 - .themeImage {
65 - width: 100%;
66 - }
67 - }
68 - }
69 -
70 - &.themeHelperOpened {
71 - right: 0;
72 - }
73 -
74 - .themeHelperBtn {
75 - position: absolute;
76 - width: $sidebar-width-open / 4;
77 - transform: translateX(-76px);
78 - margin-top: -($widget-padding-vertical);
79 - cursor: pointer;
80 - z-index: 200;
81 - border-radius: 50% 0 0 50%;
82 - padding: $spacer * 0.8 $spacer / 2 $spacer * 0.8 $spacer;
83 - &,
84 - &:not(.active) {
85 - box-shadow: $widget-shadow-designated !important;
86 - }
87 -
88 - i {
89 - animation-duration: 6500ms;
90 - animation-iteration-count: infinite;
91 - animation-timing-function: linear;
92 - }
93 -
94 - i:first-of-type {
95 - animation-name: spin;
96 - margin-right: -$spacer * 1.15;
97 - vertical-align: text-bottom;
98 - }
99 -
100 - i:last-of-type {
101 - animation-name: spin-reverse;
102 - vertical-align: $font-size-sm;
103 - }
104 - }
105 -
106 - .themeHelperSpinner {
107 - font-size: $font-size-lg * 1.4;
108 - line-height: initial;
109 - }
110 -
111 - .themeHelperHeader {
112 - padding-top: 0;
113 -
114 - h6 {
115 - margin: auto;
116 - }
117 - }
118 -
119 - .themeHelperContent {
120 - box-shadow: $widget-shadow-designated;
121 - border-radius: 0;
122 - }
123 -
124 - .themeHelperSharing {
125 - font-size: $font-size-lg;
126 - cursor: pointer;
127 - }
128 -
129 - :global .glyphicon {
130 - vertical-align: top;
131 - }
132 -
133 - @keyframes spin {
134 - 0% {
135 - transform: rotate(0deg);
136 - }
137 -
138 - 50% {
139 - transform: rotate(360deg);
140 - }
141 - }
142 -
143 - @keyframes spin-reverse {
144 - 0% {
145 - transform: rotate(0deg);
146 - }
147 -
148 - 50% {
149 - transform: rotate(-360deg);
150 - }
151 - }
152 -}
1 -import React from 'react';
2 -import PropTypes from 'prop-types';
3 -import Formsy from 'formsy-react';
4 -
5 -Formsy.addValidationRule('isRange', (values, value, array) => (value >= array[0] && value <= array[1]));
6 -
7 -class InputValidation extends React.Component {
8 - /* eslint-disable */
9 - static propTypes = {
10 - trigger: PropTypes.string,
11 - type: PropTypes.string,
12 - className: PropTypes.string,
13 - name: PropTypes.string,
14 - id: PropTypes.string,
15 - placeholder: PropTypes.string,
16 - setValue: PropTypes.func,
17 - isFormSubmitted: PropTypes.func,
18 - getErrorMessage: PropTypes.func,
19 - showRequired: PropTypes.func,
20 - };
21 - /* eslint-enable */
22 -
23 - static defaultProps = {
24 - trigger: null,
25 - type: 'text',
26 - className: '',
27 - name: '',
28 - id: '',
29 - placeholder: '',
30 - };
31 -
32 - constructor() {
33 - super();
34 - this.changeValue = this.changeValue.bind(this);
35 - }
36 -
37 - changeValue(event) {
38 - this.props.setValue(event.currentTarget.value);
39 - }
40 -
41 - render() {
42 - const errorMessageObj = (this.props.isFormSubmitted() || this.props.trigger) ? this.props.getErrorMessage() : null;
43 - const required = (this.props.isFormSubmitted() && this.props.showRequired()) ?
44 - <span className={'help-block text-danger'}>This value is required.</span> : null;
45 - const errorMsg = [];
46 - if (errorMessageObj) {
47 - Object.keys(errorMessageObj).forEach((type) => {
48 - errorMsg.push(errorMessageObj[type]);
49 - });
50 - }
51 - const errorList = errorMsg.map((msg, index) =>
52 - <span key={`msg-err-${index.toString()}`} className={'help-block text-danger'}>{msg}</span>,
53 - );
54 -
55 - return (
56 - <div className={this.props.className}>
57 - <input
58 - type={this.props.type}
59 - name={this.props.name}
60 - id={this.props.id}
61 - className={'form-control'}
62 - onBlur={this.changeValue}
63 - placeholder={this.props.placeholder}
64 - />
65 - {required}
66 - {errorList}
67 - </div>
68 - );
69 - }
70 -}
71 -
72 -export default Formsy.HOC(InputValidation);
...@@ -3,64 +3,14 @@ import PropTypes from 'prop-types'; ...@@ -3,64 +3,14 @@ import PropTypes from 'prop-types';
3 import { connect } from 'react-redux'; 3 import { connect } from 'react-redux';
4 import { Switch, Route, withRouter, Redirect } from 'react-router'; 4 import { Switch, Route, withRouter, Redirect } from 'react-router';
5 import { TransitionGroup, CSSTransition } from 'react-transition-group'; 5 import { TransitionGroup, CSSTransition } from 'react-transition-group';
6 -import $ from 'jquery';
7 import Hammer from 'rc-hammerjs'; 6 import Hammer from 'rc-hammerjs';
8 7
9 -import Profile from '../../pages/profile'; 8 +import Main from '../../pages/videoAnalysis/VideoAnalysis';
10 -import UIButtons from '../../pages/ui-elements/buttons'; 9 +import Subject from '../../pages/subject';
11 -import UIIcons from '../../pages/ui-elements/icons';
12 -import UITabsAccordion from '../../pages/ui-elements/tabs-accordion/';
13 -import UINotifications from '../../pages/ui-elements/notifications';
14 -import UIListGroups from '../../pages/ui-elements/list-groups';
15 -import FormsElements from '../../pages/forms/elements';
16 -import FormsValidation from '../../pages/forms/validation';
17 -import FormsWizard from '../../pages/forms/wizard';
18 -import TablesStatic from '../../pages/tables/static';
19 -import TablesDynamic from '../../pages/tables/dynamic';
20 -import MapsGoogle from '../../pages/maps/google';
21 -import MapsVector from '../../pages/maps/vector';
22 -import ExtraCalendar from '../../pages/extra/calendar';
23 -import ExtraInvoice from '../../pages/extra/invoice';
24 -import ExtraSearch from '../../pages/extra/search';
25 -import ExtraTimeline from '../../pages/extra/timeline';
26 -import ExtraGallery from '../../pages/extra/gallery';
27 -import Grid from '../../pages/grid';
28 -import Widgets from '../../pages/widgets';
29 -import Products from '../../pages/products';
30 -import Management from '../../pages/management';
31 -import Product from '../../pages/product';
32 -import Package from '../../pages/package';
33 -import Email from '../../pages/email';
34 -import CoreTypography from '../../pages/core/typography';
35 -import CoreColors from '../../pages/core/colors';
36 -import CoreGrid from '../../pages/core/grid';
37 -import UIAlerts from '../../pages/ui-elements/alerts';
38 -import UIBadge from '../../pages/ui-elements/badge';
39 -import UICard from '../../pages/ui-elements/card';
40 -import UICarousel from '../../pages/ui-elements/carousel';
41 -import UIJumbotron from '../../pages/ui-elements/jumbotron';
42 -import UIModal from '../../pages/ui-elements/modal';
43 -import UIProgress from '../../pages/ui-elements/progress';
44 -import UINavbar from '../../pages/ui-elements/navbar';
45 -import UINav from '../../pages/ui-elements/nav';
46 -import UIPopovers from '../../pages/ui-elements/popovers';
47 -import Charts from '../../pages/charts';
48 -import ChartsEasyPie from '../../pages/charts/easy-pie';
49 -import ChartsMorris from '../../pages/charts/morris';
50 -import ChartsFlot from '../../pages/charts/flot';
51 -import ChartsSparkline from '../../pages/charts/sparkline';
52 -import ChartsRickshaw from '../../pages/charts/rickshaw';
53 -import DashboardAnalytics from '../../pages/analytics';
54 -import Dashboard from '../../pages/dashboard';
55 -
56 -import Header from '../Header';
57 import Sidebar from '../Sidebar'; 10 import Sidebar from '../Sidebar';
58 -import Chat from '../Chat';
59 -import Helper from '../Helper';
60 import { openSidebar, closeSidebar, changeActiveSidebarItem, toggleSidebar } from '../../actions/navigation'; 11 import { openSidebar, closeSidebar, changeActiveSidebarItem, toggleSidebar } from '../../actions/navigation';
61 import s from './Layout.module.scss'; 12 import s from './Layout.module.scss';
62 import { DashboardThemes } from '../../reducers/layout'; 13 import { DashboardThemes } from '../../reducers/layout';
63 -import ProductEdit from '../../pages/management/components/productEdit';
64 14
65 class Layout extends React.Component { 15 class Layout extends React.Component {
66 static propTypes = { 16 static propTypes = {
...@@ -77,16 +27,10 @@ class Layout extends React.Component { ...@@ -77,16 +27,10 @@ class Layout extends React.Component {
77 }; 27 };
78 constructor(props) { 28 constructor(props) {
79 super(props); 29 super(props);
80 -
81 - this.chatToggle = this.chatToggle.bind(this);
82 this.handleSwipe = this.handleSwipe.bind(this); 30 this.handleSwipe = this.handleSwipe.bind(this);
83 -
84 - this.state = {
85 - chatOpen: false,
86 - };
87 } 31 }
88 32
89 - componentDidMount() { 33 + async componentDidMount() {
90 const staticSidebar = JSON.parse(localStorage.getItem('staticSidebar')); 34 const staticSidebar = JSON.parse(localStorage.getItem('staticSidebar'));
91 if (staticSidebar && window.innerWidth > 768) { 35 if (staticSidebar && window.innerWidth > 768) {
92 this.props.dispatch(toggleSidebar()); 36 this.props.dispatch(toggleSidebar());
...@@ -96,7 +40,6 @@ class Layout extends React.Component { ...@@ -96,7 +40,6 @@ class Layout extends React.Component {
96 this.props.dispatch(changeActiveSidebarItem(null)); 40 this.props.dispatch(changeActiveSidebarItem(null));
97 }, 2500); 41 }, 2500);
98 } 42 }
99 -
100 this.handleResize(); 43 this.handleResize();
101 window.addEventListener('resize', this.handleResize.bind(this)); 44 window.addEventListener('resize', this.handleResize.bind(this));
102 } 45 }
...@@ -111,35 +54,15 @@ class Layout extends React.Component { ...@@ -111,35 +54,15 @@ class Layout extends React.Component {
111 } 54 }
112 } 55 }
113 56
114 - chatToggle() {
115 - this.setState({ chatOpen: !this.state.chatOpen });
116 - $('.chat-notification-sing').remove();
117 -
118 - setTimeout(() => {
119 - // demo: add class & badge to indicate incoming messages from contact
120 - // .js-notification-added ensures notification added only once
121 - $('#chat-sidebar-user-group').find('.list-group-item:first-child:not(.js-notification-added)')
122 - .addClass('active js-notification-added')
123 - .find('.fa-circle')
124 - .after('<span class="badge badge-danger badge-pill ' +
125 - 'float-right animated bounceInDown">3</span>');
126 - }, 1000);
127 - }
128 -
129 handleSwipe(e) { 57 handleSwipe(e) {
130 if ('ontouchstart' in window) { 58 if ('ontouchstart' in window) {
131 - if (e.direction === 4 && !this.state.chatOpen) {
132 this.props.dispatch(openSidebar()); 59 this.props.dispatch(openSidebar());
133 return; 60 return;
134 } 61 }
135 -
136 if (e.direction === 2 && this.props.sidebarOpened) { 62 if (e.direction === 2 && this.props.sidebarOpened) {
137 this.props.dispatch(closeSidebar()); 63 this.props.dispatch(closeSidebar());
138 return; 64 return;
139 } 65 }
140 -
141 - this.setState({ chatOpen: e.direction === 2 });
142 - }
143 } 66 }
144 67
145 render() { 68 render() {
...@@ -148,7 +71,6 @@ class Layout extends React.Component { ...@@ -148,7 +71,6 @@ class Layout extends React.Component {
148 className={[ 71 className={[
149 s.root, 72 s.root,
150 this.props.sidebarStatic ? s.sidebarStatic : '', 73 this.props.sidebarStatic ? s.sidebarStatic : '',
151 - this.state.chatOpen ? s.chatOpen : '',
152 !this.props.sidebarOpened ? s.sidebarClose : '', 74 !this.props.sidebarOpened ? s.sidebarClose : '',
153 'sing-dashboard', 75 'sing-dashboard',
154 'dashboard-' + this.props.dashboardTheme, 76 'dashboard-' + this.props.dashboardTheme,
...@@ -156,10 +78,6 @@ class Layout extends React.Component { ...@@ -156,10 +78,6 @@ class Layout extends React.Component {
156 > 78 >
157 <Sidebar /> 79 <Sidebar />
158 <div className={s.wrap}> 80 <div className={s.wrap}>
159 - <Header chatToggle={this.chatToggle} />
160 - <Chat chatOpen={this.state.chatOpen} />
161 - <Helper />
162 -
163 <Hammer onSwipe={this.handleSwipe}> 81 <Hammer onSwipe={this.handleSwipe}>
164 <main className={s.content}> 82 <main className={s.content}>
165 <TransitionGroup> 83 <TransitionGroup>
...@@ -169,68 +87,13 @@ class Layout extends React.Component { ...@@ -169,68 +87,13 @@ class Layout extends React.Component {
169 timeout={200} 87 timeout={200}
170 > 88 >
171 <Switch> 89 <Switch>
172 - <Route path="/app/main" exact render={() => <Redirect to="/app/main/analytics" />} /> 90 + <Route path="/app/main/" exact component={Main} />
173 - <Route path="/app/main/dashboard" exact component={Dashboard} /> 91 + <Route path="/app/subject" exact component={Subject} />
174 - <Route path="/app/main/widgets" exact component={Widgets} />
175 - <Route path="/app/main/analytics" exact component={DashboardAnalytics} />
176 - <Route path="/app/ecommerce/management" exact component={Management} />
177 - <Route path="/app/ecommerce/management/:id" exact component={ProductEdit} />
178 - <Route path="/app/ecommerce/management/create" exact component={ProductEdit} />
179 - <Route path="/app/ecommerce/products" exact component={Products} />
180 - <Route path="/app/ecommerce/product" exact component={Product} />
181 - <Route path="/app/ecommerce/product/:id" exact component={Product} />
182 - <Route path="/app/profile" exact component={Profile} />
183 - <Route path="/app/inbox" exact component={Email} />
184 - <Route path="/app/ui" exact render={() => <Redirect to="/app/ui/components" />} />
185 - <Route path="/app/ui/buttons" exact component={UIButtons} />
186 - <Route path="/app/ui/icons" exact component={UIIcons} />
187 - <Route path="/app/ui/tabs-accordion" exact component={UITabsAccordion} />
188 - <Route path="/app/ui/notifications" exact component={UINotifications} />
189 - <Route path="/app/ui/list-groups" exact component={UIListGroups} />
190 - <Route path="/app/ui/alerts" exact component={UIAlerts} />
191 - <Route path="/app/ui/badge" exact component={UIBadge} />
192 - <Route path="/app/ui/card" exact component={UICard} />
193 - <Route path="/app/ui/carousel" exact component={UICarousel} />
194 - <Route path="/app/ui/jumbotron" exact component={UIJumbotron} />
195 - <Route path="/app/ui/modal" exact component={UIModal} />
196 - <Route path="/app/ui/popovers" exact component={UIPopovers} />
197 - <Route path="/app/ui/progress" exact component={UIProgress} />
198 - <Route path="/app/ui/navbar" exact component={UINavbar} />
199 - <Route path="/app/ui/nav" exact component={UINav} />
200 - <Route path="/app/grid" exact component={Grid} />
201 - <Route path="/app/package" exact component={Package} />
202 - <Route path="/app/forms" exact render={() => <Redirect to="/app/forms/elements" />} />
203 - <Route path="/app/forms/elements" exact component={FormsElements} />
204 - <Route path="/app/forms/validation" exact component={FormsValidation} />
205 - <Route path="/app/forms/wizard" exact component={FormsWizard} />
206 - <Route path="/app/charts/" exact render={() => <Redirect to="/app/charts/overview" />} />
207 - <Route path="/app/charts/overview" exact component={Charts} />
208 - <Route path="/app/charts/easy-pie" exact component={ChartsEasyPie} />
209 - <Route path="/app/charts/morris" exact component={ChartsMorris} />
210 - <Route path="/app/charts/flot" exact component={ChartsFlot} />
211 - <Route path="/app/charts/sparkline" exact component={ChartsSparkline} />
212 - <Route path="/app/charts/rickshaw" exact component={ChartsRickshaw} />
213 - <Route path="/app/tables" exact render={() => <Redirect to="/app/tables/static" />} />
214 - <Route path="/app/tables/static" exact component={TablesStatic} />
215 - <Route path="/app/tables/dynamic" exact component={TablesDynamic} />
216 - <Route path="/app/extra" exact render={() => <Redirect to="/app/extra/calendar" />} />
217 - <Route path="/app/extra/calendar" exact component={ExtraCalendar} />
218 - <Route path="/app/extra/invoice" exact component={ExtraInvoice} />
219 - <Route path="/app/extra/search" exact component={ExtraSearch} />
220 - <Route path="/app/extra/timeline" exact component={ExtraTimeline} />
221 - <Route path="/app/extra/gallery" exact component={ExtraGallery} />
222 - <Route path="/app/maps" exact render={() => <Redirect to="/app/maps/google" />} />
223 - <Route path="/app/maps/google" exact component={MapsGoogle} />
224 - <Route path="/app/maps/vector" exact component={MapsVector} />
225 - <Route path="/app/core" exact render={() => <Redirect to="/app/core/typography" />} />
226 - <Route path="/app/core/typography" exact component={CoreTypography} />
227 - <Route path="/app/core/colors" exact component={CoreColors} />
228 - <Route path="/app/core/grid" exact component={CoreGrid} />
229 </Switch> 92 </Switch>
230 </CSSTransition> 93 </CSSTransition>
231 </TransitionGroup> 94 </TransitionGroup>
232 <footer className={s.contentFooter}> 95 <footer className={s.contentFooter}>
233 - Sing App React Admin Dashboard Template - Made by <a href="https://flatlogic.com" rel="nofollow noopener noreferrer" target="_blank">Flatlogic</a> 96 + OSS project
234 </footer> 97 </footer>
235 </main> 98 </main>
236 </Hammer> 99 </Hammer>
...@@ -245,6 +108,7 @@ function mapStateToProps(store) { ...@@ -245,6 +108,7 @@ function mapStateToProps(store) {
245 sidebarOpened: store.navigation.sidebarOpened, 108 sidebarOpened: store.navigation.sidebarOpened,
246 sidebarStatic: store.navigation.sidebarStatic, 109 sidebarStatic: store.navigation.sidebarStatic,
247 dashboardTheme: store.layout.dashboardTheme, 110 dashboardTheme: store.layout.dashboardTheme,
111 + labelDataGroup: store.labelDataGroup,
248 }; 112 };
249 } 113 }
250 114
......
1 -/* eslint-env mocha */
2 -/* eslint-disable padded-blocks, no-unused-expressions */
3 -
4 -import React from 'react';
5 -import { expect } from 'chai';
6 -import { render } from 'enzyme';
7 -import configureStore from 'redux-mock-store';
8 -import thunk from 'redux-thunk';
9 -import App from '../App';
10 -import Layout from './Layout';
11 -
12 -const middlewares = [thunk];
13 -const mockStore = configureStore(middlewares);
14 -const initialState = {};
15 -
16 -describe('Layout', () => {
17 - it('renders children correctly', () => {
18 - const store = mockStore(initialState);
19 -
20 - const wrapper = render(
21 - <App context={{ insertCss: () => {}, store }}>
22 - <Layout>
23 - <div className="child" />
24 - </Layout>
25 - </App>,
26 - );
27 - expect(wrapper.find('div.child').length).to.eq(1);
28 - });
29 -
30 -});
1 -import React from 'react';
2 -import {
3 - ButtonGroup,
4 - Button,
5 -} from 'reactstrap';
6 -import classnames from 'classnames';
7 -import NotificationsDemo from './notifications-demo/Notifications';
8 -import NewNotificationsDemo from './notifications-demo/NewNotifications';
9 -import MessagesDemo from './notifications-demo/Messages';
10 -import ProgressDemo from './notifications-demo/Progress';
11 -
12 -import s from './Notifications.module.scss';
13 -
14 -class Notifications extends React.Component {
15 - constructor(props) {
16 - super(props);
17 -
18 - this.state = {
19 - notificationsTabSelected: 1,
20 - newNotifications: null,
21 - isLoad: false,
22 - };
23 - }
24 -
25 - changeNotificationsTab(tab) {
26 - this.setState({
27 - notificationsTabSelected: tab,
28 - newNotifications: null,
29 - });
30 - }
31 -
32 - loadNotifications() {
33 - this.setState({
34 - isLoad: true,
35 - });
36 -
37 - setTimeout(() => {
38 - this.setState({
39 - newNotifications: (<NewNotificationsDemo />),
40 - isLoad: false,
41 - });
42 - }, 1500);
43 - }
44 -
45 - render() {
46 - let notificationsTab;
47 -
48 - switch (this.state.notificationsTabSelected) {
49 - case 1:
50 - notificationsTab = (<NotificationsDemo />);
51 - break;
52 - case 2:
53 - notificationsTab = (<MessagesDemo />);
54 - break;
55 - case 3:
56 - notificationsTab = (<ProgressDemo />);
57 - break;
58 - default:
59 - notificationsTab = (<NotificationsDemo />);
60 - break;
61 - }
62 - return (
63 - <section className={`${s.notifications} card navbar-notifications`}>
64 - <header className={[s.cardHeader, 'card-header'].join(' ')}>
65 - <div className="text-center mb-sm">
66 - <strong>You have 13 notifications</strong>
67 - </div>
68 - <ButtonGroup id="notification-buttons">
69 - <Button color="secondary" onClick={() => this.changeNotificationsTab(1)} active={this.state.notificationsTabSelected === 1}>Notifications</Button>
70 - <Button color="secondary" onClick={() => this.changeNotificationsTab(2)} active={this.state.notificationsTabSelected === 2}>Messages</Button>
71 - <Button color="secondary" onClick={() => this.changeNotificationsTab(3)} active={this.state.notificationsTabSelected === 3}>Progress</Button>
72 - </ButtonGroup>
73 - </header>
74 - {this.state.newNotifications || notificationsTab}
75 - <footer className={[s.cardFooter, 'text-sm', 'card-footer'].join(' ')}>
76 - <Button
77 - color="link"
78 - className={classnames({ disabled: this.state.isLoad }, s.btnNotificationsReload, 'btn-xs', 'float-right', 'py-0')}
79 - onClick={() => this.loadNotifications()}
80 - id="load-notifications-btn"
81 - >
82 - {this.state.isLoad ? <span><i className="la la-refresh la-spin" /> Loading...</span> : <i className="la la-refresh" />}
83 - </Button>
84 - <span className="fs-mini">Synced at: 21 Apr 2014 18:36</span>
85 - </footer>
86 - </section>
87 - );
88 - }
89 -}
90 -
91 -export default Notifications;
1 -@import '../../styles/app';
2 -
3 -.notifications {
4 - @include media-breakpoint-up(md) {
5 - width: 333px;
6 - }
7 -
8 - height: 100%;
9 - border: none;
10 -}
11 -
12 -.cardHeader {
13 - border-radius: 0;
14 -}
15 -
16 -.cardFooter {
17 - padding-top: 14px;
18 - padding-bottom: 14px;
19 -}
20 -
21 -.btnNotificationsReload {
22 - color: $navbar-link-color;
23 - outline: none;
24 -
25 - i::before {
26 - top: 2px;
27 - }
28 -}
1 -@import '../../../styles/app';
2 -
3 -.listGroup {
4 - display: block;
5 - height: 320px;
6 - overflow-y: scroll;
7 -
8 - .listGroupItem:first-child {
9 - border: none;
10 - }
11 -}
12 -
13 -.listGroupItem {
14 - transition: background-color 0.15s ease-in-out;
15 - text-decoration: none;
16 - color: $gray-700;
17 - border-left: none;
18 - border-right: none;
19 - display: block;
20 -
21 - :global .progress {
22 - transition: background 0.15s ease-in-out;
23 -
24 - &:hover {
25 - background: $black;
26 - }
27 - }
28 -
29 - &:hover {
30 - background-color: $list-group-hover-bg;
31 -
32 - :global .progress {
33 - background: $white !important;
34 - }
35 - }
36 -
37 - &:first-child {
38 - border-top: none;
39 - border-top-right-radius: 0;
40 - border-top-left-radius: 0;
41 - }
42 -
43 - &:last-child {
44 - border-bottom: none;
45 - border-bottom-right-radius: 0;
46 - border-bottom-left-radius: 0;
47 - }
48 -}
49 -
50 -.notificationIcon {
51 - margin-right: 1rem;
52 - float: left;
53 -
54 - @include clearfix;
55 -}
1 -import React from 'react';
2 -import {
3 - ListGroup,
4 - ListGroupItem,
5 -} from 'reactstrap';
6 -
7 -import a1 from '../../../images/people/a1.jpg';
8 -import a2 from '../../../images/people/a2.jpg';
9 -import a4 from '../../../images/people/a4.jpg';
10 -import a6 from '../../../images/people/a6.jpg';
11 -import avatar from '../../../images/avatar.png';
12 -
13 -import s from './ListGroup.module.scss'; // eslint-disable-line
14 -
15 -class MessagesDemo extends React.Component {
16 - render() {
17 - return (
18 - <ListGroup className={[s.listGroup, 'thin-scroll'].join(' ')}>
19 - <ListGroupItem className={[s.listGroupItem, 'bg-warning-light'].join(' ')}>
20 - <span className={[s.notificationIcon, 'thumb-sm'].join(' ')}>
21 - <img className="rounded-circle" src={a2} alt="..." />
22 - <i className="status status-bottom bg-success" />
23 - </span>
24 - <time className="text-link help float-right">10 sec ago</time>
25 - <h6 className="m-0 fw-bold mb-1">Chris Gray</h6>
26 - <p className="deemphasize text-ellipsis m-0">Hey! What&apos;s up? So many times since we</p>
27 - </ListGroupItem>
28 - <ListGroupItem className={s.listGroupItem}>
29 - <span className={[s.notificationIcon, 'thumb-sm'].join(' ')}>
30 - <img className="rounded-circle" src={avatar} alt="..." />
31 - <i className="status status-bottom bg-success" />
32 - </span>
33 - <time className="text-link help float-right">2 min ago</time>
34 - <h6 className="m-0 mb-1">Jamey Brownlow</h6>
35 - <p className="deemphasize text-ellipsis m-0">Good news coming tonight. Seems they agreed to proceed</p>
36 - </ListGroupItem>
37 - <ListGroupItem className={s.listGroupItem}>
38 - <span className={[s.notificationIcon, 'thumb-sm'].join(' ')}>
39 - <img className="rounded-circle" src={a1} alt="..." />
40 - <i className="status status-bottom bg-warning" />
41 - </span>
42 - <time className="text-link help float-right">9 min ago</time>
43 - <h6 className="m-0 mb-1">Livia Walsh</h6>
44 - <p className="deemphasize text-ellipsis m-0">Check out my latest email plz!</p>
45 - </ListGroupItem>
46 - <ListGroupItem className={s.listGroupItem}>
47 - <span className={[s.notificationIcon, 'thumb-sm'].join(' ')}>
48 - <img className="rounded-circle" src={avatar} alt="..." />
49 - <i className="status status-bottom bg-danger" />
50 - </span>
51 - <time className="text-link help float-right">12:56 AM</time>
52 - <h6 className="m-0 mb-1">Jaron Fitzroy</h6>
53 - <p className="deemphasize text-ellipsis m-0">What about summer break?</p>
54 - </ListGroupItem>
55 - <ListGroupItem className={s.listGroupItem}>
56 - <span className={[s.notificationIcon, 'thumb-sm'].join(' ')}>
57 - <img className="rounded-circle" src={a4} alt="..." />
58 - <i className="status status-bottom bg-gray-light" />
59 - </span>
60 - <time className="text-link help float-right">Yesterday</time>
61 - <h6 className="m-0 mb-1">Mike Lewis</h6>
62 - <p className="deemphasize text-ellipsis m-0">Just ain&apos;t sure about the weekend now. 90% I&apos;ll make it.</p>
63 - </ListGroupItem>
64 - <ListGroupItem className={s.listGroupItem}>
65 - <span className={[s.notificationIcon, 'thumb-sm'].join(' ')}>
66 - <img className="rounded-circle" src={a6} alt="..." />
67 - <i className="status status-bottom bg-success" />
68 - </span>
69 - <time className="text-link help float-right">Apr 23</time>
70 - <h6 className="m-0 mb-1">Freda Edison</h6>
71 - <p className="deemphasize text-ellipsis m-0">Hey what&apos;s up? Me and Monica going for a lunch somewhere. Wanna join?</p>
72 - </ListGroupItem>
73 - </ListGroup>
74 - );
75 - }
76 -}
77 -
78 -export default MessagesDemo;
1 -import React from 'react';
2 -import {
3 - ListGroup,
4 - ListGroupItem,
5 - Button,
6 -} from 'reactstrap';
7 -
8 -import s from './ListGroup.module.scss';
9 -
10 -import a3 from '../../../images/people/a3.jpg';
11 -import a5 from '../../../images/people/a5.jpg';
12 -import a6 from '../../../images/people/a6.jpg';
13 -
14 -class NewNotificationsDemo extends React.Component {
15 - render() {
16 - return (
17 - <ListGroup className={[s.listGroup, 'thin-scroll'].join(' ')}>
18 - <ListGroupItem className={`${s.listGroupItem} bg-attention`}>
19 - <span className={[s.notificationIcon, 'thumb-sm'].join(' ')}>
20 - <i className="fa fa-check text-success fa-lg" />
21 - </span>
22 - <p className="m-0 overflow-hidden">
23 - 2 issues require your approval.
24 - {/* eslint-disable */}
25 - &nbsp;<a href="#">The Search Project</a> completed on time!
26 - {/* eslint-enable */}
27 - <time className="help-block m-0">
28 - just now
29 - </time>
30 - </p>
31 - </ListGroupItem>
32 - <ListGroupItem className={`${s.listGroupItem} bg-attention`}>
33 - <span className={[s.notificationIcon, 'thumb-sm'].join(' ')}>
34 - <img className="rounded-circle" src={a6} alt="..." />
35 - </span>
36 - <p className="m-0 overflow-hidden">
37 - <button className="btn-link">Jeniffer Willington</button>has just endorsed you with 50 points!
38 - <time className="help-block m-0">
39 - 30 sec ago
40 - </time>
41 - </p>
42 - </ListGroupItem>
43 - <ListGroupItem className={s.listGroupItem}>
44 - <span className={[s.notificationIcon, 'thumb-sm'].join(' ')}>
45 - <img className="rounded-circle" src={a3} alt="..." />
46 - </span>
47 - <p className="m-0 overflow-hidden">
48 - 1 new user just signed up! Check out
49 - {/* eslint-disable */}
50 - &nbsp;<a href="#">Monica Smith</a>'s account.
51 - {/* eslint-enable */}
52 - <time className="help-block m-0">
53 - 2 mins ago
54 - </time>
55 - </p>
56 - </ListGroupItem>
57 - <ListGroupItem className={s.listGroupItem}>
58 - <span className={[s.notificationIcon, 'thumb-sm'].join(' ')}>
59 - <i className="glyphicon glyphicon-upload fa-lg" />
60 - </span>
61 - <p className="text-ellipsis m-0">
62 - 2.1.0-pre-alpha just released.
63 - <time className="help-block m-0">
64 - 5h ago
65 - </time>
66 - </p>
67 - </ListGroupItem>
68 - <ListGroupItem className={s.listGroupItem}>
69 - <span className={[s.notificationIcon, 'thumb-sm'].join(' ')}>
70 - <i className="fa fa-bolt fa-lg" />
71 - </span>
72 - <p className="text-ellipsis m-0 overflow-hidden">
73 - Server load limited.
74 - <time className="help-block m-0">
75 - 7h ago
76 - </time>
77 - </p>
78 - </ListGroupItem>
79 - <ListGroupItem className={s.listGroupItem}>
80 - <span className={[s.notificationIcon, 'thumb-sm'].join(' ')}>
81 - <img className="rounded-circle" src={a5} alt="..." />
82 - </span>
83 - <p className="m-0 overflow-hidden">
84 - {/* eslint-disable */}
85 - User <a href="#">Jeff</a> registered
86 - {/* eslint-enable */}
87 - &nbsp;&nbsp;
88 - <Button size="xs" color="success" className="mr-1">Allow</Button>
89 - <Button size="xs" color="danger">Deny</Button>
90 - <time className="help-block m-0">
91 - 12:18 AM
92 - </time>
93 - </p>
94 - </ListGroupItem>
95 - <ListGroupItem className={s.listGroupItem}>
96 - <span className={[s.notificationIcon, 'thumb-sm'].join(' ')}>
97 - <i className="fa fa-shield fa-lg" />
98 - </span>
99 - <p className="m-0 overflow-hidden">
100 - {/* eslint-disable */}
101 - Instructions for changing your Envato Account password. Please
102 - check your account <a href="#">security page</a>.
103 - {/* eslint-enable */}
104 - <time className="help-block m-0">
105 - 12:18 AM
106 - </time>
107 - </p>
108 - </ListGroupItem>
109 - <ListGroupItem className={s.listGroupItem}>
110 - <span className={[s.notificationIcon, 'thumb-sm'].join(' ')}>
111 - <span className="rounded bg-primary rounded-lg">
112 - <i className="fa fa-facebook text-white" />
113 - </span>
114 - </span>
115 - <p className="text-ellipsis m-0">
116 - New <strong>76</strong> facebook likes received.
117 - <time className="help-block m-0">
118 - 15 Apr 2014
119 - </time>
120 - </p>
121 - </ListGroupItem>
122 - <ListGroupItem className={s.listGroupItem}>
123 - <span className={[s.notificationIcon, 'thumb-sm'].join(' ')}>
124 - <span className="circle circle-lg bg-gray-dark">
125 - <i className="fa fa-circle-o text-white" />
126 - </span>
127 - </span>
128 - <p className="text-ellipsis m-0">
129 - Dark matter detected.
130 - <time className="help-block m-0">
131 - 15 Apr 2014
132 - </time>
133 - </p>
134 - </ListGroupItem>
135 - </ListGroup>
136 - );
137 - }
138 -}
139 -
140 -export default NewNotificationsDemo;
1 -import React from 'react';
2 -import {
3 - ListGroup,
4 - ListGroupItem,
5 - Button,
6 -} from 'reactstrap';
7 -
8 -import s from './ListGroup.module.scss';
9 -
10 -import a3 from '../../../images/people/a3.jpg';
11 -import a5 from '../../../images/people/a5.jpg';
12 -
13 -class NotificationsDemo extends React.Component {
14 - render() {
15 - return (
16 - <ListGroup className={[s.listGroup, 'thin-scroll'].join(' ')}>
17 - <ListGroupItem className={s.listGroupItem}>
18 - <span className={[s.notificationIcon, 'thumb-sm'].join(' ')}>
19 - <img className="rounded-circle" src={a3} alt="..." />
20 - </span>
21 - <p className="m-0 overflow-hidden">
22 - 1 new user just signed up! Check out
23 - {/* eslint-disable */}
24 - &nbsp;<a href="#">Monica Smith</a>'s account.
25 - {/* eslint-enable */}
26 - <time className="help-block m-0">
27 - 2 mins ago
28 - </time>
29 - </p>
30 - </ListGroupItem>
31 - <ListGroupItem className={s.listGroupItem}>
32 - <span className={[s.notificationIcon, 'thumb-sm'].join(' ')}>
33 - <i className="glyphicon glyphicon-upload fa-lg" />
34 - </span>
35 - <p className="text-ellipsis m-0">
36 - 2.1.0-pre-alpha just released.
37 - <time className="help-block m-0">
38 - 5h ago
39 - </time>
40 - </p>
41 - </ListGroupItem>
42 - <ListGroupItem className={s.listGroupItem}>
43 - <span className={[s.notificationIcon, 'thumb-sm'].join(' ')}>
44 - <i className="fa fa-bolt fa-lg" />
45 - </span>
46 - <p className="text-ellipsis m-0 overflow-hidden">
47 - Server load limited.
48 - <time className="help-block m-0">
49 - 7h ago
50 - </time>
51 - </p>
52 - </ListGroupItem>
53 - <ListGroupItem className={s.listGroupItem}>
54 - <span className={[s.notificationIcon, 'thumb-sm'].join(' ')}>
55 - <img className="rounded-circle" src={a5} alt="..." />
56 - </span>
57 - <p className="m-0 overflow-hidden">
58 - {/* eslint-disable */}
59 - User <a href="#">Jeff</a> registered
60 - {/* eslint-enable */}
61 - &nbsp;&nbsp;
62 - <Button size="xs" color="success" className="mr-1">Allow</Button>
63 - <Button size="xs" color="danger">Deny</Button>
64 - <time className="help-block m-0">
65 - 12:18 AM
66 - </time>
67 - </p>
68 - </ListGroupItem>
69 - <ListGroupItem className={s.listGroupItem}>
70 - <span className={[s.notificationIcon, 'thumb-sm'].join(' ')}>
71 - <i className="fa fa-shield fa-lg" />
72 - </span>
73 - <p className="m-0 overflow-hidden">
74 - {/* eslint-disable */}
75 - Instructions for changing your Envato Account password. Please
76 - check your account <a href="#">security page</a>.
77 - {/* eslint-enable */}
78 - <time className="help-block m-0">
79 - 12:18 AM
80 - </time>
81 - </p>
82 - </ListGroupItem>
83 - <ListGroupItem className={s.listGroupItem}>
84 - <span className={[s.notificationIcon, 'thumb-sm'].join(' ')}>
85 - <span className="rounded bg-primary rounded-lg">
86 - <i className="fa fa-facebook text-white" />
87 - </span>
88 - </span>
89 - <p className="text-ellipsis m-0">
90 - New <strong>76</strong> facebook likes received.
91 - <time className="help-block m-0">
92 - 15 Apr 2014
93 - </time>
94 - </p>
95 - </ListGroupItem>
96 - <ListGroupItem className={s.listGroupItem}>
97 - <span className={[s.notificationIcon, 'thumb-sm'].join(' ')}>
98 - <span className="circle circle-lg bg-gray-dark">
99 - <i className="fa fa-circle-o text-white" />
100 - </span>
101 - </span>
102 - <p className="text-ellipsis m-0">
103 - Dark matter detected.
104 - <time className="help-block m-0">
105 - 15 Apr 2014
106 - </time>
107 - </p>
108 - </ListGroupItem>
109 - </ListGroup>
110 - );
111 - }
112 -}
113 -
114 -export default NotificationsDemo;
1 -import React from 'react';
2 -import {
3 - ListGroup,
4 - ListGroupItem,
5 - Progress,
6 - UncontrolledTooltip,
7 -} from 'reactstrap';
8 -
9 -import s from './ListGroup.module.scss'; // eslint-disable-line
10 -
11 -class ProgressDemo extends React.Component {
12 - render() {
13 - return (
14 - <ListGroup className={[s.listGroup, 'thin-scroll'].join(' ')}>
15 - <ListGroupItem className={s.listGroupItem}>
16 - <span className="text-muted float-right">60%</span>
17 - <h6 className="m-0 mb-1 text-gray">
18 - <strong>Urgent:</strong>
19 - &nbsp;Rails 4.1.0 upgrade
20 - </h6>
21 - <Progress className={['m-0'].join(' ')} color="primary" value="60" />
22 - <span className="help-block">3 notes added by James 2h ago...</span>
23 - </ListGroupItem>
24 - <ListGroupItem className={s.listGroupItem}>
25 - <span className="text-muted float-right">83%</span>
26 - <h6 className="m-0 mb-1 text-gray">
27 - <strong>Primary:</strong>
28 - &nbsp;Sing Web App
29 - </h6>
30 - <Progress className={['progress-sm', 'm-0'].join(' ')} color="success" value="83" />
31 - <span className="help-block">verifying stable probability status</span>
32 - </ListGroupItem>
33 - <ListGroupItem className={s.listGroupItem}>
34 - <span className="text-muted float-right">44%</span>
35 - <h6 className="m-0 mb-1">
36 - <span className="circle bg-gray-dark text-warning" id="TooltipQuestion">
37 - <i className="fa fa-question" />
38 - </span>
39 - <UncontrolledTooltip placement="bottom" target="TooltipQuestion">
40 - 2 issues require your attention
41 - </UncontrolledTooltip>
42 - &nbsp;
43 - Finish The Road to Hell Song
44 - </h6>
45 - <Progress className={['progress-sm', 'm-0'].join(' ')} color="gray-dark" value="44" />
46 - <span className="help-block">last update: 2h ago</span>
47 - </ListGroupItem>
48 - <ListGroupItem className={s.listGroupItem}>
49 - <span className="text-muted float-right">86%</span>
50 - <h6 className="m-0 mb-1 deemphasize text-gray">
51 - Complete project planning
52 - </h6>
53 - <Progress className={['progress-xs', 'm-0'].join(' ')} color="danger" value="86" />
54 - <span className="help-block">no, no way this is not working...</span>
55 - </ListGroupItem>
56 - <ListGroupItem className={s.listGroupItem}>
57 - <span className="text-muted float-right">100%</span>
58 - <h6 className="m-0 mb-1 deemphasize text-gray">
59 - <strong>Completed:</strong>
60 - &nbsp;Instruct newbies on coding standards
61 - </h6>
62 - <Progress className={['progress-xs', 'm-0'].join(' ')} color="primary" value="100" />
63 - <span className="help-block">last update: April 22, 2014 2:36 pm</span>
64 - </ListGroupItem>
65 - </ListGroup>
66 - );
67 - }
68 -}
69 -
70 -export default ProgressDemo;
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
9 9
10 a { 10 a {
11 display: block; 11 display: block;
12 - color: var(--sidebar-color); 12 + color: #a6b2c1;
13 text-decoration: none; 13 text-decoration: none;
14 cursor: pointer; 14 cursor: pointer;
15 15
......
1 import React from 'react'; 1 import React from 'react';
2 import PropTypes from 'prop-types'; 2 import PropTypes from 'prop-types';
3 import { connect } from 'react-redux'; 3 import { connect } from 'react-redux';
4 -import { Progress, Alert } from 'reactstrap';
5 import { withRouter } from 'react-router-dom'; 4 import { withRouter } from 'react-router-dom';
6 -import { dismissAlert } from '../../actions/alerts';
7 import s from './Sidebar.module.scss'; 5 import s from './Sidebar.module.scss';
8 import LinksGroup from './LinksGroup/LinksGroup'; 6 import LinksGroup from './LinksGroup/LinksGroup';
9 7
10 import { openSidebar, closeSidebar, changeActiveSidebarItem } from '../../actions/navigation'; 8 import { openSidebar, closeSidebar, changeActiveSidebarItem } from '../../actions/navigation';
11 import isScreen from '../../core/screenHelper'; 9 import isScreen from '../../core/screenHelper';
12 -import { logoutUser } from '../../actions/user';
13 10
14 class Sidebar extends React.Component { 11 class Sidebar extends React.Component {
15 static propTypes = { 12 static propTypes = {
...@@ -30,10 +27,8 @@ class Sidebar extends React.Component { ...@@ -30,10 +27,8 @@ class Sidebar extends React.Component {
30 27
31 constructor(props) { 28 constructor(props) {
32 super(props); 29 super(props);
33 -
34 this.onMouseEnter = this.onMouseEnter.bind(this); 30 this.onMouseEnter = this.onMouseEnter.bind(this);
35 this.onMouseLeave = this.onMouseLeave.bind(this); 31 this.onMouseLeave = this.onMouseLeave.bind(this);
36 - this.doLogout = this.doLogout.bind(this);
37 } 32 }
38 33
39 onMouseEnter() { 34 onMouseEnter() {
...@@ -52,14 +47,6 @@ class Sidebar extends React.Component { ...@@ -52,14 +47,6 @@ class Sidebar extends React.Component {
52 } 47 }
53 } 48 }
54 49
55 - dismissAlert(id) {
56 - this.props.dispatch(dismissAlert(id));
57 - }
58 -
59 - doLogout() {
60 - this.props.dispatch(logoutUser());
61 - }
62 -
63 render() { 50 render() {
64 return ( 51 return (
65 <nav 52 <nav
...@@ -67,387 +54,36 @@ class Sidebar extends React.Component { ...@@ -67,387 +54,36 @@ class Sidebar extends React.Component {
67 className={[s.root, this.props.sidebarStatic ? s.staticSidebar : '', !this.props.sidebarOpened ? s.sidebarClose : ''].join(' ')} 54 className={[s.root, this.props.sidebarStatic ? s.staticSidebar : '', !this.props.sidebarOpened ? s.sidebarClose : ''].join(' ')}
68 > 55 >
69 <header className={s.logo}> 56 <header className={s.logo}>
70 - <a href="https://demo.flatlogic.com/sing-app/"><span className="text-warning">Sing</span> App</a> 57 + <img src="/images/emergency.png" style={{width: '112px', padding: '7px'}} alt="Emergency Inc. logo"/>
71 </header> 58 </header>
72 <ul className={s.nav}> 59 <ul className={s.nav}>
73 <LinksGroup 60 <LinksGroup
74 onActiveSidebarItemChange={activeItem => this.props.dispatch(changeActiveSidebarItem(activeItem))} 61 onActiveSidebarItemChange={activeItem => this.props.dispatch(changeActiveSidebarItem(activeItem))}
75 activeItem={this.props.activeItem} 62 activeItem={this.props.activeItem}
76 - header="Dashboard" 63 + header="영상 분석"
77 isHeader 64 isHeader
78 - iconName="flaticon-home" 65 + iconName="flaticon-record"
79 link="/app/main" 66 link="/app/main"
80 index="main" 67 index="main"
81 childrenLinks={[ 68 childrenLinks={[
82 { 69 {
83 - header: 'Analytics', link: '/app/main/analytics', 70 + header: 'Phone', link: '/app/file/phone',
84 }, 71 },
85 { 72 {
86 - header: 'Visits', link: '/app/main/dashboard', 73 + header: 'RaspberryPi', link: '/app/file/raspberrypi',
87 - },
88 - {
89 - header: 'Widgets', link: '/app/main/widgets',
90 }, 74 },
91 ]} 75 ]}
92 /> 76 />
93 - <LinksGroup
94 - onActiveSidebarItemChange={activeItem => this.props.dispatch(changeActiveSidebarItem(activeItem))}
95 - activeItem={this.props.activeItem}
96 - header="E-commerce"
97 - isHeader
98 - iconName="flaticon-diamond"
99 - link="/app/ecommerce"
100 - index="ecommerce"
101 - label="NodeJS"
102 - labelColor="danger"
103 - exact={false}
104 - childrenLinks={[
105 - {
106 - header: 'Product Management', link: '/app/ecommerce/management',
107 - },
108 - {
109 - header: 'Products Grid', link: '/app/ecommerce/products',
110 - },
111 - {
112 - header: 'Product Page', link: '/app/ecommerce/product',
113 - },
114 - ]}
115 - />
116 <LinksGroup 77 <LinksGroup
117 onActiveSidebarItemChange={activeItem => this.props.dispatch(changeActiveSidebarItem(activeItem))} 78 onActiveSidebarItemChange={activeItem => this.props.dispatch(changeActiveSidebarItem(activeItem))}
118 activeItem={this.props.activeItem} 79 activeItem={this.props.activeItem}
119 - header="Sing Package" 80 + header="사진 등록"
120 - link="/app/package"
121 - isHeader
122 - iconName="flaticon-database-1"
123 - index="packages"
124 - />
125 - <LinksGroup
126 - onActiveSidebarItemChange={activeItem => this.props.dispatch(changeActiveSidebarItem(activeItem))}
127 - activeItem={this.props.activeItem}
128 - header="Profile"
129 - link="/app/profile"
130 isHeader 81 isHeader
131 iconName="flaticon-user" 82 iconName="flaticon-user"
132 - index="profile" 83 + link="/app/subject"
133 - /> 84 + index="subject"
134 - <LinksGroup
135 - onActiveSidebarItemChange={activeItem => this.props.dispatch(changeActiveSidebarItem(activeItem))}
136 - activeItem={this.props.activeItem}
137 - header="Email"
138 - link="/app/inbox"
139 - isHeader
140 - iconName="flaticon-paper-plane"
141 - index="inbox"
142 - badge="9"
143 - />
144 - <LinksGroup
145 - onActiveSidebarItemChange={activeItem => this.props.dispatch(changeActiveSidebarItem(activeItem))}
146 - activeItem={this.props.activeItem}
147 - header="Documentation"
148 - link="/documentation"
149 - isHeader
150 - iconName="flaticon-file"
151 - index="documentation"
152 - label="new"
153 - target="_blank"
154 - />
155 - <h5 className={[s.navTitle, s.groupTitle].join(' ')}>TEMPLATE</h5>
156 - <LinksGroup
157 - onActiveSidebarItemChange={activeItem => this.props.dispatch(changeActiveSidebarItem(activeItem))}
158 - activeItem={this.props.activeItem}
159 - header="Core"
160 - isHeader
161 - iconName="flaticon-network"
162 - link="/app/core"
163 - index="core"
164 - childrenLinks={[
165 - {
166 - header: 'Typography', link: '/app/core/typography',
167 - },
168 - {
169 - header: 'Colors', link: '/app/core/colors',
170 - },
171 - {
172 - header: 'Grid', link: '/app/core/grid',
173 - },
174 - ]}
175 - />
176 - <LinksGroup
177 - onActiveSidebarItemChange={activeItem => this.props.dispatch(changeActiveSidebarItem(activeItem))}
178 - activeItem={this.props.activeItem}
179 - header="UI Elements"
180 - isHeader
181 - iconName="flaticon-layers"
182 - link="/app/ui"
183 - index="ui"
184 - childrenLinks={[
185 - {
186 - header: 'Alerts', link: '/app/ui/alerts',
187 - },
188 - {
189 - header: 'Badge', link: '/app/ui/badge',
190 - },
191 - {
192 - header: 'Buttons', link: '/app/ui/buttons',
193 - },
194 - {
195 - header: 'Card', link: '/app/ui/card',
196 - },
197 - {
198 - header: 'Carousel', link: '/app/ui/carousel',
199 - },
200 - {
201 - header: 'Jumbotron', link: '/app/ui/jumbotron',
202 - },
203 - {
204 - header: 'Icons', link: '/app/ui/icons',
205 - },
206 - {
207 - header: 'List Groups', link: '/app/ui/list-groups',
208 - },
209 - {
210 - header: 'Modal', link: '/app/ui/modal',
211 - },
212 - {
213 - header: 'Nav', link: '/app/ui/nav',
214 - },
215 - {
216 - header: 'Navbar', link: '/app/ui/navbar',
217 - },
218 - {
219 - header: 'Notifications', link: '/app/ui/notifications',
220 - },
221 - {
222 - header: 'Pagination', link: '/app/tables/dynamic',
223 - },
224 - {
225 - header: 'Popovers & Tooltips', link: '/app/ui/popovers',
226 - },
227 - {
228 - header: 'Progress', link: '/app/ui/progress',
229 - },
230 - {
231 - header: 'Tabs & Accordion', link: '/app/ui/tabs-accordion',
232 - },
233 - ]}
234 /> 85 />
235 - <LinksGroup
236 - onActiveSidebarItemChange={activeItem => this.props.dispatch(changeActiveSidebarItem(activeItem))}
237 - activeItem={this.props.activeItem}
238 - header="Forms"
239 - isHeader
240 - iconName="flaticon-list"
241 - link="/app/forms"
242 - index="forms"
243 - childrenLinks={[
244 - {
245 - header: 'Forms Elements', link: '/app/forms/elements',
246 - },
247 - {
248 - header: 'Forms Validation', link: '/app/forms/validation',
249 - },
250 - {
251 - header: 'Forms Wizard', link: '/app/forms/wizard',
252 - },
253 - ]}
254 - />
255 - <LinksGroup
256 - onActiveSidebarItemChange={activeItem => this.props.dispatch(changeActiveSidebarItem(activeItem))}
257 - activeItem={this.props.activeItem}
258 - header="Charts"
259 - link="/app/charts"
260 - isHeader
261 - iconName="flaticon-controls"
262 - index="charts"
263 - childrenLinks={[
264 - {
265 - header: 'Charts Overview', link: '/app/charts/overview',
266 - },
267 - {
268 - header: 'Flot Charts', link: '/app/charts/flot',
269 - },
270 - {
271 - header: 'Morris Charts', link: '/app/charts/morris',
272 - },
273 - {
274 - header: 'Rickshaw Charts', link: '/app/charts/rickshaw',
275 - },
276 - {
277 - header: 'Sparkline Charts', link: '/app/charts/sparkline',
278 - },
279 - {
280 - header: 'Easy Pie Charts', link: '/app/charts/easy-pie',
281 - },
282 - ]}
283 - />
284 - <LinksGroup
285 - header="Grid"
286 - link="/app/grid"
287 - isHeader
288 - iconName="flaticon-menu-4"
289 - />
290 - <LinksGroup
291 - onActiveSidebarItemChange={t => this.props.dispatch(changeActiveSidebarItem(t))}
292 - activeItem={this.props.activeItem}
293 - header="Tables"
294 - isHeader
295 - iconName="flaticon-map-location"
296 - link="/app/tables"
297 - index="tables"
298 - childrenLinks={[
299 - {
300 - header: 'Tables Basic', link: '/app/tables/static',
301 - },
302 - {
303 - header: 'Tables Dynamic', link: '/app/tables/dynamic',
304 - },
305 - ]}
306 - />
307 - <LinksGroup
308 - onActiveSidebarItemChange={activeItem => this.props.dispatch(changeActiveSidebarItem(activeItem))}
309 - activeItem={this.props.activeItem}
310 - header="Maps"
311 - isHeader
312 - iconName="flaticon-equal-1"
313 - link="/app/maps"
314 - index="maps"
315 - childrenLinks={[
316 - {
317 - header: 'Google Maps', link: '/app/maps/google',
318 - },
319 - {
320 - header: 'Vector Map', link: '/app/maps/vector',
321 - },
322 - ]}
323 - />
324 - <LinksGroup
325 - onActiveSidebarItemChange={activeItem => this.props.dispatch(changeActiveSidebarItem(activeItem))}
326 - activeItem={this.props.activeItem}
327 - header="Extra"
328 - isHeader
329 - iconName="flaticon-star"
330 - link="/app/extra"
331 - index="extra"
332 - childrenLinks={[
333 - {
334 - header: 'Calendar', link: '/app/extra/calendar',
335 - },
336 - {
337 - header: 'Invoice', link: '/app/extra/invoice',
338 - },
339 - {
340 - header: 'Login Page', link: '/login', onClick: this.doLogout,
341 - },
342 - {
343 - header: 'Error Page', link: '/error',
344 - },
345 - {
346 - header: 'Gallery', link: '/app/extra/gallery',
347 - },
348 - {
349 - header: 'Search Result', link: '/app/extra/search',
350 - },
351 - {
352 - header: 'Time line', link: '/app/extra/timeline',
353 - },
354 - ]}
355 - />
356 - <LinksGroup
357 - onActiveSidebarItemChange={activeItem => this.props.dispatch(changeActiveSidebarItem(activeItem))}
358 - activeItem={this.props.activeItem}
359 - header="Menu Levels"
360 - isHeader
361 - iconName="flaticon-folder-10"
362 - link="/app/menu"
363 - index="menu"
364 - childrenLinks={[
365 - {
366 - header: 'Level 1.1', link: '/app/menu/level1',
367 - },
368 - {
369 - header: 'Level 1.2',
370 - link: '/app/menu/level_12',
371 - index: 'level_12',
372 - childrenLinks: [
373 - {
374 - header: 'Level 2.1',
375 - link: '/app/menu/level_12/level_21',
376 - index: 'level_21',
377 - },
378 - {
379 - header: 'Level 2.2',
380 - link: '/app/menu/level_12/level_22',
381 - index: 'level_22',
382 - childrenLinks: [
383 - {
384 - header: 'Level 3.1',
385 - link: '/app/menu/level_12/level_22/level_31',
386 - index: 'level_31',
387 - },
388 - {
389 - header: 'Level 3.2',
390 - link: '/app/menu/level_12/level_22/level_32',
391 - index: 'level_32 ',
392 - },
393 - ],
394 - },
395 - {
396 - header: 'Level 2.3',
397 - link: '/app/menu/level_12/level_23',
398 - index: 'level_23',
399 - },
400 - ],
401 - },
402 - ]}
403 - />
404 - </ul>
405 - <h5 className={s.navTitle}>
406 - LABELS
407 - {/* eslint-disable-next-line */}
408 - <a className={s.actionLink}>
409 - <i className={`${s.glyphiconSm} glyphicon glyphicon-plus float-right`} />
410 - </a>
411 - </h5>
412 - {/* eslint-disable */}
413 - <ul className={s.sidebarLabels}>
414 - <li>
415 - <a href="#">
416 - <i className="fa fa-circle text-warning mr-2" />
417 - <span className={s.labelName}>My Recent</span>
418 - </a>
419 - </li>
420 - <li>
421 - <a href="#">
422 - <i className="fa fa-circle text-gray mr-2" />
423 - <span className={s.labelName}>Starred</span>
424 - </a>
425 - </li>
426 - <li>
427 - <a href="#">
428 - <i className="fa fa-circle text-danger mr-2" />
429 - <span className={s.labelName}>Background</span>
430 - </a>
431 - </li>
432 </ul> 86 </ul>
433 - {/* eslint-enable */}
434 - <h5 className={s.navTitle}>
435 - PROJECTS
436 - </h5>
437 - <div className={s.sidebarAlerts}>
438 - {this.props.alertsList.map(alert => // eslint-disable-line
439 - <Alert
440 - key={alert.id}
441 - className={s.sidebarAlert} color="transparent"
442 - isOpen={true} // eslint-disable-line
443 - toggle={() => { this.dismissAlert(alert.id); }}
444 - >
445 - <span>{alert.title}</span><br />
446 - <Progress className={`${s.sidebarProgress} progress-xs mt-1`} color={alert.color} value={alert.value} />
447 - <small>{alert.footer}</small>
448 - </Alert>,
449 - )}
450 - </div>
451 </nav > 87 </nav >
452 ); 88 );
453 } 89 }
...@@ -457,7 +93,6 @@ function mapStateToProps(store) { ...@@ -457,7 +93,6 @@ function mapStateToProps(store) {
457 return { 93 return {
458 sidebarOpened: store.navigation.sidebarOpened, 94 sidebarOpened: store.navigation.sidebarOpened,
459 sidebarStatic: store.navigation.sidebarStatic, 95 sidebarStatic: store.navigation.sidebarStatic,
460 - alertsList: store.alerts.alertsList,
461 activeItem: store.navigation.activeItem, 96 activeItem: store.navigation.activeItem,
462 }; 97 };
463 } 98 }
......
1 -import React from 'react';
2 -import PropTypes from 'prop-types';
3 -import ReactDOM from 'react-dom';
4 -
5 -const Skycons = require('skycons')(window || {});
6 -
7 -class Skycon extends React.Component {
8 - static propTypes = {
9 - color: PropTypes.string.isRequired,
10 - autoPlay: PropTypes.bool,
11 - icon: PropTypes.oneOf([ // eslint-disable-line
12 - 'CLEAR_DAY',
13 - 'CLEAR_NIGHT',
14 - 'PARTLY_CLOUDY_DAY',
15 - 'PARTLY_CLOUDY_NIGHT',
16 - 'CLOUDY',
17 - 'RAIN',
18 - 'SLEET',
19 - 'SNOW',
20 - 'WIND',
21 - 'FOG',
22 - ]),
23 - width: PropTypes.string.isRequired,
24 - height: PropTypes.string.isRequired,
25 - };
26 -
27 - static defaultProps = {
28 - color: null,
29 - autoPlay: true,
30 - width: '100%',
31 - height: '100%',
32 - };
33 -
34 - constructor(props) {
35 - super(props);
36 -
37 - this.state = {
38 - skycons: new Skycons({ color: this.props.color }),
39 - };
40 - }
41 -
42 - componentDidMount() {
43 - const { skycons } = this.state;
44 - skycons.add(ReactDOM.findDOMNode(this), Skycons[this.props.icon]); // eslint-disable-line
45 -
46 - if (this.props.autoPlay) {
47 - skycons.play();
48 - }
49 - }
50 -
51 - componentWillReceiveProps(nextProps) {
52 - this.state.skycons.set(ReactDOM.findDOMNode(this), Skycons[nextProps.icon]); // eslint-disable-line
53 - }
54 -
55 - play() {
56 - this.state.skycons.play();
57 - }
58 -
59 - pause() {
60 - this.state.skycons.pause();
61 - }
62 -
63 - render() {
64 - const {
65 - ...restPops
66 - } = this.props;
67 -
68 - return (
69 - <canvas width={this.props.width} height={this.props.height} {...restPops} />
70 - );
71 - }
72 -}
73 -
74 -export default Skycon;
1 -import React from 'react';
2 -
3 -import $ from 'jquery';
4 -import PropTypes from 'prop-types';
5 -
6 -/* eslint-disable */
7 -import 'imports-loader?jQuery=jquery,this=>window!jquery-sparkline';
8 -/* eslint-enable */
9 -
10 -class Sparklines extends React.Component {
11 - static propTypes = {
12 - data: PropTypes.arrayOf(
13 - PropTypes.arrayOf(PropTypes.number),
14 - ),
15 - options: PropTypes.oneOfType([
16 - PropTypes.arrayOf(
17 - PropTypes.shape({
18 - type: PropTypes.string.isRequired,
19 - }),
20 - ),
21 - PropTypes.shape({
22 - type: PropTypes.string.isRequired,
23 - }),
24 - ]),
25 - };
26 -
27 - static defaultProps = {
28 - data: [],
29 - options: {},
30 - };
31 -
32 - componentDidMount() {
33 - this.initSparkline();
34 - }
35 -
36 - initSparkline() {
37 - const $el = $(this.sparklineRef);
38 -
39 - const model = $.type(this.data) === 'string' ?
40 - this.props.data.replace(/(^,)|(,$)/g, '')
41 - : this.props.data;
42 - const options = this.props.options;
43 -
44 - if ($.type(model) === 'array' && $.type(options) === 'array') {
45 - options.forEach((singleOptions, i) => {
46 - if (i === 0) {
47 - $el.sparkline(model[i], singleOptions);
48 - } else { // set composite for next calls
49 - $el.sparkline(model[i], $.extend({ composite: true }, singleOptions));
50 - }
51 - });
52 - } else {
53 - const data = $.type(model) === 'array' ? model : model.split(',');
54 - $el.sparkline(data, options);
55 - }
56 - }
57 -
58 - render() {
59 - return (
60 - <div
61 - className="sparkline" ref={(r) => {
62 - this.sparklineRef = r;
63 - }}
64 - />
65 - );
66 - }
67 -}
68 -
69 -export default Sparklines;
1 -const hostApi = process.env.NODE_ENV === "development" ? "http://localhost" : "https://flatlogic-node-backend.herokuapp.com"; 1 +const hostApi = process.env.NODE_ENV === "development" ? "http://localhost" : "http://localhost";
2 -const portApi = process.env.NODE_ENV === "development" ? 8080 : ""; 2 +const portApi = process.env.NODE_ENV === "development" ? 8080 : 4000;
3 const baseURLApi = `${hostApi}${portApi ? `:${portApi}` : ``}`; 3 const baseURLApi = `${hostApi}${portApi ? `:${portApi}` : ``}`;
4 4
5 export default { 5 export default {
......
1 -import React, { Component } from 'react';
2 -import PropTypes from 'prop-types';
3 -
4 -class Bundle extends Component {
5 - static propTypes = {
6 - load: PropTypes.func.isRequired,
7 - children: PropTypes.func.isRequired,
8 - };
9 -
10 - static generateBundle = loadModule => () => (
11 - /* eslint-disable */
12 - <Bundle load={loadModule}>
13 - {Mod => Mod ? <Mod /> : <div style={{ textAlign: 'center', paddingTop: '35vh' }}>Loading</div>}
14 - </Bundle>
15 - /* eslint-enable */
16 - );
17 -
18 -
19 - state = {
20 - // short for "module" but that's a keyword in js, so "mod"
21 - mod: null,
22 - };
23 -
24 - componentWillMount() {
25 - this.load(this.props);
26 - }
27 -
28 - componentWillReceiveProps(nextProps) {
29 - if (nextProps.load !== this.props.load) {
30 - this.load(nextProps);
31 - }
32 - }
33 -
34 - load(props) {
35 - this.setState({
36 - mod: null,
37 - });
38 - props.load((mod) => {
39 - this.setState({
40 - // handle both es imports and cjs
41 - mod: mod.default ? mod.default : mod,
42 - });
43 - });
44 - }
45 -
46 - render() {
47 - return this.props.children(this.state.mod);
48 - }
49 -}
50 -
51 -export default Bundle;
1 const config = { 1 const config = {
2 - name: 'sing', 2 + name: 'Video Emergency Detection',
3 - title: 'Sing Dashboard App built with React JS by Flatlogic', 3 + title: 'Video Emergency Detection',
4 version: '3.8.0', 4 version: '3.8.0',
5 settings: { 5 settings: {
6 screens: { 6 screens: {
......
1 -import React, { Component } from 'react';
2 -import hoistStatics from 'hoist-non-react-statics';
3 -import { updateMeta } from '../DOMUtils';
4 -import { defaultMeta } from '../config';
5 -
6 -function withMeta(ComposedComponent) {
7 - class WithMeta extends Component {
8 - componentWillMount() {
9 - if (ComposedComponent.meta) {
10 - Object.keys(ComposedComponent.meta).forEach((metaKey) => {
11 - if (metaKey === 'title') {
12 - document.title = `${ComposedComponent.meta[metaKey]} - ${defaultMeta[metaKey]}`;
13 - return;
14 - }
15 - updateMeta(metaKey, ComposedComponent.meta[metaKey]);
16 - });
17 - }
18 - }
19 -
20 - componentWillUnmount() {
21 - Object.keys(defaultMeta).forEach((metaKey) => {
22 - if (metaKey === 'title') {
23 - document.title = defaultMeta[metaKey];
24 - return;
25 - }
26 - updateMeta(metaKey, defaultMeta[metaKey]);
27 - });
28 - }
29 -
30 - render() {
31 - return <ComposedComponent {...this.props} />;
32 - }
33 - }
34 -
35 - WithMeta.ComposedComponent = ComposedComponent;
36 - return hoistStatics(WithMeta, ComposedComponent);
37 -}
38 -
39 -export default withMeta;
1 -import React from 'react';
2 -import { connect } from 'react-redux';
3 -import PropTypes from 'prop-types';
4 -import classnames from 'classnames';
5 -import { Link } from 'react-router-dom';
6 -import { withRouter } from 'react-router';
7 -import {
8 - Navbar,
9 - Nav,
10 - NavItem,
11 - NavLink,
12 -} from 'reactstrap';
13 -
14 -import { openSidebar, closeSidebar, changeActiveSidebarItem } from '../actions/navigation';
15 -
16 -import s from '../components/Header/Header.module.scss'; // eslint-disable-line css-modules/no-unused-class
17 -import sd from './styles.module.scss';
18 -
19 -import twitterLogo from '../images/documentation/twitter-logo.svg';
20 -import dribbleLogo from '../images/documentation/dribble-logo.svg';
21 -import facebookLogo from '../images/documentation/facebook-logo.svg';
22 -import instagramLogo from '../images/documentation/instagram-logo.svg';
23 -import linkedinLogo from '../images/documentation/linkedin-logo.svg';
24 -import githubLogo from '../images/documentation/github-logo.svg';
25 -
26 -class Header extends React.Component {
27 - static propTypes = {
28 - sidebarOpened: PropTypes.bool.isRequired,
29 - sidebarStatic: PropTypes.bool.isRequired,
30 - chatToggle: PropTypes.func.isRequired,
31 - dispatch: PropTypes.func.isRequired,
32 - location: PropTypes.shape({
33 - pathname: PropTypes.string,
34 - }).isRequired,
35 - };
36 -
37 - constructor(props) {
38 - super(props);
39 -
40 - this.toggleMenu = this.toggleMenu.bind(this);
41 - this.switchSidebar = this.switchSidebar.bind(this);
42 -
43 - this.state = {
44 - menuOpen: false,
45 - notificationsOpen: false,
46 - notificationsTabSelected: 1,
47 - };
48 - }
49 -
50 - // collapse/uncolappse
51 - switchSidebar() {
52 - if (this.props.sidebarOpened) {
53 - this.props.dispatch(closeSidebar());
54 - this.props.dispatch(changeActiveSidebarItem(null));
55 - } else {
56 - const paths = this.props.location.pathname.split('/');
57 - paths.pop();
58 - this.props.dispatch(openSidebar());
59 - this.props.dispatch(changeActiveSidebarItem(paths.join('/')));
60 - }
61 - }
62 -
63 - toggleMenu() {
64 - this.setState({
65 - menuOpen: !this.state.menuOpen,
66 - });
67 - }
68 - render() {
69 - return (
70 - <Navbar className={classnames(s.root, sd.header, 'd-print-none')}>
71 - <div className="container">
72 - <div className="row w-100 d-flex align-items-center">
73 - <Nav>
74 - <NavItem>
75 - <NavLink className="fs-lg d-lg-none d-md-none" onClick={this.switchSidebar}>
76 - <span className="rounded rounded-lg text-white d-md-none"><i className="la la-bars" /></span>
77 - <i className="la la-bars ml-3 d-sm-down-none" />
78 - </NavLink>
79 - </NavItem>
80 - <NavItem>
81 - <NavLink className={classnames(s.logo, 'd-sm-down-none px-4')} href={'/documentation'}>
82 - <span className={'fw-semi-bold'}>Sing App React</span> &nbsp; Documentation
83 - </NavLink>
84 - </NavItem>
85 - </Nav>
86 -
87 - <NavLink className={`${s.navbarBrand} d-md-none text-muted`}>
88 - <i className="fa fa-circle text-gray mr-n-sm" />
89 - <i className="fa fa-circle text-warning" />
90 - &nbsp;
91 - documentation
92 - &nbsp;
93 - <i className="fa fa-circle text-warning mr-n-sm" />
94 - <i className="fa fa-circle text-muted" />
95 - </NavLink>
96 -
97 - <Nav className="ml-auto">
98 - <NavItem className="d-flex alight-items-center d-md-down-none">
99 - <NavLink href="https://twitter.com/flatlogic" className="mr-1">
100 - <img src={twitterLogo} alt="twitter" />
101 - </NavLink>
102 - <NavLink href="https://dribbble.com/flatlogic" className="mr-1">
103 - <img src={dribbleLogo} alt="dribble" />
104 - </NavLink>
105 - <NavLink href="https://dribbble.com/flatlogic" className="mr-1">
106 - <img src={facebookLogo} alt="facebook" />
107 - </NavLink>
108 - <NavLink href="https://instagram.com/flatlogiccom/" className="mr-1">
109 - <img src={instagramLogo} alt="instagram" />
110 - </NavLink>
111 - <NavLink href="https://www.linkedin.com/company/flatlogic/" className="mr-1">
112 - <img src={linkedinLogo} alt="linkedin" />
113 - </NavLink>
114 - <NavLink href="https://github.com/flatlogic" className="mr-3">
115 - <img src={githubLogo} alt="github" />
116 - </NavLink>
117 - </NavItem>
118 - <NavItem className="d-flex align-items-center">
119 - <NavItem className="d-md-down-none">
120 - <Link to="/" className="btn btn-default">
121 - Live Preview
122 - </Link>
123 - </NavItem>
124 - <NavLink href="https://flatlogic.com/admin-dashboards/sing-app-react" target="_blank" className="mr-1">
125 - <button className="btn btn-warning text-gray fw-semi-bold">
126 - Buy Now
127 - </button>
128 - </NavLink>
129 - </NavItem>
130 - </Nav>
131 - </div>
132 - </div>
133 - </Navbar>
134 - );
135 - }
136 -}
137 -
138 -function mapStateToProps(store) {
139 - return {
140 - sidebarOpened: store.navigation.sidebarOpened,
141 - sidebarStatic: store.navigation.sidebarStatic,
142 - };
143 -}
144 -
145 -export default withRouter(connect(mapStateToProps)(Header));
146 -
1 -import React from 'react';
2 -import PropTypes from 'prop-types';
3 -import { connect } from 'react-redux';
4 -import { Col } from 'reactstrap';
5 -import classnames from 'classnames';
6 -import { Switch, Route, withRouter } from 'react-router';
7 -import Hammer from 'rc-hammerjs';
8 -
9 -import Header from './DocumentationHeader';
10 -import Sidebar from './DocumentationSidebar';
11 -import { openSidebar, closeSidebar, changeActiveSidebarItem, toggleSidebar } from '../actions/navigation';
12 -import s from '../components/Layout/Layout.module.scss';
13 -import sd from './styles.module.scss';
14 -
15 -import Overview from './pages/getting-started/Overview'
16 -import Licences from './pages/getting-started/Licences';
17 -import QuickStart from './pages/getting-started/QuickStart';
18 -import Alerts from './pages/components/Alerts';
19 -import Badge from './pages/components/Badge';
20 -import Buttons from './pages/components/Buttons';
21 -import Card from './pages/components/Card';
22 -import Carousel from './pages/components/Carousel';
23 -import Modal from './pages/components/Modal';
24 -import Nav from './pages/components/Nav';
25 -import Navbar from './pages/components/Navbar';
26 -import Popovers from './pages/components/Popovers';
27 -import Progress from './pages/components/Progress';
28 -import Tabs from './pages/components/Tabs';
29 -import Libs from './pages/Libs';
30 -import Pages from './pages/Pages';
31 -
32 -class Layout extends React.Component {
33 - static propTypes = {
34 - sidebarStatic: PropTypes.bool,
35 - sidebarOpened: PropTypes.bool,
36 - dispatch: PropTypes.func.isRequired,
37 - };
38 -
39 - static defaultProps = {
40 - sidebarStatic: false,
41 - sidebarOpened: false,
42 - };
43 -
44 - constructor(props) {
45 - super(props);
46 - this.handleSwipe = this.handleSwipe.bind(this);
47 -
48 - this.state = {
49 - chatOpen: false,
50 - width: window.innerWidth,
51 - };
52 -
53 - }
54 -
55 -
56 - componentDidMount() {
57 - const staticSidebar = JSON.parse(localStorage.getItem('staticSidebar'));
58 - if (staticSidebar) {
59 - this.props.dispatch(toggleSidebar());
60 - } else if (this.props.sidebarOpened) {
61 - setTimeout(() => {
62 - this.props.dispatch(closeSidebar());
63 - this.props.dispatch(changeActiveSidebarItem(null));
64 - }, 2500);
65 - }
66 -
67 - window.addEventListener('resize', this.handleResize.bind(this));
68 - }
69 -
70 - handleResize() {
71 - this.setState({
72 - width: window.innerWidth,
73 - })
74 -
75 - if(window.innerWidth < 768 && this.props.sidebarOpened) {
76 - this.props.dispatch(closeSidebar());
77 - }
78 - }
79 -
80 - handleSwipe(e) {
81 - if ('ontouchstart' in window) {
82 - if (e.direction === 4 && !this.state.chatOpen) {
83 - this.props.dispatch(openSidebar());
84 - return;
85 - }
86 -
87 - if (e.direction === 2 && this.props.sidebarOpened) {
88 - this.props.dispatch(closeSidebar());
89 - return;
90 - }
91 - }
92 - }
93 -
94 - render() {
95 - return (
96 - <div
97 - className={[
98 - s.root,
99 - sd.root,
100 - this.state.width > 768 && s.sidebarStatic,
101 - this.state.width < 768 && !this.props.sidebarOpened ? s.sidebarClose : '',
102 - ].join(' ')}
103 - >
104 - <Header />
105 - <div>
106 - <Hammer onSwipe={this.handleSwipe}>
107 - <main className={classnames(s.content, sd.content)}>
108 - <div className="container">
109 - <div className="row">
110 - <Sidebar width={this.state.width} />
111 - <Col xl={10} md={9}>
112 - <Switch>
113 - <Route path="/documentation/getting-started/overview" exact component={Overview} />
114 - <Route path="/documentation/getting-started/licences" exact component={Licences} />
115 - <Route path="/documentation/getting-started/quick-start" exact component={QuickStart} />
116 - <Route path="/documentation/components/alerts" exact component={Alerts} />
117 - <Route path="/documentation/components/badge" exact component={Badge} />
118 - <Route path="/documentation/components/buttons" exact component={Buttons} />
119 - <Route path="/documentation/components/card" exact component={Card} />
120 - <Route path="/documentation/components/carousel" exact component={Carousel} />
121 - <Route path="/documentation/components/modal" exact component={Modal} />
122 - <Route path="/documentation/components/nav" exact component={Nav} />
123 - <Route path="/documentation/components/navbar" exact component={Navbar} />
124 - <Route path="/documentation/components/popovers" exact component={Popovers} />
125 - <Route path="/documentation/components/tabs-accordion" exact component={Tabs} />
126 - <Route path="/documentation/components/progress" exact component={Progress} />
127 - <Route path="/documentation/libs" exact component={Libs} />
128 - <Route path="/documentation/pages" exact component={Pages} />
129 - </Switch>
130 - </Col>
131 - </div>
132 - </div>
133 - </main>
134 - </Hammer>
135 - </div>
136 - </div>
137 - );
138 - }
139 -}
140 -
141 -function mapStateToProps(store) {
142 - return {
143 - sidebarOpened: store.navigation.sidebarOpened,
144 - sidebarStatic: store.navigation.sidebarStatic,
145 - };
146 -}
147 -
148 -export default withRouter(connect(mapStateToProps)(Layout));
1 -import React from 'react';
2 -import PropTypes from 'prop-types';
3 -import classnames from 'classnames';
4 -import { connect } from 'react-redux';
5 -import { Col } from 'reactstrap';
6 -import { withRouter } from 'react-router-dom';
7 -import s from '../components/Sidebar/Sidebar.module.scss';
8 -import sd from './styles.module.scss'
9 -import { LinksGroup } from './components';
10 -
11 -import { openSidebar, closeSidebar, changeActiveSidebarItem } from '../actions/navigation';
12 -import isScreen from '../core/screenHelper';
13 -
14 -class Sidebar extends React.Component {
15 - static propTypes = {
16 - sidebarStatic: PropTypes.bool,
17 - sidebarOpened: PropTypes.bool,
18 - dispatch: PropTypes.func.isRequired,
19 - activeItem: PropTypes.string,
20 - location: PropTypes.shape({
21 - pathname: PropTypes.string,
22 - }).isRequired,
23 - };
24 -
25 - static defaultProps = {
26 - sidebarStatic: false,
27 - sidebarOpened: false,
28 - activeItem: '',
29 - };
30 -
31 - constructor(props) {
32 - super(props);
33 -
34 - this.onMouseEnter = this.onMouseEnter.bind(this);
35 - this.onMouseLeave = this.onMouseLeave.bind(this);
36 - }
37 -
38 - onMouseEnter() {
39 - if (!this.props.sidebarStatic && (isScreen('lg') || isScreen('xl'))) {
40 - const paths = this.props.location.pathname.split('/');
41 - paths.pop();
42 - this.props.dispatch(openSidebar());
43 - this.props.dispatch(changeActiveSidebarItem(paths.join('/')));
44 - }
45 - }
46 -
47 - onMouseLeave() {
48 - if (!this.props.sidebarStatic && (isScreen('lg') || isScreen('xl'))) {
49 - this.props.dispatch(closeSidebar());
50 - this.props.dispatch(changeActiveSidebarItem(null));
51 - }
52 - }
53 -
54 - render() {
55 - return (
56 - <Col xl={2} md={3}>
57 - <nav
58 - className={[s.root, sd.sidebar, this.props.width > 768 && s.staticSidebar].join(' ')}
59 - >
60 - <ul className={classnames(s.nav, sd.nav)}>
61 - <LinksGroup
62 - onActiveSidebarItemChange={activeItem => this.props.dispatch(changeActiveSidebarItem(activeItem))}
63 - activeItem={this.props.activeItem}
64 - header="Getting Started"
65 - isHeader
66 - link="/documentation/getting-started"
67 - index="getting-started"
68 - childrenLinks={[
69 - {
70 - header: 'Overview', link: '/documentation/getting-started/overview',
71 - },
72 - {
73 - header: 'Licences', link: '/documentation/getting-started/licences',
74 - },
75 - {
76 - header: 'Quick Start', link: '/documentation/getting-started/quick-start',
77 - }
78 - ]}
79 - />
80 - <LinksGroup
81 - onActiveSidebarItemChange={activeItem => this.props.dispatch(changeActiveSidebarItem(activeItem))}
82 - activeItem={this.props.activeItem}
83 - header="Pages"
84 - isHeader
85 - link="/documentation/pages"
86 - index="pages"
87 - />
88 - <LinksGroup
89 - onActiveSidebarItemChange={activeItem => this.props.dispatch(changeActiveSidebarItem(activeItem))}
90 - activeItem={this.props.activeItem}
91 - header="Components"
92 - isHeader
93 - link="/documentation/components"
94 - index="components"
95 - childrenLinks={[
96 - {
97 - header: 'Alerts', link: '/documentation/components/alerts',
98 - },
99 - {
100 - header: 'Badge', link: '/documentation/components/badge',
101 - },
102 - {
103 - header: 'Buttons', link: '/documentation/components/buttons',
104 - },
105 - {
106 - header: 'Card', link: '/documentation/components/card',
107 - },
108 - {
109 - header: 'Carousel', link: '/documentation/components/carousel',
110 - },
111 - {
112 - header: 'Modal', link: '/documentation/components/modal',
113 - },
114 - {
115 - header: 'Nav', link: '/documentation/components/nav',
116 - },
117 - {
118 - header: 'Navbar', link: '/documentation/components/navbar',
119 - },
120 - {
121 - header: 'Popovers & Tooltips', link: '/documentation/components/popovers',
122 - },
123 - {
124 - header: 'Progress', link: '/documentation/components/progress',
125 - },
126 - {
127 - header: 'Tabs & Accordion', link: '/documentation/components/tabs-accordion',
128 - },
129 - ]}
130 - />
131 - <LinksGroup
132 - onActiveSidebarItemChange={activeItem => this.props.dispatch(changeActiveSidebarItem(activeItem))}
133 - activeItem={this.props.activeItem}
134 - header="Libs"
135 - isHeader
136 - link="/documentation/libs"
137 - index="libs"
138 - />
139 - {/*<LinksGroup*/}
140 - {/*onActiveSidebarItemChange={activeItem => this.props.dispatch(changeActiveSidebarItem(activeItem))}*/}
141 - {/*activeItem={this.props.activeItem}*/}
142 - {/*header="FAQ"*/}
143 - {/*isHeader*/}
144 - {/*link="/documentation/faq"*/}
145 - {/*index="faq"*/}
146 - {/*childrenLinks={[*/}
147 - {/*{*/}
148 - {/*header: 'Analytics', link: '/app/main/analytics',*/}
149 - {/*}*/}
150 - {/*]}*/}
151 - {/*/>*/}
152 - </ul>
153 -
154 - <a className={classnames('d-md-down-none', sd.company)} href="http://flatlogic.com/" target="_blank" rel="noopener noreferrer">
155 - <img alt="company logo" src="https://cdn.dribbble.com/users/883507/avatars/small/7ca04141e335237d393ab41008adb46d.png?1509465697"/>
156 - Proudly built and maintained by <br/> Flatlogic
157 - </a>
158 - </nav >
159 - </Col>
160 - );
161 - }
162 -}
163 -
164 -function mapStateToProps(store) {
165 - return {
166 - sidebarOpened: store.navigation.sidebarOpened,
167 - sidebarStatic: store.navigation.sidebarStatic,
168 - alertsList: store.alerts.alertsList,
169 - activeItem: store.navigation.activeItem,
170 - };
171 -}
172 -
173 -export default withRouter(connect(mapStateToProps)(Sidebar));
1 -import React from 'react';
2 -
3 -import LinksGroupComponent from '../../components/Sidebar/LinksGroup/LinksGroup'
4 -import s from './styles.module.scss';
5 -
6 -export const LinksGroup = (props) => (
7 - <div className={s.linksGroupWrapper}>
8 - <LinksGroupComponent {...props} />
9 - </div>
10 -);
1 -.linksGroupWrapper :global(.collapse ul),
2 -.linksGroupWrapper :global(.collapsing ul),
3 -.linksGroupWrapper :global(li > a):hover {
4 - background: #FFFBF8 !important;
5 -}
6 -
7 -.linksGroupWrapper :global(li > a) {
8 - color: #495057 !important;
9 -}
1 -import React, {Component} from 'react';
2 -import { Row, Col, Breadcrumb, BreadcrumbItem, Button } from 'reactstrap';
3 -import SyntaxHighlighter from 'react-syntax-highlighter/dist/prism';
4 -import { tomorrow } from 'react-syntax-highlighter/dist/styles/prism';
5 -import ReactBootstrapSlider from 'react-bootstrap-slider';
6 -import {Sparklines, SparklinesBars} from "react-sparklines";
7 -import ColorPiker from 'rc-color-picker';
8 -import TextareaAutosize from 'react-autosize-textarea';
9 -import DateTime from 'react-datetime';
10 -import { Editor } from 'react-draft-wysiwyg';
11 -import MaskedInput from 'react-maskedinput'
12 -import Select2 from 'react-select2-wrapper';
13 -import Scrollspy from './ScrollSpyComponent';
14 -import { Link } from 'react-router-dom';
15 -
16 -import Widget from '../../components/Widget/Widget';
17 -import s from '../../pages/forms/elements/Elements.module.scss';
18 -import Skycon from "../../components/Skycon/Skycon";
19 -
20 -export default class Libs extends Component {
21 - state = {
22 - mde: '',
23 - };
24 -
25 - onMdeChange(value) {
26 - this.setState({
27 - mde: value,
28 - })
29 - };
30 -
31 - render() {
32 - return (
33 - <Row className={s.root}>
34 - <Col md={10}>
35 - <Breadcrumb>
36 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
37 - <BreadcrumbItem>Documentation</BreadcrumbItem>
38 - <BreadcrumbItem active>Libs</BreadcrumbItem>
39 - </Breadcrumb>
40 - </Col>
41 - <Col lg={9}>
42 - <Widget id="Animate.css">
43 - <h3>Animate.css</h3>
44 - <p>animate.css is a bunch of cool, fun, and cross-browser animations for you to use in your projects. Great
45 - for emphasis, home pages, sliders, and general just-add-water-awesomeness.</p>
46 - <h4>Example</h4>
47 - <h1 className="animated infinite fadeIn slow mt mb">Fade in</h1>
48 - <SyntaxHighlighter language='javascript'
49 - style={tomorrow}>{'<h1 class="animated infinite fadeIn slow">Fade in</h1>'}</SyntaxHighlighter>
50 - <p>For more examples please refer to <a href="https://github.com/daneden/animate.css/"
51 - target="_blank" rel="noopener noreferrer">Animate.css</a></p>
52 - </Widget>
53 - <Widget id="Bootstrap-slide">
54 - <h3>Bootstrap-slide & React-bootstrap-slider</h3>
55 - <p>A complete rewrite of the original bootstrap-slider by Stefan Petre.</p>
56 - <h4>Example</h4>
57 - <ReactBootstrapSlider
58 - value={4}
59 - step={2}
60 - max={10}
61 - min={0}
62 - orientation="horizontal"
63 - />
64 - <SyntaxHighlighter language='javascript' style={tomorrow}>{'<ReactBootstrapSlider\n' +
65 - ' value={4}\n' +
66 - ' step={2}\n' +
67 - ' max={10}\n' +
68 - ' min={0}\n' +
69 - ' orientation="horizontal"\n' +
70 - '/>'}</SyntaxHighlighter>
71 - <p>For more examples and documentation please refer to <a
72 - href="https://github.com/brownieboy/react-bootstrap-slider" target="_blank" rel="noopener noreferrer">React Bootstrap Slider</a></p>
73 - </Widget>
74 - <Widget id="Easy-pie-chart">
75 - <h3>Easy-pie-chart</h3>
76 - <p>Lightweight plugin to render simple, animated and retina optimized pie charts.</p>
77 - <p className="lead">Want to see examples? <Link to="/app/charts/easy-pie">Click</Link></p>
78 - <p>For more examples and documentation please refer to <a href="https://github.com/rendro/easy-pie-chart"
79 - target="_blank" rel="noopener noreferrer">Easy Pie Charts</a></p>
80 - </Widget>
81 - <Widget id="Flot">
82 - <h3>Flot & React-flot</h3>
83 - <p>Flot is a Javascript plotting library for jQuery.</p>
84 - <p className="lead">Want to see examples? <Link to="/app/charts/flot">Click</Link></p>
85 - <p>For more examples and documentation please refer to <a href="https://github.com/flot/flot"
86 - target="_blank" rel="noopener noreferrer">Flor</a></p>
87 - </Widget>
88 - <Widget id="Font-Awesome">
89 - <h3>Font-awesome</h3>
90 - <p>The iconic SVG, font, and CSS toolkit</p>
91 - <h4>Examples</h4>
92 - <i className="fa fa-arrow-left fa-2x mr"/>
93 - <i className="fa fa-github fa-2x mr"/>
94 - <i className="fa fa-bath fa-2x mr"/>
95 - <i className="fa fa-grav fa-2x mr"/>
96 - <i className="fa fa-telegram fa-2x"/>
97 - <SyntaxHighlighter language='javascript'
98 - style={tomorrow}>{'<i className="fa fa-arrow-left fa-2x mr" />\n' +
99 - '<i className="fa fa-github fa-2x mr" />\n' +
100 - '<i className="fa fa-bath fa-2x mr" />\n' +
101 - '<i className="fa fa-grav fa-2x mr" />\n' +
102 - '<i className="fa fa-telegram fa-2x" />'}</SyntaxHighlighter>
103 - <p className="lead">Want to see examples? <Link to="/app/components/icons">Click</Link></p>
104 - <p>For more examples and documentation please refer to <a href="https://github.com/FortAwesome/Font-Awesome"
105 - target="_blank" rel="noopener noreferrer">Font Awesome</a></p>
106 - </Widget>
107 - <Widget id="Formsy-React">
108 - <h3>Formsy-react</h3>
109 - <p>A form input builder and validator for React JS</p>
110 - <p className="lead">Want to see examples? <Link to="/app/forms/wizard">Click</Link></p>
111 - <p>For more examples and documentation please refer to <a href="https://github.com/formsy/formsy-react"
112 - target="_blank" rel="noopener noreferrer">Formcy React</a></p>
113 - </Widget>
114 - <Widget id="Fullcalendar">
115 - <h3>Fullcalendar</h3>
116 - <p>A JavaScript event calendar. Customizable and open source.</p>
117 - <p className="lead">Want to see examples? <Link to="/app/extra/calendar">Click</Link></p>
118 - <p>For more examples and documentation please refer to <a
119 - href="https://github.com/fullcalendar/fullcalendar" target="_blank" rel="noopener noreferrer">Fullcalendar</a></p>
120 - </Widget>
121 - <Widget id="Glyphicons-Halflings">
122 - <h3>Glyphicons-halflings</h3>
123 - <p>TIncludes over 250 glyphs in font format from the Glyphicon Halflings set</p>
124 - <h4>Examples</h4>
125 - <i className="glyphicon glyphicon-asterisk mr"/>
126 - <i className="glyphicon glyphicon-heart mr"/>
127 - <i className="glyphicon glyphicon-home mr"/>
128 - <i className="glyphicon glyphicon-refresh mr"/>
129 - <i className="glyphicon glyphicon-camera"/>
130 - <SyntaxHighlighter language='javascript'
131 - style={tomorrow}>{'<i className="glyphicon glyphicon-asterisk mr" />\n' +
132 - '<i className="glyphicon glyphicon-heart mr" />\n' +
133 - '<i className="glyphicon glyphicon-home mr" />\n' +
134 - '<i className="glyphicon glyphicon-refresh mr" />\n' +
135 - '<i className="glyphicon glyphicon-camera" />'}</SyntaxHighlighter>
136 - <p className="lead">Want to see examples? <Link to="/app/ui/icons">Click</Link></p>
137 - <p>For more examples and documentation please refer to <a
138 - href="https://getbootstrap.com/docs/3.3/components/" target="_blank" rel="noopener noreferrer">Glyphicons</a></p>
139 - </Widget>
140 - <Widget id="Govpredict-Morris">
141 - <h3>Govpredict-morris</h3>
142 - <p>Pretty time-series line graphs</p>
143 - <p className="lead">Want to see examples? <Link to="/app/charts/morris">Click</Link></p>
144 - <p>For more examples and documentation please refer to <a href="https://github.com/morrisjs/morris.js"
145 - target="_blank" rel="noopener noreferrer">Morris</a></p>
146 - </Widget>
147 - <Widget id="Jquery-Mapael">
148 - <h3>Jquery-mapael</h3>
149 - <p>Ease the build of pretty data visualizations on dynamic vector maps</p>
150 - <p className="lead">Want to see examples? <Link to="/app/main/dashboard">Click</Link></p>
151 - <p>For more examples and documentation please refer to <a href="https://github.com/neveldo/jQuery-Mapael"
152 - target="_blank" rel="noopener noreferrer">Mapael</a></p>
153 - </Widget>
154 - <Widget id="React-Sparkline">
155 - <h3>Jquery-sparkline & React-sparkline</h3>
156 - <p>This jQuery plugin makes it easy to generate a number of different types of sparklines directly in the
157 - browser, using online a line of two of HTML and Javascript.</p>
158 - <Sparklines data={[13, 14, 16, 15, 4, 14, 20]} style={{width: '70px', height: '30px', marginRight: '10px'}}>
159 - <SparklinesBars style={{stroke: 'white', fill: '#618fb0'}}/>
160 - </Sparklines>
161 - <Sparklines data={[14, 12, 16, 11, 17, 19, 16]} style={{width: '70px', height: '30px'}}>
162 - <SparklinesBars style={{stroke: 'white', fill: '#999'}}/>
163 - </Sparklines>
164 - <SyntaxHighlighter language='javascript'
165 - style={tomorrow}>{'<Sparklines data={[13, 14, 16, 15, 4, 14, 20]} style={{ width: \'70px\', height: \'30px\', marginRight: \'10px\' }}>\n' +
166 - ' <SparklinesBars style={{ stroke: \'white\', fill: \'#618fb0\' }} />\n' +
167 - '</Sparklines>\n' +
168 - '<Sparklines data={[14, 12, 16, 11, 17, 19, 16]} style={{ width: \'70px\', height: \'30px\' }}>\n' +
169 - ' <SparklinesBars style={{ stroke: \'white\', fill: \'#999\' }} />\n' +
170 - '</Sparklines>'}</SyntaxHighlighter>
171 - <p>For more examples and documentation please refer to <a
172 - href="https://github.com/borisyankov/react-sparklines" target="_blank" rel="noopener noreferrer">React Sparklines</a></p>
173 - </Widget>
174 - <Widget id="Jquery-UI">
175 - <h3>Jquery-ui</h3>
176 - <p>The official jQuery user interface library.</p>
177 - <p className="lead">Want to see examples? <Link to="/app/grid">Click</Link></p>
178 - <p>For more examples and documentation please refer to <a href="https://github.com/jquery/jquery-ui"
179 - target="_blank" rel="noopener noreferrer">Jquery UI</a></p>
180 - </Widget>
181 - <Widget id="Jquery-Animate-Number">
182 - <h3>Jquery.animate-number</h3>
183 - <p>jQuery numbers animation plugin, adds 'number' property and step function to jQuery's animate function
184 - properties.</p>
185 - <p className="lead">Want to see examples? <Link to="/app/main/dashboard">Click</Link></p>
186 - <p>For more examples and documentation please refer to <a
187 - href="https://github.com/aishek/jquery-animateNumber" target="_blank" rel="noopener noreferrer">Animate Number</a></p>
188 - </Widget>
189 - <Widget id="Jvectormap">
190 - <h3>Jvectormap</h3>
191 - <p>jVectorMap is a vector-based, cross-browser and cross-platform component for interactive
192 - geography-related data visualization on the web. It
193 - provides numerious features like smooth zooming and panning, fully-customizable styling, markers, labels
194 - and tooltips.</p>
195 - <p className="lead">Want to see examples? <Link to="/app/maps/vector">Click</Link></p>
196 - <p>For more examples and documentation please refer to <a href="https://github.com/bjornd/jvectormap"
197 - target="_blank" rel="noopener noreferrer">Vector Map</a></p>
198 - </Widget>
199 - <Widget id="Line-Awesome">
200 - <h3>Line-awesome</h3>
201 - <p>A single file that replaces Font Awesome with modern line icons.</p>
202 - <h4>Examples</h4>
203 - <i className="la la-arrow-left la-2x mr"/>
204 - <i className="la la-github la-2x mr"/>
205 - <i className="la la-facebook la-2x mr"/>
206 - <SyntaxHighlighter language='javascript'
207 - style={tomorrow}>{'<i className="la la-arrow-left la-2x mr" />\n' +
208 - '<i className="la la-github la-2x mr" />\n' +
209 - '<i className="la la-facebook la-2x mr" />'}</SyntaxHighlighter>
210 - <p className="lead">Want to see examples? <Link to="/app/ui/icons">Click</Link></p>
211 - <p>For more examples and documentation please refer to <a href="https://github.com/FortAwesome/Font-Awesome"
212 - target="_blank" rel="noopener noreferrer">Font Awesome</a></p>
213 - </Widget>
214 - <Widget id="Messenger">
215 - <h3>Messenger</h3>
216 - <p>Growl-style alerts and messages</p>
217 - <p className="lead">Want to see examples? <Link to="/app/ui/notifications">Click</Link></p>
218 - <p>For more examples and documentation please refer to <a href="https://github.com/HubSpot/messenger"
219 - target="_blank" rel="noopener noreferrer">Messenger</a></p>
220 - </Widget>
221 - <Widget id="Metrojs">
222 - <h3>Metrojs</h3>
223 - <p>Metro JS is a JavaScript plugin for jQuery developed to easily enable Metro interfaces on the web.</p>
224 - <p className="lead">Want to see examples? <Link to="/app/main/widgets">Click</Link></p>
225 - <p>For more examples and documentation please refer to <a
226 - href="http://www.drewgreenwell.com/projects/metrojs" target="_blank" rel="noopener noreferrer">metrojs</a></p>
227 - </Widget>
228 - <Widget id="Rc-color-picker">
229 - <h3>Rc-color-picker</h3>
230 - <p>Color piker component for React</p>
231 - <ColorPiker/>
232 - <SyntaxHighlighter language='javascript'
233 - style={tomorrow}>{'<ColorPiker />'}</SyntaxHighlighter>
234 - <p>For more examples and documentation please refer to <a
235 - href="https://github.com/react-component/color-picker" target="_blank" rel="noopener noreferrer">Color Picker</a></p>
236 - </Widget>
237 - <Widget id="Rc-Hammerjs">
238 - <h3>Rc-hammerjs</h3>
239 - <p>ReactJS / HammerJS integration. Support touch events in your React app.</p>
240 - <p>For more examples and documentation please refer to <a href="https://github.com/JedWatson/react-hammerjs"
241 - target="_blank" rel="noopener noreferrer">HammerJS</a></p>
242 - </Widget>
243 - <Widget id="React-Autosize-Textarea">
244 - <h3>react-autosize-textarea</h3>
245 - <p>A light replacement for built-in <code>&lt;textarea /></code> component which automatically adjusts its
246 - height to match the content.</p>
247 - <TextareaAutosize placeholder="Try to type"/>
248 - <SyntaxHighlighter language='javascript'
249 - style={tomorrow}>{'<TextareaAutosize placeholder="Try to type"/>'}</SyntaxHighlighter>
250 - <p>For more examples and documentation please refer to <a
251 - href="https://github.com/buildo/react-autosize-textarea" target="_blank" rel="noopener noreferrer">Textarea</a></p>
252 - </Widget>
253 - <Widget id="React-Datetime">
254 - <h3>React-datetime</h3>
255 - <p>A date and time picker in the same React.js component</p>
256 - <div style={{width: '150px'}}>
257 - <DateTime/>
258 - </div>
259 - <SyntaxHighlighter language='javascript'
260 - style={tomorrow}>{'<DateTime />'}</SyntaxHighlighter>
261 - <p>For more examples and documentation please refer to <a
262 - href="https://github.com/YouCanBookMe/react-datetime" target="_blank" rel="noopener noreferrer">DetaTime</a></p>
263 - </Widget>
264 - <Widget id="React-Draft-Wysiwyg">
265 - <h3>React-draft-wysiwyg</h3>
266 - <p>A Wysiwyg editor built using ReactJS and DraftJS libraries</p>
267 - <Editor/>
268 - <p>For more examples and documentation please refer to <a
269 - href="https://github.com/jpuri/react-draft-wysiwyg" target="_blank" rel="noopener noreferrer">React Wysiwyg</a></p>
270 - </Widget>
271 - <Widget id="React-Dropzone">
272 - <h3>React-dropzone</h3>
273 - <p>Simple HTML5-compliant drag'n'drop zone for files built with React.js.</p>
274 - <p className="lead">Want to see examples? <Link to="/app/forms/elements">Click</Link></p>
275 - <p>For more examples and documentation please refer to <a
276 - href="https://github.com/react-dropzone/react-dropzone" target="_blank" rel="noopener noreferrer">React Dropzone</a></p>
277 - </Widget>
278 - <Widget id="React-Google-Maps">
279 - <h3>React-google-maps</h3>
280 - <p>React.js Google Maps integration component</p>
281 - <p className="lead">Want to see examples? <Link to="/app/maps/google">Click</Link></p>
282 - <p>For more examples and documentation please refer to <a
283 - href="https://github.com/tomchentw/react-google-maps" target="_blank" rel="noopener noreferrer">Google Maps</a></p>
284 - </Widget>
285 - <Widget id="React-Maskedinput">
286 - <h3>React-maskedinput</h3>
287 - <p>A React component for <code>&lt;input></code> masking, built on top of inputmask-core.</p>
288 - <div style={{width: '200px'}}>
289 - <MaskedInput mask="1111 1111 1111 1111" name="card" size="20" className="form-control"/>
290 - </div>
291 - <SyntaxHighlighter language='javascript'
292 - style={tomorrow}>{'<MaskedInput mask="1111 1111 1111 1111" name="card" size="20" className="form-control"/>'}</SyntaxHighlighter>
293 - <p>For more examples and documentation please refer to <a href="https://github.com/insin/react-maskedinput"
294 - target="_blank" rel="noopener noreferrer">Masked Input</a></p>
295 - </Widget>
296 - <Widget id="React-MDE">
297 - <h3>React-mde</h3>
298 - <p>A simple yet powerful and extensible Markdown Editor editor for React. React-mde is built on top of
299 - Draft.js.</p>
300 -
301 - <p>For more examples and documentation please refer to <a href="https://github.com/andrerpena/react-mde"
302 - target="_blank" rel="noopener noreferrer">ReactMDE</a></p>
303 - </Widget>
304 - <Widget id="React-Select2-Wrapper">
305 - <h3>React-select2-wrapper</h3>
306 - <p>React wrapper for Select2</p>
307 - <Select2
308 - style={{ width: '150px' }}
309 - multiple
310 - data={['bug', 'feature', 'documents', 'discussion']}
311 - options={
312 - {
313 - placeholder: 'search by tags',
314 - }
315 - }
316 - />
317 - <p>For more examples and documentation please refer to <a href="https://github.com/rkit/react-select2-wrapper" target="_blank" rel="noopener noreferrer">Select2</a></p>
318 - </Widget>
319 - <Widget id="React-Shuffle">
320 - <h3>React-shuffle</h3>
321 - <p>Animated shuffling of child components on change.</p>
322 - <p className="lead">Want to see examples? <Link to="/app/extra/gallery">Click</Link></p>
323 - <p>For more examples and documentation please refer to <a
324 - href="https://github.com/FormidableLabs/react-shuffle" target="_blank" rel="noopener noreferrer">Shuffle</a></p>
325 - </Widget>
326 - <Widget id="React-Slick">
327 - <h3>React-slick</h3>
328 - <p>React carousel component</p>
329 - <p className="lead">Want to see examples? <Link to="/app/ecommerce/product">Click</Link></p>
330 - <p>For more examples and documentation please refer to <a
331 - href="https://github.com/FormidableLabs/react-shuffle" target="_blank" rel="noopener noreferrer">React Slick</a></p>
332 - </Widget>
333 - <Widget id="React-Sortable">
334 - <h3>React-sortable</h3>
335 - <p>A components to turn any list into an animated, touch-friendly, sortable list.</p>
336 - <p className="lead">Want to see examples? <Link to="/app/ui/list-groups">Click</Link></p>
337 - <p>For more examples and documentation please refer to <a
338 - href="https://github.com/clauderic/react-sortable-hoc" target="_blank" rel="noopener noreferrer">React Sortable</a></p>
339 - </Widget>
340 - <Widget id="Reactstrap">
341 - <h3>Reactstrap</h3>
342 - <p>React wrapper for Bootstrap 4</p>
343 - <Button color="success">Bootstrap Button</Button>
344 - <SyntaxHighlighter language='javascript'
345 - style={tomorrow}>{' <Button color="success">Bootstrap Button</Button>'}</SyntaxHighlighter>
346 - <p>For more examples and documentation please refer to <a
347 - href="https://github.com/clauderic/react-sortable-hoc" target="_blank" rel="noopener noreferrer">Reactstrap</a></p>
348 - </Widget>
349 - <Widget id="Rickshaw">
350 - <h3>rickshaw</h3>
351 - <p>JavaScript toolkit for creating interactive real-time graphs</p>
352 - <p className="lead">Want to see examples? <Link to="/app/charts/rickshaw">Click</Link></p>
353 - <p>For more examples and documentation please refer to <a
354 - href="https://github.com/shutterstock/rickshaw" target="_blank" rel="noopener noreferrer">Rickshaw</a></p>
355 - </Widget>
356 - <Widget id="Skycons">
357 - <h3>Skycons</h3>
358 - <p>Skycons is a set of ten animated weather glyphs, procedurally generated by JavaScript using the HTML5 canvas tag.</p>
359 - <Skycon icon="CLEAR_DAY" color="#17a2b8" width="40" height="40" />
360 - <p>For more examples and documentation please refer to <a
361 - href="https://github.com/darkskyapp/skycons" target="_blank" rel="noopener noreferrer">Skycons</a></p>
362 - </Widget>
363 - </Col>
364 - <Col lg={3}>
365 - <Scrollspy
366 - title="LIBS"
367 - prefix="libs"
368 - ids={[
369 - 'Animate.css',
370 - 'Bootstrap-slide',
371 - 'Easy-pie-chart',
372 - 'Flot',
373 - 'Font-Awesome',
374 - 'Formsy-React',
375 - 'Fullcalendar',
376 - 'Glyphicons-Halflings',
377 - 'Govpredict-Morris',
378 - 'Jquery-Mapael',
379 - 'React-Sparkline',
380 - 'Jquery-UI',
381 - 'Jquery-Animate-Number',
382 - 'Jvectormap',
383 - 'Line-Awesome',
384 - 'Messenger',
385 - 'Metrojs',
386 - 'Rc-color-picker',
387 - 'Rc-hammerjs',
388 - 'React-Autosize-Textarea',
389 - 'React-Datetime',
390 - 'React-Draft-Wysiwyg',
391 - 'React-dropzone',
392 - 'React-Google-Maps',
393 - 'React-Maskedinput',
394 - 'React-MDE',
395 - 'React-Select2-Wrapper',
396 - 'React-Shuffle',
397 - 'React-Slick',
398 - 'React-Sortable',
399 - 'Reactstrap',
400 - 'Rickshaw',
401 - 'Skycons',
402 - ]} />
403 - </Col>
404 - </Row>
405 - )
406 - }
407 -}
1 -import React, {Component} from 'react';
2 -import { Row, Col, Breadcrumb, BreadcrumbItem } from 'reactstrap';
3 -import SyntaxHighlighter from 'react-syntax-highlighter/dist/prism';
4 -import { tomorrow } from 'react-syntax-highlighter/dist/styles/prism';
5 -import ProductCard from '../../pages/products/components/ProductCard/ProductCard';
6 -import products from '../../pages/products/mock'
7 -import { Link } from 'react-router-dom';
8 -
9 -import Widget from '../../components/Widget/Widget';
10 -import Scrollspy from "./ScrollSpyComponent";
11 -
12 -export default class Pages extends Component {
13 - render() {
14 - return (
15 - <Row>
16 - <Col md={10}>
17 - <Breadcrumb>
18 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
19 - <BreadcrumbItem>Documentation</BreadcrumbItem>
20 - <BreadcrumbItem active>Pages</BreadcrumbItem>
21 - </Breadcrumb>
22 - </Col>
23 - <Col lg={9}>
24 - <Widget id="Auth">
25 - <h3>Auth</h3>
26 - <p>Auth is a built-in module for an admin template dashboard. It contains all actions and handlers for any token authorization for your application.</p>
27 - <p>All logic is in <code>src/actions/user.js</code> and <code>src/reducers/user.js</code>. We have already preconfigured <a href="https://github.com/flatlogic/nodejs-backend" rel="noopener noreferrer" target="_blank">Node.js backend</a>
28 - <span className="small text-muted"> (Only in full stack version)</span> under the hood. <code>Creds</code> variable contains user email and password entered in the login form. It does request to our backend server and gets token and saves it in <code>localStorage</code>.</p>
29 - <p><b>Important note.</b> Credentials validation must be on the server side.</p>
30 - <p>Another important part of authentication is <code>PrivateRoute</code> component. That’s how it looks like.</p>
31 - <SyntaxHighlighter language='javascript' style={tomorrow}>{'const PrivateRoute = ({ dispatch, component, ...rest }) => {\n' +
32 - ' if (!Login.isAuthenticated(localStorage.getItem(\'token\'))) {\n' +
33 - ' dispatch(logoutUser());\n' +
34 - ' return (<Redirect to=\'/login\'/>)\n' +
35 - ' } else {\n' +
36 - ' return (\n' +
37 - ' <Route {...rest} render={props => (React.createElement(component, props))}/>\n' +
38 - ' );\n' +
39 - ' }\n' +
40 - '};'}</SyntaxHighlighter>
41 - <p>We are getting <code>token</code> from local storage, that must be saved in local storage after successful loginUser function completion. Depends on the result of this action, <code>PrivateRoute</code> returns page (react component) or redirect to the login page. If you don’t need login functionality in your app, you can use <code>Route</code> instead of <code>PrivateRoute</code>.</p>
42 - </Widget>
43 - <Widget id="Inbox">
44 - <h3>Inbox</h3>
45 - <p>Inbox is a ready-to-use application with all needed features. It’s easy to understand and customize. The code is divided into components, so you can easily change the layout of your application.</p>
46 - <ul>
47 - <li>Messages filter & search</li>
48 - <li>Compose</li>
49 - <li>Read/unread, star/unstar, delete actionsy</li>
50 - <li>Message attachments</li>
51 - <li>Reply functionality</li>
52 - </ul>
53 - <Link className="btn btn-primary" to="/app/inbox">Demo</Link>
54 - </Widget>
55 - <Widget id="Dashboards">
56 - <h3>Dashboards</h3>
57 - <p>The main screen of any application built on the top of the admin dashboard template. That is more informative pages of all application. There are 2 types of dashboards: analytics and visits.</p>
58 - <p>Analytics one. There you can find a lot of chart and statistics, calendar, todo manager, table with any data you need, notifications block.</p>
59 - <p>Main chart made with D3.js library, most powerful charts library. Other components are just a plain markup with state</p>
60 - <p>Visits dashboard page can be used for real-time displaying users & traffic data. It is a big vector map made with mapael in the center of this dashboard, that can display any region of the world with any data you want on hover action.</p>
61 - <p>All of this component can be used on any page of the application.</p>
62 - <p>
63 - <Link className="btn btn-primary mr-sm" to="/app/main/analytics">Analytics</Link>
64 - <Link className="btn btn-primary" to="/app/main/visits">Visits</Link>
65 - </p>
66 - </Widget>
67 - <Widget id="E-Commerce">
68 - <h3>E-commerce</h3>
69 - <p className="alert alert-secondary font-weight-bold"><span className="text-warning">Important note.</span> This section is fully supported by <a
70 - href="https://github.com/flatlogic/nodejs-backend" rel="noopener noreferrer" target="_blank">Node.js
71 - backend</a> data.
72 - </p>
73 - <p>E-commerce is a group of three pages: product management, product list and product details. Must have a page if you are doing something similar to marketplace or shop.</p>
74 - <p>&bull; Product management is a page, where you can manipulate with products data. You can CREATE, READ, UPDATE and DELETE products. <span className="small text-muted">(This page is available only in full stack version)</span></p>
75 - <p>&bull; Products page is a list of ProductCard component. <code>ProductCard</code> component used to display product image, price, label, the small description in a proper way.</p>
76 - <p>&bull; Product details is a detailed product card with a lot informative description.</p>
77 - <p>Examples of <code>ProductCard</code> component:</p>
78 - <Row>
79 - <Col md={6}>
80 - <ProductCard {...products[0]} />
81 - </Col>
82 - <Col md={6}>
83 - <ProductCard {...products[2]} />
84 - </Col>
85 - </Row>
86 - <p>
87 - <Link className="btn btn-primary mr-sm" to="/app/ecommerce/management">Management</Link>
88 - <Link className="btn btn-primary mr-sm" to="/app/ecommerce/products">List</Link>
89 - <Link className="btn btn-primary" to="/app/ecommerce/product">Details</Link>
90 - </p>
91 - </Widget>
92 - </Col>
93 - <Col lg={3}>
94 - <Scrollspy
95 - title="PAGES"
96 - prefix="pages"
97 - ids={[
98 - 'Auth',
99 - 'Inbox',
100 - 'Dashboards',
101 - 'E-Commerce',
102 - ]} />
103 - </Col>
104 - </Row>
105 - )
106 - }
107 -}
1 -import React from "react";
2 -import { HashLink as Link } from 'react-router-hash-link';
3 -import Scrollspy from "react-scrollspy";
4 -
5 -import s from '../styles.module.scss';
6 -
7 -export default (props) => (
8 - <div
9 - className="border-left pl-4 d-md-down-none"
10 - style={{
11 - position: 'fixed',
12 - overflowY: 'auto',
13 - maxHeight: 'calc(100vh - 130px)',
14 - paddingLeft: '15px'
15 - }}
16 - >
17 - <h6 className="fw-semi-bold">{props.title}</h6>
18 - <Scrollspy
19 - items={props.ids}
20 - currentClassName={s.activeScrollSpy}
21 - offset={-170}
22 - >
23 - {props.ids.map((id) => (
24 - <li key="id" className="mb-xs"><Link to={`/documentation/${props.prefix}#${id}`} className={s.scrollSpy}>{id.split('-').join(' ')}</Link></li>
25 - ))}
26 - </Scrollspy>
27 - </div>
28 -)
1 -import React, { Component } from 'react';
2 -import { Row, Col, Breadcrumb, BreadcrumbItem, Alert, TabContent, TabPane, Nav, NavItem, NavLink } from 'reactstrap';
3 -import SyntaxHighlighter from 'react-syntax-highlighter/dist/prism';
4 -import classnames from 'classnames';
5 -import { tomorrow } from 'react-syntax-highlighter/dist/styles/prism';
6 -
7 -const alerts = [{
8 - id: 'al-1',
9 - type: 'success',
10 - msg: '<span class="fw-semi-bold">Success:</span> You successfully read this important alert message.',
11 - visible: [true, true, true],
12 -}, {
13 - id: 'al-2',
14 - type: 'info',
15 - msg: '<span class="fw-semi-bold">Info:</span> This alert needs your attention, but it\'s not super important.',
16 - visible: [true, true, true],
17 -}, {
18 - id: 'al-3',
19 - type: 'warning',
20 - msg: '<span class="fw-semi-bold"><strong>Warning:</strong></span> Best check yo self, you\'re not looking too good.',
21 - visible: [true, true, true],
22 -}, {
23 - id: 'al-4',
24 - type: 'danger',
25 - msg: '<span class="fw-semi-bold">Danger:</span> Change this and that and try again. <a class="btn btn-default btn-xs float-right mr" href="#">Ignore</a> <a class="btn btn-danger btn-xs float-right mr-xs" href="#">Take this action</a>',
26 - visible: [true, true, true],
27 -}];
28 -
29 -class Overview extends Component {
30 - state = {
31 - defaultAlertsTabId: '1',
32 - transparentAlertsTabId: '1',
33 - };
34 -
35 - changeTab(field, id) {
36 - this.setState({
37 - [field]: id,
38 - })
39 - }
40 -
41 - render() {
42 - return (
43 - <Row>
44 - <Col md={10}>
45 - <Breadcrumb>
46 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
47 - <BreadcrumbItem>Documentation</BreadcrumbItem>
48 - <BreadcrumbItem>Components</BreadcrumbItem>
49 - <BreadcrumbItem active>Alerts</BreadcrumbItem>
50 - </Breadcrumb>
51 - </Col>
52 - <Col lg={9}>
53 - <h2>Alerts</h2>
54 - <p className="mb-lg">Provide contextual feedback messages for typical user actions with the handful of available and flexible alert messages.</p>
55 - <SyntaxHighlighter language='javascript' style={tomorrow}>
56 - {"import { Alert } from 'reactstrap';"}
57 - </SyntaxHighlighter>
58 - <Nav tabs className="bg-transparent mt">
59 - <NavItem>
60 - <NavLink
61 - className={classnames({ active: this.state.defaultAlertsTabId === '1' })}
62 - onClick={() => {
63 - this.changeTab('defaultAlertsTabId', '1');
64 - }}
65 - >
66 - Example
67 - </NavLink>
68 - </NavItem>
69 - <NavItem>
70 - <NavLink
71 - className={classnames({ active: this.state.defaultAlertsTabId === '2' })}
72 - onClick={() => {
73 - this.changeTab('defaultAlertsTabId', '2');
74 - }}
75 - >
76 - Code
77 - </NavLink>
78 - </NavItem>
79 - </Nav>
80 - <TabContent className="mb-xlg" activeTab={this.state.defaultAlertsTabId}>
81 - <TabPane tabId="1">
82 - <p>Alerts are available for any length of text, as well as an optional dismiss button.</p>
83 - {alerts.map((alert, index) => <Alert
84 - key={alert.id} isOpen={alert.visible[0]} toggle={() => this.closeAlert(index, 0)}
85 - color={alert.type}
86 - >
87 - <span dangerouslySetInnerHTML={{__html: alert.msg}}/>
88 - </Alert>)}
89 - </TabPane>
90 - <TabPane tabId="2">
91 - <SyntaxHighlighter language='javascript' style={tomorrow}>{'<Alert\n' +
92 - ' isOpen={true}\n' +
93 - ' toggle={this.closeAlert}\n' +
94 - ' color="danger"\n' +
95 - '>\n' +
96 - ' <h1>Alert Content</h1>\n' +
97 - '</Alert>'}</SyntaxHighlighter>
98 - </TabPane>
99 - </TabContent>
100 - <Nav tabs className="bg-transparent">
101 - <NavItem>
102 - <NavLink
103 - className={classnames({ active: this.state.transparentAlertsTabId === '1' })}
104 - onClick={() => {
105 - this.changeTab('transparentAlertsTabId', '1');
106 - }}
107 - >
108 - Example
109 - </NavLink>
110 - </NavItem>
111 - <NavItem>
112 - <NavLink
113 - className={classnames({ active: this.state.transparentAlertsTabId === '2' })}
114 - onClick={() => {
115 - this.changeTab('transparentAlertsTabId', '2');
116 - }}
117 - >
118 - Code
119 - </NavLink>
120 - </NavItem>
121 - </Nav>
122 - <TabContent className="mb-xlg" activeTab={this.state.transparentAlertsTabId}>
123 - <TabPane tabId="1">
124 - <p>Alerts are available for any length of text, as well as an optional dismiss button.</p>
125 - {alerts.map((alert, index) => <Alert
126 - className="alert-transparent"
127 - key={alert.id} isOpen={alert.visible[0]} toggle={() => this.closeAlert(index, 0)}
128 - color={alert.type}
129 - >
130 - <span dangerouslySetInnerHTML={{__html: alert.msg}}/>
131 - </Alert>)}
132 - </TabPane>
133 - <TabPane tabId="2">
134 - <SyntaxHighlighter language='javascript' style={tomorrow}>{'<Alert\n' +
135 - ' className="alert-transparent"\n' +
136 - ' isOpen={true}\n' +
137 - ' toggle={this.closeAlert}\n' +
138 - ' color="danger"\n' +
139 - '>\n' +
140 - ' <h1>Alert Content</h1>\n' +
141 - '</Alert>'}</SyntaxHighlighter>
142 - </TabPane>
143 - </TabContent>
144 - For more examples please refer to <a href="https://reactstrap.github.io/components/alerts/" target="_blank" rel="noopener noreferrer">Reactstrap Alerts</a>
145 - </Col>
146 - </Row>
147 - );
148 - }
149 -}
150 -
151 -export default Overview;
1 -import React, { Component } from 'react';
2 -import { Row, Col, Breadcrumb, BreadcrumbItem, Badge, Button, TabContent, TabPane, Nav, NavItem, NavLink } from 'reactstrap';
3 -import SyntaxHighlighter from 'react-syntax-highlighter/dist/prism';
4 -import classnames from 'classnames';
5 -import { tomorrow } from 'react-syntax-highlighter/dist/styles/prism';
6 -
7 -class Badges extends Component {
8 - state = {
9 - defaultBadgesTabId: '1',
10 - pillsBadgesTabId: '1',
11 - };
12 -
13 - changeTab(field, id) {
14 - this.setState({
15 - [field]: id,
16 - })
17 - }
18 -
19 - render() {
20 - return (
21 - <Row>
22 - <Col md={10}>
23 - <Breadcrumb>
24 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
25 - <BreadcrumbItem>Documentation</BreadcrumbItem>
26 - <BreadcrumbItem>Components</BreadcrumbItem>
27 - <BreadcrumbItem active>Badge</BreadcrumbItem>
28 - </Breadcrumb>
29 - </Col>
30 - <Col lg={9}>
31 - <h2>Badge</h2>
32 - <p className="mb-lg">Documentation and examples for badges, our small count and labeling component.</p>
33 - <SyntaxHighlighter language='javascript' style={tomorrow}>
34 - {"import { Badge } from 'reactstrap';"}
35 - </SyntaxHighlighter>
36 - <Nav tabs className="bg-transparent mt">
37 - <NavItem>
38 - <NavLink
39 - className={classnames({ active: this.state.defaultBadgesTabId === '1' })}
40 - onClick={() => {
41 - this.changeTab('defaultBadgesTabId', '1');
42 - }}
43 - >
44 - Example
45 - </NavLink>
46 - </NavItem>
47 - <NavItem>
48 - <NavLink
49 - className={classnames({ active: this.state.defaultBadgesTabId === '2' })}
50 - onClick={() => {
51 - this.changeTab('defaultBadgesTabId', '2');
52 - }}
53 - >
54 - Code
55 - </NavLink>
56 - </NavItem>
57 - </Nav>
58 - <TabContent className="mb-xlg" activeTab={this.state.defaultBadgesTabId}>
59 - <TabPane tabId="1">
60 - <h1>Example heading <Badge color="primary">Primary</Badge></h1>
61 - <h2>Example heading <Badge color="info">Info</Badge></h2>
62 - <h3>Example heading <Badge color="warning">Warning</Badge></h3>
63 - <h4>Example heading <Badge color="success">Success</Badge></h4>
64 - <h5>Example heading <Badge color="danger">Danger</Badge></h5>
65 - <h6>Example heading <Badge color="secondary">Secondary</Badge></h6>
66 - <p>Badges can be used as part of links or buttons to provide a counter.</p>
67 - <Button color="primary">Notifications <Badge color="danger">4</Badge></Button>
68 - </TabPane>
69 - <TabPane tabId="2">
70 - <SyntaxHighlighter language='javascript' style={tomorrow}>{'<h1>Example heading <Badge color="primary">Primary</Badge></h1>\n' +
71 - '<h2>Example heading <Badge color="info">Info</Badge></h2>\n' +
72 - '<h3>Example heading <Badge color="warning">Warning</Badge></h3>\n' +
73 - '<h4>Example heading <Badge color="success">Success</Badge></h4>\n' +
74 - '<h5>Example heading <Badge color="danger">Danger</Badge></h5>\n' +
75 - '<h6>Example heading <Badge color="secondary">Secondary</Badge></h6>\n\n' +
76 - '<Button color="primary">Notifications <Badge color="danger">4</Badge></Button>'}</SyntaxHighlighter>
77 - </TabPane>
78 - </TabContent>
79 - <Nav tabs className="bg-transparent">
80 - <NavItem>
81 - <NavLink
82 - className={classnames({ active: this.state.pillsBadgesTabId === '1' })}
83 - onClick={() => {
84 - this.changeTab('pillsBadgesTabId', '1');
85 - }}
86 - >
87 - Example
88 - </NavLink>
89 - </NavItem>
90 - <NavItem>
91 - <NavLink
92 - className={classnames({ active: this.state.pillsBadgesTabId === '2' })}
93 - onClick={() => {
94 - this.changeTab('pillsBadgesTabId', '2');
95 - }}
96 - >
97 - Code
98 - </NavLink>
99 - </NavItem>
100 - </Nav>
101 - <TabContent className="mb-xlg" activeTab={this.state.pillsBadgesTabId}>
102 - <TabPane tabId="1">
103 - <h4>Pill badges</h4>
104 - <p>
105 - <Badge className="mr-xs" color="primary" pill>Primary</Badge>
106 - <Badge className="mr-xs" color="info" pill>Info</Badge>
107 - <Badge className="mr-xs" color="warning" pill>Warning</Badge>
108 - <Badge className="mr-xs" color="success" pill>Success</Badge>
109 - <Badge className="mr-xs" color="danger" pill>Danger</Badge>
110 - <Badge className="mr-xs" color="secondary" pill>Secondary</Badge>
111 - <Badge className="mr-xs" color="light" pill>Light</Badge>
112 - <Badge className="mr-xs" color="dark" pill>Dark</Badge>
113 - </p>
114 - <h4>Badges with link</h4>
115 - <p>
116 - <Badge className="mr-xs" href="#" color="primary">Primary</Badge>
117 - <Badge className="mr-xs" href="#" color="info">Info</Badge>
118 - <Badge className="mr-xs" href="#" color="warning">Warning</Badge>
119 - <Badge className="mr-xs" href="#" color="success">Success</Badge>
120 - <Badge className="mr-xs" href="#" color="danger">Danger</Badge>
121 - <Badge className="mr-xs" href="#" color="secondary">Secondary</Badge>
122 - <Badge className="mr-xs" href="#" color="light">Light</Badge>
123 - <Badge className="mr-xs" href="#" color="dark">Dark</Badge>
124 - </p>
125 - </TabPane>
126 - <TabPane tabId="2">
127 - <SyntaxHighlighter language='javascript' style={tomorrow}>
128 - {'<Badge className="mr-xs" color="primary" pill>Primary</Badge> \n' +
129 - '<Badge className="mr-xs" href="#" color="primary">Primary</Badge>'}
130 - </SyntaxHighlighter>
131 - </TabPane>
132 - </TabContent>
133 - For more examples please refer to <a href="https://reactstrap.github.io/components/badge/" target="_blank" rel="noopener noreferrer">Reactstrap Badge</a>
134 - </Col>
135 - </Row>
136 - );
137 - }
138 -}
139 -
140 -export default Badges;
1 -import React, { Component } from 'react';
2 -import { Row, Col, Breadcrumb, BreadcrumbItem, Button, TabContent, TabPane, Nav, NavItem, NavLink } from 'reactstrap';
3 -import SyntaxHighlighter from 'react-syntax-highlighter/dist/prism';
4 -import classnames from 'classnames';
5 -import { tomorrow } from 'react-syntax-highlighter/dist/styles/prism';
6 -
7 -class Buttons extends Component {
8 - state = {
9 - defaultButtonTabId: '1',
10 - outlineButtonsTabId: '1',
11 - buttonsSizeTabId: '1'
12 - };
13 -
14 - changeTab(field, id) {
15 - this.setState({
16 - [field]: id,
17 - })
18 - }
19 -
20 - render() {
21 - return (
22 - <Row>
23 - <Col md={10}>
24 - <Breadcrumb>
25 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
26 - <BreadcrumbItem>Documentation</BreadcrumbItem>
27 - <BreadcrumbItem>Components</BreadcrumbItem>
28 - <BreadcrumbItem active>Buttons</BreadcrumbItem>
29 - </Breadcrumb>
30 - </Col>
31 -
32 - <Col lg={9}>
33 - <h2>Buttons</h2>
34 - <p className="mb-lg">Bootstrap includes several predefined button styles, each serving its own semantic purpose, with a few extras thrown in for more control.</p>
35 - <SyntaxHighlighter language='javascript' style={tomorrow}>
36 - {"import { Button } from 'reactstrap';"}
37 - </SyntaxHighlighter>
38 - <Nav tabs className="bg-transparent mt">
39 - <NavItem>
40 - <NavLink
41 - className={classnames({ active: this.state.defaultButtonTabId === '1' })}
42 - onClick={() => {
43 - this.changeTab('defaultButtonTabId', '1');
44 - }}
45 - >
46 - Example
47 - </NavLink>
48 - </NavItem>
49 - <NavItem>
50 - <NavLink
51 - className={classnames({ active: this.state.defaultButtonTabId === '2' })}
52 - onClick={() => {
53 - this.changeTab('defaultButtonTabId', '2');
54 - }}
55 - >
56 - Code
57 - </NavLink>
58 - </NavItem>
59 - </Nav>
60 - <TabContent className="mb-xlg" activeTab={this.state.defaultButtonTabId}>
61 - <TabPane tabId="1">
62 - <Button color="default" className="width-100 mb-xs mr-xs">Default</Button>
63 - <Button color="primary" className="width-100 mb-xs mr-xs">Primary</Button>
64 - <Button color="info" className="width-100 mb-xs mr-xs">Info</Button>
65 - <Button color="success" className="width-100 mb-xs mr-xs">Success</Button>
66 - <Button color="warning" className="width-100 mb-xs mr-xs">Warning</Button>
67 - <Button color="danger" className="width-100 mb-xs mr-xs">Danger</Button>
68 - <Button color="gray" className="width-100 mb-xs mr-xs">Gray</Button>
69 - <Button color="inverse" className="width-100 mb-xs mr-xs">Inverse</Button>
70 - </TabPane>
71 - <TabPane tabId="2">
72 - <SyntaxHighlighter language='javascript' style={tomorrow}>{'<Button color="default" className="width-100 mb-xs mr-xs">Default</Button>\n' +
73 - '<Button color="primary">Primary</Button>\n' +
74 - '<Button color="info">Info</Button>\n' +
75 - '<Button color="success">Success</Button>\n' +
76 - '<Button color="warning"">Warning</Button>\n' +
77 - '<Button color="danger">Danger</Button>\n' +
78 - '<Button color="gray">Gray</Button>\n' +
79 - '<Button color="inverse">Inverse</Button>'}</SyntaxHighlighter>
80 - </TabPane>
81 - </TabContent>
82 - <Nav tabs className="bg-transparent">
83 - <NavItem>
84 - <NavLink
85 - className={classnames({ active: this.state.outlineButtonsTabId === '1' })}
86 - onClick={() => {
87 - this.changeTab('outlineButtonsTabId', '1');
88 - }}
89 - >
90 - Example
91 - </NavLink>
92 - </NavItem>
93 - <NavItem>
94 - <NavLink
95 - className={classnames({ active: this.state.outlineButtonsTabId === '2' })}
96 - onClick={() => {
97 - this.changeTab('outlineButtonsTabId', '2');
98 - }}
99 - >
100 - Code
101 - </NavLink>
102 - </NavItem>
103 - </Nav>
104 - <TabContent className="mb-xlg" activeTab={this.state.outlineButtonsTabId}>
105 - <TabPane tabId="1">
106 - <Button outline color="default" className="width-100 mb-xs mr-xs">Default</Button>
107 - <Button outline color="primary" className="width-100 mb-xs mr-xs">Primary</Button>
108 - <Button outline color="info" className="width-100 mb-xs mr-xs">Info</Button>
109 - <Button outline color="success" className="width-100 mb-xs mr-xs">Success</Button>
110 - <Button outline color="warning" className="width-100 mb-xs mr-xs">Warning</Button>
111 - <Button outline color="danger" className="width-100 mb-xs mr-xs">Danger</Button>
112 - <Button outline color="gray" className="width-100 mb-xs mr-xs">Gray</Button>
113 - <Button outline color="inverse" className="width-100 mb-xs mr-xs">Inverse</Button>
114 - </TabPane>
115 - <TabPane tabId="2">
116 - <SyntaxHighlighter language='javascript' style={tomorrow}>
117 - {'<Button outline color="default">Default</Button>\n' +
118 - '<Button outline color="primary">Primary</Button>\n' +
119 - '<Button outline color="info">Info</Button>\n' +
120 - '<Button outline color="success">Success</Button>\n' +
121 - '<Button outline color="warning">Warning</Button>\n' +
122 - '<Button outline color="danger">Danger</Button>\n' +
123 - '<Button outline color="gray"">Gray</Button>\n' +
124 - '<Button outline color="inverse">Inverse</Button>'}
125 - </SyntaxHighlighter>
126 - </TabPane>
127 - </TabContent>
128 - <Nav tabs className="bg-transparent">
129 - <NavItem>
130 - <NavLink
131 - className={classnames({ active: this.state.buttonsSizeTabId === '1' })}
132 - onClick={() => {
133 - this.changeTab('buttonsSizeTabId', '1');
134 - }}
135 - >
136 - Example
137 - </NavLink>
138 - </NavItem>
139 - <NavItem>
140 - <NavLink
141 - className={classnames({ active: this.state.buttonsSizeTabId === '2' })}
142 - onClick={() => {
143 - this.changeTab('buttonsSizeTabId', '2');
144 - }}
145 - >
146 - Code
147 - </NavLink>
148 - </NavItem>
149 - </Nav>
150 - <TabContent className="mb-xlg" activeTab={this.state.buttonsSizeTabId}>
151 - <TabPane tabId="1">
152 - <p className="fs-mini text-muted">
153 - Fancy larger or smaller buttons?
154 - Four separate sizes available for all use cases:
155 - from tiny 10px button to large one.
156 - </p>
157 - <p>
158 - <Button color="default" size="lg" className="mb-xs mr-xs">Large button</Button>
159 - <Button color="primary" className="mb-xs mr-xs">Default button</Button>
160 - <Button color="info" size="sm" className="mb-xs mr-xs">Small button</Button>
161 - <Button color="success" size="xs" className="mb-xs mr-xs">Tiny button</Button>
162 - </p>
163 - </TabPane>
164 - <TabPane tabId="2">
165 - <SyntaxHighlighter language='javascript' style={tomorrow}>
166 - {'<Button color="default" size="lg">Large button</Button>\n' +
167 - '<Button color="primary">Default button</Button>\n' +
168 - '<Button color="info" size="sm">Small button</Button>\n' +
169 - '<Button color="success" size="xs">Tiny button</Button>'}
170 - </SyntaxHighlighter>
171 - </TabPane>
172 - </TabContent>
173 - For more examples please refer to <a href="https://reactstrap.github.io/components/buttons/" target="_blank" rel="noopener noreferrer">Reactstrap Buttons</a>
174 - </Col>
175 - </Row>
176 - );
177 - }
178 -}
179 -
180 -export default Buttons;
1 -import React, { Component } from 'react';
2 -import { Row, Col, Breadcrumb, BreadcrumbItem, Button, Card, CardBody, TabContent, TabPane, Nav, NavItem, NavLink } from 'reactstrap';
3 -import SyntaxHighlighter from 'react-syntax-highlighter/dist/prism';
4 -import classnames from 'classnames';
5 -import { tomorrow } from 'react-syntax-highlighter/dist/styles/prism';
6 -
7 -class Buttons extends Component {
8 - state = {
9 - defaultCardTabId: '1',
10 - };
11 -
12 - changeTab(field, id) {
13 - this.setState({
14 - [field]: id,
15 - })
16 - }
17 -
18 - render() {
19 - return (
20 - <Row>
21 - <Col md={10}>
22 - <Breadcrumb>
23 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
24 - <BreadcrumbItem>Documentation</BreadcrumbItem>
25 - <BreadcrumbItem>Components</BreadcrumbItem>
26 - <BreadcrumbItem active>Card</BreadcrumbItem>
27 - </Breadcrumb>
28 - </Col>
29 -
30 - <Col lg={9}>
31 - <h2>Card</h2>
32 - <p className="mb-lg">Cards support a wide variety of content, including images, text, list groups, links, and more. Below are examples of whats supported.</p>
33 - <SyntaxHighlighter language='javascript' style={tomorrow}>
34 - {"import { Card, CardBody } from 'reactstrap';"}
35 - </SyntaxHighlighter>
36 - <Nav tabs className="bg-transparent mt">
37 - <NavItem>
38 - <NavLink
39 - className={classnames({ active: this.state.defaultCardTabId === '1' })}
40 - onClick={() => {
41 - this.changeTab('defaultCardTabId', '1');
42 - }}
43 - >
44 - Example
45 - </NavLink>
46 - </NavItem>
47 - <NavItem>
48 - <NavLink
49 - className={classnames({ active: this.state.defaultCardTabId === '2' })}
50 - onClick={() => {
51 - this.changeTab('defaultCardTabId', '2');
52 - }}
53 - >
54 - Code
55 - </NavLink>
56 - </NavItem>
57 - </Nav>
58 - <TabContent className="mb-xlg" activeTab={this.state.defaultCardTabId}>
59 - <TabPane tabId="1">
60 - <Card className="border-0">
61 - <CardBody>
62 - <button className="btn-link fw-semi-bold text-success">Avg Rating</button>
63 - <button className="btn-link fw-semi-bold text-muted ml-sm">All Time</button>
64 - <hr />
65 - <div className="d-flex justify-content-between mb-lg">
66 - <div className="text-warning">
67 - <i className="fa fa-star mr-xs" />
68 - <i className="fa fa-star mr-xs" />
69 - <i className="fa fa-star mr-xs" />
70 - <i className="fa fa-star mr-xs" />
71 - <i className="fa fa-star" />
72 - </div>
73 - <span className="text-muted"><small>342 REVIEWS</small></span>
74 - </div>
75 - <div className="mb-lg">
76 - <h3 className="text-success mb-0">69%</h3>
77 - of customers recomend this product
78 - </div>
79 - <Button className="btn-rounded-f" color="success">Write a Review</Button>
80 - </CardBody>
81 - </Card>
82 - </TabPane>
83 - <TabPane tabId="2">
84 - <SyntaxHighlighter language='javascript' style={tomorrow}>{'<Card className="border-0">\n' +
85 - ' <CardBody>\n' +
86 - ' <button className="btn-link fw-semi-bold text-success">Avg Rating</button>\n' +
87 - ' <button className="btn-link fw-semi-bold text-muted ml-sm">All Time</button>\n' +
88 - ' <hr />\n' +
89 - ' <div className="d-flex justify-content-between mb-lg">\n' +
90 - ' <div className="text-warning">\n' +
91 - ' <i className="fa fa-star mr-xs" />\n' +
92 - ' <i className="fa fa-star mr-xs" />\n' +
93 - ' <i className="fa fa-star mr-xs" />\n' +
94 - ' <i className="fa fa-star mr-xs" />\n' +
95 - ' <i className="fa fa-star" />\n' +
96 - ' </div>\n' +
97 - ' <span className="text-muted"><small>342 REVIEWS</small></span>\n' +
98 - ' </div>\n' +
99 - ' <div className="mb-lg">\n' +
100 - ' <h3 className="text-success mb-0">69%</h3>\n' +
101 - ' of customers recomend this product\n' +
102 - ' </div>\n' +
103 - ' <Button className="btn-rounded-f" color="success">Write a Review</Button>\n' +
104 - ' </CardBody>\n' +
105 - '</Card>'}</SyntaxHighlighter>
106 - </TabPane>
107 - </TabContent>
108 - For more examples please refer to <a href="https://reactstrap.github.io/components/card/" target="_blank" rel="noopener noreferrer">Reactstrap Card</a>
109 - </Col>
110 - </Row>
111 - );
112 - }
113 -}
114 -
115 -export default Buttons;
1 -import React, { Component } from 'react';
2 -import { Row, Col, Breadcrumb, BreadcrumbItem, UncontrolledCarousel } from 'reactstrap';
3 -import SyntaxHighlighter from 'react-syntax-highlighter/dist/prism';
4 -import { tomorrow } from 'react-syntax-highlighter/dist/styles/prism';
5 -
6 -import firstSlide from '../../../images/slides/1.jpg';
7 -import secondSlide from '../../../images/slides/2.jpg';
8 -import thirdSlide from '../../../images/slides/3.jpg';
9 -
10 -const carouselItems = [
11 - { src: firstSlide, caption: '' },
12 - { src: secondSlide, caption: '' },
13 - { src: thirdSlide, caption: '' },
14 -];
15 -
16 -class Buttons extends Component {
17 - render() {
18 - return (
19 - <Row>
20 - <Col md={10}>
21 - <Breadcrumb>
22 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
23 - <BreadcrumbItem>Documentation</BreadcrumbItem>
24 - <BreadcrumbItem>Components</BreadcrumbItem>
25 - <BreadcrumbItem active>Carousel</BreadcrumbItem>
26 - </Breadcrumb>
27 - </Col>
28 - <Col lg={9}>
29 - <h2>Carousel</h2>
30 - <p className="mb-lg">A slideshow component for cycling through elementsimages or slides of textlike a carousel.</p>
31 - <SyntaxHighlighter language='javascript' style={tomorrow}>
32 - {"import { UncontrolledCarousel} from 'reactstrap';"}
33 - </SyntaxHighlighter>
34 - <UncontrolledCarousel className="mb-lg mt-lg" captionTex={null} items={carouselItems} />
35 - <SyntaxHighlighter language='javascript' style={tomorrow}>{'const carouselItems = [\n' +
36 - ' { src: firstSlide, caption: \'\' },\n' +
37 - ' { src: secondSlide, caption: \'\' },\n' +
38 - ' { src: thirdSlide, caption: \'\' },\n' +
39 - '];\n' +
40 - '\n' +
41 - '<UncontrolledCarousel captionTex={null} items={carouselItems} />'}
42 - </SyntaxHighlighter>
43 - For more examples please refer to <a href="https://reactstrap.github.io/components/carousel/" target="_blank"
44 - rel="noopener noreferrer">Reactstrap Carousel</a>
45 - </Col>
46 - </Row>
47 - );
48 - }
49 -}
50 -
51 -export default Buttons;
1 -import React, { Component } from 'react';
2 -import { Row, Col, Breadcrumb, BreadcrumbItem, Button, Modal, ModalHeader, ModalBody, ModalFooter, TabContent, TabPane, Nav, NavItem, NavLink } from 'reactstrap';
3 -import SyntaxHighlighter from 'react-syntax-highlighter/dist/prism';
4 -import classnames from 'classnames';
5 -import { tomorrow } from 'react-syntax-highlighter/dist/styles/prism';
6 -
7 -class Modals extends Component {
8 - state = {
9 - defaultModalTabId: '1',
10 - variatonModalsTabId: '1',
11 - demo: false,
12 - scrollingLong: false,
13 - large: false,
14 - };
15 -
16 - toggle(id) {
17 - this.setState(prevState => ({
18 - [id]: !prevState[id],
19 - }));
20 - }
21 -
22 - changeTab(field, id) {
23 - this.setState({
24 - [field]: id,
25 - })
26 - }
27 -
28 - render() {
29 - return (
30 - <Row>
31 - <Col md={10}>
32 - <Breadcrumb>
33 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
34 - <BreadcrumbItem>Documentation</BreadcrumbItem>
35 - <BreadcrumbItem>Components</BreadcrumbItem>
36 - <BreadcrumbItem active>Modal</BreadcrumbItem>
37 - </Breadcrumb>
38 - </Col>
39 -
40 - <Col lg={9}>
41 - <h2>Modal</h2>
42 - <p className="mb-lg">Use Bootstraps JavaScript modal plugin to add dialogs to your site for lightboxes, user notifications, or completely custom content.</p>
43 - <SyntaxHighlighter language='javascript' style={tomorrow}>
44 - {"import { Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';"}
45 - </SyntaxHighlighter>
46 - <Nav tabs className="bg-transparent mt">
47 - <NavItem>
48 - <NavLink
49 - className={classnames({ active: this.state.defaultModalTabId === '1' })}
50 - onClick={() => {
51 - this.changeTab('defaultModalTabId', '1');
52 - }}
53 - >
54 - Example
55 - </NavLink>
56 - </NavItem>
57 - <NavItem>
58 - <NavLink
59 - className={classnames({ active: this.state.defaultModalTabId === '2' })}
60 - onClick={() => {
61 - this.changeTab('defaultModalTabId', '2');
62 - }}
63 - >
64 - Code
65 - </NavLink>
66 - </NavItem>
67 - </Nav>
68 - <TabContent className="mb-xlg" activeTab={this.state.defaultModalTabId}>
69 - <TabPane tabId="1">
70 - <Button onClick={() => this.toggle('demo')} size="lg" color="primary">Default modal</Button>
71 - </TabPane>
72 - <TabPane tabId="2">
73 - <SyntaxHighlighter language='javascript' style={tomorrow}>{'<Modal isOpen={} toggle={}>\n' +
74 - ' <ModalHeader toggle={}>Modal title</ModalHeader>\n' +
75 - ' <ModalBody className="bg-white">\n' +
76 - ' ...\n' +
77 - ' </ModalBody>\n' +
78 - ' <ModalFooter>\n' +
79 - ' <Button color="secondary" onClick={}>Close</Button>\n' +
80 - ' <Button color="primary">Save changes</Button>\n' +
81 - ' </ModalFooter>\n' +
82 - '</Modal>'}</SyntaxHighlighter>
83 - </TabPane>
84 - </TabContent>
85 - <Nav tabs className="bg-transparent mt">
86 - <NavItem>
87 - <NavLink
88 - className={classnames({ active: this.state.variatonModalsTabId === '1' })}
89 - onClick={() => {
90 - this.changeTab('variatonModalsTabId', '1');
91 - }}
92 - >
93 - Example
94 - </NavLink>
95 - </NavItem>
96 - <NavItem>
97 - <NavLink
98 - className={classnames({ active: this.state.variatonModalsTabId === '2' })}
99 - onClick={() => {
100 - this.changeTab('variatonModalsTabId', '2');
101 - }}
102 - >
103 - Code
104 - </NavLink>
105 - </NavItem>
106 - </Nav>
107 - <TabContent className="mb-xlg" activeTab={this.state.variatonModalsTabId}>
108 - <TabPane tabId="1">
109 - <h3>Variations</h3>
110 - <Button className="mr-lg" onClick={() => this.toggle('scrollingLong')} size="lg" color="danger">Long modal</Button>
111 - <Button onClick={() => this.toggle('large')} size="lg" color="success">Large modal</Button>
112 - </TabPane>
113 - <TabPane tabId="2">
114 - <SyntaxHighlighter language='javascript' style={tomorrow}>{'<Modal isOpen={} toggle={}>\n' +
115 - ' <ModalHeader toggle={}>Modal title</ModalHeader>\n' +
116 - ' <ModalBody className="bg-white">\n' +
117 - ' {longContent}\n' +
118 - ' </ModalBody>\n' +
119 - ' <ModalFooter>\n' +
120 - ' <Button color="secondary" onClick={}>Close</Button>\n' +
121 - ' <Button color="primary">Save changes</Button>\n' +
122 - ' </ModalFooter>\n' +
123 - '</Modal>\n\n' +
124 - '<Modal size="lg"> \n' +
125 - ' <ModalHeader toggle={}>Modal title</ModalHeader>\n' +
126 - ' <ModalBody className="bg-white">\n' +
127 - ' {content}\n' +
128 - ' </ModalBody>\n' +
129 - ' <ModalFooter>\n' +
130 - ' <Button color="secondary" onClick={}>Close</Button>\n' +
131 - ' <Button color="primary">Save changes</Button>\n' +
132 - ' </ModalFooter>\n' +
133 - '</Modal>'}</SyntaxHighlighter>
134 - </TabPane>
135 - </TabContent>
136 - For more examples please refer to <a href="https://reactstrap.github.io/components/modal/" target="_blank" rel="noopener noreferrer">Reactstrap Modal</a>
137 - </Col>
138 - <Modal isOpen={this.state.demo} toggle={() => this.toggle('demo')}>
139 - <ModalHeader toggle={() => this.toggle('demo')}>Modal title</ModalHeader>
140 - <ModalBody className="bg-white">
141 - ...
142 - </ModalBody>
143 - <ModalFooter>
144 - <Button color="secondary" onClick={() => this.toggle('demo')}>Close</Button>
145 - <Button color="primary">Save changes</Button>
146 - </ModalFooter>
147 - </Modal>
148 -
149 - <Modal isOpen={this.state.scrollingLong} toggle={() => this.toggle('scrollingLong')}>
150 - <ModalHeader toggle={() => this.toggle('scrollingLong')}>Long content</ModalHeader>
151 - <ModalBody className="bg-white">
152 - <p>
153 - Lorem Ipsum is simply dummy text of the printing and typesetting industry.
154 - Lorem Ipsum has been the industry&apos;s standard dummy text ever since the 1500s,
155 - when an unknown printer took a galley of type and scrambled it to make a type
156 - specimen book. It has survived not only five centuries, but also the leap
157 - into electronic typesetting, remaining essentially unchanged. It was popularised
158 - in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages,
159 - and more recently with desktop publishing software like Aldus PageMaker including
160 - versions of Lorem Ipsum.
161 - </p>
162 - <p>
163 - Lorem Ipsum is simply dummy text of the printing and typesetting industry.
164 - Lorem Ipsum has been the industry&apos;s standard dummy text ever since the 1500s,
165 - when an unknown printer took a galley of type and scrambled it to make a type
166 - specimen book. It has survived not only five centuries, but also the leap
167 - into electronic typesetting, remaining essentially unchanged. It was popularised
168 - in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages,
169 - and more recently with desktop publishing software like Aldus PageMaker including
170 - versions of Lorem Ipsum.
171 - </p>
172 - <p>
173 - Lorem Ipsum is simply dummy text of the printing and typesetting industry.
174 - Lorem Ipsum has been the industry&apos;s standard dummy text ever since the 1500s,
175 - when an unknown printer took a galley of type and scrambled it to make a type
176 - specimen book. It has survived not only five centuries, but also the leap
177 - into electronic typesetting, remaining essentially unchanged. It was popularised
178 - in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages,
179 - and more recently with desktop publishing software like Aldus PageMaker including
180 - versions of Lorem Ipsum.
181 - </p>
182 - <p>
183 - Lorem Ipsum is simply dummy text of the printing and typesetting industry.
184 - Lorem Ipsum has been the industry&apos;s standard dummy text ever since the 1500s,
185 - when an unknown printer took a galley of type and scrambled it to make a type
186 - specimen book. It has survived not only five centuries, but also the leap
187 - into electronic typesetting, remaining essentially unchanged. It was popularised
188 - in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages,
189 - and more recently with desktop publishing software like Aldus PageMaker including
190 - versions of Lorem Ipsum.
191 - </p>
192 - <p>
193 - Lorem Ipsum is simply dummy text of the printing and typesetting industry.
194 - Lorem Ipsum has been the industry&apos;s standard dummy text ever since the 1500s,
195 - when an unknown printer took a galley of type and scrambled it to make a type
196 - specimen book. It has survived not only five centuries, but also the leap
197 - into electronic typesetting, remaining essentially unchanged. It was popularised
198 - in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages,
199 - and more recently with desktop publishing software like Aldus PageMaker including
200 - versions of Lorem Ipsum.
201 - </p>
202 - </ModalBody>
203 - <ModalFooter>
204 - <Button color="secondary" onClick={() => this.toggle('scrollingLong')}>Close</Button>
205 - <Button color="primary">Save changes</Button>
206 - </ModalFooter>
207 - </Modal>
208 -
209 - <Modal size="lg" isOpen={this.state.large} toggle={() => this.toggle('large')}>
210 - <ModalHeader toggle={() => this.toggle('large')}>Large modal</ModalHeader>
211 - <ModalBody className="bg-white">
212 - Lorem ipsum dolor sit amet consectetur adipisicing elit. In, illum harum?
213 - Quidem, quisquam, natus repellat debitis veniam quia facilis magni tempora
214 - cupiditate odio vitae? Eligendi nisi consequuntur vero tenetur nemo!
215 - </ModalBody>
216 - <ModalFooter>
217 - <Button color="secondary" onClick={() => this.toggle('large')}>Close</Button>
218 - <Button color="primary">Save changes</Button>
219 - </ModalFooter>
220 - </Modal>
221 - </Row>
222 - );
223 - }
224 -}
225 -
226 -export default Modals;
1 -import React, { Component } from 'react';
2 -import { Row, Col, Breadcrumb, BreadcrumbItem, TabContent, TabPane, Nav, NavItem, NavLink } from 'reactstrap';
3 -import SyntaxHighlighter from 'react-syntax-highlighter/dist/prism';
4 -import classnames from 'classnames';
5 -import { tomorrow } from 'react-syntax-highlighter/dist/styles/prism';
6 -
7 -class NavPage extends Component {
8 - state = {
9 - defaultNavTabId: '1',
10 - verticalNavTabId: '1',
11 - pillsNavTabId: '1',
12 - };
13 -
14 - changeTab(field, id) {
15 - this.setState({
16 - [field]: id,
17 - })
18 - }
19 -
20 - render() {
21 - return (
22 - <Row>
23 - <Col md={10}>
24 - <Breadcrumb>
25 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
26 - <BreadcrumbItem>Documentation</BreadcrumbItem>
27 - <BreadcrumbItem>Components</BreadcrumbItem>
28 - <BreadcrumbItem active>Nav</BreadcrumbItem>
29 - </Breadcrumb>
30 - </Col>
31 -
32 - <Col lg={9}>
33 - <h2>Nav</h2>
34 - <p className="mb-lg">Change the style of Nav component with modifiers and utilities. Mix and match as needed, or build your own.</p>
35 - <SyntaxHighlighter language='javascript' style={tomorrow}>
36 - {"import { Nav, NavItem, NavLink } from 'reactstrap';"}
37 - </SyntaxHighlighter>
38 - <Nav tabs className="bg-transparent mt">
39 - <NavItem>
40 - <NavLink
41 - className={classnames({ active: this.state.defaultNavTabId === '1' })}
42 - onClick={() => {
43 - this.changeTab('defaultNavTabId', '1');
44 - }}
45 - >
46 - Example
47 - </NavLink>
48 - </NavItem>
49 - <NavItem>
50 - <NavLink
51 - className={classnames({ active: this.state.defaultNavTabId === '2' })}
52 - onClick={() => {
53 - this.changeTab('defaultNavTabId', '2');
54 - }}
55 - >
56 - Code
57 - </NavLink>
58 - </NavItem>
59 - </Nav>
60 - <TabContent className="mb-xlg" activeTab={this.state.defaultNavTabId}>
61 - <TabPane tabId="1">
62 - <Nav>
63 - <NavItem>
64 - <NavLink href="#">Link</NavLink>
65 - </NavItem>
66 - <NavItem>
67 - <NavLink href="#">Link</NavLink>
68 - </NavItem>
69 - <NavItem>
70 - <NavLink href="#">Another Link</NavLink>
71 - </NavItem>
72 - <NavItem>
73 - <NavLink disabled href="#">Disabled Link</NavLink>
74 - </NavItem>
75 - </Nav>
76 - </TabPane>
77 - <TabPane tabId="2">
78 - <SyntaxHighlighter language='javascript' style={tomorrow}>{'<Nav>\n' +
79 - ' <NavItem>\n' +
80 - ' <NavLink href="#">Link</NavLink>\n' +
81 - ' </NavItem>\n' +
82 - ' <NavItem>\n' +
83 - ' <NavLink href="#">Link</NavLink>\n' +
84 - ' </NavItem>\n' +
85 - ' <NavItem>\n' +
86 - ' <NavLink href="#">Another Link</NavLink>\n' +
87 - ' </NavItem>\n' +
88 - ' <NavItem>\n' +
89 - ' <NavLink disabled href="#">Disabled Link</NavLink>\n' +
90 - ' </NavItem>\n' +
91 - '</Nav>'}</SyntaxHighlighter>
92 - </TabPane>
93 - </TabContent>
94 - <Nav tabs className="bg-transparent mt">
95 - <NavItem>
96 - <NavLink
97 - className={classnames({ active: this.state.verticalNavTabId === '1' })}
98 - onClick={() => {
99 - this.changeTab('verticalNavTabId', '1');
100 - }}
101 - >
102 - Example
103 - </NavLink>
104 - </NavItem>
105 - <NavItem>
106 - <NavLink
107 - className={classnames({ active: this.state.verticalNavTabId === '2' })}
108 - onClick={() => {
109 - this.changeTab('verticalNavTabId', '2');
110 - }}
111 - >
112 - Code
113 - </NavLink>
114 - </NavItem>
115 - </Nav>
116 - <TabContent className="mb-xlg" activeTab={this.state.verticalNavTabId}>
117 - <TabPane tabId="1">
118 - <Nav vertical>
119 - <NavItem>
120 - <NavLink href="#">Link</NavLink>
121 - </NavItem>
122 - <NavItem>
123 - <NavLink href="#">Link</NavLink>
124 - </NavItem>
125 - <NavItem>
126 - <NavLink href="#">Another Link</NavLink>
127 - </NavItem>
128 - <NavItem>
129 - <NavLink disabled href="#">Disabled Link</NavLink>
130 - </NavItem>
131 - </Nav>
132 - </TabPane>
133 - <TabPane tabId="2">
134 - <SyntaxHighlighter language='javascript' style={tomorrow}>{'<Nav vertical>\n' +
135 - ' <NavItem>\n' +
136 - ' <NavLink href="#">Link</NavLink>\n' +
137 - ' </NavItem>\n' +
138 - ' <NavItem>\n' +
139 - ' <NavLink href="#">Link</NavLink>\n' +
140 - ' </NavItem>\n' +
141 - ' <NavItem>\n' +
142 - ' <NavLink href="#">Another Link</NavLink>\n' +
143 - ' </NavItem>\n' +
144 - ' <NavItem>\n' +
145 - ' <NavLink disabled href="#">Disabled Link</NavLink>\n' +
146 - ' </NavItem>\n' +
147 - '</Nav>'}</SyntaxHighlighter>
148 - </TabPane>
149 - </TabContent>
150 - <Nav tabs className="bg-transparent mt">
151 - <NavItem>
152 - <NavLink
153 - className={classnames({ active: this.state.pillsNavTabId === '1' })}
154 - onClick={() => {
155 - this.changeTab('pillsNavTabId', '1');
156 - }}
157 - >
158 - Example
159 - </NavLink>
160 - </NavItem>
161 - <NavItem>
162 - <NavLink
163 - className={classnames({ active: this.state.pillsNavTabId === '2' })}
164 - onClick={() => {
165 - this.changeTab('pillsNavTabId', '2');
166 - }}
167 - >
168 - Code
169 - </NavLink>
170 - </NavItem>
171 - </Nav>
172 - <TabContent className="mb-xlg" activeTab={this.state.pillsNavTabId}>
173 - <TabPane tabId="1">
174 - <Nav pills>
175 - <NavItem>
176 - <NavLink href="#" active>Link</NavLink>
177 - </NavItem>
178 - <NavItem>
179 - <NavLink href="#">Link</NavLink>
180 - </NavItem>
181 - <NavItem>
182 - <NavLink href="#">Another Link</NavLink>
183 - </NavItem>
184 - <NavItem>
185 - <NavLink disabled href="#">Disabled Link</NavLink>
186 - </NavItem>
187 - </Nav>
188 - </TabPane>
189 - <TabPane tabId="2">
190 - <SyntaxHighlighter language='javascript' style={tomorrow}>{'<Nav>\n' +
191 - ' <NavItem pills>\n' +
192 - ' <NavLink href="#" active>Link</NavLink>\n' +
193 - ' </NavItem>\n' +
194 - ' <NavItem>\n' +
195 - ' <NavLink href="#">Link</NavLink>\n' +
196 - ' </NavItem>\n' +
197 - ' <NavItem>\n' +
198 - ' <NavLink href="#">Another Link</NavLink>\n' +
199 - ' </NavItem>\n' +
200 - ' <NavItem>\n' +
201 - ' <NavLink disabled href="#">Disabled Link</NavLink>\n' +
202 - ' </NavItem>\n' +
203 - '</Nav>'}</SyntaxHighlighter>
204 - </TabPane>
205 - </TabContent>
206 - For more examples please refer to <a href="https://reactstrap.github.io/components/card/" target="_blank" rel="noopener noreferrer">Reactstrap Card</a>
207 - </Col>
208 - </Row>
209 - );
210 - }
211 -}
212 -
213 -export default NavPage;
1 -import React, { Component } from 'react';
2 -import {
3 - Row,
4 - Col,
5 - Breadcrumb,
6 - BreadcrumbItem,
7 - TabContent,
8 - TabPane,
9 - Nav,
10 - NavItem,
11 - NavLink,
12 - Navbar,
13 - NavbarBrand,
14 - NavbarToggler,
15 - Collapse,
16 - UncontrolledDropdown,
17 - DropdownToggle,
18 - DropdownMenu,
19 - DropdownItem
20 -} from 'reactstrap';
21 -import SyntaxHighlighter from 'react-syntax-highlighter/dist/prism';
22 -import classnames from 'classnames';
23 -import { tomorrow } from 'react-syntax-highlighter/dist/styles/prism';
24 -
25 -class NavbarPage extends Component {
26 - state = {
27 - defaultNavTabId: '1',
28 - verticalNavTabId: '1',
29 - pillsNavTabId: '1',
30 - };
31 -
32 - changeTab(field, id) {
33 - this.setState({
34 - [field]: id,
35 - })
36 - }
37 -
38 - render() {
39 - return (
40 - <Row>
41 - <Col md={10}>
42 - <Breadcrumb>
43 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
44 - <BreadcrumbItem>Documentation</BreadcrumbItem>
45 - <BreadcrumbItem>Components</BreadcrumbItem>
46 - <BreadcrumbItem active>Navbar</BreadcrumbItem>
47 - </Breadcrumb>
48 - </Col>
49 -
50 - <Col lg={9}>
51 - <h2>Navbar</h2>
52 - <p className="mb-lg">Documentation and examples for Bootstraps powerful, responsive navigation header, the navbar.
53 - Includes support for branding, navigation, and more, including support for our collapse plugin.</p>
54 - <SyntaxHighlighter language='javascript' style={tomorrow}>
55 - {"import {\n" +
56 - " Nav,\n" +
57 - " NavItem,\n" +
58 - " NavLink,\n" +
59 - " Navbar,\n" +
60 - " NavbarBrand,\n" +
61 - " NavbarToggler,\n" +
62 - " Collapse,\n" +
63 - " UncontrolledDropdown,\n" +
64 - " DropdownToggle,\n" +
65 - " DropdownMenu,\n" +
66 - " DropdownItem\n" +
67 - "} from 'reactstrap';"}
68 - </SyntaxHighlighter>
69 - <Nav tabs className="bg-transparent mt">
70 - <NavItem>
71 - <NavLink
72 - className={classnames({ active: this.state.defaultNavTabId === '1' })}
73 - onClick={() => {
74 - this.changeTab('defaultNavTabId', '1');
75 - }}
76 - >
77 - Example
78 - </NavLink>
79 - </NavItem>
80 - <NavItem>
81 - <NavLink
82 - className={classnames({ active: this.state.defaultNavTabId === '2' })}
83 - onClick={() => {
84 - this.changeTab('defaultNavTabId', '2');
85 - }}
86 - >
87 - Code
88 - </NavLink>
89 - </NavItem>
90 - </Nav>
91 - <TabContent className="mb-xlg" activeTab={this.state.defaultNavTabId}>
92 - <TabPane tabId="1">
93 - <Navbar color="light" light expand="md">
94 - <NavbarBrand href="/">Sing</NavbarBrand>
95 - <NavbarToggler />
96 - <Collapse navbar>
97 - <Nav className="ml-auto" navbar>
98 - <NavItem>
99 - <NavLink href="#">Components</NavLink>
100 - </NavItem>
101 - <NavItem>
102 - <NavLink href="#">Documentation</NavLink>
103 - </NavItem>
104 - <UncontrolledDropdown nav inNavbar>
105 - <DropdownToggle nav caret>
106 - Options
107 - </DropdownToggle>
108 - <DropdownMenu right>
109 - <DropdownItem>
110 - Option 1
111 - </DropdownItem>
112 - <DropdownItem>
113 - Option 2
114 - </DropdownItem>
115 - <DropdownItem divider />
116 - <DropdownItem>
117 - Reset
118 - </DropdownItem>
119 - </DropdownMenu>
120 - </UncontrolledDropdown>
121 - </Nav>
122 - </Collapse>
123 - </Navbar>
124 - </TabPane>
125 - <TabPane tabId="2">
126 - <SyntaxHighlighter language='javascript' style={tomorrow}>{'<Navbar color="light" light expand="md">\n' +
127 - ' <NavbarBrand href="/">Sing</NavbarBrand>\n' +
128 - ' <NavbarToggler />\n' +
129 - ' <Collapse navbar>\n' +
130 - ' <Nav className="ml-auto" navbar>\n' +
131 - ' <NavItem>\n' +
132 - ' <NavLink href="#">Components</NavLink>\n' +
133 - ' </NavItem>\n' +
134 - ' <NavItem>\n' +
135 - ' <NavLink href="#">Documentation</NavLink>\n' +
136 - ' </NavItem>\n' +
137 - ' <UncontrolledDropdown nav inNavbar>\n' +
138 - ' <DropdownToggle nav caret>\n' +
139 - ' Options\n' +
140 - ' </DropdownToggle>\n' +
141 - ' <DropdownMenu right>\n' +
142 - ' <DropdownItem>\n' +
143 - ' Option 1\n' +
144 - ' </DropdownItem>\n' +
145 - ' <DropdownItem>\n' +
146 - ' Option 2\n' +
147 - ' </DropdownItem>\n' +
148 - ' <DropdownItem divider />\n' +
149 - ' <DropdownItem>\n' +
150 - ' Reset\n' +
151 - ' </DropdownItem>\n' +
152 - ' </DropdownMenu>\n' +
153 - ' </UncontrolledDropdown>\n' +
154 - ' </Nav>\n' +
155 - ' </Collapse>\n' +
156 - '</Navbar>'}</SyntaxHighlighter>
157 - </TabPane>
158 - </TabContent>
159 - For more examples please refer to <a href="https://reactstrap.github.io/components/card/" target="_blank" rel="noopener noreferrer">Reactstrap Card</a>
160 - </Col>
161 - </Row>
162 - );
163 - }
164 -}
165 -
166 -export default NavbarPage;
1 -import React, { Component } from 'react';
2 -import {
3 - Row,
4 - Col,
5 - Breadcrumb,
6 - BreadcrumbItem,
7 - TabContent,
8 - TabPane,
9 - Nav,
10 - NavItem,
11 - NavLink,
12 - Button,
13 - Popover,
14 - PopoverHeader,
15 - PopoverBody,
16 - UncontrolledTooltip,
17 -} from 'reactstrap';
18 -import SyntaxHighlighter from 'react-syntax-highlighter/dist/prism';
19 -import classnames from 'classnames';
20 -import { tomorrow } from 'react-syntax-highlighter/dist/styles/prism';
21 -
22 -class NavbarPage extends Component {
23 - state = {
24 - defaultPopoversTabId: '1',
25 - defaultTooltipsTabId: '1',
26 - popovers: {
27 - 1: false,
28 - 2: false,
29 - 3: false,
30 - 4: false,
31 - }
32 - };
33 -
34 - changeTab(field, id) {
35 - this.setState({
36 - [field]: id,
37 - })
38 - }
39 -
40 - toggle(id) {
41 - this.setState(prevState => ({
42 - popovers: {
43 - ...prevState.popovers,
44 - [id]: !prevState.popovers[id],
45 - },
46 - }))
47 - }
48 -
49 - render() {
50 - return (
51 - <Row>
52 - <Col md={10}>
53 - <Breadcrumb>
54 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
55 - <BreadcrumbItem>Documentation</BreadcrumbItem>
56 - <BreadcrumbItem>Components</BreadcrumbItem>
57 - <BreadcrumbItem active>Popovers & Tooltips</BreadcrumbItem>
58 - </Breadcrumb>
59 - </Col>
60 -
61 - <Col lg={9}>
62 - <h2>Popovers</h2>
63 - <p className="mb-lg">The Popover is similar to Tooltip; it is a pop-up box that appears when the user clicks on an element. The difference is that the popover can contain much more content.</p>
64 - <SyntaxHighlighter language='javascript' style={tomorrow}>
65 - {"import { Popover, PopoverHeader, PopoverBody, UncontrolledTooltip } from 'reactstrap';"}
66 - </SyntaxHighlighter>
67 - <Nav tabs className="bg-transparent mt">
68 - <NavItem>
69 - <NavLink
70 - className={classnames({ active: this.state.defaultPopoversTabId === '1' })}
71 - onClick={() => {
72 - this.changeTab('defaultPopoversTabId', '1');
73 - }}
74 - >
75 - Example
76 - </NavLink>
77 - </NavItem>
78 - <NavItem>
79 - <NavLink
80 - className={classnames({ active: this.state.defaultPopoversTabId === '2' })}
81 - onClick={() => {
82 - this.changeTab('defaultPopoversTabId', '2');
83 - }}
84 - >
85 - Code
86 - </NavLink>
87 - </NavItem>
88 - </Nav>
89 - <TabContent className="mb-xlg" activeTab={this.state.defaultPopoversTabId}>
90 - <TabPane tabId="1">
91 - <Button className="mr" id="popover-1" type="button" color="success" onClick={() => this.toggle(1)}>
92 - Bottom
93 - </Button>
94 - <Button className="mr" id="popover-2" type="button" color="danger" onClick={() => this.toggle(2)}>
95 - Right
96 - </Button>
97 - <Button className="mr" id="popover-3" type="button" color="warning" onClick={() => this.toggle(3)}>
98 - Top
99 - </Button>
100 - <Button className="mr" id="popover-4" type="button" color="info" onClick={() => this.toggle(4)}>
101 - Left
102 - </Button>
103 - <Popover placement="bottom" isOpen={this.state.popovers[1]} target="popover-1" toggle={() => this.toggle(1)}>
104 - <PopoverHeader>Popover Title</PopoverHeader>
105 - <PopoverBody>Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.</PopoverBody>
106 - </Popover>
107 - <Popover placement="right" isOpen={this.state.popovers[2]} target="popover-2" toggle={() => this.toggle(2)}>
108 - <PopoverHeader>Popover Title</PopoverHeader>
109 - <PopoverBody>Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.</PopoverBody>
110 - </Popover>
111 - <Popover placement="top" isOpen={this.state.popovers[3]} target="popover-3" toggle={() => this.toggle(3)}>
112 - <PopoverHeader>Popover Title</PopoverHeader>
113 - <PopoverBody>Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.</PopoverBody>
114 - </Popover>
115 - <Popover placement="left" isOpen={this.state.popovers[4]} target="popover-4" toggle={() => this.toggle(4)}>
116 - <PopoverHeader>Popover Title</PopoverHeader>
117 - <PopoverBody>Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.</PopoverBody>
118 - </Popover>
119 - </TabPane>
120 - <TabPane tabId="2">
121 - <SyntaxHighlighter language='javascript' style={tomorrow}>{'<Button id="popover" type="button" color="info" onClick={this.toggle}>\n' +
122 - ' Top\n' +
123 - '</Button>\n\n' +
124 - '<Popover placement="top" isOpen={this.state.isPopoverActive} target="popover" toggle={this.toggle}>\n' +
125 - ' <PopoverHeader>Popover Title</PopoverHeader>\n' +
126 - ' <PopoverBody>Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.</PopoverBody>\n' +
127 - '</Popover>'}</SyntaxHighlighter>
128 - </TabPane>
129 - </TabContent>
130 - <h2>Tooltips</h2>
131 - <Nav tabs className="bg-transparent mt">
132 - <NavItem>
133 - <NavLink
134 - className={classnames({ active: this.state.defaultTooltipsTabId === '1' })}
135 - onClick={() => {
136 - this.changeTab('defaultTooltipsTabId', '1');
137 - }}
138 - >
139 - Example
140 - </NavLink>
141 - </NavItem>
142 - <NavItem>
143 - <NavLink
144 - className={classnames({ active: this.state.defaultTooltipsTabId === '2' })}
145 - onClick={() => {
146 - this.changeTab('defaultTooltipsTabId', '2');
147 - }}
148 - >
149 - Code
150 - </NavLink>
151 - </NavItem>
152 - </Nav>
153 - <TabContent className="mb-xlg" activeTab={this.state.defaultTooltipsTabId}>
154 - <TabPane tabId="1">
155 - <Button className="mr" id="tooltip-1" type="button" color="success">
156 - Bottom
157 - </Button>
158 - <Button className="mr" id="tooltip-2" type="button" color="danger">
159 - Right
160 - </Button>
161 - <Button className="mr" id="tooltip-3" type="button" color="warning">
162 - Top
163 - </Button>
164 - <Button className="mr" id="tooltip-4" type="button" color="info">
165 - Left
166 - </Button>
167 - <UncontrolledTooltip placement="bottom" target="tooltip-1">
168 - Hello world!
169 - </UncontrolledTooltip>
170 - <UncontrolledTooltip placement="right" target="tooltip-2">
171 - Hello world!
172 - </UncontrolledTooltip>
173 - <UncontrolledTooltip placement="top" target="tooltip-3">
174 - Hello world!
175 - </UncontrolledTooltip>
176 - <UncontrolledTooltip placement="left" target="tooltip-4">
177 - Hello world!
178 - </UncontrolledTooltip>
179 - </TabPane>
180 - <TabPane tabId="2">
181 - <SyntaxHighlighter language='javascript' style={tomorrow}>{'<Button className="mr" id="tooltip" type="button" color="info">\n' +
182 - ' Left\n' +
183 - '</Button>\n\n' +
184 - '<UncontrolledTooltip placement="left" target="tooltip">\n' +
185 - ' Hello world!\n' +
186 - '</UncontrolledTooltip>'}</SyntaxHighlighter>
187 - </TabPane>
188 - </TabContent>
189 - For more examples please refer to <a href="https://reactstrap.github.io/components/popovers/" target="_blank" rel="noopener noreferrer">Reactstrap Popovers</a>
190 - &nbsp;and <a href="https://reactstrap.github.io/components/tooltips/" target="_blank" rel="noopener noreferrer">Reactstrap Tooltips</a>
191 - </Col>
192 - </Row>
193 - );
194 - }
195 -}
196 -
197 -export default NavbarPage;
1 -import React, { Component } from 'react';
2 -import { Row, Col, Breadcrumb, BreadcrumbItem, Progress, TabContent, TabPane, Nav, NavItem, NavLink } from 'reactstrap';
3 -import SyntaxHighlighter from 'react-syntax-highlighter/dist/prism';
4 -import classnames from 'classnames';
5 -import { tomorrow } from 'react-syntax-highlighter/dist/styles/prism';
6 -
7 -class Buttons extends Component {
8 - state = {
9 - defaultProgressTabId: '1',
10 - };
11 -
12 - changeTab(field, id) {
13 - this.setState({
14 - [field]: id,
15 - })
16 - }
17 -
18 - render() {
19 - return (
20 - <Row>
21 - <Col md={10}>
22 - <Breadcrumb>
23 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
24 - <BreadcrumbItem>Documentation</BreadcrumbItem>
25 - <BreadcrumbItem>Components</BreadcrumbItem>
26 - <BreadcrumbItem active>Progress</BreadcrumbItem>
27 - </Breadcrumb>
28 - </Col>
29 -
30 - <Col lg={9}>
31 - <h2>Progress</h2>
32 - <p className="mb-lg">Cards support a wide variety of content, including images, text, list groups, links, and more. Below are examples of whats supported.</p>
33 - <SyntaxHighlighter language='javascript' style={tomorrow}>
34 - {"import { Progress } from 'reactstrap';"}
35 - </SyntaxHighlighter>
36 - <Nav tabs className="bg-transparent mt">
37 - <NavItem>
38 - <NavLink
39 - className={classnames({ active: this.state.defaultProgressTabId === '1' })}
40 - onClick={() => {
41 - this.changeTab('defaultProgressTabId', '1');
42 - }}
43 - >
44 - Example
45 - </NavLink>
46 - </NavItem>
47 - <NavItem>
48 - <NavLink
49 - className={classnames({ active: this.state.defaultProgressTabId === '2' })}
50 - onClick={() => {
51 - this.changeTab('defaultProgressTabId', '2');
52 - }}
53 - >
54 - Code
55 - </NavLink>
56 - </NavItem>
57 - </Nav>
58 - <TabContent className="mb-xlg" activeTab={this.state.defaultProgressTabId}>
59 - <TabPane tabId="1">
60 - <div className="text-center">0%</div>
61 - <Progress />
62 - <div className="text-center">25%</div>
63 - <Progress value="25" />
64 - <div className="text-center">50%</div>
65 - <Progress value={50} />
66 - <div className="text-center">75%</div>
67 - <Progress striped value={75} />
68 - <div className="text-center">100%</div>
69 - <Progress animated value="100" />
70 - <div className="text-center">Multiple bars</div>
71 - <Progress multi>
72 - <Progress bar value="15" />
73 - <Progress bar color="success" value="30" />
74 - <Progress bar color="info" value="25" />
75 - <Progress bar color="warning" value="20" />
76 - <Progress bar color="danger" value="5" />
77 - </Progress>
78 - </TabPane>
79 - <TabPane tabId="2">
80 - <SyntaxHighlighter language='javascript' style={tomorrow}>{'<div className="text-center">0%</div>\n' +
81 - '<Progress />\n' +
82 - '<div className="text-center">25%</div>\n' +
83 - '<Progress value="25" />\n' +
84 - '<div className="text-center">50%</div>\n' +
85 - '<Progress value={50} />\n' +
86 - '<div className="text-center">75%</div>\n' +
87 - '<Progress striped value={75} />\n' +
88 - '<div className="text-center">100%</div>\n' +
89 - '<Progress animated value="100" />\n' +
90 - '<div className="text-center">Multiple bars</div>\n' +
91 - '<Progress multi>\n' +
92 - ' <Progress bar value="15" />\n' +
93 - ' <Progress bar color="success" value="30" />\n' +
94 - ' <Progress bar color="info" value="25" />\n' +
95 - ' <Progress bar color="warning" value="20" />\n' +
96 - ' <Progress bar color="danger" value="5" />\n' +
97 - '</Progress>'}</SyntaxHighlighter>
98 - </TabPane>
99 - </TabContent>
100 - For more examples please refer to <a href="https://reactstrap.github.io/components/progress/" target="_blank" rel="noopener noreferrer">Reactstrap Progress</a>
101 - </Col>
102 - </Row>
103 - );
104 - }
105 -}
106 -
107 -export default Buttons;
1 -import React, { Component } from 'react';
2 -import { Row, Col, Breadcrumb, BreadcrumbItem, Collapse, TabContent, TabPane, Nav, NavItem, NavLink } from 'reactstrap';
3 -import SyntaxHighlighter from 'react-syntax-highlighter/dist/prism';
4 -import classnames from 'classnames';
5 -import { tomorrow } from 'react-syntax-highlighter/dist/styles/prism';
6 -
7 -class Buttons extends Component {
8 - state = {
9 - defaultTabsTabId: '1',
10 - accordion: [false, false, false],
11 - };
12 -
13 - changeTab(field, id) {
14 - this.setState({
15 - [field]: id,
16 - })
17 - }
18 -
19 - toggleAccordion(id) {
20 - const arr = [];
21 - arr.length = this.state.accordion.length;
22 - arr.fill(false);
23 - arr[id] = !this.state.accordion[id];
24 - this.setState({
25 - accordion: arr,
26 - });
27 - }
28 -
29 - render() {
30 - return (
31 - <Row>
32 - <Col md={10}>
33 - <Breadcrumb>
34 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
35 - <BreadcrumbItem>Documentation</BreadcrumbItem>
36 - <BreadcrumbItem>Components</BreadcrumbItem>
37 - <BreadcrumbItem active>Tabs & Accordion</BreadcrumbItem>
38 - </Breadcrumb>
39 - </Col>
40 -
41 - <Col lg={9}>
42 - <h2>Tabs</h2>
43 - <p className="mb-lg">Activates a tab element and content container.</p>
44 - <SyntaxHighlighter language='javascript' style={tomorrow}>
45 - {"import { TabContent, TabPane } from 'reactstrap';"}
46 - </SyntaxHighlighter>
47 - <h4 className="mt-lg">Example</h4>
48 - <Nav tabs className="bg-transparent mt">
49 - <NavItem>
50 - <NavLink
51 - className={classnames({ active: this.state.defaultTabsTabId === '1' })}
52 - onClick={() => {
53 - this.changeTab('defaultTabsTabId', '1');
54 - }}
55 - >
56 - Tab 1
57 - </NavLink>
58 - </NavItem>
59 - <NavItem>
60 - <NavLink
61 - className={classnames({ active: this.state.defaultTabsTabId === '2' })}
62 - onClick={() => {
63 - this.changeTab('defaultTabsTabId', '2');
64 - }}
65 - >
66 - Tab 2
67 - </NavLink>
68 - </NavItem>
69 - </Nav>
70 - <TabContent className="mb-xlg" activeTab={this.state.defaultTabsTabId}>
71 - <TabPane tabId="1">
72 - First tab content
73 - </TabPane>
74 - <TabPane tabId="2">
75 - Second tab content
76 - </TabPane>
77 - </TabContent>
78 - <h4>Code</h4>
79 - <SyntaxHighlighter language='javascript' style={tomorrow}>{'<TabContent className="mb-xlg" activeTab={this.state.activeTabId}>\n' +
80 - ' <TabPane tabId="1">\n' +
81 - ' First tab content\n' +
82 - ' </TabPane>\n' +
83 - ' <TabPane tabId="2">\n' +
84 - ' Second tab content\n' +
85 - ' </TabPane>\n' +
86 - '</TabContent>'}</SyntaxHighlighter>
87 - For more examples please refer to <a href="https://reactstrap.github.io/components/tabs/"
88 - rel="noopener noreferrer" target="_blank">Reactstrap Tabs</a>
89 - <h2 className="mt-lg">Accordion</h2>
90 - <p className="mb-lg">Activates a tab element and content container.</p>
91 - <SyntaxHighlighter language='javascript' style={tomorrow}>
92 - {"import { Collapse } from 'reactstrap';"}
93 - </SyntaxHighlighter>
94 - <h4 className="mt-lg">Example</h4>
95 - <div className="card panel mt-lg mb-xs">
96 - { /* eslint-disable */ }
97 - <div
98 - className="card-header panel-header bg-light" role="button"
99 - onClick={() => { this.toggleAccordion(0); }}
100 - >
101 - { /* eslint-enable */ }
102 - <div className="mb-0">
103 - {/* eslint-disable-next-line */}
104 - <a className="accordion-toggle" role="button">
105 - Collapsible Group Item
106 - <i className={`fa fa-angle-down ${this.state.accordion[0] ? 'expanded' : ''}`} />
107 - </a>
108 - </div>
109 - </div>
110 - <Collapse className="panel-body" isOpen={this.state.accordion[0]}>
111 - <p>Get base styles and flexible support for collapsible components like accordions and navigation.
112 - Using the collapse plugin, we built a simple accordion by extending the panel component.
113 - </p>
114 - </Collapse>
115 - </div>
116 - <div className="card panel mb-xs">
117 - { /* eslint-disable */ }
118 - <div
119 - className="card-header panel-header bg-light" role="button"
120 - onClick={() => { this.toggleAccordion(1); }}
121 - >
122 - { /* eslint-enable */ }
123 - <div className="mb-0">
124 - {/* eslint-disable-next-line */}
125 - <a className="accordion-toggle" role="button">
126 - Normal Text Insertion
127 - <i className={`fa fa-angle-down ${this.state.accordion[1] ? 'expanded' : ''}`} />
128 - </a>
129 - </div>
130 - </div>
131 - <Collapse className="panel-body" isOpen={this.state.accordion[1]}>
132 - <p>Why don't use Lore Ipsum? I think if some one says don't use lore ipsum it's very controversial point. I think the opposite actually.
133 - </p>
134 - </Collapse>
135 - </div>
136 - <div className="card panel mb-lg">
137 - { /* eslint-disable */ }
138 - <div
139 - className="card-header panel-header bg-light" role="button"
140 - onClick={() => { this.toggleAccordion(2); }}
141 - >
142 - { /* eslint-enable */ }
143 - <div className="mb-0">
144 - {/* eslint-disable-next-line */}
145 - <a className="accordion-toggle" role="button">
146 - Random from the Web
147 - <i className={`fa fa-angle-down ${this.state.accordion[2] ? 'expanded' : ''}`} />
148 - </a>
149 - </div>
150 - </div>
151 - <Collapse className="panel-body" isOpen={this.state.accordion[2]}>
152 - <p><span className="fw-semi-bold">Light Blue</span> - is a next generation admin template based
153 - on the latest Metro design. There are few reasons we want to tell you, why we have created it:
154 - We didn't like the darkness of most of admin templates, so we created this light one.
155 - We didn't like the high contrast of most of admin templates, so we created this unobtrusive one.
156 - We searched for a solution of how to make widgets look like real widgets, so we decided that
157 - deep background - is what makes widgets look real.
158 - </p>
159 - <p className="no-margin text-muted"><em>- Some One</em></p>
160 - </Collapse>
161 - </div>
162 - <h4>Code</h4>
163 - <SyntaxHighlighter language='javascript' style={tomorrow}>{'<div className="card panel mb-xs">\n' +
164 - ' <div\n' +
165 - ' className="card-header panel-header bg-light" role="button"\n' +
166 - ' onClick={this.toggleAccordion}\n' +
167 - ' >\n' +
168 - ' <div className="mb-0">\n' +
169 - ' <a className="accordion-toggle" role="button">\n' +
170 - ' Normal Text Insertion\n' +
171 - ' <i className={["fa fa-angle-down", this.state.isAccordionOpened ? "expanded" : ""].join(" ")} />\n' +
172 - ' </a>\n' +
173 - ' </div>\n' +
174 - ' </div>\n' +
175 - ' <Collapse className="panel-body" isOpen={this.state.isAccordionOpened}>\n' +
176 - ' <p>Why don\'t use Lore Ipsum? I think if some one says don\'t use lore ipsum it\'s very controversial point. I think the opposite actually.\n' +
177 - ' </p>\n' +
178 - ' </Collapse>\n' +
179 - '</div>'}</SyntaxHighlighter>
180 - For more examples please refer to <a href="https://reactstrap.github.io/components/collapse/" target="_blank" rel="noopener noreferrer">Reactstrap Collapse</a>
181 - </Col>
182 - </Row>
183 - );
184 - }
185 -}
186 -
187 -export default Buttons;
1 -import React from 'react';
2 -import { Row, Col, Breadcrumb, BreadcrumbItem, Table } from 'reactstrap';
3 -
4 -import Widget from '../../../components/Widget/Widget';
5 -import Scrollspy from "../ScrollSpyComponent";
6 -
7 -const Licences = () => (
8 - <Row>
9 - <Col md={10}>
10 - <Breadcrumb>
11 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
12 - <BreadcrumbItem>Documentation</BreadcrumbItem>
13 - <BreadcrumbItem>Getting Started</BreadcrumbItem>
14 - <BreadcrumbItem active>Licences</BreadcrumbItem>
15 - </Breadcrumb>
16 - </Col>
17 - <Col lg={9}>
18 - <Widget id="Licences">
19 - <h2>Licences</h2>
20 - <p className="lead">
21 - A license grants you a non-exclusive and non-transferable right to use
22 - and incorporate the item in your personal or commercial projects.
23 - If your end product including an item is going to be free to the end user then
24 - a Single License is what you need. An Extended License is required if the
25 - end user must pay to use the end product.
26 - </p>
27 - <Table>
28 - <thead>
29 - <tr>
30 - <th></th>
31 - <th>Single</th>
32 - <th>Extended</th>
33 - </tr>
34 - </thead>
35 - <tbody>
36 - <tr>
37 - <td>Hundreds unique components</td>
38 - <td className="text-success fw-bold">+</td>
39 - <td className="text-success fw-bold">+</td>
40 - </tr>
41 - <tr>
42 - <td>All pages</td>
43 - <td className="text-success fw-bold">+</td>
44 - <td className="text-success fw-bold">+</td>
45 - </tr>
46 - <tr>
47 - <td>Free Updates</td>
48 - <td>3 months</td>
49 - <td>6 months</td>
50 - </tr>
51 - <tr>
52 - <td>Paying users allowed</td>
53 - <td className="text-danger fw-bold">-</td>
54 - <td className="text-success fw-bold">+</td>
55 - </tr>
56 - </tbody>
57 - </Table>
58 - </Widget>
59 - <Widget id="Single">
60 - <h3>Single Application License</h3>
61 - <p className="lead">
62 - Your use of the item is restricted to a single application. You may use the item
63 - in work which you are creating for your own purposes or for your client. You must
64 - not incorporate the item in a work which is created for redistribution or resale
65 - by you or your client. The item may not be redistributed or resold. You may not
66 - charge users for using your application.
67 - </p>
68 - </Widget>
69 - <Widget id="Extended">
70 - <h3>Extended Application License</h3>
71 - <p className="lead">
72 - Your use of the item is restricted to a single application.
73 - You may use the item in work which you are creating for your own
74 - purposes or for your clients. You are licensed to use the Item to create one single
75 - End Product for yourself or for one client (a single application), and the
76 - End Product may be Sold and users may be charged for using it (e.g. you are building
77 - SAAS application).
78 - </p>
79 - </Widget>
80 - <p class="mt">
81 - In case if you need any clarifications considering licenses feel free
82 - to contact us via email: <a class="text-warning" href="mailto:support@flatlogic.com">support@flatlogic.com</a>.
83 - </p>
84 - </Col>
85 - <Col lg={3}>
86 - <Scrollspy
87 - title="LICENCES"
88 - prefix="getting-started/licences"
89 - ids={[
90 - 'Licences',
91 - 'Single',
92 - 'Extended',
93 - ]} />
94 - </Col>
95 - </Row>
96 -);
97 -
98 -export default Licences;
1 -import React from 'react';
2 -import { Row, Col, Breadcrumb, BreadcrumbItem } from 'reactstrap';
3 -import { Link } from 'react-router-dom';
4 -
5 -import dashboard from '../../../images/documentation/sing-screenshot.jpg';
6 -import Widget from "../../../components/Widget/Widget";
7 -import Scrollspy from "../ScrollSpyComponent";
8 -
9 -const Overview = () => (
10 - <Row>
11 - <Col md={10}>
12 - <Breadcrumb>
13 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
14 - <BreadcrumbItem>Documentation</BreadcrumbItem>
15 - <BreadcrumbItem>Getting Started</BreadcrumbItem>
16 - <BreadcrumbItem active>Overview</BreadcrumbItem>
17 - </Breadcrumb>
18 - </Col>
19 - <Col lg={9}>
20 - <Widget id="Overview">
21 - <h1>Overview</h1>
22 - <p className="lead">
23 - Sing App React is an admin dashboard template built with React 16.5.2. Sing App goes beyond usual admin
24 - templates and provides you entire intuitive programming framework. Server Side Rendering and Node.js backend
25 - will even further speed up your development. You can use Sing App React to build any type of web applications
26 - like SAAS, CMS, financial dashboards, project management tools, etc.
27 - </p>
28 - <p className="lead">
29 - Moreover, there is a version of <a rel="noreferrer noopener" href="https://flatlogic.com/admin-dashboards/sing-app-react-nodejs" target="_blank">Sing App React with Node.js</a>, enhanced with working node.js
30 - backend with authentication, login strategies and basic CRUD functions. Please refer to <a
31 - href="https://github.com/flatlogic/nodejs-backend" rel="noopener noreferrer" target="_blank">backend documentation</a> for details
32 - </p>
33 - <img className="img-responsive w-100 border" src={dashboard} alt="screenshot" />
34 - <Link to="/app">Live demo</Link>
35 - </Widget>
36 - <Widget id="Features">
37 - <h3 className="">Features</h3>
38 - <ul className="mt">
39 - <li className="lead"><i className="la la-check" /> Hundreds of Pages</li>
40 - <li className="lead"><i className="la la-check" /> Fully Responsive</li>
41 - <li className="lead"><i className="la la-check" /> React 16 new</li>
42 - <li className="lead"><i className="la la-check" /> 8 Charts Library</li>
43 - <li className="lead"><i className="la la-check" /> 2 Dashboards</li>
44 - <li className="lead"><i className="la la-check" /> Theme Support</li>
45 - <li className="lead"><i className="la la-check" /> E-Commerce Section</li>
46 - <li className="lead"><i className="la la-check" />
47 - <a href="https://github.com/flatlogic/nodejs-backend" rel="noopener noreferrer" target="_blank"> Node.js backend support</a> <span className="small text-muted">(Only in full stack version)</span>
48 - </li>
49 - <li className="lead"><i className="la la-check" /> Static & Hover Sidebar</li>
50 - <li className="lead"><i className="la la-check" /> Fully Documented Codebase</li>
51 - <li className="lead"><i className="la la-check" /> And even more coming soon!</li>
52 - </ul>
53 - </Widget>
54 - <Row>
55 - <Col md={5}>
56 - <Widget title="Continue with">
57 - <Link to="/documentation/getting-started/licences">
58 - <h4>Licences <i className="la la-arrow-right"/></h4>
59 - </Link>
60 - </Widget>
61 - </Col>
62 - <Col md={5}>
63 - <Widget title="Or learn about">
64 - <Link to="/documentation/getting-started/quick-start">
65 - <h4>How to start project <i className="la la-arrow-right"/></h4>
66 - </Link>
67 - </Widget>
68 - </Col>
69 - </Row>
70 - </Col>
71 - <Col lg={3}>
72 - <Scrollspy
73 - title="OVERVIEW"
74 - prefix="getting-started/overview"
75 - ids={[
76 - 'Overview',
77 - 'Features'
78 - ]}
79 - />
80 - </Col>
81 - </Row>
82 -);
83 -
84 -export default Overview;
1 -import React from 'react';
2 -import { Row, Col, Breadcrumb, BreadcrumbItem } from 'reactstrap';
3 -
4 -import Widget from "../../../components/Widget/Widget";
5 -
6 -const QuickStart = () => (
7 - <Row>
8 - <Col md={10}>
9 - <Breadcrumb>
10 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
11 - <BreadcrumbItem>Documentation</BreadcrumbItem>
12 - <BreadcrumbItem>Getting Started</BreadcrumbItem>
13 - <BreadcrumbItem active>Quick Start</BreadcrumbItem>
14 - </Breadcrumb>
15 - </Col>
16 - <Col md={9}>
17 - <Widget>
18 - <h5>Requirements:</h5>
19 - <ol>
20 - <li>1. Mac OS X, Windows, or Linux</li>
21 - <li>2. Yarn package + Node.js v6.5 or newer</li>
22 - <li>3. Running our <a href="https://github.com/flatlogic/nodejs-backend" rel="noopener noreferrer" target="_blank">Node.js backend</a>
23 - <span className="small text-muted"> (Required only in full stack version)</span></li>
24 - </ol>
25 - <h5>Quick Start:</h5>
26 - <ol>
27 - <li>1. Run <code>yarn install</code></li>
28 - <li>2. Run <code>yarn start</code></li>
29 - </ol>
30 - <h5>There are also other npm tasks:</h5>
31 - <ul>
32 - <li><code>yarn build</code>: if you need just to build the app (without running a dev server)</li>
33 - <li><code>yarn lint</code>: to check the source code for syntax errors and potential issues</li>
34 - </ul>
35 - </Widget>
36 - <p>For more instruction please refer to Sing App React readme.md.</p>
37 - </Col>
38 - </Row>
39 -);
40 -
41 -export default QuickStart;
1 -@import '../styles/app';
2 -
3 -.root {
4 - :global(.container) {
5 - @media (min-width: 1200px) {
6 - max-width: 1440px;
7 - }
8 - }
9 -}
10 -
11 -.content {
12 - background-color: #FFFBF8 !important;
13 - padding: $navbar-height*2 0 0 0 !important;
14 - min-height: 100vh;
15 -
16 - & :global(.widget) {
17 - box-shadow: none !important;
18 - background: transparent !important;
19 - padding-left: 0 !important;
20 - padding-right: 0 !important;
21 - }
22 -}
23 -
24 -.header {
25 - position: fixed !important;
26 - width: 100vw;
27 - background-color: #fff !important;
28 - height: 80px !important;
29 - box-shadow: 0 0 10px rgba(0,0,0,.2);
30 -}
31 -
32 -.company {
33 - display: flex;
34 - position: fixed;
35 - bottom: 0;
36 - align-items: center;
37 - width: inherit;
38 - max-width: inherit;
39 -
40 - color: #495057;
41 - font-size: 11px;
42 - font-weight: 400;
43 - background-repeat: no-repeat;
44 - margin-bottom: 30px;
45 - background-size: contain;
46 - border-radius: 50px;
47 - padding: 0 25px;
48 -
49 - img {
50 - border-radius: 50%;
51 - margin-right: 10px;
52 - margin-top: -4px;
53 - width: 50px;
54 - }
55 -}
56 -
57 -.sidebar {
58 - @media (max-width: 767px) {
59 - position: relative;
60 - width: auto;
61 - background: transparent;
62 - border-right: 0;
63 - margin-bottom: 20px;
64 -
65 - .nav {
66 - padding-top: 0;
67 -
68 - > div > li > a {
69 - padding-left: 0 !important;
70 - }
71 - }
72 - }
73 -
74 - @media (min-width: 768px) {
75 - box-shadow: -100vw 0 0 100vw white;
76 - position: absolute;
77 - height: 100%;
78 - right: 0;
79 - background: #fff;
80 - top: -40px;
81 - padding-top: 22px;
82 - overflow-y: visible !important;
83 - max-width: 100%;
84 -
85 - .nav {
86 - position: fixed;
87 - width: inherit;
88 - max-width: inherit;
89 - overflow-y: visible;
90 - max-height: calc(100vh - 200px);
91 - }
92 -
93 - > ul {
94 - padding-top: 0;
95 - }
96 - }
97 -
98 - & :global(a) {
99 - font-weight: 400 !important;
100 -
101 - &[aria-current="page"] {
102 - color: theme-color('warning') !important;
103 - }
104 - }
105 -
106 - & :global(.link-wrapper) {
107 - > a > span {
108 - display: none !important;
109 - }
110 -
111 - > a {
112 - padding-left: 25px !important;
113 - font-weight: 600 !important;
114 - }
115 - }
116 -}
117 -
118 -.scrollSpy {
119 - color: #32373b;
120 -}
121 -
122 -.activeScrollSpy > a,
123 -.activeScrollSpy > a:hover,
124 -.activeScrollSpy > a:focus {
125 - color: theme-color('warning') !important;
126 -}
1 -<svg width="2370" height="2500" viewBox="0 0 256 270" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet"><path d="M127.606.341L.849 44.95 20.88 211.022l106.86 58.732 107.412-59.528L255.175 44.16 127.606.341z" fill="#B3B3B3"/><path d="M242.532 53.758L127.31 14.466v241.256l96.561-53.441 18.66-148.523z" fill="#A6120D"/><path d="M15.073 54.466l17.165 148.525 95.07 52.731V14.462L15.074 54.465z" fill="#DD1B16"/><path d="M159.027 142.898L127.31 157.73H93.881l-15.714 39.305-29.228.54L127.31 23.227l31.717 119.672zm-3.066-7.467l-28.44-56.303-23.329 55.334h23.117l28.652.97z" fill="#F2F2F2"/><path d="M127.309 23.226l.21 55.902 26.47 55.377h-26.62l-.06 23.189 36.81.035 17.204 39.852 27.967.518-81.981-174.873z" fill="#B3B3B3"/></svg>
...\ No newline at end of file ...\ No newline at end of file
1 -<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
2 - viewBox="0 0 230 230" style="enable-background:new 0 0 230 230;" xml:space="preserve">
3 -<style type="text/css">
4 - .st0{fill:#DD0031;}
5 - .st1{fill:#C3002F;}
6 - .st2{fill:#FFFFFF;}
7 -</style>
8 -<g>
9 - <polygon class="st0" points="125,30 125,30 125,30 31.9,63.2 46.1,186.3 125,230 125,230 125,230 203.9,186.3 218.1,63.2 "/>
10 - <polygon class="st1" points="125,30 125,52.2 125,52.1 125,153.4 125,153.4 125,230 125,230 203.9,186.3 218.1,63.2 125,30 "/>
11 - <path class="st2" d="M125,52.1L66.8,182.6h0h21.7h0l11.7-29.2h49.4l11.7,29.2h0h21.7h0L125,52.1L125,52.1L125,52.1L125,52.1
12 - L125,52.1z M142,135.4H108l17-40.9L142,135.4z"/>
13 -</g>
14 -</svg>
1 -<?xml version="1.0" encoding="iso-8859-1"?>
2 -<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3 -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4 -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" x="0px" y="0px" width="512px" height="512px" viewBox="0 0 306 306" style="enable-background:new 0 0 306 306;" xml:space="preserve">
5 -<g>
6 - <g id="chevron-right">
7 - <polygon points="94.35,0 58.65,35.7 175.95,153 58.65,270.3 94.35,306 247.35,153 " fill="#FFFFFF"/>
8 - </g>
9 -</g>
10 -<g>
11 -</g>
12 -<g>
13 -</g>
14 -<g>
15 -</g>
16 -<g>
17 -</g>
18 -<g>
19 -</g>
20 -<g>
21 -</g>
22 -<g>
23 -</g>
24 -<g>
25 -</g>
26 -<g>
27 -</g>
28 -<g>
29 -</g>
30 -<g>
31 -</g>
32 -<g>
33 -</g>
34 -<g>
35 -</g>
36 -<g>
37 -</g>
38 -<g>
39 -</g>
40 -</svg>
1 -<?xml version="1.0" encoding="iso-8859-1"?>
2 -<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3 -<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4 - viewBox="0 0 31.494 31.494" style="enable-background:new 0 0 31.494 31.494;" xml:space="preserve">
5 -<path style="fill:#1E201D;" d="M10.273,5.009c0.444-0.444,1.143-0.444,1.587,0c0.429,0.429,0.429,1.143,0,1.571l-8.047,8.047h26.554
6 - c0.619,0,1.127,0.492,1.127,1.111c0,0.619-0.508,1.127-1.127,1.127H3.813l8.047,8.032c0.429,0.444,0.429,1.159,0,1.587
7 - c-0.444,0.444-1.143,0.444-1.587,0l-9.952-9.952c-0.429-0.429-0.429-1.143,0-1.571L10.273,5.009z"/>
8 -<g>
9 -</g>
10 -<g>
11 -</g>
12 -<g>
13 -</g>
14 -<g>
15 -</g>
16 -<g>
17 -</g>
18 -<g>
19 -</g>
20 -<g>
21 -</g>
22 -<g>
23 -</g>
24 -<g>
25 -</g>
26 -<g>
27 -</g>
28 -<g>
29 -</g>
30 -<g>
31 -</g>
32 -<g>
33 -</g>
34 -<g>
35 -</g>
36 -<g>
37 -</g>
38 -</svg>
1 -<?xml version="1.0" encoding="iso-8859-1"?>
2 -<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3 -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" x="0px" y="0px" viewBox="0 0 321.2 321.2" style="enable-background:new 0 0 321.2 321.2;" xml:space="preserve" width="512px" height="512px">
4 -<g>
5 - <g>
6 - <path d="M306.4,313.2l-24-223.6c-0.4-3.6-3.6-6.4-7.2-6.4h-44.4V69.6c0-38.4-31.2-69.6-69.6-69.6c-38.4,0-69.6,31.2-69.6,69.6 v13.6H46c-3.6,0-6.8,2.8-7.2,6.4l-24,223.6c-0.4,2,0.4,4,1.6,5.6c1.2,1.6,3.2,2.4,5.2,2.4h278c2,0,4-0.8,5.2-2.4 C306,317.2,306.8,315.2,306.4,313.2z M223.6,123.6c3.6,0,6.4,2.8,6.4,6.4c0,3.6-2.8,6.4-6.4,6.4c-3.6,0-6.4-2.8-6.4-6.4 C217.2,126.4,220,123.6,223.6,123.6z M106,69.6c0-30.4,24.8-55.2,55.2-55.2c30.4,0,55.2,24.8,55.2,55.2v13.6H106V69.6z M98.8,123.6c3.6,0,6.4,2.8,6.4,6.4c0,3.6-2.8,6.4-6.4,6.4c-3.6,0-6.4-2.8-6.4-6.4C92.4,126.4,95.2,123.6,98.8,123.6z M30,306.4 L52.4,97.2h39.2v13.2c-8,2.8-13.6,10.4-13.6,19.2c0,11.2,9.2,20.4,20.4,20.4c11.2,0,20.4-9.2,20.4-20.4c0-8.8-5.6-16.4-13.6-19.2 V97.2h110.4v13.2c-8,2.8-13.6,10.4-13.6,19.2c0,11.2,9.2,20.4,20.4,20.4c11.2,0,20.4-9.2,20.4-20.4c0-8.8-5.6-16.4-13.6-19.2V97.2 H270l22.4,209.2H30z" fill="#FFFFFF"/>
7 - </g>
8 -</g>
9 -<g>
10 -</g>
11 -<g>
12 -</g>
13 -<g>
14 -</g>
15 -<g>
16 -</g>
17 -<g>
18 -</g>
19 -<g>
20 -</g>
21 -<g>
22 -</g>
23 -<g>
24 -</g>
25 -<g>
26 -</g>
27 -<g>
28 -</g>
29 -<g>
30 -</g>
31 -<g>
32 -</g>
33 -<g>
34 -</g>
35 -<g>
36 -</g>
37 -<g>
38 -</g>
39 -</svg>
1 -<?xml version='1.0' encoding='utf-8'?>
2 -<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'>
3 -<svg width="64" version="1.1" xmlns="http://www.w3.org/2000/svg" height="64" viewBox="0 0 64 64" xmlns:xlink="http://www.w3.org/1999/xlink" enable-background="new 0 0 64 64">
4 - <g>
5 - <path fill="#1D1D1B" d="M28.941,31.786L0.613,60.114c-0.787,0.787-0.787,2.062,0,2.849c0.393,0.394,0.909,0.59,1.424,0.59 c0.516,0,1.031-0.196,1.424-0.59l28.541-28.541l28.541,28.541c0.394,0.394,0.909,0.59,1.424,0.59c0.515,0,1.031-0.196,1.424-0.59 c0.787-0.787,0.787-2.062,0-2.849L35.064,31.786L63.41,3.438c0.787-0.787,0.787-2.062,0-2.849c-0.787-0.786-2.062-0.786-2.848,0 L32.003,29.15L3.441,0.59c-0.787-0.786-2.061-0.786-2.848,0c-0.787,0.787-0.787,2.062,0,2.849L28.941,31.786z"/>
6 - </g>
7 -</svg>
1 -<?xml version="1.0" encoding="iso-8859-1"?>
2 -<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3 -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" x="0px" y="0px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve" width="512px" height="512px">
4 -<g>
5 - <g>
6 - <path d="M504.527,67.909c-8.611-6.92-21.2-5.547-28.118,3.063L210.291,402.169c-3.612,3.863-8.494,6.101-13.797,6.314 c-5.459,0.22-10.629-1.73-14.523-5.431L33.839,261.061c-7.975-7.643-20.634-7.374-28.278,0.599 c-7.643,7.974-7.375,20.634,0.599,28.278l148.191,142.048c11.26,10.703,25.83,16.515,41.268,16.515 c0.825,0,1.655-0.017,2.484-0.051c16.352-0.657,31.371-7.734,42.288-19.926c0.237-0.265,0.467-0.537,0.691-0.814L507.59,96.027 C514.508,87.416,513.137,74.828,504.527,67.909z" fill="#555555"/>
7 - </g>
8 -</g>
9 -<g>
10 -</g>
11 -<g>
12 -</g>
13 -<g>
14 -</g>
15 -<g>
16 -</g>
17 -<g>
18 -</g>
19 -<g>
20 -</g>
21 -<g>
22 -</g>
23 -<g>
24 -</g>
25 -<g>
26 -</g>
27 -<g>
28 -</g>
29 -<g>
30 -</g>
31 -<g>
32 -</g>
33 -<g>
34 -</g>
35 -<g>
36 -</g>
37 -<g>
38 -</g>
39 -</svg>
1 -<?xml version="1.0" encoding="UTF-8"?>
2 -<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 - <!-- Generator: Sketch 52.4 (67378) - http://www.bohemiancoding.com/sketch -->
4 - <title>dribble-logo</title>
5 - <desc>Created with Sketch.</desc>
6 - <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
7 - <g id="dribble-logo" fill="#6C757D" fill-rule="nonzero">
8 - <path d="M9.99056974,0 C4.48200393,0 0,4.48200393 0,9.99056974 C0,15.4991356 4.48200393,19.9811395 9.99056974,19.9811395 C15.4991356,19.9811395 19.9811395,15.4991356 19.9811395,9.99056974 C19.9811395,4.48200393 15.4990963,0 9.99056974,0 Z M16.5955599,4.60691552 C17.7844401,6.05929273 18.5025147,7.90880157 18.5212574,9.92314342 C18.2390177,9.86318271 15.4204322,9.29123772 12.5793713,9.64840864 L12.3957957,9.2075835 C12.2184676,8.79170923 12.0286444,8.37834971 11.8300982,7.97123772 C14.9858546,6.68369352 16.4157564,4.85041257 16.5955599,4.60691552 Z M9.99056974,1.46986248 C12.1585069,1.46986248 14.1403929,2.28282908 15.6464833,3.62031434 C15.4941454,3.83886051 14.210334,5.56471513 11.1757171,6.70239686 C9.77705305,4.13355599 8.22726916,2.02306483 7.99123772,1.70711198 C8.63308448,1.55229862 9.30247544,1.46986248 9.99056974,1.46986248 Z M6.36275049,2.28035363 C6.5875442,2.58880157 8.11233792,4.70180747 9.52601179,7.2156778 C5.53477407,8.27591356 2.01937132,8.26094303 1.63721022,8.25595285 C2.19041257,5.60719057 3.97500982,3.40679764 6.36275049,2.28035363 Z M1.45611002,10.0030648 L1.45984283,9.74204322 C1.83324165,9.75076621 5.96935167,9.803222 10.2290766,8.52817289 C10.4750884,9.0064833 10.707387,9.49225933 10.9221611,9.97681729 L10.5849902,10.0779568 C6.1853831,11.5003536 3.84385069,15.3792141 3.64903733,15.7088802 C2.28785855,14.1965815 1.45736739,12.1959921 1.45611002,10.0030648 Z M9.98931238,18.5362279 C8.01740668,18.5362279 6.19913556,17.8643615 4.75174853,16.735442 C4.90534381,16.423222 6.63371316,13.08389 11.4466798,11.4067191 L11.5028684,11.3879764 C12.7017289,14.5000393 13.1950098,17.1100589 13.3236542,17.8593713 C12.3008644,18.2952063 11.1732024,18.5374853 9.98931238,18.5362279 Z M14.7585462,17.0776031 C14.6711198,16.5580747 14.2153242,14.0604715 13.1013752,10.9933595 C15.7750884,10.5650295 18.1241257,11.2668369 18.4163458,11.3592534 C18.034224,13.7320236 16.6742633,15.7838507 14.7585462,17.0776031 Z" id="Shape"></path>
9 - </g>
10 - </g>
11 -</svg>
...\ No newline at end of file ...\ No newline at end of file
1 -<?xml version="1.0" encoding="UTF-8"?>
2 -<svg width="11px" height="20px" viewBox="0 0 11 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 - <!-- Generator: Sketch 52.4 (67378) - http://www.bohemiancoding.com/sketch -->
4 - <title>facebook-logo</title>
5 - <desc>Created with Sketch.</desc>
6 - <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
7 - <g id="facebook-logo" fill="#6C757D">
8 - <path d="M10.3276289,0.00412371134 L7.75752577,0 C4.87010309,0 3.00412371,1.91443299 3.00412371,4.87752577 L3.00412371,7.12639175 L0.42,7.12639175 C0.196701031,7.12639175 0.0158762887,7.30742268 0.0158762887,7.53072165 L0.0158762887,10.7890722 C0.0158762887,11.0123711 0.196907216,11.1931959 0.42,11.1931959 L3.00412371,11.1931959 L3.00412371,19.4150515 C3.00412371,19.6383505 3.18494845,19.8191753 3.40824742,19.8191753 L6.77979381,19.8191753 C7.00309278,19.8191753 7.18391753,19.6381443 7.18391753,19.4150515 L7.18391753,11.1931959 L10.2053608,11.1931959 C10.4286598,11.1931959 10.6094845,11.0123711 10.6094845,10.7890722 L10.6107216,7.53072165 C10.6107216,7.42350515 10.5680412,7.32082474 10.4923711,7.24494845 C10.416701,7.16907216 10.3136082,7.12639175 10.2063918,7.12639175 L7.18391753,7.12639175 L7.18391753,5.22 C7.18391753,4.30371134 7.40226804,3.8385567 8.59587629,3.8385567 L10.3272165,3.83793814 C10.5503093,3.83793814 10.731134,3.65690722 10.731134,3.43381443 L10.731134,0.408247423 C10.731134,0.185360825 10.5505155,0.00453608247 10.3276289,0.00412371134 Z" id="Path"></path>
9 - </g>
10 - </g>
11 -</svg>
...\ No newline at end of file ...\ No newline at end of file
1 -<?xml version="1.0" encoding="UTF-8"?>
2 -<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 - <!-- Generator: Sketch 52.4 (67378) - http://www.bohemiancoding.com/sketch -->
4 - <title>github-logo</title>
5 - <desc>Created with Sketch.</desc>
6 - <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
7 - <g id="github-logo" fill="#6C757D">
8 - <path d="M18.6392711,4.99193622 C17.7459681,3.46136674 16.5342597,2.24961276 15.0038269,1.35640091 C13.4731663,0.463143508 11.8021412,0.0166287016 9.9895672,0.0166287016 C8.17722096,0.0166287016 6.5056492,0.463280182 4.97530752,1.35640091 C3.44473804,2.2495672 2.23307517,3.46136674 1.33977221,4.99193622 C0.446605923,6.52246014 0,8.1938041 0,10.0059226 C0,12.1826879 0.635079727,14.1400911 1.90555809,15.8786333 C3.17589977,17.6173121 4.81699317,18.82041 6.82870159,19.4880638 C7.06287016,19.5315262 7.23621868,19.5009567 7.34892938,19.3971298 C7.46168565,19.2931663 7.51799544,19.1629613 7.51799544,19.0070615 C7.51799544,18.9810478 7.5157631,18.7470159 7.51143508,18.3046925 C7.50697039,17.862369 7.50487472,17.476492 7.50487472,17.1472437 L7.20569476,17.1989977 C7.01494305,17.2339408 6.77430524,17.2487472 6.48378132,17.2445558 C6.19339408,17.2405011 5.89193622,17.2100683 5.57981777,17.1534852 C5.26756264,17.0974032 4.97712984,16.9673349 4.70829157,16.7635535 C4.43958998,16.5597722 4.24883827,16.2930296 4.136082,15.9637358 L4.00601367,15.6644191 C3.91931663,15.4651481 3.7828246,15.2437813 3.59635535,15.001139 C3.4098861,14.7582688 3.22132118,14.5936219 3.03056948,14.5069248 L2.93949886,14.4417312 C2.87881549,14.3984055 2.82250569,14.3461503 2.7704328,14.2855125 C2.71840547,14.2248747 2.6794533,14.1641913 2.65343964,14.1034169 C2.62738041,14.0425968 2.64897494,13.9927107 2.71845103,13.9535763 C2.78792711,13.9144419 2.91348519,13.8954442 3.09567198,13.8954442 L3.35571754,13.9343052 C3.52915718,13.9690661 3.74369021,14.0728929 3.99958998,14.2464237 C4.25535308,14.4198178 4.46560364,14.6452392 4.63038724,14.9225968 C4.82993166,15.2782232 5.07034169,15.5492027 5.35230068,15.735672 C5.63403189,15.9221412 5.91808656,16.0152164 6.20419134,16.0152164 C6.49029613,16.0152164 6.73740319,15.9935308 6.94560364,15.9503872 C7.15357631,15.9070159 7.34870159,15.8418223 7.53088838,15.7551708 C7.60892938,15.1739408 7.8214123,14.727426 8.1681549,14.4153075 C7.67394077,14.3633713 7.22961276,14.2851481 6.83494305,14.181139 C6.44050114,14.0769932 6.03289294,13.9079727 5.6123918,13.6736219 C5.19166287,13.43959 4.84264237,13.1489749 4.56523918,12.8022779 C4.28779043,12.4553986 4.06009112,12 3.88246014,11.436492 C3.70473804,10.8727563 3.61585421,10.2224601 3.61585421,9.48542141 C3.61585421,8.43599089 3.95845103,7.54296128 4.64350797,6.80583144 C4.32259681,6.01685649 4.35289294,5.1323918 4.73448747,4.15252847 C4.98596811,4.07439636 5.35890661,4.13302961 5.85312073,4.32806378 C6.34742597,4.52318907 6.70933941,4.69034169 6.93922551,4.82892938 C7.16911162,4.96747153 7.35330296,5.08487472 7.49207289,5.18009112 C8.29867882,4.95471526 9.13107062,4.84200456 9.98947608,4.84200456 C10.8478815,4.84200456 11.6804556,4.95471526 12.4871071,5.18009112 L12.9813667,4.86806378 C13.3193622,4.65986333 13.7184966,4.46906606 14.1778132,4.29562642 C14.6374032,4.1222779 14.9888383,4.07453303 15.231754,4.15266515 C15.6218223,5.13257403 15.6565831,6.01699317 15.3355809,6.80596811 C16.0205923,7.54309795 16.3633257,8.43635535 16.3633257,9.48555809 C16.3633257,10.2225968 16.274123,10.8749431 16.0966743,11.4430068 C15.9189977,12.0111617 15.6893394,12.4661048 15.4076082,12.8087927 C15.1255581,13.1514351 14.7743052,13.4397722 14.3538041,13.6737585 C13.9332118,13.9079271 13.525467,14.0769476 13.1310251,14.1810934 C12.7364009,14.2852392 12.2920729,14.363508 11.7978588,14.4155353 C12.2486105,14.8056036 12.4740319,15.4213212 12.4740319,16.2624146 L12.4740319,19.006697 C12.4740319,19.1625968 12.528246,19.2927563 12.6367654,19.3967654 C12.7451481,19.5005923 12.9163098,19.5311617 13.1504784,19.4876538 C15.1624601,18.8200911 16.8035535,17.6169476 18.0738497,15.8782688 C19.3440091,14.1397267 19.9793166,12.1823235 19.9793166,10.0055581 C19.978861,8.19366743 19.5320273,6.52246014 18.6392711,4.99193622 Z" id="Path"></path>
9 - </g>
10 - </g>
11 -</svg>
...\ No newline at end of file ...\ No newline at end of file
1 -<?xml version="1.0" encoding="UTF-8"?>
2 -<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 - <!-- Generator: Sketch 52.4 (67378) - http://www.bohemiancoding.com/sketch -->
4 - <title>instagram-logo</title>
5 - <desc>Created with Sketch.</desc>
6 - <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
7 - <g id="instagram-logo" fill="#6C757D">
8 - <path d="M14.4007059,0 L5.48870588,0 C2.46223529,0 0,2.46235294 0,5.48882353 L0,14.4008235 C0,17.4274118 2.46223529,19.8896471 5.48870588,19.8896471 L14.4007059,19.8896471 C17.4274118,19.8896471 19.8896471,17.4272941 19.8896471,14.4008235 L19.8896471,5.48882353 C19.8897647,2.46235294 17.4274118,0 14.4007059,0 Z M18.1250588,14.4008235 C18.1250588,16.4543529 16.4543529,18.1249412 14.4008235,18.1249412 L5.48870588,18.1249412 C3.43529412,18.1250588 1.76470588,16.4543529 1.76470588,14.4008235 L1.76470588,5.48882353 C1.76470588,3.43541176 3.43529412,1.76470588 5.48870588,1.76470588 L14.4007059,1.76470588 C16.4542353,1.76470588 18.1249412,3.43541176 18.1249412,5.48882353 L18.1249412,14.4008235 L18.1250588,14.4008235 Z" id="Shape" fill-rule="nonzero"></path>
9 - <path d="M9.94482353,4.82 C7.11882353,4.82 4.81976471,7.11905882 4.81976471,9.94505882 C4.81976471,12.7709412 7.11882353,15.0698824 9.94482353,15.0698824 C12.7708235,15.0698824 15.0698824,12.7709412 15.0698824,9.94505882 C15.0698824,7.11905882 12.7708235,4.82 9.94482353,4.82 Z M9.94482353,13.3050588 C8.092,13.3050588 6.58447059,11.7977647 6.58447059,9.94494118 C6.58447059,8.092 8.09188235,6.58458824 9.94482353,6.58458824 C11.7977647,6.58458824 13.3051765,8.092 13.3051765,9.94494118 C13.3051765,11.7977647 11.7976471,13.3050588 9.94482353,13.3050588 Z" id="Shape" fill-rule="nonzero"></path>
10 - <path d="M15.2848235,3.32364706 C14.9448235,3.32364706 14.6108235,3.46129412 14.3707059,3.70247059 C14.1294118,3.94247059 13.9907059,4.27658824 13.9907059,4.61776471 C13.9907059,4.95788235 14.1295294,5.29188235 14.3707059,5.53305882 C14.6107059,5.77305882 14.9448235,5.91188235 15.2848235,5.91188235 C15.626,5.91188235 15.9589412,5.77305882 16.2001176,5.53305882 C16.4412941,5.29188235 16.5789412,4.95776471 16.5789412,4.61776471 C16.5789412,4.27658824 16.4412941,3.94247059 16.2001176,3.70247059 C15.9601176,3.46129412 15.626,3.32364706 15.2848235,3.32364706 Z" id="Path"></path>
11 - </g>
12 - </g>
13 -</svg>
...\ No newline at end of file ...\ No newline at end of file
1 -<?xml version="1.0" encoding="UTF-8"?>
2 -<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 - <!-- Generator: Sketch 52.4 (67378) - http://www.bohemiancoding.com/sketch -->
4 - <title>linkedin-logo</title>
5 - <desc>Created with Sketch.</desc>
6 - <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
7 - <g id="linkedin-logo" fill="#6C757D" fill-rule="nonzero">
8 - <path d="M19.9590255,12.2593689 L19.9590255,19.9786408 L15.6811601,19.9786408 L15.6811601,12.7763592 C15.6811601,10.9670874 15.062413,9.7323301 13.5139675,9.7323301 C12.3319258,9.7323301 11.6284919,10.564466 11.3190255,11.3694175 C11.2061717,11.6571845 11.177123,12.0577184 11.177123,12.460534 L11.177123,19.9786408 L6.89781903,19.9786408 C6.89781903,19.9786408 6.95545244,7.78033981 6.89781903,6.51650485 L11.1767053,6.51650485 L11.1767053,8.42470874 C11.1680278,8.43898058 11.1567517,8.45436893 11.1485847,8.46820388 L11.1767053,8.46820388 L11.1767053,8.42470874 C11.7451972,7.50873786 12.760464,6.20024272 15.0329466,6.20024272 C17.8483991,6.20019417 19.9590255,8.12432039 19.9590255,12.2593689 Z M2.42148492,0.0270873786 C0.957540603,0.0270873786 0,1.03160194 0,2.35257282 C0,3.64475728 0.929837587,4.67975728 2.36468677,4.67975728 L2.39327146,4.67975728 C3.88556845,4.67975728 4.81364269,3.64495146 4.81364269,2.35257282 C4.78552204,1.03160194 3.88556845,0.0270873786 2.42148492,0.0270873786 Z M0.254153132,19.9786408 L4.53183295,19.9786408 L4.53183295,6.51650485 L0.254153132,6.51650485 L0.254153132,19.9786408 Z" id="LinkedIn"></path>
9 - </g>
10 - </g>
11 -</svg>
...\ No newline at end of file ...\ No newline at end of file
1 -<?xml version="1.0" encoding="UTF-8"?>
2 -<svg width="20px" height="17px" viewBox="0 0 20 17" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 - <!-- Generator: Sketch 52.4 (67378) - http://www.bohemiancoding.com/sketch -->
4 - <title>twitter-logo</title>
5 - <desc>Created with Sketch.</desc>
6 - <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
7 - <g id="twitter-logo" fill="#6C757D">
8 - <path d="M20,1.93653595 C19.2638889,2.26271242 18.4740523,2.48392157 17.644183,2.58267974 C18.4915359,2.07526144 19.1401634,1.27042484 19.4475817,0.314346405 C18.6527451,0.784248366 17.7753922,1.12545752 16.8405556,1.31042484 C16.0919608,0.511830065 15.0271569,0.0144117647 13.8461111,0.0144117647 C11.5802941,0.0144117647 9.74313725,1.85156863 9.74313725,4.11614379 C9.74313725,4.43732026 9.77937908,4.75101307 9.84937908,5.05098039 C6.44003268,4.87973856 3.41686275,3.24630719 1.39349673,0.764248366 C1.03980392,1.36915033 0.838594771,2.07398693 0.838594771,2.82637255 C0.838594771,4.24986928 1.56346405,5.50588235 2.66326797,6.24071895 C1.99088235,6.21823529 1.35849673,6.03326797 0.804869281,5.72581699 L0.804869281,5.77705882 C0.804869281,7.76418301 2.21960784,9.42261438 4.0954902,9.80006536 C3.75179739,9.89254902 3.38937908,9.94379085 3.01444444,9.94379085 C2.7495098,9.94379085 2.49330065,9.91754902 2.2420915,9.86754902 C2.76447712,11.4984967 4.27921569,12.6845098 6.07388889,12.7170261 C4.67039216,13.8168301 2.90071895,14.4704575 0.978594771,14.4704575 C0.647418301,14.4704575 0.32120915,14.4504575 3.26797386e-05,14.4142157 C1.81594771,15.5802614 3.97179739,16.2601307 6.28885621,16.2601307 C13.8361765,16.2601307 17.9616667,10.0087908 17.9616667,4.58732026 L17.9479085,4.05617647 C18.7539869,3.48124183 19.4513399,2.75888889 20,1.93653595 Z" id="Path"></path>
9 - </g>
10 - </g>
11 -</svg>
...\ No newline at end of file ...\ No newline at end of file
1 -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 630 630">
2 -<rect width="630" height="630" fill="#f7df1e"/>
3 -<path d="m423.2 492.19c12.69 20.72 29.2 35.95 58.4 35.95 24.53 0 40.2-12.26 40.2-29.2 0-20.3-16.1-27.49-43.1-39.3l-14.8-6.35c-42.72-18.2-71.1-41-71.1-89.2 0-44.4 33.83-78.2 86.7-78.2 37.64 0 64.7 13.1 84.2 47.4l-46.1 29.6c-10.15-18.2-21.1-25.37-38.1-25.37-17.34 0-28.33 11-28.33 25.37 0 17.76 11 24.95 36.4 35.95l14.8 6.34c50.3 21.57 78.7 43.56 78.7 93 0 53.3-41.87 82.5-98.1 82.5-54.98 0-90.5-26.2-107.88-60.54zm-209.13 5.13c9.3 16.5 17.76 30.45 38.1 30.45 19.45 0 31.72-7.61 31.72-37.2v-201.3h59.2v202.1c0 61.3-35.94 89.2-88.4 89.2-47.4 0-74.85-24.53-88.81-54.075z"/>
4 -</svg>
...\ No newline at end of file ...\ No newline at end of file
1 -<?xml version="1.0" encoding="iso-8859-1"?>
2 -<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3 -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4 -<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
5 - width="56.48px" height="56.48px" viewBox="0 0 56.48 56.48" style="enable-background:new 0 0 56.48 56.48;" xml:space="preserve"
6 - >
7 -<g>
8 - <path d="M24.25,26.305h-4.284v-5.367h4.284v1.118h-3.002v0.967h2.931v1.1h-2.931v1.072h3.002V26.305z M14.703,26.305l-1.863-4.206
9 - v4.207h-2.61l-0.493-1.197h-2.67l-0.498,1.197H5.176l2.297-5.367h1.904l2.183,5.082v-5.082h2.094l1.679,3.641l1.541-3.641h2.138
10 - v5.367h-1.315l-0.005-4.203l-1.86,4.203L14.703,26.305L14.703,26.305z M9.273,23.99l-0.877-2.139L7.524,23.99H9.273z
11 - M30.022,31.944c0,1.491-1.112,1.799-2.233,1.799h-1.6v1.8h-2.493l-1.58-1.777l-1.642,1.777h-5.081v-5.367h5.158l1.58,1.758
12 - l1.632-1.758h4.098C28.879,30.175,30.022,30.458,30.022,31.944z M21.291,32.849l-1.403-1.563h-3.215v0.976h2.815v1.096h-2.815
13 - v1.068h3.152L21.291,32.849z M24.911,30.751l-1.97,2.116l1.97,2.188V30.751z M28.645,31.944c0-0.47-0.32-0.659-0.784-0.659h-1.672
14 - v1.367h1.656C28.339,32.653,28.645,32.408,28.645,31.944z M26.424,26.305H25.14v-5.367h2.95c0.655,0,1.138,0.017,1.554,0.257
15 - c0.404,0.24,0.648,0.59,0.648,1.189c0,0.855-0.57,1.298-0.904,1.43c0.281,0.107,0.521,0.296,0.635,0.452
16 - c0.182,0.267,0.213,0.505,0.213,0.984v1.055h-1.294l-0.006-0.677c0-0.323,0.031-0.787-0.202-1.045
17 - c-0.187-0.188-0.473-0.229-0.935-0.229h-1.375V26.305z M26.422,23.248h1.559c0.249,0,0.457-0.003,0.635-0.11
18 - c0.165-0.087,0.264-0.276,0.264-0.51c0-0.23-0.103-0.396-0.269-0.474c-0.152-0.086-0.386-0.097-0.608-0.097h-1.58L26.422,23.248
19 - L26.422,23.248z M32.344,20.939h-1.309v5.367h1.309V20.939z M33.66,25.712c-0.452-0.456-0.688-1.074-0.688-2.049
20 - c0-0.796,0.141-1.524,0.691-2.099c0.413-0.428,1.064-0.625,1.948-0.625h1.241v1.15h-1.215c-0.471,0-0.734,0.07-0.988,0.318
21 - c-0.219,0.226-0.368,0.652-0.368,1.216c0,0.574,0.112,0.989,0.353,1.259c0.197,0.213,0.559,0.277,0.894,0.277h0.575l1.812-4.22
22 - h1.921l2.172,5.076v-5.076h1.953l2.256,3.738v-3.738h1.312v5.367h-1.816l-2.434-4.028v4.028h-2.611l-0.5-1.197h-2.664l-0.482,1.197
23 - H35.52C34.895,26.305,34.106,26.167,33.66,25.712z M37.963,23.99h1.77l-0.889-2.139L37.963,23.99z M35.27,23.041
24 - c-0.012,0.017-0.102,0.21-0.102,0.582c0,0.368,0.059,0.545,0.102,0.625c0.045,0.012,0.128,0.026,0.252,0.026l0.556-1.299h-0.438
25 - C35.338,22.974,35.307,23.006,35.27,23.041z M56.48,11.393v33.695c0,0.803-0.65,1.454-1.454,1.454H1.454
26 - C0.65,46.542,0,45.89,0,45.087V11.393c0-0.803,0.65-1.454,1.454-1.454h53.572C55.83,9.939,56.48,10.59,56.48,11.393z
27 - M14.703,27.192h1.127c0.352,0,0.668-0.207,0.81-0.528l0.17-0.38v0.022c0,0.489,0.396,0.885,0.886,0.885h1.315
28 - c0.18,0,0.337-0.068,0.478-0.159c0.14,0.091,0.297,0.159,0.478,0.159h4.284c0.166,0,0.313-0.058,0.444-0.137
29 - c0.134,0.079,0.279,0.137,0.445,0.137h1.284c0.489,0,0.886-0.397,0.886-0.886v-1.066h0.489c0.111,0,0.19,0.003,0.249,0.007
30 - c0.006,0.091,0.004,0.199,0.004,0.271l-0.002,0.118l0.005,0.677c0.004,0.486,0.4,0.879,0.887,0.879h1.294
31 - c0.146,0,0.277-0.044,0.398-0.107c0.123,0.063,0.256,0.107,0.401,0.107h1.31c0.429,0,0.769-0.31,0.852-0.714
32 - c0.729,0.611,1.751,0.714,2.322,0.714h1.502c0.359,0,0.685-0.22,0.818-0.555l0.262-0.643h1.478l0.271,0.652
33 - c0.14,0.33,0.461,0.545,0.818,0.545h2.611c0.488,0,0.886-0.397,0.886-0.886v-0.847l0.787,1.305
34 - c0.161,0.266,0.448,0.428,0.761,0.428h1.816c0.488,0,0.886-0.397,0.886-0.886v-5.367c0-0.489-0.396-0.886-0.886-0.886h-1.312
35 - c-0.49,0-0.888,0.397-0.888,0.886v0.554l-0.61-1.011c-0.16-0.266-0.447-0.428-0.758-0.428h-1.953c-0.49,0-0.887,0.397-0.887,0.886
36 - v0.753l-0.471-1.102c-0.141-0.325-0.46-0.537-0.814-0.537h-1.921c-0.196,0-0.381,0.064-0.53,0.176
37 - c-0.147-0.111-0.332-0.176-0.529-0.176h-1.241c-1.052,0-1.834,0.256-2.408,0.753c-0.065-0.423-0.417-0.753-0.86-0.753h-1.309
38 - c-0.349,0-0.645,0.207-0.789,0.499c-0.055-0.04-0.099-0.087-0.16-0.124c-0.603-0.348-1.234-0.375-1.997-0.375h-2.95
39 - c-0.166,0-0.312,0.058-0.445,0.137c-0.131-0.079-0.278-0.137-0.444-0.137h-4.284c-0.181,0-0.338,0.067-0.478,0.159
40 - c-0.141-0.092-0.298-0.159-0.478-0.159h-2.138c-0.354,0-0.676,0.213-0.814,0.541l-0.762,1.796l-0.839-1.822
41 - c-0.146-0.313-0.461-0.515-0.805-0.515H11.56c-0.49,0-0.886,0.397-0.886,0.886v0.771l-0.481-1.122
42 - c-0.141-0.325-0.46-0.536-0.815-0.536H7.474c-0.355,0-0.676,0.212-0.815,0.537l-2.296,5.367c-0.118,0.273-0.089,0.587,0.074,0.837
43 - c0.164,0.248,0.442,0.398,0.74,0.398h1.394c0.356,0,0.68-0.216,0.816-0.546l0.271-0.652h1.486l0.267,0.648
44 - c0.137,0.332,0.46,0.549,0.82,0.549h2.609c0.489,0,0.886-0.397,0.886-0.886v-0.021l0.168,0.381
45 - C14.035,26.985,14.353,27.192,14.703,27.192z M52.19,33.849c0-0.75-0.2-1.308-0.64-1.76c-0.009-0.009-0.019-0.018-0.026-0.026
46 - c0.245-0.158,0.405-0.433,0.405-0.746v-1.142c0-0.49-0.396-0.887-0.885-0.887h-2.572c-0.801,0-1.402,0.235-1.842,0.592
47 - c-0.123-0.343-0.441-0.592-0.828-0.592h-2.57c-0.706,0-1.266,0.176-1.688,0.462c-0.152-0.271-0.432-0.462-0.764-0.462H36.5
48 - c-0.346,0-0.635,0.202-0.781,0.489c-0.062-0.042-0.105-0.093-0.172-0.132c-0.619-0.331-1.279-0.357-1.961-0.357h-2.962
49 - c-0.347,0-0.639,0.203-0.784,0.493c-0.449-0.294-1.081-0.493-1.979-0.493h-4.098c-0.247,0-0.482,0.102-0.65,0.283l-0.971,1.048
50 - l-0.932-1.037c-0.167-0.188-0.406-0.294-0.659-0.294h-5.158c-0.489,0-0.886,0.396-0.886,0.887v5.367
51 - c0,0.489,0.396,0.887,0.886,0.887h5.081c0.247,0,0.482-0.104,0.65-0.285l0.979-1.06l0.929,1.046
52 - c0.168,0.189,0.41,0.297,0.663,0.297h2.493c0.49,0,0.887-0.396,0.887-0.886v-0.915h0.713c0.866,0,1.494-0.178,1.949-0.449v1.364
53 - c0,0.489,0.396,0.886,0.887,0.886h1.289c0.489,0,0.886-0.396,0.886-0.886v-1.075h0.484c0.118,0,0.201,0.004,0.26,0.008
54 - c0.006,0.095,0.006,0.211,0.004,0.287v0.78c0,0.489,0.396,0.886,0.887,0.886h1.287c0.142,0,0.271-0.041,0.39-0.1
55 - c0.118,0.061,0.249,0.1,0.392,0.1h4.28c0.14,0,0.267-0.039,0.384-0.096c0.118,0.057,0.244,0.096,0.385,0.096h2.498
56 - c0.797,0,1.441-0.194,1.928-0.539c0.136,0.316,0.449,0.539,0.815,0.539h2.498C51.107,36.429,52.19,35.464,52.19,33.849z
57 - M44.215,32.281l-0.689-0.02c-0.219,0-0.363-0.014-0.5-0.061c-0.161-0.061-0.28-0.197-0.28-0.4c0-0.17,0.052-0.299,0.194-0.387
58 - c0.128-0.087,0.279-0.097,0.514-0.097h2.352v-1.142h-2.57c-1.346,0-1.834,0.818-1.834,1.598c0,1.697,1.503,1.621,2.701,1.66
59 - c0.225,0,0.359,0.037,0.457,0.119c0.09,0.076,0.156,0.198,0.156,0.355c0,0.146-0.062,0.268-0.15,0.35
60 - c-0.108,0.102-0.281,0.133-0.523,0.133h-2.488v1.151h2.498c1.293,0,2.016-0.539,2.016-1.694c0-0.551-0.135-0.879-0.385-1.137
61 - C45.389,32.417,44.911,32.298,44.215,32.281z M34.881,33.048c0.284,0.104,0.519,0.295,0.627,0.451
62 - c0.183,0.262,0.209,0.506,0.213,0.979v1.064h-1.287v-0.671c0-0.323,0.031-0.801-0.207-1.051c-0.188-0.192-0.473-0.238-0.941-0.238
63 - h-1.37v1.96h-1.288v-5.367h2.961c0.649,0,1.121,0.027,1.545,0.252c0.403,0.244,0.658,0.58,0.658,1.192
64 - C35.79,32.478,35.217,32.915,34.881,33.048z M34.371,31.866c0-0.229-0.099-0.396-0.265-0.483c-0.156-0.092-0.386-0.097-0.612-0.097
65 - h-1.58v1.206h1.559c0.25,0,0.463-0.009,0.635-0.111C34.272,32.281,34.371,32.095,34.371,31.866z M36.502,35.542h4.28v-1.113
66 - l-3.004-0.006v-1.067h2.93v-1.095h-2.93v-0.977h3.004v-1.109h-4.28V35.542z M49.456,32.281l-0.69-0.02
67 - c-0.217,0-0.362-0.014-0.5-0.061c-0.159-0.061-0.279-0.197-0.279-0.4c0-0.17,0.052-0.299,0.193-0.387
68 - c0.129-0.087,0.281-0.097,0.515-0.097h2.353v-1.142h-2.572c-1.344,0-1.834,0.818-1.834,1.598c0,1.697,1.504,1.621,2.703,1.66
69 - c0.224,0,0.357,0.037,0.457,0.119c0.088,0.076,0.155,0.198,0.155,0.355c0,0.146-0.063,0.268-0.149,0.35
70 - c-0.109,0.102-0.282,0.133-0.524,0.133h-2.487v1.151h2.498c1.293,0,2.014-0.539,2.014-1.694c0-0.551-0.133-0.879-0.385-1.137
71 - C50.631,32.417,50.152,32.298,49.456,32.281z"/>
72 -</g>
73 -<g>
74 -</g>
75 -<g>
76 -</g>
77 -<g>
78 -</g>
79 -<g>
80 -</g>
81 -<g>
82 -</g>
83 -<g>
84 -</g>
85 -<g>
86 -</g>
87 -<g>
88 -</g>
89 -<g>
90 -</g>
91 -<g>
92 -</g>
93 -<g>
94 -</g>
95 -<g>
96 -</g>
97 -<g>
98 -</g>
99 -<g>
100 -</g>
101 -<g>
102 -</g>
103 -</svg>
1 -<?xml version="1.0" encoding="utf-8"?>
2 -<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3 -<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4 - viewBox="0 0 34 21.5" style="enable-background:new 0 0 34 21.5;" xml:space="preserve">
5 -<style type="text/css">
6 - .st0{fill:#FFFFFF;}
7 - .st1{fill:#FF5F00;}
8 - .st2{fill:#EB001B;}
9 - .st3{fill:#F79E1B;}
10 -</style>
11 -<rect id="XMLID_1_" x="0" width="34" height="21.5"/>
12 -<g id="XMLID_4703_">
13 - <path id="XMLID_4607_" class="st0" d="M9.5,19.8v-1.2c0-0.5-0.3-0.8-0.7-0.8c-0.2,0-0.5,0.1-0.7,0.3c-0.1-0.2-0.3-0.3-0.6-0.3
14 - c-0.2,0-0.4,0.1-0.6,0.3v-0.2H6.5v1.9h0.4v-1.1c0-0.3,0.2-0.5,0.5-0.5c0.3,0,0.4,0.2,0.4,0.5v1.1h0.4v-1.1c0-0.3,0.2-0.5,0.5-0.5
15 - c0.3,0,0.4,0.2,0.4,0.5v1.1L9.5,19.8L9.5,19.8z M15.8,17.9h-0.7v-0.6h-0.4v0.6h-0.4v0.4h0.4v0.9c0,0.4,0.2,0.7,0.7,0.7
16 - c0.2,0,0.4-0.1,0.5-0.1l-0.1-0.3c-0.1,0.1-0.3,0.1-0.4,0.1c-0.2,0-0.3-0.1-0.3-0.3v-0.9h0.7L15.8,17.9L15.8,17.9z M19.4,17.8
17 - c-0.2,0-0.4,0.1-0.5,0.3v-0.2h-0.4v1.9h0.4v-1.1c0-0.3,0.2-0.5,0.4-0.5c0.1,0,0.2,0,0.3,0l0.1-0.4C19.6,17.8,19.5,17.8,19.4,17.8
18 - L19.4,17.8z M14,18c-0.2-0.1-0.5-0.2-0.8-0.2c-0.5,0-0.8,0.2-0.8,0.6c0,0.3,0.2,0.5,0.7,0.6l0.2,0c0.2,0,0.4,0.1,0.4,0.2
19 - c0,0.1-0.2,0.2-0.5,0.2c-0.3,0-0.5-0.1-0.6-0.2l-0.2,0.3c0.3,0.2,0.6,0.3,0.8,0.3c0.6,0,0.9-0.3,0.9-0.6c0-0.3-0.2-0.5-0.7-0.6
20 - l-0.2,0c-0.2,0-0.3-0.1-0.3-0.2c0-0.1,0.2-0.2,0.4-0.2c0.2,0,0.5,0.1,0.6,0.2L14,18z M19.8,18.8c0,0.6,0.4,1,1,1
21 - c0.3,0,0.5-0.1,0.7-0.2l-0.2-0.3c-0.2,0.1-0.3,0.2-0.5,0.2c-0.3,0-0.6-0.3-0.6-0.7c0-0.4,0.3-0.7,0.6-0.7c0.2,0,0.3,0.1,0.5,0.2
22 - l0.2-0.3c-0.2-0.2-0.4-0.2-0.7-0.2C20.2,17.8,19.8,18.2,19.8,18.8L19.8,18.8z M17.1,17.8c-0.6,0-1,0.4-1,1c0,0.6,0.4,1,1,1
23 - c0.3,0,0.6-0.1,0.8-0.3l-0.2-0.3c-0.2,0.1-0.4,0.2-0.6,0.2c-0.3,0-0.5-0.2-0.6-0.5H18c0-0.1,0-0.1,0-0.2
24 - C18,18.2,17.6,17.8,17.1,17.8L17.1,17.8z M17.1,18.2c0.3,0,0.5,0.2,0.5,0.5h-1C16.6,18.4,16.8,18.2,17.1,18.2L17.1,18.2z
25 - M11.9,18.8v-1h-0.4v0.2c-0.1-0.2-0.4-0.3-0.6-0.3c-0.5,0-1,0.4-1,1s0.4,1,1,1c0.3,0,0.5-0.1,0.6-0.3v0.2h0.4V18.8z M10.3,18.8
26 - c0-0.4,0.2-0.7,0.6-0.7c0.4,0,0.6,0.3,0.6,0.7s-0.2,0.7-0.6,0.7C10.5,19.5,10.3,19.2,10.3,18.8L10.3,18.8z M25.2,17.8
27 - c-0.2,0-0.4,0.1-0.5,0.3v-0.2h-0.4v1.9h0.4v-1.1c0-0.3,0.2-0.5,0.4-0.5c0.1,0,0.2,0,0.3,0l0.1-0.4C25.4,17.8,25.3,17.8,25.2,17.8
28 - L25.2,17.8z M28.3,19.5C28.4,19.5,28.4,19.5,28.3,19.5c0.1,0,0.1,0,0.1,0.1c0,0,0,0,0,0.1c0,0,0,0,0,0.1c0,0,0,0.1,0,0.1
29 - c0,0,0,0,0,0.1c0,0,0,0-0.1,0c0,0,0,0-0.1,0c0,0-0.1,0-0.1,0c0,0,0,0-0.1,0c0,0,0,0,0-0.1c0,0,0,0,0-0.1c0,0,0-0.1,0-0.1
30 - c0,0,0,0,0-0.1C28.2,19.6,28.2,19.5,28.3,19.5C28.3,19.5,28.3,19.5,28.3,19.5z M28.3,19.9C28.4,19.9,28.4,19.9,28.3,19.9
31 - c0.1,0,0.1,0,0.1,0c0,0,0,0,0,0c0,0,0,0,0-0.1c0,0,0,0,0-0.1c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0-0.1,0c0,0,0,0-0.1,0c0,0,0,0,0,0
32 - c0,0,0,0,0,0c0,0,0,0,0,0.1c0,0,0,0,0,0.1c0,0,0,0,0,0C28.2,19.8,28.3,19.8,28.3,19.9C28.3,19.9,28.3,19.9,28.3,19.9z M28.3,19.6
33 - C28.4,19.6,28.4,19.6,28.3,19.6C28.4,19.6,28.4,19.7,28.3,19.6C28.4,19.7,28.4,19.7,28.3,19.6c0,0.1,0,0.1,0,0.1l0.1,0.1h0
34 - l-0.1-0.1h0v0.1h0L28.3,19.6L28.3,19.6L28.3,19.6z M28.3,19.7L28.3,19.7L28.3,19.7C28.4,19.7,28.4,19.7,28.3,19.7
35 - C28.4,19.7,28.4,19.7,28.3,19.7C28.4,19.7,28.4,19.7,28.3,19.7C28.4,19.7,28.4,19.7,28.3,19.7L28.3,19.7z M23.7,18.8v-1h-0.4v0.2
36 - c-0.1-0.2-0.4-0.3-0.6-0.3c-0.5,0-1,0.4-1,1s0.4,1,1,1c0.3,0,0.5-0.1,0.6-0.3v0.2h0.4V18.8z M22.2,18.8c0-0.4,0.2-0.7,0.6-0.7
37 - c0.4,0,0.6,0.3,0.6,0.7s-0.2,0.7-0.6,0.7C22.4,19.5,22.2,19.2,22.2,18.8L22.2,18.8z M27.6,18.8v-1.7h-0.4v1
38 - c-0.1-0.2-0.4-0.3-0.6-0.3c-0.5,0-1,0.4-1,1s0.4,1,1,1c0.3,0,0.5-0.1,0.6-0.3v0.2h0.4V18.8z M26.1,18.8c0-0.4,0.2-0.7,0.6-0.7
39 - c0.4,0,0.6,0.3,0.6,0.7s-0.2,0.7-0.6,0.7C26.3,19.5,26.1,19.2,26.1,18.8z"/>
40 - <g id="XMLID_4571_">
41 - <rect id="XMLID_4635_" x="13.5" y="3.2" class="st1" width="7" height="11.4"/>
42 - <path id="XMLID_4576_" class="st2" d="M14.2,8.9c0-2.3,1.1-4.4,2.8-5.7c-1.2-1-2.8-1.6-4.5-1.6c-4,0-7.3,3.3-7.3,7.3
43 - c0,4,3.3,7.3,7.3,7.3c1.7,0,3.3-0.6,4.5-1.6C15.3,13.3,14.2,11.2,14.2,8.9z"/>
44 - <path id="XMLID_4707_" class="st3" d="M28.1,13.4v-0.2h0.1v0h-0.2v0H28L28.1,13.4L28.1,13.4z M28.5,13.4v-0.3h-0.1l-0.1,0.2
45 - l-0.1-0.2h-0.1v0.3h0.1v-0.2l0.1,0.2h0.1l0.1-0.2L28.5,13.4L28.5,13.4L28.5,13.4z"/>
46 - <path id="XMLID_4631_" class="st3" d="M28.8,8.9c0,4-3.3,7.3-7.3,7.3c-1.7,0-3.3-0.6-4.5-1.6c1.7-1.3,2.8-3.4,2.8-5.7
47 - c0-2.3-1.1-4.4-2.8-5.7c1.2-1,2.8-1.6,4.5-1.6C25.5,1.6,28.8,4.9,28.8,8.9z"/>
48 - </g>
49 -</g>
50 -</svg>
1 -<?xml version="1.0" encoding="iso-8859-1"?>
2 -<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3 -<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4 - viewBox="0 0 504 504" style="enable-background:new 0 0 504 504;" xml:space="preserve">
5 -<path style="fill:#139AD6;" d="M389.6,221.2h-27.2c-1.6,0-3.2,1.6-4,3.2l-11.2,70.4c0,1.6,0.8,2.4,2.4,2.4H364
6 - c1.6,0,2.4-0.8,2.4-2.4l3.2-20c0-1.6,1.6-3.2,4-3.2h8.8c18.4,0,28.8-8.8,31.2-26.4c1.6-7.2,0-13.6-3.2-17.6
7 - C405.6,223.6,398.4,221.2,389.6,221.2 M392.8,247.6c-1.6,9.6-8.8,9.6-16,9.6H372l3.2-18.4c0-0.8,0.8-1.6,2.4-1.6h1.6
8 - c4.8,0,9.6,0,12,3.2C392.8,241.2,392.8,243.6,392.8,247.6"/>
9 -<g>
10 - <path style="fill:#263B80;" d="M193.6,221.2h-27.2c-1.6,0-3.2,1.6-4,3.2l-11.2,70.4c0,1.6,0.8,2.4,2.4,2.4h12.8
11 - c1.6,0,3.2-1.6,4-3.2l3.2-19.2c0-1.6,1.6-3.2,4-3.2h8.8c18.4,0,28.8-8.8,31.2-26.4c1.6-7.2,0-13.6-3.2-17.6
12 - C209.6,223.6,203.2,221.2,193.6,221.2 M196.8,247.6c-1.6,9.6-8.8,9.6-16,9.6h-4l3.2-18.4c0-0.8,0.8-1.6,2.4-1.6h1.6
13 - c4.8,0,9.6,0,12,3.2C196.8,241.2,197.6,243.6,196.8,247.6"/>
14 - <path style="fill:#263B80;" d="M276,246.8h-12.8c-0.8,0-2.4,0.8-2.4,1.6l-0.8,4l-0.8-1.6c-3.2-4-8.8-5.6-15.2-5.6
15 - c-14.4,0-27.2,11.2-29.6,26.4c-1.6,8,0.8,15.2,4.8,20s9.6,6.4,16.8,6.4c12,0,18.4-7.2,18.4-7.2l-0.8,4c0,1.6,0.8,2.4,2.4,2.4h12
16 - c1.6,0,3.2-1.6,4-3.2l7.2-44.8C278.4,248.4,276.8,246.8,276,246.8 M257.6,272.4c-1.6,7.2-7.2,12.8-15.2,12.8c-4,0-7.2-1.6-8.8-3.2
17 - c-1.6-2.4-2.4-5.6-2.4-9.6c0.8-7.2,7.2-12.8,14.4-12.8c4,0,6.4,1.6,8.8,3.2C256.8,265.2,257.6,269.2,257.6,272.4"/>
18 -</g>
19 -<path style="fill:#139AD6;" d="M471.2,246.8h-12.8c-0.8,0-2.4,0.8-2.4,1.6l-0.8,4l-0.8-1.6c-3.2-4-8.8-5.6-15.2-5.6
20 - c-14.4,0-27.2,11.2-29.6,26.4c-1.6,8,0.8,15.2,4.8,20s9.6,6.4,16.8,6.4c12,0,18.4-7.2,18.4-7.2l-0.8,4c0,1.6,0.8,2.4,2.4,2.4h12
21 - c1.6,0,3.2-1.6,4-3.2l7.2-44.8C473.6,248.4,472.8,246.8,471.2,246.8 M452.8,272.4c-1.6,7.2-7.2,12.8-15.2,12.8c-4,0-7.2-1.6-8.8-3.2
22 - c-1.6-2.4-2.4-5.6-2.4-9.6c0.8-7.2,7.2-12.8,14.4-12.8c4,0,6.4,1.6,8.8,3.2C452.8,265.2,453.6,269.2,452.8,272.4"/>
23 -<path style="fill:#263B80;" d="M345.6,246.8H332c-1.6,0-2.4,0.8-3.2,1.6l-17.6,27.2l-8-25.6c-0.8-1.6-1.6-2.4-4-2.4h-12.8
24 - c-1.6,0-2.4,1.6-2.4,3.2l14.4,42.4l-13.6,19.2c-0.8,1.6,0,4,1.6,4h12.8c1.6,0,2.4-0.8,3.2-1.6l44-63.2
25 - C348.8,249.2,347.2,246.8,345.6,246.8"/>
26 -<path style="fill:#139AD6;" d="M486.4,223.6l-11.2,72c0,1.6,0.8,2.4,2.4,2.4h11.2c1.6,0,3.2-1.6,4-3.2l11.2-70.4
27 - c0-1.6-0.8-2.4-2.4-2.4h-12.8C488,221.2,487.2,222,486.4,223.6"/>
28 -<path style="fill:#263B80;" d="M92,197.2c-5.6-6.4-16-9.6-30.4-9.6h-40c-2.4,0-4.8,2.4-5.6,4.8L0,297.2c0,2.4,1.6,4,3.2,4H28
29 - l6.4-39.2v1.6c0.8-2.4,3.2-4.8,5.6-4.8h12c23.2,0,40.8-9.6,46.4-36c0-0.8,0-1.6,0-2.4c-0.8,0-0.8,0,0,0
30 - C99.2,210,97.6,203.6,92,197.2"/>
31 -<path style="fill:#139AD6;" d="M97.6,220.4L97.6,220.4c0,0.8,0,1.6,0,2.4c-5.6,27.2-23.2,36-46.4,36h-12c-2.4,0-4.8,2.4-5.6,4.8
32 - l-8,48.8c0,1.6,0.8,3.2,3.2,3.2h20.8c2.4,0,4.8-1.6,4.8-4v-0.8l4-24.8v-1.6c0-2.4,2.4-4,4.8-4h3.2c20,0,36-8,40-32
33 - c1.6-9.6,0.8-18.4-4-24C101.6,222.8,100,221.2,97.6,220.4"/>
34 -<path style="fill:#232C65;" d="M92,218c-0.8,0-1.6-0.8-2.4-0.8s-1.6,0-2.4-0.8c-3.2-0.8-6.4-0.8-10.4-0.8H45.6c-0.8,0-1.6,0-2.4,0.8
35 - c-1.6,0.8-2.4,2.4-2.4,4L34.4,262v1.6c0.8-2.4,3.2-4.8,5.6-4.8h12c23.2,0,40.8-9.6,46.4-36c0-0.8,0-1.6,0.8-2.4
36 - c-1.6-0.8-2.4-1.6-4-1.6C92.8,218,92.8,218,92,218"/>
37 -<g>
38 -</g>
39 -<g>
40 -</g>
41 -<g>
42 -</g>
43 -<g>
44 -</g>
45 -<g>
46 -</g>
47 -<g>
48 -</g>
49 -<g>
50 -</g>
51 -<g>
52 -</g>
53 -<g>
54 -</g>
55 -<g>
56 -</g>
57 -<g>
58 -</g>
59 -<g>
60 -</g>
61 -<g>
62 -</g>
63 -<g>
64 -</g>
65 -<g>
66 -</g>
67 -</svg>
1 -<?xml version="1.0" encoding="iso-8859-1"?>
2 -<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3 -<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4 - viewBox="0 0 504 504" style="enable-background:new 0 0 504 504;" xml:space="preserve">
5 -<polygon style="fill:#3C58BF;" points="184.8,324.4 210.4,180.4 250.4,180.4 225.6,324.4 "/>
6 -<polygon style="fill:#293688;" points="184.8,324.4 217.6,180.4 250.4,180.4 225.6,324.4 "/>
7 -<path style="fill:#3C58BF;" d="M370.4,182c-8-3.2-20.8-6.4-36.8-6.4c-40,0-68.8,20-68.8,48.8c0,21.6,20,32.8,36,40
8 - s20.8,12,20.8,18.4c0,9.6-12.8,14.4-24,14.4c-16,0-24.8-2.4-38.4-8l-5.6-2.4l-5.6,32.8c9.6,4,27.2,8,45.6,8
9 - c42.4,0,70.4-20,70.4-50.4c0-16.8-10.4-29.6-34.4-40c-14.4-7.2-23.2-11.2-23.2-18.4c0-6.4,7.2-12.8,23.2-12.8
10 - c13.6,0,23.2,2.4,30.4,5.6l4,1.6L370.4,182L370.4,182z"/>
11 -<path style="fill:#293688;" d="M370.4,182c-8-3.2-20.8-6.4-36.8-6.4c-40,0-61.6,20-61.6,48.8c0,21.6,12.8,32.8,28.8,40
12 - s20.8,12,20.8,18.4c0,9.6-12.8,14.4-24,14.4c-16,0-24.8-2.4-38.4-8l-5.6-2.4l-5.6,32.8c9.6,4,27.2,8,45.6,8
13 - c42.4,0,70.4-20,70.4-50.4c0-16.8-10.4-29.6-34.4-40c-14.4-7.2-23.2-11.2-23.2-18.4c0-6.4,7.2-12.8,23.2-12.8
14 - c13.6,0,23.2,2.4,30.4,5.6l4,1.6L370.4,182L370.4,182z"/>
15 -<path style="fill:#3C58BF;" d="M439.2,180.4c-9.6,0-16.8,0.8-20.8,10.4l-60,133.6h43.2l8-24h51.2l4.8,24H504l-33.6-144H439.2z
16 - M420.8,276.4c2.4-7.2,16-42.4,16-42.4s3.2-8.8,5.6-14.4l2.4,13.6c0,0,8,36,9.6,44h-33.6V276.4z"/>
17 -<path style="fill:#293688;" d="M448.8,180.4c-9.6,0-16.8,0.8-20.8,10.4l-69.6,133.6h43.2l8-24h51.2l4.8,24H504l-33.6-144H448.8z
18 - M420.8,276.4c3.2-8,16-42.4,16-42.4s3.2-8.8,5.6-14.4l2.4,13.6c0,0,8,36,9.6,44h-33.6V276.4z"/>
19 -<path style="fill:#3C58BF;" d="M111.2,281.2l-4-20.8c-7.2-24-30.4-50.4-56-63.2l36,128h43.2l64.8-144H152L111.2,281.2z"/>
20 -<path style="fill:#293688;" d="M111.2,281.2l-4-20.8c-7.2-24-30.4-50.4-56-63.2l36,128h43.2l64.8-144H160L111.2,281.2z"/>
21 -<path style="fill:#FFBC00;" d="M0,180.4l7.2,1.6c51.2,12,86.4,42.4,100,78.4l-14.4-68c-2.4-9.6-9.6-12-18.4-12H0z"/>
22 -<path style="fill:#F7981D;" d="M0,180.4L0,180.4c51.2,12,93.6,43.2,107.2,79.2l-13.6-56.8c-2.4-9.6-10.4-15.2-19.2-15.2L0,180.4z"/>
23 -<path style="fill:#ED7C00;" d="M0,180.4L0,180.4c51.2,12,93.6,43.2,107.2,79.2l-9.6-31.2c-2.4-9.6-5.6-19.2-16.8-23.2L0,180.4z"/>
24 -<g>
25 - <path style="fill:#051244;" d="M151.2,276.4L124,249.2l-12.8,30.4l-3.2-20c-7.2-24-30.4-50.4-56-63.2l36,128h43.2L151.2,276.4z"/>
26 - <polygon style="fill:#051244;" points="225.6,324.4 191.2,289.2 184.8,324.4 "/>
27 - <path style="fill:#051244;" d="M317.6,274.8L317.6,274.8c3.2,3.2,4.8,5.6,4,8.8c0,9.6-12.8,14.4-24,14.4c-16,0-24.8-2.4-38.4-8
28 - l-5.6-2.4l-5.6,32.8c9.6,4,27.2,8,45.6,8c25.6,0,46.4-7.2,58.4-20L317.6,274.8z"/>
29 - <path style="fill:#051244;" d="M364,324.4h37.6l8-24h51.2l4.8,24H504L490.4,266l-48-46.4l2.4,12.8c0,0,8,36,9.6,44h-33.6
30 - c3.2-8,16-42.4,16-42.4s3.2-8.8,5.6-14.4"/>
31 -</g>
32 -<g>
33 -</g>
34 -<g>
35 -</g>
36 -<g>
37 -</g>
38 -<g>
39 -</g>
40 -<g>
41 -</g>
42 -<g>
43 -</g>
44 -<g>
45 -</g>
46 -<g>
47 -</g>
48 -<g>
49 -</g>
50 -<g>
51 -</g>
52 -<g>
53 -</g>
54 -<g>
55 -</g>
56 -<g>
57 -</g>
58 -<g>
59 -</g>
60 -<g>
61 -</g>
62 -</svg>
1 -<?xml version="1.0" encoding="utf-8"?>
2 -<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3 -<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4 - viewBox="0 0 960 960" style="enable-background:new 0 0 960 960;" xml:space="preserve">
5 -<style type="text/css">
6 - .st0{fill:#05A5D1;}
7 -</style>
8 -<g id="XMLID_17_">
9 - <path id="XMLID_21_" class="st0" d="M960.2,478.3c0-63.5-79.5-123.7-201.5-161C786.8,193,774.3,94.1,719.2,62.4
10 - c-12.7-7.4-27.6-10.9-43.8-10.9v43.6c9,0,16.2,1.8,22.3,5.1c26.6,15.2,38.1,73.3,29.1,147.9c-2.1,18.4-5.7,37.7-10,57.5
11 - c-38.3-9.4-80.1-16.6-124.1-21.3c-26.4-36.2-53.7-69-81.3-97.7c63.7-59.2,123.5-91.7,164.2-91.7V51.3l0,0
12 - c-53.7,0-124.1,38.3-195.2,104.8c-71.1-66.1-141.5-104-195.2-104v43.6c40.5,0,100.5,32.2,164.2,91.1
13 - c-27.4,28.7-54.7,61.4-80.7,97.5c-44.2,4.7-86,11.9-124.3,21.5c-4.5-19.5-7.8-38.5-10.2-56.7c-9.2-74.7,2.1-132.7,28.5-148.1
14 - c5.9-3.5,13.5-5.1,22.5-5.1V52.3l0,0c-16.4,0-31.3,3.5-44.2,10.9c-54.9,31.7-67.2,130.4-38.9,254.3C80.5,355,1.4,415,1.4,478.3
15 - c0,63.5,79.5,123.7,201.5,161c-28.1,124.3-15.6,223.2,39.5,254.8c12.7,7.4,27.6,10.9,44,10.9c53.7,0,124.1-38.3,195.2-104.8
16 - c71.1,66.1,141.5,104,195.2,104c16.4,0,31.3-3.5,44.2-10.9c54.9-31.7,67.2-130.4,38.9-254.3C881,601.8,960.2,541.6,960.2,478.3z
17 - M705.7,348c-7.2,25.2-16.2,51.2-26.4,77.2c-8-15.6-16.4-31.3-25.6-46.9c-9-15.6-18.6-30.9-28.1-45.7
18 - C653.4,336.6,680.1,341.7,705.7,348z M616.2,556.1c-15.2,26.4-30.9,51.4-47.1,74.7c-29.1,2.5-58.6,3.9-88.3,3.9
19 - c-29.5,0-59-1.4-87.9-3.7c-16.2-23.3-32.1-48.1-47.3-74.3c-14.9-25.6-28.3-51.6-40.7-77.8c12.1-26.2,25.8-52.4,40.5-78
20 - c15.2-26.4,30.9-51.4,47.1-74.7c29.1-2.5,58.6-3.9,88.3-3.9c29.5,0,59,1.4,87.9,3.7c16.2,23.3,32.1,48.1,47.3,74.3
21 - c14.9,25.6,28.3,51.6,40.7,77.8C644.4,504.3,630.9,530.5,616.2,556.1z M679.4,530.7c10.6,26.2,19.5,52.4,27,77.8
22 - c-25.6,6.3-52.6,11.5-80.5,15.6c9.6-15,19.2-30.5,28.1-46.3C662.9,562.2,671.3,546.3,679.4,530.7z M481.2,739.2
23 - c-18.2-18.8-36.4-39.7-54.3-62.5c17.6,0.8,35.6,1.4,53.7,1.4c18.4,0,36.5-0.4,54.3-1.4C517.3,699.5,499.2,720.5,481.2,739.2z
24 - M335.8,624.1c-27.8-4.1-54.5-9.2-80.1-15.4c7.2-25.2,16.2-51.2,26.4-77.2c8,15.6,16.4,31.3,25.6,46.9
25 - C316.8,594,326.2,609.3,335.8,624.1z M480.2,217.4c18.2,18.8,36.4,39.7,54.3,62.5c-17.6-0.8-35.6-1.4-53.7-1.4
26 - c-18.4,0-36.5,0.4-54.3,1.4C444.1,257.1,462.2,236.2,480.2,217.4z M335.6,332.5c-9.6,15-19.2,30.5-28.1,46.3
27 - c-9,15.6-17.4,31.3-25.4,46.9c-10.6-26.2-19.5-52.4-27-77.8C280.7,341.9,307.6,336.6,335.6,332.5z M158.7,577.2
28 - C89.5,547.7,44.8,509,44.8,478.3s44.8-69.6,113.9-98.9c16.8-7.2,35.2-13.7,54.1-19.7c11.1,38.3,25.8,78.2,44,119
29 - c-18,40.7-32.4,80.3-43.4,118.4C194.1,591.1,175.7,584.4,158.7,577.2z M263.9,856.5c-26.6-15.2-38.1-73.3-29.1-147.9
30 - c2.1-18.4,5.7-37.7,10-57.5c38.3,9.4,80.1,16.6,124.1,21.3c26.4,36.2,53.7,69,81.3,97.7c-63.7,59.2-123.5,91.7-164.2,91.7
31 - C277.2,861.6,269.7,859.8,263.9,856.5z M727.4,707.6c9.2,74.7-2.1,132.7-28.5,148.1c-5.9,3.5-13.5,5.1-22.5,5.1
32 - c-40.5,0-100.5-32.2-164.2-91.1c27.4-28.7,54.7-61.4,80.7-97.5c44.2-4.7,86-11.9,124.3-21.5C721.8,670.4,725.3,689.4,727.4,707.6z
33 - M802.7,577.2c-16.8,7.2-35.2,13.7-54.1,19.7c-11.1-38.3-25.8-78.2-44-119c18-40.7,32.4-80.3,43.4-118.4
34 - c19.3,6.1,37.7,12.7,54.9,19.9c69.2,29.5,113.9,68.2,113.9,98.9C916.6,509,871.9,547.9,802.7,577.2z"/>
35 - <path id="XMLID_3_" class="st0" d="M285,52.1L285,52.1L285,52.1z"/>
36 - <circle id="XMLID_2_" class="st0" cx="480.6" cy="478.3" r="89.3"/>
37 - <path id="XMLID_1_" class="st0" d="M675.3,51.5L675.3,51.5L675.3,51.5z"/>
38 -</g>
39 -</svg>
1 -<?xml version="1.0" encoding="UTF-8"?>
2 -<svg version="1.1" viewBox="0 0 261.76 226.69" xmlns="http://www.w3.org/2000/svg"><g transform="matrix(1.3333 0 0 -1.3333 -76.311 313.34)"><g transform="translate(178.06 235.01)"><path d="m0 0-22.669-39.264-22.669 39.264h-75.491l98.16-170.02 98.16 170.02z" fill="#41b883"/></g><g transform="translate(178.06 235.01)"><path d="m0 0-22.669-39.264-22.669 39.264h-36.227l58.896-102.01 58.896 102.01z" fill="#34495e"/></g></g></svg>
1 -import 'expose-loader?jQuery!jquery' // eslint-disable-line
2 -import 'expose-loader?$!jquery' // eslint-disable-line
3 import React from 'react'; 1 import React from 'react';
4 import ReactDOM from 'react-dom'; 2 import ReactDOM from 'react-dom';
5 import { createStore, applyMiddleware } from 'redux'; 3 import { createStore, applyMiddleware } from 'redux';
6 import { Provider } from 'react-redux' 4 import { Provider } from 'react-redux'
7 import ReduxThunk from 'redux-thunk' 5 import ReduxThunk from 'redux-thunk'
8 -import * as serviceWorker from './serviceWorker';
9 import axios from 'axios'; 6 import axios from 'axios';
10 7
11 import App from './components/App'; 8 import App from './components/App';
12 import config from './config'; 9 import config from './config';
13 import reducers from './reducers'; 10 import reducers from './reducers';
14 -import * as $ from 'jquery'
15 -window.jQuery = window.$ = $;
16 11
17 axios.defaults.baseURL = config.baseURLApi; 12 axios.defaults.baseURL = config.baseURLApi;
18 axios.defaults.headers.common['Content-Type'] = "application/json"; 13 axios.defaults.headers.common['Content-Type'] = "application/json";
19 -const token = localStorage.getItem('token');
20 -if (token) {
21 - axios.defaults.headers.common['Authorization'] = "Bearer " + token;
22 -}
23 14
24 const store = createStore( 15 const store = createStore(
25 reducers, 16 reducers,
...@@ -32,8 +23,3 @@ ReactDOM.render( ...@@ -32,8 +23,3 @@ ReactDOM.render(
32 </Provider>, 23 </Provider>,
33 document.getElementById('root') 24 document.getElementById('root')
34 ); 25 );
35 -
36 -// If you want your app to work offline and load faster, you can change
37 -// unregister() to register() below. Note this comes with some pitfalls.
38 -// Learn more about service workers: http://bit.ly/CRA-PWA
39 -serviceWorker.unregister();
......
1 -@import '../../styles/app';
2 -
3 -.sidesWrapper {
4 - display: flex;
5 - flex-wrap: wrap;
6 -}
7 -
8 -.analyticsSide {
9 - width: 80%;
10 -
11 - &:last-child {
12 - width: 20%;
13 - padding-left: $grid-gutter-width;
14 - }
15 -
16 - @media (max-width: 1620px) {
17 - width: 100% !important;
18 -
19 - &:last-child {
20 - padding-left: 0;
21 - }
22 - }
23 -
24 - @media (min-width: 1200px) and (max-width: 1440px) {
25 - .lastSideElement {
26 - max-width: 50%;
27 - }
28 - }
29 -
30 - @media (min-width: 1440px) and (max-width: 1620px) {
31 - .lastSideElement {
32 - max-width: 1 / 3 * 100%;
33 - }
34 - }
35 -}
36 -
37 -.visitElement {
38 - h6 {
39 - font-size: 115%;
40 - }
41 -}
42 -
43 -.sparklineWrapper {
44 - display: flex;
45 - justify-content: center;
46 - min-width: calc(100% - 150px);
47 -}
48 -
49 -.notifications {
50 - :global .la {
51 - font-size: $font-size-lg;
52 - margin-top: 0.15rem;
53 - }
54 -
55 - p {
56 - margin-bottom: 1.4rem;
57 - }
58 -}
59 -
60 -:global .legendColorBox div {
61 - border-radius: 50%;
62 -}
1 -import React, { Component } from 'react';
2 -import PropTypes from 'prop-types';
3 -import { connect } from 'react-redux';
4 -import cx from 'classnames';
5 -import { Col, Row, Progress } from 'reactstrap';
6 -
7 -import Widget from '../../components/Widget';
8 -import RevenueChart from './components/Charts/RevenueChart';
9 -import LineChart from './components/Charts/LineChart';
10 -import MainChart from './components/Charts/MainChart';
11 -import TaskContainer from './components/TaskContainer/TaskContainer';
12 -import BigStat from './components/BigStat/BigStat';
13 -import TableContainer from './components/TableContainer/TableContainer';
14 -import Calendar from '../dashboard/components/calendar/Calendar';
15 -
16 -import mock from './mock';
17 -import s from './Analitycs.module.scss';
18 -import { receiveDataRequest } from '../../actions/analytics';
19 -
20 -class Analytics extends Component {
21 - static propTypes = {
22 - visits: PropTypes.any,
23 - performance: PropTypes.any,
24 - server: PropTypes.any,
25 - revenue: PropTypes.any,
26 - mainChart: PropTypes.any,
27 - isReceiving: PropTypes.bool,
28 - dispatch: PropTypes.func.isRequired,
29 - };
30 -
31 - static defaultProps = {
32 - visits: {},
33 - performance: {},
34 - server: {},
35 - revenue: [],
36 - mainChart: [],
37 - isReceiving: false
38 - };
39 -
40 - componentDidMount() {
41 - this.props.dispatch(receiveDataRequest());
42 - }
43 -
44 - render() {
45 - const { visits, isReceiving, performance, server, revenue, mainChart } = this.props;
46 - return (
47 - <div>
48 - <h1 className="page-title mb-xlg mt-lg">Analytics <small>Company performance</small></h1>
49 - <div className={s.sidesWrapper}>
50 - <div className={s.analyticsSide}>
51 - <Row>
52 - <Col xs={12} xl={3} md={6}>
53 - <div className="pb-xlg h-100">
54 - <Widget
55 - className="mb-0 h-100"
56 - close
57 - bodyClass="mt-lg"
58 - fetchingData={isReceiving}
59 - title={<h5 style={{ color: "#757575" }}>Visits Today</h5>}
60 - >
61 - <div className="d-flex justify-content-between align-items-center mb">
62 - <h2 style={{fontSize: '2.1rem'}}>{visits.count}</h2>
63 - <i className="la la-arrow-right text-success rotate-315"/>
64 - </div>
65 - <div className="d-flex flex-wrap justify-content-between">
66 - <div className={cx('mt', s.visitElement)}>
67 - <h6>+{visits.logins}</h6>
68 - <p className="text-muted mb-0 mr">
69 - <small>Logins</small>
70 - </p>
71 - </div>
72 - <div className={cx('mt', s.visitElement)}>
73 - <h6>{visits.sign_out_pct}%</h6>
74 - <p className="text-muted mb-0">
75 - <small>Sign Out</small>
76 - </p>
77 - </div>
78 - <div className={cx('mt', s.visitElement)}>
79 - <h6>{visits.rate_pct}%</h6>
80 - <p className="text-muted mb-0 mr">
81 - <small>Rate</small>
82 - </p>
83 - </div>
84 - </div>
85 - </Widget>
86 - </div>
87 - </Col>
88 - <Col xs={12} xl={3} md={6}>
89 - <div className="pb-xlg h-100">
90 - <Widget
91 - bodyClass="mt"
92 - close
93 - className="mb-0 h-100"
94 - fetchingData={isReceiving}
95 - title={<h5 style={{ color: "#757575" }}>Revenue Breakdown</h5>}
96 - >
97 - <RevenueChart data={revenue} />
98 - </Widget>
99 - </div>
100 - </Col>
101 - <Col xs={12} xl={3} md={6}>
102 - <div className="pb-xlg h-100">
103 - <Widget
104 - bodyClass="mt"
105 - close
106 - className="mb-0 h-100"
107 - fetchingData={isReceiving}
108 - title={<h5 style={{ color: "#757575" }}>App Performance</h5>}
109 - >
110 - <p className="text-muted d-flex flex-wrap">
111 - <small className="mr-lg d-flex align-items-center">
112 - <span className="circle bg-success text-success mr-xs" style={{ fontSize: '4px' }}>.</span>
113 - This Period
114 - </small>
115 - <small className="mr-lg d-flex align-items-center">
116 - <span className="circle bg-warning text-warning mr-xs" style={{ fontSize: '4px' }}>.</span>
117 - Last Period
118 - </small>
119 - </p>
120 - <h6 className="fs-sm text-muted">SDK</h6>
121 - <Progress color="success" className="progress-xs" style={{height: '3px', marginBottom: '5px'}}
122 - value={performance.sdk?.this_period_pct}/>
123 - <Progress color="warning" className="progress-xs" style={{height: '3px'}}
124 - value={performance.sdk?.last_period_pct}/>
125 - <h6 className="mt fs-sm text-muted">Integration</h6>
126 - <Progress color="success" className="progress-xs" style={{height: '3px', marginBottom: '5px'}}
127 - value={performance.integration?.this_period_pct}/>
128 - <Progress color="warning" className="progress-xs" style={{height: '3px'}}
129 - value={performance.integration?.last_period_pct}/>
130 - </Widget>
131 - </div>
132 - </Col>
133 - <Col xs={12} xl={3} md={6}>
134 - <div className="pb-xlg h-100">
135 - <Widget
136 - bodyClass="mt-lg"
137 - close
138 - className="mb-0 h-100"
139 - fetchingData={isReceiving}
140 - title={<h5 style={{ color: "#757575" }}>Server Overview</h5>}
141 - >
142 - <div className="d-flex justify-content-between flex-wrap mb-sm">
143 - <p className="width-150"><small>{server[1]?.pct}% <span style={{ color: '#a3aeb7' }}>/</span> {server[1]?.temp}°С <span style={{ color: '#a3aeb7' }}>/</span> {server[1]?.frequency} Ghz</small></p>
144 - <div className={s.sparklineWrapper}>
145 - <LineChart color="#ffc247" />
146 - </div>
147 - </div>
148 - <div className="d-flex justify-content-between flex-wrap mb-sm">
149 - <p className="width-150"><small>{server[2]?.pct}% <span style={{ color: '#a3aeb7' }}>/</span> {server[2]?.temp}°С <span style={{ color: '#a3aeb7' }}>/</span> {server[2]?.frequency} Ghz</small></p>
150 - <div className={s.sparklineWrapper}>
151 - <LineChart color="#9964e3" />
152 - </div>
153 - </div>
154 - </Widget>
155 - </div>
156 - </Col>
157 - <Col xs={12}>
158 - <MainChart data={mainChart} isReceiving={isReceiving} />
159 - </Col>
160 - <Col xs={12} lg={6} xl={4}>
161 - <BigStat {...mock.bigStat[0]} />
162 - </Col>
163 - <Col xs={12} lg={6} xl={4}>
164 - <BigStat {...mock.bigStat[1]} />
165 - </Col>
166 - <Col xs={12} lg={6} xl={4}>
167 - <BigStat {...mock.bigStat[2]} />
168 - </Col>
169 - <Col xs={12} className="mb-lg">
170 - <Widget
171 - className="pb-0"
172 - bodyClass="p-0 mt"
173 - title={<h4> Support <strong>Requests</strong></h4>}
174 - close settings
175 - >
176 - <TableContainer data={mock.table} />
177 - </Widget>
178 - </Col>
179 - </Row>
180 - </div>
181 - <div className={s.analyticsSide}>
182 - <Row>
183 - <Col xs={12} md={6} xl={12} className={s.lastSideElement}>
184 - <Widget className="mb-xlg" bodyClass="pb-0 mt-0">
185 - <Calendar white />
186 - </Widget>
187 - </Col>
188 - <Col xs={12} md={6} xl={12} className={s.lastSideElement}>
189 - <TaskContainer data={mock.tasks} />
190 - </Col>
191 - <Col xs={12} md={6} xl={12} className={s.lastSideElement}>
192 - <Widget
193 - className="widget"
194 - bodyClass={cx(s.notifications, 'w-100 mt-lg')}
195 - title={
196 - <h4>Notifications <span className="badge badge-pill badge-success fw-normal pull-right mt-xs">{mock.notifications.length}</span></h4>
197 - }
198 - >
199 - {mock.notifications.map(({ id, icon, color, content }) => (
200 - <div className="d-flex align-items-start" key={id}>
201 - <i className={`la la-${icon} mr text-${color}`} />
202 - <p
203 - className={cx({ 'mb-0': id === mock.notifications.length - 1 })}
204 - dangerouslySetInnerHTML={{ __html: content }}
205 - />
206 - </div>
207 - ))}
208 - </Widget>
209 - </Col>
210 - </Row>
211 - </div>
212 - </div>
213 - </div>
214 - );
215 - }
216 -}
217 -
218 -function mapStateToProps(state) {
219 - return {
220 - visits: state.analytics.visits,
221 - isReceiving: state.analytics.isReceiving,
222 - performance: state.analytics.performance,
223 - revenue: state.analytics.revenue,
224 - server: state.analytics.server,
225 - mainChart: state.analytics.mainChart,
226 - }
227 -}
228 -
229 -export default connect(mapStateToProps)(Analytics);
1 -import React, { Component } from 'react';
2 -import PropTypes from 'prop-types';
3 -import cx from 'classnames';
4 -import {
5 - UncontrolledButtonDropdown,
6 - DropdownToggle,
7 - DropdownMenu,
8 - DropdownItem,
9 -} from 'reactstrap';
10 -
11 -import Widget from '../../../../components/Widget';
12 -
13 -import s from './BigStat.module.scss';
14 -
15 -class BigStat extends Component {
16 - static propTypes = {
17 - product: PropTypes.string.isRequired,
18 - total: PropTypes.string.isRequired,
19 - registrations: PropTypes.shape({
20 - value: PropTypes.number,
21 - profit: PropTypes.bool,
22 - }).isRequired,
23 - bounce: PropTypes.shape({
24 - value: PropTypes.number,
25 - profit: PropTypes.bool,
26 - }).isRequired,
27 - color: PropTypes.string.isRequired,
28 - }
29 -
30 - state = { simpleSelectDropdownValue: 'Daily' }
31 -
32 - changeSelectDropdownSimple = (e) => {
33 - this.setState({ simpleSelectDropdownValue: e.currentTarget.textContent });
34 - }
35 -
36 - render() {
37 - const { product, total, registrations, bounce, color } = this.props;
38 - return (
39 - <div className="pb-xlg h-100">
40 - <Widget
41 - className="mb-0 h-100"
42 - bodyClass="p-0 mt"
43 - title={
44 - <div className="d-flex justify-content-between flex-wrap">
45 - <h4 className={cx('d-flex align-items-center pb-1', s.bigStatTitle)}>
46 - <span className={`circle bg-${color} mr-sm`} style={{ fontSize: '6px' }} />
47 - Statistic <span className="fw-normal ml-xs">{product}</span>
48 - </h4>
49 - <UncontrolledButtonDropdown className={s.dropdown}>
50 - <DropdownToggle
51 - caret color="default"
52 - className="dropdown-toggle-split mr-xs"
53 - >
54 - {this.state.simpleSelectDropdownValue}&nbsp;&nbsp;
55 - </DropdownToggle>
56 - <DropdownMenu>
57 - <DropdownItem onClick={this.changeSelectDropdownSimple}>
58 - Daily
59 - </DropdownItem>
60 - <DropdownItem onClick={this.changeSelectDropdownSimple}>
61 - Weekly
62 - </DropdownItem>
63 - <DropdownItem onClick={this.changeSelectDropdownSimple}>
64 - Monthly
65 - </DropdownItem>
66 - </DropdownMenu>
67 - </UncontrolledButtonDropdown>
68 - </div>
69 - }
70 - >
71 - <h4 className="fw-semi-bold mb-lg px-4">{total}</h4>
72 - <div className="d-flex border-top">
73 - <div className="w-50 border-right py-3 pr-2 pl-4">
74 - <div className="d-flex align-items-start">
75 - <h6>+{registrations.value}</h6>
76 - <i
77 - className={`la la-arrow-right ml-sm text-${registrations.profit ? 'success' : 'danger'}
78 - rotate-${registrations.profit ? '315' : '45'}`}
79 - />
80 - </div>
81 - <p className="text-muted mb-0 mr"><small>Registrations</small></p>
82 - </div>
83 - <div className="w-50 py-3 pl-2">
84 - <div className="d-flex align-items-start">
85 - <h6>{bounce.value}%</h6>
86 - <i
87 - className={`la la-arrow-right ml-sm text-${bounce.profit ? 'success' : 'danger'}
88 - rotate-${bounce.profit ? '315' : '45'}`}
89 - />
90 - </div>
91 - <p className="text-muted mb-0 mr"><small>Bounce Rate</small></p>
92 - </div>
93 - </div>
94 - </Widget>
95 - </div>
96 - );
97 - }
98 -}
99 -
100 -export default BigStat;
1 -.bigStatTitle {
2 - width: 220px;
3 - margin-right: 0.5rem;
4 -}
5 -
6 -.dropdown {
7 - :global {
8 - .dropdown-toggle {
9 - background-color: transparent !important;
10 - font-size: 90%;
11 - border-color: transparent;
12 -
13 - &:hover {
14 - border-color: #c4ccd4;
15 - background-color: transparent;
16 - }
17 -
18 - &:active,
19 - &:focus {
20 - background-color: transparent !important;
21 - }
22 - }
23 - }
24 -}
1 -import React, { PureComponent } from 'react';
2 -import PropTypes from 'prop-types';
3 -import $ from 'jquery';
4 -
5 -/* eslint-disable */
6 -import 'imports-loader?jQuery=jquery,this=>window!jquery-sparkline';
7 -/* eslint-enable */
8 -
9 -export default class LineChart extends PureComponent {
10 - static propTypes = {
11 - color: PropTypes.string.isRequired,
12 - }
13 -
14 - componentDidMount() {
15 - this.initChart(this.getData());
16 - }
17 -
18 - getData() { // eslint-disable-line
19 - const randomData = [];
20 -
21 - for (let i = 0; i < 150; i += 1) {
22 - randomData.push((i/9+Math.sin(i/6)*8+Math.random() * 2).toFixed(2));
23 - }
24 -
25 - return randomData;
26 - }
27 -
28 - initChart(data) {
29 - this.$chartContainer.sparkline(data, {
30 - type: 'line',
31 - lineWidth: 1.67,
32 - lineColor: this.props.color,
33 - normalRangeMin: '10px',
34 - width: '160px',
35 - height: '20px',
36 - fillColor: false,
37 - spotColor: false,
38 - minSpotColor: false,
39 - maxSpotColor: false,
40 - highlightSpotColor: false,
41 - highlightLineColor: false,
42 - drawNormalOnTop: false,
43 - tooltipClassname: 'line-chart-tooltip'
44 - });
45 - }
46 -
47 - render() {
48 - return (
49 - <div ref={(r) => { this.$chartContainer = $(r); }} />
50 - );
51 - }
52 -}
1 -import React, { PureComponent } from 'react';
2 -import PropTypes from 'prop-types';
3 -import $ from 'jquery';
4 -import {Row, Col} from "reactstrap";
5 -import Widget from "../../../../components/Widget";
6 -
7 -/* eslint-disable */
8 -import 'imports-loader?jQuery=jquery,this=>window!flot';
9 -import 'imports-loader?jQuery=jquery,this=>window!flot.dashes/jquery.flot.dashes';
10 -import 'imports-loader?jQuery=jquery,this=>window!jquery.flot.animator/jquery.flot.animator';
11 -/* eslint-enable */
12 -
13 -export default class RevenueChart extends PureComponent {
14 - static propTypes = {
15 - data: PropTypes.any.isRequired,
16 - isReceiving: PropTypes.bool
17 - };
18 -
19 - static defaultProps = {
20 - data: [],
21 - isReceiving: false
22 - };
23 -
24 - componentDidMount() {
25 - window.addEventListener('resize', this.initChart.bind(this));
26 - }
27 -
28 - componentDidUpdate() {
29 - const {data} = this.props;
30 - if (data.length) {
31 - this.initChart();
32 - this.initEventListeners();
33 - }
34 - }
35 -
36 - componentWillUnmount() {
37 - window.removeEventListener('resize', this.initChart.bind(this));
38 - }
39 -
40 - onDrawHook() {
41 - this.$chartLegend
42 - .find('.legendColorBox > div')
43 - .css({
44 - border: 0,
45 - borderRadius: 0,
46 - paddingTop: 5
47 - })
48 - .children('div')
49 - .css({
50 - borderWidth: 1,
51 - borderRadius: 0,
52 - width: 50,
53 - });
54 -
55 - this.$chartLegend.find('tbody td').css({
56 - paddingLeft: 10,
57 - paddingRight: 10,
58 - textAlign: 'center'
59 - });
60 -
61 - let labels = this.$chartLegend.find('.legendLabel').detach();
62 - this.$chartLegend.find('tbody').prepend('<tr></tr>');
63 - this.$chartLegend.find('tbody tr:eq(0)').append(labels);
64 - }
65 -
66 - initChart() {
67 - const {data} = this.props;
68 -
69 - const ticks = ['Dec 19', 'Dec 25', 'Dec 31', 'Jan 10', 'Jan 14',
70 - 'Jan 20', 'Jan 27', 'Jan 30', 'Feb 2', 'Feb 8', 'Feb 15',
71 - 'Feb 22', 'Feb 28', 'Mar 7', 'Mar 17'];
72 -
73 - // check the screen size and either show tick for every 4th tick on large screens, or
74 - // every 8th tick on mobiles
75 - const tickInterval = window.screen.width < 500 ? 10 : 6;
76 -
77 - if (this.$chartContainer.length > 0) {
78 - return $.plotAnimator(this.$chartContainer, [{
79 - label: 'Light Blue',
80 - data: data[0],
81 - lines: {
82 - show: true,
83 - fill: 0.3,
84 - lineWidth: 0,
85 - },
86 - points: {
87 - fillColor: '#A7BEFF',
88 - },
89 - shadowSize: 0,
90 - }, {
91 - label: 'RNS App',
92 - data: data[1],
93 - dashes: {
94 - show: true,
95 - lineWidth: 1.5,
96 - dashLength: [5, 2],
97 - },
98 - points: {
99 - fillColor: '#3abf94',
100 - },
101 - shadowSize: 0,
102 - }, {
103 - animator: {steps: 100, duration: 30 * 14, start: 0},
104 - label: 'Sing App',
105 - data: data[2],
106 - lines: {
107 - show: true,
108 - lineWidth: 1.5,
109 - },
110 - points: {
111 - fillColor: '#f55d5d',
112 -
113 - },
114 - shadowSize: 0,
115 - }], {
116 - xaxis: {
117 - tickColor: '#f8f9fa',
118 - tickSize: tickInterval,
119 - tickFormatter: i => ticks[i / tickInterval],
120 - font: {
121 - lineHeight: 11,
122 - weight: 400,
123 - },
124 - },
125 - yaxis: {
126 - tickColor: '#f8f9fa',
127 - max: 5,
128 - font: {
129 - lineHeight: 11,
130 - weight: 400,
131 - labelFontColor: 'red'
132 - },
133 - },
134 - points: {
135 - show: true,
136 - fill: true,
137 - lineWidth: 5,
138 - radius: 0,
139 - },
140 - grid: {
141 - backgroundColor: { colors: ['#ffffff', '#ffffff'] },
142 - borderWidth: 1,
143 - borderColor: '#ffffff',
144 - margin: 0,
145 - minBorderMargin: 0,
146 - labelMargin: 20,
147 - hoverable: true,
148 - clickable: true,
149 - mouseActiveRadius: 6,
150 - },
151 - legend: {
152 - noColumns: 3,
153 - container: this.$chartLegend,
154 - },
155 - colors: ['#E2E1FF', '#3abf94', '#ffc247'],
156 - hooks: {
157 - draw: [this.onDrawHook.bind(this)],
158 - },
159 - });
160 - }
161 - }
162 - initEventListeners() {
163 - const self = this;
164 -
165 - this.$chartContainer.on('plothover', (event, pos, item) => {
166 - if (item) {
167 - const x = item.datapoint[0].toFixed(2);
168 - const y = item.datapoint[1].toFixed(2);
169 -
170 - self.$chartTooltip.html(`${item.series.label} at ${x} : ${y}`)
171 - .css({
172 - top: (item.pageY + 5) - window.scrollY,
173 - left: (item.pageX + 5) - window.scrollX,
174 - })
175 - .fadeIn(200);
176 - } else {
177 - self.$chartTooltip.hide();
178 - }
179 - });
180 - }
181 -
182 - render() {
183 - return (
184 - <Widget
185 - bodyClass="mt"
186 - className="mb-xlg"
187 - fetchingData={this.props.isReceiving}
188 - title={
189 - <Row>
190 - <Col xs={12} sm={5}>
191 - <h5>
192 - Daily <span className="fw-semi-bold">Line Chart</span>
193 - </h5>
194 - </Col>
195 - <Col xs={12} sm={7}>
196 - <div className="d-flex justify-content-end">
197 - <div ref={(r) => {
198 - this.$chartLegend = $(r);
199 - }}/>
200 - </div>
201 - </Col>
202 - </Row>
203 - }
204 - >
205 - <div ref={(r) => { this.$chartContainer = $(r); }} style={{ width: '100%', height: '250px' }} />
206 - <div className="chart-tooltip" ref={(r) => { this.$chartTooltip = $(r); }} />
207 - </Widget>
208 - );
209 - }
210 -}
1 -import React, { PureComponent } from 'react';
2 -import PropTypes from 'prop-types';
3 -import $ from 'jquery';
4 -import { Row, Col } from 'reactstrap';
5 -
6 -/* eslint-disable */
7 -import 'imports-loader?jQuery=jquery,this=>window!flot';
8 -import 'imports-loader?jQuery=jquery,this=>window!flot/jquery.flot.pie';
9 -/* eslint-enable */
10 -
11 -export default class RevenueChart extends PureComponent {
12 - static propTypes = {
13 - data: PropTypes.any,
14 - };
15 -
16 - static defaultProps = {
17 - data: [],
18 - };
19 -
20 - componentDidMount() {
21 - this.initChart();
22 - window.addEventListener('resize', this.initChart.bind(this));
23 - }
24 -
25 - componentWillUnmount() {
26 - window.removeEventListener('resize', this.initChart.bind(this));
27 - }
28 -
29 - initChart() {
30 - $.plot(this.$chartContainer, this.props.data, {
31 - series: {
32 - pie: {
33 - innerRadius: 0.8,
34 - show: true,
35 - fill: 0.5,
36 - },
37 - },
38 - colors: ['#ffc247', '#f55d5d', '#9964e3'],
39 - legend: {
40 - noColumns: 1,
41 - container: this.$chartLegend,
42 - labelBoxBorderColor: '#ffffff',
43 - },
44 - });
45 - }
46 -
47 - render() {
48 - return (
49 - <Row>
50 - <Col xs={12} md={6} lg={7} className="text-center">
51 - <div ref={(r) => { this.$chartContainer = $(r); }} style={{ height: '100px' }} />
52 - </Col>
53 - <Col xs={12} md={5} lg={4} className="display-flex flex-column justify-content-center">
54 - <div ref={(r) => { this.$chartLegend = $(r); }} />
55 - </Col>
56 - </Row>
57 - );
58 - }
59 -}
1 -import React, { PureComponent } from 'react';
2 -import PropTypes from 'prop-types';
3 -import cx from 'classnames';
4 -import { Table, Button } from 'reactstrap';
5 -
6 -import s from './TableContainer.module.scss';
7 -
8 -const states = {
9 - sent: 'info',
10 - pending: 'success',
11 - declined: 'danger',
12 -};
13 -
14 -class TableContainer extends PureComponent {
15 - static propTypes = {
16 - data: PropTypes.arrayOf(
17 - PropTypes.shape({
18 - name: PropTypes.string,
19 - email: PropTypes.string,
20 - product: PropTypes.string,
21 - price: PropTypes.string,
22 - date: PropTypes.string,
23 - city: PropTypes.string,
24 - status: PropTypes.string,
25 - }),
26 - ).isRequired,
27 - }
28 -
29 - render() {
30 - const { data } = this.props;
31 - const keys = Object.keys(data[0]).map(i => i.toUpperCase());
32 - keys.shift(); // delete "id" key
33 - return (
34 - <Table className={cx('mb-0', s.table)} borderless responsive>
35 - <thead>
36 - <tr className="text-muted">
37 - {keys.map((key, index) => (
38 - index === 0
39 - ? <th key={key} scope="col"><span className="pl-2">{key}</span></th>
40 - : <th key={key} scope="col">{key}</th>
41 - ))}
42 - </tr>
43 - </thead>
44 - <tbody className="text-dark">
45 - {
46 - data.map(({ name, email, product, price, date, city, status }) => (
47 - <tr key={name}>
48 - <td className="pl-3 fw-normal">{name}</td>
49 - <td>{email}</td>
50 - <td>{product}</td>
51 - <td>{price}</td>
52 - <td>{date}</td>
53 - <td>{city}</td>
54 - <td>
55 - <Button
56 - color={states[status.toLowerCase()]}
57 - size="xs"
58 - className="px-2"
59 - >
60 - {status}
61 - </Button>
62 - </td>
63 - </tr>
64 - ))
65 - }
66 - </tbody>
67 - </Table>
68 - );
69 - }
70 -}
71 -
72 -export default TableContainer;
1 -@import '../../../../styles/app';
2 -
3 -.table {
4 - td,
5 - th {
6 - font-weight: normal;
7 - align-items: center;
8 - min-width: 100px;
9 - }
10 -
11 - th {
12 - font-size: $font-size-sm;
13 - }
14 -
15 - tbody tr:nth-child(odd) {
16 - background-color: $gray-light;
17 - }
18 -}
1 -import React, { PureComponent } from 'react';
2 -import PropTypes from 'prop-types';
3 -import cx from 'classnames';
4 -
5 -import s from './Task.module.scss';
6 -
7 -class Task extends PureComponent {
8 - static propTypes = {
9 - id: PropTypes.number.isRequired,
10 - index: PropTypes.number.isRequired,
11 - type: PropTypes.string.isRequired,
12 - title: PropTypes.string.isRequired,
13 - time: PropTypes.string.isRequired,
14 - completed: PropTypes.bool.isRequired,
15 - toggle: PropTypes.func.isRequired,
16 - }
17 -
18 - render() {
19 - const { id, type, title, time, completed, toggle, index } = this.props;
20 - return (
21 - <div className={cx('d-flex align-items-center mb', { [s.completed]: completed })} key={id}>
22 - <div className="form-check abc-checkbox abc-checkbox-success mb-sm d-flex">
23 - <input className="form-check-input" id={`checkbox${id}`} type="checkbox" onChange={() => toggle(index)} />
24 - <label className="form-check-label" htmlFor={`checkbox${id}`} />
25 - </div>
26 - <div className="task-content pl-2">
27 - <p className="text-muted mb-xs"><small>{type}</small></p>
28 - <h6>{title}</h6>
29 - <p className="text-muted mb-0"><small>{time}</small></p>
30 - </div>
31 - </div>
32 - );
33 - }
34 -}
35 -
36 -export default Task;
1 -.completed {
2 - p,
3 - h6 {
4 - opacity: 0.8;
5 - text-decoration: line-through;
6 - }
7 -}
1 -import React, { Component } from 'react';
2 -import PropTypes from 'prop-types';
3 -import { Button } from 'reactstrap';
4 -
5 -import Widget from '../../../../components/Widget';
6 -import Task from '../Task/Task';
7 -
8 -export default class TasksContainer extends Component {
9 - static propTypes = {
10 - data: PropTypes.arrayOf(
11 - PropTypes.shape({
12 - type: PropTypes.string,
13 - title: PropTypes.string,
14 - date: PropTypes.string,
15 - }),
16 - ).isRequired,
17 - }
18 -
19 - componentWillMount() {
20 - const tasks = this.props.data;
21 -
22 - tasks.map((task) => {
23 - task.completed = false;
24 - return task;
25 - });
26 -
27 - this.setState({ tasks });
28 - }
29 -
30 - toggleTaskState = (index) => {
31 - const newTasks = [...this.state.tasks];
32 -
33 - newTasks[index].completed = !this.state.tasks[index].completed;
34 -
35 - this.setState({ tasks: newTasks });
36 - }
37 -
38 - render() {
39 - const { tasks } = this.state;
40 - const totalCompleted = tasks.filter(i => i.completed).length;
41 - return (
42 - <Widget
43 - className="mb-xlg pb-2"
44 - bodyClass="task-container mt"
45 - title={
46 - <div>
47 - <h4>Today&apos;s Tasks <span className="badge badge-pill badge-success fw-normal pull-right mt-xs">{tasks.length}</span></h4>
48 - <p className="text-muted mb-0"><small>{totalCompleted} of {tasks.length} completed</small></p>
49 - </div>
50 - }
51 - >
52 - {tasks.map((item, index) =>
53 - <Task key={item.id} index={index} toggle={this.toggleTaskState} {...item} />)}
54 - <Button color="transparent" className="bg-white w-100 text-center text-primary">
55 - See All <i className="la la-arrow-down" />
56 - </Button>
57 - </Widget>
58 - );
59 - }
60 -}
1 -export default {
2 - tasks: [
3 - {
4 - id: 0,
5 - type: 'Meeting',
6 - title: 'Meeting with Andrew Piker',
7 - time: '9:00',
8 - },
9 - {
10 - id: 1,
11 - type: 'Call',
12 - title: 'Call with HT Company',
13 - time: '12:00',
14 - },
15 - {
16 - id: 2,
17 - type: 'Meeting',
18 - title: 'Meeting with Zoe Alison',
19 - time: '14:00',
20 - },
21 - {
22 - id: 3,
23 - type: 'Interview',
24 - title: 'Interview with HR',
25 - time: '15:00',
26 - },
27 - ],
28 - bigStat: [
29 - {
30 - product: 'Light Blue',
31 - total: '4,232',
32 - color: 'primary',
33 - registrations: {
34 - value: 830,
35 - profit: true,
36 - },
37 - bounce: {
38 - value: 4.5,
39 - profit: false,
40 - },
41 - },
42 - {
43 - product: 'Sing App',
44 - total: '754',
45 - color: 'warning',
46 - registrations: {
47 - value: 30,
48 - profit: true,
49 - },
50 - bounce: {
51 - value: 2.5,
52 - profit: true,
53 - },
54 - },
55 - {
56 - product: 'RNS',
57 - total: '1,025',
58 - color: 'info',
59 - registrations: {
60 - value: 230,
61 - profit: true,
62 - },
63 - bounce: {
64 - value: 21.5,
65 - profit: false,
66 - },
67 - },
68 - ],
69 - notifications: [
70 - {
71 - id: 0,
72 - icon: 'thumbs-up',
73 - color: 'primary',
74 - content: 'Ken <span className="fw-semi-bold">accepts</span> your invitation',
75 - },
76 - {
77 - id: 1,
78 - icon: 'file',
79 - color: 'success',
80 - content: 'Report from LT Company',
81 - },
82 - {
83 - id: 2,
84 - icon: 'envelope',
85 - color: 'danger',
86 - content: '4 <span className="fw-semi-bold">Private</span> Mails',
87 - },
88 - {
89 - id: 3,
90 - icon: 'comment',
91 - color: 'success',
92 - content: '3 <span className="fw-semi-bold">Comments</span> to your Post',
93 - },
94 - {
95 - id: 4,
96 - icon: 'cog',
97 - color: 'light',
98 - content: 'New <span className="fw-semi-bold">Version</span> of RNS app',
99 - },
100 - {
101 - id: 5,
102 - icon: 'bell',
103 - color: 'info',
104 - content: '15 <span className="fw-semi-bold">Notifications</span> from Social Apps',
105 - },
106 - ],
107 - table: [
108 - {
109 - id: 0,
110 - name: 'Mark Otto',
111 - email: 'ottoto@wxample.com',
112 - product: 'ON the Road',
113 - price: '$25 224.2',
114 - date: '11 May 2017',
115 - city: 'Otsego',
116 - status: 'Sent',
117 - },
118 - {
119 - id: 1,
120 - name: 'Jacob Thornton',
121 - email: 'thornton@wxample.com',
122 - product: 'HP Core i7',
123 - price: '$1 254.2',
124 - date: '4 Jun 2017',
125 - city: 'Fivepointville',
126 - status: 'Sent',
127 - },
128 - {
129 - id: 2,
130 - name: 'Larry the Bird',
131 - email: 'bird@wxample.com',
132 - product: 'Air Pro',
133 - price: '$1 570.0',
134 - date: '27 Aug 2017',
135 - city: 'Leadville North',
136 - status: 'Pending',
137 - },
138 - {
139 - id: 3,
140 - name: 'Joseph May',
141 - email: 'josephmay@wxample.com',
142 - product: 'Version Control',
143 - price: '$5 224.5',
144 - date: '19 Feb 2018',
145 - city: 'Seaforth',
146 - status: 'Declined',
147 - },
148 - {
149 - id: 4,
150 - name: 'Peter Horadnia',
151 - email: 'horadnia@wxample.com',
152 - product: 'Let\'s Dance',
153 - price: '$43 594.7',
154 - date: '1 Mar 2018',
155 - city: 'Hanoverton',
156 - status: 'Sent',
157 - },
158 - ],
159 -};
1 -@import '../../styles/app';
2 -
3 -.root {
4 - :global {
5 - /* NVD3 */
6 - .nvtooltip {
7 - padding: $padding-small-vertical $padding-small-horizontal;
8 - font-family: $font-family-base;
9 - font-size: $font-size-sm;
10 - text-align: center;
11 -
12 - p {
13 - margin: 0;
14 - padding: 0;
15 - }
16 -
17 - h3 {
18 - background: none;
19 - border-bottom: 0;
20 - }
21 - }
22 -
23 - svg text {
24 - font: $font-weight-base $font-size-sm $font-family-base;
25 - fill: $text-color;
26 - }
27 -
28 - svg .title {
29 - font: $font-weight-bold $font-size-base $font-family-base;
30 - }
31 -
32 - .nvd3.nv-noData {
33 - font-size: $font-size-lg;
34 - font-weight: $font-weight-bold;
35 - }
36 -
37 - .nvd3 .nv-axis path.domain {
38 - stroke-opacity: 0;
39 - }
40 -
41 - .nv-controlsWrap {
42 - .nv-legend-symbol {
43 - fill: #666 !important;
44 - stroke: #666 !important;
45 - }
46 - }
47 -
48 - /* Flot */
49 - .chart-tooltip {
50 - position: fixed;
51 - padding: $padding-small-vertical $padding-small-horizontal;
52 - border: 1px solid $gray-600;
53 - font-size: $font-size-mini;
54 - background-color: $white;
55 - }
56 -
57 - /* Easy Pie Chart */
58 - .easy-pie-chart {
59 - position: relative;
60 - display: inline-block;
61 - line-height: 120px;
62 - height: 120px;
63 - width: 120px;
64 - text-align: center;
65 - color: $gray-600;
66 -
67 - canvas {
68 - position: absolute;
69 - top: 0;
70 - left: 0;
71 - }
72 - }
73 - }
74 -}
1 -import React, { PureComponent } from 'react';
2 -import {
3 - Row,
4 - Col,
5 - Breadcrumb,
6 - BreadcrumbItem,
7 -} from 'reactstrap';
8 -import $ from 'jquery';
9 -/* eslint-disable */
10 -import 'imports-loader?jQuery=jquery,this=>window!easy-pie-chart/dist/jquery.easypiechart.js';
11 -/* eslint-enable */
12 -import Widget from '../../../components/Widget';
13 -
14 -class EasyPie extends PureComponent {
15 - componentDidMount() {
16 - this.initCharts();
17 - }
18 -
19 - initCharts() { // eslint-disable-line
20 - $('#easy-pie1').easyPieChart({
21 - barColor: '#8fe5d4',
22 - trackColor: '#f8f9fa',
23 - scaleColor: false,
24 - lineWidth: 10,
25 - size: 120,
26 - });
27 -
28 - $('#easy-pie2').easyPieChart({
29 - barColor: '#ffd7de',
30 - trackColor: '#f8f9fa',
31 - scaleColor: '#f55d5d',
32 - lineCap: 'butt',
33 - lineWidth: 22,
34 - size: 140,
35 - animate: 1000,
36 - });
37 -
38 - $('#easy-pie3').easyPieChart({
39 - barColor: '#ffebb2',
40 - trackColor: '#f8f9fa',
41 - scaleColor: '#ffc247',
42 - lineCap: 'butt',
43 - lineWidth: 22,
44 - size: 140,
45 - animate: 1000,
46 - });
47 -
48 - $('#easy-pie4').easyPieChart({
49 - barColor: '#b7b3ff',
50 - trackColor: false,
51 - scaleColor: '#6c757d',
52 - lineCap: 'square',
53 - lineWidth: 10,
54 - size: 120,
55 - animate: 1000,
56 - });
57 - }
58 -
59 - render() {
60 - return (
61 - <div>
62 - <Breadcrumb>
63 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
64 - <BreadcrumbItem>Charts</BreadcrumbItem>
65 - <BreadcrumbItem active>Easy Pie</BreadcrumbItem>
66 - </Breadcrumb>
67 - <h1 className="page-title">Visual - <span className="fw-semi-bold">Charts</span></h1>
68 - <Row>
69 - <Col xs={12} md={6} lg={4}>
70 - <Widget
71 - title={<h5>Easy Pie Charts</h5>}
72 - close collapse
73 - >
74 - <div className="text-center">
75 - <div className="easy-pie-chart-md mb-lg" id="easy-pie1" data-percent="73">
76 - 73
77 - </div>
78 - </div>
79 - <p className="fs-mini text-muted">
80 - Easy pie chart is a jQuery plugin that uses the canvas
81 - element to render simple pie charts for single values.
82 - These charts are highly customizable, very easy to
83 - implement, scale to the resolution of the display of
84 - the client to provide sharp charts even on retina displays.
85 - </p>
86 - </Widget>
87 - </Col>
88 - <Col xs={12} md={6} lg={4}>
89 - <Widget
90 - title={<h5>Easy Pie Charts</h5>}
91 - close collapse
92 - >
93 - <div className="text-center">
94 - <div className="easy-pie-chart-lg mb-lg" id="easy-pie2" data-percent="22">
95 - 22
96 - </div>
97 - </div>
98 - <div className="text-center">
99 - <div className="easy-pie-chart-lg mb-lg" id="easy-pie3" data-percent="88">
100 - 88
101 - </div>
102 - </div>
103 - </Widget>
104 - </Col>
105 - <Col xs={12} md={6} lg={4}>
106 - <Widget
107 - title={<h5>Easy Pie Charts</h5>}
108 - close collapse
109 - >
110 - <p className="fw-mini text-muted">
111 - Ok, but <span className="fw-semi-bold">when to use pie chart?</span> Pie
112 - charts are mostly used to show how much individual shares such as
113 - quarterly sales figures contribute to a total amount, such as annual sales.
114 - </p>
115 - <div className="text-center">
116 - <div className="easy-pie-chart-md mb-lg" id="easy-pie4" data-percent="43">
117 - 43
118 - </div>
119 - </div>
120 - <hr />
121 - <Row>
122 - <Col xs={3}>
123 - <span className="widget-icon">
124 - <i className="fi flaticon-like text-primary" />
125 - </span>
126 - </Col>
127 - <Col xs={9}>
128 - <div className="text-muted">
129 - <h6 className="no-margin">TOTAL PROGRESS</h6>
130 - <p className="h2 no-margin fw-normal">43,32%</p>
131 - </div>
132 - </Col>
133 - </Row>
134 - </Widget>
135 - </Col>
136 - </Row>
137 - </div>
138 - );
139 - }
140 -}
141 -
142 -export default EasyPie;
1 -import React, { PureComponent } from 'react';
2 -import {
3 - Row,
4 - Col,
5 - Breadcrumb,
6 - BreadcrumbItem,
7 -} from 'reactstrap';
8 -import $ from 'jquery';
9 -/* eslint-disable */
10 -import 'imports-loader?jQuery=jquery,this=>window!flot';
11 -import 'imports-loader?jQuery=jquery,this=>window!flot/jquery.flot.time';
12 -import 'imports-loader?jQuery=jquery,this=>window!flot/jquery.flot.resize';
13 -import 'imports-loader?jQuery=jquery,this=>window!jquery.flot.animator/jquery.flot.animator';
14 -import 'imports-loader?jQuery=jquery,this=>window!flot/jquery.flot.crosshair';
15 -import 'imports-loader?jQuery=jquery,this=>window!flot/jquery.flot.symbol';
16 -import 'imports-loader?jQuery=jquery,this=>window!flot/jquery.flot.selection';
17 -import 'imports-loader?jQuery=jquery,this=>window!flot/jquery.flot.pie';
18 -import 'imports-loader?jQuery=jquery,this=>window!jquery.flot-orderBars/js/jquery.flot.orderBars';
19 -import 'imports-loader?jQuery=jquery,this=>window!jquery-sparkline';
20 -/* eslint-enable */
21 -import Widget from '../../../components/Widget';
22 -
23 -import LineChart from './charts/LineChart';
24 -import TrackingChart from './charts/TrackingChart';
25 -import MarkersChart from './charts/MarkersChart';
26 -import BarsChart from './charts/BarsChart';
27 -import PieChart from './charts/PieChart';
28 -import DonutChart from './charts/DonutChart';
29 -import StackedBar from './charts/BarsStackedCharts';
30 -
31 -class EasyPie extends PureComponent {
32 - constructor(props) {
33 - super(props);
34 -
35 - this.sparklines = [];
36 - }
37 - componentDidMount() {
38 - this.initSparklines();
39 - }
40 -
41 -
42 - initSparklines() {
43 - this.sparklines.forEach((spark) => {
44 - $(spark).sparkline('html', $(spark).data());
45 - });
46 - }
47 -
48 - render() {
49 - return (
50 - <div>
51 - <Breadcrumb>
52 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
53 - <BreadcrumbItem>Charts</BreadcrumbItem>
54 - <BreadcrumbItem active>Flot</BreadcrumbItem>
55 - </Breadcrumb>
56 - <h1 className="page-title">Visual - <span className="fw-semi-bold">Flot Charts</span></h1>
57 - <Row>
58 - <Col xs={12} lg={6} xl={5}>
59 - <Widget
60 - title={<h5>Flot <span className="fw-semi-bold">Stacked Line Chart</span></h5>}
61 - close collapse
62 - >
63 - <LineChart />
64 - <p className="fs-mini text-muted">
65 - Flot is a <span className="fw-semi-bold">pure</span> JavaScript plotting library for jQuery,
66 - with a
67 - focus on simple usage, attractive looks and interactive features.
68 - </p>
69 - <h5 className="mt">Interactive <span className="fw-semi-bold">Sparklines</span></h5>
70 - <Row className="mt">
71 - <Col xs={12} md={6}>
72 - <div className="stats-row">
73 - <div className="stat-item">
74 - <p className="value5 fw-thin">34 567</p>
75 - <h6 className="name text-muted no-margin fs-mini">Overall Values</h6>
76 - </div>
77 - <div className="stat-item stat-item-mini-chart">
78 - <div className="sparkline" ref={(r) => { this.sparklines.push(r); }} data-type="bar" data-bar-color="#FFC247" data-height="30" data-bar-width="6" data-bar-spacing="2">
79 - 9,12,14,15,10,14,20
80 - </div>
81 - </div>
82 - </div>
83 - </Col>
84 - <Col xs={12} md={6}>
85 - <div className="stats-row">
86 - <div className="stat-item">
87 - <p className="value5 fw-thin">34 567</p>
88 - <h6 className="name text-muted no-margin fs-mini">Overall Values</h6>
89 - </div>
90 - <div className="stat-item stat-item-mini-chart">
91 - <div className="sparkline" ref={(r) => { this.sparklines.push(r); }} data-type="bar" data-bar-color="#FFF8E3" data-height="30" data-bar-width="6" data-bar-spacing="2">
92 - 9,12,14,15,10,14,20
93 - </div>
94 - </div>
95 - </div>
96 - </Col>
97 - </Row>
98 - <p className="fs-mini text-muted">
99 - This jQuery plugin generates sparklines (small inline charts) directly in the browser using
100 - data supplied either inline in the HTML, or via javascript.
101 - </p>
102 - </Widget>
103 - </Col>
104 - <Col xs={12} lg={6} xl={7}>
105 - <Widget
106 - title={<h5>Flot <span className="fw-semi-bold">Tracking</span></h5>}
107 - close collapse
108 - >
109 - <div className="mt mb">
110 - <TrackingChart />
111 - </div>
112 - <p className="fs-mini text-muted">
113 - Flot charts can be customized easily due to its <span className="fw-semi-bold">powerful API</span>.
114 - But if you meet any troubles, you are always welcome to contact us to integrate the business
115 - logic into <span className="fw-semi-bold">SING Admin Dashboard</span>.
116 - </p>
117 - </Widget>
118 - </Col>
119 - <Col xs={12}>
120 - <Widget
121 - title={<h5>Flot <span className="fw-semi-bold">Markers</span></h5>}
122 - close collapse
123 - >
124 - <div className="mt mb">
125 - <MarkersChart />
126 - </div>
127 - <p className="fs-mini text-muted">Points can be marked in several ways, with circles being the built-in default.</p>
128 - </Widget>
129 - </Col>
130 - <Col xs={12} lg={7}>
131 - <Widget
132 - title={<h5>Flot <span className="fw-semi-bold">Bars</span></h5>}
133 - close collapse
134 - >
135 - <div className="mt mb">
136 - <BarsChart />
137 - </div>
138 - <p className="fs-mini text-muted">Flot is a pure JavaScript plotting library for jQuery, with a focus on simple usage, attractive looks and interactive features.</p>
139 - </Widget>
140 - </Col>
141 - <Col xs={12} lg={5}>
142 - <Widget
143 - className="mb-xlg"
144 - title={<h5>Flot <span className="fw-semi-bold">Pie Chart</span></h5>}
145 - close collapse
146 - >
147 - <div className="mt mb">
148 - <PieChart />
149 - </div>
150 - <p className="fs-mini text-muted">Labels can be hidden if the slice is less than a given percentage of the pie (19% in this case).</p>
151 - </Widget>
152 - <Widget
153 - className="mb-xlg"
154 - title={<h5>Flot <span className="fw-semi-bold">Donut Chart</span></h5>}
155 - close collapse
156 - >
157 - <DonutChart />
158 - </Widget>
159 - </Col>
160 - <Col xs={12}>
161 - <Widget
162 - className="mb-xlg"
163 - title={<h5>Flot <span className="fw-semi-bold">Bars Stacked</span></h5>}
164 - close collapse
165 - >
166 - <div className="mt mb">
167 - <StackedBar />
168 - </div>
169 - </Widget>
170 - </Col>
171 - </Row>
172 - </div>
173 - );
174 - }
175 -}
176 -
177 -export default EasyPie;
1 -import React, { PureComponent } from 'react';
2 -import $ from 'jquery';
3 -
4 -class BarChart extends PureComponent {
5 - componentDidMount() {
6 - this.chart = this.createChart(this.getDataSeries(this.getBarChartData()));
7 - }
8 -
9 - getBarChartData() { // eslint-disable-line
10 - return [
11 - [[1388534400000, 120], [1391212800000, 70], [1393632000000, 100], [1396310400000, 60], [1398902400000, 35]],
12 - [[1388534400000, 90], [1391212800000, 60], [1393632000000, 30], [1396310400000, 73], [1398902400000, 30]],
13 - [[1388534400000, 80], [1391212800000, 40], [1393632000000, 47], [1396310400000, 22], [1398902400000, 24]],
14 - ];
15 - }
16 -
17 - getDataSeries(data) { // eslint-disable-line
18 - return [{
19 - label: 'Apple',
20 - data: data[0],
21 - bars: {
22 - show: true,
23 - barWidth: 12 * 24 * 60 * 60 * 300,
24 - fill: 0.5,
25 - lineWidth: 0,
26 - order: 1,
27 - },
28 - }, {
29 - label: 'Google',
30 - data: data[1],
31 - bars: {
32 - show: true,
33 - barWidth: 12 * 24 * 60 * 60 * 300,
34 - fill: 0.5,
35 - lineWidth: 0,
36 - order: 2,
37 - },
38 - }, {
39 - label: 'Facebook',
40 - data: data[2],
41 - bars: {
42 - show: true,
43 - barWidth: 12 * 24 * 60 * 60 * 300,
44 - fill: 0.5,
45 - lineWidth: 0,
46 - order: 3,
47 - },
48 - }];
49 - }
50 -
51 - createChart(dataSeries) {
52 - return $.plot(this.$chartContainer, dataSeries, {
53 - series: {
54 - bars: {
55 - show: true,
56 - barWidth: 12 * 24 * 60 * 60 * 350,
57 - lineWidth: 0,
58 - order: 1,
59 - fillColor: {
60 - colors: [{
61 - opacity: 1,
62 - }, {
63 - opacity: 0.7,
64 - }],
65 - },
66 - },
67 - },
68 - xaxis: {
69 - mode: 'time',
70 - min: 1387497600000,
71 - max: 1400112000000,
72 - tickLength: 0,
73 - tickSize: [1, 'month'],
74 - axisLabel: 'Month',
75 - axisLabelUseCanvas: true,
76 - axisLabelFontSizePixels: 13,
77 - axisLabelPadding: 15,
78 - },
79 - yaxis: {
80 - axisLabel: 'Value',
81 - axisLabelUseCanvas: true,
82 - axisLabelFontSizePixels: 13,
83 - axisLabelPadding: 5,
84 - },
85 - grid: {
86 - hoverable: true,
87 - borderWidth: 0,
88 - },
89 - legend: {
90 - backgroundColor: 'transparent',
91 - labelBoxBorderColor: 'none',
92 - },
93 - colors: ['#a7beff', '#ace5d1', '#ffd7de'],
94 - });
95 - }
96 - render() {
97 - return (
98 - <div ref={(r) => { this.$chartContainer = $(r); }} style={{ height: '400px' }} />
99 - );
100 - }
101 -}
102 -
103 -export default BarChart;
1 -import React, { PureComponent } from 'react';
2 -import $ from 'jquery';
3 -
4 -class StackedBarChart extends PureComponent {
5 - componentDidMount() {
6 - this.chart = this.createChart(this.getStackedBarChartData());
7 - }
8 -
9 - getStackedBarChartData() { // eslint-disable-line
10 - const seriesCount = 3;
11 - const tickCount = 10;
12 - let series = [];
13 - const data = [];
14 -
15 - for (let i = 0; i < seriesCount; i += 1) {
16 - series = [];
17 -
18 - for (let j = 0; j < tickCount; j += 1) {
19 - series.push([j, parseInt(Math.random() * 30, 10)]);
20 - }
21 -
22 - data.push(series);
23 - }
24 -
25 - return data;
26 - }
27 -
28 - createChart(data) {
29 - return $.plot(this.$chartContainer, data, {
30 - series: {
31 - stack: true,
32 - bars: {
33 - show: true,
34 - barWidth: 0.45,
35 - lineWidth: 1,
36 - fill: 0.75,
37 - },
38 - },
39 - grid: {
40 - backgroundColor: { colors: ['#ffffff', '#ffffff'] },
41 - borderWidth: 1,
42 - borderColor: '#ffffff',
43 - margin: 0,
44 - minBorderMargin: 0,
45 - labelMargin: 20,
46 - hoverable: true,
47 - clickable: true,
48 - mouseActiveRadius: 6,
49 - },
50 - xaxis: {
51 - min: 1,
52 - tickLength: 0,
53 - axisLabelUseCanvas: true,
54 - axisLabelFontSizePixels: 13,
55 - axisLabelPadding: 15,
56 - },
57 - colors: ['#E5E5FF', '#C0BDFF', '#D7E0FF'],
58 - });
59 - }
60 -
61 - render() {
62 - return (
63 - <div ref={(r) => { this.$chartContainer = $(r); }} style={{ height: '200px' }} />
64 - );
65 - }
66 -}
67 -
68 -export default StackedBarChart;
1 -import React, { PureComponent } from 'react';
2 -import { Row, Col } from 'reactstrap';
3 -import $ from 'jquery';
4 -
5 -class DonutChart extends PureComponent {
6 - componentDidMount() {
7 - this.chart = this.createChart(this.getPieChartData());
8 - }
9 -
10 - getPieChartData() { // eslint-disable-line
11 - const data = [];
12 - const seriesCount = 4;
13 - const accessories = ['Rolex', 'Tissot', 'Orient', 'Other'];
14 -
15 - for (let i = 0; i < seriesCount; i += 1) {
16 - data.push({
17 - label: accessories[i],
18 - data: Math.floor(Math.random() * 100) + 1,
19 - });
20 - }
21 -
22 - return data;
23 - }
24 -
25 - createChart(data) {
26 - return $.plot(this.$chartContainer, data, {
27 - series: {
28 - pie: {
29 - innerRadius: 0.5,
30 - show: true,
31 - fill: 0.7,
32 - },
33 - },
34 - colors: ['#8fe5d4', '#ace5d1', '#ffebb2', '#fff8e3'],
35 - legend: {
36 - noColumns: 1,
37 - container: this.$chartLegend,
38 - },
39 - });
40 - }
41 - render() {
42 - return (
43 - <Row>
44 - <Col xs={12} md={6} lg={7} className="mt mb">
45 - <div style={{ height: '120px' }} ref={(r) => { this.$chartContainer = $(r); }} />
46 - </Col>
47 - <Col xs={12} md={5} lg={4} >
48 - <div className="mt" ref={(r) => { this.$chartLegend = $(r); }} />
49 - </Col>
50 - </Row>
51 - );
52 - }
53 -}
54 -
55 -export default DonutChart;
1 -import React, { PureComponent } from 'react';
2 -import $ from 'jquery';
3 -
4 -class LineChart extends PureComponent {
5 - constructor(props) {
6 - super(props);
7 - this.options = {
8 - xaxis: {
9 - tickLength: 0,
10 - tickDecimals: 0,
11 - min: 2,
12 - font: {
13 - lineHeight: 13,
14 - weight: 'bold',
15 - color: '#c1ccd3',
16 - },
17 - },
18 - yaxis: {
19 - tickDecimals: 0,
20 - tickColor: '#f8f9fa',
21 - font: {
22 - lineHeight: 13,
23 - weight: 'bold',
24 - color: '#c1ccd3',
25 - },
26 - },
27 - grid: {
28 - backgroundColor: { colors: ['#ffffff', '#ffffff'] },
29 - borderWidth: 1,
30 - borderColor: '#ffffff',
31 - margin: 0,
32 - minBorderMargin: 0,
33 - labelMargin: 20,
34 - hoverable: true,
35 - clickable: true,
36 - mouseActiveRadius: 6,
37 - },
38 - legend: false,
39 - colors: ['#fff8e3', '#ffebb2', '#ffc247'],
40 - };
41 - }
42 - componentDidMount() {
43 - this.createChart(this.getData());
44 - }
45 -
46 - getData() { // eslint-disable-line
47 - return [
48 - [
49 - [1, 20],
50 - [2, 20],
51 - [3, 40],
52 - [4, 30],
53 - [5, 40],
54 - [6, 35],
55 - [7, 47],
56 - ], [
57 - [1, 13],
58 - [2, 8],
59 - [3, 17],
60 - [4, 10],
61 - [5, 17],
62 - [6, 15],
63 - [7, 16],
64 - ], [
65 - [1, 23],
66 - [2, 13],
67 - [3, 33],
68 - [4, 16],
69 - [5, 32],
70 - [6, 28],
71 - [7, 31],
72 - ],
73 - ];
74 - }
75 -
76 - createChart(data) { // eslint-disable-line
77 - return $.plotAnimator(this.$chartContainer, [{
78 - label: 'Traffic',
79 - data: data[2],
80 - lines: {
81 - fill: 0.3,
82 - lineWidth: 0,
83 - },
84 - }, {
85 - label: 'Traffic',
86 - data: data[1],
87 - lines: {
88 - fill: 0.6,
89 - lineWidth: 0,
90 - },
91 - }, {
92 - label: 'Traffic',
93 - data: data[0],
94 - animator: { steps: 60, duration: 1000, start: 0 },
95 - lines: { lineWidth: 2 },
96 - shadowSize: 0,
97 - }], this.options);
98 - }
99 -
100 - render() {
101 - return (
102 - <div ref={(r) => { this.$chartContainer = $(r); }} style={{ height: '250px' }} />
103 - );
104 - }
105 -}
106 -
107 -export default LineChart;
1 -import React, { PureComponent } from 'react';
2 -import $ from 'jquery';
3 -
4 -class Markers extends PureComponent {
5 - constructor(props) {
6 - super(props);
7 - this.data = [
8 - { data: this.generate(2, 0.6), points: { symbol: 'circle' } },
9 - { data: this.generate(3, 0.5), points: { symbol: 'square' } },
10 - { data: this.generate(4, 0.8), points: { symbol: 'diamond' } },
11 - { data: this.generate(6, 0.7), points: { symbol: 'triangle' } },
12 - { data: this.generate(7, 0.2), points: { symbol: 'cross' } },
13 - ];
14 - }
15 -
16 - componentDidMount() {
17 - this.chart = this.createChart(this.data);
18 - }
19 -
20 - generate(offset, amplitude) { // eslint-disable-line
21 - const result = [];
22 - const start = 0;
23 - const end = 10;
24 - let point;
25 -
26 - for (let i = 0; i <= 50; i += 1) {
27 - point = ((start + i) / 50) * (end - start);
28 - result.push([point, amplitude * Math.sin(point + offset)]);
29 - }
30 -
31 - return result;
32 - }
33 -
34 - createChart(data) {
35 - return $.plot(this.$chartContainer, data, {
36 - series: {
37 - points: {
38 - show: true,
39 - radius: 3,
40 - },
41 - },
42 - yaxis: {
43 - ticks: [],
44 - },
45 - xaxis: {
46 - min: 1,
47 - },
48 - grid: {
49 - hoverable: true,
50 - backgroundColor: { colors: ['#ffffff', '#ffffff'] },
51 - borderWidth: 1,
52 - borderColor: '#ffffff',
53 - },
54 - colors: ['#e2e1ff', '#f59f9f', '#ffd7de', '#8fe5d4', '#ace5d1', '#ffebb2', '#fff8e3'],
55 - });
56 - }
57 - render() {
58 - return (
59 - <div ref={(r) => { this.$chartContainer = $(r); }} style={{ height: '200px' }} />
60 - );
61 - }
62 -}
63 -
64 -export default Markers;
1 -import React, { PureComponent } from 'react';
2 -import $ from 'jquery';
3 -
4 -class PieChart extends PureComponent {
5 - componentDidMount() {
6 - this.chart = this.createChart(this.getPieChartData());
7 - }
8 -
9 - getPieChartData() { // eslint-disable-line
10 - const data = [];
11 - const seriesCount = 4;
12 - const accessories = ['Rolex', 'Tissot', 'Orient', 'Other'];
13 -
14 - for (let i = 0; i < seriesCount; i += 1) {
15 - data.push({
16 - label: accessories[i],
17 - data: Math.floor(Math.random() * 100) + 1,
18 - });
19 - }
20 -
21 - return data;
22 - }
23 -
24 - createChart(data) {
25 - const self = this;
26 -
27 - return $.plot(this.$chartContainer, data, {
28 - series: {
29 - pie: {
30 - show: true,
31 - radius: 1,
32 - label: {
33 - show: true,
34 - radius: 2 / 3,
35 - formatter: self.labelFormatter,
36 - threshold: 0.2,
37 - },
38 - },
39 - },
40 - legend: {
41 - show: false,
42 - },
43 - colors: ['#ffd7de', '#8fe5d4', '#ace5d1', '#ffebb2', '#fff8e3'],
44 - });
45 - }
46 -
47 - labelFormatter(label, series) { // eslint-disable-line
48 - return `<h1><span class="badge badge-secondary">${label}: ${Math.round(series.percent)}%</span></h1>`;
49 - }
50 -
51 - render() {
52 - return (
53 - <div ref={(r) => { this.$chartContainer = $(r); }} style={{ height: '150px' }} />
54 - );
55 - }
56 -}
57 -
58 -export default PieChart;
1 -import React, { PureComponent } from 'react';
2 -import $ from 'jquery';
3 -
4 -class TrackingChart extends PureComponent {
5 - getTrackingChartData() { // eslint-disable-line
6 - const sin = [];
7 - const cos = [];
8 - for (let i = 0; i < 14; i += 0.1) {
9 - sin.push([i, Math.sin(i)]);
10 - cos.push([i, Math.cos(i)]);
11 - }
12 -
13 - return [
14 - { data: sin, label: 'sin(x) = -0.00' },
15 - { data: cos, label: 'cos(x) = -0.00' },
16 - ];
17 - }
18 -
19 - componentDidMount() {
20 - this.chart = this.createChart(this.getTrackingChartData());
21 - this.legend = this.$chartContainer.find('.legendLabel');
22 - this.initEventListeners();
23 - }
24 -
25 - createChart(data) {
26 - return $.plotAnimator(this.$chartContainer, [{
27 - label: data[0].label,
28 - data: data[0].data,
29 - }, {
30 - label: data[1].label,
31 - data: data[1].data,
32 - animator: { steps: 60, duration: 1000, start: 0 },
33 - }], {
34 - series: {
35 - lines: {
36 - show: true,
37 - },
38 - },
39 - colors: ['#8fe5d4', '#ffd7de'],
40 - crosshair: {
41 - mode: 'x',
42 - color: '#f55d5d',
43 - },
44 - grid: {
45 - hoverable: true,
46 - autoHighlight: false,
47 - backgroundColor: { colors: ['#ffffff', '#ffffff'] },
48 - borderWidth: 1,
49 - borderColor: '#ffffff',
50 - margin: 0,
51 - minBorderMargin: 0,
52 - labelMargin: 40,
53 - mouseActiveRadius: 6,
54 - },
55 - xaxis: {
56 - tickLength: 0,
57 - tickDecimals: 0,
58 - min: 1,
59 - max: 6,
60 - font: {
61 - lineHeight: 13,
62 - weight: 'bold',
63 - color: '#c1ccd3',
64 - },
65 - },
66 - yaxis: {
67 - min: -1.2,
68 - max: 1.2,
69 - tickDecimals: 0,
70 - font: {
71 - lineHeight: 13,
72 - weight: 'bold',
73 - color: '#c1ccd3',
74 - },
75 - },
76 - });
77 - }
78 -
79 - initEventListeners() {
80 - const self = this;
81 -
82 - this.$chartContainer.bind('plothover', (event, pos) => {
83 - if (!self.updateLegendTimeout) {
84 - self.updateLegendTimeout = setTimeout(self.updateLegendContent.bind(self, event, pos), 50);
85 - }
86 - });
87 - }
88 -
89 - updateLegendContent(event, pos) {
90 - this.updateLegendTimeout = null;
91 -
92 - const axes = this.chart.getAxes();
93 - if (pos.x < axes.xaxis.min || pos.x > axes.xaxis.max ||
94 - pos.y < axes.yaxis.min || pos.y > axes.yaxis.max) {
95 - return;
96 - }
97 -
98 - const dataset = this.chart.getData();
99 - for (let i = 0; i < dataset.length; i += 1) {
100 - const series = dataset[i];
101 - let point1;
102 - let point2;
103 -
104 - // Find the nearest points, x-wise
105 - for (let j = 0; j < series.data.length; j += 1) {
106 - if (series.data[j][0] > pos.x) {
107 - point1 = series.data[j - 1];
108 - point2 = series.data[j];
109 - break;
110 - }
111 - }
112 -
113 - let y;
114 - // Now Interpolate
115 - if (point1 == null && point2) {
116 - y = point2[1];
117 - } else if (point2 == null && point1) {
118 - y = point1[1];
119 - } else {
120 - /* eslint-disable */
121 - y = point1[1] + (point2[1] - point1[1]) * (pos.x - point1[0]) / (point2[0] - point1[0]);
122 - /* eslint-enable */
123 - }
124 -
125 - this.legend.eq(i).text(series.label.replace(/=.*/, `= ${y.toFixed(2)}`));
126 - }
127 - }
128 -
129 - render() {
130 - return (
131 - <div>
132 - <div ref={(r) => { this.$chartContainer = $(r); }} style={{ height: '340px' }} />
133 - </div>
134 - );
135 - }
136 -}
137 -
138 -export default TrackingChart;
1 -import React, { PureComponent } from 'react';
2 -import {
3 - Row,
4 - Col,
5 - Breadcrumb,
6 - BreadcrumbItem,
7 -} from 'reactstrap';
8 -import $ from 'jquery';
9 -/* eslint-disable */
10 -import 'imports-loader?jQuery=jquery,this=>window!webpack-raphael/raphael';
11 -import 'imports-loader?jQuery=jquery,this=>window!govpredict-morris/morris';
12 -/* eslint-enable */
13 -import Widget from '../../../components/Widget';
14 -
15 -const Morris = window.Morris;
16 -
17 -class MorrisCharts extends PureComponent {
18 - componentDidMount() {
19 - this.initMorrisLineChart();
20 - this.initMorrisAreaChart();
21 - this.initMorrisBarChart();
22 - this.initMorrisBar2Chart();
23 - this.initMorrisDonutChart();
24 - this.initMorrisStackedChart();
25 - }
26 -
27 - initMorrisLineChart() {
28 - $(this.morrisLineChart).html('');
29 - Morris.Line({
30 - element: this.morrisLineChart,
31 - resize: true,
32 - data: [
33 - { y: '2006', a: 100, b: 90 },
34 - { y: '2007', a: 75, b: 65 },
35 - { y: '2008', a: 50, b: 40 },
36 - { y: '2009', a: 75, b: 65 },
37 - { y: '2010', a: 50, b: 40 },
38 - { y: '2011', a: 75, b: 65 },
39 - { y: '2012', a: 100, b: 90 },
40 - ],
41 - xkey: 'y',
42 - ykeys: ['a', 'b'],
43 - labels: ['Series A', 'Series B'],
44 - lineColors: ['#8fe5d4', '#ffebb2'],
45 - });
46 - }
47 -
48 - initMorrisAreaChart() {
49 - $(this.morrisAreaChart).html('');
50 - Morris.Area({
51 - element: this.morrisAreaChart,
52 - resize: true,
53 - data: [
54 - { y: '2006', a: 100, b: 90 },
55 - { y: '2007', a: 75, b: 65 },
56 - { y: '2008', a: 50, b: 40 },
57 - { y: '2009', a: 75, b: 65 },
58 - { y: '2010', a: 50, b: 40 },
59 - { y: '2011', a: 75, b: 65 },
60 - { y: '2012', a: 100, b: 90 },
61 - ],
62 - xkey: 'y',
63 - ykeys: ['a', 'b'],
64 - labels: ['Users A', 'Series B'],
65 - lineColors: ['#8fe5d4', '#ffd7de'],
66 - lineWidth: 0,
67 - });
68 - }
69 -
70 - initMorrisBarChart() {
71 - $(this.morrisBarChart).html('');
72 - Morris.Bar({
73 - element: this.morrisBarChart,
74 - resize: true,
75 - grid: false,
76 - data: [
77 - { y: 4, x: 'Linux' },
78 - { y: 12, x: 'MacOS' },
79 - { y: 29, x: 'Windows' },
80 - ],
81 - xkey: 'x',
82 - ykeys: ['y'],
83 - labels: ['OS Users, %'],
84 - barColors: ['#b7b3ff'],
85 - gridTextColor: '#c1ccd3',
86 - });
87 - }
88 -
89 - initMorrisBar2Chart() {
90 - $(this.morrisBar2Chart).html('');
91 - Morris.Bar({
92 - element: this.morrisBar2Chart,
93 - resize: true,
94 - grid: false,
95 - data: [
96 - { y: '2014', a: 50, b: 90 },
97 - { y: '2015', a: 65, b: 75 },
98 - { y: '2016', a: 50, b: 50 },
99 - { y: '2017', a: 75, b: 60 },
100 - { y: '2018', a: 80, b: 65 },
101 - { y: '2019', a: 90, b: 70 },
102 - { y: '2020', a: 100, b: 75 },
103 - { y: '2021', a: 115, b: 75 },
104 - { y: '2022', a: 120, b: 85 },
105 - { y: '2023', a: 145, b: 85 },
106 - { y: '2024', a: 160, b: 95 },
107 - ],
108 - xkey: 'y',
109 - ykeys: ['a', 'b'],
110 - labels: ['Total Income', 'Total Outcome'],
111 - hideHover: 'auto',
112 - barColors: ['#8fe5d4', '#f59f9f'],
113 - gridTextColor: '#d6dee5',
114 - });
115 - }
116 -
117 - initMorrisDonutChart() {
118 - $(this.morrisDonutChart).html('');
119 - Morris.Donut({
120 - element: this.morrisDonutChart,
121 - resize: true,
122 - data: [
123 - { label: 'Download Sales', value: 12 },
124 - { label: 'In-Store Sales', value: 30 },
125 - { label: 'Mail-Order Sales', value: 20 },
126 - ],
127 - colors: ['#ffd7de', '#ffebb2', '#e2e1ff'],
128 - });
129 - }
130 -
131 - initMorrisStackedChart() {
132 - $(this.morrisStackedChart).html('');
133 - Morris.Bar({
134 - element: this.morrisStackedChart,
135 - stacked: true,
136 - resize: true,
137 - data: [
138 - { y: '2012', a: 3, b: 7, c: 90, d: 0 },
139 - { y: '2013', a: 2, b: 7, c: 75, d: 14 },
140 - { y: '2014', a: 3, b: 15, c: 65, d: 4 },
141 - { y: '2015', a: 3, b: 17, c: 56, d: 20 },
142 - { y: '2016', a: 5, b: 16, c: 49, d: 30 },
143 - { y: '2017', a: 4, b: 20, c: 40, d: 36 },
144 - { y: '2018', a: 5, b: 20, c: 40, d: 35 },
145 - ],
146 - xkey: 'y',
147 - ykeys: ['a', 'b', 'c', 'd'],
148 - barColors: ['#a7beff', '#e2e1ff', '#fff8e3', '#ffd7de'],
149 - labels: ['Linux', 'MacOS', 'Windows', 'Other'],
150 - hoverCallback(index, options, content, row) {
151 - const keys = Object.keys(row).splice(1).sort();
152 - let tooltip = `
153 - <div class="card" style="width: 11rem;"><div class="card-body">
154 - <h5 class="card-title">${row.y} OS Shares</h5>
155 - <h6 class="card-subtitle mb-2 text-muted">Statistics for most popular Operation Systems Usage</h6>`;
156 -
157 - const rows = [];
158 - keys.forEach((value, id) => {
159 - rows.push(
160 - (`<tr>
161 - <td>${options.labels[id]}: </td>
162 - <td>${row[value]}%</td>
163 - </tr>`).trim(),
164 - );
165 - });
166 -
167 - tooltip += '<table class="table"><tbody>';
168 - tooltip += rows.join('');
169 - tooltip += '</tbody></table></div></div>';
170 -
171 - return tooltip;
172 - },
173 - hideHover: 'auto',
174 - });
175 - }
176 -
177 - render() {
178 - return (
179 - <div>
180 - <Breadcrumb>
181 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
182 - <BreadcrumbItem>Charts</BreadcrumbItem>
183 - <BreadcrumbItem active>Morris</BreadcrumbItem>
184 - </Breadcrumb>
185 - <h1 className="page-title">Visual - <span className="fw-semi-bold">Charts</span></h1>
186 - <Row>
187 - <Col lg={6} xs={12}>
188 - <Widget
189 - title={<h5> Morris <span className="fw-semi-bold">Line Chart</span></h5>}
190 - close collapse
191 - >
192 - <div>
193 - <p className="fs-mini text-muted">
194 - Good-looking charts shouldn&apos;t be difficult.
195 - The public API is terribly simple. It&apos;s just one function: <code>Morris.Line(options)</code>,
196 - where options is an object containing some of the following configuration options.
197 - </p>
198 - <div className="text-center" ref={(r) => { this.morrisLineChart = r; }} style={{ height: '343px' }} />
199 - </div>
200 - </Widget>
201 - </Col>
202 - <Col lg={6} xs={12}>
203 - <Widget
204 - title={<h5> Morris <span className="fw-semi-bold">Area Chart</span></h5>}
205 - close collapse
206 - >
207 - <div>
208 - <p className="fs-mini text-muted">
209 - Good-looking charts shouldn&apos;t be difficult.
210 - The public API is terribly simple. It&apos;s just one function: <code>Morris.Line(options)</code>,
211 - where options is an object containing some of the following configuration options.
212 - </p>
213 - <div className="text-center" ref={(r) => { this.morrisAreaChart = r; }} style={{ height: '343px' }} />
214 - </div>
215 - </Widget>
216 - </Col>
217 - <Col lg={5} xs={12}>
218 - <Widget
219 - title={<h5> Morris <span className="fw-semi-bold">Bar Chart</span></h5>}
220 - close collapse
221 - >
222 - <div>
223 - <div className="text-center" ref={(r) => { this.morrisBarChart = r; }} style={{ height: '260px' }} />
224 - <p className="fs-mini text-muted">
225 - Bar charts are also commonly referred to as a column charts. If you was trying to compare
226 - the height of something then intuitvely you would represent this by using columns. This
227 - really couldn&apos;t be easier. Create a Bar chart using <code>Morris.Bar(options)</code>,
228 - with only few options.
229 - </p>
230 - </div>
231 - </Widget>
232 - </Col>
233 - <Col lg={3} xs={12}>
234 - <Widget
235 - title={<h5> Morris <span className="fw-semi-bold">Donut Chart</span></h5>}
236 - close collapse
237 - >
238 - <div>
239 - <div className="text-center" ref={(r) => { this.morrisDonutChart = r; }} style={{ height: '180px' }} />
240 - <p className="fs-mini text-muted">
241 - Donuts a great for representing some parted information like traffice sources, disk partitions,
242 - etc. This really couldn&apos;t be easier. Create a Donut chart using <code>Morris.Bar(options)</code>,
243 - with only few options.
244 - </p>
245 - </div>
246 - </Widget>
247 - </Col>
248 - <Col lg={4} xs={12}>
249 - <Widget
250 - title={<h5> Morris <span className="fw-semi-bold">Bar Chart 2</span></h5>}
251 - close collapse
252 - >
253 - <div>
254 - <div className="text-center" ref={(r) => { this.morrisBar2Chart = r; }} style={{ height: '180px' }} />
255 - <p className="fs-mini text-muted">
256 - This is generally a good chart to choose for all comparison based analysis but if you were to
257 - display a data set with negative values a column would be the best to represent this. This
258 - really couldn&apos;t be easier. Create a Bar chart using <code>Morris.Bar(options)</code>,
259 - with only few options.
260 - </p>
261 - </div>
262 - </Widget>
263 - </Col>
264 - <Col xs={12}>
265 - <Widget
266 - title={<h5> Morris <span className="fw-semi-bold">Stacked Bar Chart</span></h5>}
267 - close collapse
268 - >
269 - <div>
270 - <div className="text-center" ref={(r) => { this.morrisStackedChart = r; }} style={{ height: '200px' }} />
271 - <p className="fs-mini text-muted">
272 - Stacked charts are excellent to track some dynamics within declared categories. An example of this
273 - can be seen above. To create a Stacked Bar chart use <code>Morris.Bar(options)</code> and
274 - set <code>stacked</code>, option to true.
275 - </p>
276 - </div>
277 - </Widget>
278 - </Col>
279 - </Row>
280 - </div>
281 - );
282 - }
283 -}
284 -
285 -export default MorrisCharts;
1 -import React, { PureComponent } from 'react';
2 -import { Row, Col, Alert, Progress } from 'reactstrap';
3 -
4 -import BarsChart from './charts/BarsChart';
5 -import LineChart from './charts/LineChart';
6 -import ScatterplotChart from './charts/ScatterplotChart';
7 -import RealtimeChart from './charts/RealtimeChart';
8 -
9 -import Widget from '../../../components/Widget';
10 -
11 -class RickshawExamples extends PureComponent {
12 - render() {
13 - return (
14 - <div>
15 - <Row>
16 - <Col xs={12}>
17 - <Widget
18 - title={<h5>Bias <span className="fw-semi-bold">Rickshaw</span></h5>}
19 - close collapse
20 - >
21 - <p className="fs-mini text-muted mb-lg">
22 - Basic scatter plot with two overlapping series. Based on d3 library,
23 - which is extremely fast and powerful. Customize it to visualize and
24 - analyze your data.
25 - </p>
26 - <ScatterplotChart />
27 - </Widget>
28 - </Col>
29 - </Row>
30 - <Row>
31 - <Col xs={12} lg={7} xl={8}>
32 - <Widget
33 - title={<h5>Line Chart - <span className="fw-semi-bold">Rickshaw</span></h5>}
34 - close collapse
35 - >
36 - <Alert className="alert-transparent rounded-0 mb-3" color="primary">
37 - <span className="fw-semi-bold">Important alert</span>: It&apos;s time to buy Tesla shares!
38 - </Alert>
39 - <LineChart />
40 - </Widget>
41 - </Col>
42 - <Col xs={12} lg={5} xl={4}>
43 - <Widget
44 - title={<h5>Stacked Bar Chart - <span className="fw-semi-bold">Rickshaw</span></h5>}
45 - close collapse
46 - >
47 - <p className="fs-mini text-muted">
48 - You can combine Rickshaw charts with <span className="fw-semi-bold">Bootstrap</span> components
49 - for data visualization and call to action.
50 - </p>
51 - <p className="text-muted">A simple success alertcheck it out!</p>
52 - <BarsChart colors={['#a7beff', '#d1dcff', '#ffebb2']} seriesLength={10} bars={3} stacked />
53 - </Widget>
54 - </Col>
55 - <Col lg={6} xs={12}>
56 - <Widget
57 - title={<h5>Bar Chart - <span className="fw-semi-bold">Rickshaw</span></h5>}
58 - collapse close
59 - >
60 - <p className="fs-mini text-muted">
61 - Rickshaw charts give you a possibility to enter the low level settings, when
62 - you need it, so you can always refer to d3 attributes and DOM elements to create
63 - your awesome custom chart.
64 - </p>
65 - <BarsChart colors={['#ace5d1', '#ffebb2']} seriesLength={12} bars={2} />
66 - </Widget>
67 - </Col>
68 - <Col lg={6} xs={12}>
69 - <Widget
70 - title={<h5>Realtime <span className="fw-semi-bold">Rickshaw</span></h5>}
71 - collapse close
72 - >
73 - <div>
74 - <p className="fs-mini text-muted mb-lg">
75 - Rickshaw provides the elements you need to create interactive graphs: renderers, legends,
76 - hovers, range selectors, etc. You put the pieces together.
77 - It&apos;s all based on <span className="fw-semi-bold">d3</span> underneath, so graphs are drawn with
78 - standard
79 - SVG and styled with CSS.
80 - Customize all you like with techniques you already know.
81 - </p>
82 - <h5>720 Users</h5>
83 - <Progress value="60" color="primary" size="xs" className="mb-sm progress-xs" />
84 - <p className="fs-mini text-muted mb-lg">
85 - <span className="circle bg-primary text-white">
86 - <i className="fa fa-circle" />
87 - </span>
88 - &nbsp;
89 - Target <span className="fw-semi-bold">820</span> users
90 - is <span className="fw-semi-bold">96%</span> reached.
91 - </p>
92 - <RealtimeChart />
93 - </div>
94 - </Widget>
95 - </Col>
96 - </Row>
97 - </div>
98 - );
99 - }
100 -}
101 -
102 -export default RickshawExamples;
1 -import React, { Component } from 'react';
2 -import PropTypes from 'prop-types';
3 -import $ from 'jquery';
4 -import Rickshaw from 'rickshaw';
5 -
6 -Rickshaw.Graph.Renderer.BarNoGap = Rickshaw.Class.create(Rickshaw.Graph.Renderer.Bar, {
7 - name: 'bar_with_gaps',
8 - barWidth(series) {
9 - const frequentInterval = this._frequentInterval(series.stack); // eslint-disable-line
10 - const barWidth = this.graph.x(series.stack[0].x + (frequentInterval.magnitude / 2));
11 - return barWidth;
12 - },
13 -});
14 -
15 -export default class BarsChart extends Component {
16 - static propTypes = {
17 - colors: PropTypes.arrayOf(PropTypes.string).isRequired,
18 - stacked: PropTypes.bool,
19 - seriesLength: PropTypes.number,
20 - }
21 -
22 - static defaultProps = {
23 - stacked: false,
24 - seriesLength: 10,
25 - }
26 -
27 - constructor(props) {
28 - super(props);
29 -
30 - const { stacked, colors } = this.props;
31 -
32 - this.options = { stacked, padding: { left: 0.03 } };
33 - this.colors = colors;
34 - }
35 -
36 - state = {
37 - graph: null,
38 - };
39 -
40 - componentDidMount() {
41 - this.createChart();
42 -
43 - window.addEventListener('resize', this.onResize);
44 - }
45 -
46 - componentWillUnmount() {
47 - window.removeEventListener('resize', this.onResize);
48 - }
49 -
50 - onResize = () => {
51 - const width = $(this.rickshawChart).closest('.widget-body')[0].clientWidth;
52 -
53 - this.state.graph.configure({ width });
54 -
55 - this.state.graph.render();
56 - }
57 -
58 - createChart() {
59 - const seriesData = this.options.stacked ? [[], [], []] : [[], []];
60 - const random = new Rickshaw.Fixtures.RandomData(30);
61 - for (let i = 0; i < this.props.seriesLength; i += 1) {
62 - random.addData(seriesData);
63 - }
64 - const series = seriesData.map((data, i) => ({
65 - name: `Series ${i + 1}`,
66 - color: this.colors[i % this.colors.length],
67 - data,
68 - }));
69 -
70 - // eslint-disable-next-line
71 - this.state.graph = new Rickshaw.Graph({
72 - padding: this.options.padding || {},
73 - element: this.rickshawChart,
74 - height: 180,
75 - renderer: 'bar_with_gaps',
76 - stack: this.options.stacked,
77 - series,
78 - });
79 -
80 - const hoverDetail = new Rickshaw.Graph.HoverDetail({ graph: this.state.graph });
81 - hoverDetail.show();
82 -
83 - this.state.graph.render();
84 - }
85 -
86 - render() {
87 - return (
88 - <div>
89 - <div ref={(r) => { this.rickshawChart = r; }} />
90 - </div>
91 - );
92 - }
93 -}
1 -import React, { Component } from 'react';
2 -import $ from 'jquery';
3 -import Rickshaw from 'rickshaw';
4 -
5 -export default class LineChart extends Component {
6 - state = {
7 - graph: null,
8 - };
9 -
10 - componentDidMount() {
11 - this.createChart();
12 -
13 - window.addEventListener('resize', this.onResize);
14 - }
15 -
16 - componentWillUnmount() {
17 - window.removeEventListener('resize', this.onResize);
18 - }
19 -
20 - onResize = () => {
21 - const width = $(this.rickshawChart).closest('.widget-body')[0].clientWidth - 30;
22 -
23 - this.state.graph.configure({ width });
24 -
25 - this.state.graph.render();
26 - }
27 -
28 - createChart() {
29 - const seriesData = [[], []];
30 - const random = new Rickshaw.Fixtures.RandomData(30);
31 - for (let i = 0; i < 30; i += 1) {
32 - random.addData(seriesData);
33 - }
34 -
35 - // eslint-disable-next-line
36 - this.state.graph = new Rickshaw.Graph({
37 - element: this.rickshawChart,
38 - height: 200,
39 - renderer: 'line',
40 - min: 45,
41 - series: [
42 - {
43 - color: '#b7b3ff',
44 - data: seriesData[0],
45 - name: 'Series 1',
46 - }, {
47 - color: '#e2e1ff',
48 - data: seriesData[1],
49 - name: 'Series 2',
50 - },
51 - ],
52 - });
53 -
54 - const hoverDetail = new Rickshaw.Graph.HoverDetail({ graph: this.state.graph });
55 - hoverDetail.show();
56 -
57 - new Rickshaw.Graph.Axis.Y({ // eslint-disable-line
58 - graph: this.state.graph,
59 - orientation: 'left',
60 - tickFormat: Rickshaw.Fixtures.Number.formatKMBT,
61 - element: this.axis,
62 - });
63 -
64 - this.state.graph.render();
65 - }
66 -
67 - render() {
68 - return (
69 - <div>
70 - <div ref={(r) => { this.rickshawChart = r; }} style={{ left: '30px', maxWidth: '90%' }} />
71 - <div ref={(r) => { this.axis = r; }} style={{ position: 'absolute', width: '30px', height: '300px', top: '102px' }} />
72 - </div>
73 - );
74 - }
75 -}
1 -import React, { Component } from 'react';
2 -import $ from 'jquery';
3 -import Rickshaw from 'rickshaw';
4 -
5 -export default class RealtimeChart extends Component {
6 - state = {
7 - graph: null,
8 - };
9 -
10 - componentDidMount() {
11 - this.createChart();
12 -
13 - window.addEventListener('resize', this.onResize);
14 - }
15 -
16 - componentWillUnmount() {
17 - window.removeEventListener('resize', this.onResize);
18 - }
19 -
20 - onResize = () => {
21 - const width = $(this.rickshawChart).closest('.widget-body')[0].clientWidth + 40;
22 -
23 - this.state.graph.configure({ width });
24 -
25 - this.state.graph.render();
26 - }
27 -
28 - createChart() {
29 - const seriesData = [[], []];
30 - const random = new Rickshaw.Fixtures.RandomData(30);
31 - for (let i = 0; i < 30; i += 1) {
32 - random.addData(seriesData);
33 - }
34 -
35 - // eslint-disable-next-line
36 - this.state.graph = new Rickshaw.Graph({
37 - element: this.rickshawChart,
38 - height: 80,
39 - series: [
40 - {
41 - color: '#d1dcff',
42 - data: seriesData[0],
43 - name: 'Uploads',
44 - }, {
45 - color: '#547fff',
46 - data: seriesData[1],
47 - name: 'Downloads',
48 - },
49 - ],
50 - });
51 -
52 - const hoverDetail = new Rickshaw.Graph.HoverDetail({
53 - graph: this.state.graph,
54 - xFormatter: x => new Date(x * 1000).toString(),
55 - });
56 -
57 - hoverDetail.show();
58 -
59 - setInterval(() => {
60 - random.removeData(seriesData);
61 - random.addData(seriesData);
62 - this.state.graph.update();
63 - }, 1000);
64 -
65 - this.state.graph.render();
66 - }
67 -
68 - render() {
69 - return (
70 - <div>
71 - <div className="chart-overflow-bottom" ref={(r) => { this.rickshawChart = r; }} />
72 - </div>
73 - );
74 - }
75 -}
1 -import React, { Component } from 'react';
2 -import $ from 'jquery';
3 -import Rickshaw from 'rickshaw';
4 -
5 -export default class ScatterplotChart extends Component {
6 - state = {
7 - graph: null,
8 - };
9 -
10 - componentDidMount() {
11 - this.createChart();
12 -
13 - window.addEventListener('resize', this.onResize);
14 - }
15 -
16 - componentWillUnmount() {
17 - window.removeEventListener('resize', this.onResize);
18 - }
19 -
20 - onResize = () => {
21 - const width = $(this.rickshawChart).closest('.widget-body')[0].clientWidth - 30;
22 -
23 - this.state.graph.configure({ width });
24 -
25 - this.state.graph.render();
26 - }
27 -
28 - createChart() {
29 - const seriesData = [[], []];
30 - const random = new Rickshaw.Fixtures.RandomData();
31 - for (let i = 0; i < 150; i += 1) {
32 - random.addData(seriesData);
33 - }
34 -
35 - // eslint-disable-next-line
36 - this.state.graph = new Rickshaw.Graph({
37 - element: this.rickshawChart,
38 - height: 250,
39 - renderer: 'scatterplot',
40 - series: [
41 - {
42 - color: '#ffd7de',
43 - data: seriesData[0],
44 - name: 'Series 1',
45 - }, {
46 - color: '#8fe5d4',
47 - data: seriesData[1],
48 - name: 'Series 2',
49 - },
50 - ],
51 - });
52 -
53 - const hoverDetail = new Rickshaw.Graph.HoverDetail({ graph: this.state.graph });
54 -
55 - hoverDetail.show();
56 -
57 - this.state.graph.render();
58 - }
59 -
60 - render() {
61 - return (
62 - <div>
63 - <div ref={(r) => { this.rickshawChart = r; }} />
64 - </div>
65 - );
66 - }
67 -}
1 -import React, { Component } from 'react';
2 -import { Col, Row, Alert, Progress, Button, ButtonGroup, Input, InputGroup, InputGroupAddon } from 'reactstrap';
3 -import $ from 'jquery';
4 -/* eslint-disable */
5 -import 'imports-loader?jQuery=jquery,this=>window!jquery-sparkline';
6 -/* eslint-enable */
7 -import Widget from '../../../components/Widget';
8 -
9 -class Sparkline extends Component {
10 - state = { isAlertVisible: true }
11 -
12 - componentDidMount() {
13 - this.initCharts();
14 -
15 - window.addEventListener('resize', this.initCharts);
16 - }
17 -
18 - componentWillUnmount() {
19 - window.removeEventListener('resize', this.initCharts);
20 - }
21 -
22 - initCharts = () => {
23 - this.initSparkline1();
24 - this.initSparkline2();
25 - this.initSparkline3();
26 - this.initSparkline4();
27 - this.initSparkline5();
28 - this.initSparkline6();
29 - this.initSparkline7();
30 - }
31 -
32 - toggleAlert = () => {
33 - this.setState(prevState => ({ isAlertVisible: !prevState.isAlertVisible }));
34 - }
35 -
36 - generateRandomArr(length, min, max, isFloat) { // eslint-disable-line
37 - const result = [];
38 - const maxDefault = 100;
39 - const minDefault = -100;
40 - let rand = 0;
41 -
42 - min = min === 0 ? 0 : (min || minDefault); // eslint-disable-line
43 - max = max === 0 ? 0 : (max || maxDefault); // eslint-disable-line
44 -
45 - for (let i = 0; i < length; i += 1) {
46 - rand = Math.random() * (Math.abs(result[i - 1] / 10) || 1) * [min, max][i % 2];
47 - rand = rand < min ? min : rand;
48 - result.push(isFloat ? rand : Math.round(rand));
49 - }
50 -
51 - return result;
52 - }
53 -
54 - initSparkline1() {
55 - this.$sparkline1.sparkline(this.generateRandomArr(80, -150), {
56 - type: 'bar',
57 - height: '140px',
58 - width: '100%',
59 - barWidth: 6,
60 - barSpacing: 3,
61 - barColor: '#ffebb2',
62 - negBarColor: '#f59f9f',
63 - });
64 -
65 - // Chrome and Safari fix for to set correct width to chart
66 - this.$sparkline1.find('canvas').css({ width: this.$sparkline1.width() });
67 - }
68 -
69 - initSparkline2() {
70 - this.$sparkline2.sparkline(this.generateRandomArr(6, 4, 15), {
71 - type: 'pie',
72 - width: '200px',
73 - height: '200px',
74 - sliceColors: ['#ffd7de', '#8fe5d4', '#ace5d1', '#ffebb2', '#fff8e3'],
75 - highlightLighten: 1.05,
76 - });
77 - }
78 -
79 - initSparkline3() {
80 - this.$sparkline3.sparkline(this.generateRandomArr(5), {
81 - width: '100%',
82 - fillColor: '#ffebb2',
83 - height: '100px',
84 - lineColor: 'transparent',
85 - spotColor: '#c0d0f0',
86 - minSpotColor: null,
87 - maxSpotColor: null,
88 - highlightSpotColor: '#ddd',
89 - highlightLineColor: '#ddd',
90 - }).sparkline(this.generateRandomArr(7), {
91 - composite: true,
92 - lineColor: 'transparent',
93 - spotColor: '#c0d0f0',
94 - fillColor: '#ace5d1',
95 - minSpotColor: null,
96 - maxSpotColor: null,
97 - highlightSpotColor: '#ddd',
98 - highlightLineColor: '#ddd',
99 - });
100 - }
101 -
102 - initSparkline4() {
103 - this.$sparkline4.sparkline(this.generateRandomArr(10, 10, 30), {
104 - type: 'line',
105 - width: '100%',
106 - height: '200px',
107 - lineColor: '#a7beff',
108 - fillColor: '#d1dcff',
109 - lineWidth: 2,
110 - spotColor: '#547fff',
111 - minSpotColor: '#fdf7e6',
112 - maxSpotColor: '#f55d5d',
113 - highlightSpotColor: '#547fff',
114 - highlightLineColor: '#ffffff',
115 - spotRadius: 1,
116 - chartRangeMin: 5,
117 - chartRangeMax: 7,
118 - normalRangeColor: '#547fff',
119 - drawNormalOnTop: true,
120 - });
121 - }
122 -
123 - initSparkline5() {
124 - this.$sparkline5.sparkline(this.generateRandomArr(2, 8, 15), {
125 - type: 'pie',
126 - width: '100px',
127 - height: '100px',
128 - sliceColors: ['#f59f9f', '#ffd7de'],
129 - highlightLighten: 1.1,
130 - });
131 - }
132 -
133 - initSparkline6() {
134 - this.$sparkline6.sparkline(this.generateRandomArr(102, -1, 1), {
135 - type: 'tristate',
136 - height: '100px',
137 - width: '100%',
138 - posBarColor: '#ffebb2',
139 - negBarColor: '#b7b3ff',
140 - zeroBarColor: '#d6dee5',
141 - barWidth: 5,
142 - barSpacing: 3,
143 - zeroAxis: true,
144 - });
145 -
146 - // Chrome and Safari fix for to set correct width to chart
147 - this.$sparkline6.find('canvas').css({ width: this.$sparkline6.width() });
148 - }
149 -
150 - initSparkline7() {
151 - this.$sparkline7.sparkline(this.generateRandomArr(15, 10, 100, true), {
152 - width: '100%',
153 - height: '200px',
154 - lineColor: '#547fff',
155 - fillColor: false,
156 - });
157 - }
158 -
159 - render() {
160 - return (
161 - <div>
162 - <Row>
163 - <Col xs={12} lg={6} xl={5}>
164 - <Widget
165 - title={<h5>Sparkline <span className="fw-semi-bold">Bar Chart</span></h5>}
166 - close collapse
167 - >
168 - <p className="fs-mini text-muted">Each example displayed below takes just 1 line of HTML or javascript to generate.</p>
169 - <div className="chart-overflow-bottom" ref={(r) => { this.$sparkline1 = $(r); }} />
170 - <div className="stats-row text-muted mt-xlg">
171 - <div className="stat-item">
172 - <h6 className="name">ARR ($)</h6>
173 - <p className="value">4 375 800</p>
174 - </div>
175 - <div className="stat-item">
176 - <h6 className="name">MRR ($)</h6>
177 - <p className="value">863 425</p>
178 - </div>
179 - <div className="stat-item">
180 - <h6 className="name">TTN ($)</h6>
181 - <p className="value">5 634 100</p>
182 - </div>
183 - <div className="stat-item">
184 - <h6 className="name">MRR / ARR </h6>
185 - <p className="value">0.1634</p>
186 - </div>
187 - </div>
188 - <hr />
189 - <div className="d-flex justify-content-between">
190 - <small>
191 - <span className="badge badge-warning">Profit</span> Legend Item Emulation
192 - </small>
193 - <small>
194 - <span className="badge badge-danger">Loss</span> Legend Item Emulation
195 - </small>
196 - </div>
197 - </Widget>
198 - </Col>
199 - <Col xs={12} lg={6} xl={4}>
200 - <Widget
201 - title={<h5>Sparkline <span className="fw-semi-bold">Pie Chart</span></h5>}
202 - close collapse
203 - >
204 - <p className="fs-mini text-muted">Each example displayed below takes just 1 line of HTML or javascript to generate.</p>
205 - <div className="text-center" ref={(r) => { this.$sparkline2 = $(r); }} />
206 - <Alert className="text-muted" color="white" isOpen={this.state.isAlertVisible} toggle={this.toggleAlert}>
207 - <h5>Sales Report</h5>
208 - <Progress className="progress-xs" color="secondary" value="16" />
209 - <p className="text-muted"><small>Prev year quota achievement 16%. Should work harder!</small></p>
210 - </Alert>
211 - </Widget>
212 - </Col>
213 - <Col xs={12} lg={6} xl={3}>
214 - <Widget
215 - title={<h5>Area <span className="fw-semi-bold">Sparkline</span></h5>}
216 - close collapse
217 - >
218 - <p className="fs-mini text-muted">Each example displayed below takes just 1 line of HTML or javascript to generate.</p>
219 - <div className="stats-row text-muted mt">
220 - <div className="stat-item">
221 - <h6 className="name">Overall Growth</h6>
222 - <p className="value">43.75%</p>
223 - </div>
224 - <div className="stat-item">
225 - <h6 className="name">Montly</h6>
226 - <p className="value">86.34%</p>
227 - </div>
228 - </div>
229 - <p className="text-muted fs-mini">
230 - <span className="fw-semi-bold">17% higher</span> than last month
231 - </p>
232 - <div className="chart-overflow-bottom" ref={(r) => { this.$sparkline3 = $(r); }} />
233 - </Widget>
234 - </Col>
235 - </Row>
236 - <Row>
237 - <Col xs={12} lg={7} xl={9}>
238 - <Widget
239 - title={<h5>Sparkline <span className="fw-semi-bold">Line Chart</span></h5>}
240 - close collapse
241 - >
242 - <p className="fs-mini text-muted">Each example displayed below takes just 1 line of HTML or javascript to generate.</p>
243 - <div className="chart-overflow-bottom" ref={(r) => { this.$sparkline4 = $(r); }} />
244 - </Widget>
245 - </Col>
246 - <Col xs={12} lg={5} xl={3}>
247 - <Widget
248 - title={<h5>Sparkline <span className="fw-semi-bold">Pie Chart</span></h5>}
249 - close collapse
250 - >
251 - <p className="fs-mini text-muted">Each example displayed below takes just 1 line of HTML or javascript to generate.</p>
252 - <div className="text-center" ref={(r) => { this.$sparkline5 = $(r); }} />
253 - <p className="mt">Possible actions:</p>
254 - <ButtonGroup>
255 - <Button color="light">Yoga</Button>
256 - <Button color="light">Coffee</Button>
257 - <Button color="light">Dancing</Button>
258 - </ButtonGroup>
259 - </Widget>
260 - </Col>
261 - <Col xs={12} lg={6}>
262 - <Widget
263 - title={<h5>Sparkline <span className="fw-semi-bold">Pie Chart</span></h5>}
264 - close collapse
265 - >
266 - <InputGroup>
267 - <Input type="text" size={16} placeholder="Filter By Period: MM/DD/YYY" />
268 - <InputGroupAddon><i className="fa fa-search text-gray" /></InputGroupAddon>
269 - </InputGroup>
270 - <p className="fs-mini text-muted mt">Each example displayed below takes just 1 line of HTML or javascript to generate.</p>
271 - <div className="chart-overflow-bottom" ref={(r) => { this.$sparkline6 = $(r); }} />
272 - </Widget>
273 - </Col>
274 - <Col xs={12} lg={6}>
275 - <Widget
276 - title={<h5>Sparkline <span className="fw-semi-bold">Line Chart</span></h5>}
277 - close collapse
278 - >
279 - <p className="fs-mini text-muted">Each example displayed below takes just 1 line of HTML or javascript to generate.</p>
280 - <div className="chart-overflow-bottom" ref={(r) => { this.$sparkline7 = $(r); }} />
281 - </Widget>
282 - </Col>
283 - </Row>
284 - </div>
285 - );
286 - }
287 -}
288 -
289 -export default Sparkline;
1 -import React from 'react';
2 -import {
3 - Row,
4 - Col,
5 - Progress,
6 - Table,
7 - Label,
8 - Input,
9 -} from 'reactstrap';
10 -
11 -import Widget from '../../components/Widget';
12 -
13 -/* eslint-disable */
14 -import Calendar from './components/calendar/Calendar';
15 -import Map from './components/mapael-map/MapaelMap';
16 -import Rickshaw from './components/rickshaw/Rickshaw';
17 -/* eslint-enable */
18 -
19 -import AnimateNumber from 'react-animated-number';
20 -
21 -import s from './Dashboard.module.scss';
22 -
23 -import peopleA1 from '../../images/people/a1.jpg';
24 -import peopleA2 from '../../images/people/a2.jpg';
25 -import peopleA5 from '../../images/people/a5.jpg';
26 -import peopleA4 from '../../images/people/a4.jpg';
27 -
28 -class Dashboard extends React.Component {
29 -
30 - constructor(props) {
31 - super(props);
32 - this.state = {
33 - graph: null,
34 - checkedArr: [false, false, false],
35 - };
36 - this.checkTable = this.checkTable.bind(this);
37 - }
38 -
39 - checkTable(id) {
40 - let arr = [];
41 - if (id === 0) {
42 - const val = !this.state.checkedArr[0];
43 - for (let i = 0; i < this.state.checkedArr.length; i += 1) {
44 - arr[i] = val;
45 - }
46 - } else {
47 - arr = this.state.checkedArr;
48 - arr[id] = !arr[id];
49 - }
50 - if (arr[0]) {
51 - let count = 1;
52 - for (let i = 1; i < arr.length; i += 1) {
53 - if (arr[i]) {
54 - count += 1;
55 - }
56 - }
57 - if (count !== arr.length) {
58 - arr[0] = !arr[0];
59 - }
60 - }
61 - this.setState({
62 - checkedArr: arr,
63 - });
64 - }
65 -
66 - render() {
67 - return (
68 - <div className={s.root}>
69 - <h1 className="page-title">Dashboard &nbsp;
70 - <small>
71 - <small>The Lucky One</small>
72 - </small>
73 - </h1>
74 -
75 - <Row>
76 - <Col lg={7}>
77 - <Widget className="bg-transparent">
78 - <Map />
79 - </Widget>
80 - </Col>
81 - <Col lg={1} />
82 -
83 - <Col lg={4}>
84 - <Widget
85 - className="bg-transparent"
86 - title={<h5> Map
87 - <span className="fw-semi-bold">&nbsp;Statistics</span></h5>} settings refresh close
88 - >
89 - <p>Status: <strong>Live</strong></p>
90 - <p>
91 - <span className="circle bg-warning text-white"><i className="fa fa-map-marker" /></span> &nbsp;
92 - 146 Countries, 2759 Cities
93 - </p>
94 - <div className="row progress-stats">
95 - <div className="col-md-9 col-12">
96 - <h6 className="name">Foreign Visits</h6>
97 - <p className="description deemphasize mb-xs">Some Cool Text</p>
98 - <Progress color="primary" value="60" className="bg-white progress-xs" />
99 - </div>
100 - <div className="col-md-3 col-12 text-center">
101 - <span className="status rounded rounded-lg bg-body-light">
102 - <small><AnimateNumber value={75} />%</small>
103 - </span>
104 - </div>
105 - </div>
106 - <div className="row progress-stats">
107 - <div className="col-md-9 col-12">
108 - <h6 className="name">Local Visits</h6>
109 - <p className="description deemphasize mb-xs">P. to C. Conversion</p>
110 - <Progress color="danger" value="39" className="bg-white progress-xs" />
111 - </div>
112 - <div className="col-md-3 col-12 text-center">
113 - <span className="status rounded rounded-lg bg-body-light">
114 - <small><AnimateNumber value={84} />%</small>
115 - </span>
116 - </div>
117 - </div>
118 - <div className="row progress-stats">
119 - <div className="col-md-9 col-12">
120 - <h6 className="name">Sound Frequencies</h6>
121 - <p className="description deemphasize mb-xs">Average Bitrate</p>
122 - <Progress color="success" value="80" className="bg-white progress-xs" />
123 - </div>
124 - <div className="col-md-3 col-12 text-center">
125 - <span className="status rounded rounded-lg bg-body-light">
126 - <small><AnimateNumber value={92} />%</small>
127 - </span>
128 - </div>
129 - </div>
130 - <h6 className="fw-semi-bold mt">Map Distributions</h6>
131 - <p>Tracking: <strong>Active</strong></p>
132 - <p>
133 - <span className="circle bg-warning text-white"><i className="fa fa-cog" /></span>
134 - &nbsp; 391 elements installed, 84 sets
135 - </p>
136 - <div className="input-group mt">
137 - <input type="text" className="form-control" placeholder="Search Map" />
138 - <span className="input-group-btn">
139 - <button type="submit" className="btn btn-default">
140 - <i className="fa fa-search text-gray" />
141 - </button>
142 - </span>
143 - </div>
144 -
145 - </Widget>
146 - </Col>
147 -
148 - </Row>
149 -
150 - <Row>
151 - <Col lg={4} xs={12}>
152 - <Widget
153 - title={<h6> USERBASE GROWTH </h6>}
154 - close settings
155 - >
156 - <div className="stats-row">
157 - <div className="stat-item">
158 - <h6 className="name">Overall Growth</h6>
159 - <p className="value">76.38%</p>
160 - </div>
161 - <div className="stat-item">
162 - <h6 className="name">Montly</h6>
163 - <p className="value">10.38%</p>
164 - </div>
165 - <div className="stat-item">
166 - <h6 className="name">24h</h6>
167 - <p className="value">3.38%</p>
168 - </div>
169 - </div>
170 - <Progress color="success" value="60" className="bg-gray-lighter progress-xs" />
171 - <p>
172 - <small>
173 - <span className="circle bg-warning text-white">
174 - <i className="fa fa-chevron-up" />
175 - </span>
176 - </small>
177 - <span className="fw-semi-bold">&nbsp;17% higher</span>
178 - &nbsp;than last month
179 - </p>
180 - </Widget>
181 - </Col>
182 - <Col lg={4} xs={12}>
183 - <Widget
184 - title={<h6> TRAFFIC VALUES </h6>}
185 - close settings
186 - >
187 - <div className="stats-row">
188 - <div className="stat-item">
189 - <h6 className="name">Overall Values</h6>
190 - <p className="value">17 567 318</p>
191 - </div>
192 - <div className="stat-item">
193 - <h6 className="name">Montly</h6>
194 - <p className="value">55 120</p>
195 - </div>
196 - <div className="stat-item">
197 - <h6 className="name">24h</h6>
198 - <p className="value">9 695</p>
199 - </div>
200 - </div>
201 - <Progress color="danger" value="60" className="bg-gray-lighter progress-xs" />
202 - <p>
203 - <small><span className="circle bg-warning text-white"><i className="fa fa-chevron-down" /></span></small>
204 - <span className="fw-semi-bold">&nbsp;8% lower</span>
205 - &nbsp;than last month
206 - </p>
207 - </Widget>
208 - </Col>
209 - <Col lg={4} xs={12}>
210 - <Widget
211 - title={<h6> RANDOM VALUES </h6>}
212 - close settings
213 - >
214 - <div className="stats-row">
215 - <div className="stat-item">
216 - <h6 className="name fs-sm">Overcome T.</h6>
217 - <p className="value">104.85%</p>
218 - </div>
219 - <div className="stat-item">
220 - <h6 className="name fs-sm">Takeoff Angle</h6>
221 - <p className="value">14.29&deg;</p>
222 - </div>
223 - <div className="stat-item">
224 - <h6 className="name fs-sm">World Pop.</h6>
225 - <p className="value">7,211M</p>
226 - </div>
227 - </div>
228 - <Progress color="bg-primary" value="60" className="bg-gray-lighter progress-xs" />
229 - <p>
230 - <small><span className="circle bg-warning text-white"><i className="fa fa-plus" /></span></small>
231 - <span className="fw-semi-bold">&nbsp;8 734 higher</span>
232 - &nbsp;than last month
233 - </p>
234 - </Widget>
235 - </Col>
236 -
237 - </Row>
238 -
239 - <Row>
240 - <Col lg={4} xs={12}>
241 - <Widget
242 - title={<h6><span className="badge badge-danger">New</span> Messages</h6>}
243 - refresh close
244 - >
245 - <div className="widget-body p-0">
246 - <div className="list-group list-group-lg">
247 - <button className="list-group-item text-left">
248 - <span className="thumb-sm float-left mr">
249 - <img className="rounded-circle" src={peopleA2} alt="..." />
250 - <i className="status status-bottom bg-success" />
251 - </span>
252 - <div>
253 - <h6 className="m-0">Chris Gray</h6>
254 - <p className="help-block text-ellipsis m-0">Hey! What&apos;s up? So many times since we</p>
255 - </div>
256 - </button>
257 - <button className="list-group-item text-left">
258 - <span className="thumb-sm float-left mr">
259 - <img className="rounded-circle" src={peopleA4} alt="..." />
260 - <i className="status status-bottom bg-success" />
261 - </span>
262 - <div>
263 - <h6 className="m-0">Jamey Brownlow</h6>
264 - <p className="help-block text-ellipsis m-0">Good news coming tonight. Seems they agreed to
265 - proceed</p>
266 - </div>
267 - </button>
268 - <button className="list-group-item text-left">
269 - <span className="thumb-sm float-left mr">
270 - <img className="rounded-circle" src={peopleA1} alt="..." />
271 - <i className="status status-bottom bg-warning" />
272 - </span>
273 - <div>
274 - <h6 className="m-0">Livia Walsh</h6>
275 - <p className="help-block text-ellipsis m-0">Check my latest email plz!</p>
276 - </div>
277 - </button>
278 - <button className="list-group-item text-left">
279 - <span className="thumb-sm float-left mr">
280 - <img className="rounded-circle" src={peopleA5} alt="..." />
281 - <i className="status status-bottom bg-danger" />
282 - </span>
283 - <div>
284 - <h6 className="m-0">Jaron Fitzroy</h6>
285 - <p className="help-block text-ellipsis m-0">What about summer break?</p>
286 - </div>
287 - </button>
288 - </div>
289 - </div>
290 - <footer className="bg-body-light mt">
291 - <input type="search" className="form-control form-control-sm" placeholder="Search" />
292 - </footer>
293 -
294 - </Widget>
295 - </Col>
296 -
297 - <Col lg={4} xs={12}>
298 - <Widget
299 - title={<h6> Market <span className="fw-semi-bold">Stats</span></h6>} close
300 - >
301 -
302 - <div className="widget-body">
303 - <h3>$720 Earned</h3>
304 - <p className="fs-mini text-muted mb mt-sm">
305 - Target <span className="fw-semi-bold">$820</span> day earnings
306 - is <span className="fw-semi-bold">96%</span> reached.
307 - </p>
308 - </div>
309 - <div className={`widget-table-overflow ${s.table}`}>
310 - <Table striped size="sm">
311 - <thead className="no-bd">
312 - <tr>
313 - <th>
314 - <div className="checkbox abc-checkbox">
315 - <Input
316 - className="mt-0"
317 - id="checkbox210" type="checkbox" onClick={() => this.checkTable(0)}
318 - checked={this.state.checkedArr[0]}
319 - readOnly
320 - />{' '}
321 - <Label for="checkbox210" />
322 - </div>
323 - </th>
324 - <th>&nbsp;</th>
325 - <th>&nbsp;</th>
326 - </tr>
327 - </thead>
328 - <tbody>
329 - <tr>
330 - <td>
331 - <div className="checkbox abc-checkbox">
332 - <Input
333 - className="mt-0"
334 - id="checkbox212" type="checkbox" onClick={() => this.checkTable(1)}
335 - checked={this.state.checkedArr[1]}
336 - readOnly
337 - />{' '}
338 - <Label for="checkbox212" />
339 - </div>
340 - </td>
341 - <td>HP Core i7</td>
342 - <td className="text-align-right fw-semi-bold">$346.1</td>
343 - </tr>
344 - <tr>
345 - <td>
346 - <div className="checkbox abc-checkbox">
347 - <Input
348 - className="mt-0"
349 - id="checkbox214" onClick={() => this.checkTable(2)} type="checkbox"
350 - checked={this.state.checkedArr[2]}
351 - readOnly
352 - />{' '}
353 - <Label for="checkbox214" />
354 - </div>
355 - </td>
356 - <td>Air Pro</td>
357 - <td className="text-align-right fw-semi-bold">$533.1</td>
358 - </tr>
359 - </tbody>
360 - </Table>
361 - </div>
362 -
363 - <div className="widget-body mt-xlg chart-overflow-bottom" style={{ height: '100px' }}>
364 - <Rickshaw height={100} />
365 - </div>
366 -
367 - </Widget>
368 - </Col>
369 -
370 - <Col lg={4} xs={12}>
371 - <Widget title={<h6>Calendar</h6>} settings close bodyClass="p-0">
372 - <Calendar />
373 - <div className="list-group fs-mini">
374 - <button className="list-group-item text-ellipsis">
375 - <span className="badge badge-pill badge-warning float-right">6:45</span>
376 - Weed out the flower bed
377 - </button>
378 - <button className="list-group-item text-ellipsis">
379 - <span className="badge badge-pill badge-success float-right">9:41</span>
380 - Stop world water pollution
381 - </button>
382 - </div>
383 - </Widget>
384 - </Col>
385 -
386 - </Row>
387 -
388 - </div>
389 - );
390 - }
391 -}
392 -
393 -export default Dashboard;
1 -import React from 'react';
2 -import PropTypes from 'prop-types';
3 -import cx from 'classnames';
4 -
5 -/* eslint-disable */
6 -import $ from 'jquery';
7 -import 'imports-loader?jQuery=jquery,this=>window!bootstrap';
8 -import 'imports-loader?jQuery=jquery,this=>window!bootstrap_calendar/bootstrap_calendar/js/bootstrap_calendar';
9 -/* eslint-enable */
10 -
11 -import './Calendar.scss';
12 -
13 -const monthNames = [
14 - 'January',
15 - 'February',
16 - 'March',
17 - 'April',
18 - 'May',
19 - 'June',
20 - 'July',
21 - 'August',
22 - 'September',
23 - 'October',
24 - 'November',
25 - 'December',
26 -];
27 -const dayNames = ['S', 'M', 'T', 'W', 'T', 'F', 'S'];
28 -
29 -class Calendar extends React.Component {
30 - static propTypes = {
31 - white: PropTypes.bool,
32 - }
33 -
34 - static defaultProps = {
35 - white: false,
36 - }
37 -
38 - componentDidMount() {
39 - const $calendar = $(this.element);
40 - const now = new Date();
41 - const month = now.getMonth() + 1;
42 - const year = now.getFullYear();
43 - const events = [
44 - [
45 - `2/${month}/${year}`,
46 - 'The flower bed',
47 - '#',
48 - '#547fff',
49 - 'Contents here',
50 - ],
51 - [
52 - `5/${month}/${year}`,
53 - 'Stop world water pollution',
54 - '#',
55 - '#ffc247',
56 - 'Have a kick off meeting with .inc company',
57 - ],
58 - [
59 - `18/${month}/${year}`,
60 - 'Light Blue 2.2 release',
61 - '#',
62 - '#3abf94',
63 - 'Some contents here',
64 - ],
65 - [
66 - `29/${month}/${year}`,
67 - 'A link',
68 - 'http://www.flatlogic.com',
69 - '#f55d5d',
70 - ],
71 - ];
72 - $calendar.calendar({
73 - months: monthNames,
74 - days: dayNames,
75 - events,
76 - popover_options: {
77 - placement: 'top',
78 - html: true,
79 - },
80 - });
81 - $calendar.find('.icon-arrow-left').addClass('la la-arrow-left');
82 - $calendar.find('.icon-arrow-right').addClass('la la-arrow-right');
83 - const restyleCalendar = () => {
84 - $calendar.find('.event').each((index, el) => {
85 - const $eventIndicator = $('<span></span>');
86 - $eventIndicator
87 - .css('background-color', $(el).css('background-color'))
88 - .appendTo($(el).find('a'));
89 - $(el).css('background-color', '');
90 - });
91 - };
92 - $calendar.find('.icon-arrow-left, .icon-arrow-right').parent().on('click', restyleCalendar);
93 - restyleCalendar();
94 - }
95 -
96 - render() {
97 - return (<div ref={(el) => this.element = el} className={cx('calendar', { 'calendar-white': this.props.white })} />);
98 - }
99 -}
100 -
101 -export default Calendar;
1 -@import '../../../../styles/app';
2 -
3 -/*
4 -* Bootstrap calendar
5 -*/
6 -
7 -.calendar {
8 - font-size: $font-size-mini;
9 - background: $gray-light;
10 -
11 - :global {
12 - .la {
13 - color: #798892;
14 - }
15 - }
16 -}
17 -
18 -.calendar-white {
19 - background: $white;
20 -
21 - .calendar {
22 - background: inherit;
23 - }
24 -}
25 -
26 -.calendar a {
27 - text-decoration: none;
28 - cursor: pointer;
29 - color: $gray-800 !important;
30 - display: inline-block;
31 - width: 30px;
32 - height: 30px;
33 - line-height: 30px;
34 - position: relative;
35 -}
36 -
37 -.calendar td {
38 - text-align: center;
39 - font-size: 110%;
40 -}
41 -
42 -.calendar .header {
43 - padding: 10px 0;
44 - color: #666;
45 -
46 - i {
47 - cursor: pointer;
48 - }
49 -}
50 -
51 -.calendar .prev_month {
52 - float: left;
53 -}
54 -
55 -.calendar .next_month {
56 - float: right;
57 -}
58 -
59 -.calendar .year {
60 - text-align: center;
61 - font-weight: 500;
62 -}
63 -
64 -.calendar .week_days {
65 - color: $gray-600;
66 - font-size: 80%;
67 -}
68 -
69 -.calendar .event {
70 - color: white;
71 - font-weight: bold;
72 - background-color: transparent;
73 -
74 - &:hover {
75 - > a {
76 - background-color: $gray-200;
77 - }
78 - }
79 -
80 - > a {
81 - background-color: $white;
82 -
83 - @include border-radius(50%);
84 -
85 - > span {
86 - display: inline-block;
87 - width: 6px;
88 - height: 6px;
89 - position: absolute;
90 - bottom: 1px;
91 - right: 1px;
92 -
93 - @include border-radius(50%);
94 - }
95 - }
96 -
97 - .popover {
98 - color: $text-color;
99 - }
100 -}
101 -
102 -.calendar .table td {
103 - padding: 3px 0;
104 - border-top: 0;
105 -}
106 -
107 -.calendar .table {
108 - margin-bottom: 3px;
109 -
110 - &.header {
111 - margin-bottom: $spacer;
112 - }
113 -}
114 -
115 -.calendar .visualmonthyear {
116 - font-size: 1.25rem;
117 - color: #757575;
118 -}
119 -
120 -.dropdown-menu .calendar td a {
121 - padding: 0;
122 -}
1 -import React from 'react';
2 -
3 -/* eslint-disable */
4 -import $ from 'jquery';
5 -import 'imports-loader?$=jquery,this=>window!jquery-mapael/js/maps/usa_states';
6 -import 'imports-loader?$=jquery,this=>window!jquery-mapael/js/jquery.mapael';
7 -/* eslint-enable */
8 -
9 -import AnimateNumber from 'react-animated-number';
10 -import s from './MapaelMap.module.scss';
11 -
12 -class MapaelMap extends React.Component {
13 -
14 - componentDidMount() {
15 - let state = '';
16 - const geoLocationData = {
17 - map: {
18 - name: 'usa_states',
19 - defaultArea: {
20 - attrs: {
21 - fill: '#e5e7f1',
22 - stroke: '#fafbff',
23 - },
24 - attrsHover: {
25 - fill: '#e9ebf6',
26 - animDuration: 50,
27 - },
28 - tooltip: {
29 - content: () => `<strong>${state}</strong>`,
30 - },
31 - eventHandlers: {
32 - mouseover: (e, id) => {
33 - state = id;
34 - },
35 - },
36 - },
37 - defaultPlot: {
38 - size: 17,
39 - attrs: {
40 - fill: '#ffc247',
41 - stroke: '#fff',
42 - 'stroke-width': 0,
43 - 'stroke-linejoin': 'round',
44 - },
45 - attrsHover: {
46 - 'stroke-width': 1,
47 - animDuration: 100,
48 - },
49 - },
50 - zoom: {
51 - enabled: true,
52 - step: 0.75,
53 - mousewheel: false,
54 - },
55 - },
56 - plots: {
57 - ny: {
58 - latitude: 40.717079,
59 - longitude: -74.00116,
60 - tooltip: { content: 'New York' },
61 - },
62 - on: {
63 - latitude: 33.145235,
64 - longitude: -83.811834,
65 - size: 18,
66 - tooltip: { content: 'Oconee National Forest' },
67 - },
68 - sf: {
69 - latitude: 37.792032,
70 - longitude: -122.394613,
71 - size: 12,
72 - tooltip: { content: 'San Francisco' },
73 - },
74 - la: {
75 - latitude: 26.935080,
76 - longitude: -80.851766,
77 - size: 26,
78 - tooltip: { content: 'Lake Okeechobee' },
79 - },
80 - gc: {
81 - latitude: 36.331308,
82 - longitude: -83.336050,
83 - size: 10,
84 - tooltip: { content: 'Grainger County' },
85 - },
86 - cc: {
87 - latitude: 36.269356,
88 - longitude: -76.587477,
89 - size: 22,
90 - tooltip: { content: 'Chowan County' },
91 - },
92 - ll: {
93 - latitude: 30.700644,
94 - longitude: -95.145249,
95 - tooltip: { content: 'Lake Livingston' },
96 - },
97 - tc: {
98 - latitude: 34.546708,
99 - longitude: -90.211471,
100 - size: 14,
101 - tooltip: { content: 'Tunica County' },
102 - },
103 - lc: {
104 - latitude: 32.628599,
105 - longitude: -103.675115,
106 - tooltip: { content: 'Lea County' },
107 - },
108 - uc: {
109 - latitude: 40.456692,
110 - longitude: -83.522688,
111 - size: 11,
112 - tooltip: { content: 'Union County' },
113 - },
114 - lm: {
115 - latitude: 33.844630,
116 - longitude: -118.157483,
117 - tooltip: { content: 'Lakewood Mutual' },
118 - },
119 - },
120 - };
121 - $('#mapael').mapael(geoLocationData);
122 - }
123 -
124 - render() {
125 - return (
126 - <div className={`mapael ${s.mapael}`} id="mapael">
127 - <div className="stats">
128 - <h6 className="mt-1">GEO-LOCATIONS</h6>
129 - <p className="h3 m-0">
130 - <span className="mr-xs fw-normal">
131 - <AnimateNumber
132 - value={1656843}
133 - initialValue={0}
134 - duration={1000}
135 - stepPrecision={0}
136 - formatValue={n => n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " ")}
137 - /></span>
138 - <i className="fa fa-map-marker" />
139 - </p>
140 - </div>
141 - <div className="map">
142 - <span>Alternative content for the map</span>
143 - </div>
144 - </div>
145 - );
146 - }
147 -}
148 -
149 -export default MapaelMap;
1 -{
2 - "name": "email",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Email.js"
6 -}
...\ No newline at end of file ...\ No newline at end of file
...@@ -2,7 +2,6 @@ import React from 'react'; ...@@ -2,7 +2,6 @@ import React from 'react';
2 import $ from 'jquery'; 2 import $ from 'jquery';
3 /* eslint-disable */ 3 /* eslint-disable */
4 import 'imports-loader?jQuery=jquery,this=>window!webpack-raphael/raphael'; 4 import 'imports-loader?jQuery=jquery,this=>window!webpack-raphael/raphael';
5 -import 'imports-loader?jQuery=jquery,this=>window!govpredict-morris/morris';
6 import 'imports-loader?jQuery=jquery,this=>window!flot'; 5 import 'imports-loader?jQuery=jquery,this=>window!flot';
7 import 'imports-loader?jQuery=jquery,this=>window!flot/jquery.flot.resize'; 6 import 'imports-loader?jQuery=jquery,this=>window!flot/jquery.flot.resize';
8 import 'imports-loader?jQuery=jquery,this=>window!flot/jquery.flot.time'; 7 import 'imports-loader?jQuery=jquery,this=>window!flot/jquery.flot.time';
...@@ -20,7 +19,7 @@ import { ...@@ -20,7 +19,7 @@ import {
20 } from 'reactstrap'; 19 } from 'reactstrap';
21 20
22 import FlotBars from './flot/charts/BarsChart'; 21 import FlotBars from './flot/charts/BarsChart';
23 -import Widget from '../../components/Widget'; 22 +import Widget from '../../../components/Widget';
24 23
25 import s from './Charts.module.scss'; 24 import s from './Charts.module.scss';
26 25
......
...@@ -8,7 +8,7 @@ import { ...@@ -8,7 +8,7 @@ import {
8 Button, 8 Button,
9 } from 'reactstrap'; 9 } from 'reactstrap';
10 10
11 -import Widget from '../../../components/Widget'; 11 +import Widget from '../../../../components/Widget';
12 12
13 const tableData = [ 13 const tableData = [
14 { 14 {
......
...@@ -7,7 +7,7 @@ import { ...@@ -7,7 +7,7 @@ import {
7 Table, 7 Table,
8 } from 'reactstrap'; 8 } from 'reactstrap';
9 9
10 -import Widget from '../../../components/Widget'; 10 +import Widget from '../../../../components/Widget';
11 11
12 const Typography = () => ( 12 const Typography = () => (
13 <div> 13 <div>
......
...@@ -6,7 +6,7 @@ import { ...@@ -6,7 +6,7 @@ import {
6 Col, 6 Col,
7 } from 'reactstrap'; 7 } from 'reactstrap';
8 8
9 -import Widget from '../../../components/Widget'; 9 +import Widget from '../../../../components/Widget';
10 10
11 const Typography = () => ( 11 const Typography = () => (
12 <div> 12 <div>
......
...@@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; ...@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
3 import { Editor } from 'react-draft-wysiwyg'; 3 import { Editor } from 'react-draft-wysiwyg';
4 import { Input, Button } from 'reactstrap'; 4 import { Input, Button } from 'reactstrap';
5 5
6 -import Widget from '../../../../components/Widget'; 6 +import Widget from '../../../../../components/Widget';
7 7
8 import s from './Compose.module.scss'; 8 import s from './Compose.module.scss';
9 9
......
1 -@import '../../../../styles/app'; 1 +@import '../../../../../styles/app';
2 2
3 :global { 3 :global {
4 - @import '../../../../../node_modules/react-draft-wysiwyg/dist/react-draft-wysiwyg'; 4 + @import '../../../../../../node_modules/react-draft-wysiwyg/dist/react-draft-wysiwyg';
5 } 5 }
6 6
7 .compose { 7 .compose {
......
1 -@import '../../../../styles/app'; 1 +@import '../../../../../styles/app';
2 2
3 .filters { 3 .filters {
4 width: 16%; 4 width: 16%;
......
1 import React from 'react'; 1 import React from 'react';
2 import PropTypes from 'prop-types'; 2 import PropTypes from 'prop-types';
3 3
4 -import Widget from '../../../../components/Widget'; 4 +import Widget from '../../../../../components/Widget';
5 import MessageHeader from '../MessageHeader/MessageHeader'; 5 import MessageHeader from '../MessageHeader/MessageHeader';
6 import MessageAttachments from '../MessageAttachments/MessageAttachments'; 6 import MessageAttachments from '../MessageAttachments/MessageAttachments';
7 7
......
1 -@import '../../../../styles/app'; 1 +@import '../../../../../styles/app';
2 2
3 .messageAttachments { 3 .messageAttachments {
4 width: 50%; 4 width: 50%;
......
...@@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; ...@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
3 3
4 import ReplyDropdown from '../ReplyDropdown/ReplyDropdown'; 4 import ReplyDropdown from '../ReplyDropdown/ReplyDropdown';
5 5
6 -import userPhoto from '../../../../images/people/a5.jpg'; 6 +import userPhoto from '../../../../../images/people/a5.jpg';
7 import s from './MessageHeader.module.scss'; 7 import s from './MessageHeader.module.scss';
8 8
9 const MessageHeader = ({ title, name, email, to, date, compose }) => ( 9 const MessageHeader = ({ title, name, email, to, date, compose }) => (
......
1 -@import '../../../../styles/app'; 1 +@import '../../../../../styles/app';
2 2
3 .messageHeader { 3 .messageHeader {
4 width: 100%; 4 width: 100%;
......
...@@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; ...@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
3 import cx from 'classnames'; 3 import cx from 'classnames';
4 import { Table, Input, FormGroup, Label } from 'reactstrap'; 4 import { Table, Input, FormGroup, Label } from 'reactstrap';
5 5
6 -import Widget from '../../../../components/Widget'; 6 +import Widget from '../../../../../components/Widget';
7 import MessageTableHeader from '../MessageTableHeader/MessageTableHeader'; 7 import MessageTableHeader from '../MessageTableHeader/MessageTableHeader';
8 import Pagination from '../Pagination/Pagination'; 8 import Pagination from '../Pagination/Pagination';
9 import Compose from '../Compose/Compose'; 9 import Compose from '../Compose/Compose';
......
1 -@import '../../../../styles/app'; 1 +@import '../../../../../styles/app';
2 2
3 .messages { 3 .messages {
4 width: 84%; 4 width: 84%;
......
1 -@import '../../../../styles/app'; 1 +@import '../../../../../styles/app';
2 2
3 .pagination { 3 .pagination {
4 width: 100%; 4 width: 100%;
......
1 -import photo1 from '../../images/tables/1.png'; 1 +import photo1 from '../../../images/tables/1.png';
2 -import photo2 from '../../images/tables/2.png'; 2 +import photo2 from '../../../images/tables/2.png';
3 -import photo3 from '../../images/tables/3.png'; 3 +import photo3 from '../../../images/tables/3.png';
4 4
5 export default [ 5 export default [
6 { 6 {
......
1 { 1 {
2 - "name": "Chat", 2 + "name": "email",
3 "version": "0.0.0", 3 "version": "0.0.0",
4 "private": true, 4 "private": true,
5 - "main": "./Chat.js" 5 + "main": "./Email.js"
6 -} 6 +}
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -12,7 +12,7 @@ import moment from 'moment/moment'; ...@@ -12,7 +12,7 @@ import moment from 'moment/moment';
12 import $ from 'jquery'; 12 import $ from 'jquery';
13 13
14 import s from './Calendar.module.scss'; 14 import s from './Calendar.module.scss';
15 -import Widget from '../../../components/Widget'; 15 +import Widget from '../../../../components/Widget';
16 16
17 class Calendar extends React.Component { 17 class Calendar extends React.Component {
18 18
......
1 -@import '../../../styles/app'; 1 +@import '../../../../styles/app';
2 2
3 :global { 3 :global {
4 - @import '../../../../node_modules/fullcalendar/dist/fullcalendar'; 4 + @import '../../../../../node_modules/fullcalendar/dist/fullcalendar';
5 } 5 }
6 6
7 .root { 7 .root {
......
1 { 1 {
2 - "name": "Header", 2 + "name": "calendar",
3 "version": "0.0.0", 3 "version": "0.0.0",
4 "private": true, 4 "private": true,
5 - "main": "./Header.js" 5 + "main": "./Calendar.js"
6 } 6 }
......
...@@ -9,18 +9,18 @@ import { ...@@ -9,18 +9,18 @@ import {
9 import Lightbox from 'react-images'; 9 import Lightbox from 'react-images';
10 import s from './Gallery.module.scss'; 10 import s from './Gallery.module.scss';
11 11
12 -import pic1 from '../../../images/pictures/1.jpg'; 12 +import pic1 from '../../../../images/pictures/1.jpg';
13 -import pic2 from '../../../images/pictures/2.jpg'; 13 +import pic2 from '../../../../images/pictures/2.jpg';
14 -import pic3 from '../../../images/pictures/3.jpg'; 14 +import pic3 from '../../../../images/pictures/3.jpg';
15 -import pic4 from '../../../images/pictures/4.jpg'; 15 +import pic4 from '../../../../images/pictures/4.jpg';
16 -import pic5 from '../../../images/pictures/5.jpg'; 16 +import pic5 from '../../../../images/pictures/5.jpg';
17 -import pic6 from '../../../images/pictures/6.jpg'; 17 +import pic6 from '../../../../images/pictures/6.jpg';
18 -import pic8 from '../../../images/pictures/8.jpg'; 18 +import pic8 from '../../../../images/pictures/8.jpg';
19 -import pic9 from '../../../images/pictures/9.jpg'; 19 +import pic9 from '../../../../images/pictures/9.jpg';
20 -import pic10 from '../../../images/pictures/10.jpg'; 20 +import pic10 from '../../../../images/pictures/10.jpg';
21 -import pic11 from '../../../images/pictures/11.jpg'; 21 +import pic11 from '../../../../images/pictures/11.jpg';
22 -import pic13 from '../../../images/pictures/13.jpg'; 22 +import pic13 from '../../../../images/pictures/13.jpg';
23 -import pic14 from '../../../images/pictures/14.jpg'; 23 +import pic14 from '../../../../images/pictures/14.jpg';
24 24
25 const items = [ 25 const items = [
26 { 26 {
......
1 -@import '../../../styles/app'; 1 +@import '../../../../styles/app';
2 2
3 .root { 3 .root {
4 :global .tile { 4 :global .tile {
......
1 { 1 {
2 - "name": "Helper", 2 + "name": "invoice",
3 "version": "0.0.0", 3 "version": "0.0.0",
4 "private": true, 4 "private": true,
5 - "main": "./Helper.js" 5 + "main": "./Gallery.js"
6 } 6 }
......
...@@ -9,8 +9,8 @@ import { ...@@ -9,8 +9,8 @@ import {
9 } from 'reactstrap'; 9 } from 'reactstrap';
10 10
11 import s from './Invoice.module.scss'; 11 import s from './Invoice.module.scss';
12 -import Widget from '../../../components/Widget'; 12 +import Widget from '../../../../components/Widget';
13 -import iLogo from '../../../images/invoice-logo.png'; 13 +import iLogo from '../../../../images/invoice-logo.png';
14 14
15 class Stats extends React.Component { 15 class Stats extends React.Component {
16 16
......
1 -@import '../../../styles/app'; 1 +@import '../../../../styles/app';
2 2
3 .root { 3 .root {
4 .invoiceLogo { 4 .invoiceLogo {
......
1 { 1 {
2 - "name": "InputValidation", 2 + "name": "invoice",
3 "version": "0.0.0", 3 "version": "0.0.0",
4 "private": true, 4 "private": true,
5 - "main": "./InputValidation.js" 5 + "main": "./Invoice.js"
6 } 6 }
......
...@@ -20,10 +20,10 @@ import { ...@@ -20,10 +20,10 @@ import {
20 } from 'reactstrap'; 20 } from 'reactstrap';
21 21
22 import s from './Search.module.scss'; 22 import s from './Search.module.scss';
23 -import i1 from '../../../images/search/1.jpg'; 23 +import i1 from '../../../../images/search/1.jpg';
24 -import i2 from '../../../images/search/5.jpg'; 24 +import i2 from '../../../../images/search/5.jpg';
25 -import i3 from '../../../images/search/3.jpg'; 25 +import i3 from '../../../../images/search/3.jpg';
26 -import i4 from '../../../images/search/13.jpg'; 26 +import i4 from '../../../../images/search/13.jpg';
27 27
28 class Search extends React.Component { 28 class Search extends React.Component {
29 29
......
1 -@import '../../../styles/app'; 1 +@import '../../../../styles/app';
2 2
3 .root { 3 .root {
4 .searchResultCategories { 4 .searchResultCategories {
......
1 { 1 {
2 - "name": "Notifications", 2 + "name": "search",
3 "version": "0.0.0", 3 "version": "0.0.0",
4 "private": true, 4 "private": true,
5 - "main": "./Notifications" 5 + "main": "./Search.js"
6 } 6 }
......
...@@ -11,14 +11,14 @@ import { ...@@ -11,14 +11,14 @@ import {
11 11
12 import s from './Timeline.module.scss'; // eslint-disable-line css-modules/no-unused-class 12 import s from './Timeline.module.scss'; // eslint-disable-line css-modules/no-unused-class
13 13
14 -import a1 from '../../../images/people/a1.jpg'; 14 +import a1 from '../../../../images/people/a1.jpg';
15 -import a2 from '../../../images/people/a2.jpg'; 15 +import a2 from '../../../../images/people/a2.jpg';
16 -import a3 from '../../../images/people/a3.jpg'; 16 +import a3 from '../../../../images/people/a3.jpg';
17 -import a4 from '../../../images/people/a4.jpg'; 17 +import a4 from '../../../../images/people/a4.jpg';
18 -import a5 from '../../../images/people/a5.jpg'; 18 +import a5 from '../../../../images/people/a5.jpg';
19 -import a6 from '../../../images/people/a6.jpg'; 19 +import a6 from '../../../../images/people/a6.jpg';
20 -import avatar from '../../../images/avatar.png'; 20 +import avatar from '../../../../images/avatar.png';
21 -import img8 from '../../../images/search/8.jpg'; 21 +import img8 from '../../../../images/search/8.jpg';
22 22
23 const BasicMap = withScriptjs(withGoogleMap(() => 23 const BasicMap = withScriptjs(withGoogleMap(() =>
24 <GoogleMap 24 <GoogleMap
......
1 -@import '../../../styles/app'; 1 +@import '../../../../styles/app';
2 2
3 /* Post Comments */ 3 /* Post Comments */
4 .postComments { 4 .postComments {
......
1 +{
2 + "name": "timeline",
3 + "version": "0.0.0",
4 + "main": "./Timeline.js",
5 + "private": true
6 +}
...@@ -28,7 +28,7 @@ import TextareaAutosize from 'react-autosize-textarea'; ...@@ -28,7 +28,7 @@ import TextareaAutosize from 'react-autosize-textarea';
28 import ReactMde, { ReactMdeCommands } from 'react-mde'; 28 import ReactMde, { ReactMdeCommands } from 'react-mde';
29 29
30 30
31 -import Widget from '../../../components/Widget'; 31 +import Widget from '../../../../components/Widget';
32 32
33 import s from './Elements.module.scss'; 33 import s from './Elements.module.scss';
34 34
......
1 -@import '../../../styles/app'; 1 +@import '../../../../styles/app';
2 2
3 :global { 3 :global {
4 - @import '../../../../node_modules/react-draft-wysiwyg/dist/react-draft-wysiwyg'; 4 + @import '../../../../../node_modules/react-draft-wysiwyg/dist/react-draft-wysiwyg';
5 - @import '../../../../node_modules/react-select2-wrapper/css/select2'; 5 + @import '../../../../../node_modules/react-select2-wrapper/css/select2';
6 - @import '../../../../node_modules/awesome-bootstrap-checkbox/awesome-bootstrap-checkbox'; 6 + @import '../../../../../node_modules/awesome-bootstrap-checkbox/awesome-bootstrap-checkbox';
7 - @import '../../../../node_modules/react-datetime/css/react-datetime'; 7 + @import '../../../../../node_modules/react-datetime/css/react-datetime';
8 - @import '../../../../node_modules/rc-color-picker/dist/rc-color-picker'; 8 + @import '../../../../../node_modules/rc-color-picker/dist/rc-color-picker';
9 - @import '../../../../node_modules/bootstrap-slider/dist/css/bootstrap-slider'; 9 + @import '../../../../../node_modules/bootstrap-slider/dist/css/bootstrap-slider';
10 - @import '../../../../node_modules/jasny-bootstrap/dist/css/jasny-bootstrap'; 10 + @import '../../../../../node_modules/jasny-bootstrap/dist/css/jasny-bootstrap';
11 - @import '../../../../node_modules/react-mde/lib/styles/scss/react-mde-all'; 11 + @import '../../../../../node_modules/react-mde/lib/styles/scss/react-mde-all';
12 } 12 }
13 13
14 .autogrow { 14 .autogrow {
......
1 { 1 {
2 - "name": "Skycons", 2 + "name": "FormsElements",
3 "version": "0.0.0", 3 "version": "0.0.0",
4 "private": true, 4 "private": true,
5 - "main": "./Skycons.js" 5 + "main": "./Elements.js"
6 } 6 }
......
...@@ -8,8 +8,8 @@ import { ...@@ -8,8 +8,8 @@ import {
8 } from 'reactstrap'; 8 } from 'reactstrap';
9 import Formsy from 'formsy-react'; 9 import Formsy from 'formsy-react';
10 10
11 -import InputValidation from '../../../components/InputValidation'; 11 +import InputValidation from '../../../../components/InputValidation';
12 -import Widget from '../../../components/Widget'; 12 +import Widget from '../../../../components/Widget';
13 13
14 14
15 class Validation extends React.Component { 15 class Validation extends React.Component {
......
1 { 1 {
2 - "name": "Sparklines", 2 + "name": "FormValidation",
3 "version": "0.0.0", 3 "version": "0.0.0",
4 "private": true, 4 "private": true,
5 - "main": "./Sparklines.js" 5 + "main": "./Validation.js"
6 } 6 }
......
...@@ -17,8 +17,8 @@ import Datetime from 'react-datetime'; ...@@ -17,8 +17,8 @@ import Datetime from 'react-datetime';
17 import { select2CountriesData, select2ShipmentData, cardTypesData } from './data'; 17 import { select2CountriesData, select2ShipmentData, cardTypesData } from './data';
18 18
19 19
20 -import InputValidation from '../../../components/InputValidation/InputValidation'; 20 +import InputValidation from '../../../../components/InputValidation/InputValidation';
21 -import Widget from '../../../components/Widget'; 21 +import Widget from '../../../../components/Widget';
22 import s from './Wizard.module.scss'; 22 import s from './Wizard.module.scss';
23 23
24 const count = 4; 24 const count = 4;
......
1 -@import '../../../styles/app'; 1 +@import '../../../../styles/app';
2 2
3 :global { 3 :global {
4 - @import '../../../../node_modules/react-select2-wrapper/css/select2'; 4 + @import '../../../../../node_modules/react-select2-wrapper/css/select2';
5 - @import '../../../../node_modules/react-datetime/css/react-datetime'; 5 + @import '../../../../../node_modules/react-datetime/css/react-datetime';
6 } 6 }
7 7
8 .root { 8 .root {
......
1 { 1 {
2 - "name": "Analytics", 2 + "name": "FormWizard",
3 "version": "0.0.0", 3 "version": "0.0.0",
4 "private": true, 4 "private": true,
5 - "main": "./Analytics.js" 5 + "main": "./Wizard.js"
6 } 6 }
......
...@@ -19,14 +19,14 @@ import { ...@@ -19,14 +19,14 @@ import {
19 import $ from 'jquery'; 19 import $ from 'jquery';
20 import 'imports-loader?window.jQuery=jquery,this=>window!jquery-ui/ui/widgets/sortable'; //eslint-disable-line 20 import 'imports-loader?window.jQuery=jquery,this=>window!jquery-ui/ui/widgets/sortable'; //eslint-disable-line
21 21
22 -import Widget from '../../components/Widget'; 22 +import Widget from '../../../components/Widget';
23 import './Grid.scss'; 23 import './Grid.scss';
24 24
25 25
26 -import peopleA1 from '../../images/people/a1.jpg'; 26 +import peopleA1 from '../../../images/people/a1.jpg';
27 -import peopleA2 from '../../images/people/a2.jpg'; 27 +import peopleA2 from '../../../images/people/a2.jpg';
28 -import peopleA3 from '../../images/people/a3.jpg'; 28 +import peopleA3 from '../../../images/people/a3.jpg';
29 -import peopleA4 from '../../images/people/a4.jpg'; 29 +import peopleA4 from '../../../images/people/a4.jpg';
30 30
31 const sortOptions = { 31 const sortOptions = {
32 connectWith: '.widget-container', 32 connectWith: '.widget-container',
...@@ -143,7 +143,6 @@ class Grid extends React.Component { ...@@ -143,7 +143,6 @@ class Grid extends React.Component {
143 title={<h6>Default <span className="fw-semi-bold">Widget</span></h6>} 143 title={<h6>Default <span className="fw-semi-bold">Widget</span></h6>}
144 refresh collapse fullscreen close 144 refresh collapse fullscreen close
145 showTooltip tooltipPlacement={tooltipPlacement} 145 showTooltip tooltipPlacement={tooltipPlacement}
146 - data-widgster-load="/demo/grid/default.php"
147 > 146 >
148 <div> 147 <div>
149 <p>A timestamp this widget was created: Apr 24, 19:07:07</p> 148 <p>A timestamp this widget was created: Apr 24, 19:07:07</p>
...@@ -156,7 +155,6 @@ class Grid extends React.Component { ...@@ -156,7 +155,6 @@ class Grid extends React.Component {
156 ref={(r) => { 155 ref={(r) => {
157 this.sharesWidget = r; 156 this.sharesWidget = r;
158 }} 157 }}
159 - data-widgster-load="/demo/grid/shares.php"
160 data-post-processing 158 data-post-processing
161 showTooltip tooltipPlacement={tooltipPlacement} 159 showTooltip tooltipPlacement={tooltipPlacement}
162 title={<h6> 160 title={<h6>
...@@ -211,7 +209,6 @@ class Grid extends React.Component { ...@@ -211,7 +209,6 @@ class Grid extends React.Component {
211 </Widget> 209 </Widget>
212 <Widget 210 <Widget
213 id="autoload-widget" 211 id="autoload-widget"
214 - data-widgster-load="/demo/grid/autoload.php"
215 data-post-processing="true" 212 data-post-processing="true"
216 data-widgster-autoload="true" 213 data-widgster-autoload="true"
217 data-widgster-show-loader="false" 214 data-widgster-show-loader="false"
...@@ -295,7 +292,6 @@ class Grid extends React.Component { ...@@ -295,7 +292,6 @@ class Grid extends React.Component {
295 <Col xl={6} className="widget-container"> 292 <Col xl={6} className="widget-container">
296 <Widget 293 <Widget
297 id="news-widget" 294 id="news-widget"
298 - data-widgster-load="/demo/grid/news.php"
299 data-post-processing="true" 295 data-post-processing="true"
300 title={<div><h6> News <span className="badge badge-pill badge-success">17</span></h6> 296 title={<div><h6> News <span className="badge badge-pill badge-success">17</span></h6>
301 <span className="text-muted">spinning refresh button & close prompt</span> 297 <span className="text-muted">spinning refresh button & close prompt</span>
......
1 -@import '../../styles/app'; 1 +@import '../../../styles/app';
2 2
3 /* NEWS LIST */ 3 /* NEWS LIST */
4 :global { 4 :global {
......
1 +{
2 + "name": "grid",
3 + "version": "0.0.0",
4 + "main": "./Grid.js",
5 + "private": true
6 +}
...@@ -18,12 +18,11 @@ import { ...@@ -18,12 +18,11 @@ import {
18 DropdownToggle 18 DropdownToggle
19 } from "reactstrap"; 19 } from "reactstrap";
20 20
21 -import Widget from '../../components/Widget'; 21 +import Widget from '../../../components/Widget';
22 -import Rating from '../product/components/Rating/Rating';
23 import s from './Management.module.scss'; 22 import s from './Management.module.scss';
24 23
25 -import { getProductsRequest, deleteProductRequest } from '../../actions/products' 24 +import { getProductsRequest, deleteProductRequest } from '../../../actions/products'
26 -import Loader from '../../components/Loader'; 25 +import Loader from '../../../components/Loader';
27 import cx from 'classnames'; 26 import cx from 'classnames';
28 27
29 class Management extends React.Component { 28 class Management extends React.Component {
...@@ -63,12 +62,6 @@ class Management extends React.Component { ...@@ -63,12 +62,6 @@ class Management extends React.Component {
63 ) 62 )
64 } 63 }
65 64
66 - ratingFormatter(cell) {
67 - return (
68 - <Rating rating={parseFloat(cell)}/>
69 - )
70 - }
71 -
72 titleFormatter(cell, row) { 65 titleFormatter(cell, row) {
73 return cell ? ( 66 return cell ? (
74 <Link to={'/app/ecommerce/product/' + row.id}> 67 <Link to={'/app/ecommerce/product/' + row.id}>
...@@ -199,11 +192,6 @@ class Management extends React.Component { ...@@ -199,11 +192,6 @@ class Management extends React.Component {
199 <span className="fs-sm">Price($)</span> 192 <span className="fs-sm">Price($)</span>
200 </TableHeaderColumn> 193 </TableHeaderColumn>
201 )} 194 )}
202 - {window.innerWidth >= 768 && (
203 - <TableHeaderColumn dataField="rating" dataFormat={this.ratingFormatter}>
204 - <span className="fs-sm">Rating</span>
205 - </TableHeaderColumn>
206 - )}
207 <TableHeaderColumn dataFormat={this.apiFormatter}> 195 <TableHeaderColumn dataFormat={this.apiFormatter}>
208 <span className="fs-sm">Api</span> 196 <span className="fs-sm">Api</span>
209 </TableHeaderColumn> 197 </TableHeaderColumn>
......
...@@ -28,9 +28,9 @@ import { ...@@ -28,9 +28,9 @@ import {
28 createProductRequest, 28 createProductRequest,
29 deleteProductRequest, 29 deleteProductRequest,
30 getProductsImagesRequest 30 getProductsImagesRequest
31 -} from '../../../../actions/products'; 31 +} from '../../../../../actions/products';
32 -import Widget from '../../../../components/Widget'; 32 +import Widget from '../../../../../components/Widget';
33 -import Loader from '../../../../components/Loader'; 33 +import Loader from '../../../../../components/Loader';
34 import s from './ProductEdit.module.scss'; 34 import s from './ProductEdit.module.scss';
35 35
36 class ProductEdit extends React.Component { 36 class ProductEdit extends React.Component {
......
1 { 1 {
2 - "name": "EasyPie", 2 + "name": "ProductEdit",
3 "version": "0.0.0", 3 "version": "0.0.0",
4 "private": true, 4 "private": true,
5 - "main": "./EasyPie.js" 5 + "main": "./ProductEdit.js"
6 -} 6 +}
...\ No newline at end of file ...\ No newline at end of file
......
1 { 1 {
2 - "name": "Flot", 2 + "name": "Management",
3 "version": "0.0.0", 3 "version": "0.0.0",
4 "private": true, 4 "private": true,
5 - "main": "./Flot.js" 5 + "main": "./Management.js"
6 -} 6 +}
...\ No newline at end of file ...\ No newline at end of file
......
1 -@import '../../../styles/app'; 1 +@import '../../../../styles/app';
2 2
3 .MapContainer { 3 .MapContainer {
4 position: absolute; 4 position: absolute;
......
1 { 1 {
2 - "name": "Morris", 2 + "name": "GoogleMap",
3 "version": "0.0.0", 3 "version": "0.0.0",
4 "private": true, 4 "private": true,
5 - "main": "./Morris.js" 5 + "main": "./Google.js"
6 } 6 }
......
1 -@import '../../../styles/app'; 1 +@import '../../../../styles/app';
2 2
3 .contentMap { 3 .contentMap {
4 position: absolute; 4 position: absolute;
......
1 +{
2 + "name": "Vector",
3 + "version": "0.0.0",
4 + "main": "./Vector.js",
5 + "private": true
6 +}
...@@ -10,13 +10,13 @@ import { ...@@ -10,13 +10,13 @@ import {
10 Form, 10 Form,
11 FormGroup, 11 FormGroup,
12 } from 'reactstrap'; 12 } from 'reactstrap';
13 -import Widget from '../../components/Widget'; 13 +import Widget from '../../../components/Widget';
14 14
15 -import p19 from '../../images/pictures/19.jpg'; 15 +import p19 from '../../../images/pictures/19.jpg';
16 -import a5 from '../../images/people/a5.jpg'; 16 +import a5 from '../../../images/people/a5.jpg';
17 -import a1 from '../../images/people/a1.jpg'; 17 +import a1 from '../../../images/people/a1.jpg';
18 -import a3 from '../../images/people/a3.jpg'; 18 +import a3 from '../../../images/people/a3.jpg';
19 -import avatar from '../../images/avatar.png'; 19 +import avatar from '../../../images/avatar.png';
20 20
21 import s from './Profile.module.scss'; 21 import s from './Profile.module.scss';
22 22
......
1 +@import '../../../styles/app';
2 +
3 +.root {
4 + // some styles
5 +}
6 +
7 +.profileContactContainer {
8 + margin-top: -75px;
9 +}
10 +
11 +.profileContacts {
12 + @include list-unstyled();
13 +
14 + display: inline-block;
15 + text-align: left;
16 +
17 + > li {
18 + margin-bottom: $spacer / 2;
19 + }
20 +
21 + > li > a {
22 + color: lighten($text-color, 30%);
23 + text-decoration: none;
24 +
25 + @include hover-focus {
26 + color: $text-color;
27 + }
28 + }
29 +}
30 +
31 +.profileAvatar {
32 + border: 3px solid $white;
33 +}
34 +
35 +.profileStat {
36 + border-left: none !important;
37 + padding-right: 0 !important;
38 +}
39 +
40 +.profileStatValue {
41 + font-size: 28px;
42 + font-weight: $font-weight-base !important;
43 + margin-bottom: 0;
44 +}
45 +
46 +.event {
47 + background: $white;
48 + border-radius: $border-radius;
49 + padding: 20px 20px 0;
50 + position: relative;
51 + margin-bottom: $spacer;
52 + box-shadow: var(--widget-shadow);
53 +}
54 +
55 +.eventTitle {
56 + margin-bottom: 2px;
57 + font-weight: $font-weight-semi-bold;
58 +
59 + a {
60 + text-decoration: none;
61 + color: #7ca9dd;
62 + }
63 +
64 + small > a {
65 + color: $text-muted;
66 + }
67 +}
68 +
69 +.eventAvatar {
70 + float: left;
71 + margin-right: $spacer;
72 +}
73 +
74 +.eventAvatar > img {
75 + width: 34px;
76 +}
77 +
78 +.eventBody {
79 + font-size: 0.9rem;
80 + margin-bottom: $spacer;
81 +}
82 +
83 +.eventFooter {
84 + background-color: $gray-100;
85 + margin: 20px -20px 0;
86 + padding: 10px 20px;
87 +}
88 +
89 +.eventTimestamp {
90 + color: $text-muted;
91 +}
1 { 1 {
2 - "name": "Charts", 2 + "name": "profile",
3 "version": "0.0.0", 3 "version": "0.0.0",
4 "private": true, 4 "private": true,
5 - "main": "./Charts.js" 5 + "main": "./Profile.js"
6 } 6 }
......
1 +import React from 'react';
2 +import {
3 + Breadcrumb,
4 + BreadcrumbItem,
5 + Progress,
6 + Dropdown,
7 + DropdownMenu,
8 + DropdownToggle,
9 + DropdownItem,
10 +} from 'reactstrap';
11 +
12 +import {
13 + BootstrapTable,
14 + TableHeaderColumn,
15 +} from 'react-bootstrap-table';
16 +
17 +import ReactTable from 'react-table';
18 +
19 +import { reactTableData, reactBootstrapTableData } from './data';
20 +import Widget from '../../../../components/Widget';
21 +import s from './Dynamic.modules.scss';
22 +
23 +class Dynamic extends React.Component {
24 +
25 + constructor(props) {
26 + super(props);
27 +
28 + this.state = {
29 + reactTable: reactTableData(),
30 + reactBootstrapTable: reactBootstrapTableData(),
31 + };
32 + }
33 +
34 + renderSizePerPageDropDown = (props) => {
35 + const limits = [];
36 + props.sizePerPageList.forEach((limit) => {
37 + limits.push(<DropdownItem key={limit} onClick={() => props.changeSizePerPage(limit)}>{ limit }</DropdownItem>);
38 + });
39 +
40 + return (
41 + <Dropdown isOpen={props.open} toggle={props.toggleDropDown}>
42 + <DropdownToggle color="default" caret>
43 + { props.currSizePerPage }
44 + </DropdownToggle>
45 + <DropdownMenu>
46 + { limits }
47 + </DropdownMenu>
48 + </Dropdown>
49 + );
50 + };
51 +
52 + render() {
53 + const options = {
54 + sizePerPage: 10,
55 + paginationSize: 3,
56 + sizePerPageDropDown: this.renderSizePerPageDropDown,
57 + };
58 +
59 + function infoFormatter(cell) {
60 + return (
61 + <div>
62 + <small>
63 + Type:&nbsp;<span className="fw-semi-bold">{cell.type}</span>
64 + </small>
65 + <br />
66 + <small>
67 + Dimensions:&nbsp;<span className="fw-semi-bold">{cell.dimensions}</span>
68 + </small>
69 + </div>
70 + );
71 + }
72 +
73 + function descriptionFormatter(cell) {
74 + return (
75 + <button className="btn-link">
76 + {cell}
77 + </button>
78 + );
79 + }
80 +
81 + function progressFormatter(cell) {
82 + return (
83 + <Progress style={{ height: '15px' }} color={cell.type} value={cell.progress} />
84 + );
85 + }
86 +
87 + function progressSortFunc(a, b, order) {
88 + if (order === 'asc') {
89 + return a.status.progress - b.status.progress;
90 + }
91 + return b.status.progress - a.status.progress;
92 + }
93 +
94 + function dateSortFunc(a, b, order) {
95 + if (order === 'asc') {
96 + return new Date(a.date).getTime() - new Date(b.date).getTime();
97 + }
98 + return new Date(b.date).getTime() - new Date(a.date).getTime();
99 + }
100 +
101 + return (
102 + <div>
103 + <Breadcrumb>
104 + <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
105 + <BreadcrumbItem active>Tables Dynamic</BreadcrumbItem>
106 + </Breadcrumb>
107 + <h2 className="page-title">Tables - <span className="fw-semi-bold">Dynamic</span></h2>
108 + <Widget title={<h4>The <span className="fw-semi-bold">React</span> Way</h4>} collapse close>
109 + <p>
110 + Fully customizable Table. Built with <a href="https://allenfang.github.io/react-bootstrap-table/" target="_blank" rel="noopener noreferrer">react-bootstrap-table</a>
111 + </p>
112 + <BootstrapTable data={this.state.reactBootstrapTable} version="4" pagination options={options} search tableContainerClass={`table-striped table-hover ${s.bootstrapTable}`}>
113 + <TableHeaderColumn className="width-50" columnClassName="width-50" dataField="id" isKey>
114 + <span className="fs-sm">ID</span>
115 + </TableHeaderColumn>
116 + <TableHeaderColumn dataField="name" dataSort>
117 + <span className="fs-sm">Name</span>
118 + </TableHeaderColumn>
119 + <TableHeaderColumn className="d-none d-md-table-cell" columnClassName="d-none d-md-table-cell" dataField="info" dataFormat={infoFormatter}>
120 + <span className="fs-sm">Info</span>
121 + </TableHeaderColumn>
122 + <TableHeaderColumn className="d-none d-md-table-cell" columnClassName="d-none d-md-table-cell" dataField="description" dataFormat={descriptionFormatter}>
123 + <span className="fs-sm">Description</span>
124 + </TableHeaderColumn>
125 + <TableHeaderColumn className="d-none d-md-table-cell" columnClassName="d-none d-md-table-cell" dataField="date" dataSort sortFunc={dateSortFunc}>
126 + <span className="fs-sm">Date</span>
127 + </TableHeaderColumn>
128 + <TableHeaderColumn className="width-150" columnClassName="width-150" dataField="status" dataSort dataFormat={progressFormatter} sortFunc={progressSortFunc}>
129 + <span className="fs-sm">Status</span>
130 + </TableHeaderColumn>
131 + </BootstrapTable>
132 + </Widget>
133 + <Widget title={<h4>React <span className="fw-semi-bold">Table</span></h4>} collapse close>
134 + <p>
135 + Simple table extension with sorting, filtering and pagination for React apps. Built with <a href="https://react-table.js.org/" target="_blank" rel="noopener noreferrer">react-table</a>
136 + </p>
137 + <ReactTable
138 + data={this.state.reactTable}
139 + filterable
140 + columns={[
141 + {
142 + Header: 'NAME',
143 + accessor: 'name',
144 + },
145 + {
146 + Header: 'POSITION',
147 + accessor: 'position',
148 + },
149 + {
150 + Header: 'OFFICE',
151 + accessor: 'office',
152 + },
153 + {
154 + Header: 'EXT',
155 + accessor: 'ext',
156 + },
157 + {
158 + Header: 'START DATE',
159 + accessor: 'startDate',
160 + },
161 + {
162 + Header: 'SALARY',
163 + accessor: 'salary',
164 + },
165 + ]}
166 + defaultPageSize={10}
167 + className="-striped -highlight"
168 + />
169 + </Widget>
170 + </div>
171 + );
172 + }
173 +
174 +}
175 +
176 +export default Dynamic;
1 -@import '../../../styles/app'; 1 +@import '../../../../styles/app';
2 2
3 .bootstrapTable { 3 .bootstrapTable {
4 border: none; 4 border: none;
......
1 { 1 {
2 - "name": "Rickshaw", 2 + "name": "dynamic",
3 "version": "0.0.0", 3 "version": "0.0.0",
4 "private": true, 4 "private": true,
5 - "main": "./Rickshaw.js" 5 + "main": "./Dynamic.js"
6 } 6 }
......
...@@ -15,7 +15,7 @@ import { ...@@ -15,7 +15,7 @@ import {
15 } from 'reactstrap'; 15 } from 'reactstrap';
16 import { Sparklines, SparklinesBars } from 'react-sparklines'; 16 import { Sparklines, SparklinesBars } from 'react-sparklines';
17 17
18 -import Widget from '../../../components/Widget'; 18 +import Widget from '../../../../components/Widget';
19 import s from './Static.modules.scss'; 19 import s from './Static.modules.scss';
20 20
21 class Static extends React.Component { 21 class Static extends React.Component {
...@@ -27,7 +27,7 @@ class Static extends React.Component { ...@@ -27,7 +27,7 @@ class Static extends React.Component {
27 tableStyles: [ 27 tableStyles: [
28 { 28 {
29 id: 1, 29 id: 1,
30 - picture: require('../../../images/tables/1.png'), // eslint-disable-line global-require 30 + picture: require('../../../../images/tables/1.png'), // eslint-disable-line global-require
31 description: 'Palo Alto', 31 description: 'Palo Alto',
32 info: { 32 info: {
33 type: 'JPEG', 33 type: 'JPEG',
...@@ -42,7 +42,7 @@ class Static extends React.Component { ...@@ -42,7 +42,7 @@ class Static extends React.Component {
42 }, 42 },
43 { 43 {
44 id: 2, 44 id: 2,
45 - picture: require('../../../images/tables/2.png'), // eslint-disable-line global-require 45 + picture: require('../../../../images/tables/2.png'), // eslint-disable-line global-require
46 description: 'The Sky', 46 description: 'The Sky',
47 info: { 47 info: {
48 type: 'PSD', 48 type: 'PSD',
...@@ -57,7 +57,7 @@ class Static extends React.Component { ...@@ -57,7 +57,7 @@ class Static extends React.Component {
57 }, 57 },
58 { 58 {
59 id: 3, 59 id: 3,
60 - picture: require('../../../images/tables/3.png'), // eslint-disable-line global-require 60 + picture: require('../../../../images/tables/3.png'), // eslint-disable-line global-require
61 description: 'Down the road', 61 description: 'Down the road',
62 label: { 62 label: {
63 colorClass: 'danger', 63 colorClass: 'danger',
...@@ -76,7 +76,7 @@ class Static extends React.Component { ...@@ -76,7 +76,7 @@ class Static extends React.Component {
76 }, 76 },
77 { 77 {
78 id: 4, 78 id: 4,
79 - picture: require('../../../images/tables/4.png'), // eslint-disable-line global-require 79 + picture: require('../../../../images/tables/4.png'), // eslint-disable-line global-require
80 description: 'The Edge', 80 description: 'The Edge',
81 info: { 81 info: {
82 type: 'PNG', 82 type: 'PNG',
...@@ -91,7 +91,7 @@ class Static extends React.Component { ...@@ -91,7 +91,7 @@ class Static extends React.Component {
91 }, 91 },
92 { 92 {
93 id: 5, 93 id: 5,
94 - picture: require('../../../images/tables/5.png'), // eslint-disable-line global-require 94 + picture: require('../../../../images/tables/5.png'), // eslint-disable-line global-require
95 description: 'Fortress', 95 description: 'Fortress',
96 info: { 96 info: {
97 type: 'JPEG', 97 type: 'JPEG',
......
1 +@import '../../../../styles/app';
2 +
3 +.root {
4 + // some styles
5 +}
1 { 1 {
2 - "name": "Sparkline", 2 + "name": "static",
3 "version": "0.0.0", 3 "version": "0.0.0",
4 "private": true, 4 "private": true,
5 - "main": "./Sparkline.js" 5 + "main": "./Static.js"
6 } 6 }
......
1 +import React, { Component } from 'react';
2 +import cx from 'classnames';
3 +import {
4 + Row,
5 + Col,
6 + Breadcrumb,
7 + BreadcrumbItem,
8 + Alert,
9 +} from 'reactstrap';
10 +
11 +import Widget from '../../../../components/Widget';
12 +
13 +class Alerts extends Component {
14 + state = {
15 + alerts: [{
16 + id: 'al-1',
17 + type: 'success',
18 + msg: '<span class="fw-semi-bold">Success:</span> You successfully read this important alert message.',
19 + visible: [true, true, true],
20 + }, {
21 + id: 'al-2',
22 + type: 'info',
23 + msg: '<span class="fw-semi-bold">Info:</span> This alert needs your attention, but it\'s not super important.',
24 + visible: [true, true, true],
25 + }, {
26 + id: 'al-3',
27 + type: 'warning',
28 + msg: '<span class="fw-semi-bold"><strong>Warning:</strong></span> Best check yo self, you\'re not looking too good.',
29 + visible: [true, true, true],
30 + }, {
31 + id: 'al-4',
32 + type: 'danger',
33 + msg: '<span class="fw-semi-bold">Danger:</span> Change this and that and try again. <a class="btn btn-default btn-xs float-right mr" href="#">Ignore</a> <a class="btn btn-danger btn-xs float-right mr-xs" href="#">Take this action</a>',
34 + visible: [true, true, true],
35 + }],
36 + }
37 +
38 + closeAlert(index, alertGroup) {
39 + const newAlerts = [...this.state.alerts];
40 + newAlerts[index].visible[alertGroup] = false;
41 +
42 + this.setState({ alerts: newAlerts });
43 + }
44 +
45 + render() {
46 + const { alerts } = this.state;
47 +
48 + return (
49 + <div>
50 + <Breadcrumb>
51 + <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
52 + <BreadcrumbItem active>UI Alerts</BreadcrumbItem>
53 + </Breadcrumb>
54 + <h1 className="page-title">Alerts</h1>
55 + <Row>
56 + <Col xs={12} md={8}>
57 + <Widget
58 + title={<h5>Alert <span className="fw-semi-bold">Messages</span></h5>}
59 + close collapse
60 + >
61 + <p>Alerts are available for any length of text, as well as an optional dismiss button.</p>
62 + {alerts.map((alert, index) => <Alert
63 + key={alert.id} isOpen={alert.visible[0]} toggle={() => this.closeAlert(index, 0)}
64 + color={alert.type}
65 + >
66 + <span dangerouslySetInnerHTML={{ __html: alert.msg }} />
67 + </Alert>)}
68 + </Widget>
69 + </Col>
70 + <Col xs={12} md={8}>
71 + <Widget
72 + title={<h5>Transparent <span className="fw-semi-bold">Alerts</span></h5>}
73 + close collapse
74 + >
75 + <p>Transparent alerts are available by adding <code>.alert-transparent</code> class.</p>
76 + {alerts.map((alert, index) => <Alert
77 + className="alert-transparent"
78 + key={alert.id} isOpen={alert.visible[1]} toggle={() => this.closeAlert(index, 1)}
79 + color={alert.type}
80 + >
81 + <span dangerouslySetInnerHTML={{ __html: alert.msg }} />
82 + </Alert>)}
83 + </Widget>
84 + </Col>
85 + <Col xs={12} md={8}>
86 + <Widget
87 + title={<h5>Rounded <span className="fw-semi-bold">Alerts</span></h5>}
88 + close collapse
89 + >
90 + <p>Rounded alerts are available by adding <code>.alert-rounded</code> class.</p>
91 + {alerts.map((alert, index) => <Alert
92 + className={cx('alert-rounded', { 'alert-transparent': index % 2 !== 1 })}
93 + key={alert.id} isOpen={alert.visible[2]} toggle={() => this.closeAlert(index, 2)}
94 + color={alert.type}
95 + >
96 + <span dangerouslySetInnerHTML={{ __html: alert.msg }} />
97 + </Alert>)}
98 + </Widget>
99 + </Col>
100 + <Col xs={12} md={8}>
101 + <Widget
102 + title={<h5>Additional <span className="fw-semi-bold">Content</span></h5>}
103 + close collapse
104 + >
105 + <p>Alerts can also contain additional HTML elements like headings, paragraphs and dividers.</p>
106 + <Alert color="success">
107 + <h4 className="alert-heading">Well done!</h4>
108 + <p>
109 + Aww yeah, you successfully read this important alert message. This example text is going
110 + to run a bit longer so that you can see how spacing within an alert works with this kind
111 + of content.
112 + </p>
113 + <hr />
114 + <p className="mb-0">
115 + Whenever you need to, be sure to use margin utilities to keep things nice and tidy.
116 + </p>
117 + </Alert>
118 + <Alert color="danger">
119 + <h4 className="alert-heading">Well done!</h4>
120 + <p>
121 + Aww yeah, you successfully read this important alert message. This example text is going
122 + to run a bit longer so that you can see how spacing within an alert works with this kind
123 + of content.
124 + </p>
125 + </Alert>
126 + </Widget>
127 + </Col>
128 + </Row>
129 + </div>
130 + );
131 + }
132 +}
133 +
134 +export default Alerts;
1 +{
2 + "name": "Alerts",
3 + "version": "0.0.0",
4 + "private": true,
5 + "main": "./Alerts.js"
6 +}
1 +import React from 'react';
2 +import {
3 + Row,
4 + Col,
5 + Breadcrumb,
6 + BreadcrumbItem,
7 + Button,
8 + Badge,
9 +} from 'reactstrap';
10 +
11 +import Widget from '../../../../components/Widget';
12 +
13 +const Badges = () => (
14 + <div>
15 + <Breadcrumb>
16 + <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
17 + <BreadcrumbItem active>UI Badge</BreadcrumbItem>
18 + </Breadcrumb>
19 + <h1 className="page-title">Badge</h1>
20 + <Row>
21 + <Col xs={12} md={8}>
22 + <Widget
23 + title={<h5>Badge <span className="fw-semi-bold">Example</span></h5>}
24 + close collapse
25 + >
26 + <p>
27 + Badges scale to match the size of the immediate parent element by
28 + using relative font sizing and em units.
29 + </p>
30 + <h1>Example heading <Badge color="primary">Primary</Badge></h1>
31 + <h2>Example heading <Badge color="info">Info</Badge></h2>
32 + <h3>Example heading <Badge color="warning">Warning</Badge></h3>
33 + <h4>Example heading <Badge color="success">Success</Badge></h4>
34 + <h5>Example heading <Badge color="danger">Danger</Badge></h5>
35 + <h6>Example heading <Badge color="secondary">Secondary</Badge></h6>
36 + <p>Badges can be used as part of links or buttons to provide a counter.</p>
37 + <Button color="primary">Notifications <Badge color="danger">4</Badge></Button>
38 + </Widget>
39 + </Col>
40 + <Col xs={12} md={8}>
41 + <Widget
42 + title={<h5>Pill <span className="fw-semi-bold">Badges</span></h5>}
43 + close collapse
44 + >
45 + <p>
46 + Use the <code>pill</code> property to make badges more rounded
47 + (with a larger border-radius and additional horizontal padding).
48 + </p>
49 + <Badge className="mr-xs" color="primary" pill>Primary</Badge>
50 + <Badge className="mr-xs" color="info" pill>Info</Badge>
51 + <Badge className="mr-xs" color="warning" pill>Warning</Badge>
52 + <Badge className="mr-xs" color="success" pill>Success</Badge>
53 + <Badge className="mr-xs" color="danger" pill>Danger</Badge>
54 + <Badge className="mr-xs" color="secondary" pill>Secondary</Badge>
55 + <Badge className="mr-xs" color="light" pill>Light</Badge>
56 + <Badge className="mr-xs" color="dark" pill>Dark</Badge>
57 + </Widget>
58 + </Col>
59 + <Col xs={12} md={8}>
60 + <Widget
61 + title={<h5>Pill <span className="fw-semi-bold">Badges</span></h5>}
62 + close collapse
63 + >
64 + <p>
65 + Using the contextual <code>href=&quot;&#35;&quot;</code> classes on
66 + an <code>&lt;Badge&gt;</code> element quickly provide actionable badges with hover and focus states.
67 + </p>
68 + <Badge className="mr-xs" href="#" color="primary">Primary</Badge>
69 + <Badge className="mr-xs" href="#" color="info">Info</Badge>
70 + <Badge className="mr-xs" href="#" color="warning">Warning</Badge>
71 + <Badge className="mr-xs" href="#" color="success">Success</Badge>
72 + <Badge className="mr-xs" href="#" color="danger">Danger</Badge>
73 + <Badge className="mr-xs" href="#" color="secondary">Secondary</Badge>
74 + <Badge className="mr-xs" href="#" color="light">Light</Badge>
75 + <Badge className="mr-xs" href="#" color="dark">Dark</Badge>
76 + </Widget>
77 + </Col>
78 + </Row>
79 + </div>
80 +);
81 +
82 +export default Badges;
1 +{
2 + "name": "Badge",
3 + "version": "0.0.0",
4 + "private": true,
5 + "main": "./Badge.js"
6 +}
...@@ -11,7 +11,7 @@ import { ...@@ -11,7 +11,7 @@ import {
11 DropdownItem, 11 DropdownItem,
12 } from 'reactstrap'; 12 } from 'reactstrap';
13 13
14 -import Widget from '../../../components/Widget'; 14 +import Widget from '../../../../components/Widget';
15 15
16 class Buttons extends React.Component { 16 class Buttons extends React.Component {
17 constructor(props) { 17 constructor(props) {
......
1 +{
2 + "name": "UIButtons",
3 + "version": "0.0.0",
4 + "private": true,
5 + "main": "./Buttons.js"
6 +}
1 +import React from 'react';
2 +import {
3 + Row,
4 + Col,
5 + Breadcrumb,
6 + BreadcrumbItem,
7 + Button,
8 + Badge,
9 + Card,
10 + CardBody,
11 + CardTitle,
12 + CardText,
13 + CardImg,
14 +} from 'reactstrap';
15 +
16 +import lifestyleImg from '../../../../images/cards/lifestyle.jpg';
17 +import isometricImg from '../../../../images/cards/isometric.jpg';
18 +import mountainsImg from '../../../../images/cards/mountains.jpeg';
19 +import reactnativeImg from '../../../../images/cards/rns.png';
20 +
21 +
22 +const Cards = () => (
23 + <div>
24 + <Breadcrumb>
25 + <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
26 + <BreadcrumbItem active>UI Card</BreadcrumbItem>
27 + </Breadcrumb>
28 + <h1 className="page-title">Cards - <span className="fw-semi-bold">Examples</span></h1>
29 + <p>
30 + A card is a flexible and extensible content container. It includes options for headers and footers,
31 + a wide variety of content, contextual background colors, and powerful display options. If youre
32 + familiar with Bootstrap 3, cards replace its old panels, wells, and thumbnails. Similar functionality
33 + to those components is available as modifier classes for cards.
34 + </p>
35 + <Row>
36 + <Col>
37 + <Card
38 + className="background-cover border-0 mb-xlg"
39 + style={{ backgroundImage: `url(${lifestyleImg})` }}
40 + >
41 + <CardBody className="text-white">
42 + <span>13 Mar</span>
43 + <h3 className="mt-lg">Lifestyle brand</h3>
44 + <p className="w-75">A lifestyle brand is a company that markets its products or services to embody the
45 + interests, attitudes, and opinions of a group or a culture. Lifestyle brands
46 + seek to inspire, guide, and motivate people, with the goal of their products
47 + contributing to the definition of the consumer&apos;s way of life.</p>
48 + <Button className="btn-rounded-f mt-lg" color="danger">Full Article</Button>
49 + </CardBody>
50 + </Card>
51 + </Col>
52 + </Row>
53 + <Row>
54 + <Col xs={12} sm={6} md={4}>
55 + <Card className="border-0 mb-xlg">
56 + <CardImg top width="100%" src={isometricImg} alt="Card image cap" />
57 + <CardBody>
58 + <CardTitle>Isometric design</CardTitle>
59 + <CardText>
60 + Isometric projection is a method for visually representing three-dimensional in two
61 + dimensions in technical and engineering drawings.
62 + </CardText>
63 + <div className="w-100 text-center">
64 + <Button className="btn-rounded-f" color="primary">Full Article</Button>
65 + </div>
66 + </CardBody>
67 + </Card>
68 + </Col>
69 + <Col xs={12} sm={6} md={4}>
70 + <Card className="mb-xlg border-0">
71 + <CardBody>
72 + <button className="btn-link fw-semi-bold text-success">Avg Rating</button>
73 + <button className="btn-link fw-semi-bold text-muted ml-sm">All Time</button>
74 + <hr />
75 + <div className="d-flex justify-content-between mb-lg">
76 + <div className="text-warning">
77 + <i className="fa fa-star mr-xs" />
78 + <i className="fa fa-star mr-xs" />
79 + <i className="fa fa-star mr-xs" />
80 + <i className="fa fa-star mr-xs" />
81 + <i className="fa fa-star" />
82 + </div>
83 + <span className="text-muted"><small>342 REVIEWS</small></span>
84 + </div>
85 + <div className="mb-lg">
86 + <h3 className="text-success mb-0">69%</h3>
87 + of customers recomend this product
88 + </div>
89 + <Button className="btn-rounded-f" color="success">Write a Review</Button>
90 + </CardBody>
91 + </Card>
92 + <Card className="mb-xlg border-0" style={{ position: 'relative' }}>
93 + <CardImg top width="100%" src={mountainsImg} alt="Card image cap" />
94 + <Badge className="mt-lg fw-thin rounded-0" color="success" style={{ position: 'absolute' }}>New</Badge>
95 + <CardBody>
96 + <CardTitle>Weekly Inspiration</CardTitle>
97 + <hr />
98 + <CardText>
99 + There are at least 109 mountains on Earts with elevations greeter than 7,200 meters
100 + </CardText>
101 + <Button className="border-0" color="default">Read More</Button>
102 + </CardBody>
103 + </Card>
104 + </Col>
105 + <Col xs={12} sm={6} md={4}>
106 + <Card className="border-0">
107 + <CardImg top width="100%" src={reactnativeImg} alt="Card image cap" />
108 + <CardBody>
109 + <small>Technology</small><br />
110 + <CardTitle className="mb mt-xs">
111 + React Native Starter
112 + </CardTitle>
113 + <hr />
114 + <div className="w-100 d-flex justify-content-between align-items-center">
115 + <span className="text-muted fw-semi-bold">from $49.95</span>
116 + <Button color="info">Read more</Button>
117 + </div>
118 + </CardBody>
119 + </Card>
120 + </Col>
121 + </Row>
122 + </div>
123 +);
124 +
125 +export default Cards;
1 +{
2 + "name": "Card",
3 + "version": "0.0.0",
4 + "private": true,
5 + "main": "./Card.js"
6 +}
1 +import React from 'react';
2 +import {
3 + Row,
4 + Col,
5 + Breadcrumb,
6 + BreadcrumbItem,
7 + UncontrolledCarousel,
8 +} from 'reactstrap';
9 +
10 +import firstSlide from '../../../../images/slides/1.jpg';
11 +import secondSlide from '../../../../images/slides/2.jpg';
12 +import thirdSlide from '../../../../images/slides/3.jpg';
13 +
14 +const carouselItems = [
15 + { src: firstSlide, caption: '' },
16 + { src: secondSlide, caption: '' },
17 + { src: thirdSlide, caption: '' },
18 +];
19 +
20 +const Carousel = () => (
21 + <div>
22 + <Breadcrumb>
23 + <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
24 + <BreadcrumbItem active>UI Carousel</BreadcrumbItem>
25 + </Breadcrumb>
26 + <p>
27 + The carousel is a slideshow for cycling through a series of content, built with
28 + CSS 3D transforms and a bit of JavaScript. It works with a series of images, text,
29 + or custom markup. It also includes support for previous/next controls and indicators.
30 + </p>
31 + <Row>
32 + <Col>
33 + <UncontrolledCarousel captionTex={null} items={carouselItems} />
34 + </Col>
35 + </Row>
36 + </div>
37 +);
38 +
39 +export default Carousel;
1 +{
2 + "name": "Carousel",
3 + "version": "0.0.0",
4 + "private": true,
5 + "main": "./Carousel.js"
6 +}
1 -@import '../../../styles/app'; 1 +@import '../../../../styles/app';
2 2
3 .root { 3 .root {
4 :global { 4 :global {
......
1 +{
2 + "name": "UIIcons",
3 + "version": "0.0.0",
4 + "private": true,
5 + "main": "./Icons.js"
6 +}
1 +import React from 'react';
2 +import {
3 + Row,
4 + Col,
5 + Breadcrumb,
6 + BreadcrumbItem,
7 + Button,
8 + Jumbotron,
9 + Container,
10 +} from 'reactstrap';
11 +
12 +const Jumb = () => (
13 + <div>
14 + <Breadcrumb>
15 + <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
16 + <BreadcrumbItem active>UI Jumbotron</BreadcrumbItem>
17 + </Breadcrumb>
18 + <Jumbotron fluid>
19 + <Container fluid>
20 + <h1 className="display-3">Fluid jumbotron</h1>
21 + <p className="lead">This is a modified jumbotron that occupies the entire horizontal space of its parent.</p>
22 + </Container>
23 + </Jumbotron>
24 + <Row>
25 + <Col xs={12} md={8}>
26 + <Jumbotron>
27 + <h1 className="display-3">Hello, world!</h1>
28 + <p className="lead">This is a simple hero unit, a simple Jumbotron-style component for calling extra attention to featured content or information.</p>
29 + <hr className="my-2" />
30 + <p>It uses utility classes for typgraphy and spacing to space content out within the larger container.</p>
31 + <p className="lead">
32 + <Button color="primary">Learn More</Button>
33 + </p>
34 + </Jumbotron>
35 + </Col>
36 + </Row>
37 + </div>
38 +);
39 +
40 +export default Jumb;
1 +{
2 + "name": "Jumbotron",
3 + "version": "0.0.0",
4 + "private": true,
5 + "main": "./Jumbotron.js"
6 +}
1 +import React from 'react';
2 +import {
3 + Row, Col,
4 +} from 'reactstrap';
5 +import { SortableContainer, SortableElement, arrayMove } from 'react-sortable-hoc';
6 +import SortableTree from 'react-sortable-tree';
7 +
8 +import Widget from '../../../../components/Widget';
9 +
10 +import './ListGroups.scss';
11 +
12 +const SortableItem = SortableElement(({ value }) => <li className="list-group-item">
13 + <i className="fa fa-sort" />
14 + <button className="close flex-last ml-auto" data-dismiss="alert">&times;</button>
15 + &nbsp;&nbsp;&nbsp; {value.id} &nbsp;&nbsp;&nbsp;
16 + {value.text}
17 +</li>);
18 +
19 +
20 +const SortableList = SortableContainer(({ items }) => (
21 + <ul className="list-group list-group-sortable mt-xs">
22 + {items.map((value, index) => (
23 + <SortableItem key={`item-${index.toString()}`} index={index} value={value} />
24 + ))}
25 + </ul>
26 + ));
27 +
28 +const NestableItem = SortableElement(({ value }) => {
29 + if (value.children) {
30 + return (
31 + <li className="dd-item">
32 + <div className="dd-handle" data-id={value.id}> {value.text} </div>
33 + <ol className="dd-list">
34 + {value.children.map((child, index) => (
35 + <NestableItem key={`nest-${index.toString()}`} index={index} value={child} />
36 + ))}
37 + </ol>
38 + </li>);
39 + }
40 + return (
41 + <li className="dd-item">
42 + <div className="dd-handle" data-id={value.id}> {value.text} </div>
43 + </li>
44 + );
45 +});
46 +
47 +class ListGroups extends React.Component {
48 +
49 + constructor() {
50 + super();
51 + this.state = {
52 + nestableFirstItems: [{ id: 1, title: 'Item 1' }, {
53 + id: 2,
54 + expanded: true,
55 + title: 'Item 2',
56 + children: [{ id: 3, title: 'Item 3' }, { id: 4, title: 'Item 4' }, {
57 + id: 5,
58 + title: 'Item 5',
59 + expanded: true,
60 + children: [{ id: 6, title: 'Item 6' }, {
61 + id: 7, title: 'Item 7',
62 + }, {
63 + id: 8, title: 'Item 8',
64 + }],
65 + }, { id: 9, title: 'Item 9' }],
66 + }],
67 + nestableSecondItems: [{ id: 13, title: 'Item 13' }, { id: 14, title: 'Item 14' }, {
68 + id: 15,
69 + expanded: true,
70 + title: 'Item 15',
71 + children: [{ id: 16, title: 'Item 16' }, { id: 17, title: 'Item 17' }, {
72 + id: 18, title: 'Item 18',
73 + }],
74 +
75 + }],
76 + sortableList: [{
77 + id: '03', text: ' Barnard\'s Star',
78 + }, {
79 + id: '01', text: 'The Sun',
80 + }, {
81 + id: '04', text: 'Wolf 359',
82 + }, {
83 + id: '02', text: 'Proxima Centauri',
84 + }, {
85 + id: '05', text: 'Lalande 21185',
86 + }],
87 + };
88 + }
89 +
90 + onSortEnd = ({ oldIndex, newIndex }) => {
91 + this.setState({
92 + sortableList: arrayMove(this.state.sortableList, oldIndex, newIndex),
93 + });
94 + };
95 +
96 + render() {
97 + return (
98 + <div>
99 + <ol className="breadcrumb">
100 + <li className="breadcrumb-item">YOU ARE HERE</li>
101 + <li className="breadcrumb-item active">UI List Groups</li>
102 + </ol>
103 + <h1 className="page-title">Lists - <span className="fw-semi-bold">Sortable Groups</span>
104 + </h1>
105 + <Widget
106 + title={<h4> Grouped <span className="fw-semi-bold">Lists</span></h4>}
107 + close refresh settings
108 + >
109 + <h3>Closest <span className="fw-semi-bold">Stars</span></h3>
110 + <p>
111 + Try to play around with this list. Are you ready to pass an exam on astronomy?
112 + </p>
113 +
114 + <SortableList items={this.state.sortableList} onSortEnd={this.onSortEnd} />
115 + </Widget>
116 +
117 + <Widget
118 + title={<h3>Nestable <span className="fw-semi-bold">List</span></h3>}
119 + close refresh settings
120 + >
121 + <p className="fs-mini">
122 + There is a scientific theory that you can arrange this list in such way that there will
123 + be no more saddness
124 + in the whole world. Can you? Touch devices supported
125 + </p>
126 + <Row className="nestable">
127 + <Col md="6" xs="12" className="mb-xs">
128 + <SortableTree
129 + treeData={this.state.nestableFirstItems}
130 + onChange={nestableFirstItems => this.setState({ nestableFirstItems })}
131 + />
132 + </Col>
133 + <Col md="6">
134 + <SortableTree
135 + treeData={this.state.nestableSecondItems}
136 + onChange={nestableSecondItems => this.setState({ nestableSecondItems })}
137 + />
138 + </Col>
139 + </Row>
140 + </Widget>
141 +
142 + </div>
143 + );
144 + }
145 +
146 +}
147 +
148 +export default ListGroups;
1 -@import '../../../styles/app'; 1 +@import '../../../../styles/app';
2 2
3 .list-group-sortable { 3 .list-group-sortable {
4 > .list-group-item { 4 > .list-group-item {
......
1 +{
2 + "name": "UIListGroups",
3 + "version": "0.0.0",
4 + "private": true,
5 + "main": "./ListGroups.js"
6 +}
...@@ -12,7 +12,7 @@ import { ...@@ -12,7 +12,7 @@ import {
12 Container, 12 Container,
13 } from 'reactstrap'; 13 } from 'reactstrap';
14 14
15 -import Widget from '../../../components/Widget'; 15 +import Widget from '../../../../components/Widget';
16 16
17 class ModalExample extends React.Component { 17 class ModalExample extends React.Component {
18 state = { 18 state = {
......
1 +{
2 + "name": "Modal",
3 + "version": "0.0.0",
4 + "private": true,
5 + "main": "./Modal.js"
6 +}
1 +import React, { Component } from 'react';
2 +import {
3 + Row,
4 + Col,
5 + Breadcrumb,
6 + BreadcrumbItem,
7 + Nav,
8 + NavItem,
9 + NavLink,
10 + Dropdown,
11 + DropdownToggle,
12 + DropdownMenu,
13 + DropdownItem,
14 +} from 'reactstrap';
15 +
16 +import Widget from '../../../../components/Widget';
17 +
18 +class NavExamples extends Component {
19 + state = {
20 + isDropdownOpened: false,
21 + };
22 +
23 + toggleDropdown = () => {
24 + this.setState(prevState => ({
25 + isDropdownOpened: !prevState.isDropdownOpened,
26 + }));
27 + }
28 +
29 + render() {
30 + return (
31 + <div>
32 + <Breadcrumb>
33 + <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
34 + <BreadcrumbItem active>UI Nav</BreadcrumbItem>
35 + </Breadcrumb>
36 + <Row>
37 + <Col xs={12} md={6}>
38 + <Widget
39 + title={<h5>Base <span className="fw-semi-bold">Nav</span></h5>}
40 + close collapse
41 + >
42 + <p>
43 + Navigation available in Bootstrap share general markup and styles,
44 + from the base .nav class to the active and disabled states. Swap
45 + modifier classes to switch between each style.
46 + </p>
47 + <div className="bg-light p-3">
48 + <Nav>
49 + <NavItem>
50 + <NavLink href="#">Link</NavLink>
51 + </NavItem>
52 + <NavItem>
53 + <NavLink href="#">Link</NavLink>
54 + </NavItem>
55 + <NavItem>
56 + <NavLink href="#">Another Link</NavLink>
57 + </NavItem>
58 + <NavItem>
59 + <NavLink disabled href="#">Disabled Link</NavLink>
60 + </NavItem>
61 + </Nav>
62 + <pre className="bg-light border-0 w-100 h-100">
63 + <code className="text-danger">{'<Nav>\n'}</code>
64 + <code className="text-info">{' <NavItem>\n'}</code>
65 + <code className="text-warning">{' <NavLink href="#">\n'}</code>
66 + <code>{' Link\n'}</code>
67 + <code className="text-warning">{' </NavLink>\n'}</code>
68 + <code className="text-info">{' </NavItem>\n'}</code>
69 +
70 + <code className="text-info">{' <NavItem>\n'}</code>
71 + <code className="text-warning">{' <NavLink href="#">\n'}</code>
72 + <code>{' Link\n'}</code>
73 + <code className="text-warning">{' </NavLink>\n'}</code>
74 + <code className="text-info">{' </NavItem>\n'}</code>
75 +
76 + <code className="text-info">{' <NavItem>\n'}</code>
77 + <code className="text-warning">{' <NavLink href="#">\n'}</code>
78 + <code>{' Another Link\n'}</code>
79 + <code className="text-warning">{' </NavLink>\n'}</code>
80 + <code className="text-info">{' </NavItem>\n'}</code>
81 +
82 + <code className="text-info">{' <NavItem>\n'}</code>
83 + <code className="text-warning">{' <NavLink disabled href="#">\n'}</code>
84 + <code>{' Disabled Link\n'}</code>
85 + <code className="text-warning">{' </NavLink>\n'}</code>
86 + <code className="text-info">{' </NavItem>\n'}</code>
87 + <code className="text-danger">{'</Nav>'}</code>
88 + </pre>
89 + </div>
90 + <h5 className="mt">With dropdown</h5>
91 + <Nav className="bg-light p-2">
92 + <NavItem>
93 + <NavLink href="#">Link</NavLink>
94 + </NavItem>
95 + <Dropdown isOpen={this.state.isDropdownOpened} toggle={this.toggleDropdown}>
96 + <DropdownToggle nav caret>
97 + Dropdown
98 + </DropdownToggle>
99 + <DropdownMenu>
100 + <DropdownItem header>Header</DropdownItem>
101 + <DropdownItem disabled>Action</DropdownItem>
102 + <DropdownItem>Another Action</DropdownItem>
103 + <DropdownItem divider />
104 + <DropdownItem>Another Action</DropdownItem>
105 + </DropdownMenu>
106 + </Dropdown>
107 + <NavItem>
108 + <NavLink href="#">Another Link</NavLink>
109 + </NavItem>
110 + <NavItem>
111 + <NavLink disabled href="#">Disabled Link</NavLink>
112 + </NavItem>
113 + </Nav>
114 + </Widget>
115 + </Col>
116 + <Col xs={12} md={6}>
117 + <Widget
118 + title={<h5>Tabs & Pills</h5>}
119 + close collapse
120 + >
121 + <p>
122 + Takes the basic <code>&lt;Nav&gt;</code> from above and adds the <code>tabs</code> property to generate a
123 + tabbed interface. Use them to create tabbable regions with our tab
124 + JavaScript plugin.
125 + </p>
126 + <div className="bg-light p-3">
127 + <Nav tabs>
128 + <NavItem>
129 + <NavLink href="#" active>Link</NavLink>
130 + </NavItem>
131 + <NavItem>
132 + <NavLink href="#">Link</NavLink>
133 + </NavItem>
134 + <NavItem>
135 + <NavLink href="#">Another Link</NavLink>
136 + </NavItem>
137 + <NavItem>
138 + <NavLink disabled href="#">Disabled Link</NavLink>
139 + </NavItem>
140 + </Nav>
141 + <pre className="bg-light border-0 w-100 h-100">
142 + <code className="text-danger">{'<Nav tabs>\n'}</code>
143 + <code className="text-info">{' <NavItem>\n'}</code>
144 + <code className="text-warning">{' <NavLink href="#">\n'}</code>
145 + <code>{' Link\n'}</code>
146 + <code className="text-warning">{' </NavLink>\n'}</code>
147 + <code className="text-info">{' </NavItem>\n'}</code>
148 +
149 + <code className="text-info">{' <NavItem>\n'}</code>
150 + <code className="text-warning">{' <NavLink href="#">\n'}</code>
151 + <code>{' Link\n'}</code>
152 + <code className="text-warning">{' </NavLink>\n'}</code>
153 + <code className="text-info">{' </NavItem>\n'}</code>
154 +
155 + <code className="text-info">{' <NavItem>\n'}</code>
156 + <code className="text-warning">{' <NavLink href="#">\n'}</code>
157 + <code>{' Another Link\n'}</code>
158 + <code className="text-warning">{' </NavLink>\n'}</code>
159 + <code className="text-info">{' </NavItem>\n'}</code>
160 +
161 + <code className="text-info">{' <NavItem>\n'}</code>
162 + <code className="text-warning">{' <NavLink disabled href="#">\n'}</code>
163 + <code>{' Disabled Link\n'}</code>
164 + <code className="text-warning">{' </NavLink>\n'}</code>
165 + <code className="text-info">{' </NavItem>\n'}</code>
166 + <code className="text-danger">{'</Nav>'}</code>
167 + </pre>
168 + </div>
169 + <p className="mt">Do the same thing with the <code>pills</code> property.</p>
170 + <div className="bg-light p-3">
171 + <Nav pills>
172 + <NavItem>
173 + <NavLink href="#" active>Link</NavLink>
174 + </NavItem>
175 + <NavItem>
176 + <NavLink href="#">Link</NavLink>
177 + </NavItem>
178 + <NavItem>
179 + <NavLink href="#">Another Link</NavLink>
180 + </NavItem>
181 + <NavItem>
182 + <NavLink disabled href="#">Disabled Link</NavLink>
183 + </NavItem>
184 + </Nav>
185 + </div>
186 + </Widget>
187 + </Col>
188 + </Row>
189 + </div>
190 + );
191 + }
192 +}
193 +
194 +export default NavExamples;
1 +{
2 + "name": "Nav",
3 + "version": "0.0.0",
4 + "private": true,
5 + "main": "./Nav.js"
6 +}
1 +import React, { Component } from 'react';
2 +import {
3 + Row,
4 + Col,
5 + Breadcrumb,
6 + BreadcrumbItem,
7 + Navbar,
8 + NavbarBrand,
9 + NavbarToggler,
10 + Collapse,
11 + Nav,
12 + NavItem,
13 + NavLink,
14 +} from 'reactstrap';
15 +
16 +import Widget from '../../../../components/Widget';
17 +
18 +class NavbarExamples extends Component {
19 + state = {
20 + navs: [false, false, false, false],
21 + }
22 +
23 + toggle(id) {
24 + const newState = Array(4).fill(false);
25 +
26 + if (!this.state.navs[id]) {
27 + newState[id] = true;
28 + }
29 +
30 + this.setState({ navs: newState });
31 + }
32 + render() {
33 + return (
34 + <div>
35 + <Breadcrumb>
36 + <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
37 + <BreadcrumbItem active>UI Navbar</BreadcrumbItem>
38 + </Breadcrumb>
39 + <Row>
40 + <Col xs={12} md={9}>
41 + <Widget
42 + title={<h5>Navbar <span className="fw-semi-bold">Example</span></h5>}
43 + close collapse
44 + >
45 + <p>Heres what you need to know before getting started with the navbar:</p>
46 + <ui>
47 + <li>Navbars require a wrapping <code>&lt;Navbar&gt;</code> with <code>expand=&quot;*&quot;</code> for
48 + responsive collapsing and color scheme classes.</li>
49 + <li>Navbars and their contents are fluid by default. Use optional containers
50 + to limit their horizontal width.</li>
51 + <li>Use our spacing and flex utility classes for controlling spacing and alignment within navbars.</li>
52 + <li>Navbars are responsive by default, but you can easily modify them to change that. Responsive
53 + behavior depends on our Collapse JavaScript plugin.</li>
54 + <li>Navbars are hidden by default when printing. Force them to be printed by adding <code>.d-print</code>
55 + to the <code>.navbar</code>. See the display utility class.</li>
56 + </ui>
57 + <Navbar className="px-2 mt-lg" color="light" light expand="md">
58 + <NavbarBrand href="/">Navbar</NavbarBrand>
59 + <NavbarToggler className="ml-auto" onClick={() => this.toggle(0)} />
60 + <Collapse isOpen={this.state.navs[0]} navbar>
61 + <Nav className="ml-auto" navbar>
62 + <NavItem>
63 + <NavLink>Home</NavLink>
64 + </NavItem>
65 + <NavItem>
66 + <NavLink>Features</NavLink>
67 + </NavItem>
68 + <NavItem>
69 + <NavLink>Pricing</NavLink>
70 + </NavItem>
71 + <NavItem>
72 + <NavLink disabled>Disabled</NavLink>
73 + </NavItem>
74 + </Nav>
75 + </Collapse>
76 + </Navbar>
77 + </Widget>
78 + </Col>
79 + <Col xs={12} md={9}>
80 + <Widget
81 + title={<h5>Navbar <span className="fw-semi-bold">Example</span></h5>}
82 + close collapse
83 + >
84 + <p>Theming the navbar has never been easier thanks to the combination of
85 + theming classes and background-color utilities. Choose from <code>color=&quot;light&quot;</code>
86 + for use with light background colors, or <code>color=&quot;dark&quot;</code> for dark background
87 + colors. Then, customize with <code>.bg-*</code> utilities.</p>
88 + <Navbar className="px-2 mt-lg" color="dark" dark expand="md">
89 + <NavbarBrand href="/">Navbar</NavbarBrand>
90 + <NavbarToggler className="ml-auto" onClick={() => this.toggle(1)} />
91 + <Collapse isOpen={this.state.navs[1]} navbar>
92 + <Nav className="ml-auto" navbar>
93 + <NavItem>
94 + <NavLink>Home</NavLink>
95 + </NavItem>
96 + <NavItem>
97 + <NavLink>Features</NavLink>
98 + </NavItem>
99 + <NavItem>
100 + <NavLink>Pricing</NavLink>
101 + </NavItem>
102 + <NavItem>
103 + <NavLink disabled>Disabled</NavLink>
104 + </NavItem>
105 + </Nav>
106 + </Collapse>
107 + </Navbar>
108 + <Navbar className="px-2 mt-lg" color="primary" dark expand="md">
109 + <NavbarBrand href="/">Navbar</NavbarBrand>
110 + <NavbarToggler className="ml-auto" onClick={() => this.toggle(2)} />
111 + <Collapse isOpen={this.state.navs[2]} navbar>
112 + <Nav className="ml-auto" navbar>
113 + <NavItem>
114 + <NavLink>Home</NavLink>
115 + </NavItem>
116 + <NavItem>
117 + <NavLink>Features</NavLink>
118 + </NavItem>
119 + <NavItem>
120 + <NavLink>Pricing</NavLink>
121 + </NavItem>
122 + <NavItem>
123 + <NavLink disabled>Disabled</NavLink>
124 + </NavItem>
125 + </Nav>
126 + </Collapse>
127 + </Navbar>
128 + <Navbar className="px-2 mt-lg" color="light" light expand="md">
129 + <NavbarBrand href="/">Navbar</NavbarBrand>
130 + <NavbarToggler className="ml-auto" onClick={() => this.toggle(3)} />
131 + <Collapse isOpen={this.state.navs[3]} navbar>
132 + <Nav className="ml-auto" navbar>
133 + <NavItem>
134 + <NavLink>Home</NavLink>
135 + </NavItem>
136 + <NavItem>
137 + <NavLink>Features</NavLink>
138 + </NavItem>
139 + <NavItem>
140 + <NavLink>Pricing</NavLink>
141 + </NavItem>
142 + <NavItem>
143 + <NavLink disabled>Disabled</NavLink>
144 + </NavItem>
145 + </Nav>
146 + </Collapse>
147 + </Navbar>
148 + </Widget>
149 + </Col>
150 + </Row>
151 + </div>
152 + );
153 + }
154 +}
155 +
156 +export default NavbarExamples;
1 +{
2 + "name": "Navbar",
3 + "version": "0.0.0",
4 + "private": true,
5 + "main": "./Navbar.js"
6 +}
1 +import React from 'react';
2 +import {
3 + Row, Col, Button,
4 +} from 'reactstrap';
5 +/* eslint-disable */
6 +import 'imports-loader?$=jquery,this=>window!messenger/build/js/messenger';
7 +/* eslint-enable */
8 +
9 +import Widget from '../../../../components/Widget';
10 +import s from './Notifications.module.scss';
11 +
12 +// todo @franckeeva what about server side rendering? this will fail unless launched as lazy route
13 +const Messenger = window.Messenger;
14 +
15 +/* eslint-disable */
16 +function initializationMessengerCode() {
17 + (function () {
18 + let $,
19 + FlatMessage,
20 + spinner_template,
21 + __hasProp = {}.hasOwnProperty,
22 + __extends = function (child, parent) {
23 + for (const key in parent) {
24 + if (__hasProp.call(parent, key)) child[key] = parent[key];
25 + }
26 +
27 + function ctor() {
28 + this.constructor = child;
29 + }
30 +
31 + ctor.prototype = parent.prototype;
32 + child.prototype = new ctor();
33 + child.__super__ = parent.prototype;
34 + return child;
35 + };
36 +
37 + $ = jQuery;
38 +
39 + spinner_template = '<div class="messenger-spinner">\n <span class="messenger-spinner-side messenger-spinner-side-left">\n <span class="messenger-spinner-fill"></span>\n </span>\n <span class="messenger-spinner-side messenger-spinner-side-right">\n <span class="messenger-spinner-fill"></span>\n </span>\n</div>';
40 +
41 + FlatMessage = (function (_super) {
42 + __extends(FlatMessage, _super);
43 +
44 + function FlatMessage() {
45 + return FlatMessage.__super__.constructor.apply(this, arguments);
46 + }
47 +
48 + FlatMessage.prototype.template = function (opts) {
49 + let $message;
50 + $message = FlatMessage.__super__.template.apply(this, arguments);
51 + $message.append($(spinner_template));
52 + return $message;
53 + };
54 +
55 + return FlatMessage;
56 + }(Messenger.Message));
57 +
58 + Messenger.themes.air = {
59 + Message: FlatMessage,
60 + };
61 + }).call(window);
62 +}
63 +/* eslint-enable */
64 +
65 +class Notifications extends React.Component {
66 + constructor() {
67 + super();
68 + this.addSuccessNotification = this.addSuccessNotification.bind(this);
69 + this.addInfoNotification = this.addInfoNotification.bind(this);
70 + this.addErrorNotification = this.addErrorNotification.bind(this);
71 + this.toggleLocation = this.toggleLocation.bind(this);
72 + this.state = {
73 + locationClasses: 'messenger-fixed messenger-on-bottom messenger-on-right',
74 + };
75 + }
76 +
77 +
78 + componentDidMount() {
79 + initializationMessengerCode();
80 + Messenger.options = {
81 + extraClasses: this.state.locationClasses,
82 + theme: 'air',
83 + };
84 + Messenger().post('Thanks for checking out Messenger!');
85 + }
86 +
87 + addSuccessNotification() {
88 + Messenger().post({
89 + extraClasses: this.state.locationClasses,
90 + message: 'Showing success message was successful!',
91 + type: 'success',
92 + showCloseButton: true,
93 + });
94 + return false;
95 + }
96 +
97 + addInfoNotification() {
98 + const msg = Messenger().post({
99 + extraClasses: this.state.locationClasses,
100 + message: 'Launching thermonuclear war...',
101 + actions: {
102 + cancel: {
103 + label: 'cancel launch',
104 + action: () => msg.update({
105 + message: 'Thermonuclear war averted', type: 'success', actions: false,
106 + }),
107 + },
108 + },
109 + });
110 +
111 + return false;
112 + }
113 +
114 + addErrorNotification() {
115 + let i = 0;
116 + Messenger().run({
117 + errorMessage: 'Error destroying alien planet',
118 + successMessage: 'Alien planet destroyed!',
119 + extraClasses: this.state.locationClasses,
120 + action(opts) {
121 + /* eslint-disable */
122 + if (++i < 3) {
123 + return opts.error({
124 + status: 500,
125 + readyState: 0,
126 + responseText: 0,
127 + });
128 + }
129 + /* eslint-enable */
130 + return opts.success();
131 + },
132 + });
133 + }
134 +
135 + toggleLocation(vertical = 'top', horizontal = '') {
136 + let className = `messenger-fixed messenger-on-${vertical}`;
137 + className += (horizontal === '') ? '' : ` messenger-on-${horizontal}`;
138 + this.setState({
139 + locationClasses: className,
140 + });
141 + Messenger.options = {
142 + extraClasses: className,
143 + theme: 'air',
144 + };
145 + Messenger();
146 + }
147 +
148 + render() {
149 + return (
150 + <div className={s.root}>
151 + <ol className="breadcrumb">
152 + <li className="breadcrumb-item">YOU ARE HERE</li>
153 + <li className="breadcrumb-item active">UI Notifications</li>
154 + </ol>
155 + <h1 className="page-title">Messages - <span className="fw-semi-bold">Notifications</span>
156 + </h1>
157 +
158 + <Widget title={<h6> Messenger </h6>} close collapse settings>
159 + <Row>
160 + <Col lg="4" xs="12">
161 + <h5 className="m-t-1">Layout options</h5>
162 + <p>There are few position options available for notifications. You can click any of
163 + them
164 + to change notifications position:</p>
165 + <div className="location-selector">
166 + { /* eslint-disable */}
167 + <div
168 + className="bit top left" onClick={() => {
169 + this.toggleLocation('top', 'left');
170 + }}
171 + />
172 + <div
173 + className="bit top right" onClick={() => {
174 + this.toggleLocation('top', 'right');
175 + }}
176 + />
177 + <div
178 + className="bit top" onClick={() => {
179 + this.toggleLocation('top', '');
180 + }}
181 + />
182 + <div
183 + className="bit bottom left" onClick={() => {
184 + this.toggleLocation('bottom', 'left');
185 + }}
186 + />
187 + <div
188 + className="bit bottom right" onClick={() => {
189 + this.toggleLocation('bottom', 'right');
190 + }}
191 + />
192 + <div
193 + className="bit bottom" onClick={() => {
194 + this.toggleLocation('bottom', '');
195 + }}
196 + />
197 + { /* eslint-enable */}
198 + </div>
199 + </Col>
200 +
201 + <Col lg="4" xs="12">
202 + <h5 className="m-t-1">Notification Types</h5>
203 + <p>Different types of notifications for lost of use cases. Custom classes are also
204 + supported.</p>
205 + <p><Button color="info" id="show-info-message" onClick={this.addInfoNotification}>Info
206 + Message</Button></p>
207 + <p><Button color="danger" id="show-error-message" onClick={this.addErrorNotification}>Error
208 + + Retry Message</Button></p>
209 + <p><Button
210 + color="success" id="show-success-message" onClick={this.addSuccessNotification}
211 + >Success
212 + Message</Button></p>
213 + </Col>
214 +
215 + <Col lg="4" xs="12">
216 + <h5 className="m-t-1">Dead Simple Usage</h5>
217 + <p>Just few lines of code to instantiate a notifications object. Does not require
218 + passing any options:</p>
219 + <pre><code>{'Messenger().post("Thanks for checking out Messenger!");'}</code></pre>
220 + <p>More complex example:</p>
221 + <pre>
222 + <code>{'\nMessenger().post({\n message: \'There was an explosion while processing your request.\',\n type: \'error\',\n showCloseButton: true\n});\n\n'}
223 + </code>
224 + </pre>
225 + </Col>
226 + </Row>
227 + </Widget>
228 + </div>
229 + );
230 + }
231 +}
232 +
233 +export default Notifications;
1 +@import '../../../../styles/app';
2 +
3 +.root {
4 + :global {
5 + .location-selector {
6 + width: 100%;
7 + height: 220px;
8 + border: 1px dashed #bbb;
9 + background-color: $white;
10 + position: relative;
11 + }
12 +
13 + .location-selector .bit {
14 + @include transition(background-color 0.15s ease-in-out);
15 +
16 + background-color: $gray-300;
17 + cursor: pointer;
18 + position: absolute;
19 + }
20 +
21 + .location-selector .bit:hover {
22 + background-color: $gray-400;
23 + }
24 +
25 + .location-selector .bit.top,
26 + .location-selector .bit.bottom {
27 + height: 25%;
28 + width: 40%;
29 + margin: 0 30%;
30 + }
31 +
32 + .location-selector .bit.top {
33 + top: 0;
34 + }
35 +
36 + .location-selector .bit.bottom {
37 + bottom: 0;
38 + }
39 +
40 + .location-selector .bit.right,
41 + .location-selector .bit.left {
42 + height: 20%;
43 + width: 20%;
44 + margin-left: 0;
45 + margin-right: 0;
46 + }
47 +
48 + .location-selector .bit.right {
49 + right: 0;
50 + }
51 +
52 + .location-selector .bit.left {
53 + left: 0;
54 + }
55 + }
56 +}
1 +{
2 + "name": "UINotifications",
3 + "version": "0.0.0",
4 + "private": true,
5 + "main": "./Notifications.js"
6 +}
1 +import React, { Component } from 'react';
2 +import {
3 + Row,
4 + Col,
5 + Breadcrumb,
6 + BreadcrumbItem,
7 + Button,
8 + Popover,
9 + PopoverHeader,
10 + PopoverBody,
11 + Tooltip,
12 +} from 'reactstrap';
13 +
14 +import Widget from '../../../../components/Widget';
15 +
16 +class PopoverExamples extends Component {
17 + state = {
18 + tooltips: [false, false, false, false, false, false],
19 + popovers: [false, false, false, false, false, false],
20 + tooltipOpen: false,
21 + }
22 +
23 + toggle(id, field) {
24 + const newState = [...this.state[field]];
25 + newState.fill(false);
26 +
27 + if (!this.state[field][id]) {
28 + newState[id] = true;
29 + }
30 +
31 + this.setState({
32 + [field]: newState,
33 + });
34 + }
35 +
36 + render() {
37 + return (
38 + <div>
39 + <Breadcrumb>
40 + <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
41 + <BreadcrumbItem active>UI Badge</BreadcrumbItem>
42 + </Breadcrumb>
43 + <h1 className="page-title">Badge</h1>
44 + <Row>
45 + <Col xs={12} md={6}>
46 + <Widget
47 + className="mb-xlg"
48 + title={<h5>Popover <span className="fw-semi-bold">Example</span></h5>}
49 + close collapse
50 + >
51 + <Button
52 + id="p-1" className="mr-xs" size="lg" color="danger"
53 + onClick={() => this.toggle(0, 'popovers')}
54 + >Click to toggle popover</Button>
55 + <Button
56 + id="p-2" color="danger" disabled
57 + onClick={() => this.toggle(1, 'popovers')}
58 + >Disabled button</Button>
59 + </Widget>
60 + <Widget
61 + title={<h5>Popover <span className="fw-semi-bold">Directions</span></h5>}
62 + close collapse
63 + >
64 + <Button
65 + id="p-3" className="mr-xs mb-xs" color="info"
66 + onClick={() => this.toggle(2, 'popovers')}
67 + >Popover on top</Button>
68 + <Button
69 + id="p-4" className="mr-xs mb-xs" color="warning"
70 + onClick={() => this.toggle(3, 'popovers')}
71 + >Popover on right</Button>
72 + <Button
73 + id="p-5" className="mr-xs mb-xs" color="inverse"
74 + onClick={() => this.toggle(4, 'popovers')}
75 + >Popover on bottom</Button>
76 + <Button
77 + id="p-6" className="mr-xs mb-xs" color="default"
78 + onClick={() => this.toggle(5, 'popovers')}
79 + >Popover on left</Button>
80 + </Widget>
81 + </Col>
82 + <Col xs={12} md={6}>
83 + <Widget
84 + className="mb-xlg"
85 + title={<h5>Tooltip <span className="fw-semi-bold">Example</span></h5>}
86 + close collapse
87 + >
88 + <Button id="t-1" className="mr-sm" size="lg" color="success">Tooltip</Button>
89 + <Button id="t-2" color="success" disabled>Disabled button</Button>
90 + </Widget>
91 + <Widget
92 + title={<h5>Tooltip <span className="fw-semi-bold">Directions</span></h5>}
93 + close collapse
94 + >
95 + <Button id="t-3" className="mr-xs mb-xs" color="info">Tooltip on top</Button>
96 + <Button id="t-4" className="mr-xs mb-xs" color="warning">Tooltip on right</Button>
97 + <Button id="t-5" className="mr-xs mb-xs" color="inverse">Tooltip on bottom</Button>
98 + <Button id="t-6" className="mr-xs mb-xs" color="default">Tooltip on left</Button>
99 + </Widget>
100 + </Col>
101 + </Row>
102 +
103 + {/* Popovers & Tooltips */}
104 +
105 + <Popover placement="top" isOpen={this.state.popovers[0]} target="p-1" toggle={() => this.toggle(0, 'popovers')}>
106 + <PopoverHeader>Popover Title</PopoverHeader>
107 + <PopoverBody>
108 + Sed posuere consectetur est at lobortis. Aenean eu leo quam.
109 + Pellentesque ornare sem lacinia quam venenatis vestibulum.
110 + </PopoverBody>
111 + </Popover>
112 + <Popover placement="top" isOpen={this.state.popovers[1]} target="p-2" toggle={() => this.toggle(1, 'popovers')}>
113 + <PopoverHeader>Popover Title</PopoverHeader>
114 + <PopoverBody>
115 + Sed posuere consectetur est at lobortis. Aenean eu leo quam.
116 + Pellentesque ornare sem lacinia quam venenatis vestibulum.
117 + </PopoverBody>
118 + </Popover>
119 + <Popover placement="top" isOpen={this.state.popovers[2]} target="p-3" toggle={() => this.toggle(2, 'popovers')}>
120 + <PopoverHeader>Popover Title</PopoverHeader>
121 + <PopoverBody>
122 + Sed posuere consectetur est at lobortis. Aenean eu leo quam.
123 + Pellentesque ornare sem lacinia quam venenatis vestibulum.
124 + </PopoverBody>
125 + </Popover>
126 + <Popover placement="right" isOpen={this.state.popovers[3]} target="p-4" toggle={() => this.toggle(3, 'popovers')}>
127 + <PopoverHeader>Popover Title</PopoverHeader>
128 + <PopoverBody>
129 + Sed posuere consectetur est at lobortis. Aenean eu leo quam.
130 + Pellentesque ornare sem lacinia quam venenatis vestibulum.
131 + </PopoverBody>
132 + </Popover>
133 + <Popover placement="bottom" isOpen={this.state.popovers[4]} target="p-5" toggle={() => this.toggle(4, 'popovers')}>
134 + <PopoverHeader>Popover Title</PopoverHeader>
135 + <PopoverBody>
136 + Sed posuere consectetur est at lobortis. Aenean eu leo quam.
137 + Pellentesque ornare sem lacinia quam venenatis vestibulum.
138 + </PopoverBody>
139 + </Popover>
140 + <Popover placement="left" isOpen={this.state.popovers[5]} target="p-6" toggle={() => this.toggle(5, 'popovers')}>
141 + <PopoverHeader>Popover Title</PopoverHeader>
142 + <PopoverBody>
143 + Sed posuere consectetur est at lobortis. Aenean eu leo quam.
144 + Pellentesque ornare sem lacinia quam venenatis vestibulum.
145 + </PopoverBody>
146 + </Popover>
147 +
148 + <Tooltip placement="top" isOpen={this.state.tooltips[0]} toggle={() => this.toggle(0, 'tooltips')} target="t-1">
149 + Hello world!
150 + </Tooltip>
151 + <Tooltip placement="top" isOpen={this.state.tooltips[1]} toggle={() => this.toggle(1, 'tooltips')} target="t-2">
152 + Hello world!
153 + </Tooltip>
154 + <Tooltip placement="top" isOpen={this.state.tooltips[2]} toggle={() => this.toggle(2, 'tooltips')} target="t-3">
155 + Top
156 + </Tooltip>
157 + <Tooltip placement="right" isOpen={this.state.tooltips[3]} toggle={() => this.toggle(3, 'tooltips')} target="t-4">
158 + Right
159 + </Tooltip>
160 + <Tooltip placement="bottom" isOpen={this.state.tooltips[4]} toggle={() => this.toggle(4, 'tooltips')} target="t-5">
161 + Bottom
162 + </Tooltip>
163 + <Tooltip placement="left" isOpen={this.state.tooltips[5]} toggle={() => this.toggle(5, 'tooltips')} target="t-6">
164 + Left
165 + </Tooltip>
166 + </div>
167 + );
168 + }
169 +}
170 +
171 +export default PopoverExamples;
1 +{
2 + "name": "Popovers",
3 + "version": "0.0.0",
4 + "private": true,
5 + "main": "./Popovers.js"
6 +}
1 +import React from 'react';
2 +import {
3 + Row,
4 + Col,
5 + Breadcrumb,
6 + BreadcrumbItem,
7 + Progress,
8 +} from 'reactstrap';
9 +
10 +import Widget from '../../../../components/Widget';
11 +
12 +const ProgressExamples = () => (
13 + <div>
14 + <Breadcrumb>
15 + <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
16 + <BreadcrumbItem active>UI Progress</BreadcrumbItem>
17 + </Breadcrumb>
18 + <h1 className="page-title">Progress</h1>
19 + <Row>
20 + <Col xs={12} md={6}>
21 + <Widget
22 + title={<h5>Progress <span className="fw-semi-bold">Example</span></h5>}
23 + close collapse
24 + >
25 + <p>
26 + Badges scale to match the size of the immediate parent element by
27 + using relative font sizing and em units.
28 + </p>
29 + <Progress className="mb-sm" value="25" />
30 + <Progress className="mb-sm" value="50" />
31 + <Progress className="mb-sm" value="75" />
32 + <Progress value="100" />
33 + </Widget>
34 + </Col>
35 + <Col xs={12} md={6}>
36 + <Widget
37 + title={<h5>Backgrounds</h5>}
38 + close collaple
39 + >
40 + <p>
41 + Use background utility classes to change the appearance of
42 + individual progress bars.
43 + </p>
44 + <Progress className="mb-sm" value="25" color="info" />
45 + <Progress className="mb-sm" value="50" color="warning" />
46 + <Progress className="mb-sm" value="75" color="danger" />
47 + <Progress value="100" color="success" />
48 + </Widget>
49 + </Col>
50 + <Col xs={12} md={6}>
51 + <Widget
52 + title={<h5>Labels</h5>}
53 + close collapse
54 + >
55 + <p>
56 + Add labels to your progress bars by placing text within the <code>&lt;Progress&gt;</code>
57 + </p>
58 + <Progress className="mb-sm" value="25">25%</Progress>
59 + <Progress className="mb-sm" value="100" color="danger">Something was wrong!</Progress>
60 + <Progress value="100" color="success">Completed!</Progress>
61 + </Widget>
62 + </Col>
63 + <Col xs={12} md={6}>
64 + <Widget
65 + title={<h5>Size</h5>}
66 + close collapse
67 + >
68 + <p>
69 + We only set a height value on the <code>&lt;Progress&gt;</code>, so if you change that value the inner
70 + bar will automatically resize accordingly. Also <code>.progress-sm</code> is available.
71 + </p>
72 + <Progress className="progress-sm mb-sm" value="25" color="dark">25%</Progress>
73 + <Progress className="mb-sm" value="50" color="gray">50%</Progress>
74 + <Progress value="75" color="secondary" style={{ height: '30px' }}>75%</Progress>
75 + </Widget>
76 + </Col>
77 + <Col xs={12}>
78 + <Widget
79 + title={<h5><span className="fw-semi-bold">Striped</span> Progress</h5>}
80 + close collapse
81 + >
82 + <Row>
83 + <Col xs={12} md={6}>
84 + <p>
85 + Add <code>striped</code> property to any <code>&lt;Progress&gt;</code> to
86 + apply a stripe via CSS gradient over the progress bars background color.
87 + </p>
88 + <Progress striped className="mb-sm" value="10" />
89 + <Progress striped className="mb-sm" value="25" color="success" />
90 + <Progress striped className="mb-sm" value="50" color="info" />
91 + <Progress striped className="mb-sm" value="75" color="warning" />
92 + <Progress striped value="100" color="danger" />
93 + </Col>
94 + <Col xs={12} md={6}>
95 + <p>
96 + The striped gradient can also be animated. Add <code>animated</code> property
97 + to <code>&lt;Progress&gt;</code> to animate the stripes right to left via CSS3 animations.
98 + </p>
99 + <Progress animated striped className="mb-sm" value="10" color="danger" />
100 + <Progress animated striped className="mb-sm" value="25" color="warning" />
101 + <Progress animated striped className="mb-sm" value="50" color="info" />
102 + <Progress animated striped className="mb-sm" value="75" color="success" />
103 + <Progress animated striped value="100" />
104 + </Col>
105 + </Row>
106 + </Widget>
107 + </Col>
108 + </Row>
109 + </div>
110 +);
111 +
112 +export default ProgressExamples;
1 +{
2 + "name": "Progress",
3 + "version": "0.0.0",
4 + "private": true,
5 + "main": "./Progress.js"
6 +}
1 +{
2 + "name": "UITabsAccordion",
3 + "version": "0.0.0",
4 + "private": true,
5 + "main": "./TabsAccordion.js"
6 +}
...@@ -5,25 +5,25 @@ import { ...@@ -5,25 +5,25 @@ import {
5 Progress, 5 Progress,
6 } from 'reactstrap'; 6 } from 'reactstrap';
7 7
8 -import Widget from '../../components/Widget'; 8 +import Widget from '../../../components/Widget';
9 import LiveTile from './components/live-tile/LiveTile'; 9 import LiveTile from './components/live-tile/LiveTile';
10 import ChangesChart from './components/changes-chart/ChangesChart'; 10 import ChangesChart from './components/changes-chart/ChangesChart';
11 import RealtimeTraffic from './components/realtime-traffic/RealtimeTraffic'; 11 import RealtimeTraffic from './components/realtime-traffic/RealtimeTraffic';
12 import YearsMap from './components/years-map/YearsMap'; 12 import YearsMap from './components/years-map/YearsMap';
13 import FlotCharts from './components/flot-charts/FlotCharts'; 13 import FlotCharts from './components/flot-charts/FlotCharts';
14 import NasdaqSparkline from './components/nasdaq-sparkline-widget/nasdaqSparkline'; 14 import NasdaqSparkline from './components/nasdaq-sparkline-widget/nasdaqSparkline';
15 -import Skycon from '../../components/Skycon/Skycon'; 15 +import Skycon from '../../../components/Skycon/Skycon';
16 import { Input, InputGroup, InputGroupAddon, Button } from 'reactstrap'; 16 import { Input, InputGroup, InputGroupAddon, Button } from 'reactstrap';
17 import './Widgets.scss'; 17 import './Widgets.scss';
18 18
19 -import peopleA1 from '../../images/people/a1.jpg'; 19 +import peopleA1 from '../../../images/people/a1.jpg';
20 -import peopleA2 from '../../images/people/a2.jpg'; 20 +import peopleA2 from '../../../images/people/a2.jpg';
21 -import peopleA4 from '../../images/people/a4.jpg'; 21 +import peopleA4 from '../../../images/people/a4.jpg';
22 -import peopleA6 from '../../images/people/a6.jpg'; 22 +import peopleA6 from '../../../images/people/a6.jpg';
23 -import peopleA3 from '../../images/people/a3.jpg'; 23 +import peopleA3 from '../../../images/people/a3.jpg';
24 -import avatar from '../../images/avatar.png'; 24 +import avatar from '../../../images/avatar.png';
25 -import img18 from '../../images/pictures/18.jpg'; 25 +import img18 from '../../../images/pictures/18.jpg';
26 -import img17 from '../../images/pictures/17.jpg'; 26 +import img17 from '../../../images/pictures/17.jpg';
27 27
28 class Widgets extends React.Component { 28 class Widgets extends React.Component {
29 componentDidMount() { 29 componentDidMount() {
......
1 +@import '../../../styles/app';
2 +
3 +
4 + /* Post User */
5 +.post-user {
6 + position: relative;
7 +
8 + @include clearfix();
9 +
10 + img {
11 + border: 3px solid white;
12 + }
13 +}
14 +
15 +/* Tags */
16 +.tags {
17 + padding-left: 0;
18 + list-style: none;
19 +
20 + @include clearfix();
21 +
22 + > li {
23 + float: left;
24 +
25 + > a {
26 + padding: 2px 8px;
27 + font-size: $font-size-mini;
28 + border-radius: 6px;
29 + border: 1px solid white;
30 + color: inherit;
31 + text-decoration: none;
32 +
33 + &:hover {
34 + background-color: rgba(0, 0, 0, 0.1);
35 + }
36 +
37 + .fa {
38 + font-size: 8px;
39 + margin-right: 3px;
40 + opacity: 0.8;
41 + }
42 + }
43 + }
44 +
45 + > li + li > a {
46 + margin-left: 6px;
47 + }
48 +}
49 +
50 +.widget-top-overflow > img + .tags {
51 + position: absolute;
52 + bottom: 0;
53 + right: 0;
54 + margin: 20px;
55 +}
56 +
57 +/* Weather */
58 +.widget-image .forecast {
59 + position: absolute;
60 + left: 0;
61 + right: 0;
62 + bottom: 0;
63 + margin-bottom: 5px;
64 + padding-left: 15px;
65 + padding-right: 15px;
66 + text-align: center;
67 +}
68 +
69 +/* Chat List Group */
70 +.widget-chat-list-group {
71 + padding-top: $spacer/2;
72 +
73 + .list-group-item {
74 + margin-left: $widget-padding-horizontal;
75 + margin-right: $widget-padding-horizontal;
76 + padding: 0;
77 + border: 0;
78 + display: flex;
79 +
80 + div {
81 + width: 100%;
82 + }
83 +
84 + &:nth-child(even) {
85 + margin-left: 75px;
86 + }
87 +
88 + &:hover {
89 + background: none;
90 + }
91 +
92 + & + .list-group-item {
93 + margin-top: 20px;
94 + }
95 +
96 + .thumb,
97 + .thumb-sm {
98 + float: left;
99 + margin-right: 15px;
100 + }
101 +
102 + .time {
103 + font-size: $font-size-sm;
104 + color: $text-muted;
105 + }
106 +
107 + .sender {
108 + margin-top: 5px;
109 + margin-bottom: 5px;
110 + font-size: $font-size-mini;
111 + font-weight: $font-weight-normal;
112 + color: theme-color('primary');
113 + }
114 +
115 + .body {
116 + font-size: $font-size-mini;
117 + margin-bottom: 0;
118 + }
119 +
120 + &.on-right {
121 + div {
122 + padding-right: 1rem;
123 + }
124 +
125 + .thumb,
126 + .thumb-sm {
127 + order: 1;
128 + margin-left: auto;
129 + margin-right: 0;
130 + }
131 +
132 + .time {
133 + float: left;
134 + }
135 +
136 + .sender {
137 + text-align: right;
138 + }
139 + }
140 + }
141 +}
142 +
1 +import React from 'react';
2 +import Rickshaw from 'rickshaw';
3 +
4 +import $ from 'jquery';
5 +
6 +import {
7 + Row, Col,
8 +} from 'reactstrap';
9 +
10 +import Sparklines from '../../../../../components/Sparklines';
11 +import s from './ChangesChart.module.scss';
12 +
13 +class ChangesChart extends React.Component {
14 +
15 + constructor(prop) {
16 + super(prop);
17 + this.state = {
18 + rickshawGraph: null,
19 + sparklineData: [],
20 + sparklineOptions: {},
21 + };
22 + this.onResizeRickshaw = this.onResizeRickshaw.bind(this);
23 + this.initRickshaw = this.initRickshaw.bind(this);
24 + this.initSparkline();
25 + }
26 +
27 + componentDidMount() {
28 + this.initRickshaw();
29 + window.addEventListener('resize', this.onResizeRickshaw);
30 + }
31 +
32 + componentWillUnmount() {
33 + window.removeEventListener('resize', this.onResizeRickshaw);
34 + }
35 +
36 + onResizeRickshaw() {
37 + this.state.graph.configure({ height: 100 });
38 + this.state.graph.render();
39 + }
40 +
41 + initRickshaw() {
42 + const seriesData = [[], []];
43 + const random = new Rickshaw.Fixtures.RandomData(32);
44 + for (let i = 0; i < 32; i += 1) {
45 + random.addData(seriesData);
46 + }
47 +
48 + // eslint-disable-next-line
49 + this.state.graph = new Rickshaw.Graph({
50 + element: this.rickshawChart,
51 + height: '100',
52 + renderer: 'multi',
53 + series: [{
54 + name: 'pop',
55 + data: seriesData.shift().map(d => ({ x: d.x, y: d.y })),
56 + color: '#7bd47a', // (#64bd63, 0.9)
57 + renderer: 'bar',
58 + gapSize: 2,
59 + min: 'auto',
60 + strokeWidth: 3,
61 + }, {
62 + name: 'humidity',
63 + data: seriesData.shift()
64 + .map(d => ({ x: d.x, y: ((d.y * (Math.random() * 0.5)) + 30.1) })),
65 + renderer: 'line',
66 + color: '#fff',
67 + gapSize: 2,
68 + min: 'auto',
69 + strokeWidth: 3,
70 + }],
71 + });
72 +
73 + const hoverDetail = new Rickshaw.Graph.HoverDetail({
74 + graph: this.state.graph,
75 + xFormatter: x => new Date(x * 1000).toString(),
76 + });
77 +
78 + hoverDetail.show();
79 + this.state.graph.render();
80 + }
81 +
82 + initSparkline() {
83 + const data = [3, 6, 2, 4, 5, 8, 6, 8];
84 + const dataMax = Math.max.apply(null, data);
85 + const backgroundData = data.map(() => dataMax);
86 +
87 + // eslint-disable-next-line
88 + this.state.sparklineData = [backgroundData, data];
89 + // eslint-disable-next-line
90 + this.state.sparklineOptions = [
91 + {
92 + type: 'bar',
93 + height: 26,
94 + barColor: '#eee',
95 + barWidth: 7,
96 + barSpacing: 5,
97 + chartRangeMin: Math.min.apply(null, data),
98 + tooltipFormat: new $.SPFormatClass(''),
99 + },
100 + {
101 + composite: true,
102 + type: 'bar',
103 + barColor: '#64bd63',
104 + barWidth: 7,
105 + barSpacing: 5,
106 + },
107 + ];
108 + }
109 +
110 + render() {
111 + return (
112 + <div className={s.changesChart}>
113 + <div className={`${s.chart} bg-success btlr btrr`}>
114 + <p className={s.chartValue}><i className="fa fa-caret-up" /> 352.79</p>
115 + <p className={s.chartValueChange}>+2.04 (1.69%)</p>
116 + <div
117 + style={{ overflow: 'hidden' }}
118 + ref={(r) => {
119 + this.rickshawChart = r;
120 + }}
121 + />
122 + {/* <div rickshaw-chart [series]="series" [height]="100" [renderer]="'multi'"
123 + [configureProps]="{gapSize: 0.5, min: 'auto', strokeWidth: 3}"></div> */}
124 + </div>
125 + <h4 className={s.chartTitle}><span className="fw-normal">Salt Lake City</span>, Utah</h4>
126 + <p className="deemphasize">Today 13:34</p>
127 + <div className="mt">
128 + <Row>
129 + <Col xs={6}>
130 + <p className="h4 m-0">18.7M</p>
131 + <p className="deemphasize">Shares Traded</p>
132 + </Col>
133 + <Col xs={6} className="text-right">
134 + <p className="h4 m-0">19.9B</p>
135 + <p className="deemphasize">Market Cap</p>
136 + </Col>
137 + </Row>
138 + </div>
139 + <div className="mt">
140 + <Row>
141 + <Col xs={6}>
142 + <p className="h3 m-0 text-success fw-semi-bold">+120.93</p>
143 + <p className="deemphasize">Yearly Change</p>
144 + </Col>
145 + <Col xs={6} className="text-right">
146 + <div
147 + className="sparkline" ref={(r) => {
148 + this.sparklineRef = r;
149 + }}
150 + />
151 + <Sparklines data={this.state.sparklineData} options={this.state.sparklineOptions} />
152 + <p className="deemphasize">GOOG</p>
153 + </Col>
154 + </Row>
155 + </div>
156 + </div>
157 + );
158 + }
159 +}
160 +
161 +export default ChangesChart;
1 +@import '../../../../../styles/app';
2 +
3 +.changesChart {
4 + .chart {
5 + margin: -$widget-padding-vertical (-$widget-padding-horizontal) 0;
6 + padding: $widget-padding-vertical 0 0;
7 + }
8 +
9 + .chartTitle {
10 + margin: 20px 0 0;
11 + }
12 +
13 + .chartValue,
14 + .chartValueChange {
15 + padding: 0 $widget-padding-horizontal;
16 + }
17 +
18 + .chartValue {
19 + margin-bottom: 0;
20 + font-weight: $font-weight-bold;
21 + font-size: 21px;
22 + line-height: 1;
23 + color: $white;
24 + }
25 +
26 + .chartValueChange {
27 + color: rgba($white, 0.7);
28 + font-size: $small-font-size;
29 + margin-bottom: $spacer;
30 + }
31 +}
1 +import React from 'react';
2 +import {
3 + Row,
4 + Col,
5 + Button,
6 + Badge,
7 +} from 'reactstrap';
8 +import ReactFlot from 'react-flot';
9 +
10 +import Widget from '../../../../../components/Widget';
11 +import s from './FlotCharts.module.scss';
12 +
13 +class FlotCharts extends React.Component {
14 + static generateRandomData(labels) {
15 + function random() {
16 + return (Math.floor(Math.random() * 30)) + 10;
17 + }
18 +
19 + const data = [];
20 + let maxValueIndex = 5;
21 +
22 + for (let i = 0; i < labels.length; i += 1) {
23 + const randomSeries = [];
24 + for (let j = 0; j < 25; j += 1) {
25 + randomSeries.push([j, Math.floor(maxValueIndex * j) + random()]);
26 + }
27 + maxValueIndex -= 1;
28 + data.push({
29 + data: randomSeries,
30 + showLabels: true,
31 + label: labels[i].label,
32 + labelPlacement: 'below',
33 + canvasRender: true,
34 + cColor: 'red',
35 + color: labels[i].color,
36 + });
37 + }
38 + return data;
39 + }
40 +
41 + render() {
42 + const flotOptions = {
43 + series: {
44 + lines: {
45 + show: true,
46 + lineWidth: 1,
47 + fill: false,
48 + fillColor: { colors: [{ opacity: 0.001 }, { opacity: 0.5 }] },
49 + },
50 + points: {
51 + show: false,
52 + fill: true,
53 + },
54 + shadowSize: 0,
55 + },
56 + legend: false,
57 + grid: {
58 + show: false,
59 + margin: 0,
60 + labelMargin: 0,
61 + axisMargin: 0,
62 + hoverable: true,
63 + clickable: true,
64 + tickColor: 'rgba(255,255,255,1)',
65 + borderWidth: 0,
66 + },
67 + };
68 +
69 + const generateData = this.constructor.generateRandomData;
70 +
71 + return (<Row>
72 + <Col lg={6} xs={12}>
73 + <Widget
74 + title={<Row>
75 + <Col xs={4}>
76 + <h6>
77 + Total Sales
78 + </h6>
79 + <p className="value5">
80 + January, 2018
81 + </p>
82 + </Col>
83 + <Col xs={4}>
84 + <h5>
85 + <small>Best</small>
86 + </h5>
87 + <p className="value6 fs-sm">
88 + March, 2018 + 1
89 + </p>
90 + </Col>
91 + </Row>}
92 + settings close
93 + >
94 + <div className="chart-stats">
95 + <p className="text-muted fs-mini mt-xs">
96 + <i className="fi flaticon-placeholder fa-5x pull-left mr-3" />
97 + <span className="fw-semi-bold text-gray-dark">Jess:</span> Seems like statically it&apos;s getting impossible
98 + to achieve any sort of
99 + results in nearest future. The only thing we can hope for is pressing one of these two buttons:
100 + </p>
101 + <div className="btn-toolbar">
102 + <Button color="success" size="xs">Accept</Button>
103 + <Button color="default" size="xs">Reject</Button>
104 + </div>
105 + </div>
106 + <div className={`${s.chart} bg-body-light`}>
107 + <ReactFlot
108 + id="product-chart-1"
109 + data={
110 + generateData([{
111 + label: 'Visitors', color: '#777',
112 + }, {
113 + label: 'Charts', color: '#dd5826',
114 + }])}
115 + options={flotOptions}
116 + height={'100%'}
117 + />
118 + </div>
119 + </Widget>
120 + </Col>
121 + <Col lg={6} xs={12}>
122 + <Widget
123 + className=" widget-chart-stats-simple" title={<Row>
124 + <Col xs={12}>
125 + <h6 className="mb-0">
126 + <span className="fw-semi-bold">Budget</span>&nbsp;<Badge pill color="danger">2019</Badge>
127 + </h6>
128 + <span className="text-muted fs-mini">monthly report will be available in <button className="btn-link">6 hours</button></span>
129 + </Col>
130 + </Row>}
131 + settings close
132 + >
133 + <div className="chart-stats">
134 + <div className="row">
135 + <div className="col-md-5">
136 + <div className="clearfix m-t-1">
137 + <h6 className="pull-left text-muted mb-xs">
138 + Income
139 + </h6>
140 + <p className="pull-right h6 mb-xs">
141 + <span className="fw-semi-bold">$14,595</span>
142 + </p>
143 + </div>
144 + <div className="clearfix">
145 + <h6 className="pull-left no-margin text-muted">
146 + Recent
147 + </h6>
148 + <p className="pull-right">
149 + <span className="fw-semi-bold">$7,647</span>
150 + </p>
151 + </div>
152 + </div>
153 + <div className="col-md-3 text-right m-t-1">
154 + <h6 className="text-muted mb-xs">Inqueries</h6>
155 + <p className="fw-semi-bold">73 at 14am</p>
156 + </div>
157 + <div className="col-md-4 text-right m-t-1">
158 + <h6 className="text-muted mb-xs">Last Updated</h6>
159 + <p className="fw-semi-bold">23.06.2013</p>
160 + </div>
161 + </div>
162 + </div>
163 + <div className={`${s.chart} bg-body-light`}>
164 + <ReactFlot
165 + id="product-chart-2"
166 + data={
167 + generateData([{
168 + label: 'Controllers', color: '#777',
169 + }, {
170 + label: 'Scopes', color: '#f0b518',
171 + }])}
172 + options={flotOptions}
173 + height={'100%'}
174 + />
175 + </div>
176 + </Widget>
177 + </Col>
178 + </Row>
179 + );
180 + }
181 +}
182 +
183 +export default FlotCharts;
1 -@import '../../../../styles/app'; 1 +@import '../../../../../styles/app';
2 2
3 .chart { 3 .chart {
4 height: 200px; 4 height: 200px;
......
1 +import React from 'react';
2 +import $ from 'jquery'
3 +import PropTypes from 'prop-types';
4 +/* eslint-disable */
5 +import 'metrojs/release/MetroJs.Full/MetroJs';
6 +/* eslint-enable */
7 +
8 +import './LiveTile.scss';
9 +
10 +class LiveTile extends React.Component {
11 + static propTypes = {
12 + children: PropTypes.oneOfType([
13 + PropTypes.arrayOf(PropTypes.node),
14 + PropTypes.node,
15 + ]),
16 + };
17 +
18 + static defaultProps = {
19 + children: null,
20 + };
21 +
22 + constructor(props) {
23 + super(props);
24 + this.state = {
25 + id: `live-tile-${Math.floor(Math.random() * 255)}`,
26 + };
27 + }
28 +
29 + componentDidMount() {
30 + const el = $(`#${this.state.id}`);
31 + el.css('height', el.data('height'))
32 + .liveTile();
33 + }
34 +
35 + render() {
36 + const {
37 + children,
38 + ...attr
39 + } = this.props;
40 + return (
41 + <div {...attr} id={this.state.id} className="live-tile">
42 + {children}
43 + </div>
44 + );
45 + }
46 +}
47 +
48 +export default LiveTile;
1 +@import '../../../../../styles/app';
2 +
3 +/* Live Tiles */
4 +.live-tile,
5 +.list-tile,
6 +.copy-tile,
7 +.tile-strip .flip-list > li {
8 + height: auto;
9 + min-width: 100%;
10 + margin: 0 !important;
11 + color: inherit !important;
12 +
13 + &.fade {
14 + opacity: 1;
15 + }
16 +}
17 +
18 +.live-tile p,
19 +.list-tile p,
20 +.copy-tile p {
21 + padding: 0 !important;
22 +}
23 +
24 +.live-tile p,
25 +.list-tile p,
26 +.copy-tile p,
27 +.live-tile .face,
28 +.list-tile .face,
29 +.copy-tile .face {
30 + &.h1 {
31 + font-size: $h1-font-size;
32 + }
33 +
34 + &.h2 {
35 + font-size: $h2-font-size;
36 + }
37 +
38 + &.h3 {
39 + font-size: $h3-font-size;
40 + }
41 +
42 + &.h4 {
43 + font-size: $h4-font-size;
44 + }
45 +
46 + &.h5 {
47 + font-size: $h5-font-size;
48 + }
49 +
50 + &.h6 {
51 + font-size: $h6-font-size;
52 + }
53 +
54 + $font-sizes: $h1-font-size, $h2-font-size, $h3-font-size, $h4-font-size, $h5-font-size, $h6-font-size;
55 + $i: 1;
56 +
57 + @each $font-size in $font-sizes {
58 + &.value#{$i} {
59 + font-size: $font-size;
60 + }
61 + $i: $i + 1;
62 + }
63 +}
1 +import React from 'react';
2 +
3 +import $ from 'jquery';
4 +import Sparklines from '../../../../../components/Sparklines';
5 +
6 +class NasdaqSparkline extends React.Component {
7 +
8 + render() {
9 + const data = [[4, 6, 5, 7, 5]];
10 + const options = {
11 + type: 'line',
12 + width: '99%',
13 + height: '60',
14 + lineColor: '#666',
15 + fillColor: 'transparent',
16 + spotRadius: 5,
17 + spotColor: '#666',
18 + valueSpots: { '0:': '#666' },
19 + highlightSpotColor: '#fff',
20 + highlightLineColor: '#666',
21 + minSpotColor: '#666',
22 + maxSpotColor: '#dd5826',
23 + tooltipFormat: new $
24 + .SPFormatClass('<span style="color: white">&#9679;</span> {{prefix}}{{y}}{{suffix}}'),
25 + chartRangeMin: Math.min.apply(null, data) - 1,
26 + };
27 +
28 +
29 + return (
30 + <Sparklines data={data} options={options} />
31 + );
32 + }
33 +}
34 +
35 +export default NasdaqSparkline;
1 import React from 'react'; 1 import React from 'react';
2 +import {
3 + Progress,
4 +} from 'reactstrap';
2 import Rickshaw from 'rickshaw'; 5 import Rickshaw from 'rickshaw';
3 -import PropTypes from 'prop-types';
4 6
5 7
6 -class RickshawGraph extends React.Component { 8 +class RealtimeTraffic extends React.Component {
7 - 9 + state = { graph: null }
8 - static propTypes = { 10 + constructor(prop) {
9 - height: PropTypes.number, 11 + super(prop);
10 - };
11 -
12 - static defaultProps = {
13 - height: 100,
14 - };
15 -
16 - constructor(props) {
17 - super(props);
18 - this.state = {
19 - graph: null,
20 - };
21 - this.initRickshaw = this.initRickshaw.bind(this);
22 this.onResizeRickshaw = this.onResizeRickshaw.bind(this); 12 this.onResizeRickshaw = this.onResizeRickshaw.bind(this);
23 } 13 }
24 14
25 componentDidMount() { 15 componentDidMount() {
26 - this.initRickshaw(); 16 + this.initChart();
27 window.addEventListener('resize', this.onResizeRickshaw); 17 window.addEventListener('resize', this.onResizeRickshaw);
28 } 18 }
29 19
...@@ -32,28 +22,28 @@ class RickshawGraph extends React.Component { ...@@ -32,28 +22,28 @@ class RickshawGraph extends React.Component {
32 } 22 }
33 23
34 onResizeRickshaw() { 24 onResizeRickshaw() {
35 - this.state.graph.configure({ height: this.props.height }); 25 + this.graph.configure({ height: 130 });
36 - this.state.graph.render(); 26 + this.graph.render();
37 } 27 }
38 28
39 - initRickshaw() { 29 + initChart() {
40 const seriesData = [[], []]; 30 const seriesData = [[], []];
41 const random = new Rickshaw.Fixtures.RandomData(30); 31 const random = new Rickshaw.Fixtures.RandomData(30);
32 +
42 for (let i = 0; i < 30; i += 1) { 33 for (let i = 0; i < 30; i += 1) {
43 random.addData(seriesData); 34 random.addData(seriesData);
44 } 35 }
45 - 36 + this.graph = new Rickshaw.Graph({
46 - // eslint-disable-next-line
47 - this.state.graph = new Rickshaw.Graph({
48 element: this.rickshawChart, 37 element: this.rickshawChart,
49 - height: this.props.height, 38 + height: 130,
39 + realtime: true,
50 series: [ 40 series: [
51 { 41 {
52 - color: '#ffdddd', 42 + color: '#343434', // 'gray-dark'
53 data: seriesData[0], 43 data: seriesData[0],
54 name: 'Uploads', 44 name: 'Uploads',
55 }, { 45 }, {
56 - color: '#f55d5d', 46 + color: '#666', // gray,
57 data: seriesData[1], 47 data: seriesData[1],
58 name: 'Downloads', 48 name: 'Downloads',
59 }, 49 },
...@@ -61,7 +51,7 @@ class RickshawGraph extends React.Component { ...@@ -61,7 +51,7 @@ class RickshawGraph extends React.Component {
61 }); 51 });
62 52
63 const hoverDetail = new Rickshaw.Graph.HoverDetail({ 53 const hoverDetail = new Rickshaw.Graph.HoverDetail({
64 - graph: this.state.graph, 54 + graph: this.graph,
65 xFormatter: x => new Date(x * 1000).toString(), 55 xFormatter: x => new Date(x * 1000).toString(),
66 }); 56 });
67 57
...@@ -70,21 +60,42 @@ class RickshawGraph extends React.Component { ...@@ -70,21 +60,42 @@ class RickshawGraph extends React.Component {
70 setInterval(() => { 60 setInterval(() => {
71 random.removeData(seriesData); 61 random.removeData(seriesData);
72 random.addData(seriesData); 62 random.addData(seriesData);
73 - this.state.graph.update(); 63 + this.graph.update();
74 }, 1000); 64 }, 1000);
75 65
76 - this.state.graph.render(); 66 + this.graph.render();
77 } 67 }
78 68
79 render() { 69 render() {
80 return ( 70 return (
81 - <div 71 + <div>
82 - ref={(r) => { 72 + <h4 className="mb-lg">Recent <span className="fw-semi-bold">Update</span></h4>
83 - this.rickshawChart = r; 73 + <h6>Node.js <span className="fw-semi-bold">4.0.1 distribution</span></h6>
84 - }} 74 + <Progress className="bg-gray-lighter progress-xs" color="danger" value="77" />
85 - /> 75 + <p className="mt-sm mb fs-mini ">
76 + <small><span className="circle bg-warning text-gray-dark"><i
77 + className="glyphicon glyphicon-chevron-up"
78 + /></span></small>
79 + <strong className="px-1">17% higher</strong>
80 + than last month
81 + </p>
82 + <p className="fs-sm text-gray-lighter mb-0">Remaining hours</p>
83 + <button className="btn btn-xs btn-gray pull-right ml-xs">
84 + <i className="fa fa-compress" /> track
85 + </button>
86 + <button className="btn btn-xs btn-gray pull-right">
87 + <i className="fa fa-pause" /> pause
88 + </button>
89 + <p className="value4">2h 56m</p>
90 + <br />
91 + <div
92 + ref={(r) => {
93 + this.rickshawChart = r;
94 + }} className="text-gray-dark chart-overflow-bottom" style={{ height: '130px' }}
95 + />
96 + </div>
86 ); 97 );
87 } 98 }
88 } 99 }
89 100
90 -export default RickshawGraph; 101 +export default RealtimeTraffic;
......
1 +import React from 'react';
2 +import { Nav, NavItem, NavLink } from 'reactstrap';
3 +/* eslint-disable */
4 +import $ from 'jquery';
5 +import 'imports-loader?$=jquery,this=>window!jquery-mapael/js/maps/world_countries';
6 +import 'imports-loader?$=jquery,this=>window!jquery-mapael/js/jquery.mapael';
7 +/* eslint-enable */
8 +import './YearsMap.scss';
9 +import fakeWorldData from './MapData';
10 +
11 +class YearsMap extends React.Component {
12 + constructor(prop) {
13 + super(prop);
14 + this.state = {
15 + activeYear: 2019,
16 + };
17 + this.triggerYear = this.triggerYear.bind(this);
18 + }
19 +
20 + componentDidMount() {
21 + this.init();
22 + }
23 +
24 + init() {
25 + const $map = $('#mapael');
26 + const data = {
27 + map: {
28 + name: 'world_countries',
29 + defaultArea: {
30 + attrs: {
31 + fill: '#eee', // gray-lighter
32 + stroke: '#666', // 'gray'
33 + 'stroke-width': 0.1,
34 + },
35 + attrsHover: {
36 + fill: '#999', // gray-light,
37 + animDuration: 100,
38 + },
39 + },
40 + defaultPlot: {
41 + size: 17,
42 + attrs: {
43 + fill: '#f0b518', // brand-warning,
44 + stroke: '#fff',
45 + 'stroke-width': 0,
46 + 'stroke-linejoin': 'round',
47 + },
48 + attrsHover: {
49 + 'stroke-width': 1,
50 + animDuration: 100,
51 + },
52 + },
53 + zoom: {
54 + enabled: true,
55 + step: 1,
56 + maxLevel: 10,
57 + mousewheel: false,
58 + },
59 + },
60 + legend: {
61 + area: {
62 + display: false,
63 + slices: [
64 + {
65 + max: 5000000,
66 + attrs: {
67 + fill: 'rgb(245, 249, 251)', // lightenColor('#ebeff1', .04)
68 + },
69 + label: 'Less than 5M',
70 + },
71 + {
72 + min: 5000000,
73 + max: 10000000,
74 + attrs: {
75 + fill: '#ebeff1',
76 + },
77 + label: 'Between 5M and 10M',
78 + },
79 + {
80 + min: 10000000,
81 + max: 50000000,
82 + attrs: {
83 + fill: '#eee', // gray-lighter
84 + },
85 + label: 'Between 10M and 50M',
86 + },
87 + {
88 + min: 50000000,
89 + attrs: {
90 + fill: 'rgb(209, 213, 215)', // darkenColor('#ebeff1', .1)
91 + },
92 + label: 'More than 50M',
93 + },
94 + ],
95 + },
96 + },
97 + areas: fakeWorldData[this.state.activeYear].areas,
98 + };
99 + const height = 394;
100 + $map.css('height', height);
101 + if ($map.parents('.widget')[0]) {
102 + $map.find('.map').css('height', parseInt($map.parents('.widget').css('height'), 10) - 35);
103 + }
104 + $map.mapael(data);
105 + $map.trigger('zoom', { level: 6, latitude: 59.599254, longitude: 8.863224 });
106 + }
107 +
108 + triggerYear(year) {
109 + this.setState({
110 + activeYear: year,
111 + });
112 + const $map = $('#mapael');
113 + $map.trigger('update', [{
114 + mapOptions: fakeWorldData[year],
115 + animDuration: 300,
116 + }]);
117 + }
118 +
119 + render() {
120 + return (<div>
121 + <div className="mapael" id="mapael">
122 + <div className="stats">
123 + <h6 className="text-gray-dark">YEARLY <span className="fw-semi-bold">DISTRIBUTIONS</span></h6>
124 + <span className="pull-left mr-xs">
125 + <small><span className="circle bg-warning text-gray-dark">
126 + <i className="fa fa-plus" /></span></small>
127 + </span>
128 + <p className="h4 m-0">
129 + <strong>17% last year</strong>
130 + </p>
131 + </div>
132 + <div className="map">
133 + <span>Alternative content for the map</span>
134 + </div>
135 + <div className="areaLegend">
136 + <span>Alternative content for the legend</span>
137 + </div>
138 + </div>
139 + <Nav className="map-controls" pills fill>
140 + <NavItem>
141 + <NavLink active={this.state.activeYear === 2014} onClick={() => this.triggerYear(2014)}>2014</NavLink>
142 + </NavItem>
143 + <NavItem>
144 + <NavLink active={this.state.activeYear === 2015} onClick={() => this.triggerYear(2015)}>2015</NavLink>
145 + </NavItem>
146 + <NavItem>
147 + <NavLink active={this.state.activeYear === 2016} onClick={() => this.triggerYear(2016)}>2016</NavLink>
148 + </NavItem>
149 + <NavItem>
150 + <NavLink active={this.state.activeYear === 2017} onClick={() => this.triggerYear(2017)}>2017</NavLink>
151 + </NavItem>
152 + <NavItem>
153 + <NavLink active={this.state.activeYear === 2018} onClick={() => this.triggerYear(2018)}>2018</NavLink>
154 + </NavItem>
155 + <NavItem>
156 + <NavLink active={this.state.activeYear === 2019} onClick={() => this.triggerYear(2019)}>2019</NavLink>
157 + </NavItem>
158 + </Nav>
159 + </div>);
160 + }
161 +}
162 +
163 +export default YearsMap;
1 -@import '../../../../styles/app'; 1 +@import '../../../../../styles/app';
2 +
3 +/* Mapael */
4 +.mapTooltip {
5 + position: fixed;
6 + padding: 2px;
7 + z-index: 1000;
8 + max-width: 200px;
9 + display: none;
10 + background-color: #fff;
11 + border: 1px solid #ccc;
12 + border-radius: $border-radius;
13 + font-size: $font-size-sm;
14 + color: $text-color;
15 +}
16 +
17 +.zoomIn,
18 +.zoomOut {
19 + position: absolute;
20 + bottom: 10px;
21 + left: 10px;
22 + width: 20px;
23 + height: 20px;
24 + box-sizing: content-box;
25 + border: 1px solid #ccc;
26 + background-color: #fff;
27 + color: $text-color;
28 + line-height: 20px;
29 + text-align: center;
30 + border-radius: $border-radius;
31 + cursor: pointer;
32 + font-weight: $font-weight-bold;
33 + user-select: none;
34 +}
35 +
36 +.zoomOut {
37 + left: 36px;
38 +}
2 39
3 .mapael { 40 .mapael {
4 position: relative; 41 position: relative;
5 margin: (-$widget-padding-vertical) (-$widget-padding-horizontal) 0; 42 margin: (-$widget-padding-vertical) (-$widget-padding-horizontal) 0;
6 43
7 - /* Mapael */ 44 + .map {
8 - :global { 45 + position: relative;
9 - .mapTooltip { 46 + height: calc(100% - 20px);
10 - position: absolute; 47 + }
11 - padding: 2px; 48 +
12 - background-color: #fff; 49 + .stats {
13 - border: 1px solid #ccc; 50 + position: absolute;
14 - border-radius: $border-radius; 51 + z-index: 1;
15 - font-size: $font-size-sm; 52 + top: 0;
53 + left: 0;
54 + margin: 5% 10%;
55 + }
56 +}
57 +
58 +/* Part:Map Controls */
59 +.map-controls {
60 + position: absolute;
61 + bottom: 0;
62 + left: 0;
63 + right: 0;
64 + border-top: 1px solid #bbb;
65 + background-color: $addition-bg;
66 + border-bottom-left-radius: $border-radius;
67 + border-bottom-right-radius: $border-radius;
68 +
69 + > .nav-item > .nav-link {
70 + border-radius: 0;
71 + padding: 0.7143rem 0;
72 + color: $text-color;
73 +
74 + &:hover {
75 + background-color: $gray-200;
16 color: $text-color; 76 color: $text-color;
17 } 77 }
78 + }
18 79
19 - .zoomIn, 80 + > .nav-item > .nav-link.active {
20 - .zoomOut { 81 + &,
21 - position: absolute; 82 + &:hover {
22 - bottom: 10px; 83 + background-color: $white;
23 - left: 10px;
24 - width: 20px;
25 - height: 20px;
26 - box-sizing: content-box;
27 - border: 1px solid #ccc;
28 - background-color: #fff;
29 color: $text-color; 84 color: $text-color;
30 - line-height: 20px;
31 - text-align: center;
32 - border-radius: $border-radius;
33 - cursor: pointer;
34 font-weight: $font-weight-bold; 85 font-weight: $font-weight-bold;
35 - user-select: none;
36 - }
37 -
38 - .zoomOut {
39 - left: 36px;
40 } 86 }
87 + }
41 88
42 - .map { 89 + > .nav-item:first-child > a {
43 - position: relative; 90 + border-bottom-left-radius: $border-radius;
44 - } 91 + }
45 92
46 - .stats { 93 + > .nav-item:last-child > a {
47 - position: absolute; 94 + border-bottom-right-radius: $border-radius;
48 - z-index: 1;
49 - top: 0;
50 - left: 0;
51 - margin: 5% 10%;
52 - }
53 } 95 }
54 } 96 }
97 +
98 +.map svg {
99 + height: 100%;
100 + width: 100%;
101 +}
102 +
......
1 +{
2 + "name": "widgets",
3 + "version": "0.0.0",
4 + "main": "./Widgets.js",
5 + "private": true
6 +}
1 -{
2 - "name": "calendar",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Calendar.js"
6 -}
1 -{
2 - "name": "invoice",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Gallery.js"
6 -}
1 -{
2 - "name": "invoice",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Invoice.js"
6 -}
1 -{
2 - "name": "search",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Search.js"
6 -}
1 -{
2 - "name": "timeline",
3 - "version": "0.0.0",
4 - "main": "./Timeline.js",
5 - "private": true
6 -}
1 -{
2 - "name": "FormsElements",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Elements.js"
6 -}
1 -{
2 - "name": "FormValidation",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Validation.js"
6 -}
1 -{
2 - "name": "FormWizard",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Wizard.js"
6 -}
1 -{
2 - "name": "grid",
3 - "version": "0.0.0",
4 - "main": "./Grid.js",
5 - "private": true
6 -}
1 -import React from 'react';
2 -import PropTypes from 'prop-types';
3 -import { withRouter, Redirect, Link } from 'react-router-dom';
4 -import { connect } from 'react-redux';
5 -import { Container, Alert, Button } from 'reactstrap';
6 -import Widget from '../../components/Widget';
7 -import { loginUser, receiveToken } from '../../actions/user';
8 -import jwt from "jsonwebtoken";
9 -import microsoft from '../../images/microsoft.png';
10 -
11 -class Login extends React.Component {
12 - static propTypes = {
13 - dispatch: PropTypes.func.isRequired,
14 - };
15 -
16 - static isAuthenticated(token) {
17 - if (!token) return;
18 - const date = new Date().getTime() / 1000;
19 - const data = jwt.decode(token);
20 - return date < data.exp;
21 - }
22 -
23 - constructor(props) {
24 - super(props);
25 -
26 - this.state = {
27 - email: 'admin@flatlogic.com',
28 - password: 'password',
29 - };
30 -
31 - this.doLogin = this.doLogin.bind(this);
32 - this.googleLogin = this.googleLogin.bind(this);
33 - this.microsoftLogin = this.microsoftLogin.bind(this);
34 - this.changeEmail = this.changeEmail.bind(this);
35 - this.changePassword = this.changePassword.bind(this);
36 - this.signUp = this.signUp.bind(this);
37 - }
38 -
39 - changeEmail(event) {
40 - this.setState({ email: event.target.value });
41 - }
42 -
43 - changePassword(event) {
44 - this.setState({ password: event.target.value });
45 - }
46 -
47 - doLogin(e) {
48 - e.preventDefault();
49 - this.props.dispatch(loginUser({ email: this.state.email, password: this.state.password }));
50 - }
51 -
52 - googleLogin() {
53 - this.props.dispatch(loginUser({social: "google"}));
54 - }
55 -
56 - microsoftLogin() {
57 - this.props.dispatch(loginUser({social: "microsoft"}));
58 - }
59 -
60 - componentDidMount() {
61 - const params = new URLSearchParams(this.props.location.search);
62 - const token = params.get('token');
63 - if (token) {
64 - this.props.dispatch(receiveToken(token));
65 - }
66 - }
67 -
68 - signUp() {
69 - this.props.history.push('/register');
70 - }
71 -
72 - render() {
73 - const { from } = this.props.location.state || { from: { pathname: '/app' } }; // eslint-disable-line
74 -
75 - // cant access login page while logged in
76 - if (Login.isAuthenticated(localStorage.getItem('token'))) {
77 - return (
78 - <Redirect to={from} />
79 - );
80 - }
81 -
82 - return (
83 - <div className="auth-page">
84 - <Container>
85 - <h5 className="auth-logo">
86 - <i className="fa fa-circle text-gray" />
87 - Sing App
88 - <i className="fa fa-circle text-warning" />
89 - </h5>
90 - <Widget className="widget-auth mx-auto" title={<h3 className="mt-0">Login to your Web App</h3>}>
91 - <p className="widget-auth-info">
92 - Use your email to sign in.
93 - </p>
94 - <Alert className="alert-sm text-center mt-2" color="secondary">
95 - This is a real app with Node.js backend - use
96 - <br/>
97 - <span className="font-weight-bold">"admin@flatlogic.com / password"</span>
98 - <br/>
99 - to login!
100 - </Alert>
101 - <form className="mt" onSubmit={this.doLogin}>
102 - {
103 - this.props.errorMessage && (
104 - <Alert className="alert-sm" color="danger">
105 - {this.props.errorMessage}
106 - </Alert>
107 - )
108 - }
109 - <div className="form-group">
110 - <input className="form-control no-border" value={this.state.email} onChange={this.changeEmail} type="email" required name="email" placeholder="Email" />
111 - </div>
112 - <div className="form-group">
113 - <input className="form-control no-border" value={this.state.password} onChange={this.changePassword} type="password" required name="password" placeholder="Password" />
114 - </div>
115 - <Button type="submit" color="inverse" className="auth-btn mb-3" size="sm">{this.props.isFetching ? 'Loading...' : 'Login'}</Button>
116 - <p className="widget-auth-info">or sign in with</p>
117 - <div className="social-buttons">
118 - <Button onClick={this.googleLogin} color="primary" className="social-button mb-2">
119 - <i className="social-icon social-google"/>
120 - <p className="social-text">GOOGLE</p>
121 - </Button>
122 - <Button onClick={this.microsoftLogin} color="success" className="social-button">
123 - <i className="social-icon social-microsoft"
124 - style={{backgroundImage: `url(${microsoft})`}}/>
125 - <p className="social-text">MICROSOFT</p>
126 - </Button>
127 - </div>
128 - </form>
129 - <p className="widget-auth-info">
130 - Don't have an account? Sign up now!
131 - </p>
132 - <Link className="d-block text-center" to="register">Create an Account</Link>
133 - </Widget>
134 - </Container>
135 - <footer className="auth-footer">
136 - 2019 &copy; Sing App - React Admin Dashboard Template.
137 - </footer>
138 - </div>
139 - );
140 - }
141 -}
142 -
143 -function mapStateToProps(state) {
144 - return {
145 - isFetching: state.auth.isFetching,
146 - isAuthenticated: state.auth.isAuthenticated,
147 - errorMessage: state.auth.errorMessage,
148 - };
149 -}
150 -
151 -export default withRouter(connect(mapStateToProps)(Login));
152 -
1 -{
2 - "name": "login",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Login.js"
6 -
7 -}
1 -{
2 - "name": "ProductEdit",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./ProductEdit.js"
6 -}
...\ No newline at end of file ...\ No newline at end of file
1 -{
2 - "name": "Management",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Management.js"
6 -}
...\ No newline at end of file ...\ No newline at end of file
1 -{
2 - "name": "GoogleMap",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Google.js"
6 -}
1 -{
2 - "name": "Vector",
3 - "version": "0.0.0",
4 - "main": "./Vector.js",
5 - "private": true
6 -}
1 -import React from 'react';
2 -import {
3 - Row,
4 - Col,
5 -} from 'reactstrap';
6 -
7 -import Widget from '../../components/Widget';
8 -import s from './SPackage.module.scss';
9 -import reactLogo from '../../images/react-logo.svg';
10 -import angularLogo from '../../images/angularjs-logo.svg';
11 -import angularJSLogo from '../../images/angular-logo.svg';
12 -import vueLogo from '../../images/vue-logo.svg';
13 -import jsLogo from '../../images/js-logo.svg';
14 -
15 -class SPackage extends React.Component {
16 -
17 - render() {
18 - return (
19 - <div>
20 - <h2 className="page-title">Sing - <span className="fw-semi-bold">Package</span>&nbsp;
21 - <small>More than 2000 man-hours already invested!</small>
22 - </h2>
23 - <p className="lead">Over 8,000 developers worldwide chose our bootstrap admin templates to build their web applications, SAAS and E-Commerce platforms faster. Jump in to burn through your gig too!</p>
24 - <Row>
25 - <Col lg={5} md={6}>
26 - <Widget
27 - title={
28 - <h6>React JS Version</h6>
29 - } settings collapse close
30 - >
31 - <img className={['rounded pull-left mb-1 mr-3', s.image].join(' ')} src={reactLogo} width="80" alt="" />
32 - <h3>React JS Version</h3>
33 - <p className="text-muted">We spent another <span className="fw-semi-bold">500</span> man-hours
34 - developing and designing
35 - React version, to save you time and money.</p>
36 - <p><a href="https://reactjs.org/" rel="nofollow noopener noreferrer" target="_blank">React</a> is
37 - the most trendy and advanced
38 - component-based JavaScript library for building user interfaces. Our React
39 - version follows latest industry
40 - best practices and uses <strong>Redux</strong> as a state manager and
41 - supports <strong>Server Side Rendering</strong> which makes this app incredibly fast
42 - and SEO-friendly.
43 - </p>
44 - <p>This version is a great choice when you want to be in control
45 - of your own codebase and
46 - decide on development approaches that are the best for your project.
47 - <a href="https://webpack.js.org/">Webpack</a> Module Bundler and Yarn as a package
48 - manager are under the hood.</p>
49 - <button className="btn btn-transparent btn-lg btn-block disabled">(You are here)</button>
50 - </Widget>
51 - </Col>
52 - <Col lg={5} md={6} xs={12}>
53 - <Widget
54 - title={
55 - <h6>Angular Version</h6>
56 - } settings collapse close
57 - >
58 - <img className={['rounded pull-left mb-1 mr-3', s.image].join(' ')} src={angularLogo} width="80" alt="" />
59 - <h3>Angular 2+ Version</h3>
60 - <p className="text-muted">We spent around <span className="fw-semi-bold">500</span> man-hours
61 - developing and designing
62 - Angular version, to match high engineering requirements.</p>
63 - <p><a href="https://angular.io" rel="nofollow noopener noreferrer" target="_blank">Angular</a> is the
64 - most mature and wide spread
65 - front-end framework created by Google and used by many established enterprises.
66 - It is a very good choice when
67 - your expect your application to have a well-engineered structure
68 - and development workflow. If you are familiar
69 - with Java or .NET ecosystems Angular is definitely your choice.
70 - </p>
71 - <p>Our app is built on top of latest <strong>Angular 5.0</strong> version and
72 - uses <a href="https://webpack.js.org/">Webpack</a> Module Bundler and NPM as a package manager,
73 - so everything
74 - works out of the box! <br /><br /></p>
75 - <a
76 - className="btn btn-default btn-lg btn-block"
77 - href="https://demo.flatlogic.com/sing-app/angular/"
78 - >
79 - Go to Demo
80 - </a>
81 - </Widget>
82 - </Col>
83 - <Col lg={5} md={6}>
84 - <Widget
85 - title={
86 - <h6>AngularJS 1.X Version</h6>
87 - } settings collapse close
88 - >
89 - <img className={['rounded pull-left mb-1 mr-3', s.image].join(' ')} src={angularJSLogo} width="80" alt="" />
90 - <h3>AngularJS Version</h3>
91 - <p className="text-muted">We dont know about you but were very excited that its finally here!
92 - Our brand new Light Blue Angular version.</p>
93 - <p><strong>Angular 1.0</strong> have so many opportunities in comparison to HTML. It lets you
94 - extend HTML vocabulary.
95 - And as a result your application can be very expressive and readable.
96 - <strong>Directives</strong> can hide complex DOM structure, CSS. They can let you invent new
97 - HTML syntax, specific to your application.
98 - We strongly believe that theres nothing better than arranging an outstanding end-user experience.</p>
99 - <p><a href="https://reactjs.org/" rel="nofollow noopener noreferrer" target="_blank">Angular</a>
100 - should be definitely
101 - among your top considerations when choosing the right framework.</p>
102 - <p>Angular version makes it possible by letting responsive, fast-loading and
103 - seamlessly-navigating application.</p>
104 - <a
105 - className="btn btn-default btn-lg btn-block"
106 - href="https://demo.flatlogic.com/sing-app/angularjs/"
107 - >
108 - Go to Demo
109 - </a>
110 - </Widget>
111 - </Col>
112 - <Col lg={5} md={6} xs={12}>
113 - <Widget
114 - title={
115 - <h6>Pure HTML5 Version</h6>
116 - } settings collapse close
117 - >
118 - <img className={['rounded pull-left mb-1 mr-3', s.image].join(' ')} src={jsLogo} width="80" alt="" />
119 - <h3>HTML5 Version</h3>
120 - <p className="text-muted">During last 4 years we
121 - invested more than <span className="fw-semi-bold">1000</span> man-hours
122 - crafting and maintaining this version.</p>
123 - <p>Basic HTML version is the most generic version of Light Blue App
124 - that can be used with any platform
125 - starting from PHP and Rails to .NET and Java. It contains pure
126 - w3c-validated <strong>HTML5</strong> markup
127 - and valid <strong>CSS3</strong> styles. It can work in two modes:
128 - (a) as a <strong>Single
129 - Page Application</strong>, using ajax to fetch page contents, or
130 - (b) as a static application, where
131 - pages served directly from server.
132 - The mode can be switched by changing the
133 - value of &nbsp;<code>window.PJAX_ENABLED</code> global variable.</p>
134 - <p>Moreover, this version comes with three different color
135 - schemes which you can easily switch based on your choice.</p>
136 - <a
137 - className="btn btn-default btn-lg btn-block"
138 - href="https://demo.flatlogic.com/sing-app/html-bs4/dashboard/index.html"
139 - >
140 - Go to Demo
141 - </a>
142 - </Widget>
143 - </Col>
144 - <Col lg={5} md={6}>
145 - <Widget
146 - title={
147 - <h6>Vue JS Version</h6>
148 - } settings collapse close
149 - >
150 - <img className={['rounded pull-left mb-1 mr-3', s.image].join(' ')} src={vueLogo} width="80" alt="" />
151 - <h3>VUE JS Version</h3>
152 - <p className="text-muted">Coming soon version. Seed
153 - project is <span className="fw-semi-bold">50%</span> ready.</p>
154 - <p><a href="https://reactjs.org/" rel="nofollow noopener noreferrer" target="_blank">Vue</a> is a
155 - an open-source progressive
156 - JavaScript framework for building user interfaces. Vue is designed to be
157 - incrementally adoptable meaning that
158 - adding new libraries is made incredibly easy.
159 - </p>
160 - <p>Supporting Vue JS version is a main
161 - priority of <a href="https://flatlogic.com">Flatlogic</a> for next months,
162 - so seed version will ready really soon! <br /><br /><br /><br /><br /></p>
163 - <a
164 - className="btn btn-default btn-lg btn-block"
165 - href="https://demo.flatlogic.com/sing-app-vue/#/app/main/analytics"
166 - >
167 - Go to Demo
168 - </a>
169 - </Widget>
170 - </Col>
171 - </Row>
172 - </div>
173 - );
174 - }
175 -}
176 -
177 -export default SPackage;
1 -@import '../../styles/app';
2 -
3 -.image {
4 - width: 80px;
5 - height: 80px;
6 -}
1 -{
2 - "name": "package",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./SPackage.js"
6 -}
...\ No newline at end of file ...\ No newline at end of file
1 -import React from 'react';
2 -import PropTypes from 'prop-types';
3 -import {
4 - Breadcrumb,
5 - BreadcrumbItem,
6 -} from 'reactstrap';
7 -
8 -import Section from './components/Section/Section';
9 -import Banner from './components/Banner/Banner';
10 -import Description from './components/Description/Description';
11 -import Slider from './components/Slider/Slider';
12 -import { withRouter } from 'react-router';
13 -import { connect } from 'react-redux';
14 -import { getProductsRequest } from '../../actions/products';
15 -
16 -class Product extends React.Component {
17 - static propTypes = {
18 - products: PropTypes.array,
19 - dispatch: PropTypes.func.isRequired,
20 - };
21 -
22 - static defaultProps = {
23 - products: []
24 - };
25 -
26 - componentDidMount() {
27 - window.scrollTo(0,0);
28 - this.props.dispatch(getProductsRequest());
29 - }
30 -
31 - findProduct(id) {
32 - const {products} = this.props;
33 - return products.find(p => p.id === id);
34 - }
35 -
36 - getId() {
37 - const {match} = this.props;
38 - return parseInt(match.params.id);
39 - }
40 -
41 - render () {
42 - let product;
43 - if (this.getId()) {
44 - product = this.findProduct(this.getId());
45 - } else {
46 - product = {
47 - img: 'static/media/img1.jpg',
48 - title: 'trainers',
49 - subtitle: 'Trainers In White',
50 - price: 76,
51 - rating: 4.6,
52 - description_1: "Sneakers (also known as athletic shoes, tennis shoes,gym shoes, runners, takkies, or trainers) are shoes primarily designed for sports or other forms of physical exercise, but which are now also often used for everyday wear.",
53 - description_2: "The term generally describes a type of footwear with a flexible sole made of rubber or synthetic material and an upper part made of leather or synthetic materials.",
54 - code: 135234,
55 - hashtag: "whitetrainers",
56 - technology: [
57 - "Ollie patch",
58 - "Cup soles",
59 - "Vulcanized rubber soles"
60 - ],
61 - reviews: 32
62 - }
63 - }
64 - const products = this.props.products;
65 -
66 - return (
67 - <div className="product-details">
68 - <Breadcrumb>
69 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
70 - <BreadcrumbItem active>E-commerce</BreadcrumbItem>
71 - </Breadcrumb>
72 - <h1 className="page-title">E-commerce - <span className="fw-semi-bold">Product Detail</span></h1>
73 - {
74 - product && (
75 - <div>
76 - <Banner data={product}/>
77 - <Section title="Product Description" h>
78 - <Description data={product}/>
79 - </Section>
80 - <Section title="You may also like">
81 - <Slider slides={products}/>
82 - </Section>
83 - </div>
84 - )
85 - }
86 - </div>
87 - )
88 - }
89 -}
90 -
91 -
92 -function mapStateToProps(state) {
93 - return {
94 - products: state.products.data,
95 - };
96 -}
97 -
98 -export default withRouter(connect(mapStateToProps)(Product));
1 -import React, { Component } from 'react';
2 -import cx from 'classnames';
3 -import PropTypes from 'prop-types';
4 -
5 -import bag from '../../../../images/bag.svg';
6 -import star from '../../../../images/stars/star.svg';
7 -import starFilled from '../../../../images/stars/star-filled.svg';
8 -import s from './Bag.module.scss';
9 -
10 -class Bag extends Component {
11 - state = {
12 - favourite: this.props.favourite || false,
13 - }
14 -
15 - changeFavourite() {
16 - this.setState(pvState => ({ favourite: !pvState.favourite }));
17 - }
18 -
19 - render() {
20 - const { favourite } = this.state;
21 - return (
22 - <div className={s.bag} >
23 - <button className={cx('btn', s.add)}>
24 - add to bag
25 - <img src={bag} alt="bag" />
26 - </button>
27 - <button className={cx('btn', s.star)} onClick={() => this.changeFavourite()}>
28 - <img src={favourite ? starFilled : star} alt="star" />
29 - </button>
30 - </div>
31 - );
32 - }
33 -}
34 -
35 -Bag.propTypes = {
36 - favourite: PropTypes.bool,
37 -};
38 -
39 -Bag.getDefaultProps = {
40 - favourite: false,
41 -};
42 -
43 -export default Bag;
1 -@import '../../../../styles/app';
2 -
3 -.bag {
4 - display: flex;
5 - height: 50px;
6 -}
7 -
8 -.add {
9 - width: 100%;
10 - background-color: theme-color('dark');
11 - text-transform: uppercase;
12 - color: $white;
13 - border: none;
14 - margin-right: $spacer / 2;
15 - display: flex;
16 - align-items: center;
17 - justify-content: center;
18 -
19 - &:hover {
20 - cursor: pointer;
21 - }
22 -
23 - &:focus {
24 - outline: none;
25 - }
26 -
27 - img {
28 - height: 20px;
29 - margin-left: 10px;
30 - }
31 -}
32 -
33 -.star {
34 - display: flex;
35 - justify-content: center;
36 - align-items: center;
37 - width: 55px;
38 - border: 2px solid $border-color;
39 - background: transparent;
40 -
41 - &:hover {
42 - cursor: pointer;
43 - }
44 -
45 - &:focus {
46 - outline: none;
47 - }
48 -
49 - img {
50 - height: 20px;
51 - width: 20px;
52 - }
53 -}
1 -import React from 'react';
2 -import PropTypes from 'prop-types';
3 -
4 -import General from '../General/General';
5 -import Selects from '../Selects/Selects';
6 -import Bag from '../Bag/Bag';
7 -
8 -import mastercard from '../../../../images/payments/mastercard.svg';
9 -import visa from '../../../../images/payments/visa.svg';
10 -import aexpress from '../../../../images/payments/aexpress.svg';
11 -import paypal from '../../../../images/payments/paypal.svg';
12 -
13 -import s from './Banner.module.scss';
14 -
15 -const Banner = ({ data }) => (
16 - <div className={s.productDetailsBanner}>
17 - <div className={s.productPhoto} style={{ backgroundImage: `url(${data.img})` }} />
18 - <div className={s.productInfo}>
19 - <General {...data} />
20 - <button className={`btn-link ${s.productGuide}`}>Size Guide</button>
21 - <Selects sizes={[1, 2, 3, 4, 5]} quantity={[1, 2, 3, 4, 5, 6, 7]} />
22 - <Bag />
23 - <div className={s.payments}>
24 - <div style={{ backgroundImage: `url(${visa})` }} />
25 - <div style={{ backgroundImage: `url(${mastercard})` }} />
26 - <div style={{ backgroundImage: `url(${aexpress})` }} />
27 - <div style={{ backgroundImage: `url(${paypal})` }} />
28 - </div>
29 - <span className={s.delivery}>FREE Delivery & Returns</span>
30 - </div>
31 - </div >
32 -);
33 -
34 -Banner.propTypes = {
35 - data: PropTypes.any.isRequired,
36 -};
37 -
38 -export default Banner;
1 -@import '../../../../styles/app';
2 -
3 -.productDetailsBanner {
4 - display: flex;
5 - margin: $content-padding 0 75px;
6 - border-radius: $border-radius;
7 - box-shadow: var(--widget-shadow);
8 -
9 - @include media-breakpoint-down(sm) {
10 - flex-direction: column;
11 - width: calc(100% + 30px);
12 - box-shadow: none;
13 - margin: auto -15px 0;
14 - }
15 -}
16 -
17 -.productPhoto {
18 - background-size: cover;
19 - background-position: center;
20 - width: 66.6%;
21 - border-bottom-left-radius: $border-radius;
22 - border-top-left-radius: $border-radius;
23 -
24 - @include media-breakpoint-down(md) {
25 - width: 55%;
26 - }
27 -
28 - @include media-breakpoint-down(sm) {
29 - height: 300px;
30 - width: 100%;
31 - border-radius: 0;
32 - }
33 -}
34 -
35 -.productInfo {
36 - background: $white;
37 - width: 33.3%;
38 - padding: 15px $content-padding / 2;
39 - border-bottom-right-radius: $border-radius;
40 - border-top-right-radius: $border-radius;
41 -
42 - @include media-breakpoint-down(md) {
43 - width: 45%;
44 - }
45 -
46 - @include media-breakpoint-down(sm) {
47 - width: 100%;
48 - }
49 -}
50 -
51 -.productGuide {
52 - color: $gray-500;
53 - text-decoration: underline;
54 -
55 - &:hover {
56 - color: $gray-500;
57 - text-decoration: none;
58 - }
59 -}
60 -
61 -.payments {
62 - display: flex;
63 - height: 25px;
64 - margin: 25px 0 $content-padding / 2;
65 -
66 - div {
67 - width: 40px;
68 - margin-right: 15px;
69 - border-radius: 2px;
70 - background-size: cover;
71 - background-position: center;
72 - }
73 -}
74 -
75 -.delivery {
76 - font-weight: $font-weight-normal;
77 - color: $gray-500;
78 -}
1 -import React, { Component } from 'react';
2 -import cx from 'classnames';
3 -import PropTypes from 'prop-types';
4 -import { Col, Row, Collapse } from 'reactstrap';
5 -
6 -import s from './Description.module.scss';
7 -import Rating from '../Rating/Rating';
8 -
9 -class Description extends Component {
10 - state = {
11 - accordion: [false, false, false],
12 - };
13 -
14 - toggleAccordion(id) {
15 - const { accordion } = this.state;
16 - const newAccordion = [...accordion];
17 -
18 - newAccordion[id] = !newAccordion[id];
19 -
20 - this.setState({ accordion: newAccordion });
21 - }
22 -
23 - render() {
24 - const { data } = this.props;
25 - return (
26 - <div>
27 - <div className={s.productDescription}>
28 - <div className={cx(s.productDescriptionInfo, s.productDescriptionBlock)}>
29 - <h3>PRODUCT DESCRIPTION</h3>
30 - <p className="dot-before">{data.description_1}</p>
31 - <p className="dot-before">{data.description_2}</p>
32 - </div>
33 - <div className={s.productDescriptionBlock}>
34 - <h3>PRODUCT CODE</h3>
35 - <div>{data.code}</div>
36 - </div>
37 - <div className={s.productDescriptionBlock}>
38 - <h3>SHARE</h3>
39 - <div>
40 - {/* eslint-disable */}
41 - Share photo with a tag <a href="#">#{data.hashtag}</a>
42 - {/* eslint-enable */}
43 - <div className={s.socialList}>
44 - <div><i className="fa fa-facebook"/></div>
45 - <div><i className="fa fa-instagram"/></div>
46 - <div><i className="fa fa-twitter"/></div>
47 - </div>
48 - </div>
49 - </div>
50 - <div className={s.productDescriptionBlock}>
51 - <h3>TECHNOLOGY</h3>
52 - <ul>
53 - {data.technology.map(t => (
54 - <li key={t} className="dot-before">{t}</li>
55 - ))}
56 - </ul>
57 - </div>
58 - <div className={s.productDescriptionBlock}>
59 - <h3>RATING & REVIEWS</h3>
60 - <div className={s.reviews}>
61 - <Rating rating={data.rating}/>
62 - 32 Reviews
63 - {/* eslint-disable */}
64 - <a href="#">Read all</a>
65 - {/* eslint-enable */}
66 - </div>
67 - </div>
68 - </div>
69 - <Row className={cx(s.productDescription, s.productDescriptionMobile)}>
70 - <Col xs="12">
71 - <div className="card panel">
72 - <div className='card-header panel-header panel-first' role="button" onClick={() => {this.toggleAccordion(0);}}>
73 - <div className="mb-0">
74 - <button className="accordion-toggle">
75 - PRODUCT DESCRIPTION
76 - <i className={`fa fa-angle-down fa-2x ${this.state.accordion[0] ? 'expanded' : ''}`}/>
77 - </button>
78 - </div>
79 - </div>
80 - <Collapse className="panel-body" isOpen={this.state.accordion[0]}>
81 - <div className="card-body">
82 - <p className="dot-before">{data.description_1}</p>
83 - <p className="dot-before">{data.description_2}</p>
84 - </div>
85 - </Collapse>
86 - </div>
87 - <div className="card panel">
88 - <div className='card-header panel-header' role="button" onClick={() => {
89 - this.toggleAccordion(1);
90 - }}>
91 - <div className="mb-0">
92 - <button className="accordion-toggle">
93 - PRODUCT CODE
94 - <i className={`fa fa-angle-down fa-2x ${this.state.accordion[1] ? 'expanded' : ''}`}/>
95 - </button>
96 - </div>
97 - </div>
98 - <Collapse className="panel-body" isOpen={this.state.accordion[1]}>
99 - <div className="card-body">
100 - {data.code}
101 - </div>
102 - </Collapse>
103 - </div>
104 - <div className="card panel">
105 - <div className='card-header panel-header' role="button" onClick={() => {
106 - this.toggleAccordion(2);
107 - }}>
108 - <div className="mb-0">
109 - <button className="accordion-toggle">
110 - SHARE
111 - <i className={`fa fa-angle-down fa-2x ${this.state.accordion[2] ? 'expanded' : ''}`}/>
112 - </button>
113 - </div>
114 - </div>
115 - <Collapse className="panel-body" isOpen={this.state.accordion[2]}>
116 - <div className="card-body">
117 - {/* eslint-disable */}
118 - Share photo with a tag <a href="#">#{data.hashtag}</a>
119 - {/* eslint-enable */}
120 - <div className={s.socialList}>
121 - <div><i className="fa fa-facebook"/></div>
122 - <div><i className="fa fa-instagram"/></div>
123 - <div><i className="fa fa-twitter"/></div>
124 - </div>
125 - </div>
126 - </Collapse>
127 - </div>
128 - <div className="card panel">
129 - <div className='card-header panel-header' role="button" onClick={() => {
130 - this.toggleAccordion(3);
131 - }}>
132 - <div className="mb-0">
133 - <button className="accordion-toggle">
134 - TECHNOLOGY
135 - <i className={`fa fa-angle-down fa-2x ${this.state.accordion[3] ? 'expanded' : ''}`}/>
136 - </button>
137 - </div>
138 - </div>
139 - <Collapse className="panel-body" isOpen={this.state.accordion[3]}>
140 - <div className="card-body">
141 - <ul>
142 - {data.technology.map(t => (
143 - <li key={t} className="dot-before">{t}</li>
144 - ))}
145 - </ul>
146 - </div>
147 - </Collapse>
148 - </div>
149 - <div className="card panel">
150 - <div className='card-header panel-header' role="button" onClick={() => {
151 - this.toggleAccordion(4);
152 - }}>
153 - <div className="mb-0">
154 - <button className="accordion-toggle">
155 - RATING & REVIEWS
156 - <i className={`fa fa-angle-down fa-2x ${this.state.accordion[4] ? 'expanded' : ''}`}/>
157 - </button>
158 - </div>
159 - </div>
160 - <Collapse className="panel-body" isOpen={this.state.accordion[4]}>
161 - <div className="card-body">
162 - <div className={s.reviews}>
163 - <Rating rating={data.rating}/>
164 - 32 Reviews
165 - {/* eslint-disable */}
166 - <a href="#">Read all</a>
167 - {/* eslint-enable */}
168 - </div>
169 - </div>
170 - </Collapse>
171 - </div>
172 - </Col>
173 - </Row>
174 - </div>
175 - );
176 - }
177 -}
178 -
179 -Description.propTypes = {
180 - data: PropTypes.any.isRequired,
181 -};
182 -
183 -export default Description;
1 -@import '../../../../styles/app';
2 -
3 -.productDescription {
4 - background-color: $white;
5 - box-shadow: var(--widget-shadow);
6 - border-radius: $border-radius;
7 - display: grid;
8 - grid-template-columns: 1fr 1fr 1fr;
9 - grid-template-rows: 1fr 1fr;
10 -
11 - @include media-breakpoint-down(sm) {
12 - display: none;
13 - }
14 -
15 - h3 {
16 - font-size: 1.4rem;
17 - font-weight: $font-weight-normal;
18 - margin-bottom: 15px;
19 - color: theme-color('dark');
20 - }
21 -
22 - :global .dot-before {
23 - margin: 3px 0;
24 -
25 - &::before {
26 - content: '•';
27 - margin-right: 7.5px;
28 - }
29 - }
30 -
31 - a {
32 - color: $link-color;
33 - }
34 -
35 - .productDescriptionInfo {
36 - grid-row: 1 / 3;
37 - grid-column: 1;
38 - }
39 -
40 - .socialList {
41 - display: flex;
42 - margin-top: $spacer;
43 -
44 - div {
45 - transition: $transition-base;
46 - height: 25px;
47 - width: 25px;
48 - border-radius: 50%;
49 - margin-right: 10px;
50 - display: flex;
51 - align-items: center;
52 - justify-content: center;
53 - color: $white;
54 -
55 - &:hover {
56 - cursor: pointer;
57 - }
58 -
59 - &:nth-child(1) {
60 - background-color: #3b5998;
61 -
62 - &:hover {
63 - background-color: lighten(#3b5998, 10%);
64 - }
65 - }
66 -
67 - &:nth-child(2) {
68 - background-color: #8a3ab9;
69 -
70 - &:hover {
71 - background-color: lighten(#8a3ab9, 10%);
72 - }
73 - }
74 -
75 - &:nth-child(3) {
76 - background-color: #1dcaff;
77 -
78 - &:hover {
79 - background-color: lighten(#1dcaff, 10%);
80 - }
81 - }
82 - }
83 - }
84 -
85 - .reviews {
86 - display: flex;
87 - flex-direction: column;
88 -
89 - a {
90 - margin-top: 5px;
91 - }
92 - }
93 -
94 - & :global .panel-header {
95 - background-color: $white;
96 - border-top: 1px solid $gray-500;
97 -
98 - button {
99 - color: $gray-500;
100 - width: 100%;
101 - }
102 - }
103 -
104 - & :global .card-header {
105 - padding-left: 0;
106 - padding-right: 0;
107 - }
108 -
109 - & :global .card-body {
110 - padding-top: 0;
111 - padding-left: 0;
112 - }
113 -
114 - & :global .panel-first {
115 - border-top: none;
116 - }
117 -}
118 -
119 -.productDescriptionBlock {
120 - padding: 30px $content-padding / 2;
121 - font-weight: $font-weight-normal;
122 - display: flex;
123 - flex-direction: column;
124 -
125 - &:nth-child(n + 4) {
126 - padding-top: 0;
127 - }
128 -}
129 -
130 -.productDescriptionMobile {
131 - display: none !important;
132 - margin: 0 !important;
133 - font-weight: $font-weight-normal;
134 - padding: 5px 5px 10px;
135 -
136 - @include media-breakpoint-down(sm) {
137 - display: block !important;
138 - }
139 -}
1 -import React from 'react';
2 -import cx from 'classnames';
3 -import PropTypes from 'prop-types';
4 -
5 -import Rating from '../Rating/Rating';
6 -
7 -import s from './General.module.scss';
8 -
9 -const General = ({ rating, title, subtitle, price }) => (
10 - <div className={s.general}>
11 - <div className={s.ratingWrapper}>
12 - <Rating rating={rating} />
13 - </div>
14 - <div className={s.dataWrapper}>
15 - <span className={cx(s.title, 'title')}>{title}</span>
16 - <span className={cx(s.subtitle, 'subtitle')}>{subtitle}</span></div>
17 - <span className={s.price}>${price}</span>
18 - </div>
19 -);
20 -
21 -General.propTypes = {
22 - rating: PropTypes.oneOfType([
23 - PropTypes.string,
24 - PropTypes.number,
25 - ]).isRequired,
26 - title: PropTypes.string.isRequired,
27 - subtitle: PropTypes.string.isRequired,
28 - price: PropTypes.any.isRequired,
29 -};
30 -
31 -export default General;
1 -@import '../../../../styles/app';
2 -
3 -.general {
4 - display: flex;
5 - flex-direction: column;
6 -}
7 -
8 -.title {
9 - margin-top: $content-padding / 2;
10 - font-weight: $font-weight-normal;
11 - text-transform: uppercase;
12 - font-size: $font-size-lg;
13 - color: theme-color('dark');
14 -}
15 -
16 -.subtitle {
17 - font-size: $font-size-lg;
18 - font-weight: $font-weight-normal;
19 - color: $gray-500;
20 - text-transform: capitalize;
21 - margin: 5px 0 25px;
22 -}
23 -
24 -.price {
25 - font-weight: $font-weight-semi-bold;
26 - font-size: $font-size-lg;
27 - margin-bottom: 25px;
28 - color: theme-color('dark');
29 -}
30 -
31 -.ratingWrapper {
32 - display: flex;
33 -
34 - @include media-breakpoint-down(sm) {
35 - justify-content: flex-end;
36 - }
37 -}
38 -
39 -.dataWrapper {
40 - display: flex;
41 - flex-direction: column;
42 -
43 - @include media-breakpoint-down(sm) {
44 - flex-direction: column-reverse;
45 - margin-top: -31px;
46 -
47 - & :global .title {
48 - margin-bottom: 25px;
49 - margin-top: 5px;
50 - }
51 -
52 - & :global .subtitle {
53 - margin-bottom: 0;
54 - }
55 - }
56 -}
1 -import React from 'react';
2 -import cx from 'classnames';
3 -import PropTypes from 'prop-types';
4 -/* eslint-disable */
5 -import s from './Rating.module.scss';
6 -/* eslint-enable */
7 -const Rating = ({ rating, size }) => (
8 - <div className={cx(s.rating, 'rating', { [s[`rating-${size}`]]: size })}>
9 - {rating}
10 - <svg xmlns="http://www.w3.org/2000/svg" version="1.1" id="Capa_1" x="0px" y="0px" viewBox="0 0 49.94 49.94" width="17px" height="17px">
11 - <path d="M48.856,22.73c0.983-0.958,1.33-2.364,0.906-3.671c-0.425-1.307-1.532-2.24-2.892-2.438l-12.092-1.757 c-0.515-0.075-0.96-0.398-1.19-0.865L28.182,3.043c-0.607-1.231-1.839-1.996-3.212-1.996c-1.372,0-2.604,0.765-3.211,1.996 L16.352,14c-0.23,0.467-0.676,0.79-1.191,0.865L3.069,16.622c-1.359,0.197-2.467,1.131-2.892,2.438 c-0.424,1.307-0.077,2.713,0.906,3.671l8.749,8.528c0.373,0.364,0.544,0.888,0.456,1.4L8.224,44.701 c-0.183,1.06,0.095,2.091,0.781,2.904c1.066,1.267,2.927,1.653,4.415,0.871l10.814-5.686c0.452-0.237,1.021-0.235,1.472,0 l10.815,5.686c0.526,0.277,1.087,0.417,1.666,0.417c1.057,0,2.059-0.47,2.748-1.288c0.687-0.813,0.964-1.846,0.781-2.904 l-2.065-12.042c-0.088-0.513,0.083-1.036,0.456-1.4L48.856,22.73z" fill="#ffc247" />
12 - </svg>
13 - </div>
14 -);
15 -
16 -Rating.propTypes = {
17 - rating: PropTypes.oneOfType([
18 - PropTypes.string,
19 - PropTypes.number,
20 - ]).isRequired,
21 - size: PropTypes.string,
22 -};
23 -
24 -Rating.defaultProps = {
25 - size: '',
26 -};
27 -
28 -export default Rating;
1 -@import '../../../../styles/app';
2 -
3 -.rating {
4 - display: flex;
5 - font-size: $font-size-lg;
6 - font-weight: $font-weight-semi-bold;
7 - color: theme-color('warning');
8 - align-items: center;
9 -
10 - svg {
11 - margin: -2px 0 0 10px;
12 - }
13 -}
14 -
15 -.rating-sm {
16 - font-size: $font-size-base;
17 -
18 - svg {
19 - height: 14px;
20 - }
21 -}
1 -import React from 'react';
2 -import cx from 'classnames';
3 -import PropTypes from 'prop-types';
4 -
5 -import s from './Section.module.scss';
6 -
7 -const Section = ({ title, children, h }) => (
8 - <div className={s.section}>
9 - <h2 className={cx(s.sectionTitle, { 'hideon-sm': h })}>{title}</h2>
10 - {children}
11 - </div>
12 -);
13 -
14 -Section.propTypes = {
15 - title: PropTypes.string.isRequired,
16 - children: PropTypes.node.isRequired,
17 - h: PropTypes.bool,
18 -};
19 -
20 -Section.defaultProps = {
21 - h: false,
22 -};
23 -
24 -export default Section;
1 -@import '../../../../styles/app';
2 -
3 -.section {
4 - margin-bottom: $spacer * 5;
5 -
6 - @include media-breakpoint-down(sm) {
7 - background-color: $white;
8 - margin: 0 -15px;
9 -
10 - & :global .hideon-sm {
11 - display: none;
12 - }
13 - }
14 -
15 - &:last-child {
16 - margin-bottom: 0;
17 - }
18 -}
19 -
20 -.sectionTitle {
21 - width: 100%;
22 - text-align: center;
23 - margin-bottom: $spacer * 2;
24 - font-weight: $font-weight-normal;
25 - color: theme-color('dark');
26 -
27 - @include media-breakpoint-down(sm) {
28 - font-size: 1.4rem;
29 - margin-bottom: $content-padding / 2;
30 - }
31 -}
1 -import React, { Component } from 'react';
2 -import PropTypes from 'prop-types';
3 -import {
4 - UncontrolledButtonDropdown,
5 - DropdownMenu,
6 - DropdownToggle,
7 - DropdownItem,
8 -} from 'reactstrap';
9 -
10 -import s from './Selects.module.scss';
11 -
12 -class Selects extends Component {
13 - state = {
14 - currentSize: 'Select size',
15 - currentQuantity: 1,
16 - }
17 -
18 - changeState(field, value) {
19 - this.setState({ [field]: value });
20 - }
21 -
22 - render() {
23 - const { sizes, quantity } = this.props;
24 - const { currentSize, currentQuantity } = this.state;
25 - return (
26 - <div className={s.selects}>
27 - <UncontrolledButtonDropdown>
28 - <DropdownToggle
29 - caret color="default"
30 - className="dropdown-toggle-split mr-xs"
31 - >
32 - {currentSize === 'Select size'
33 - ? currentSize
34 - : `Size: ${currentSize}`}
35 - </DropdownToggle>
36 - <DropdownMenu>
37 - {sizes.map(item =>
38 - <DropdownItem key={item} onClick={() => this.changeState('currentSize', item)}>{item}</DropdownItem>,
39 - )}
40 - </DropdownMenu>
41 - </UncontrolledButtonDropdown>
42 - <UncontrolledButtonDropdown>
43 - <DropdownToggle
44 - caret color="default"
45 - className="dropdown-toggle-split mr-xs"
46 - >
47 - {currentQuantity}
48 - </DropdownToggle>
49 - <DropdownMenu>
50 - {quantity.map(item =>
51 - <DropdownItem key={item} onClick={() => this.changeState('currentQuantity', item)}>{item}</DropdownItem>,
52 - )}
53 - </DropdownMenu>
54 - </UncontrolledButtonDropdown>
55 - </div>
56 - );
57 - }
58 -}
59 -
60 -Selects.propTypes = {
61 - sizes: PropTypes.any.isRequired,
62 - quantity: PropTypes.any.isRequired,
63 -};
64 -
65 -export default Selects;
1 -@import '../../../../styles/app';
2 -
3 -.selects {
4 - display: flex;
5 - margin: $spacer / 2 0;
6 -
7 - & > div {
8 - height: 50px;
9 -
10 - button {
11 - width: 100%;
12 - margin-right: 0;
13 - }
14 -
15 - &:first-child {
16 - width: 65%;
17 - }
18 -
19 - &:last-child {
20 - width: calc(35% - #{$spacer / 2});
21 - margin-left: $spacer / 2;
22 - }
23 - }
24 -}
1 -import React from 'react';
2 -import PropTypes from 'prop-types';
3 -import Slick from 'react-slick';
4 -
5 -import SliderArrow from '../SliderArrow/SliderArrow';
6 -import ProductCard from '../../../products/components/ProductCard/ProductCard';
7 -
8 -import s from './Slider.module.scss';
9 -
10 -const Slider = ({ slides }) => {
11 - const itemsToDisplay = 4;
12 - const settings = {
13 - className: s.slick,
14 - infinite: false,
15 - speed: 500,
16 - slidesToShow: itemsToDisplay,
17 - slidesToScroll: 1,
18 - initialSlide: 0,
19 - nextArrow: <SliderArrow orientation="right" itemsToDisplay={itemsToDisplay} />,
20 - prevArrow: <SliderArrow orientation="left" itemsToDisplay={itemsToDisplay} />,
21 - responsive: [{
22 - breakpoint: 992,
23 - settings: {
24 - slidesToShow: 3,
25 - },
26 - },
27 - {
28 - breakpoint: 575,
29 - settings: {
30 - slidesToShow: 2,
31 - infinite: true,
32 - },
33 - },
34 - {
35 - breakpoint: 360,
36 - settings: {
37 - slidesToShow: 1,
38 - infinite: true,
39 - },
40 - }],
41 - };
42 - return (
43 - <div className={s.slider} >
44 - <Slick {...settings}>
45 - {slides.map(slide =>
46 - <div className={s.sliderItem} key={slide.id}><ProductCard {...slide} /></div>)}
47 - </Slick>
48 - </div >
49 - );
50 -};
51 -
52 -Slider.propTypes = {
53 - slides: PropTypes.arrayOf(PropTypes.any).isRequired,
54 -};
55 -
56 -export default Slider;
1 -@import '../../../../styles/app';
2 -
3 -.slider {
4 - width: 100%;
5 - max-width: 1300px;
6 - margin: 0 auto;
7 - position: relative;
8 - overflow: hidden;
9 -
10 - @include media-breakpoint-down(sm) {
11 - margin-bottom: -#{$content-padding / 2};
12 - padding-bottom: 50px;
13 - }
14 -
15 - & :global .product-card {
16 - margin-bottom: 0;
17 - }
18 -}
19 -
20 -.sliderItem {
21 - padding: 0 10px;
22 -
23 - @include media-breakpoint-down(sm) {
24 - padding: 5px;
25 - }
26 -}
27 -
28 -.slick {
29 - & :global .slick-track {
30 - display: flex;
31 - }
32 -}
33 -
1 -import React from 'react';
2 -import cx from 'classnames';
3 -import PropTypes from 'prop-types';
4 -
5 -import arrow from '../../../../images/arrow.svg';
6 -
7 -import s from './SliderArrow.module.scss';
8 -
9 -const SliderArrow = ({ orientation, itemsToDisplay, currentSlide, slideCount, ...otherProps }) => {
10 - const active = orientation === 'left'
11 - ? currentSlide !== 0
12 - : currentSlide + itemsToDisplay < slideCount;
13 - const orientationClass = orientation === 'left' ? s['arrow--left'] : s['arrow--right'];
14 - return (
15 - <button {...otherProps} className={cx(s.arrow, orientationClass, { [s.active]: active })}>
16 - <img src={arrow} alt="arrow" />
17 - </button>
18 - );
19 -};
20 -
21 -SliderArrow.propTypes = {
22 - orientation: PropTypes.string.isRequired,
23 - currentSlide: PropTypes.number,
24 - slideCount: PropTypes.number,
25 - itemsToDisplay: PropTypes.number.isRequired,
26 -};
27 -
28 -SliderArrow.getDefaultProps = {
29 - currentSlide: null,
30 - slideCount: null,
31 -};
32 -
33 -
34 -export default SliderArrow;
1 -@import '../../../../styles/app';
2 -
3 -.arrow {
4 - opacity: 0;
5 - transition: 0.3s;
6 - z-index: 99;
7 - width: 50px;
8 - height: 50px;
9 - display: none;
10 - align-items: center;
11 - justify-content: center;
12 - position: absolute;
13 - top: 135px;
14 - border: none;
15 - background-color: rgba(0, 0, 0, 0.15);
16 -
17 - &:focus {
18 - outline: none;
19 - }
20 -
21 - &:hover {
22 - cursor: pointer;
23 - background-color: rgba(0, 0, 0, 0.25);
24 - }
25 -
26 - img {
27 - height: 20px;
28 - width: 20px;
29 - }
30 -}
31 -
32 -.arrow--left {
33 - left: 10px;
34 -
35 - img {
36 - transform: rotate(180deg);
37 - }
38 -}
39 -
40 -.arrow--right {
41 - right: 10px;
42 -}
43 -
44 -.active {
45 - opacity: 1;
46 -
47 - @include media-breakpoint-down(sm) {
48 - opacity: 0;
49 - }
50 -}
1 -{
2 - "name": "product",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Product.js"
6 -}
...\ No newline at end of file ...\ No newline at end of file
1 -import React, { Component } from 'react';
2 -import {
3 - Breadcrumb,
4 - BreadcrumbItem,
5 -} from 'reactstrap';
6 -import PropTypes from 'prop-types';
7 -
8 -import FilterElement from './components/FilterElement/FilterElement';
9 -import ProductCard from './components/ProductCard/ProductCard';
10 -import MobileModal from './components/MobileModal/MobileModal';
11 -
12 -import s from './Products.module.scss';
13 -import { getProductsRequest } from '../../actions/products';
14 -import { withRouter } from 'react-router';
15 -import { connect } from 'react-redux';
16 -
17 -const filtersData = [{
18 - title: 'Filter',
19 - data: [{
20 - id: 0,
21 - label: 'Type',
22 - options: ['Shoes', 'Boots', 'Trainers'],
23 - },
24 - {
25 - id: 1,
26 - label: 'Brands',
27 - options: ['All', 'Nike', 'Adidas'],
28 - },
29 - {
30 - id: 2,
31 - label: 'Size',
32 - options: [7, 8, 9, 10, 11, 12, 12.5, 13],
33 - },
34 - {
35 - id: 3,
36 - label: 'Colour',
37 - options: ['All', 'White', 'Black'],
38 - },
39 - {
40 - id: 4,
41 - label: 'Range',
42 - options: ['All', '-', 'None'],
43 - }],
44 -},
45 -{
46 - id: 6,
47 - title: 'Sort',
48 - data: ['Favourite', 'Price', 'Popular'],
49 -}];
50 -
51 -class ProductList extends Component {
52 - static propTypes = {
53 - products: PropTypes.array,
54 - dispatch: PropTypes.func.isRequired,
55 - };
56 -
57 - static defaultProps = {
58 - products: []
59 - };
60 -
61 - state = {
62 - isModalActive: false,
63 - modalId: null,
64 - };
65 -
66 - openModal(id) {
67 - this.setState({ isModalActive: true, modalId: id });
68 - }
69 -
70 - closeModal = () => {
71 - this.setState({ isModalActive: false, modalId: null });
72 - };
73 -
74 - componentDidMount() {
75 - this.props.dispatch(getProductsRequest());
76 - }
77 -
78 - render() {
79 - const products = this.props.products;
80 - const { isModalActive, modalId } = this.state;
81 - return (
82 - <div>
83 - {!isModalActive &&
84 - <div>
85 - <Breadcrumb>
86 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
87 - <BreadcrumbItem active>E-commerce</BreadcrumbItem>
88 - </Breadcrumb>
89 - {/* eslint-disable */}
90 - <h1 className="page-title">E-commerce - <span className="fw-semi-bold">Product Grid</span></h1>
91 - {/* eslint-enable */}
92 - <div className={s.productsListFilters}>
93 - {filtersData.map(item =>
94 - (typeof item.data[0] === 'string'
95 - ? <FilterElement defaultLable={item.title} options={item.data} key={item.id} />
96 - : item.data.map(i =>
97 - <FilterElement defaultLable={i.label} options={i.options} key={i.id} />)),
98 - )}
99 - </div>
100 - <div className={s.mobileFilterButtons}>
101 - <button
102 - className="btn btn-transparent btn-lg"
103 - onClick={() => this.openModal(1)}
104 - >
105 - Sort <i className="fa fa-2x fa-angle-down" />
106 - </button>
107 - <button
108 - className="btn btn-transparent btn-lg"
109 - onClick={() => this.openModal(0)}
110 - >
111 - Filter <i className="fa fa-2x fa-angle-down" />
112 - </button>
113 - </div>
114 - <div className={s.productsListElements}>
115 - {products.map(item => <ProductCard key={item.id} {...item} />)}
116 - </div>
117 - </div>
118 - }
119 - <MobileModal active={isModalActive && modalId === 0} data={filtersData[0]} close={this.closeModal} />
120 - <MobileModal active={isModalActive && modalId === 1} data={filtersData[1]} close={this.closeModal} />
121 - </div >
122 - );
123 - }
124 -}
125 -
126 -function mapStateToProps(state) {
127 - return {
128 - products: state.products.data,
129 - };
130 -}
131 -
132 -export default withRouter(connect(mapStateToProps)(ProductList));
1 -@import '../../styles/app';
2 -
3 -.productsListFilters {
4 - display: flex;
5 - flex-wrap: wrap;
6 - align-items: flex-start;
7 - margin-bottom: calc(#{$spacer} - 4px);
8 -
9 - @include media-breakpoint-down(sm) {
10 - display: none;
11 - }
12 -}
13 -
14 -.mobileFilterButtons {
15 - display: none;
16 - margin: auto -15px 25px;
17 - padding: 10px 0;
18 - border-top: 1px solid $border-color;
19 - border-bottom: 1px solid $border-color;
20 -
21 - @include media-breakpoint-down(sm) {
22 - display: flex;
23 - }
24 -
25 - button {
26 - width: 50%;
27 - background: transparent;
28 - display: flex;
29 - align-items: center;
30 - justify-content: center;
31 - padding: 0;
32 -
33 - i {
34 - color: $border-color;
35 - margin-left: $content-padding / 4;
36 - }
37 -
38 - &:first-child {
39 - border-right: 1px solid $border-color;
40 - }
41 - }
42 -}
43 -
44 -.productsListElements {
45 - display: grid;
46 - grid-gap: 15px;
47 - grid-template-columns: repeat(4, 1fr);
48 -
49 - @include media-breakpoint-down(lg) {
50 - grid-template-columns: repeat(3, 1fr);
51 - }
52 -
53 - @include media-breakpoint-down(sm) {
54 - grid-template-columns: repeat(2, 1fr);
55 - }
56 -}
57 -
1 -import React, { Component } from 'react';
2 -import PropTypes from 'prop-types';
3 -import {
4 - UncontrolledButtonDropdown,
5 - DropdownMenu,
6 - DropdownToggle,
7 - DropdownItem,
8 -} from 'reactstrap';
9 -
10 -import s from './FilterElement.module.scss';
11 -
12 -class FilterElement extends Component {
13 - static propTypes = {
14 - defaultLable: PropTypes.string.isRequired,
15 - options: PropTypes.any.isRequired,
16 - }
17 -
18 - state = {
19 - currentOption: this.props.options[0],
20 - }
21 -
22 - changeOption(currentOption) {
23 - this.setState({ currentOption });
24 - }
25 -
26 - render() {
27 - const { options, defaultLable } = this.props;
28 - const { currentOption } = this.state;
29 - return (
30 - <div className={s.filterElement}>
31 - <div className={s.filterElementLable}>{defaultLable}</div>
32 - <UncontrolledButtonDropdown>
33 - <DropdownToggle
34 - caret color="default"
35 - className="dropdown-toggle-split mr-xs"
36 - >
37 - {currentOption}&nbsp;&nbsp;
38 - </DropdownToggle>
39 - <DropdownMenu>
40 - {options.map(item =>
41 - <DropdownItem key={item} onClick={() => this.changeOption(item)}>{item}</DropdownItem>,
42 - )}
43 - </DropdownMenu>
44 - </UncontrolledButtonDropdown>
45 - </div>
46 - );
47 - }
48 -}
49 -
50 -export default FilterElement;
51 -
1 -@import '../../../../styles/app';
2 -
3 -.filterElement {
4 - display: flex;
5 - align-items: center;
6 - margin-right: 30px;
7 - margin-bottom: $content-padding / 2;
8 -
9 - &:last-child {
10 - margin-left: 0;
11 - }
12 -}
13 -
14 -.filterElementLable {
15 - margin-right: 10px;
16 - font-weight: $font-weight-normal;
17 -}
1 -import React from 'react';
2 -import PropTypes from 'prop-types';
3 -import cx from 'classnames';
4 -
5 -import check from '../../../../images/check.svg';
6 -
7 -import s from './MobileMenuOption.module.scss';
8 -
9 -const MobileMenuOption = (props) => {
10 - const { active, children, onClick } = props;
11 - return (
12 - /*eslint-disable*/
13 - <li
14 - className={cx('option', s.option, { [s.active]: active })}
15 - onClick={onClick}
16 - >
17 - {/*eslint-enable*/}
18 - <span>
19 - <img src={check} alt="check" />
20 - </span>
21 - {children}
22 - </li>
23 - );
24 -};
25 -
26 -MobileMenuOption.propTypes = {
27 - active: PropTypes.bool,
28 - children: PropTypes.node.isRequired,
29 - onClick: PropTypes.func.isRequired,
30 -};
31 -
32 -MobileMenuOption.defaultProps = {
33 - active: false,
34 -};
35 -
36 -export default MobileMenuOption;
1 -@import '../../../../styles/app';
2 -
3 -.option {
4 - span {
5 - margin: 0 $content-padding / 2 0 -10px;
6 - transition: $sidebar-transition-time;
7 - width: 30px;
8 - height: 30px;
9 - border-radius: 50%;
10 - border: 2px solid $addition-bg;
11 - display: flex;
12 - align-items: center;
13 - justify-content: center;
14 -
15 - img {
16 - transition: 0.3s;
17 - width: 15px;
18 - opacity: 0;
19 - }
20 - }
21 -}
22 -
23 -.active {
24 - span {
25 - img {
26 - width: 15px;
27 - opacity: 1;
28 - }
29 - }
30 -}
1 -import React, { Component } from 'react';
2 -import cx from 'classnames';
3 -import PropTypes from 'prop-types';
4 -
5 -import ModalMenuOption from '../MobileMenuOption/MobileMenuOption';
6 -
7 -import closeImg from '../../../../images/cancel.svg';
8 -import backImg from '../../../../images/back.svg';
9 -
10 -import s from './MobileModal.module.scss';
11 -
12 -class MobileModal extends Component {
13 - state = {
14 - data: this.props.data,
15 - isPages: typeof this.props.data.data[0] !== 'string',
16 - isPageOpened: false,
17 - activePageId: 0,
18 - activeOptions: {},
19 - }
20 -
21 - toggleOptionActive(field, value) {
22 - const newActiveOption = {
23 - ...this.state.activeOptions,
24 - [field]: value,
25 - };
26 -
27 - this.setState({ activeOptions: newActiveOption });
28 - }
29 -
30 - handleBackClick = () => {
31 - this.setState({ activePageId: null, isPageOpened: false });
32 - }
33 -
34 - handleCloseClick = () => {
35 - this.setState({ activePageId: null, isPageOpened: false });
36 -
37 - this.props.close();
38 - }
39 -
40 - openPage(index) {
41 - this.setState({ activePageId: index, isPageOpened: true });
42 - }
43 -
44 - render() {
45 - const { active } = this.props;
46 - const { activePageId, isPages, isPageOpened, data: { data, title }, activeOptions } = this.state;
47 - const openedPage = isPageOpened && data[activePageId];
48 - const renderedTitle = openedPage ? openedPage.label : title;
49 - return (
50 - <div className={cx(s.mobileModal, { [s.mobileModalActive]: active })}>
51 - <div className={s.mobileModalTitle}>
52 - <button onClick={openedPage ? this.handleBackClick : this.handleCloseClick}>
53 - <img className={cx({ back: openedPage })} src={openedPage ? backImg : closeImg} alt="close" />
54 - </button>
55 - <h5>{renderedTitle}</h5>
56 - </div>
57 - <ul className={s.mobileModalBody}>
58 - {/* eslint-disable */}
59 - {isPages
60 - ? !isPageOpened
61 - ? data.map(({ label, id }, index) => <li onClick={() => this.openPage(index)} key={id}>{label}</li>)
62 - : openedPage.options.map((option, index) => <ModalMenuOption
63 - active={activeOptions[renderedTitle] === index}
64 - onClick={() => this.toggleOptionActive(renderedTitle, index)}
65 - key={index}
66 - >
67 - {option}
68 - </ModalMenuOption>)
69 - : data.map((option, index) => <ModalMenuOption
70 - active={activeOptions[renderedTitle] === index}
71 - onClick={() => this.toggleOptionActive(renderedTitle, index)}
72 - key={index}
73 - >
74 - {option}
75 - </ModalMenuOption>)}
76 - {/* eslint-enable */}
77 - </ul>
78 - </div >
79 - );
80 - }
81 -}
82 -
83 -MobileModal.propTypes = {
84 - active: PropTypes.bool,
85 - close: PropTypes.func.isRequired,
86 - data: PropTypes.any.isRequired,
87 -};
88 -
89 -MobileModal.defaultProps = {
90 - active: false,
91 -};
92 -
93 -export default MobileModal;
1 -@import '../../../../styles/app';
2 -
3 -.mobileModal {
4 - display: none;
5 - margin: -#{$content-padding / 2} -15px;
6 - min-height: calc(100vh - #{$navbar-height});
7 -}
8 -
9 -.mobileModalActive {
10 - display: flex;
11 - flex-direction: column;
12 -}
13 -
14 -.mobileModalTitle {
15 - position: relative;
16 - width: 100%;
17 - height: $navbar-height;
18 - display: flex;
19 - justify-content: center;
20 - align-items: center;
21 - background-color: $addition-bg;
22 -
23 - button {
24 - left: 35px;
25 - padding: 0;
26 - border: none;
27 - position: absolute;
28 - background: transparent;
29 -
30 - &:focus {
31 - outline: none;
32 - }
33 -
34 - img {
35 - height: 15px;
36 - }
37 -
38 - & :global .back {
39 - height: 17px;
40 - }
41 - }
42 -
43 - h5 {
44 - margin: 0;
45 - font-weight: $font-weight-normal;
46 - }
47 -}
48 -
49 -.mobileModalBody {
50 - min-height: calc(100vh - #{$navbar-height * 2});
51 - background-color: $white;
52 - padding-left: 35px;
53 -
54 - li {
55 - display: flex;
56 - align-items: center;
57 - height: $navbar-height;
58 - border-bottom: 2px solid $addition-bg;
59 - font-weight: $font-weight-normal;
60 - }
61 -
62 - & :global .option {
63 - border: none;
64 - }
65 -}
1 -import React, { Component } from 'react';
2 -import cx from 'classnames';
3 -import PropTypes from 'prop-types';
4 -import { withRouter } from 'react-router-dom';
5 -
6 -import Rating from '../../../product/components/Rating/Rating';
7 -
8 -import star from '../../../../images/stars/star.svg';
9 -import starFilled from '../../../../images/stars/star-filled.svg';
10 -
11 -import s from './ProductCard.module.scss';
12 -
13 -class ProductCard extends Component {
14 - state = {
15 - favourite: this.props.favourite,
16 - };
17 -
18 - changeFavourite() {
19 - this.setState(pvState => ({ favourite: !pvState.favourite }));
20 - }
21 -
22 - openProduct(id) {
23 - this.props.history.push('/app/ecommerce/product/' + id);
24 - }
25 -
26 - render() {
27 - const { img, title, subtitle, price, discount, rating, id, createdAt, updatedAt } = this.props;
28 - const {favourite} = this.state;
29 - const newPrice = discount ? price - (price * discount / 100) : price;
30 - const label = discount ? "Sale" : createdAt === updatedAt ? "New" : null;
31 - return (
32 - <div className={[s.productCard, 'product-card'].join(' ')}>
33 - <div onClick={() => {this.openProduct(id)}} className={s.productCardPhoto} style={{ backgroundImage: `url(${img})` }}>
34 - {label && <div className={cx(s.label, label === 'Sale' ? 'bg-danger' : 'bg-success')}>{label}</div>}
35 - <button className={s.star} onClick={() => this.changeFavourite()}>
36 - <img src={favourite ? starFilled : star} alt="star" />
37 - </button>
38 - </div>
39 - <div className={s.productCardDataWrapper}>
40 - <div className={cx(s.productsCardTitle, 'title')}>{title}</div>
41 - <div className={cx(s.productsCardDescription, 'description')}>{subtitle}</div>
42 - </div>
43 - <div className={s.productsCardPrice}>
44 - {!discount
45 - ? `$${price}`
46 - : <div className={s.sale}>
47 - <span className={s.old}>${price}</span>
48 - {discount}% off
49 - <span className={s.new}> ${newPrice}</span>
50 - </div>
51 - }
52 - {rating && <Rating rating={rating} size="sm" />}
53 - </div>
54 - </div>
55 - );
56 - }
57 -}
58 -
59 -ProductCard.propTypes = {
60 - img: PropTypes.string.isRequired,
61 - title: PropTypes.string.isRequired,
62 - subtitle: PropTypes.string.isRequired,
63 - price: PropTypes.oneOfType([
64 - PropTypes.string,
65 - PropTypes.number,
66 - ]).isRequired,
67 - discount: PropTypes.oneOfType([
68 - PropTypes.string,
69 - PropTypes.number,
70 - ]),
71 - rating: PropTypes.oneOfType([
72 - PropTypes.string,
73 - PropTypes.number,
74 - ]).isRequired,
75 -};
76 -
77 -ProductCard.getDefaultProps = {
78 - rating: null,
79 -};
80 -
81 -export default withRouter(ProductCard);
1 -@import '../../../../styles/app';
2 -
3 -.productCard {
4 - margin-bottom: $spacer * 5;
5 - width: 100%;
6 -
7 - @include media-breakpoint-down(sm) {
8 - margin-bottom: $spacer;
9 - }
10 -}
11 -
12 -.productCardPhoto {
13 - width: 100%;
14 - height: 320px;
15 - background-position: center;
16 - background-size: cover;
17 - position: relative;
18 - border-radius: $border-radius;
19 - box-shadow: var(--widget-shadow);
20 -
21 - @include media-breakpoint-down(sm) {
22 - height: 200px;
23 - }
24 -
25 - @include media-breakpoint-down(md) {
26 - height: 250px;
27 - }
28 -
29 - @include media-breakpoint-down(xs) {
30 - height: 150px;
31 - }
32 -
33 - cursor: pointer;
34 - transition: $transition-base;
35 -
36 - &:hover {
37 - transform: scale(1.01);
38 - }
39 -
40 - .label {
41 - position: absolute;
42 - left: 0;
43 - top: 15px;
44 - padding: 1px 11px;
45 - color: $white;
46 - }
47 -
48 - .star {
49 - position: absolute;
50 - right: 15px;
51 - top: 12px;
52 - padding: 5px;
53 - border-radius: 50%;
54 - border: none;
55 - background: $white;
56 - display: flex;
57 -
58 - @include media-breakpoint-down(sm) {
59 - top: auto;
60 - bottom: 12px;
61 - padding: 8px;
62 - }
63 -
64 - &:hover {
65 - cursor: pointer;
66 - }
67 -
68 - &:focus {
69 - outline: none;
70 - }
71 -
72 - img {
73 - height: 15px;
74 - width: 15px;
75 - }
76 - }
77 -}
78 -
79 -.productCardDataWrapper {
80 - display: flex;
81 - flex-direction: column;
82 -
83 - @include media-breakpoint-down(sm) {
84 - flex-direction: column-reverse;
85 -
86 - & :global .title {
87 - margin: 2px 0 8px;
88 - }
89 -
90 - & :global .description {
91 - margin-top: 10px;
92 - }
93 - }
94 -}
95 -
96 -.productsCardTitle {
97 - text-transform: uppercase;
98 - margin-top: $spacer;
99 - letter-spacing: 0.1px;
100 - font-weight: $font-weight-normal;
101 - color: theme-color('dark');
102 -}
103 -
104 -.productsCardDescription {
105 - text-transform: capitalize;
106 - color: theme-color('inverce');
107 - margin: 1.5px 0;
108 -}
109 -
110 -.productsCardPrice {
111 - display: flex;
112 - font-size: $font-size-larger;
113 - font-weight: $font-weight-semi-bold;
114 - align-items: center;
115 - justify-content: space-between;
116 -
117 - .sale {
118 - font-weight: $font-weight-normal;
119 - }
120 -
121 - .old {
122 - color: $border-color;
123 - position: relative;
124 - margin-right: $spacer;
125 -
126 - &::before {
127 - content: '';
128 - width: 100%;
129 - height: 1px;
130 - left: 0;
131 - bottom: 0;
132 - transform: translateY(-10px);
133 - background-color: $border-color;
134 - position: absolute;
135 - }
136 -
137 - &::after {
138 - content: '';
139 - bottom: 2px;
140 - position: absolute;
141 - width: 1px;
142 - height: 15px;
143 - background-color: theme-color('light');
144 - margin: 0 7.5px;
145 - }
146 - }
147 -
148 - .new {
149 - color: theme-color('danger');
150 - font-weight: $font-weight-semi-bold;
151 - }
152 -
153 - & :global .rating {
154 - flex-direction: row-reverse;
155 -
156 - svg {
157 - margin-right: 7.5px;
158 - }
159 - }
160 -
161 - @include media-breakpoint-down(sm) {
162 - & :global .rating {
163 - display: none;
164 - }
165 - }
166 -}
1 -// Products photos
2 -import img1 from '../../images/products/img1.jpg';
3 -import img2 from '../../images/products/img2.jpg';
4 -import img3 from '../../images/products/img3.jpg';
5 -
6 -export default [
7 - {
8 - id: 0,
9 - img: img1,
10 - title: 'trainers',
11 - description: 'Trainers In White',
12 - price: 76,
13 - favourite: true,
14 - label: false,
15 - },
16 - {
17 - id: 1,
18 - img: img2,
19 - title: 'boots',
20 - description: 'Trainers In Blue',
21 - price: {
22 - old: 56,
23 - new: 45,
24 - percents: 20,
25 - },
26 - favourite: false,
27 - label: 'Sale',
28 - },
29 - {
30 - id: 2,
31 - img: img3,
32 - title: 'flat sandals',
33 - description: 'Trainers In White',
34 - price: 55,
35 - favourite: false,
36 - label: 'New',
37 - },
38 -];
1 -{
2 - "name": "products",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Products.js"
6 -}
...\ No newline at end of file ...\ No newline at end of file
1 -@import '../../styles/app';
2 -
3 -.root {
4 - // some styles
5 -}
6 -
7 -.profileContactContainer {
8 - margin-top: -75px;
9 -}
10 -
11 -.profileContacts {
12 - @include list-unstyled();
13 -
14 - display: inline-block;
15 - text-align: left;
16 -
17 - > li {
18 - margin-bottom: $spacer / 2;
19 - }
20 -
21 - > li > a {
22 - color: lighten($text-color, 30%);
23 - text-decoration: none;
24 -
25 - @include hover-focus {
26 - color: $text-color;
27 - }
28 - }
29 -}
30 -
31 -.profileAvatar {
32 - border: 3px solid $white;
33 -}
34 -
35 -.profileStat {
36 - border-left: none !important;
37 - padding-right: 0 !important;
38 -}
39 -
40 -.profileStatValue {
41 - font-size: 28px;
42 - font-weight: $font-weight-base !important;
43 - margin-bottom: 0;
44 -}
45 -
46 -.event {
47 - background: $white;
48 - border-radius: $border-radius;
49 - padding: 20px 20px 0;
50 - position: relative;
51 - margin-bottom: $spacer;
52 - box-shadow: var(--widget-shadow);
53 -}
54 -
55 -.eventTitle {
56 - margin-bottom: 2px;
57 - font-weight: $font-weight-semi-bold;
58 -
59 - a {
60 - text-decoration: none;
61 - color: #7ca9dd;
62 - }
63 -
64 - small > a {
65 - color: $text-muted;
66 - }
67 -}
68 -
69 -.eventAvatar {
70 - float: left;
71 - margin-right: $spacer;
72 -}
73 -
74 -.eventAvatar > img {
75 - width: 34px;
76 -}
77 -
78 -.eventBody {
79 - font-size: 0.9rem;
80 - margin-bottom: $spacer;
81 -}
82 -
83 -.eventFooter {
84 - background-color: $gray-100;
85 - margin: 20px -20px 0;
86 - padding: 10px 20px;
87 -}
88 -
89 -.eventTimestamp {
90 - color: $text-muted;
91 -}
1 -{
2 - "name": "profile",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Profile.js"
6 -}
1 -import React from 'react';
2 -import PropTypes from 'prop-types';
3 -import { withRouter, Redirect, Link } from 'react-router-dom';
4 -import { connect } from 'react-redux';
5 -import { Container, Alert, Button } from 'reactstrap';
6 -import Widget from '../../components/Widget';
7 -import { registerUser, registerError } from '../../actions/register';
8 -import { loginUser } from '../../actions/user';
9 -import microsoft from '../../images/microsoft.png';
10 -import Login from '../login';
11 -
12 -class Register extends React.Component {
13 - static propTypes = {
14 - dispatch: PropTypes.func.isRequired,
15 - };
16 -
17 - constructor(props) {
18 - super(props);
19 -
20 - this.state = {
21 - email: '',
22 - password: '',
23 - confirmPassword: ''
24 - };
25 -
26 - this.doRegister = this.doRegister.bind(this);
27 - this.googleLogin = this.googleLogin.bind(this);
28 - this.microsoftLogin = this.microsoftLogin.bind(this);
29 - this.changeEmail = this.changeEmail.bind(this);
30 - this.changePassword = this.changePassword.bind(this);
31 - this.changeConfirmPassword = this.changeConfirmPassword.bind(this);
32 - this.checkPassword = this.checkPassword.bind(this);
33 - this.isPasswordValid = this.isPasswordValid.bind(this);
34 - }
35 -
36 - changeEmail(event) {
37 - this.setState({email: event.target.value});
38 - }
39 -
40 - changePassword(event) {
41 - this.setState({password: event.target.value});
42 - }
43 -
44 - changeConfirmPassword(event) {
45 - this.setState({confirmPassword: event.target.value});
46 - }
47 -
48 - checkPassword() {
49 - if (!this.isPasswordValid()) {
50 - if (!this.state.password) {
51 - this.props.dispatch(registerError("Password field is empty"));
52 - } else {
53 - this.props.dispatch(registerError("Passwords are not equal"));
54 - }
55 - setTimeout(() => {
56 - this.props.dispatch(registerError());
57 - }, 3 * 1000)
58 - }
59 - }
60 -
61 - isPasswordValid() {
62 - return this.state.password && this.state.password === this.state.confirmPassword;
63 - }
64 -
65 - doRegister(e) {
66 - e.preventDefault();
67 - if (!this.isPasswordValid()) {
68 - this.checkPassword();
69 - } else {
70 - this.props.dispatch(registerUser({
71 - creds: {
72 - email: this.state.email,
73 - password: this.state.password
74 - },
75 - history: this.props.history
76 - }));
77 - }
78 - }
79 -
80 - googleLogin() {
81 - this.props.dispatch(loginUser({social: "google"}));
82 - }
83 -
84 - microsoftLogin() {
85 - this.props.dispatch(loginUser({social: "microsoft"}));
86 - }
87 -
88 - render() {
89 - const {from} = this.props.location.state || {from: {pathname: '/app'}}; // eslint-disable-line
90 -
91 - // cant access login page while logged in
92 - if (Login.isAuthenticated(localStorage.getItem('token'))) {
93 - return (
94 - <Redirect to={from}/>
95 - );
96 - }
97 -
98 - return (
99 - <div className="auth-page">
100 - <Container>
101 - <h5 className="auth-logo">
102 - <i className="fa fa-circle text-gray"/>
103 - Sing App
104 - <i className="fa fa-circle text-warning"/>
105 - </h5>
106 - <Widget className="widget-auth mx-auto" title={<h3 className="mt-0">Create an account</h3>}>
107 - <p className="widget-auth-info">
108 - Please fill all fields below
109 - </p>
110 - <form className="mt" onSubmit={this.doRegister}>
111 - {
112 - this.props.errorMessage && (
113 - <Alert className="alert-sm" color="danger">
114 - {this.props.errorMessage}
115 - </Alert>
116 - )
117 - }
118 - <div className="form-group">
119 - <input className="form-control no-border" value={this.state.email}
120 - onChange={this.changeEmail} type="text" required name="email"
121 - placeholder="Email"/>
122 - </div>
123 - <div className="form-group">
124 - <input className="form-control no-border" value={this.state.password}
125 - onChange={this.changePassword} type="password" required name="password"
126 - placeholder="Password"/>
127 - </div>
128 - <div className="form-group">
129 - <input className="form-control no-border" value={this.state.confirmPassword}
130 - onChange={this.changeConfirmPassword} onBlur={this.checkPassword} type="password" required name="confirmPassword"
131 - placeholder="Confirm"/>
132 - </div>
133 - <Button type="submit" color="inverse" className="auth-btn mb-3" size="sm">{this.props.isFetching ? 'Loading...' : 'Register'}</Button>
134 - <p className="widget-auth-info">or sign up with</p>
135 - <div className="social-buttons">
136 - <Button onClick={this.googleLogin} color="primary" className="social-button mb-2">
137 - <i className="social-icon social-google"/>
138 - <p className="social-text">GOOGLE</p>
139 - </Button>
140 - <Button onClick={this.microsoftLogin} color="success" className="social-button">
141 - <i className="social-icon social-microsoft"
142 - style={{backgroundImage: `url(${microsoft})`}}/>
143 - <p className="social-text">MICROSOFT</p>
144 - </Button>
145 - </div>
146 - </form>
147 - <p className="widget-auth-info">
148 - Already have the account? Login now!
149 - </p>
150 - <Link className="d-block text-center" to="login">Enter the account</Link>
151 - </Widget>
152 - </Container>
153 - <footer className="auth-footer">
154 - 2019 &copy; Sing App - React Admin Dashboard Template.
155 - </footer>
156 - </div>
157 - );
158 - }
159 -}
160 -
161 -function mapStateToProps(state) {
162 - return {
163 - isFetching: state.register.isFetching,
164 - errorMessage: state.register.errorMessage,
165 - };
166 -}
167 -
168 -export default withRouter(connect(mapStateToProps)(Register));
169 -
1 -{
2 - "name": "register",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Register.js"
6 -}
1 +import React, { PureComponent } from 'react';
2 +import { connect } from 'react-redux';
3 +import Widget from '../../components/Widget';
4 +
5 +class Subject extends PureComponent {
6 + async componentDidUpdate() {
7 + const isReceivingData = true;
8 + }
9 +
10 + render() {
11 + const isReceivingData = true;
12 +
13 + const display = isReceivingData ? 'none' : 'block';
14 + const style = {
15 + height: '1200px',
16 + display: display
17 + };
18 +
19 + return (
20 + <div>
21 + <h1 className="page-title mb-xlg mt-lg">Photo <small> registration</small></h1>
22 + <Widget
23 + title={<h5><span className="fw-semi-bold">registrate photos</span></h5>}
24 + fetchingData={true}>
25 + <div>
26 + <div className="text-center"style={style} />
27 + <p className="fs-mini text-muted">
28 + Stacked charts are excellent to track some dynamics within declared categories. An example of this
29 + can be seen above. To create a Stacked Bar chart use <code>Bar(options)</code> and
30 + set <code>stacked</code>, option to true.
31 + </p>
32 + </div>
33 + </Widget>
34 + </div>
35 + );
36 + }
37 +}
38 +
39 +function mapStateToProps(state) {
40 + return {
41 + labelData: state.labelData,
42 + }
43 +}
44 +
45 +export default connect(mapStateToProps)(Subject);
1 +{
2 + "name": "Subject",
3 + "version": "0.0.0",
4 + "private": true,
5 + "main": "./Subject.js"
6 +}
1 -import React from 'react';
2 -import {
3 - Breadcrumb,
4 - BreadcrumbItem,
5 - Progress,
6 - Dropdown,
7 - DropdownMenu,
8 - DropdownToggle,
9 - DropdownItem,
10 -} from 'reactstrap';
11 -
12 -import {
13 - BootstrapTable,
14 - TableHeaderColumn,
15 -} from 'react-bootstrap-table';
16 -
17 -import ReactTable from 'react-table';
18 -
19 -import { reactTableData, reactBootstrapTableData } from './data';
20 -import Widget from '../../../components/Widget';
21 -import s from './Dynamic.modules.scss';
22 -
23 -class Dynamic extends React.Component {
24 -
25 - constructor(props) {
26 - super(props);
27 -
28 - this.state = {
29 - reactTable: reactTableData(),
30 - reactBootstrapTable: reactBootstrapTableData(),
31 - };
32 - }
33 -
34 - renderSizePerPageDropDown = (props) => {
35 - const limits = [];
36 - props.sizePerPageList.forEach((limit) => {
37 - limits.push(<DropdownItem key={limit} onClick={() => props.changeSizePerPage(limit)}>{ limit }</DropdownItem>);
38 - });
39 -
40 - return (
41 - <Dropdown isOpen={props.open} toggle={props.toggleDropDown}>
42 - <DropdownToggle color="default" caret>
43 - { props.currSizePerPage }
44 - </DropdownToggle>
45 - <DropdownMenu>
46 - { limits }
47 - </DropdownMenu>
48 - </Dropdown>
49 - );
50 - };
51 -
52 - render() {
53 - const options = {
54 - sizePerPage: 10,
55 - paginationSize: 3,
56 - sizePerPageDropDown: this.renderSizePerPageDropDown,
57 - };
58 -
59 - function infoFormatter(cell) {
60 - return (
61 - <div>
62 - <small>
63 - Type:&nbsp;<span className="fw-semi-bold">{cell.type}</span>
64 - </small>
65 - <br />
66 - <small>
67 - Dimensions:&nbsp;<span className="fw-semi-bold">{cell.dimensions}</span>
68 - </small>
69 - </div>
70 - );
71 - }
72 -
73 - function descriptionFormatter(cell) {
74 - return (
75 - <button className="btn-link">
76 - {cell}
77 - </button>
78 - );
79 - }
80 -
81 - function progressFormatter(cell) {
82 - return (
83 - <Progress style={{ height: '15px' }} color={cell.type} value={cell.progress} />
84 - );
85 - }
86 -
87 - function progressSortFunc(a, b, order) {
88 - if (order === 'asc') {
89 - return a.status.progress - b.status.progress;
90 - }
91 - return b.status.progress - a.status.progress;
92 - }
93 -
94 - function dateSortFunc(a, b, order) {
95 - if (order === 'asc') {
96 - return new Date(a.date).getTime() - new Date(b.date).getTime();
97 - }
98 - return new Date(b.date).getTime() - new Date(a.date).getTime();
99 - }
100 -
101 - return (
102 - <div>
103 - <Breadcrumb>
104 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
105 - <BreadcrumbItem active>Tables Dynamic</BreadcrumbItem>
106 - </Breadcrumb>
107 - <h2 className="page-title">Tables - <span className="fw-semi-bold">Dynamic</span></h2>
108 - <Widget title={<h4>The <span className="fw-semi-bold">React</span> Way</h4>} collapse close>
109 - <p>
110 - Fully customizable Table. Built with <a href="https://allenfang.github.io/react-bootstrap-table/" target="_blank" rel="noopener noreferrer">react-bootstrap-table</a>
111 - </p>
112 - <BootstrapTable data={this.state.reactBootstrapTable} version="4" pagination options={options} search tableContainerClass={`table-striped table-hover ${s.bootstrapTable}`}>
113 - <TableHeaderColumn className="width-50" columnClassName="width-50" dataField="id" isKey>
114 - <span className="fs-sm">ID</span>
115 - </TableHeaderColumn>
116 - <TableHeaderColumn dataField="name" dataSort>
117 - <span className="fs-sm">Name</span>
118 - </TableHeaderColumn>
119 - <TableHeaderColumn className="d-none d-md-table-cell" columnClassName="d-none d-md-table-cell" dataField="info" dataFormat={infoFormatter}>
120 - <span className="fs-sm">Info</span>
121 - </TableHeaderColumn>
122 - <TableHeaderColumn className="d-none d-md-table-cell" columnClassName="d-none d-md-table-cell" dataField="description" dataFormat={descriptionFormatter}>
123 - <span className="fs-sm">Description</span>
124 - </TableHeaderColumn>
125 - <TableHeaderColumn className="d-none d-md-table-cell" columnClassName="d-none d-md-table-cell" dataField="date" dataSort sortFunc={dateSortFunc}>
126 - <span className="fs-sm">Date</span>
127 - </TableHeaderColumn>
128 - <TableHeaderColumn className="width-150" columnClassName="width-150" dataField="status" dataSort dataFormat={progressFormatter} sortFunc={progressSortFunc}>
129 - <span className="fs-sm">Status</span>
130 - </TableHeaderColumn>
131 - </BootstrapTable>
132 - </Widget>
133 - <Widget title={<h4>React <span className="fw-semi-bold">Table</span></h4>} collapse close>
134 - <p>
135 - Simple table extension with sorting, filtering and pagination for React apps. Built with <a href="https://react-table.js.org/" target="_blank" rel="noopener noreferrer">react-table</a>
136 - </p>
137 - <ReactTable
138 - data={this.state.reactTable}
139 - filterable
140 - columns={[
141 - {
142 - Header: 'NAME',
143 - accessor: 'name',
144 - },
145 - {
146 - Header: 'POSITION',
147 - accessor: 'position',
148 - },
149 - {
150 - Header: 'OFFICE',
151 - accessor: 'office',
152 - },
153 - {
154 - Header: 'EXT',
155 - accessor: 'ext',
156 - },
157 - {
158 - Header: 'START DATE',
159 - accessor: 'startDate',
160 - },
161 - {
162 - Header: 'SALARY',
163 - accessor: 'salary',
164 - },
165 - ]}
166 - defaultPageSize={10}
167 - className="-striped -highlight"
168 - />
169 - </Widget>
170 - </div>
171 - );
172 - }
173 -
174 -}
175 -
176 -export default Dynamic;
1 -{
2 - "name": "dynamic",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Dynamic.js"
6 -}
1 -@import '../../../styles/app';
2 -
3 -.root {
4 - // some styles
5 -}
1 -{
2 - "name": "static",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Static.js"
6 -}
1 -import React, { Component } from 'react';
2 -import cx from 'classnames';
3 -import {
4 - Row,
5 - Col,
6 - Breadcrumb,
7 - BreadcrumbItem,
8 - Alert,
9 -} from 'reactstrap';
10 -
11 -import Widget from '../../../components/Widget';
12 -
13 -class Alerts extends Component {
14 - state = {
15 - alerts: [{
16 - id: 'al-1',
17 - type: 'success',
18 - msg: '<span class="fw-semi-bold">Success:</span> You successfully read this important alert message.',
19 - visible: [true, true, true],
20 - }, {
21 - id: 'al-2',
22 - type: 'info',
23 - msg: '<span class="fw-semi-bold">Info:</span> This alert needs your attention, but it\'s not super important.',
24 - visible: [true, true, true],
25 - }, {
26 - id: 'al-3',
27 - type: 'warning',
28 - msg: '<span class="fw-semi-bold"><strong>Warning:</strong></span> Best check yo self, you\'re not looking too good.',
29 - visible: [true, true, true],
30 - }, {
31 - id: 'al-4',
32 - type: 'danger',
33 - msg: '<span class="fw-semi-bold">Danger:</span> Change this and that and try again. <a class="btn btn-default btn-xs float-right mr" href="#">Ignore</a> <a class="btn btn-danger btn-xs float-right mr-xs" href="#">Take this action</a>',
34 - visible: [true, true, true],
35 - }],
36 - }
37 -
38 - closeAlert(index, alertGroup) {
39 - const newAlerts = [...this.state.alerts];
40 - newAlerts[index].visible[alertGroup] = false;
41 -
42 - this.setState({ alerts: newAlerts });
43 - }
44 -
45 - render() {
46 - const { alerts } = this.state;
47 -
48 - return (
49 - <div>
50 - <Breadcrumb>
51 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
52 - <BreadcrumbItem active>UI Alerts</BreadcrumbItem>
53 - </Breadcrumb>
54 - <h1 className="page-title">Alerts</h1>
55 - <Row>
56 - <Col xs={12} md={8}>
57 - <Widget
58 - title={<h5>Alert <span className="fw-semi-bold">Messages</span></h5>}
59 - close collapse
60 - >
61 - <p>Alerts are available for any length of text, as well as an optional dismiss button.</p>
62 - {alerts.map((alert, index) => <Alert
63 - key={alert.id} isOpen={alert.visible[0]} toggle={() => this.closeAlert(index, 0)}
64 - color={alert.type}
65 - >
66 - <span dangerouslySetInnerHTML={{ __html: alert.msg }} />
67 - </Alert>)}
68 - </Widget>
69 - </Col>
70 - <Col xs={12} md={8}>
71 - <Widget
72 - title={<h5>Transparent <span className="fw-semi-bold">Alerts</span></h5>}
73 - close collapse
74 - >
75 - <p>Transparent alerts are available by adding <code>.alert-transparent</code> class.</p>
76 - {alerts.map((alert, index) => <Alert
77 - className="alert-transparent"
78 - key={alert.id} isOpen={alert.visible[1]} toggle={() => this.closeAlert(index, 1)}
79 - color={alert.type}
80 - >
81 - <span dangerouslySetInnerHTML={{ __html: alert.msg }} />
82 - </Alert>)}
83 - </Widget>
84 - </Col>
85 - <Col xs={12} md={8}>
86 - <Widget
87 - title={<h5>Rounded <span className="fw-semi-bold">Alerts</span></h5>}
88 - close collapse
89 - >
90 - <p>Rounded alerts are available by adding <code>.alert-rounded</code> class.</p>
91 - {alerts.map((alert, index) => <Alert
92 - className={cx('alert-rounded', { 'alert-transparent': index % 2 !== 1 })}
93 - key={alert.id} isOpen={alert.visible[2]} toggle={() => this.closeAlert(index, 2)}
94 - color={alert.type}
95 - >
96 - <span dangerouslySetInnerHTML={{ __html: alert.msg }} />
97 - </Alert>)}
98 - </Widget>
99 - </Col>
100 - <Col xs={12} md={8}>
101 - <Widget
102 - title={<h5>Additional <span className="fw-semi-bold">Content</span></h5>}
103 - close collapse
104 - >
105 - <p>Alerts can also contain additional HTML elements like headings, paragraphs and dividers.</p>
106 - <Alert color="success">
107 - <h4 className="alert-heading">Well done!</h4>
108 - <p>
109 - Aww yeah, you successfully read this important alert message. This example text is going
110 - to run a bit longer so that you can see how spacing within an alert works with this kind
111 - of content.
112 - </p>
113 - <hr />
114 - <p className="mb-0">
115 - Whenever you need to, be sure to use margin utilities to keep things nice and tidy.
116 - </p>
117 - </Alert>
118 - <Alert color="danger">
119 - <h4 className="alert-heading">Well done!</h4>
120 - <p>
121 - Aww yeah, you successfully read this important alert message. This example text is going
122 - to run a bit longer so that you can see how spacing within an alert works with this kind
123 - of content.
124 - </p>
125 - </Alert>
126 - </Widget>
127 - </Col>
128 - </Row>
129 - </div>
130 - );
131 - }
132 -}
133 -
134 -export default Alerts;
1 -{
2 - "name": "Alerts",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Alerts.js"
6 -}
1 -import React from 'react';
2 -import {
3 - Row,
4 - Col,
5 - Breadcrumb,
6 - BreadcrumbItem,
7 - Button,
8 - Badge,
9 -} from 'reactstrap';
10 -
11 -import Widget from '../../../components/Widget';
12 -
13 -const Badges = () => (
14 - <div>
15 - <Breadcrumb>
16 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
17 - <BreadcrumbItem active>UI Badge</BreadcrumbItem>
18 - </Breadcrumb>
19 - <h1 className="page-title">Badge</h1>
20 - <Row>
21 - <Col xs={12} md={8}>
22 - <Widget
23 - title={<h5>Badge <span className="fw-semi-bold">Example</span></h5>}
24 - close collapse
25 - >
26 - <p>
27 - Badges scale to match the size of the immediate parent element by
28 - using relative font sizing and em units.
29 - </p>
30 - <h1>Example heading <Badge color="primary">Primary</Badge></h1>
31 - <h2>Example heading <Badge color="info">Info</Badge></h2>
32 - <h3>Example heading <Badge color="warning">Warning</Badge></h3>
33 - <h4>Example heading <Badge color="success">Success</Badge></h4>
34 - <h5>Example heading <Badge color="danger">Danger</Badge></h5>
35 - <h6>Example heading <Badge color="secondary">Secondary</Badge></h6>
36 - <p>Badges can be used as part of links or buttons to provide a counter.</p>
37 - <Button color="primary">Notifications <Badge color="danger">4</Badge></Button>
38 - </Widget>
39 - </Col>
40 - <Col xs={12} md={8}>
41 - <Widget
42 - title={<h5>Pill <span className="fw-semi-bold">Badges</span></h5>}
43 - close collapse
44 - >
45 - <p>
46 - Use the <code>pill</code> property to make badges more rounded
47 - (with a larger border-radius and additional horizontal padding).
48 - </p>
49 - <Badge className="mr-xs" color="primary" pill>Primary</Badge>
50 - <Badge className="mr-xs" color="info" pill>Info</Badge>
51 - <Badge className="mr-xs" color="warning" pill>Warning</Badge>
52 - <Badge className="mr-xs" color="success" pill>Success</Badge>
53 - <Badge className="mr-xs" color="danger" pill>Danger</Badge>
54 - <Badge className="mr-xs" color="secondary" pill>Secondary</Badge>
55 - <Badge className="mr-xs" color="light" pill>Light</Badge>
56 - <Badge className="mr-xs" color="dark" pill>Dark</Badge>
57 - </Widget>
58 - </Col>
59 - <Col xs={12} md={8}>
60 - <Widget
61 - title={<h5>Pill <span className="fw-semi-bold">Badges</span></h5>}
62 - close collapse
63 - >
64 - <p>
65 - Using the contextual <code>href=&quot;&#35;&quot;</code> classes on
66 - an <code>&lt;Badge&gt;</code> element quickly provide actionable badges with hover and focus states.
67 - </p>
68 - <Badge className="mr-xs" href="#" color="primary">Primary</Badge>
69 - <Badge className="mr-xs" href="#" color="info">Info</Badge>
70 - <Badge className="mr-xs" href="#" color="warning">Warning</Badge>
71 - <Badge className="mr-xs" href="#" color="success">Success</Badge>
72 - <Badge className="mr-xs" href="#" color="danger">Danger</Badge>
73 - <Badge className="mr-xs" href="#" color="secondary">Secondary</Badge>
74 - <Badge className="mr-xs" href="#" color="light">Light</Badge>
75 - <Badge className="mr-xs" href="#" color="dark">Dark</Badge>
76 - </Widget>
77 - </Col>
78 - </Row>
79 - </div>
80 -);
81 -
82 -export default Badges;
1 -{
2 - "name": "Badge",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Badge.js"
6 -}
1 -{
2 - "name": "UIButtons",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Buttons.js"
6 -}
1 -import React from 'react';
2 -import {
3 - Row,
4 - Col,
5 - Breadcrumb,
6 - BreadcrumbItem,
7 - Button,
8 - Badge,
9 - Card,
10 - CardBody,
11 - CardTitle,
12 - CardText,
13 - CardImg,
14 -} from 'reactstrap';
15 -
16 -import lifestyleImg from '../../../images/cards/lifestyle.jpg';
17 -import isometricImg from '../../../images/cards/isometric.jpg';
18 -import mountainsImg from '../../../images/cards/mountains.jpeg';
19 -import reactnativeImg from '../../../images/cards/rns.png';
20 -
21 -
22 -const Cards = () => (
23 - <div>
24 - <Breadcrumb>
25 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
26 - <BreadcrumbItem active>UI Card</BreadcrumbItem>
27 - </Breadcrumb>
28 - <h1 className="page-title">Cards - <span className="fw-semi-bold">Examples</span></h1>
29 - <p>
30 - A card is a flexible and extensible content container. It includes options for headers and footers,
31 - a wide variety of content, contextual background colors, and powerful display options. If youre
32 - familiar with Bootstrap 3, cards replace its old panels, wells, and thumbnails. Similar functionality
33 - to those components is available as modifier classes for cards.
34 - </p>
35 - <Row>
36 - <Col>
37 - <Card
38 - className="background-cover border-0 mb-xlg"
39 - style={{ backgroundImage: `url(${lifestyleImg})` }}
40 - >
41 - <CardBody className="text-white">
42 - <span>13 Mar</span>
43 - <h3 className="mt-lg">Lifestyle brand</h3>
44 - <p className="w-75">A lifestyle brand is a company that markets its products or services to embody the
45 - interests, attitudes, and opinions of a group or a culture. Lifestyle brands
46 - seek to inspire, guide, and motivate people, with the goal of their products
47 - contributing to the definition of the consumer&apos;s way of life.</p>
48 - <Button className="btn-rounded-f mt-lg" color="danger">Full Article</Button>
49 - </CardBody>
50 - </Card>
51 - </Col>
52 - </Row>
53 - <Row>
54 - <Col xs={12} sm={6} md={4}>
55 - <Card className="border-0 mb-xlg">
56 - <CardImg top width="100%" src={isometricImg} alt="Card image cap" />
57 - <CardBody>
58 - <CardTitle>Isometric design</CardTitle>
59 - <CardText>
60 - Isometric projection is a method for visually representing three-dimensional in two
61 - dimensions in technical and engineering drawings.
62 - </CardText>
63 - <div className="w-100 text-center">
64 - <Button className="btn-rounded-f" color="primary">Full Article</Button>
65 - </div>
66 - </CardBody>
67 - </Card>
68 - </Col>
69 - <Col xs={12} sm={6} md={4}>
70 - <Card className="mb-xlg border-0">
71 - <CardBody>
72 - <button className="btn-link fw-semi-bold text-success">Avg Rating</button>
73 - <button className="btn-link fw-semi-bold text-muted ml-sm">All Time</button>
74 - <hr />
75 - <div className="d-flex justify-content-between mb-lg">
76 - <div className="text-warning">
77 - <i className="fa fa-star mr-xs" />
78 - <i className="fa fa-star mr-xs" />
79 - <i className="fa fa-star mr-xs" />
80 - <i className="fa fa-star mr-xs" />
81 - <i className="fa fa-star" />
82 - </div>
83 - <span className="text-muted"><small>342 REVIEWS</small></span>
84 - </div>
85 - <div className="mb-lg">
86 - <h3 className="text-success mb-0">69%</h3>
87 - of customers recomend this product
88 - </div>
89 - <Button className="btn-rounded-f" color="success">Write a Review</Button>
90 - </CardBody>
91 - </Card>
92 - <Card className="mb-xlg border-0" style={{ position: 'relative' }}>
93 - <CardImg top width="100%" src={mountainsImg} alt="Card image cap" />
94 - <Badge className="mt-lg fw-thin rounded-0" color="success" style={{ position: 'absolute' }}>New</Badge>
95 - <CardBody>
96 - <CardTitle>Weekly Inspiration</CardTitle>
97 - <hr />
98 - <CardText>
99 - There are at least 109 mountains on Earts with elevations greeter than 7,200 meters
100 - </CardText>
101 - <Button className="border-0" color="default">Read More</Button>
102 - </CardBody>
103 - </Card>
104 - </Col>
105 - <Col xs={12} sm={6} md={4}>
106 - <Card className="border-0">
107 - <CardImg top width="100%" src={reactnativeImg} alt="Card image cap" />
108 - <CardBody>
109 - <small>Technology</small><br />
110 - <CardTitle className="mb mt-xs">
111 - React Native Starter
112 - </CardTitle>
113 - <hr />
114 - <div className="w-100 d-flex justify-content-between align-items-center">
115 - <span className="text-muted fw-semi-bold">from $49.95</span>
116 - <Button color="info">Read more</Button>
117 - </div>
118 - </CardBody>
119 - </Card>
120 - </Col>
121 - </Row>
122 - </div>
123 -);
124 -
125 -export default Cards;
1 -{
2 - "name": "Card",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Card.js"
6 -}
1 -import React from 'react';
2 -import {
3 - Row,
4 - Col,
5 - Breadcrumb,
6 - BreadcrumbItem,
7 - UncontrolledCarousel,
8 -} from 'reactstrap';
9 -
10 -import firstSlide from '../../../images/slides/1.jpg';
11 -import secondSlide from '../../../images/slides/2.jpg';
12 -import thirdSlide from '../../../images/slides/3.jpg';
13 -
14 -const carouselItems = [
15 - { src: firstSlide, caption: '' },
16 - { src: secondSlide, caption: '' },
17 - { src: thirdSlide, caption: '' },
18 -];
19 -
20 -const Carousel = () => (
21 - <div>
22 - <Breadcrumb>
23 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
24 - <BreadcrumbItem active>UI Carousel</BreadcrumbItem>
25 - </Breadcrumb>
26 - <p>
27 - The carousel is a slideshow for cycling through a series of content, built with
28 - CSS 3D transforms and a bit of JavaScript. It works with a series of images, text,
29 - or custom markup. It also includes support for previous/next controls and indicators.
30 - </p>
31 - <Row>
32 - <Col>
33 - <UncontrolledCarousel captionTex={null} items={carouselItems} />
34 - </Col>
35 - </Row>
36 - </div>
37 -);
38 -
39 -export default Carousel;
1 -{
2 - "name": "Carousel",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Carousel.js"
6 -}
1 -{
2 - "name": "UIIcons",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Icons.js"
6 -}
1 -import React from 'react';
2 -import {
3 - Row,
4 - Col,
5 - Breadcrumb,
6 - BreadcrumbItem,
7 - Button,
8 - Jumbotron,
9 - Container,
10 -} from 'reactstrap';
11 -
12 -const Jumb = () => (
13 - <div>
14 - <Breadcrumb>
15 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
16 - <BreadcrumbItem active>UI Jumbotron</BreadcrumbItem>
17 - </Breadcrumb>
18 - <Jumbotron fluid>
19 - <Container fluid>
20 - <h1 className="display-3">Fluid jumbotron</h1>
21 - <p className="lead">This is a modified jumbotron that occupies the entire horizontal space of its parent.</p>
22 - </Container>
23 - </Jumbotron>
24 - <Row>
25 - <Col xs={12} md={8}>
26 - <Jumbotron>
27 - <h1 className="display-3">Hello, world!</h1>
28 - <p className="lead">This is a simple hero unit, a simple Jumbotron-style component for calling extra attention to featured content or information.</p>
29 - <hr className="my-2" />
30 - <p>It uses utility classes for typgraphy and spacing to space content out within the larger container.</p>
31 - <p className="lead">
32 - <Button color="primary">Learn More</Button>
33 - </p>
34 - </Jumbotron>
35 - </Col>
36 - </Row>
37 - </div>
38 -);
39 -
40 -export default Jumb;
1 -{
2 - "name": "Jumbotron",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Jumbotron.js"
6 -}
1 -import React from 'react';
2 -import {
3 - Row, Col,
4 -} from 'reactstrap';
5 -import { SortableContainer, SortableElement, arrayMove } from 'react-sortable-hoc';
6 -import SortableTree from 'react-sortable-tree';
7 -
8 -import Widget from '../../../components/Widget';
9 -
10 -import './ListGroups.scss';
11 -
12 -const SortableItem = SortableElement(({ value }) => <li className="list-group-item">
13 - <i className="fa fa-sort" />
14 - <button className="close flex-last ml-auto" data-dismiss="alert">&times;</button>
15 - &nbsp;&nbsp;&nbsp; {value.id} &nbsp;&nbsp;&nbsp;
16 - {value.text}
17 -</li>);
18 -
19 -
20 -const SortableList = SortableContainer(({ items }) => (
21 - <ul className="list-group list-group-sortable mt-xs">
22 - {items.map((value, index) => (
23 - <SortableItem key={`item-${index.toString()}`} index={index} value={value} />
24 - ))}
25 - </ul>
26 - ));
27 -
28 -const NestableItem = SortableElement(({ value }) => {
29 - if (value.children) {
30 - return (
31 - <li className="dd-item">
32 - <div className="dd-handle" data-id={value.id}> {value.text} </div>
33 - <ol className="dd-list">
34 - {value.children.map((child, index) => (
35 - <NestableItem key={`nest-${index.toString()}`} index={index} value={child} />
36 - ))}
37 - </ol>
38 - </li>);
39 - }
40 - return (
41 - <li className="dd-item">
42 - <div className="dd-handle" data-id={value.id}> {value.text} </div>
43 - </li>
44 - );
45 -});
46 -
47 -class ListGroups extends React.Component {
48 -
49 - constructor() {
50 - super();
51 - this.state = {
52 - nestableFirstItems: [{ id: 1, title: 'Item 1' }, {
53 - id: 2,
54 - expanded: true,
55 - title: 'Item 2',
56 - children: [{ id: 3, title: 'Item 3' }, { id: 4, title: 'Item 4' }, {
57 - id: 5,
58 - title: 'Item 5',
59 - expanded: true,
60 - children: [{ id: 6, title: 'Item 6' }, {
61 - id: 7, title: 'Item 7',
62 - }, {
63 - id: 8, title: 'Item 8',
64 - }],
65 - }, { id: 9, title: 'Item 9' }],
66 - }],
67 - nestableSecondItems: [{ id: 13, title: 'Item 13' }, { id: 14, title: 'Item 14' }, {
68 - id: 15,
69 - expanded: true,
70 - title: 'Item 15',
71 - children: [{ id: 16, title: 'Item 16' }, { id: 17, title: 'Item 17' }, {
72 - id: 18, title: 'Item 18',
73 - }],
74 -
75 - }],
76 - sortableList: [{
77 - id: '03', text: ' Barnard\'s Star',
78 - }, {
79 - id: '01', text: 'The Sun',
80 - }, {
81 - id: '04', text: 'Wolf 359',
82 - }, {
83 - id: '02', text: 'Proxima Centauri',
84 - }, {
85 - id: '05', text: 'Lalande 21185',
86 - }],
87 - };
88 - }
89 -
90 - onSortEnd = ({ oldIndex, newIndex }) => {
91 - this.setState({
92 - sortableList: arrayMove(this.state.sortableList, oldIndex, newIndex),
93 - });
94 - };
95 -
96 - render() {
97 - return (
98 - <div>
99 - <ol className="breadcrumb">
100 - <li className="breadcrumb-item">YOU ARE HERE</li>
101 - <li className="breadcrumb-item active">UI List Groups</li>
102 - </ol>
103 - <h1 className="page-title">Lists - <span className="fw-semi-bold">Sortable Groups</span>
104 - </h1>
105 - <Widget
106 - title={<h4> Grouped <span className="fw-semi-bold">Lists</span></h4>}
107 - close refresh settings
108 - >
109 - <h3>Closest <span className="fw-semi-bold">Stars</span></h3>
110 - <p>
111 - Try to play around with this list. Are you ready to pass an exam on astronomy?
112 - </p>
113 -
114 - <SortableList items={this.state.sortableList} onSortEnd={this.onSortEnd} />
115 - </Widget>
116 -
117 - <Widget
118 - title={<h3>Nestable <span className="fw-semi-bold">List</span></h3>}
119 - close refresh settings
120 - >
121 - <p className="fs-mini">
122 - There is a scientific theory that you can arrange this list in such way that there will
123 - be no more saddness
124 - in the whole world. Can you? Touch devices supported
125 - </p>
126 - <Row className="nestable">
127 - <Col md="6" xs="12" className="mb-xs">
128 - <SortableTree
129 - treeData={this.state.nestableFirstItems}
130 - onChange={nestableFirstItems => this.setState({ nestableFirstItems })}
131 - />
132 - </Col>
133 - <Col md="6">
134 - <SortableTree
135 - treeData={this.state.nestableSecondItems}
136 - onChange={nestableSecondItems => this.setState({ nestableSecondItems })}
137 - />
138 - </Col>
139 - </Row>
140 - </Widget>
141 -
142 - </div>
143 - );
144 - }
145 -
146 -}
147 -
148 -export default ListGroups;
1 -{
2 - "name": "UIListGroups",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./ListGroups.js"
6 -}
1 -{
2 - "name": "Modal",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Modal.js"
6 -}
1 -import React, { Component } from 'react';
2 -import {
3 - Row,
4 - Col,
5 - Breadcrumb,
6 - BreadcrumbItem,
7 - Nav,
8 - NavItem,
9 - NavLink,
10 - Dropdown,
11 - DropdownToggle,
12 - DropdownMenu,
13 - DropdownItem,
14 -} from 'reactstrap';
15 -
16 -import Widget from '../../../components/Widget';
17 -
18 -class NavExamples extends Component {
19 - state = {
20 - isDropdownOpened: false,
21 - };
22 -
23 - toggleDropdown = () => {
24 - this.setState(prevState => ({
25 - isDropdownOpened: !prevState.isDropdownOpened,
26 - }));
27 - }
28 -
29 - render() {
30 - return (
31 - <div>
32 - <Breadcrumb>
33 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
34 - <BreadcrumbItem active>UI Nav</BreadcrumbItem>
35 - </Breadcrumb>
36 - <Row>
37 - <Col xs={12} md={6}>
38 - <Widget
39 - title={<h5>Base <span className="fw-semi-bold">Nav</span></h5>}
40 - close collapse
41 - >
42 - <p>
43 - Navigation available in Bootstrap share general markup and styles,
44 - from the base .nav class to the active and disabled states. Swap
45 - modifier classes to switch between each style.
46 - </p>
47 - <div className="bg-light p-3">
48 - <Nav>
49 - <NavItem>
50 - <NavLink href="#">Link</NavLink>
51 - </NavItem>
52 - <NavItem>
53 - <NavLink href="#">Link</NavLink>
54 - </NavItem>
55 - <NavItem>
56 - <NavLink href="#">Another Link</NavLink>
57 - </NavItem>
58 - <NavItem>
59 - <NavLink disabled href="#">Disabled Link</NavLink>
60 - </NavItem>
61 - </Nav>
62 - <pre className="bg-light border-0 w-100 h-100">
63 - <code className="text-danger">{'<Nav>\n'}</code>
64 - <code className="text-info">{' <NavItem>\n'}</code>
65 - <code className="text-warning">{' <NavLink href="#">\n'}</code>
66 - <code>{' Link\n'}</code>
67 - <code className="text-warning">{' </NavLink>\n'}</code>
68 - <code className="text-info">{' </NavItem>\n'}</code>
69 -
70 - <code className="text-info">{' <NavItem>\n'}</code>
71 - <code className="text-warning">{' <NavLink href="#">\n'}</code>
72 - <code>{' Link\n'}</code>
73 - <code className="text-warning">{' </NavLink>\n'}</code>
74 - <code className="text-info">{' </NavItem>\n'}</code>
75 -
76 - <code className="text-info">{' <NavItem>\n'}</code>
77 - <code className="text-warning">{' <NavLink href="#">\n'}</code>
78 - <code>{' Another Link\n'}</code>
79 - <code className="text-warning">{' </NavLink>\n'}</code>
80 - <code className="text-info">{' </NavItem>\n'}</code>
81 -
82 - <code className="text-info">{' <NavItem>\n'}</code>
83 - <code className="text-warning">{' <NavLink disabled href="#">\n'}</code>
84 - <code>{' Disabled Link\n'}</code>
85 - <code className="text-warning">{' </NavLink>\n'}</code>
86 - <code className="text-info">{' </NavItem>\n'}</code>
87 - <code className="text-danger">{'</Nav>'}</code>
88 - </pre>
89 - </div>
90 - <h5 className="mt">With dropdown</h5>
91 - <Nav className="bg-light p-2">
92 - <NavItem>
93 - <NavLink href="#">Link</NavLink>
94 - </NavItem>
95 - <Dropdown isOpen={this.state.isDropdownOpened} toggle={this.toggleDropdown}>
96 - <DropdownToggle nav caret>
97 - Dropdown
98 - </DropdownToggle>
99 - <DropdownMenu>
100 - <DropdownItem header>Header</DropdownItem>
101 - <DropdownItem disabled>Action</DropdownItem>
102 - <DropdownItem>Another Action</DropdownItem>
103 - <DropdownItem divider />
104 - <DropdownItem>Another Action</DropdownItem>
105 - </DropdownMenu>
106 - </Dropdown>
107 - <NavItem>
108 - <NavLink href="#">Another Link</NavLink>
109 - </NavItem>
110 - <NavItem>
111 - <NavLink disabled href="#">Disabled Link</NavLink>
112 - </NavItem>
113 - </Nav>
114 - </Widget>
115 - </Col>
116 - <Col xs={12} md={6}>
117 - <Widget
118 - title={<h5>Tabs & Pills</h5>}
119 - close collapse
120 - >
121 - <p>
122 - Takes the basic <code>&lt;Nav&gt;</code> from above and adds the <code>tabs</code> property to generate a
123 - tabbed interface. Use them to create tabbable regions with our tab
124 - JavaScript plugin.
125 - </p>
126 - <div className="bg-light p-3">
127 - <Nav tabs>
128 - <NavItem>
129 - <NavLink href="#" active>Link</NavLink>
130 - </NavItem>
131 - <NavItem>
132 - <NavLink href="#">Link</NavLink>
133 - </NavItem>
134 - <NavItem>
135 - <NavLink href="#">Another Link</NavLink>
136 - </NavItem>
137 - <NavItem>
138 - <NavLink disabled href="#">Disabled Link</NavLink>
139 - </NavItem>
140 - </Nav>
141 - <pre className="bg-light border-0 w-100 h-100">
142 - <code className="text-danger">{'<Nav tabs>\n'}</code>
143 - <code className="text-info">{' <NavItem>\n'}</code>
144 - <code className="text-warning">{' <NavLink href="#">\n'}</code>
145 - <code>{' Link\n'}</code>
146 - <code className="text-warning">{' </NavLink>\n'}</code>
147 - <code className="text-info">{' </NavItem>\n'}</code>
148 -
149 - <code className="text-info">{' <NavItem>\n'}</code>
150 - <code className="text-warning">{' <NavLink href="#">\n'}</code>
151 - <code>{' Link\n'}</code>
152 - <code className="text-warning">{' </NavLink>\n'}</code>
153 - <code className="text-info">{' </NavItem>\n'}</code>
154 -
155 - <code className="text-info">{' <NavItem>\n'}</code>
156 - <code className="text-warning">{' <NavLink href="#">\n'}</code>
157 - <code>{' Another Link\n'}</code>
158 - <code className="text-warning">{' </NavLink>\n'}</code>
159 - <code className="text-info">{' </NavItem>\n'}</code>
160 -
161 - <code className="text-info">{' <NavItem>\n'}</code>
162 - <code className="text-warning">{' <NavLink disabled href="#">\n'}</code>
163 - <code>{' Disabled Link\n'}</code>
164 - <code className="text-warning">{' </NavLink>\n'}</code>
165 - <code className="text-info">{' </NavItem>\n'}</code>
166 - <code className="text-danger">{'</Nav>'}</code>
167 - </pre>
168 - </div>
169 - <p className="mt">Do the same thing with the <code>pills</code> property.</p>
170 - <div className="bg-light p-3">
171 - <Nav pills>
172 - <NavItem>
173 - <NavLink href="#" active>Link</NavLink>
174 - </NavItem>
175 - <NavItem>
176 - <NavLink href="#">Link</NavLink>
177 - </NavItem>
178 - <NavItem>
179 - <NavLink href="#">Another Link</NavLink>
180 - </NavItem>
181 - <NavItem>
182 - <NavLink disabled href="#">Disabled Link</NavLink>
183 - </NavItem>
184 - </Nav>
185 - </div>
186 - </Widget>
187 - </Col>
188 - </Row>
189 - </div>
190 - );
191 - }
192 -}
193 -
194 -export default NavExamples;
1 -{
2 - "name": "Nav",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Nav.js"
6 -}
1 -import React, { Component } from 'react';
2 -import {
3 - Row,
4 - Col,
5 - Breadcrumb,
6 - BreadcrumbItem,
7 - Navbar,
8 - NavbarBrand,
9 - NavbarToggler,
10 - Collapse,
11 - Nav,
12 - NavItem,
13 - NavLink,
14 -} from 'reactstrap';
15 -
16 -import Widget from '../../../components/Widget';
17 -
18 -class NavbarExamples extends Component {
19 - state = {
20 - navs: [false, false, false, false],
21 - }
22 -
23 - toggle(id) {
24 - const newState = Array(4).fill(false);
25 -
26 - if (!this.state.navs[id]) {
27 - newState[id] = true;
28 - }
29 -
30 - this.setState({ navs: newState });
31 - }
32 - render() {
33 - return (
34 - <div>
35 - <Breadcrumb>
36 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
37 - <BreadcrumbItem active>UI Navbar</BreadcrumbItem>
38 - </Breadcrumb>
39 - <Row>
40 - <Col xs={12} md={9}>
41 - <Widget
42 - title={<h5>Navbar <span className="fw-semi-bold">Example</span></h5>}
43 - close collapse
44 - >
45 - <p>Heres what you need to know before getting started with the navbar:</p>
46 - <ui>
47 - <li>Navbars require a wrapping <code>&lt;Navbar&gt;</code> with <code>expand=&quot;*&quot;</code> for
48 - responsive collapsing and color scheme classes.</li>
49 - <li>Navbars and their contents are fluid by default. Use optional containers
50 - to limit their horizontal width.</li>
51 - <li>Use our spacing and flex utility classes for controlling spacing and alignment within navbars.</li>
52 - <li>Navbars are responsive by default, but you can easily modify them to change that. Responsive
53 - behavior depends on our Collapse JavaScript plugin.</li>
54 - <li>Navbars are hidden by default when printing. Force them to be printed by adding <code>.d-print</code>
55 - to the <code>.navbar</code>. See the display utility class.</li>
56 - </ui>
57 - <Navbar className="px-2 mt-lg" color="light" light expand="md">
58 - <NavbarBrand href="/">Navbar</NavbarBrand>
59 - <NavbarToggler className="ml-auto" onClick={() => this.toggle(0)} />
60 - <Collapse isOpen={this.state.navs[0]} navbar>
61 - <Nav className="ml-auto" navbar>
62 - <NavItem>
63 - <NavLink>Home</NavLink>
64 - </NavItem>
65 - <NavItem>
66 - <NavLink>Features</NavLink>
67 - </NavItem>
68 - <NavItem>
69 - <NavLink>Pricing</NavLink>
70 - </NavItem>
71 - <NavItem>
72 - <NavLink disabled>Disabled</NavLink>
73 - </NavItem>
74 - </Nav>
75 - </Collapse>
76 - </Navbar>
77 - </Widget>
78 - </Col>
79 - <Col xs={12} md={9}>
80 - <Widget
81 - title={<h5>Navbar <span className="fw-semi-bold">Example</span></h5>}
82 - close collapse
83 - >
84 - <p>Theming the navbar has never been easier thanks to the combination of
85 - theming classes and background-color utilities. Choose from <code>color=&quot;light&quot;</code>
86 - for use with light background colors, or <code>color=&quot;dark&quot;</code> for dark background
87 - colors. Then, customize with <code>.bg-*</code> utilities.</p>
88 - <Navbar className="px-2 mt-lg" color="dark" dark expand="md">
89 - <NavbarBrand href="/">Navbar</NavbarBrand>
90 - <NavbarToggler className="ml-auto" onClick={() => this.toggle(1)} />
91 - <Collapse isOpen={this.state.navs[1]} navbar>
92 - <Nav className="ml-auto" navbar>
93 - <NavItem>
94 - <NavLink>Home</NavLink>
95 - </NavItem>
96 - <NavItem>
97 - <NavLink>Features</NavLink>
98 - </NavItem>
99 - <NavItem>
100 - <NavLink>Pricing</NavLink>
101 - </NavItem>
102 - <NavItem>
103 - <NavLink disabled>Disabled</NavLink>
104 - </NavItem>
105 - </Nav>
106 - </Collapse>
107 - </Navbar>
108 - <Navbar className="px-2 mt-lg" color="primary" dark expand="md">
109 - <NavbarBrand href="/">Navbar</NavbarBrand>
110 - <NavbarToggler className="ml-auto" onClick={() => this.toggle(2)} />
111 - <Collapse isOpen={this.state.navs[2]} navbar>
112 - <Nav className="ml-auto" navbar>
113 - <NavItem>
114 - <NavLink>Home</NavLink>
115 - </NavItem>
116 - <NavItem>
117 - <NavLink>Features</NavLink>
118 - </NavItem>
119 - <NavItem>
120 - <NavLink>Pricing</NavLink>
121 - </NavItem>
122 - <NavItem>
123 - <NavLink disabled>Disabled</NavLink>
124 - </NavItem>
125 - </Nav>
126 - </Collapse>
127 - </Navbar>
128 - <Navbar className="px-2 mt-lg" color="light" light expand="md">
129 - <NavbarBrand href="/">Navbar</NavbarBrand>
130 - <NavbarToggler className="ml-auto" onClick={() => this.toggle(3)} />
131 - <Collapse isOpen={this.state.navs[3]} navbar>
132 - <Nav className="ml-auto" navbar>
133 - <NavItem>
134 - <NavLink>Home</NavLink>
135 - </NavItem>
136 - <NavItem>
137 - <NavLink>Features</NavLink>
138 - </NavItem>
139 - <NavItem>
140 - <NavLink>Pricing</NavLink>
141 - </NavItem>
142 - <NavItem>
143 - <NavLink disabled>Disabled</NavLink>
144 - </NavItem>
145 - </Nav>
146 - </Collapse>
147 - </Navbar>
148 - </Widget>
149 - </Col>
150 - </Row>
151 - </div>
152 - );
153 - }
154 -}
155 -
156 -export default NavbarExamples;
1 -{
2 - "name": "Navbar",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Navbar.js"
6 -}
1 -import React from 'react';
2 -import {
3 - Row, Col, Button,
4 -} from 'reactstrap';
5 -/* eslint-disable */
6 -import 'imports-loader?$=jquery,this=>window!messenger/build/js/messenger';
7 -/* eslint-enable */
8 -
9 -import Widget from '../../../components/Widget';
10 -import s from './Notifications.module.scss';
11 -
12 -// todo @franckeeva what about server side rendering? this will fail unless launched as lazy route
13 -const Messenger = window.Messenger;
14 -
15 -/* eslint-disable */
16 -function initializationMessengerCode() {
17 - (function () {
18 - let $,
19 - FlatMessage,
20 - spinner_template,
21 - __hasProp = {}.hasOwnProperty,
22 - __extends = function (child, parent) {
23 - for (const key in parent) {
24 - if (__hasProp.call(parent, key)) child[key] = parent[key];
25 - }
26 -
27 - function ctor() {
28 - this.constructor = child;
29 - }
30 -
31 - ctor.prototype = parent.prototype;
32 - child.prototype = new ctor();
33 - child.__super__ = parent.prototype;
34 - return child;
35 - };
36 -
37 - $ = jQuery;
38 -
39 - spinner_template = '<div class="messenger-spinner">\n <span class="messenger-spinner-side messenger-spinner-side-left">\n <span class="messenger-spinner-fill"></span>\n </span>\n <span class="messenger-spinner-side messenger-spinner-side-right">\n <span class="messenger-spinner-fill"></span>\n </span>\n</div>';
40 -
41 - FlatMessage = (function (_super) {
42 - __extends(FlatMessage, _super);
43 -
44 - function FlatMessage() {
45 - return FlatMessage.__super__.constructor.apply(this, arguments);
46 - }
47 -
48 - FlatMessage.prototype.template = function (opts) {
49 - let $message;
50 - $message = FlatMessage.__super__.template.apply(this, arguments);
51 - $message.append($(spinner_template));
52 - return $message;
53 - };
54 -
55 - return FlatMessage;
56 - }(Messenger.Message));
57 -
58 - Messenger.themes.air = {
59 - Message: FlatMessage,
60 - };
61 - }).call(window);
62 -}
63 -/* eslint-enable */
64 -
65 -class Notifications extends React.Component {
66 - constructor() {
67 - super();
68 - this.addSuccessNotification = this.addSuccessNotification.bind(this);
69 - this.addInfoNotification = this.addInfoNotification.bind(this);
70 - this.addErrorNotification = this.addErrorNotification.bind(this);
71 - this.toggleLocation = this.toggleLocation.bind(this);
72 - this.state = {
73 - locationClasses: 'messenger-fixed messenger-on-bottom messenger-on-right',
74 - };
75 - }
76 -
77 -
78 - componentDidMount() {
79 - initializationMessengerCode();
80 - Messenger.options = {
81 - extraClasses: this.state.locationClasses,
82 - theme: 'air',
83 - };
84 - Messenger().post('Thanks for checking out Messenger!');
85 - }
86 -
87 - addSuccessNotification() {
88 - Messenger().post({
89 - extraClasses: this.state.locationClasses,
90 - message: 'Showing success message was successful!',
91 - type: 'success',
92 - showCloseButton: true,
93 - });
94 - return false;
95 - }
96 -
97 - addInfoNotification() {
98 - const msg = Messenger().post({
99 - extraClasses: this.state.locationClasses,
100 - message: 'Launching thermonuclear war...',
101 - actions: {
102 - cancel: {
103 - label: 'cancel launch',
104 - action: () => msg.update({
105 - message: 'Thermonuclear war averted', type: 'success', actions: false,
106 - }),
107 - },
108 - },
109 - });
110 -
111 - return false;
112 - }
113 -
114 - addErrorNotification() {
115 - let i = 0;
116 - Messenger().run({
117 - errorMessage: 'Error destroying alien planet',
118 - successMessage: 'Alien planet destroyed!',
119 - extraClasses: this.state.locationClasses,
120 - action(opts) {
121 - /* eslint-disable */
122 - if (++i < 3) {
123 - return opts.error({
124 - status: 500,
125 - readyState: 0,
126 - responseText: 0,
127 - });
128 - }
129 - /* eslint-enable */
130 - return opts.success();
131 - },
132 - });
133 - }
134 -
135 - toggleLocation(vertical = 'top', horizontal = '') {
136 - let className = `messenger-fixed messenger-on-${vertical}`;
137 - className += (horizontal === '') ? '' : ` messenger-on-${horizontal}`;
138 - this.setState({
139 - locationClasses: className,
140 - });
141 - Messenger.options = {
142 - extraClasses: className,
143 - theme: 'air',
144 - };
145 - Messenger();
146 - }
147 -
148 - render() {
149 - return (
150 - <div className={s.root}>
151 - <ol className="breadcrumb">
152 - <li className="breadcrumb-item">YOU ARE HERE</li>
153 - <li className="breadcrumb-item active">UI Notifications</li>
154 - </ol>
155 - <h1 className="page-title">Messages - <span className="fw-semi-bold">Notifications</span>
156 - </h1>
157 -
158 - <Widget title={<h6> Messenger </h6>} close collapse settings>
159 - <Row>
160 - <Col lg="4" xs="12">
161 - <h5 className="m-t-1">Layout options</h5>
162 - <p>There are few position options available for notifications. You can click any of
163 - them
164 - to change notifications position:</p>
165 - <div className="location-selector">
166 - { /* eslint-disable */}
167 - <div
168 - className="bit top left" onClick={() => {
169 - this.toggleLocation('top', 'left');
170 - }}
171 - />
172 - <div
173 - className="bit top right" onClick={() => {
174 - this.toggleLocation('top', 'right');
175 - }}
176 - />
177 - <div
178 - className="bit top" onClick={() => {
179 - this.toggleLocation('top', '');
180 - }}
181 - />
182 - <div
183 - className="bit bottom left" onClick={() => {
184 - this.toggleLocation('bottom', 'left');
185 - }}
186 - />
187 - <div
188 - className="bit bottom right" onClick={() => {
189 - this.toggleLocation('bottom', 'right');
190 - }}
191 - />
192 - <div
193 - className="bit bottom" onClick={() => {
194 - this.toggleLocation('bottom', '');
195 - }}
196 - />
197 - { /* eslint-enable */}
198 - </div>
199 - </Col>
200 -
201 - <Col lg="4" xs="12">
202 - <h5 className="m-t-1">Notification Types</h5>
203 - <p>Different types of notifications for lost of use cases. Custom classes are also
204 - supported.</p>
205 - <p><Button color="info" id="show-info-message" onClick={this.addInfoNotification}>Info
206 - Message</Button></p>
207 - <p><Button color="danger" id="show-error-message" onClick={this.addErrorNotification}>Error
208 - + Retry Message</Button></p>
209 - <p><Button
210 - color="success" id="show-success-message" onClick={this.addSuccessNotification}
211 - >Success
212 - Message</Button></p>
213 - </Col>
214 -
215 - <Col lg="4" xs="12">
216 - <h5 className="m-t-1">Dead Simple Usage</h5>
217 - <p>Just few lines of code to instantiate a notifications object. Does not require
218 - passing any options:</p>
219 - <pre><code>{'Messenger().post("Thanks for checking out Messenger!");'}</code></pre>
220 - <p>More complex example:</p>
221 - <pre>
222 - <code>{'\nMessenger().post({\n message: \'There was an explosion while processing your request.\',\n type: \'error\',\n showCloseButton: true\n});\n\n'}
223 - </code>
224 - </pre>
225 - </Col>
226 - </Row>
227 - </Widget>
228 - </div>
229 - );
230 - }
231 -}
232 -
233 -export default Notifications;
1 -@import '../../../styles/app';
2 -
3 -.root {
4 - :global {
5 - .location-selector {
6 - width: 100%;
7 - height: 220px;
8 - border: 1px dashed #bbb;
9 - background-color: $white;
10 - position: relative;
11 - }
12 -
13 - .location-selector .bit {
14 - @include transition(background-color 0.15s ease-in-out);
15 -
16 - background-color: $gray-300;
17 - cursor: pointer;
18 - position: absolute;
19 - }
20 -
21 - .location-selector .bit:hover {
22 - background-color: $gray-400;
23 - }
24 -
25 - .location-selector .bit.top,
26 - .location-selector .bit.bottom {
27 - height: 25%;
28 - width: 40%;
29 - margin: 0 30%;
30 - }
31 -
32 - .location-selector .bit.top {
33 - top: 0;
34 - }
35 -
36 - .location-selector .bit.bottom {
37 - bottom: 0;
38 - }
39 -
40 - .location-selector .bit.right,
41 - .location-selector .bit.left {
42 - height: 20%;
43 - width: 20%;
44 - margin-left: 0;
45 - margin-right: 0;
46 - }
47 -
48 - .location-selector .bit.right {
49 - right: 0;
50 - }
51 -
52 - .location-selector .bit.left {
53 - left: 0;
54 - }
55 - }
56 -}
1 -{
2 - "name": "UINotifications",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Notifications.js"
6 -}
1 -import React, { Component } from 'react';
2 -import {
3 - Row,
4 - Col,
5 - Breadcrumb,
6 - BreadcrumbItem,
7 - Button,
8 - Popover,
9 - PopoverHeader,
10 - PopoverBody,
11 - Tooltip,
12 -} from 'reactstrap';
13 -
14 -import Widget from '../../../components/Widget';
15 -
16 -class PopoverExamples extends Component {
17 - state = {
18 - tooltips: [false, false, false, false, false, false],
19 - popovers: [false, false, false, false, false, false],
20 - tooltipOpen: false,
21 - }
22 -
23 - toggle(id, field) {
24 - const newState = [...this.state[field]];
25 - newState.fill(false);
26 -
27 - if (!this.state[field][id]) {
28 - newState[id] = true;
29 - }
30 -
31 - this.setState({
32 - [field]: newState,
33 - });
34 - }
35 -
36 - render() {
37 - return (
38 - <div>
39 - <Breadcrumb>
40 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
41 - <BreadcrumbItem active>UI Badge</BreadcrumbItem>
42 - </Breadcrumb>
43 - <h1 className="page-title">Badge</h1>
44 - <Row>
45 - <Col xs={12} md={6}>
46 - <Widget
47 - className="mb-xlg"
48 - title={<h5>Popover <span className="fw-semi-bold">Example</span></h5>}
49 - close collapse
50 - >
51 - <Button
52 - id="p-1" className="mr-xs" size="lg" color="danger"
53 - onClick={() => this.toggle(0, 'popovers')}
54 - >Click to toggle popover</Button>
55 - <Button
56 - id="p-2" color="danger" disabled
57 - onClick={() => this.toggle(1, 'popovers')}
58 - >Disabled button</Button>
59 - </Widget>
60 - <Widget
61 - title={<h5>Popover <span className="fw-semi-bold">Directions</span></h5>}
62 - close collapse
63 - >
64 - <Button
65 - id="p-3" className="mr-xs mb-xs" color="info"
66 - onClick={() => this.toggle(2, 'popovers')}
67 - >Popover on top</Button>
68 - <Button
69 - id="p-4" className="mr-xs mb-xs" color="warning"
70 - onClick={() => this.toggle(3, 'popovers')}
71 - >Popover on right</Button>
72 - <Button
73 - id="p-5" className="mr-xs mb-xs" color="inverse"
74 - onClick={() => this.toggle(4, 'popovers')}
75 - >Popover on bottom</Button>
76 - <Button
77 - id="p-6" className="mr-xs mb-xs" color="default"
78 - onClick={() => this.toggle(5, 'popovers')}
79 - >Popover on left</Button>
80 - </Widget>
81 - </Col>
82 - <Col xs={12} md={6}>
83 - <Widget
84 - className="mb-xlg"
85 - title={<h5>Tooltip <span className="fw-semi-bold">Example</span></h5>}
86 - close collapse
87 - >
88 - <Button id="t-1" className="mr-sm" size="lg" color="success">Tooltip</Button>
89 - <Button id="t-2" color="success" disabled>Disabled button</Button>
90 - </Widget>
91 - <Widget
92 - title={<h5>Tooltip <span className="fw-semi-bold">Directions</span></h5>}
93 - close collapse
94 - >
95 - <Button id="t-3" className="mr-xs mb-xs" color="info">Tooltip on top</Button>
96 - <Button id="t-4" className="mr-xs mb-xs" color="warning">Tooltip on right</Button>
97 - <Button id="t-5" className="mr-xs mb-xs" color="inverse">Tooltip on bottom</Button>
98 - <Button id="t-6" className="mr-xs mb-xs" color="default">Tooltip on left</Button>
99 - </Widget>
100 - </Col>
101 - </Row>
102 -
103 - {/* Popovers & Tooltips */}
104 -
105 - <Popover placement="top" isOpen={this.state.popovers[0]} target="p-1" toggle={() => this.toggle(0, 'popovers')}>
106 - <PopoverHeader>Popover Title</PopoverHeader>
107 - <PopoverBody>
108 - Sed posuere consectetur est at lobortis. Aenean eu leo quam.
109 - Pellentesque ornare sem lacinia quam venenatis vestibulum.
110 - </PopoverBody>
111 - </Popover>
112 - <Popover placement="top" isOpen={this.state.popovers[1]} target="p-2" toggle={() => this.toggle(1, 'popovers')}>
113 - <PopoverHeader>Popover Title</PopoverHeader>
114 - <PopoverBody>
115 - Sed posuere consectetur est at lobortis. Aenean eu leo quam.
116 - Pellentesque ornare sem lacinia quam venenatis vestibulum.
117 - </PopoverBody>
118 - </Popover>
119 - <Popover placement="top" isOpen={this.state.popovers[2]} target="p-3" toggle={() => this.toggle(2, 'popovers')}>
120 - <PopoverHeader>Popover Title</PopoverHeader>
121 - <PopoverBody>
122 - Sed posuere consectetur est at lobortis. Aenean eu leo quam.
123 - Pellentesque ornare sem lacinia quam venenatis vestibulum.
124 - </PopoverBody>
125 - </Popover>
126 - <Popover placement="right" isOpen={this.state.popovers[3]} target="p-4" toggle={() => this.toggle(3, 'popovers')}>
127 - <PopoverHeader>Popover Title</PopoverHeader>
128 - <PopoverBody>
129 - Sed posuere consectetur est at lobortis. Aenean eu leo quam.
130 - Pellentesque ornare sem lacinia quam venenatis vestibulum.
131 - </PopoverBody>
132 - </Popover>
133 - <Popover placement="bottom" isOpen={this.state.popovers[4]} target="p-5" toggle={() => this.toggle(4, 'popovers')}>
134 - <PopoverHeader>Popover Title</PopoverHeader>
135 - <PopoverBody>
136 - Sed posuere consectetur est at lobortis. Aenean eu leo quam.
137 - Pellentesque ornare sem lacinia quam venenatis vestibulum.
138 - </PopoverBody>
139 - </Popover>
140 - <Popover placement="left" isOpen={this.state.popovers[5]} target="p-6" toggle={() => this.toggle(5, 'popovers')}>
141 - <PopoverHeader>Popover Title</PopoverHeader>
142 - <PopoverBody>
143 - Sed posuere consectetur est at lobortis. Aenean eu leo quam.
144 - Pellentesque ornare sem lacinia quam venenatis vestibulum.
145 - </PopoverBody>
146 - </Popover>
147 -
148 - <Tooltip placement="top" isOpen={this.state.tooltips[0]} toggle={() => this.toggle(0, 'tooltips')} target="t-1">
149 - Hello world!
150 - </Tooltip>
151 - <Tooltip placement="top" isOpen={this.state.tooltips[1]} toggle={() => this.toggle(1, 'tooltips')} target="t-2">
152 - Hello world!
153 - </Tooltip>
154 - <Tooltip placement="top" isOpen={this.state.tooltips[2]} toggle={() => this.toggle(2, 'tooltips')} target="t-3">
155 - Top
156 - </Tooltip>
157 - <Tooltip placement="right" isOpen={this.state.tooltips[3]} toggle={() => this.toggle(3, 'tooltips')} target="t-4">
158 - Right
159 - </Tooltip>
160 - <Tooltip placement="bottom" isOpen={this.state.tooltips[4]} toggle={() => this.toggle(4, 'tooltips')} target="t-5">
161 - Bottom
162 - </Tooltip>
163 - <Tooltip placement="left" isOpen={this.state.tooltips[5]} toggle={() => this.toggle(5, 'tooltips')} target="t-6">
164 - Left
165 - </Tooltip>
166 - </div>
167 - );
168 - }
169 -}
170 -
171 -export default PopoverExamples;
1 -{
2 - "name": "Popovers",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Popovers.js"
6 -}
1 -import React from 'react';
2 -import {
3 - Row,
4 - Col,
5 - Breadcrumb,
6 - BreadcrumbItem,
7 - Progress,
8 -} from 'reactstrap';
9 -
10 -import Widget from '../../../components/Widget';
11 -
12 -const ProgressExamples = () => (
13 - <div>
14 - <Breadcrumb>
15 - <BreadcrumbItem>YOU ARE HERE</BreadcrumbItem>
16 - <BreadcrumbItem active>UI Progress</BreadcrumbItem>
17 - </Breadcrumb>
18 - <h1 className="page-title">Progress</h1>
19 - <Row>
20 - <Col xs={12} md={6}>
21 - <Widget
22 - title={<h5>Progress <span className="fw-semi-bold">Example</span></h5>}
23 - close collapse
24 - >
25 - <p>
26 - Badges scale to match the size of the immediate parent element by
27 - using relative font sizing and em units.
28 - </p>
29 - <Progress className="mb-sm" value="25" />
30 - <Progress className="mb-sm" value="50" />
31 - <Progress className="mb-sm" value="75" />
32 - <Progress value="100" />
33 - </Widget>
34 - </Col>
35 - <Col xs={12} md={6}>
36 - <Widget
37 - title={<h5>Backgrounds</h5>}
38 - close collaple
39 - >
40 - <p>
41 - Use background utility classes to change the appearance of
42 - individual progress bars.
43 - </p>
44 - <Progress className="mb-sm" value="25" color="info" />
45 - <Progress className="mb-sm" value="50" color="warning" />
46 - <Progress className="mb-sm" value="75" color="danger" />
47 - <Progress value="100" color="success" />
48 - </Widget>
49 - </Col>
50 - <Col xs={12} md={6}>
51 - <Widget
52 - title={<h5>Labels</h5>}
53 - close collapse
54 - >
55 - <p>
56 - Add labels to your progress bars by placing text within the <code>&lt;Progress&gt;</code>
57 - </p>
58 - <Progress className="mb-sm" value="25">25%</Progress>
59 - <Progress className="mb-sm" value="100" color="danger">Something was wrong!</Progress>
60 - <Progress value="100" color="success">Completed!</Progress>
61 - </Widget>
62 - </Col>
63 - <Col xs={12} md={6}>
64 - <Widget
65 - title={<h5>Size</h5>}
66 - close collapse
67 - >
68 - <p>
69 - We only set a height value on the <code>&lt;Progress&gt;</code>, so if you change that value the inner
70 - bar will automatically resize accordingly. Also <code>.progress-sm</code> is available.
71 - </p>
72 - <Progress className="progress-sm mb-sm" value="25" color="dark">25%</Progress>
73 - <Progress className="mb-sm" value="50" color="gray">50%</Progress>
74 - <Progress value="75" color="secondary" style={{ height: '30px' }}>75%</Progress>
75 - </Widget>
76 - </Col>
77 - <Col xs={12}>
78 - <Widget
79 - title={<h5><span className="fw-semi-bold">Striped</span> Progress</h5>}
80 - close collapse
81 - >
82 - <Row>
83 - <Col xs={12} md={6}>
84 - <p>
85 - Add <code>striped</code> property to any <code>&lt;Progress&gt;</code> to
86 - apply a stripe via CSS gradient over the progress bars background color.
87 - </p>
88 - <Progress striped className="mb-sm" value="10" />
89 - <Progress striped className="mb-sm" value="25" color="success" />
90 - <Progress striped className="mb-sm" value="50" color="info" />
91 - <Progress striped className="mb-sm" value="75" color="warning" />
92 - <Progress striped value="100" color="danger" />
93 - </Col>
94 - <Col xs={12} md={6}>
95 - <p>
96 - The striped gradient can also be animated. Add <code>animated</code> property
97 - to <code>&lt;Progress&gt;</code> to animate the stripes right to left via CSS3 animations.
98 - </p>
99 - <Progress animated striped className="mb-sm" value="10" color="danger" />
100 - <Progress animated striped className="mb-sm" value="25" color="warning" />
101 - <Progress animated striped className="mb-sm" value="50" color="info" />
102 - <Progress animated striped className="mb-sm" value="75" color="success" />
103 - <Progress animated striped value="100" />
104 - </Col>
105 - </Row>
106 - </Widget>
107 - </Col>
108 - </Row>
109 - </div>
110 -);
111 -
112 -export default ProgressExamples;
1 -{
2 - "name": "Progress",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./Progress.js"
6 -}
1 -{
2 - "name": "UITabsAccordion",
3 - "version": "0.0.0",
4 - "private": true,
5 - "main": "./TabsAccordion.js"
6 -}
1 +import React from 'react';
2 +import PropTypes from 'prop-types';
3 +import { connect } from 'react-redux';
4 +import {
5 + Row,
6 + Col,
7 +} from 'reactstrap';
8 +
9 +import Widget from '../../components/Widget';
10 +
11 +import s from './VideoAnalysis.module.scss';
12 +
13 +class Dashboard extends React.Component {
14 + constructor(props) {
15 + super(props);
16 + this.state = {
17 + checkedArr: [false, false, false],
18 + };
19 + }
20 +
21 + async componentDidUpdate() {
22 + const isReceivingData = true;
23 + }
24 +
25 + static propTypes = {
26 + visits: PropTypes.any,
27 + performance: PropTypes.any,
28 + };
29 +
30 + render() {
31 + return (
32 + <div className={s.root}>
33 + <h1 className="page-title">Video Analysis <small><small>Performance</small></small></h1>
34 + <Row>
35 + <Col lg={9} xs={12}>
36 + <Widget
37 + title={<h5> Registrate <span className="fw-semi-bold">Video</span></h5>}
38 + >
39 + <div>
40 + <div className="text-center" style={{ height: '300px' }} />
41 + <p className="fs-mini text-muted">
42 + </p>
43 + </div>
44 + </Widget>
45 + </Col>
46 + </Row>
47 + <Row>
48 + <Col lg={9} xs={12}>
49 + <Widget
50 + title={<h5><span className="fw-semi-bold">Results</span></h5>}
51 + fetchingData={true}
52 + >
53 + <div>
54 + <div className="text-center" style={{ height: '300px' }} />
55 + <p className="fs-mini text-muted">
56 + </p>
57 + </div>
58 + </Widget>
59 + </Col>
60 + </Row>
61 + </div>
62 + );
63 + }
64 +}
65 +
66 +function mapStateToProps(state) {
67 + return {
68 + filters: state.filters,
69 + }
70 +}
71 +
72 +export default connect(mapStateToProps)(Dashboard);
...@@ -21,3 +21,8 @@ ...@@ -21,3 +21,8 @@
21 } 21 }
22 } 22 }
23 } 23 }
24 +.visitElement {
25 + h6 {
26 + font-size: 115%;
27 + }
28 +}
...\ No newline at end of file ...\ No newline at end of file
......
1 -@import '../../styles/app';
2 -
3 -
4 - /* Post User */
5 -.post-user {
6 - position: relative;
7 -
8 - @include clearfix();
9 -
10 - img {
11 - border: 3px solid white;
12 - }
13 -}
14 -
15 -/* Tags */
16 -.tags {
17 - padding-left: 0;
18 - list-style: none;
19 -
20 - @include clearfix();
21 -
22 - > li {
23 - float: left;
24 -
25 - > a {
26 - padding: 2px 8px;
27 - font-size: $font-size-mini;
28 - border-radius: 6px;
29 - border: 1px solid white;
30 - color: inherit;
31 - text-decoration: none;
32 -
33 - &:hover {
34 - background-color: rgba(0, 0, 0, 0.1);
35 - }
36 -
37 - .fa {
38 - font-size: 8px;
39 - margin-right: 3px;
40 - opacity: 0.8;
41 - }
42 - }
43 - }
44 -
45 - > li + li > a {
46 - margin-left: 6px;
47 - }
48 -}
49 -
50 -.widget-top-overflow > img + .tags {
51 - position: absolute;
52 - bottom: 0;
53 - right: 0;
54 - margin: 20px;
55 -}
56 -
57 -/* Weather */
58 -.widget-image .forecast {
59 - position: absolute;
60 - left: 0;
61 - right: 0;
62 - bottom: 0;
63 - margin-bottom: 5px;
64 - padding-left: 15px;
65 - padding-right: 15px;
66 - text-align: center;
67 -}
68 -
69 -/* Chat List Group */
70 -.widget-chat-list-group {
71 - padding-top: $spacer/2;
72 -
73 - .list-group-item {
74 - margin-left: $widget-padding-horizontal;
75 - margin-right: $widget-padding-horizontal;
76 - padding: 0;
77 - border: 0;
78 - display: flex;
79 -
80 - div {
81 - width: 100%;
82 - }
83 -
84 - &:nth-child(even) {
85 - margin-left: 75px;
86 - }
87 -
88 - &:hover {
89 - background: none;
90 - }
91 -
92 - & + .list-group-item {
93 - margin-top: 20px;
94 - }
95 -
96 - .thumb,
97 - .thumb-sm {
98 - float: left;
99 - margin-right: 15px;
100 - }
101 -
102 - .time {
103 - font-size: $font-size-sm;
104 - color: $text-muted;
105 - }
106 -
107 - .sender {
108 - margin-top: 5px;
109 - margin-bottom: 5px;
110 - font-size: $font-size-mini;
111 - font-weight: $font-weight-normal;
112 - color: theme-color('primary');
113 - }
114 -
115 - .body {
116 - font-size: $font-size-mini;
117 - margin-bottom: 0;
118 - }
119 -
120 - &.on-right {
121 - div {
122 - padding-right: 1rem;
123 - }
124 -
125 - .thumb,
126 - .thumb-sm {
127 - order: 1;
128 - margin-left: auto;
129 - margin-right: 0;
130 - }
131 -
132 - .time {
133 - float: left;
134 - }
135 -
136 - .sender {
137 - text-align: right;
138 - }
139 - }
140 - }
141 -}
142 -
1 -import React from 'react';
2 -import Rickshaw from 'rickshaw';
3 -
4 -import $ from 'jquery';
5 -
6 -import {
7 - Row, Col,
8 -} from 'reactstrap';
9 -
10 -import Sparklines from '../../../../components/Sparklines';
11 -import s from './ChangesChart.module.scss';
12 -
13 -class ChangesChart extends React.Component {
14 -
15 - constructor(prop) {
16 - super(prop);
17 - this.state = {
18 - rickshawGraph: null,
19 - sparklineData: [],
20 - sparklineOptions: {},
21 - };
22 - this.onResizeRickshaw = this.onResizeRickshaw.bind(this);
23 - this.initRickshaw = this.initRickshaw.bind(this);
24 - this.initSparkline();
25 - }
26 -
27 - componentDidMount() {
28 - this.initRickshaw();
29 - window.addEventListener('resize', this.onResizeRickshaw);
30 - }
31 -
32 - componentWillUnmount() {
33 - window.removeEventListener('resize', this.onResizeRickshaw);
34 - }
35 -
36 - onResizeRickshaw() {
37 - this.state.graph.configure({ height: 100 });
38 - this.state.graph.render();
39 - }
40 -
41 - initRickshaw() {
42 - const seriesData = [[], []];
43 - const random = new Rickshaw.Fixtures.RandomData(32);
44 - for (let i = 0; i < 32; i += 1) {
45 - random.addData(seriesData);
46 - }
47 -
48 - // eslint-disable-next-line
49 - this.state.graph = new Rickshaw.Graph({
50 - element: this.rickshawChart,
51 - height: '100',
52 - renderer: 'multi',
53 - series: [{
54 - name: 'pop',
55 - data: seriesData.shift().map(d => ({ x: d.x, y: d.y })),
56 - color: '#7bd47a', // (#64bd63, 0.9)
57 - renderer: 'bar',
58 - gapSize: 2,
59 - min: 'auto',
60 - strokeWidth: 3,
61 - }, {
62 - name: 'humidity',
63 - data: seriesData.shift()
64 - .map(d => ({ x: d.x, y: ((d.y * (Math.random() * 0.5)) + 30.1) })),
65 - renderer: 'line',
66 - color: '#fff',
67 - gapSize: 2,
68 - min: 'auto',
69 - strokeWidth: 3,
70 - }],
71 - });
72 -
73 - const hoverDetail = new Rickshaw.Graph.HoverDetail({
74 - graph: this.state.graph,
75 - xFormatter: x => new Date(x * 1000).toString(),
76 - });
77 -
78 - hoverDetail.show();
79 - this.state.graph.render();
80 - }
81 -
82 - initSparkline() {
83 - const data = [3, 6, 2, 4, 5, 8, 6, 8];
84 - const dataMax = Math.max.apply(null, data);
85 - const backgroundData = data.map(() => dataMax);
86 -
87 - // eslint-disable-next-line
88 - this.state.sparklineData = [backgroundData, data];
89 - // eslint-disable-next-line
90 - this.state.sparklineOptions = [
91 - {
92 - type: 'bar',
93 - height: 26,
94 - barColor: '#eee',
95 - barWidth: 7,
96 - barSpacing: 5,
97 - chartRangeMin: Math.min.apply(null, data),
98 - tooltipFormat: new $.SPFormatClass(''),
99 - },
100 - {
101 - composite: true,
102 - type: 'bar',
103 - barColor: '#64bd63',
104 - barWidth: 7,
105 - barSpacing: 5,
106 - },
107 - ];
108 - }
109 -
110 - render() {
111 - return (
112 - <div className={s.changesChart}>
113 - <div className={`${s.chart} bg-success btlr btrr`}>
114 - <p className={s.chartValue}><i className="fa fa-caret-up" /> 352.79</p>
115 - <p className={s.chartValueChange}>+2.04 (1.69%)</p>
116 - <div
117 - style={{ overflow: 'hidden' }}
118 - ref={(r) => {
119 - this.rickshawChart = r;
120 - }}
121 - />
122 - {/* <div rickshaw-chart [series]="series" [height]="100" [renderer]="'multi'"
123 - [configureProps]="{gapSize: 0.5, min: 'auto', strokeWidth: 3}"></div> */}
124 - </div>
125 - <h4 className={s.chartTitle}><span className="fw-normal">Salt Lake City</span>, Utah</h4>
126 - <p className="deemphasize">Today 13:34</p>
127 - <div className="mt">
128 - <Row>
129 - <Col xs={6}>
130 - <p className="h4 m-0">18.7M</p>
131 - <p className="deemphasize">Shares Traded</p>
132 - </Col>
133 - <Col xs={6} className="text-right">
134 - <p className="h4 m-0">19.9B</p>
135 - <p className="deemphasize">Market Cap</p>
136 - </Col>
137 - </Row>
138 - </div>
139 - <div className="mt">
140 - <Row>
141 - <Col xs={6}>
142 - <p className="h3 m-0 text-success fw-semi-bold">+120.93</p>
143 - <p className="deemphasize">Yearly Change</p>
144 - </Col>
145 - <Col xs={6} className="text-right">
146 - <div
147 - className="sparkline" ref={(r) => {
148 - this.sparklineRef = r;
149 - }}
150 - />
151 - <Sparklines data={this.state.sparklineData} options={this.state.sparklineOptions} />
152 - <p className="deemphasize">GOOG</p>
153 - </Col>
154 - </Row>
155 - </div>
156 - </div>
157 - );
158 - }
159 -}
160 -
161 -export default ChangesChart;
1 -@import '../../../../styles/app';
2 -
3 -.changesChart {
4 - .chart {
5 - margin: -$widget-padding-vertical (-$widget-padding-horizontal) 0;
6 - padding: $widget-padding-vertical 0 0;
7 - }
8 -
9 - .chartTitle {
10 - margin: 20px 0 0;
11 - }
12 -
13 - .chartValue,
14 - .chartValueChange {
15 - padding: 0 $widget-padding-horizontal;
16 - }
17 -
18 - .chartValue {
19 - margin-bottom: 0;
20 - font-weight: $font-weight-bold;
21 - font-size: 21px;
22 - line-height: 1;
23 - color: $white;
24 - }
25 -
26 - .chartValueChange {
27 - color: rgba($white, 0.7);
28 - font-size: $small-font-size;
29 - margin-bottom: $spacer;
30 - }
31 -}
1 -import React from 'react';
2 -import {
3 - Row,
4 - Col,
5 - Button,
6 - Badge,
7 -} from 'reactstrap';
8 -import ReactFlot from 'react-flot';
9 -
10 -import Widget from '../../../../components/Widget';
11 -import s from './FlotCharts.module.scss';
12 -
13 -class FlotCharts extends React.Component {
14 - static generateRandomData(labels) {
15 - function random() {
16 - return (Math.floor(Math.random() * 30)) + 10;
17 - }
18 -
19 - const data = [];
20 - let maxValueIndex = 5;
21 -
22 - for (let i = 0; i < labels.length; i += 1) {
23 - const randomSeries = [];
24 - for (let j = 0; j < 25; j += 1) {
25 - randomSeries.push([j, Math.floor(maxValueIndex * j) + random()]);
26 - }
27 - maxValueIndex -= 1;
28 - data.push({
29 - data: randomSeries,
30 - showLabels: true,
31 - label: labels[i].label,
32 - labelPlacement: 'below',
33 - canvasRender: true,
34 - cColor: 'red',
35 - color: labels[i].color,
36 - });
37 - }
38 - return data;
39 - }
40 -
41 - render() {
42 - const flotOptions = {
43 - series: {
44 - lines: {
45 - show: true,
46 - lineWidth: 1,
47 - fill: false,
48 - fillColor: { colors: [{ opacity: 0.001 }, { opacity: 0.5 }] },
49 - },
50 - points: {
51 - show: false,
52 - fill: true,
53 - },
54 - shadowSize: 0,
55 - },
56 - legend: false,
57 - grid: {
58 - show: false,
59 - margin: 0,
60 - labelMargin: 0,
61 - axisMargin: 0,
62 - hoverable: true,
63 - clickable: true,
64 - tickColor: 'rgba(255,255,255,1)',
65 - borderWidth: 0,
66 - },
67 - };
68 -
69 - const generateData = this.constructor.generateRandomData;
70 -
71 - return (<Row>
72 - <Col lg={6} xs={12}>
73 - <Widget
74 - title={<Row>
75 - <Col xs={4}>
76 - <h6>
77 - Total Sales
78 - </h6>
79 - <p className="value5">
80 - January, 2018
81 - </p>
82 - </Col>
83 - <Col xs={4}>
84 - <h5>
85 - <small>Best</small>
86 - </h5>
87 - <p className="value6 fs-sm">
88 - March, 2018 + 1
89 - </p>
90 - </Col>
91 - </Row>}
92 - settings close
93 - >
94 - <div className="chart-stats">
95 - <p className="text-muted fs-mini mt-xs">
96 - <i className="fi flaticon-placeholder fa-5x pull-left mr-3" />
97 - <span className="fw-semi-bold text-gray-dark">Jess:</span> Seems like statically it&apos;s getting impossible
98 - to achieve any sort of
99 - results in nearest future. The only thing we can hope for is pressing one of these two buttons:
100 - </p>
101 - <div className="btn-toolbar">
102 - <Button color="success" size="xs">Accept</Button>
103 - <Button color="default" size="xs">Reject</Button>
104 - </div>
105 - </div>
106 - <div className={`${s.chart} bg-body-light`}>
107 - <ReactFlot
108 - id="product-chart-1"
109 - data={
110 - generateData([{
111 - label: 'Visitors', color: '#777',
112 - }, {
113 - label: 'Charts', color: '#dd5826',
114 - }])}
115 - options={flotOptions}
116 - height={'100%'}
117 - />
118 - </div>
119 - </Widget>
120 - </Col>
121 - <Col lg={6} xs={12}>
122 - <Widget
123 - className=" widget-chart-stats-simple" title={<Row>
124 - <Col xs={12}>
125 - <h6 className="mb-0">
126 - <span className="fw-semi-bold">Budget</span>&nbsp;<Badge pill color="danger">2019</Badge>
127 - </h6>
128 - <span className="text-muted fs-mini">monthly report will be available in <button className="btn-link">6 hours</button></span>
129 - </Col>
130 - </Row>}
131 - settings close
132 - >
133 - <div className="chart-stats">
134 - <div className="row">
135 - <div className="col-md-5">
136 - <div className="clearfix m-t-1">
137 - <h6 className="pull-left text-muted mb-xs">
138 - Income
139 - </h6>
140 - <p className="pull-right h6 mb-xs">
141 - <span className="fw-semi-bold">$14,595</span>
142 - </p>
143 - </div>
144 - <div className="clearfix">
145 - <h6 className="pull-left no-margin text-muted">
146 - Recent
147 - </h6>
148 - <p className="pull-right">
149 - <span className="fw-semi-bold">$7,647</span>
150 - </p>
151 - </div>
152 - </div>
153 - <div className="col-md-3 text-right m-t-1">
154 - <h6 className="text-muted mb-xs">Inqueries</h6>
155 - <p className="fw-semi-bold">73 at 14am</p>
156 - </div>
157 - <div className="col-md-4 text-right m-t-1">
158 - <h6 className="text-muted mb-xs">Last Updated</h6>
159 - <p className="fw-semi-bold">23.06.2013</p>
160 - </div>
161 - </div>
162 - </div>
163 - <div className={`${s.chart} bg-body-light`}>
164 - <ReactFlot
165 - id="product-chart-2"
166 - data={
167 - generateData([{
168 - label: 'Controllers', color: '#777',
169 - }, {
170 - label: 'Scopes', color: '#f0b518',
171 - }])}
172 - options={flotOptions}
173 - height={'100%'}
174 - />
175 - </div>
176 - </Widget>
177 - </Col>
178 - </Row>
179 - );
180 - }
181 -}
182 -
183 -export default FlotCharts;
1 -import React from 'react';
2 -import $ from 'jquery'
3 -import PropTypes from 'prop-types';
4 -/* eslint-disable */
5 -import 'metrojs/release/MetroJs.Full/MetroJs';
6 -/* eslint-enable */
7 -
8 -import './LiveTile.scss';
9 -
10 -class LiveTile extends React.Component {
11 - static propTypes = {
12 - children: PropTypes.oneOfType([
13 - PropTypes.arrayOf(PropTypes.node),
14 - PropTypes.node,
15 - ]),
16 - };
17 -
18 - static defaultProps = {
19 - children: null,
20 - };
21 -
22 - constructor(props) {
23 - super(props);
24 - this.state = {
25 - id: `live-tile-${Math.floor(Math.random() * 255)}`,
26 - };
27 - }
28 -
29 - componentDidMount() {
30 - const el = $(`#${this.state.id}`);
31 - el.css('height', el.data('height'))
32 - .liveTile();
33 - }
34 -
35 - render() {
36 - const {
37 - children,
38 - ...attr
39 - } = this.props;
40 - return (
41 - <div {...attr} id={this.state.id} className="live-tile">
42 - {children}
43 - </div>
44 - );
45 - }
46 -}
47 -
48 -export default LiveTile;
1 -@import '../../../../styles/app';
2 -
3 -/* Live Tiles */
4 -.live-tile,
5 -.list-tile,
6 -.copy-tile,
7 -.tile-strip .flip-list > li {
8 - height: auto;
9 - min-width: 100%;
10 - margin: 0 !important;
11 - color: inherit !important;
12 -
13 - &.fade {
14 - opacity: 1;
15 - }
16 -}
17 -
18 -.live-tile p,
19 -.list-tile p,
20 -.copy-tile p {
21 - padding: 0 !important;
22 -}
23 -
24 -.live-tile p,
25 -.list-tile p,
26 -.copy-tile p,
27 -.live-tile .face,
28 -.list-tile .face,
29 -.copy-tile .face {
30 - &.h1 {
31 - font-size: $h1-font-size;
32 - }
33 -
34 - &.h2 {
35 - font-size: $h2-font-size;
36 - }
37 -
38 - &.h3 {
39 - font-size: $h3-font-size;
40 - }
41 -
42 - &.h4 {
43 - font-size: $h4-font-size;
44 - }
45 -
46 - &.h5 {
47 - font-size: $h5-font-size;
48 - }
49 -
50 - &.h6 {
51 - font-size: $h6-font-size;
52 - }
53 -
54 - $font-sizes: $h1-font-size, $h2-font-size, $h3-font-size, $h4-font-size, $h5-font-size, $h6-font-size;
55 - $i: 1;
56 -
57 - @each $font-size in $font-sizes {
58 - &.value#{$i} {
59 - font-size: $font-size;
60 - }
61 - $i: $i + 1;
62 - }
63 -}
1 -import React from 'react';
2 -
3 -import $ from 'jquery';
4 -import Sparklines from '../../../../components/Sparklines';
5 -
6 -class NasdaqSparkline extends React.Component {
7 -
8 - render() {
9 - const data = [[4, 6, 5, 7, 5]];
10 - const options = {
11 - type: 'line',
12 - width: '99%',
13 - height: '60',
14 - lineColor: '#666',
15 - fillColor: 'transparent',
16 - spotRadius: 5,
17 - spotColor: '#666',
18 - valueSpots: { '0:': '#666' },
19 - highlightSpotColor: '#fff',
20 - highlightLineColor: '#666',
21 - minSpotColor: '#666',
22 - maxSpotColor: '#dd5826',
23 - tooltipFormat: new $
24 - .SPFormatClass('<span style="color: white">&#9679;</span> {{prefix}}{{y}}{{suffix}}'),
25 - chartRangeMin: Math.min.apply(null, data) - 1,
26 - };
27 -
28 -
29 - return (
30 - <Sparklines data={data} options={options} />
31 - );
32 - }
33 -}
34 -
35 -export default NasdaqSparkline;
1 -import React from 'react';
2 -import {
3 - Progress,
4 -} from 'reactstrap';
5 -import Rickshaw from 'rickshaw';
6 -
7 -
8 -class RealtimeTraffic extends React.Component {
9 - state = { graph: null }
10 - constructor(prop) {
11 - super(prop);
12 - this.onResizeRickshaw = this.onResizeRickshaw.bind(this);
13 - }
14 -
15 - componentDidMount() {
16 - this.initChart();
17 - window.addEventListener('resize', this.onResizeRickshaw);
18 - }
19 -
20 - componentWillUnmount() {
21 - window.removeEventListener('resize', this.onResizeRickshaw);
22 - }
23 -
24 - onResizeRickshaw() {
25 - this.graph.configure({ height: 130 });
26 - this.graph.render();
27 - }
28 -
29 - initChart() {
30 - const seriesData = [[], []];
31 - const random = new Rickshaw.Fixtures.RandomData(30);
32 -
33 - for (let i = 0; i < 30; i += 1) {
34 - random.addData(seriesData);
35 - }
36 - this.graph = new Rickshaw.Graph({
37 - element: this.rickshawChart,
38 - height: 130,
39 - realtime: true,
40 - series: [
41 - {
42 - color: '#343434', // 'gray-dark'
43 - data: seriesData[0],
44 - name: 'Uploads',
45 - }, {
46 - color: '#666', // gray,
47 - data: seriesData[1],
48 - name: 'Downloads',
49 - },
50 - ],
51 - });
52 -
53 - const hoverDetail = new Rickshaw.Graph.HoverDetail({
54 - graph: this.graph,
55 - xFormatter: x => new Date(x * 1000).toString(),
56 - });
57 -
58 - hoverDetail.show();
59 -
60 - setInterval(() => {
61 - random.removeData(seriesData);
62 - random.addData(seriesData);
63 - this.graph.update();
64 - }, 1000);
65 -
66 - this.graph.render();
67 - }
68 -
69 - render() {
70 - return (
71 - <div>
72 - <h4 className="mb-lg">Recent <span className="fw-semi-bold">Update</span></h4>
73 - <h6>Node.js <span className="fw-semi-bold">4.0.1 distribution</span></h6>
74 - <Progress className="bg-gray-lighter progress-xs" color="danger" value="77" />
75 - <p className="mt-sm mb fs-mini ">
76 - <small><span className="circle bg-warning text-gray-dark"><i
77 - className="glyphicon glyphicon-chevron-up"
78 - /></span></small>
79 - <strong className="px-1">17% higher</strong>
80 - than last month
81 - </p>
82 - <p className="fs-sm text-gray-lighter mb-0">Remaining hours</p>
83 - <button className="btn btn-xs btn-gray pull-right ml-xs">
84 - <i className="fa fa-compress" /> track
85 - </button>
86 - <button className="btn btn-xs btn-gray pull-right">
87 - <i className="fa fa-pause" /> pause
88 - </button>
89 - <p className="value4">2h 56m</p>
90 - <br />
91 - <div
92 - ref={(r) => {
93 - this.rickshawChart = r;
94 - }} className="text-gray-dark chart-overflow-bottom" style={{ height: '130px' }}
95 - />
96 - </div>
97 - );
98 - }
99 -}
100 -
101 -export default RealtimeTraffic;
1 -import React from 'react';
2 -import { Nav, NavItem, NavLink } from 'reactstrap';
3 -/* eslint-disable */
4 -import $ from 'jquery';
5 -import 'imports-loader?$=jquery,this=>window!jquery-mapael/js/maps/world_countries';
6 -import 'imports-loader?$=jquery,this=>window!jquery-mapael/js/jquery.mapael';
7 -/* eslint-enable */
8 -import './YearsMap.scss';
9 -import fakeWorldData from './MapData';
10 -
11 -class YearsMap extends React.Component {
12 - constructor(prop) {
13 - super(prop);
14 - this.state = {
15 - activeYear: 2019,
16 - };
17 - this.triggerYear = this.triggerYear.bind(this);
18 - }
19 -
20 - componentDidMount() {
21 - this.init();
22 - }
23 -
24 - init() {
25 - const $map = $('#mapael');
26 - const data = {
27 - map: {
28 - name: 'world_countries',
29 - defaultArea: {
30 - attrs: {
31 - fill: '#eee', // gray-lighter
32 - stroke: '#666', // 'gray'
33 - 'stroke-width': 0.1,
34 - },
35 - attrsHover: {
36 - fill: '#999', // gray-light,
37 - animDuration: 100,
38 - },
39 - },
40 - defaultPlot: {
41 - size: 17,
42 - attrs: {
43 - fill: '#f0b518', // brand-warning,
44 - stroke: '#fff',
45 - 'stroke-width': 0,
46 - 'stroke-linejoin': 'round',
47 - },
48 - attrsHover: {
49 - 'stroke-width': 1,
50 - animDuration: 100,
51 - },
52 - },
53 - zoom: {
54 - enabled: true,
55 - step: 1,
56 - maxLevel: 10,
57 - mousewheel: false,
58 - },
59 - },
60 - legend: {
61 - area: {
62 - display: false,
63 - slices: [
64 - {
65 - max: 5000000,
66 - attrs: {
67 - fill: 'rgb(245, 249, 251)', // lightenColor('#ebeff1', .04)
68 - },
69 - label: 'Less than 5M',
70 - },
71 - {
72 - min: 5000000,
73 - max: 10000000,
74 - attrs: {
75 - fill: '#ebeff1',
76 - },
77 - label: 'Between 5M and 10M',
78 - },
79 - {
80 - min: 10000000,
81 - max: 50000000,
82 - attrs: {
83 - fill: '#eee', // gray-lighter
84 - },
85 - label: 'Between 10M and 50M',
86 - },
87 - {
88 - min: 50000000,
89 - attrs: {
90 - fill: 'rgb(209, 213, 215)', // darkenColor('#ebeff1', .1)
91 - },
92 - label: 'More than 50M',
93 - },
94 - ],
95 - },
96 - },
97 - areas: fakeWorldData[this.state.activeYear].areas,
98 - };
99 - const height = 394;
100 - $map.css('height', height);
101 - if ($map.parents('.widget')[0]) {
102 - $map.find('.map').css('height', parseInt($map.parents('.widget').css('height'), 10) - 35);
103 - }
104 - $map.mapael(data);
105 - $map.trigger('zoom', { level: 6, latitude: 59.599254, longitude: 8.863224 });
106 - }
107 -
108 - triggerYear(year) {
109 - this.setState({
110 - activeYear: year,
111 - });
112 - const $map = $('#mapael');
113 - $map.trigger('update', [{
114 - mapOptions: fakeWorldData[year],
115 - animDuration: 300,
116 - }]);
117 - }
118 -
119 - render() {
120 - return (<div>
121 - <div className="mapael" id="mapael">
122 - <div className="stats">
123 - <h6 className="text-gray-dark">YEARLY <span className="fw-semi-bold">DISTRIBUTIONS</span></h6>
124 - <span className="pull-left mr-xs">
125 - <small><span className="circle bg-warning text-gray-dark">
126 - <i className="fa fa-plus" /></span></small>
127 - </span>
128 - <p className="h4 m-0">
129 - <strong>17% last year</strong>
130 - </p>
131 - </div>
132 - <div className="map">
133 - <span>Alternative content for the map</span>
134 - </div>
135 - <div className="areaLegend">
136 - <span>Alternative content for the legend</span>
137 - </div>
138 - </div>
139 - <Nav className="map-controls" pills fill>
140 - <NavItem>
141 - <NavLink active={this.state.activeYear === 2014} onClick={() => this.triggerYear(2014)}>2014</NavLink>
142 - </NavItem>
143 - <NavItem>
144 - <NavLink active={this.state.activeYear === 2015} onClick={() => this.triggerYear(2015)}>2015</NavLink>
145 - </NavItem>
146 - <NavItem>
147 - <NavLink active={this.state.activeYear === 2016} onClick={() => this.triggerYear(2016)}>2016</NavLink>
148 - </NavItem>
149 - <NavItem>
150 - <NavLink active={this.state.activeYear === 2017} onClick={() => this.triggerYear(2017)}>2017</NavLink>
151 - </NavItem>
152 - <NavItem>
153 - <NavLink active={this.state.activeYear === 2018} onClick={() => this.triggerYear(2018)}>2018</NavLink>
154 - </NavItem>
155 - <NavItem>
156 - <NavLink active={this.state.activeYear === 2019} onClick={() => this.triggerYear(2019)}>2019</NavLink>
157 - </NavItem>
158 - </Nav>
159 - </div>);
160 - }
161 -}
162 -
163 -export default YearsMap;
1 -@import '../../../../styles/app';
2 -
3 -/* Mapael */
4 -.mapTooltip {
5 - position: fixed;
6 - padding: 2px;
7 - z-index: 1000;
8 - max-width: 200px;
9 - display: none;
10 - background-color: #fff;
11 - border: 1px solid #ccc;
12 - border-radius: $border-radius;
13 - font-size: $font-size-sm;
14 - color: $text-color;
15 -}
16 -
17 -.zoomIn,
18 -.zoomOut {
19 - position: absolute;
20 - bottom: 10px;
21 - left: 10px;
22 - width: 20px;
23 - height: 20px;
24 - box-sizing: content-box;
25 - border: 1px solid #ccc;
26 - background-color: #fff;
27 - color: $text-color;
28 - line-height: 20px;
29 - text-align: center;
30 - border-radius: $border-radius;
31 - cursor: pointer;
32 - font-weight: $font-weight-bold;
33 - user-select: none;
34 -}
35 -
36 -.zoomOut {
37 - left: 36px;
38 -}
39 -
40 -.mapael {
41 - position: relative;
42 - margin: (-$widget-padding-vertical) (-$widget-padding-horizontal) 0;
43 -
44 - .map {
45 - position: relative;
46 - height: calc(100% - 20px);
47 - }
48 -
49 - .stats {
50 - position: absolute;
51 - z-index: 1;
52 - top: 0;
53 - left: 0;
54 - margin: 5% 10%;
55 - }
56 -}
57 -
58 -/* Part:Map Controls */
59 -.map-controls {
60 - position: absolute;
61 - bottom: 0;
62 - left: 0;
63 - right: 0;
64 - border-top: 1px solid #bbb;
65 - background-color: $addition-bg;
66 - border-bottom-left-radius: $border-radius;
67 - border-bottom-right-radius: $border-radius;
68 -
69 - > .nav-item > .nav-link {
70 - border-radius: 0;
71 - padding: 0.7143rem 0;
72 - color: $text-color;
73 -
74 - &:hover {
75 - background-color: $gray-200;
76 - color: $text-color;
77 - }
78 - }
79 -
80 - > .nav-item > .nav-link.active {
81 - &,
82 - &:hover {
83 - background-color: $white;
84 - color: $text-color;
85 - font-weight: $font-weight-bold;
86 - }
87 - }
88 -
89 - > .nav-item:first-child > a {
90 - border-bottom-left-radius: $border-radius;
91 - }
92 -
93 - > .nav-item:last-child > a {
94 - border-bottom-right-radius: $border-radius;
95 - }
96 -}
97 -
98 -.map svg {
99 - height: 100%;
100 - width: 100%;
101 -}
102 -
1 -{
2 - "name": "widgets",
3 - "version": "0.0.0",
4 - "main": "./Widgets.js",
5 - "private": true
6 -}
1 -import { DISMISS_ALERT } from '../actions/alerts';
2 -
3 -const defaultState = {
4 - alertsList: [
5 - {
6 - id: 0,
7 - title: 'Sales Report',
8 - value: 16,
9 - color: 'primary',
10 - footer: 'Calculating x-axis bias... 65%',
11 - },
12 - {
13 - id: 1,
14 - title: 'Personal Responsibility',
15 - value: 23,
16 - color: 'danger',
17 - footer: 'Provide required notes',
18 - },
19 - ],
20 -};
21 -
22 -export default function alertsReducer(state = defaultState, action) {
23 - let index;
24 - switch (action.type) {
25 - case DISMISS_ALERT:
26 - state.alertsList.forEach((alert, alertIndex) => {
27 - if (alert.id === action.id) {
28 - index = alertIndex;
29 - }
30 - });
31 - return Object.assign({}, state, {
32 - alertsList: [
33 - ...state.alertsList.slice(0, index),
34 - ...state.alertsList.slice(index + 1),
35 - ],
36 - });
37 - default:
38 - return state;
39 - }
40 -}
1 -import { RECEIVED_DATA_SUCCESS, RECEIVING_DATA } from '../actions/analytics';
2 -
3 -const defaultState = {
4 - visits: {},
5 - performance: {},
6 - server: {},
7 - revenue: [],
8 - mainChart: [],
9 - isReceiving: false
10 -};
11 -
12 -export default function analyticsReducer(state = defaultState, action) {
13 - switch (action.type) {
14 - case RECEIVED_DATA_SUCCESS:
15 - const { visits, performance, server, revenue, mainChart } = action.payload;
16 - return Object.assign({}, state, {
17 - visits,
18 - performance,
19 - server,
20 - revenue,
21 - mainChart,
22 - isReceiving: false
23 - });
24 - case RECEIVING_DATA:
25 - return Object.assign({}, state, {
26 - isReceiving: true
27 - });
28 - default:
29 - return state;
30 - }
31 -}
1 -import {
2 - LOGIN_REQUEST, LOGIN_SUCCESS, LOGIN_FAILURE, LOGOUT_SUCCESS,
3 -} from '../actions/user';
4 -
5 -const token = localStorage.getItem('token');
6 -export default function auth(state = {
7 - isFetching: false,
8 - isAuthenticated: !!token,
9 -}, action) {
10 - switch (action.type) {
11 - case LOGIN_REQUEST:
12 - return Object.assign({}, state, {
13 - isFetching: true,
14 - isAuthenticated: false,
15 - });
16 - case LOGIN_SUCCESS:
17 - return Object.assign({}, state, {
18 - isFetching: false,
19 - isAuthenticated: true,
20 - errorMessage: '',
21 - });
22 - case LOGIN_FAILURE:
23 - return Object.assign({}, state, {
24 - isFetching: false,
25 - isAuthenticated: false,
26 - errorMessage: action.payload,
27 - });
28 - case LOGOUT_SUCCESS:
29 - return Object.assign({}, state, {
30 - isAuthenticated: false,
31 - });
32 - default:
33 - return state;
34 - }
35 -}
1 import { combineReducers } from 'redux'; 1 import { combineReducers } from 'redux';
2 -import auth from './auth';
3 import navigation from './navigation'; 2 import navigation from './navigation';
4 -import alerts from './alerts';
5 import layout from './layout'; 3 import layout from './layout';
6 -import products from './products';
7 -import register from './register';
8 -import analytics from './analytics';
9 4
10 export default combineReducers({ 5 export default combineReducers({
11 - alerts,
12 - auth,
13 navigation, 6 navigation,
14 layout, 7 layout,
15 - products,
16 - register,
17 - analytics,
18 }); 8 });
......
1 -import {
2 - RECEIVED_PRODUCTS,
3 - RECEIVED_PRODUCT,
4 - UPDATED_PRODUCT,
5 - DELETED_PRODUCT,
6 - RECEIVING_PRODUCTS,
7 - RECEIVING_PRODUCT,
8 - UPDATING_PRODUCT,
9 - DELETING_PRODUCT,
10 - RECEIVED_IMAGES
11 -} from '../actions/products';
12 -
13 -const defaultState = {
14 - data: [],
15 - images: [],
16 - isReceiving: false,
17 - isUpdating: false,
18 - isDeleting: false,
19 - idToDelete: null
20 -};
21 -
22 -export default function productsReducer(state = defaultState, action) {
23 - switch (action.type) {
24 - case RECEIVED_PRODUCTS:
25 - return Object.assign({}, state, {
26 - data: action.payload,
27 - isReceiving: false,
28 - });
29 - case RECEIVED_PRODUCT:
30 - return Object.assign({}, state, {
31 - data: [...state.data, action.payload],
32 - isReceiving: false,
33 - });
34 - case UPDATED_PRODUCT:
35 - let index = state.data.findIndex(p => p.id === action.payload.id);
36 - return Object.assign({}, state, {
37 - data: state.data.map((p, i) => {
38 - if (i === index) {
39 - return Object.assign({}, p, action.payload);
40 - }
41 - return p;
42 - }),
43 - isUpdating: false,
44 - });
45 - case DELETED_PRODUCT:
46 - let indexToDelete = state.data.findIndex(p => p.id === action.payload.id);
47 - let data = [...state.data];
48 - data.splice(indexToDelete, 1);
49 - return Object.assign({}, state, {
50 - data: [...data],
51 - isDeleting: false,
52 - idToDelete: null
53 - });
54 - case RECEIVING_PRODUCTS:
55 - case RECEIVING_PRODUCT:
56 - return Object.assign({}, state, {
57 - isReceiving: true
58 - });
59 - case UPDATING_PRODUCT:
60 - return Object.assign({}, state, {
61 - isUpdating: true
62 - });
63 - case DELETING_PRODUCT:
64 - return Object.assign({}, state, {
65 - isDeleting: true,
66 - idToDelete: action.payload.id
67 - });
68 - case RECEIVED_IMAGES:
69 - return Object.assign({}, state, {
70 - images: action.payload,
71 - });
72 - default:
73 - return state;
74 - }
75 -}
1 -import { REGISTER_FAILURE, REGISTER_REQUEST, REGISTER_SUCCESS } from '../actions/register';
2 -
3 -export default function register(state = {
4 - isFetching: false,
5 - errorMessage: ''
6 -}, action) {
7 - switch (action.type) {
8 - case REGISTER_REQUEST:
9 - return Object.assign({}, state, {
10 - isFetching: true,
11 - });
12 - case REGISTER_SUCCESS:
13 - return Object.assign({}, state, {
14 - isFetching: false,
15 - errorMessage: '',
16 - });
17 - case REGISTER_FAILURE:
18 - return Object.assign({}, state, {
19 - isFetching: false,
20 - errorMessage: action.payload,
21 - });
22 - default:
23 - return state;
24 - }
25 -}
1 -// This optional code is used to register a service worker.
2 -// register() is not called by default.
3 -
4 -// This lets the app load faster on subsequent visits in production, and gives
5 -// it offline capabilities. However, it also means that developers (and users)
6 -// will only see deployed updates on subsequent visits to a page, after all the
7 -// existing tabs open on the page have been closed, since previously cached
8 -// resources are updated in the background.
9 -
10 -// To learn more about the benefits of this model and instructions on how to
11 -// opt-in, read http://bit.ly/CRA-PWA.
12 -
13 -const isLocalhost = Boolean(
14 - window.location.hostname === 'localhost' ||
15 - // [::1] is the IPv6 localhost address.
16 - window.location.hostname === '[::1]' ||
17 - // 127.0.0.1/8 is considered localhost for IPv4.
18 - window.location.hostname.match(
19 - /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
20 - )
21 -);
22 -
23 -export function register(config) {
24 - if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
25 - // The URL constructor is available in all browsers that support SW.
26 - const publicUrl = new URL(process.env.PUBLIC_URL, window.location);
27 - if (publicUrl.origin !== window.location.origin) {
28 - // Our service worker won't work if PUBLIC_URL is on a different origin
29 - // from what our page is served on. This might happen if a CDN is used to
30 - // serve assets; see https://github.com/facebook/create-react-app/issues/2374
31 - return;
32 - }
33 -
34 - window.addEventListener('load', () => {
35 - const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
36 -
37 - if (isLocalhost) {
38 - // This is running on localhost. Let's check if a service worker still exists or not.
39 - checkValidServiceWorker(swUrl, config);
40 -
41 - // Add some additional logging to localhost, pointing developers to the
42 - // service worker/PWA pages.
43 - navigator.serviceWorker.ready.then(() => {
44 - console.log(
45 - 'This web app is being served cache-first by a service ' +
46 - 'worker. To learn more, visit http://bit.ly/CRA-PWA'
47 - );
48 - });
49 - } else {
50 - // Is not localhost. Just register service worker
51 - registerValidSW(swUrl, config);
52 - }
53 - });
54 - }
55 -}
56 -
57 -function registerValidSW(swUrl, config) {
58 - navigator.serviceWorker
59 - .register(swUrl)
60 - .then(registration => {
61 - registration.onupdatefound = () => {
62 - const installingWorker = registration.installing;
63 - installingWorker.onstatechange = () => {
64 - if (installingWorker.state === 'installed') {
65 - if (navigator.serviceWorker.controller) {
66 - // At this point, the updated precached content has been fetched,
67 - // but the previous service worker will still serve the older
68 - // content until all client tabs are closed.
69 - console.log(
70 - 'New content is available and will be used when all ' +
71 - 'tabs for this page are closed. See http://bit.ly/CRA-PWA.'
72 - );
73 -
74 - // Execute callback
75 - if (config && config.onUpdate) {
76 - config.onUpdate(registration);
77 - }
78 - } else {
79 - // At this point, everything has been precached.
80 - // It's the perfect time to display a
81 - // "Content is cached for offline use." message.
82 - console.log('Content is cached for offline use.');
83 -
84 - // Execute callback
85 - if (config && config.onSuccess) {
86 - config.onSuccess(registration);
87 - }
88 - }
89 - }
90 - };
91 - };
92 - })
93 - .catch(error => {
94 - console.error('Error during service worker registration:', error);
95 - });
96 -}
97 -
98 -function checkValidServiceWorker(swUrl, config) {
99 - // Check if the service worker can be found. If it can't reload the page.
100 - fetch(swUrl)
101 - .then(response => {
102 - // Ensure service worker exists, and that we really are getting a JS file.
103 - if (
104 - response.status === 404 ||
105 - response.headers.get('content-type').indexOf('javascript') === -1
106 - ) {
107 - // No service worker found. Probably a different app. Reload the page.
108 - navigator.serviceWorker.ready.then(registration => {
109 - registration.unregister().then(() => {
110 - window.location.reload();
111 - });
112 - });
113 - } else {
114 - // Service worker found. Proceed as normal.
115 - registerValidSW(swUrl, config);
116 - }
117 - })
118 - .catch(() => {
119 - console.log(
120 - 'No internet connection found. App is running in offline mode.'
121 - );
122 - });
123 -}
124 -
125 -export function unregister() {
126 - if ('serviceWorker' in navigator) {
127 - navigator.serviceWorker.ready.then(registration => {
128 - registration.unregister();
129 - });
130 - }
131 -}
...@@ -15,7 +15,6 @@ ...@@ -15,7 +15,6 @@
15 @import '../../node_modules/awesome-bootstrap-checkbox/awesome-bootstrap-checkbox'; 15 @import '../../node_modules/awesome-bootstrap-checkbox/awesome-bootstrap-checkbox';
16 @import '../../node_modules/messenger/build/css/messenger.css'; 16 @import '../../node_modules/messenger/build/css/messenger.css';
17 @import '../../node_modules/messenger/build/css/messenger-theme-air.css'; 17 @import '../../node_modules/messenger/build/css/messenger-theme-air.css';
18 -@import '../../node_modules/govpredict-morris/morris.css';
19 @import '../../node_modules/nvd3/build/nv.d3.css'; 18 @import '../../node_modules/nvd3/build/nv.d3.css';
20 @import '../../node_modules/rickshaw/rickshaw.css'; 19 @import '../../node_modules/rickshaw/rickshaw.css';
21 @import '../../node_modules/react-table/react-table.css'; 20 @import '../../node_modules/react-table/react-table.css';
......
...@@ -908,6 +908,13 @@ ...@@ -908,6 +908,13 @@
908 dependencies: 908 dependencies:
909 regenerator-runtime "^0.13.2" 909 regenerator-runtime "^0.13.2"
910 910
911 +"@babel/runtime@^7.4.3", "@babel/runtime@^7.4.4":
912 + version "7.5.5"
913 + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132"
914 + integrity sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==
915 + dependencies:
916 + regenerator-runtime "^0.13.2"
917 +
911 "@babel/template@7.0.0-beta.44": 918 "@babel/template@7.0.0-beta.44":
912 version "7.0.0-beta.44" 919 version "7.0.0-beta.44"
913 resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" 920 resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f"
...@@ -1011,6 +1018,83 @@ ...@@ -1011,6 +1018,83 @@
1011 version "1.4.0" 1018 version "1.4.0"
1012 resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" 1019 resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7"
1013 1020
1021 +"@emotion/cache@^10.0.14", "@emotion/cache@^10.0.9":
1022 + version "10.0.14"
1023 + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-10.0.14.tgz#56093cff025c04b0330bdd92afe8335ed326dd18"
1024 + integrity sha512-HNGEwWnPlNyy/WPXBXzbjzkzeZFV657Z99/xq2xs5yinJHbMfi3ioCvBJ6Y8Zc8DQzO9F5jDmVXJB41Ytx3QMw==
1025 + dependencies:
1026 + "@emotion/sheet" "0.9.3"
1027 + "@emotion/stylis" "0.8.4"
1028 + "@emotion/utils" "0.11.2"
1029 + "@emotion/weak-memoize" "0.2.3"
1030 +
1031 +"@emotion/core@^10.0.9":
1032 + version "10.0.14"
1033 + resolved "https://registry.yarnpkg.com/@emotion/core/-/core-10.0.14.tgz#cac5c334b278d5b7688cfff39e460a5b50abb71c"
1034 + integrity sha512-G9FbyxLm3lSnPfLDcag8fcOQBKui/ueXmWOhV+LuEQg9HrqExuWnWaO6gm6S5rNe+AMcqLXVljf8pYgAdFLNSg==
1035 + dependencies:
1036 + "@babel/runtime" "^7.4.3"
1037 + "@emotion/cache" "^10.0.14"
1038 + "@emotion/css" "^10.0.14"
1039 + "@emotion/serialize" "^0.11.8"
1040 + "@emotion/sheet" "0.9.3"
1041 + "@emotion/utils" "0.11.2"
1042 +
1043 +"@emotion/css@^10.0.14", "@emotion/css@^10.0.9":
1044 + version "10.0.14"
1045 + resolved "https://registry.yarnpkg.com/@emotion/css/-/css-10.0.14.tgz#95dacabdd0e22845d1a1b0b5968d9afa34011139"
1046 + integrity sha512-MozgPkBEWvorcdpqHZE5x1D/PLEHUitALQCQYt2wayf4UNhpgQs2tN0UwHYS4FMy5ROBH+0ALyCFVYJ/ywmwlg==
1047 + dependencies:
1048 + "@emotion/serialize" "^0.11.8"
1049 + "@emotion/utils" "0.11.2"
1050 + babel-plugin-emotion "^10.0.14"
1051 +
1052 +"@emotion/hash@0.7.2":
1053 + version "0.7.2"
1054 + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.7.2.tgz#53211e564604beb9befa7a4400ebf8147473eeef"
1055 + integrity sha512-RMtr1i6E8MXaBWwhXL3yeOU8JXRnz8GNxHvaUfVvwxokvayUY0zoBeWbKw1S9XkufmGEEdQd228pSZXFkAln8Q==
1056 +
1057 +"@emotion/memoize@0.7.2":
1058 + version "0.7.2"
1059 + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.2.tgz#7f4c71b7654068dfcccad29553520f984cc66b30"
1060 + integrity sha512-hnHhwQzvPCW1QjBWFyBtsETdllOM92BfrKWbUTmh9aeOlcVOiXvlPsK4104xH8NsaKfg86PTFsWkueQeUfMA/w==
1061 +
1062 +"@emotion/serialize@^0.11.8":
1063 + version "0.11.8"
1064 + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.8.tgz#e41dcf7029e45286a3e0cf922933e670fe05402c"
1065 + integrity sha512-Qb6Us2Yk1ZW8SOYH6s5z7qzXXb2iHwVeqc6FjXtac0vvxC416ki0eTtHNw4Q5smoyxdyZh3519NKGrQvvvrZ/Q==
1066 + dependencies:
1067 + "@emotion/hash" "0.7.2"
1068 + "@emotion/memoize" "0.7.2"
1069 + "@emotion/unitless" "0.7.4"
1070 + "@emotion/utils" "0.11.2"
1071 + csstype "^2.5.7"
1072 +
1073 +"@emotion/sheet@0.9.3":
1074 + version "0.9.3"
1075 + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-0.9.3.tgz#689f135ecf87d3c650ed0c4f5ddcbe579883564a"
1076 + integrity sha512-c3Q6V7Df7jfwSq5AzQWbXHa5soeE4F5cbqi40xn0CzXxWW9/6Mxq48WJEtqfWzbZtW9odZdnRAkwCQwN12ob4A==
1077 +
1078 +"@emotion/stylis@0.8.4":
1079 + version "0.8.4"
1080 + resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.4.tgz#6c51afdf1dd0d73666ba09d2eb6c25c220d6fe4c"
1081 + integrity sha512-TLmkCVm8f8gH0oLv+HWKiu7e8xmBIaokhxcEKPh1m8pXiV/akCiq50FvYgOwY42rjejck8nsdQxZlXZ7pmyBUQ==
1082 +
1083 +"@emotion/unitless@0.7.4":
1084 + version "0.7.4"
1085 + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.4.tgz#a87b4b04e5ae14a88d48ebef15015f6b7d1f5677"
1086 + integrity sha512-kBa+cDHOR9jpRJ+kcGMsysrls0leukrm68DmFQoMIWQcXdr2cZvyvypWuGYT7U+9kAExUE7+T7r6G3C3A6L8MQ==
1087 +
1088 +"@emotion/utils@0.11.2":
1089 + version "0.11.2"
1090 + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-0.11.2.tgz#713056bfdffb396b0a14f1c8f18e7b4d0d200183"
1091 + integrity sha512-UHX2XklLl3sIaP6oiMmlVzT0J+2ATTVpf0dHQVyPJHTkOITvXfaSqnRk6mdDhV9pR8T/tHc3cex78IKXssmzrA==
1092 +
1093 +"@emotion/weak-memoize@0.2.3":
1094 + version "0.2.3"
1095 + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.3.tgz#dfa0c92efe44a1d1a7974fb49ffeb40ef2da5a27"
1096 + integrity sha512-zVgvPwGK7c1aVdUVc9Qv7SqepOGRDrqCw7KZPSZziWGxSlbII3gmvGLPzLX4d0n0BMbamBacUrN22zOMyFFEkQ==
1097 +
1014 "@hapi/address@2.x.x": 1098 "@hapi/address@2.x.x":
1015 version "2.0.0" 1099 version "2.0.0"
1016 resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.0.0.tgz#9f05469c88cb2fd3dcd624776b54ee95c312126a" 1100 resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.0.0.tgz#9f05469c88cb2fd3dcd624776b54ee95c312126a"
...@@ -1169,6 +1253,14 @@ ...@@ -1169,6 +1253,14 @@
1169 "@types/istanbul-reports" "^1.1.1" 1253 "@types/istanbul-reports" "^1.1.1"
1170 "@types/yargs" "^12.0.9" 1254 "@types/yargs" "^12.0.9"
1171 1255
1256 +"@semantic-ui-react/event-stack@^3.1.0":
1257 + version "3.1.0"
1258 + resolved "https://registry.yarnpkg.com/@semantic-ui-react/event-stack/-/event-stack-3.1.0.tgz#aadbe4a28b0dd7703c5f451640d0fefe66dd9208"
1259 + integrity sha512-WHtU9wutZByZtFZxzj4BVEk+rvWldZpZhRcyv6d84+XLSolm83zLHYJLTACGuSl6Xa/xpgVXquvm9GyMudkJYg==
1260 + dependencies:
1261 + exenv "^1.2.2"
1262 + prop-types "^15.6.2"
1263 +
1172 "@svgr/babel-plugin-add-jsx-attribute@^4.2.0": 1264 "@svgr/babel-plugin-add-jsx-attribute@^4.2.0":
1173 version "4.2.0" 1265 version "4.2.0"
1174 resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz#dadcb6218503532d6884b210e7f3c502caaa44b1" 1266 resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz#dadcb6218503532d6884b210e7f3c502caaa44b1"
...@@ -1575,6 +1667,14 @@ address@1.0.3, address@^1.0.1: ...@@ -1575,6 +1667,14 @@ address@1.0.3, address@^1.0.1:
1575 version "1.0.3" 1667 version "1.0.3"
1576 resolved "https://registry.yarnpkg.com/address/-/address-1.0.3.tgz#b5f50631f8d6cec8bd20c963963afb55e06cbce9" 1668 resolved "https://registry.yarnpkg.com/address/-/address-1.0.3.tgz#b5f50631f8d6cec8bd20c963963afb55e06cbce9"
1577 1669
1670 +adler-32@~1.2.0:
1671 + version "1.2.0"
1672 + resolved "https://registry.yarnpkg.com/adler-32/-/adler-32-1.2.0.tgz#6a3e6bf0a63900ba15652808cb15c6813d1a5f25"
1673 + integrity sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU=
1674 + dependencies:
1675 + exit-on-epipe "~1.0.1"
1676 + printj "~1.1.0"
1677 +
1578 ajv-errors@^1.0.0: 1678 ajv-errors@^1.0.0:
1579 version "1.0.0" 1679 version "1.0.0"
1580 resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.0.tgz#ecf021fa108fd17dfb5e6b383f2dd233e31ffc59" 1680 resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.0.tgz#ecf021fa108fd17dfb5e6b383f2dd233e31ffc59"
...@@ -1940,6 +2040,22 @@ babel-plugin-dynamic-import-node@2.2.0: ...@@ -1940,6 +2040,22 @@ babel-plugin-dynamic-import-node@2.2.0:
1940 dependencies: 2040 dependencies:
1941 object.assign "^4.1.0" 2041 object.assign "^4.1.0"
1942 2042
2043 +babel-plugin-emotion@^10.0.14:
2044 + version "10.0.14"
2045 + resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.0.14.tgz#c1d0e4621e303507ea7da57daa3cd771939d6df4"
2046 + integrity sha512-T7hdxJ4xXkKW3OXcizK0pnUJlBeNj/emjQZPDIZvGOuwl2adIgicQWRNkz6BuwKdDTrqaXQn1vayaL6aL8QW5A==
2047 + dependencies:
2048 + "@babel/helper-module-imports" "^7.0.0"
2049 + "@emotion/hash" "0.7.2"
2050 + "@emotion/memoize" "0.7.2"
2051 + "@emotion/serialize" "^0.11.8"
2052 + babel-plugin-macros "^2.0.0"
2053 + babel-plugin-syntax-jsx "^6.18.0"
2054 + convert-source-map "^1.5.0"
2055 + escape-string-regexp "^1.0.5"
2056 + find-root "^1.1.0"
2057 + source-map "^0.5.7"
2058 +
1943 babel-plugin-istanbul@^5.1.0: 2059 babel-plugin-istanbul@^5.1.0:
1944 version "5.1.4" 2060 version "5.1.4"
1945 resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.4.tgz#841d16b9a58eeb407a0ddce622ba02fe87a752ba" 2061 resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.4.tgz#841d16b9a58eeb407a0ddce622ba02fe87a752ba"
...@@ -1962,10 +2078,24 @@ babel-plugin-macros@2.5.1: ...@@ -1962,10 +2078,24 @@ babel-plugin-macros@2.5.1:
1962 cosmiconfig "^5.2.0" 2078 cosmiconfig "^5.2.0"
1963 resolve "^1.10.0" 2079 resolve "^1.10.0"
1964 2080
2081 +babel-plugin-macros@^2.0.0:
2082 + version "2.6.1"
2083 + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.6.1.tgz#41f7ead616fc36f6a93180e89697f69f51671181"
2084 + integrity sha512-6W2nwiXme6j1n2erPOnmRiWfObUhWH7Qw1LMi9XZy8cj+KtESu3T6asZvtk5bMQQjX8te35o7CFueiSdL/2NmQ==
2085 + dependencies:
2086 + "@babel/runtime" "^7.4.2"
2087 + cosmiconfig "^5.2.0"
2088 + resolve "^1.10.0"
2089 +
1965 babel-plugin-named-asset-import@1.0.0-next.103: 2090 babel-plugin-named-asset-import@1.0.0-next.103:
1966 version "1.0.0-next.103" 2091 version "1.0.0-next.103"
1967 resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-1.0.0-next.103.tgz#c2da5b8426705191710ad5b435a6577d68b21ae9" 2092 resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-1.0.0-next.103.tgz#c2da5b8426705191710ad5b435a6577d68b21ae9"
1968 2093
2094 +babel-plugin-syntax-jsx@^6.18.0:
2095 + version "6.18.0"
2096 + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946"
2097 + integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=
2098 +
1969 babel-plugin-syntax-object-rest-spread@^6.8.0: 2099 babel-plugin-syntax-object-rest-spread@^6.8.0:
1970 version "6.13.0" 2100 version "6.13.0"
1971 resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" 2101 resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
...@@ -2432,6 +2562,16 @@ ccount@^1.0.3: ...@@ -2432,6 +2562,16 @@ ccount@^1.0.3:
2432 version "1.0.4" 2562 version "1.0.4"
2433 resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.4.tgz#9cf2de494ca84060a2a8d2854edd6dfb0445f386" 2563 resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.4.tgz#9cf2de494ca84060a2a8d2854edd6dfb0445f386"
2434 2564
2565 +cfb@^1.1.2:
2566 + version "1.1.2"
2567 + resolved "https://registry.yarnpkg.com/cfb/-/cfb-1.1.2.tgz#5dfff9813eb37757597272dae3da3b37b3edcc44"
2568 + integrity sha512-FAEjGHtrAF027TFkhDmTDNbRf97C33jBXRa9ODeabZRqYDglsq/F5uRpJfV5BitCH4yiyplHNBKx2xOhQb12PA==
2569 + dependencies:
2570 + adler-32 "~1.2.0"
2571 + commander "^2.16.0"
2572 + crc-32 "~1.2.0"
2573 + printj "~1.1.2"
2574 +
2435 chain-function@^1.0.0: 2575 chain-function@^1.0.0:
2436 version "1.0.1" 2576 version "1.0.1"
2437 resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.1.tgz#c63045e5b4b663fb86f1c6e186adaf1de402a1cc" 2577 resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.1.tgz#c63045e5b4b663fb86f1c6e186adaf1de402a1cc"
...@@ -2638,6 +2778,14 @@ code-point-at@^1.0.0: ...@@ -2638,6 +2778,14 @@ code-point-at@^1.0.0:
2638 version "1.1.0" 2778 version "1.1.0"
2639 resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 2779 resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
2640 2780
2781 +codepage@~1.14.0:
2782 + version "1.14.0"
2783 + resolved "https://registry.yarnpkg.com/codepage/-/codepage-1.14.0.tgz#8cbe25481323559d7d307571b0fff91e7a1d2f99"
2784 + integrity sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k=
2785 + dependencies:
2786 + commander "~2.14.1"
2787 + exit-on-epipe "~1.0.1"
2788 +
2641 collection-visit@^1.0.0: 2789 collection-visit@^1.0.0:
2642 version "1.0.0" 2790 version "1.0.0"
2643 resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" 2791 resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
...@@ -2703,10 +2851,15 @@ commander@^2.11.0: ...@@ -2703,10 +2851,15 @@ commander@^2.11.0:
2703 version "2.19.0" 2851 version "2.19.0"
2704 resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" 2852 resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
2705 2853
2706 -commander@^2.19.0: 2854 +commander@^2.16.0, commander@^2.19.0:
2707 version "2.20.0" 2855 version "2.20.0"
2708 resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" 2856 resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
2709 2857
2858 +commander@~2.14.1:
2859 + version "2.14.1"
2860 + resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa"
2861 + integrity sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==
2862 +
2710 common-tags@^1.8.0: 2863 common-tags@^1.8.0:
2711 version "1.8.0" 2864 version "1.8.0"
2712 resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" 2865 resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937"
...@@ -2764,6 +2917,23 @@ concat-stream@^1.5.0: ...@@ -2764,6 +2917,23 @@ concat-stream@^1.5.0:
2764 readable-stream "^2.2.2" 2917 readable-stream "^2.2.2"
2765 typedarray "^0.0.6" 2918 typedarray "^0.0.6"
2766 2919
2920 +condense-newlines@^0.2.1:
2921 + version "0.2.1"
2922 + resolved "https://registry.yarnpkg.com/condense-newlines/-/condense-newlines-0.2.1.tgz#3de985553139475d32502c83b02f60684d24c55f"
2923 + integrity sha1-PemFVTE5R10yUCyDsC9gaE0kxV8=
2924 + dependencies:
2925 + extend-shallow "^2.0.1"
2926 + is-whitespace "^0.3.0"
2927 + kind-of "^3.0.2"
2928 +
2929 +config-chain@^1.1.12:
2930 + version "1.1.12"
2931 + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa"
2932 + integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==
2933 + dependencies:
2934 + ini "^1.3.4"
2935 + proto-list "~1.2.1"
2936 +
2767 confusing-browser-globals@^1.0.7: 2937 confusing-browser-globals@^1.0.7:
2768 version "1.0.7" 2938 version "1.0.7"
2769 resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.7.tgz#5ae852bd541a910e7ffb2dbb864a2d21a36ad29b" 2939 resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.7.tgz#5ae852bd541a910e7ffb2dbb864a2d21a36ad29b"
...@@ -2798,7 +2968,7 @@ content-type@~1.0.4: ...@@ -2798,7 +2968,7 @@ content-type@~1.0.4:
2798 version "1.0.4" 2968 version "1.0.4"
2799 resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 2969 resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
2800 2970
2801 -convert-source-map@^1.1.0, convert-source-map@^1.4.0: 2971 +convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0:
2802 version "1.6.0" 2972 version "1.6.0"
2803 resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" 2973 resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20"
2804 dependencies: 2974 dependencies:
...@@ -2882,6 +3052,14 @@ cosmiconfig@^5.2.0: ...@@ -2882,6 +3052,14 @@ cosmiconfig@^5.2.0:
2882 js-yaml "^3.13.0" 3052 js-yaml "^3.13.0"
2883 parse-json "^4.0.0" 3053 parse-json "^4.0.0"
2884 3054
3055 +crc-32@~1.2.0:
3056 + version "1.2.0"
3057 + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208"
3058 + integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==
3059 + dependencies:
3060 + exit-on-epipe "~1.0.1"
3061 + printj "~1.1.0"
3062 +
2885 create-ecdh@^4.0.0: 3063 create-ecdh@^4.0.0:
2886 version "4.0.3" 3064 version "4.0.3"
2887 resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" 3065 resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
...@@ -2918,6 +3096,14 @@ create-react-class@15.x, create-react-class@^15.5.2: ...@@ -2918,6 +3096,14 @@ create-react-class@15.x, create-react-class@^15.5.2:
2918 loose-envify "^1.3.1" 3096 loose-envify "^1.3.1"
2919 object-assign "^4.1.1" 3097 object-assign "^4.1.1"
2920 3098
3099 +create-react-context@<=0.2.2:
3100 + version "0.2.2"
3101 + resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.2.2.tgz#9836542f9aaa22868cd7d4a6f82667df38019dca"
3102 + integrity sha512-KkpaLARMhsTsgp0d2NA/R94F/eDLbhXERdIq3LvX2biCAXcDvHYoOqHfWCHf1+OLj+HKBotLG3KqaOOf+C1C+A==
3103 + dependencies:
3104 + fbjs "^0.8.0"
3105 + gud "^1.0.0"
3106 +
2921 cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5: 3107 cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5:
2922 version "6.0.5" 3108 version "6.0.5"
2923 resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 3109 resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
...@@ -3158,6 +3344,11 @@ cssstyle@^1.0.0: ...@@ -3158,6 +3344,11 @@ cssstyle@^1.0.0:
3158 dependencies: 3344 dependencies:
3159 cssom "0.3.x" 3345 cssom "0.3.x"
3160 3346
3347 +csstype@^2.5.7:
3348 + version "2.6.6"
3349 + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.6.tgz#c34f8226a94bbb10c32cc0d714afdf942291fc41"
3350 + integrity sha512-RpFbQGUE74iyPgvr46U9t1xoQBM8T4BL8SxrN66Le2xYAPSaDJJKeztV3awugusb3g3G9iL8StmkBBXhcbbXhg==
3351 +
3161 currently-unhandled@^0.4.1: 3352 currently-unhandled@^0.4.1:
3162 version "0.4.1" 3353 version "0.4.1"
3163 resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" 3354 resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
...@@ -3226,10 +3417,6 @@ decode-uri-component@^0.2.0: ...@@ -3226,10 +3417,6 @@ decode-uri-component@^0.2.0:
3226 version "0.2.0" 3417 version "0.2.0"
3227 resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" 3418 resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
3228 3419
3229 -deep-diff@^0.3.5:
3230 - version "0.3.8"
3231 - resolved "https://registry.yarnpkg.com/deep-diff/-/deep-diff-0.3.8.tgz#c01de63efb0eec9798801d40c7e0dae25b582c84"
3232 -
3233 deep-equal@^1.0.1: 3420 deep-equal@^1.0.1:
3234 version "1.0.1" 3421 version "1.0.1"
3235 resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" 3422 resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
...@@ -3478,9 +3665,10 @@ dotenv-expand@5.1.0: ...@@ -3478,9 +3665,10 @@ dotenv-expand@5.1.0:
3478 version "5.1.0" 3665 version "5.1.0"
3479 resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" 3666 resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0"
3480 3667
3481 -dotenv@8.0.0: 3668 +dotenv@^8.0.0:
3482 version "8.0.0" 3669 version "8.0.0"
3483 resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.0.0.tgz#ed310c165b4e8a97bb745b0a9d99c31bda566440" 3670 resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.0.0.tgz#ed310c165b4e8a97bb745b0a9d99c31bda566440"
3671 + integrity sha512-30xVGqjLjiUOArT4+M5q9sYdvuR4riM6yK9wMcas9Vbp6zZa+ocC9dp6QoftuhTPhFAiLK/0C5Ni2nou/Bk8lg==
3484 3672
3485 draft-js@^0.10.5: 3673 draft-js@^0.10.5:
3486 version "0.10.5" 3674 version "0.10.5"
...@@ -3524,6 +3712,16 @@ ecdsa-sig-formatter@1.0.11: ...@@ -3524,6 +3712,16 @@ ecdsa-sig-formatter@1.0.11:
3524 dependencies: 3712 dependencies:
3525 safe-buffer "^5.0.1" 3713 safe-buffer "^5.0.1"
3526 3714
3715 +editorconfig@^0.15.3:
3716 + version "0.15.3"
3717 + resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5"
3718 + integrity sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==
3719 + dependencies:
3720 + commander "^2.19.0"
3721 + lru-cache "^4.1.5"
3722 + semver "^5.6.0"
3723 + sigmund "^1.0.1"
3724 +
3527 ee-first@1.1.1: 3725 ee-first@1.1.1:
3528 version "1.1.1" 3726 version "1.1.1"
3529 resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 3727 resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
...@@ -3922,6 +4120,11 @@ exenv@^1.2.0, exenv@^1.2.2: ...@@ -3922,6 +4120,11 @@ exenv@^1.2.0, exenv@^1.2.2:
3922 version "1.2.2" 4120 version "1.2.2"
3923 resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d" 4121 resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d"
3924 4122
4123 +exit-on-epipe@~1.0.1:
4124 + version "1.0.1"
4125 + resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692"
4126 + integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==
4127 +
3925 exit@^0.1.2: 4128 exit@^0.1.2:
3926 version "0.1.2" 4129 version "0.1.2"
3927 resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" 4130 resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
...@@ -4080,7 +4283,7 @@ fb-watchman@^2.0.0: ...@@ -4080,7 +4283,7 @@ fb-watchman@^2.0.0:
4080 dependencies: 4283 dependencies:
4081 bser "^2.0.0" 4284 bser "^2.0.0"
4082 4285
4083 -fbjs@^0.8.1, fbjs@^0.8.15, fbjs@^0.8.9: 4286 +fbjs@^0.8.0, fbjs@^0.8.1, fbjs@^0.8.15, fbjs@^0.8.9:
4084 version "0.8.17" 4287 version "0.8.17"
4085 resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" 4288 resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd"
4086 dependencies: 4289 dependencies:
...@@ -4156,6 +4359,11 @@ find-cache-dir@^2.0.0: ...@@ -4156,6 +4359,11 @@ find-cache-dir@^2.0.0:
4156 make-dir "^1.0.0" 4359 make-dir "^1.0.0"
4157 pkg-dir "^3.0.0" 4360 pkg-dir "^3.0.0"
4158 4361
4362 +find-root@^1.1.0:
4363 + version "1.1.0"
4364 + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
4365 + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
4366 +
4159 find-up@3.0.0, find-up@^3.0.0: 4367 find-up@3.0.0, find-up@^3.0.0:
4160 version "3.0.0" 4368 version "3.0.0"
4161 resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 4369 resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
...@@ -4272,6 +4480,11 @@ forwarded@~0.1.2: ...@@ -4272,6 +4480,11 @@ forwarded@~0.1.2:
4272 version "0.1.2" 4480 version "0.1.2"
4273 resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 4481 resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
4274 4482
4483 +frac@~1.1.2:
4484 + version "1.1.2"
4485 + resolved "https://registry.yarnpkg.com/frac/-/frac-1.1.2.tgz#3d74f7f6478c88a1b5020306d747dc6313c74d0b"
4486 + integrity sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==
4487 +
4275 fragment-cache@^0.2.1: 4488 fragment-cache@^0.2.1:
4276 version "0.2.1" 4489 version "0.2.1"
4277 resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" 4490 resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
...@@ -4504,10 +4717,6 @@ google-maps-infobox@^2.0.0: ...@@ -4504,10 +4717,6 @@ google-maps-infobox@^2.0.0:
4504 version "2.0.0" 4717 version "2.0.0"
4505 resolved "https://registry.yarnpkg.com/google-maps-infobox/-/google-maps-infobox-2.0.0.tgz#1ea6de93c0cdf4138c2d586331835c83dcc59dc2" 4718 resolved "https://registry.yarnpkg.com/google-maps-infobox/-/google-maps-infobox-2.0.0.tgz#1ea6de93c0cdf4138c2d586331835c83dcc59dc2"
4506 4719
4507 -govpredict-morris@0.5.1:
4508 - version "0.5.1"
4509 - resolved "https://registry.yarnpkg.com/govpredict-morris/-/govpredict-morris-0.5.1.tgz#3a16dd1cf48718cb992458ab49edc2748cbad2e1"
4510 -
4511 graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: 4720 graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6:
4512 version "4.1.11" 4721 version "4.1.11"
4513 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 4722 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
...@@ -4520,6 +4729,11 @@ growly@^1.3.0: ...@@ -4520,6 +4729,11 @@ growly@^1.3.0:
4520 version "1.3.0" 4729 version "1.3.0"
4521 resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" 4730 resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
4522 4731
4732 +gud@^1.0.0:
4733 + version "1.0.0"
4734 + resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0"
4735 + integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==
4736 +
4523 gzip-size@5.0.0: 4737 gzip-size@5.0.0:
4524 version "5.0.0" 4738 version "5.0.0"
4525 resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.0.0.tgz#a55ecd99222f4c48fd8c01c625ce3b349d0a0e80" 4739 resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.0.0.tgz#a55ecd99222f4c48fd8c01c625ce3b349d0a0e80"
...@@ -5277,6 +5491,11 @@ is-utf8@^0.2.0: ...@@ -5277,6 +5491,11 @@ is-utf8@^0.2.0:
5277 version "0.2.1" 5491 version "0.2.1"
5278 resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 5492 resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
5279 5493
5494 +is-whitespace@^0.3.0:
5495 + version "0.3.0"
5496 + resolved "https://registry.yarnpkg.com/is-whitespace/-/is-whitespace-0.3.0.tgz#1639ecb1be036aec69a54cbb401cfbed7114ab7f"
5497 + integrity sha1-Fjnssb4DauxppUy7QBz77XEUq38=
5498 +
5280 is-windows@^1.0.1, is-windows@^1.0.2: 5499 is-windows@^1.0.1, is-windows@^1.0.2:
5281 version "1.0.2" 5500 version "1.0.2"
5282 resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" 5501 resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
...@@ -5729,6 +5948,17 @@ js-base64@^2.1.8: ...@@ -5729,6 +5948,17 @@ js-base64@^2.1.8:
5729 version "2.4.9" 5948 version "2.4.9"
5730 resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.9.tgz#748911fb04f48a60c4771b375cac45a80df11c03" 5949 resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.9.tgz#748911fb04f48a60c4771b375cac45a80df11c03"
5731 5950
5951 +js-beautify@^1.6.12:
5952 + version "1.10.1"
5953 + resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.10.1.tgz#bdfe738ddbcaa12e4fced5af2d7cfad59f60ac0a"
5954 + integrity sha512-4y8SHOIRC+/YQ2gs3zJEKBUraQerq49FJYyXRpdzUGYQzCq8q9xtIh0YXial1S5KmonVui4aiUb6XaGyjE51XA==
5955 + dependencies:
5956 + config-chain "^1.1.12"
5957 + editorconfig "^0.15.3"
5958 + glob "^7.1.3"
5959 + mkdirp "~0.5.1"
5960 + nopt "~4.0.1"
5961 +
5732 js-levenshtein@^1.1.3: 5962 js-levenshtein@^1.1.3:
5733 version "1.1.4" 5963 version "1.1.4"
5734 resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.4.tgz#3a56e3cbf589ca0081eb22cd9ba0b1290a16d26e" 5964 resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.4.tgz#3a56e3cbf589ca0081eb22cd9ba0b1290a16d26e"
...@@ -5921,6 +6151,11 @@ jws@^3.2.2: ...@@ -5921,6 +6151,11 @@ jws@^3.2.2:
5921 jwa "^1.4.1" 6151 jwa "^1.4.1"
5922 safe-buffer "^5.0.1" 6152 safe-buffer "^5.0.1"
5923 6153
6154 +keyboard-key@^1.0.4:
6155 + version "1.0.4"
6156 + resolved "https://registry.yarnpkg.com/keyboard-key/-/keyboard-key-1.0.4.tgz#52d8fa07b7e17757072aa22a67fb4ae85e4c46b0"
6157 + integrity sha512-my04dE6BCwPpwoe4KYKfPxWiwgDYQOHrVmtzn1CfzmoEsGG/ef4oZGaXCzi1+iFhG7CN5JkOuxmei5OABY8/ag==
6158 +
5924 killable@^1.0.1: 6159 killable@^1.0.1:
5925 version "1.0.1" 6160 version "1.0.1"
5926 resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" 6161 resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892"
...@@ -6224,6 +6459,14 @@ lru-cache@^4.0.1, lru-cache@^4.1.3: ...@@ -6224,6 +6459,14 @@ lru-cache@^4.0.1, lru-cache@^4.1.3:
6224 pseudomap "^1.0.2" 6459 pseudomap "^1.0.2"
6225 yallist "^2.1.2" 6460 yallist "^2.1.2"
6226 6461
6462 +lru-cache@^4.1.5:
6463 + version "4.1.5"
6464 + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
6465 + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
6466 + dependencies:
6467 + pseudomap "^1.0.2"
6468 + yallist "^2.1.2"
6469 +
6227 make-dir@^1.0.0: 6470 make-dir@^1.0.0:
6228 version "1.3.0" 6471 version "1.3.0"
6229 resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" 6472 resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
...@@ -6305,6 +6548,11 @@ mem@^4.0.0: ...@@ -6305,6 +6548,11 @@ mem@^4.0.0:
6305 mimic-fn "^1.0.0" 6548 mimic-fn "^1.0.0"
6306 p-is-promise "^1.1.0" 6549 p-is-promise "^1.1.0"
6307 6550
6551 +memoize-one@^5.0.0:
6552 + version "5.0.5"
6553 + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.0.5.tgz#8cd3809555723a07684afafcd6f756072ac75d7e"
6554 + integrity sha512-ey6EpYv0tEaIbM/nTDOpHciXUvd+ackQrJgEzBwemhZZIWZjcyodqEcrmqDy2BKRTM3a65kKBV4WtLXJDt26SQ==
6555 +
6308 memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1: 6556 memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1:
6309 version "0.4.1" 6557 version "0.4.1"
6310 resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" 6558 resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
...@@ -6493,6 +6741,18 @@ mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdi ...@@ -6493,6 +6741,18 @@ mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdi
6493 dependencies: 6741 dependencies:
6494 minimist "0.0.8" 6742 minimist "0.0.8"
6495 6743
6744 +moment-timezone@^0.5.26:
6745 + version "0.5.26"
6746 + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.26.tgz#c0267ca09ae84631aa3dc33f65bedbe6e8e0d772"
6747 + integrity sha512-sFP4cgEKTCymBBKgoxZjYzlSovC20Y6J7y3nanDc5RoBIXKlZhoYwBoZGe3flwU6A372AcRwScH8KiwV6zjy1g==
6748 + dependencies:
6749 + moment ">= 2.9.0"
6750 +
6751 +"moment@>= 2.9.0":
6752 + version "2.24.0"
6753 + resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b"
6754 + integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==
6755 +
6496 moment@^2.20.1, moment@^2.22.2: 6756 moment@^2.20.1, moment@^2.22.2:
6497 version "2.22.2" 6757 version "2.22.2"
6498 resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66" 6758 resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66"
...@@ -6732,7 +6992,7 @@ node-sass@4.12.0: ...@@ -6732,7 +6992,7 @@ node-sass@4.12.0:
6732 dependencies: 6992 dependencies:
6733 abbrev "1" 6993 abbrev "1"
6734 6994
6735 -nopt@^4.0.1: 6995 +nopt@^4.0.1, nopt@~4.0.1:
6736 version "4.0.1" 6996 version "4.0.1"
6737 resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" 6997 resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
6738 dependencies: 6998 dependencies:
...@@ -7291,7 +7551,7 @@ pnp-webpack-plugin@1.4.3: ...@@ -7291,7 +7551,7 @@ pnp-webpack-plugin@1.4.3:
7291 dependencies: 7551 dependencies:
7292 ts-pnp "^1.1.2" 7552 ts-pnp "^1.1.2"
7293 7553
7294 -popper.js@^1.14.1: 7554 +popper.js@^1.14.1, popper.js@^1.14.4:
7295 version "1.15.0" 7555 version "1.15.0"
7296 resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.15.0.tgz#5560b99bbad7647e9faa475c6b8056621f5a4ff2" 7556 resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.15.0.tgz#5560b99bbad7647e9faa475c6b8056621f5a4ff2"
7297 7557
...@@ -7926,6 +8186,25 @@ pretty-format@^24.8.0: ...@@ -7926,6 +8186,25 @@ pretty-format@^24.8.0:
7926 ansi-styles "^3.2.0" 8186 ansi-styles "^3.2.0"
7927 react-is "^16.8.4" 8187 react-is "^16.8.4"
7928 8188
8189 +pretty@^2.0.0:
8190 + version "2.0.0"
8191 + resolved "https://registry.yarnpkg.com/pretty/-/pretty-2.0.0.tgz#adbc7960b7bbfe289a557dc5f737619a220d06a5"
8192 + integrity sha1-rbx5YLe7/iiaVX3F9zdhmiINBqU=
8193 + dependencies:
8194 + condense-newlines "^0.2.1"
8195 + extend-shallow "^2.0.1"
8196 + js-beautify "^1.6.12"
8197 +
8198 +prettysize@^2.0.0:
8199 + version "2.0.0"
8200 + resolved "https://registry.yarnpkg.com/prettysize/-/prettysize-2.0.0.tgz#902c02480d865d9cc0813011c9feb4fa02ce6996"
8201 + integrity sha512-VVtxR7sOh0VsG8o06Ttq5TrI1aiZKmC+ClSn4eBPaNf4SHr5lzbYW+kYGX3HocBL/MfpVrRfFZ9V3vCbLaiplg==
8202 +
8203 +printj@~1.1.0, printj@~1.1.2:
8204 + version "1.1.2"
8205 + resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222"
8206 + integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==
8207 +
7929 prismjs@^1.8.4, prismjs@~1.15.0: 8208 prismjs@^1.8.4, prismjs@~1.15.0:
7930 version "1.15.0" 8209 version "1.15.0"
7931 resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.15.0.tgz#8801d332e472091ba8def94976c8877ad60398d9" 8210 resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.15.0.tgz#8801d332e472091ba8def94976c8877ad60398d9"
...@@ -7992,6 +8271,11 @@ property-information@^5.0.0, property-information@^5.0.1: ...@@ -7992,6 +8271,11 @@ property-information@^5.0.0, property-information@^5.0.1:
7992 dependencies: 8271 dependencies:
7993 xtend "^4.0.1" 8272 xtend "^4.0.1"
7994 8273
8274 +proto-list@~1.2.1:
8275 + version "1.2.4"
8276 + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
8277 + integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=
8278 +
7995 proxy-addr@~2.0.4: 8279 proxy-addr@~2.0.4:
7996 version "2.0.4" 8280 version "2.0.4"
7997 resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" 8281 resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93"
...@@ -8368,7 +8652,14 @@ react-images@^0.5.19: ...@@ -8368,7 +8652,14 @@ react-images@^0.5.19:
8368 react-scrolllock "^2.0.1" 8652 react-scrolllock "^2.0.1"
8369 react-transition-group "2" 8653 react-transition-group "2"
8370 8654
8371 -react-is@^16.8.1, react-is@^16.8.4: 8655 +react-input-autosize@^2.2.1:
8656 + version "2.2.1"
8657 + resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-2.2.1.tgz#ec428fa15b1592994fb5f9aa15bb1eb6baf420f8"
8658 + integrity sha512-3+K4CD13iE4lQQ2WlF8PuV5htfmTRLH6MDnfndHM6LuBRszuXnuyIfE7nhSKt8AzRBZ50bu0sAhkNMeS5pxQQA==
8659 + dependencies:
8660 + prop-types "^15.5.8"
8661 +
8662 +react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4:
8372 version "16.8.6" 8663 version "16.8.6"
8373 resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" 8664 resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16"
8374 8665
...@@ -8407,6 +8698,18 @@ react-popper@^0.10.4: ...@@ -8407,6 +8698,18 @@ react-popper@^0.10.4:
8407 popper.js "^1.14.1" 8698 popper.js "^1.14.1"
8408 prop-types "^15.6.1" 8699 prop-types "^15.6.1"
8409 8700
8701 +react-popper@^1.3.3:
8702 + version "1.3.3"
8703 + resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-1.3.3.tgz#2c6cef7515a991256b4f0536cd4bdcb58a7b6af6"
8704 + integrity sha512-ynMZBPkXONPc5K4P5yFWgZx5JGAUIP3pGGLNs58cfAPgK67olx7fmLp+AdpZ0+GoQ+ieFDa/z4cdV6u7sioH6w==
8705 + dependencies:
8706 + "@babel/runtime" "^7.1.2"
8707 + create-react-context "<=0.2.2"
8708 + popper.js "^1.14.4"
8709 + prop-types "^15.6.1"
8710 + typed-styles "^0.0.7"
8711 + warning "^4.0.2"
8712 +
8410 react-prop-toggle@^1.0.2: 8713 react-prop-toggle@^1.0.2:
8411 version "1.0.2" 8714 version "1.0.2"
8412 resolved "https://registry.yarnpkg.com/react-prop-toggle/-/react-prop-toggle-1.0.2.tgz#8b0b7e74653606b1427cfcf6c4eaa9198330568e" 8715 resolved "https://registry.yarnpkg.com/react-prop-toggle/-/react-prop-toggle-1.0.2.tgz#8b0b7e74653606b1427cfcf6c4eaa9198330568e"
...@@ -8480,6 +8783,22 @@ react-select2-wrapper@^1.0.4-beta6: ...@@ -8480,6 +8783,22 @@ react-select2-wrapper@^1.0.4-beta6:
8480 select2 "^4.0.0" 8783 select2 "^4.0.0"
8481 shallow-equal-fuzzy "^0.0.2" 8784 shallow-equal-fuzzy "^0.0.2"
8482 8785
8786 +react-select@^3.0.4:
8787 + version "3.0.4"
8788 + resolved "https://registry.yarnpkg.com/react-select/-/react-select-3.0.4.tgz#16bde37c24fd4f6444914d4681e78f15ffbc86d3"
8789 + integrity sha512-fbVISKa/lSUlLsltuatfUiKcWCNvdLXxFFyrzVQCBUsjxJZH/m7UMPdw/ywmRixAmwXAP++MdbNNZypOsiDEfA==
8790 + dependencies:
8791 + "@babel/runtime" "^7.4.4"
8792 + "@emotion/cache" "^10.0.9"
8793 + "@emotion/core" "^10.0.9"
8794 + "@emotion/css" "^10.0.9"
8795 + classnames "^2.2.5"
8796 + memoize-one "^5.0.0"
8797 + prop-types "^15.6.0"
8798 + raf "^3.4.0"
8799 + react-input-autosize "^2.2.1"
8800 + react-transition-group "^2.2.1"
8801 +
8483 react-shuffle@2.1.0: 8802 react-shuffle@2.1.0:
8484 version "2.1.0" 8803 version "2.1.0"
8485 resolved "https://registry.yarnpkg.com/react-shuffle/-/react-shuffle-2.1.0.tgz#978de4ed7ea006fd4eaa5b8756b607da3c05f7ef" 8804 resolved "https://registry.yarnpkg.com/react-shuffle/-/react-shuffle-2.1.0.tgz#978de4ed7ea006fd4eaa5b8756b607da3c05f7ef"
...@@ -8573,20 +8892,20 @@ react-transition-group@^1.2.0: ...@@ -8573,20 +8892,20 @@ react-transition-group@^1.2.0:
8573 prop-types "^15.5.6" 8892 prop-types "^15.5.6"
8574 warning "^3.0.0" 8893 warning "^3.0.0"
8575 8894
8576 -react-transition-group@^2.5.2: 8895 +react-transition-group@^2.2.1, react-transition-group@^2.6.1:
8577 - version "2.5.2" 8896 + version "2.9.0"
8578 - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.5.2.tgz#9457166a9ba6ce697a3e1b076b3c049b9fb2c408" 8897 + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d"
8579 dependencies: 8898 dependencies:
8580 - dom-helpers "^3.3.1" 8899 + dom-helpers "^3.4.0"
8581 loose-envify "^1.4.0" 8900 loose-envify "^1.4.0"
8582 prop-types "^15.6.2" 8901 prop-types "^15.6.2"
8583 react-lifecycles-compat "^3.0.4" 8902 react-lifecycles-compat "^3.0.4"
8584 8903
8585 -react-transition-group@^2.6.1: 8904 +react-transition-group@^2.5.2:
8586 - version "2.9.0" 8905 + version "2.5.2"
8587 - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d" 8906 + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.5.2.tgz#9457166a9ba6ce697a3e1b076b3c049b9fb2c408"
8588 dependencies: 8907 dependencies:
8589 - dom-helpers "^3.4.0" 8908 + dom-helpers "^3.3.1"
8590 loose-envify "^1.4.0" 8909 loose-envify "^1.4.0"
8591 prop-types "^15.6.2" 8910 prop-types "^15.6.2"
8592 react-lifecycles-compat "^3.0.4" 8911 react-lifecycles-compat "^3.0.4"
...@@ -8749,12 +9068,6 @@ reduce-css-calc@^2.0.0: ...@@ -8749,12 +9068,6 @@ reduce-css-calc@^2.0.0:
8749 css-unit-converter "^1.1.1" 9068 css-unit-converter "^1.1.1"
8750 postcss-value-parser "^3.3.0" 9069 postcss-value-parser "^3.3.0"
8751 9070
8752 -redux-logger@^3.0.6:
8753 - version "3.0.6"
8754 - resolved "https://registry.yarnpkg.com/redux-logger/-/redux-logger-3.0.6.tgz#f7555966f3098f3c88604c449cf0baf5778274bf"
8755 - dependencies:
8756 - deep-diff "^0.3.5"
8757 -
8758 redux-thunk@^2.3.0: 9071 redux-thunk@^2.3.0:
8759 version "2.3.0" 9072 version "2.3.0"
8760 resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622" 9073 resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622"
...@@ -9167,6 +9480,21 @@ selfsigned@^1.10.4: ...@@ -9167,6 +9480,21 @@ selfsigned@^1.10.4:
9167 dependencies: 9480 dependencies:
9168 node-forge "0.7.5" 9481 node-forge "0.7.5"
9169 9482
9483 +semantic-ui-react@^0.87.3:
9484 + version "0.87.3"
9485 + resolved "https://registry.yarnpkg.com/semantic-ui-react/-/semantic-ui-react-0.87.3.tgz#59b6e1ca52b202bf6deed4c65e81b170b4a12bf6"
9486 + integrity sha512-YJgFYEheeFBMm/epZpIpWKF9glgSShdLPiY8zoUi+KJ0IKtLtbI8RbMD/ELbZkY+SO/IWbK/f/86pWt3PVvMVA==
9487 + dependencies:
9488 + "@babel/runtime" "^7.1.2"
9489 + "@semantic-ui-react/event-stack" "^3.1.0"
9490 + classnames "^2.2.6"
9491 + keyboard-key "^1.0.4"
9492 + lodash "^4.17.11"
9493 + prop-types "^15.6.2"
9494 + react-is "^16.7.0"
9495 + react-popper "^1.3.3"
9496 + shallowequal "^1.1.0"
9497 +
9170 "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1: 9498 "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1:
9171 version "5.6.0" 9499 version "5.6.0"
9172 resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" 9500 resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
...@@ -9290,7 +9618,7 @@ shallowequal@^0.2.2: ...@@ -9290,7 +9618,7 @@ shallowequal@^0.2.2:
9290 dependencies: 9618 dependencies:
9291 lodash.keys "^3.1.2" 9619 lodash.keys "^3.1.2"
9292 9620
9293 -shallowequal@^1.0.2: 9621 +shallowequal@^1.0.2, shallowequal@^1.1.0:
9294 version "1.1.0" 9622 version "1.1.0"
9295 resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" 9623 resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8"
9296 9624
...@@ -9323,6 +9651,11 @@ showdown@1.8.6: ...@@ -9323,6 +9651,11 @@ showdown@1.8.6:
9323 dependencies: 9651 dependencies:
9324 yargs "^10.0.3" 9652 yargs "^10.0.3"
9325 9653
9654 +sigmund@^1.0.1:
9655 + version "1.0.1"
9656 + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
9657 + integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=
9658 +
9326 signal-exit@^3.0.0, signal-exit@^3.0.2: 9659 signal-exit@^3.0.0, signal-exit@^3.0.2:
9327 version "3.0.2" 9660 version "3.0.2"
9328 resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 9661 resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
...@@ -9453,7 +9786,7 @@ source-map@^0.4.2: ...@@ -9453,7 +9786,7 @@ source-map@^0.4.2:
9453 dependencies: 9786 dependencies:
9454 amdefine ">=0.0.4" 9787 amdefine ">=0.0.4"
9455 9788
9456 -source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6: 9789 +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7:
9457 version "0.5.7" 9790 version "0.5.7"
9458 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 9791 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
9459 9792
...@@ -9520,6 +9853,13 @@ sprintf-js@~1.0.2: ...@@ -9520,6 +9853,13 @@ sprintf-js@~1.0.2:
9520 version "1.0.3" 9853 version "1.0.3"
9521 resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 9854 resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
9522 9855
9856 +ssf@~0.10.2:
9857 + version "0.10.2"
9858 + resolved "https://registry.yarnpkg.com/ssf/-/ssf-0.10.2.tgz#65b2b4fcdfd967bc8e8383a41349009893115976"
9859 + integrity sha512-rDhAPm9WyIsY8eZEKyE8Qsotb3j/wBdvMWBUsOhJdfhKGLfQidRjiBUV0y/MkyCLiXQ38FG6LWW/VYUtqlIDZQ==
9860 + dependencies:
9861 + frac "~1.1.2"
9862 +
9523 sshpk@^1.7.0: 9863 sshpk@^1.7.0:
9524 version "1.15.1" 9864 version "1.15.1"
9525 resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.15.1.tgz#b79a089a732e346c6e0714830f36285cd38191a2" 9865 resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.15.1.tgz#b79a089a732e346c6e0714830f36285cd38191a2"
...@@ -10011,6 +10351,11 @@ type-is@~1.6.16: ...@@ -10011,6 +10351,11 @@ type-is@~1.6.16:
10011 media-typer "0.3.0" 10351 media-typer "0.3.0"
10012 mime-types "~2.1.18" 10352 mime-types "~2.1.18"
10013 10353
10354 +typed-styles@^0.0.7:
10355 + version "0.0.7"
10356 + resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9"
10357 + integrity sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==
10358 +
10014 typedarray@^0.0.6: 10359 typedarray@^0.0.6:
10015 version "0.0.6" 10360 version "0.0.6"
10016 resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 10361 resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
...@@ -10288,6 +10633,13 @@ warning@^4.0.1: ...@@ -10288,6 +10633,13 @@ warning@^4.0.1:
10288 dependencies: 10633 dependencies:
10289 loose-envify "^1.0.0" 10634 loose-envify "^1.0.0"
10290 10635
10636 +warning@^4.0.2:
10637 + version "4.0.3"
10638 + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3"
10639 + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==
10640 + dependencies:
10641 + loose-envify "^1.0.0"
10642 +
10291 watchpack@^1.5.0: 10643 watchpack@^1.5.0:
10292 version "1.6.0" 10644 version "1.6.0"
10293 resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" 10645 resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
...@@ -10644,6 +10996,19 @@ x-is-string@^0.1.0: ...@@ -10644,6 +10996,19 @@ x-is-string@^0.1.0:
10644 version "0.1.0" 10996 version "0.1.0"
10645 resolved "https://registry.yarnpkg.com/x-is-string/-/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82" 10997 resolved "https://registry.yarnpkg.com/x-is-string/-/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82"
10646 10998
10999 +xlsx@^0.14.4:
11000 + version "0.14.4"
11001 + resolved "https://registry.yarnpkg.com/xlsx/-/xlsx-0.14.4.tgz#7c2ccfce81d56282df55d0cea76722ef83986c02"
11002 + integrity sha512-AYVNzZKmU9pxDf4d6dSOy52EivzRnJ5lo0Jyxqk7Pz5G+8dMCUsO1PdFlGj6C6MQZ8xBRPinmIpTHYzI2DyfXg==
11003 + dependencies:
11004 + adler-32 "~1.2.0"
11005 + cfb "^1.1.2"
11006 + codepage "~1.14.0"
11007 + commander "~2.17.1"
11008 + crc-32 "~1.2.0"
11009 + exit-on-epipe "~1.0.1"
11010 + ssf "~0.10.2"
11011 +
10647 xml-name-validator@^3.0.0: 11012 xml-name-validator@^3.0.0:
10648 version "3.0.0" 11013 version "3.0.0"
10649 resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" 11014 resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
......