From a64f3fdeaff8ec2e1b132772bdef915e40390487 Mon Sep 17 00:00:00 2001 From: nouffer Date: Mon, 12 Jul 2021 09:41:26 +0530 Subject: [PATCH] initial FBS admin --- .editorconfig | 14 ++ .env | 2 + .gitignore | 24 +++ CHANGELOG.md | 68 ++++++ ISSUE_TEMPLATE.md | 20 ++ LICENSE | 21 ++ REACT.md | 19 ++ README.md | 174 +++++++++++++++ jsconfig.json | 6 + migration.md | 34 +++ package.json | 86 ++++++++ public/avatars/1.jpg | Bin 0 -> 1913 bytes public/avatars/2.jpg | Bin 0 -> 2105 bytes public/avatars/3.jpg | Bin 0 -> 1645 bytes public/avatars/4.jpg | Bin 0 -> 2580 bytes public/avatars/5.jpg | Bin 0 -> 19058 bytes public/avatars/6.jpg | Bin 0 -> 1608 bytes public/avatars/7.jpg | Bin 0 -> 2059 bytes public/avatars/8.jpg | Bin 0 -> 20466 bytes public/favicon.ico | Bin 0 -> 1150 bytes public/index.html | 50 +++++ public/manifest.json | 15 ++ src/App.js | 40 ++++ src/App.test.js | 21 ++ src/assets/icons/index.js | 263 +++++++++++++++++++++++ src/assets/icons/logo-negative.js | 30 +++ src/assets/icons/logo.js | 29 +++ src/assets/icons/sygnet.js | 9 + src/containers/TheContent.js | 46 ++++ src/containers/TheFooter.js | 19 ++ src/containers/TheHeader.js | 94 ++++++++ src/containers/TheHeaderDropdown.js | 47 ++++ src/containers/TheHeaderDropdownMssg.js | 127 +++++++++++ src/containers/TheHeaderDropdownNotif.js | 70 ++++++ src/containers/TheHeaderDropdownTasks.js | 59 +++++ src/containers/TheLayout.js | 25 +++ src/containers/TheSidebar.js | 54 +++++ src/containers/_nav.js | 45 ++++ src/containers/index.js | 21 ++ src/index.js | 27 +++ src/polyfill.js | 63 ++++++ src/reusable/DocsLink.js | 28 +++ src/reusable/index.js | 5 + src/routes.js | 23 ++ src/scss/_custom.scss | 1 + src/scss/_fixes.scss | 16 ++ src/scss/_variables.scss | 1 + src/scss/style.scss | 11 + src/serviceWorker.js | 127 +++++++++++ src/setupTests.js | 15 ++ src/store.js | 17 ++ src/views/BoxDisplacemen/index.js | 149 +++++++++++++ src/views/Injection/index.js | 17 ++ src/views/MachineControl/index.js | 11 + src/views/MachineSheet/index.js | 11 + src/views/Measurement/index.js | 11 + src/views/dashboard/Dashboard.js | 115 ++++++++++ src/views/pages/login/Login.js | 78 +++++++ src/views/pages/page404/Page404.js | 44 ++++ src/views/pages/page500/Page500.js | 44 ++++ src/views/pages/register/Register.js | 80 +++++++ src/views/users/User.js | 41 ++++ src/views/users/Users.js | 86 ++++++++ src/views/users/UsersData.js | 29 +++ 64 files changed, 2582 insertions(+) create mode 100644 .editorconfig create mode 100644 .env create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 ISSUE_TEMPLATE.md create mode 100644 LICENSE create mode 100644 REACT.md create mode 100644 README.md create mode 100644 jsconfig.json create mode 100644 migration.md create mode 100644 package.json create mode 100644 public/avatars/1.jpg create mode 100644 public/avatars/2.jpg create mode 100644 public/avatars/3.jpg create mode 100644 public/avatars/4.jpg create mode 100644 public/avatars/5.jpg create mode 100644 public/avatars/6.jpg create mode 100644 public/avatars/7.jpg create mode 100644 public/avatars/8.jpg create mode 100644 public/favicon.ico create mode 100644 public/index.html create mode 100644 public/manifest.json create mode 100644 src/App.js create mode 100644 src/App.test.js create mode 100644 src/assets/icons/index.js create mode 100644 src/assets/icons/logo-negative.js create mode 100644 src/assets/icons/logo.js create mode 100644 src/assets/icons/sygnet.js create mode 100644 src/containers/TheContent.js create mode 100644 src/containers/TheFooter.js create mode 100644 src/containers/TheHeader.js create mode 100644 src/containers/TheHeaderDropdown.js create mode 100644 src/containers/TheHeaderDropdownMssg.js create mode 100644 src/containers/TheHeaderDropdownNotif.js create mode 100644 src/containers/TheHeaderDropdownTasks.js create mode 100644 src/containers/TheLayout.js create mode 100644 src/containers/TheSidebar.js create mode 100644 src/containers/_nav.js create mode 100644 src/containers/index.js create mode 100644 src/index.js create mode 100644 src/polyfill.js create mode 100644 src/reusable/DocsLink.js create mode 100644 src/reusable/index.js create mode 100644 src/routes.js create mode 100644 src/scss/_custom.scss create mode 100644 src/scss/_fixes.scss create mode 100644 src/scss/_variables.scss create mode 100644 src/scss/style.scss create mode 100644 src/serviceWorker.js create mode 100644 src/setupTests.js create mode 100644 src/store.js create mode 100644 src/views/BoxDisplacemen/index.js create mode 100644 src/views/Injection/index.js create mode 100644 src/views/MachineControl/index.js create mode 100644 src/views/MachineSheet/index.js create mode 100644 src/views/Measurement/index.js create mode 100644 src/views/dashboard/Dashboard.js create mode 100644 src/views/pages/login/Login.js create mode 100644 src/views/pages/page404/Page404.js create mode 100644 src/views/pages/page500/Page500.js create mode 100644 src/views/pages/register/Register.js create mode 100644 src/views/users/User.js create mode 100644 src/views/users/Users.js create mode 100644 src/views/users/UsersData.js diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..54e4850 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,14 @@ +# Editor configuration, see http://editorconfig.org +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/.env b/.env new file mode 100644 index 0000000..0c48d3c --- /dev/null +++ b/.env @@ -0,0 +1,2 @@ +PORT=3000 +CHOKIDAR_USEPOLLING=true diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..86ebeb5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# See https://help.github.com/ignore-files/ for more about ignoring files. + +# dependencies +/node_modules +package-lock.json + +# testing +/coverage + +# production +/build + +# misc +.eslintcache +.DS_Store +.idea +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..5b575d7 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,68 @@ +### Changelog + +All notable changes to this project will be documented in this file. Dates are displayed in UTC. + +#### [3.2.1](https://github.com/coreui/coreui-free-react-admin-template/compare/3.2.0...3.2.1) + +> 30 March 2021 + +- chore: dependencies update - closes #294 [`#294`](https://github.com/coreui/coreui-free-react-admin-template/issues/294) + +### [3.2.0](https://github.com/coreui/coreui-free-react-admin-template/compare/3.1.1...3.2.0) + +> 14 December 2020 + +- fix(BrandButtons): minor temp fixes with stylings [`f0c0585`](https://github.com/coreui/coreui-free-react-admin-template/commit/f0c05858329430c9487bdcfcf36d0aa98f60776d) +- refactor: polyfills cleanup [`9522ade`](https://github.com/coreui/coreui-free-react-admin-template/commit/9522ade1f1eb2c5a26d5208fe6e44be803123bd2) +- chore: 3.2.0 release for React 17 [`9d5ba97`](https://github.com/coreui/coreui-free-react-admin-template/commit/9d5ba97b4d7ab7d2adbb09b8a2c74d4f00fadbcc) +- test: refactor, import temp update [`f3f91c5`](https://github.com/coreui/coreui-free-react-admin-template/commit/f3f91c5d721754a2dac26143f312415c94c7ed68) +- chore: React 17 and dependencies update [`f6a710f`](https://github.com/coreui/coreui-free-react-admin-template/commit/f6a710ffd6996c9b6b026b8eebed6ff390757fe1) +- fix(_nav): no anonymous default export [`ed83c9a`](https://github.com/coreui/coreui-free-react-admin-template/commit/ed83c9a3d4199b8c6566a6e01396cdcbca80cf42) + +#### [3.1.1](https://github.com/coreui/coreui-free-react-admin-template/compare/3.1.0...3.1.1) + +> 26 November 2020 + +- chore: dependencies update [`5b70904`](https://github.com/coreui/coreui-free-react-admin-template/commit/5b70904d8f22f61a71def3306ea96ad640573c39) +- chore: add changelog [`de605cc`](https://github.com/coreui/coreui-free-react-admin-template/commit/de605cc1aadec9fb066625c6bc7b656590efc7bb) +- chore: limit changelog to version 3 [`6ac9a1d`](https://github.com/coreui/coreui-free-react-admin-template/commit/6ac9a1d094d4d293ddacb3f3562216a98be8e129) +- chore: add migration docs [`b661344`](https://github.com/coreui/coreui-free-react-admin-template/commit/b661344485a38404b8c2b1326e3a4258009b071c) +- chore: changelog update [`f9f1927`](https://github.com/coreui/coreui-free-react-admin-template/commit/f9f19274f046cf5f11f68d6c7eb7ae04c553f219) +- chore: .gitignore cleanup [`ba21e00`](https://github.com/coreui/coreui-free-react-admin-template/commit/ba21e001944322fb48e43264719b94368c589732) +- chore: 3.1.1 release [`081b957`](https://github.com/coreui/coreui-free-react-admin-template/commit/081b957291a8020e3d2e3b42c1f0a1455a49c524) + +#### [3.1.0](https://github.com/coreui/coreui-free-react-admin-template/compare/3.0.0...3.1.0) + +> 12 August 2020 + +- docs(readme): CoreUI react theme setup with laravel tutorial link add into readme [`#226`](https://github.com/coreui/coreui-free-react-admin-template/pull/226) +- fix: fix template testing [`68ce41d`](https://github.com/coreui/coreui-free-react-admin-template/commit/68ce41db6831d6995121766a5771dc9d667cc61a) +- chore: 3.1.0 release - update dependencies [`92f55b8`](https://github.com/coreui/coreui-free-react-admin-template/commit/92f55b8cdfd748a9e72649d5da62b93015a1c8e6) +- refactor: add reusable folder with DocsLink component [`eef84db`](https://github.com/coreui/coreui-free-react-admin-template/commit/eef84dbbd770c7253080a6f69443c40e4fecefd2) +- feat: add CSwitch examples to forms [`b31e452`](https://github.com/coreui/coreui-free-react-admin-template/commit/b31e452fd0ea736763d3032d7204cd478863b505) +- refactor: add CIcon example in _nav.js [`be5d1f0`](https://github.com/coreui/coreui-free-react-admin-template/commit/be5d1f0618f981f18c45be87afb56c4409bd3389) + +### [3.0.0](https://github.com/coreui/coreui-free-react-admin-template/compare/v2.6.1...3.0.0) + +> 17 June 2020 + +- feat: update template to version 3 [`cc79542`](https://github.com/coreui/coreui-free-react-admin-template/commit/cc795425bbf610873fcdf6938b5fb0aba49a4d97) +- refactor: update folder casing to kebab-case [`75138b0`](https://github.com/coreui/coreui-free-react-admin-template/commit/75138b0d0340cc21d58bcc2f800f042f86e54346) +- refactor: temporarily delete views folder [`cb4433a`](https://github.com/coreui/coreui-free-react-admin-template/commit/cb4433a3e33cb943bc1f47199110ead28fab517b) +- docs: README update [`188e0b1`](https://github.com/coreui/coreui-free-react-admin-template/commit/188e0b1c09fd7d47dc87d0410303ae43e8ee79de) +- chore: clear packages [`e236aad`](https://github.com/coreui/coreui-free-react-admin-template/commit/e236aad4ab0129e3611adfc2127670da64696e54) +- fix: delete obsolete files, fix logos [`f479a5d`](https://github.com/coreui/coreui-free-react-admin-template/commit/f479a5dc72bb5bb75b95a4b904d1c350be8fe7bc) +- chore: 3.0.0-beta.1 release [`d940f92`](https://github.com/coreui/coreui-free-react-admin-template/commit/d940f92ef741d7eab021af4fbcf385823c80421a) +- fix: fix accordion, delete aside [`0e6506e`](https://github.com/coreui/coreui-free-react-admin-template/commit/0e6506ea3303ca30bc21ba2bcf3717a3f009dc8c) +- refactor: optimize icon bundle size, update icons [`9fed168`](https://github.com/coreui/coreui-free-react-admin-template/commit/9fed168a534b88cb27371d6364b922418a5a13b4) +- refacotor: template updates [`1df8c15`](https://github.com/coreui/coreui-free-react-admin-template/commit/1df8c15030d45779f6adc5031153eaff09701d97) +- refactor: turn logos extensions from svg to js [`8c0deee`](https://github.com/coreui/coreui-free-react-admin-template/commit/8c0deeed169267155323a5b6bdbbdfaf8a856a41) +- refactor: rename containers from 'Default' to 'The', small fixes [`bfc79da`](https://github.com/coreui/coreui-free-react-admin-template/commit/bfc79da4039dd534ee49b4526978f7b949cea90b) +- refactor: update icons to version 2, rtl fixes [`8e4fbc2`](https://github.com/coreui/coreui-free-react-admin-template/commit/8e4fbc2aa8786b00a004282260c52986e1cd2430) +- fix: delete unneded icons, aside, fix readme.md [`1ee0561`](https://github.com/coreui/coreui-free-react-admin-template/commit/1ee05619ba15d050b73df21c8d1347e8329942d5) +- chore: 3.0.0 version release - update dependencies [`fd5236d`](https://github.com/coreui/coreui-free-react-admin-template/commit/fd5236d47340b336bf641041cbf6d48ec8b1081a) +- feat: add query parameters to Users view [`98f8b67`](https://github.com/coreui/coreui-free-react-admin-template/commit/98f8b677edb96f9175b7d4c20370c3d6744543bd) +- docs: add license [`db85786`](https://github.com/coreui/coreui-free-react-admin-template/commit/db85786be465fdb7a84b7337dbe876afc5e957bc) +- chore: update react.md [`5aa0cc3`](https://github.com/coreui/coreui-free-react-admin-template/commit/5aa0cc3ce15c841032cd75392418cfeb2e4d094f) +- docs: README cleanup [`82a4351`](https://github.com/coreui/coreui-free-react-admin-template/commit/82a4351daa6c8d452e19c7141dbadecc3f721c1b) +- fix: fix Icons views [`1777a09`](https://github.com/coreui/coreui-free-react-admin-template/commit/1777a092f6444497120e85c8852a1e4779640e71) diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..00045c0 --- /dev/null +++ b/ISSUE_TEMPLATE.md @@ -0,0 +1,20 @@ +Before opening an issue: + +- [Search for duplicate or closed issues](https://github.com/coreui/coreui-free-react-admin-template/issues?utf8=%E2%9C%93&q=is%3Aissue) +- Prepare a [reduced test case](https://css-tricks.com/reduced-test-cases/) for any bugs + + +When asking general "how to" questions: + +- Please do not open an issue here + +When reporting a bug, include: + +- Operating system and version (Windows, Mac OS X, Android, iOS, Win10 Mobile) +- Browser and version (Chrome, Firefox, Safari, IE, MS Edge, Opera, Android Browser) +- Reduced test cases and potential fixes using [CodePen](https://codepen.io/) or [JS Bin](https://jsbin.com/) + +When suggesting a feature, include: + +- As much detail as possible for what we should add and why it's important to CoreUI Admin Template +- Relevant links to prior art, screenshots, or live demos whenever possible diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b1ddb7f --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2020 creativeLabs Łukasz Holeczek. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/REACT.md b/REACT.md new file mode 100644 index 0000000..e3e62a4 --- /dev/null +++ b/REACT.md @@ -0,0 +1,19 @@ +# CoreUI React version + +## Intro +This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app) + +It uses Sass (with .scss). The styles are loaded at the template level with `node-sass-chokidar` css preprocessor + +Dependencies are handled by **npm**. + +## Usage +`npm i` - to install dependencies + +## Sctipts +`npm start` for developing (it runs webpack-dev-server) +`npm run build` to run a dev build + +## See also +[Create-React-App](CRA.md) +[Readme](./README.md) diff --git a/README.md b/README.md new file mode 100644 index 0000000..d1af00d --- /dev/null +++ b/README.md @@ -0,0 +1,174 @@ +[![@coreui coreui](https://img.shields.io/badge/@coreui%20-coreui-lightgrey.svg?style=flat-square)](https://github.com/coreui/coreui) +[![npm package][npm-coreui-badge]][npm-coreui] +[![NPM downloads][npm-coreui-download]][npm-coreui] +[![@coreui react](https://img.shields.io/badge/@coreui%20-react-lightgrey.svg?style=flat-square)](https://github.com/coreui/react) +[![npm package][npm-coreui-react-badge]][npm-coreui-react] +[![NPM downloads][npm-coreui-react-download]][npm-coreui-react] +[![npm next][npm-next]][npm] + +[npm-coreui]: https://www.npmjs.com/package/@coreui/coreui +[npm-coreui-badge]: https://img.shields.io/npm/v/@coreui/coreui.png?style=flat-square +[npm-coreui-download]: https://img.shields.io/npm/dm/@coreui/coreui.svg?style=flat-square +[npm-coreui-react]: https://www.npmjs.com/package/@coreui/react +[npm-coreui-react-badge]: https://img.shields.io/npm/v/@coreui/react.png?style=flat-square +[npm-coreui-react-download]: https://img.shields.io/npm/dm/@coreui/react.svg?style=flat-square +[npm-next]: https://img.shields.io/npm/v/@coreui/react/next.png?style=flat-square +[npm]: https://www.npmjs.com/package/@coreui/react + +# CoreUI Free React Admin Template v3 + +CoreUI is meant to be the UX game changer. Pure & transparent code is devoid of redundant components, so the app is light enough to offer ultimate user experience. This means mobile devices also, where the navigation is just as easy and intuitive as on a desktop or laptop. The CoreUI Layout API lets you customize your project for almost any device – be it Mobile, Web or WebApp – CoreUI covers them all! + +## Table of Contents + +* [Versions](#versions) +* [CoreUI Pro](#coreui-pro) +* [Installation](#installation) +* [Basic usage](#create-react-app) +* [What's included](#whats-included) +* [Documentation](#documentation) +* [Versioning](#versioning) +* [Creators](#creators) +* [Community](#community) +* [Copyright and License](#copyright-and-license) + +## Versions + +* [CoreUI Free Bootstrap Admin Template](https://github.com/coreui/coreui-free-bootstrap-admin-template) +* [CoreUI Free Angular 9+ Admin Template](https://github.com/coreui/coreui-free-angular-admin-template) +* [CoreUI Free React.js Admin Template](https://github.com/coreui/coreui-free-react-admin-template) +* [CoreUI Free Vue.js Admin Template](https://github.com/coreui/coreui-free-vue-admin-template) +* [CoreUI Free Laravel Admin Template](https://github.com/coreui/coreui-free-laravel-admin-template) +* [CoreUI Free Vue.js + Laravel Admin Template](https://github.com/coreui/coreui-free-vue-laravel-admin-template) + +## CoreUI Pro + +**Only customers with [Enterpise Membership Plan](https://coreui.io/pro/#buy) have access to private github CoreUI Pro repository.** + +* πŸ’ͺ [CoreUI Pro Bootstrap Admin Template](https://coreui.io/pro/) +* πŸ’ͺ [CoreUI Pro Angular 9+ Admin Template](https://coreui.io/pro/angular) +* πŸ’ͺ [CoreUI Pro React Admin Template](https://coreui.io/pro/react) +* πŸ’ͺ [CoreUI Pro Vue Admin Template](https://coreui.io/pro/vue) +* πŸ’ͺ [CoreUI Pro Laravel Admin Template](https://coreui.io/pro/laravel/) +* πŸ’ͺ [CoreUI Pro Vue.js + Laravel Admin Template](https://coreui.io/pro/vue-laravel/) + +## Installation + +### Clone repo + +``` bash +# clone the repo +$ git clone https://github.com/coreui/coreui-free-react-admin-template.git my-project + +# go into app's directory +$ cd my-project + +# install app's dependencies +$ npm install +``` + +### Copy and Paste + +Copy all your files to your project folder and then, + +``` bash +# go into app's directory +$ cd my-project + +# install app's dependencies +$ npm install +``` + +## Create React App +This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app) + +see also: +[CRA docs](https://create-react-app.dev/docs/getting-started) + +### Basic usage + +``` bash +# dev server with hot reload at http://localhost:3000 +$ npm start +``` + +Navigate to [http://localhost:3000](http://localhost:3000). The app will automatically reload if you change any of the source files. + +### Build + +Run `build` to build the project. The build artifacts will be stored in the `build/` directory. + +```bash +# build for production with minification +$ npm run build +``` + +## What's included + +Within the download you'll find the following directories and files, logically grouping common assets and providing both compiled and minified variations. You'll see something like this: + +``` +CoreUI-React#v3.0.0 +β”œβ”€β”€ public/ #static files +β”‚ └── index.html #html template +β”‚ +β”œβ”€β”€ src/ #project root +β”‚ β”œβ”€β”€ assets/ #assets - js icons object +β”‚ β”œβ”€β”€ containers/ #container source - template layout +| β”‚ β”œβ”€β”€ _nav.js #sidebar config +| β”‚ └── ... +β”‚ β”œβ”€β”€ scss/ #user scss/css source +β”‚ β”œβ”€β”€ views/ #views source +β”‚ β”œβ”€β”€ App.js +β”‚ β”œβ”€β”€ App.test.js +β”‚ β”œβ”€β”€ polyfill.js +β”‚ β”œβ”€β”€ index.js +β”‚ β”œβ”€β”€ routes.js #routes config +β”‚ └── store.js #template state example +β”‚ +└── package.json +``` + +## Documentation + +The documentation for the CoreUI Admin Template is hosted at our website [CoreUI for React](https://coreui.io/react/) + +### :film_strip: How to setup coreui react theme in laravel. Video tutorial available [here](https://youtu.be/HVVpbpNUJ8M) + +## Versioning + +For transparency into our release cycle and in striving to maintain backward compatibility, CoreUI Free Admin Template is maintained under [the Semantic Versioning guidelines](http://semver.org/). + +See [the Releases section of our project](https://github.com/coreui/coreui-free-react-admin-template/releases) for changelogs for each release version. + +## Creators + +**Łukasz Holeczek** +* +* +* + +**CoreUI team** +* https://github.com/orgs/coreui/people + +## Community + +Get updates on CoreUI's development and chat with the project maintainers and community members. + +- Follow [@core_ui on Twitter](https://twitter.com/core_ui). +- Read and subscribe to [CoreUI Blog](https://coreui.ui/blog/). + + +## Copyright and License + +copyright 2020 creativeLabs Łukasz Holeczek. + + +Code released under [the MIT license](https://github.com/coreui/coreui-free-react-admin-template/blob/master/LICENSE). +There is only one limitation you can't can’t re-distribute the CoreUI as stock. You can’t do this if you modify the CoreUI. In past we faced some problems with persons who tried to sell CoreUI based templates. + +## Support CoreUI Development + +CoreUI is an MIT licensed open source project and completely free to use. However, the amount of effort needed to maintain and develop new features for the project is not sustainable without proper financial backing. You can support development by buying [CoreUI Pro Version](https://coreui.io/pro/). + +We're also open to conversations regarding custom sponsorship / consulting arrangements. Get in touch on [Twitter](https://twitter.com/lukaszholeczek). diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..63f923e --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "baseUrl": "." + }, + "include": ["src"] +} \ No newline at end of file diff --git a/migration.md b/migration.md new file mode 100644 index 0000000..14b62c7 --- /dev/null +++ b/migration.md @@ -0,0 +1,34 @@ +# Migration from version 2 + +Migration from version 2 must be performed manually because the components library `@coreui/coreui-react` has been completely rewritten. + +The docs of the new components are available [here](https://coreui.io/react/docs/) + +The good news is that most probably it will be sufficient to migrate layout components (Sidebar, Header, Footer, Aside) and `Switch` component + +The best way to do a migration is: +1. Install `@coreui/coreui-react` v3 +2. Make a copy of the current `containers` folder +2. Paste [containers](https://github.com/coreui/coreui-free-react-admin-template/tree/master/src/containers) folder from v3 template to project +3. Correct routing paths +4. Add previous content to new template layout components +5. Replace `Switch` components with `CSwitch` + +Layout components/ corresponding components in version 3 +- Aside -> CSidebar (with prop aside={true}) +- AsideToggler -> CToggler +- Breadcrumb -> CBreadcrumbRouter +- Footer -> CFooter +- Header -> CHeader +- HeaderDropdown -> CDropdown +- NavbarBrand -> CSidebarBrand +- Sidebar -> CSidebar +- SidebarFooter -> CSidebarFooter +- SidebarForm -> CSidebarForm +- SidebarHeader -> CSidebarHeader +- SidebarMinimizer -> CSidebarMinimizer +- SidebarNav -> CSidebarNav + CSidebarNavDropdown + CSidebarNavItem +- SidebarToggler -> CSidebarToggler +- Switch -> CSwitch + +After the migration is done, you can start using new components of `@coreui/coreui-react` v3 library. diff --git a/package.json b/package.json new file mode 100644 index 0000000..0641365 --- /dev/null +++ b/package.json @@ -0,0 +1,86 @@ +{ + "name": "@coreui/coreui-free-react-admin-template", + "version": "3.2.1", + "description": "CoreUI React Open Source Bootstrap 4 Admin Template", + "author": { + "name": "CoreUI", + "url": "https://coreui.io", + "github": "https://github.com/coreui", + "twitter": "https://twitter.com/core_ui" + }, + "contributors": [ + { + "name": "CoreUI Team", + "url": "https://github.com/orgs/coreui/people" + } + ], + "homepage": ".", + "copyright": "Copyright 2017-2020 creativeLabs Łukasz Holeczek", + "license": "MIT", + "private": true, + "repository": { + "type": "git", + "url": "git@github.com:coreui/coreui-free-react-admin-template.git" + }, + "dependencies": { + "@coreui/chartjs": "^2.0.0", + "@coreui/coreui": "^3.4.0", + "@coreui/icons": "^2.0.0", + "@coreui/icons-react": "^1.1.0", + "@coreui/react": "^3.4.6", + "@coreui/react-chartjs": "^1.1.0", + "@coreui/utils": "^1.3.1", + "@wojtekmaj/enzyme-adapter-react-17": "^0.6.0", + "axios": "^0.21.1", + "classnames": "^2.2.6", + "core-js": "^3.9.1", + "enzyme": "^3.11.0", + "js-file-download": "^0.4.12", + "prop-types": "^15.7.2", + "react": "^17.0.2", + "react-app-polyfill": "^2.0.0", + "react-dom": "^17.0.2", + "react-redux": "^7.2.3", + "react-router-dom": "^5.2.0", + "redux": "^4.0.5", + "sass": "^1.32.8" + }, + "devDependencies": { + "@babel/core": "^7.13.14", + "auto-changelog": "~2.2.1", + "react-scripts": "^4.0.3" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "test:cov": "npm test -- --coverage --watchAll=false", + "test:debug": "react-scripts --inspect-brk test --runInBand", + "eject": "react-scripts eject", + "changelog": "auto-changelog --starting-version 3.0.0 --commit-limit false --hide-credit" + }, + "bugs": { + "url": "https://github.com/coreui/coreui-free-react-admin-template/issues" + }, + "eslintConfig": { + "extends": "react-app" + }, + "browserslist": [ + ">0.2%", + "not dead", + "not ie <= 10", + "not op_mini all" + ], + "jest": { + "collectCoverageFrom": [ + "src/**/*.{js,jsx}", + "!**/*index.js", + "!src/serviceWorker.js", + "!src/polyfill.js" + ] + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } +} diff --git a/public/avatars/1.jpg b/public/avatars/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0b087037586ffb857229dfa66d490cc6e204345a GIT binary patch literal 1913 zcmY*XcU0477ye}rW{?dEs2nJeDhNnr2w?^+5H?{QhR6;Z0*1Y0BnLi*U{!)b8D*20 zfEHzlf+DM|Fl1FhmWwI^X|z4<*XNJ>zV~_Vz3+X_dAZZvB|y?NKF}Wk@OTvf3H%H0 zCV(-C@eL*eAOOmvZ2^G04G0?fk$f%#eh+yJh|2*o0PsJ6@NN(&FG8R&=vTntuy26F z5eOs#0Y{=02nh7AAtV5UqreC>j|IRy<^Loo41mBvV1zKh+Xf7UAi#*f zR1nV#1_lR26x5F)2pUKu?}*fs=S1zq3h7HYpHrGB46g(H)hg`oabIU+pbF|DFe8FD zyzr#PvE7K)(WTT!I6F}v?kvFn^>qvc16%~E^R%7O{7;%JBYLEi(g$j1gMuAu>Sgs` zuDdh0qXI@c#HTQfURN_W2{&smPDjnc_`RFG!Of&~R*9e(ED*RYEOgv=TlNk4U;ytn zWN{-xq6}k=jC`VgV}dN$q@NpgcH*f8S*^447Q9|JD8ArgdzW{pRi@LG@Ro9#fw3j_ zoPL~zSm3040M@K)59nA-W71U5V9=-`y)PlhyG2-kYDIa(|w@NPlt0e6ab<`lm09=L$~r z-3&2<(&FJ)9z?sM=K322I!c)~Svh64VhF{g#VrHFF&JK|iFPQtAJrE@U3A@MW9!cA zmW~Ocx;g6FOxw79?v@n*Zf70=gWF59eC@T=Y5rgNDt(f>fZ;83|9^H1lwhzN8zAap>m?YpwczG{8&Q_oFztXCi+46+p&h;Mj@5eZthd zx}$lJ$(km4xAP?#X>Sf??Ig4fnPe-p6@iuu`e7zx9ZO9fX#=T>#z{Y~Xua`IEmPWQ{er?5sLE=a`%moytC5;}_h`Y4 zs6cBygV*K@UL4jKR>wgiEg5-wNUBRFpB+anWDQ2Mv6n*DOH^s&ZFNV|aUqjuku&R3 zYO!nEPbf1K>j4#IicQykKnGoflDU)F%zW^uKT@r9?h7+f&Cjj+`{|6jkLH%el~tTP zoI`yBZ9+3IdZv3~OmgEmv6Z;h&UPb7Qk@*&>(I!)70+to8t(_?V_-}34 zU5M@Vrw-<(tk#K~m@V}53;Pt{!X&!@jRxkhfNk-q!B-Tqq_~|)1F!j-KC7$B(^NT( zrFe)nO4T^%P`D#) zcQ=xlo!m9^qmHX$R#l$%K`$ZZj_4b#iFpXfq=D8>y{}zj`uz2!{k?Q6f(b+PTkvwa s+PkdPTj&wyeQ`mr@vvL|UF7GWocCsP38EwudAkV$)>LGIkj$O=6K!EAK>z>% literal 0 HcmV?d00001 diff --git a/public/avatars/2.jpg b/public/avatars/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e7367094a3a904ccf7ea8edd2bf2b7b9c778c1ef GIT binary patch literal 2105 zcmY+Ddpy(oAIHBlHiWt6s665nGFc(ya*|u_%8bSIQ#6^|D7V^~&T2w_=Fs9KV`h~| zqRnMz{Ld) zNCQ6*EdWXmalzr20T3W5mQMkI=p&$DdmbNz1^PAk>ip zi|oj5IO#dg#8g;Xl(A^zQ)Pb^c$VuK9 zo$m2Nr;3o-*`XNE&m9gh*Sdkp`~AqKyl-(~0CzwK5($vVF~p?Wsg zKQ3o4x>z%J6enQi_X~cf`qEVjL-st-9mKgaU{=W(bjN`Z;@IkH$%1ZhRE_@Hkxne9 zsAVF?JVl-$L6RWZH%1*az+w;dvR>afjJMs!U=nwGy%$;~W&AOFobvkO75Vi&;iL4Y zTK5plNB64vF@(}YdVK#MnH|2dU!9DOJYv>qs#QK-tH?7GUJtLIOQ4;h*kWPY$uIOH z6(H?eAN8Mw5nidAk9+u?u9_gN_IxgLCo{cHu(ftvR@y0O!O zVk@^)P90fW@XD=OmT!Gxh~>**?uRp91vx=JYJUu|sGY~uoJk#>7z%8KatTQ-z1yDM z1&w{_hp6Pka}SNqIQXU7byb+TQF4_hU9V*_7=@3l!YRiOevO|a_ByP+y>D6I*xHII zPdIVb0~c28a@`c0l6|5Hs-E=cSAosGU9l{~1l`YUlji#}FVFukrptJWCRW{v@Tu~_8#W@qDIPPv1>BTTp(HS>FmO^m)GJJiW zeSl^8uNg;EErqD(`CYm9$?7ZK1EHL7=C@Mk?9l*&^Ve3Z=yt~=2Ck2IHmAY2J@%ug zs@lpUsV291{(0Xv$;YNPkODZy*#aoNoH8_QCTL^%47YR5xv)lSjE!6%e|4qs@^2Jd9py^(mxf&d`SQE6ER!9dnFU2*UY! zw!Pdejoa=XoX2vD_~<*D8Ie&~`B~u@8}d34Tj>Dd>-FW3UthL)4|BdyZ{*f4;9z?0 z+PoST268Z&Sq4P6s3FG{QlE!mF^^WVrpCju{dlM}o%Yr+8OmbbU7M(wiLpjN7C~3mGP1XEf zzB(0jRXt;UpmCykt4@ppY$g^xiD#t*r;CG{3rr0txWk<$$2s!>42 zp{U-avmorJ{I~o)q>bFWVbxcLfsDc#tIm~zlLq*KHNq1hq2!mI*V7xpT^k<7w}qS0 jfPIt*cnl*72OIF*g+T6?jV}|R`E_B%hwV?mUJ>s<0pG59 literal 0 HcmV?d00001 diff --git a/public/avatars/3.jpg b/public/avatars/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..caf9a7e7c52563a34646b11fdc888197a6e73582 GIT binary patch literal 1645 zcmY+9e>~H99LGOj-~FCpe&&qQa?!=5lpQI*lIa#!Q%XYRchhvMxPC0HA1bv-2xS_! zvR1O%PHZ|P?H+1`g?=dM@?*Os6}5A9kGgyQ@p->rulM`?`Mf{+F8xz5ZP~7bSOBQh zIRFE`p&tT7fA*%NGynm_lpO+qegqi#Y)*;U0yZnB97x{{xWM2m@KgpPrcM}vMEnC1 zh5QT(g+^o0XcQKU!(p+8{|AC$7>Ph)Q79|{kHr&=jixX*{@nC$F#MwaKlfGXm4Ju= z^TB)=A_4;<1QQ{B1K0zA0SrOVw-2GQFb0Q$kpK0*R80T`Pc4l?!+7Lp2bxkuBrrwU zyPBbWLgz1V!$h<8&!jKJ@_j9Jr|M%;v&nwu7Veu4%wjAe{^yM^_vs%3Ll~Oc1tx-} zVD85iH*fWjYBjqR336sYHDB;(;pCyW*p-5~!x-T{X9W6;2ZLwJd1Cf_B)oSaF_GoF zY2HVRhK;}BXzuKLhUiw=Yi5#Vo{Qyps9V{HnOLfIx~6b~%kv?xNB3v8&i+8fI-bt( z6Y~;t!#KoFPKsTCoUlilxRNotr2RuoZB(5@VNZR2fjW*`HC9LIqRcCmPj2}*&|Xc* z>V)`YpU6sdK~5(}<$hL#eGnNVQEv{sG(wY=uPS~V z>!W4&c$(?BqHVlI1_sdEC^V_6J$-*g$@;{;rLrJeQ(uJFX;DL&V4}Nazc*aLgewD% z*F?(C*814|>@xn{eFyoU)fNs;dmhx0>l6ITq9dp{96dgfE4ctB-L@*$y?!y+KkDnw z^t(Ue?74uExY@y)JWXUA7%vEM`ZIWOBEN(23O`=hi%<)~ild4r&x&b^Gy#Dp_$5DWM=; zvg%0a#<11yc5@dw9xX4R^F##UrzVJ>#%Lp6_DHQ4_IHJDEliEBX*@$ymgSM6*)g+j zshdLsqfDC1sOx&%kcfj5$0~>OwuWzNV_q5TbX;jop!zPj9Ymi`p@^)L=!?QCG@Pri z)&`n)x6d;f*cb_$X7xI3cov-McZtq9LW7)K;w(4p~OxW0T|8?3~#U2yA=@Cr$r_bIM>;dDyc#l}0=9~NBD(z-71 zw9NMnXVqKe@g(nF5-M&wjtO!UpnESKT*u5bowTK<%nlE;>yv^?L z*h@ayvX{&nZl#Pour4qW`OoItrzve-dgvh9^0-sDpbM4z%zvw@&N^)_(Qs<*!sN?; z86X|g{+P{3E=uE>!Xa8?YRf9EJT{Xn z@|Q~)o^PMnoXdLQ)k63~=-!l*By*mzP9W>9l%`TuyV%D;$Pzo*#AER=1A#q-yXFx1RVa-}plV-doBaM@Qkn zC`?QS7PJ=wg|uV>@a?yTmO=rw->hRd&^ literal 0 HcmV?d00001 diff --git a/public/avatars/4.jpg b/public/avatars/4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..97f676969a42835666416ad1866a47fa47cfc431 GIT binary patch literal 2580 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

