├── .github
└── PULL_REQUEST_TEMPLATE.md
├── .gitignore
├── .npmignore
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── MANUAL_CONFIG.md
├── README.md
├── TROUBLESHOOTING.md
├── commitlint.config.js
├── dashboard
├── .browserslistrc
├── .eslintrc.js
├── .gitignore
├── README.md
├── babel.config.js
├── package.json
├── public
│ ├── background.jpg
│ ├── buttons.png
│ ├── favicon.ico
│ ├── favicon.png
│ ├── fonts
│ │ ├── fontawesome
│ │ │ ├── fa-brands-400.eot
│ │ │ ├── fa-brands-400.svg
│ │ │ ├── fa-brands-400.ttf
│ │ │ ├── fa-brands-400.woff
│ │ │ ├── fa-brands-400.woff2
│ │ │ ├── fa-regular-400.eot
│ │ │ ├── fa-regular-400.svg
│ │ │ ├── fa-regular-400.ttf
│ │ │ ├── fa-regular-400.woff
│ │ │ ├── fa-regular-400.woff2
│ │ │ ├── fa-solid-900.eot
│ │ │ ├── fa-solid-900.svg
│ │ │ ├── fa-solid-900.ttf
│ │ │ ├── fa-solid-900.woff
│ │ │ └── fa-solid-900.woff2
│ │ └── simple-line-icons
│ │ │ ├── Simple-Line-Icons.eot
│ │ │ ├── Simple-Line-Icons.svg
│ │ │ ├── Simple-Line-Icons.ttf
│ │ │ ├── Simple-Line-Icons.woff
│ │ │ └── Simple-Line-Icons.woff2
│ ├── index.html
│ ├── jf-top.png
│ ├── logo-big.png
│ ├── rr-icon.png
│ └── rr-top.png
├── src
│ ├── App.vue
│ ├── assets
│ │ ├── .gitignore
│ │ ├── _es6
│ │ │ ├── main
│ │ │ │ ├── app.js
│ │ │ │ ├── bootstrap.js
│ │ │ │ └── modules
│ │ │ │ │ ├── helpers.js
│ │ │ │ │ ├── template.js
│ │ │ │ │ └── tools.js
│ │ │ └── pages
│ │ │ │ ├── be_comp_calendar.js
│ │ │ │ ├── be_comp_charts.js
│ │ │ │ ├── be_comp_dialogs.js
│ │ │ │ ├── be_comp_image_cropper.js
│ │ │ │ ├── be_comp_maps_google.js
│ │ │ │ ├── be_comp_maps_vector.js
│ │ │ │ ├── be_comp_rating.js
│ │ │ │ ├── be_forms_validation.js
│ │ │ │ ├── be_forms_wizard.js
│ │ │ │ ├── be_pages_dashboard.js
│ │ │ │ ├── be_tables_datatables.js
│ │ │ │ ├── be_ui_animations.js
│ │ │ │ ├── be_ui_icons.js
│ │ │ │ ├── be_ui_progress.js
│ │ │ │ ├── op_auth_lock.js
│ │ │ │ ├── op_auth_reminder.js
│ │ │ │ ├── op_auth_signin.js
│ │ │ │ ├── op_auth_signup.js
│ │ │ │ └── op_coming_soon.js
│ │ ├── _scss
│ │ │ ├── bootstrap
│ │ │ │ ├── _alert.scss
│ │ │ │ ├── _badge.scss
│ │ │ │ ├── _breadcrumb.scss
│ │ │ │ ├── _button-group.scss
│ │ │ │ ├── _buttons.scss
│ │ │ │ ├── _card.scss
│ │ │ │ ├── _carousel.scss
│ │ │ │ ├── _close.scss
│ │ │ │ ├── _code.scss
│ │ │ │ ├── _custom-forms.scss
│ │ │ │ ├── _dropdown.scss
│ │ │ │ ├── _forms.scss
│ │ │ │ ├── _functions.scss
│ │ │ │ ├── _grid.scss
│ │ │ │ ├── _images.scss
│ │ │ │ ├── _input-group.scss
│ │ │ │ ├── _jumbotron.scss
│ │ │ │ ├── _list-group.scss
│ │ │ │ ├── _media.scss
│ │ │ │ ├── _mixins.scss
│ │ │ │ ├── _modal.scss
│ │ │ │ ├── _nav.scss
│ │ │ │ ├── _navbar.scss
│ │ │ │ ├── _pagination.scss
│ │ │ │ ├── _popover.scss
│ │ │ │ ├── _print.scss
│ │ │ │ ├── _progress.scss
│ │ │ │ ├── _reboot.scss
│ │ │ │ ├── _root.scss
│ │ │ │ ├── _tables.scss
│ │ │ │ ├── _tooltip.scss
│ │ │ │ ├── _transitions.scss
│ │ │ │ ├── _type.scss
│ │ │ │ ├── _utilities.scss
│ │ │ │ ├── _variables.scss
│ │ │ │ ├── bootstrap-grid.scss
│ │ │ │ ├── bootstrap-reboot.scss
│ │ │ │ ├── bootstrap.scss
│ │ │ │ ├── mixins
│ │ │ │ │ ├── _alert.scss
│ │ │ │ │ ├── _background-variant.scss
│ │ │ │ │ ├── _badge.scss
│ │ │ │ │ ├── _border-radius.scss
│ │ │ │ │ ├── _box-shadow.scss
│ │ │ │ │ ├── _breakpoints.scss
│ │ │ │ │ ├── _buttons.scss
│ │ │ │ │ ├── _caret.scss
│ │ │ │ │ ├── _clearfix.scss
│ │ │ │ │ ├── _float.scss
│ │ │ │ │ ├── _forms.scss
│ │ │ │ │ ├── _gradients.scss
│ │ │ │ │ ├── _grid-framework.scss
│ │ │ │ │ ├── _grid.scss
│ │ │ │ │ ├── _hover.scss
│ │ │ │ │ ├── _image.scss
│ │ │ │ │ ├── _list-group.scss
│ │ │ │ │ ├── _lists.scss
│ │ │ │ │ ├── _nav-divider.scss
│ │ │ │ │ ├── _pagination.scss
│ │ │ │ │ ├── _reset-text.scss
│ │ │ │ │ ├── _resize.scss
│ │ │ │ │ ├── _screen-reader.scss
│ │ │ │ │ ├── _size.scss
│ │ │ │ │ ├── _table-row.scss
│ │ │ │ │ ├── _text-emphasis.scss
│ │ │ │ │ ├── _text-hide.scss
│ │ │ │ │ ├── _text-truncate.scss
│ │ │ │ │ ├── _transition.scss
│ │ │ │ │ └── _visibility.scss
│ │ │ │ └── utilities
│ │ │ │ │ ├── _align.scss
│ │ │ │ │ ├── _background.scss
│ │ │ │ │ ├── _borders.scss
│ │ │ │ │ ├── _clearfix.scss
│ │ │ │ │ ├── _display.scss
│ │ │ │ │ ├── _embed.scss
│ │ │ │ │ ├── _flex.scss
│ │ │ │ │ ├── _float.scss
│ │ │ │ │ ├── _position.scss
│ │ │ │ │ ├── _screenreaders.scss
│ │ │ │ │ ├── _shadows.scss
│ │ │ │ │ ├── _sizing.scss
│ │ │ │ │ ├── _spacing.scss
│ │ │ │ │ ├── _text.scss
│ │ │ │ │ └── _visibility.scss
│ │ │ ├── custom
│ │ │ │ ├── _main.scss
│ │ │ │ └── _variables.scss
│ │ │ ├── main.scss
│ │ │ ├── oneui
│ │ │ │ ├── _badge.scss
│ │ │ │ ├── _block.scss
│ │ │ │ ├── _breadcrumb.scss
│ │ │ │ ├── _buttons.scss
│ │ │ │ ├── _custom-forms.scss
│ │ │ │ ├── _dropdown.scss
│ │ │ │ ├── _forms.scss
│ │ │ │ ├── _grid.scss
│ │ │ │ ├── _header.scss
│ │ │ │ ├── _hero.scss
│ │ │ │ ├── _images.scss
│ │ │ │ ├── _input-group.scss
│ │ │ │ ├── _item.scss
│ │ │ │ ├── _layout-variations.scss
│ │ │ │ ├── _layout.scss
│ │ │ │ ├── _lists.scss
│ │ │ │ ├── _mixins.scss
│ │ │ │ ├── _modal.scss
│ │ │ │ ├── _nav-main.scss
│ │ │ │ ├── _nav.scss
│ │ │ │ ├── _overlay.scss
│ │ │ │ ├── _page-loader.scss
│ │ │ │ ├── _pagination.scss
│ │ │ │ ├── _print.scss
│ │ │ │ ├── _reboot.scss
│ │ │ │ ├── _side-overlay.scss
│ │ │ │ ├── _sidebar.scss
│ │ │ │ ├── _tables.scss
│ │ │ │ ├── _timeline.scss
│ │ │ │ ├── _transitions.scss
│ │ │ │ ├── _type.scss
│ │ │ │ ├── _utilities.scss
│ │ │ │ ├── _variables-bootstrap.scss
│ │ │ │ ├── _variables-themes.scss
│ │ │ │ ├── _variables.scss
│ │ │ │ ├── mixins
│ │ │ │ │ ├── _alert.scss
│ │ │ │ │ ├── _buttons.scss
│ │ │ │ │ ├── _content.scss
│ │ │ │ │ ├── _custom-forms.scss
│ │ │ │ │ ├── _text-emphasis.scss
│ │ │ │ │ └── _theme.scss
│ │ │ │ ├── themes
│ │ │ │ │ ├── _base.scss
│ │ │ │ │ ├── amethyst.scss
│ │ │ │ │ ├── city.scss
│ │ │ │ │ ├── flat.scss
│ │ │ │ │ ├── modern.scss
│ │ │ │ │ └── smooth.scss
│ │ │ │ └── utilities
│ │ │ │ │ ├── _background.scss
│ │ │ │ │ ├── _borders.scss
│ │ │ │ │ ├── _display.scss
│ │ │ │ │ ├── _effects.scss
│ │ │ │ │ ├── _flex.scss
│ │ │ │ │ └── _text.scss
│ │ │ └── vendor
│ │ │ │ ├── _animate.scss
│ │ │ │ ├── _bootstrap-colorpicker.scss
│ │ │ │ ├── _bootstrap-datepicker.scss
│ │ │ │ ├── _ckeditor.scss
│ │ │ │ ├── _datatables.scss
│ │ │ │ ├── _dropzone.scss
│ │ │ │ ├── _easy-pie-chart.scss
│ │ │ │ ├── _fullcalendar.scss
│ │ │ │ ├── _ion-range-slider.scss
│ │ │ │ ├── _jquery-sparkline.scss
│ │ │ │ ├── _jvector-map.scss
│ │ │ │ ├── _select2.scss
│ │ │ │ ├── _simple-line-icons.scss
│ │ │ │ ├── _simplebar.scss
│ │ │ │ ├── _simplemde.scss
│ │ │ │ ├── _slick.scss
│ │ │ │ ├── _summernote.scss
│ │ │ │ └── fontawesome
│ │ │ │ ├── _animated.scss
│ │ │ │ ├── _bordered-pulled.scss
│ │ │ │ ├── _core.scss
│ │ │ │ ├── _fixed-width.scss
│ │ │ │ ├── _icons.scss
│ │ │ │ ├── _larger.scss
│ │ │ │ ├── _list.scss
│ │ │ │ ├── _mixins.scss
│ │ │ │ ├── _rotated-flipped.scss
│ │ │ │ ├── _screen-reader.scss
│ │ │ │ ├── _shims.scss
│ │ │ │ ├── _stacked.scss
│ │ │ │ ├── _variables.scss
│ │ │ │ ├── brands.scss
│ │ │ │ ├── fontawesome.scss
│ │ │ │ ├── regular.scss
│ │ │ │ ├── solid.scss
│ │ │ │ └── v4-shims.scss
│ │ ├── battery_outline.svg
│ │ ├── colors.scss
│ │ ├── logo-w-text.png
│ │ ├── logo-w-text.psd
│ │ ├── logo.png
│ │ ├── tyres_green.png
│ │ ├── tyres_red.png
│ │ ├── tyres_yellow.png
│ │ └── vehicle-top.png
│ ├── components
│ │ ├── AssetConfiguration.vue
│ │ ├── AssetMap.vue
│ │ ├── AssetOverview.vue
│ │ ├── BarChart.vue
│ │ ├── BatteryLevel.vue
│ │ ├── Dashboard.vue
│ │ ├── DoughnutChart.vue
│ │ ├── FleetMap.vue
│ │ ├── FleetMapMenu.vue
│ │ ├── Footer.vue
│ │ ├── Form.vue
│ │ ├── Framework.vue
│ │ ├── LandingPage.vue
│ │ ├── LineChart.vue
│ │ ├── Login.vue
│ │ ├── SensorHistory.vue
│ │ ├── SensorOverview.vue
│ │ ├── TyrePressure.vue
│ │ └── VehicleStatus.vue
│ ├── main.ts
│ ├── router
│ │ └── index.ts
│ └── services
│ │ ├── AssetService.js
│ │ ├── AuthService.js
│ │ ├── ConfigurationService.js
│ │ ├── DdbService.js
│ │ ├── FrameworkService.js
│ │ └── IotService.js
├── tests
│ ├── e2e
│ │ ├── .eslintrc.js
│ │ ├── custom-assertions
│ │ │ └── elementCount.js
│ │ ├── custom-commands
│ │ │ ├── customExecute.js
│ │ │ ├── openHomepage.js
│ │ │ └── openHomepageClass.js
│ │ ├── globals.js
│ │ ├── page-objects
│ │ │ └── homepage.js
│ │ └── specs
│ │ │ ├── test-with-pageobjects.js
│ │ │ └── test.js
│ └── unit
│ │ └── example.spec.ts
├── tsconfig.json
└── vue.config.js
├── infra
├── .gitignore
├── config-model.ts
├── config.sample.ts
├── core
│ ├── .gitignore
│ ├── .npmignore
│ ├── README.md
│ ├── bin
│ │ └── core.ts
│ ├── cdk.json
│ ├── lib
│ │ └── core-stack.ts
│ ├── package.json
│ └── tsconfig.json
├── dns
│ ├── .gitignore
│ ├── .npmignore
│ ├── README.md
│ ├── bin
│ │ └── dns.ts
│ ├── cdk.json
│ ├── lib
│ │ └── dns-stack.ts
│ ├── package.json
│ └── tsconfig.json
└── packages
│ ├── auth
│ ├── .gitignore
│ ├── .npmignore
│ ├── README.md
│ ├── lib
│ │ └── index.ts
│ ├── package.json
│ └── tsconfig.json
│ ├── dns
│ ├── .gitignore
│ ├── .npmignore
│ ├── README.md
│ ├── lib
│ │ └── index.ts
│ ├── package.json
│ └── tsconfig.json
│ ├── inventory
│ ├── .gitignore
│ ├── .npmignore
│ ├── README.md
│ ├── lib
│ │ └── index.ts
│ ├── package.json
│ └── tsconfig.json
│ └── webui
│ ├── .gitignore
│ ├── .npmignore
│ ├── README.md
│ ├── lib
│ └── index.ts
│ ├── package.json
│ └── tsconfig.json
├── package.json
├── scripts
├── .gitignore
├── config.sample.sh
├── configure-infra.sh
├── configure-ui.sh
├── configure-user.sh
├── dashboard.sh
├── deploy-ui.sh
├── get-ui-entry-point.sh
├── post-deployment-tasks.sh
└── prepare-infra.sh
├── static
├── acm-request.png
├── acm-verify.png
├── add-asset-menu.png
├── add-asset-sample-attrs.png
├── add-asset-sample-result.png
├── add-asset-sample.png
├── arch-dashboard.png
├── asset-connectivity-stats-empty.png
├── asset-connectivity-stats.png
├── cloudfront-oai.png
├── cognito-client-settings.png
├── cognito-domain-alias-setup.png
├── cognito-domain-setup.png
├── cognito-role-mapping.png
├── customize-asset-overview.png
├── dashboard-overview.png
├── deployment-flow.png
├── landing-page.png
├── main-architecture-overview.png
└── map-with-assets.png
└── tutorials
└── README.md
/.github/PULL_REQUEST_TEMPLATE.md:
--------------------------------------------------------------------------------
1 | *Issue #, if available:*
2 |
3 | *Description of changes:*
4 |
5 |
6 | By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.
7 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.d.ts
2 | .DS_Store
3 | **/.DS_Store
4 | node_modules/
5 | dashboard/src/assets/config.json
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | *.ts
2 | !*.d.ts
3 |
--------------------------------------------------------------------------------
/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------
1 | ## Code of Conduct
2 | This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct).
3 | For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact
4 | opensource-codeofconduct@amazon.com with any additional questions or comments.
5 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this
4 | software and associated documentation files (the "Software"), to deal in the Software
5 | without restriction, including without limitation the rights to use, copy, modify,
6 | merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
7 | permit persons to whom the Software is furnished to do so.
8 |
9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
10 | INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
11 | PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
12 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
13 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
14 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
15 |
--------------------------------------------------------------------------------
/TROUBLESHOOTING.md:
--------------------------------------------------------------------------------
1 | # Troubleshooting
2 |
3 | This section will help you solve common issues related to the usage of this project. Take a look at the section you're experiencing errors with.
4 |
5 | ## Failed during infrastructure spin up
6 |
7 | TODO
8 |
9 | ## Failed during UI deployment
10 |
11 | TODO
12 |
13 | ## Failed during UI usage
14 |
15 | TODO
16 |
--------------------------------------------------------------------------------
/commitlint.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {extends: ['@commitlint/config-conventional']};
2 |
--------------------------------------------------------------------------------
/dashboard/.browserslistrc:
--------------------------------------------------------------------------------
1 | > 1%
2 | last 2 versions
3 |
--------------------------------------------------------------------------------
/dashboard/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | root: true,
3 | env: {
4 | node: true
5 | },
6 | 'extends': [
7 | 'plugin:vue/essential',
8 | 'eslint:recommended',
9 | '@vue/typescript/recommended'
10 | ],
11 | parserOptions: {
12 | ecmaVersion: 2020
13 | },
14 | rules: {
15 | 'no-console': process.env.NODE_ENV === 'production' ? 'off' : 'off',
16 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
17 | },
18 | overrides: [
19 | {
20 | files: [
21 | '**/__tests__/*.{j,t}s?(x)',
22 | '**/tests/unit/**/*.spec.{j,t}s?(x)'
23 | ],
24 | env: {
25 | mocha: true
26 | }
27 | }
28 | ]
29 | }
30 |
--------------------------------------------------------------------------------
/dashboard/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | /dist
4 |
5 | /tests/e2e/reports/
6 | selenium-debug.log
7 | chromedriver.log
8 | geckodriver.log
9 |
10 | # local env files
11 | .env.local
12 | .env.*.local
13 |
14 | # Log files
15 | npm-debug.log*
16 | yarn-debug.log*
17 | yarn-error.log*
18 |
19 | # Editor directories and files
20 | .idea
21 | .vscode
22 | *.suo
23 | *.ntvs*
24 | *.njsproj
25 | *.sln
26 | *.sw?
27 |
--------------------------------------------------------------------------------
/dashboard/README.md:
--------------------------------------------------------------------------------
1 | # ui
2 |
3 | ## Project setup
4 | ```
5 | npm install
6 | ```
7 |
8 | ### Compiles and hot-reloads for development
9 | ```
10 | npm run serve
11 | ```
12 |
13 | ### Compiles and minifies for production
14 | ```
15 | npm run build
16 | ```
17 |
18 | ### Run your unit tests
19 | ```
20 | npm run test:unit
21 | ```
22 |
23 | ### Run your end-to-end tests
24 | ```
25 | npm run test:e2e
26 | ```
27 |
28 | ### Lints and fixes files
29 | ```
30 | npm run lint
31 | ```
32 |
33 | ### Customize configuration
34 | See [Configuration Reference](https://cli.vuejs.org/config/).
35 |
--------------------------------------------------------------------------------
/dashboard/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | presets: [
3 | '@vue/cli-plugin-babel/preset'
4 | ]
5 | }
6 |
--------------------------------------------------------------------------------
/dashboard/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ui",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "serve": "vue-cli-service serve",
7 | "build": "vue-cli-service build",
8 | "test:unit": "vue-cli-service test:unit",
9 | "test:e2e": "vue-cli-service test:e2e",
10 | "lint": "vue-cli-service lint"
11 | },
12 | "dependencies": {
13 | "@types/chart.js": "^2.9.18",
14 | "async": "^2.6.2",
15 | "aws-iot-device-sdk": "^2.2.1",
16 | "aws-sdk": "^2.406.0",
17 | "chart.js": "^2.7.2",
18 | "core-js": "^3.6.4",
19 | "jwt-decode": "^2.2.0",
20 | "moment": "^2.22.2",
21 | "project-name-generator": "^2.1.5",
22 | "random-location": "^1.0.12",
23 | "randomcolor": "^0.5.3",
24 | "shortid": "^2.2.13",
25 | "uuid": "^3.3.2",
26 | "vin-generator": "^1.0.1",
27 | "vue": "^2.6.11",
28 | "vue-chartjs": "^3.5.0",
29 | "vue-class-component": "^7.2.2",
30 | "vue-property-decorator": "^8.3.0",
31 | "vue-router": "^3.1.5",
32 | "vue2-google-maps": "^0.10.7",
33 | "vuex": "^3.1.2"
34 | },
35 | "devDependencies": {
36 | "@types/chai": "^4.2.8",
37 | "@types/mocha": "^5.2.4",
38 | "@typescript-eslint/eslint-plugin": "^2.18.0",
39 | "@typescript-eslint/parser": "^2.18.0",
40 | "@vue/cli-plugin-babel": "^4.2.0",
41 | "@vue/cli-plugin-e2e-nightwatch": "^4.2.0",
42 | "@vue/cli-plugin-eslint": "^4.2.0",
43 | "@vue/cli-plugin-router": "^4.2.0",
44 | "@vue/cli-plugin-typescript": "^4.2.0",
45 | "@vue/cli-plugin-unit-mocha": "^4.2.0",
46 | "@vue/cli-plugin-vuex": "^4.2.0",
47 | "@vue/cli-service": "^4.2.0",
48 | "@vue/eslint-config-typescript": "^5.0.1",
49 | "@vue/test-utils": "1.0.0-beta.31",
50 | "chai": "^4.1.2",
51 | "chromedriver": "80",
52 | "eslint": "^6.7.2",
53 | "eslint-plugin-vue": "^6.1.2",
54 | "geckodriver": "^1.19.1",
55 | "node-sass": "^4.12.0",
56 | "sass-loader": "^8.0.2",
57 | "typescript": "~3.7.5",
58 | "vue-template-compiler": "^2.6.11"
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/dashboard/public/background.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/public/background.jpg
--------------------------------------------------------------------------------
/dashboard/public/buttons.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/public/buttons.png
--------------------------------------------------------------------------------
/dashboard/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/public/favicon.ico
--------------------------------------------------------------------------------
/dashboard/public/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/public/favicon.png
--------------------------------------------------------------------------------
/dashboard/public/fonts/fontawesome/fa-brands-400.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/public/fonts/fontawesome/fa-brands-400.eot
--------------------------------------------------------------------------------
/dashboard/public/fonts/fontawesome/fa-brands-400.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/public/fonts/fontawesome/fa-brands-400.ttf
--------------------------------------------------------------------------------
/dashboard/public/fonts/fontawesome/fa-brands-400.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/public/fonts/fontawesome/fa-brands-400.woff
--------------------------------------------------------------------------------
/dashboard/public/fonts/fontawesome/fa-brands-400.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/public/fonts/fontawesome/fa-brands-400.woff2
--------------------------------------------------------------------------------
/dashboard/public/fonts/fontawesome/fa-regular-400.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/public/fonts/fontawesome/fa-regular-400.eot
--------------------------------------------------------------------------------
/dashboard/public/fonts/fontawesome/fa-regular-400.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/public/fonts/fontawesome/fa-regular-400.ttf
--------------------------------------------------------------------------------
/dashboard/public/fonts/fontawesome/fa-regular-400.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/public/fonts/fontawesome/fa-regular-400.woff
--------------------------------------------------------------------------------
/dashboard/public/fonts/fontawesome/fa-regular-400.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/public/fonts/fontawesome/fa-regular-400.woff2
--------------------------------------------------------------------------------
/dashboard/public/fonts/fontawesome/fa-solid-900.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/public/fonts/fontawesome/fa-solid-900.eot
--------------------------------------------------------------------------------
/dashboard/public/fonts/fontawesome/fa-solid-900.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/public/fonts/fontawesome/fa-solid-900.ttf
--------------------------------------------------------------------------------
/dashboard/public/fonts/fontawesome/fa-solid-900.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/public/fonts/fontawesome/fa-solid-900.woff
--------------------------------------------------------------------------------
/dashboard/public/fonts/fontawesome/fa-solid-900.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/public/fonts/fontawesome/fa-solid-900.woff2
--------------------------------------------------------------------------------
/dashboard/public/fonts/simple-line-icons/Simple-Line-Icons.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/public/fonts/simple-line-icons/Simple-Line-Icons.eot
--------------------------------------------------------------------------------
/dashboard/public/fonts/simple-line-icons/Simple-Line-Icons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/public/fonts/simple-line-icons/Simple-Line-Icons.ttf
--------------------------------------------------------------------------------
/dashboard/public/fonts/simple-line-icons/Simple-Line-Icons.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/public/fonts/simple-line-icons/Simple-Line-Icons.woff
--------------------------------------------------------------------------------
/dashboard/public/fonts/simple-line-icons/Simple-Line-Icons.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/public/fonts/simple-line-icons/Simple-Line-Icons.woff2
--------------------------------------------------------------------------------
/dashboard/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | AWS Fleet Management sample system
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/dashboard/public/jf-top.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/public/jf-top.png
--------------------------------------------------------------------------------
/dashboard/public/logo-big.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/public/logo-big.png
--------------------------------------------------------------------------------
/dashboard/public/rr-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/public/rr-icon.png
--------------------------------------------------------------------------------
/dashboard/public/rr-top.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/public/rr-top.png
--------------------------------------------------------------------------------
/dashboard/src/assets/.gitignore:
--------------------------------------------------------------------------------
1 | config.json
2 | !config.sample.json
3 | config.*.json
4 | colors.scss
--------------------------------------------------------------------------------
/dashboard/src/assets/_es6/main/app.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Document : app.js
3 | * Author : pixelcave
4 | * Description: Main entry point
5 | *
6 | */
7 |
8 | // Import global dependencies
9 | import './bootstrap.js';
10 |
11 | // Import required modules
12 | import Tools from './modules/tools';
13 | import Helpers from './modules/helpers';
14 | import Template from './modules/template';
15 |
16 | // App extends Template
17 | export default class App extends Template {
18 | /*
19 | * Auto called when creating a new instance
20 | *
21 | */
22 | constructor() {
23 | super();
24 | }
25 |
26 | /*
27 | * Here you can override or extend any function you want from Template class
28 | * if you would like to change/extend/remove the default functionality.
29 | *
30 | * This way it will be easier for you to update the module files if a new update
31 | * is released since all your changes will be in here overriding the original ones.
32 | *
33 | * Let's have a look at the _uiInit() function, the one that runs the first time
34 | * we create an instance of Template class or App class which extends it. This function
35 | * inits all vital functionality but you can change it to fit your own needs.
36 | *
37 | */
38 |
39 | /*
40 | * EXAMPLE #1 - Removing default functionality by making it empty
41 | *
42 | */
43 |
44 | // _uiInit() {}
45 |
46 |
47 | /*
48 | * EXAMPLE #2 - Extending default functionality with additional code
49 | *
50 | */
51 |
52 | // _uiInit() {
53 | // // Call original function
54 | // super._uiInit();
55 | //
56 | // // Your extra JS code afterwards
57 | // }
58 |
59 | /*
60 | * EXAMPLE #3 - Replacing default functionality by writing your own code
61 | *
62 | */
63 |
64 | // _uiInit() {
65 | // // Your own JS code without ever calling the original function's code
66 | // }
67 | }
68 |
69 | // Once everything is loaded
70 | jQuery(() => {
71 | // Create a new instance of App
72 | window.One = new App();
73 | });
74 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_es6/main/bootstrap.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Document : bootstrap.js
3 | * Author : pixelcave
4 | * Description: Import global dependencies
5 | *
6 | */
7 |
8 | /*
9 | ********************************************************************************************
10 | *
11 | * If you would like to use webpack to handle all required core JS files, you can uncomment
12 | * the following imports and window assignments to have them included in the compiled
13 | * oneui.app.min.js as well.
14 | *
15 | * After that change, you won't have to include oneui.core.min.js in your pages any more
16 | *
17 | *********************************************************************************************
18 | */
19 |
20 | // Import all vital core JS files..
21 | //import jQuery from 'jquery';
22 | //import SimpleBar from 'simplebar';
23 | //import Cookies from 'js-cookie';
24 | //import 'bootstrap';
25 | //import 'popper.js';
26 | //import 'jquery.appear';
27 | //import 'jquery-scroll-lock';
28 |
29 | // ..and assign to window the ones that need it
30 | //window.jQuery = jQuery;
31 | //window.SimpleBar = SimpleBar;
32 | //window.Cookies = Cookies;
33 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_es6/main/modules/tools.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Document : tools.js
3 | * Author : pixelcave
4 | * Description: Various small tools
5 | *
6 | */
7 |
8 | // Import global dependencies
9 | import './../bootstrap.js';
10 |
11 | // Tools
12 | export default class Tools {
13 | /*
14 | * Updates the color theme
15 | *
16 | */
17 | static updateTheme(themeEl, themeName) {
18 | if (themeName === 'default') {
19 | if (themeEl.length) {
20 | themeEl.remove();
21 | }
22 | } else {
23 | if (themeEl.length) {
24 | themeEl.attr('href', themeName);
25 | } else {
26 | jQuery('#css-main')
27 | .after('');
28 | }
29 | }
30 | }
31 |
32 | /*
33 | * Returns current browser's window width
34 | *
35 | */
36 | static getWidth() {
37 | return window.innerWidth
38 | || document.documentElement.clientWidth
39 | || document.body.clientWidth;
40 | }
41 | }
--------------------------------------------------------------------------------
/dashboard/src/assets/_es6/pages/be_comp_rating.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Document : be_comp_rating.js
3 | * Author : pixelcave
4 | * Description: Custom JS code used in Rating Page
5 | */
6 |
7 | // jQuery Raty, for more examples you can check out https://github.com/wbotelhos/raty
8 | class pageCompRating {
9 | /*
10 | * Init demo rating functionality
11 | *
12 | */
13 | static initRating() {
14 | // Set Default options
15 | jQuery.fn.raty.defaults.starType = 'i';
16 | jQuery.fn.raty.defaults.hints = ['Just Bad!', 'Almost There!', 'It’s ok!', 'That’s nice!', 'Incredible!'];
17 |
18 | // Init Raty on .js-rating class
19 | jQuery('.js-rating').each((index, element) => {
20 | let el = jQuery(element);
21 |
22 | el.raty({
23 | score: el.data('score') || 0,
24 | number: el.data('number') || 5,
25 | cancel: el.data('cancel') || false,
26 | target: el.data('target') || false,
27 | targetScore: el.data('target-score') || false,
28 | precision: el.data('precision') || false,
29 | cancelOff: el.data('cancel-off') || 'fa fa-fw fa-times-circle text-danger',
30 | cancelOn: el.data('cancel-on') || 'fa fa-fw fa-times-circle',
31 | starHalf: el.data('star-half') || 'fa fa-fw fa-star-half text-warning',
32 | starOff: el.data('star-off') || 'fa fa-fw fa-star text-muted',
33 | starOn: el.data('star-on') || 'fa fa-fw fa-star text-warning',
34 | click: function(score, evt) {
35 | // Here you could add your logic on rating click
36 | // console.log('ID: ' + this.id + "\nscore: " + score + "\nevent: " + evt);
37 | }
38 | });
39 | });
40 | }
41 |
42 | /*
43 | * Init functionality
44 | *
45 | */
46 | static init() {
47 | this.initRating();
48 | }
49 | }
50 |
51 | // Initialize when page loads
52 | jQuery(() => { pageCompRating.init(); });
53 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_es6/pages/be_ui_animations.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Document : be_ui_animations.js
3 | * Author : pixelcave
4 | * Description: Custom JS code used in Animations Page
5 | */
6 |
7 | class pageAnimations {
8 | /*
9 | * Animation toggle functionality
10 | *
11 | */
12 | static animationsToggle() {
13 | let animationClass, animationButton, currentSection;
14 |
15 | // On button click
16 | jQuery('.js-animation-section button').on('click', (e) => {
17 | animationButton = jQuery(e.currentTarget);
18 | animationClass = animationButton.data('animation-class');
19 | currentSection = animationButton.parents('.js-animation-section');
20 |
21 | // Update class preview
22 | jQuery('.js-animation-preview', currentSection).html(animationClass);
23 |
24 | // Update animation object classes
25 | jQuery('.js-animation-object', currentSection)
26 | .removeClass()
27 | .addClass('js-animation-object animated ' + animationClass);
28 | });
29 | }
30 |
31 | /*
32 | * Init functionality
33 | *
34 | */
35 | static init() {
36 | this.animationsToggle();
37 | }
38 | }
39 |
40 | // Initialize when page loads
41 | jQuery(() => { pageAnimations.init(); });
42 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_es6/pages/be_ui_icons.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Document : be_ui_icons.js
3 | * Author : pixelcave
4 | * Description: Custom JS code used in Icons Page
5 | */
6 |
7 | class pageIcons {
8 | /*
9 | * Icon Search functionality
10 | *
11 | */
12 | static iconSearch() {
13 | let searchItems = jQuery('.js-icon-list > div');
14 | let searchValue = '', el;
15 |
16 | // Disable form submission
17 | jQuery('.js-form-icon-search').on('submit', () => false);
18 |
19 | // When user types
20 | jQuery('.js-icon-search').on('keyup', (e) => {
21 | searchValue = jQuery(e.currentTarget).val().toLowerCase();
22 |
23 | if (searchValue.length > 2) { // If ore than 2 characters, search the icons
24 | searchItems.hide();
25 |
26 | jQuery('code', searchItems).each((index, element) => {
27 | el = jQuery(element);
28 |
29 | if (el.text().match(searchValue)) {
30 | el.parent('div').fadeIn(250);
31 | }
32 | });
33 | } else if (searchValue.length === 0) { // If text was deleted, show all icons
34 | searchItems.show();
35 | }
36 | });
37 | }
38 |
39 | /*
40 | * Init functionality
41 | *
42 | */
43 | static init() {
44 | this.iconSearch();
45 | }
46 | }
47 |
48 | // Initialize when page loads
49 | jQuery(() => { pageIcons.init(); });
50 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_es6/pages/be_ui_progress.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Document : be_ui_progress.js
3 | * Author : pixelcave
4 | * Description: Custom JS code used in Progress Page
5 | */
6 |
7 | class pageProgress {
8 | /*
9 | * Bars randomize functionality
10 | *
11 | */
12 | static barsRandomize() {
13 | jQuery('.js-bar-randomize').on('click', (e) => {
14 | jQuery(e.currentTarget)
15 | .parents('.block')
16 | .find('.progress-bar')
17 | .each((index, element) => {
18 | let el = jQuery(element);
19 | let random = Math.floor((Math.random() * 91) + 10);
20 |
21 | // Update progress width
22 | el.css('width', random + '%');
23 |
24 | // Update progress label
25 | jQuery('span', el).html(random + '%');
26 | });
27 | });
28 | }
29 |
30 | /*
31 | * Init functionality
32 | *
33 | */
34 | static init() {
35 | this.barsRandomize();
36 | }
37 | }
38 |
39 | // Initialize when page loads
40 | jQuery(() => { pageProgress.init(); });
41 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_es6/pages/op_auth_lock.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Document : op_auth_lock.js
3 | * Author : pixelcave
4 | * Description: Custom JS code used in Lock Page
5 | */
6 |
7 | class pageAuthLock {
8 | /*
9 | * Init Lock Form Validation, for more examples you can check out https://github.com/jzaefferer/jquery-validation
10 | *
11 | */
12 | static initValidation() {
13 | jQuery('.js-validation-lock').validate({
14 | errorClass: 'invalid-feedback animated fadeIn',
15 | errorElement: 'div',
16 | errorPlacement: (error, el) => {
17 | jQuery(el).addClass('is-invalid');
18 | jQuery(el).parents('.form-group').append(error);
19 | },
20 | highlight: (el) => {
21 | jQuery(el).parents('.form-group').find('.is-invalid').removeClass('is-invalid').addClass('is-invalid');
22 | },
23 | success: (el) => {
24 | jQuery(el).parents('.form-group').find('.is-invalid').removeClass('is-invalid');
25 | jQuery(el).remove();
26 | },
27 | rules: {
28 | 'lock-password': {
29 | required: true,
30 | minlength: 3
31 | }
32 | },
33 | messages: {
34 | 'lock-password': {
35 | required: 'Please enter your valid password'
36 | }
37 | }
38 | });
39 | }
40 |
41 | /*
42 | * Init functionality
43 | *
44 | */
45 | static init() {
46 | this.initValidation();
47 | }
48 | }
49 |
50 | // Initialize when page loads
51 | jQuery(() => { pageAuthLock.init(); });
--------------------------------------------------------------------------------
/dashboard/src/assets/_es6/pages/op_auth_reminder.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Document : op_auth_reminder.js
3 | * Author : pixelcave
4 | * Description: Custom JS code used in Password Reminder Page
5 | */
6 |
7 | class pageAuthReminder {
8 | /*
9 | * Init Password Reminder Form Validation, for more examples you can check out https://github.com/jzaefferer/jquery-validation
10 | *
11 | */
12 | static initValidation() {
13 | jQuery('.js-validation-reminder').validate({
14 | errorClass: 'invalid-feedback animated fadeIn',
15 | errorElement: 'div',
16 | errorPlacement: (error, el) => {
17 | jQuery(el).addClass('is-invalid');
18 | jQuery(el).parents('.form-group').append(error);
19 | },
20 | highlight: (el) => {
21 | jQuery(el).parents('.form-group').find('.is-invalid').removeClass('is-invalid').addClass('is-invalid');
22 | },
23 | success: (el) => {
24 | jQuery(el).parents('.form-group').find('.is-invalid').removeClass('is-invalid');
25 | jQuery(el).remove();
26 | },
27 | rules: {
28 | 'reminder-credential': {
29 | required: true,
30 | minlength: 3
31 | }
32 | },
33 | messages: {
34 | 'reminder-credential': {
35 | required: 'Please enter a valid credential'
36 | }
37 | }
38 | });
39 | }
40 |
41 | /*
42 | * Init functionality
43 | *
44 | */
45 | static init() {
46 | this.initValidation();
47 | }
48 | }
49 |
50 | // Initialize when page loads
51 | jQuery(() => { pageAuthReminder.init(); });
52 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_es6/pages/op_auth_signin.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Document : op_auth_signin.js
3 | * Author : pixelcave
4 | * Description: Custom JS code used in Sign In Page
5 | */
6 |
7 | class pageAuthSignIn {
8 | /*
9 | * Init Sign In Form Validation, for more examples you can check out https://github.com/jzaefferer/jquery-validation
10 | *
11 | */
12 | static initValidation() {
13 | jQuery('.js-validation-signin').validate({
14 | errorClass: 'invalid-feedback animated fadeIn',
15 | errorElement: 'div',
16 | errorPlacement: (error, el) => {
17 | jQuery(el).addClass('is-invalid');
18 | jQuery(el).parents('.form-group').append(error);
19 | },
20 | highlight: (el) => {
21 | jQuery(el).parents('.form-group').find('.is-invalid').removeClass('is-invalid').addClass('is-invalid');
22 | },
23 | success: (el) => {
24 | jQuery(el).parents('.form-group').find('.is-invalid').removeClass('is-invalid');
25 | jQuery(el).remove();
26 | },
27 | rules: {
28 | 'login-username': {
29 | required: true,
30 | minlength: 3
31 | },
32 | 'login-password': {
33 | required: true,
34 | minlength: 5
35 | }
36 | },
37 | messages: {
38 | 'login-username': {
39 | required: 'Please enter a username',
40 | minlength: 'Your username must consist of at least 3 characters'
41 | },
42 | 'login-password': {
43 | required: 'Please provide a password',
44 | minlength: 'Your password must be at least 5 characters long'
45 | }
46 | }
47 | });
48 | }
49 |
50 | /*
51 | * Init functionality
52 | *
53 | */
54 | static init() {
55 | this.initValidation();
56 | }
57 | }
58 |
59 | // Initialize when page loads
60 | jQuery(() => { pageAuthSignIn.init(); });
--------------------------------------------------------------------------------
/dashboard/src/assets/_es6/pages/op_coming_soon.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Document : op_coming_soon.js
3 | * Author : pixelcave
4 | * Description: Custom JS code used in Coming Soon Page
5 | */
6 |
7 | class pageComingSoon {
8 | /*
9 | * Init Countdown.js, for more examples you can check out https://github.com/hilios/jQuery.countdown
10 | *
11 | */
12 | static countdown() {
13 | jQuery('.js-countdown').countdown((new Date().getFullYear() + 2) + '/01/15', (e) => {
14 | jQuery(e.currentTarget).html(e.strftime(''
15 | + '
'
16 | + '
'
17 | + '
'
18 | + '
'
19 | + '
'
20 | ));
21 | });
22 | }
23 |
24 | /*
25 | * Init functionality
26 | *
27 | */
28 | static init() {
29 | this.countdown();
30 | }
31 | }
32 |
33 | // Initialize when page loads
34 | jQuery(() => { pageComingSoon.init(); });
35 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/_alert.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Base styles
3 | //
4 |
5 | .alert {
6 | position: relative;
7 | padding: $alert-padding-y $alert-padding-x;
8 | margin-bottom: $alert-margin-bottom;
9 | border: $alert-border-width solid transparent;
10 | @include border-radius($alert-border-radius);
11 | }
12 |
13 | // Headings for larger alerts
14 | .alert-heading {
15 | // Specified to prevent conflicts of changing $headings-color
16 | color: inherit;
17 | }
18 |
19 | // Provide class for links that match alerts
20 | .alert-link {
21 | font-weight: $alert-link-font-weight;
22 | }
23 |
24 |
25 | // Dismissible alerts
26 | //
27 | // Expand the right padding and account for the close button's positioning.
28 |
29 | .alert-dismissible {
30 | padding-right: ($close-font-size + $alert-padding-x * 2);
31 |
32 | // Adjust close link position
33 | .close {
34 | position: absolute;
35 | top: 0;
36 | right: 0;
37 | padding: $alert-padding-y $alert-padding-x;
38 | color: inherit;
39 | }
40 | }
41 |
42 |
43 | // Alternate styles
44 | //
45 | // Generate contextual modifier classes for colorizing the alert.
46 |
47 | @each $color, $value in $theme-colors {
48 | .alert-#{$color} {
49 | @include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), theme-color-level($color, $alert-color-level));
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/_badge.scss:
--------------------------------------------------------------------------------
1 | // Base class
2 | //
3 | // Requires one of the contextual, color modifier classes for `color` and
4 | // `background-color`.
5 |
6 | .badge {
7 | display: inline-block;
8 | padding: $badge-padding-y $badge-padding-x;
9 | font-size: $badge-font-size;
10 | font-weight: $badge-font-weight;
11 | line-height: 1;
12 | text-align: center;
13 | white-space: nowrap;
14 | vertical-align: baseline;
15 | @include border-radius($badge-border-radius);
16 |
17 | // Empty badges collapse automatically
18 | &:empty {
19 | display: none;
20 | }
21 | }
22 |
23 | // Quick fix for badges in buttons
24 | .btn .badge {
25 | position: relative;
26 | top: -1px;
27 | }
28 |
29 | // Pill badges
30 | //
31 | // Make them extra rounded with a modifier to replace v3's badges.
32 |
33 | .badge-pill {
34 | padding-right: $badge-pill-padding-x;
35 | padding-left: $badge-pill-padding-x;
36 | @include border-radius($badge-pill-border-radius);
37 | }
38 |
39 | // Colors
40 | //
41 | // Contextual variations (linked badges get darker on :hover).
42 |
43 | @each $color, $value in $theme-colors {
44 | .badge-#{$color} {
45 | @include badge-variant($value);
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/_breadcrumb.scss:
--------------------------------------------------------------------------------
1 | .breadcrumb {
2 | display: flex;
3 | flex-wrap: wrap;
4 | padding: $breadcrumb-padding-y $breadcrumb-padding-x;
5 | margin-bottom: $breadcrumb-margin-bottom;
6 | list-style: none;
7 | background-color: $breadcrumb-bg;
8 | @include border-radius($breadcrumb-border-radius);
9 | }
10 |
11 | .breadcrumb-item {
12 | // The separator between breadcrumbs (by default, a forward-slash: "/")
13 | + .breadcrumb-item {
14 | padding-left: $breadcrumb-item-padding;
15 |
16 | &::before {
17 | display: inline-block; // Suppress underlining of the separator in modern browsers
18 | padding-right: $breadcrumb-item-padding;
19 | color: $breadcrumb-divider-color;
20 | content: $breadcrumb-divider;
21 | }
22 | }
23 |
24 | // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built
25 | // without ``s. The `::before` pseudo-element generates an element
26 | // *within* the .breadcrumb-item and thereby inherits the `text-decoration`.
27 | //
28 | // To trick IE into suppressing the underline, we give the pseudo-element an
29 | // underline and then immediately remove it.
30 | + .breadcrumb-item:hover::before {
31 | text-decoration: underline;
32 | }
33 | // stylelint-disable-next-line no-duplicate-selectors
34 | + .breadcrumb-item:hover::before {
35 | text-decoration: none;
36 | }
37 |
38 | &.active {
39 | color: $breadcrumb-active-color;
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/_close.scss:
--------------------------------------------------------------------------------
1 | .close {
2 | float: right;
3 | font-size: $close-font-size;
4 | font-weight: $close-font-weight;
5 | line-height: 1;
6 | color: $close-color;
7 | text-shadow: $close-text-shadow;
8 | opacity: .5;
9 |
10 | &:not(:disabled):not(.disabled) {
11 |
12 | @include hover-focus {
13 | color: $close-color;
14 | text-decoration: none;
15 | opacity: .75;
16 | }
17 |
18 | // Opinionated: add "hand" cursor to non-disabled .close elements
19 | cursor: pointer;
20 | }
21 | }
22 |
23 | // Additional properties for button version
24 | // iOS requires the button element instead of an anchor tag.
25 | // If you want the anchor version, it requires `href="#"`.
26 | // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
27 |
28 | // stylelint-disable property-no-vendor-prefix, selector-no-qualifying-type
29 | button.close {
30 | padding: 0;
31 | background-color: transparent;
32 | border: 0;
33 | -webkit-appearance: none;
34 | }
35 | // stylelint-enable
36 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/_code.scss:
--------------------------------------------------------------------------------
1 | // Inline code
2 | code {
3 | font-size: $code-font-size;
4 | color: $code-color;
5 | word-break: break-word;
6 |
7 | // Streamline the style when inside anchors to avoid broken underline and more
8 | a > & {
9 | color: inherit;
10 | }
11 | }
12 |
13 | // User input typically entered via keyboard
14 | kbd {
15 | padding: $kbd-padding-y $kbd-padding-x;
16 | font-size: $kbd-font-size;
17 | color: $kbd-color;
18 | background-color: $kbd-bg;
19 | @include border-radius($border-radius-sm);
20 | @include box-shadow($kbd-box-shadow);
21 |
22 | kbd {
23 | padding: 0;
24 | font-size: 100%;
25 | font-weight: $nested-kbd-font-weight;
26 | @include box-shadow(none);
27 | }
28 | }
29 |
30 | // Blocks of code
31 | pre {
32 | display: block;
33 | font-size: $code-font-size;
34 | color: $pre-color;
35 |
36 | // Account for some code outputs that place code tags in pre tags
37 | code {
38 | font-size: inherit;
39 | color: inherit;
40 | word-break: normal;
41 | }
42 | }
43 |
44 | // Enable scrollable blocks of code
45 | .pre-scrollable {
46 | max-height: $pre-scrollable-max-height;
47 | overflow-y: scroll;
48 | }
49 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/_grid.scss:
--------------------------------------------------------------------------------
1 | // Container widths
2 | //
3 | // Set the container width, and override it for fixed navbars in media queries.
4 |
5 | @if $enable-grid-classes {
6 | .container {
7 | @include make-container();
8 | @include make-container-max-widths();
9 | }
10 | }
11 |
12 | // Fluid container
13 | //
14 | // Utilizes the mixin meant for fixed width containers, but with 100% width for
15 | // fluid, full width layouts.
16 |
17 | @if $enable-grid-classes {
18 | .container-fluid {
19 | @include make-container();
20 | }
21 | }
22 |
23 | // Row
24 | //
25 | // Rows contain and clear the floats of your columns.
26 |
27 | @if $enable-grid-classes {
28 | .row {
29 | @include make-row();
30 | }
31 |
32 | // Remove the negative margin from default .row, then the horizontal padding
33 | // from all immediate children columns (to prevent runaway style inheritance).
34 | .no-gutters {
35 | margin-right: 0;
36 | margin-left: 0;
37 |
38 | > .col,
39 | > [class*="col-"] {
40 | padding-right: 0;
41 | padding-left: 0;
42 | }
43 | }
44 | }
45 |
46 | // Columns
47 | //
48 | // Common styles for small and large grid columns
49 |
50 | @if $enable-grid-classes {
51 | @include make-grid-columns();
52 | }
53 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/_images.scss:
--------------------------------------------------------------------------------
1 | // Responsive images (ensure images don't scale beyond their parents)
2 | //
3 | // This is purposefully opt-in via an explicit class rather than being the default for all `
`s.
4 | // We previously tried the "images are responsive by default" approach in Bootstrap v2,
5 | // and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)
6 | // which weren't expecting the images within themselves to be involuntarily resized.
7 | // See also https://github.com/twbs/bootstrap/issues/18178
8 | .img-fluid {
9 | @include img-fluid;
10 | }
11 |
12 |
13 | // Image thumbnails
14 | .img-thumbnail {
15 | padding: $thumbnail-padding;
16 | background-color: $thumbnail-bg;
17 | border: $thumbnail-border-width solid $thumbnail-border-color;
18 | @include border-radius($thumbnail-border-radius);
19 | @include box-shadow($thumbnail-box-shadow);
20 |
21 | // Keep them at most 100% wide
22 | @include img-fluid;
23 | }
24 |
25 | //
26 | // Figures
27 | //
28 |
29 | .figure {
30 | // Ensures the caption's text aligns with the image.
31 | display: inline-block;
32 | }
33 |
34 | .figure-img {
35 | margin-bottom: ($spacer / 2);
36 | line-height: 1;
37 | }
38 |
39 | .figure-caption {
40 | font-size: $figure-caption-font-size;
41 | color: $figure-caption-color;
42 | }
43 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/_jumbotron.scss:
--------------------------------------------------------------------------------
1 | .jumbotron {
2 | padding: $jumbotron-padding ($jumbotron-padding / 2);
3 | margin-bottom: $jumbotron-padding;
4 | background-color: $jumbotron-bg;
5 | @include border-radius($border-radius-lg);
6 |
7 | @include media-breakpoint-up(sm) {
8 | padding: ($jumbotron-padding * 2) $jumbotron-padding;
9 | }
10 | }
11 |
12 | .jumbotron-fluid {
13 | padding-right: 0;
14 | padding-left: 0;
15 | @include border-radius(0);
16 | }
17 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/_media.scss:
--------------------------------------------------------------------------------
1 | .media {
2 | display: flex;
3 | align-items: flex-start;
4 | }
5 |
6 | .media-body {
7 | flex: 1;
8 | }
9 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/_mixins.scss:
--------------------------------------------------------------------------------
1 | // Toggles
2 | //
3 | // Used in conjunction with global variables to enable certain theme features.
4 |
5 | // Utilities
6 | @import "mixins/breakpoints";
7 | @import "mixins/hover";
8 | @import "mixins/image";
9 | @import "mixins/badge";
10 | @import "mixins/resize";
11 | @import "mixins/screen-reader";
12 | @import "mixins/size";
13 | @import "mixins/reset-text";
14 | @import "mixins/text-emphasis";
15 | @import "mixins/text-hide";
16 | @import "mixins/text-truncate";
17 | @import "mixins/visibility";
18 |
19 | // // Components
20 | @import "mixins/alert";
21 | @import "mixins/buttons";
22 | @import "mixins/caret";
23 | @import "mixins/pagination";
24 | @import "mixins/lists";
25 | @import "mixins/list-group";
26 | @import "mixins/nav-divider";
27 | @import "mixins/forms";
28 | @import "mixins/table-row";
29 |
30 | // // Skins
31 | @import "mixins/background-variant";
32 | @import "mixins/border-radius";
33 | @import "mixins/box-shadow";
34 | @import "mixins/gradients";
35 | @import "mixins/transition";
36 |
37 | // // Layout
38 | @import "mixins/clearfix";
39 | @import "mixins/grid-framework";
40 | @import "mixins/grid";
41 | @import "mixins/float";
42 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/_progress.scss:
--------------------------------------------------------------------------------
1 | @keyframes progress-bar-stripes {
2 | from { background-position: $progress-height 0; }
3 | to { background-position: 0 0; }
4 | }
5 |
6 | .progress {
7 | display: flex;
8 | height: $progress-height;
9 | overflow: hidden; // force rounded corners by cropping it
10 | font-size: $progress-font-size;
11 | background-color: $progress-bg;
12 | @include border-radius($progress-border-radius);
13 | @include box-shadow($progress-box-shadow);
14 | }
15 |
16 | .progress-bar {
17 | display: flex;
18 | flex-direction: column;
19 | justify-content: center;
20 | color: $progress-bar-color;
21 | text-align: center;
22 | white-space: nowrap;
23 | background-color: $progress-bar-bg;
24 | @include transition($progress-bar-transition);
25 | }
26 |
27 | .progress-bar-striped {
28 | @include gradient-striped();
29 | background-size: $progress-height $progress-height;
30 | }
31 |
32 | .progress-bar-animated {
33 | animation: progress-bar-stripes $progress-bar-animation-timing;
34 | }
35 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/_root.scss:
--------------------------------------------------------------------------------
1 | :root {
2 | // Custom variable values only support SassScript inside `#{}`.
3 | @each $color, $value in $colors {
4 | --#{$color}: #{$value};
5 | }
6 |
7 | @each $color, $value in $theme-colors {
8 | --#{$color}: #{$value};
9 | }
10 |
11 | @each $bp, $value in $grid-breakpoints {
12 | --breakpoint-#{$bp}: #{$value};
13 | }
14 |
15 | // Use `inspect` for lists so that quoted items keep the quotes.
16 | // See https://github.com/sass/sass/issues/2383#issuecomment-336349172
17 | --font-family-sans-serif: #{inspect($font-family-sans-serif)};
18 | --font-family-monospace: #{inspect($font-family-monospace)};
19 | }
20 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/_transitions.scss:
--------------------------------------------------------------------------------
1 | // stylelint-disable selector-no-qualifying-type
2 |
3 | .fade {
4 | @include transition($transition-fade);
5 |
6 | &:not(.show) {
7 | opacity: 0;
8 | }
9 | }
10 |
11 | .collapse {
12 | &:not(.show) {
13 | display: none;
14 | }
15 | }
16 |
17 | .collapsing {
18 | position: relative;
19 | height: 0;
20 | overflow: hidden;
21 | @include transition($transition-collapse);
22 | }
23 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/_utilities.scss:
--------------------------------------------------------------------------------
1 | @import "utilities/align";
2 | @import "utilities/background";
3 | @import "utilities/borders";
4 | @import "utilities/clearfix";
5 | @import "utilities/display";
6 | @import "utilities/embed";
7 | @import "utilities/flex";
8 | @import "utilities/float";
9 | @import "utilities/position";
10 | @import "utilities/screenreaders";
11 | @import "utilities/shadows";
12 | @import "utilities/sizing";
13 | @import "utilities/spacing";
14 | @import "utilities/text";
15 | @import "utilities/visibility";
16 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/bootstrap-grid.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap Grid v4.1.3 (https://getbootstrap.com/)
3 | * Copyright 2011-2018 The Bootstrap Authors
4 | * Copyright 2011-2018 Twitter, Inc.
5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
6 | */
7 |
8 | @at-root {
9 | @-ms-viewport { width: device-width; } // stylelint-disable-line at-rule-no-vendor-prefix
10 | }
11 |
12 | html {
13 | box-sizing: border-box;
14 | -ms-overflow-style: scrollbar;
15 | }
16 |
17 | *,
18 | *::before,
19 | *::after {
20 | box-sizing: inherit;
21 | }
22 |
23 | @import "functions";
24 | @import "variables";
25 |
26 | @import "mixins/breakpoints";
27 | @import "mixins/grid-framework";
28 | @import "mixins/grid";
29 |
30 | @import "grid";
31 | @import "utilities/display";
32 | @import "utilities/flex";
33 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/bootstrap-reboot.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap Reboot v4.1.3 (https://getbootstrap.com/)
3 | * Copyright 2011-2018 The Bootstrap Authors
4 | * Copyright 2011-2018 Twitter, Inc.
5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
6 | * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
7 | */
8 |
9 | @import "functions";
10 | @import "variables";
11 | @import "mixins";
12 | @import "reboot";
13 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/bootstrap.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap v4.1.3 (https://getbootstrap.com/)
3 | * Copyright 2011-2018 The Bootstrap Authors
4 | * Copyright 2011-2018 Twitter, Inc.
5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
6 | */
7 |
8 | @import "functions";
9 | @import "variables";
10 | @import "mixins";
11 | @import "root";
12 | @import "reboot";
13 | @import "type";
14 | @import "images";
15 | @import "code";
16 | @import "grid";
17 | @import "tables";
18 | @import "forms";
19 | @import "buttons";
20 | @import "transitions";
21 | @import "dropdown";
22 | @import "button-group";
23 | @import "input-group";
24 | @import "custom-forms";
25 | @import "nav";
26 | @import "navbar";
27 | @import "card";
28 | @import "breadcrumb";
29 | @import "pagination";
30 | @import "badge";
31 | @import "jumbotron";
32 | @import "alert";
33 | @import "progress";
34 | @import "media";
35 | @import "list-group";
36 | @import "close";
37 | @import "modal";
38 | @import "tooltip";
39 | @import "popover";
40 | @import "carousel";
41 | @import "utilities";
42 | @import "print";
43 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/mixins/_alert.scss:
--------------------------------------------------------------------------------
1 | @mixin alert-variant($background, $border, $color) {
2 | color: $color;
3 | @include gradient-bg($background);
4 | border-color: $border;
5 |
6 | hr {
7 | border-top-color: darken($border, 5%);
8 | }
9 |
10 | .alert-link {
11 | color: darken($color, 10%);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/mixins/_background-variant.scss:
--------------------------------------------------------------------------------
1 | // stylelint-disable declaration-no-important
2 |
3 | // Contextual backgrounds
4 |
5 | @mixin bg-variant($parent, $color) {
6 | #{$parent} {
7 | background-color: $color !important;
8 | }
9 | a#{$parent},
10 | button#{$parent} {
11 | @include hover-focus {
12 | background-color: darken($color, 10%) !important;
13 | }
14 | }
15 | }
16 |
17 | @mixin bg-gradient-variant($parent, $color) {
18 | #{$parent} {
19 | background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x !important;
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/mixins/_badge.scss:
--------------------------------------------------------------------------------
1 | @mixin badge-variant($bg) {
2 | color: color-yiq($bg);
3 | background-color: $bg;
4 |
5 | &[href] {
6 | @include hover-focus {
7 | color: color-yiq($bg);
8 | text-decoration: none;
9 | background-color: darken($bg, 10%);
10 | }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/mixins/_border-radius.scss:
--------------------------------------------------------------------------------
1 | // Single side border-radius
2 |
3 | @mixin border-radius($radius: $border-radius) {
4 | @if $enable-rounded {
5 | border-radius: $radius;
6 | }
7 | }
8 |
9 | @mixin border-top-radius($radius) {
10 | @if $enable-rounded {
11 | border-top-left-radius: $radius;
12 | border-top-right-radius: $radius;
13 | }
14 | }
15 |
16 | @mixin border-right-radius($radius) {
17 | @if $enable-rounded {
18 | border-top-right-radius: $radius;
19 | border-bottom-right-radius: $radius;
20 | }
21 | }
22 |
23 | @mixin border-bottom-radius($radius) {
24 | @if $enable-rounded {
25 | border-bottom-right-radius: $radius;
26 | border-bottom-left-radius: $radius;
27 | }
28 | }
29 |
30 | @mixin border-left-radius($radius) {
31 | @if $enable-rounded {
32 | border-top-left-radius: $radius;
33 | border-bottom-left-radius: $radius;
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/mixins/_box-shadow.scss:
--------------------------------------------------------------------------------
1 | @mixin box-shadow($shadow...) {
2 | @if $enable-shadows {
3 | box-shadow: $shadow;
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/mixins/_caret.scss:
--------------------------------------------------------------------------------
1 | @mixin caret-down {
2 | border-top: $caret-width solid;
3 | border-right: $caret-width solid transparent;
4 | border-bottom: 0;
5 | border-left: $caret-width solid transparent;
6 | }
7 |
8 | @mixin caret-up {
9 | border-top: 0;
10 | border-right: $caret-width solid transparent;
11 | border-bottom: $caret-width solid;
12 | border-left: $caret-width solid transparent;
13 | }
14 |
15 | @mixin caret-right {
16 | border-top: $caret-width solid transparent;
17 | border-right: 0;
18 | border-bottom: $caret-width solid transparent;
19 | border-left: $caret-width solid;
20 | }
21 |
22 | @mixin caret-left {
23 | border-top: $caret-width solid transparent;
24 | border-right: $caret-width solid;
25 | border-bottom: $caret-width solid transparent;
26 | }
27 |
28 | @mixin caret($direction: down) {
29 | @if $enable-caret {
30 | &::after {
31 | display: inline-block;
32 | width: 0;
33 | height: 0;
34 | margin-left: $caret-width * .85;
35 | vertical-align: $caret-width * .85;
36 | content: "";
37 | @if $direction == down {
38 | @include caret-down;
39 | } @else if $direction == up {
40 | @include caret-up;
41 | } @else if $direction == right {
42 | @include caret-right;
43 | }
44 | }
45 |
46 | @if $direction == left {
47 | &::after {
48 | display: none;
49 | }
50 |
51 | &::before {
52 | display: inline-block;
53 | width: 0;
54 | height: 0;
55 | margin-right: $caret-width * .85;
56 | vertical-align: $caret-width * .85;
57 | content: "";
58 | @include caret-left;
59 | }
60 | }
61 |
62 | &:empty::after {
63 | margin-left: 0;
64 | }
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/mixins/_clearfix.scss:
--------------------------------------------------------------------------------
1 | @mixin clearfix() {
2 | &::after {
3 | display: block;
4 | clear: both;
5 | content: "";
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/mixins/_float.scss:
--------------------------------------------------------------------------------
1 | // stylelint-disable declaration-no-important
2 |
3 | @mixin float-left {
4 | float: left !important;
5 | }
6 | @mixin float-right {
7 | float: right !important;
8 | }
9 | @mixin float-none {
10 | float: none !important;
11 | }
12 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/mixins/_grid-framework.scss:
--------------------------------------------------------------------------------
1 | // Framework grid generation
2 | //
3 | // Used only by Bootstrap to generate the correct number of grid classes given
4 | // any value of `$grid-columns`.
5 |
6 | @mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {
7 | // Common properties for all breakpoints
8 | %grid-column {
9 | position: relative;
10 | width: 100%;
11 | min-height: 1px; // Prevent columns from collapsing when empty
12 | padding-right: ($gutter / 2);
13 | padding-left: ($gutter / 2);
14 | }
15 |
16 | @each $breakpoint in map-keys($breakpoints) {
17 | $infix: breakpoint-infix($breakpoint, $breakpoints);
18 |
19 | // Allow columns to stretch full width below their breakpoints
20 | @for $i from 1 through $columns {
21 | .col#{$infix}-#{$i} {
22 | @extend %grid-column;
23 | }
24 | }
25 | .col#{$infix},
26 | .col#{$infix}-auto {
27 | @extend %grid-column;
28 | }
29 |
30 | @include media-breakpoint-up($breakpoint, $breakpoints) {
31 | // Provide basic `.col-{bp}` classes for equal-width flexbox columns
32 | .col#{$infix} {
33 | flex-basis: 0;
34 | flex-grow: 1;
35 | max-width: 100%;
36 | }
37 | .col#{$infix}-auto {
38 | flex: 0 0 auto;
39 | width: auto;
40 | max-width: none; // Reset earlier grid tiers
41 | }
42 |
43 | @for $i from 1 through $columns {
44 | .col#{$infix}-#{$i} {
45 | @include make-col($i, $columns);
46 | }
47 | }
48 |
49 | .order#{$infix}-first { order: -1; }
50 |
51 | .order#{$infix}-last { order: $columns + 1; }
52 |
53 | @for $i from 0 through $columns {
54 | .order#{$infix}-#{$i} { order: $i; }
55 | }
56 |
57 | // `$columns - 1` because offsetting by the width of an entire row isn't possible
58 | @for $i from 0 through ($columns - 1) {
59 | @if not ($infix == "" and $i == 0) { // Avoid emitting useless .offset-0
60 | .offset#{$infix}-#{$i} {
61 | @include make-col-offset($i, $columns);
62 | }
63 | }
64 | }
65 | }
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/mixins/_grid.scss:
--------------------------------------------------------------------------------
1 | /// Grid system
2 | //
3 | // Generate semantic grid columns with these mixins.
4 |
5 | @mixin make-container() {
6 | width: 100%;
7 | padding-right: ($grid-gutter-width / 2);
8 | padding-left: ($grid-gutter-width / 2);
9 | margin-right: auto;
10 | margin-left: auto;
11 | }
12 |
13 |
14 | // For each breakpoint, define the maximum width of the container in a media query
15 | @mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {
16 | @each $breakpoint, $container-max-width in $max-widths {
17 | @include media-breakpoint-up($breakpoint, $breakpoints) {
18 | max-width: $container-max-width;
19 | }
20 | }
21 | }
22 |
23 | @mixin make-row() {
24 | display: flex;
25 | flex-wrap: wrap;
26 | margin-right: ($grid-gutter-width / -2);
27 | margin-left: ($grid-gutter-width / -2);
28 | }
29 |
30 | @mixin make-col-ready() {
31 | position: relative;
32 | // Prevent columns from becoming too narrow when at smaller grid tiers by
33 | // always setting `width: 100%;`. This works because we use `flex` values
34 | // later on to override this initial width.
35 | width: 100%;
36 | min-height: 1px; // Prevent collapsing
37 | padding-right: ($grid-gutter-width / 2);
38 | padding-left: ($grid-gutter-width / 2);
39 | }
40 |
41 | @mixin make-col($size, $columns: $grid-columns) {
42 | flex: 0 0 percentage($size / $columns);
43 | // Add a `max-width` to ensure content within each column does not blow out
44 | // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari
45 | // do not appear to require this.
46 | max-width: percentage($size / $columns);
47 | }
48 |
49 | @mixin make-col-offset($size, $columns: $grid-columns) {
50 | $num: $size / $columns;
51 | margin-left: if($num == 0, 0, percentage($num));
52 | }
53 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/mixins/_hover.scss:
--------------------------------------------------------------------------------
1 | // Hover mixin and `$enable-hover-media-query` are deprecated.
2 | //
3 | // Originally added during our alphas and maintained during betas, this mixin was
4 | // designed to prevent `:hover` stickiness on iOS-an issue where hover styles
5 | // would persist after initial touch.
6 | //
7 | // For backward compatibility, we've kept these mixins and updated them to
8 | // always return their regular pseudo-classes instead of a shimmed media query.
9 | //
10 | // Issue: https://github.com/twbs/bootstrap/issues/25195
11 |
12 | @mixin hover {
13 | &:hover { @content; }
14 | }
15 |
16 | @mixin hover-focus {
17 | &:hover,
18 | &:focus {
19 | @content;
20 | }
21 | }
22 |
23 | @mixin plain-hover-focus {
24 | &,
25 | &:hover,
26 | &:focus {
27 | @content;
28 | }
29 | }
30 |
31 | @mixin hover-focus-active {
32 | &:hover,
33 | &:focus,
34 | &:active {
35 | @content;
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/mixins/_image.scss:
--------------------------------------------------------------------------------
1 | // Image Mixins
2 | // - Responsive image
3 | // - Retina image
4 |
5 |
6 | // Responsive image
7 | //
8 | // Keep images from scaling beyond the width of their parents.
9 |
10 | @mixin img-fluid {
11 | // Part 1: Set a maximum relative to the parent
12 | max-width: 100%;
13 | // Part 2: Override the height to auto, otherwise images will be stretched
14 | // when setting a width and height attribute on the img element.
15 | height: auto;
16 | }
17 |
18 |
19 | // Retina image
20 | //
21 | // Short retina mixin for setting background-image and -size.
22 |
23 | // stylelint-disable indentation, media-query-list-comma-newline-after
24 | @mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {
25 | background-image: url($file-1x);
26 |
27 | // Autoprefixer takes care of adding -webkit-min-device-pixel-ratio and -o-min-device-pixel-ratio,
28 | // but doesn't convert dppx=>dpi.
29 | // There's no such thing as unprefixed min-device-pixel-ratio since it's nonstandard.
30 | // Compatibility info: https://caniuse.com/#feat=css-media-resolution
31 | @media only screen and (min-resolution: 192dpi), // IE9-11 don't support dppx
32 | only screen and (min-resolution: 2dppx) { // Standardized
33 | background-image: url($file-2x);
34 | background-size: $width-1x $height-1x;
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/mixins/_list-group.scss:
--------------------------------------------------------------------------------
1 | // List Groups
2 |
3 | @mixin list-group-item-variant($state, $background, $color) {
4 | .list-group-item-#{$state} {
5 | color: $color;
6 | background-color: $background;
7 |
8 | &.list-group-item-action {
9 | @include hover-focus {
10 | color: $color;
11 | background-color: darken($background, 5%);
12 | }
13 |
14 | &.active {
15 | color: $white;
16 | background-color: $color;
17 | border-color: $color;
18 | }
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/mixins/_lists.scss:
--------------------------------------------------------------------------------
1 | // Lists
2 |
3 | // Unstyled keeps list items block level, just removes default browser padding and list-style
4 | @mixin list-unstyled {
5 | padding-left: 0;
6 | list-style: none;
7 | }
8 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/mixins/_nav-divider.scss:
--------------------------------------------------------------------------------
1 | // Horizontal dividers
2 | //
3 | // Dividers (basically an hr) within dropdowns and nav lists
4 |
5 | @mixin nav-divider($color: $nav-divider-color, $margin-y: $nav-divider-margin-y) {
6 | height: 0;
7 | margin: $margin-y 0;
8 | overflow: hidden;
9 | border-top: 1px solid $color;
10 | }
11 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/mixins/_pagination.scss:
--------------------------------------------------------------------------------
1 | // Pagination
2 |
3 | @mixin pagination-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {
4 | .page-link {
5 | padding: $padding-y $padding-x;
6 | font-size: $font-size;
7 | line-height: $line-height;
8 | }
9 |
10 | .page-item {
11 | &:first-child {
12 | .page-link {
13 | @include border-left-radius($border-radius);
14 | }
15 | }
16 | &:last-child {
17 | .page-link {
18 | @include border-right-radius($border-radius);
19 | }
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/mixins/_reset-text.scss:
--------------------------------------------------------------------------------
1 | @mixin reset-text {
2 | font-family: $font-family-base;
3 | // We deliberately do NOT reset font-size or word-wrap.
4 | font-style: normal;
5 | font-weight: $font-weight-normal;
6 | line-height: $line-height-base;
7 | text-align: left; // Fallback for where `start` is not supported
8 | text-align: start; // stylelint-disable-line declaration-block-no-duplicate-properties
9 | text-decoration: none;
10 | text-shadow: none;
11 | text-transform: none;
12 | letter-spacing: normal;
13 | word-break: normal;
14 | word-spacing: normal;
15 | white-space: normal;
16 | line-break: auto;
17 | }
18 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/mixins/_resize.scss:
--------------------------------------------------------------------------------
1 | // Resize anything
2 |
3 | @mixin resizable($direction) {
4 | overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`
5 | resize: $direction; // Options: horizontal, vertical, both
6 | }
7 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/mixins/_screen-reader.scss:
--------------------------------------------------------------------------------
1 | // Only display content to screen readers
2 | //
3 | // See: https://a11yproject.com/posts/how-to-hide-content/
4 | // See: https://hugogiraudel.com/2016/10/13/css-hide-and-seek/
5 |
6 | @mixin sr-only {
7 | position: absolute;
8 | width: 1px;
9 | height: 1px;
10 | padding: 0;
11 | overflow: hidden;
12 | clip: rect(0, 0, 0, 0);
13 | white-space: nowrap;
14 | border: 0;
15 | }
16 |
17 | // Use in conjunction with .sr-only to only display content when it's focused.
18 | //
19 | // Useful for "Skip to main content" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
20 | //
21 | // Credit: HTML5 Boilerplate
22 |
23 | @mixin sr-only-focusable {
24 | &:active,
25 | &:focus {
26 | position: static;
27 | width: auto;
28 | height: auto;
29 | overflow: visible;
30 | clip: auto;
31 | white-space: normal;
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/mixins/_size.scss:
--------------------------------------------------------------------------------
1 | // Sizing shortcuts
2 |
3 | @mixin size($width, $height: $width) {
4 | width: $width;
5 | height: $height;
6 | }
7 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/mixins/_table-row.scss:
--------------------------------------------------------------------------------
1 | // Tables
2 |
3 | @mixin table-row-variant($state, $background) {
4 | // Exact selectors below required to override `.table-striped` and prevent
5 | // inheritance to nested tables.
6 | .table-#{$state} {
7 | &,
8 | > th,
9 | > td {
10 | background-color: $background;
11 | }
12 | }
13 |
14 | // Hover states for `.table-hover`
15 | // Note: this is not available for cells or rows within `thead` or `tfoot`.
16 | .table-hover {
17 | $hover-background: darken($background, 5%);
18 |
19 | .table-#{$state} {
20 | @include hover {
21 | background-color: $hover-background;
22 |
23 | > td,
24 | > th {
25 | background-color: $hover-background;
26 | }
27 | }
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/mixins/_text-emphasis.scss:
--------------------------------------------------------------------------------
1 | // stylelint-disable declaration-no-important
2 |
3 | // Typography
4 |
5 | @mixin text-emphasis-variant($parent, $color) {
6 | #{$parent} {
7 | color: $color !important;
8 | }
9 | a#{$parent} {
10 | @include hover-focus {
11 | color: darken($color, 10%) !important;
12 | }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/mixins/_text-hide.scss:
--------------------------------------------------------------------------------
1 | // CSS image replacement
2 | @mixin text-hide($ignore-warning: false) {
3 | // stylelint-disable-next-line font-family-no-missing-generic-family-keyword
4 | font: 0/0 a;
5 | color: transparent;
6 | text-shadow: none;
7 | background-color: transparent;
8 | border: 0;
9 |
10 | @if ($ignore-warning != true) {
11 | @warn "The `text-hide()` mixin has been deprecated as of v4.1.0. It will be removed entirely in v5.";
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/mixins/_text-truncate.scss:
--------------------------------------------------------------------------------
1 | // Text truncate
2 | // Requires inline-block or block for proper styling
3 |
4 | @mixin text-truncate() {
5 | overflow: hidden;
6 | text-overflow: ellipsis;
7 | white-space: nowrap;
8 | }
9 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/mixins/_transition.scss:
--------------------------------------------------------------------------------
1 | @mixin transition($transition...) {
2 | @if $enable-transitions {
3 | @if length($transition) == 0 {
4 | transition: $transition-base;
5 | } @else {
6 | transition: $transition;
7 | }
8 | }
9 |
10 | @media screen and (prefers-reduced-motion: reduce) {
11 | transition: none;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/mixins/_visibility.scss:
--------------------------------------------------------------------------------
1 | // stylelint-disable declaration-no-important
2 |
3 | // Visibility
4 |
5 | @mixin invisible($visibility) {
6 | visibility: $visibility !important;
7 | }
8 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/utilities/_align.scss:
--------------------------------------------------------------------------------
1 | // stylelint-disable declaration-no-important
2 |
3 | .align-baseline { vertical-align: baseline !important; } // Browser default
4 | .align-top { vertical-align: top !important; }
5 | .align-middle { vertical-align: middle !important; }
6 | .align-bottom { vertical-align: bottom !important; }
7 | .align-text-bottom { vertical-align: text-bottom !important; }
8 | .align-text-top { vertical-align: text-top !important; }
9 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/utilities/_background.scss:
--------------------------------------------------------------------------------
1 | // stylelint-disable declaration-no-important
2 |
3 | @each $color, $value in $theme-colors {
4 | @include bg-variant(".bg-#{$color}", $value);
5 | }
6 |
7 | @if $enable-gradients {
8 | @each $color, $value in $theme-colors {
9 | @include bg-gradient-variant(".bg-gradient-#{$color}", $value);
10 | }
11 | }
12 |
13 | .bg-white {
14 | background-color: $white !important;
15 | }
16 |
17 | .bg-transparent {
18 | background-color: transparent !important;
19 | }
20 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/utilities/_borders.scss:
--------------------------------------------------------------------------------
1 | // stylelint-disable declaration-no-important
2 |
3 | //
4 | // Border
5 | //
6 |
7 | .border { border: $border-width solid $border-color !important; }
8 | .border-top { border-top: $border-width solid $border-color !important; }
9 | .border-right { border-right: $border-width solid $border-color !important; }
10 | .border-bottom { border-bottom: $border-width solid $border-color !important; }
11 | .border-left { border-left: $border-width solid $border-color !important; }
12 |
13 | .border-0 { border: 0 !important; }
14 | .border-top-0 { border-top: 0 !important; }
15 | .border-right-0 { border-right: 0 !important; }
16 | .border-bottom-0 { border-bottom: 0 !important; }
17 | .border-left-0 { border-left: 0 !important; }
18 |
19 | @each $color, $value in $theme-colors {
20 | .border-#{$color} {
21 | border-color: $value !important;
22 | }
23 | }
24 |
25 | .border-white {
26 | border-color: $white !important;
27 | }
28 |
29 | //
30 | // Border-radius
31 | //
32 |
33 | .rounded {
34 | border-radius: $border-radius !important;
35 | }
36 | .rounded-top {
37 | border-top-left-radius: $border-radius !important;
38 | border-top-right-radius: $border-radius !important;
39 | }
40 | .rounded-right {
41 | border-top-right-radius: $border-radius !important;
42 | border-bottom-right-radius: $border-radius !important;
43 | }
44 | .rounded-bottom {
45 | border-bottom-right-radius: $border-radius !important;
46 | border-bottom-left-radius: $border-radius !important;
47 | }
48 | .rounded-left {
49 | border-top-left-radius: $border-radius !important;
50 | border-bottom-left-radius: $border-radius !important;
51 | }
52 |
53 | .rounded-circle {
54 | border-radius: 50% !important;
55 | }
56 |
57 | .rounded-0 {
58 | border-radius: 0 !important;
59 | }
60 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/utilities/_clearfix.scss:
--------------------------------------------------------------------------------
1 | .clearfix {
2 | @include clearfix();
3 | }
4 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/utilities/_display.scss:
--------------------------------------------------------------------------------
1 | // stylelint-disable declaration-no-important
2 |
3 | //
4 | // Utilities for common `display` values
5 | //
6 |
7 | @each $breakpoint in map-keys($grid-breakpoints) {
8 | @include media-breakpoint-up($breakpoint) {
9 | $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
10 |
11 | .d#{$infix}-none { display: none !important; }
12 | .d#{$infix}-inline { display: inline !important; }
13 | .d#{$infix}-inline-block { display: inline-block !important; }
14 | .d#{$infix}-block { display: block !important; }
15 | .d#{$infix}-table { display: table !important; }
16 | .d#{$infix}-table-row { display: table-row !important; }
17 | .d#{$infix}-table-cell { display: table-cell !important; }
18 | .d#{$infix}-flex { display: flex !important; }
19 | .d#{$infix}-inline-flex { display: inline-flex !important; }
20 | }
21 | }
22 |
23 |
24 | //
25 | // Utilities for toggling `display` in print
26 | //
27 |
28 | @media print {
29 | .d-print-none { display: none !important; }
30 | .d-print-inline { display: inline !important; }
31 | .d-print-inline-block { display: inline-block !important; }
32 | .d-print-block { display: block !important; }
33 | .d-print-table { display: table !important; }
34 | .d-print-table-row { display: table-row !important; }
35 | .d-print-table-cell { display: table-cell !important; }
36 | .d-print-flex { display: flex !important; }
37 | .d-print-inline-flex { display: inline-flex !important; }
38 | }
39 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/utilities/_embed.scss:
--------------------------------------------------------------------------------
1 | // Credit: Nicolas Gallagher and SUIT CSS.
2 |
3 | .embed-responsive {
4 | position: relative;
5 | display: block;
6 | width: 100%;
7 | padding: 0;
8 | overflow: hidden;
9 |
10 | &::before {
11 | display: block;
12 | content: "";
13 | }
14 |
15 | .embed-responsive-item,
16 | iframe,
17 | embed,
18 | object,
19 | video {
20 | position: absolute;
21 | top: 0;
22 | bottom: 0;
23 | left: 0;
24 | width: 100%;
25 | height: 100%;
26 | border: 0;
27 | }
28 | }
29 |
30 | .embed-responsive-21by9 {
31 | &::before {
32 | padding-top: percentage(9 / 21);
33 | }
34 | }
35 |
36 | .embed-responsive-16by9 {
37 | &::before {
38 | padding-top: percentage(9 / 16);
39 | }
40 | }
41 |
42 | .embed-responsive-4by3 {
43 | &::before {
44 | padding-top: percentage(3 / 4);
45 | }
46 | }
47 |
48 | .embed-responsive-1by1 {
49 | &::before {
50 | padding-top: percentage(1 / 1);
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/utilities/_float.scss:
--------------------------------------------------------------------------------
1 | @each $breakpoint in map-keys($grid-breakpoints) {
2 | @include media-breakpoint-up($breakpoint) {
3 | $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
4 |
5 | .float#{$infix}-left { @include float-left; }
6 | .float#{$infix}-right { @include float-right; }
7 | .float#{$infix}-none { @include float-none; }
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/utilities/_position.scss:
--------------------------------------------------------------------------------
1 | // stylelint-disable declaration-no-important
2 |
3 | // Common values
4 |
5 | // Sass list not in variables since it's not intended for customization.
6 | // stylelint-disable-next-line scss/dollar-variable-default
7 | $positions: static, relative, absolute, fixed, sticky;
8 |
9 | @each $position in $positions {
10 | .position-#{$position} { position: $position !important; }
11 | }
12 |
13 | // Shorthand
14 |
15 | .fixed-top {
16 | position: fixed;
17 | top: 0;
18 | right: 0;
19 | left: 0;
20 | z-index: $zindex-fixed;
21 | }
22 |
23 | .fixed-bottom {
24 | position: fixed;
25 | right: 0;
26 | bottom: 0;
27 | left: 0;
28 | z-index: $zindex-fixed;
29 | }
30 |
31 | .sticky-top {
32 | @supports (position: sticky) {
33 | position: sticky;
34 | top: 0;
35 | z-index: $zindex-sticky;
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/utilities/_screenreaders.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Screenreaders
3 | //
4 |
5 | .sr-only {
6 | @include sr-only();
7 | }
8 |
9 | .sr-only-focusable {
10 | @include sr-only-focusable();
11 | }
12 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/utilities/_shadows.scss:
--------------------------------------------------------------------------------
1 | // stylelint-disable declaration-no-important
2 |
3 | .shadow-sm { box-shadow: $box-shadow-sm !important; }
4 | .shadow { box-shadow: $box-shadow !important; }
5 | .shadow-lg { box-shadow: $box-shadow-lg !important; }
6 | .shadow-none { box-shadow: none !important; }
7 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/utilities/_sizing.scss:
--------------------------------------------------------------------------------
1 | // stylelint-disable declaration-no-important
2 |
3 | // Width and height
4 |
5 | @each $prop, $abbrev in (width: w, height: h) {
6 | @each $size, $length in $sizes {
7 | .#{$abbrev}-#{$size} { #{$prop}: $length !important; }
8 | }
9 | }
10 |
11 | .mw-100 { max-width: 100% !important; }
12 | .mh-100 { max-height: 100% !important; }
13 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/utilities/_spacing.scss:
--------------------------------------------------------------------------------
1 | // stylelint-disable declaration-no-important
2 |
3 | // Margin and Padding
4 |
5 | @each $breakpoint in map-keys($grid-breakpoints) {
6 | @include media-breakpoint-up($breakpoint) {
7 | $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
8 |
9 | @each $prop, $abbrev in (margin: m, padding: p) {
10 | @each $size, $length in $spacers {
11 |
12 | .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }
13 | .#{$abbrev}t#{$infix}-#{$size},
14 | .#{$abbrev}y#{$infix}-#{$size} {
15 | #{$prop}-top: $length !important;
16 | }
17 | .#{$abbrev}r#{$infix}-#{$size},
18 | .#{$abbrev}x#{$infix}-#{$size} {
19 | #{$prop}-right: $length !important;
20 | }
21 | .#{$abbrev}b#{$infix}-#{$size},
22 | .#{$abbrev}y#{$infix}-#{$size} {
23 | #{$prop}-bottom: $length !important;
24 | }
25 | .#{$abbrev}l#{$infix}-#{$size},
26 | .#{$abbrev}x#{$infix}-#{$size} {
27 | #{$prop}-left: $length !important;
28 | }
29 | }
30 | }
31 |
32 | // Some special margin utils
33 | .m#{$infix}-auto { margin: auto !important; }
34 | .mt#{$infix}-auto,
35 | .my#{$infix}-auto {
36 | margin-top: auto !important;
37 | }
38 | .mr#{$infix}-auto,
39 | .mx#{$infix}-auto {
40 | margin-right: auto !important;
41 | }
42 | .mb#{$infix}-auto,
43 | .my#{$infix}-auto {
44 | margin-bottom: auto !important;
45 | }
46 | .ml#{$infix}-auto,
47 | .mx#{$infix}-auto {
48 | margin-left: auto !important;
49 | }
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/utilities/_text.scss:
--------------------------------------------------------------------------------
1 | // stylelint-disable declaration-no-important
2 |
3 | //
4 | // Text
5 | //
6 |
7 | .text-monospace { font-family: $font-family-monospace; }
8 |
9 | // Alignment
10 |
11 | .text-justify { text-align: justify !important; }
12 | .text-nowrap { white-space: nowrap !important; }
13 | .text-truncate { @include text-truncate; }
14 |
15 | // Responsive alignment
16 |
17 | @each $breakpoint in map-keys($grid-breakpoints) {
18 | @include media-breakpoint-up($breakpoint) {
19 | $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
20 |
21 | .text#{$infix}-left { text-align: left !important; }
22 | .text#{$infix}-right { text-align: right !important; }
23 | .text#{$infix}-center { text-align: center !important; }
24 | }
25 | }
26 |
27 | // Transformation
28 |
29 | .text-lowercase { text-transform: lowercase !important; }
30 | .text-uppercase { text-transform: uppercase !important; }
31 | .text-capitalize { text-transform: capitalize !important; }
32 |
33 | // Weight and italics
34 |
35 | .font-weight-light { font-weight: $font-weight-light !important; }
36 | .font-weight-normal { font-weight: $font-weight-normal !important; }
37 | .font-weight-bold { font-weight: $font-weight-bold !important; }
38 | .font-italic { font-style: italic !important; }
39 |
40 | // Contextual colors
41 |
42 | .text-white { color: $white !important; }
43 |
44 | @each $color, $value in $theme-colors {
45 | @include text-emphasis-variant(".text-#{$color}", $value);
46 | }
47 |
48 | .text-body { color: $body-color !important; }
49 | .text-muted { color: $text-muted !important; }
50 |
51 | .text-black-50 { color: rgba($black, .5) !important; }
52 | .text-white-50 { color: rgba($white, .5) !important; }
53 |
54 | // Misc
55 |
56 | .text-hide {
57 | @include text-hide($ignore-warning: true);
58 | }
59 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/bootstrap/utilities/_visibility.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Visibility utilities
3 | //
4 |
5 | .visible {
6 | @include invisible(visible);
7 | }
8 |
9 | .invisible {
10 | @include invisible(hidden);
11 | }
12 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/custom/_main.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Custom Main
3 | //
4 | // Add your own styles or override existing ones
5 | //
6 | // This file is included last, so you have access
7 | // to all Bootstrap and OneUI functions/mixins/styles etc
8 | // --------------------------------------------------
9 |
10 | // If you have many custom styles, you can create and import additional files
11 | // For example you can create _component1.scss and include it as follows:
12 | // @import 'component1';
13 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/custom/_variables.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Custom Variables
3 | //
4 | // Here you can add your own variables overrides
5 | //
6 | // The file is included before any other variable file,
7 | // so you can override them because they all use !default
8 | // --------------------------------------------------
9 |
10 | // For example, changing the primary color
11 | // $primary: #a48ad4;
12 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/_badge.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Badge
3 | // --------------------------------------------------
4 |
5 | .badge-secondary {
6 | @include badge-variant(rgba($black,.33));
7 | }
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/_breadcrumb.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Breadcrumb
3 | // --------------------------------------------------
4 |
5 | .breadcrumb.breadcrumb-alt {
6 | .breadcrumb-item {
7 | font-size: $font-size-sm;
8 | font-weight: $font-weight-bold;
9 | }
10 |
11 | .breadcrumb-item + .breadcrumb-item::before {
12 | position: relative;
13 | top: 1px;
14 | width: 1.25rem;
15 | font-family: "simple-line-icons";
16 | font-size: $font-size-sm;
17 | color: gray("400");
18 | content: "\e606";
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/_buttons.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Buttons
3 | // --------------------------------------------------
4 |
5 | .btn {
6 | font-family: $font-family-base;
7 |
8 | &.btn-square { border-radius: 0; }
9 | &.btn-rounded { border-radius: 2rem; }
10 |
11 | .si,
12 | .fa {
13 | position: relative;
14 | top: 1px;
15 | }
16 |
17 | &.btn-sm .fa { top: 0; }
18 | }
19 |
20 | // Used for buttons that adapt to light/dark header and sidebar variations
21 | .btn-dual {
22 | @include button-dual-variant($body-color-dark, #f5f5f5, #f5f5f5);
23 | }
24 |
25 | .page-header-dark #page-header .btn-dual,
26 | .sidebar-dark #sidebar .btn-dual {
27 | @include button-dual-variant($white, lighten(theme-color("primary-darker"), 9%), lighten(theme-color("primary-darker"), 9%));
28 | }
29 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/_dropdown.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Dropdown
3 | // --------------------------------------------------
4 |
5 | .dropdown-menu {
6 | box-shadow: $dropdown-box-shadow;
7 |
8 | &.dropdown-menu-lg {
9 | min-width: 300px;
10 | }
11 | }
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/_forms.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Forms
3 | // --------------------------------------------------
4 |
5 | .form-control {
6 | font-family: $font-family-base;
7 |
8 | // Alternative Style
9 | &.form-control-alt {
10 | border-color: $body-bg;
11 | background-color: $body-bg;
12 | transition: none;
13 |
14 | &:focus {
15 | border-color: $body-bg-dark;
16 | background-color: $body-bg-dark;
17 | box-shadow: none;
18 | }
19 |
20 | &.is-valid {
21 | border-color: theme-color("success-light");
22 | background-color: theme-color("success-light");
23 |
24 | &:focus {
25 | border-color: lighten(theme-color("success-light"), 2%);
26 | background-color: lighten(theme-color("success-light"), 2%);
27 | }
28 | }
29 |
30 | &.is-invalid {
31 | border-color: theme-color("danger-light");
32 | background-color: theme-color("danger-light");
33 |
34 |
35 | &:focus {
36 | border-color: lighten(theme-color("danger-light"), 2%);
37 | background-color: lighten(theme-color("danger-light"), 2%);
38 | }
39 | }
40 | }
41 | }
42 |
43 | // Temporary fix for custom form controls when labels are empty (bug introduced in Bootstrap 4.1.1)
44 | .custom-control-label {
45 | vertical-align: top;
46 | }
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/_grid.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Grid
3 | // --------------------------------------------------
4 |
5 | // Tiny grid gutters
6 | .row.gutters-tiny {
7 | margin-right: (-($space-row-gutter-tiny / 2));
8 | margin-left: (-($space-row-gutter-tiny / 2));
9 |
10 | > .col,
11 | > [class*="col-"] {
12 | padding-left: ($space-row-gutter-tiny / 2);
13 | padding-right: ($space-row-gutter-tiny / 2);
14 | }
15 |
16 | .push,
17 | .block,
18 | &.items-push > div {
19 | margin-bottom: $space-row-gutter-tiny;
20 | }
21 | }
22 |
23 | // Equal height of elements inside columns
24 | .row.row-deck > div {
25 | display: flex;
26 | align-items: stretch;
27 |
28 | > .block {
29 | min-width: 100%;
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/_header.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Header
3 | // --------------------------------------------------
4 |
5 | #page-header {
6 | position: relative;
7 | margin: 0 auto;
8 | width: 100%;
9 | background-color: $header-bg;
10 | }
11 |
12 | // Header overlay (used for various reasons eg: loading or search)
13 | .overlay-header {
14 | position: absolute;
15 | top: 0;
16 | right: 0;
17 | bottom: 0;
18 | left: 0;
19 | background-color: $white;
20 | opacity: 0;
21 | transition: opacity .1s ease-in-out;
22 | transform: translateY(-100%);
23 | will-change: opacity;
24 |
25 | &.show {
26 | opacity: 1;
27 | transform: translateY(0);
28 | }
29 | }
30 |
31 | // Content header sections
32 | .content-header {
33 | display: flex;
34 | justify-content: space-between;
35 | align-items: center;
36 | margin: 0 auto;
37 | height: $header-height;
38 |
39 | @at-root #page-header & {
40 | padding-left: $space-mobile;
41 | padding-right: $space-mobile;
42 |
43 | @include media-breakpoint-up(md) {
44 | padding-left: $space-base;
45 | padding-right: $space-base;
46 | }
47 | }
48 |
49 | @at-root #sidebar &,
50 | #side-overlay & {
51 | padding-left: $space-side;
52 | padding-right: $space-side;
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/_hero.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Hero
3 | // --------------------------------------------------
4 |
5 | .hero {
6 | position: relative;
7 | display: flex;
8 | flex-direction: row;
9 | justify-content: center;
10 | align-items: center;
11 | width: 100%;
12 | height: 100vh;
13 | min-height: 500px;
14 |
15 | &.hero-sm {
16 | min-height: 300px;
17 | }
18 |
19 | &.hero-lg {
20 | min-height: 800px;
21 | }
22 |
23 | &-inner {
24 | flex: 0 0 auto;
25 | width: 100%;
26 | }
27 |
28 | &-meta {
29 | position: absolute;
30 | right: 0;
31 | bottom: 0;
32 | left: 0;
33 | padding: 1rem 0;
34 | text-align: center;
35 | }
36 | }
37 |
38 | .hero-static {
39 | min-height: 100vh;
40 | }
41 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/_images.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Image (links and hover options)
3 | // --------------------------------------------------
4 |
5 | // Avatar
6 | .img-avatar {
7 | display: inline-block !important;
8 | width: 64px;
9 | height: 64px;
10 | border-radius: 50%;
11 |
12 | &.img-avatar16 {
13 | width: 16px;
14 | height: 16px;
15 | }
16 |
17 | &.img-avatar20 {
18 | width: 20px;
19 | height: 20px;
20 | }
21 |
22 | &.img-avatar32 {
23 | width: 32px;
24 | height: 32px;
25 | }
26 |
27 | &.img-avatar48 {
28 | width: 48px;
29 | height: 48px;
30 | }
31 |
32 | &.img-avatar96 {
33 | width: 96px;
34 | height: 96px;
35 | }
36 |
37 | &.img-avatar128 {
38 | width: 128px;
39 | height: 128px;
40 | }
41 |
42 | &-thumb {
43 | margin: .25rem;
44 | box-shadow: 0 0 0 .25rem rgba(255,255,255,.3);
45 | }
46 |
47 | &.img-avatar-rounded {
48 | border-radius: .25rem;
49 | }
50 | }
51 |
52 | // Image Thumb
53 | .img-thumb {
54 | padding: .375rem;
55 | background-color: $white;
56 | border-radius: .25rem;
57 | }
58 |
59 | // Image Link
60 | .img-link {
61 | display: inline-block;
62 | transition: transform .25s ease-out, opacity .25s ease-out;
63 |
64 | @include hover {
65 | transform: scale(1.02);
66 | opacity: .75;
67 | }
68 |
69 | &:active {
70 | transform: scale(1);
71 | opacity: 1;
72 | }
73 |
74 | &.img-link-simple:hover {
75 | transform: scale(1);
76 | }
77 | }
78 |
79 | .img-link-zoom-in {
80 | cursor: -webkit-zoom-in;
81 | cursor: zoom-in;
82 | }
83 |
84 | // Responsive
85 | .img-fluid.img-fluid-100,
86 | .img-fluid-100 .img-fluid {
87 | width: 100%;
88 | }
89 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/_input-group.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Input Group
3 | // --------------------------------------------------
4 |
5 | .input-group-text.input-group-text-alt {
6 | background-color: $body-bg-dark;
7 | border-color: $body-bg-dark;
8 | }
9 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/_item.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Item
3 | // --------------------------------------------------
4 |
5 | .item {
6 | display: flex;
7 | align-items: center;
8 | justify-content: center;
9 | width: 4rem;
10 | height: 4rem;
11 | transition: opacity .25s ease-out, transform .25s ease-out;
12 |
13 | @at-root {
14 | a#{&} {
15 | will-change: opacity;
16 |
17 | @include hover-focus {
18 | opacity: .6;
19 | }
20 |
21 | &:active {
22 | opacity: 1;
23 | }
24 |
25 | &.item-link-pop {
26 | will-change: transform;
27 |
28 | @include hover-focus {
29 | opacity: 1;
30 | transform: scale(1.1);
31 | }
32 |
33 | &:active {
34 | transform: scale(1);
35 | }
36 | }
37 | }
38 | }
39 |
40 | &.item-tiny {
41 | width: 1rem;
42 | height: 1rem;
43 | }
44 |
45 | &.item-2x {
46 | width: 6rem;
47 | height: 6rem;
48 | }
49 |
50 | &.item-3x {
51 | width: 8rem;
52 | height: 8rem;
53 | }
54 |
55 | &.item-circle {
56 | border-radius: 50%;
57 | }
58 |
59 | &.item-rounded {
60 | border-radius: $border-radius;
61 | }
62 |
63 | &.item-rounded-big {
64 | border-radius: 1.75rem;
65 |
66 | &.item-2x {
67 | border-radius: 2.25rem;
68 | }
69 |
70 | &.item-3x {
71 | border-radius: 3rem;
72 | }
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/_layout.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Layout
3 | // --------------------------------------------------
4 |
5 | // Main Structure
6 | #page-container {
7 | display: flex;
8 | flex-direction: column;
9 | margin: 0 auto;
10 | width: 100%;
11 | height: 100%;
12 | min-width: 320px;
13 | }
14 |
15 | #page-overlay {
16 | position: fixed;
17 | top: 0;
18 | right: 0;
19 | bottom: 0;
20 | left: 0;
21 | content: "";
22 | background-color: rgba($black, .6);
23 | z-index: $zindex-page-overlay;
24 | opacity: 0;
25 | transition: opacity $side-transition;
26 | transform: translateY(-100%);
27 |
28 | @include media-breakpoint-up(lg) {
29 | .side-overlay-o.enable-page-overlay & {
30 | transform: translateY(0);
31 | opacity: 1;
32 | }
33 | }
34 | }
35 |
36 | #main-container {
37 | display: flex;
38 | flex-direction: column;
39 | flex: 1 0 auto;
40 | max-width: 100%;
41 | }
42 |
43 | // Main Content
44 | .content {
45 | @include content-layout($space-mobile, $space-mobile);
46 |
47 | @include media-breakpoint-up(md) {
48 | @include content-layout($space-base, $space-base);
49 | }
50 |
51 | @include media-breakpoint-up(xl) {
52 | &.content-narrow { max-width: $space-narrow !important; }
53 | }
54 |
55 | &.content-boxed { max-width: $space-boxed !important; }
56 |
57 | &.content-top {
58 | padding-top: $header-height + $space-mobile;
59 |
60 | @include media-breakpoint-up(lg) {
61 | padding-top: $header-height + $space-base;
62 | }
63 | }
64 | }
65 |
66 | .content-section-top {
67 | padding-top: $header-height;
68 | }
69 |
70 | // Side Content
71 | .content-side {
72 | @include content-layout($space-side, $space-side, hidden);
73 | }
74 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/_lists.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Lists
3 | // --------------------------------------------------
4 |
5 | // Base List
6 | .list {
7 | @include list-unstyled;
8 |
9 | > li {
10 | position: relative;
11 | }
12 |
13 | &.list-simple > li,
14 | &-li-push > li {
15 | margin-bottom: 1.25rem;
16 | }
17 |
18 | &.list-simple-mini > li,
19 | &-li-push-sm > li {
20 | margin-bottom: .625rem;
21 | }
22 | }
23 |
24 | // Activity
25 | .list-activity {
26 | > li {
27 | margin-bottom: .75rem;
28 | padding-bottom: .375rem;
29 | padding-left: 2rem;
30 | border-bottom: 1px solid $body-bg;
31 |
32 | > i:first-child {
33 | position: absolute;
34 | left: 0;
35 | top: 0;
36 | display: inline-block;
37 | width: 1.25rem;
38 | height: 1.25rem;
39 | line-height: 1.25rem;
40 | text-align: center;
41 | }
42 | }
43 |
44 | > li:last-child {
45 | border-bottom: none;
46 | }
47 | }
48 |
49 | // Events
50 | .list-events > li {
51 | margin-bottom: .25rem;
52 | padding: .5rem .75rem;
53 | font-size: $font-size-sm;
54 | font-weight: 600;
55 | background-color: theme-color('info-light');
56 | transition: transform .3s ease-out;
57 |
58 | @include hover {
59 | cursor: move;
60 | transform: translateX(-.25rem);
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/_mixins.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Mixins
3 | // --------------------------------------------------
4 |
5 | // Custom mixins and Bootstrap overrides
6 | @import 'mixins/alert';
7 | @import 'mixins/text-emphasis';
8 |
9 | // Custom mixins
10 | @import 'mixins/buttons';
11 | @import 'mixins/custom-forms';
12 | @import 'mixins/content';
13 | @import 'mixins/theme';
14 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/_modal.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Modal
3 | // --------------------------------------------------
4 |
5 | // Top position
6 | .modal-dialog.modal-dialog-top {
7 | margin-top: 0 !important;
8 | }
9 |
10 | // Modal Transitions
11 | .modal {
12 | &.fade .modal-dialog {
13 | transition-duration: .12s;
14 |
15 | &.modal-dialog-popin {
16 | transform: scale(1.1);
17 | }
18 |
19 | &.modal-dialog-popout {
20 | transform: scale(.9);
21 | }
22 |
23 | &.modal-dialog-slideup {
24 | transform: translate(0, 10%);
25 | }
26 |
27 | &.modal-dialog-slideright {
28 | transform: translate(-10%, 0);
29 | }
30 |
31 | &.modal-dialog-slideleft {
32 | transform: translate(10%, 0);
33 | }
34 |
35 | &.modal-dialog-fromright {
36 | transform: translateX(25%) rotate(10deg) scale(.9);
37 | }
38 |
39 | &.modal-dialog-fromleft {
40 | transform: translateX(-25%) rotate(-10deg) scale(.9);
41 | }
42 | }
43 |
44 | &.show .modal-dialog {
45 | &.modal-dialog-popin,
46 | &.modal-dialog-popout {
47 | transform: scale(1);
48 | }
49 |
50 | &.modal-dialog-slideup,
51 | &.modal-dialog-slideright,
52 | &.modal-dialog-slideleft {
53 | transform: translate(0, 0);
54 | }
55 |
56 | &.modal-dialog-fromright,
57 | &.modal-dialog-fromleft {
58 | transform: translateX(0) rotate(0) scale(1);
59 | }
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/_page-loader.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Page Loader
3 | // --------------------------------------------------
4 |
5 | #page-loader {
6 | position: fixed;
7 | top: 0;
8 | right: 0;
9 | bottom: 0;
10 | left: 0;
11 | background-color: $white;
12 | z-index: 999998;
13 | transform: translateY(-100%);
14 |
15 | &.show {
16 | transform: translateY(0);
17 | }
18 |
19 | &::after {
20 | position: absolute;
21 | top: 50%;
22 | left: 50%;
23 | display: block;
24 | margin-top: -30px;
25 | margin-left: -30px;
26 | width: 60px;
27 | height: 60px;
28 | border-radius: 100%;
29 | background-color: theme-color("primary");
30 | content: '';
31 | z-index: 999999;
32 | animation: page-loader .9s infinite ease-in-out;
33 | }
34 | }
35 |
36 |
37 | @keyframes page-loader {
38 | 0% {
39 | transform: scale(0);
40 | }
41 |
42 | 100% {
43 | transform: scale(1);
44 | opacity: 0;
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/_pagination.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Pagination
3 | // --------------------------------------------------
4 |
5 | .page-link {
6 | margin-right: .25rem;
7 | font-weight: $font-weight-bold;
8 | border-width: 0 0 $pagination-border-width 0;
9 | border-radius: 0 !important;
10 |
11 | &:focus {
12 | background-color: $body-bg;
13 | }
14 | }
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/_print.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Print
3 | // --------------------------------------------------
4 |
5 | @media print {
6 | #page-container,
7 | #main-container {
8 | padding: 0 !important;
9 | }
10 |
11 | #page-overlay,
12 | #page-loader,
13 | #page-header,
14 | #page-footer,
15 | #sidebar,
16 | #side-overlay,
17 | .block-options {
18 | display: none !important;
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/_reboot.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Reboot
3 | // --------------------------------------------------
4 |
5 | // Document
6 | html {
7 | height: 100%;
8 | font-size: $font-size-root;
9 | }
10 |
11 | // Body
12 | body {
13 | height: 100%;
14 | @if $enable-text-optimize-legibility {
15 | text-rendering: optimizeLegibility;
16 | -webkit-font-smoothing: antialiased;
17 | -moz-osx-font-smoothing: grayscale;
18 | }
19 | }
20 |
21 | b,
22 | strong {
23 | font-weight: $font-weight-bold;
24 | }
25 |
26 | // Links
27 | a {
28 | transition: color .12s ease-out;
29 |
30 | @include media-breakpoint-up(sm) {
31 | &.link-fx {
32 | position: relative;
33 |
34 | &::before {
35 | position: absolute;
36 | bottom: 0;
37 | left: 0;
38 | width: 100%;
39 | height: 2px;
40 | content: '';
41 | background-color: $link-color;
42 | visibility: hidden;
43 | transform: scaleX(0);
44 | transition: transform .12s ease-out;
45 | }
46 | }
47 | }
48 |
49 | @include hover {
50 | &.link-fx::before {
51 | visibility: visible;
52 | transform: scaleX(1);
53 | }
54 | }
55 | }
56 |
57 | // Paragraphs
58 | p {
59 | line-height: $paragraph-line-height;
60 | margin-bottom: $space-base;
61 | }
62 |
63 | .story p,
64 | p.story {
65 | line-height: $paragraph-line-height-lg;
66 | font-size: $font-size-lg;
67 | color: gray("700");
68 | }
69 |
70 | .story {
71 | h2,
72 | h3,
73 | h4 {
74 | margin-top: 3rem;
75 | }
76 | }
77 |
78 | // Forms
79 | label {
80 | font-weight: 600;
81 | }
82 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/_side-overlay.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Side Overlay
3 | // --------------------------------------------------
4 |
5 | #side-overlay {
6 | position: fixed;
7 | top: 0;
8 | right: 0;
9 | bottom: 0;
10 | z-index: $zindex-side-overlay;
11 | width: 100%;
12 | background-color: $side-overlay-bg;
13 | overflow-y: auto;
14 | transform: translateX(100%) translateY(0) translateZ(0);
15 | opacity: 0;
16 | -webkit-overflow-scrolling: touch;
17 | will-change: transform;
18 |
19 | .side-trans-enabled & {
20 | transition: transform $side-transition, opacity $side-transition;
21 | }
22 |
23 | .sidebar-r & {
24 | right: auto;
25 | left: 0;
26 | transform: translateX(-100%) translateY(0) translateZ(0);
27 | }
28 |
29 | .side-overlay-o & {
30 | transform: translateX(0) translateY(0) translateZ(0);
31 | opacity: 1;
32 | }
33 |
34 | @include media-breakpoint-up(lg) {
35 | width: $side-overlay-width;
36 | box-shadow: 0 0 1.5rem rgba(0,0,0,.15);
37 | transform: translateX(110%) translateY(0) translateZ(0);
38 |
39 | .sidebar-r & {
40 | transform: translateX(-110%) translateY(0) translateZ(0);
41 | }
42 |
43 | .side-overlay-hover & {
44 | transform: translateX($side-overlay-width - 15px) translateY(0) translateZ(0);
45 | opacity: 1;
46 | }
47 |
48 | .sidebar-r.side-overlay-hover & {
49 | transform: translateX(-($side-overlay-width - 15px)) translateY(0) translateZ(0);
50 | opacity: 1;
51 | }
52 |
53 | .side-overlay-hover &:hover,
54 | .side-overlay-o &,
55 | .side-overlay-o.side-overlay-hover & {
56 | box-shadow: 0 0 1.25rem rgba($black,.3);
57 | transform: translateX(0) translateY(0) translateZ(0);
58 | opacity: 1;
59 | }
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/_tables.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Tables
3 | // --------------------------------------------------
4 |
5 | .table {
6 | thead th {
7 | font-weight: $font-weight-bold;
8 | font-size: $font-size-sm;
9 | text-transform: uppercase;
10 | letter-spacing: .0625rem;
11 | }
12 | }
13 |
14 | .table-vcenter {
15 | th,
16 | td {
17 | vertical-align: middle;
18 | }
19 | }
20 |
21 | // Table tools
22 | .js-table-checkable tbody tr,
23 | .js-table-sections-header > tr {
24 | cursor: pointer;
25 | }
26 |
27 | .js-table-sections-header {
28 | > tr > td:first-child > i {
29 | transition: transform .15s ease-out;
30 | }
31 |
32 | + tbody {
33 | display: none;
34 | }
35 |
36 | &.show {
37 | > tr > td:first-child > i {
38 | transform: rotate(90deg);
39 | }
40 |
41 | + tbody {
42 | display: table-row-group;
43 | }
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/_transitions.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Transitions
3 | // --------------------------------------------------
4 |
5 | .fade {
6 | transition: opacity .25s ease-out;
7 |
8 | &.fade-up,
9 | &.fade-right,
10 | &.fade-left {
11 | transition: opacity .25s ease-out, transform .25s ease-out;
12 | }
13 |
14 | &.fade-up {
15 | transform: translateY(50px);
16 |
17 | &.show {
18 | transform: translateY(0);
19 | }
20 | }
21 |
22 | &.fade-right {
23 | transform: translateX(-50px);
24 |
25 | &.show {
26 | transform: translateX(0);
27 | }
28 | }
29 |
30 | &.fade-left {
31 | transform: translateX(50px);
32 |
33 | &.show {
34 | transform: translateX(0);
35 | }
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/_type.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Typography
3 | // --------------------------------------------------
4 |
5 | // Headings
6 | .font-size-h1 { font-size: $h1-font-size; }
7 | .font-size-h2 { font-size: $h2-font-size; }
8 | .font-size-h3 { font-size: $h3-font-size; }
9 | .font-size-h4 { font-size: $h4-font-size; }
10 | .font-size-h5 { font-size: $h5-font-size; }
11 | .font-size-h6 { font-size: $h6-font-size; }
12 |
13 | @include media-breakpoint-down(sm) {
14 | .display-1 { font-size: $display1-size / 1.5; }
15 | .display-2 { font-size: $display2-size / 1.5; }
16 | .display-3 { font-size: $display3-size / 1.5; }
17 | .display-4 { font-size: $display4-size / 1.5; }
18 |
19 | h1, .h1, .font-size-h1 { font-size: $h2-font-size; }
20 | h2, .h2, .font-size-h2 { font-size: $h3-font-size; }
21 | h3, .h3, .font-size-h3 { font-size: $h4-font-size; }
22 | h4, .h4, .font-size-h4 { font-size: $h5-font-size; }
23 |
24 | h5, .h5, .font-size-h5,
25 | h6, .h6, .font-size-h6 {
26 | font-size: $h6-font-size;
27 | }
28 | }
29 |
30 | .content-heading {
31 | margin-bottom: 1rem;
32 | padding-top: 1rem;
33 | font-size: $font-size-sm;
34 | font-weight: $font-weight-bold;
35 | color: gray("600");
36 | line-height: 1.75;
37 | text-transform: uppercase;
38 | letter-spacing: .0625rem;
39 |
40 | small {
41 | margin-top: .25rem;
42 | font-size: $font-size-sm;
43 | font-weight: 400;
44 | color: gray("600");
45 | text-transform: none;
46 | letter-spacing: normal;
47 | }
48 |
49 | @include media-breakpoint-up(md) {
50 | padding-top: 1.5rem;
51 |
52 | small {
53 | margin-top: 0;
54 | }
55 | }
56 |
57 | .block-content > &:first-child,
58 | .content > &:first-child {
59 | padding-top: 0 !important;
60 | }
61 |
62 | .dropdown {
63 | line-height: $line-height-base;
64 | }
65 | }
66 |
67 | // Emphasis
68 | small,
69 | .small {
70 | font-weight: inherit;
71 | }
72 |
73 | // Transformations
74 | .text-uppercase {
75 | letter-spacing: .0625rem;
76 | }
77 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/_utilities.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Utilities
3 | // --------------------------------------------------
4 |
5 | @import 'utilities/background';
6 | @import 'utilities/borders';
7 | @import 'utilities/display';
8 | @import 'utilities/effects';
9 | @import 'utilities/flex';
10 | @import 'utilities/text';
11 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/mixins/_alert.scss:
--------------------------------------------------------------------------------
1 | @mixin alert-variant($background, $border, $color) {
2 | color: $color;
3 | @include gradient-bg($background);
4 | border-color: $border;
5 | box-shadow: 0 .125rem darken($background, 5%);
6 |
7 | hr {
8 | border-top-color: darken($border, 5%);
9 | }
10 |
11 | .alert-link {
12 | color: darken($color, 10%);
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/mixins/_buttons.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Buttons
3 | // --------------------------------------------------
4 |
5 | // Used for buttons that adapt to light/dark header and sidebar variations
6 | @mixin button-dual-variant($color, $background, $border) {
7 | color: $color;
8 | background-color: $background;
9 | border-color: $border;
10 |
11 | &:hover,
12 | &:focus,
13 | &.focus {
14 | color: $color;
15 | background-color: darken($background, 8%);
16 | border-color: darken($border, 12%);
17 | box-shadow: none;
18 | }
19 |
20 | &.disabled,
21 | &:disabled {
22 | background-color: transparent;
23 | border-color: transparent;
24 | }
25 |
26 | &:active,
27 | &.active {
28 | color: $color;
29 | background-color: darken($background, 18%);
30 | border-color: darken($border, 22%);
31 | }
32 |
33 | .show > &.dropdown-toggle {
34 | color: $color;
35 | background-color: $background;
36 | border-color: $background;
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/mixins/_content.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Content
3 | // --------------------------------------------------
4 |
5 | @mixin content-layout($x, $y, $overflow: visible) {
6 | width: 100%;
7 | margin: 0 auto;
8 | padding: $y $x 1px;
9 | overflow-x: $overflow;
10 |
11 | > .pull-t,
12 | > .pull-y {
13 | margin-top: -$y;
14 | }
15 |
16 | > .pull-b,
17 | > .pull-y {
18 | margin-bottom: -1px;
19 | }
20 |
21 | > .pull-r,
22 | > .pull-x {
23 | margin-right: -$x;
24 | }
25 |
26 | > .pull-r,
27 | > .pull-x {
28 | margin-left: -$x;
29 | }
30 |
31 | > .pull {
32 | margin: (-$y) (-$x) (-1px);
33 | }
34 |
35 | @at-root {
36 | #{&}#{&}-full {
37 | padding-bottom: $y;
38 |
39 | > .pull-b,
40 | > .pull-y,
41 | > .pull {
42 | margin-bottom: -$y;
43 | }
44 | }
45 | }
46 |
47 | p,
48 | .push,
49 | .block,
50 | .items-push > div {
51 | margin-bottom: $y;
52 | }
53 |
54 | .items-push-2x > div {
55 | margin-bottom: $y*2;
56 | }
57 |
58 | .items-push-3x > div {
59 | margin-bottom: $y*3;
60 | }
61 | }
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/mixins/_custom-forms.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Custom Forms
3 | // --------------------------------------------------
4 |
5 | // Custom control variant
6 | @mixin custom-control-variant($background, $background-checked) {
7 | &.custom-block {
8 | .custom-control-input:checked ~ .custom-control-label {
9 | background-color: $background;
10 | border-color: $background-checked;
11 | }
12 |
13 | .custom-control-input:focus ~ .custom-control-label {
14 | box-shadow: 0 0 .75rem rgba($background-checked,.25);
15 | }
16 | }
17 |
18 | .custom-control-label::before {
19 | background-color: $background;
20 | }
21 |
22 | .custom-control-input:checked ~ .custom-control-label::before {
23 | background-color: $background-checked;
24 | }
25 |
26 | .custom-control-input:focus ~ .custom-control-label::before {
27 | box-shadow: 0 0 0 1px #fff, 0 0 0 .2rem rgba($background-checked, .25);
28 | }
29 |
30 | .custom-control-input:active ~ .custom-control-label::before {
31 | background-color: lighten($background-checked, 20%);
32 | }
33 |
34 | &.custom-checkbox {
35 | .custom-control-input:checked ~ .custom-control-label::before {
36 | background-color: $background-checked;
37 | }
38 |
39 | .custom-control-input:indeterminate ~ .custom-control-label::before {
40 | background-color: $background-checked;
41 | }
42 | }
43 |
44 | &.custom-radio {
45 | .custom-control-input:checked ~ .custom-control-label::before {
46 | background-color: $background-checked;
47 | }
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/mixins/_text-emphasis.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Text emphasis
3 | // --------------------------------------------------
4 |
5 | @mixin text-emphasis-variant($parent, $color) {
6 | #{$parent} {
7 | color: $color !important;
8 | }
9 |
10 | a#{$parent} {
11 | &.link-fx::before {
12 | background-color: $color;
13 | }
14 |
15 | @include hover-focus {
16 | color: darken($color, 20%) !important;
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/themes/_base.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Required files for theme creation
3 | // --------------------------------------------------
4 |
5 | // Bootstrap functions
6 | @import '../../bootstrap/functions';
7 |
8 | // User variables (your own variable overrides)
9 | @import '../../custom/variables';
10 |
11 | // Custom Bootstrap variables overrides
12 | @import '../variables-bootstrap';
13 |
14 | // Bootstrap variables
15 | @import '../../bootstrap/variables';
16 |
17 | // Bootstrap mixins
18 | @import '../../bootstrap/mixins';
19 |
20 | // Custom mixins and Bootstrap overrides
21 | @import '../mixins';
22 |
23 | // Custom variables
24 | @import '../variables';
25 | @import '../variables-themes';
26 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/themes/amethyst.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Amethyst Theme
3 | // --------------------------------------------------
4 |
5 | // Include base files
6 | @import 'base';
7 |
8 | // Generate color theme
9 | @include color-theme($theme-amethyst-primary,
10 | $theme-amethyst-light,
11 | $theme-amethyst-lighter,
12 | $theme-amethyst-dark,
13 | $theme-amethyst-darker,
14 | $theme-amethyst-body-bg,
15 | $theme-amethyst-body-bg-dark,
16 | $theme-amethyst-body-bg-light,
17 | $theme-amethyst-body-color,
18 | $theme-amethyst-body-color-dark,
19 | $theme-amethyst-body-color-light,
20 | $theme-amethyst-link-color,
21 | $theme-amethyst-link-hover-color,
22 | $theme-amethyst-headings-color,
23 | $theme-amethyst-input-btn-focus-color,
24 | $theme-amethyst-input-btn-focus-box-shadow,
25 | $theme-amethyst-input-bg,
26 | $theme-amethyst-input-color,
27 | $theme-amethyst-input-border-color,
28 | $theme-amethyst-input-focus-bg,
29 | $theme-amethyst-input-focus-color,
30 | $theme-amethyst-input-focus-border-color,
31 | $theme-amethyst-header-bg,
32 | $theme-amethyst-header-dark-bg,
33 | $theme-amethyst-sidebar-bg,
34 | $theme-amethyst-sidebar-dark-bg,
35 | $theme-amethyst-side-overlay-bg);
36 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/themes/city.scss:
--------------------------------------------------------------------------------
1 | //
2 | // City Theme
3 | // --------------------------------------------------
4 |
5 | // Include base files
6 | @import 'base';
7 |
8 | // Generate color theme
9 | @include color-theme($theme-city-primary,
10 | $theme-city-light,
11 | $theme-city-lighter,
12 | $theme-city-dark,
13 | $theme-city-darker,
14 | $theme-city-body-bg,
15 | $theme-city-body-bg-dark,
16 | $theme-city-body-bg-light,
17 | $theme-city-body-color,
18 | $theme-city-body-color-dark,
19 | $theme-city-body-color-light,
20 | $theme-city-link-color,
21 | $theme-city-link-hover-color,
22 | $theme-city-headings-color,
23 | $theme-city-input-btn-focus-color,
24 | $theme-city-input-btn-focus-box-shadow,
25 | $theme-city-input-bg,
26 | $theme-city-input-color,
27 | $theme-city-input-border-color,
28 | $theme-city-input-focus-bg,
29 | $theme-city-input-focus-color,
30 | $theme-city-input-focus-border-color,
31 | $theme-city-header-bg,
32 | $theme-city-header-dark-bg,
33 | $theme-city-sidebar-bg,
34 | $theme-city-sidebar-dark-bg,
35 | $theme-city-side-overlay-bg);
36 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/themes/flat.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Flat Theme
3 | // --------------------------------------------------
4 |
5 | // Include base files
6 | @import 'base';
7 |
8 | // Generate color theme
9 | @include color-theme($theme-flat-primary,
10 | $theme-flat-light,
11 | $theme-flat-lighter,
12 | $theme-flat-dark,
13 | $theme-flat-darker,
14 | $theme-flat-body-bg,
15 | $theme-flat-body-bg-dark,
16 | $theme-flat-body-bg-light,
17 | $theme-flat-body-color,
18 | $theme-flat-body-color-dark,
19 | $theme-flat-body-color-light,
20 | $theme-flat-link-color,
21 | $theme-flat-link-hover-color,
22 | $theme-flat-headings-color,
23 | $theme-flat-input-btn-focus-color,
24 | $theme-flat-input-btn-focus-box-shadow,
25 | $theme-flat-input-bg,
26 | $theme-flat-input-color,
27 | $theme-flat-input-border-color,
28 | $theme-flat-input-focus-bg,
29 | $theme-flat-input-focus-color,
30 | $theme-flat-input-focus-border-color,
31 | $theme-flat-header-bg,
32 | $theme-flat-header-dark-bg,
33 | $theme-flat-sidebar-bg,
34 | $theme-flat-sidebar-dark-bg,
35 | $theme-flat-side-overlay-bg);
36 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/themes/modern.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Modern Theme
3 | // --------------------------------------------------
4 |
5 | // Include base files
6 | @import 'base';
7 |
8 | // Generate color theme
9 | @include color-theme($theme-modern-primary,
10 | $theme-modern-light,
11 | $theme-modern-lighter,
12 | $theme-modern-dark,
13 | $theme-modern-darker,
14 | $theme-modern-body-bg,
15 | $theme-modern-body-bg-dark,
16 | $theme-modern-body-bg-light,
17 | $theme-modern-body-color,
18 | $theme-modern-body-color-dark,
19 | $theme-modern-body-color-light,
20 | $theme-modern-link-color,
21 | $theme-modern-link-hover-color,
22 | $theme-modern-headings-color,
23 | $theme-modern-input-btn-focus-color,
24 | $theme-modern-input-btn-focus-box-shadow,
25 | $theme-modern-input-bg,
26 | $theme-modern-input-color,
27 | $theme-modern-input-border-color,
28 | $theme-modern-input-focus-bg,
29 | $theme-modern-input-focus-color,
30 | $theme-modern-input-focus-border-color,
31 | $theme-modern-header-bg,
32 | $theme-modern-header-dark-bg,
33 | $theme-modern-sidebar-bg,
34 | $theme-modern-sidebar-dark-bg,
35 | $theme-modern-side-overlay-bg);
36 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/themes/smooth.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Smooth Theme
3 | // --------------------------------------------------
4 |
5 | // Include base files
6 | @import 'base';
7 |
8 | // Generate color theme
9 | @include color-theme($theme-smooth-primary,
10 | $theme-smooth-light,
11 | $theme-smooth-lighter,
12 | $theme-smooth-dark,
13 | $theme-smooth-darker,
14 | $theme-smooth-body-bg,
15 | $theme-smooth-body-bg-dark,
16 | $theme-smooth-body-bg-light,
17 | $theme-smooth-body-color,
18 | $theme-smooth-body-color-dark,
19 | $theme-smooth-body-color-light,
20 | $theme-smooth-link-color,
21 | $theme-smooth-link-hover-color,
22 | $theme-smooth-headings-color,
23 | $theme-smooth-input-btn-focus-color,
24 | $theme-smooth-input-btn-focus-box-shadow,
25 | $theme-smooth-input-bg,
26 | $theme-smooth-input-color,
27 | $theme-smooth-input-border-color,
28 | $theme-smooth-input-focus-bg,
29 | $theme-smooth-input-focus-color,
30 | $theme-smooth-input-focus-border-color,
31 | $theme-smooth-header-bg,
32 | $theme-smooth-header-dark-bg,
33 | $theme-smooth-sidebar-bg,
34 | $theme-smooth-sidebar-dark-bg,
35 | $theme-smooth-side-overlay-bg);
36 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/utilities/_borders.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Borders
3 | // --------------------------------------------------
4 |
5 | .border-white-op { border-color: rgba($white, .1) !important; }
6 | .border-black-op { border-color: rgba($black, .1) !important; }
7 |
8 | .border-2x { border-width: 2px !important; }
9 | .border-3x { border-width: 3px !important; }
10 | .border-4x { border-width: 4px !important; }
11 | .border-5x { border-width: 5px !important; }
12 | .border-10x { border-width: 10px !important; }
13 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/utilities/_display.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Display
3 | // --------------------------------------------------
4 |
5 | .overflow-hidden {
6 | overflow: hidden;
7 | }
8 |
9 | .overflow-y-auto {
10 | overflow-y: auto;
11 | -webkit-overflow-scrolling: touch;
12 | }
13 |
14 | .opacity-0 { opacity: 0; }
15 | .opacity-25 { opacity: .25; }
16 | .opacity-50 { opacity: .50; }
17 | .opacity-75 { opacity: .75; }
18 | .opacity-1 { opacity: 1; }
19 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/utilities/_effects.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Effects
3 | // --------------------------------------------------
4 |
5 | // Helpers
6 | .no-transition { transition: none !important; }
7 |
8 | // Ripple effect (mostly for buttons usage)
9 | .click-ripple {
10 | display: block;
11 | position: absolute;
12 | background: rgba($white, .6);
13 | border-radius: 100%;
14 | transform: scale(0);
15 |
16 | &.animate {
17 | animation: click-ripple .6s ease-out;
18 | }
19 | }
20 |
21 | @keyframes click-ripple {
22 | 50% {
23 | opacity: .6;
24 | transform: scale(2);
25 | }
26 |
27 | 100% {
28 | opacity: 0;
29 | transform: scale(3);
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/oneui/utilities/_flex.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Flex Utilities
3 | // --------------------------------------------------
4 |
5 | // Flex specific options
6 | @each $breakpoint in map-keys($grid-breakpoints) {
7 | @include media-breakpoint-up($breakpoint) {
8 | $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
9 |
10 | .flex#{$infix}-00-auto { flex: 0 0 auto; }
11 | .flex#{$infix}-10-auto { flex: 1 0 auto; }
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/vendor/_bootstrap-colorpicker.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Bootstrap Colorpicker
3 | //
4 | // Overwrite/Extend styles
5 | // --------------------------------------------------
6 |
7 | .colorpicker.dropdown-menu {
8 | min-width: auto;
9 | }
10 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/vendor/_ckeditor.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Ckeditor Editor
3 | //
4 | // Overwrite/Extend styles
5 | // --------------------------------------------------
6 |
7 | .cke_chrome {
8 | border-color: $body-bg-dark !important;
9 | }
10 |
11 | .cke_top {
12 | border-bottom-color: $body-bg-dark !important;
13 | background: $body-bg-light !important;
14 | }
15 |
16 | .cke_bottom {
17 | border-top-color: $body-bg-dark !important;
18 | background: $body-bg-light !important;
19 | }
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/vendor/_datatables.scss:
--------------------------------------------------------------------------------
1 | //
2 | // DataTables
3 | //
4 | // Overwrite/Extend styles
5 | // --------------------------------------------------
6 |
7 | table.dataTable {
8 | border-collapse: collapse !important;
9 |
10 | td,
11 | th {
12 | box-sizing: border-box;
13 | }
14 |
15 | thead {
16 | > tr > th.sorting_asc,
17 | > tr > th.sorting_desc,
18 | > tr > th.sorting,
19 | > tr > td.sorting_asc,
20 | > tr > td.sorting_desc,
21 | > tr > td.sorting {
22 | padding-right: 1.25rem;
23 | }
24 |
25 | .sorting:before,
26 | .sorting_asc:before,
27 | .sorting_desc:before,
28 | .sorting_asc_disabled:before,
29 | .sorting_desc_disabled:before {
30 | display: none;
31 | }
32 |
33 | .sorting:after,
34 | .sorting_asc:after,
35 | .sorting_desc:after,
36 | .sorting_asc_disabled:after,
37 | .sorting_desc_disabled:after {
38 | right: .375rem;
39 | bottom: .75rem;
40 | font-family: "Font Awesome 5 Free";
41 | font-weight: 600;
42 | opacity: .4;
43 | }
44 |
45 | .sorting:after {
46 | content: "\f0dc";
47 | }
48 |
49 | .sorting_asc:after {
50 | content: "\f106";
51 | }
52 |
53 | .sorting_desc:after {
54 | content: "\f107";
55 | }
56 | }
57 | }
58 |
59 | div.dataTables_wrapper div.dataTables_paginate ul.pagination {
60 | margin-top: .75rem;
61 | justify-content: center;
62 |
63 | @include media-breakpoint-up(md) {
64 | margin-top: .125rem;
65 | justify-content: flex-end;
66 | }
67 | }
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/vendor/_dropzone.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Dropzone
3 | //
4 | // Overwrite/Extend styles
5 | // --------------------------------------------------
6 |
7 | .dropzone {
8 | min-height: 200px;
9 | background-color: $body-bg-light;
10 | border: .125rem dashed $input-border-color;
11 | border-radius: $border-radius-lg;
12 |
13 | .dz-message {
14 | margin: 4rem 0;
15 | font-size: 1rem;
16 | font-style: italic;
17 | font-weight: $font-weight-bold;
18 | color: $body-color;
19 | }
20 |
21 | @include hover {
22 | background-color: $white;
23 | border-color: theme-color("primary");
24 |
25 | .dz-message {
26 | color: theme-color("primary");
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/vendor/_easy-pie-chart.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Easy Pie Chart
3 | //
4 | // Overwrite/Extend styles
5 | // --------------------------------------------------
6 |
7 | .pie-chart {
8 | position: relative;
9 | display: block;
10 |
11 | > canvas {
12 | display: block;
13 | margin: 0 auto;
14 | }
15 |
16 | > span {
17 | position: absolute;
18 | top: 50%;
19 | right: 0;
20 | left: 0;
21 | text-align: center;
22 | transform: translateY(-50%);
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/vendor/_ion-range-slider.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Ion Range Slider
3 | //
4 | // Overwrite/Extend styles
5 | // --------------------------------------------------
6 |
7 | .irs {
8 | &-line {
9 | height: 5px;
10 | background: $body-bg;
11 | border: none;
12 | border-radius: $border-radius-lg;
13 | }
14 |
15 | &-bar {
16 | height: 5px;
17 | border: none;
18 | background: theme-color("primary");
19 |
20 | &-edge {
21 | height: 5px;
22 | border: none;
23 | background: theme-color("primary");
24 | border-radius: $border-radius-lg 0 0 $border-radius-lg;
25 | }
26 | }
27 |
28 | &-slider {
29 | top: 25px;
30 | width: 20px;
31 | height: 20px;
32 | border: none;
33 | background: $white;
34 | border-radius: 50%;
35 | box-shadow: 0 1px 5px rgba(0,0,0,.35);
36 |
37 | @include hover {
38 | background: $white;
39 | box-shadow: 0 1px 5px rgba(0,0,0,.75);
40 | }
41 | }
42 |
43 | &-from,
44 | &-to,
45 | &-single {
46 | color: $white;
47 | font-size: .75rem;
48 | background: theme-color("primary");
49 | }
50 |
51 | &-grid-pol {
52 | background: theme-color("primary");
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/vendor/_jquery-sparkline.scss:
--------------------------------------------------------------------------------
1 | //
2 | // jQuery Sparkline
3 | //
4 | // Overwrite/Extend styles
5 | // --------------------------------------------------
6 |
7 | .jqstooltip {
8 | box-sizing: content-box;
9 | font-family: $font-family-base;
10 | border: none !important;
11 | background-color: rgba(0,0,0,.75) !important;
12 | border-radius: $border-radius-sm;
13 | }
14 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/vendor/_jvector-map.scss:
--------------------------------------------------------------------------------
1 | //
2 | // jVectorMap
3 | //
4 | // Overwrite/Extend styles
5 | // --------------------------------------------------
6 |
7 | .jvectormap-tip {
8 | padding: .375rem .5rem;
9 | font-family: $font-family-base;
10 | background: theme-color('dark');
11 | border: none;
12 | border-radius: 0;
13 | }
14 |
15 | .jvectormap-zoomin,
16 | .jvectormap-zoomout,
17 | .jvectormap-goback {
18 | left: 1rem;
19 | padding: .25rem;
20 | line-height: 1rem;
21 | background: #555555;
22 | }
23 |
24 | .jvectormap-zoomin,
25 | .jvectormap-zoomout {
26 | width: 1rem;
27 | height: 1rem;
28 | }
29 |
30 | .jvectormap-zoomin:hover,
31 | .jvectormap-zoomout:hover {
32 | opacity: .6;
33 | }
34 |
35 | .jvectormap-zoomout {
36 | top: 2.25rem;
37 | }
38 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/vendor/_simplemde.scss:
--------------------------------------------------------------------------------
1 | //
2 | // SimpleMDE Markdown Editor
3 | //
4 | // Overwrite/Extend styles
5 | // --------------------------------------------------
6 |
7 | .CodeMirror-fullscreen,
8 | .editor-toolbar.fullscreen,
9 | .editor-preview-side {
10 | z-index: $zindex-modal + 2;
11 | }
12 |
13 | .editor-preview {
14 | z-index: $zindex-modal + 1;
15 | }
16 |
17 | .editor-toolbar {
18 | border-color: $body-bg-dark;
19 | background-color: $body-bg-light;
20 | }
21 |
22 | .CodeMirror {
23 | border-color: $body-bg-dark;
24 | }
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/vendor/_summernote.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Summernote Editor
3 | //
4 | // Overwrite/Extend styles
5 | // --------------------------------------------------
6 |
7 | .note-editor.note-frame {
8 | border-color: $body-bg-dark;
9 |
10 | .note-toolbar-wrapper {
11 | background-color: $white;
12 | }
13 |
14 | .note-toolbar {
15 | background-color: $body-bg-light;
16 | border-bottom-color: $body-bg-dark;
17 | }
18 |
19 | .note-statusbar {
20 | border-top-color: $body-bg-dark;
21 | background-color: $body-bg-light;
22 | }
23 |
24 | .note-popover .popover-content .note-color .dropdown-menu,
25 | .card-header.note-toolbar .note-color .dropdown-menu {
26 | min-width: 350px;
27 | }
28 | }
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/vendor/fontawesome/_animated.scss:
--------------------------------------------------------------------------------
1 | // Animated Icons
2 | // --------------------------
3 |
4 | .#{$fa-css-prefix}-spin {
5 | animation: fa-spin 2s infinite linear;
6 | }
7 |
8 | .#{$fa-css-prefix}-pulse {
9 | animation: fa-spin 1s infinite steps(8);
10 | }
11 |
12 | @keyframes fa-spin {
13 | 0% {
14 | transform: rotate(0deg);
15 | }
16 |
17 | 100% {
18 | transform: rotate(360deg);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/vendor/fontawesome/_bordered-pulled.scss:
--------------------------------------------------------------------------------
1 | // Bordered & Pulled
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-border {
5 | border: solid .08em $fa-border-color;
6 | border-radius: .1em;
7 | padding: .2em .25em .15em;
8 | }
9 |
10 | .#{$fa-css-prefix}-pull-left { float: left; }
11 | .#{$fa-css-prefix}-pull-right { float: right; }
12 |
13 | .#{$fa-css-prefix},
14 | .fas,
15 | .far,
16 | .fal,
17 | .fab {
18 | &.#{$fa-css-prefix}-pull-left { margin-right: .3em; }
19 | &.#{$fa-css-prefix}-pull-right { margin-left: .3em; }
20 | }
21 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/vendor/fontawesome/_core.scss:
--------------------------------------------------------------------------------
1 | // Base Class Definition
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix},
5 | .fas,
6 | .far,
7 | .fal,
8 | .fab {
9 | -moz-osx-font-smoothing: grayscale;
10 | -webkit-font-smoothing: antialiased;
11 | display: inline-block;
12 | font-style: normal;
13 | font-variant: normal;
14 | text-rendering: auto;
15 | line-height: 1;
16 | }
17 |
18 | %fa-icon {
19 | @include fa-icon;
20 | }
21 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/vendor/fontawesome/_fixed-width.scss:
--------------------------------------------------------------------------------
1 | // Fixed Width Icons
2 | // -------------------------
3 | .#{$fa-css-prefix}-fw {
4 | text-align: center;
5 | width: (20em / 16);
6 | }
7 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/vendor/fontawesome/_larger.scss:
--------------------------------------------------------------------------------
1 | // Icon Sizes
2 | // -------------------------
3 |
4 | // makes the font 33% larger relative to the icon container
5 | .#{$fa-css-prefix}-lg {
6 | font-size: (4em / 3);
7 | line-height: (3em / 4);
8 | vertical-align: -.0667em;
9 | }
10 |
11 | .#{$fa-css-prefix}-xs {
12 | font-size: .75em;
13 | }
14 |
15 | .#{$fa-css-prefix}-sm {
16 | font-size: .875em;
17 | }
18 |
19 | @for $i from 1 through 10 {
20 | .#{$fa-css-prefix}-#{$i}x {
21 | font-size: $i * 1em;
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/vendor/fontawesome/_list.scss:
--------------------------------------------------------------------------------
1 | // List Icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-ul {
5 | list-style-type: none;
6 | margin-left: $fa-li-width * 5/4;
7 | padding-left: 0;
8 |
9 | > li { position: relative; }
10 | }
11 |
12 | .#{$fa-css-prefix}-li {
13 | left: -$fa-li-width;
14 | position: absolute;
15 | text-align: center;
16 | width: $fa-li-width;
17 | line-height: inherit;
18 | }
19 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/vendor/fontawesome/_mixins.scss:
--------------------------------------------------------------------------------
1 | // Mixins
2 | // --------------------------
3 |
4 | @mixin fa-icon {
5 | -webkit-font-smoothing: antialiased;
6 | -moz-osx-font-smoothing: grayscale;
7 | display: inline-block;
8 | font-style: normal;
9 | font-variant: normal;
10 | font-weight: normal;
11 | line-height: 1;
12 | vertical-align: -.125em;
13 | }
14 |
15 | @mixin fa-icon-rotate($degrees, $rotation) {
16 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})";
17 | transform: rotate($degrees);
18 | }
19 |
20 | @mixin fa-icon-flip($horiz, $vert, $rotation) {
21 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)";
22 | transform: scale($horiz, $vert);
23 | }
24 |
25 |
26 | // Only display content to screen readers. A la Bootstrap 4.
27 | //
28 | // See: http://a11yproject.com/posts/how-to-hide-content/
29 |
30 | @mixin sr-only {
31 | border: 0;
32 | clip: rect(0, 0, 0, 0);
33 | height: 1px;
34 | margin: -1px;
35 | overflow: hidden;
36 | padding: 0;
37 | position: absolute;
38 | width: 1px;
39 | }
40 |
41 | // Use in conjunction with .sr-only to only display content when it's focused.
42 | //
43 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
44 | //
45 | // Credit: HTML5 Boilerplate
46 |
47 | @mixin sr-only-focusable {
48 | &:active,
49 | &:focus {
50 | clip: auto;
51 | height: auto;
52 | margin: 0;
53 | overflow: visible;
54 | position: static;
55 | width: auto;
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/vendor/fontawesome/_rotated-flipped.scss:
--------------------------------------------------------------------------------
1 | // Rotated & Flipped Icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); }
5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }
6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }
7 |
8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }
9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); }
10 | .#{$fa-css-prefix}-flip-horizontal.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(-1, -1, 2); }
11 |
12 | // Hook for IE8-9
13 | // -------------------------
14 |
15 | :root {
16 | .#{$fa-css-prefix}-rotate-90,
17 | .#{$fa-css-prefix}-rotate-180,
18 | .#{$fa-css-prefix}-rotate-270,
19 | .#{$fa-css-prefix}-flip-horizontal,
20 | .#{$fa-css-prefix}-flip-vertical {
21 | filter: none;
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/vendor/fontawesome/_screen-reader.scss:
--------------------------------------------------------------------------------
1 | // Screen Readers
2 | // -------------------------
3 |
4 | .sr-only { @include sr-only; }
5 | .sr-only-focusable { @include sr-only-focusable; }
6 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/vendor/fontawesome/_stacked.scss:
--------------------------------------------------------------------------------
1 | // Stacked Icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-stack {
5 | display: inline-block;
6 | height: 2em;
7 | line-height: 2em;
8 | position: relative;
9 | vertical-align: middle;
10 | width: 2em;
11 | }
12 |
13 | .#{$fa-css-prefix}-stack-1x,
14 | .#{$fa-css-prefix}-stack-2x {
15 | left: 0;
16 | position: absolute;
17 | text-align: center;
18 | width: 100%;
19 | }
20 |
21 | .#{$fa-css-prefix}-stack-1x {
22 | line-height: inherit;
23 | }
24 |
25 | .#{$fa-css-prefix}-stack-2x {
26 | font-size: 2em;
27 | }
28 |
29 | .#{$fa-css-prefix}-inverse {
30 | color: $fa-inverse;
31 | }
32 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/vendor/fontawesome/brands.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome Free 5.3.1 by @fontawesome - https://fontawesome.com
3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 | */
5 | @import 'variables';
6 |
7 | @font-face {
8 | font-family: 'Font Awesome 5 Brands';
9 | font-style: normal;
10 | font-weight: normal;
11 | src: url('#{$fa-font-path}/fa-brands-400.eot');
12 | src: url('#{$fa-font-path}/fa-brands-400.eot?#iefix') format('embedded-opentype'),
13 | url('#{$fa-font-path}/fa-brands-400.woff2') format('woff2'),
14 | url('#{$fa-font-path}/fa-brands-400.woff') format('woff'),
15 | url('#{$fa-font-path}/fa-brands-400.ttf') format('truetype'),
16 | url('#{$fa-font-path}/fa-brands-400.svg#fontawesome') format('svg');
17 | }
18 |
19 | .fab {
20 | font-family: 'Font Awesome 5 Brands';
21 | }
22 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/vendor/fontawesome/fontawesome.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome Free 5.3.1 by @fontawesome - https://fontawesome.com
3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 | */
5 | @import 'variables';
6 | @import 'mixins';
7 | @import 'core';
8 | @import 'larger';
9 | @import 'fixed-width';
10 | @import 'list';
11 | @import 'bordered-pulled';
12 | @import 'animated';
13 | @import 'rotated-flipped';
14 | @import 'stacked';
15 | @import 'icons';
16 | @import 'screen-reader';
17 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/vendor/fontawesome/regular.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome Free 5.3.1 by @fontawesome - https://fontawesome.com
3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 | */
5 | @import 'variables';
6 |
7 | @font-face {
8 | font-family: 'Font Awesome 5 Free';
9 | font-style: normal;
10 | font-weight: 400;
11 | src: url('#{$fa-font-path}/fa-regular-400.eot');
12 | src: url('#{$fa-font-path}/fa-regular-400.eot?#iefix') format('embedded-opentype'),
13 | url('#{$fa-font-path}/fa-regular-400.woff2') format('woff2'),
14 | url('#{$fa-font-path}/fa-regular-400.woff') format('woff'),
15 | url('#{$fa-font-path}/fa-regular-400.ttf') format('truetype'),
16 | url('#{$fa-font-path}/fa-regular-400.svg#fontawesome') format('svg');
17 | }
18 |
19 | .far {
20 | font-family: 'Font Awesome 5 Free';
21 | font-weight: 400;
22 | }
23 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/vendor/fontawesome/solid.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome Free 5.3.1 by @fontawesome - https://fontawesome.com
3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 | */
5 | @import 'variables';
6 |
7 | @font-face {
8 | font-family: 'Font Awesome 5 Free';
9 | font-style: normal;
10 | font-weight: 900;
11 | src: url('#{$fa-font-path}/fa-solid-900.eot');
12 | src: url('#{$fa-font-path}/fa-solid-900.eot?#iefix') format('embedded-opentype'),
13 | url('#{$fa-font-path}/fa-solid-900.woff2') format('woff2'),
14 | url('#{$fa-font-path}/fa-solid-900.woff') format('woff'),
15 | url('#{$fa-font-path}/fa-solid-900.ttf') format('truetype'),
16 | url('#{$fa-font-path}/fa-solid-900.svg#fontawesome') format('svg');
17 | }
18 |
19 | .fa,
20 | .fas {
21 | font-family: 'Font Awesome 5 Free';
22 | font-weight: 900;
23 | }
24 |
--------------------------------------------------------------------------------
/dashboard/src/assets/_scss/vendor/fontawesome/v4-shims.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome Free 5.3.1 by @fontawesome - https://fontawesome.com
3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 | */
5 | @import 'variables';
6 | @import 'shims';
7 |
--------------------------------------------------------------------------------
/dashboard/src/assets/battery_outline.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/dashboard/src/assets/colors.scss:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/src/assets/colors.scss
--------------------------------------------------------------------------------
/dashboard/src/assets/logo-w-text.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/src/assets/logo-w-text.png
--------------------------------------------------------------------------------
/dashboard/src/assets/logo-w-text.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/src/assets/logo-w-text.psd
--------------------------------------------------------------------------------
/dashboard/src/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/src/assets/logo.png
--------------------------------------------------------------------------------
/dashboard/src/assets/tyres_green.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/src/assets/tyres_green.png
--------------------------------------------------------------------------------
/dashboard/src/assets/tyres_red.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/src/assets/tyres_red.png
--------------------------------------------------------------------------------
/dashboard/src/assets/tyres_yellow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/src/assets/tyres_yellow.png
--------------------------------------------------------------------------------
/dashboard/src/assets/vehicle-top.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/dashboard/src/assets/vehicle-top.png
--------------------------------------------------------------------------------
/dashboard/src/components/BarChart.vue:
--------------------------------------------------------------------------------
1 |
30 |
31 |
32 |
37 |
--------------------------------------------------------------------------------
/dashboard/src/components/DoughnutChart.vue:
--------------------------------------------------------------------------------
1 |
13 |
--------------------------------------------------------------------------------
/dashboard/src/components/Footer.vue:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
16 |
17 |
18 |
23 |
--------------------------------------------------------------------------------
/dashboard/src/components/Framework.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | {{ alert.message }}
6 |
7 |
8 |
9 |
10 |
11 |
12 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/dashboard/src/components/LandingPage.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
AWS Track & Trace sample
7 | Track your moving assets and their status
8 |
9 |
10 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
38 |
39 |
40 |
85 |
--------------------------------------------------------------------------------
/dashboard/src/components/LineChart.vue:
--------------------------------------------------------------------------------
1 |
13 |
--------------------------------------------------------------------------------
/dashboard/src/components/Login.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
37 |
38 |
39 |
46 |
--------------------------------------------------------------------------------
/dashboard/src/components/SensorHistory.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
{{ sensor.SensorName }}
4 |
5 |
6 |
7 |
8 |
9 |
10 |
54 |
55 |
56 |
75 |
--------------------------------------------------------------------------------
/dashboard/src/main.ts:
--------------------------------------------------------------------------------
1 | // The Vue build version to load with the `import` command
2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias.
3 | import Vue from 'vue'
4 |
5 | import App from './App'
6 | import router from './router'
7 | import ConfigurationService from '@/services/ConfigurationService';
8 | import * as VueGoogleMaps from 'vue2-google-maps';
9 |
10 | const configService = ConfigurationService.getInstance()
11 | Vue.use(VueGoogleMaps, {
12 | load: {
13 | key: configService.get('GMAPS_API_KEY')
14 | }
15 | })
16 |
17 | Vue.config.productionTip = false
18 |
19 | /* eslint-disable no-new */
20 | new Vue({
21 | el: '#app',
22 | router,
23 | components: { App },
24 | template: ''
25 | })
26 |
--------------------------------------------------------------------------------
/dashboard/src/router/index.ts:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import Router from 'vue-router'
3 |
4 | import Dashboard from '@/components/Dashboard.vue';
5 | import LandingPage from '@/components/LandingPage.vue';
6 | import Login from '@/components/Login.vue';
7 |
8 | Vue.use(Router)
9 |
10 | export default new Router({
11 | mode: 'history',
12 | routes: [
13 | {
14 | path: '/',
15 | name: 'LandingPage',
16 | component: LandingPage,
17 | meta: {
18 | public: true
19 | }
20 | },
21 | {
22 | path: '/login',
23 | name: 'Login',
24 | component: Login,
25 | meta: {
26 | public: true
27 | }
28 | },
29 | {
30 | path: '/dashboard',
31 | name: 'DashboardFleetMap',
32 | component: Dashboard,
33 | meta: {
34 | public: false,
35 | sidebar: false,
36 | visual: 'fleet-map'
37 | }
38 | }
39 | ]
40 | })
41 |
--------------------------------------------------------------------------------
/dashboard/src/services/AssetService.js:
--------------------------------------------------------------------------------
1 | // Imports
2 |
3 | export default class AssetService {
4 |
5 | constructor () {
6 | // Do something here
7 | }
8 |
9 | getAssetLocation (asset) {
10 | const ret = eval(`asset.$state.${asset.$inventory.LocationField}`);
11 | return ret;
12 | }
13 |
14 | getAssetStyle (asset) {
15 | const style = asset.$inventory.MarkerStyle;
16 | let parsedStyle = null;
17 | if (!style) {
18 | parsedStyle = {
19 | path: 'CIRCLE',
20 | scale: 8,
21 | fillColor: '#444',
22 | fillOpacity: 1,
23 | strokeWeight: 0,
24 | strokeColor: '#444'
25 | };
26 | } else {
27 | parsedStyle = JSON.parse(style);
28 | }
29 |
30 | const ret = { ...parsedStyle };
31 |
32 | const conditions = asset.$conditions
33 | .filter(condition => this.verifyConditionMatch(asset, condition))
34 | .reverse()
35 | .map(condition => JSON.parse(condition.StyleOverrides))
36 | .reduce((total, item) => ({ ...total, ...item }), ret)
37 |
38 | return conditions;
39 | }
40 |
41 | getSensorValue (asset, sensor) {
42 | const value = eval(`asset.$state.${sensor.ValueField}`);
43 | return value;
44 | }
45 |
46 | verifyConditionMatch (asset, condition) {
47 | const state = asset.$state;
48 | const sensorList = asset.$sensors;
49 | const sensors = sensorList.map(item => {
50 | const { ValueField } = item;
51 | const value = eval(`state.${ValueField}`);
52 |
53 | return {
54 | key: item.SensorName,
55 | value
56 | };
57 | }).reduce((total, item) => {
58 | total[item.key] = item.value;
59 | return total;
60 | }, {});
61 |
62 | let expressionString = condition.ConditionExpression;
63 | Object.keys(sensors).forEach(sensor => {
64 | expressionString = expressionString.replace(new RegExp(sensor, 'ig'), `sensors.${sensor}`);
65 | });
66 |
67 | const value = eval(expressionString);
68 | const matches = !!value;
69 |
70 | return matches;
71 | }
72 |
73 | static getInstance () {
74 | if (!AssetService._instance) AssetService._instance = new AssetService()
75 | return AssetService._instance
76 | }
77 | }
78 |
--------------------------------------------------------------------------------
/dashboard/src/services/ConfigurationService.js:
--------------------------------------------------------------------------------
1 | import DefaultConfig from '@/assets/config.json'
2 |
3 | export default class ConfigurationService {
4 | static ITEM_DOES_NOT_EXIST_EXCEPTION = item => new Error(`ITEM_DOES_NOT_EXIST: ${item}`)
5 | static ITEM_ALREADY_EXISTS_EXCEPTION = item => new Error(`ITEM_ALREADY_EXISTS: ${item}`)
6 |
7 | constructor () {
8 | this.data = DefaultConfig
9 | }
10 |
11 | get (item, optional = false) {
12 | const value = this.data[item]
13 | if (!value && !optional) {
14 | throw ConfigurationService.ITEM_DOES_NOT_EXIST_EXCEPTION(item)
15 | }
16 |
17 | if (!value && optional) {
18 | console.log(`WARN: Parameter ${item} does not exist`)
19 | }
20 |
21 | return value
22 | }
23 |
24 | set (item, value, overwrite = false) {
25 | const existing = this.data[item]
26 | if (existing !== undefined && !overwrite) {
27 | throw ConfigurationService.ITEM_ALREADY_EXISTS_EXCEPTION(item)
28 | }
29 |
30 | this.data[item] = value
31 |
32 | return this.get(item)
33 | }
34 |
35 | static getInstance () {
36 | if (!ConfigurationService._instance) {
37 | ConfigurationService._instance = new ConfigurationService()
38 | }
39 | return ConfigurationService._instance
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/dashboard/src/services/DdbService.js:
--------------------------------------------------------------------------------
1 | import { DynamoDB } from 'aws-sdk';
2 |
3 | import AuthService from '@/services/AuthService';
4 | import ConfigurationService from '@/services/ConfigurationService';
5 |
6 | export default class DdbService {
7 |
8 | constructor () {
9 | this.auth = AuthService.getInstance();
10 | this.config = ConfigurationService.getInstance();
11 |
12 | const credentials = this.auth.getCredentials();
13 | const region = this.config.get('AWS_REGION');
14 |
15 | this.ddb = new DynamoDB.DocumentClient({
16 | credentials, region
17 | });
18 | }
19 |
20 | async delete (TableName, Key) {
21 | const ret = await this.ddb.delete({ TableName, Key }).promise()
22 | return ret;
23 | }
24 |
25 | async get (TableName, Key) {
26 | const ret = await this.ddb.get({ TableName, Key }).promise();
27 | return ret.Item;
28 | }
29 |
30 | async put (TableName, Key, Item) {
31 | const ret = await this.ddb.put({ TableName, Key, Item }).promise();
32 | return ret.Item;
33 | }
34 |
35 | async query (TableName, KeyConditionExpression, ExpressionAttributeNames, ExpressionAttributeValues) {
36 | const ret = await this.ddb.query({ TableName, KeyConditionExpression, ExpressionAttributeNames, ExpressionAttributeValues }).promise();
37 | return ret.Items;
38 | }
39 |
40 | async scan (TableName) {
41 | const ret = await this.ddb.scan({ TableName }).promise();
42 | return ret.Items;
43 | }
44 |
45 | async update (TableName, Key, UpdateExpression, ExpressionAttributeNames, ExpressionAttributeValues) {
46 | const ret = await this.ddb.update({ TableName, Key, UpdateExpression, ExpressionAttributeNames, ExpressionAttributeValues }).promise()
47 | return ret.Item;
48 | }
49 |
50 | static getInstance () {
51 | if (!DdbService._instance) DdbService._instance = new DdbService()
52 | return DdbService._instance
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/dashboard/src/services/FrameworkService.js:
--------------------------------------------------------------------------------
1 |
2 | export default class FrameworkService {
3 |
4 | constructor() {
5 | this.data = {
6 | alerts: []
7 | }
8 | }
9 |
10 | getData() {
11 | return this.data;
12 | }
13 |
14 | addAlert(rawType, message) {
15 | const type = `alert-${rawType}`;
16 | this.data.alerts.push({
17 | type, message
18 | });
19 | }
20 |
21 | static getInstance() {
22 | if (!FrameworkService._instance) FrameworkService._instance = new FrameworkService();
23 | return FrameworkService._instance;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/dashboard/tests/e2e/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | rules: {
3 | '@typescript-eslint/no-var-requires': 'off',
4 | 'no-unused-expressions': 'off'
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/dashboard/tests/e2e/custom-assertions/elementCount.js:
--------------------------------------------------------------------------------
1 | /**
2 | * A custom Nightwatch assertion. The assertion name is the filename.
3 | *
4 | * Example usage:
5 | * browser.assert.elementCount(selector, count)
6 | *
7 | * For more information on custom assertions see:
8 | * https://nightwatchjs.org/guide/extending-nightwatch/#writing-custom-assertions
9 | *
10 | *
11 | * @param {string|object} selectorOrObject
12 | * @param {number} count
13 | */
14 |
15 | exports.assertion = function elementCount (selectorOrObject, count) {
16 | let selector
17 |
18 | // when called from a page object element or section
19 | if (typeof selectorOrObject === 'object' && selectorOrObject.selector) {
20 | // eslint-disable-next-line prefer-destructuring
21 | selector = selectorOrObject.selector
22 | } else {
23 | selector = selectorOrObject
24 | }
25 |
26 | this.message = `Testing if element <${selector}> has count: ${count}`
27 | this.expected = count
28 | this.pass = val => val === count
29 | this.value = res => res.value
30 | function evaluator (_selector) {
31 | return document.querySelectorAll(_selector).length
32 | }
33 | this.command = cb => this.api.execute(evaluator, [selector], cb)
34 | }
35 |
--------------------------------------------------------------------------------
/dashboard/tests/e2e/custom-commands/customExecute.js:
--------------------------------------------------------------------------------
1 | /**
2 | * A very basic Nightwatch custom command. The command name is the filename and the
3 | * exported "command" function is the command.
4 | *
5 | * Example usage:
6 | * browser.customExecute(function() {
7 | * console.log('Hello from the browser window')
8 | * });
9 | *
10 | * For more information on writing custom commands see:
11 | * https://nightwatchjs.org/guide/extending-nightwatch/#writing-custom-commands
12 | *
13 | * @param {*} data
14 | */
15 | exports.command = function command (data) {
16 | // Other Nightwatch commands are available via "this"
17 |
18 | // .execute() inject a snippet of JavaScript into the page for execution.
19 | // the executed script is assumed to be synchronous.
20 | //
21 | // See https://nightwatchjs.org/api/execute.html for more info.
22 | //
23 | this.execute(
24 | // The function argument is converted to a string and sent to the browser
25 | function (argData) { return argData },
26 |
27 | // The arguments for the function to be sent to the browser are specified in this array
28 | [data],
29 |
30 | function (result) {
31 | // The "result" object contains the result of what we have sent back from the browser window
32 | console.log('custom execute result:', result.value)
33 | }
34 | )
35 |
36 | return this
37 | }
38 |
--------------------------------------------------------------------------------
/dashboard/tests/e2e/custom-commands/openHomepage.js:
--------------------------------------------------------------------------------
1 | /**
2 | * A basic Nightwatch custom command
3 | * which demonstrates usage of ES6 async/await instead of using callbacks.
4 | * The command name is the filename and the exported "command" function is the command.
5 | *
6 | * Example usage:
7 | * browser.openHomepage();
8 | *
9 | * For more information on writing custom commands see:
10 | * https://nightwatchjs.org/guide/extending-nightwatch/#writing-custom-commands
11 | *
12 | */
13 | module.exports = {
14 | command: async function () {
15 | // Other Nightwatch commands are available via "this"
16 | // .init() simply calls .url() command with the value of the "launch_url" setting
17 | this.init()
18 | this.waitForElementVisible('#app')
19 |
20 | const result = await this.elements('css selector', '#app ul')
21 | this.assert.strictEqual(result.value.length, 3)
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/dashboard/tests/e2e/custom-commands/openHomepageClass.js:
--------------------------------------------------------------------------------
1 | /**
2 | * A class-based Nightwatch custom command which is a variation of the openHomepage.js command.
3 | * The command name is the filename and class needs to contain a "command" method.
4 | *
5 | * Example usage:
6 | * browser.openHomepageClass();
7 | *
8 | * For more information on writing custom commands see:
9 | * https://nightwatchjs.org/guide/extending-nightwatch/#writing-custom-commands
10 | *
11 | */
12 |
13 | const assert = require('assert')
14 |
15 | module.exports = class {
16 | async command () {
17 | // Other Nightwatch commands are available via "this.api"
18 | this.api.init()
19 | this.api.waitForElementVisible('#app')
20 |
21 | const result = await this.api.elements('css selector', '#app ul')
22 | assert.strictEqual(result.value.length, 3)
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/dashboard/tests/e2e/page-objects/homepage.js:
--------------------------------------------------------------------------------
1 | /**
2 | * A Nightwatch page object. The page object name is the filename.
3 | *
4 | * Example usage:
5 | * browser.page.homepage.navigate()
6 | *
7 | * For more information on working with page objects see:
8 | * https://nightwatchjs.org/guide/working-with-page-objects/
9 | *
10 | */
11 |
12 | module.exports = {
13 | url: '/',
14 | commands: [],
15 |
16 | // A page object can have elements
17 | elements: {
18 | appContainer: '#app'
19 | },
20 |
21 | // Or a page objects can also have sections
22 | sections: {
23 | app: {
24 | selector: '#app',
25 |
26 | elements: {
27 | logo: 'img'
28 | },
29 |
30 | // - a page object section can also have sub-sections
31 | // - elements or sub-sections located here are retrieved using the "app" section as the base
32 | sections: {
33 | headline: {
34 | selector: 'h1'
35 | },
36 |
37 | welcome: {
38 | // the equivalent css selector for the "welcome" sub-section would be:
39 | // '#app div.hello'
40 | selector: 'div.hello',
41 |
42 | elements: {
43 | cliPluginLinks: {
44 | selector: 'ul',
45 | index: 0
46 | }
47 | }
48 | }
49 | }
50 | }
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/dashboard/tests/e2e/specs/test-with-pageobjects.js:
--------------------------------------------------------------------------------
1 | ////////////////////////////////////////////////////////////////
2 | // For authoring Nightwatch tests, see
3 | // https://nightwatchjs.org/guide
4 | //
5 | // For more information on working with page objects see:
6 | // https://nightwatchjs.org/guide/working-with-page-objects/
7 | ////////////////////////////////////////////////////////////////
8 |
9 | module.exports = {
10 | beforeEach: (browser) => browser.init(),
11 |
12 | 'e2e tests using page objects': (browser) => {
13 | const homepage = browser.page.homepage()
14 | homepage.waitForElementVisible('@appContainer')
15 |
16 | const app = homepage.section.app
17 | app.assert.elementCount('@logo', 1)
18 | app.expect.section('@welcome').to.be.visible
19 | app.expect.section('@headline').text.to.match(/^Welcome to Your Vue\.js (.*)App$/)
20 |
21 | browser.end()
22 | },
23 |
24 | 'verify if string "e2e-nightwatch" is within the cli plugin links': (browser) => {
25 | const homepage = browser.page.homepage()
26 | const welcomeSection = homepage.section.app.section.welcome
27 |
28 | welcomeSection.expect.element('@cliPluginLinks').text.to.contain('e2e-nightwatch')
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/dashboard/tests/e2e/specs/test.js:
--------------------------------------------------------------------------------
1 | // For authoring Nightwatch tests, see
2 | // https://nightwatchjs.org/guide
3 |
4 | module.exports = {
5 | 'default e2e tests': browser => {
6 | browser
7 | .init()
8 | .waitForElementVisible('#app')
9 | .assert.elementPresent('.hello')
10 | .assert.containsText('h1', 'Welcome to Your Vue.js + TypeScript App')
11 | .assert.elementCount('img', 1)
12 | .end()
13 | },
14 |
15 | 'example e2e test using a custom command': browser => {
16 | browser
17 | .openHomepage()
18 | .assert.elementPresent('.hello')
19 | .end()
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/dashboard/tests/unit/example.spec.ts:
--------------------------------------------------------------------------------
1 | import { expect } from 'chai'
2 | import { shallowMount } from '@vue/test-utils'
3 | import HelloWorld from '@/components/HelloWorld.vue'
4 |
5 | describe('HelloWorld.vue', () => {
6 | it('renders props.msg when passed', () => {
7 | const msg = 'new message'
8 | const wrapper = shallowMount(HelloWorld, {
9 | propsData: { msg }
10 | })
11 | expect(wrapper.text()).to.include(msg)
12 | })
13 | })
14 |
--------------------------------------------------------------------------------
/dashboard/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "esnext",
4 | "module": "esnext",
5 | "strict": true,
6 | "jsx": "preserve",
7 | "importHelpers": true,
8 | "moduleResolution": "node",
9 | "experimentalDecorators": true,
10 | "esModuleInterop": true,
11 | "allowSyntheticDefaultImports": true,
12 | "sourceMap": true,
13 | "baseUrl": ".",
14 | "types": [
15 | "webpack-env",
16 | "mocha",
17 | "chai"
18 | ],
19 | "paths": {
20 | "@/*": [
21 | "src/*"
22 | ]
23 | },
24 | "lib": [
25 | "esnext",
26 | "dom",
27 | "dom.iterable",
28 | "scripthost"
29 | ]
30 | },
31 | "include": [
32 | "src/**/*.ts",
33 | "src/**/*.tsx",
34 | "src/**/*.vue",
35 | "tests/**/*.ts",
36 | "tests/**/*.tsx"
37 | ],
38 | "exclude": [
39 | "node_modules"
40 | ]
41 | }
42 |
--------------------------------------------------------------------------------
/dashboard/vue.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | runtimeCompiler: true
3 | }
--------------------------------------------------------------------------------
/infra/.gitignore:
--------------------------------------------------------------------------------
1 | config.ts
2 | config.*.ts
3 | !config.sample.ts
4 |
5 | config.js
6 | config.*.js
7 | config-*.js
--------------------------------------------------------------------------------
/infra/config-model.ts:
--------------------------------------------------------------------------------
1 |
2 | export interface ConfigModel {
3 | general: {
4 | solutionName: string;
5 | description: string;
6 | };
7 |
8 | administrator: {
9 | name: string;
10 | email: string;
11 | username: string;
12 | phone?: string;
13 | };
14 |
15 | dns?: {
16 | domainName: string;
17 | hostedZoneId?: string,
18 | certificateArn?: string;
19 | }
20 | }
--------------------------------------------------------------------------------
/infra/config.sample.ts:
--------------------------------------------------------------------------------
1 | import { ConfigModel } from './config-model'
2 |
3 | /**
4 | * Configuration file for your deployment. Enter the information in the fields
5 | */
6 | let Config: ConfigModel = {
7 | general: {
8 | solutionName: 'AWSTrackAndTrace',
9 | description: 'Sample project for tracking your moving assets.'
10 | },
11 | administrator: {
12 | username: 'admin',
13 | email: 'john.doe@example.com',
14 | name: 'John Doe'
15 | },
16 | dns: {
17 | certificateArn: 'arn:aws:...',
18 | domainName: 'myfleet.example.com',
19 | hostedZoneId: 'AABBCCDD'
20 | }
21 | }
22 |
23 | export {
24 | Config
25 | }
26 |
--------------------------------------------------------------------------------
/infra/core/.gitignore:
--------------------------------------------------------------------------------
1 | *.js
2 | *.d.ts
3 | node_modules
4 | cdk.out/
--------------------------------------------------------------------------------
/infra/core/.npmignore:
--------------------------------------------------------------------------------
1 | *.ts
2 | !*.d.ts
3 |
--------------------------------------------------------------------------------
/infra/core/README.md:
--------------------------------------------------------------------------------
1 | # Useful commands
2 |
3 | * `npm run build` compile typescript to js
4 | * `npm run watch` watch for changes and compile
5 | * `cdk deploy` deploy this stack to your default AWS account/region
6 | * `cdk diff` compare deployed stack with current state
7 | * `cdk synth` emits the synthesized CloudFormation template
8 |
--------------------------------------------------------------------------------
/infra/core/bin/core.ts:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 | import cdk = require('@aws-cdk/core');
3 | import { CoreStack } from '../lib/core-stack';
4 | import { Config } from '../../config';
5 |
6 | const app = new cdk.App();
7 | new CoreStack(app, Config.general.solutionName, {
8 | data: Config
9 | });
10 |
--------------------------------------------------------------------------------
/infra/core/cdk.json:
--------------------------------------------------------------------------------
1 | {
2 | "app": "node bin/core.js"
3 | }
4 |
--------------------------------------------------------------------------------
/infra/core/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "core",
3 | "version": "0.1.0",
4 | "bin": {
5 | "core": "bin/core.js"
6 | },
7 | "scripts": {
8 | "build": "tsc",
9 | "watch": "tsc -w",
10 | "cdk": "cdk"
11 | },
12 | "devDependencies": {
13 | "@types/node": "^8.9.4",
14 | "typescript": "^3.1.2",
15 | "aws-cdk": "*"
16 | },
17 | "dependencies": {
18 | "@aws-cdk/aws-cognito": "*",
19 | "@aws-cdk/aws-dynamodb": "*",
20 | "@aws-cdk/aws-iam": "*",
21 | "@aws-cdk/core": "*"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/infra/core/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target":"ES2018",
4 | "module": "commonjs",
5 | "lib": ["es2016", "es2017.object", "es2017.string"],
6 | "declaration": true,
7 | "strict": true,
8 | "noImplicitAny": true,
9 | "strictNullChecks": true,
10 | "noImplicitThis": true,
11 | "alwaysStrict": true,
12 | "noUnusedLocals": true,
13 | "noUnusedParameters": true,
14 | "noImplicitReturns": true,
15 | "noFallthroughCasesInSwitch": false,
16 | "inlineSourceMap": true,
17 | "inlineSources": true,
18 | "experimentalDecorators": true,
19 | "strictPropertyInitialization":false
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/infra/dns/.gitignore:
--------------------------------------------------------------------------------
1 | *.js
2 | *.d.ts
3 | node_modules
4 |
--------------------------------------------------------------------------------
/infra/dns/.npmignore:
--------------------------------------------------------------------------------
1 | *.ts
2 | !*.d.ts
3 |
--------------------------------------------------------------------------------
/infra/dns/README.md:
--------------------------------------------------------------------------------
1 | # Useful commands
2 |
3 | * `npm run build` compile typescript to js
4 | * `npm run watch` watch for changes and compile
5 | * `cdk deploy` deploy this stack to your default AWS account/region
6 | * `cdk diff` compare deployed stack with current state
7 | * `cdk synth` emits the synthesized CloudFormation template
8 |
--------------------------------------------------------------------------------
/infra/dns/bin/dns.ts:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 | import { DnsStack } from '../lib/dns-stack';
3 | import { App } from '@aws-cdk/core';
4 | import { Config } from '../../config';
5 |
6 |
7 | const app = new App();
8 | if (Config.dns) {
9 | new DnsStack(app, `${Config.general.solutionName}-DNS`, {
10 | solutionName: Config.general.solutionName,
11 | description: Config.general.description,
12 | domainName: Config.dns.domainName,
13 | hostedZoneId: Config.dns.hostedZoneId,
14 | env: {
15 | region: 'us-east-1'
16 | }
17 | });
18 | } else {
19 | console.error('ERROR: No DNS configuration specified. This is not needed');
20 | process.exit(1);
21 | }
--------------------------------------------------------------------------------
/infra/dns/cdk.json:
--------------------------------------------------------------------------------
1 | {
2 | "app": "node bin/dns.js"
3 | }
4 |
--------------------------------------------------------------------------------
/infra/dns/lib/dns-stack.ts:
--------------------------------------------------------------------------------
1 | import { Stack, App, StackProps, CfnOutput } from '@aws-cdk/core';
2 | import { Certificate } from '@aws-cdk/aws-certificatemanager';
3 | import { HostedZone, IHostedZone } from '@aws-cdk/aws-route53';
4 |
5 | export interface DnsProps extends StackProps {
6 | solutionName: string,
7 | domainName: string,
8 | description: string,
9 | hostedZoneId?: string
10 | }
11 |
12 | export class DnsStack extends Stack {
13 |
14 | /** @returns The created certificate */
15 | public readonly certificate: Certificate;
16 |
17 | /** @returns the hosted zone */
18 | public readonly hostedZone: IHostedZone;
19 |
20 | constructor(scope: App, id: string, props: DnsProps) {
21 | super(scope, id, props);
22 |
23 | if (props.hostedZoneId) {
24 | this.hostedZone = HostedZone.fromHostedZoneId(this, 'HostedZone', props.hostedZoneId);
25 | } else {
26 | this.hostedZone = new HostedZone(this, 'HostedZone', {
27 | comment: props.description,
28 | zoneName: props.domainName
29 | });
30 | }
31 |
32 | this.certificate = new Certificate(this, 'Certificate', {
33 | domainName: `*.${props.domainName}`
34 | });
35 |
36 | new CfnOutput(this, `CertificateArn`, { exportName: `${props.solutionName}-certificate`, value: this.certificate.certificateArn });
37 | new CfnOutput(this, 'HostedZoneId', { exportName: `${props.solutionName}-hosted-zone`, value: this.hostedZone.hostedZoneId });
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/infra/dns/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "dns",
3 | "version": "0.1.0",
4 | "bin": {
5 | "dns": "bin/dns.js"
6 | },
7 | "scripts": {
8 | "build": "tsc",
9 | "watch": "tsc -w",
10 | "cdk": "cdk"
11 | },
12 | "devDependencies": {
13 | "@types/node": "^8.9.4",
14 | "typescript": "^3.1.2",
15 | "aws-cdk": "*"
16 | },
17 | "dependencies": {
18 | "@aws-cdk/aws-certificatemanager": "*",
19 | "@aws-cdk/aws-route53": "*",
20 | "@aws-cdk/core": "*"
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/infra/dns/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target":"ES2018",
4 | "module": "commonjs",
5 | "lib": ["es2016", "es2017.object", "es2017.string"],
6 | "declaration": true,
7 | "strict": true,
8 | "noImplicitAny": true,
9 | "strictNullChecks": true,
10 | "noImplicitThis": true,
11 | "alwaysStrict": true,
12 | "noUnusedLocals": true,
13 | "noUnusedParameters": true,
14 | "noImplicitReturns": true,
15 | "noFallthroughCasesInSwitch": false,
16 | "inlineSourceMap": true,
17 | "inlineSources": true,
18 | "experimentalDecorators": true,
19 | "strictPropertyInitialization":false
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/infra/packages/auth/.gitignore:
--------------------------------------------------------------------------------
1 | *.js
2 | *.d.ts
3 | node_modules
4 |
--------------------------------------------------------------------------------
/infra/packages/auth/.npmignore:
--------------------------------------------------------------------------------
1 | *.ts
2 | !*.d.ts
3 |
--------------------------------------------------------------------------------
/infra/packages/auth/README.md:
--------------------------------------------------------------------------------
1 | # Human authentication module
2 |
3 | The `auth` module provides authentication and authorisation mechanisms for human stakeholders that use the system. It uses Amazon Cognito to enable you to store your own user base within your deployment, and allows you to define RBAC policies for individual users and/or groups.
4 |
5 | ## Module components
6 |
7 | The `auth` module comprehends all resources needed for an authentication system, including default configuration for being instantly ready to use. These are the resources this module includes:
8 |
9 | * **Cognito User Pool:** Stores your users and groups and provides a built-in customizable login experience for web and mobile apps. This user pool is built with a `default` app client, that you can use to leverage authentication capabilities right out of the box. You can add multiple other clients for the different consumers of the module.
10 | * **Cognito Identity Pool:** Enables federated access to AWS resources for users within the User Pool. Configured already for the default User Pool client, this Identity Pool provides AWS credentials for users of the User Pool.
11 | * **Identity Pool default roles:** The IdP is configured with two IAM roles, used by default for both `authenticated` and `unauthenticated` users.
12 |
--------------------------------------------------------------------------------
/infra/packages/auth/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@plp/auth",
3 | "version": "0.1.4",
4 | "main": "lib/index.js",
5 | "types": "lib/index.d.ts",
6 | "scripts": {
7 | "build": "tsc",
8 | "watch": "tsc -w",
9 | "test": "nodeunit test/test.*.js"
10 | },
11 | "devDependencies": {
12 | "@types/nodeunit": "^0.0.30",
13 | "nodeunit": "^0.11.2",
14 | "typescript": "^3.1.2"
15 | },
16 | "dependencies": {
17 | "@aws-cdk/aws-cognito": "*",
18 | "@aws-cdk/aws-iot": "*",
19 | "@aws-cdk/aws-kms": "*",
20 | "@aws-cdk/aws-sqs": "*",
21 | "@aws-cdk/core": "*",
22 | "@types/node": "^10.12.18"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/infra/packages/auth/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target":"ES2018",
4 | "module": "commonjs",
5 | "lib": ["es2016", "es2017.object", "es2017.string"],
6 | "declaration": true,
7 | "strict": true,
8 | "noImplicitAny": true,
9 | "strictNullChecks": true,
10 | "noImplicitThis": true,
11 | "alwaysStrict": true,
12 | "noUnusedLocals": true,
13 | "noUnusedParameters": true,
14 | "noImplicitReturns": true,
15 | "noFallthroughCasesInSwitch": false,
16 | "inlineSourceMap": true,
17 | "inlineSources": true,
18 | "experimentalDecorators": true,
19 | "strictPropertyInitialization":false
20 | }
21 | }
22 |
23 |
--------------------------------------------------------------------------------
/infra/packages/dns/.gitignore:
--------------------------------------------------------------------------------
1 | *.js
2 | *.d.ts
3 | node_modules
4 |
--------------------------------------------------------------------------------
/infra/packages/dns/.npmignore:
--------------------------------------------------------------------------------
1 | *.ts
2 | !*.d.ts
3 |
--------------------------------------------------------------------------------
/infra/packages/dns/README.md:
--------------------------------------------------------------------------------
1 | # Useful commands
2 |
3 | * `npm run build` compile typescript to js
4 | * `npm run watch` watch for changes and compile
5 |
--------------------------------------------------------------------------------
/infra/packages/dns/lib/index.ts:
--------------------------------------------------------------------------------
1 | import { Construct } from '@aws-cdk/core';
2 | import { CloudFrontWebDistribution } from '@aws-cdk/aws-cloudfront';
3 | import { HostedZone, IHostedZone, RecordSet, RecordTarget, RecordType } from '@aws-cdk/aws-route53';
4 | import { CloudFrontTarget } from '@aws-cdk/aws-route53-targets'
5 |
6 | export interface DnsProps {
7 | fqdn: string,
8 | description: string,
9 | hostedZoneId: string,
10 | target: CloudFrontWebDistribution
11 | }
12 |
13 | export class Dns extends Construct {
14 |
15 | /** @returns the Hosted zone */
16 | public readonly hostedZone: IHostedZone;
17 |
18 | /** @returns the main website record set */
19 | public readonly websiteMainRecordSet: RecordSet;
20 |
21 | /** @returns the www record set */
22 | public readonly websiteWwwRecordSet: RecordSet;
23 |
24 | constructor(scope: Construct, id: string, props: DnsProps) {
25 | super(scope, id);
26 |
27 | // Create the hosted zone
28 | this.hostedZone = HostedZone.fromHostedZoneId(this, 'HostedZone', props.hostedZoneId);
29 |
30 | this.websiteMainRecordSet = new RecordSet(this, 'MainRecord', {
31 | recordName: `${props.fqdn}.`,
32 | recordType: RecordType.A,
33 | target: RecordTarget.fromAlias(new CloudFrontTarget(props.target)),
34 | zone: this.hostedZone
35 | });
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/infra/packages/dns/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@plp/dns",
3 | "version": "0.1.0",
4 | "main": "lib/index.js",
5 | "types": "lib/index.d.ts",
6 | "scripts": {
7 | "build": "tsc",
8 | "watch": "tsc -w",
9 | "test": "nodeunit test/test.*.js"
10 | },
11 | "devDependencies": {
12 | "@types/nodeunit": "^0.0.30",
13 | "nodeunit": "^0.11.2",
14 | "typescript": "^3.1.2"
15 | },
16 | "peerDependencies": {
17 | "@aws-cdk/core": "*"
18 | },
19 | "dependencies": {
20 | "@aws-cdk/aws-cloudfront": "*",
21 | "@aws-cdk/aws-route53": "*",
22 | "@aws-cdk/aws-route53-targets": "^1.3.0",
23 | "@aws-cdk/aws-sns": "*",
24 | "@aws-cdk/aws-sqs": "*",
25 | "@aws-cdk/core": "*"
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/infra/packages/dns/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target":"ES2018",
4 | "module": "commonjs",
5 | "lib": ["es2016", "es2017.object", "es2017.string"],
6 | "declaration": true,
7 | "strict": true,
8 | "noImplicitAny": true,
9 | "strictNullChecks": true,
10 | "noImplicitThis": true,
11 | "alwaysStrict": true,
12 | "noUnusedLocals": true,
13 | "noUnusedParameters": true,
14 | "noImplicitReturns": true,
15 | "noFallthroughCasesInSwitch": false,
16 | "inlineSourceMap": true,
17 | "inlineSources": true,
18 | "experimentalDecorators": true,
19 | "strictPropertyInitialization":false
20 | }
21 | }
22 |
23 |
--------------------------------------------------------------------------------
/infra/packages/inventory/.gitignore:
--------------------------------------------------------------------------------
1 | *.js
2 | *.d.ts
3 | node_modules
4 |
--------------------------------------------------------------------------------
/infra/packages/inventory/.npmignore:
--------------------------------------------------------------------------------
1 | *.ts
2 | !*.d.ts
3 |
--------------------------------------------------------------------------------
/infra/packages/inventory/README.md:
--------------------------------------------------------------------------------
1 | # Useful commands
2 |
3 | * `npm run build` compile typescript to js
4 | * `npm run watch` watch for changes and compile
5 |
--------------------------------------------------------------------------------
/infra/packages/inventory/lib/index.ts:
--------------------------------------------------------------------------------
1 | import { RemovalPolicy, Construct } from '@aws-cdk/core';
2 | import { Table, AttributeType } from '@aws-cdk/aws-dynamodb';
3 | import { Bucket } from '@aws-cdk/aws-s3';
4 |
5 | export class Inventory extends Construct {
6 |
7 | /** @returns the Inventory assets DynamoDB table */
8 | public readonly assetsTable: Table;
9 |
10 | /** @returns the Inventory Sensors DynamoDB table */
11 | public readonly sensorsTable: Table;
12 |
13 | /** @returns the Inventory Conditions DynamoDB table */
14 | public readonly conditionsTable: Table;
15 |
16 | /** @returns the assets bucket */
17 | public readonly assetsBucket: Bucket;
18 |
19 | constructor(scope: Construct, id: string) {
20 | super(scope, id);
21 |
22 | this.assetsTable = new Table(this, 'InventoryAssetsTable', {
23 | partitionKey: {
24 | name: 'AssetId',
25 | type: AttributeType.STRING
26 | }
27 | });
28 |
29 | this.sensorsTable = new Table(this, 'InventorySensorsTable', {
30 | partitionKey: {
31 | name: 'AssetId',
32 | type: AttributeType.STRING
33 | },
34 | sortKey: {
35 | name: 'SensorId',
36 | type: AttributeType.STRING
37 | }
38 | });
39 |
40 | this.conditionsTable = new Table(this, 'InventoryConditionsTable', {
41 | partitionKey: {
42 | name: 'AssetId',
43 | type: AttributeType.STRING
44 | },
45 | sortKey: {
46 | name: 'ConditionId',
47 | type: AttributeType.STRING
48 | }
49 | });
50 |
51 | this.assetsBucket = new Bucket(this, 'AssetsBucket', {
52 | removalPolicy: RemovalPolicy.DESTROY
53 | });
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/infra/packages/inventory/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@plp/inventory",
3 | "version": "0.1.0",
4 | "main": "lib/index.js",
5 | "types": "lib/index.d.ts",
6 | "scripts": {
7 | "build": "tsc",
8 | "watch": "tsc -w",
9 | "test": "nodeunit test/test.*.js"
10 | },
11 | "devDependencies": {
12 | "@types/nodeunit": "^0.0.30",
13 | "nodeunit": "^0.11.2",
14 | "typescript": "^3.1.2"
15 | },
16 | "peerDependencies": {
17 | "@aws-cdk/core": "*"
18 | },
19 | "dependencies": {
20 | "@aws-cdk/aws-dynamodb": "*",
21 | "@aws-cdk/aws-iam": "*",
22 | "@aws-cdk/aws-s3": "*",
23 | "@aws-cdk/aws-sns": "*",
24 | "@aws-cdk/aws-sqs": "*",
25 | "@aws-cdk/core": "*"
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/infra/packages/inventory/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target":"ES2018",
4 | "module": "commonjs",
5 | "lib": ["es2016", "es2017.object", "es2017.string"],
6 | "declaration": true,
7 | "strict": true,
8 | "noImplicitAny": true,
9 | "strictNullChecks": true,
10 | "noImplicitThis": true,
11 | "alwaysStrict": true,
12 | "noUnusedLocals": true,
13 | "noUnusedParameters": true,
14 | "noImplicitReturns": true,
15 | "noFallthroughCasesInSwitch": false,
16 | "inlineSourceMap": true,
17 | "inlineSources": true,
18 | "experimentalDecorators": true,
19 | "strictPropertyInitialization":false
20 | }
21 | }
22 |
23 |
--------------------------------------------------------------------------------
/infra/packages/webui/.gitignore:
--------------------------------------------------------------------------------
1 | *.js
2 | *.d.ts
3 | node_modules
4 |
--------------------------------------------------------------------------------
/infra/packages/webui/.npmignore:
--------------------------------------------------------------------------------
1 | *.ts
2 | !*.d.ts
3 |
--------------------------------------------------------------------------------
/infra/packages/webui/README.md:
--------------------------------------------------------------------------------
1 | # Useful commands
2 |
3 | * `npm run build` compile typescript to js
4 | * `npm run watch` watch for changes and compile
5 |
--------------------------------------------------------------------------------
/infra/packages/webui/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@plp/webui",
3 | "version": "0.1.0",
4 | "main": "lib/index.js",
5 | "types": "lib/index.d.ts",
6 | "scripts": {
7 | "build": "tsc",
8 | "watch": "tsc -w",
9 | "test": "nodeunit test/test.*.js"
10 | },
11 | "devDependencies": {
12 | "@types/nodeunit": "^0.0.30",
13 | "nodeunit": "^0.11.2",
14 | "typescript": "^3.1.2"
15 | },
16 | "peerDependencies": {
17 | "@aws-cdk/core": "*"
18 | },
19 | "dependencies": {
20 | "@aws-cdk/aws-cloudfront": "*",
21 | "@aws-cdk/aws-iam": "*",
22 | "@aws-cdk/aws-s3": "*",
23 | "@aws-cdk/aws-sns": "*",
24 | "@aws-cdk/aws-sqs": "*",
25 | "@aws-cdk/core": "*"
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/infra/packages/webui/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target":"ES2018",
4 | "module": "commonjs",
5 | "lib": ["es2016", "es2017.object", "es2017.string"],
6 | "declaration": true,
7 | "strict": true,
8 | "noImplicitAny": true,
9 | "strictNullChecks": true,
10 | "noImplicitThis": true,
11 | "alwaysStrict": true,
12 | "noUnusedLocals": true,
13 | "noUnusedParameters": true,
14 | "noImplicitReturns": true,
15 | "noFallthroughCasesInSwitch": false,
16 | "inlineSourceMap": true,
17 | "inlineSources": true,
18 | "experimentalDecorators": true,
19 | "strictPropertyInitialization":false
20 | }
21 | }
22 |
23 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "aws-track-and-trace",
3 | "version": "1.0.0",
4 | "description": "Sample project for tracking and tracing your moving assets and their status",
5 | "main": "index.js",
6 | "dependencies": {},
7 | "devDependencies": {
8 | "@commitlint/cli": "^7.5.2",
9 | "@commitlint/config-conventional": "^7.5.0",
10 | "husky": "^1.3.1"
11 | },
12 | "scripts": {
13 | "test": "test",
14 | "build:infra": "bash scripts/prepare-infra.sh",
15 | "configure:infra": "bash scripts/configure-infra.sh",
16 | "configure:post-deployment": "bash scripts/post-deployment-tasks.sh",
17 | "configure:ui": "bash scripts/configure-ui.sh",
18 | "deploy:ui": "bash scripts/deploy-ui.sh",
19 | "get:entry": "bash scripts/get-ui-entry-point.sh"
20 | },
21 | "repository": {
22 | "type": "git",
23 | "url": "git+https://github.com/aws-samples/aws-track-and-trace.git"
24 | },
25 | "keywords": [
26 | "track-and-trace",
27 | "track",
28 | "trace",
29 | "aws",
30 | "serverless",
31 | "iot"
32 | ],
33 | "author": "Pelayo Margareto ",
34 | "license": "MIT",
35 | "bugs": {
36 | "url": "https://github.com/aws-samples/aws-track-and-trace/issues"
37 | },
38 | "homepage": "https://github.com/aws-samples/aws-track-and-trace#readme",
39 | "husky": {
40 | "hooks": {
41 | "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
42 | }
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/scripts/.gitignore:
--------------------------------------------------------------------------------
1 | config.sh
2 | config.*.sh
3 | !config.sample.sh
--------------------------------------------------------------------------------
/scripts/config.sample.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
3 | project_dir="${script_dir}/.."
4 |
5 | #################################
6 | # Configurable parameters start #
7 | #################################
8 |
9 | export STACK_NAME="AWSTrackAndTrace"
10 | export AWS_REGION="eu-west-1"
11 | export COGNITO_CUSTOM_DOMAIN="" # Change this with your own
12 | export GOOGLE_MAPS_API_KEY=""
13 |
14 | #################################
15 | # Configurable parameters end #
16 | #################################
17 |
18 | ############################
19 | # Autopopulated parameters #
20 | ############################
21 |
22 |
--------------------------------------------------------------------------------
/scripts/configure-ui.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
3 | project_dir="${script_dir}/.."
4 | dashboard_dir="${project_dir}/dashboard"
5 |
6 | echo "INFO: Configuring UI"
7 |
8 | source ${script_dir}/config.sh
9 | source ${script_dir}/config.infra.sh
10 |
11 | echo "INFO: Creating JSON configuration"
12 | config="{ \
13 | \"AWS_ACCOUNT_ID\": \"${AWS_ACCOUNT_ID}\", \
14 | \"AWS_REGION\": \"${AWS_REGION}\", \
15 | \"USER_POOL_ID\": \"${USER_POOL_ID}\", \
16 | \"USER_POOL_CLIENT_ID\": \"${USER_POOL_CLIENT_ID}\", \
17 | \"IDENTITY_POOL_ID\": \"${IDENTITY_POOL_ID}\", \
18 | \"COGNITO_CUSTOM_DOMAIN\": \"${COGNITO_CUSTOM_DOMAIN}\", \
19 | \"IOT_ENDPOINT\": \"${IOT_ENDPOINT}\", \
20 | \"PEOPLE_POLICY_NAME\": \"${PEOPLE_POLICY_NAME}\", \
21 | \"INVENTORY_ASSETS_TABLE_NAME\": \"${INVENTORY_ASSETS_TABLE_NAME}\", \
22 | \"INVENTORY_CONDITIONS_TABLE_NAME\": \"${INVENTORY_CONDITIONS_TABLE_NAME}\", \
23 | \"INVENTORY_SENSORS_TABLE_NAME\": \"${INVENTORY_SENSORS_TABLE_NAME}\", \
24 | \"INVENTORY_ASSETS_BUCKET_NAME\": \"${INVENTORY_ASSETS_BUCKET_NAME}\", \
25 | \"APP_CLIENT_NAME\": \"${STACK_NAME}\", \
26 | \"GMAPS_API_KEY\": \"${GOOGLE_MAPS_API_KEY}\"
27 | }"
28 |
29 | echo "INFO: Writing JSON configuration"
30 | echo $config > $dashboard_dir/src/assets/config.json
31 |
--------------------------------------------------------------------------------
/scripts/configure-user.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
3 | project_dir="${script_dir}/.."
4 | dashboard_dir="${project_dir}/dashboard"
5 |
6 | echo "INFO: Configuring UI"
7 |
8 | #################################
9 | # Configurable parameters start #
10 | #################################
11 |
12 | export STACK_NAME="AWSTrackAndTrace"
13 | export AWS_REGION="eu-west-1"
14 |
15 | #################################
16 | # Configurable parameters end #
17 | #################################
18 |
19 | echo "INFO: Fetching deployment information."
20 | stack_description=$(aws cloudformation describe-stacks --stack-name ${STACK_NAME})
21 |
22 | iot_policy=$(echo $stack_description | jq -r '.Stacks[0].Outputs[] | select(.OutputKey == "PeopleIotPolicy") | .OutputValue')
23 | identity_id=${1:-none}
24 | if [ "none" = $identity_id ]; then
25 | echo "ERROR: Parameter identity_id is mandatory, and not given."
26 | exit 1
27 | fi
28 |
29 | echo "INFO: Configuring Iot policy for identity ${identity_id}"
30 | aws iot attach-principal-policy --principal ${identity_id} --policy-name ${iot_policy}
31 |
--------------------------------------------------------------------------------
/scripts/dashboard.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
3 | project_dir="${script_dir}/.."
4 |
5 | stack_name="helicopters-dashboard"
6 | tmp_bucket="aws-pelaym-tmp-bucket"
7 |
8 | echo "INFO: Packaging templates"
9 | aws cloudformation package \
10 | --s3-bucket $tmp_bucket \
11 | --template-file $project_dir/infra/dashboard.yaml \
12 | --output-template-file $project_dir/infra/dashboard.pkg.yaml
13 | prev_code=$(echo $?)
14 | if [ "0" != $prev_code ]; then
15 | echo "ERROR: Failed to package template."
16 | exit 1
17 | fi
18 |
19 | echo "INFO: Deploying stack"
20 | aws cloudformation deploy \
21 | --stack-name $stack_name \
22 | --template-file $project_dir/infra/dashboard.pkg.yaml \
23 | --capabilities CAPABILITY_IAM
24 | prev_code=$(echo $?)
25 | if [ "0" != $prev_code ]; then
26 | echo "ERROR: Failed to deploy stack."
27 | exit 1
28 | fi
29 |
30 | echo "INFO: Stack deployed successfully"
--------------------------------------------------------------------------------
/scripts/deploy-ui.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
3 | project_dir="${script_dir}/.."
4 |
5 | source ${script_dir}/configure-infra.sh
6 | website_bucket=${web_ui_bucket_name}
7 |
8 | cd $project_dir/dashboard
9 | npm i
10 | npm run build
11 |
12 | aws s3 cp --acl bucket-owner-full-control ./dist/index.html s3://$website_bucket/index.html
13 | aws s3 cp --acl bucket-owner-full-control --recursive ./dist/static s3://$website_bucket/static
--------------------------------------------------------------------------------
/scripts/get-ui-entry-point.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
3 | project_dir="${script_dir}/.."
4 |
5 | source ${script_dir}/config.sh
6 | source ${script_dir}/config.infra.sh
7 |
8 | echo "INFO: This is your distribution URL: ${WEB_DISTRIBUTION_DOMAIN_NAME}"
9 |
--------------------------------------------------------------------------------
/scripts/prepare-infra.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
3 | project_dir="${script_dir}/.."
4 |
5 | infra_core_folder=${project_dir}/infra/core
6 | packages_folder=${project_dir}/infra/packages/
7 | cdk_packages=("auth dns inventory webui")
8 |
9 | echo "INFO: Preparing your environment"
10 |
11 | echo "INFO: Building modules..."
12 | for i in $cdk_packages; do
13 |
14 | echo "INFO: Preparing package ${i}"
15 | cd $packages_folder/$i
16 |
17 | echo "INFO: Installing dependencies"
18 | npm i
19 | prev_code=$(echo $?)
20 | if [ "0" != $prev_code ]; then
21 | echo "ERROR: Failed to install dependencies for package ${i}."
22 | exit 1
23 | fi
24 |
25 | echo "INFO: Building package"
26 | npm run build
27 | prev_code=$(echo $?)
28 | if [ "0" != $prev_code ]; then
29 | echo "ERROR: Failed to build package ${i}."
30 | exit 1
31 | fi
32 | done
33 |
34 | echo "INFO: Preparing core infrastructure..."
35 | cd $infra_core_folder
36 |
37 | echo "INFO: Installing dependencies"
38 | npm i
39 | prev_code=$(echo $?)
40 | if [ "0" != $prev_code ]; then
41 | echo "ERROR: Failed to install dependencies."
42 | exit 1
43 | fi
44 |
45 | echo "INFO: Building core"
46 | npm run build
47 | prev_code=$(echo $?)
48 | if [ "0" != $prev_code ]; then
49 | echo "ERROR: Failed to build infrastructure."
50 | exit 1
51 | fi
52 |
53 | echo "INFO: Successfully built infrastructure."
54 |
--------------------------------------------------------------------------------
/static/acm-request.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/static/acm-request.png
--------------------------------------------------------------------------------
/static/acm-verify.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/static/acm-verify.png
--------------------------------------------------------------------------------
/static/add-asset-menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/static/add-asset-menu.png
--------------------------------------------------------------------------------
/static/add-asset-sample-attrs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/static/add-asset-sample-attrs.png
--------------------------------------------------------------------------------
/static/add-asset-sample-result.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/static/add-asset-sample-result.png
--------------------------------------------------------------------------------
/static/add-asset-sample.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/static/add-asset-sample.png
--------------------------------------------------------------------------------
/static/arch-dashboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/static/arch-dashboard.png
--------------------------------------------------------------------------------
/static/asset-connectivity-stats-empty.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/static/asset-connectivity-stats-empty.png
--------------------------------------------------------------------------------
/static/asset-connectivity-stats.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/static/asset-connectivity-stats.png
--------------------------------------------------------------------------------
/static/cloudfront-oai.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/static/cloudfront-oai.png
--------------------------------------------------------------------------------
/static/cognito-client-settings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/static/cognito-client-settings.png
--------------------------------------------------------------------------------
/static/cognito-domain-alias-setup.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/static/cognito-domain-alias-setup.png
--------------------------------------------------------------------------------
/static/cognito-domain-setup.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/static/cognito-domain-setup.png
--------------------------------------------------------------------------------
/static/cognito-role-mapping.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/static/cognito-role-mapping.png
--------------------------------------------------------------------------------
/static/customize-asset-overview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/static/customize-asset-overview.png
--------------------------------------------------------------------------------
/static/dashboard-overview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/static/dashboard-overview.png
--------------------------------------------------------------------------------
/static/deployment-flow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/static/deployment-flow.png
--------------------------------------------------------------------------------
/static/landing-page.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/static/landing-page.png
--------------------------------------------------------------------------------
/static/main-architecture-overview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/static/main-architecture-overview.png
--------------------------------------------------------------------------------
/static/map-with-assets.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/awslabs/aws-track-and-trace/4cf0cd0e926fed436636d833671ca4f65c6c437b/static/map-with-assets.png
--------------------------------------------------------------------------------
/tutorials/README.md:
--------------------------------------------------------------------------------
1 | # Tutorials
--------------------------------------------------------------------------------