b5q(M^Ki{`D1 zB~~Ls1!SlEgP+$xoS&;%jyhah*mCnILGT3*mg|3ISg4N8RM8}0CuKRV0uEOcq{nVr z6kS5?qOH*0rzy%xmLy*t4g~NH5J9I5S>Zxq89Sar(F%-33H|+gN75@Nm;W(x6J6V1?{Y@;)eM8L1swYX)cvD{tUPE26D1F$%}pC=Q8Qq zj=PasZECP*_U^)DW0=dgjE>{1ul3fF8)v74^sNT9CO3O^MV0>mAu-8MyyorY#T6*` z6WK>)O zHe`!Bv2VeupKVH)ko3|M*;p?ysFPd>O4?d3l&DyZ$r@Lj`^LWKhI*%Mw>zKCyb;p#M1bB!b3trzE%1$pKXLC~Lz#Ecqf?}vkUzvLqAwtI2sq0M^buEpP z#!jAz!HPq(ecSxdoUGAy#7NKT!nvXC=g*B>Nr zoW;bS9rQZFR+0)u$5GOmR#dVUqhsw|GEtsy_WQ*0zNzskdCXav#`2D(yu>u5kCWxG z16$u)QFwb9(ztC9ZTgDw*TvT|^wMP9>L8P^((wL)lGoL7!a}B7%C;J#peoU5E%ngcG3ACZ(sDuiVse8sF?? zUUFlK$j-^SNkF=YHMrNUHetPn#Bli_PDzz}D>Qja+R*3$($%BZs|%EQ=d#&t@W!%+ z)e+ovt8HKp2{|mY<#Pj%)ady-e6jASGAtWc4edKC%jSASe2$23YAT(D%EPU_sMeZ? zFuZ5A{41viEJy9Nf0@4;5&TLW6Y;36ue!jy_2i~sb3bryaoEoAo*j@UD>x~6tb<2b z$s)>R+q8`!u*-Uvebv3K5FGpl6?73xI0g2t%X=f2B(&Ia&y5+2VI~5 zN3y!eACuWCbouHYA^`j}t{f7{Sy^mfbR2S>@_ujY#FJ_cRn zwjXLfo#XvR^^1ye?4&g0F-trD+|dDZ^_$n}3+G^j{x`b#++Go4Q3`4Sb5&ZEqPdjpMJ{@wK)8c&k9 zv7%Fhaq>->_>N=}rKx|Yr6~$;{3qqEKO|amRmpysAiVw#UK(^f{xzcHxDp#O8y!jl z!6V`YbHHMAQ;RHw47+)pM0t&*vZnx4h{veEP-)V6GJAUNEw6)|#v-`R_J9Q=LETeh zf^8_cG)K7z%u98qUKWzlx8tP$0P(r#<^Tfo;A3StLZXP$CmVU zXjD_6U;EVqW*^vS$xr=2{F^+%ZPp*~6d-`_Wk(KJU)Jlm;hAywGs=+`8_*k(qSkBy z@2w7vE#NzS=~XY-%D!pHnI-6PU2v&-Nv-#;)sp<5gUS7c{&^z7YYn=jjW69=NGu~U bHTIt5HeMeJBM@npt$I1GmBtQSzIC0?3 literal 0 HcmV?d00001 diff --git a/public/avatars/6.jpg b/public/avatars/6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1d2b884397eb019bbbaf752fddb46e70f18f8b09 GIT binary patch literal 1608 zcmZXPdpy&77{|ZcZ}-jCT+#){WlPh=$t6xi^OBNW+G?j1$}P8rgVl4qG-|zGJKF|00Jn|=UDOj}ekiRbg_Vxw< z1HL1F1IV@!UV&Ty0|=zX2(35JC|l1QPKTBnmkX z3WY{v&}bAEi^E~Dgdc%H5QIb^u_zQ)36I4qk%$UNr1_$M55hm$kA2@Vc|9OwfDtf) zU}OL%!yqzD-UOn6!Wjhnz7N1)QD_K>L%{wk&c81J3KOue9^m+S0j5}ij6?yQHOgrE zHX{||ebEe66E)Mdm{46CPbRiO?``QsOo|uJHbUKu{J;O?PXR$O8cv4Dz#3e(N~;y@ zZ0S*1BWB0!`0Jr&^nobat_1#3YK*f=!L<(uiRXoZpIGaO_{7_;Y!jG$5PM7H#cR{y z3){mtB{51j#Iy2LIdiGA;Y%~PrYX&E+tE~!)HW&EEy9tz_1fD-8Ivpx4qNKLpjiYyFWHTud4p)HrtqR#KYi62No zlQhGrlz!UubI6`XLYYs{$aOV*c`x)=W$YN8w^%72DrAjVbh~h0BbMRCBPE1jtro|I z*$Zcm9a5)C85O+PG7&Bn-WZO%EbdO6f!Z`hO$kcfxp`_j{DY^K;;x!)XG=hGZRQKF zUq&+sN0?4s0k6k8dpI;yq)&}BJO<&Pg8b}prj_5LxYbIVgc1&&> zh;Ux78;%)G3?y0JWc|@gdvA`_zbAZRg8pgQs$$R2MZ+S)b;~_p^yFEdse3NXZ}oai z2_=?PV&3@~b{(vr>f-f25@J;n@_=E|5^d!L!11shZ#Uf7*k@IX3+{B0Xr1VI{=K#U zQMNZH%}ic(C`Gdx zqZ>anrCQ#+RWz<1=bn<^uao8;aJb9YywJ3-?xHWx@KIJ(|MeZ2VahMX$)g+BTI~Jp zf}iVc55YN!xw0$0U`PggE~JgCtC<{fDXn7@dAnr$=d4cqsWr>28jEj~p(*!0`}U-( zrnm7$soQZmwaN@7l6#CPd_vrRq7$}1qk^+o7R~(>rpgBxQ|gT&p%IsRq@<#Xu%UYW z`Buic=dG1Ui^UZKphAOdt7E{L%iJv4=E1UTzq8MLx4^qlF!`o)_lHrvpd7e`SK@R4 zqmIBj$>7hNX6tb!zk1kNGlSgOD~74}aEr1MGl)a)Br<&OqP7U9b)zQ&zIZh_7=*Do zyy^{&#Z_k4YZkb?r`>YUW_B=z$wwM)bgx6E5VpB_g>x`c(NP8ezMS7Mw68D8V8F_5K9HfQy)#Timp3MS| xt#Xi48hko(OaI%t0|Os<({t97<(kBuHH+L0eb(0we(+o7F*IRakV%*K{SC#=m6ZSh literal 0 HcmV?d00001 diff --git a/public/avatars/7.jpg b/public/avatars/7.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2903cd2f9dcfd814cb0ab4c0b843d7793d78022c GIT binary patch literal 2059 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 + + + + + + + + + + CoreUI Free React.js Admin Template + + + + + + + +

+ + + diff --git a/public/manifest.json b/public/manifest.json new file mode 100644 index 0000000..1ca1724 --- /dev/null +++ b/public/manifest.json @@ -0,0 +1,15 @@ +{ + "short_name": "CoreUI-React", + "name": "CoreUI-React sample", + "icons": [ + { + "src": "./assets/img/favicon.png", + "sizes": "100x100", + "type": "image/png" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/src/App.js b/src/App.js new file mode 100644 index 0000000..0661b44 --- /dev/null +++ b/src/App.js @@ -0,0 +1,40 @@ +import React, { Component } from 'react'; +import { BrowserRouter, Route, Switch } from 'react-router-dom'; +import './scss/style.scss'; + + +const loading = ( +
+
+
+) + +// Containers +const TheLayout = React.lazy(() => import('./containers/TheLayout')); + +// Pages +const Login = React.lazy(() => import('./views/pages/login/Login')); +const Register = React.lazy(() => import('./views/pages/register/Register')); +const Page404 = React.lazy(() => import('./views/pages/page404/Page404')); +const Page500 = React.lazy(() => import('./views/pages/page500/Page500')); + +class App extends Component { + + render() { + return ( + + + + } /> + } /> + } /> + } /> + } /> + + + + ); + } +} + +export default App; diff --git a/src/App.test.js b/src/App.test.js new file mode 100644 index 0000000..87ba6fb --- /dev/null +++ b/src/App.test.js @@ -0,0 +1,21 @@ +import React from 'react' +import { shallow } from 'enzyme/build' +import App from './App' +import ChartLineSimple from './views/charts/ChartLineSimple' +import Dashboard from './views/dashboard/Dashboard.js' + + +it('mounts App without crashing', () => { + const wrapper = shallow() + wrapper.unmount() +}) + +it('mounts Dashboard without crashing', () => { + const wrapper = shallow() + wrapper.unmount() +}) + +it('mounts Charts without crashing', () => { + const wrapper = shallow( ) + wrapper.unmount() +}) diff --git a/src/assets/icons/index.js b/src/assets/icons/index.js new file mode 100644 index 0000000..171fcb3 --- /dev/null +++ b/src/assets/icons/index.js @@ -0,0 +1,263 @@ +import { sygnet } from './sygnet' +import { logo } from './logo' +import { logoNegative } from './logo-negative' + +import { + cibSkype, + cibFacebook, + cibTwitter, + cibLinkedin, + cibFlickr, + cibTumblr, + cibXing, + cibGithub, + cibStackoverflow, + cibYoutube, + cibDribbble, + cibInstagram, + cibPinterest, + cibVk, + cibYahoo, + cibBehance, + cibReddit, + cibVimeo, + cibCcMastercard, + cibCcVisa, + cibStripe, + cibPaypal, + cibGooglePay, + cibCcAmex +} from '@coreui/icons' +import { + cifUs, + cifBr, + cifIn, + cifFr, + cifEs, + cifPl +} from '@coreui/icons' +import { + cilAlignCenter, + cilAlignLeft, + cilAlignRight, + cilApplicationsSettings, + cilArrowRight, + cilArrowTop, + cilAsterisk, + cilBan, + cilBasket, + cilBell, + cilBold, + cilBookmark, + cilCalculator, + cilCalendar, + cilCloudDownload, + cilChartPie, + cilCheck, + cilChevronBottom, + cilChevronLeft, + cilChevronRight, + cilChevronTop, + cilCircle, + cilCheckCircle, + cilCode, + cilCommentSquare, + cilCreditCard, + cilCursor, + cilCursorMove, + cilDrop, + cilDollar, + cilEnvelopeClosed, + cilEnvelopeLetter, + cilEnvelopeOpen, + cilEuro, + cilGlobeAlt, + cilGrid, + cilFile, + cilFullscreen, + cilFullscreenExit, + cilGraph, + cilHome, + cilInbox, + cilIndentDecrease, + cilIndentIncrease, + cilInputPower, + cilItalic, + cilJustifyCenter, + cilJustifyLeft, + cilLaptop, + cilLayers, + cilLightbulb, + cilList, + cilListNumbered, + cilListRich, + cilLocationPin, + cilLockLocked, + cilMagnifyingGlass, + cilMap, + cilMoon, + cilNotes, + cilOptions, + cilPaperclip, + cilPaperPlane, + cilPencil, + cilPeople, + cilPhone, + cilPrint, + cilPuzzle, + cilSave, + cilScrubber, + cilSettings, + cilShare, + cilShareAll, + cilShareBoxed, + cilShieldAlt, + cilSpeech, + cilSpeedometer, + cilSpreadsheet, + cilStar, + cilSun, + cilTags, + cilTask, + cilTrash, + cilUnderline, + cilUser, + cilUserFemale, + cilUserFollow, + cilUserUnfollow, + cilX, + cilXCircle, + cilWarning, + cilEyedropper +} from '@coreui/icons' + +export const icons = Object.assign({}, { + sygnet, + logo, + logoNegative +}, { + cilAlignCenter, + cilAlignLeft, + cilAlignRight, + cilApplicationsSettings, + cilArrowRight, + cilArrowTop, + cilAsterisk, + cilBan, + cilBasket, + cilBell, + cilBold, + cilBookmark, + cilCalculator, + cilCalendar, + cilCloudDownload, + cilChartPie, + cilCheck, + cilChevronBottom, + cilChevronLeft, + cilChevronRight, + cilChevronTop, + cilCircle, + cilCheckCircle, + cilCode, + cilCommentSquare, + cilCreditCard, + cilCursor, + cilCursorMove, + cilDrop, + cilDollar, + cilEnvelopeClosed, + cilEnvelopeLetter, + cilEnvelopeOpen, + cilEuro, + cilGlobeAlt, + cilGrid, + cilFile, + cilFullscreen, + cilFullscreenExit, + cilGraph, + cilHome, + cilInbox, + cilIndentDecrease, + cilIndentIncrease, + cilInputPower, + cilItalic, + cilJustifyCenter, + cilJustifyLeft, + cilLaptop, + cilLayers, + cilLightbulb, + cilList, + cilListNumbered, + cilListRich, + cilLocationPin, + cilLockLocked, + cilMagnifyingGlass, + cilMap, + cilMoon, + cilNotes, + cilOptions, + cilPaperclip, + cilPaperPlane, + cilPencil, + cilPeople, + cilPhone, + cilPrint, + cilPuzzle, + cilSave, + cilScrubber, + cilSettings, + cilShare, + cilShareAll, + cilShareBoxed, + cilShieldAlt, + cilSpeech, + cilSpeedometer, + cilSpreadsheet, + cilStar, + cilSun, + cilTags, + cilTask, + cilTrash, + cilUnderline, + cilUser, + cilUserFemale, + cilUserFollow, + cilUserUnfollow, + cilX, + cilXCircle, + cilWarning +}, { + cifUs, + cifBr, + cifIn, + cifFr, + cifEs, + cifPl +}, { + cibSkype, + cibFacebook, + cibTwitter, + cibLinkedin, + cibFlickr, + cibTumblr, + cibXing, + cibGithub, + cibStackoverflow, + cibYoutube, + cibDribbble, + cibInstagram, + cibPinterest, + cibVk, + cibYahoo, + cibBehance, + cibReddit, + cibVimeo, + cibCcMastercard, + cibCcVisa, + cibStripe, + cibPaypal, + cibGooglePay, + cibCcAmex, + cilEyedropper +}) \ No newline at end of file diff --git a/src/assets/icons/logo-negative.js b/src/assets/icons/logo-negative.js new file mode 100644 index 0000000..337875e --- /dev/null +++ b/src/assets/icons/logo-negative.js @@ -0,0 +1,30 @@ +export const logoNegative = ['608 134', ` + coreui react pro logo + + + + + + + + + + + + + + + + + + + + + + + + + + + +`] diff --git a/src/assets/icons/logo.js b/src/assets/icons/logo.js new file mode 100644 index 0000000..01d6ddd --- /dev/null +++ b/src/assets/icons/logo.js @@ -0,0 +1,29 @@ +export const logo = ['608 134', ` + coreui react pro + + + + + + + + + + + + + + + + + + + + + + + + + + +`] diff --git a/src/assets/icons/sygnet.js b/src/assets/icons/sygnet.js new file mode 100644 index 0000000..fddab7e --- /dev/null +++ b/src/assets/icons/sygnet.js @@ -0,0 +1,9 @@ +export const sygnet = ['160 160', ` + coreui logo + + + + + + +`] diff --git a/src/containers/TheContent.js b/src/containers/TheContent.js new file mode 100644 index 0000000..20ba9b1 --- /dev/null +++ b/src/containers/TheContent.js @@ -0,0 +1,46 @@ +import React, { Suspense } from 'react' +import { + Redirect, + Route, + Switch +} from 'react-router-dom' +import { CContainer, CFade } from '@coreui/react' + +// routes config +import routes from '../routes' + +const loading = ( +
+
+
+) + +const TheContent = () => { + return ( +
+ + + + {routes.map((route, idx) => { + return route.component && ( + ( + + + + )} /> + ) + })} + + + + +
+ ) +} + +export default React.memo(TheContent) diff --git a/src/containers/TheFooter.js b/src/containers/TheFooter.js new file mode 100644 index 0000000..0b722f5 --- /dev/null +++ b/src/containers/TheFooter.js @@ -0,0 +1,19 @@ +import React from 'react' +import { CFooter } from '@coreui/react' + +const TheFooter = () => { + return ( + +
+ FBS + © 2021 DigitalVox. +
+
+ Powered by + DigitalVox +
+
+ ) +} + +export default React.memo(TheFooter) diff --git a/src/containers/TheHeader.js b/src/containers/TheHeader.js new file mode 100644 index 0000000..6763a92 --- /dev/null +++ b/src/containers/TheHeader.js @@ -0,0 +1,94 @@ +import React from 'react' +import { useSelector, useDispatch } from 'react-redux' +import { + CHeader, + CToggler, + CHeaderBrand, + CHeaderNav, + CHeaderNavItem, + CHeaderNavLink, + CSubheader, + CBreadcrumbRouter, + CLink +} from '@coreui/react' +import CIcon from '@coreui/icons-react' + +// routes config +import routes from '../routes' + +import { + TheHeaderDropdown, + TheHeaderDropdownMssg, + TheHeaderDropdownNotif, + TheHeaderDropdownTasks +} from './index' + +const TheHeader = () => { + const dispatch = useDispatch() + const sidebarShow = useSelector(state => state.sidebarShow) + + const toggleSidebar = () => { + const val = [true, 'responsive'].includes(sidebarShow) ? false : 'responsive' + dispatch({type: 'set', sidebarShow: val}) + } + + const toggleSidebarMobile = () => { + const val = [false, 'responsive'].includes(sidebarShow) ? true : 'responsive' + dispatch({type: 'set', sidebarShow: val}) + } + + return ( + + + + + {/* */} +

FBS

+
+ + + + Dashboard + + + Users + + + Settings + + + + + +
+ + + + +  Dashboard + + +  Settings + +
+
+
+ ) +} + +export default TheHeader diff --git a/src/containers/TheHeaderDropdown.js b/src/containers/TheHeaderDropdown.js new file mode 100644 index 0000000..94dec4f --- /dev/null +++ b/src/containers/TheHeaderDropdown.js @@ -0,0 +1,47 @@ +import React from 'react' +import { + CBadge, + CDropdown, + CDropdownItem, + CDropdownMenu, + CDropdownToggle, + CImg +} from '@coreui/react' +import CIcon from '@coreui/icons-react' + +const TheHeaderDropdown = () => { + return ( + + +
+ +
+
+ + + Account + + + + Updates + 42 + + +
+ ) +} + +export default TheHeaderDropdown diff --git a/src/containers/TheHeaderDropdownMssg.js b/src/containers/TheHeaderDropdownMssg.js new file mode 100644 index 0000000..b7f2af5 --- /dev/null +++ b/src/containers/TheHeaderDropdownMssg.js @@ -0,0 +1,127 @@ +import React from 'react' +import { + CBadge, + CDropdown, + CDropdownItem, + CDropdownMenu, + CDropdownToggle, + CImg +} from '@coreui/react' +import CIcon from '@coreui/icons-react' + +const TheHeaderDropdownMssg = () => { + const itemsCount = 4 + return ( + + + {itemsCount} + + + + You have {itemsCount} messages + + +
+
+
+ + +
+
+
+ John Doe + Just now +
+
+ Important message +
+
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt... +
+
+
+ + +
+
+
+ + +
+
+
+ Jane Dovve + 5 minutes ago +
+
Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt... +
+
+
+ + +
+
+
+ + +
+
+
+ Janet Doe + 1:52 PM +
+
Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt... +
+
+
+ + +
+
+
+ + +
+
+
+ Joe Doe + 4:03 AM +
+
Lorem ipsum dolor sit amet
+
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt... +
+
+
+ View all messages +
+
+ ) +} + +export default TheHeaderDropdownMssg \ No newline at end of file diff --git a/src/containers/TheHeaderDropdownNotif.js b/src/containers/TheHeaderDropdownNotif.js new file mode 100644 index 0000000..261ccff --- /dev/null +++ b/src/containers/TheHeaderDropdownNotif.js @@ -0,0 +1,70 @@ +import React from 'react' +import { + CBadge, + CDropdown, + CDropdownItem, + CDropdownMenu, + CDropdownToggle, + CProgress +} from '@coreui/react' +import CIcon from '@coreui/icons-react' + +const TheHeaderDropdownNotif = () => { + const itemsCount = 5 + return ( + + + + {itemsCount} + + + + You have {itemsCount} notifications + + New user registered + User deleted + Sales report is ready + New client + Server overloaded + + Server + + +
+ CPU Usage +
+ + 348 Processes. 1/4 Cores. +
+ +
+ Memory Usage +
+ + 11444GB/16384MB +
+ +
+ SSD 1 Usage +
+ + 243GB/256GB +
+
+
+ ) +} + +export default TheHeaderDropdownNotif \ No newline at end of file diff --git a/src/containers/TheHeaderDropdownTasks.js b/src/containers/TheHeaderDropdownTasks.js new file mode 100644 index 0000000..ce509b7 --- /dev/null +++ b/src/containers/TheHeaderDropdownTasks.js @@ -0,0 +1,59 @@ +import React from 'react' +import { + CBadge, + CDropdown, + CDropdownItem, + CDropdownMenu, + CDropdownToggle, + CProgress +} from '@coreui/react' +import CIcon from '@coreui/icons-react' + +const TheHeaderDropdownTasks = () => { + const itemsCount = 5 + return ( + + + + {itemsCount} + + + + You have {itemsCount} pending tasks + + +
Upgrade NPM & Bower 0%
+ +
+ +
ReactJS Version 25%
+ +
+ +
VueJS Version 50%
+ +
+ +
Add new layouts 75%
+ +
+ +
Angular 2 Cli Version 100%
+ +
+ View all tasks +
+
+ ) +} + +export default TheHeaderDropdownTasks \ No newline at end of file diff --git a/src/containers/TheLayout.js b/src/containers/TheLayout.js new file mode 100644 index 0000000..8fb6f1d --- /dev/null +++ b/src/containers/TheLayout.js @@ -0,0 +1,25 @@ +import React from 'react' +import { + TheContent, + TheSidebar, + TheFooter, + TheHeader +} from './index' + +const TheLayout = () => { + + return ( +
+ +
+ +
+ +
+ +
+
+ ) +} + +export default TheLayout diff --git a/src/containers/TheSidebar.js b/src/containers/TheSidebar.js new file mode 100644 index 0000000..3f50228 --- /dev/null +++ b/src/containers/TheSidebar.js @@ -0,0 +1,54 @@ +import React from 'react' +import { useSelector, useDispatch } from 'react-redux' +import { + CCreateElement, + CSidebar, + CSidebarBrand, + CSidebarNav, + CSidebarNavDivider, + CSidebarNavTitle, + CSidebarMinimizer, + CSidebarNavDropdown, + CSidebarNavItem, +} from '@coreui/react' + +import CIcon from '@coreui/icons-react' + +// sidebar nav config +import navigation from './_nav' + +const TheSidebar = () => { + const dispatch = useDispatch() + const show = useSelector(state => state.sidebarShow) + + return ( + dispatch({type: 'set', sidebarShow: val })} + > + +

FBS

+ +
+ + + + + +
+ ) +} + +export default React.memo(TheSidebar) diff --git a/src/containers/_nav.js b/src/containers/_nav.js new file mode 100644 index 0000000..59f3909 --- /dev/null +++ b/src/containers/_nav.js @@ -0,0 +1,45 @@ +import React from 'react' +import CIcon from '@coreui/icons-react' + +const _nav = [{ + _tag: 'CSidebarNavItem', + name: 'Dashboard', + to: '/dashboard', + icon: < CIcon name = "cil-speedometer" + customClasses = "c-sidebar-nav-icon" / > + }, + { + _tag: 'CSidebarNavTitle', + _children: ['Reports'] + }, + { + _tag: 'CSidebarNavItem', + name: 'Download reports', + to: '/boxdisplacement', + icon: 'cil-drop', + }, + // { + // _tag: 'CSidebarNavTitle', + // _children: ['Components'] + // }, + // { + // _tag: 'CSidebarNavDropdown', + // name: 'Base', + // route: '/base', + // icon: 'cil-puzzle', + // _children: [ + // { + // _tag: 'CSidebarNavItem', + // name: 'Breadcrumb', + // to: '/base/breadcrumbs', + // }, + // { + // _tag: 'CSidebarNavItem', + // name: 'Tooltips', + // to: '/base/tooltips', + // }, + // ], + // } +] + +export default _nav \ No newline at end of file diff --git a/src/containers/index.js b/src/containers/index.js new file mode 100644 index 0000000..253866f --- /dev/null +++ b/src/containers/index.js @@ -0,0 +1,21 @@ +import TheContent from './TheContent' +import TheFooter from './TheFooter' +import TheHeader from './TheHeader' +import TheHeaderDropdown from './TheHeaderDropdown' +import TheHeaderDropdownMssg from './TheHeaderDropdownMssg' +import TheHeaderDropdownNotif from './TheHeaderDropdownNotif' +import TheHeaderDropdownTasks from './TheHeaderDropdownTasks' +import TheLayout from './TheLayout' +import TheSidebar from './TheSidebar' + +export { + TheContent, + TheFooter, + TheHeader, + TheHeaderDropdown, + TheHeaderDropdownMssg, + TheHeaderDropdownNotif, + TheHeaderDropdownTasks, + TheLayout, + TheSidebar +} diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..189fecc --- /dev/null +++ b/src/index.js @@ -0,0 +1,27 @@ +import 'react-app-polyfill/ie11'; // For IE 11 support +import 'react-app-polyfill/stable'; +import 'core-js'; +import './polyfill' +import React from 'react'; +import ReactDOM from 'react-dom'; +import App from './App'; +import * as serviceWorker from './serviceWorker'; + +import { icons } from './assets/icons' + +import { Provider } from 'react-redux' +import store from './store' + +React.icons = icons + +ReactDOM.render( + + + , + document.getElementById('root') +); + +// If you want your app to work offline and load faster, you can change +// unregister() to register() below. Note this comes with some pitfalls. +// Learn more about service workers: http://bit.ly/CRA-PWA +serviceWorker.unregister(); diff --git a/src/polyfill.js b/src/polyfill.js new file mode 100644 index 0000000..1e73bf5 --- /dev/null +++ b/src/polyfill.js @@ -0,0 +1,63 @@ +/* +* required polyfills +*/ + +/** IE9, IE10 and IE11 requires all of the following polyfills. **/ +// import "core-js"; +// import 'core-js/features/symbol' +// import 'core-js/features/object' +// import 'core-js/features/function' +// import 'core-js/features/parse-int' +// import 'core-js/features/parse-float' +// import 'core-js/features/number' +// import 'core-js/features/math' +// import 'core-js/features/string' +// import 'core-js/features/date' +// import 'core-js/features/array' +// import 'core-js/features/regexp' +// import 'core-js/features/map' +// import 'core-js/features/weak-map' +// import 'core-js/features/set' +// import 'core-js/features/set/map'; + +/** IE10 and IE11 requires the following for the Reflect API. */ +// import 'core-js/features/reflect'; + +/** Evergreen browsers require these. **/ +// Used for reflect-metadata in JIT. If you use AOT (and only Angular decorators), you can remove. +// import 'core-js/features/reflect' + +// CustomEvent() constructor functionality in IE9, IE10, IE11 +(function () { + + if ( typeof window.CustomEvent === "function" ) return false + + function CustomEvent ( event, params ) { + params = params || { bubbles: false, cancelable: false, detail: undefined } + var evt = document.createEvent( 'CustomEvent' ) + evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail ) + return evt + } + + CustomEvent.prototype = window.Event.prototype + + window.CustomEvent = CustomEvent +})() + +if (!Element.prototype.matches) { + Element.prototype.matches = + Element.prototype.msMatchesSelector || + Element.prototype.webkitMatchesSelector; +} + +if (!Element.prototype.closest) { + Element.prototype.closest = function(s) { + var el = this; + + do { + if (Element.prototype.matches.call(el, s)) return el; + el = el.parentElement || el.parentNode; + } while (el !== null && el.nodeType === 1); + return null; + }; +} diff --git a/src/reusable/DocsLink.js b/src/reusable/DocsLink.js new file mode 100644 index 0000000..673447f --- /dev/null +++ b/src/reusable/DocsLink.js @@ -0,0 +1,28 @@ +import React from 'react' +import { CLink } from '@coreui/react' + +const DocsLink = props => { + const { + name, + text, + ...rest + } = props + + const href = name ? `https://coreui.io/react/docs/components/${name}` : props.href + + return ( +
+ + { text || 'docs' } + +
+ ) +} + +export default React.memo(DocsLink) \ No newline at end of file diff --git a/src/reusable/index.js b/src/reusable/index.js new file mode 100644 index 0000000..6b2e38a --- /dev/null +++ b/src/reusable/index.js @@ -0,0 +1,5 @@ +import DocsLink from './DocsLink' + +export { + DocsLink +} \ No newline at end of file diff --git a/src/routes.js b/src/routes.js new file mode 100644 index 0000000..51abd5f --- /dev/null +++ b/src/routes.js @@ -0,0 +1,23 @@ +import React from 'react'; + +const Dashboard = React.lazy(() => import('./views/dashboard/Dashboard')); +const BoxDisplacemen = React.lazy(() => import('./views/BoxDisplacemen/index')); +const CheckSheet = React.lazy(() => import('./views/CheckSheet/index')); +const Injection = React.lazy(() => import('./views/Injection/index')); +const MachineControl = React.lazy(() => import('./views/MachineControl/index')); +const Measurement = React.lazy(() => import('./views/Measurement/index')); +const MachineSheet = React.lazy(() => import('./views/MachineSheet/index')); + + +const routes = [ + { path: '/', exact: true, name: 'Home' }, + { path: '/dashboard', name: 'Dashboard', component: Dashboard }, + { path: '/boxdisplacement', exact: true, name: 'Box Displacemen', component: BoxDisplacemen }, + { path: '/checksheet', exact: true, name: 'Check Sheet', component: CheckSheet }, + { path: '/injection', exact: true, name: 'Injection', component: Injection }, + { path: '/machinecontrol', exact: true, name: 'Machine Control', component: MachineControl }, + { path: '/measurement', exact: true, name: 'Measurement', component: Measurement }, + { path: '/machinesheet', exact: true, name: 'Machine Sheet', component: MachineSheet }, +]; + +export default routes; diff --git a/src/scss/_custom.scss b/src/scss/_custom.scss new file mode 100644 index 0000000..15d367a --- /dev/null +++ b/src/scss/_custom.scss @@ -0,0 +1 @@ +// Here you can add other styles diff --git a/src/scss/_fixes.scss b/src/scss/_fixes.scss new file mode 100644 index 0000000..93d3535 --- /dev/null +++ b/src/scss/_fixes.scss @@ -0,0 +1,16 @@ +// todo: disabled button styles +button { + &:disabled { + cursor: default; + } + &.disabled { + cursor: default; + } +} + +// todo: brand button icon margin +.btn-brand:not(:only-child) { + .c-icon { + margin-top: 0 !important; + } +} diff --git a/src/scss/_variables.scss b/src/scss/_variables.scss new file mode 100644 index 0000000..3ee3142 --- /dev/null +++ b/src/scss/_variables.scss @@ -0,0 +1 @@ +// Variable overrides diff --git a/src/scss/style.scss b/src/scss/style.scss new file mode 100644 index 0000000..e993a80 --- /dev/null +++ b/src/scss/style.scss @@ -0,0 +1,11 @@ +// If you want to override variables do it here +@import "variables"; + +// Import CoreUI styles +@import "~@coreui/coreui/scss/coreui.scss"; + +// Some temp fixes +@import "fixes"; + +// If you want to add something do it here +@import "custom"; diff --git a/src/serviceWorker.js b/src/serviceWorker.js new file mode 100644 index 0000000..8859a0c --- /dev/null +++ b/src/serviceWorker.js @@ -0,0 +1,127 @@ +// In production, we register a service worker to serve assets from local cache. + +// This lets the app load faster on subsequent visits in production, and gives +// it offline capabilities. However, it also means that developers (and users) +// will only see deployed updates on the "N+1" visit to a page, since previously +// cached resources are updated in the background. + +// To learn more about the benefits of this model, read https://goo.gl/KwvDNy. +// This link also includes instructions on opting out of this behavior. + +const isLocalhost = Boolean( + window.location.hostname === 'localhost' || + // [::1] is the IPv6 localhost address. + window.location.hostname === '[::1]' || + // 127.0.0.1/8 is considered localhost for IPv4. + window.location.hostname.match( + /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ + ) +); + +export function register(config) { + if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { + // The URL constructor is available in all browsers that support SW. + const publicUrl = new URL(process.env.PUBLIC_URL, window.location); + if (publicUrl.origin !== window.location.origin) { + // Our service worker won't work if PUBLIC_URL is on a different origin + // from what our page is served on. This might happen if a CDN is used to + // serve assets; see https://github.com/facebook/create-react-app/issues/2374 + return; + } + + window.addEventListener('load', () => { + const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; + + if (isLocalhost) { + // This is running on localhost. Let's check if a service worker still exists or not. + checkValidServiceWorker(swUrl, config); + + // Add some additional logging to localhost, pointing developers to the + // service worker/PWA documentation. + navigator.serviceWorker.ready.then(() => { + console.log( + 'This web app is being served cache-first by a service ' + + 'worker. To learn more, visit https://goo.gl/SC7cgQ' + ); + }); + } else { + // Is not local host. Just register service worker + registerValidSW(swUrl, config); + } + }); + } +} + +function registerValidSW(swUrl, config) { + navigator.serviceWorker + .register(swUrl) + .then(registration => { + registration.onupdatefound = () => { + const installingWorker = registration.installing; + installingWorker.onstatechange = () => { + if (installingWorker.state === 'installed') { + if (navigator.serviceWorker.controller) { + // At this point, the old content will have been purged and + // the fresh content will have been added to the cache. + // It's the perfect time to display a "New content is + // available; please refresh." message in your web app. + console.log('New content is available; please refresh.'); + + // Execute callback + if (config.onUpdate) { + config.onUpdate(registration); + } + } else { + // At this point, everything has been precached. + // It's the perfect time to display a + // "Content is cached for offline use." message. + console.log('Content is cached for offline use.'); + + // Execute callback + if (config.onSuccess) { + config.onSuccess(registration); + } + } + } + }; + }; + }) + .catch(error => { + console.error('Error during service worker registration:', error); + }); +} + +function checkValidServiceWorker(swUrl, config) { + // Check if the service worker can be found. If it can't reload the page. + fetch(swUrl) + .then(response => { + // Ensure service worker exists, and that we really are getting a JS file. + if ( + response.status === 404 || + response.headers.get('content-type').indexOf('javascript') === -1 + ) { + // No service worker found. Probably a different app. Reload the page. + navigator.serviceWorker.ready.then(registration => { + registration.unregister().then(() => { + window.location.reload(); + }); + }); + } else { + // Service worker found. Proceed as normal. + registerValidSW(swUrl, config); + } + }) + .catch(() => { + console.log( + 'No internet connection found. App is running in offline mode.' + ); + }); +} + +export function unregister() { + if ('serviceWorker' in navigator) { + navigator.serviceWorker.ready.then(registration => { + registration.unregister(); + }); + } +} diff --git a/src/setupTests.js b/src/setupTests.js new file mode 100644 index 0000000..6f2c9fc --- /dev/null +++ b/src/setupTests.js @@ -0,0 +1,15 @@ +import {configure} from 'enzyme'; +import Adapter from '@wojtekmaj/enzyme-adapter-react-17'; + +configure({adapter: new Adapter()}); + +if (global.document) { + document.createRange = () => ({ + setStart: () => {}, + setEnd: () => {}, + commonAncestorContainer: { + nodeName: 'BODY', + ownerDocument: document, + }, + }); +} diff --git a/src/store.js b/src/store.js new file mode 100644 index 0000000..0267b34 --- /dev/null +++ b/src/store.js @@ -0,0 +1,17 @@ +import { createStore } from 'redux' + +const initialState = { + sidebarShow: 'responsive' +} + +const changeState = (state = initialState, { type, ...rest }) => { + switch (type) { + case 'set': + return {...state, ...rest } + default: + return state + } +} + +const store = createStore(changeState) +export default store \ No newline at end of file diff --git a/src/views/BoxDisplacemen/index.js b/src/views/BoxDisplacemen/index.js new file mode 100644 index 0000000..fd090e9 --- /dev/null +++ b/src/views/BoxDisplacemen/index.js @@ -0,0 +1,149 @@ +import React, { useState, useEffect } from 'react'; +import axios from 'axios'; +import { + CCard, + CCardBody, + CCardHeader, + CCol, + CRow, + CDropdown, + CDropdownDivider, + CDropdownItem, + CDropdownMenu, + CDropdownToggle, + ///// + CButton, + CCardFooter, + CForm, + CFormGroup, + CFormText, + CTextarea, + CInput, + CInputFile, + CInputCheckbox, + CInputRadio, + CLabel, + CSelect, + CSwitch +} from '@coreui/react' +import CIcon from '@coreui/icons-react' +const FileDownload = require('js-file-download'); + +function Index() { + + const baseUrl = "https://natnats.mobilous.com/"; + + var today = new Date(); + + var cdate = (today.getMonth()+1)+'/'+today.getDate()+'/'+today.getFullYear(); + + const [data, setData] = useState([]); + const [sdate, setSdate] = useState(cdate); + const [report, setReport] = useState(''); + const [selectedcons, setSelectedCons] = useState(''); + + useEffect(() => { + async function fetchData() { + // You can await here + const result = await axios('https://natnats.mobilous.com/getConstructionList'); + setData(result.data); + } + fetchData(); + }, []); + + function setingSDate(e){ + setSdate(e.target.value); + } + function setingReport(e){ + setReport(e.target.value); + } + + function setingSelectedCons(e) { + setSelectedCons(e.target.value); + } + + function doGetReport(){ + if(report == "" || selectedcons == ""){ + alert("Please select both Construction and Report"); + return; + } + var url = baseUrl + "/" + report + "?construction_id=" +selectedcons+ "&construction_date="+sdate; + console.log(selectedcons); + console.log(sdate); + console.log(report); + downloadReport(url); + } + + function downloadReport(url) { + const response = axios(url).then((res) => { + FileDownload(res.data, 'report.xls'); + }) + console.log(response); + } + + return ( + + + + + Reports + + + + + " "+ + { + data.map((cc, index) => { + return( + + ) + }) + } + + + + + + + + + Date ({sdate}) + + + + + + + + Select + + + + + + + + + + + + + + + + + + + Submit + + + + + + + + + ); +} + +export default Index diff --git a/src/views/Injection/index.js b/src/views/Injection/index.js new file mode 100644 index 0000000..d2098d8 --- /dev/null +++ b/src/views/Injection/index.js @@ -0,0 +1,17 @@ +import React from 'react' +import PropTypes from 'prop-types' + +function Injecttion(props) { + return ( +
+ Injection +
+ ) +} + +Injecttion.propTypes = { + +} + +export default Injecttion + diff --git a/src/views/MachineControl/index.js b/src/views/MachineControl/index.js new file mode 100644 index 0000000..73b36ed --- /dev/null +++ b/src/views/MachineControl/index.js @@ -0,0 +1,11 @@ +import React from 'react' + +function MachineControl() { + return ( +
+ Machine Control +
+ ) +} + +export default MachineControl diff --git a/src/views/MachineSheet/index.js b/src/views/MachineSheet/index.js new file mode 100644 index 0000000..42937c8 --- /dev/null +++ b/src/views/MachineSheet/index.js @@ -0,0 +1,11 @@ +import React from 'react' + +function MachineSheet() { + return ( +
+ Machine Sheet +
+ ) +} + +export default MachineSheet diff --git a/src/views/Measurement/index.js b/src/views/Measurement/index.js new file mode 100644 index 0000000..2798bb2 --- /dev/null +++ b/src/views/Measurement/index.js @@ -0,0 +1,11 @@ +import React from 'react' + +function index() { + return ( +
+ Measurement +
+ ) +} + +export default index diff --git a/src/views/dashboard/Dashboard.js b/src/views/dashboard/Dashboard.js new file mode 100644 index 0000000..4a8322b --- /dev/null +++ b/src/views/dashboard/Dashboard.js @@ -0,0 +1,115 @@ +import React, { lazy } from 'react' +import { + CBadge, + CButton, + CButtonGroup, + CCard, + CCardBody, + CCardFooter, + CCardHeader, + CCol, + CProgress, + CRow, + CCallout +} from '@coreui/react' +import CIcon from '@coreui/icons-react' + +import MainChartExample from '../charts/MainChartExample.js' + +const WidgetsDropdown = lazy(() => import('../widgets/WidgetsDropdown.js')) +const WidgetsBrand = lazy(() => import('../widgets/WidgetsBrand.js')) + +const Dashboard = () => { + return ( + <> + + + + + +

Traffic

+
November 2017
+
+ + + + + + { + ['Day', 'Month', 'Year'].map(value => ( + + {value} + + )) + } + + +
+ +
+ + + +
Visits
+ 29.703 Users (40%) + +
+ +
Unique
+ 24.093 Users (20%) + +
+ +
Pageviews
+ 78.706 Views (60%) + +
+ +
New Users
+ 22.123 Users (80%) + +
+ +
Bounce Rate
+ Average Rate (40.15%) + +
+
+
+
+ + + + ) +} + +export default Dashboard diff --git a/src/views/pages/login/Login.js b/src/views/pages/login/Login.js new file mode 100644 index 0000000..7f90972 --- /dev/null +++ b/src/views/pages/login/Login.js @@ -0,0 +1,78 @@ +import React from 'react' +import { Link } from 'react-router-dom' +import { + CButton, + CCard, + CCardBody, + CCardGroup, + CCol, + CContainer, + CForm, + CInput, + CInputGroup, + CInputGroupPrepend, + CInputGroupText, + CRow +} from '@coreui/react' +import CIcon from '@coreui/icons-react' + +const Login = () => { + return ( +
+ + + + + + + +

Login

+

Sign In to your account

+ + + + + + + + + + + + + + + + + + + Login + + + Forgot password? + + +
+
+
+ + +
+

Sign up

+

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut + labore et dolore magna aliqua.

+ + Register Now! + +
+
+
+
+
+
+
+
+ ) +} + +export default Login diff --git a/src/views/pages/page404/Page404.js b/src/views/pages/page404/Page404.js new file mode 100644 index 0000000..4461e64 --- /dev/null +++ b/src/views/pages/page404/Page404.js @@ -0,0 +1,44 @@ +import React from 'react' +import { + CButton, + CCol, + CContainer, + CInput, + CInputGroup, + CInputGroupPrepend, + CInputGroupAppend, + CInputGroupText, + CRow +} from '@coreui/react' +import CIcon from '@coreui/icons-react' + +const Page404 = () => { + return ( +
+ + + +
+

404

+

Oops! You{'\''}re lost.

+

The page you are looking for was not found.

+
+ + + + + + + + + Search + + +
+
+
+
+ ) +} + +export default Page404 diff --git a/src/views/pages/page500/Page500.js b/src/views/pages/page500/Page500.js new file mode 100644 index 0000000..1ea3998 --- /dev/null +++ b/src/views/pages/page500/Page500.js @@ -0,0 +1,44 @@ +import React from 'react' +import { + CButton, + CCol, + CContainer, + CInput, + CInputGroup, + CInputGroupAppend, + CInputGroupPrepend, + CInputGroupText, + CRow +} from '@coreui/react' +import CIcon from '@coreui/icons-react' + +const Page500 = () => { + return ( +
+ + + + +

500

+

Houston, we have a problem!

+

The page you are looking for is temporarily unavailable.

+
+ + + + + + + + + Search + + +
+
+
+
+ ) +} + +export default Page500 diff --git a/src/views/pages/register/Register.js b/src/views/pages/register/Register.js new file mode 100644 index 0000000..6837ae6 --- /dev/null +++ b/src/views/pages/register/Register.js @@ -0,0 +1,80 @@ +import React from 'react' +import { + CButton, + CCard, + CCardBody, + CCardFooter, + CCol, + CContainer, + CForm, + CInput, + CInputGroup, + CInputGroupPrepend, + CInputGroupText, + CRow +} from '@coreui/react' +import CIcon from '@coreui/icons-react' + +const Register = () => { + return ( +
+ + + + + + +

Register

+

Create your account

+ + + + + + + + + + + @ + + + + + + + + + + + + + + + + + + + + Create Account +
+
+ + + + facebook + + + twitter + + + +
+
+
+
+
+ ) +} + +export default Register diff --git a/src/views/users/User.js b/src/views/users/User.js new file mode 100644 index 0000000..330d154 --- /dev/null +++ b/src/views/users/User.js @@ -0,0 +1,41 @@ +import React from 'react' +import { CCard, CCardBody, CCardHeader, CCol, CRow } from '@coreui/react' +import CIcon from '@coreui/icons-react' + +import usersData from './UsersData' + +const User = ({match}) => { + const user = usersData.find( user => user.id.toString() === match.params.id) + const userDetails = user ? Object.entries(user) : + [['id', ( Not found)]] + + return ( + + + + + User id: {match.params.id} + + + + + { + userDetails.map(([key, value], index) => { + return ( + + + + + ) + }) + } + +
{`${key}:`}{value}
+
+
+
+
+ ) +} + +export default User diff --git a/src/views/users/Users.js b/src/views/users/Users.js new file mode 100644 index 0000000..05d525b --- /dev/null +++ b/src/views/users/Users.js @@ -0,0 +1,86 @@ +import React, { useState, useEffect } from 'react' +import { useHistory, useLocation } from 'react-router-dom' +import { + CBadge, + CCard, + CCardBody, + CCardHeader, + CCol, + CDataTable, + CRow, + CPagination +} from '@coreui/react' + +import usersData from './UsersData' + +const getBadge = status => { + switch (status) { + case 'Active': return 'success' + case 'Inactive': return 'secondary' + case 'Pending': return 'warning' + case 'Banned': return 'danger' + default: return 'primary' + } +} + +const Users = () => { + const history = useHistory() + const queryPage = useLocation().search.match(/page=([0-9]+)/, '') + const currentPage = Number(queryPage && queryPage[1] ? queryPage[1] : 1) + const [page, setPage] = useState(currentPage) + + const pageChange = newPage => { + currentPage !== newPage && history.push(`/users?page=${newPage}`) + } + + useEffect(() => { + currentPage !== page && setPage(currentPage) + }, [currentPage, page]) + + return ( + + + + + Users + example + + + history.push(`/users/${item.id}`)} + scopedSlots = {{ + 'status': + (item)=>( + + + {item.status} + + + ) + }} + /> + + + + + + ) +} + +export default Users diff --git a/src/views/users/UsersData.js b/src/views/users/UsersData.js new file mode 100644 index 0000000..f5f923a --- /dev/null +++ b/src/views/users/UsersData.js @@ -0,0 +1,29 @@ +const usersData = [ + {id: 0, name: 'John Doe', registered: '2018/01/01', role: 'Guest', status: 'Pending'}, + {id: 1, name: 'Samppa Nori', registered: '2018/01/01', role: 'Member', status: 'Active'}, + {id: 2, name: 'Estavan Lykos', registered: '2018/02/01', role: 'Staff', status: 'Banned'}, + {id: 3, name: 'Chetan Mohamed', registered: '2018/02/01', role: 'Admin', status: 'Inactive'}, + {id: 4, name: 'Derick Maximinus', registered: '2018/03/01', role: 'Member', status: 'Pending'}, + {id: 5, name: 'Friderik DÑvid', registered: '2018/01/21', role: 'Staff', status: 'Active'}, + {id: 6, name: 'Yiorgos Avraamu', registered: '2018/01/01', role: 'Member', status: 'Active'}, + {id: 7, name: 'Avram Tarasios', registered: '2018/02/01', role: 'Staff', status: 'Banned'}, + {id: 8, name: 'Quintin Ed', registered: '2018/02/01', role: 'Admin', status: 'Inactive'}, + {id: 9, name: 'Enéas Kwadwo', registered: '2018/03/01', role: 'Member', status: 'Pending'}, + {id: 10, name: 'Agapetus TadeÑő', registered: '2018/01/21', role: 'Staff', status: 'Active'}, + {id: 11, name: 'Carwyn Fachtna', registered: '2018/01/01', role: 'Member', status: 'Active'}, + {id: 12, name: 'Nehemiah Tatius', registered: '2018/02/01', role: 'Staff', status: 'Banned'}, + {id: 13, name: 'Ebbe Gemariah', registered: '2018/02/01', role: 'Admin', status: 'Inactive'}, + {id: 14, name: 'Eustorgios Amulius', registered: '2018/03/01', role: 'Member', status: 'Pending'}, + {id: 15, name: 'Leopold GÑspÑr', registered: '2018/01/21', role: 'Staff', status: 'Active'}, + {id: 16, name: 'Pompeius René', registered: '2018/01/01', role: 'Member', status: 'Active'}, + {id: 17, name: 'Paĉjo Jadon', registered: '2018/02/01', role: 'Staff', status: 'Banned'}, + {id: 18, name: 'Micheal Mercurius', registered: '2018/02/01', role: 'Admin', status: 'Inactive'}, + {id: 19, name: 'Ganesha Dubhghall', registered: '2018/03/01', role: 'Member', status: 'Pending'}, + {id: 20, name: 'Hiroto Šimun', registered: '2018/01/21', role: 'Staff', status: 'Active'}, + {id: 21, name: 'Vishnu Serghei', registered: '2018/01/01', role: 'Member', status: 'Active'}, + {id: 22, name: 'Zbyněk Phoibos', registered: '2018/02/01', role: 'Staff', status: 'Banned'}, + {id: 23, name: 'Aulus Agmundr', registered: '2018/01/01', role: 'Member', status: 'Pending'}, + {id: 42, name: 'Ford Prefect', registered: '2001/05/25', role: 'Alien', status: 'Don\'t panic!'} +] + +export default usersData