diff --git a/app/.env b/app/.env new file mode 100644 index 0000000000000000000000000000000000000000..f59016db67e56a27f19d06b57fa3900152193a2e --- /dev/null +++ b/app/.env @@ -0,0 +1 @@ +VUE_APP_VERSION = ENVVERSION \ No newline at end of file diff --git a/app/.env.development b/app/.env.development new file mode 100644 index 0000000000000000000000000000000000000000..11cd668bcee753cd0735e934d0c9ac267a32976e --- /dev/null +++ b/app/.env.development @@ -0,0 +1 @@ +VUE_APP_VERSION = envVersion diff --git a/app/.env.production b/app/.env.production new file mode 100644 index 0000000000000000000000000000000000000000..69a8837feff20308618eca055e6036a6a41faa5b --- /dev/null +++ b/app/.env.production @@ -0,0 +1 @@ +VUE_APP_VERSION = envProductionVersion \ No newline at end of file diff --git a/app/.env.staging b/app/.env.staging new file mode 100644 index 0000000000000000000000000000000000000000..1889196533d60d9f6d82f9247573efb755fefa96 --- /dev/null +++ b/app/.env.staging @@ -0,0 +1,2 @@ +NODE_ENV = production +VUE_APP_VERSION = envStagingVersion \ No newline at end of file diff --git a/app/.eslintignore b/app/.eslintignore new file mode 100644 index 0000000000000000000000000000000000000000..05fcc48fb5720b6d46a74fe78c34b9e81acacb58 --- /dev/null +++ b/app/.eslintignore @@ -0,0 +1,3 @@ +build/*.js +config/*.js +src/*.js \ No newline at end of file diff --git a/app/.eslintrc.js b/app/.eslintrc.js new file mode 100644 index 0000000000000000000000000000000000000000..2380cc7eb18ebe3db7047bfbca2387602bc59e48 --- /dev/null +++ b/app/.eslintrc.js @@ -0,0 +1,21 @@ +module.exports = { + root: true, + env: { + node: true + }, + 'extends': [ + "@vue/standard", + "plugin:vue/vue3-strongly-recommended" + ], + rules: { + "template-curly-spacing" : "off", + "indent": ["error", 2, { + "ignoredNodes": ["TemplateLiteral"] + }], + 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', + }, + parserOptions: { + parser: 'babel-eslint' + } +} \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..99ffd2c8a6cde2b62960f2c67adbae22db4b6aa5 --- /dev/null +++ b/app/.gitignore @@ -0,0 +1,25 @@ +.DS_Store +node_modules +/dist +package-lock.json + +/tests/e2e/reports/ +selenium-debug.log + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw* diff --git a/app/README.md b/app/README.md new file mode 100644 index 0000000000000000000000000000000000000000..22c1025ba8d54dcbc2175e87780c969a89dd1286 --- /dev/null +++ b/app/README.md @@ -0,0 +1,118 @@ +# Node and npm environement: + Updated and tested with latest dependencies using node 18.12.1 and npm 8.19.2 +# Vue Client app +# Vite CLI version 4.2.3 +# FormKit version 0.17.2 +# DaisyUI version 2.51.6 +# TailwindCSS version 3.3.2 +# Kindly do rename yor application in package.json name +# Pre-requisite +- NPM and/or Yarn installed +# Steps +- Install vue cli 3 [VUE CLI 3](https://cli.vuejs.org/guide/installation.html) +```sh + npm install -g @vue/cli + # OR + yarn global add @vue/cli + # Check using + vue --version +``` +- Navigate to project client/app and execute +```sh + npm install +``` +- execute below command it start browser which help for run, build, testing etc +```sh + vue ui +``` +- You can also use cmd for executing +```sh + "serve": "vite", + "build": "vite build", + "lint": "vue-cli-service lint", + "test:unit": "vue-cli-service test:unit", + "test:e2e": "vue-cli-service test:e2e" +``` +- once vue ui started click on import and add your app (it emit error if node_module not installed ) +- go to tasks menu and click on Serve (for running app) +- Other option like build , analyzer, plugin installation etc. +- You can also updating serve execution script in package.json by adding +```sh +Usage: vue-cli-service serve [options] [entry] + +Options: + --open open browser on server start + --copy copy url to clipboard on server start + --mode specify env mode (default: development) + --host specify host (default: 0.0.0.0) + --port specify port (default: 8080) + --https use https (default: false) +``` + VSCode Setting: + Install eslint extension + This is for vue client application formatting you can add your other plugins related to Golang, Python, todo Highlight, theme etc + + { + "editor.fontFamily": "Fira Code, Menlo, Monaco, 'Courier New', monospace", + "editor.fontLigatures": true, + "editor.fontSize": 14, + "workbench.colorTheme": "Visual Studio Dark", + "nativescript.analytics.enabled": false, + "window.zoomLevel": 0, + "vetur.format.defaultFormatter.js": "vscode-typescript", + "vetur.format.defaultFormatter.html": "js-beautify-html", + "javascript.format.insertSpaceBeforeFunctionParenthesis": true, + "eslint.autoFixOnSave": true, + "eslint.validate": [ + { + "language": "vue", + "autoFix": true + }, + { + "language": "html", + "autoFix": true + }, + { + "language": "javascript", + "autoFix": true + } + ], +} + Ctrl + S => shall format your code (multiple save action may require) + +``` + -- edit: .eslintrc.js file update "plugin:vue/recommended" to "plugin:vue/strongly-recommended" + -- edit: .eslintignore file add update src/* to src/*.js + -- run: npm run lint and resolve the issue you are facing refer : https://vuejs.github.io/eslint-plugin-vue/rules/ +``` +# Gulp task for 'en.json' and 'dv.json' creation + +Note: 'dv.json' is created for identifying which labels or places are left/skipped by developers for i18n changes. +Steps To perform:- +1. While doing i18n, developers should do it with following mentioned pattern:- + + i. If i18n is done in curly braces like :- + <button>{{ $t('btn_confirm') }}</button> + Then it should be done with pattern:- + <button>{{ $t('##btn_confirm##@@Confirm@@') }}</button> + + ii. If i18n is done at attribute level in element like :- + <button :label="$t('btn_confirm')"></button> + Then it should be done with pattern:- + <button :label="$t('##btn_confirm##@@Confirm@@')"></button> + + iii. If i18n is done at script level like :- + this.$toast.error(this.$t('invalidUsername'), { + theme: 'bubble', + duration: 6000 + }) + Then it should be done with pattern:- + this.$toast.error(this.$t('##invalidUsername##@@User name is invalid@@'), { + theme: 'bubble', + duration: 6000 + }) + +2. After this just run command 'npm run geni18n' +3. This will create backup of current 'en.json' +4. Create new 'en.json' and 'dv.json' +5. Further the 'en.json' can be used to do i18n in any language at 'https://cs.mkcl.org' \ No newline at end of file diff --git a/app/assets/css/template.scss b/app/assets/css/template.scss new file mode 100644 index 0000000000000000000000000000000000000000..6cac4a5f0a57c40f2b9a0e0e9ebb290571e1c955 --- /dev/null +++ b/app/assets/css/template.scss @@ -0,0 +1,411 @@ + // Variables + $gray-lightest: #85858d; + $blue: #B7CADB; + $yellow: #FAF4B7; + $pink: #F2D1D1; + $green: #C4DFAA; + $indigo: #D9D7F1; + $orange: #F6D7A7; + $red : #FFB3B3; + $gray-lighter: #5e5a49; + + // Reset + *, *::after, *::before { + margin: 0; + padding: 0; + box-sizing: border-box; + } + + // Body + body { + font-family: 'DM Sans', sans-serif; + } + + // Img + img { + display: block; + max-width: 100%; + height: auto; + } + + .wrapper { + display: flex; + flex-direction: column; + height: calc(100vh - 72px); + padding: 2.5rem; + overflow-y: auto; + } + + // Buttons + .btn { + padding: 1rem; + border: 0; + border-radius: 8px; + outline: none; + background-color: transparent; + display: inline-flex; + align-items: center; + color: #212121; + font-weight: 600; + font-size: 1rem; + cursor: pointer; + .isax { + font-size: 1.25rem; + margin-right: 0.5rem; + } + &.btn-submit { + background-color: $green; + .isax { + font-size: 1.25rem; + margin-right: 0.5rem; + } + } + &.btn-show { + background-color: $orange; + } + } + // Home + .box { + .title { + text-align: center; + font-weight: 900; + color: #212121; + } + .desc { + text-align: center; + margin-top: 0.5rem; + font-size: 0.8125rem; + color: $gray-lightest; + font-weight: 500; + margin-bottom: 2.5rem; + } + .bx-card { + margin-bottom: 1.5rem; + .p-card { + height: 350px; + border-radius: 12px; + padding: 3rem; + display: flex; + flex-direction: column; + overflow: hidden; + cursor: pointer; + } + .icon-holder { + margin-left: -0.5rem; + .isax { + font-size: 3rem; + color: #212121; + } + } + &-name { + font-size: 1.5rem; + font-weight: 700; + color: var(--bluegray-900); + margin-top: auto; + transition: transform 0.3s ease; + transform: translateY(66px); + display: flex; + align-items: center; + justify-content: space-between; + .isax { + font-size: 2rem; + transition: transform 0.3s ease; + transform: translateX(350px); + } + } + &-desc { + color: #212121; + font-weight: 500; + line-height: 1.6; + font-size: 0.875rem; + transition: transform 0.3s ease; + transform: translateY(450px); + } + &:hover { + .bx-card-name { + transform: translateY(-16px); + .isax { + transform: translateX(0); + } + } + .bx-card-desc { + transform: translateY(0); + } + } + } + .col-3 { + $colors: $blue, $yellow, $pink, $green,$indigo, $orange; + $repeat: 26; + @for $i from 1 through $repeat { + &:nth-child(#{length($colors)}n + #{$i}) { + .bx-card { + .p-card { + background-color: (nth($colors, random(length($colors)))); + box-shadow: 0 24px 50px rgba(#212121, 0.08); + } + } + } + } + + // &:nth-child(2n+2) { + // .bx-card { + // .p-card { + // background-color: $blue; + // box-shadow: 0 24px 50px rgba($blue, 0.3); + // } + // } + // } + + + // &:nth-child(3n+3) { + // .bx-card { + // .p-card { + // background-color: $yellow; + // box-shadow: 0 24px 50px rgba($yellow, 0.3); + // } + // } + // } + + + // &:nth-child(5n+5) { + // .bx-card { + // .p-card { + // background-color: $green; + // box-shadow: 0 24px 50px rgba($green, 0.3); + // } + // } + // } + + // &:nth-child(7n+7) { + // .bx-card { + // .p-card { + // background-color: $orange; + // box-shadow: 0 24px 50px rgba($orange, 0.3); + // } + // } + // } + + } + } + + // Login + .title.alt { + display: flex; + align-items: center; + .isax { + margin-right: 1rem; + font-size: 2rem; + cursor: pointer; + } + } + .box-login { + margin-top: 2.5rem; + + &.clickable { + cursor: pointer; + } + + .p-card { + padding: 2rem; + box-shadow: 0 24px 50px rgba(#212121, 0.04); + + .icon-holder { + i { + font-size: 2rem; + } + } + + .bx-login-name { + margin-top: 1rem; + font-size: 1.125rem; + font-weight: 700; + } + + + .data { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 2rem; + .btn-wrapper { + margin-top: 0; + } + &.alt { + background-color: #f8f8f8; + padding: 1rem 2rem; + border-radius: 8px; + margin-bottom: 0; + } + } + + .field + .field { + margin-top: 2.5rem; + } + + .form-text { + font-size: 0.8125rem; + margin-top: 0.25rem; + } + .btn-wrapper { + margin-top: 2rem; + .btn + .btn { + margin-left: 1.5rem; + } + } + + .field { + p { + word-wrap: break-word; + } + .p-fileupload { + .p-fileupload-files { + .p-button-icon-only { + .p-button-icon { + &::before { + content: '\e9d9'; + font-family: 'iconsax'; + font-size: 1.5rem; + } + } + } + } + .isax { + font-size: 1.5rem; + } + } + } + } + + .json-wrapper { + .jv-container.jv-light { + font-family: 'DM Sans', sans-serif; + } + .jv-container:hover { + box-shadow: none; + border-color: #eee; + } + } + + } + + // Registration + .reg { + .box-login { + + .field { + .p-inputtext { + width: 100%; + } + } + .field { + .p-password { + width: 100%; + .p-inputtext { + width: 100%; + } + } + } + .btn-wrapper { + text-align: center; + } + } + } + + // Validator + #validator { + .box-login { + .p-card { + .field { + .p-dropdown { + width: 100%; + height: 42px; + margin-top: 0.5rem; + padding: 0.75rem; + font-size: 0.875rem; + } + } + } + + .p-card { + .field { + .p-dropdown { + .p-dropdown-item { + font-size: 0.875rem; + } + } + } + } + + .p-card { + .field { + .invalid-feedback { + color: $red; + font-weight: 700; + margin-top: 0.5rem; + } + } + } + .p-card { + .field { + .p-inputtext { + width: 100%; + margin-top: 0.5rem; + font-size: 0.875rem; + } + } + } + + .p-card { + .field { + .label-checkbox { + margin-left: 0.5rem; + } + } + } + } + } + + // Accordion + .p-accordion-tab { + margin-bottom: 0; + & + .p-accordion-tab { + margin-top: 1rem; + } + } + // Footer + .box-footer { + padding: 0.25rem 1rem; + box-shadow: 0 -8px 16px rgba(#212121, 0.04); + margin-top: auto; + .bxf-container { + display: flex; + align-items: center; + img { + width: 64px; + height: 64px; + margin-right: 1rem; + } + &-info { + font-size: 0.8125rem; + color: var(--gray-500); + p + p { + margin-top: 0.25rem; + } + } + } + } + + // Custom Scrollbar + ::-webkit-scrollbar { + width: 6px; + background-color: transparent; + } + + ::-webkit-scrollbar-track { + border-radius: 16px; + } + + ::-webkit-scrollbar-thumb { + border-radius: 16px; + background: #f8f9fa; + } \ No newline at end of file diff --git a/app/assets/fonts/dm-500.woff2 b/app/assets/fonts/dm-500.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..43eb7ac349847723c628f4fce4d3ad12de88e6a3 Binary files /dev/null and b/app/assets/fonts/dm-500.woff2 differ diff --git a/app/assets/fonts/dm-700.woff2 b/app/assets/fonts/dm-700.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9a7696df2ade09b5a17828b68f3246cc6bb0b4ba Binary files /dev/null and b/app/assets/fonts/dm-700.woff2 differ diff --git a/app/assets/fonts/dm.woff2 b/app/assets/fonts/dm.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b8f0bd8ae02f1838b2a0b0707eee6f1e12b9f385 Binary files /dev/null and b/app/assets/fonts/dm.woff2 differ diff --git a/app/assets/fonts/iconsax/iconsax.woff b/app/assets/fonts/iconsax/iconsax.woff new file mode 100644 index 0000000000000000000000000000000000000000..9e48773ad59685beaaeb75c1ef8c7ba403676243 Binary files /dev/null and b/app/assets/fonts/iconsax/iconsax.woff differ diff --git a/app/assets/fonts/iconsax/style.css b/app/assets/fonts/iconsax/style.css new file mode 100644 index 0000000000000000000000000000000000000000..83d8cc4e835f53df958a797b070c910a4a22bfab --- /dev/null +++ b/app/assets/fonts/iconsax/style.css @@ -0,0 +1,3083 @@ +@font-face { + font-family: 'iconsax'; + src: + url('./iconsax.woff') format('woff'); + font-weight: normal; + font-style: normal; + font-display: block; +} + +.isax { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'iconsax' !important; + speak: never; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.isax-bold-3dcube:before { + content: "\e900"; +} +.isax-bold-3d-cube-scan:before { + content: "\e901"; +} +.isax-bold-3d-rotate:before { + content: "\e902"; +} +.isax-bold-3d-square:before { + content: "\e903"; +} +.isax-bold-3square:before { + content: "\e904"; +} +.isax-bold-24-support:before { + content: "\e905"; +} +.isax-bold-aave-aave:before { + content: "\e906"; +} +.isax-bold-activity:before { + content: "\e907"; +} +.isax-bold-add:before { + content: "\e908"; +} +.isax-bold-add-circle:before { + content: "\e909"; +} +.isax-bold-additem:before { + content: "\e90a"; +} +.isax-bold-add-square:before { + content: "\e90b"; +} +.isax-bold-airdrop:before { + content: "\e90c"; +} +.isax-bold-airplane:before { + content: "\e90d"; +} +.isax-bold-airplane-square:before { + content: "\e90e"; +} +.isax-bold-airpod:before { + content: "\e90f"; +} +.isax-bold-airpods:before { + content: "\e910"; +} +.isax-bold-alarm:before { + content: "\e911"; +} +.isax-bold-align-bottom:before { + content: "\e912"; +} +.isax-bold-align-horizontally:before { + content: "\e913"; +} +.isax-bold-align-left:before { + content: "\e914"; +} +.isax-bold-align-right:before { + content: "\e915"; +} +.isax-bold-align-vertically:before { + content: "\e916"; +} +.isax-bold-android:before { + content: "\e917"; +} +.isax-bold-ankr-ankr:before { + content: "\e918"; +} +.isax-bold-apple:before { + content: "\e919"; +} +.isax-bold-aquarius:before { + content: "\e91a"; +} +.isax-bold-archive:before { + content: "\e91b"; +} +.isax-bold-archive-1:before { + content: "\e91c"; +} +.isax-bold-archive-2:before { + content: "\e91d"; +} +.isax-bold-archive-add:before { + content: "\e91e"; +} +.isax-bold-archive-book:before { + content: "\e91f"; +} +.isax-bold-archive-minus:before { + content: "\e920"; +} +.isax-bold-archive-slash:before { + content: "\e921"; +} +.isax-bold-archive-tick:before { + content: "\e922"; +} +.isax-bold-arrange-circle:before { + content: "\e923"; +} +.isax-bold-arrange-circle-2:before { + content: "\e924"; +} +.isax-bold-arrange-square:before { + content: "\e925"; +} +.isax-bold-arrange-square-2:before { + content: "\e926"; +} +.isax-bold-arrow:before { + content: "\e927"; +} +.isax-bold-arrow-2:before { + content: "\e928"; +} +.isax-bold-arrow-3:before { + content: "\e929"; +} +.isax-bold-arrow-bottom:before { + content: "\e92a"; +} +.isax-bold-arrow-circle-down:before { + content: "\e92b"; +} +.isax-bold-arrow-circle-left:before { + content: "\e92c"; +} +.isax-bold-arrow-circle-right:before { + content: "\e92d"; +} +.isax-bold-arrow-circle-up:before { + content: "\e92e"; +} +.isax-bold-arrow-down:before { + content: "\e92f"; +} +.isax-bold-arrow-down-1:before { + content: "\e930"; +} +.isax-bold-arrow-down-2:before { + content: "\e931"; +} +.isax-bold-arrow-left:before { + content: "\e932"; +} +.isax-bold-arrow-left-1:before { + content: "\e933"; +} +.isax-bold-arrow-left-2:before { + content: "\e934"; +} +.isax-bold-arrow-left-3:before { + content: "\e935"; +} +.isax-bold-arrow-right:before { + content: "\e936"; +} +.isax-bold-arrow-right-1:before { + content: "\e937"; +} +.isax-bold-arrow-right-2:before { + content: "\e938"; +} +.isax-bold-arrow-right-3:before { + content: "\e939"; +} +.isax-bold-arrow-square:before { + content: "\e93a"; +} +.isax-bold-arrow-square-down:before { + content: "\e93b"; +} +.isax-bold-arrow-square-left:before { + content: "\e93c"; +} +.isax-bold-arrow-square-right:before { + content: "\e93d"; +} +.isax-bold-arrow-square-up:before { + content: "\e93e"; +} +.isax-bold-arrow-swap:before { + content: "\e93f"; +} +.isax-bold-arrow-swap-horizontal:before { + content: "\e940"; +} +.isax-bold-arrow-up:before { + content: "\e941"; +} +.isax-bold-arrow-up-1:before { + content: "\e942"; +} +.isax-bold-arrow-up-2:before { + content: "\e943"; +} +.isax-bold-arrow-up-3:before { + content: "\e944"; +} +.isax-bold-attach-circle:before { + content: "\e945"; +} +.isax-bold-attach-square:before { + content: "\e946"; +} +.isax-bold-audio-square:before { + content: "\e947"; +} +.isax-bold-augur-rep:before { + content: "\e948"; +} +.isax-bold-autobrightness:before { + content: "\e949"; +} +.isax-bold-autonio-niox:before { + content: "\e94a"; +} +.isax-bold-avalanche-avax:before { + content: "\e94b"; +} +.isax-bold-award:before { + content: "\e94c"; +} +.isax-bold-back-square:before { + content: "\e94d"; +} +.isax-bold-backward:before { + content: "\e94e"; +} +.isax-bold-backward-5-seconds:before { + content: "\e94f"; +} +.isax-bold-backward-10-seconds:before { + content: "\e950"; +} +.isax-bold-backward-15-seconds:before { + content: "\e951"; +} +.isax-bold-backward-item:before { + content: "\e952"; +} +.isax-bold-bag:before { + content: "\e953"; +} +.isax-bold-bag-2:before { + content: "\e954"; +} +.isax-bold-bag-cross:before { + content: "\e955"; +} +.isax-bold-bag-cross-1:before { + content: "\e956"; +} +.isax-bold-bag-happy:before { + content: "\e957"; +} +.isax-bold-bag-tick:before { + content: "\e958"; +} +.isax-bold-bag-tick-2:before { + content: "\e959"; +} +.isax-bold-bag-timer:before { + content: "\e95a"; +} +.isax-bold-bank:before { + content: "\e95b"; +} +.isax-bold-barcode:before { + content: "\e95c"; +} +.isax-bold-battery-3full:before { + content: "\e95d"; +} +.isax-bold-battery-charging:before { + content: "\e95e"; +} +.isax-bold-battery-disable:before { + content: "\e95f"; +} +.isax-bold-battery-empty:before { + content: "\e960"; +} +.isax-bold-battery-empty-1:before { + content: "\e961"; +} +.isax-bold-battery-full:before { + content: "\e962"; +} +.isax-bold-be:before { + content: "\e963"; +} +.isax-bold-bezier:before { + content: "\e964"; +} +.isax-bold-bill:before { + content: "\e965"; +} +.isax-bold-binance-coin-bnb:before { + content: "\e966"; +} +.isax-bold-binance-usd-busd:before { + content: "\e967"; +} +.isax-bold-bitcoin-btc:before { + content: "\e968"; +} +.isax-bold-bitcoin-card:before { + content: "\e969"; +} +.isax-bold-bitcoin-convert:before { + content: "\e96a"; +} +.isax-bold-bitcoin-refresh:before { + content: "\e96b"; +} +.isax-bold-blend:before { + content: "\e96c"; +} +.isax-bold-blend-2:before { + content: "\e96d"; +} +.isax-bold-blogger:before { + content: "\e96e"; +} +.isax-bold-bluetooth:before { + content: "\e96f"; +} +.isax-bold-bluetooth-2:before { + content: "\e970"; +} +.isax-bold-bluetooth-circle:before { + content: "\e971"; +} +.isax-bold-bluetooth-rectangle:before { + content: "\e972"; +} +.isax-bold-blur:before { + content: "\e973"; +} +.isax-bold-book:before { + content: "\e974"; +} +.isax-bold-book-1:before { + content: "\e975"; +} +.isax-bold-bookmark:before { + content: "\e976"; +} +.isax-bold-bookmark-2:before { + content: "\e977"; +} +.isax-bold-book-saved:before { + content: "\e978"; +} +.isax-bold-book-square:before { + content: "\e979"; +} +.isax-bold-bootsrap:before { + content: "\e97a"; +} +.isax-bold-box:before { + content: "\e97b"; +} +.isax-bold-box-1:before { + content: "\e97c"; +} +.isax-bold-box-2:before { + content: "\e97d"; +} +.isax-bold-box-add:before { + content: "\e97e"; +} +.isax-bold-box-remove:before { + content: "\e97f"; +} +.isax-bold-box-search:before { + content: "\e980"; +} +.isax-bold-box-tick:before { + content: "\e981"; +} +.isax-bold-box-time:before { + content: "\e982"; +} +.isax-bold-briefcase:before { + content: "\e983"; +} +.isax-bold-brifecase-cross:before { + content: "\e984"; +} +.isax-bold-brifecase-tick:before { + content: "\e985"; +} +.isax-bold-brifecase-timer:before { + content: "\e986"; +} +.isax-bold-broom:before { + content: "\e987"; +} +.isax-bold-brush:before { + content: "\e988"; +} +.isax-bold-brush-1:before { + content: "\e989"; +} +.isax-bold-brush-2:before { + content: "\e98a"; +} +.isax-bold-brush-3:before { + content: "\e98b"; +} +.isax-bold-brush-4:before { + content: "\e98c"; +} +.isax-bold-bubble:before { + content: "\e98d"; +} +.isax-bold-bucket:before { + content: "\e98e"; +} +.isax-bold-bucket-circle:before { + content: "\e98f"; +} +.isax-bold-bucket-square:before { + content: "\e990"; +} +.isax-bold-building:before { + content: "\e991"; +} +.isax-bold-building-3:before { + content: "\e992"; +} +.isax-bold-building-4:before { + content: "\e993"; +} +.isax-bold-buildings:before { + content: "\e994"; +} +.isax-bold-buildings-2:before { + content: "\e995"; +} +.isax-bold-buliding:before { + content: "\e996"; +} +.isax-bold-bus:before { + content: "\e997"; +} +.isax-bold-buy-crypto:before { + content: "\e998"; +} +.isax-bold-cake:before { + content: "\e999"; +} +.isax-bold-calculator:before { + content: "\e99a"; +} +.isax-bold-calendar:before { + content: "\e99b"; +} +.isax-bold-calendar-1:before { + content: "\e99c"; +} +.isax-bold-calendar-2:before { + content: "\e99d"; +} +.isax-bold-calendar-add:before { + content: "\e99e"; +} +.isax-bold-calendar-circle:before { + content: "\e99f"; +} +.isax-bold-calendar-edit:before { + content: "\e9a0"; +} +.isax-bold-calendar-remove:before { + content: "\e9a1"; +} +.isax-bold-calendar-search:before { + content: "\e9a2"; +} +.isax-bold-calendar-tick:before { + content: "\e9a3"; +} +.isax-bold-call:before { + content: "\e9a4"; +} +.isax-bold-call-add:before { + content: "\e9a5"; +} +.isax-bold-call-calling:before { + content: "\e9a6"; +} +.isax-bold-call-incoming:before { + content: "\e9a7"; +} +.isax-bold-call-minus:before { + content: "\e9a8"; +} +.isax-bold-call-outgoing:before { + content: "\e9a9"; +} +.isax-bold-call-received:before { + content: "\e9aa"; +} +.isax-bold-call-remove:before { + content: "\e9ab"; +} +.isax-bold-call-slash:before { + content: "\e9ac"; +} +.isax-bold-camera:before { + content: "\e9ad"; +} +.isax-bold-camera-slash:before { + content: "\e9ae"; +} +.isax-bold-candle:before { + content: "\e9af"; +} +.isax-bold-candle-2:before { + content: "\e9b0"; +} +.isax-bold-car:before { + content: "\e9b1"; +} +.isax-bold-card:before { + content: "\e9b2"; +} +.isax-bold-card-add:before { + content: "\e9b3"; +} +.isax-bold-cardano-ada:before { + content: "\e9b4"; +} +.isax-bold-card-coin:before { + content: "\e9b5"; +} +.isax-bold-card-edit:before { + content: "\e9b6"; +} +.isax-bold-card-pos:before { + content: "\e9b7"; +} +.isax-bold-card-receive:before { + content: "\e9b8"; +} +.isax-bold-card-remove:before { + content: "\e9b9"; +} +.isax-bold-card-remove-1:before { + content: "\e9ba"; +} +.isax-bold-cards:before { + content: "\e9bb"; +} +.isax-bold-card-send:before { + content: "\e9bc"; +} +.isax-bold-card-slash:before { + content: "\e9bd"; +} +.isax-bold-card-tick:before { + content: "\e9be"; +} +.isax-bold-card-tick-1:before { + content: "\e9bf"; +} +.isax-bold-category:before { + content: "\e9c0"; +} +.isax-bold-category-2:before { + content: "\e9c1"; +} +.isax-bold-cd:before { + content: "\e9c2"; +} +.isax-bold-celo-celo:before { + content: "\e9c3"; +} +.isax-bold-celsius-cel:before { + content: "\e9c4"; +} +.isax-bold-chainlink-link:before { + content: "\e9c5"; +} +.isax-bold-chart:before { + content: "\e9c6"; +} +.isax-bold-chart-1:before { + content: "\e9c7"; +} +.isax-bold-chart-2:before { + content: "\e9c8"; +} +.isax-bold-chart-3:before { + content: "\e9c9"; +} +.isax-bold-chart-21:before { + content: "\e9ca"; +} +.isax-bold-chart-fail:before { + content: "\e9cb"; +} +.isax-bold-chart-square:before { + content: "\e9cc"; +} +.isax-bold-chart-success:before { + content: "\e9cd"; +} +.isax-bold-check:before { + content: "\e9ce"; +} +.isax-bold-chrome:before { + content: "\e9cf"; +} +.isax-bold-civic-cvc:before { + content: "\e9d0"; +} +.isax-bold-clipboard:before { + content: "\e9d1"; +} +.isax-bold-clipboard-close:before { + content: "\e9d2"; +} +.isax-bold-clipboard-export:before { + content: "\e9d3"; +} +.isax-bold-clipboard-import:before { + content: "\e9d4"; +} +.isax-bold-clipboard-text:before { + content: "\e9d5"; +} +.isax-bold-clipboard-tick:before { + content: "\e9d6"; +} +.isax-bold-clock:before { + content: "\e9d7"; +} +.isax-bold-clock-1:before { + content: "\e9d8"; +} +.isax-bold-close-circle:before { + content: "\e9d9"; +} +.isax-bold-close-square:before { + content: "\e9da"; +} +.isax-bold-cloud:before { + content: "\e9db"; +} +.isax-bold-cloud-add:before { + content: "\e9dc"; +} +.isax-bold-cloud-change:before { + content: "\e9dd"; +} +.isax-bold-cloud-connection:before { + content: "\e9de"; +} +.isax-bold-cloud-cross:before { + content: "\e9df"; +} +.isax-bold-cloud-drizzle:before { + content: "\e9e0"; +} +.isax-bold-cloud-fog:before { + content: "\e9e1"; +} +.isax-bold-cloud-lightning:before { + content: "\e9e2"; +} +.isax-bold-cloud-minus:before { + content: "\e9e3"; +} +.isax-bold-cloud-notif:before { + content: "\e9e4"; +} +.isax-bold-cloud-plus:before { + content: "\e9e5"; +} +.isax-bold-cloud-remove:before { + content: "\e9e6"; +} +.isax-bold-cloud-snow:before { + content: "\e9e7"; +} +.isax-bold-cloud-sunny:before { + content: "\e9e8"; +} +.isax-bold-code:before { + content: "\e9e9"; +} +.isax-bold-code-1:before { + content: "\e9ea"; +} +.isax-bold-code-circle:before { + content: "\e9eb"; +} +.isax-bold-coffee:before { + content: "\e9ec"; +} +.isax-bold-coin:before { + content: "\e9ed"; +} +.isax-bold-coin-1:before { + content: "\e9ee"; +} +.isax-bold-colorfilter:before { + content: "\e9ef"; +} +.isax-bold-colors-square:before { + content: "\e9f0"; +} +.isax-bold-color-swatch:before { + content: "\e9f1"; +} +.isax-bold-command:before { + content: "\e9f2"; +} +.isax-bold-command-square:before { + content: "\e9f3"; +} +.isax-bold-component:before { + content: "\e9f4"; +} +.isax-bold-computing:before { + content: "\e9f5"; +} +.isax-bold-convert:before { + content: "\e9f6"; +} +.isax-bold-convert-3d-cube:before { + content: "\e9f7"; +} +.isax-bold-convert-card:before { + content: "\e9f8"; +} +.isax-bold-convertshape:before { + content: "\e9f9"; +} +.isax-bold-convertshape-2:before { + content: "\e9fa"; +} +.isax-bold-copy:before { + content: "\e9fb"; +} +.isax-bold-copyright:before { + content: "\e9fc"; +} +.isax-bold-copy-success:before { + content: "\e9fd"; +} +.isax-bold-courthouse:before { + content: "\e9fe"; +} +.isax-bold-cpu:before { + content: "\e9ff"; +} +.isax-bold-cpu-charge:before { + content: "\ea00"; +} +.isax-bold-cpu-setting:before { + content: "\ea01"; +} +.isax-bold-creative-commons:before { + content: "\ea02"; +} +.isax-bold-crop:before { + content: "\ea03"; +} +.isax-bold-crown:before { + content: "\ea04"; +} +.isax-bold-crown-1:before { + content: "\ea05"; +} +.isax-bold-cup:before { + content: "\ea06"; +} +.isax-bold-dai-dai:before { + content: "\ea07"; +} +.isax-bold-danger:before { + content: "\ea08"; +} +.isax-bold-dash-dash:before { + content: "\ea09"; +} +.isax-bold-data:before { + content: "\ea0a"; +} +.isax-bold-data-2 .path1:before { + content: "\ea0b"; + color: rgb(41, 45, 50); +} +.isax-bold-data-2 .path2:before { + content: "\ea0c"; + margin-left: -1em; + color: rgb(41, 45, 50); +} +.isax-bold-data-2 .path3:before { + content: "\ea0d"; + margin-left: -1em; + color: rgb(41, 45, 50); +} +.isax-bold-data-2 .path4:before { + content: "\ea0e"; + margin-left: -1em; + color: rgb(41, 45, 50); + opacity: 0.96; +} +.isax-bold-data-2 .path5:before { + content: "\ea0f"; + margin-left: -1em; + color: rgb(41, 45, 50); +} +.isax-bold-decred-dcr:before { + content: "\ea10"; +} +.isax-bold-dent-dent:before { + content: "\ea11"; +} +.isax-bold-designtools:before { + content: "\ea12"; +} +.isax-bold-device-message:before { + content: "\ea13"; +} +.isax-bold-devices:before { + content: "\ea14"; +} +.isax-bold-devices-1:before { + content: "\ea15"; +} +.isax-bold-diagram:before { + content: "\ea16"; +} +.isax-bold-diamonds:before { + content: "\ea17"; +} +.isax-bold-direct:before { + content: "\ea18"; +} +.isax-bold-directbox-default:before { + content: "\ea19"; +} +.isax-bold-directbox-notif:before { + content: "\ea1a"; +} +.isax-bold-directbox-receive:before { + content: "\ea1b"; +} +.isax-bold-directbox-send:before { + content: "\ea1c"; +} +.isax-bold-direct-down:before { + content: "\ea1d"; +} +.isax-bold-direct-inbox:before { + content: "\ea1e"; +} +.isax-bold-direct-left:before { + content: "\ea1f"; +} +.isax-bold-direct-normal:before { + content: "\ea20"; +} +.isax-bold-direct-notification:before { + content: "\ea21"; +} +.isax-bold-direct-right:before { + content: "\ea22"; +} +.isax-bold-direct-send:before { + content: "\ea23"; +} +.isax-bold-direct-up:before { + content: "\ea24"; +} +.isax-bold-discount-circle:before { + content: "\ea25"; +} +.isax-bold-discount-shape:before { + content: "\ea26"; +} +.isax-bold-discover:before { + content: "\ea27"; +} +.isax-bold-discover-1:before { + content: "\ea28"; +} +.isax-bold-dislike:before { + content: "\ea29"; +} +.isax-bold-document:before { + content: "\ea2a"; +} +.isax-bold-document-1:before { + content: "\ea2b"; +} +.isax-bold-document-cloud:before { + content: "\ea2c"; +} +.isax-bold-document-code:before { + content: "\ea2d"; +} +.isax-bold-document-code-2:before { + content: "\ea2e"; +} +.isax-bold-document-copy:before { + content: "\ea2f"; +} +.isax-bold-document-download:before { + content: "\ea30"; +} +.isax-bold-document-favorite:before { + content: "\ea31"; +} +.isax-bold-document-filter:before { + content: "\ea32"; +} +.isax-bold-document-forward:before { + content: "\ea33"; +} +.isax-bold-document-like:before { + content: "\ea34"; +} +.isax-bold-document-normal:before { + content: "\ea35"; +} +.isax-bold-document-previous:before { + content: "\ea36"; +} +.isax-bold-document-sketch:before { + content: "\ea37"; +} +.isax-bold-document-text:before { + content: "\ea38"; +} +.isax-bold-document-text-1:before { + content: "\ea39"; +} +.isax-bold-document-upload:before { + content: "\ea3a"; +} +.isax-bold-dollar-circle:before { + content: "\ea3b"; +} +.isax-bold-dollar-square:before { + content: "\ea3c"; +} +.isax-bold-dribbble:before { + content: "\ea3d"; +} +.isax-bold-driver:before { + content: "\ea3e"; +} +.isax-bold-driver-2:before { + content: "\ea3f"; +} +.isax-bold-driver-refresh:before { + content: "\ea40"; +} +.isax-bold-driving:before { + content: "\ea41"; +} +.isax-bold-drop:before { + content: "\ea42"; +} +.isax-bold-dropbox:before { + content: "\ea43"; +} +.isax-bold-edit:before { + content: "\ea44"; +} +.isax-bold-edit-2:before { + content: "\ea45"; +} +.isax-bold-educare-ekt:before { + content: "\ea46"; +} +.isax-bold-electricity:before { + content: "\ea47"; +} +.isax-bold-element-2:before { + content: "\ea48"; +} +.isax-bold-element-3:before { + content: "\ea49"; +} +.isax-bold-element-4:before { + content: "\ea4a"; +} +.isax-bold-element-equal:before { + content: "\ea4b"; +} +.isax-bold-element-plus:before { + content: "\ea4c"; +} +.isax-bold-emercoin-emc:before { + content: "\ea4d"; +} +.isax-bold-emoji-happy:before { + content: "\ea4e"; +} +.isax-bold-emoji-normal:before { + content: "\ea4f"; +} +.isax-bold-emoji-sad:before { + content: "\ea50"; +} +.isax-bold-empty-wallet:before { + content: "\ea51"; +} +.isax-bold-empty-wallet-add:before { + content: "\ea52"; +} +.isax-bold-empty-wallet-change:before { + content: "\ea53"; +} +.isax-bold-empty-wallet-remove:before { + content: "\ea54"; +} +.isax-bold-empty-wallet-tick:before { + content: "\ea55"; +} +.isax-bold-empty-wallet-time:before { + content: "\ea56"; +} +.isax-bold-enjin-coin-enj:before { + content: "\ea57"; +} +.isax-bold-eos-eos:before { + content: "\ea58"; +} +.isax-bold-eraser:before { + content: "\ea59"; +} +.isax-bold-eraser-1:before { + content: "\ea5a"; +} +.isax-bold-ethereum-eth:before { + content: "\ea5b"; +} +.isax-bold-ethereum-classic-etc:before { + content: "\ea5c"; +} +.isax-bold-export:before { + content: "\ea5d"; +} +.isax-bold-export-1:before { + content: "\ea5e"; +} +.isax-bold-export-2:before { + content: "\ea5f"; +} +.isax-bold-export-3:before { + content: "\ea60"; +} +.isax-bold-external-drive:before { + content: "\ea61"; +} +.isax-bold-eye:before { + content: "\ea62"; +} +.isax-bold-eye-slash:before { + content: "\ea63"; +} +.isax-bold-facebook:before { + content: "\ea64"; +} +.isax-bold-fatrows:before { + content: "\ea65"; +} +.isax-bold-favorite-chart:before { + content: "\ea66"; +} +.isax-bold-figma:before { + content: "\ea67"; +} +.isax-bold-figma-1:before { + content: "\ea68"; +} +.isax-bold-filter:before { + content: "\ea69"; +} +.isax-bold-filter-add:before { + content: "\ea6a"; +} +.isax-bold-filter-edit:before { + content: "\ea6b"; +} +.isax-bold-filter-remove:before { + content: "\ea6c"; +} +.isax-bold-filter-search:before { + content: "\ea6d"; +} +.isax-bold-filter-square:before { + content: "\ea6e"; +} +.isax-bold-filter-tick:before { + content: "\ea6f"; +} +.isax-bold-finger-cricle:before { + content: "\ea70"; +} +.isax-bold-finger-scan:before { + content: "\ea71"; +} +.isax-bold-firstline:before { + content: "\ea72"; +} +.isax-bold-flag:before { + content: "\ea73"; +} +.isax-bold-flag-2:before { + content: "\ea74"; +} +.isax-bold-flash:before { + content: "\ea75"; +} +.isax-bold-flash-1:before { + content: "\ea76"; +} +.isax-bold-flash-circle:before { + content: "\ea77"; +} +.isax-bold-flash-circle-1:before { + content: "\ea78"; +} +.isax-bold-flash-slash:before { + content: "\ea79"; +} +.isax-bold-folder:before { + content: "\ea7a"; +} +.isax-bold-folder-2:before { + content: "\ea7b"; +} +.isax-bold-folder-add:before { + content: "\ea7c"; +} +.isax-bold-folder-cloud:before { + content: "\ea7d"; +} +.isax-bold-folder-connection:before { + content: "\ea7e"; +} +.isax-bold-folder-cross:before { + content: "\ea7f"; +} +.isax-bold-folder-favorite:before { + content: "\ea80"; +} +.isax-bold-folder-minus:before { + content: "\ea81"; +} +.isax-bold-folder-open:before { + content: "\ea82"; +} +.isax-bold-forbidden:before { + content: "\ea83"; +} +.isax-bold-forbidden-2:before { + content: "\ea84"; +} +.isax-bold-format-circle:before { + content: "\ea85"; +} +.isax-bold-format-square:before { + content: "\ea86"; +} +.isax-bold-forward:before { + content: "\ea87"; +} +.isax-bold-forward-5-seconds:before { + content: "\ea88"; +} +.isax-bold-forward-10-seconds:before { + content: "\ea89"; +} +.isax-bold-forward-15-seconds:before { + content: "\ea8a"; +} +.isax-bold-forward-item:before { + content: "\ea8b"; +} +.isax-bold-forward-square:before { + content: "\ea8c"; +} +.isax-bold-frame:before { + content: "\ea8d"; +} +.isax-bold-frame-1:before { + content: "\ea8e"; +} +.isax-bold-frame-2:before { + content: "\ea8f"; +} +.isax-bold-frame-3:before { + content: "\ea90"; +} +.isax-bold-frame-4:before { + content: "\ea91"; +} +.isax-bold-framer:before { + content: "\ea92"; +} +.isax-bold-ftx-token-ftt:before { + content: "\ea93"; +} +.isax-bold-gallery:before { + content: "\ea94"; +} +.isax-bold-gallery-add:before { + content: "\ea95"; +} +.isax-bold-gallery-edit:before { + content: "\ea96"; +} +.isax-bold-gallery-export:before { + content: "\ea97"; +} +.isax-bold-gallery-favorite:before { + content: "\ea98"; +} +.isax-bold-gallery-import:before { + content: "\ea99"; +} +.isax-bold-gallery-remove:before { + content: "\ea9a"; +} +.isax-bold-gallery-slash:before { + content: "\ea9b"; +} +.isax-bold-gallery-tick:before { + content: "\ea9c"; +} +.isax-bold-game:before { + content: "\ea9d"; +} +.isax-bold-gameboy:before { + content: "\ea9e"; +} +.isax-bold-gas-station:before { + content: "\ea9f"; +} +.isax-bold-gemini:before { + content: "\eaa0"; +} +.isax-bold-gemini-2:before { + content: "\eaa1"; +} +.isax-bold-ghost:before { + content: "\eaa2"; +} +.isax-bold-gift:before { + content: "\eaa3"; +} +.isax-bold-glass:before { + content: "\eaa4"; +} +.isax-bold-glass-1:before { + content: "\eaa5"; +} +.isax-bold-global:before { + content: "\eaa6"; +} +.isax-bold-global-edit:before { + content: "\eaa7"; +} +.isax-bold-global-refresh:before { + content: "\eaa8"; +} +.isax-bold-global-search:before { + content: "\eaa9"; +} +.isax-bold-google:before { + content: "\eaaa"; +} +.isax-bold-google-1:before { + content: "\eaab"; +} +.isax-bold-google-play:before { + content: "\eaac"; +} +.isax-bold-gps:before { + content: "\eaad"; +} +.isax-bold-gps-slash:before { + content: "\eaae"; +} +.isax-bold-grammerly:before { + content: "\eaaf"; +} +.isax-bold-graph:before { + content: "\eab0"; +} +.isax-bold-grid-1:before { + content: "\eab1"; +} +.isax-bold-grid-2:before { + content: "\eab2"; +} +.isax-bold-grid-3:before { + content: "\eab3"; +} +.isax-bold-grid-4:before { + content: "\eab4"; +} +.isax-bold-grid-5:before { + content: "\eab5"; +} +.isax-bold-grid-6:before { + content: "\eab6"; +} +.isax-bold-grid-7:before { + content: "\eab7"; +} +.isax-bold-grid-8:before { + content: "\eab8"; +} +.isax-bold-grid-9:before { + content: "\eab9"; +} +.isax-bold-grid-edit:before { + content: "\eaba"; +} +.isax-bold-grid-eraser:before { + content: "\eabb"; +} +.isax-bold-grid-lock:before { + content: "\eabc"; +} +.isax-bold-happyemoji:before { + content: "\eabd"; +} +.isax-bold-harmony-one:before { + content: "\eabe"; +} +.isax-bold-hashtag:before { + content: "\eabf"; +} +.isax-bold-hashtag-1:before { + content: "\eac0"; +} +.isax-bold-hashtag-down:before { + content: "\eac1"; +} +.isax-bold-hashtag-up:before { + content: "\eac2"; +} +.isax-bold-headphone:before { + content: "\eac3"; +} +.isax-bold-headphones:before { + content: "\eac4"; +} +.isax-bold-health:before { + content: "\eac5"; +} +.isax-bold-heart:before { + content: "\eac6"; +} +.isax-bold-heart-add:before { + content: "\eac7"; +} +.isax-bold-heart-circle:before { + content: "\eac8"; +} +.isax-bold-heart-edit:before { + content: "\eac9"; +} +.isax-bold-heart-remove:before { + content: "\eaca"; +} +.isax-bold-heart-search:before { + content: "\eacb"; +} +.isax-bold-heart-slash:before { + content: "\eacc"; +} +.isax-bold-heart-tick:before { + content: "\eacd"; +} +.isax-bold-hedera-hashgraph-hbar:before { + content: "\eace"; +} +.isax-bold-hex-hex .path1:before { + content: "\eacf"; + color: rgb(0, 0, 0); + opacity: 0.13; +} +.isax-bold-hex-hex .path2:before { + content: "\ead0"; + margin-left: -1em; + color: rgb(0, 0, 0); +} +.isax-bold-hex-hex .path3:before { + content: "\ead1"; + margin-left: -1em; + color: rgb(0, 0, 0); +} +.isax-bold-hex-hex .path4:before { + content: "\ead2"; + margin-left: -1em; + color: rgb(0, 0, 0); +} +.isax-bold-hierarchy:before { + content: "\ead3"; +} +.isax-bold-hierarchy-2:before { + content: "\ead4"; +} +.isax-bold-hierarchy-3:before { + content: "\ead5"; +} +.isax-bold-hierarchy-square:before { + content: "\ead6"; +} +.isax-bold-hierarchy-square-2:before { + content: "\ead7"; +} +.isax-bold-hierarchy-square-3:before { + content: "\ead8"; +} +.isax-bold-home:before { + content: "\ead9"; +} +.isax-bold-home-1:before { + content: "\eada"; +} +.isax-bold-home-2:before { + content: "\eadb"; +} +.isax-bold-home-hashtag:before { + content: "\eadc"; +} +.isax-bold-home-trend-down:before { + content: "\eadd"; +} +.isax-bold-home-trend-up:before { + content: "\eade"; +} +.isax-bold-home-wifi:before { + content: "\eadf"; +} +.isax-bold-hospital:before { + content: "\eae0"; +} +.isax-bold-house:before { + content: "\eae1"; +} +.isax-bold-house-2:before { + content: "\eae2"; +} +.isax-bold-html-3:before { + content: "\eae3"; +} +.isax-bold-html-5:before { + content: "\eae4"; +} +.isax-bold-huobi-token-ht:before { + content: "\eae5"; +} +.isax-bold-icon-icx:before { + content: "\eae6"; +} +.isax-bold-icon:before { + content: "\eae7"; +} +.isax-bold-icon-1:before { + content: "\eae8"; +} +.isax-bold-illustrator:before { + content: "\eae9"; +} +.isax-bold-image:before { + content: "\eaea"; +} +.isax-bold-import:before { + content: "\eaeb"; +} +.isax-bold-import-1:before { + content: "\eaec"; +} +.isax-bold-import-2:before { + content: "\eaed"; +} +.isax-bold-import-3:before { + content: "\eaee"; +} +.isax-bold-info-circle:before { + content: "\eaef"; +} +.isax-bold-information:before { + content: "\eaf0"; +} +.isax-bold-instagram:before { + content: "\eaf1"; +} +.isax-bold-iost-iost:before { + content: "\eaf2"; +} +.isax-bold-java-script:before { + content: "\eaf3"; +} +.isax-bold-js:before { + content: "\eaf4"; +} +.isax-bold-judge:before { + content: "\eaf5"; +} +.isax-bold-kanban:before { + content: "\eaf6"; +} +.isax-bold-key:before { + content: "\eaf7"; +} +.isax-bold-keyboard:before { + content: "\eaf8"; +} +.isax-bold-keyboard-open:before { + content: "\eaf9"; +} +.isax-bold-key-square:before { + content: "\eafa"; +} +.isax-bold-kyber-network-knc:before { + content: "\eafb"; +} +.isax-bold-lamp:before { + content: "\eafc"; +} +.isax-bold-lamp-1:before { + content: "\eafd"; +} +.isax-bold-lamp-charge:before { + content: "\eafe"; +} +.isax-bold-lamp-on:before { + content: "\eaff"; +} +.isax-bold-lamp-slash:before { + content: "\eb00"; +} +.isax-bold-language-circle:before { + content: "\eb01"; +} +.isax-bold-language-square:before { + content: "\eb02"; +} +.isax-bold-layer:before { + content: "\eb03"; +} +.isax-bold-level:before { + content: "\eb04"; +} +.isax-bold-lifebuoy:before { + content: "\eb05"; +} +.isax-bold-like:before { + content: "\eb06"; +} +.isax-bold-like-1:before { + content: "\eb07"; +} +.isax-bold-like-dislike:before { + content: "\eb08"; +} +.isax-bold-like-shapes:before { + content: "\eb09"; +} +.isax-bold-like-tag:before { + content: "\eb0a"; +} +.isax-bold-link:before { + content: "\eb0b"; +} +.isax-bold-link-1:before { + content: "\eb0c"; +} +.isax-bold-link-2:before { + content: "\eb0d"; +} +.isax-bold-link-21:before { + content: "\eb0e"; +} +.isax-bold-link-circle:before { + content: "\eb0f"; +} +.isax-bold-link-square:before { + content: "\eb10"; +} +.isax-bold-litecoinltc:before { + content: "\eb11"; +} +.isax-bold-location:before { + content: "\eb12"; +} +.isax-bold-location-add:before { + content: "\eb13"; +} +.isax-bold-location-cross:before { + content: "\eb14"; +} +.isax-bold-location-minus:before { + content: "\eb15"; +} +.isax-bold-location-slash:before { + content: "\eb16"; +} +.isax-bold-location-tick:before { + content: "\eb17"; +} +.isax-bold-lock:before { + content: "\eb18"; +} +.isax-bold-lock-1:before { + content: "\eb19"; +} +.isax-bold-lock-circle:before { + content: "\eb1a"; +} +.isax-bold-lock-slash:before { + content: "\eb1b"; +} +.isax-bold-login:before { + content: "\eb1c"; +} +.isax-bold-login-1:before { + content: "\eb1d"; +} +.isax-bold-logout:before { + content: "\eb1e"; +} +.isax-bold-logout-1:before { + content: "\eb1f"; +} +.isax-bold-lovely:before { + content: "\eb20"; +} +.isax-bold-magicpen:before { + content: "\eb21"; +} +.isax-bold-magic-star:before { + content: "\eb22"; +} +.isax-bold-main-component:before { + content: "\eb23"; +} +.isax-bold-maker-mkr:before { + content: "\eb24"; +} +.isax-bold-man:before { + content: "\eb25"; +} +.isax-bold-map:before { + content: "\eb26"; +} +.isax-bold-map-1:before { + content: "\eb27"; +} +.isax-bold-mask:before { + content: "\eb28"; +} +.isax-bold-mask-1:before { + content: "\eb29"; +} +.isax-bold-mask-2:before { + content: "\eb2a"; +} +.isax-bold-math:before { + content: "\eb2b"; +} +.isax-bold-maximize:before { + content: "\eb2c"; +} +.isax-bold-maximize-1:before { + content: "\eb2d"; +} +.isax-bold-maximize-2:before { + content: "\eb2e"; +} +.isax-bold-maximize-3:before { + content: "\eb2f"; +} +.isax-bold-maximize-4:before { + content: "\eb30"; +} +.isax-bold-maximize-21:before { + content: "\eb31"; +} +.isax-bold-maximize-circle:before { + content: "\eb32"; +} +.isax-bold-medal:before { + content: "\eb33"; +} +.isax-bold-medal-star:before { + content: "\eb34"; +} +.isax-bold-menu:before { + content: "\eb35"; +} +.isax-bold-menu-1:before { + content: "\eb36"; +} +.isax-bold-menu-board:before { + content: "\eb37"; +} +.isax-bold-message:before { + content: "\eb38"; +} +.isax-bold-message-2:before { + content: "\eb39"; +} +.isax-bold-message-add:before { + content: "\eb3a"; +} +.isax-bold-message-add-1:before { + content: "\eb3b"; +} +.isax-bold-message-circle:before { + content: "\eb3c"; +} +.isax-bold-message-edit:before { + content: "\eb3d"; +} +.isax-bold-message-favorite:before { + content: "\eb3e"; +} +.isax-bold-message-minus:before { + content: "\eb3f"; +} +.isax-bold-message-notif:before { + content: "\eb40"; +} +.isax-bold-message-programming:before { + content: "\eb41"; +} +.isax-bold-message-question:before { + content: "\eb42"; +} +.isax-bold-message-remove:before { + content: "\eb43"; +} +.isax-bold-messages:before { + content: "\eb44"; +} +.isax-bold-messages-1:before { + content: "\eb45"; +} +.isax-bold-messages-2:before { + content: "\eb46"; +} +.isax-bold-messages-3:before { + content: "\eb47"; +} +.isax-bold-message-search:before { + content: "\eb48"; +} +.isax-bold-message-square:before { + content: "\eb49"; +} +.isax-bold-message-text:before { + content: "\eb4a"; +} +.isax-bold-message-text-1:before { + content: "\eb4b"; +} +.isax-bold-message-tick:before { + content: "\eb4c"; +} +.isax-bold-message-time:before { + content: "\eb4d"; +} +.isax-bold-messenger:before { + content: "\eb4e"; +} +.isax-bold-microphone:before { + content: "\eb4f"; +} +.isax-bold-microphone-2:before { + content: "\eb50"; +} +.isax-bold-microphone-slash:before { + content: "\eb51"; +} +.isax-bold-microphone-slash-1:before { + content: "\eb52"; +} +.isax-bold-microscope:before { + content: "\eb53"; +} +.isax-bold-milk:before { + content: "\eb54"; +} +.isax-bold-mini-music-sqaure .path1:before { + content: "\eb55"; + color: rgb(41, 45, 50); + opacity: 0.4; +} +.isax-bold-mini-music-sqaure .path2:before { + content: "\eb56"; + margin-left: -1em; + color: rgb(41, 45, 50); +} +.isax-bold-mini-music-sqaure .path3:before { + content: "\eb57"; + margin-left: -1em; + color: rgb(41, 45, 50); +} +.isax-bold-minus:before { + content: "\eb58"; +} +.isax-bold-minus-cirlce:before { + content: "\eb59"; +} +.isax-bold-minus-square:before { + content: "\eb5a"; +} +.isax-bold-mirror:before { + content: "\eb5b"; +} +.isax-bold-mirroring-screen:before { + content: "\eb5c"; +} +.isax-bold-mobile:before { + content: "\eb5d"; +} +.isax-bold-mobile-programming:before { + content: "\eb5e"; +} +.isax-bold-monero-xmr:before { + content: "\eb5f"; +} +.isax-bold-money:before { + content: "\eb60"; +} +.isax-bold-money-2:before { + content: "\eb61"; +} +.isax-bold-money-3:before { + content: "\eb62"; +} +.isax-bold-money-4:before { + content: "\eb63"; +} +.isax-bold-money-add:before { + content: "\eb64"; +} +.isax-bold-money-change:before { + content: "\eb65"; +} +.isax-bold-money-forbidden:before { + content: "\eb66"; +} +.isax-bold-money-recive:before { + content: "\eb67"; +} +.isax-bold-money-remove:before { + content: "\eb68"; +} +.isax-bold-moneys:before { + content: "\eb69"; +} +.isax-bold-money-send:before { + content: "\eb6a"; +} +.isax-bold-money-tick:before { + content: "\eb6b"; +} +.isax-bold-money-time:before { + content: "\eb6c"; +} +.isax-bold-monitor:before { + content: "\eb6d"; +} +.isax-bold-monitor-mobbile:before { + content: "\eb6e"; +} +.isax-bold-monitor-recorder:before { + content: "\eb6f"; +} +.isax-bold-moon:before { + content: "\eb70"; +} +.isax-bold-more:before { + content: "\eb71"; +} +.isax-bold-more-2:before { + content: "\eb72"; +} +.isax-bold-more-circle:before { + content: "\eb73"; +} +.isax-bold-more-square:before { + content: "\eb74"; +} +.isax-bold-mouse:before { + content: "\eb75"; +} +.isax-bold-mouse-1:before { + content: "\eb76"; +} +.isax-bold-mouse-circle:before { + content: "\eb77"; +} +.isax-bold-mouse-square:before { + content: "\eb78"; +} +.isax-bold-music:before { + content: "\eb79"; +} +.isax-bold-music-circle:before { + content: "\eb7a"; +} +.isax-bold-music-dashboard:before { + content: "\eb7b"; +} +.isax-bold-music-filter:before { + content: "\eb7c"; +} +.isax-bold-music-library-2:before { + content: "\eb7d"; +} +.isax-bold-musicnote:before { + content: "\eb7e"; +} +.isax-bold-music-play:before { + content: "\eb7f"; +} +.isax-bold-music-playlist:before { + content: "\eb80"; +} +.isax-bold-music-square:before { + content: "\eb81"; +} +.isax-bold-music-square-add:before { + content: "\eb82"; +} +.isax-bold-music-square-remove:before { + content: "\eb83"; +} +.isax-bold-music-square-search:before { + content: "\eb84"; +} +.isax-bold-nebulas-nas:before { + content: "\eb85"; +} +.isax-bold-nem-xem:before { + content: "\eb86"; +} +.isax-bold-nexo-nexo:before { + content: "\eb87"; +} +.isax-bold-next:before { + content: "\eb88"; +} +.isax-bold-note:before { + content: "\eb89"; +} +.isax-bold-note-1:before { + content: "\eb8a"; +} +.isax-bold-note-2:before { + content: "\eb8b"; +} +.isax-bold-note-21:before { + content: "\eb8c"; +} +.isax-bold-note-add:before { + content: "\eb8d"; +} +.isax-bold-note-favorite:before { + content: "\eb8e"; +} +.isax-bold-note-remove:before { + content: "\eb8f"; +} +.isax-bold-note-square:before { + content: "\eb90"; +} +.isax-bold-note-text:before { + content: "\eb91"; +} +.isax-bold-notification:before { + content: "\eb92"; +} +.isax-bold-notification-1:before { + content: "\eb93"; +} +.isax-bold-notification-bing:before { + content: "\eb94"; +} +.isax-bold-notification-favorite:before { + content: "\eb95"; +} +.isax-bold-notification-status:before { + content: "\eb96"; +} +.isax-bold-ocean-protocol-ocean:before { + content: "\eb97"; +} +.isax-bold-okb-okb:before { + content: "\eb98"; +} +.isax-bold-omega-circle:before { + content: "\eb99"; +} +.isax-bold-omega-square:before { + content: "\eb9a"; +} +.isax-bold-ontology-ont:before { + content: "\eb9b"; +} +.isax-bold-paintbucket:before { + content: "\eb9c"; +} +.isax-bold-paperclip:before { + content: "\eb9d"; +} +.isax-bold-paperclip-2:before { + content: "\eb9e"; +} +.isax-bold-password-check:before { + content: "\eb9f"; +} +.isax-bold-path:before { + content: "\eba0"; +} +.isax-bold-path-2:before { + content: "\eba1"; +} +.isax-bold-path-square:before { + content: "\eba2"; +} +.isax-bold-pause:before { + content: "\eba3"; +} +.isax-bold-pause-circle:before { + content: "\eba4"; +} +.isax-bold-paypal:before { + content: "\eba5"; +} +.isax-bold-pen-add:before { + content: "\eba6"; +} +.isax-bold-pen-close:before { + content: "\eba7"; +} +.isax-bold-pen-remove:before { + content: "\eba8"; +} +.isax-bold-pen-tool:before { + content: "\eba9"; +} +.isax-bold-pen-tool-2:before { + content: "\ebaa"; +} +.isax-bold-people:before { + content: "\ebab"; +} +.isax-bold-percentage-circle:before { + content: "\ebac"; +} +.isax-bold-percentage-square:before { + content: "\ebad"; +} +.isax-bold-personalcard:before { + content: "\ebae"; +} +.isax-bold-pet:before { + content: "\ebaf"; +} +.isax-bold-pharagraphspacing:before { + content: "\ebb0"; +} +.isax-bold-photoshop:before { + content: "\ebb1"; +} +.isax-bold-picture-frame:before { + content: "\ebb2"; +} +.isax-bold-play:before { + content: "\ebb3"; +} +.isax-bold-play-add:before { + content: "\ebb4"; +} +.isax-bold-play-circle:before { + content: "\ebb5"; +} +.isax-bold-play-cricle:before { + content: "\ebb6"; +} +.isax-bold-play-remove:before { + content: "\ebb7"; +} +.isax-bold-polkadot-dot:before { + content: "\ebb8"; +} +.isax-bold-polygon-matic:before { + content: "\ebb9"; +} +.isax-bold-polyswarm-nct:before { + content: "\ebba"; +} +.isax-bold-presention-chart:before { + content: "\ebbb"; +} +.isax-bold-previous:before { + content: "\ebbc"; +} +.isax-bold-printer:before { + content: "\ebbd"; +} +.isax-bold-printer-slash:before { + content: "\ebbe"; +} +.isax-bold-profile-2user:before { + content: "\ebbf"; +} +.isax-bold-profile-add:before { + content: "\ebc0"; +} +.isax-bold-profile-circle:before { + content: "\ebc1"; +} +.isax-bold-profile-delete:before { + content: "\ebc2"; +} +.isax-bold-profile-remove:before { + content: "\ebc3"; +} +.isax-bold-profile-tick:before { + content: "\ebc4"; +} +.isax-bold-programming-arrow:before { + content: "\ebc5"; +} +.isax-bold-programming-arrows:before { + content: "\ebc6"; +} +.isax-bold-python:before { + content: "\ebc7"; +} +.isax-bold-quant-qnt:before { + content: "\ebc8"; +} +.isax-bold-quote-down:before { + content: "\ebc9"; +} +.isax-bold-quote-down-circle:before { + content: "\ebca"; +} +.isax-bold-quote-down-square:before { + content: "\ebcb"; +} +.isax-bold-quote-up:before { + content: "\ebcc"; +} +.isax-bold-quote-up-circle:before { + content: "\ebcd"; +} +.isax-bold-quote-up-square:before { + content: "\ebce"; +} +.isax-bold-radar:before { + content: "\ebcf"; +} +.isax-bold-radar-1:before { + content: "\ebd0"; +} +.isax-bold-radar-2:before { + content: "\ebd1"; +} +.isax-bold-radio:before { + content: "\ebd2"; +} +.isax-bold-ram:before { + content: "\ebd3"; +} +.isax-bold-ram-2:before { + content: "\ebd4"; +} +.isax-bold-ranking:before { + content: "\ebd5"; +} +.isax-bold-ranking-1:before { + content: "\ebd6"; +} +.isax-bold-receipt:before { + content: "\ebd7"; +} +.isax-bold-receipt-1:before { + content: "\ebd8"; +} +.isax-bold-receipt-2:before { + content: "\ebd9"; +} +.isax-bold-receipt-2-1:before { + content: "\ebda"; +} +.isax-bold-receipt-add:before { + content: "\ebdb"; +} +.isax-bold-receipt-discount:before { + content: "\ebdc"; +} +.isax-bold-receipt-disscount:before { + content: "\ebdd"; +} +.isax-bold-receipt-edit:before { + content: "\ebde"; +} +.isax-bold-receipt-item:before { + content: "\ebdf"; +} +.isax-bold-receipt-minus:before { + content: "\ebe0"; +} +.isax-bold-receipt-search:before { + content: "\ebe1"; +} +.isax-bold-receipt-square:before { + content: "\ebe2"; +} +.isax-bold-receipt-text:before { + content: "\ebe3"; +} +.isax-bold-received:before { + content: "\ebe4"; +} +.isax-bold-receive-square:before { + content: "\ebe5"; +} +.isax-bold-receive-square-2:before { + content: "\ebe6"; +} +.isax-bold-record:before { + content: "\ebe7"; +} +.isax-bold-record-circle:before { + content: "\ebe8"; +} +.isax-bold-recovery-convert:before { + content: "\ebe9"; +} +.isax-bold-redo:before { + content: "\ebea"; +} +.isax-bold-refresh:before { + content: "\ebeb"; +} +.isax-bold-refresh-2:before { + content: "\ebec"; +} +.isax-bold-refresh-circle:before { + content: "\ebed"; +} +.isax-bold-refresh-left-square:before { + content: "\ebee"; +} +.isax-bold-refresh-right-square:before { + content: "\ebef"; +} +.isax-bold-refresh-square-2:before { + content: "\ebf0"; +} +.isax-bold-repeat:before { + content: "\ebf1"; +} +.isax-bold-repeat-circle:before { + content: "\ebf2"; +} +.isax-bold-repeate-music:before { + content: "\ebf3"; +} +.isax-bold-repeate-one:before { + content: "\ebf4"; +} +.isax-bold-reserve:before { + content: "\ebf5"; +} +.isax-bold-rotate-left:before { + content: "\ebf6"; +} +.isax-bold-rotate-left-1:before { + content: "\ebf7"; +} +.isax-bold-rotate-right:before { + content: "\ebf8"; +} +.isax-bold-rotate-right-1:before { + content: "\ebf9"; +} +.isax-bold-route-square:before { + content: "\ebfa"; +} +.isax-bold-routing:before { + content: "\ebfb"; +} +.isax-bold-routing-2:before { + content: "\ebfc"; +} +.isax-bold-row-horizontal:before { + content: "\ebfd"; +} +.isax-bold-row-vertical:before { + content: "\ebfe"; +} +.isax-bold-rulerpen:before { + content: "\ebff"; +} +.isax-bold-ruler:before { + content: "\ec00"; +} +.isax-bold-safe-home:before { + content: "\ec01"; +} +.isax-bold-sagittarius:before { + content: "\ec02"; +} +.isax-bold-save-2:before { + content: "\ec03"; +} +.isax-bold-save-add:before { + content: "\ec04"; +} +.isax-bold-save-minus:before { + content: "\ec05"; +} +.isax-bold-save-remove:before { + content: "\ec06"; +} +.isax-bold-scan:before { + content: "\ec07"; +} +.isax-bold-scan-barcode:before { + content: "\ec08"; +} +.isax-bold-scanner:before { + content: "\ec09"; +} +.isax-bold-scanning:before { + content: "\ec0a"; +} +.isax-bold-scissor:before { + content: "\ec0b"; +} +.isax-bold-scissor-1:before { + content: "\ec0c"; +} +.isax-bold-screenmirroring:before { + content: "\ec0d"; +} +.isax-bold-scroll:before { + content: "\ec0e"; +} +.isax-bold-search-favorite:before { + content: "\ec0f"; +} +.isax-bold-search-favorite-1:before { + content: "\ec10"; +} +.isax-bold-search-normal:before { + content: "\ec11"; +} +.isax-bold-search-normal-1:before { + content: "\ec12"; +} +.isax-bold-search-status:before { + content: "\ec13"; +} +.isax-bold-search-status-1:before { + content: "\ec14"; +} +.isax-bold-search-zoom-in:before { + content: "\ec15"; +} +.isax-bold-search-zoom-in-1:before { + content: "\ec16"; +} +.isax-bold-search-zoom-out:before { + content: "\ec17"; +} +.isax-bold-search-zoom-out-1:before { + content: "\ec18"; +} +.isax-bold-security:before { + content: "\ec19"; +} +.isax-bold-security-card:before { + content: "\ec1a"; +} +.isax-bold-security-safe:before { + content: "\ec1b"; +} +.isax-bold-security-time:before { + content: "\ec1c"; +} +.isax-bold-security-user:before { + content: "\ec1d"; +} +.isax-bold-send:before { + content: "\ec1e"; +} +.isax-bold-send-1:before { + content: "\ec1f"; +} +.isax-bold-send-2:before { + content: "\ec20"; +} +.isax-bold-send-sqaure-2:before { + content: "\ec21"; +} +.isax-bold-send-square:before { + content: "\ec22"; +} +.isax-bold-setting:before { + content: "\ec23"; +} +.isax-bold-setting-2:before { + content: "\ec24"; +} +.isax-bold-setting-3:before { + content: "\ec25"; +} +.isax-bold-setting-4:before { + content: "\ec26"; +} +.isax-bold-setting-5:before { + content: "\ec27"; +} +.isax-bold-settings:before { + content: "\ec28"; +} +.isax-bold-shapes:before { + content: "\ec29"; +} +.isax-bold-shapes-1:before { + content: "\ec2a"; +} +.isax-bold-share:before { + content: "\ec2b"; +} +.isax-bold-shield-cross:before { + content: "\ec2c"; +} +.isax-bold-shield-search:before { + content: "\ec2d"; +} +.isax-bold-shield-security:before { + content: "\ec2e"; +} +.isax-bold-shield-slash:before { + content: "\ec2f"; +} +.isax-bold-shield-tick:before { + content: "\ec30"; +} +.isax-bold-ship:before { + content: "\ec31"; +} +.isax-bold-shop:before { + content: "\ec32"; +} +.isax-bold-shop-add:before { + content: "\ec33"; +} +.isax-bold-shopping-bag:before { + content: "\ec34"; +} +.isax-bold-shopping-cart:before { + content: "\ec35"; +} +.isax-bold-shop-remove:before { + content: "\ec36"; +} +.isax-bold-shuffle:before { + content: "\ec37"; +} +.isax-bold-siacoin-sc:before { + content: "\ec38"; +} +.isax-bold-sidebar-bottom:before { + content: "\ec39"; +} +.isax-bold-sidebar-left:before { + content: "\ec3a"; +} +.isax-bold-sidebar-right:before { + content: "\ec3b"; +} +.isax-bold-sidebar-top:before { + content: "\ec3c"; +} +.isax-bold-signpost:before { + content: "\ec3d"; +} +.isax-bold-simcard:before { + content: "\ec3e"; +} +.isax-bold-simcard-1:before { + content: "\ec3f"; +} +.isax-bold-simcard-2:before { + content: "\ec40"; +} +.isax-bold-size:before { + content: "\ec41"; +} +.isax-bold-slack:before { + content: "\ec42"; +} +.isax-bold-slash:before { + content: "\ec43"; +} +.isax-bold-slider:before { + content: "\ec44"; +} +.isax-bold-slider-horizontal:before { + content: "\ec45"; +} +.isax-bold-slider-horizontal-1:before { + content: "\ec46"; +} +.isax-bold-slider-vertical:before { + content: "\ec47"; +} +.isax-bold-slider-vertical-1:before { + content: "\ec48"; +} +.isax-bold-smallcaps:before { + content: "\ec49"; +} +.isax-bold-smart-car:before { + content: "\ec4a"; +} +.isax-bold-smart-home:before { + content: "\ec4b"; +} +.isax-bold-smileys:before { + content: "\ec4c"; +} +.isax-bold-sms:before { + content: "\ec4d"; +} +.isax-bold-sms-edit:before { + content: "\ec4e"; +} +.isax-bold-sms-notification:before { + content: "\ec4f"; +} +.isax-bold-sms-search:before { + content: "\ec50"; +} +.isax-bold-sms-star:before { + content: "\ec51"; +} +.isax-bold-sms-tracking:before { + content: "\ec52"; +} +.isax-bold-snapchat:before { + content: "\ec53"; +} +.isax-bold-solana-sol:before { + content: "\ec54"; +} +.isax-bold-sort:before { + content: "\ec55"; +} +.isax-bold-sound:before { + content: "\ec56"; +} +.isax-bold-speaker:before { + content: "\ec57"; +} +.isax-bold-speedometer:before { + content: "\ec58"; +} +.isax-bold-spotify:before { + content: "\ec59"; +} +.isax-bold-stacks-stx:before { + content: "\ec5a"; +} +.isax-bold-star:before { + content: "\ec5b"; +} +.isax-bold-star-1:before { + content: "\ec5c"; +} +.isax-bold-star-slash:before { + content: "\ec5d"; +} +.isax-bold-status:before { + content: "\ec5e"; +} +.isax-bold-status-up:before { + content: "\ec5f"; +} +.isax-bold-stellar-xlm:before { + content: "\ec60"; +} +.isax-bold-sticker:before { + content: "\ec61"; +} +.isax-bold-stickynote:before { + content: "\ec62"; +} +.isax-bold-stop:before { + content: "\ec63"; +} +.isax-bold-stop-circle:before { + content: "\ec64"; +} +.isax-bold-story:before { + content: "\ec65"; +} +.isax-bold-strongbox:before { + content: "\ec66"; +} +.isax-bold-strongbox-2:before { + content: "\ec67"; +} +.isax-bold-subtitle:before { + content: "\ec68"; +} +.isax-bold-sun:before { + content: "\ec69"; +} +.isax-bold-sun-1:before { + content: "\ec6a"; +} +.isax-bold-sun-fog:before { + content: "\ec6b"; +} +.isax-bold-tag:before { + content: "\ec6c"; +} +.isax-bold-tag-2:before { + content: "\ec6d"; +} +.isax-bold-tag-cross:before { + content: "\ec6e"; +} +.isax-bold-tag-right:before { + content: "\ec6f"; +} +.isax-bold-tag-user:before { + content: "\ec70"; +} +.isax-bold-task:before { + content: "\ec71"; +} +.isax-bold-task-square:before { + content: "\ec72"; +} +.isax-bold-teacher:before { + content: "\ec73"; +} +.isax-bold-tenx-pay:before { + content: "\ec74"; +} +.isax-bold-tether-usdt:before { + content: "\ec75"; +} +.isax-bold-text:before { + content: "\ec76"; +} +.isax-bold-textalign-center:before { + content: "\ec77"; +} +.isax-bold-textalign-justifycenter:before { + content: "\ec78"; +} +.isax-bold-textalign-justifyleft:before { + content: "\ec79"; +} +.isax-bold-textalign-justifyright:before { + content: "\ec7a"; +} +.isax-bold-textalign-left:before { + content: "\ec7b"; +} +.isax-bold-textalign-right:before { + content: "\ec7c"; +} +.isax-bold-text-block:before { + content: "\ec7d"; +} +.isax-bold-text-bold:before { + content: "\ec7e"; +} +.isax-bold-text-italic:before { + content: "\ec7f"; +} +.isax-bold-text-underline:before { + content: "\ec80"; +} +.isax-bold-the-graph-grt:before { + content: "\ec81"; +} +.isax-bold-theta-theta:before { + content: "\ec82"; +} +.isax-bold-thorchain-rune:before { + content: "\ec83"; +} +.isax-bold-tick-circle:before { + content: "\ec84"; +} +.isax-bold-ticket:before { + content: "\ec85"; +} +.isax-bold-ticket-2:before { + content: "\ec86"; +} +.isax-bold-ticket-discount:before { + content: "\ec87"; +} +.isax-bold-ticket-expired:before { + content: "\ec88"; +} +.isax-bold-ticket-star:before { + content: "\ec89"; +} +.isax-bold-tick-square:before { + content: "\ec8a"; +} +.isax-bold-timer:before { + content: "\ec8b"; +} +.isax-bold-timer-1:before { + content: "\ec8c"; +} +.isax-bold-timer-pause:before { + content: "\ec8d"; +} +.isax-bold-timer-start:before { + content: "\ec8e"; +} +.isax-bold-toggle-off:before { + content: "\ec8f"; +} +.isax-bold-toggle-off-circle:before { + content: "\ec90"; +} +.isax-bold-toggle-on:before { + content: "\ec91"; +} +.isax-bold-toggle-on-circle:before { + content: "\ec92"; +} +.isax-bold-trade:before { + content: "\ec93"; +} +.isax-bold-transaction-minus:before { + content: "\ec94"; +} +.isax-bold-translate:before { + content: "\ec95"; +} +.isax-bold-trash:before { + content: "\ec96"; +} +.isax-bold-tree:before { + content: "\ec97"; +} +.isax-bold-trello:before { + content: "\ec98"; +} +.isax-bold-trend-down:before { + content: "\ec99"; +} +.isax-bold-trend-up:before { + content: "\ec9a"; +} +.isax-bold-triangle:before { + content: "\ec9b"; +} +.isax-bold-triangle-crypto:before { + content: "\ec9c"; +} +.isax-bold-trontron-trx:before { + content: "\ec9d"; +} +.isax-bold-truck:before { + content: "\ec9e"; +} +.isax-bold-truck-fast:before { + content: "\ec9f"; +} +.isax-bold-truck-remove:before { + content: "\eca0"; +} +.isax-bold-truck-tick:before { + content: "\eca1"; +} +.isax-bold-truck-time:before { + content: "\eca2"; +} +.isax-bold-trush-square:before { + content: "\eca3"; +} +.isax-bold-twitch:before { + content: "\eca4"; +} +.isax-bold-ui8:before { + content: "\eca5"; +} +.isax-bold-undo:before { + content: "\eca6"; +} +.isax-bold-unlimited:before { + content: "\eca7"; +} +.isax-bold-unlock:before { + content: "\eca8"; +} +.isax-bold-usd-coin-usdc:before { + content: "\eca9"; +} +.isax-bold-user:before { + content: "\ecaa"; +} +.isax-bold-user-add:before { + content: "\ecab"; +} +.isax-bold-user-cirlce-add:before { + content: "\ecac"; +} +.isax-bold-user-edit:before { + content: "\ecad"; +} +.isax-bold-user-minus:before { + content: "\ecae"; +} +.isax-bold-user-octagon:before { + content: "\ecaf"; +} +.isax-bold-user-remove:before { + content: "\ecb0"; +} +.isax-bold-user-search:before { + content: "\ecb1"; +} +.isax-bold-user-square:before { + content: "\ecb2"; +} +.isax-bold-user-tag:before { + content: "\ecb3"; +} +.isax-bold-user-tick:before { + content: "\ecb4"; +} +.isax-bold-velas-vlx:before { + content: "\ecb5"; +} +.isax-bold-verify:before { + content: "\ecb6"; +} +.isax-bold-vibe-vibe:before { + content: "\ecb7"; +} +.isax-bold-video:before { + content: "\ecb8"; +} +.isax-bold-video-add:before { + content: "\ecb9"; +} +.isax-bold-video-circle:before { + content: "\ecba"; +} +.isax-bold-video-horizontal:before { + content: "\ecbb"; +} +.isax-bold-video-octagon:before { + content: "\ecbc"; +} +.isax-bold-video-play:before { + content: "\ecbd"; +} +.isax-bold-video-remove:before { + content: "\ecbe"; +} +.isax-bold-video-slash .path1:before { + content: "\ecbf"; + color: rgb(41, 45, 50); + opacity: 0.4; +} +.isax-bold-video-slash .path2:before { + content: "\ecc0"; + margin-left: -1em; + color: rgb(41, 45, 50); +} +.isax-bold-video-slash .path3:before { + content: "\ecc1"; + margin-left: -1em; + color: rgb(41, 45, 50); +} +.isax-bold-video-slash .path4:before { + content: "\ecc2"; + margin-left: -1em; + color: rgb(41, 45, 50); +} +.isax-bold-video-square:before { + content: "\ecc3"; +} +.isax-bold-video-tick:before { + content: "\ecc4"; +} +.isax-bold-video-time:before { + content: "\ecc5"; +} +.isax-bold-video-vertical:before { + content: "\ecc6"; +} +.isax-bold-voice-cricle:before { + content: "\ecc7"; +} +.isax-bold-voice-square:before { + content: "\ecc8"; +} +.isax-bold-volume-cross:before { + content: "\ecc9"; +} +.isax-bold-volume-high:before { + content: "\ecca"; +} +.isax-bold-volume-low:before { + content: "\eccb"; +} +.isax-bold-volume-low-1:before { + content: "\eccc"; +} +.isax-bold-volume-mute:before { + content: "\eccd"; +} +.isax-bold-volume-slash:before { + content: "\ecce"; +} +.isax-bold-volume-up:before { + content: "\eccf"; +} +.isax-bold-vuesax:before { + content: "\ecd0"; +} +.isax-bold-wallet:before { + content: "\ecd1"; +} +.isax-bold-wallet-1:before { + content: "\ecd2"; +} +.isax-bold-wallet-2:before { + content: "\ecd3"; +} +.isax-bold-wallet-3:before { + content: "\ecd4"; +} +.isax-bold-wallet-add:before { + content: "\ecd5"; +} +.isax-bold-wallet-add-1:before { + content: "\ecd6"; +} +.isax-bold-wallet-check:before { + content: "\ecd7"; +} +.isax-bold-wallet-minus:before { + content: "\ecd8"; +} +.isax-bold-wallet-money:before { + content: "\ecd9"; +} +.isax-bold-wallet-remove:before { + content: "\ecda"; +} +.isax-bold-wallet-search:before { + content: "\ecdb"; +} +.isax-bold-wanchain-wan:before { + content: "\ecdc"; +} +.isax-bold-wanchain-wan-1:before { + content: "\ecdd"; +} +.isax-bold-warning-2:before { + content: "\ecde"; +} +.isax-bold-watch:before { + content: "\ecdf"; +} +.isax-bold-watch-status:before { + content: "\ece0"; +} +.isax-bold-weight:before { + content: "\ece1"; +} +.isax-bold-weight-1:before { + content: "\ece2"; +} +.isax-bold-whatsapp:before { + content: "\ece3"; +} +.isax-bold-wifi:before { + content: "\ece4"; +} +.isax-bold-wifi-square:before { + content: "\ece5"; +} +.isax-bold-wind:before { + content: "\ece6"; +} +.isax-bold-wind-2:before { + content: "\ece7"; +} +.isax-bold-windows:before { + content: "\ece8"; +} +.isax-bold-wing-wing:before { + content: "\ece9"; +} +.isax-bold-woman:before { + content: "\ecea"; +} +.isax-bold-xd:before { + content: "\eceb"; +} +.isax-bold-xiaomi:before { + content: "\ecec"; +} +.isax-bold-xrp-xrp:before { + content: "\eced"; +} +.isax-bold-youtube:before { + content: "\ecee"; +} +.isax-bold-zel-zel:before { + content: "\ecef"; +} +.isax-bold-zoom:before { + content: "\ecf0"; +} diff --git a/app/assets/plugins/bootstrap/bootstrap-grid.min.css b/app/assets/plugins/bootstrap/bootstrap-grid.min.css new file mode 100644 index 0000000000000000000000000000000000000000..e0922219988c91cd5218383d1f6485be7e0869b4 --- /dev/null +++ b/app/assets/plugins/bootstrap/bootstrap-grid.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap Grid v5.0.2 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{width:100%;padding-right:var(--bs-gutter-x,.75rem);padding-left:var(--bs-gutter-x,.75rem);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(var(--bs-gutter-y) * -1);margin-right:calc(var(--bs-gutter-x) * -.5);margin-left:calc(var(--bs-gutter-x) * -.5)}.row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}@media (min-width:576px){.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}}@media (min-width:768px){.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}}@media (min-width:992px){.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}}@media (min-width:1200px){.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}}@media (min-width:1400px){.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} +/*# sourceMappingURL=bootstrap-grid.min.css.map */ \ No newline at end of file diff --git a/app/assets/plugins/bootstrap/bootstrap-utilities.min.css b/app/assets/plugins/bootstrap/bootstrap-utilities.min.css new file mode 100644 index 0000000000000000000000000000000000000000..bd71a55c531ccc3f09b95d311b2ed369fb593927 --- /dev/null +++ b/app/assets/plugins/bootstrap/bootstrap-utilities.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap Utilities v5.0.2 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#0d6efd}.link-primary:focus,.link-primary:hover{color:#0a58ca}.link-secondary{color:#6c757d}.link-secondary:focus,.link-secondary:hover{color:#565e64}.link-success{color:#198754}.link-success:focus,.link-success:hover{color:#146c43}.link-info{color:#0dcaf0}.link-info:focus,.link-info:hover{color:#3dd5f3}.link-warning{color:#ffc107}.link-warning:focus,.link-warning:hover{color:#ffcd39}.link-danger{color:#dc3545}.link-danger:focus,.link-danger:hover{color:#b02a37}.link-light{color:#f8f9fa}.link-light:focus,.link-light:hover{color:#f9fafb}.link-dark{color:#212529}.link-dark:focus,.link-dark:hover{color:#1a1e21}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:calc(3 / 4 * 100%)}.ratio-16x9{--bs-aspect-ratio:calc(9 / 16 * 100%)}.ratio-21x9{--bs-aspect-ratio:calc(9 / 21 * 100%)}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:1px solid #dee2e6!important}.border-0{border:0!important}.border-top{border-top:1px solid #dee2e6!important}.border-top-0{border-top:0!important}.border-end{border-right:1px solid #dee2e6!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:1px solid #dee2e6!important}.border-start-0{border-left:0!important}.border-primary{border-color:#0d6efd!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#198754!important}.border-info{border-color:#0dcaf0!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#212529!important}.border-white{border-color:#fff!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{color:#0d6efd!important}.text-secondary{color:#6c757d!important}.text-success{color:#198754!important}.text-info{color:#0dcaf0!important}.text-warning{color:#ffc107!important}.text-danger{color:#dc3545!important}.text-light{color:#f8f9fa!important}.text-dark{color:#212529!important}.text-white{color:#fff!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-reset{color:inherit!important}.bg-primary{background-color:#0d6efd!important}.bg-secondary{background-color:#6c757d!important}.bg-success{background-color:#198754!important}.bg-info{background-color:#0dcaf0!important}.bg-warning{background-color:#ffc107!important}.bg-danger{background-color:#dc3545!important}.bg-light{background-color:#f8f9fa!important}.bg-dark{background-color:#212529!important}.bg-body{background-color:#fff!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.25rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.2rem!important}.rounded-2{border-radius:.25rem!important}.rounded-3{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-end{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-start{border-bottom-left-radius:.25rem!important;border-top-left-radius:.25rem!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} +/*# sourceMappingURL=bootstrap-utilities.min.css.map */ \ No newline at end of file diff --git a/app/babel.config.js b/app/babel.config.js new file mode 100644 index 0000000000000000000000000000000000000000..a16fff7ccba1a3218e72b19a8b9230dd62d6a333 --- /dev/null +++ b/app/babel.config.js @@ -0,0 +1,6 @@ +module.exports = { + presets: [ + '@babel/preset-env', + '@vue/cli-plugin-babel/preset' + ] +} diff --git a/app/favicon.ico b/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8939fc850569e98ed0c8489ae3e116e1d9987674 Binary files /dev/null and b/app/favicon.ico differ diff --git a/app/gulpfile.js b/app/gulpfile.js new file mode 100644 index 0000000000000000000000000000000000000000..98911857e7f403cfec1aa7e897ea733a5672a812 --- /dev/null +++ b/app/gulpfile.js @@ -0,0 +1,149 @@ +const path = require('path') +const fs = require('fs') +const gulp = require('gulp') +// const readlineSync = require('readline-sync') +const fsExtra = require('fs-extra') + +let objToWrite = {} +let paths = { + langFolder: path.join(__dirname, 'src/lang/'), + srcFolder: path.join(__dirname, 'src/') +} + +gulp.task('geni18n', function (done) { + // let projPath = readlineSync.question("Please enter project path (path of 'src' folder) ") + // projPath = projPath + '/' + let projPath = paths.srcFolder + readPrevi18n() + backUpI18nFile(projPath) + i18nGenerator(projPath, ['en'], 'en') + done() +}) + +function backUpI18nFile (projPath) { + let d = new Date() + let dformat = [paddingZero(d.getDate()), paddingZero(d.getMonth() + 1), + paddingZero(d.getFullYear())].join('_') + '_' + + [paddingZero(d.getHours()), + paddingZero(d.getMinutes()), + paddingZero(d.getSeconds()), paddingZero(d.getMilliseconds())].join('_') + let backUpFolderPath = paths.langFolder + 'backup' + let backUpFilePath = backUpFolderPath + '/en_' + dformat + '.json' + try { + fsExtra.ensureDirSync(backUpFolderPath) + } catch (error) { + console.log('Cannot create backup folder...') + } + let enFilePath = paths.langFolder + 'en.json' + let content = fs.readFileSync(enFilePath, 'utf8') + fs.writeFileSync(backUpFilePath, JSON.parse(JSON.stringify(content))) +} + +function paddingZero (number) { + if (number <= 9) { + let temp = '0' + number.toString() + return temp + } + return number.toString() +} + +function createDvJson (projPath, objToWrite) { + for (let key in objToWrite) { + if (typeof objToWrite[key] === 'object') { + let temp = objToWrite[key] + for (let newKey in temp) { + if (temp.hasOwnProperty(newKey)) { + temp[newKey] = newKey + } + } + } + } + let dvFilePath = paths.langFolder + 'dv.json' + fs.writeFileSync(dvFilePath, JSON.stringify(objToWrite)) +} + +function readPrevi18n () { + let enFilePath = paths.langFolder + 'en.json' + try { + fs.accessSync(enFilePath, fs.R_OK | fs.W_OK) + let content = fs.readFileSync(enFilePath, 'utf8') + objToWrite = JSON.parse(content) + } catch (e) { + console.log('en.json file is missing...') + fsExtra.ensureFileSync(enFilePath) + console.log('Created en.json file...') + objToWrite = {} + } +} + +function i18nGenerator (projPath, langArray, defaultLanguage) { + let fileList = walkSync(projPath) + let flag = 0 + let i + let len = fileList.length + let regexString = `([$]t[(]('|")##(.+?)##)(\\s*\\s*)(@@([\\s\\S]*?)@@('|")[)])` + let regex = new RegExp(regexString, 'gi') + + if (fileList != null && fileList !== undefined && fileList.length > 0) { + for (i = 0; i < fileList.length; i++) { + flag++ + if (flag === len) { + let fileList = walkSync(projPath) + let i; let len = fileList.length + if (fileList !== null && fileList !== undefined && fileList.length > 0) { + for (i = 0; i < len; i++) { + let file = fileList[i] + let keyPrefix = path.basename(file).split('.')[0] + let content = fs.readFileSync(file, 'utf8') + let i18nContentsToBeReplaced = content.match(regex) + let translatedAdded = content + if (i18nContentsToBeReplaced != null && i18nContentsToBeReplaced !== '' && i18nContentsToBeReplaced !== undefined && i18nContentsToBeReplaced.length > 0) { + for (let j = 0; j < i18nContentsToBeReplaced.length; j++) { + let extractKeyFrom = i18nContentsToBeReplaced[j].toString() + let key = extractKeyFrom.substring(extractKeyFrom.indexOf('##') + 2, extractKeyFrom.lastIndexOf('##')).trim() + let value = extractKeyFrom.substring(extractKeyFrom.indexOf('@@') + 2, extractKeyFrom.lastIndexOf('@@')).trim() + // let replacement = "{{'" + key + "' | translate}}"; + let replacement = "$t('" + keyPrefix + '.' + key + "')" + // console.log('keyPrefix + key', keyPrefix, key) + translatedAdded = translatedAdded.replace(extractKeyFrom, replacement) + prepareI18nObject(keyPrefix, key, value) + } + fs.writeFileSync(file, translatedAdded) + } + if (i === (len - 1)) { + console.log('\n\n') + console.log('Internationalization successfully done on ' + (i + 1) + ' files') + console.log('\n\n') + let enFilePath = paths.langFolder + 'en.json' + fs.writeFileSync(enFilePath, JSON.stringify(objToWrite)) + createDvJson(projPath, objToWrite) + } + } + } + } + } + } +} + +let walkSync = function (dir, filelist) { + let files = fs.readdirSync(dir) + filelist = filelist || [] + files.forEach(function (file) { + if (fs.statSync(dir + file).isDirectory()) { + filelist = walkSync(dir + file + '/', filelist) + } else { + if (path.extname(file) === '.vue') { + filelist.push(dir + file) + } + } + }) + return filelist +} + +function prepareI18nObject (keyPrefix, key, value) { + if (!objToWrite.hasOwnProperty(keyPrefix)) { + objToWrite[keyPrefix] = {} + } + let parentObj = objToWrite[keyPrefix] + parentObj[key] = value +} diff --git a/app/img/icons/android-icon-144x144.png b/app/img/icons/android-icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..d847ba9c695d74bb4deebeabc87bea0561b6113c Binary files /dev/null and b/app/img/icons/android-icon-144x144.png differ diff --git a/app/img/icons/android-icon-192x192.png b/app/img/icons/android-icon-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..6536205b1da4c612bff91e3e88eb792748cd67c4 Binary files /dev/null and b/app/img/icons/android-icon-192x192.png differ diff --git a/app/img/icons/android-icon-36x36.png b/app/img/icons/android-icon-36x36.png new file mode 100644 index 0000000000000000000000000000000000000000..921624faf1e19289acaec61fda3f2f1e34648490 Binary files /dev/null and b/app/img/icons/android-icon-36x36.png differ diff --git a/app/img/icons/android-icon-48x48.png b/app/img/icons/android-icon-48x48.png new file mode 100644 index 0000000000000000000000000000000000000000..f4a4855e713f5cfc39d2f9e6a9ea0d85916104e0 Binary files /dev/null and b/app/img/icons/android-icon-48x48.png differ diff --git a/app/img/icons/android-icon-72x72.png b/app/img/icons/android-icon-72x72.png new file mode 100644 index 0000000000000000000000000000000000000000..5f76cf2cf791aa68b758677f5615422539969553 Binary files /dev/null and b/app/img/icons/android-icon-72x72.png differ diff --git a/app/img/icons/android-icon-96x96.png b/app/img/icons/android-icon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..d6abfa1517f558c745363424da08f41ab7a0e931 Binary files /dev/null and b/app/img/icons/android-icon-96x96.png differ diff --git a/app/img/icons/apple-icon-114x114.png b/app/img/icons/apple-icon-114x114.png new file mode 100644 index 0000000000000000000000000000000000000000..8cef596dfae46a8df123635acaac7d02ffeeba34 Binary files /dev/null and b/app/img/icons/apple-icon-114x114.png differ diff --git a/app/img/icons/apple-icon-120x120.png b/app/img/icons/apple-icon-120x120.png new file mode 100644 index 0000000000000000000000000000000000000000..2c44f22d0d70e4383a6ebfe074cf5eb6c4be64f6 Binary files /dev/null and b/app/img/icons/apple-icon-120x120.png differ diff --git a/app/img/icons/apple-icon-144x144.png b/app/img/icons/apple-icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..d847ba9c695d74bb4deebeabc87bea0561b6113c Binary files /dev/null and b/app/img/icons/apple-icon-144x144.png differ diff --git a/app/img/icons/apple-icon-152x152.png b/app/img/icons/apple-icon-152x152.png new file mode 100644 index 0000000000000000000000000000000000000000..ca1b6808a3cae4d3a49eca1235c2888f99f48dfe Binary files /dev/null and b/app/img/icons/apple-icon-152x152.png differ diff --git a/app/img/icons/apple-icon-180x180.png b/app/img/icons/apple-icon-180x180.png new file mode 100644 index 0000000000000000000000000000000000000000..902836042ecfc8c74b7a3a2f51212c75e61d6f4f Binary files /dev/null and b/app/img/icons/apple-icon-180x180.png differ diff --git a/app/img/icons/apple-icon-57x57.png b/app/img/icons/apple-icon-57x57.png new file mode 100644 index 0000000000000000000000000000000000000000..910d55410aa1b663bdf60c5992826f4e99fd4320 Binary files /dev/null and b/app/img/icons/apple-icon-57x57.png differ diff --git a/app/img/icons/apple-icon-60x60.png b/app/img/icons/apple-icon-60x60.png new file mode 100644 index 0000000000000000000000000000000000000000..1cd3950bf2bd8367ac06dcf860b76580b447f2fd Binary files /dev/null and b/app/img/icons/apple-icon-60x60.png differ diff --git a/app/img/icons/apple-icon-72x72.png b/app/img/icons/apple-icon-72x72.png new file mode 100644 index 0000000000000000000000000000000000000000..5f76cf2cf791aa68b758677f5615422539969553 Binary files /dev/null and b/app/img/icons/apple-icon-72x72.png differ diff --git a/app/img/icons/apple-icon-76x76.png b/app/img/icons/apple-icon-76x76.png new file mode 100644 index 0000000000000000000000000000000000000000..495afd8e5a6a123c9ecc4df9a535581c81495fac Binary files /dev/null and b/app/img/icons/apple-icon-76x76.png differ diff --git a/app/img/icons/apple-icon-precomposed.png b/app/img/icons/apple-icon-precomposed.png new file mode 100644 index 0000000000000000000000000000000000000000..3de117800f7e844ae32ee4b8187cef69565c9790 Binary files /dev/null and b/app/img/icons/apple-icon-precomposed.png differ diff --git a/app/img/icons/apple-icon.png b/app/img/icons/apple-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3de117800f7e844ae32ee4b8187cef69565c9790 Binary files /dev/null and b/app/img/icons/apple-icon.png differ diff --git a/app/img/icons/favicon-16x16.png b/app/img/icons/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..775fdb7a5a87bb24e5d347b801a00af46c44b0a8 Binary files /dev/null and b/app/img/icons/favicon-16x16.png differ diff --git a/app/img/icons/favicon-32x32.png b/app/img/icons/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..7757820c7c6535cffcf17197c4fb0e5c1243e44b Binary files /dev/null and b/app/img/icons/favicon-32x32.png differ diff --git a/app/img/icons/favicon-96x96.png b/app/img/icons/favicon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..d6abfa1517f558c745363424da08f41ab7a0e931 Binary files /dev/null and b/app/img/icons/favicon-96x96.png differ diff --git a/app/img/icons/favicon.ico b/app/img/icons/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8939fc850569e98ed0c8489ae3e116e1d9987674 Binary files /dev/null and b/app/img/icons/favicon.ico differ diff --git a/app/img/icons/ms-icon-144x144.png b/app/img/icons/ms-icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..d847ba9c695d74bb4deebeabc87bea0561b6113c Binary files /dev/null and b/app/img/icons/ms-icon-144x144.png differ diff --git a/app/img/icons/ms-icon-150x150.png b/app/img/icons/ms-icon-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..dc35e8964686644474140d608a4ae4e5d28f9af4 Binary files /dev/null and b/app/img/icons/ms-icon-150x150.png differ diff --git a/app/img/icons/ms-icon-310x310.png b/app/img/icons/ms-icon-310x310.png new file mode 100644 index 0000000000000000000000000000000000000000..22488404e4c5401ed7be4e1a54f6da79aee8e5bc Binary files /dev/null and b/app/img/icons/ms-icon-310x310.png differ diff --git a/app/img/icons/ms-icon-70x70.png b/app/img/icons/ms-icon-70x70.png new file mode 100644 index 0000000000000000000000000000000000000000..6b53808f91a86cc7f16de54f5b9f354c611535f9 Binary files /dev/null and b/app/img/icons/ms-icon-70x70.png differ diff --git a/app/index.html b/app/index.html new file mode 100644 index 0000000000000000000000000000000000000000..6e831e8ffb4a7c7cb587d2359694d9c8a9b6be24 --- /dev/null +++ b/app/index.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge" /> + <meta name="viewport" content="width=device-width,initial-scale=1.0" /> + <link rel="shortcut icon" href="/favicon.ico?v=gAdelrOOOm" /> + <link + href="https://fonts.googleapis.com/icon?family=Material+Icons" + rel="stylesheet" + /> + <link + href="https://fonts.googleapis.com/icon?family=Material+Icons" + rel="stylesheet" + /> + <title>GoFullStack</title> + <style> + @font-face { + font-family: "DM Sans"; + font-style: normal; + font-weight: 400; + src: url("./assets/fonts/dm.woff2") format("woff2"); + } + + @font-face { + font-family: "DM Sans"; + font-style: normal; + font-weight: 500; + src: url("./assets/fonts/dm-500.woff2") format("woff2"); + } + + @font-face { + font-family: "DM Sans"; + font-style: normal; + font-weight: 700; + src: url("./assets/fonts/dm-700.woff2") format("woff2"); + } + </style> + </head> + <body> + <noscript> + <strong + >We're sorry but template2 doesn't work properly without JavaScript + enabled. Please enable it to continue.</strong + > + </noscript> + <div id="app"></div> + <script type="module" src="/src/main.js"></script> + <!-- built files will be auto injected --> + </body> +</html> diff --git a/app/jest.config.js b/app/jest.config.js new file mode 100644 index 0000000000000000000000000000000000000000..40186da6af8b331e3db8b00ff610e3460f7086c6 --- /dev/null +++ b/app/jest.config.js @@ -0,0 +1,22 @@ +module.exports = { + moduleFileExtensions: [ + 'js', + 'jsx', + 'json', + 'vue' + ], + transform: { + '^.+\\.vue$': 'vue-jest', + '.+\\.(css|styl|less|sass|scss|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub', + '^.+\\.jsx?$': 'babel-jest' + }, + moduleNameMapper: { + '^@/(.*)$': '<rootDir>/src/$1' + }, + snapshotSerializers: [ + 'jest-serializer-vue' + ], + testMatch: [ + '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)' + ] +} diff --git a/app/package.json b/app/package.json new file mode 100644 index 0000000000000000000000000000000000000000..3fb4eab0e7d42e60f3f714313c2d4acd8068a7b7 --- /dev/null +++ b/app/package.json @@ -0,0 +1,81 @@ +{ + "name": "app", + "version": "1.0.1", + "private": true, + "scripts": { + "serve": "vite", + "build": "vite build", + "geni18n": "gulp geni18n" + }, + "dependencies": { + "@formkit/icons": "^0.17.2", + "@formkit/vue": "^0.17.2", + "@meforma/vue-toaster": "^1.2.2", + "@popperjs/core": "^2.11.6", + "@vueform/multiselect": "^2.6.2", + "@vuepic/vue-datepicker": "^5.1.2", + "axios": "^0.21.1", + "core-js": "^3.24.1", + "crypto-js": "^3.1.9-1", + "daisyui": "^2.51.6", + "fs-extra": "^8.1.0", + "material-design-icons": "^3.0.1", + "pinia": "^2.1.3", + "readline-sync": "^1.4.10", + "register-service-worker": "^1.6.2", + "sass": "^1.54.4", + "sweetalert2": "^11.7.5", + "tailwind-scrollbar": "^3.0.4", + "vee-validate": "^4.5.4", + "vue": "^3.3.1", + "vue-i18n": "^9.2.0-beta.15", + "vue-json-viewer": "^3.0.4", + "vue-meta": "^3.0.0-alpha.9", + "vue-router": "^4.0.12", + "vue3-clipboard": "^1.0.0", + "vue3-confirm-dialog": "^0.1.1", + "vuex": "^4.0.0-alpha.1", + "vuex-persistedstate": "^4.1.0", + "yup": "^0.32.11" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vue/cli-plugin-babel": "^5.0.8", + "@vue/cli-plugin-e2e-nightwatch": "^5.0.8", + "@vue/cli-plugin-pwa": "^5.0.8", + "@vue/cli-plugin-unit-jest": "^5.0.8", + "@vue/cli-service": "^5.0.8", + "@vue/compiler-sfc": "^3.0.0-beta.1", + "@vue/eslint-config-standard": "^4.0.0", + "@vue/test-utils": "^2.0.0-alpha.1", + "autoprefixer": "^10.4.14", + "babel-core": "7.0.0-bridge.0", + "babel-eslint": "^10.0.1", + "babel-jest": "^29.1.2", + "compression-webpack-plugin": "^10.0.0", + "eslint": "^7.32.0", + "eslint-plugin-vue": "^7.2.2", + "gulp": "^4.0.2", + "gulp-cli": "^2.2.0", + "node-sass": "^8.0.0", + "postcss": "^8.4.23", + "sass-loader": "^10.2.0", + "tailwindcss": "^3.3.2", + "vite": "^4.3.5", + "vite-plugin-compression": "^0.5.1", + "vite-plugin-eslint": "1.8.1", + "vite-plugin-linter": "^1.2.0", + "vite-plugin-require": "0.0.8", + "vite-plugin-vue-devtools": "0.0.20" + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not ie <= 8" + ], + "overrides": { + "glob-parent": "6.0.2", + "chokidar": "3.5.3" + }, + "type": "module" +} diff --git a/app/postcss.config.js b/app/postcss.config.js new file mode 100644 index 0000000000000000000000000000000000000000..fbe14a4c98ae1e88685c21b79c95250d724fd43f --- /dev/null +++ b/app/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; \ No newline at end of file diff --git a/app/robots.txt b/app/robots.txt new file mode 100644 index 0000000000000000000000000000000000000000..eb0536286f3081c6c0646817037faf5446e3547d --- /dev/null +++ b/app/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: diff --git a/app/src/App.vue b/app/src/App.vue new file mode 100644 index 0000000000000000000000000000000000000000..dc605cf0365db1294bdace73c10d87dde08fef78 --- /dev/null +++ b/app/src/App.vue @@ -0,0 +1,70 @@ +<template> + <div id="app"> + <div id="app-loader" v-if="mainStore.isPageBlocked"> + <div class="bg-gray-200 w-full min-h-screen flex justify-center items-center"> + <div class="flex min-h-screen w-full items-center justify-center bg-gray-200"> + <div + class="flex h-14 w-14 items-center justify-center rounded-full bg-gradient-to-tr from-indigo-500 to-pink-500 animate-spin" + > + <div class="h-9 w-9 rounded-full bg-gray-200"></div> + </div> + </div> + </div> + </div> + <div class="wrapper"> + <router-view :key="$route.fullPath" /> + </div> + <Toast></Toast> + <ConfirmDialog></ConfirmDialog> + <Footer></Footer> + </div> +</template> + +<script> + import { useMeta } from "vue-meta" + import Footer from "./components/common/Footer.vue" + import { main } from './store/index' + + export default { + name: "App", + components: { + Footer, + }, + data() { + return {} + }, + setup() { + useMeta({ + title: "", + htmlAttrs: { lang: "en", amp: true }, + }) + const mainStore = main() + return {mainStore} + }, + metaInfo: { + meta: [ + { + vmid: "description", + name: "description", + content: "Test title", + template: (chunk) => `${chunk} - FullStack`, + }, + ], + }, + } +</script> + +<style lang="scss"> + #app-loader { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: rgba(255, 255, 255, 0.8); + z-index: 2000; + display: flex; + align-items: center; + justify-content: center; + } +</style> diff --git a/app/src/assets/logo.png b/app/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d2503fc2a44b5053b0837ebea6e87a2d339a43 Binary files /dev/null and b/app/src/assets/logo.png differ diff --git a/app/src/assets/logo_mkcl.svg b/app/src/assets/logo_mkcl.svg new file mode 100644 index 0000000000000000000000000000000000000000..726616f9bf2609c95975725a2b9a6df5332101c0 --- /dev/null +++ b/app/src/assets/logo_mkcl.svg @@ -0,0 +1,109 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Creator: CorelDRAW X6 --> +<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="8in" height="6in" version="1.1" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd" +viewBox="0 0 8000 6000" + xmlns:xlink="http://www.w3.org/1999/xlink"> + <defs> + <style type="text/css"> + <![CDATA[ + .str0 {stroke:#848688;stroke-width:3} + .fil11 {fill:none;fill-rule:nonzero} + .fil7 {fill:#96989A} + .fil5 {fill:#C7C9CB} + .fil13 {fill:#F37435} + .fil12 {fill:#FFCC29} + .fil6 {fill:#FEFEFE} + .fil8 {fill:#848587;fill-rule:nonzero} + .fil10 {fill:#848688;fill-rule:nonzero} + .fil4 {fill:#373435;fill-rule:nonzero} + .fil14 {fill:#F58634;fill-rule:nonzero} + .fil9 {fill:#FEFEFE;fill-rule:nonzero} + .fil2 {fill:url(#id0)} + .fil1 {fill:url(#id1)} + .fil3 {fill:url(#id2)} + .fil0 {fill:url(#id3)} + ]]> + </style> + <linearGradient id="id0" gradientUnits="userSpaceOnUse" x1="7065.15" y1="1389.45" x2="7236.49" y2="1218.11"> + <stop offset="0" style="stop-color:#64B074"/> + <stop offset="1" style="stop-color:#98BD26"/> + </linearGradient> + <linearGradient id="id1" gradientUnits="userSpaceOnUse" x1="6440.12" y1="1620.81" x2="6735.08" y2="1325.85"> + <stop offset="0" style="stop-color:#209CBA"/> + <stop offset="1" style="stop-color:#1B7387"/> + </linearGradient> + <linearGradient id="id2" gradientUnits="userSpaceOnUse" xlink:href="#id1" x1="6531.31" y1="1216.64" x2="6797" y2="950.957"> + </linearGradient> + <linearGradient id="id3" gradientUnits="userSpaceOnUse" xlink:href="#id1" x1="7060.18" y1="1834.44" x2="7194.5" y2="1700.12"> + </linearGradient> + </defs> +<symbol id="Symbol6" viewBox="7060 1701 129 131"> + <path class="fil0" d="M7151 1701l-54 0c-35,0 -37,37 -37,37l0 52c0,44 39,42 39,42l47 0c49,0 42,-47 42,-47l0 -44c0,-39 -37,-39 -37,-39z"/> +</symbol> +<symbol id="Symbol2" viewBox="7060 1701 129 131"> + <path class="fil0" d="M7151 1701l-54 0c-35,0 -37,37 -37,37l0 52c0,44 39,42 39,42l47 0c49,0 42,-47 42,-47l0 -44c0,-39 -37,-39 -37,-39z"/> +</symbol> +<symbol id="Symbol7" viewBox="6456 1336 280 271"> + <path class="fil1" d="M6736 1507l0 -77c0,-104 -86,-95 -86,-95l-108 9c-104,9 -86,117 -86,117l0 72c-5,86 86,72 86,72l99 -5c86,-9 95,-95 95,-95z"/> +</symbol> +<symbol id="Symbol3" viewBox="7064 1219 164 167"> + <path class="fil2" d="M7181 1219l-69 0c-44,0 -47,47 -47,47l0 66c0,57 50,53 50,53l60 0c63,0 53,-60 53,-60l0 -57c0,-50 -47,-50 -47,-50z"/> +</symbol> +<symbol id="Symbol4" viewBox="6546 962 245 244"> + <path class="fil3" d="M6547 1084c0,0 -18,-113 95,-117l68 -5c0,0 81,-9 81,72l0 63c0,0 9,95 -77,99l-90 9c0,0 -77,9 -77,-59l0 -63z"/> +</symbol> +<symbol id="Symbol1" viewBox="6456 1336 280 271"> + <path class="fil1" d="M6736 1507l0 -77c0,-104 -86,-95 -86,-95l-108 9c-104,9 -86,117 -86,117l0 72c-5,86 86,72 86,72l99 -5c86,-9 95,-95 95,-95z"/> +</symbol> +<symbol id="Symbol8" viewBox="6546 962 245 244"> + <path class="fil3" d="M6547 1084c0,0 -18,-113 95,-117l68 -5c0,0 81,-9 81,72l0 63c0,0 9,95 -77,99l-90 9c0,0 -77,9 -77,-59l0 -63z"/> +</symbol> +<symbol id="Symbol5" viewBox="7064 1219 164 167"> + <path class="fil2" d="M7181 1219l-69 0c-44,0 -47,47 -47,47l0 66c0,57 50,53 50,53l60 0c63,0 53,-60 53,-60l0 -57c0,-50 -47,-50 -47,-50z"/> +</symbol> + <g id="Layer_x0020_1"> + <metadata id="CorelCorpID_0Corel-Layer"/> + <g id="_880697104"> + <path class="fil4" d="M427 5469l53 16c-12,55 -32,96 -62,123 -29,27 -65,40 -107,40 -37,0 -69,-9 -95,-27 -26,-18 -48,-47 -65,-87 -17,-40 -25,-87 -25,-141 0,-54 8,-99 25,-136 17,-37 39,-65 68,-84 29,-19 61,-28 96,-28 39,0 72,12 100,36 28,24 47,59 58,106l-52 15c-18,-68 -53,-102 -107,-102 -27,0 -50,7 -69,20 -20,14 -35,35 -47,64 -12,29 -17,65 -17,110 0,67 12,117 35,150 24,33 55,50 94,50 29,0 54,-10 75,-31 21,-21 35,-52 42,-93zm112 171l0 -353 44 0 0 54c11,-25 22,-41 31,-49 9,-8 20,-12 32,-12 16,0 33,6 50,19l-17 56c-12,-9 -24,-13 -36,-13 -10,0 -20,4 -29,11 -9,7 -15,17 -18,31 -6,23 -9,47 -9,73l0 185 -49 0zm385 -114l51 8c-8,38 -24,66 -46,85 -22,19 -49,29 -82,29 -41,0 -74,-16 -100,-47 -25,-31 -38,-76 -38,-135 0,-61 13,-108 38,-140 26,-32 58,-48 97,-48 37,0 69,16 94,47 25,32 38,77 38,137l0 16 -216 0c2,40 11,70 28,90 16,20 36,30 60,30 37,0 62,-24 77,-73zm-161 -97l162 0c-2,-31 -9,-53 -20,-69 -16,-22 -36,-33 -60,-33 -22,0 -41,9 -56,27 -16,18 -24,43 -26,74zm463 167c-16,17 -33,30 -51,39 -18,9 -36,13 -55,13 -30,0 -54,-9 -72,-27 -18,-18 -27,-43 -27,-74 0,-20 4,-39 13,-54 8,-16 20,-28 35,-37 15,-9 37,-15 67,-20 40,-6 69,-13 88,-21l0 -15c0,-24 -4,-41 -13,-51 -12,-14 -31,-21 -56,-21 -23,0 -40,5 -51,14 -11,9 -20,27 -25,53l-48 -8c7,-38 21,-66 42,-83 21,-17 51,-26 90,-26 30,0 54,6 72,17 17,11 28,26 33,42 5,17 7,41 7,74l0 80c0,56 1,91 3,106 2,15 6,29 12,42l-51 0c-5,-12 -8,-27 -10,-44zm-4 -134c-18,9 -45,16 -80,23 -21,4 -35,8 -43,12 -8,5 -15,11 -19,19 -5,8 -7,18 -7,29 0,17 5,30 16,40 10,10 25,15 43,15 18,0 34,-5 48,-14 14,-9 25,-21 32,-36 7,-15 11,-37 11,-66l0 -22zm235 124l7 53c-14,4 -26,5 -37,5 -17,0 -31,-3 -41,-10 -10,-7 -18,-16 -21,-28 -4,-12 -6,-35 -6,-70l0 -203 -36 0 0 -47 36 0 0 -88 49 -36 0 123 50 0 0 47 -50 0 0 207c0,19 1,31 4,37 4,8 12,12 24,12 6,0 13,-1 22,-2zm46 -365l0 -69 49 0 0 69 -49 0zm0 419l0 -353 49 0 0 353 -49 0zm124 0l0 -353 44 0 0 50c11,-20 24,-34 39,-44 15,-10 33,-15 53,-15 15,0 30,3 43,9 13,6 24,14 32,24 8,10 14,23 18,38 4,16 6,40 6,73l0 217 -49 0 0 -215c0,-26 -2,-45 -7,-57 -4,-12 -11,-21 -21,-28 -9,-7 -20,-10 -33,-10 -24,0 -42,9 -56,26 -14,17 -21,48 -21,90l0 193 -49 0zm302 29l48 9c2,19 9,33 20,42 11,9 26,14 46,14 22,0 39,-5 51,-15 13,-10 21,-26 26,-46 3,-12 4,-39 4,-79 -11,15 -23,27 -36,35 -13,8 -28,12 -44,12 -35,0 -63,-15 -86,-44 -26,-34 -39,-79 -39,-135 0,-38 6,-71 17,-100 11,-28 27,-49 45,-63 19,-13 40,-20 63,-20 17,0 33,4 47,13 14,8 27,21 37,38l0 -43 45 0 0 306c0,54 -4,93 -13,116 -9,23 -23,41 -44,55 -20,14 -45,20 -73,20 -37,0 -66,-10 -87,-30 -20,-20 -30,-48 -29,-84zm41 -212c0,46 8,80 23,101 15,21 34,32 56,32 22,0 41,-10 57,-31 16,-21 23,-54 23,-100 0,-44 -8,-77 -24,-99 -16,-22 -35,-32 -58,-32 -20,0 -38,11 -54,32 -15,22 -23,54 -23,96zm624 139c-16,17 -33,30 -51,39 -18,9 -36,13 -55,13 -30,0 -54,-9 -72,-27 -18,-18 -27,-43 -27,-74 0,-20 4,-39 13,-54 8,-16 20,-28 35,-37 15,-9 37,-15 67,-20 40,-6 69,-13 88,-21l0 -15c0,-24 -4,-41 -13,-51 -12,-14 -31,-21 -56,-21 -23,0 -40,5 -51,14 -11,9 -20,27 -25,53l-48 -8c7,-38 21,-66 42,-83 21,-17 51,-26 90,-26 30,0 54,6 72,17 17,11 28,26 33,42 5,17 7,41 7,74l0 80c0,56 1,91 3,106 2,15 6,29 12,42l-51 0c-5,-12 -8,-27 -10,-44zm-4 -134c-18,9 -45,16 -80,23 -21,4 -35,8 -43,12 -8,5 -15,11 -19,19 -5,8 -7,18 -7,29 0,17 5,30 16,40 10,10 25,15 43,15 18,0 34,-5 48,-14 14,-9 25,-21 32,-36 7,-15 11,-37 11,-66l0 -22zm287 177l0 -488 53 0 0 242 199 -242 72 0 -168 198 175 290 -70 0 -142 -247 -66 78 0 169 -53 0zm367 0l0 -353 44 0 0 50c11,-20 24,-34 39,-44 15,-10 33,-15 53,-15 15,0 30,3 43,9 13,6 24,14 32,24 8,10 14,23 18,38 4,16 6,40 6,73l0 217 -49 0 0 -215c0,-26 -2,-45 -7,-57 -4,-12 -11,-21 -21,-28 -9,-7 -20,-10 -33,-10 -24,0 -42,9 -56,26 -14,17 -21,48 -21,90l0 193 -49 0zm293 -177c0,-61 13,-107 39,-138 26,-31 58,-47 97,-47 39,0 71,16 97,47 26,31 39,76 39,134 0,64 -13,111 -38,142 -26,31 -58,47 -97,47 -39,0 -71,-16 -97,-47 -26,-31 -39,-77 -39,-138zm50 0c0,46 8,80 25,102 17,22 37,34 62,34 23,0 43,-11 59,-34 17,-22 25,-56 25,-102 0,-45 -8,-79 -25,-102 -17,-22 -37,-33 -62,-33 -23,0 -43,11 -60,34 -16,22 -25,56 -25,101zm332 177l-89 -353 51 0 46 204 17 76 15 -73 46 -207 51 0 43 205 15 68 17 -68 50 -204 48 0 -91 353 -51 0 -46 -212 -11 -60 -59 272 -52 0zm349 0l0 -488 49 0 0 488 -49 0zm324 -114l51 8c-8,38 -24,66 -46,85 -22,19 -49,29 -82,29 -41,0 -74,-16 -100,-47 -25,-31 -38,-76 -38,-135 0,-61 13,-108 38,-140 26,-32 58,-48 97,-48 37,0 69,16 94,47 25,32 38,77 38,137l0 16 -216 0c2,40 11,70 28,90 16,20 36,30 60,30 37,0 62,-24 77,-73zm-161 -97l162 0c-2,-31 -9,-53 -20,-69 -16,-22 -36,-33 -60,-33 -22,0 -41,9 -56,27 -16,18 -24,43 -26,74zm462 211l0 -45c-9,17 -20,30 -34,39 -14,9 -29,13 -45,13 -34,0 -64,-16 -89,-48 -25,-32 -37,-78 -37,-136 0,-40 6,-74 17,-102 11,-28 26,-49 44,-62 19,-14 39,-20 62,-20 16,0 31,4 45,13 14,9 25,20 34,36l0 -175 49 0 0 488 -46 0zm-155 -176c0,46 8,80 24,102 16,22 34,33 55,33 21,0 39,-11 54,-32 15,-21 23,-53 23,-96 0,-50 -8,-86 -23,-108 -15,-23 -35,-34 -58,-34 -21,0 -38,11 -53,33 -15,22 -22,56 -22,103zm269 206l48 9c2,19 9,33 20,42 11,9 26,14 46,14 22,0 39,-5 51,-15 13,-10 21,-26 26,-46 3,-12 4,-39 4,-79 -11,15 -23,27 -36,35 -13,8 -28,12 -44,12 -35,0 -63,-15 -86,-44 -26,-34 -39,-79 -39,-135 0,-38 6,-71 17,-100 11,-28 27,-49 45,-63 19,-13 40,-20 63,-20 17,0 33,4 47,13 14,8 27,21 37,38l0 -43 45 0 0 306c0,54 -4,93 -13,116 -9,23 -23,41 -44,55 -20,14 -45,20 -73,20 -37,0 -66,-10 -87,-30 -20,-20 -30,-48 -29,-84zm41 -212c0,46 8,80 23,101 15,21 34,32 56,32 22,0 41,-10 57,-31 16,-21 23,-54 23,-100 0,-44 -8,-77 -24,-99 -16,-22 -35,-32 -58,-32 -20,0 -38,11 -54,32 -15,22 -23,54 -23,96zm478 69l51 8c-8,38 -24,66 -46,85 -22,19 -49,29 -82,29 -41,0 -74,-16 -100,-47 -25,-31 -38,-76 -38,-135 0,-61 13,-108 38,-140 26,-32 58,-48 97,-48 37,0 69,16 94,47 25,32 38,77 38,137l0 16 -216 0c2,40 11,70 28,90 16,20 36,30 60,30 37,0 62,-24 77,-73zm-161 -97l162 0c-2,-31 -9,-53 -20,-69 -16,-22 -36,-33 -60,-33 -22,0 -41,9 -56,27 -16,18 -24,43 -26,74zm433 211l0 -488 53 0 0 430 197 0 0 58 -250 0zm307 -419l0 -69 49 0 0 69 -49 0zm0 419l0 -353 49 0 0 353 -49 0zm234 -54l7 53c-14,4 -26,5 -37,5 -17,0 -31,-3 -41,-10 -10,-7 -18,-16 -21,-28 -4,-12 -6,-35 -6,-70l0 -203 -36 0 0 -47 36 0 0 -88 49 -36 0 123 50 0 0 47 -50 0 0 207c0,19 1,31 4,37 4,8 12,12 24,12 6,0 13,-1 22,-2zm279 54l-106 -488 54 0 61 320c6,33 12,66 17,100l18 -90 76 -329 64 0 57 247c14,60 24,118 31,173 5,-32 12,-67 20,-106l63 -314 53 0 -110 488 -51 0 -85 -372 -13 -57c-4,21 -8,40 -12,57l-85 372 -54 0zm422 -177c0,-61 13,-107 39,-138 26,-31 58,-47 97,-47 39,0 71,16 97,47 26,31 39,76 39,134 0,64 -13,111 -38,142 -26,31 -58,47 -97,47 -39,0 -71,-16 -97,-47 -26,-31 -39,-77 -39,-138zm50 0c0,46 8,80 25,102 17,22 37,34 62,34 23,0 43,-11 59,-34 17,-22 25,-56 25,-102 0,-45 -8,-79 -25,-102 -17,-22 -37,-33 -62,-33 -23,0 -43,11 -60,34 -16,22 -25,56 -25,101zm279 177l0 -353 44 0 0 54c11,-25 22,-41 31,-49 9,-8 20,-12 32,-12 16,0 33,6 50,19l-17 56c-12,-9 -24,-13 -36,-13 -10,0 -20,4 -29,11 -9,7 -15,17 -18,31 -6,23 -9,47 -9,73l0 185 -49 0zm185 0l0 -488 49 0 0 488 -49 0zm314 0l0 -45c-9,17 -20,30 -34,39 -14,9 -29,13 -45,13 -34,0 -64,-16 -89,-48 -25,-32 -37,-78 -37,-136 0,-40 6,-74 17,-102 11,-28 26,-49 44,-62 19,-14 39,-20 62,-20 16,0 31,4 45,13 14,9 25,20 34,36l0 -175 49 0 0 488 -46 0zm-155 -176c0,46 8,80 24,102 16,22 34,33 55,33 21,0 39,-11 54,-32 15,-21 23,-53 23,-96 0,-50 -8,-86 -23,-108 -15,-23 -35,-34 -58,-34 -21,0 -38,11 -53,33 -15,22 -22,56 -22,103z"/> + <g> + <path class="fil5" d="M4021 272c926,0 1680,755 1680,1680 0,926 -755,1680 -1680,1680 -925,0 -1680,-755 -1680,-1680 0,-925 755,-1680 1680,-1680z"/> + <path class="fil6" d="M4021 506c797,0 1446,650 1446,1446 0,797 -650,1446 -1446,1446 -797,0 -1446,-650 -1446,-1446 0,-797 650,-1446 1446,-1446z"/> + <path class="fil7" d="M3261 397c179,-97 445,426 751,426 312,28 574,-505 750,-433 187,79 -56,613 135,852 172,262 753,134 806,316 55,196 -514,339 -582,637 -97,298 365,672 255,828 -119,165 -585,-191 -861,-58 -293,110 -298,704 -488,716 -203,10 -216,-577 -491,-709 -269,-161 -736,207 -864,65 -134,-153 316,-528 248,-826 -42,-311 -620,-447 -589,-635 36,-200 610,-82 801,-321 217,-226 -37,-764 129,-856z"/> + <path class="fil5" d="M3307 469c126,-53 405,440 705,428 323,26 609,-483 726,-424 120,66 -92,591 105,818 181,269 757,175 784,303 23,135 -519,297 -574,592 -98,309 335,701 252,802 -91,102 -555,-221 -820,-80 -302,117 -339,699 -470,697 -137,-7 -174,-572 -449,-691 -280,-164 -758,171 -838,67 -80,-111 339,-492 260,-782 -46,-321 -606,-486 -575,-613 38,-132 596,-42 774,-284 222,-236 2,-777 121,-832z"/> + <path class="fil8" d="M3014 1959c0,552 449,1001 1001,1001 552,0 1001,-449 1001,-1001 0,-552 -449,-1000 -1001,-1000 -552,0 -1001,449 -1001,1000zm1001 -990c546,0 990,444 990,990 0,546 -444,990 -990,990 -546,0 -990,-444 -990,-990 0,-546 444,-990 990,-990z"/> + <path class="fil9" d="M4013 962c546,0 991,445 991,991 0,546 -445,991 -991,991 -546,0 -991,-445 -991,-991 0,-546 445,-991 991,-991z"/> + <path class="fil10" d="M3543 1083c86,-20 247,10 470,90l8 3 -5 -7c-54,-75 -110,-138 -170,-192l-3 4c60,54 115,117 170,191l3 -4c-224,-80 -382,-110 -469,-91l-2 5z"/> + <path class="fil10" d="M3069 2289c-8,-143 5,-275 37,-392 33,-120 88,-227 163,-320 77,-95 178,-177 299,-243 124,-68 274,-122 445,-160l0 -5c-239,-12 -436,14 -587,76 -152,63 -261,165 -325,303l5 2c63,-137 172,-238 322,-300 151,-63 348,-88 585,-76l0 -5c-172,38 -322,93 -447,161 -122,67 -223,149 -301,244 -76,93 -131,201 -164,322 -33,117 -45,250 -37,394l5 0z"/> + <path class="fil10" d="M3793 2933c-27,-383 -23,-723 13,-1012 36,-298 107,-550 210,-749l4 -8 -7 4c-131,74 -244,159 -338,254 -97,98 -176,210 -234,331 -60,125 -100,265 -118,416 -19,155 -17,326 8,508l5 -1c-24,-182 -27,-352 -8,-507 19,-150 58,-289 118,-414 58,-121 136,-232 233,-330 93,-95 207,-180 337,-253l-4 -3c-103,200 -174,452 -211,750 -35,289 -40,630 -13,1013l5 0z"/> + <path class="fil10" d="M4481 1078c-87,-20 -244,10 -468,90l3 4c54,-75 110,-137 169,-191l-3 -4c-60,54 -115,117 -170,191l-5 7 8 -3c223,-79 379,-110 465,-90l1 -5z"/> + <path class="fil10" d="M4963 2276c8,-143 -5,-275 -37,-391 -33,-119 -89,-226 -165,-318 -77,-94 -179,-174 -301,-240 -124,-67 -274,-120 -446,-159l0 5c237,-12 433,14 584,76 150,62 258,163 321,300l5 -2c-64,-138 -173,-239 -324,-302 -151,-63 -348,-88 -586,-76l0 5c171,38 320,92 444,158 122,65 222,146 299,239 75,91 130,197 164,316 32,116 45,247 37,390l5 0z"/> + <path class="fil10" d="M4307 2907c25,-358 9,-694 -47,-1000 -50,-274 -132,-522 -244,-738l-4 3c130,73 243,158 336,253 96,98 174,208 232,329 59,124 99,263 117,413 19,154 16,327 -8,509l5 -3c24,-182 27,-352 8,-507 -19,-150 -58,-289 -118,-414 -58,-121 -136,-232 -233,-330 -93,-95 -207,-180 -337,-253l-7 -4 4 8c111,215 193,463 243,736 56,305 72,641 47,999l5 0z"/> + <path class="fil10" d="M3030 2182c84,236 291,370 449,441 200,90 409,120 537,118 155,-2 344,-50 506,-129 145,-71 344,-202 464,-427l-5 -2c-120,224 -317,354 -462,425 -161,78 -350,127 -504,129 -128,2 -336,-28 -535,-118 -157,-71 -362,-204 -446,-438l-5 2z"/> + <path class="fil10" d="M3047 1692c-35,176 8,342 123,482 174,211 499,341 846,338 169,-1 334,-32 479,-90 148,-59 271,-144 355,-247 114,-139 157,-307 123,-488l-5 1c34,178 -8,346 -122,483 -84,102 -206,187 -353,245 -144,57 -309,88 -477,89 -346,2 -669,-127 -842,-337 -114,-138 -156,-303 -122,-477l-5 -1z"/> + <path class="fil10" d="M3238 1328c-128,150 -159,312 -88,469 115,255 479,444 866,451 183,3 371,-44 530,-131 154,-86 270,-203 324,-331 34,-79 44,-158 29,-236 -16,-84 -60,-163 -131,-236l-4 4c70,72 114,150 130,233 15,77 5,155 -29,233 -115,268 -480,465 -849,459 -385,-7 -748,-195 -862,-448 -70,-155 -39,-315 88,-463l-4 -3z"/> + <path class="fil10" d="M3508 1092c-196,141 -277,320 -222,490 34,105 121,200 243,267 132,71 298,109 483,108 186,-1 355,-48 487,-136 120,-80 202,-187 229,-303 19,-81 11,-161 -24,-233 -38,-77 -105,-141 -199,-190l-2 5c93,48 159,111 196,188 35,70 43,150 24,229 -50,208 -294,433 -712,435 -358,2 -648,-147 -721,-371 -55,-168 26,-344 220,-484l-3 -4z"/> + <path class="fil10" d="M3729 1004c-92,56 -158,118 -196,185 -34,60 -44,124 -27,185 42,160 251,276 506,283 126,3 250,-28 349,-87 95,-57 157,-135 176,-219 14,-64 1,-129 -38,-187 -44,-65 -118,-121 -222,-166l-2 5c102,45 176,101 220,165 38,57 51,121 37,183 -40,176 -268,309 -520,302 -253,-7 -460,-121 -502,-279 -16,-60 -7,-121 27,-181 37,-66 108,-132 199,-188l-8 0z"/> + <path class="fil10" d="M3752 1234c0,41 28,82 76,112 50,31 116,48 186,48 146,0 274,-75 274,-160 0,-41 -29,-80 -82,-109 -52,-29 -120,-45 -192,-45 -71,0 -137,16 -186,45 -49,29 -76,68 -76,109zm262 -149c146,0 269,68 269,149 0,83 -125,155 -269,155 -139,0 -256,-71 -256,-155 0,-84 113,-149 256,-149z"/> + <polygon class="fil10" points="4010,1170 4015,1170 4015,966 4010,966 "/> + <path class="fil10" d="M3006 1958c0,552 449,1000 1000,1000 552,0 1000,-449 1000,-1000 0,-552 -449,-1000 -1000,-1000 -551,0 -1000,449 -1000,1000zm1000 -990c546,0 990,444 990,990 0,546 -444,990 -990,990 -546,0 -990,-444 -990,-990 0,-546 444,-990 990,-990z"/> + <path class="fil11 str0" d="M3006 1958c0,552 449,1000 1000,1000 552,0 1000,-449 1000,-1000 0,-552 -449,-1000 -1000,-1000 -551,0 -1000,449 -1000,1000zm1000 -990c546,0 990,444 990,990 0,546 -444,990 -990,990 -546,0 -990,-444 -990,-990 0,-546 444,-990 990,-990z"/> + <path class="fil10" d="M4019 756l-15 0 0 -71 15 0 0 71zm31 31l0 118c0,5 -3,8 -5,8l-3 0 0 -11c0,-19 -7,-31 -18,-31l-24 0c-11,0 -18,12 -18,31l0 11 0 0c-2,0 -5,-4 -5,-8l0 -118c0,-5 3,-8 5,-8l1 0c2,13 8,21 17,21l24 0c9,0 15,-8 17,-21l4 0c2,0 5,4 5,8zm-46 115c0,-4 1,-7 1,-9l13 0c1,2 1,5 1,9l0 11 -15 0 0 -11zm15 105l-15 0 0 -71 15 0 0 71zm31 30l0 118c0,5 -3,8 -5,8l-3 0 0 -11c0,-19 -7,-31 -18,-31l-24 0c-11,0 -18,12 -18,31l0 11 0 0c-2,0 -5,-4 -5,-8l0 -118c0,-5 3,-8 5,-8l1 0c2,13 8,21 17,21l24 0c9,0 15,-8 17,-21l4 0c2,0 5,4 5,8zm-46 115c0,-4 1,-7 1,-9l13 0c1,2 1,5 1,9l0 11 -15 0 0 -11zm15 105l-15 0 0 -71 15 0 0 71zm31 31l0 118c0,5 -3,8 -5,8l-3 0 0 -11c0,-19 -7,-31 -18,-31l-24 0c-11,0 -18,12 -18,31l0 11 0 0c-2,0 -5,-3 -5,-8l0 -118c0,-5 3,-8 5,-8l1 0c2,13 8,21 17,21l24 0c9,0 15,-8 17,-21l4 0c2,0 5,4 5,8zm-46 115c0,-4 1,-7 1,-9l13 0c1,2 1,5 1,9l0 11 -15 0 0 -11zm15 110l-15 0 0 -77 15 0 0 77zm27 30l0 118c0,5 -3,8 -5,8l-3 0 0 -11c0,-19 -7,-31 -18,-31l-25 0c-11,0 -18,12 -18,31l0 11 0 0c-2,0 -5,-3 -5,-8l0 -118c0,-5 3,-8 5,-8l7 0c3,9 8,15 15,15l24 0c7,0 13,-6 15,-15l2 0c2,0 5,4 5,8zm-46 115c0,-4 0,-7 1,-9l13 0c1,2 1,5 1,9l0 11 -15 0 0 -11zm15 117c0,4 0,7 -1,9l-13 0c0,-2 -1,-5 -1,-9l0 -83 15 0 0 83zm-11 -1121c0,-4 1,-7 1,-9l13 0c1,2 1,5 1,9l0 11 -15 0 0 -11zm-23 11c-2,0 -5,-4 -5,-8l0 -118c0,-5 3,-8 5,-8l64 0c2,0 5,4 5,8l0 118c0,5 -3,8 -5,8l-3 0 0 -11c0,-19 -7,-31 -18,-31l-24 0c-11,0 -18,12 -18,31l0 11 0 0zm64 22c15,0 28,-14 28,-30l0 -118c0,-17 -12,-30 -28,-30l-64 0c-15,0 -28,14 -28,30l0 118c0,17 12,30 28,30l0 0 0 71 0 0c-15,0 -28,14 -28,31l0 118c0,17 12,31 28,31l0 0 0 71 0 0c-15,0 -28,14 -28,30l0 118c0,17 12,31 28,31l0 0 0 71 0 0c-15,0 -28,14 -28,31l0 118c0,17 12,30 28,30l0 0 0 77 -4 0c-15,0 -28,14 -28,30l0 118c0,17 12,31 28,31l0 0 0 83c0,19 7,31 18,31l25 0c11,0 18,-12 18,-31l0 -83 3 0c15,0 28,-14 28,-31l0 -118c0,-17 -12,-30 -27,-30l0 -77 3 0c15,0 28,-14 28,-30l0 -118c0,-17 -12,-31 -28,-31l-3 0 0 -71 3 0c15,0 28,-14 28,-31l0 -118c0,-17 -12,-30 -28,-30l-3 0 0 -71 3 0c15,0 28,-14 28,-31l0 -118c0,-17 -12,-31 -28,-31l-3 0 0 -71 3 0z"/> + <path class="fil12" d="M3465 2569l1079 0c9,0 23,11 16,16 -48,34 -80,66 -66,88 5,7 -7,16 -16,16l-959 0c-9,0 -19,-8 -16,-16 9,-29 -13,-59 -54,-88 -7,-5 7,-16 16,-16z"/> + <path class="fil13" d="M4487 2676c-1,2 -5,4 -9,4l-959 0c-3,0 -6,-2 -8,-4 -1,-1 -1,-1 -1,-1 10,-30 -8,-61 -53,-94 2,-2 5,-4 8,-4l1079 0c2,0 5,2 8,4 -40,29 -82,66 -65,95zm83 -98c-3,-9 -17,-17 -26,-17l-1079 0c-9,0 -23,8 -26,17 -2,5 0,11 5,14 41,29 58,55 51,78 -2,6 -1,11 3,16 5,6 13,11 21,11l959 0c9,0 20,-6 24,-13 3,-5 3,-11 0,-16 -6,-9 -1,-30 63,-76 5,-3 7,-9 5,-14z"/> + <path class="fil12" d="M3555 2720l901 0c17,0 31,11 31,24l0 33c0,13 -14,24 -31,24l-901 0c-17,0 -31,-11 -31,-24l0 -33c0,-13 14,-24 31,-24z"/> + <path class="fil13" d="M4478 2777c0,8 -10,16 -23,16l-901 0c-12,0 -23,-7 -23,-16l0 -33c0,-8 10,-16 23,-16l901 0c12,0 23,7 23,16l0 33zm-23 -65l-901 0c-22,0 -39,15 -39,32l0 33c0,18 18,32 39,32l901 0c22,0 39,-14 39,-32l0 -33c0,-18 -18,-32 -39,-32z"/> + <path class="fil12" d="M3554 2837l901 0c17,0 31,9 31,19l0 27c0,11 -14,19 -31,19l-901 0c-17,0 -31,-9 -31,-19l0 -27c0,-11 14,-19 31,-19z"/> + <path class="fil13" d="M4477 2883c0,4 -9,11 -22,11l-901 0c-14,0 -23,-7 -23,-11l0 -27c0,-4 9,-11 23,-11l901 0c7,0 13,2 17,4 3,2 5,5 5,7l0 27zm4 -48c-7,-4 -17,-7 -26,-7l-901 0c-22,0 -39,12 -39,28l0 27c0,15 17,28 39,28l901 0c22,0 39,-12 39,-28l0 -27c0,-8 -5,-16 -13,-21z"/> + <path class="fil12" d="M3807 2938l393 0c13,0 24,44 24,99 -176,7 -107,99 -120,99l-194 0c-13,0 46,-91 -127,-99 0,-54 11,-99 24,-99z"/> + <path class="fil13" d="M4105 3067c-16,21 -11,45 -8,59 0,0 0,0 0,1l-179 0c0,-1 0,-1 0,-2 2,-13 5,-37 -13,-58 -19,-23 -56,-35 -113,-38 1,-49 11,-79 16,-83l392 0c6,3 15,33 16,83 -57,3 -94,16 -111,39zm96 -138l-393 0c-26,0 -32,67 -32,107l0 8 8 0c55,2 92,14 108,33 13,15 11,33 9,45 -1,7 -2,13 2,17 2,2 5,4 8,4l194 0c3,0 6,-1 8,-4 4,-4 2,-10 1,-17 -3,-12 -7,-29 5,-45 15,-19 51,-30 107,-33l8 0 0 -8c0,-40 -7,-107 -32,-107z"/> + <path class="fil12" d="M4007 2531l-155 0c8,-29 26,-48 55,-55 28,-76 -46,-64 -50,-181 -21,-143 112,-205 137,-328 -85,-58 -82,-127 13,-180 95,53 98,122 13,180 25,123 157,185 137,328 -4,117 -78,106 -50,181 29,8 47,26 55,55l-155 0z"/> + <path class="fil13" d="M3864 2522c8,-20 23,-33 45,-39l4 -1 2 -4c15,-42 2,-61 -14,-83 -15,-20 -33,-45 -35,-101l0 0 0 0c-11,-80 27,-133 67,-189 29,-40 59,-82 70,-136l1 -5 -5 -3c-39,-27 -59,-55 -57,-83 1,-28 24,-56 66,-80 42,24 64,51 66,80 1,28 -19,57 -57,83l-5 3 1 6c11,53 41,95 70,136 40,56 78,109 67,189l0 0 0 0c-2,56 -20,81 -35,101 -16,22 -30,41 -14,83l2 4 4 1c22,6 37,19 45,39l-143 0 -143 0zm306 6c-8,-30 -27,-50 -56,-59 -10,-31 -2,-44 13,-64 16,-22 36,-49 38,-111l0 1c13,-87 -29,-145 -70,-201 -27,-38 -55,-77 -66,-124 40,-29 61,-61 60,-94 -2,-35 -29,-69 -78,-96l-4 -2 -4 2c-50,28 -77,61 -78,96 -2,33 20,65 60,94 -11,47 -39,87 -66,125 -40,56 -82,115 -70,201l0 -1c2,61 22,89 38,111 15,20 23,33 13,64 -29,9 -48,29 -56,59l-3 11 11 0 155 0 155 0 11 0 -3 -11z"/> + <path class="fil13" d="M4557 2528c-61,16 -110,-59 -110,-205 0,-146 90,-348 86,-310 -4,45 -32,146 15,275 41,112 116,213 9,240z"/> + <path class="fil12" d="M3907 3172l201 0c9,0 37,50 37,109 0,59 -7,107 -16,107 -43,0 -82,115 -125,115 -42,0 -88,-115 -130,-115 -9,0 -16,-48 -16,-107 0,-59 40,-109 49,-109z"/> + <path class="fil13" d="M4126 3380c-25,2 -45,31 -66,61 -18,25 -39,54 -56,54 -17,0 -39,-29 -58,-54 -23,-30 -45,-58 -68,-60 -4,-7 -10,-40 -10,-99 0,-53 34,-96 41,-101l198 0c8,6 30,50 30,101 0,59 -7,92 -11,99zm-18 -217l-201 0c-18,0 -57,60 -57,118 0,53 4,115 24,115 17,0 39,29 58,54 24,31 47,61 72,61 26,0 47,-30 69,-61 18,-25 38,-54 56,-54 20,0 24,-63 24,-115 0,-56 -27,-118 -45,-118z"/> + </g> + <path class="fil14" d="M3270 4935l-157 0 0 -738 -226 652c-22,62 -56,94 -103,94 -48,0 -81,-28 -99,-84l-220 -648 0 725 -157 0 0 -915c0,-48 8,-83 23,-104 24,-33 55,-49 94,-49 58,0 102,41 130,124l230 683 243 -703c24,-68 65,-102 122,-102 38,0 67,13 88,40 21,26 31,63 31,112l0 915zm1028 0l-207 0 -304 -457c-19,-28 -28,-55 -28,-80 0,-31 10,-62 29,-93l267 -429 192 0 -329 514 381 544zm-546 0l-168 0 0 -1059 168 0 0 1059zm1250 -163l0 163c-89,-1 -152,-3 -189,-7 -93,-10 -178,-46 -256,-109 -70,-56 -121,-125 -155,-207 -26,-62 -39,-130 -39,-204 0,-158 56,-289 169,-394 86,-80 185,-124 295,-133 38,-3 96,-5 174,-5l0 164c-18,0 -30,0 -35,0 -83,0 -140,5 -174,15 -80,23 -145,69 -194,138 -44,62 -67,134 -67,214 0,66 16,125 49,180 50,83 119,138 208,165 40,12 95,19 166,19 8,1 24,1 47,1zm723 163l-318 0c-62,0 -106,-12 -130,-36 -24,-24 -36,-67 -36,-129l0 -894 168 0 0 895 316 0 0 163z"/> + </g> + </g> +</svg> diff --git a/app/src/assets/logo_mkcl_w.svg b/app/src/assets/logo_mkcl_w.svg new file mode 100644 index 0000000000000000000000000000000000000000..c6f49975a7a939a740aa775b276585d7d0a7b07b --- /dev/null +++ b/app/src/assets/logo_mkcl_w.svg @@ -0,0 +1,109 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Creator: CorelDRAW X6 --> +<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="8in" height="6in" version="1.1" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd" +viewBox="0 0 8000 6000" + xmlns:xlink="http://www.w3.org/1999/xlink"> + <defs> + <style type="text/css"> + <![CDATA[ + .str0 {stroke:#848688;stroke-width:3} + .fil11 {fill:none;fill-rule:nonzero} + .fil7 {fill:#96989A} + .fil5 {fill:#C7C9CB} + .fil13 {fill:#F37435} + .fil12 {fill:#FFCC29} + .fil6 {fill:#FEFEFE} + .fil8 {fill:#848587;fill-rule:nonzero} + .fil10 {fill:#848688;fill-rule:nonzero} + .fil4 {fill:#FFFFFF;fill-rule:nonzero} + .fil14 {fill:#F58634;fill-rule:nonzero} + .fil9 {fill:#FEFEFE;fill-rule:nonzero} + .fil2 {fill:url(#id0)} + .fil1 {fill:url(#id1)} + .fil3 {fill:url(#id2)} + .fil0 {fill:url(#id3)} + ]]> + </style> + <linearGradient id="id0" gradientUnits="userSpaceOnUse" x1="7065.15" y1="1389.45" x2="7236.49" y2="1218.11"> + <stop offset="0" style="stop-color:#64B074"/> + <stop offset="1" style="stop-color:#98BD26"/> + </linearGradient> + <linearGradient id="id1" gradientUnits="userSpaceOnUse" x1="6440.12" y1="1620.81" x2="6735.08" y2="1325.85"> + <stop offset="0" style="stop-color:#209CBA"/> + <stop offset="1" style="stop-color:#1B7387"/> + </linearGradient> + <linearGradient id="id2" gradientUnits="userSpaceOnUse" xlink:href="#id1" x1="6531.31" y1="1216.64" x2="6797" y2="950.957"> + </linearGradient> + <linearGradient id="id3" gradientUnits="userSpaceOnUse" xlink:href="#id1" x1="7060.18" y1="1834.44" x2="7194.5" y2="1700.12"> + </linearGradient> + </defs> +<symbol id="Symbol6" viewBox="7060 1701 129 131"> + <path class="fil0" d="M7151 1701l-54 0c-35,0 -37,37 -37,37l0 52c0,44 39,42 39,42l47 0c49,0 42,-47 42,-47l0 -44c0,-39 -37,-39 -37,-39z"/> +</symbol> +<symbol id="Symbol2" viewBox="7060 1701 129 131"> + <path class="fil0" d="M7151 1701l-54 0c-35,0 -37,37 -37,37l0 52c0,44 39,42 39,42l47 0c49,0 42,-47 42,-47l0 -44c0,-39 -37,-39 -37,-39z"/> +</symbol> +<symbol id="Symbol7" viewBox="6456 1336 280 271"> + <path class="fil1" d="M6736 1507l0 -77c0,-104 -86,-95 -86,-95l-108 9c-104,9 -86,117 -86,117l0 72c-5,86 86,72 86,72l99 -5c86,-9 95,-95 95,-95z"/> +</symbol> +<symbol id="Symbol3" viewBox="7064 1219 164 167"> + <path class="fil2" d="M7181 1219l-69 0c-44,0 -47,47 -47,47l0 66c0,57 50,53 50,53l60 0c63,0 53,-60 53,-60l0 -57c0,-50 -47,-50 -47,-50z"/> +</symbol> +<symbol id="Symbol4" viewBox="6546 962 245 244"> + <path class="fil3" d="M6547 1084c0,0 -18,-113 95,-117l68 -5c0,0 81,-9 81,72l0 63c0,0 9,95 -77,99l-90 9c0,0 -77,9 -77,-59l0 -63z"/> +</symbol> +<symbol id="Symbol1" viewBox="6456 1336 280 271"> + <path class="fil1" d="M6736 1507l0 -77c0,-104 -86,-95 -86,-95l-108 9c-104,9 -86,117 -86,117l0 72c-5,86 86,72 86,72l99 -5c86,-9 95,-95 95,-95z"/> +</symbol> +<symbol id="Symbol8" viewBox="6546 962 245 244"> + <path class="fil3" d="M6547 1084c0,0 -18,-113 95,-117l68 -5c0,0 81,-9 81,72l0 63c0,0 9,95 -77,99l-90 9c0,0 -77,9 -77,-59l0 -63z"/> +</symbol> +<symbol id="Symbol5" viewBox="7064 1219 164 167"> + <path class="fil2" d="M7181 1219l-69 0c-44,0 -47,47 -47,47l0 66c0,57 50,53 50,53l60 0c63,0 53,-60 53,-60l0 -57c0,-50 -47,-50 -47,-50z"/> +</symbol> + <g id="Layer_x0020_1"> + <metadata id="CorelCorpID_0Corel-Layer"/> + <g id="_880697104"> + <path class="fil4" d="M427 5469l53 16c-12,55 -32,96 -62,123 -29,27 -65,40 -107,40 -37,0 -69,-9 -95,-27 -26,-18 -48,-47 -65,-87 -17,-40 -25,-87 -25,-141 0,-54 8,-99 25,-136 17,-37 39,-65 68,-84 29,-19 61,-28 96,-28 39,0 72,12 100,36 28,24 47,59 58,106l-52 15c-18,-68 -53,-102 -107,-102 -27,0 -50,7 -69,20 -20,14 -35,35 -47,64 -12,29 -17,65 -17,110 0,67 12,117 35,150 24,33 55,50 94,50 29,0 54,-10 75,-31 21,-21 35,-52 42,-93zm112 171l0 -353 44 0 0 54c11,-25 22,-41 31,-49 9,-8 20,-12 32,-12 16,0 33,6 50,19l-17 56c-12,-9 -24,-13 -36,-13 -10,0 -20,4 -29,11 -9,7 -15,17 -18,31 -6,23 -9,47 -9,73l0 185 -49 0zm385 -114l51 8c-8,38 -24,66 -46,85 -22,19 -49,29 -82,29 -41,0 -74,-16 -100,-47 -25,-31 -38,-76 -38,-135 0,-61 13,-108 38,-140 26,-32 58,-48 97,-48 37,0 69,16 94,47 25,32 38,77 38,137l0 16 -216 0c2,40 11,70 28,90 16,20 36,30 60,30 37,0 62,-24 77,-73zm-161 -97l162 0c-2,-31 -9,-53 -20,-69 -16,-22 -36,-33 -60,-33 -22,0 -41,9 -56,27 -16,18 -24,43 -26,74zm463 167c-16,17 -33,30 -51,39 -18,9 -36,13 -55,13 -30,0 -54,-9 -72,-27 -18,-18 -27,-43 -27,-74 0,-20 4,-39 13,-54 8,-16 20,-28 35,-37 15,-9 37,-15 67,-20 40,-6 69,-13 88,-21l0 -15c0,-24 -4,-41 -13,-51 -12,-14 -31,-21 -56,-21 -23,0 -40,5 -51,14 -11,9 -20,27 -25,53l-48 -8c7,-38 21,-66 42,-83 21,-17 51,-26 90,-26 30,0 54,6 72,17 17,11 28,26 33,42 5,17 7,41 7,74l0 80c0,56 1,91 3,106 2,15 6,29 12,42l-51 0c-5,-12 -8,-27 -10,-44zm-4 -134c-18,9 -45,16 -80,23 -21,4 -35,8 -43,12 -8,5 -15,11 -19,19 -5,8 -7,18 -7,29 0,17 5,30 16,40 10,10 25,15 43,15 18,0 34,-5 48,-14 14,-9 25,-21 32,-36 7,-15 11,-37 11,-66l0 -22zm235 124l7 53c-14,4 -26,5 -37,5 -17,0 -31,-3 -41,-10 -10,-7 -18,-16 -21,-28 -4,-12 -6,-35 -6,-70l0 -203 -36 0 0 -47 36 0 0 -88 49 -36 0 123 50 0 0 47 -50 0 0 207c0,19 1,31 4,37 4,8 12,12 24,12 6,0 13,-1 22,-2zm46 -365l0 -69 49 0 0 69 -49 0zm0 419l0 -353 49 0 0 353 -49 0zm124 0l0 -353 44 0 0 50c11,-20 24,-34 39,-44 15,-10 33,-15 53,-15 15,0 30,3 43,9 13,6 24,14 32,24 8,10 14,23 18,38 4,16 6,40 6,73l0 217 -49 0 0 -215c0,-26 -2,-45 -7,-57 -4,-12 -11,-21 -21,-28 -9,-7 -20,-10 -33,-10 -24,0 -42,9 -56,26 -14,17 -21,48 -21,90l0 193 -49 0zm302 29l48 9c2,19 9,33 20,42 11,9 26,14 46,14 22,0 39,-5 51,-15 13,-10 21,-26 26,-46 3,-12 4,-39 4,-79 -11,15 -23,27 -36,35 -13,8 -28,12 -44,12 -35,0 -63,-15 -86,-44 -26,-34 -39,-79 -39,-135 0,-38 6,-71 17,-100 11,-28 27,-49 45,-63 19,-13 40,-20 63,-20 17,0 33,4 47,13 14,8 27,21 37,38l0 -43 45 0 0 306c0,54 -4,93 -13,116 -9,23 -23,41 -44,55 -20,14 -45,20 -73,20 -37,0 -66,-10 -87,-30 -20,-20 -30,-48 -29,-84zm41 -212c0,46 8,80 23,101 15,21 34,32 56,32 22,0 41,-10 57,-31 16,-21 23,-54 23,-100 0,-44 -8,-77 -24,-99 -16,-22 -35,-32 -58,-32 -20,0 -38,11 -54,32 -15,22 -23,54 -23,96zm624 139c-16,17 -33,30 -51,39 -18,9 -36,13 -55,13 -30,0 -54,-9 -72,-27 -18,-18 -27,-43 -27,-74 0,-20 4,-39 13,-54 8,-16 20,-28 35,-37 15,-9 37,-15 67,-20 40,-6 69,-13 88,-21l0 -15c0,-24 -4,-41 -13,-51 -12,-14 -31,-21 -56,-21 -23,0 -40,5 -51,14 -11,9 -20,27 -25,53l-48 -8c7,-38 21,-66 42,-83 21,-17 51,-26 90,-26 30,0 54,6 72,17 17,11 28,26 33,42 5,17 7,41 7,74l0 80c0,56 1,91 3,106 2,15 6,29 12,42l-51 0c-5,-12 -8,-27 -10,-44zm-4 -134c-18,9 -45,16 -80,23 -21,4 -35,8 -43,12 -8,5 -15,11 -19,19 -5,8 -7,18 -7,29 0,17 5,30 16,40 10,10 25,15 43,15 18,0 34,-5 48,-14 14,-9 25,-21 32,-36 7,-15 11,-37 11,-66l0 -22zm287 177l0 -488 53 0 0 242 199 -242 72 0 -168 198 175 290 -70 0 -142 -247 -66 78 0 169 -53 0zm367 0l0 -353 44 0 0 50c11,-20 24,-34 39,-44 15,-10 33,-15 53,-15 15,0 30,3 43,9 13,6 24,14 32,24 8,10 14,23 18,38 4,16 6,40 6,73l0 217 -49 0 0 -215c0,-26 -2,-45 -7,-57 -4,-12 -11,-21 -21,-28 -9,-7 -20,-10 -33,-10 -24,0 -42,9 -56,26 -14,17 -21,48 -21,90l0 193 -49 0zm293 -177c0,-61 13,-107 39,-138 26,-31 58,-47 97,-47 39,0 71,16 97,47 26,31 39,76 39,134 0,64 -13,111 -38,142 -26,31 -58,47 -97,47 -39,0 -71,-16 -97,-47 -26,-31 -39,-77 -39,-138zm50 0c0,46 8,80 25,102 17,22 37,34 62,34 23,0 43,-11 59,-34 17,-22 25,-56 25,-102 0,-45 -8,-79 -25,-102 -17,-22 -37,-33 -62,-33 -23,0 -43,11 -60,34 -16,22 -25,56 -25,101zm332 177l-89 -353 51 0 46 204 17 76 15 -73 46 -207 51 0 43 205 15 68 17 -68 50 -204 48 0 -91 353 -51 0 -46 -212 -11 -60 -59 272 -52 0zm349 0l0 -488 49 0 0 488 -49 0zm324 -114l51 8c-8,38 -24,66 -46,85 -22,19 -49,29 -82,29 -41,0 -74,-16 -100,-47 -25,-31 -38,-76 -38,-135 0,-61 13,-108 38,-140 26,-32 58,-48 97,-48 37,0 69,16 94,47 25,32 38,77 38,137l0 16 -216 0c2,40 11,70 28,90 16,20 36,30 60,30 37,0 62,-24 77,-73zm-161 -97l162 0c-2,-31 -9,-53 -20,-69 -16,-22 -36,-33 -60,-33 -22,0 -41,9 -56,27 -16,18 -24,43 -26,74zm462 211l0 -45c-9,17 -20,30 -34,39 -14,9 -29,13 -45,13 -34,0 -64,-16 -89,-48 -25,-32 -37,-78 -37,-136 0,-40 6,-74 17,-102 11,-28 26,-49 44,-62 19,-14 39,-20 62,-20 16,0 31,4 45,13 14,9 25,20 34,36l0 -175 49 0 0 488 -46 0zm-155 -176c0,46 8,80 24,102 16,22 34,33 55,33 21,0 39,-11 54,-32 15,-21 23,-53 23,-96 0,-50 -8,-86 -23,-108 -15,-23 -35,-34 -58,-34 -21,0 -38,11 -53,33 -15,22 -22,56 -22,103zm269 206l48 9c2,19 9,33 20,42 11,9 26,14 46,14 22,0 39,-5 51,-15 13,-10 21,-26 26,-46 3,-12 4,-39 4,-79 -11,15 -23,27 -36,35 -13,8 -28,12 -44,12 -35,0 -63,-15 -86,-44 -26,-34 -39,-79 -39,-135 0,-38 6,-71 17,-100 11,-28 27,-49 45,-63 19,-13 40,-20 63,-20 17,0 33,4 47,13 14,8 27,21 37,38l0 -43 45 0 0 306c0,54 -4,93 -13,116 -9,23 -23,41 -44,55 -20,14 -45,20 -73,20 -37,0 -66,-10 -87,-30 -20,-20 -30,-48 -29,-84zm41 -212c0,46 8,80 23,101 15,21 34,32 56,32 22,0 41,-10 57,-31 16,-21 23,-54 23,-100 0,-44 -8,-77 -24,-99 -16,-22 -35,-32 -58,-32 -20,0 -38,11 -54,32 -15,22 -23,54 -23,96zm478 69l51 8c-8,38 -24,66 -46,85 -22,19 -49,29 -82,29 -41,0 -74,-16 -100,-47 -25,-31 -38,-76 -38,-135 0,-61 13,-108 38,-140 26,-32 58,-48 97,-48 37,0 69,16 94,47 25,32 38,77 38,137l0 16 -216 0c2,40 11,70 28,90 16,20 36,30 60,30 37,0 62,-24 77,-73zm-161 -97l162 0c-2,-31 -9,-53 -20,-69 -16,-22 -36,-33 -60,-33 -22,0 -41,9 -56,27 -16,18 -24,43 -26,74zm433 211l0 -488 53 0 0 430 197 0 0 58 -250 0zm307 -419l0 -69 49 0 0 69 -49 0zm0 419l0 -353 49 0 0 353 -49 0zm234 -54l7 53c-14,4 -26,5 -37,5 -17,0 -31,-3 -41,-10 -10,-7 -18,-16 -21,-28 -4,-12 -6,-35 -6,-70l0 -203 -36 0 0 -47 36 0 0 -88 49 -36 0 123 50 0 0 47 -50 0 0 207c0,19 1,31 4,37 4,8 12,12 24,12 6,0 13,-1 22,-2zm279 54l-106 -488 54 0 61 320c6,33 12,66 17,100l18 -90 76 -329 64 0 57 247c14,60 24,118 31,173 5,-32 12,-67 20,-106l63 -314 53 0 -110 488 -51 0 -85 -372 -13 -57c-4,21 -8,40 -12,57l-85 372 -54 0zm422 -177c0,-61 13,-107 39,-138 26,-31 58,-47 97,-47 39,0 71,16 97,47 26,31 39,76 39,134 0,64 -13,111 -38,142 -26,31 -58,47 -97,47 -39,0 -71,-16 -97,-47 -26,-31 -39,-77 -39,-138zm50 0c0,46 8,80 25,102 17,22 37,34 62,34 23,0 43,-11 59,-34 17,-22 25,-56 25,-102 0,-45 -8,-79 -25,-102 -17,-22 -37,-33 -62,-33 -23,0 -43,11 -60,34 -16,22 -25,56 -25,101zm279 177l0 -353 44 0 0 54c11,-25 22,-41 31,-49 9,-8 20,-12 32,-12 16,0 33,6 50,19l-17 56c-12,-9 -24,-13 -36,-13 -10,0 -20,4 -29,11 -9,7 -15,17 -18,31 -6,23 -9,47 -9,73l0 185 -49 0zm185 0l0 -488 49 0 0 488 -49 0zm314 0l0 -45c-9,17 -20,30 -34,39 -14,9 -29,13 -45,13 -34,0 -64,-16 -89,-48 -25,-32 -37,-78 -37,-136 0,-40 6,-74 17,-102 11,-28 26,-49 44,-62 19,-14 39,-20 62,-20 16,0 31,4 45,13 14,9 25,20 34,36l0 -175 49 0 0 488 -46 0zm-155 -176c0,46 8,80 24,102 16,22 34,33 55,33 21,0 39,-11 54,-32 15,-21 23,-53 23,-96 0,-50 -8,-86 -23,-108 -15,-23 -35,-34 -58,-34 -21,0 -38,11 -53,33 -15,22 -22,56 -22,103z"/> + <g> + <path class="fil5" d="M4021 272c926,0 1680,755 1680,1680 0,926 -755,1680 -1680,1680 -925,0 -1680,-755 -1680,-1680 0,-925 755,-1680 1680,-1680z"/> + <path class="fil6" d="M4021 506c797,0 1446,650 1446,1446 0,797 -650,1446 -1446,1446 -797,0 -1446,-650 -1446,-1446 0,-797 650,-1446 1446,-1446z"/> + <path class="fil7" d="M3261 397c179,-97 445,426 751,426 312,28 574,-505 750,-433 187,79 -56,613 135,852 172,262 753,134 806,316 55,196 -514,339 -582,637 -97,298 365,672 255,828 -119,165 -585,-191 -861,-58 -293,110 -298,704 -488,716 -203,10 -216,-577 -491,-709 -269,-161 -736,207 -864,65 -134,-153 316,-528 248,-826 -42,-311 -620,-447 -589,-635 36,-200 610,-82 801,-321 217,-226 -37,-764 129,-856z"/> + <path class="fil5" d="M3307 469c126,-53 405,440 705,428 323,26 609,-483 726,-424 120,66 -92,591 105,818 181,269 757,175 784,303 23,135 -519,297 -574,592 -98,309 335,701 252,802 -91,102 -555,-221 -820,-80 -302,117 -339,699 -470,697 -137,-7 -174,-572 -449,-691 -280,-164 -758,171 -838,67 -80,-111 339,-492 260,-782 -46,-321 -606,-486 -575,-613 38,-132 596,-42 774,-284 222,-236 2,-777 121,-832z"/> + <path class="fil8" d="M3014 1959c0,552 449,1001 1001,1001 552,0 1001,-449 1001,-1001 0,-552 -449,-1000 -1001,-1000 -552,0 -1001,449 -1001,1000zm1001 -990c546,0 990,444 990,990 0,546 -444,990 -990,990 -546,0 -990,-444 -990,-990 0,-546 444,-990 990,-990z"/> + <path class="fil9" d="M4013 962c546,0 991,445 991,991 0,546 -445,991 -991,991 -546,0 -991,-445 -991,-991 0,-546 445,-991 991,-991z"/> + <path class="fil10" d="M3543 1083c86,-20 247,10 470,90l8 3 -5 -7c-54,-75 -110,-138 -170,-192l-3 4c60,54 115,117 170,191l3 -4c-224,-80 -382,-110 -469,-91l-2 5z"/> + <path class="fil10" d="M3069 2289c-8,-143 5,-275 37,-392 33,-120 88,-227 163,-320 77,-95 178,-177 299,-243 124,-68 274,-122 445,-160l0 -5c-239,-12 -436,14 -587,76 -152,63 -261,165 -325,303l5 2c63,-137 172,-238 322,-300 151,-63 348,-88 585,-76l0 -5c-172,38 -322,93 -447,161 -122,67 -223,149 -301,244 -76,93 -131,201 -164,322 -33,117 -45,250 -37,394l5 0z"/> + <path class="fil10" d="M3793 2933c-27,-383 -23,-723 13,-1012 36,-298 107,-550 210,-749l4 -8 -7 4c-131,74 -244,159 -338,254 -97,98 -176,210 -234,331 -60,125 -100,265 -118,416 -19,155 -17,326 8,508l5 -1c-24,-182 -27,-352 -8,-507 19,-150 58,-289 118,-414 58,-121 136,-232 233,-330 93,-95 207,-180 337,-253l-4 -3c-103,200 -174,452 -211,750 -35,289 -40,630 -13,1013l5 0z"/> + <path class="fil10" d="M4481 1078c-87,-20 -244,10 -468,90l3 4c54,-75 110,-137 169,-191l-3 -4c-60,54 -115,117 -170,191l-5 7 8 -3c223,-79 379,-110 465,-90l1 -5z"/> + <path class="fil10" d="M4963 2276c8,-143 -5,-275 -37,-391 -33,-119 -89,-226 -165,-318 -77,-94 -179,-174 -301,-240 -124,-67 -274,-120 -446,-159l0 5c237,-12 433,14 584,76 150,62 258,163 321,300l5 -2c-64,-138 -173,-239 -324,-302 -151,-63 -348,-88 -586,-76l0 5c171,38 320,92 444,158 122,65 222,146 299,239 75,91 130,197 164,316 32,116 45,247 37,390l5 0z"/> + <path class="fil10" d="M4307 2907c25,-358 9,-694 -47,-1000 -50,-274 -132,-522 -244,-738l-4 3c130,73 243,158 336,253 96,98 174,208 232,329 59,124 99,263 117,413 19,154 16,327 -8,509l5 -3c24,-182 27,-352 8,-507 -19,-150 -58,-289 -118,-414 -58,-121 -136,-232 -233,-330 -93,-95 -207,-180 -337,-253l-7 -4 4 8c111,215 193,463 243,736 56,305 72,641 47,999l5 0z"/> + <path class="fil10" d="M3030 2182c84,236 291,370 449,441 200,90 409,120 537,118 155,-2 344,-50 506,-129 145,-71 344,-202 464,-427l-5 -2c-120,224 -317,354 -462,425 -161,78 -350,127 -504,129 -128,2 -336,-28 -535,-118 -157,-71 -362,-204 -446,-438l-5 2z"/> + <path class="fil10" d="M3047 1692c-35,176 8,342 123,482 174,211 499,341 846,338 169,-1 334,-32 479,-90 148,-59 271,-144 355,-247 114,-139 157,-307 123,-488l-5 1c34,178 -8,346 -122,483 -84,102 -206,187 -353,245 -144,57 -309,88 -477,89 -346,2 -669,-127 -842,-337 -114,-138 -156,-303 -122,-477l-5 -1z"/> + <path class="fil10" d="M3238 1328c-128,150 -159,312 -88,469 115,255 479,444 866,451 183,3 371,-44 530,-131 154,-86 270,-203 324,-331 34,-79 44,-158 29,-236 -16,-84 -60,-163 -131,-236l-4 4c70,72 114,150 130,233 15,77 5,155 -29,233 -115,268 -480,465 -849,459 -385,-7 -748,-195 -862,-448 -70,-155 -39,-315 88,-463l-4 -3z"/> + <path class="fil10" d="M3508 1092c-196,141 -277,320 -222,490 34,105 121,200 243,267 132,71 298,109 483,108 186,-1 355,-48 487,-136 120,-80 202,-187 229,-303 19,-81 11,-161 -24,-233 -38,-77 -105,-141 -199,-190l-2 5c93,48 159,111 196,188 35,70 43,150 24,229 -50,208 -294,433 -712,435 -358,2 -648,-147 -721,-371 -55,-168 26,-344 220,-484l-3 -4z"/> + <path class="fil10" d="M3729 1004c-92,56 -158,118 -196,185 -34,60 -44,124 -27,185 42,160 251,276 506,283 126,3 250,-28 349,-87 95,-57 157,-135 176,-219 14,-64 1,-129 -38,-187 -44,-65 -118,-121 -222,-166l-2 5c102,45 176,101 220,165 38,57 51,121 37,183 -40,176 -268,309 -520,302 -253,-7 -460,-121 -502,-279 -16,-60 -7,-121 27,-181 37,-66 108,-132 199,-188l-8 0z"/> + <path class="fil10" d="M3752 1234c0,41 28,82 76,112 50,31 116,48 186,48 146,0 274,-75 274,-160 0,-41 -29,-80 -82,-109 -52,-29 -120,-45 -192,-45 -71,0 -137,16 -186,45 -49,29 -76,68 -76,109zm262 -149c146,0 269,68 269,149 0,83 -125,155 -269,155 -139,0 -256,-71 -256,-155 0,-84 113,-149 256,-149z"/> + <polygon class="fil10" points="4010,1170 4015,1170 4015,966 4010,966 "/> + <path class="fil10" d="M3006 1958c0,552 449,1000 1000,1000 552,0 1000,-449 1000,-1000 0,-552 -449,-1000 -1000,-1000 -551,0 -1000,449 -1000,1000zm1000 -990c546,0 990,444 990,990 0,546 -444,990 -990,990 -546,0 -990,-444 -990,-990 0,-546 444,-990 990,-990z"/> + <path class="fil11 str0" d="M3006 1958c0,552 449,1000 1000,1000 552,0 1000,-449 1000,-1000 0,-552 -449,-1000 -1000,-1000 -551,0 -1000,449 -1000,1000zm1000 -990c546,0 990,444 990,990 0,546 -444,990 -990,990 -546,0 -990,-444 -990,-990 0,-546 444,-990 990,-990z"/> + <path class="fil10" d="M4019 756l-15 0 0 -71 15 0 0 71zm31 31l0 118c0,5 -3,8 -5,8l-3 0 0 -11c0,-19 -7,-31 -18,-31l-24 0c-11,0 -18,12 -18,31l0 11 0 0c-2,0 -5,-4 -5,-8l0 -118c0,-5 3,-8 5,-8l1 0c2,13 8,21 17,21l24 0c9,0 15,-8 17,-21l4 0c2,0 5,4 5,8zm-46 115c0,-4 1,-7 1,-9l13 0c1,2 1,5 1,9l0 11 -15 0 0 -11zm15 105l-15 0 0 -71 15 0 0 71zm31 30l0 118c0,5 -3,8 -5,8l-3 0 0 -11c0,-19 -7,-31 -18,-31l-24 0c-11,0 -18,12 -18,31l0 11 0 0c-2,0 -5,-4 -5,-8l0 -118c0,-5 3,-8 5,-8l1 0c2,13 8,21 17,21l24 0c9,0 15,-8 17,-21l4 0c2,0 5,4 5,8zm-46 115c0,-4 1,-7 1,-9l13 0c1,2 1,5 1,9l0 11 -15 0 0 -11zm15 105l-15 0 0 -71 15 0 0 71zm31 31l0 118c0,5 -3,8 -5,8l-3 0 0 -11c0,-19 -7,-31 -18,-31l-24 0c-11,0 -18,12 -18,31l0 11 0 0c-2,0 -5,-3 -5,-8l0 -118c0,-5 3,-8 5,-8l1 0c2,13 8,21 17,21l24 0c9,0 15,-8 17,-21l4 0c2,0 5,4 5,8zm-46 115c0,-4 1,-7 1,-9l13 0c1,2 1,5 1,9l0 11 -15 0 0 -11zm15 110l-15 0 0 -77 15 0 0 77zm27 30l0 118c0,5 -3,8 -5,8l-3 0 0 -11c0,-19 -7,-31 -18,-31l-25 0c-11,0 -18,12 -18,31l0 11 0 0c-2,0 -5,-3 -5,-8l0 -118c0,-5 3,-8 5,-8l7 0c3,9 8,15 15,15l24 0c7,0 13,-6 15,-15l2 0c2,0 5,4 5,8zm-46 115c0,-4 0,-7 1,-9l13 0c1,2 1,5 1,9l0 11 -15 0 0 -11zm15 117c0,4 0,7 -1,9l-13 0c0,-2 -1,-5 -1,-9l0 -83 15 0 0 83zm-11 -1121c0,-4 1,-7 1,-9l13 0c1,2 1,5 1,9l0 11 -15 0 0 -11zm-23 11c-2,0 -5,-4 -5,-8l0 -118c0,-5 3,-8 5,-8l64 0c2,0 5,4 5,8l0 118c0,5 -3,8 -5,8l-3 0 0 -11c0,-19 -7,-31 -18,-31l-24 0c-11,0 -18,12 -18,31l0 11 0 0zm64 22c15,0 28,-14 28,-30l0 -118c0,-17 -12,-30 -28,-30l-64 0c-15,0 -28,14 -28,30l0 118c0,17 12,30 28,30l0 0 0 71 0 0c-15,0 -28,14 -28,31l0 118c0,17 12,31 28,31l0 0 0 71 0 0c-15,0 -28,14 -28,30l0 118c0,17 12,31 28,31l0 0 0 71 0 0c-15,0 -28,14 -28,31l0 118c0,17 12,30 28,30l0 0 0 77 -4 0c-15,0 -28,14 -28,30l0 118c0,17 12,31 28,31l0 0 0 83c0,19 7,31 18,31l25 0c11,0 18,-12 18,-31l0 -83 3 0c15,0 28,-14 28,-31l0 -118c0,-17 -12,-30 -27,-30l0 -77 3 0c15,0 28,-14 28,-30l0 -118c0,-17 -12,-31 -28,-31l-3 0 0 -71 3 0c15,0 28,-14 28,-31l0 -118c0,-17 -12,-30 -28,-30l-3 0 0 -71 3 0c15,0 28,-14 28,-31l0 -118c0,-17 -12,-31 -28,-31l-3 0 0 -71 3 0z"/> + <path class="fil12" d="M3465 2569l1079 0c9,0 23,11 16,16 -48,34 -80,66 -66,88 5,7 -7,16 -16,16l-959 0c-9,0 -19,-8 -16,-16 9,-29 -13,-59 -54,-88 -7,-5 7,-16 16,-16z"/> + <path class="fil13" d="M4487 2676c-1,2 -5,4 -9,4l-959 0c-3,0 -6,-2 -8,-4 -1,-1 -1,-1 -1,-1 10,-30 -8,-61 -53,-94 2,-2 5,-4 8,-4l1079 0c2,0 5,2 8,4 -40,29 -82,66 -65,95zm83 -98c-3,-9 -17,-17 -26,-17l-1079 0c-9,0 -23,8 -26,17 -2,5 0,11 5,14 41,29 58,55 51,78 -2,6 -1,11 3,16 5,6 13,11 21,11l959 0c9,0 20,-6 24,-13 3,-5 3,-11 0,-16 -6,-9 -1,-30 63,-76 5,-3 7,-9 5,-14z"/> + <path class="fil12" d="M3555 2720l901 0c17,0 31,11 31,24l0 33c0,13 -14,24 -31,24l-901 0c-17,0 -31,-11 -31,-24l0 -33c0,-13 14,-24 31,-24z"/> + <path class="fil13" d="M4478 2777c0,8 -10,16 -23,16l-901 0c-12,0 -23,-7 -23,-16l0 -33c0,-8 10,-16 23,-16l901 0c12,0 23,7 23,16l0 33zm-23 -65l-901 0c-22,0 -39,15 -39,32l0 33c0,18 18,32 39,32l901 0c22,0 39,-14 39,-32l0 -33c0,-18 -18,-32 -39,-32z"/> + <path class="fil12" d="M3554 2837l901 0c17,0 31,9 31,19l0 27c0,11 -14,19 -31,19l-901 0c-17,0 -31,-9 -31,-19l0 -27c0,-11 14,-19 31,-19z"/> + <path class="fil13" d="M4477 2883c0,4 -9,11 -22,11l-901 0c-14,0 -23,-7 -23,-11l0 -27c0,-4 9,-11 23,-11l901 0c7,0 13,2 17,4 3,2 5,5 5,7l0 27zm4 -48c-7,-4 -17,-7 -26,-7l-901 0c-22,0 -39,12 -39,28l0 27c0,15 17,28 39,28l901 0c22,0 39,-12 39,-28l0 -27c0,-8 -5,-16 -13,-21z"/> + <path class="fil12" d="M3807 2938l393 0c13,0 24,44 24,99 -176,7 -107,99 -120,99l-194 0c-13,0 46,-91 -127,-99 0,-54 11,-99 24,-99z"/> + <path class="fil13" d="M4105 3067c-16,21 -11,45 -8,59 0,0 0,0 0,1l-179 0c0,-1 0,-1 0,-2 2,-13 5,-37 -13,-58 -19,-23 -56,-35 -113,-38 1,-49 11,-79 16,-83l392 0c6,3 15,33 16,83 -57,3 -94,16 -111,39zm96 -138l-393 0c-26,0 -32,67 -32,107l0 8 8 0c55,2 92,14 108,33 13,15 11,33 9,45 -1,7 -2,13 2,17 2,2 5,4 8,4l194 0c3,0 6,-1 8,-4 4,-4 2,-10 1,-17 -3,-12 -7,-29 5,-45 15,-19 51,-30 107,-33l8 0 0 -8c0,-40 -7,-107 -32,-107z"/> + <path class="fil12" d="M4007 2531l-155 0c8,-29 26,-48 55,-55 28,-76 -46,-64 -50,-181 -21,-143 112,-205 137,-328 -85,-58 -82,-127 13,-180 95,53 98,122 13,180 25,123 157,185 137,328 -4,117 -78,106 -50,181 29,8 47,26 55,55l-155 0z"/> + <path class="fil13" d="M3864 2522c8,-20 23,-33 45,-39l4 -1 2 -4c15,-42 2,-61 -14,-83 -15,-20 -33,-45 -35,-101l0 0 0 0c-11,-80 27,-133 67,-189 29,-40 59,-82 70,-136l1 -5 -5 -3c-39,-27 -59,-55 -57,-83 1,-28 24,-56 66,-80 42,24 64,51 66,80 1,28 -19,57 -57,83l-5 3 1 6c11,53 41,95 70,136 40,56 78,109 67,189l0 0 0 0c-2,56 -20,81 -35,101 -16,22 -30,41 -14,83l2 4 4 1c22,6 37,19 45,39l-143 0 -143 0zm306 6c-8,-30 -27,-50 -56,-59 -10,-31 -2,-44 13,-64 16,-22 36,-49 38,-111l0 1c13,-87 -29,-145 -70,-201 -27,-38 -55,-77 -66,-124 40,-29 61,-61 60,-94 -2,-35 -29,-69 -78,-96l-4 -2 -4 2c-50,28 -77,61 -78,96 -2,33 20,65 60,94 -11,47 -39,87 -66,125 -40,56 -82,115 -70,201l0 -1c2,61 22,89 38,111 15,20 23,33 13,64 -29,9 -48,29 -56,59l-3 11 11 0 155 0 155 0 11 0 -3 -11z"/> + <path class="fil13" d="M4557 2528c-61,16 -110,-59 -110,-205 0,-146 90,-348 86,-310 -4,45 -32,146 15,275 41,112 116,213 9,240z"/> + <path class="fil12" d="M3907 3172l201 0c9,0 37,50 37,109 0,59 -7,107 -16,107 -43,0 -82,115 -125,115 -42,0 -88,-115 -130,-115 -9,0 -16,-48 -16,-107 0,-59 40,-109 49,-109z"/> + <path class="fil13" d="M4126 3380c-25,2 -45,31 -66,61 -18,25 -39,54 -56,54 -17,0 -39,-29 -58,-54 -23,-30 -45,-58 -68,-60 -4,-7 -10,-40 -10,-99 0,-53 34,-96 41,-101l198 0c8,6 30,50 30,101 0,59 -7,92 -11,99zm-18 -217l-201 0c-18,0 -57,60 -57,118 0,53 4,115 24,115 17,0 39,29 58,54 24,31 47,61 72,61 26,0 47,-30 69,-61 18,-25 38,-54 56,-54 20,0 24,-63 24,-115 0,-56 -27,-118 -45,-118z"/> + </g> + <path class="fil14" d="M3270 4935l-157 0 0 -738 -226 652c-22,62 -56,94 -103,94 -48,0 -81,-28 -99,-84l-220 -648 0 725 -157 0 0 -915c0,-48 8,-83 23,-104 24,-33 55,-49 94,-49 58,0 102,41 130,124l230 683 243 -703c24,-68 65,-102 122,-102 38,0 67,13 88,40 21,26 31,63 31,112l0 915zm1028 0l-207 0 -304 -457c-19,-28 -28,-55 -28,-80 0,-31 10,-62 29,-93l267 -429 192 0 -329 514 381 544zm-546 0l-168 0 0 -1059 168 0 0 1059zm1250 -163l0 163c-89,-1 -152,-3 -189,-7 -93,-10 -178,-46 -256,-109 -70,-56 -121,-125 -155,-207 -26,-62 -39,-130 -39,-204 0,-158 56,-289 169,-394 86,-80 185,-124 295,-133 38,-3 96,-5 174,-5l0 164c-18,0 -30,0 -35,0 -83,0 -140,5 -174,15 -80,23 -145,69 -194,138 -44,62 -67,134 -67,214 0,66 16,125 49,180 50,83 119,138 208,165 40,12 95,19 166,19 8,1 24,1 47,1zm723 163l-318 0c-62,0 -106,-12 -130,-36 -24,-24 -36,-67 -36,-129l0 -894 168 0 0 895 316 0 0 163z"/> + </g> + </g> +</svg> diff --git a/app/src/assets/mkcl-logo.png b/app/src/assets/mkcl-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d620ad13206d3fe96bc84d6cec6ab8968d9d367d Binary files /dev/null and b/app/src/assets/mkcl-logo.png differ diff --git a/app/src/components/BL/updateDbSave.vue b/app/src/components/BL/updateDbSave.vue new file mode 100644 index 0000000000000000000000000000000000000000..c8010ba4e8cc12c5390ab424d657c8839805ff46 --- /dev/null +++ b/app/src/components/BL/updateDbSave.vue @@ -0,0 +1,73 @@ +<template> + <div id="updateAndSave" class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Updated and Save in Database + </h2> + <div class="row justify-content-center"> + <div class="col-6"> + <div class="box-login"> + <div class="p-card p-conponent"> + <h3> + Note + </h3> + <div class="mt-2"> + This feature updates the user age. Server can add 5 for given age and saves data in database. + </div> + <div class="field mt-4"> + <div class="p-float-label"> + <input type="text" class="p-inputtext p-component w-100" :class="sobj.name ? 'p-filled' : ''" v-model="sobj.name" id="name"> + <label for="name">Enter name</label> + </div> + </div> + <div class="field"> + <div class="p-float-label"> + <input type="text" class="p-inputtext p-component w-100" :class="sobj.age ? 'p-filled' : ''" v-model="sobj.age" id="age"> + <label for="age">Enter age</label> + </div> + </div> + <div class="field"> + <div class="p-float-label"> + <input type="text" class="p-inputtext p-component w-100" :class="sobj.address ? 'p-filled' : ''" v-model="sobj.address" id="address"> + <label for="address">Enter address</label> + </div> + </div> + <div class="btn-wrapper"> + <button class="btn btn-submit" @click.prevent="updateObjectUsingBLAndSave"> + <i class="isax isax-bold-document-upload"></i> + Update and Save + </button> + </div> + </div> + </div> + </div> + </div> + </div> +</template> + +<script> +import MQL from '@/plugins/mql.js' +export default { + data () { + return { + sobj: {} + } + }, + methods: { + updateObjectUsingBLAndSave () { + new MQL() + .setActivity('o.[UpdateObjectUsingBLAndSave]') + .setData(this.sobj) + .fetch() + .then((rs) => { + rs.getActivity('UpdateObjectUsingBLAndSave', true) + if (rs.isValid('UpdateObjectUsingBLAndSave')) { + this.$toast.add({ severity: 'success', summary: 'UpdateObjectUsingBLAndSave', detail: 'Update Object UsingBL And Save Successfully', life: 3000 }) + } else { + rs.showErrorToast('UpdateObjectUsingBLAndSave') + } + }) + } + } +} +</script> \ No newline at end of file diff --git a/app/src/components/BL/updateUser.vue b/app/src/components/BL/updateUser.vue new file mode 100644 index 0000000000000000000000000000000000000000..ffed7092b40b1f373ee4fb387e74b11c53fb95e1 --- /dev/null +++ b/app/src/components/BL/updateUser.vue @@ -0,0 +1,91 @@ +<template> + <div id="updateUser" class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Update User + </h2> + <div class="row justify-content-center"> + <div class="col-6"> + <div class="box-login"> + <div class="p-card p-component"> + <div class="field"> + <div class="p-float-label"> + <input type="text" required v-model="obj.name" id="name" class="p-inputtext p-component w-100" :class="obj.name ? 'p-filled': ''"> + <label for="name">Enter name</label> + </div> + </div> + <div class="field"> + <div class="p-float-label"> + <input type="text" required v-model="obj.age" id="age" class="p-inputtext p-component w-100" :class="obj.age ? 'p-filled': ''"> + <label for="age">Enter age</label> + </div> + </div> + <div class="field"> + <div class="p-float-label"> + <input type="text" required v-model="obj.address" id="address" class="p-inputtext p-component w-100" :class="obj.address ? 'p-filled': ''"> + <label for="address">Enter address</label> + </div> + </div> + <div class="btn-wrapper"> + <button class="btn btn-submit" @click.prevent="updateObjectUsingBL"> + <i class="isax isax-bold-tick-circle"></i> + Update Data + </button> + </div> + </div> + </div> + </div> + <div class="col-6"> + <div class="box-login"> + <div class="p-card p-component"> + <h3> + Note + </h3> + <div class="mt-2"> + This feature update the user age, Server can add 5 in given age & save data in database. + </div> + <h3 class="mt-5"> + Result + </h3> + <div class="mt-2"> + <json-viewer :value="result" boxed :expanded="true"></json-viewer> + </div> + </div> + </div> + </div> + </div> + </div> +</template> + +<script> +import MQL from '@/plugins/mql.js' +import jsonViewer from 'vue-json-viewer' +export default { + data () { + return { + obj: {}, + result: '' + } + }, + components: { + jsonViewer + }, + methods: { + updateObjectUsingBL () { + new MQL() + .setActivity('o.[UpdateObjectUsingBL]') + .setData(this.obj) + .fetch() + .then((rs) => { + let res = rs.getActivity('UpdateObjectUsingBL', true) + if (rs.isValid('UpdateObjectUsingBL')) { + alert('Data update success') + this.result = res.result + } else { + rs.showErrorToast('UpdateObjectUsingBL') + } + }) + } + } +} +</script> diff --git a/app/src/components/DaiseUIComponents/Toast.vue b/app/src/components/DaiseUIComponents/Toast.vue new file mode 100644 index 0000000000000000000000000000000000000000..2ee07eca83a3935bebf29329bac5b21646eb0030 --- /dev/null +++ b/app/src/components/DaiseUIComponents/Toast.vue @@ -0,0 +1,29 @@ +<template> + <div class="toast toast-top toast-end"> + <div v-if="type==='info'" class="alert alert-info"> + <div> + <span>New mail arrived.</span> + </div> + </div> + <div v-if="type==='success'" class="alert alert-success"> + <div> + <span>Message sent successfully.</span> + </div> + </div> + </div> +</template> +<script> +export default { + name:"Toast", + props:{ + type:String, + data:String + }, + data(){ + return { + + } + } +} +</script> + diff --git a/app/src/components/MTable.vue b/app/src/components/MTable.vue new file mode 100644 index 0000000000000000000000000000000000000000..7f8f65c8e175c3d4c1a7626a7481797866cb61d2 --- /dev/null +++ b/app/src/components/MTable.vue @@ -0,0 +1,89 @@ +<template> + <div id="mTable" class="container-fluid"> + <div class="row justify-content-center"> + <div class="col-4"> + <div class="box-login"> + <div class="p-card p-component"> + <h3 class="mb-4"> + {{ msg }} + </h3> + <div class="overflow-x-auto"> + <table class="table w-full"> + <thead> + <tr> + <th>id</th> + <th>age</th> + </tr> + </thead> + <tbody v-for="(item, index) in itemList" v-bind:key="index"> + <tr> + <th>{{ item.id }}</th> + <td>{{ item.age }}</td> + </tr> + </tbody> + </table> + </div> + </div> + </div> + </div> + </div> + </div> +</template> + +<script> + import MQL from "@/plugins/mql.js" + export default { + name: "MTable", + props: { + msg: { + type: String, + default: null, + }, + activity: { + type: String, + required: true, + default: null, + }, + restriction: { + type: String, + required: true, + default: null, + }, + }, + data() { + return { + itemList: [], + } + }, + mounted() { + this.getActivityData() + }, + methods: { + // call for activity specific mql + getActivityData() { + new MQL() + .setActivity(this.restriction + ".[" + this.activity + "]") + // In case params not provided it will go with empty object + .setData() + .fetch() + .then((rs) => { + let res = rs.getActivity(this.activity, false) + if (rs.isValid(this.activity)) { + // Check if the request is of query type + if (this.activity.startsWith("query_")) { + // Request is of query type + console.log(res) + this.itemList = res + } else { + // Request is of activity type + this.itemList = res.result[this.resultKey || []] + } + } else { + // In case there is error from server side + rs.showErrorToast(this.activity, this.$toast) + } + }) + }, + }, + } +</script> diff --git a/app/src/components/common/Footer.vue b/app/src/components/common/Footer.vue new file mode 100644 index 0000000000000000000000000000000000000000..2f151af26a0a25a34790003fc0376b3f11957b1f --- /dev/null +++ b/app/src/components/common/Footer.vue @@ -0,0 +1,26 @@ +<template> + <div class="box-footer"> + <div class="bxf-container"> + <img src="../../assets/logo_mkcl.svg" alt="MKCL Logo"> + <div class="bxf-container-info"> + <p> + © Maharashtra Knowledge Corporation Limited. + </p> + <p> + All Rights Reserved. + </p> + </div> + </div> + + </div> +</template> + +<script> +export default { + +} +</script> + +<style> + +</style> \ No newline at end of file diff --git a/app/src/components/date-range-pickr.vue b/app/src/components/date-range-pickr.vue new file mode 100644 index 0000000000000000000000000000000000000000..0daae539b4329ea164e1c3ee0edd0a35e1cc6a92 --- /dev/null +++ b/app/src/components/date-range-pickr.vue @@ -0,0 +1,24 @@ +<script setup> + import { ref, onMounted } from "vue" + import VueDatePicker from "@vuepic/vue-datepicker" + import "@vuepic/vue-datepicker/dist/main.css" + const props = defineProps({ + context: Object, + }) + function handleInput(e) { + console.log("props", e) + props.context.node.input(e) + } + const selectedDate = [new Date(), new Date(new Date().getTime() + 9 * 24 * 60 * 60 * 1000)] + const date = ref() + onMounted(() => { + const startDate = new Date() + const endDate = new Date(new Date().setDate(startDate.getDate() + 7)) + date.value = [startDate, endDate] + }) +</script> + +<template> + <VueDatePicker v-model="date" @update:model-value="handleInput" range multi-calendars></VueDatePicker> +</template> +<style src="@vueform/multiselect/themes/default.css"></style> diff --git a/app/src/components/download-manager/downloadFile.vue b/app/src/components/download-manager/downloadFile.vue new file mode 100644 index 0000000000000000000000000000000000000000..67f2138c36b7521034cfcdc15225ef3c9e950cc3 --- /dev/null +++ b/app/src/components/download-manager/downloadFile.vue @@ -0,0 +1,128 @@ +<template> + <div class="container-fluid" id="downloadFileInner"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Download File + </h2> + <div class="row justify-content-center"> + <div class="col-6"> + <div class="box-login"> + <div class="p-card p-component"> + <div class="field"> + <div class="p-float-label"> + <input type="text" v-model="download.cdnBaseUrl" class="p-inputtext p-component w-100" + :class="download.cdnBaseUrl ? 'p-filled': ''" id="url"> + <label for="url">Enter Base Url</label> + </div> + </div> + <div class="field"> + <div class="p-float-label"> + <input type="text" v-model="download.downloadFileUrl" class="p-inputtext p-component w-100" + :class="download.downloadFileUrl ? 'p-filled': ''" id="downloadFileUrl"> + <label for="downloadFileUrl">Enter Download File Url</label> + </div> + </div> + <div class="field"> + <div class="p-float-label"> + <input type="text" v-model="download.destinationFileUrl" class="p-inputtext p-component w-100" + :class="download.destinationFileUrl ? 'p-filled': ''" id="destinationFileUrl"> + <label for="destinationFileUrl">Enter Destination Url</label> + </div> + </div> + <div class="btn-wrapper"> + <button class="btn btn-submit" @click.prevent="downloadFile"> + <i class="isax isax-bold-document-download"></i> + Download File + </button> + </div> + </div> + </div> + </div> + <div class="col-6"> + <div class="box-login"> + <div class="p-card p-component"> + <h4> Testing Parameters </h4> + <ul class="list"> + <li> + Base URL + <div> + https://csdev.mkcl.org/ + </div> + </li> + <li> + Download File URL + <div> + server/sls/ProjectConfigBackup/1Mg6VkbM1MQhhKh8z2qGSa42HIY/02_04_2021/1Mg6VkbM1MQhhKh8z2qGSa42HIY_1617343458.json + </div> + </li> + <li>Destination File URL + <div> + 02_04_2021/ + </div> + </li> + </ul> + </div> + </div> + </div> + </div> + </div> +</template> + +<script> +import MQL from '@/plugins/mql.js' +export default { + data() { + return { + download: {}, + downloadId: '', + downloadResult: '', + progressResult: '' + } + }, + methods: { + downloadFile() { + var a = [] + a.push(this.download.downloadFileUrl) + this.download.downloadFileUrl = a + new MQL() + .setActivity('o.[DownloadFileUsingDM]') + .setData(this.download) + .fetch() + .then((rs) => { + let res = rs.getActivity('DownloadFileUsingDM', true) + if (rs.isValid('DownloadFileUsingDM')) { + this.download = {} + this.downloadResult = res.result + this.$toast.add({ severity: 'success', summary: 'File Download ', detail: 'File Downloaded Successfully', life: 3000 }) + } else { + rs.showErrorToast('DownloadFileUsingDM') + } + }) + } + } +} +</script> + +<style lang="scss" scoped> +h4 { + margin-bottom: 1rem; +} + +.list { + padding: 0 1rem; + + li { + font-weight: 600; + + div { + font-weight: 400; + word-break: break-word; + } + + &+li { + margin-top: 0.75rem; + } + } + +} +</style> \ No newline at end of file diff --git a/app/src/components/download-manager/downloadProgress.vue b/app/src/components/download-manager/downloadProgress.vue new file mode 100644 index 0000000000000000000000000000000000000000..446d45dddaa226ccb071c87b7508ac792e1735a8 --- /dev/null +++ b/app/src/components/download-manager/downloadProgress.vue @@ -0,0 +1,84 @@ +<template> + <div class="container-fluid" id="downloadFIleProgress"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Check Progress + </h2> + <div class="row justify-content-center"> + <div class="col-6"> + <div class="box-login"> + <div class="p-card p-component"> + <div class="field"> + <div class="p-float-label"> + <input + type="text" + v-model="downloadId" + class="p-inputtext p-component" + :class="downloadId ? 'p-filled' : ''" + id="progress" + /> + <label for="progress">Download Id</label> + </div> + </div> + <div class="btn-wrapper"> + <button class="btn btn-submit" @click="checkDownloadProgress"> + <i class="isax isax-bold-tick-circle"></i> + Check Progress + </button> + </div> + <div class="field mt-4"> + <h3>Result</h3> + <div class="json-wrapper"> + <json-viewer :value="progressResult" boxed :expanded="true"></json-viewer> + </div> + </div> + </div> + </div> + </div> + </div> + </div> +</template> + +<script> + import MQL from '@/plugins/mql.js' + import jsonViewer from 'vue-json-viewer' + export default { + data() { + return { + downloadId: '', + progressResult: '', + } + }, + components: { + jsonViewer + }, + methods: { + checkDownloadProgress() { + new MQL() + .setActivity('o.[CheckDownloadedFileProgress]') + .setData({ downloadFileId: this.downloadId }) + .fetch() + .then((rs) => { + let res = rs.getActivity('CheckDownloadedFileProgress', true) + if (rs.isValid('CheckDownloadedFileProgress')) { + if (res && res.result) { + this.progressResult = res.result + this.downloadId = '' + } else { + // alert('Progress checking failed') + this.$toast.add({ + severity: 'error', + summary: 'Progress Check ', + detail: 'Progress Check Failed', + life: 3000, + }) + + } + } else { + rs.showErrorToast('CheckDownloadedFileProgress') + } + }) + }, + }, + } +</script> diff --git a/app/src/components/excel/clientData.vue b/app/src/components/excel/clientData.vue new file mode 100644 index 0000000000000000000000000000000000000000..c0e369ed4cd558c2a72907dfbb9bb1d38078b5e2 --- /dev/null +++ b/app/src/components/excel/clientData.vue @@ -0,0 +1,69 @@ +<template> + <div class="container-fluid" id="clientData"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Save Client Data + </h2> + <div class="subtext">This client data is saved in "Employee" collection of "cs playground" database.</div> + <div class="row justify-content-center"> + <div class="col-6"> + <div class="box-login"> + <div class="p-card p-component"> + <DataTable :value="empList" v-if="empList && empList.length > 0"> + <Column field="name" header="name"></Column> + <Column field="age" header="age"></Column> + <Column field="address" header="address"></Column> + </DataTable> + <div class="empty-state" v-else>Records not found</div> + <div class="btn-wrapper"> + <button class="btn btn-submit" @click="saveClientDataUsingExcel"> + <i class="isax isax-bold-tick-circle"></i> + Save Data + </button> + </div> + </div> + </div> + </div> + </div> +</div> +</template> + +<script> +import MQL from '@/plugins/mql.js' +export default { + data () { + return { + empList: [ + { name: 'vikram', age: 27, address: 'pune' }, + { name: 'kunal', age: 28, address: 'satara' }, + { name: 'akshay', age: 29, address: 'mumbai' } + ], + url: '', + excel: {} + } + }, + methods: { + saveClientDataUsingExcel () { + new MQL() + .setActivity('o.[SaveClientDataUsingExcel]') + .setData(this.empList) + .fetch() + .then((rs) => { + rs.getActivity('SaveClientDataUsingExcel', true) + if (rs.isValid('SaveClientDataUsingExcel')) { + this.$toast.add({severity:'success', summary: 'Employees Data ', detail:'Data saved successfully', life: 3000}) + } else { + rs.showErrorToast('SaveClientDataUsingExcel') + } + }) + } + } +} +</script> + +<style lang="scss" scoped> +.subtext { + margin-top: 0.25rem; + margin-left: 48px; +} +</style> \ No newline at end of file diff --git a/app/src/components/excel/saveWActivity.vue b/app/src/components/excel/saveWActivity.vue new file mode 100644 index 0000000000000000000000000000000000000000..2186be84ad7fc6d3f54942f1c0fa49d441ba6f1a --- /dev/null +++ b/app/src/components/excel/saveWActivity.vue @@ -0,0 +1,82 @@ +<template> + <div class="container-fluid" id="saveData"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Save excel data + </h2> + <div class="row justify-content-center"> + <div class="col-6"> + <div class="box-login"> + <div class="p-card p-component"> + <div class="field"> + <label for="text">Activity</label> + <input type="text" class="p-inputtext p-component w-100 mt-2" id="activity"> + </div> + <div class="btn-wrapper"> + <button class="btn btn-submit" @click.prevent="saveExcelDataUsingActivity"> + <i class="isax isax-bold-tick-circle"></i> + Save excel data + </button> + </div> + </div> + </div> + </div> + <div class="col-6"> + <div class="box-login"> + <div class="p-card p-component"> + <h4> + Testing CDN File + </h4> + <div class="mt-3"> + <a href="https://testcdncs.mkcl.org/1TxYD2KhMcczFlxXntsueOYN46J/demoFolder/Test.xlsx"> + https://testcdncs.mkcl.org/1TxYD2KhMcczFlxXntsueOYN46J/demoFolder/Test.xlsx + </a> + </div> + </div> + </div> + </div> + </div> +</div> +</template> + +<script> +import MQL from '@/plugins/mql.js' +export default { + data () { + return { + url: '' + } + }, + components: { + }, + methods: { + saveExcelDataUsingActivity () { + new MQL() + .setActivity('o.[SaveActivityDataUsingExcel]') + .setData({ excelURL: this.url }) + .fetch() + .then((rs) => { + rs.getActivity('SaveActivityDataUsingExcel', true) + if (rs.isValid('SaveActivityDataUsingExcel')) { + // alert('Excel data saved successfully using activity') + this.$toast.add({severity:'success', summary: 'Data Saved ', detail:'Excel data saved successfully using activity', life: 3000}) + this.url = '' + } else { + rs.showErrorToast('SaveActivityDataUsingExcel') + } + }) + } + } +} +</script> +<style lang="scss" scoped> +.subtext { + margin-top: 0.75rem; + margin-left: 3rem; +} + +h4 + div { + word-break: break-word; +} + +</style> \ No newline at end of file diff --git a/app/src/components/excel/updateData.vue b/app/src/components/excel/updateData.vue new file mode 100644 index 0000000000000000000000000000000000000000..e93ae53a5992a283bb52331e266c7044ed4dabf4 --- /dev/null +++ b/app/src/components/excel/updateData.vue @@ -0,0 +1,68 @@ +<template> + <div class="container-fluid" id="updateData"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Update Data + </h2> + <div class="row justify-content-center"> + <div class="col-auto"> + <div class="box-login"> + <div class="p-card p-component"> + <div class="field"> + <label for="name">Enter name</label> + <input type="text" class="p-inputtext p-component w-100 mt-2" id="name" v-model="excel.name" required> + </div> + <div class="field"> + <label for="mobile">Enter age</label> + <input type="text" class="p-inputtext p-component w-100 mt-2" id="mobile" v-model="excel.age" required> + </div> + <div class="btn-wrapper"> + <button class="btn btn-submit" @click.prevent="updateData"> + <i class="isax isax-bold-tick-circle"></i> + Submit + </button> + </div> + </div> + </div> + </div> + </div> +</div> +</template> + +<script> +import MQL from '@/plugins/mql.js' +export default { + data () { + return { + empList: [ + { name: 'vikram', age: 27, address: 'pune' }, + { name: 'kunal', age: 28, address: 'satara' }, + { name: 'akshay', age: 29, address: 'mumbai' } + ], + + mobile: '', + excel: {} + } + }, + components: { + }, + methods: { + updateData () { + new MQL() + .setActivity('o.[UpdateDataUsingExcel]') + .setData([this.excel]) + .fetch() + .then((rs) => { + rs.getActivity('UpdateDataUsingExcel', true) + if (rs.isValid('UpdateDataUsingExcel')) { + // alert('Excel data updated successfully') + this.$toast.add({severity:'success', summary: 'Data Saved ', detail:'Excel Data Updated Successfully', life: 3000}) + this.excel = {} + } else { + rs.showErrorToast('UpdateDataUsingExcel') + } + }) + } + } +} +</script> \ No newline at end of file diff --git a/app/src/components/i18Demo/Component1.vue b/app/src/components/i18Demo/Component1.vue new file mode 100644 index 0000000000000000000000000000000000000000..ee5cf4e4503c824e820a6355c65f2ec52b23c399 --- /dev/null +++ b/app/src/components/i18Demo/Component1.vue @@ -0,0 +1,33 @@ +<template> + <div> + <h2>Component 1</h2> + <h4 class="mt-2 mb-3"> + <b>{{ $t('demo.demoHeading') }}</b> + </h4> + <button class="btn btn-primary" @click="changeLanguage('en')">English</button> + <button class="btn btn-secondary" @click="changeLanguage('hi')">Hindi</button> + <button class="btn btn-warning" @click="changeLanguage('mr')" >Marathi</button> + </div> +</template> + +<script> + import { loadLanguageAsync } from '@/setup/i18n-setup.js' + +export default { + mounted () { + this.$i18n.locale = 'hi' + }, + methods: { + changeLanguage (lang) { + this.$i18n.locale = lang + this.$i18n.locale = lang + this.$i18n.fallbackLocale = lang + loadLanguageAsync(lang) + console.log(lang) + } + } +} +</script> + +<style> +</style> diff --git a/app/src/components/i18Demo/Component2.vue b/app/src/components/i18Demo/Component2.vue new file mode 100644 index 0000000000000000000000000000000000000000..c0cec42fdbea3c8d8af32ff50464c97b40e8909a --- /dev/null +++ b/app/src/components/i18Demo/Component2.vue @@ -0,0 +1,40 @@ +<template> + <div> + <h2>Component 2</h2> + <h4 class="mt-2 mb-3"> + <b>{{ $t('component2.title') }}</b> + </h4> + <button class="btn btn-primary" @click="changeLanguage('en')">English</button> + <button class="btn btn-secondary" @click="changeLanguage('hi')">Hindi</button> + <button class="btn btn-warning" @click="changeLanguage('mr')" >Marathi</button> + </div> +</template> + +<script> +import { createI18n } from 'vue-i18n' +export default { + i18n: createI18n({ // `i18n` option, setup locale info for component + locale: 'mr' + }), + mounted () { + this.loadMessagesFromFile() + }, + methods: { + changeLanguage (lang) { + this.$i18n.locale = lang + this.loadMessagesFromFile() + }, + loadMessagesFromFile () { + return new Promise((resolve) => { + return import(`../../lang/${this.$i18n.locale}.json`).then(res => { + this.$i18n.setLocaleMessage(this.$i18n.locale, res.default) + resolve(true) + }) + }) + } + } +} +</script> + +<style> +</style> diff --git a/app/src/components/keymappers/decryptData.vue b/app/src/components/keymappers/decryptData.vue new file mode 100644 index 0000000000000000000000000000000000000000..96e5100ad1dbde7204202f38b4ffcbfbff142a2d --- /dev/null +++ b/app/src/components/keymappers/decryptData.vue @@ -0,0 +1,66 @@ +<template> + <div id="decryptData" class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Decrypt Data + </h2> + <div class="row justify-content-center"> + <div class="col-auto"> + <div class="box-login"> + <div class="p-card p-component"> + <div class="field"> + <div class="p-float-label"> + <input type="text" v-model="dname" class="p-inputtext p-component" id="dname" :class="dname ? 'p-filled': ''" + > + <label for="dname">Decrypt Data</label> + </div> + </div> + <div class="btn-wrapper"> + <button class="btn btn-submit" @click.prevent="decryptData"> + <i class="isax isax-bold-shield-slash"></i> + Decrypt + </button> + </div> + <div class="field mt-4"> + <h3>Result</h3> + <json-viewer :value="decryptResult" boxed :expanded="true"></json-viewer> + </div> + </div> + </div> + </div> + </div> + </div> +</template> +<script> +import MQL from '@/plugins/mql.js' +import jsonViewer from 'vue-json-viewer' +export default { + data() { + return { + name: '', + decryptResult: '', + dname: '' + } + }, + components: { + jsonViewer + }, + methods: { + decryptData() { + new MQL() + .setActivity('o.[DecryptData]') + .setData({ name: this.dname }) + .fetch() + .then((rs) => { + let res = rs.getActivity('DecryptData', true) + if (rs.isValid('DecryptData')) { + this.decryptResult = res.result + this.dname = '' + } else { + rs.showErrorToast('DecryptData') + } + }) + } + } +} +</script> \ No newline at end of file diff --git a/app/src/components/keymappers/encryptData.vue b/app/src/components/keymappers/encryptData.vue new file mode 100644 index 0000000000000000000000000000000000000000..a3e1e86fbf1d5405ac54be5b797af3750c573093 --- /dev/null +++ b/app/src/components/keymappers/encryptData.vue @@ -0,0 +1,72 @@ +<template> + <div class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Encrypt Data + </h2> + <div class="row justify-content-center"> + <div class="col-auto"> + <div class="box-login"> + <div class="p-card p-component"> + <div class="field"> + <div class="p-float-label"> + <input type="text" class="p-inputtext p-component" id="ename" v-model="ename" :class="ename ? 'p-filled': ''" + > + <label for="ename">Data to Encrypt</label> + </div> + </div> + <div class="btn-wrapper"> + <button class="btn btn-submit" @click.prevent="encryptData"> + <i class="isax isax-bold-security-safe"></i> + Encrypt Data + </button> + </div> + <div class="field mt-4"> + <h3>Result</h3> + <json-viewer :value="encryptResult" boxed :expanded="true"></json-viewer> + </div> + </div> + </div> + </div> + </div> + </div> + +</template> + +<script> +import MQL from '@/plugins/mql.js' +import jsonViewer from 'vue-json-viewer' +export default { + data() { + return { + ename: '', + name: '', + encryptResult: '' + } + }, + components: { + jsonViewer + }, + methods: { + encryptData() { + new MQL() + .setActivity('o.[EncryptData]') + .setData({ name: this.ename }) + .fetch() + .then((rs) => { + let res = rs.getActivity('EncryptData', true) + if (rs.isValid('EncryptData')) { + this.encryptResult = res.result + this.ename = '' + } else { + rs.showErrorToast('EncryptData') + } + }) + } + } +} +</script> + +<style> + +</style> \ No newline at end of file diff --git a/app/src/components/keymappers/hashData.vue b/app/src/components/keymappers/hashData.vue new file mode 100644 index 0000000000000000000000000000000000000000..662221e872b21fa71c30434ba334dd7e6002e944 --- /dev/null +++ b/app/src/components/keymappers/hashData.vue @@ -0,0 +1,69 @@ +<template> + <div class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Hash Data + </h2> + <div class="row justify-content-center"> + <div class="col-auto"> + <div class="box-login"> + <div class="p-card p-component"> + <div class="field"> + <div class="p-float-label"> + <input type="text" class="p-inputtext p-component" v-model="name" id="hashName" :class="name ? 'p-filled': ''"> + <label for="hashName">Enter data to hash</label> + </div> + </div> + <div class="btn-wrapper"> + <button class="btn btn-submit" @click.prevent="hashData"> + <i class="isax isax-bold-shield-tick"></i> + Hash + </button> + </div> + <div class="field mt-4"> + <h3>Result</h3> + <json-viewer :value="hashResult" boxed :expanded="true"></json-viewer> + </div> + </div> + </div> + </div> + </div> + </div> +</template> + +<script> +import MQL from '@/plugins/mql.js' +import jsonViewer from 'vue-json-viewer' +export default { + data() { + return { + hashResult: '', + name: '' + } + }, + components: { + jsonViewer + }, + methods: { + hashData() { + new MQL() + .setActivity('o.[GenerateHash]') + .setData({ name: this.name }) + .fetch() + .then((rs) => { + let res = rs.getActivity('GenerateHash', true) + if (rs.isValid('GenerateHash')) { + this.hashResult = res.result + this.name = '' + } else { + rs.showErrorToast('GenerateHash') + } + }) + } + } +} +</script> + +<style> + +</style> \ No newline at end of file diff --git a/app/src/components/keymappers/hashSalt.vue b/app/src/components/keymappers/hashSalt.vue new file mode 100644 index 0000000000000000000000000000000000000000..fde90ec0264453094cdbd90d91dc45e9cf793a3e --- /dev/null +++ b/app/src/components/keymappers/hashSalt.vue @@ -0,0 +1,74 @@ +<template> + <div class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Hash Salt + </h2> + <div class="row justify-content-center"> + <div class="col-auto"> + <div class="box-login"> + <div class="p-card p-component"> + <div class="field"> + <div class="p-float-label"> + <input type="text" class="p-inputtext p-component" :class="sname ? 'active' : ''" v-model="sname" id="sname"> + <label for="sname">Generate Salt</label> + </div> + </div> + <div class="field"> + <div class="p-float-label"> + <input type="text" class="p-inputtext p-component" :class="saltKey ? 'active' : ''" v-model="saltKey" id="saltKey"> + <label for="saltKey">Enter Salt Key</label> + </div> + </div> + <div class="btn-wrapper"> + <button class="btn btn-submit" @click.prevent="generateSalt"> + <i class="isax isax-bold-security-card"></i> + Generate Salt + </button> + </div> + <div class="field mt-4"> + <h3>Result</h3> + <json-viewer :value="saltResult" boxed :expanded="true"></json-viewer> + </div> + </div> + </div> + </div> + </div> + </div> + +</template> + +<script> +import MQL from '@/plugins/mql.js' +import jsonViewer from 'vue-json-viewer' +export default { + data() { + return { + sname: '', + saltKey: '', + name: '' + } + }, + components: { + jsonViewer + }, + methods: { + generateSalt() { + new MQL() + .setActivity('o.[GenerateSalt]') + .setData({ name: this.sname, saltKey: this.saltKey }) + .fetch() + .then((rs) => { + let res = rs.getActivity('GenerateSalt', true) + if (rs.isValid('GenerateSalt')) { + this.saltResult = res.result + this.sname = '' + this.saltKey = '' + } else { + rs.showErrorToast('GenerateSalt') + } + }) + } + } +} +</script> \ No newline at end of file diff --git a/app/src/components/mongodbID/customID.vue b/app/src/components/mongodbID/customID.vue new file mode 100644 index 0000000000000000000000000000000000000000..278b18c7ec79a14168c2c8983ee16e0886d57d94 --- /dev/null +++ b/app/src/components/mongodbID/customID.vue @@ -0,0 +1,68 @@ +<template> + <div id="customID" class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Custom ID + </h2> + <div class="row justify-content-center"> + <div class="col-auto"> + <div class="box-login"> + <div class="p-card p-component"> + <div class="field"> + <div class="p-float-label"> + <input type="text" v-model="obj.objectId" class="p-inputtext p-component" :class="obj.objectId ? 'p-filled' : ''" id="objectID"> + <label for="objectID">Enter object ID</label> + </div> + </div> + <div class="field"> + <div class="p-float-label"> + <input type="text" v-model="obj.name" class="p-inputtext p-component" :class="obj.name ? 'p-filled' : ''" id="name"> + <label for="name">Enter name</label> + </div> + </div> + <div class="field"> + <div class="p-float-label"> + <input type="text" v-model="obj.address" class="p-inputtext p-component" :class="obj.address ? 'p-filled' : ''" id="address"> + <label for="address">Enter address</label> + </div> + </div> + <div class="btn-wrapper"> + <button class="btn btn-submit" @click="saveCustomId"> + <i class="isax isax-bold-tick-circle"></i> + Save + </button> + </div> + + </div> + </div> + </div> + </div> + </div> +</template> + +<script> +import MQL from '@/plugins/mql.js' +export default { + data () { + return { + obj: {} + } + }, + methods: { + saveCustomId () { + new MQL() + .setActivity('o.[SaveCustomObjectID]') + .setData(this.obj) + .fetch() + .then((rs) => { + rs.getActivity('SaveCustomObjectID', true) + if (rs.isValid('SaveCustomObjectID')) { + this.obj = {} + } else { + rs.showErrorToast('SaveCustomObjectID') + } + }) + } + } +} +</script> \ No newline at end of file diff --git a/app/src/components/mongodbID/hexID.vue b/app/src/components/mongodbID/hexID.vue new file mode 100644 index 0000000000000000000000000000000000000000..8f87adba6e40f94eb6613fe3893aab0717cc20e4 --- /dev/null +++ b/app/src/components/mongodbID/hexID.vue @@ -0,0 +1,69 @@ +<template> + <div id="hexID" class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Insert Custom Hex MongoDB ID + </h2> + <div class="row justify-content-center"> + <div class="col-auto"> + <div class="box-login"> + <div class="p-card p-component"> + <div class="field"> + <div class="p-float-label"> + <input type="text" v-model="hobj._id" class="p-inputtext p-component" :class="hobj._id ? 'p-filled' : ''" id="hexObject"> + <label for="hexObject">Enter Hex Object ID</label> + </div> + </div> + <div class="field"> + <div class="p-float-label"> + <input type="text" v-model="hobj.name" class="p-inputtext p-component" :class="hobj.name ? 'p-filled' : ''" id="name"> + <label for="name">Enter name</label> + </div> + </div> + <div class="field"> + <div class="p-float-label"> + <input type="text" v-model="hobj.address" class="p-inputtext p-component" :class="hobj.address ? 'p-filled' : ''" id="address"> + <label for="address">Enter address</label> + </div> + </div> + <div class="btn-wrapper"> + <button class="btn btn-submit" @click.prevent="saveCustomHexId"> + <i class="isax isax-bold-tick-circle"></i> + Submit + </button> + </div> + </div> + </div> + </div> + </div> + </div> + +</template> + +<script> +import MQL from '@/plugins/mql.js' +export default { + data () { + return { + hobj: {} + } + }, + methods: { + saveCustomHexId () { + new MQL() + .setActivity('o.[SaveCustomHexObjectID]') + .setData(this.hobj) + .fetch() + .then((rs) => { + rs.getActivity('SaveCustomHexObjectID', true) + if (rs.isValid('SaveCustomHexObjectID')) { + this.hobj = {} + alert('Custom hex objectId saved successfully') + } else { + rs.showErrorToast('SaveCustomHexObjectID') + } + }) + } + } +} +</script> \ No newline at end of file diff --git a/app/src/components/multiselect.vue b/app/src/components/multiselect.vue new file mode 100644 index 0000000000000000000000000000000000000000..5bb72e11c1748722fc109077179cc8633b307311 --- /dev/null +++ b/app/src/components/multiselect.vue @@ -0,0 +1,27 @@ +<script setup> + import Multiselect from "@vueform/multiselect" + import { ref, onMounted } from "vue" + import VueDatePicker from "@vuepic/vue-datepicker" + import "@vuepic/vue-datepicker/dist/main.css" + const props = defineProps({ + context: Object, + }) + function handleInput(e) { + console.log("props", e) + props.context.node.input(e) + } + const selectedDate = [new Date(), new Date(new Date().getTime() + 9 * 24 * 60 * 60 * 1000)] + const options = ["Batman", "Robin", "Joker"] + const value = [] + const date = ref() + onMounted(() => { + const startDate = new Date() + const endDate = new Date(new Date().setDate(startDate.getDate() + 7)) + date.value = [startDate, endDate] + }) +</script> + +<template> + <Multiselect @change="handleInput" mode="multiple" v-model="value" :options="['Batman', 'Robin', 'Joker']" /> +</template> +<style src="@vueform/multiselect/themes/default.css"></style> diff --git a/app/src/components/sessionmanager/deleteData.vue b/app/src/components/sessionmanager/deleteData.vue new file mode 100644 index 0000000000000000000000000000000000000000..43ce39b9d1ef06ea85a57d2c188fd88f07bf0a0d --- /dev/null +++ b/app/src/components/sessionmanager/deleteData.vue @@ -0,0 +1,72 @@ +<template> + <div id="deleteData" class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Delete Data from Session + </h2> + <div class="row justify-content-center"> + <div class="col-auto"> + <div class="box-login"> + <FormKit + type="form" + id="registration-example" + :form-class="submitted ? 'hide' : 'show'" + submit-label="Register" + @submit="deleteSessionData" + :actions="false" + #default="{ value }" + > + <FormKit + type="text" + name="sessionName" + label="Session Key" + v-model="deleteKey" + placeholder="Session Key" + help="Enter Session Key" + validation="required" + /> + <button class="btn btn-error" type="submit" label="Delete">Delete</button> + </FormKit> + </div> + </div> + </div> + </div> + +</template> + +<script> +import MQL from '@/plugins/mql.js' +export default { + data () { + return { + session: '', + deleteKey: '' + } + }, + components: { + }, + methods: { + deleteSessionData () { + new MQL() + .setActivity('o.[DeleteDataFromSession]') + .setData({ name: this.deleteKey }) + .fetch() + .then((rs) => { + let res = rs.getActivity('DeleteDataFromSession', true) + if (rs.isValid('DeleteDataFromSession')) { + if (res && res.result) { + this.sessionResult = res.result + this.deleteKey = '' + // alert('Data deleted successfully') + this.$toast.add({severity:'success', summary: 'Data Delete ', detail:'Data Deleted Successfully', life: 3000}) + } else { + this.$toast.add({severity:'error', summary: 'Data Delete', detail:'Data Deletion Failed', life: 3000}) + } + } else { + rs.showErrorToast('DeleteDataFromSession') + } + }) + } + } +} +</script> \ No newline at end of file diff --git a/app/src/components/sessionmanager/fetchData.vue b/app/src/components/sessionmanager/fetchData.vue new file mode 100644 index 0000000000000000000000000000000000000000..9b572c0f72fc60c2f68bbcbc615856af436a6b60 --- /dev/null +++ b/app/src/components/sessionmanager/fetchData.vue @@ -0,0 +1,87 @@ +<template> + <div id="fetchData" class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Fetch Data in Session + </h2> + <div class="row justify-content-center"> + <div class="col-auto"> + <div class="box-login"> + <FormKit + type="form" + id="registration-example" + :form-class="submitted ? 'hide' : 'show'" + submit-label="Register" + @submit="fetchSessionData" + :actions="false" + #default="{ value }" + > + <FormKit + type="text" + name="sessionName" + label="Session Key" + v-model="fetchKey" + placeholder="Session Key" + help="Enter Session Key" + validation="required" + /> + <FormKit type="submit" label="Save" /> + </FormKit> + <div class="field"> + <h3>Result</h3> + <json-viewer :value="sessionResult" boxed :expanded="true"></json-viewer> + </div> + </div> + </div> + </div> + </div> +</template> + +<script> + import MQL from "@/plugins/mql.js" + import jsonViewer from "vue-json-viewer" + export default { + data() { + return { + session: {}, + fetchKey: "", + sessionResult: "", + } + }, + components: { + jsonViewer, + }, + methods: { + fetchSessionData() { + new MQL() + .setActivity("o.[FetchDataFromSession]") + .setData({ name: this.fetchKey }) + .fetch() + .then((rs) => { + let res = rs.getActivity("FetchDataFromSession", true) + if (rs.isValid("FetchDataFromSession")) { + if (res && res.result) { + this.sessionResult = res.result + this.fetchKey = "" + this.$toast.add({ + severity: "success", + summary: "Fetch Data in Session", + detail: "Data fetched successfully", + life: 3000, + }) + } else { + this.$toast.add({ + severity: "error", + summary: "Fetch Data in Session", + detail: "Data fetched failed", + life: 3000, + }) + } + } else { + rs.showErrorToast("FetchDataFromSession") + } + }) + }, + }, + } +</script> diff --git a/app/src/components/sessionmanager/storeData.vue b/app/src/components/sessionmanager/storeData.vue new file mode 100644 index 0000000000000000000000000000000000000000..9b24ebae13610eaa19fdbfe0aa58df681e7aad2b --- /dev/null +++ b/app/src/components/sessionmanager/storeData.vue @@ -0,0 +1,77 @@ +<template> + <div id="storeData" class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"> </i> + Store Data in Session + </h2> + <div class="row justify-content-center"> + <div class="col-auto"> + <div class="box-login"> + <FormKit + type="form" + id="registration-example" + :form-class="submitted ? 'hide' : 'show'" + submit-label="Register" + @submit="saveSessionData" + :actions="false" + #default="{ value }" + > + <FormKit + type="text" + name="sessionName" + label="Session Key" + v-model="session.name" + placeholder="Session Key" + help="Enter Session Key" + validation="required" + /> + <FormKit + type="text" + name="sessionName" + label="Session Name Value" + v-model="session.nameValue" + placeholder="Session Name Value" + help="Session value is automatically deleted after 5 minutes because session expiration time is set to 5 minute in `StoreDataInSession` activity." + validation="required" + /> + <FormKit type="submit" label="Save"/> + </FormKit> + </div> + </div> + </div> + </div> +</template> + +<script> + import MQL from "@/plugins/mql.js" + export default { + data() { + return { + session: {}, + } + }, + components: {}, + methods: { + saveSessionData() { + new MQL() + .setActivity("o.[StoreDataInSession]") + .setData(this.session) + .fetch() + .then((rs) => { + rs.getActivity("StoreDataInSession", true) + if (rs.isValid("StoreDataInSession")) { + this.session = {} + this.$toast.add({ + severity: "success", + summary: "Data Saved ", + detail: "Data Saved Successfully", + life: 3000, + }) + } else { + rs.showErrorToast("StoreDataInSession") + } + }) + }, + }, + } +</script> diff --git a/app/src/components/svgs/account_circle_black_24dp.svg b/app/src/components/svgs/account_circle_black_24dp.svg new file mode 100644 index 0000000000000000000000000000000000000000..3d0f00f7cf65d1c829656f753c5698c0e614c955 --- /dev/null +++ b/app/src/components/svgs/account_circle_black_24dp.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zM7.07 18.28c.43-.9 3.05-1.78 4.93-1.78s4.51.88 4.93 1.78C15.57 19.36 13.86 20 12 20s-3.57-.64-4.93-1.72zm11.29-1.45c-1.43-1.74-4.9-2.33-6.36-2.33s-4.93.59-6.36 2.33C4.62 15.49 4 13.82 4 12c0-4.41 3.59-8 8-8s8 3.59 8 8c0 1.82-.62 3.49-1.64 4.83zM12 6c-1.94 0-3.5 1.56-3.5 3.5S10.06 13 12 13s3.5-1.56 3.5-3.5S13.94 6 12 6zm0 5c-.83 0-1.5-.67-1.5-1.5S11.17 8 12 8s1.5.67 1.5 1.5S12.83 11 12 11z"/></svg> \ No newline at end of file diff --git a/app/src/components/upload-manager/uploadFile.vue b/app/src/components/upload-manager/uploadFile.vue new file mode 100644 index 0000000000000000000000000000000000000000..dae880b66aaad80bf45867087dba045bb6cc4731 --- /dev/null +++ b/app/src/components/upload-manager/uploadFile.vue @@ -0,0 +1,169 @@ +<template> + <div id="uploadFile" class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Upload File + </h2> + <div class="row"> + <div class="col-6"> + <div class="box-login"> + <!-- <div class="p-card p-component"> + <div class="field"> + <div class="p-float-label"> + <input type="text" v-model="upload.cdnBaseUrl" class="p-inputtext p-component w-100" + :class="upload.cdnBaseUrl ? 'p-filled' : ''" id="cdnBaseUrl"> + <label for="cdnBaseUrl">CDN Base Url</label> + </div> + </div> + <div class="field"> + <div class="p-float-label"> + <input type="text" v-model="upload.uploadFileUrl" class="p-inputtext p-component w-100" + :class="upload.uploadFileUrl ? 'p-filled' : ''" id="uploadFileUrl"> + <label for="uploadFileUrl">File Upload Url</label> + </div> + </div> + <div class="field"> + <div class="p-float-label"> + <input type="text" v-model="upload.destinationFileUrl" class="p-inputtext p-component w-100" + :class="upload.destinationFileUrl ? 'p-filled' : ''" id="destinationFileUrl"> + <label for="destinationFileUrl">Destination File Url</label> + </div> + </div> + <div class="btn-wrapper"> + <button class="btn btn-submit" @click.prevent="uploadFile"> + <i class="isax isax-bold-document-upload"></i> + Upload File + </button> + </div> + <div class="field mt-4"> + <h3>Result</h3> + <json-viewer :value="uploadResult" boxed :expanded="true"></json-viewer> + </div> + </div> --> + <FormKit + type="form" + id="registration-example" + :form-class="submitted ? 'hide' : 'show'" + submit-label="Upload" + @submit="uploadFile" + :actions="false" + #default="{ value }" + > + <FormKit + type="text" + name="sessionName" + label="CDN Base Url" + v-model="upload.cdnBaseUrl" + placeholder="CDN Base Url" + help="Enter CDN Base Url" + validation="required" + /> + <FormKit + type="text" + name="sessionName" + label="File Upload Url" + v-model="upload.uploadFileUrl" + placeholder="File Upload Url" + help="Enter File Upload Url" + validation="required" + /> + <FormKit + type="text" + name="sessionName" + label="Destination File Url" + v-model="upload.destinationFileUrl" + placeholder="Destination File Url" + help="Enter Destination File Url" + validation="required" + /> + <FormKit type="submit" label="Upload File" /> + </FormKit> + <div class="field mt-4"> + <h3>Result</h3> + <json-viewer :value="uploadResult" boxed :expanded="true"></json-viewer> + </div> + </div> + </div> + <div class="col-6"> + <div class="box-login"> + <h4>Please start the multipart server before uploading files testing</h4> + <ul class="list"> + <li> + cdnBaseUrl: + <div>"https://cstest.mkcl.org/uploadFile/uploadsinglefile"</div> + </li> + <li> + uploadFileUrl: + <div> + "/app/CoreSLS/ProjectConfigBackup/1JFfwe3g8vHuNOtxk2BsH09pBA5/05_06_2021/1JFfwe3g8vHuNOtxk2BsH09pBA5_1622894824.json" + </div> + </li> + <li>destinationFileUrl: ""</li> + </ul> + </div> + </div> + </div> + </div> +</template> + +<script> + import MQL from "@/plugins/mql.js" + import jsonViewer from "vue-json-viewer" + export default { + data() { + return { + upload: {}, + uploadId: "", + uploadResult: "", + } + }, + components: { + jsonViewer, + }, + methods: { + uploadFile() { + // var a = [] + // a.push(this.upload.uploadFileUrl) + // this.upload.uploadFileUrl = a + var a = { + cdnBaseUrl: [this.upload.cdnBaseUrl], + uploadFileUrl: [this.upload.uploadFileUrl], + destinationFileUrl: [this.upload.destinationFileUrl], + } + new MQL() + .setActivity("o.[UploadFileUsingUM]") + .setData(a) + .fetch() + .then((rs) => { + let res = rs.getActivity("UploadFileUsingUM", true) + if (rs.isValid("UploadFileUsingUM")) { + this.upload = {} + this.uploadResult = res.result + this.$toast.success("Upload Success") + } else { + rs.showErrorToast("UploadFileUsingUM") + } + }) + }, + }, + } +</script> + +<style scoped lang="scss"> + h4 { + margin-bottom: 1rem; + } + .list { + padding: 0 1rem; + li { + font-weight: 600; + div { + font-weight: 400; + word-break: break-word; + } + & + li { + margin-top: 0.75rem; + } + } + } +</style> diff --git a/app/src/components/upload-manager/uploadProgessFile.vue b/app/src/components/upload-manager/uploadProgessFile.vue new file mode 100644 index 0000000000000000000000000000000000000000..a5f02894773a5faad17ce71ee6afa04f2c331743 --- /dev/null +++ b/app/src/components/upload-manager/uploadProgessFile.vue @@ -0,0 +1,106 @@ +<template> + <div id="progessFile" class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Check Progress + </h2> + <div class="row justify-content-center"> + <div class="col-auto"> + <div class="box-login"> + <!-- <div class="p-card p-component"> + <div class="field"> + <div class="p-float-label"> + <input type="text" v-model="uploadId" class="p-inputtext p-component" :class="uploadId ? 'p-filled' : ''" id="uploadId"> + <label for="uploadId">Upload Id</label> + </div> + </div> + <div class="btn-wrapper"> + <button class="btn btn-submit" @click.prevent="checkUploadProgress"> + <i class="isax isax-bold-tick-circle"></i> + Check Progress + </button> + </div> + <div class="field mt-4"> + <h3>Result</h3> + <json-viewer :value="progressResult" boxed :expanded="true"></json-viewer> + </div> + </div> --> + <FormKit + type="form" + id="registration-example" + :form-class="submitted ? 'hide' : 'show'" + submit-label="Upload" + @submit="checkUploadProgress" + :actions="false" + #default="{ value }" + > + <FormKit + type="text" + name="sessionName" + label="Upload Id" + v-model="uploadId" + placeholder="Upload Id" + help="Enter Upload Id" + validation="required" + /> + <FormKit type="submit" label="Check Progress" /> + </FormKit> + <div class="field mt-4"> + <h3>Result</h3> + <json-viewer :value="progressResult" boxed :expanded="true"></json-viewer> + </div> + </div> + </div> + </div> + </div> +</template> + +<script> + import MQL from "@/plugins/mql.js" + import jsonViewer from "vue-json-viewer" + export default { + data() { + return { + uploadId: "", + progressResult: "", + } + }, + components: { + jsonViewer, + }, + methods: { + checkUploadProgress() { + new MQL() + .setActivity("o.[CheckUploadedFileProgress]") + .setData({ uploadFileId: this.uploadId }) + .fetch() + .then((rs) => { + let res = rs.getActivity("CheckUploadedFileProgress", true) + if (rs.isValid("CheckUploadedFileProgress")) { + if (res && res.result) { + this.progressResult = res.result + this.uploadId = "" + this.$toast.add({ + severity: "success", + summary: "Upload Progress", + detail: "File Uploaded Successfully", + life: 3000, + }) + } else { + this.$toast.add({ + severity: "error", + summary: "Upload Progress", + detail: "File Upload Failed", + life: 3000, + }) + } + } else { + rs.showErrorToast("CheckUploadedFileProgress") + } + }) + }, + }, + } +</script> + +<style></style> diff --git a/app/src/formkit.config.js b/app/src/formkit.config.js new file mode 100644 index 0000000000000000000000000000000000000000..295521806bfe6bc3ce5c23d5d8e873fa4da540fc --- /dev/null +++ b/app/src/formkit.config.js @@ -0,0 +1,8 @@ +import "@formkit/themes/genesis" +import { genesisIcons } from "@formkit/icons" + +const config = { + icons: { ...genesisIcons } +} + +export default config diff --git a/app/src/index.css b/app/src/index.css new file mode 100644 index 0000000000000000000000000000000000000000..bd6213e1dfe6b0a79ce7d8b37d0d2dc70f0250bb --- /dev/null +++ b/app/src/index.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; \ No newline at end of file diff --git a/app/src/lang/dv.json b/app/src/lang/dv.json new file mode 100644 index 0000000000000000000000000000000000000000..3de7ad26f40f361212cef7411347de56ceeaaa88 --- /dev/null +++ b/app/src/lang/dv.json @@ -0,0 +1,28 @@ +{ + "about": { + "aboutHeading": "aboutHeading" + }, + "home": { + "homeTitle": "homeTitle" + }, + "demo": { + "demoHeading": "demoHeading" + }, + "component2": { + "title": "title" + }, + "validation": { + "nameRequired": "nameRequired", + "nameAlpha": "nameAlpha", + "emailValid": "emailValid", + "emailRequired": "emailRequired", + "phoneNumeric": "phoneNumeric", + "phoneRequired": "phoneRequired", + "fullnameRequired": "fullnameRequired", + "fullnameValidate": "fullnameValidate", + "credit_cardRequired": "credit_cardRequired", + "credit_cardValidate": "credit_cardValidate", + "ipValid": "ipValid", + "phoneMinLength": "phoneMinLength" + } + } \ No newline at end of file diff --git a/app/src/lang/en.json b/app/src/lang/en.json new file mode 100644 index 0000000000000000000000000000000000000000..d2eccae7d61203bdd43793be2d3846dce927db38 --- /dev/null +++ b/app/src/lang/en.json @@ -0,0 +1,31 @@ +{ + "about": { + "aboutHeading": "This is an about page" + }, + "home": { + "homeTitle": "This is home page" + }, + "demo": { + "demoHeading": "This is text" + }, + "component2": { + "title": "English text (Loaded from file)" + }, + "validation": { + "nameRequired": "The Name field is required", + "nameAlpha": "The Name field may only contain alphabetic characters.", + "emailValid": "The Email field must be a valid email.", + "emailRequired": "The Email field is required.", + "phoneNumeric": "The Phone number field format is invalid.", + "phoneRequired": "Phone no field is required.", + "fullnameRequired": "The fullname field is required.", + "fullnameValidate": "The fullname field may only contain alphabetic characters as well as spaces.", + "credit_cardRequired": "The credit card field is required.", + "credit_cardValidate": "The credit card field is invalid.", + "credit_cardMinimum":"The credit card field must be of 16 characters.", + "ipRequired": "The ip field is required.", + "ipValid": "The ip field must be a valid ip address.", + "phoneMinLength": "The phone field must be at least 10 characters.", + "stateRequired": "The state field is required." + } +} diff --git a/app/src/lang/hi.json b/app/src/lang/hi.json new file mode 100644 index 0000000000000000000000000000000000000000..a3924e1044a1be009e9f1c7804449edc15433889 --- /dev/null +++ b/app/src/lang/hi.json @@ -0,0 +1 @@ +{"about":{"aboutHeading":"यह à¤à¤• पेज के बारे में है"},"component2":{"title":"अंगà¥à¤°à¥‡à¤œà¥€ पाठ(फ़ाइल से लोड)"},"demo":{"demoHeading":"यह पाठहै"},"home":{"homeTitle":"यह होम पेज है"},"validation":{"credit_cardMinimum":"कà¥à¤°à¥‡à¤¡à¤¿à¤Ÿ कारà¥à¤¡ फ़ीलà¥à¤¡ 16 वरà¥à¤£à¥‹à¤‚ की होनी चाहिà¤à¥¤","credit_cardRequired":"कà¥à¤°à¥‡à¤¡à¤¿à¤Ÿ कारà¥à¤¡ फ़ीलà¥à¤¡ आवशà¥à¤¯à¤• है।","credit_cardValidate":"कà¥à¤°à¥‡à¤¡à¤¿à¤Ÿ कारà¥à¤¡ फ़ीलà¥à¤¡ अमानà¥à¤¯ है।","emailRequired":"ईमेल कà¥à¤·à¥‡à¤¤à¥à¤° की आवशà¥à¤¯à¤•à¤¤à¤¾ है।","emailValid":"ईमेल फ़ीलà¥à¤¡ à¤à¤• मानà¥à¤¯ ईमेल होनी चाहिà¤à¥¤","fullnameRequired":"फà¥à¤²à¤¨à¤¾à¤® फ़ीलà¥à¤¡ आवशà¥à¤¯à¤• है।","fullnameValidate":"पूरà¥à¤£ नाम फ़ीलà¥à¤¡ में केवल वरà¥à¤£à¤®à¤¾à¤²à¤¾ के साथ-साथ रिकà¥à¤¤ सà¥à¤¥à¤¾à¤¨ हो सकते हैं।","ipRequired":"आईपी फ़ीलà¥à¤¡ की आवशà¥à¤¯à¤•à¤¤à¤¾ है।","ipValid":"आईपी फ़ीलà¥à¤¡ à¤à¤• मानà¥à¤¯ आईपी पता होना चाहिà¤à¥¤","nameAlpha":"नाम फ़ीलà¥à¤¡ में केवल वरà¥à¤£à¤®à¤¾à¤²à¤¾ वरà¥à¤£ हो सकते हैं।","nameRequired":"नाम का फीलà¥à¤¡ आवशà¥à¤¯à¤• है","phoneMinLength":"फोन फ़ीलà¥à¤¡ में कम से कम 10 अकà¥à¤·à¤° होने चाहिà¤à¥¤","phoneNumeric":"फ़ोन नंबर फ़ीलà¥à¤¡ पà¥à¤°à¤¾à¤°à¥‚प अमानà¥à¤¯ है।","phoneRequired":"फ़ोन नहीं फ़ीलà¥à¤¡ की आवशà¥à¤¯à¤•à¤¤à¤¾ है।","stateRequired":"राजà¥à¤¯ कà¥à¤·à¥‡à¤¤à¥à¤° की आवशà¥à¤¯à¤•à¤¤à¤¾ है।"}} \ No newline at end of file diff --git a/app/src/lang/mr.json b/app/src/lang/mr.json new file mode 100644 index 0000000000000000000000000000000000000000..f48f5ec2423c79f3b96852c06aefc4a5e31e1975 --- /dev/null +++ b/app/src/lang/mr.json @@ -0,0 +1,31 @@ +{ + "about": { + "aboutHeading": "हे à¤à¤• पृषà¥à¤ बदà¥à¤¦à¤² आहे" + }, + "component2": { + "title": "इंगà¥à¤°à¤œà¥€ मजकूर (फाइलमधून लोड)" + }, + "demo": { + "demoHeading": "हा मजकूर आहे" + }, + "home": { + "homeTitle": "हे मà¥à¤–à¥à¤¯à¤ªà¥ƒà¤·à¥à¤ आहे" + }, + "validation": { + "credit_cardMinimum": "कà¥à¤°à¥‡à¤¡à¤¿à¤Ÿ कारà¥à¤¡ फीलà¥à¤¡ 16 वरà¥à¤£à¤¾à¤‚चे असणे आवशà¥à¤¯à¤• आहे.", + "credit_cardRequired": "कà¥à¤°à¥‡à¤¡à¤¿à¤Ÿ कारà¥à¤¡ फीलà¥à¤¡ आवशà¥à¤¯à¤• आहे.", + "credit_cardValidate": "कà¥à¤°à¥‡à¤¡à¤¿à¤Ÿ कारà¥à¤¡ फीलà¥à¤¡ अवैध आहे.", + "emailRequired": "ईमेल फीलà¥à¤¡ आवशà¥à¤¯à¤• आहे.", + "emailValid": "ईमेल फीलà¥à¤¡ वैध ईमेल असणे आवशà¥à¤¯à¤• आहे.", + "fullnameRequired": "पूरà¥à¤£ नाव फीलà¥à¤¡ आवशà¥à¤¯à¤• आहे.", + "fullnameValidate": "पूरà¥à¤£ नाव फीलà¥à¤¡à¤®à¤§à¥à¤¯à¥‡ फकà¥à¤¤ वरà¥à¤£à¤®à¤¾à¤²à¤¾ तसेच रिकà¥à¤¤ सà¥à¤¥à¤¾à¤¨ असू शकतात.", + "ipRequired": "आयपी फीलà¥à¤¡ आवशà¥à¤¯à¤• आहे.", + "ipValid": "आयपी फीलà¥à¤¡ वैध आयपी पतà¥à¤¤à¤¾ असणे आवशà¥à¤¯à¤• आहे.", + "nameAlpha": "नेम फीलà¥à¤¡à¤®à¤§à¥à¤¯à¥‡ फकà¥à¤¤ वरà¥à¤£à¤®à¤¾à¤²à¤¾ वरà¥à¤£ असू शकतात.", + "nameRequired": "नाव फीलà¥à¤¡ आवशà¥à¤¯à¤• आहे", + "phoneMinLength": "फोन फीलà¥à¤¡ किमान 10 वरà¥à¤£à¤¾à¤‚चे असणे आवशà¥à¤¯à¤• आहे.", + "phoneNumeric": "फोन नंबर फीलà¥à¤¡ सà¥à¤µà¤°à¥‚पन अवैध आहे.", + "phoneRequired": "फोन फीलà¥à¤¡ आवशà¥à¤¯à¤• नाही.", + "stateRequired": "राजà¥à¤¯ फीलà¥à¤¡ आवशà¥à¤¯à¤• आहे." + } +} diff --git a/app/src/main.js b/app/src/main.js new file mode 100644 index 0000000000000000000000000000000000000000..be890ac4444e81a082e5e2c6bebb989a59b6e0b2 --- /dev/null +++ b/app/src/main.js @@ -0,0 +1,98 @@ +import { createApp, h } from 'vue' +import VueClipboard from 'vue3-clipboard' +import App from './App.vue' +import router from './router' +import './registerServiceWorker' +import mqlOptions from './plugins/mqlOptions.js' +import { loadLanguageAsync, i18n } from './setup/i18n-setup.js' +import { createMetaManager } from "vue-meta"; +import Toaster from '@meforma/vue-toaster' +import '/assets/plugins/bootstrap/bootstrap-grid.min.css' +import '/assets/plugins/bootstrap/bootstrap-utilities.min.css' +import '../assets/fonts/iconsax/style.css' +import '../assets/css/template.scss' +import "./index.css" +import { plugin, defaultConfig } from '@formkit/vue' +import formKitConfig from './formkit.config' +import { createPinia } from 'pinia' +const piniaStore = createPinia() +var vm = createApp({ + render: () => h(App), +}) +// window.app = vm +vm.use(piniaStore) +vm.$router = router +vm.use(i18n) +vm.use(router) +vm.use(plugin, defaultConfig(formKitConfig)) +vm.use(defaultConfig) +vm.use(createMetaManager()) +vm.use(VueClipboard, { + autoSetContainer: true, + appendToBody: true, +}) +vm.use(Toaster, { + position: "top-right", + duration: 3000 +}) +var baseURL = '/server' +var cdnBaseURL = '/cdnserver' + +vm.use(mqlOptions, { + baseURL: baseURL, + cdnBaseURL: cdnBaseURL, + cdnConfig: [], +}) + +// axios.defaults.baseURL = baseURL +// TODO: set axios header on login to session storage +// axios.defaults.headers.common['Authorization'] = 'Bearer ' + token + +// TODO: delete axios header on logout and clear session storage +// delete axios.defaults.headers.common['Authorization'] +// sessionStorage.setItem( +// 'user-token', +// 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.qCJ-hcgSTLgkaT7kfI6--xRm4IEpPFQmMj3UZ94gNo4' +// ) + +// vm.use(VueLocalStorage); + +router.beforeEach((to, from, next) => { + + const nearestWithTitle = to.matched + .slice() + .reverse() + .find((r) => r.meta && r.meta.title) + const nearestWithMeta = to.matched + .slice() + .reverse() + .find((r) => r.meta && r.meta.metaTags) + + if (nearestWithTitle) document.title = nearestWithTitle.meta.title + + Array.from(document.querySelectorAll('[data-vue-router-controlled]')).map((el) => el.parentNode.removeChild(el)) + + if (!nearestWithMeta) return loadLanguageAsync(to.meta.lang).then(() => next()) + nearestWithMeta.meta.metaTags + .map((tagDef) => { + const tag = document.createElement('meta') + Object.keys(tagDef).forEach((key) => { + tag.setAttribute(key, tagDef[key]) + }) + tag.setAttribute('data-vue-router-controlled', '') + return tag + }) + .forEach((tag) => document.head.appendChild(tag)) + next() +}) +// axios.interceptors.request.use(function (config) { +// // if (config.url.indexOf('/r/') !== -1) { // Check for restricted request +// if (config.headers.common['Authorization']) { +// } else { +// } +// // } +// return config +// }, function (error) { +// return Promise.reject(error) +// }) +vm.mount('#app') diff --git a/app/src/plugins/mql.js b/app/src/plugins/mql.js new file mode 100644 index 0000000000000000000000000000000000000000..1f196b206e912413931b4cc98b81b12c74e7f352 --- /dev/null +++ b/app/src/plugins/mql.js @@ -0,0 +1,348 @@ +import axios from 'axios' +import Response from '@/plugins/response.js' +import Swal from 'sweetalert2' +import {main} from "../store/index" + +function dialogConfirm({ title, text, errMsg }) { + return new Promise((resolve, reject) => { + Swal.fire({ + title: title, + text: text, + confirmButtonText: 'Yes', + showCancelButton: true, + cancelButtonText: 'Cancel' + }).then((obj) => { + if (obj.isConfirmed) { + resolve() + } else { + console.log("in reject", new Error(errMsg)); + reject(new Error(errMsg)) + } + }) + }) +} + +class MQL { + constructor(strActivities = null) { + let cancel + let isDevelopment = process.env.NODE_ENV !== 'production' + let CancelToken = axios.CancelToken + this.strActivities = strActivities + this.isQuery = false + this.isActivity = false + this.fetchableMap = new Map() + this.version = window.app.getVersion() + this.region = window.app.getRegion() + this.appCode = window.app.getAppCode() + this.activityType = 'o' + this.mqlString = '/mql' + this.isConfirm = false + this.showPageLoader = true + const QueryActivityKey = 'FetchQueryData' + this.mainStore = main() + const ActivitySplitter = '.[' + + const ObjActivityNameKey = 'ActivityName' + + const ObjActivityData = 'Data' + const mqlInstance = axios.create({ + baseURL: window.app.getBaseURL() + // baseURL: window.location.host, + // transformRequest: axios.defaults.transformRequest.concat( + // function (data, headers) { + // // compress strings if over 1KB + // if (typeof data === 'string' && data.length > 10) { + // headers['Content-Encoding'] = 'gzip'; + // return pako.gzip(data); + // } else { + // // delete is slow apparently, faster to set to undefined + // //headers['Content-Encoding'] = undefined; + // return data; + // } + // } + // ) + }) + mqlInstance.interceptors.request.use( + function (config) { + if (config.url.indexOf('r/mql') !== -1 || config.url.indexOf('r/c/mql') !== -1) { + // Check for restricted request + if (sessionStorage.getItem('user-token') === null) { + cancel('Operation canceled by the MQL interceptor.') + // TODO: Uncomment below code for dispatch + // this.mainStore .dispatch('AUTH_LOGOUT') + } + } + return config + }, + function (error) { + return Promise.reject(error) + } + ) + // mqlInstance.interceptors.response.use( + // function (config) { + // if (config.url.indexOf('r/') !== -1) { + // // Check for restricted request + // if (sessionStorage.getItem('user-token') === null) { + // cancel('Operation canceled by the MQL interceptor.') + // //TODO: Uncomment below code for dispatch + // // this.mainStore .dispatch('AUTH_LOGOUT') + // } + // } + // return config + // }, + // function (error) { + // return Promise.reject(error) + // } + // ) + this.formatActivity = function (activityStr) { + let activityArray = [] + this.activityType = activityStr.split(ActivitySplitter)[0] + this.fetchableMap.set('ActivityType', this.activityType) + activityArray = activityStr + .split(ActivitySplitter)[1] + .substring(0, activityStr.split(ActivitySplitter)[1].length - 1) + .split(',') + activityArray.map((item) => { + let obj = {} + + let srvName + obj[ObjActivityData] = null + if (item.match(/query_/) !== null && item.match(/query_/).length > 0) { + obj[item] = item.trim() + srvName = item.trim() + this.isQuery = true + } else { + obj[ObjActivityNameKey] = item.trim() + srvName = item.trim() + this.isActivity = true + } + this.fetchableMap.set(srvName, obj) + }) + } + this.deepFreeze = (object) => { + // Retrieve the property names defined on object + var propNames = Object.getOwnPropertyNames(object) + // Freeze properties before freezing self + for (let name of propNames) { + let value = object[name] + object[name] = value && typeof value === 'object' ? this.deepFreeze(value) : value + } + // return Object.freeze(object) + return object + } + this.generateURL = (activityType, customURL) => { + if (customURL != null && customURL !== undefined) { + return customURL + this.getVersion() + this.getRegion() + this.getAppCode() + this.getServiceURL(activityType) + } else { + return this.getVersion() + this.getRegion() + this.getAppCode() + this.getServiceURL(activityType) + } + } + this.getServiceURL = (activityType) => { + return ( + (activityType.toLowerCase() === 'c' ? 'r/' + activityType.toLowerCase() : activityType.toLowerCase()) + + this.mqlString + ) + } + this.generateHeaders = (activityType, activities, headers = {}, isQuery = false) => { + headers['Service-Header'] = isQuery ? QueryActivityKey : activities + if (activityType !== 'o') { + headers['Authorization'] = 'Bearer ' + sessionStorage.getItem('user-token') + } + return headers + } + this.getVersion = function () { + // return '' + return this.version != null || this.version !== undefined ? this.version + '/' : '' + } + this.getRegion = function () { + // return '' + return this.region != null || undefined !== this.region ? this.region + '/' : '' + } + this.getAppCode = function () { + // return '' + return this.appCode != null || this.appCode !== undefined ? this.appCode + '/' : '' + } + /* Setter methods */ + this.setActivity = function (strActivities = null) { + this.strActivities = strActivities + this.formatActivity(this.strActivities) + return this + } + this.setData = function (strActivity = null, strDataObj = null) { + if (strActivity === null) { + } else if (strDataObj === null) { + // common data + for (let [key, value] of this.fetchableMap) { + if (value[ObjActivityData] === null) { + value[ObjActivityData] = strActivity + this.fetchableMap.set(key, value) + } + } + } else { + // service specific + let activityValue = this.fetchableMap.get(strActivity) + activityValue[ObjActivityData] = strDataObj + this.fetchableMap.set(strActivity, activityValue) + } + return this + } + this.setHeader = function (obj_header = {}) { + this.fetchableMap.set('Header', obj_header) + return this + } + this.setCustomURL = function (str_customURL = null) { + this.fetchableMap.set('CustomURL', str_customURL) + return this + } + this.showConfirmDialog = function (boolConfirmation = false) { + this.isConfirm = boolConfirmation + return this + } + this.enablePageLoader = function (boolShowPageLoader = false) { + this.showPageLoader = boolShowPageLoader + return this + } + this.setLoginActivity = function () { + this.setActivity('o.[ldapLogin]') + // this.setCustomURL('/o/mql/login') + // this.activityType = '' + // this.mqlString = '' + return this + } + this.fetch = function (docId = null) { + return new Promise((resolve, reject) => { + let self = this + if (this.isConfirm) { + dialogConfirm({ + title: 'Confirmation', + text: 'Are you sure you want to continue ?', + errMsg: 'Cancelled by User', + }) + .then(() => { + let rs = self.run(docId, self.isQuery, self.isActivity, self.fetchableMap, self.activityType) + resolve(rs) + }) + .catch(e => { + // eslint-disable-next-line prefer-promise-reject-errors + resolve(new Response({ + data: { + error: e.message, + errorCode: 1990, + result: null + } + })) + }) + } else { + let rs = self.run(docId, self.isQuery, self.isActivity, self.fetchableMap, self.activityType) + resolve(rs) + } + }).catch((error) => { + // Handling development related errors + if (isDevelopment) { + alert(error) + } + }) + } + this.run = function (docId = null, isQuery = false, isActivity = false, fetchableMap = null, activityType = 'o') { + return new Promise((resolve) => { + // TODO: seperate this in new function + let txt = 'Processing' + if (this.showPageLoader && this.mainStore !== undefined && this.mainStore !== null) { + this.mainStore.MUTATE_PAGE_BLOCKER(true) + } + if (docId !== null && document.getElementById(docId) !== null) { + txt = document.getElementById(docId).innerHTML + document.getElementById(docId).disabled = true + document.getElementById(docId).innerHTML = 'Processing' + } + let postParamObject = {} + let activities = '' + if (isQuery && isActivity) { + let obj = {} + obj.data = {} + obj.data.error = 'Can not support query and activity in a single execution' + obj.data.errorCode = 1990 + obj.data.result = null + + resolve(new Response(obj)) + } else { + fetchableMap.set('isQuery', isQuery) + } + let payloadObject = {} + for (var [key, value] of fetchableMap) { + if ( + key.search('ActivityType') < 0 && + key.search('Header') < 0 && + key.search('CustomURL') < 0 && + key.search('isQuery') < 0 + ) { + activities = activities + ',' + key + // eslint-disable-next-line standard/computed-property-even-spacing + payloadObject[ + key.match(/query_/) !== null && key.match(/query_/).length > 0 + ? key.substring('query_'.length, key.length) + : key + ] = value.Data + } + } + if (this.isQuery) { + payloadObject['fetchGroup'] = activities + .substring(1, activities.length) + .split(',') + .map((item) => { + return item.substring('query_'.length, item.length) + }) + postParamObject[QueryActivityKey] = payloadObject + } else { + postParamObject = payloadObject + } + mqlInstance({ + url: this.generateURL(activityType, fetchableMap.get('CustomURL')), + method: 'Post', + headers: this.generateHeaders( + activityType, + activities.substring(1, activities.length), + fetchableMap.get('Header'), + isQuery + ), + data: postParamObject, + cancelToken: new CancelToken(function executor(c) { + cancel = c + }) + }) + .then((res) => { + if (docId !== null && document.getElementById(docId) !== null) { + document.getElementById(docId).disabled = false + document.getElementById(docId).innerHTML = txt + } + if (this.showPageLoader) { + this.mainStore.MUTATE_PAGE_BLOCKER(false) + } + resolve(new Response(res)) + }) + .catch((error) => { + let obj = {} + obj.data = {} + if (docId !== null && document.getElementById(docId) !== null) { + document.getElementById(docId).disabled = false + document.getElementById(docId).innerHTML = txt + } + if (this.showPageLoader) { + this.mainStore.MUTATE_PAGE_BLOCKER(false) + } + obj.data.error = error.message + obj.data.errorCode = 1990 + obj.data.result = null + resolve(new Response(obj)) + }) + }).catch((error) => { + // Handling development related errors + if (isDevelopment) { + alert(error) + } + }) + } + } +} + +export default MQL diff --git a/app/src/plugins/mqlAssetFDB.js b/app/src/plugins/mqlAssetFDB.js new file mode 100644 index 0000000000000000000000000000000000000000..28abefa521bf07096fba1f362516aef3fcdd32f4 --- /dev/null +++ b/app/src/plugins/mqlAssetFDB.js @@ -0,0 +1,294 @@ +import axios from "axios" +import Response from "@/plugins/response.js" +import { main } from "../store/index" +const Vue = window.app + +class mqlAssetFDB { + constructor(indexId = null) { + let cancel + let isDevelopment = process.env.NODE_ENV !== "production" + let CancelToken = axios.CancelToken + this.assetData = new FormData() + this.route = "assetfdb" + this.downloadRoute = "assetdownload" + this.hostName = "" + this.fileName = "" + this.indexType = "o" + this.indexId = indexId + this.recordId = "" + const IndexSplitter = "." + this.customURL = "" + this.mainStore = main() + const mqlInstance = axios.create({ + baseURL: Vue.getBaseURL(), + }) + + mqlInstance.interceptors.request.use( + function (config) { + if (config.url.indexOf("r/mql") !== -1 || config.url.indexOf("r/c/mql") !== -1) { + if (sessionStorage.getItem("user-token") === null) { + cancel("Operation canceled by the MQL interceptor.") + } + } + return config + }, + function (error) { + return Promise.reject(error) + } + ) + + const setHeaders = (headers = {}) => { + headers["Authorization"] = "Bearer " + sessionStorage.getItem("user-token") + headers["Content-Type"] = "multipart/form-data" + return headers + } + + this.formatIndex = function (indexIdStr) { + this.indexType = indexIdStr.split(IndexSplitter)[0] + this.indexId = indexIdStr.split(IndexSplitter)[1] + } + + // TODO: Validate the necessary params by creating a helper function + // to generate url for uploading an asset + this.generateUploadURL = () => { + let url = `${this.indexType}/${this.route}/${this.hostName}/${this.indexId}` + if (this.customURL) { + url = `${this.customURL}/${url}` + } else { + url = `/${url}` + } + return url + } + this.generateUpdateURL = () => { + let url = `${this.indexType}/${this.route}/${this.hostName}/${this.indexId}` + if (this.recordId) { + url = `${url}/${this.recordId}` + } else { + url = `${url}/` + return url + } + if (this.customURL) { + url = `${this.customURL}/${url}` + return url + } else { + url = `/${url}` + return url + } + } + this.generateStreamURL = (assetPath) => { + let url = `${this.indexType}/${this.route}` + if (assetPath) { + url = `${url}/${assetPath}` + } else { + console.error("Asset Path cannot be null") + return + } + if (this.customURL) { + url = `${this.customURL}/${url}` + return url + } else { + url = `/server/${url}` + return url + } + } + this.generateDownloadURL = (assetPath) => { + let url = `${this.indexType}/${this.downloadRoute}` + if (assetPath) { + url = `${url}/${assetPath}` + } else { + console.error("Asset Path cannot be null") + return + } + if (this.customURL) { + url = `${this.customURL}/${url}` + return url + } else { + url = `/server/${url}` + return url + } + } + this.setIndex = function (indexId) { + this.formatIndex(indexId) + return this + } + + this.setHostName = function (hostName) { + this.hostName = hostName + return this + } + this.setFormData = (formData) => { + this.fileName = formData.get("file").name + this.assetData.append("asset", formData.get("file")) + return this + } + + this.setCustomURL = (customURL) => { + this.customURL = customURL + return this + } + + this.setAssetData = function (assetData) { + assetData = JSON.stringify(assetData) + this.assetData.set("data", assetData) + return this + } + + this.enablePageLoader = function (boolShowPageLoader = false) { + this.showPageLoader = boolShowPageLoader + return this + } + + this.setUpdateWithRecordId = function (recordId) { + this.recordId = recordId + return this + } + + this.uploadAssetFile = (docId = null) => { + let txt = "" + if (this.showPageLoader) { + // window.app.$store.dispatch('app/MUTATE_PAGE_BLOCKER', true) + this.mainStore.MUTATE_PAGE_BLOCKER(true) + } + return new Promise((resolve) => { + if (docId !== null && document.getElementById(docId) !== null) { + txt = document.getElementById(docId).innerHTML + document.getElementById(docId).disabled = true + document.getElementById(docId).innerHTML = "Processing" + } + let url = "" + if (this.recordId) { + url = this.generateUpdateURL() + } else { + url = this.generateUploadURL() + } + if (this.indexId) { + mqlInstance({ + url: url, + method: "POST", + headers: setHeaders(), + data: this.assetData, + cancelToken: new CancelToken(function executor(c) { + cancel = c + }), + }) + .then((res) => { + if (this.showPageLoader) { + // window.app.$store.dispatch('app/MUTATE_PAGE_BLOCKER', false) + this.mainStore.MUTATE_PAGE_BLOCKER(true) + } + if (docId !== null && document.getElementById(docId) !== null) { + document.getElementById(docId).disabled = false + document.getElementById(docId).innerHTML = txt + } + let obj = {} + obj.data = {} + obj.data.errorCode = 1000 + obj.data.result = res.data + resolve(new Response(obj)) + }) + .catch((error) => { + let obj = {} + obj.data = {} + if (docId !== null && document.getElementById(docId) !== null) { + document.getElementById(docId).disabled = false + document.getElementById(docId).innerHTML = txt + } + if (this.showPageLoader) { + // window.app.$store.dispatch('app/MUTATE_PAGE_BLOCKER', false) + this.mainStore.MUTATE_PAGE_BLOCKER(false) + } + obj.data.error = error.message + obj.data.errorCode = 1990 + obj.data.result = null + resolve(new Response(obj)) + }) + } else { + if (docId !== null && document.getElementById(docId) !== null) { + document.getElementById(docId).disabled = false + document.getElementById(docId).innerHTML = txt + } + let obj = {} + obj.data = {} + obj.data.error = "Data Not Found" + this.assetData + obj.data.errorCode = 1990 + obj.data.result = null + resolve(new Response(obj)) + } + }).catch((error) => { + // Handling development related errors + if (isDevelopment) { + alert(error) + } + }) + } + + this.download = (assetPath, docId = null) => { + let txt = "" + if (this.showPageLoader) { + // window.app.$store.dispatch('app/MUTATE_PAGE_BLOCKER', true) + this.mainStore.MUTATE_PAGE_BLOCKER(true) + } + return new Promise((resolve) => { + if (docId !== null && document.getElementById(docId) !== null) { + txt = document.getElementById(docId).innerHTML + document.getElementById(docId).disabled = true + document.getElementById(docId).innerHTML = "Processing" + } + if (assetPath) { + window.open(this.generateDownloadURL(assetPath), "_blank") + } else { + if (docId !== null && document.getElementById(docId) !== null) { + document.getElementById(docId).disabled = false + document.getElementById(docId).innerHTML = txt + } + let obj = {} + obj.data = {} + obj.data.error = "No Data Found" + this.assetData + obj.data.errorCode = 1990 + obj.data.result = null + resolve(new Response(obj)) + } + }).catch((error) => { + // Handling development related errors + if (isDevelopment) { + alert(error) + } + }) + } + this.render = (assetPath, docId = null) => { + let txt = "" + if (this.showPageLoader) { + // window.app.$store.dispatch('app/MUTATE_PAGE_BLOCKER', true) + this.mainStore.MUTATE_PAGE_BLOCKER(true) + } + return new Promise((resolve) => { + if (docId !== null && document.getElementById(docId) !== null) { + txt = document.getElementById(docId).innerHTML + document.getElementById(docId).disabled = true + document.getElementById(docId).innerHTML = "Processing" + } + if (assetPath) { + window.open(this.generateStreamURL(assetPath), "_blank") + } else { + if (docId !== null && document.getElementById(docId) !== null) { + document.getElementById(docId).disabled = false + document.getElementById(docId).innerHTML = txt + } + let obj = {} + obj.data = {} + obj.data.error = "No Data Found" + this.assetData + obj.data.errorCode = 1990 + obj.data.result = null + resolve(new Response(obj)) + } + }).catch((error) => { + // Handling development related errors + if (isDevelopment) { + alert(error) + } + }) + } + } +} + +export default mqlAssetFDB diff --git a/app/src/plugins/mqlCdn.js b/app/src/plugins/mqlCdn.js new file mode 100644 index 0000000000000000000000000000000000000000..e7a83b11741ee65ad435c61136cc08b0008dfa87 --- /dev/null +++ b/app/src/plugins/mqlCdn.js @@ -0,0 +1,341 @@ +import axios from 'axios' +import Response from '@/plugins/response.js' +import { main } from "../store/index" +const Vue = window.app + +class MQLCdn { + constructor() { + // eslint-disable-next-line + let cancel + let requestProcessedWithoutErrorCode = 1000 + let isDevelopment = process.env.NODE_ENV !== 'production' + this.fileName = '' + this.formData = new FormData() + this.formData.set('enctype', 'multipart/form-data') + this.clientId = '' + this.bucketId = '' + this.isPrivateBucket = false + this.cdnURL = '' + this.cdnPath = '' + this.directoryPath = '' + this.forceCreateDirectory = true + this.showPageLoader = false + this.GateWayConfigObj = {} + this.savedConfig = {} + this.mainStore = main() + let CancelToken = axios.CancelToken + const mqlInstance = axios.create({ + baseURL: Vue.getCDNBaseURL() + }) + + // To set cdnPath and authorization header in request + const setHeaders = (headers = {}) => { + headers['Authorization'] = 'Bearer ' + sessionStorage.getItem('user-token') + if (this.directoryPath) { + headers['directoryPath'] = this.directoryPath + } + return headers + } + + // To set the bucket config data in multipart formrequest data to send to cdn + const setBucketConfigInFormData = (data) => { + this.formData.append('BucketId', this.bucketId) + this.formData.append('JWTKey', data.jwtKey) + this.formData.append('IsPrivateBucket', data.isPrivateBucket) + this.formData.append('forceCreateDirectory', this.forceCreateDirectory) + } + + // To get the filename from the request url for download + const getFilenameFromUrl = (url) => { + const pathname = decodeURIComponent(new URL(url).pathname) + const index = pathname.lastIndexOf('/') + return (index !== -1 ? pathname.substring(index + 1) : pathname) + } + + // To prepare post request to actual cdn server + const prepareMQLCDNRequest = (requestType, cdnURL, docId, txt) => { + return new Promise((resolve) => { + // client side file size check + if (this.bucketId !== undefined) { + if (this.savedConfig.maxFileSize && this.formData.get('file') && this.formData.get('file').size > this.savedConfig.maxFileSize) { + if (docId !== null && document.getElementById(docId) !== null) { + document.getElementById(docId).disabled = false + document.getElementById(docId).innerHTML = txt + } + let obj = {} + obj.data = {} + obj.data.error = 'File size exceeds the maximum limit of ' + this.savedConfig.maxFileSize / (1024 * 1024) + ' MB.' + obj.data.errorCode = 1990 + obj.data.result = null + return resolve(new Response(obj)) + } + + mqlInstance({ + url: this.cdnURL, + method: requestType, + headers: setHeaders(), + data: this.formData, + cancelToken: new CancelToken(function executor(c) { + cancel = c + }) + }) + .then(res => { + let obj = {} + obj.data = {} + obj.data.errorCode = 1000 + obj.data.result = res.data.result + if (res.data.errorCode !== requestProcessedWithoutErrorCode) { + obj.data.errorCode = res.data.errorCode + obj.data.error = res.data.error + if (this.showPageLoader) { + this.mainStore.MUTATE_PAGE_BLOCKER(false) + } + if (docId !== null && document.getElementById(docId) !== null) { + document.getElementById(docId).disabled = false + document.getElementById(docId).innerHTML = txt + } + } + resolve(new Response(obj)) + }) + .catch(error => { + console.log('fail error', error.message) + let obj = {} + obj.data = {} + if (docId !== null && document.getElementById(docId) !== null) { + document.getElementById(docId).disabled = false + document.getElementById(docId).innerHTML = txt + } + if (this.showPageLoader) { + // window.app.$store.dispatch('app/MUTATE_PAGE_BLOCKER', false) + this.mainStore.MUTATE_PAGE_BLOCKER(false) + + } + obj.data.error = error.message + obj.data.errorCode = 1990 + obj.data.result = null + resolve(new Response(obj)) + }) + } else { + if (docId !== null && document.getElementById(docId) !== null) { + document.getElementById(docId).disabled = false + document.getElementById(docId).innerHTML = txt + } + let obj = {} + obj.data = {} + obj.data.error = 'Invalid Bucket Key ' + this.bucketId + obj.data.errorCode = 1990 + obj.data.result = null + resolve(new Response(obj)) + } + }).catch(error => { + // Handling development related errors + if (isDevelopment) { + alert(error) + } + }) + } + + // To route request to actual cdn server + const uploadFileToCDN = (docId = null, cdnURL = '') => { + let txt = '' + if (this.showPageLoader) { + // window.app.$store.dispatch('app/MUTATE_PAGE_BLOCKER', true) + this.mainStore.MUTATE_PAGE_BLOCKER(true) + + } + return new Promise((resolve) => { + if (docId !== null && document.getElementById(docId) !== null) { + txt = document.getElementById(docId).innerHTML + document.getElementById(docId).disabled = true + document.getElementById(docId).innerHTML = 'Processing' + } + prepareMQLCDNRequest('POST', cdnURL, docId, txt).then(cdnResponse => { + if (this.showPageLoader) { + // window.app.$store.dispatch('app/MUTATE_PAGE_BLOCKER', false) + this.mainStore.MUTATE_PAGE_BLOCKER(false) + + } + if (docId !== null && document.getElementById(docId) !== null) { + document.getElementById(docId).disabled = false + document.getElementById(docId).innerHTML = txt + } + resolve(cdnResponse) + }) + }).catch(error => { + // Handling development related errors + console.log(error) + if (isDevelopment) { + alert(error) + } + }) + } + + // To set the filename in formData of multipart request + this.setFileName = (fileName) => { + if (fileName !== '' && fileName !== undefined) { + this.fileName = fileName.trim() + this.formData.append('fileName', this.fileName) + } else { + this.fileName = '' + } + return this + } + + // To set the path of file to be saved in + this.setCDNPath = (cdnPath) => { + this.cdnPath = cdnPath + return this + } + // To set the path of file to be saved in + this.setDirectoryPath = (directoryPath, forceCreate = true) => { + this.directoryPath = directoryPath + this.forceCreateDirectory = forceCreate + return this + } + + // To prepare formData + this.setFormData = (formData) => { + this.formData = formData + return this + } + + // To activate page loader while request completes processing + this.enablePageLoader = function (boolShowPageLoader = false) { + this.showPageLoader = boolShowPageLoader + return this + } + + // To get the bucket config from bucket name + this.setBucketKey = (bucketId) => { + this.bucketId = bucketId + // fetchBucketConfigFromKey(bucketId) + this.GateWayConfigObj.bucketConfig = [] + let data = { + 'bucketId': bucketId + } + this.GateWayConfigObj.bucketConfig.push(data) + return this + } + + // To set the purposeId for cdn + this.setPurposeId = (purposeId) => { + this.GateWayConfigObj.purposeId = purposeId + return this + } + + // To set the clientId for cdn + this.setClientId = (clientId) => { + this.GateWayConfigObj.clientId = clientId + return this + } + + // To set the userId for cdn + this.setUserId = (userId) => { + this.GateWayConfigObj.userId = userId + return this + } + + const getFileFromCDN = (cdnURL = '') => { + return new Promise((resolve) => { + mqlInstance({ + url: cdnURL, + method: 'GET', + headers: setHeaders(), + responseType: 'blob', + cancelToken: new CancelToken(function executor(c) { + cancel = c + }) + }) + .then(res => { + this.fileName = getFilenameFromUrl(this.cdnURL) + const url = window.URL.createObjectURL(new Blob([res.data], { type: 'application/octet-stream' })) + var a = document.createElement('a') + a.href = url + a.download = this.fileName + a.target = '_blank' + a.click() + }) + .catch(error => { + console.log('fail error', error.message) + let obj = {} + obj.data = {} + if (this.showPageLoader) { + // window.app.$store.dispatch('app/MUTATE_PAGE_BLOCKER', false) + this.mainStore.MUTATE_PAGE_BLOCKER(false) + + } + obj.data.error = error.message + obj.data.errorCode = 1990 + obj.data.result = null + resolve(new Response(obj)) + }) + }).catch(error => { + // Handling development related errors + console.log(error) + if (isDevelopment) { + alert(error) + } + }) + } + + this.uploadFile = (docId = null) => { + this.cdnURL = '/uploadfile' + let obj = {} + obj.data = {} + + this.savedConfig.jwtKey = '' + this.savedConfig.isPrivateBucket = true + + setBucketConfigInFormData(this.savedConfig) + return new Promise((resolve) => { + // uploadFileToCDN(docId, this.savedConfig.cdnURL).then(cdnres => { + uploadFileToCDN(docId, this.cdnURL).then(cdnres => { + obj.data = cdnres.raw + resolve(new Response(obj)) + }) + }) + } + + this.downloadFile = (docId = null) => { + let txt = '' + if (this.showPageLoader) { + // window.app.$store.dispatch('app/MUTATE_PAGE_BLOCKER', true) + this.mainStore.MUTATE_PAGE_BLOCKER(true) + + } + if (docId !== null && document.getElementById(docId) !== null) { + txt = document.getElementById(docId).innerHTML + document.getElementById(docId).disabled = true + document.getElementById(docId).innerHTML = 'Processing' + } + + return new Promise((resolve) => { + if (this.cdnPath.includes('http://') || this.cdnPath.includes('https://')) { + this.cdnURL = this.cdnPath + getFileFromCDN(this.cdnURL).then(res => { + resolve(res) + }) + } else { + this.cdnURL = window.location.origin + Vue.getCDNBaseURL() + '/' + this.cdnPath + getFileFromCDN(this.cdnURL).then(res => { + resolve(res) + }) + } + if (this.showPageLoader) { + // window.app.$store.dispatch('app/MUTATE_PAGE_BLOCKER', false) + this.mainStore.MUTATE_PAGE_BLOCKER(false) + } + if (docId !== null && document.getElementById(docId) !== null) { + document.getElementById(docId).disabled = false + document.getElementById(docId).innerHTML = txt + } + }).catch(error => { + // Handling development related errors + if (isDevelopment) { + alert(error) + } + }) + } + } +} +export default MQLCdn diff --git a/app/src/plugins/mqlOptions.js b/app/src/plugins/mqlOptions.js new file mode 100644 index 0000000000000000000000000000000000000000..820e26fe3498c3bf4cad4d8f98d4da975e839664 --- /dev/null +++ b/app/src/plugins/mqlOptions.js @@ -0,0 +1,60 @@ +export default { + install: (Vue, options) => { + let cdnServerList = [] + let baseURL = options.baseURL + let cdnBaseURL = options.cdnBaseURL + let version = options.version + let region = options.region + let appCode = options.appCode + let pageLoader = false + // TODO: check for values on staging /development/ production + let bucketConfigurations = process.env.NODE_ENV !== 'production' ? options.cdnConfig : null + + Vue.getBucketConfigByKey = (bucketId) => { + let result = bucketConfigurations.find(bucket => bucket.bucketId === bucketId) + return result + } + Vue.$PageLoader = pageLoader + Vue.setPageLoader = (show = false) => { + alert(show) + pageLoader = show + } + Vue.getBaseURL = () => { + return baseURL + } + Vue.getCDNBaseURL = () => { + return cdnBaseURL + } + Vue.setBaseURL = (str) => { + baseURL = str + } + + Vue.getVersion = function () { + return version + } + Vue.setVersion = function (str) { + version = str + } + + Vue.getRegion = function () { + return region + } + Vue.setRegion = function (str) { + region = str + } + + Vue.getAppCode = function () { + return appCode + } + Vue.setAppCode = function (str) { + appCode = str + } + Vue.getServerList = function (purposeId, bucketId) { + let result = cdnServerList.find(purpose => (purpose.purposeId === purposeId && purpose.bucketId === bucketId)) + return result + } + Vue.setServerList = function (obj) { + cdnServerList.push(obj) + } + } +} diff --git a/app/src/plugins/response.js b/app/src/plugins/response.js new file mode 100644 index 0000000000000000000000000000000000000000..cdc8bb39bbb33a5bbb7d4867ed3fc4834e0eb494 --- /dev/null +++ b/app/src/plugins/response.js @@ -0,0 +1,124 @@ +import router from '@/router.js' +class Response { + constructor(objRaw) { + this.raw = objRaw.data + this.headers = objRaw.headers + this.isReactive = false + if (this.headers !== undefined) { + if (this.headers.authorization !== undefined) { + sessionStorage.setItem('user-token', this.headers.authorization) + } + } + + this.setReactivity = isReactive => { + this.isReactive = isReactive + } + this.deepFreeze = object => { + // Retrieve the property names defined on object + if (object === undefined || object === null) { + return object + } + var propNames = Object.getOwnPropertyNames(object) + // Freeze properties before freezing self + for (let name of propNames) { + let value = object[name] + object[name] = + value && typeof value === 'object' ? this.deepFreeze(value) : value + } + return Object.freeze(object) + } + this.getRaw = function (isReactive = false) { + return isReactive ? this.raw : this.deepFreeze(this.raw) + } + this.getHeaders = function () { + return this.headers + } + this.showElement = function (strDocId) { + if (strDocId != null) { + var x = document.getElementById(strDocId) + if (x.style.display === 'none') { + x.style.display = 'block' + } + } + } + this.hideElement = function (strDocId) { + if (strDocId != null) { + var x = document.getElementById(strDocId) + x.style.display = 'none' + } + } + this.getActivity = function (strActivity, isReactive = false) { + // TODO: if calling auto set the local cache property + + if (strActivity.split('_').length > 1) { + // alert('query') + return isReactive + ? this.raw.FetchQueryData.result[strActivity.substring('query_'.length, strActivity.length)] + : this.deepFreeze( + this.raw.FetchQueryData.result[strActivity.substring('query_'.length, strActivity.length)] + ) + } else { + return isReactive + ? this.raw[strActivity] + : this.deepFreeze(this.raw[strActivity]) + } + } + this.Navigate = function ( + str_routeName = null, + str_activityData = null, + str_key = null + ) { + router.push({ + name: str_routeName, + params: { [str_key]: this.getActivity(str_activityData, true) } + }) + } + + this.isValid = function (strActivity = null) { + // NOTE: check global error and activity specific error + if (strActivity === null) { + // check for global errorCode + return !!(this.raw.errorCode === 1000 || this.raw.errorCode === 0) + } else { + // check for specific + if (strActivity.split('_').length > 1) { + // query activity + return !!( + this.raw['FetchQueryData'].errorCode === 1000 || + this.raw['FetchQueryData'].errorCode === 0 + ) + } else { + return !!( + this.raw[strActivity].errorCode === 1000 || + this.raw[strActivity].errorCode === 0 + ) + } + } + } + this.uploadedFileURL = function () { + return this.raw.result + } + + this.getAssetPath = function () { + return this.raw.result.path // returns path where your asset is stored + } + + // this.getAssetContent = function () { + // return this.raw.result // returns the data in your asset + // } + + this.showErrorToast = function (strActivity = null) { + if (strActivity === null) { + window.app.$toast.error(this.raw.error) + } else { + if (strActivity.split('_').length > 1) { + window.app.$toast.error(this.raw['FetchQueryData'].error) + } else { + window.app.$toast.error(this.raw[strActivity].error) + } + } + return this + } + } +} +export default Response diff --git a/app/src/registerServiceWorker.js b/app/src/registerServiceWorker.js new file mode 100644 index 0000000000000000000000000000000000000000..83f1b482f07ec347bfb1c2161a7a5065a08fb2f1 --- /dev/null +++ b/app/src/registerServiceWorker.js @@ -0,0 +1,23 @@ +import { register } from 'register-service-worker' + +if (process.env.NODE_ENV === 'production') { + register(`${process.env.BASE_URL}sw.js`, { + ready () { + console.log( + 'App is being served from cache by a service worker.\n' + ) + }, + cached () { + console.log('Content has been cached for offline use.') + }, + updated () { + console.log('New content is available; please refresh.') + }, + offline () { + console.log('No internet connection found. App is running in offline mode.') + }, + error (error) { + console.error('Error during service worker registration:', error) + } + }) +} \ No newline at end of file diff --git a/app/src/router.js b/app/src/router.js new file mode 100644 index 0000000000000000000000000000000000000000..705ccae16eef977f8937d5ce422c8b4bd7e4fb0b --- /dev/null +++ b/app/src/router.js @@ -0,0 +1,394 @@ +import { createRouter, createWebHashHistory } from 'vue-router' + +function loadView(view) { + return () => + import(/* webpackChunkName: "view-[request]" */ `@/views/${view}.vue`) +} + +function loadHashComponent(component) { + return () => + import(/* webpackChunkName: "component-[request]" */ `@/components/keymappers/${component}.vue`) +} + +function loadBLComponent(component) { + return () => + import(/* webpackChunkName: "component-[request]" */ `@/components/BL/${component}.vue`) +} + +function loadMongoComponent(component) { + return () => + import(/* webpackChunkName: "component-[request]" */ `@/components/mongodbID/${component}.vue`) +} + +function loadExcelComponent(component) { + return () => + import(/* webpackChunkName: "component-[request]" */ `@/components/excel/${component}.vue`) +} +function loadUploadManagerComponent(component) { + return () => + import(/* webpackChunkName: "component-[request]" */ `@/components/upload-manager/${component}.vue`) +} +function loadSessionManagerComponent(component) { + return () => + import(/* webpackChunkName: "component-[request]" */ `@/components/sessionmanager/${component}.vue`) +} +function loadDownloadManagerComponent(component) { + return () => + import(/* webpackChunkName: "component-[request]" */ `@/components/download-manager/${component}.vue`) +} +export default createRouter({ + history: createWebHashHistory(), + routes: [ + { + path: '/', + name: 'home', + component: loadView('Home'), + meta: { title: 'Home', lang: 'en', icon: 'mdi mdi-home-outline' }, + }, + { + path: '/formkitcomposition', + name: 'FormKitComposition', + component: loadView('FormKitCustomComposition'), + meta: { title: 'FormKitComposition', lang: 'en', icon: 'mdi mdi-home-outline' }, + }, + { + path: '/formkitoption', + name: 'FormKitOption', + component: loadView('FormKitCustomOption'), + meta: { title: 'FormKitOption', lang: 'en', icon: 'mdi mdi-home-outline' }, + }, + { + path: '/about', + name: 'about', + component: loadView('About'), + meta: { title: 'About', lang: 'en', icon: 'mdi mdi-information-variant' }, + }, + { + path: '/login', + name: 'login', + component: loadView('Login'), + meta: { title: 'Login', lang: 'mr', icon: 'mdi mdi-account' }, + }, + { + path: '/registration', + name: 'registration', + component: loadView('Registration'), + meta: { title: 'Registration', lang: 'mr', icon: 'mdi mdi-account-edit' }, + }, + { + path: '/mqlRequestDemo', + name: 'mqlRequestDemo', + component: loadView('MQLRequestDemo'), + meta: { title: 'MQLRequestDemo', lang: 'en', icon: 'mdi mdi-presentation-play' }, + }, + { + path: '/i18Demo', + name: 'i18Demo', + component: loadView('I18Demo'), + meta: { title: 'Language Demo', lang: 'en', icon: 'mdi mdi-eject-outline' }, + }, + { + path: '/validator', + name: 'validator', + component: loadView('Validator'), + meta: { title: 'Validator', lang: 'en', icon: 'mdi mdi-check-all' }, + }, + { + path: '/encryption', + name: 'encryption', + component: loadView('Encryption'), + meta: { title: 'Encrypt', lang: 'en', icon: 'mdi mdi-laptop' }, + }, + { + path: '/cdnUpload', + name: 'cdnUpload', + component: loadView('CdnUpload'), + meta: { title: 'Cdn Upload', lang: 'en', icon: 'mdi mdi-upload' }, + }, + { + path: '/tableDemo', + name: 'tableDemo', + component: loadView('TableDemo'), + meta: { title: 'Table Demo', lang: 'en', icon: 'mdi mdi-file-table-outline' }, + }, + { + path: '/vueMetaExample/:title', + name: 'vueMetaExample', + component: loadView('vueMetaExample'), + meta: { title: 'vueMetaExample', lang: 'en', icon: 'mdi mdi-arrow-expand' }, + }, + { + path: '/clipboard', + name: 'clipboard', + component: loadView('vueClipboard'), + meta: { title: 'vueClipboard', lang: 'en', icon: 'mdi mdi-arrow-expand' }, + }, + { + path: '/MqlAssetFDBDemo', + name: 'MqlAssetFDBDemo', + component: loadView('MqlAssetFDBDemo'), + meta: { + title: 'Mql Request For Asset FDB Demo', lang: 'en', + icon: 'mdi mdi-database-plus', + }, + }, + { + path: '/sessionmgr', + name: 'sessionmgr', + component: loadView('SessionManager'), + meta: { + title: 'Session Manager Demo', lang: 'en', + icon: 'mdi mdi-compass', + }, + }, + { + path: '/uploadmanager', + name: 'uploadmanager', + component: loadView('UploadManager'), + meta: { + title: 'Upload Manager Demo', lang: 'en', + icon: 'mdi mdi-upload', + }, + }, + { + path: '/downloadmanager', + name: 'downloadmanager', + component: loadView('DownloadManager'), + meta: { + title: 'Download Manager Demo', lang: 'en', + icon: 'mdi mdi-download', + }, + }, + { + path: '/serversidepagination', + name: 'serversidepagination', + component: loadView('ServerSidePagination'), + meta: { + title: 'Server Side Pagination Demo', lang: 'en', + icon: 'mdi mdi-google-pages', + }, + }, + { + path: '/keymapper', + name: 'keymapper', + component: loadView('KeyMapper'), + meta: { + title: 'Key Mapper Demo', lang: 'en', + icon: 'mdi mdi-sort', + }, + }, + { + path: '/excel', + name: 'excel', + component: loadView('Excel'), + meta: { + title: 'Excel Demo', lang: 'en', + icon: 'mdi mdi-file-excel', + }, + }, + { + path: '/lastinsertedId', + name: 'lastinsertedId', + component: loadView('LastInsertedId'), + meta: { + title: 'Last Inserted Id Demo', + icon: 'mdi mdi-border-color', + }, + }, + { + path: '/forloop', + name: 'forloop', + component: loadView('ForLoop'), + meta: { + title: 'For Loop Demo', lang: 'en', + icon: 'mdi mdi-refresh', + }, + }, + { + path: '/sendSms', + name: 'sendSms', + component: loadView('sms'), + meta: { + title: 'SMS Demo', lang: 'en', + icon: 'mdi mdi-comment-text-outline', + }, + }, + { + path: '/sendEmail', + name: 'sendEmail', + component: loadView('email'), + meta: { + title: 'Email Demo', lang: 'en', + icon: 'mdi mdi-email', + }, + }, + { + path: '/sendOtp', + name: 'sendOtp', + component: loadView('otp'), + meta: { + title: 'OTP Demo', lang: 'en', + icon: 'mdi mdi-numeric-0-box', + }, + }, + { + path: '/autoBL', + name: 'autoBL', + component: loadView('autoBL'), + meta: { + title: 'AutoBL Demo', lang: 'en', + icon: 'mdi mdi-code-array', + }, + }, + { + path: '/updateUserDataUsingBL', + name: 'updateUserDataUsingBL', + component: loadView('updateUserDataUsingBL'), + meta: { + title: 'Update User Data Using BL Demo', lang: 'en', + icon: 'mdi mdi-crop-free', + }, + }, + { + path: '/insertCustomMongoId', + name: 'insertCustomMongoId', + component: loadView('insertCustomMongoId'), + meta: { + title: 'Insert Custom Mongo Id', lang: 'en', + icon: 'mdi mdi-code-braces', + }, + }, + { + path: '/classroom', + name: 'classroom', + component: loadView('Classroom'), + meta: { + title: 'Insert Custom Mongo Id', lang: 'en', + icon: 'mdi mdi-library-books', + }, + }, + { + path: '/tailwindForm', + name: 'tailwindForm', + component: loadView('tailwindForm'), + meta: { + title: 'Insert Custom Mongo Id', lang: 'en', + icon: 'mdi mdi-library-books', + }, + }, + { + path: '/sendStaticMessages', + component: loadView('sendStaticMessages'), + }, + { + path: '/sendDynamicMessages', + component: loadView('sendDynamicMessages'), + }, + { + path: '/sendStaticEmails', + component: loadView('sendStaticEmails'), + }, + { + path: '/sendDynamicEmails', + component: loadView('sendDynamicEmails'), + }, + { + path: '/generateOTP', + component: loadView('generateOTP'), + }, + { + path: '/validateOTP', + component: loadView('validateOTP'), + }, + { + path: '/hashData', + name: 'hashData', + component: loadHashComponent('hashData'), + }, + { + path: '/hashSalt', + name: 'hashSalt', + component: loadHashComponent('hashSalt'), + }, + { + path: '/encryptData', + name: 'encrpytData', + component: loadHashComponent('encryptData') + }, + { + path: '/decryptData', + name: 'decrpytData', + component: loadHashComponent('decryptData'), + }, + { + path: '/clientData', + name: 'clientData', + component: loadExcelComponent('clientData'), + }, + { + path: '/updateData', + name: 'updateData', + component: loadExcelComponent('updateData'), + }, + { + path: '/saveWActivity', + name: 'saveWActivity', + component: loadExcelComponent('saveWActivity'), + }, + { + path: '/storeData', + name: 'storeData', + component: loadSessionManagerComponent('storeData'), + }, + { + path: '/fetchData', + name: 'fetchData', + component: loadSessionManagerComponent('fetchData'), + }, + { + path: '/deleteData', + name: 'deleteData', + component: loadSessionManagerComponent('deleteData'), + }, + { + path: '/updateUser', + name: 'updateUser', + component: loadBLComponent('updateUser'), + }, + { + path: '/updateDbSave', + name: 'updateDbSave', + component: loadBLComponent('updateDbSave'), + }, + { + path: '/customID', + name: 'customID', + component: loadMongoComponent('customID'), + }, + { + path: '/hexID', + name: 'hexID', + component: loadMongoComponent('hexID'), + }, + { + path: '/uploadFile', + name: 'uploadFile', + component: loadUploadManagerComponent('uploadFile'), + }, + { + path: '/uploadProgessFile', + name: 'uploadProgessFile', + component: loadUploadManagerComponent('uploadProgessFile'), + }, + { + path: '/downloadFile', + name: 'downloadFile', + component: loadDownloadManagerComponent('downloadFile'), + }, + { + path: '/downloadProgress', + name: 'downloadProgress', + component: loadDownloadManagerComponent('downloadProgress'), + }, + ], +}) diff --git a/app/src/setup/i18n-setup.js b/app/src/setup/i18n-setup.js new file mode 100644 index 0000000000000000000000000000000000000000..ced6330f94f18e6149fa363ef894ddb2dcb9b441 --- /dev/null +++ b/app/src/setup/i18n-setup.js @@ -0,0 +1,45 @@ +import { createI18n } from 'vue-i18n' +import messages from '@/lang/en.json' +import axios from 'axios' +export const i18n = createI18n({ + locale: 'en', // set locale + fallbackLocale: 'en', + messages, // set locale messages + silentTranslationWarn: true, + silentFallbackWarn: true, + missingWarn: false, + fallbackWarn: false, +}) + +const loadedLanguages = [] // our default language that is preloaded + +function setI18nLanguage (lang) { + i18n.global.locale = lang + i18n.global.fallbackLocale = lang + axios.defaults.headers.common['Accept-Language'] = lang + document.querySelector('html').setAttribute('lang', lang) + return lang +} +export async function loadLanguageAsync(lang) { + if (lang === "" || lang === undefined) { + const msgs = await import( + /* webpackChunkName: "locale-[request]" */ `../lang/${lang}.json` + ); + i18n.global.setLocaleMessage("en", msgs.default); + return setI18nLanguage("en"); + } else { + if (!i18n.global.locale.value !== lang) { + if (!loadedLanguages.includes(lang)) { + const msgs_1 = await import( + /* webpackChunkName: "locale-[request]" */ `../lang/${lang}.json` + ); + i18n.global.setLocaleMessage(lang, msgs_1.default); + loadedLanguages.push(lang); + return setI18nLanguage(lang); + } + return Promise.resolve(setI18nLanguage(lang)); + } + } + + return Promise.resolve(lang); +} diff --git a/app/src/setup/init.js b/app/src/setup/init.js new file mode 100644 index 0000000000000000000000000000000000000000..fc140a421adbc7d020a16cfcd1486fb89ddfcaee --- /dev/null +++ b/app/src/setup/init.js @@ -0,0 +1 @@ +// function that shall call during application loading diff --git a/app/src/store/index.js b/app/src/store/index.js new file mode 100644 index 0000000000000000000000000000000000000000..0c37efaf3a1d26e18e84d753d23003ee6c80aa23 --- /dev/null +++ b/app/src/store/index.js @@ -0,0 +1,13 @@ +import { defineStore } from 'pinia' + +export const main = defineStore('main', { + state: () => ({ isPageBlocked: false }), + getters: { + Boolean: state => state.isPageBlocked + }, + actions: { + MUTATE_PAGE_BLOCKER(payload){ + this.isPageBlocked=payload + } + }, +}) diff --git a/app/src/store/modules/login.js b/app/src/store/modules/login.js new file mode 100644 index 0000000000000000000000000000000000000000..ab46248b57dbb4124e2d5b6467d0405d774ff3d3 --- /dev/null +++ b/app/src/store/modules/login.js @@ -0,0 +1,68 @@ +import router from '../../router' +import { defineStore } from 'pinia' +import MQL from '@/plugins/mql.js' +export const login = defineStore('login', { + persist: { + storage: sessionStorage, + // paths:['token','status'] + }, + state: () => ({ + token: sessionStorage.getItem('user-token') || '', + status: '', + }), + getters:{ + isAuthenticated:(state) => !!state.token, + authStatus:(state)=>state.status + }, + actions:{ + MUTATE_AUTH_REQUEST(){ + this.status = 'loading' + }, + MUTATE_AUTH_SUCCESS(token){ + this.status = 'sucess' + this.token = token + }, + MUTATE_AUTH_ERROR(){ + this.status = 'error' + }, + AUTH_REQUEST(payload) { + return new Promise((resolve) => { + this.MUTATE_AUTH_REQUEST() + sessionStorage.setItem('user-token', 'token') + // axios.defaults.headers.common['Authorization'] = 'token' + new MQL() + .setLoginActivity() + .setData(payload) + // .showConfirmDialog(true) + .fetch('loginBtn') + .then((response) => { + let res = response.getActivity('ldapLogin', false) + // response.hideElement('loginFormId') + if (response.isValid('ldapLogin')) { + let token = response.getHeaders().authorization + sessionStorage.setItem('user-token', token) + this.MUTATE_AUTH_SUCCESS(token) + resolve(res.result) + } else { + this.MUTATE_AUTH_ERROR() + sessionStorage.removeItem('user-token') + response.showErrorToast('ldapLogin') + } + }) + }) + }, + + AUTH_LOGOUT () { + return new Promise((resolve) => { + sessionStorage.removeItem('user-token') + // remove the axios default header + // delete axios.defaults.headers.common['Authorization'] + router.push({ + name: 'login', + }) + resolve() + }) + }, + + } +}) \ No newline at end of file diff --git a/app/src/store/types.js b/app/src/store/types.js new file mode 100644 index 0000000000000000000000000000000000000000..f5c5dd0416eac966cab0a02b5274c4b39e35a1b7 --- /dev/null +++ b/app/src/store/types.js @@ -0,0 +1,8 @@ +// Login Actions +export const AUTH_REQUEST = 'AUTH_REQUEST' +export const AUTH_LOGOUT = 'login/AUTH_REQUEST' + +// Login Mutations +export const MUTATE_AUTH_REQUEST = 'login/MUTATE_AUTH_REQUEST' +export const MUTATE_AUTH_SUCCESS = 'login/MUTATE_AUTH_LOGOUT' +export const MUTATE_AUTH_ERROR = 'login/MUTATE_AUTH_LOGOUT' diff --git a/app/src/views/About.vue b/app/src/views/About.vue new file mode 100644 index 0000000000000000000000000000000000000000..d84abb785c72f4bacea88c5652543b06da13d137 --- /dev/null +++ b/app/src/views/About.vue @@ -0,0 +1,46 @@ +<template> + <FormKit + type="form" + #default="{ value }" + :actions="false" + > + <FormKit + type="dropdown" + name="framework" + label="Choose a frontend framework" + placeholder="Example placeholder" + :options="frameworks" + > + <!--OPTION SLOT--> + <template #option="{ option }"> + <div class="formkit-option"> + <img + :src="option.asset" + alt="optionAvatar" + /> + <span> + {{ option.label }} + </span> + </div> + </template> + <!----> + </FormKit> + <pre wrap>{{ value }}</pre> + </FormKit> +</template> + +<script setup> +const frameworks = [ + { label: 'React', value: 'react' }, + { label: 'Vue', value: 'vue' }, + { label: 'Angular', value: 'angular' }, + { label: 'Svelte', value: 'svelte' } +] +</script> + +<style> +/* +vanilla CSS can go here. If you are using +Tailwind you can also use @apply rules. +*/ +</style> \ No newline at end of file diff --git a/app/src/views/CdnUpload.vue b/app/src/views/CdnUpload.vue new file mode 100644 index 0000000000000000000000000000000000000000..ff5031cc0e4d5feb0138f0591d45a37cf4f7a312 --- /dev/null +++ b/app/src/views/CdnUpload.vue @@ -0,0 +1,116 @@ +<template> + <div id="cdnUpload" class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + MarketPlace Applications + </h2> + <div class="row justify-content-center"> + <div class="col-4"> + <div class="box-login"> + <div class="p-card p-component"> + <h3>Upload File</h3> + <div class="field mt-5"> + <FormKit + type="text" + name="inputFileName" + label="Input File Name" + v-model="inputFileName" + placeholder="File name" + help="Enter file name" + /> + <FormKit + type="file" + label="Your files" + help="This input starts with files already “attachedâ€." + multiple="true" + :value="file_2" + v-model="file" + /><FormKit @click="cdnProfileUpload" type="submit" label="Upload" /> + </div> + <div v-if="uploadedFilePath"> + <h3>cdnServer</h3> + <div class="field"> + <p>{{ uploadedFilePath.cdnServer }}</p> + </div> + <h3>File Path</h3> + <p>{{ uploadedFilePath.filePath }}</p> + </div> + <h3>Download File</h3> + <div class="field mt-5"> + <FormKit + type="text" + name="inputFileName" + label="Uploaded File Name" + v-model="fileURL" + placeholder="File path" + help="Enter File URI for Download" + /><FormKit @click="downloadFile" type="submit" label="Download" /> + </div> + <div class="field" v-if="uploadedFilePath.filePath"> + <h3>Show Image</h3> + <img :src="'https://testcdncs.mkcl.org/' + uploadedFilePath.filePath" /> + </div> + </div> + </div> + </div> + </div> + </div> +</template> + +<script> + import MQLCdn from "@/plugins/mqlCdn.js" + export default { + data() { + return { + url: "https://testcdncs.mkcl.org/upload", + inputFileName: "", + fileURL: "", + file: "", + uploadedFilePath: "", + } + }, + methods: { + cdnProfileUpload() { + let formData = new FormData() + formData.append("file", this.file[0].file) // append your file as 'file' in formdata. + new MQLCdn() + .enablePageLoader(true) + // FIXED: change this to directory path + .setDirectoryPath("/demoFolder") // (optional field) if you want to save file to specific directory path + .setFormData(formData) // (required) sets file data + .setFileName(this.inputFileName) // (optional field) if you want to set name to file that is being uploaded + // FIXED: pass buckeyKey instead of name + .setBucketKey("1TxYD2KhMcczFlxXntsueOYN46J") // (required) valid bucket key need to set in which file will be uploaded. + .setPurposeId("1TxY9TS4uzp8Ivyo0eKPpo1g2Og") // (required) valid purposeId need to set in which file will be uploaded. + .setClientId("1TxY9TS4uzp8Ivyo0eKPpo1g2Og") // (required) valid purposeId need to set in which file will be uploaded. + .uploadFile("uploadtBtn") + .then((res) => { + // (required) this will upload file takes element id (optional param) which will be blocked while file upload.. + if (res.isValid()) { + this.uploadedFilePath = res.uploadedFileURL() // returns uploaded file url.. + this.$toast.add({ severity: "success", summary: "File", detail: "file uploaded.", life: 3000 }) + } else { + res.showErrorToast() + } + }) + }, + downloadFile() { + if (this.fileURL !== "") { + new MQLCdn() + .setCDNPath(this.fileURL) // (required) set a filepath whihch needs to be download. + .setBucketKey("1TxYD2KhMcczFlxXntsueOYN46J") + .setPurposeId("1TxY9TS4uzp8Ivyo0eKPpo1g2Og") // (required) valid purposeId need to set in which file will be uploaded. + .setClientId("1TxY9TS4uzp8Ivyo0eKPpo1g2Og") // (required) if you are providing relative path + .enablePageLoader(true) + .downloadFile("downloadBtn") + .then((res) => { + // (required) this will take elemnt id (optional) which will be blocked while file being downloaded. + if (!res.isValid()) { + res.showErrorToast() + } + }) + } + }, + }, + } +</script> diff --git a/app/src/views/Classroom.vue b/app/src/views/Classroom.vue new file mode 100644 index 0000000000000000000000000000000000000000..2141eeaabeaa5117b800063beefe7e0512c94d5b --- /dev/null +++ b/app/src/views/Classroom.vue @@ -0,0 +1,227 @@ +<template> + <div id="classroom" class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Classroom + </h2> + <div class="row justify-content-center"> + <div class="col-6"> + <div class="box-login"> + <div class="p-card p-component"> + <Accordion :multiple="true"> + <AccordionTab header="Add Classroom"> + <div class="field mt-5"> + <div class="p-float-label"> + <input type="text" class="p-inputtext p-component w-100" :class="classroom.name ? 'p-filled' : ''" + v-model="classroom.name" id="name" required> + <label for="name">Enter classroom name</label> + </div> + </div> + <div class="field mt-5"> + <div class="p-float-label"> + <input type="text" class="p-inputtext p-component w-100" + :class="classroom.description ? 'p-filled' : ''" v-model="classroom.description" id="description" + required> + <label for="description">Enter classroom description</label> + </div> + </div> + <div class="field mt-5"> + <div class="p-float-label"> + <input type="date" class="p-inputtext p-component w-100" + :class="classroom.startDate ? 'p-filled' : ''" v-model="classroom.startDate" id="startDate" + required> + <label for="startDate">Enter classroom start date</label> + </div> + </div> + <div class="btn-wrapper"> + <button class="btn btn-submit" @click.prevent="saveClassroom"> + <i class="isax isax-bold-tick-circle"></i> + Save + </button> + </div> + </AccordionTab> + <AccordionTab header="Fetch classroom within two dates"> + <div class="field mt-5"> + <div class="p-float-label"> + <input type="date" class="p-inputtext p-component w-100" :class="fclassroom.sdate ? 'p-filled' : ''" + v-model="fclassroom.sdate" id="sdate" required> + <label for="sdate">Enter start date</label> + </div> + </div> + <div class="field"> + <div class="p-float-label"> + <input type="date" class="p-inputtext p-component w-100" :class="fclassroom.edate ? 'p-filled' : ''" + v-model="fclassroom.edate" id="edate" required> + <label for="edate">Enter end date</label> + </div> + </div> + <div class="btn-wrapper"> + <button class="btn btn-submit" @click.prevent="fetchClassroom"> + <i class="isax isax-bold-tick-circle"></i> + Fetch + </button> + </div> + <div class="field mt-5" v-if="classroomResult && classroomResult.length > 0"> + <DataTable :value="classroomResult"> + <Column field="name" header="name"></Column> + <Column field="description" header="description"></Column> + <Column field="startDate" header="startDate"></Column> + </DataTable> + </div> + </AccordionTab> + <AccordionTab header="Add Classroom with ISO Date"> + <div class="field mt-4"> + <div class="p-float-label"> + <input type="text" class="p-inputtext p-component w-100" :class="isoclassroom.name ? 'p-filled': ''" v-model="isoclassroom.name" required id="email"> + <label for="email">Enter classroom name</label> + </div> + </div> + <div class="field"> + <div class="p-float-label"> + <input type="text" class="p-inputtext p-component w-100" :class="isoclassroom.description ? 'p-filled': ''" v-model="isoclassroom.description" required id="description"> + <label for="description">Enter classroom description</label> + </div> + </div> + <div class="field"> + <div class="p-float-label"> + <input type="datetime-local" :class="isoclassroom.startDate ? 'p-inputtext p-component w-100 p-filled': 'p-inputtext p-component w-100'" v-model="isoclassroom.startDate" required id="date"> + <label for="date">Enter classroom Start Date</label> + </div> + </div> + <div class="btn-wrapper"> + <button class="btn btn-submit" @click.prevent="saveClassroomWithISODate"> + <i class="isax isax-bold-tick-circle"></i> + Save + </button> + </div> + </AccordionTab> + <AccordionTab header="Fetch classroom within two ISO dates"> + <div class="field mt-4"> + <div class="p-float-label"> + <input type="datetime-local" class="p-inputtext p-component w-100" :class="fisoclassroom.sdate ? 'p-filled':''" v-model="fisoclassroom.sdate" id="sdates"> + <label for="sdates">Enter start date</label> + </div> + </div> + <div class="field"> + <div class="p-float-label"> + <input type="datetime-local" class="p-inputtext p-component w-100" :class="fisoclassroom.edate ? 'p-filled':''" v-model="fisoclassroom.edate" id="edates"> + <label for="edates">Enter end date</label> + </div> + </div> + <div class="btn-wrapper"> + <button @click.prevent="fetchClassroomWithISODate" + class="btn btn-submit" + > + <i class="isax isax-bold-tick-circle"></i> + Fetch + </button> + </div> + </AccordionTab> + </Accordion> + <div class="field mt-5" v-if="isoClassroomResult && isoClassroomResult.length > 0"> + <h3 class="mb-3">Result</h3> + <DataTable :value="isoClassroomResult"> + <Column field="name" header="name"></Column> + <Column field="description" header="description"></Column> + <Column field="startDate" header="startDate"></Column> + </DataTable> + </div> + </div> + </div> + </div> + </div> + </div> +</template> + +<script> +import MQL from '@/plugins/mql.js' +export default { + data() { + return { + classroom: {}, + fclassroom: {}, + isoclassroom: {}, + fisoclassroom: {}, + classroomResult: null, + isoClassroomResult: [] + } + }, + methods: { + saveClassroom() { + this.classroom.startDate = Math.round( + new Date(this.classroom.startDate).getTime() / 1000 + ) + new MQL() + .setActivity('o.[SaveClassroom]') + .setData(this.classroom) + .fetch() + .then((rs) => { + if (rs.isValid('SaveClassroom')) { + this.classroom = {} + this.$toast.add({severity:'success', summary: 'Classroom', detail:'Classroom added successfully', life: 3000}) + } else { + rs.showErrorToast('SaveClassroom') + } + }) + }, + fetchClassroom() { + this.fclassroom.sdate = Math.round( + new Date(this.fclassroom.sdate).getTime() / 1000 + ) + this.fclassroom.edate = Math.round( + new Date(this.fclassroom.edate).getTime() / 1000 + ) + new MQL() + .setActivity('o.[FetchClassroom]') + .setData(this.fclassroom) + .fetch() + .then((rs) => { + let res = rs.getActivity('FetchClassroom', true) + if (rs.isValid('FetchClassroom')) { + this.fclassroom = {} + this.classroomResult = res.result + for (var i = 0; i < this.classroomResult.length; i++) { + this.classroomResult[i].startDate = new Date( + this.classroomResult[i].startDate * 1000 + ) + } + } else { + rs.showErrorToast('FetchClassroom') + } + }) + }, + saveClassroomWithISODate() { + this.isoclassroom.startDate = new Date( + this.isoclassroom.startDate + ).toISOString() + new MQL() + .setActivity('o.[SaveClassroomWithISODate]') + .setData(this.isoclassroom) + .fetch() + .then((rs) => { + if (rs.isValid('SaveClassroomWithISODate')) { + this.isoclassroom = {} + this.$toast.add({severity:'success', summary: 'Classroom', detail:'Classroom added successfully', life: 3000}) + } else { + rs.showErrorToast('SaveClassroomWithISODate') + } + }) + }, + fetchClassroomWithISODate() { + new MQL() + .setActivity('o.[FetchClassroomWithISODate]') + .setData(this.fisoclassroom) + .fetch() + .then((rs) => { + let res = rs.getActivity('FetchClassroomWithISODate', true) + if (rs.isValid('FetchClassroomWithISODate')) { + this.fisoclassroom = {} + this.isoClassroomResult = res.result + } else { + rs.showErrorToast('FetchClassroomWithISODate') + } + }) + } + } +} +</script> \ No newline at end of file diff --git a/app/src/views/DownloadManager.vue b/app/src/views/DownloadManager.vue new file mode 100644 index 0000000000000000000000000000000000000000..73b648559951d225e128cfd7c23c092cd5ec06e5 --- /dev/null +++ b/app/src/views/DownloadManager.vue @@ -0,0 +1,94 @@ +<template> + <div id="downloadManger" class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Download Manager + </h2> + <div class="row justify-content-center"> + <div class="col-4"> + <div class="box-login clickable" @click.prevent="downloadFilePush"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-document-download"></i> + </div> + <div class="bx-login-name"> + Download File + </div> + </div> + </div> + </div> + <div class="col-4"> + <div class="box-login clickable" @click.prevent="downloadProgressPush"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-document-cloud"></i> + </div> + <div class="bx-login-name"> + Check Download Progress + </div> + </div> + </div> + </div> + </div> + </div> +</template> + +<script> +import MQL from '@/plugins/mql.js' +export default { + data() { + return { + download: {}, + downloadId: '', + downloadResult: '', + progressResult: '' + } + }, + methods: { + downloadFilePush() { + this.$router.push('/downloadFile') + }, + downloadProgressPush() { + this.$router.push('/downloadProgress') + }, + downloadFile() { + var a = [] + a.push(this.download.downloadFileUrl) + this.download.downloadFileUrl = a + new MQL() + .setActivity('o.[DownloadFileUsingDM]') + .setData(this.download) + .fetch() + .then((rs) => { + let res = rs.getActivity('DownloadFileUsingDM', true) + if (rs.isValid('DownloadFileUsingDM')) { + this.download = {} + this.downloadResult = res.result + alert('File downloaded successfully') + } else { + rs.showErrorToast('DownloadFileUsingDM') + } + }) + }, + checkDownloadProgress() { + new MQL() + .setActivity('o.[CheckDownloadedFileProgress]') + .setData({ downloadFileId: this.downloadId }) + .fetch() + .then((rs) => { + let res = rs.getActivity('CheckDownloadedFileProgress', true) + if (rs.isValid('CheckDownloadedFileProgress')) { + if (res && res.result) { + this.progressResult = res.result + this.downloadId = '' + } else { + alert('Progress checking failed') + } + } else { + rs.showErrorToast('CheckDownloadedFileProgress') + } + }) + } + } +} +</script> \ No newline at end of file diff --git a/app/src/views/Encryption.vue b/app/src/views/Encryption.vue new file mode 100644 index 0000000000000000000000000000000000000000..74fc2bccae8b80505332d51c9ff3dd32fff1d1e3 --- /dev/null +++ b/app/src/views/Encryption.vue @@ -0,0 +1,128 @@ +<template> + <div id="encryption" class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Encryption + </h2> + <div class="row justify-content-center"> + <div class="col-12"> + <div class="box-login"> + <div class="p-card p-component"> + <div class="flex flex-col w-full lg:flex-row"> + <div class="grid flex-grow h-50 card bg-base-300 rounded-box place-items-center"> + <h3 class="text-center mb-4">Plain Text Encryption / Decryption</h3> + <div class="flex flex-col w-full"> + <div class="grid h-50 card bg-base-300 rounded-box place-items-center"> + <FormKit + type="text" + name="encryptInputText" + label="Encrypt Input Text" + v-model="encryptInputText" + placeho + lder="Enter text for encryption" + help="Enter text for encryption" + validation="required" + /> + <FormKit type="button" @click="encryptText" label="Encrypt" /> + {{ encryptOutputText }} + </div> + <div class="divider"></div> + <div class="grid h-50 card bg-base-300 rounded-box place-items-center"> + <FormKit + type="text" + name="decryptionInputText" + label="Decrypt Input Text" + v-model="decryptInputText" + placeho + lder="Enter text for decryption" + help="Enter text for decryption" + validation="required" + /> + <FormKit type="button" @click="decryptText" label="Decrypt Text" /> + {{ decryptOutputText }} + </div> + </div> + </div> + <div class="divider lg:divider-horizontal">OR</div> + <div class="grid flex-grow h-50 card bg-base-300 rounded-box place-items-center"> + <h3 >Object encryption/decryption</h3> + <div class="flex flex-col w-full mt-4"> + <div class="grid h-50 card bg-base-300 rounded-box place-items-center"> + <FormKit + type="text" + name="decryptionInputText" + label="Encrypt Input Text" + v-model="encryptInputObject" + placeho + lder="Enter object for encryption" + help="Enter object for encryption" + validation="required" + /> + <FormKit type="button" @click="encryptObj" label="Encrypt Object" /> + {{ encryptOutputObject }} + </div> + <div class="divider"></div> + <div class="grid h-50 card bg-base-300 rounded-box place-items-center"> + <FormKit + type="text" + name="decryptionInputText" + label="Decrypt Input Text" + v-model="decryptInputObject" + placeho + lder="Enter object for decryption" + help="Enter object for decryption" + validation="required" + /> + <FormKit type="button" @click="decryptObj" label="Decrypt Object" /> + {{ decryptOutputObject }} + </div> + </div> + </div> + </div> + </div> + </div> + </div> + </div> + </div> +</template> + +<script> + import CryptoJS from "crypto-js" + export default { + data() { + return { + encryptInputText: "", + encryptOutputText: "", + decryptInputText: "", + decryptOutputText: "", + encryptInputObject: "", + encryptOutputObject: "", + decryptInputObject: "", + decryptOutputObject: null, + key: "SECRETKEY", + } + }, + methods: { + encryptText() { + var op = CryptoJS.AES.encrypt(this.encryptInputText, this.key) + this.encryptOutputText = op.toString() + }, + decryptText() { + var bytes = CryptoJS.AES.decrypt(this.encryptOutputText.toString(), this.key) + var plaintext = bytes.toString(CryptoJS.enc.Utf8) + this.decryptOutputText = plaintext + }, + encryptObj() { + var ip = this.encryptInputObject + var op = CryptoJS.AES.encrypt(JSON.stringify(ip), this.key) + this.encryptOutputObject = op.toString() + }, + decryptObj() { + var bytes = CryptoJS.AES.decrypt(this.encryptOutputObject.toString(), this.key) + this.decryptOutputObject = JSON.parse(bytes.toString(CryptoJS.enc.Utf8)) + }, + }, + } +</script> + +<style></style> diff --git a/app/src/views/Excel.vue b/app/src/views/Excel.vue new file mode 100644 index 0000000000000000000000000000000000000000..087b72caac42ff96141f88a9138d53680a903b7f --- /dev/null +++ b/app/src/views/Excel.vue @@ -0,0 +1,123 @@ +<template> +<div class="container-fluid" id="excel"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Excel Plugins + </h2> + <div class="row justify-content-center"> + <div class="col-4"> + <div class="box-login clickable" @click.prevent="clientDataPush"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-data"></i> + </div> + <div class="bx-login-name"> + Client Data + </div> + </div> + </div> + </div> + <div class="col-4"> + <div class="box-login clickable" @click.prevent="updateDataPush"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-global-refresh"></i> + </div> + <div class="bx-login-name"> + Update Data + </div> + </div> + </div> + </div> + <div class="col-4"> + <div class="box-login clickable" @click.prevent="saveWActivityPush"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-document-text-1"></i> + </div> + <div class="bx-login-name"> + Save with Activity + </div> + </div> + </div> + </div> + </div> +</div> +</template> + +<script> +import MQL from '@/plugins/mql.js' +export default { + data () { + return { + empList: [ + { name: 'vikram', age: 27, address: 'pune' }, + { name: 'kunal', age: 28, address: 'satara' }, + { name: 'akshay', age: 29, address: 'mumbai' } + ], + url: '', + excel: {} + } + }, + components: { + }, + methods: { + clientDataPush () { + this.$router.push('/clientData') + }, + updateDataPush () { + this.$router.push('/updateData') + }, + saveWActivityPush () { + this.$router.push('/saveWActivity') + }, + + saveClientDataUsingExcel () { + new MQL() + .setActivity('o.[SaveClientDataUsingExcel]') + .setData(this.empList) + .fetch() + .then((rs) => { + rs.getActivity('SaveClientDataUsingExcel', true) + if (rs.isValid('SaveClientDataUsingExcel')) { + this.$toast.add({severity:'success', summary: 'Data Saved ', detail:'Employees Data Saved Successfully', life: 3000}) + } else { + rs.showErrorToast('SaveClientDataUsingExcel') + } + }) + }, + saveExcelDataUsingActivity () { + new MQL() + .setActivity('o.[SaveActivityDataUsingExcel]') + .setData({ excelURL: this.url }) + .fetch() + .then((rs) => { + rs.getActivity('SaveActivityDataUsingExcel', true) + if (rs.isValid('SaveActivityDataUsingExcel')) { + this.$toast.add({severity:'success', summary: 'Data Saved ', detail:'Excel data saved successfully using activity', life: 3000}) + this.url = '' + } else { + rs.showErrorToast('SaveActivityDataUsingExcel') + } + }) + }, + updateData () { + this.excel.age = 30 + this.excel.address = 'pune' + new MQL() + .setActivity('o.[UpdateDataUsingExcel]') + .setData([this.excel]) + .fetch() + .then((rs) => { + rs.getActivity('UpdateDataUsingExcel', true) + if (rs.isValid('UpdateDataUsingExcel')) { + this.$toast.add({severity:'success', summary: 'Data Saved ', detail:'Excel data updated successfully', life: 3000}) + this.excel = {} + } else { + rs.showErrorToast('UpdateDataUsingExcel') + } + }) + } + } +} +</script> \ No newline at end of file diff --git a/app/src/views/ForLoop.vue b/app/src/views/ForLoop.vue new file mode 100644 index 0000000000000000000000000000000000000000..01c0537542cc1930307d2a8fe91274a55b3a59a8 --- /dev/null +++ b/app/src/views/ForLoop.vue @@ -0,0 +1,70 @@ +<template> +<div class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Save client data + </h2> + <div class="subtext"> + This client data is saved in "Employee" collection of "cs playground" + database using for loop plugin + </div> + <div class="row justify-content-center"> + <div class="col-6"> + <div class="box-login"> + <div class="p-card p-component"> + <DataTable v-if="empList && empList.length > 0" :value="empList"> + <Column field="name" header="name"></Column> + <Column field="age" header="age"></Column> + <Column field="address" header="address"></Column> + </DataTable> + <div class="empty-state" v-else>Records not found</div> + <div class="btn-wrapper"> + <button class="btn btn-submit" @click="saveClientDataUsingForLoop()"> + <i class="isax isax-bold-tick-circle"></i> + Save + </button> + </div> + </div> + </div> + </div> + </div> +</div> +</template> + +<script> +import MQL from '@/plugins/mql.js' +export default { + data () { + return { + empList: [ + { name: 'vikram', age: 27, address: 'pune' }, + { name: 'kunal', age: 28, address: 'satara' }, + { name: 'akshay', age: 29, address: 'mumbai' } + ] + } + }, + methods: { + saveClientDataUsingForLoop () { + new MQL() + .setActivity('o.[SaveClientDataUsingForLoop]') + .setData(this.empList) + .fetch() + .then((rs) => { + rs.getActivity('SaveClientDataUsingForLoop', true) + if (rs.isValid('SaveClientDataUsingForLoop')) { + this.$toast.add({severity:'success', summary: 'Data Saved ', detail:'Employees data saved successfully', life: 3000}) + } else { + rs.showErrorToast('SaveClientDataUsingForLoop') + } + }) + } + } +} +</script> + +<style lang="scss" scoped> +.subtext { + margin-top: 0.75rem; + margin-left: 3rem; +} +</style> \ No newline at end of file diff --git a/app/src/views/FormKitCustomComposition.vue b/app/src/views/FormKitCustomComposition.vue new file mode 100644 index 0000000000000000000000000000000000000000..9371d7b3e5a7d342aedb990c5e5ddce86a26802b --- /dev/null +++ b/app/src/views/FormKitCustomComposition.vue @@ -0,0 +1,41 @@ +<script setup> + // Formkit with composition API + + import { ref } from "vue" + import { createInput } from "@formkit/vue" + import Multiselect from "@/components/multiselect.vue" + import dateRangePickr from "@/components/date-range-pickr.vue" + + const multiselect = createInput(Multiselect) + const dateRangePickrC = createInput(dateRangePickr) + const values = ref({}) +</script> +<template> + <div id="masterAxios" class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Dashboard + </h2> + <div class="row justify-content-center"> + <div class="col-6"> + <div class="box-login"> + <FormKit type="form" v-model="values"> + <FormKit + :type="multiselect" + label="Multiple Data Select" + validation="required" + validation-visibility="live" + ></FormKit> + <FormKit + :type="dateRangePickrC" + label="Date Range Select" + validation="required" + validation-visibility="live" + ></FormKit> + {{ values }} + </FormKit> + </div> + </div> + </div> + </div> +</template> diff --git a/app/src/views/FormKitCustomOption.vue b/app/src/views/FormKitCustomOption.vue new file mode 100644 index 0000000000000000000000000000000000000000..2dbc29eb684b7ecd173adbde16672833b08ca2f0 --- /dev/null +++ b/app/src/views/FormKitCustomOption.vue @@ -0,0 +1,45 @@ +<script> + // Formkit with Option API + import { ref } from "vue" + import { createInput } from "@formkit/vue" + import Multiselect from "@/components/multiselect.vue" + import dateRangePickr from "@/components/date-range-pickr.vue" + export default { + data() { + return { + multiselect: createInput(Multiselect), + dateRangePickrC: createInput(dateRangePickr), + values: "", + } + }, + } +</script> +<template> + <div id="masterAxios" class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Dashboard + </h2> + <div class="row justify-content-center"> + <div class="col-6"> + <div class="box-login"> + <FormKit type="form" v-model="values"> + <FormKit + :type="multiselect" + label="Multiple Data Select" + validation="required" + validation-visibility="live" + ></FormKit> + <FormKit + :type="dateRangePickrC" + label="Date Range Select" + validation="required" + validation-visibility="live" + ></FormKit> + {{ values }} + </FormKit> + </div> + </div> + </div> + </div> +</template> diff --git a/app/src/views/Home.vue b/app/src/views/Home.vue new file mode 100644 index 0000000000000000000000000000000000000000..5840dd583a6fe072e0bcb34e37ba4a2251bf7381 --- /dev/null +++ b/app/src/views/Home.vue @@ -0,0 +1,500 @@ +<template> + <div class="box"> + <h1 class="title"> + GoLang FullStack + </h1> + <p class="desc"> + LIST OF CORE FUNCTIONALITIES + </p> + <div class="row align-items-center"> + <div class="col-3"> + <div class="bx-card"> + <div class="p-card p-component" @click="$router.push({name: 'login'})"> + <div class="icon-holder"> + <i class="isax isax-bold-login"></i> + </div> + <div class="bx-card-name"> + Login + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div> + <div class="col-3" @click="$router.push({name: 'registration'})"> + <div class="bx-card" > + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-edit-2"></i> + </div> + <div class="bx-card-name"> + Registration + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="bx-card" @click="$router.push({name: 'mqlRequestDemo'})"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-cloud-change"></i> + </div> + <div class="bx-card-name"> + Mql Request + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="bx-card" @click="$router.push({name: 'i18Demo'})"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-translate"></i> + </div> + <div class="bx-card-name"> + i18 + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="bx-card" @click="$router.push({name: 'validator'})"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-tick-circle"></i> + </div> + <div class="bx-card-name"> + Validator + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="bx-card" @click="$router.push({name: 'encryption'})"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-lock-1"></i> + </div> + <div class="bx-card-name"> + Encryption + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="bx-card" @click="$router.push({name: 'cdnUpload'})"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-arrow-up"></i> + </div> + <div class="bx-card-name"> + CDN Upload + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="bx-card" @click="$router.push({name: 'tableDemo'})"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-stickynote"></i> + </div> + <div class="bx-card-name"> + Table + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="bx-card" @click="vueMeta()"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-menu-board"></i> + </div> + <div class="bx-card-name"> + Vue Meta Example + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="bx-card" @click="$router.push({name: 'MqlAssetFDBDemo'})"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-3d-cube-scan"></i> + </div> + <div class="bx-card-name"> + Mql Asset FDB + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="bx-card" @click="$router.push({name: 'sessionmgr'})"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-check"></i> + </div> + <div class="bx-card-name"> + Session Manager + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="bx-card" @click="$router.push({name: 'uploadmanager'})"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-document-upload"></i> + </div> + <div class="bx-card-name"> + Upload Manager + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="bx-card" @click="$router.push({name: 'downloadmanager'})"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-document-download"></i> + </div> + <div class="bx-card-name"> + Download Manager + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="bx-card" @click="$router.push({name: 'serversidepagination'})"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-element-3"></i> + </div> + <div class="bx-card-name"> + Server Side Pagination + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="bx-card" @click="$router.push({name: 'keymapper'})"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-keyboard-open"></i> + </div> + <div class="bx-card-name"> + Key Mapper + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="bx-card" @click="$router.push({name: 'excel'})"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-document-1"></i> + </div> + <div class="bx-card-name"> + Excel Plugin + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="bx-card" @click="$router.push({name: 'lastinsertedId'})"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-note"></i> + </div> + <div class="bx-card-name"> + Last Insert ID + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="bx-card" @click="$router.push({name: 'forloop'})"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-refresh"></i> + </div> + <div class="bx-card-name"> + For Loop + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="bx-card" @click="$router.push({name: 'sendSms'})"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-sms-tracking"></i> + </div> + <div class="bx-card-name"> + Send SMS + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="bx-card" @click="$router.push({name: 'sendEmail'})"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-directbox-send"></i> + </div> + <div class="bx-card-name"> + Send Email + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="bx-card" @click="$router.push({name: 'sendOtp'})"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-notification-status"></i> + </div> + <div class="bx-card-name"> + Send OTP + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="bx-card" @click="$router.push({name: 'autoBL'})"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-note-1"></i> + </div> + <div class="bx-card-name"> + Auto BL + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="bx-card" @click="$router.push({name: 'updateUserDataUsingBL'})"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-refresh"></i> + </div> + <div class="bx-card-name"> + Update using BL + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="bx-card" @click="$router.push({name: 'insertCustomMongoId'})"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-data"></i> + </div> + <div class="bx-card-name"> + Custom Mongo ID + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="bx-card" @click="$router.push({name: 'classroom'})"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-profile-2user"></i> + </div> + <div class="bx-card-name"> + Classroom + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="bx-card" @click="$router.push({name: 'clipboard'})"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-profile-2user"></i> + </div> + <div class="bx-card-name"> + Vue Clipboard + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="bx-card" @click="$router.push({name: 'FormKitComposition'})"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-profile-2user"></i> + </div> + <div class="bx-card-name"> + FormKit Custom Components (CompositionAPI) + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div><div class="col-3"> + <div class="bx-card" @click="$router.push({name: 'FormKitOption'})"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-profile-2user"></i> + </div> + <div class="bx-card-name"> + FormKit Custom Components (OptionAPI) + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="bx-card" @click="$router.push({name: 'tailwindForm'})"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-profile-2user"></i> + </div> + <div class="bx-card-name"> + Tailwind Testing + <i class="isax isax-bold-arrow-right"></i> + </div> + <div class="bx-card-desc"> + Lorem ipsum dolor sit amet consectetur, adipisicing elit. Ullam, rerum. + </div> + </div> + </div> + </div> + </div> + </div> +</template> + +<script> + +export default { + name: 'Home', + components: { + }, + data(){ + return{ + + } + }, + methods:{ + vueMeta(){ + this.$router.push({name: 'vueMetaExample',params:{title:"Live Demo"}}) + } + } +} +</script> + +<style> +.home { + text-align: center; +} +</style> diff --git a/app/src/views/I18Demo.vue b/app/src/views/I18Demo.vue new file mode 100644 index 0000000000000000000000000000000000000000..38b145a32b320a0c645fa88af094877136f031d5 --- /dev/null +++ b/app/src/views/I18Demo.vue @@ -0,0 +1,73 @@ +<template> + <div id="i18" class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Internationalization + </h2> + <div class="row justify-content-center"> + <div class="col-10"> + <div class="box-login"> + <div class="p-card p-component"> + <div class="data"> + <h3>Change Language (i18)</h3> + <FormKit + type="select" + label="" + placeholder="Change Language" + name="salutation" + :options="langs" + @change="changeLanguage(lang)" + v-model="lang" + /> + </div> + <div class="data alt"> + <component1 class="my-3" /> + <component2 /> + </div> + </div> + </div> + </div> + </div> + </div> +</template> + +<script> + import component1 from "../components/i18Demo/Component1.vue" + import component2 from "../components/i18Demo/Component2.vue" + import { loadLanguageAsync } from "@/setup/i18n-setup.js" + export default { + components: { component1, component2 }, + data() { + return { + langs: [ + { + label: "Hindi", + value: "hi", + }, + { + label: "Marathi", + value: "mr", + }, + { + label: "English", + value: "en", + }, + ], + lang: {}, + } + }, + methods: { + changeLanguage(lang) { + console.log("lang", lang) + if (Object.keys(lang).length > 0 && lang !== undefined) { + this.$i18n.locale = lang + this.$i18n.fallbackLocale = lang + loadLanguageAsync(lang) + console.log(lang) + } + }, + }, + } +</script> + +<style></style> diff --git a/app/src/views/KeyMapper.vue b/app/src/views/KeyMapper.vue new file mode 100644 index 0000000000000000000000000000000000000000..2c256335f3d80e22e95600e01af7b3203de8e225 --- /dev/null +++ b/app/src/views/KeyMapper.vue @@ -0,0 +1,95 @@ +<template> +<div class="container-fluid" id="keyMapper"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Key Mappers + </h2> + <div class="row justify-content-center"> + <div class="col-3"> + <div class="box-login clickable" @click.prevent="hashDataPush"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-shield-tick"></i> + </div> + <div class="bx-login-name"> + Hash Data + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="box-login clickable" @click.prevent="hashSaltPush"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-security-card"></i> + </div> + <div class="bx-login-name"> + Hash Salt + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="box-login clickable" @click.prevent="encryptDataPush"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-security-safe"></i> + </div> + <div class="bx-login-name"> + Encrypts Data + </div> + </div> + </div> + </div> + <div class="col-3"> + <div class="box-login clickable" @click.prevent="decryptDataPush"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-shield-slash"></i> + </div> + <div class="bx-login-name"> + Decrypts Data + </div> + </div> + </div> + </div> + </div> +</div> +</template> + +<script> + +export default { + data () { + return { + name: '', + sname: '', + saltKey: '', + ename: '', + dname: '', + hashResult: '', + saltResult: '', + encryptResult: '', + decryptResult: '' + } + }, + methods: { + hashDataPush () { + this.$router.push('/hashData') + }, + hashSaltPush () { + this.$router.push('/hashSalt') + }, + encryptDataPush () { + this.$router.push('/encryptData') + }, + decryptDataPush () { + this.$router.push('/decryptData') + } + } +} +</script> + +<style> + +</style> \ No newline at end of file diff --git a/app/src/views/LastInsertedId.vue b/app/src/views/LastInsertedId.vue new file mode 100644 index 0000000000000000000000000000000000000000..a70f59cd3238d5ea4826a72d08eb497f2f1030f4 --- /dev/null +++ b/app/src/views/LastInsertedId.vue @@ -0,0 +1,78 @@ +<template> +<div class="container-fluid" id="lastInsertID"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Last Insert ID + </h2> + <div class="row justify-content-center"> + <div class="col-auto"> + <div class="box-login"> + <div class="p-card p-component"> + <div class="field"> + <div class="p-float-label"> + <input type="text" class="p-inputtext p-component w-100" :class="emp.name ? 'p-filled' : ''" v-model="emp.name" id="name" required> + <label for="name">Employee Name</label> + </div> + </div> + <div class="field"> + <div class="p-float-label"> + <input type="text" class="p-inputtext p-component w-100" :class="emp.age ? 'p-filled' : ''" v-model="emp.age" id="age" required> + <label for="age">Employee Age</label> + </div> + </div> + <div class="field"> + <div class="p-float-label"> + <input type="text" class="p-inputtext p-component w-100" :class="emp.address ? 'p-filled' : ''" v-model="emp.address" id="address" required> + <label for="address">Employee Address</label> + </div> + </div> + <div class="btn-wrapper"> + <button class="btn btn-submit" @click.prevent="saveAndGetLastInsertedId"> + <i class="isax isax-bold-tick-circle"></i> + Save & Get Last Insert ID + </button> + </div> + <div class="field mt-4"> + <h3>Result</h3> + <json-viewer :value="empResult" boxed :expanded="true"></json-viewer> + </div> + </div> + </div> + </div> + </div> +</div> +</template> + +<script> +import MQL from '@/plugins/mql.js' +import jsonViewer from 'vue-json-viewer' +export default { + data () { + return { + emp: {}, + empResult: '' + } + }, + components: { + jsonViewer + }, + methods: { + saveAndGetLastInsertedId () { + new MQL() + .setActivity('o.[FetchLastInsertedId]') + .setData(this.emp) + .fetch() + .then((rs) => { + let res = rs.getActivity('FetchLastInsertedId', true) + if (rs.isValid('FetchLastInsertedId')) { + this.$toast.add({severity:'success', summary: 'Data Saved ', detail:'Data Saved Successfully', life: 3000}) + this.emp = {} + this.empResult = res.result + } else { + rs.showErrorToast('FetchLastInsertedId') + } + }) + } + } +} +</script> \ No newline at end of file diff --git a/app/src/views/Login.vue b/app/src/views/Login.vue new file mode 100644 index 0000000000000000000000000000000000000000..7bbb3a1044d92153718c1ebe2482a99b5bd917ab --- /dev/null +++ b/app/src/views/Login.vue @@ -0,0 +1,80 @@ +<template> + <div id="login" class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Login Form + </h2> + <div class="row justify-content-center"> + <div class="col-auto"> + <div class="box-login"> + <div class="p-card p-component"> + <FormKit + type="form" + id="login-example" + :form-class="submitted ? 'hide' : 'show'" + submit-label="Register" + @submit="authenticate" + :actions="false" + #default="{ value }" + > + <FormKit + type="text" + name="username" + label="User Name" + v-model="username" + placeholder="User Name" + help="Enter User Name" + validation="required" + /> + <div class="double"> + <FormKit + type="password" + name="password" + label="Password" + validation="required|length:6|matches:/[^a-zA-Z]/" + :validation-messages="{ + matches: 'Please include at least one symbol', + }" + v-model="password" + placeholder="Your password" + help="Choose a password" + /> + </div> + + <FormKit type="submit" label="Login" /> + <pre wrap>{{ value }}</pre> + </FormKit> + </div> + </div> + </div> + </div> + </div> +</template> + +<script> + import { login } from "../store/modules/login.js" + export default { + setup() { + const loginStore = login() + return { loginStore } + }, + data() { + return { + username: "", + password: "", + } + }, + methods: { + authenticate() { + this.loginStore + .AUTH_REQUEST({ loginId: this.username, password: this.password }) + .then((res) => { + this.$toast.success("Login Successfully") + }) + .catch((err) => { + this.$toast.error(err) + }) + }, + }, + } +</script> diff --git a/app/src/views/MQLRequestDemo.vue b/app/src/views/MQLRequestDemo.vue new file mode 100644 index 0000000000000000000000000000000000000000..c98090627d19464a37e3632ce2b19a17d9bff964 --- /dev/null +++ b/app/src/views/MQLRequestDemo.vue @@ -0,0 +1,59 @@ +<template> + <div id="masterAxios" class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + MQL Request + </h2> + <div class="row justify-content-center"> + <div class="col-6"> + <div class="box-login"> + <div class="data"> + <h3>MQL Data</h3> + <FormKit type="button" prefix-icon="check" @click="GetAllPosts"> + MQL Request + </FormKit> + </div> + <div class="json-wrapper"> + <json-viewer :value="result" boxed :expanded="true"></json-viewer> + </div> + </div> + </div> + </div> + </div> +</template> + +<script> + import MQL from "@/plugins/mql.js" + import jsonViewer from "vue-json-viewer" + export default { + data() { + return { + result: [], + } + }, + components: { + jsonViewer, + }, + methods: { + GetAllPosts() { + new MQL() + .showConfirmDialog(true) + .setActivity("o.[query_1QPikbRCETCu32Dj13qzRKNBraC]") + .setData({}) + .setHeader({ "my-header": "It is Ok" }) + .fetch("mqlData") + .then((rs) => { + let res = rs.getActivity("query_1QPikbRCETCu32Dj13qzRKNBraC", true) + if (rs.isValid("query_1QPikbRCETCu32Dj13qzRKNBraC")) { + this.$toast.success("Data Loaded Successfully") + this.result = res + } else { + rs.showErrorToast("query_1QPikbRCETCu32Dj13qzRKNBraC") + } + }) + }, + }, + } +</script> + +<style></style> diff --git a/app/src/views/MqlAssetFDBDemo.vue b/app/src/views/MqlAssetFDBDemo.vue new file mode 100644 index 0000000000000000000000000000000000000000..d1f1a3931e58a8b51c491311aad6f215fbe533e7 --- /dev/null +++ b/app/src/views/MqlAssetFDBDemo.vue @@ -0,0 +1,160 @@ +<template> + <div id="assetFDB" class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + MQL Request For Asset FDB + </h2> + <div class="row justify-content-center"> + <div class="col-4"> + <div class="box-login"> + <div class="p-card p-component"> + <h3>Upload File</h3> + <div class="field mt-5"> + <!-- <fileupload name="file" :url="url" id="files" :chooseIcon="chooseIcon" + :uploadIcon="uploadIcon" :cancelIcon="cancelIcon" :customUpload="true" @uploader="uploadFile"> + <template #empty> + <p>Click on the choose button to upload files</p> + </template> + </fileupload> --> + <FormKit + type="file" + label="Your files" + help="This input starts with files already “attachedâ€." + multiple="true" + :value="file_2" + v-model="file" + /> + <FormKit type="submit" label="Upload File" @click="uploadFile" /> + </div> + <div class="field mt-5"> + <h3 class="mb-5">Asset File</h3> + <div class="p-float-label"> + <input + type="text" + class="p-inputtext p-component w-100" + :class="assetPath ? 'p-filled' : ''" + id="assetPath" + name="assetPath" + /> + <label for="assetPath">Enter Asset File Path</label> + </div> + </div> + <div class="field mt-5"> + <h3 class="mb-5">Update File</h3> + <div class="p-float-label"> + <input + type="text" + class="p-inputtext p-component w-100" + :class="recordId ? 'p-filled' : ''" + name="recordID" + id="recordID" + /> + <label for="recordID">Enter your Record ID</label> + </div> + </div> + <div class="field mt-5"> + <fileupload + name="file" + :url="url" + id="files" + :chooseIcon="chooseIcon" + :uploadIcon="uploadIcon" + :cancelIcon="cancelIcon" + :customUpload="true" + @uploader="uploadFile" + > + <template #empty> + <p>Click on the choose button to upload files</p> + </template> + </fileupload> + </div> + + <div class="field mt-5"> + <h3 class="mb-3">Updated Asset Path</h3> + <p v-if="!updatedAssetPath">Asset path not updated</p> + <p v-else> + {{ updatedAssetPath }} + </p> + </div> + + <div class="btn-wrapper text-center"> + <button class="btn btn-submit" @click.stop.prevent="downloadFile"> + <i class="isax isax-bold-document-download"></i> + Download Asset + </button> + <button class="btn btn-show" @click.stop.prevent="renderFile"> + <i class="isax isax-bold-document-download"></i> + Render Asset + </button> + </div> + </div> + </div> + </div> + </div> + </div> +</template> + +<script> + import MQLAssetFDB from "@/plugins/mqlAssetFDB.js" + + export default { + data() { + return { + assetPath: "", + file: "", + content: "", + recordId: "", + updatedAssetPath: "", + chooseIcon: "isax isax-bold-cloud-plus", + uploadIcon: "isax isax-bold-add", + cancelIcon: "isax isax-bold-close-circle", + } + }, + methods: { + uploadFile() { + let formData = new FormData() + formData.append("file", this.file[0].file) + new MQLAssetFDB() + .enablePageLoader(true) + .setIndex("o.9929b6e44da568f390d20e51032b") + .setHostName("TestMixedBucketFDB2") + .setFormData(formData) + .setAssetData({ TestAssetBucket: "bucket1" }) + .uploadAssetFile() + .then((res) => { + if (res.isValid()) { + this.assetPath = res.getAssetPath() + } else { + res.showErrorToast() + } + }) + }, + updateFile(recordId) { + let formData = new FormData() + formData.append("file", this.files) + new MQLAssetFDB() + .setIndex("o.9929b6e44da568f390d20e51032b") + .setHostName("TestMixedBucketFDB2") + .setFormData(formData) + .setUpdateWithRecordId(recordId) + .setAssetData({ TestAssetBucket: "bucket1" }) + .uploadAssetFile() + .then((res) => { + if (res.isValid()) { + this.updatedAssetPath = res.getAssetPath() + } else { + res.showErrorToast() + } + }) + }, + downloadFile() { + new MQLAssetFDB().download(this.updatedAssetPath || this.assetPath) + }, + renderFile() { + new MQLAssetFDB().render(this.updatedAssetPath || this.assetPath) + }, + }, + } +</script> + +<style></style> diff --git a/app/src/views/Registration.vue b/app/src/views/Registration.vue new file mode 100644 index 0000000000000000000000000000000000000000..2cacd2f2221dcc90f6d203a771123d441f6ef2b5 --- /dev/null +++ b/app/src/views/Registration.vue @@ -0,0 +1,280 @@ +<template> + <div id="registration" class="container-fluid reg"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Registration Form + </h2> + <div class="container-fluid"> + <div class="row justify-content-center"> + <div class="col-6"> + <div class="box-login e"> + <div class="p-card p-component"> + <FormKit + type="form" + id="registration-example" + :form-class="submitted ? 'hide' : 'show'" + submit-label="Register" + @submit="saveData(value)" + :actions="false" + #default="{ value }" + > + <FormKit + type="text" + name="loginId" + label="loginId" + v-model="loginId" + placeholder="Login ID" + help="Enter Login ID" + validation="required" + /> + <div class="double"> + <FormKit + type="password" + name="password" + label="Password" + validation="required|length:6|matches:/[^a-zA-Z]/" + :validation-messages="{ + matches: 'Please include at least one symbol', + }" + placeholder="Your password" + help="Choose a password" + /> + <FormKit + type="password" + name="password_confirm" + label="Confirm password" + placeholder="Confirm password" + validation="required|confirm" + help="Confirm your password" + /> + <FormKit + type="file" + label="Your files" + help="This input starts with files already “attachedâ€." + multiple="true" + :value="file_2" + v-model="file" + validation="required" + /> + </div> + + <FormKit + type="checkbox" + label="Terms and Conditions" + help="Do you agree to our terms of service?" + name="terms" + :value="true" + validation="accepted|required" + validation-visibility="dirty" + /> + + <FormKit + type="color" + value="#00FF00" + label="Select a color" + help="Select your favorite color." + validation="required" + /> + + <FormKit + type="date" + value="2011-01-01" + label="Birthday" + help="Enter your birth day" + validation="required|date_before:2010-01-01" + validation-visibility="live" + /> + + <FormKit + type="datetime-local" + value="2020-03-13T18:22" + label="End of the world" + help="When will the end of the world take place?" + validation="required|date_after" + validation-visibility="live" + /> + + <FormKit + type="email" + label="Student email address" + help="Please enter your student email address." + validation="required|email|ends_with:.com" + validation-visibility="live" + placeholder="vikas@school.com" + /> + + <FormKit name="user_id" type="hidden" value="user_32135" /> + + <FormKit v-model="list" type="list"> + <p>Please provide a list of emails.</p> + <FormKit label="Email address" validation="required|email" /> + <FormKit label="Email address" validation="required|email" /> + <FormKit label="Email address" validation="required|email" /> + </FormKit> + + <FormKit + type="month" + help="What month were you born?" + label="Birth month" + name="birth_month" + value="1965-09" + validation="required" + /> + <FormKit + type="number" + help="What temperature should the house be?" + label="Thermostat" + name="temperature" + value="25" + step="1" + validation="required" + /> + + <FormKit + v-model="value1" + type="radio" + label="Preferred transportation" + :options="['E-Bike', 'E-Scooter', 'Electric car', 'Walking', 'Space tube']" + help="How do you like to get around?" + validation="required" + /> + + <FormKit + v-model="value2" + type="range" + label="Volume" + min="0" + max="11" + help="Select your volume level." + validation="required" + /> + <pre wrap>{{ value2 }}</pre> + + <FormKit + type="search" + placeholder="Search..." + label="Search" + value="Apple Cider" + validation="required" + /> + <FormKit + type="select" + label="Which country is the smallest?" + name="small_country" + :options="['Monaco', 'Vatican City', 'Maldives', 'Tuvalu']" + validation="required" + /> + + <FormKit + type="tel" + label="Phone number" + placeholder="xxx-xxx-xxxx" + validation="required|matches:/^[0-9]{3}-[0-9]{3}-[0-9]{4}$/" + :validation-messages="{ + matches: 'Phone number must be in the format xxx-xxx-xxxx', + }" + validation-visibility="dirty" + /> + + <FormKit + type="textarea" + label="Your Essay" + rows="10" + placeholder="Remember to write in complete sentences." + help="I'll know if you didn't read the book!" + validation="required" + /> + <FormKit + type="time" + label="Time" + value="15:50" + help="What time will go home today?" + validation="required" + /> + <FormKit + label="Vacation" + type="week" + help="What week will you travel to Fiji?" + value="2025-W02" + validation="required" + /> + <FormKit + type="url" + label="Favorite website" + placeholder="https://www.example.com..." + validation="required|url" + help="What is your favorite website?" + /> + <FormKit type="submit" label="Register" /> + + <pre wrap>{{ value }}</pre> + </FormKit> + </div> + </div> + </div> + </div> + </div> + </div> +</template> + +<script> + import MQLCdn from "@/plugins/mqlCdn.js" + export default { + data() { + return { + loginId: "", + password: "", + file: null, + result: "", + showPass: false, + url: "https://testcdncs.mkcl.org/1TxYD2KhMcczFlxXntsueOYN46J/demoFolder/", + uploadedFilePath: "", + value: "", + value1: "", + value2: "", + submitted: false, + file_2: "", + list: "", + } + }, + methods: { + cdnProfileUpload() { + let formData = new FormData() + formData.append("file", this.file[0].file) // append your file as 'file' in formdata. + new MQLCdn() + .enablePageLoader(true) + // FIXED: change this to directory path + .setDirectoryPath("/demoFolder") // (optional field) if you want to save file to specific directory path + .setFormData(formData) // (required) sets file data + .setFileName(this.inputFileName) // (optional field) if you want to set name to file that is being uploaded + // FIXED: pass buckeyKey instead of name + .setBucketKey("1TxYD2KhMcczFlxXntsueOYN46J") // (required) valid bucket key need to set in which file will be uploaded. + .setPurposeId("1TxY9TS4uzp8Ivyo0eKPpo1g2Og") // (required) valid purposeId need to set in which file will be uploaded. + .setClientId("1TxY9TS4uzp8Ivyo0eKPpo1g2Og") // (required) valid purposeId need to set in which file will be uploaded. + .uploadFile("uploadtBtn") + .then((res) => { + // (required) this will upload file takes element id (optional param) which will be blocked while file upload.. + if (res.isValid()) { + this.uploadedFilePath = res.uploadedFileURL() // returns uploaded file url.. + console.log("res cdn path", this.uploadedFilePath) + this.$toast.add({ severity: "success", summary: "File", detail: "file uploaded.", life: 3000 }) + } else { + res.showErrorToast() + } + }) + }, + saveData(value) { + this.cdnProfileUpload() + const form = new FormData() + form.set("enctype", "multipart/form-data") + form.append("fileUrl", this.uploadedFilePath.cdnServer + this.uploadedFilePath.filePath) + form.append("loginId", this.loginId) + form.append("password", this.password) + console.log("formData", this.value) + console.log(value) + }, + }, + } +</script> + +<style></style> diff --git a/app/src/views/ServerSidePagination.vue b/app/src/views/ServerSidePagination.vue new file mode 100644 index 0000000000000000000000000000000000000000..d150335f7b5b1c5113d7234cb1f32aeffe2c0cbe --- /dev/null +++ b/app/src/views/ServerSidePagination.vue @@ -0,0 +1,86 @@ +<template> +<div id="serverSidePagination" class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Server Side Pagination + </h2> + <div class="subtext">This report shows per page 3 documents</div> + <div class="row justify-content-center"> + <div class="col"> + <div class="box-login"> + <div class="p-card p-component"> + <DataTable :value="items" v-if="items && items.length > 0"> + <Column field="addcategory" header="addcategory"></Column> + <Column field="fname" header="fname"></Column> + <Column field="name" header="name"></Column> + <Column field="sname" header="sname"></Column> + </DataTable> + <div class="empty-state" v-else>Records Not Found</div> + <div class="btn-wrapper"> + <button class="btn btn-show" v-if="pageNo > 1" @click="prevClick()"> + <i class="isax isax-bold-arrow-left-3"></i> + Prev + </button> + <button v-if="items && items.length > 0" class="btn btn-submit" :disabled="items == undefined || items.length == 0" @click="nextClick()"> + <i class="isax isax-bold-arrow-right-2"></i> + Next + </button> + </div> + </div> + </div> + </div> + </div> +</div> +</template> + +<script> +import MQL from '@/plugins/mql.js' +export default { + data () { + return { + items: [], + pageNo: 1 + } + }, + mounted () { + this.fetchPaginationData() + }, + methods: { + prevClick () { + if (this.pageNo > 1) { + this.pageNo-- + } else { + this.pageNo = 1 + } + this.fetchPaginationData() + }, + nextClick () { + this.pageNo++ + this.fetchPaginationData() + }, + fetchPaginationData () { + new MQL() + .setActivity('o.[GetPaginationData]') + .setData({ pageNo: this.pageNo }) + .fetch() + .then((rs) => { + let res = rs.getActivity('GetPaginationData', true) + if (rs.isValid('GetPaginationData')) { + this.items = res.result + this.$toast.add({severity:'success', summary: 'Pagination Data ', detail:'Get Pagination Data', life: 3000}) + } else { + this.items = [] + rs.showErrorToast('GetPaginationData') + } + }) + } + } +} +</script> + +<style lang="scss" scoped> +.subtext { + margin-top: 0.25rem; + margin-left: 3rem; +} +</style> \ No newline at end of file diff --git a/app/src/views/SessionManager.vue b/app/src/views/SessionManager.vue new file mode 100644 index 0000000000000000000000000000000000000000..7fa6a82ec84999d2aa6c5950b7be27941720ecf1 --- /dev/null +++ b/app/src/views/SessionManager.vue @@ -0,0 +1,125 @@ +<template> + <div id="sessionManager" class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Session Manager + </h2> + <div class="row justify-content-center"> + <div class="tabs"> + <a class="tab tab-bordered" @click.prevent="storeDataPush"> Store Data</a> + <a class="tab tab-bordered tab-active" @click.prevent="fetchDataPush">Fetch Data</a> + <a class="tab tab-bordered" @click.prevent="deleteDataPush">Delete Data</a> + </div> + <!-- <div class="col-4"> + <div class="box-login clickable"> + <div class="p-card p-component" @click.prevent="storeDataPush"> + <div class="icon-holder"> + <i class="isax isax-bold-story"></i> + </div> + <div class="bx-login-name">Store Data</div> + </div> + </div> + </div> + <div class="col-4"> + <div class="box-login clickable"> + <div class="p-card p-component" @click.prevent="fetchDataPush"> + <div class="icon-holder"> + <i class="isax isax-bold-document-download"></i> + </div> + <div class="bx-login-name">Fetch Data</div> + </div> + </div> + </div> + <div class="col-4"> + <div class="box-login clickable"> + <div class="p-card p-component" @click.prevent="deleteDataPush"> + <div class="icon-holder"> + <i class="isax isax-bold-trash"></i> + </div> + <div class="bx-login-name">Delete Data</div> + </div> + </div> + </div> --> + </div> + </div> +</template> + +<script> + import MQL from "@/plugins/mql.js" + export default { + data() { + return { + session: {}, + fetchKey: "", + deleteKey: "", + sessionResult: "", + } + }, + methods: { + storeDataPush() { + this.$router.push("/storeData") + }, + fetchDataPush() { + this.$router.push("/fetchData") + }, + deleteDataPush() { + this.$router.push("deleteData") + }, + saveSessionData() { + new MQL() + .setActivity("o.[StoreDataInSession]") + .setData(this.session) + .fetch() + .then((rs) => { + rs.getActivity("StoreDataInSession", true) + if (rs.isValid("StoreDataInSession")) { + this.session = {} + alert("Data saved successfully") + } else { + rs.showErrorToast("StoreDataInSession") + } + }) + }, + fetchSessionData() { + new MQL() + .setActivity("o.[FetchDataFromSession]") + .setData({ name: this.fetchKey }) + .fetch() + .then((rs) => { + let res = rs.getActivity("FetchDataFromSession", true) + if (rs.isValid("FetchDataFromSession")) { + if (res && res.result) { + this.sessionResult = res.result + this.fetchKey = "" + alert("Data fetched successfully") + } else { + alert("Data fetched failed") + } + } else { + rs.showErrorToast("FetchDataFromSession") + } + }) + }, + deleteSessionData() { + new MQL() + .setActivity("o.[DeleteDataFromSession]") + .setData({ name: this.deleteKey }) + .fetch() + .then((rs) => { + let res = rs.getActivity("DeleteDataFromSession", true) + if (rs.isValid("DeleteDataFromSession")) { + if (res && res.result) { + this.sessionResult = res.result + this.deleteKey = "" + alert("Data deleted successfully") + } else { + alert("Data delete failed") + } + } else { + rs.showErrorToast("DeleteDataFromSession") + } + }) + }, + }, + } +</script> diff --git a/app/src/views/StudentDemo.vue b/app/src/views/StudentDemo.vue new file mode 100644 index 0000000000000000000000000000000000000000..e7e60848b047c1d47f5497900e3da9cb0066057e --- /dev/null +++ b/app/src/views/StudentDemo.vue @@ -0,0 +1,123 @@ +<template> + <div> + <h3>Save Student</h3> + Student Name: <input + v-model="student.name" + required + > <br> + Student Age: <input + v-model.number="student.age" + required + > <br> + Student address: <input + v-model="student.address" + required + ><br> + <button @click="saveStudentData"> + Save + </button> + <br><br> + <h3>Update Student</h3> + Student Name: <input + v-model="uname" + required + > <br> + <button @click="updateStudentData"> + Update + </button> + <div>{{ updatedRes }}</div> + <br><br> + <h3>Fetch All Student</h3> + <button @click="fetchAllStudent"> + FetchAllStudent + </button> + <div>{{ AllStudent }}</div> + <br><br> + <h3>Delete Student</h3> + Student Name: <input + v-model="dstudent" + required + > <br> + <button @click="deleteStudentData"> + Delete + </button> + </div> +</template> + +<script> +import MQL from '@/plugins/mql.js' +export default { + data () { + return { + student: {}, + uname: '', + dstudent: '', + updatedRes: '', + AllStudent: [] + } + }, + methods: { + saveStudentData () { + // alert(JSON.stringify(this.student)) + new MQL() + .setActivity('o.[SaveStudentData]') + .setData(this.student) + .fetch() + .then((rs) => { + let res = rs.getActivity('SaveStudentData', true) + if (rs.isValid('SaveStudentData')) { + alert(JSON.stringify(res)) + alert('student saved successfully') + this.student = {} + } else { + rs.showErrorToast('SaveStudentData') + } + }) + }, + updateStudentData () { + new MQL() + .setActivity('o.[UpdateStudentData]') + .setData({ name: this.uname }) + .fetch() + .then((rs) => { + let res = rs.getActivity('UpdateStudentData', true) + if (rs.isValid('UpdateStudentData')) { + this.updatedRes = res.result + this.uname = '' + } else { + rs.showErrorToast('UpdateStudentData') + } + }) + }, + deleteStudentData () { + new MQL() + .setActivity('o.[DeleteStudentData]') + .setData({ name: this.dstudent }) + .fetch() + .then((rs) => { + rs.getActivity('DeleteStudentData', true) + if (rs.isValid('DeleteStudentData')) { + alert('Student deleted successfully') + this.dstudent = '' + } else { + rs.showErrorToast('DeleteStudentData') + } + }) + }, + fetchAllStudent () { + new MQL() + .setActivity('o.[query_1tvgHmekn2RX1jUoViq5E0vDPh9]') + .fetch() + .then((rs) => { + let res = rs.getActivity('query_1tvgHmekn2RX1jUoViq5E0vDPh9', true) + if (rs.isValid('query_1tvgHmekn2RX1jUoViq5E0vDPh9')) { + this.AllStudent = res + } else { + rs.showErrorToast('query_1tvgHmekn2RX1jUoViq5E0vDPh9') + } + }) + } + } +} +</script> +<style></style> diff --git a/app/src/views/TableDemo.vue b/app/src/views/TableDemo.vue new file mode 100644 index 0000000000000000000000000000000000000000..ba44c3e9e3970cfda70e3edf3d1e937108039037 --- /dev/null +++ b/app/src/views/TableDemo.vue @@ -0,0 +1,32 @@ +<template> + <div id="tableDemo" class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Table + </h2> + <mTable + id-table="tblPlaces" + restriction="o" + activity="query_1el1NAwh6nMeZl1PhbzhP1TyQLf" + msg="Table Component" + /> + </div> +</template> + +<script> +import MTable from '@/components/MTable.vue' + +export default { + components: { + mTable: MTable + }, + data () { + return { + } + } +} +</script> + +<style lang="scss"> + +</style> diff --git a/app/src/views/UploadManager.vue b/app/src/views/UploadManager.vue new file mode 100644 index 0000000000000000000000000000000000000000..0a50c403ccacf6a28292fafe8d71ec37af0ce395 --- /dev/null +++ b/app/src/views/UploadManager.vue @@ -0,0 +1,104 @@ +<template> + <div id="uploadManager" class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Upload Manager + </h2> + <div class="row justify-content-center"> + <!-- <div class="col-4"> + <div class="box-login clickable" @click.prevent="uploadFilePush"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-document-upload"></i> + </div> + <div class="bx-login-name"> + Upload File + </div> + </div> + </div> + </div> + <div class="col-4"> + <div class="box-login clickable" @click.prevent="uploadProgressPush"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-document-cloud"></i> + </div> + <div class="bx-login-name"> + Upload Progress Check + </div> + </div> + </div> + </div> --> + <div class="tabs"> + <a class="tab tab-bordered" @click.prevent="uploadFilePush">Upload File</a> + <a class="tab tab-bordered tab-active" @click.prevent="uploadProgressPush">Upload Progress Check</a> + </div> + </div> + </div> +</template> + +<script> +import MQL from '@/plugins/mql.js' +export default { + data () { + return { + upload: {}, + uploadId: '', + uploadResult: '', + progressResult: '' + } + }, + methods: { + uploadFilePush () { + this.$router.push('/uploadFile') + }, + uploadProgressPush () { + this.$router.push('/uploadProgessFile') + }, + + uploadFile () { + // var a = [] + // a.push(this.upload.uploadFileUrl) + // this.upload.uploadFileUrl = a + var a = { + cdnBaseUrl: [this.upload.cdnBaseUrl], + uploadFileUrl: [this.upload.uploadFileUrl], + destinationFileUrl: [this.upload.destinationFileUrl] + } + new MQL() + .setActivity('o.[UploadFileUsingUM]') + .setData(a) + .fetch() + .then((rs) => { + let res = rs.getActivity('UploadFileUsingUM', true) + if (rs.isValid('UploadFileUsingUM')) { + this.upload = {} + this.uploadResult = res.result + alert('File uploaded successfully') + } else { + rs.showErrorToast('UploadFileUsingUM') + } + }) + }, + checkUploadProgress () { + new MQL() + .setActivity('o.[CheckUploadedFileProgress]') + .setData({ uploadFileId: this.uploadId }) + .fetch() + .then((rs) => { + let res = rs.getActivity('CheckUploadedFileProgress', true) + if (rs.isValid('CheckUploadedFileProgress')) { + if (res && res.result) { + this.progressResult = res.result + this.uploadId = '' + } else { + alert('Progress checking failed') + } + } else { + rs.showErrorToast('CheckUploadedFileProgress') + } + }) + } + } +} +</script> \ No newline at end of file diff --git a/app/src/views/Validator.vue b/app/src/views/Validator.vue new file mode 100644 index 0000000000000000000000000000000000000000..eaa035bc3acca98df2582c6c692f780bcf0c62d3 --- /dev/null +++ b/app/src/views/Validator.vue @@ -0,0 +1,230 @@ +<template> + <div id="validator" class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Validator + </h2> + <div class="row justify-content-center"> + <div class="col-auto"> + <div class="box-login"> + <div class="p-card p-component"> + <!-- <Form @submit="onSubmit" :validation-schema="schema" v-slot="{ errors }"> + <div class="field"> + <label>Title</label> + <Field + name="title" + as="select" + class="p-dropdown p-componet p-inputwrapper" + :class="{ 'is-invalid': errors.title }" + > + <option class="p-dropdown-item" value="">Select your title</option> + <option class="p-dropdown-item" value="Mr">Mr</option> + <option class="p-dropdown-item" value="Mrs">Mrs</option> + <option class="p-dropdown-item" value="Miss">Miss</option> + <option class="p-dropdown-item" value="Ms">Ms</option> + </Field> + <div class="invalid-feedback">{{ errors.title }}</div> + </div> + <div class="field"> + <label>First Name</label> + <Field + name="firstName" + type="text" + class="p-inputtext p-component" + :class="{ 'is-invalid': errors.firstName }" + /> + <div class="invalid-feedback">{{ errors.firstName }}</div> + </div> + <div class="field"> + <label>Last Name</label> + <Field + name="lastName" + type="text" + class="p-inputtext p-component" + :class="{ 'is-invalid': errors.lastName }" + /> + <div class="invalid-feedback">{{ errors.lastName }}</div> + </div> + <div class="field"> + <label>Date of Birth</label> + <Field + name="dob" + type="date" + class="p-inputtext p-component" + :class="{ 'is-invalid': errors.dob }" + /> + <div class="invalid-feedback">{{ errors.dob }}</div> + </div> + <div class="field"> + <label>Email</label> + <Field + name="email" + type="text" + class="p-inputtext p-component" + :class="{ 'is-invalid': errors.email }" + /> + <div class="invalid-feedback">{{ errors.email }}</div> + </div> + <div class="field"> + <label>Password</label> + <Field + name="password" + type="password" + class="p-inputtext p-component" + :class="{ 'is-invalid': errors.password }" + /> + <div class="invalid-feedback">{{ errors.password }}</div> + </div> + <div class="field"> + <label>Confirm Password</label> + <Field + name="confirmPassword" + type="password" + class="p-inputtext p-component" + :class="{ 'is-invalid': errors.confirmPassword }" + /> + <div class="invalid-feedback">{{ errors.confirmPassword }}</div> + </div> + <div class="field"> + <Field + name="acceptTerms" + type="checkbox" + id="acceptTerms" + value="true" + class="p-checkbox p-component" + :class="{ 'is-invalid': errors.acceptTerms }" + /> + <label for="acceptTerms" class="label-checkbox" + >Accept Terms & Conditions</label + > + <div class="invalid-feedback">{{ errors.acceptTerms }}</div> + </div> + <div class="btn-wrapper"> + <button class="btn btn-submit" type="submit"> + <i class="isax isax-bold-tick-circle"></i> + Submit + </button> + </div> + </Form> --> + <FormKit + type="form" + id="validator-example" + :form-class="submitted ? 'hide' : 'show'" + submit-label="Register" + :actions="false" + #default="{ value }" + > + <FormKit + type="select" + label="Select Salutation" + placeholder="Select Salutation" + name="salutation" + :options="['MR', 'MISS']" + validation="required" + /> + <FormKit + type="text" + name="firstName" + label="firstName" + v-model="firstName" + placeholder="First Name" + help="Enter First Name" + validation="required" + /> + <FormKit + type="text" + name="lastName" + label="lastName" + v-model="lastName" + placeholder="Last Name" + help="Enter Last Name" + validation="required" + /> + <FormKit + type="date" + value="2011-01-01" + label="Birthday" + help="Enter your birth day" + validation="required|date_before:2010-01-01" + validation-visibility="live" + /><FormKit + type="email" + name="email" + label="email" + v-model="email" + placeholder="Email" + help="Enter Email" + validation="required" + /> + <div class="double"> + <FormKit + type="password" + name="password" + label="Password" + validation="required|length:6|matches:/[^a-zA-Z]/" + :validation-messages="{ + matches: 'Please include at least one symbol', + }" + placeholder="Your password" + help="Choose a password" + /> + <FormKit + type="password" + name="password_confirm" + label="Confirm password" + placeholder="Confirm password" + validation="required|confirm" + help="Confirm your password" + /> + <FormKit + type="checkbox" + label="Terms and Conditions" + help="Do you agree to our terms of service?" + name="terms" + :value="true" + validation="accepted" + validation-visibility="dirty" + /> + </div> + <FormKit type="submit" label="Register" /> + <!-- <pre wrap>{{ value }}</pre> --> + </FormKit> + </div> + </div> + </div> + </div> + </div> +</template> + +<script> + import * as Yup from "yup" + + export default { + data() { + return { + schema: Yup.object().shape({ + title: Yup.string().required("Title is required"), + firstName: Yup.string().required("First Name is required"), + lastName: Yup.string().required("Last name is required"), + dob: Yup.string() + .required("Date of Birth is required") + .matches( + /^\d{4}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$/, + "Date of Birth must be a valid date in the format YYYY-MM-DD" + ), + email: Yup.string().required("Email is required").email("Email is invalid"), + password: Yup.string().min(6, "Password must be at least 6 characters").required("Password is required"), + confirmPassword: Yup.string() + .oneOf([Yup.ref("password"), null], "Passwords must match") + .required("Confirm Password is required"), + acceptTerms: Yup.string().required("Accept Ts & Cs is required"), + }), + onSubmit: (values) => { + alert("SUCCESS!! :-)\n\n" + JSON.stringify(values, null, 4)) + }, + } + }, + } +</script> + +<style></style> diff --git a/app/src/views/autoBL.vue b/app/src/views/autoBL.vue new file mode 100644 index 0000000000000000000000000000000000000000..15bcb28800621a19962ca87878341144cedf1962 --- /dev/null +++ b/app/src/views/autoBL.vue @@ -0,0 +1,75 @@ +<template> + <div class="container-fluid" id="autoBL"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Auto BL + </h2> + <div class="subtext">To check positive condition write "CoreStudio" string in input box</div> + <div class="row justify-content-center"> + <div class="col-auto"> + <div class="box-login"> + <div class="p-card p-component"> + <div class="field"> + <div class="p-float-label"> + <input type="text" v-model="autobl.name" :class="autobl.name ? 'p-filled' : ''" id="bl" + class="p-inputtext p-component"> + <label for="bl">Enter string</label> + </div> + </div> + <div class="btn-wrapper"> + <button class="btn btn-submit" @click.prevent="autoblDemo"> + <i class="isax isax-bold-tick-circle"></i> + Test + </button> + </div> + <div class="field mt-4"> + <h3>Result</h3> + <json-viewer :value="autoblResult" boxed :expanded="true"></json-viewer> + </div> + </div> + </div> + </div> + </div> + </div> + +</template> + +<script> +import MQL from '@/plugins/mql.js' +import jsonViewer from 'vue-json-viewer' +export default { + data() { + return { + autobl: {}, + autoblResult: '' + } + }, + components: { + jsonViewer + }, + methods: { + autoblDemo() { + new MQL() + .setActivity('o.[AutoBLDemo]') + .setData(this.autobl) + .fetch() + .then((rs) => { + let res = rs.getActivity('AutoBLDemo', true) + if (rs.isValid('AutoBLDemo')) { + this.autobl = {} + this.autoblResult = res.result + } else { + rs.showErrorToast('AutoBLDemo') + } + }) + } + } +} +</script> + +<style lang="scss" scoped> +.subtext { + margin-left: 3rem; + margin-top: 0.75rem; +} +</style> \ No newline at end of file diff --git a/app/src/views/email.vue b/app/src/views/email.vue new file mode 100644 index 0000000000000000000000000000000000000000..acf67b5cd839fab7a2f6e5d20a454d48efea2072 --- /dev/null +++ b/app/src/views/email.vue @@ -0,0 +1,70 @@ +<template> + <div class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Email + </h2> + <div class="row justify-content-center"> + <div class="col-6"> + <div class="box-login clickable" @click.prevent="sendStatic"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-sms"></i> + </div> + <div class="bx-login-name"> + Send Static Email Example + </div> + </div> + </div> + </div> + <div class="col-6"> + <div class="box-login clickable" @click.prevent="sendDynamic"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-sms-tracking"></i> + </div> + <div class="bx-login-name"> + Send Dynamic Email Example + </div> + </div> + </div> + </div> + </div> + </div> + </template> + +<script> +import MQL from '@/plugins/mql.js' +export default { + data () { + return { + email: {} + } + }, + components: { + }, + methods: { + sendDynamic () { + this.$router.push('/sendDynamicEmails') + }, + sendStatic () { + this.$router.push('/sendStaticEmails') + }, + sendemail () { + new MQL() + .setActivity('o.[SendEmail]') + .setData(this.email) + .fetch() + .then((rs) => { + rs.getActivity('SendEmail', true) + if (rs.isValid('SendEmail')) { + this.email = {} + this.$toast.add({severity:'success', summary: 'Email Sent ', detail:'Email Sent Successfully', life: 3000}) + } else { + rs.showErrorToast('SendEmail') + } + }) + } + } +} +</script> \ No newline at end of file diff --git a/app/src/views/generateOTP.vue b/app/src/views/generateOTP.vue new file mode 100644 index 0000000000000000000000000000000000000000..19b7a83b0f730deee5beaac2954c1856ad9ad889 --- /dev/null +++ b/app/src/views/generateOTP.vue @@ -0,0 +1,72 @@ +<template> +<div class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Generate OTP + </h2> + <div class="row justify-content-center"> + <div class="col-auto"> + <div class="box-login"> + <div class="p-card p-component"> + <div class="field"> + <div class="p-float-label"> + <input type="text" class="p-inputtext p-component" :class="otp.number ? 'p-filled' : ''" id="number" v-model="otp.number"> + <label for="number">Enter mobile number</label> + </div> + </div> + <div class="btn-wrapper"> + <button class="btn btn-submit" @click.prevent="generateOTP"> + <i class="isax isax-bold-message"></i> + Generate + </button> + </div> + <div class="field mt-4"> + <h3>Result</h3> + <json-viewer :value="result" boxed :expanded="true"></json-viewer> + </div> + </div> + </div> + </div> + </div> +</div> +</template> + +<script> +import MQL from '@/plugins/mql.js' +import jsonViewer from 'vue-json-viewer' +export default { + data () { + return { + otp: {}, + result: '' + } + }, + components: { + jsonViewer + }, + methods: { + onCopy () { + this.$toast.add({severity:'info', summary: 'OTP ', detail:'You just copied OTP', life: 3000}) + }, + onError () { + this.$toast.add({severity:'error', summary: 'OTP ', detail:'Failed to get OTP', life: 3000}) + }, + generateOTP () { + new MQL() + .setActivity('o.[smsOTP]') + .setData(this.otp) + .fetch() + .then((rs) => { + let res = rs.getActivity('smsOTP', true) + if (rs.isValid('smsOTP')) { + this.otp = {} + this.result = res.result + this.$toast.add({severity:'success', summary: 'OTP ', detail:'OTP Sent Successfully', life: 3000}) + } else { + rs.showErrorToast('smsOTP') + } + }) + } + } +} +</script> \ No newline at end of file diff --git a/app/src/views/insertCustomMongoId.vue b/app/src/views/insertCustomMongoId.vue new file mode 100644 index 0000000000000000000000000000000000000000..6df39420ca444832264d0d5f4701ffcb3243ad3c --- /dev/null +++ b/app/src/views/insertCustomMongoId.vue @@ -0,0 +1,84 @@ +<template> + <div id="customMongoID" class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Insert Any Custom MongoDB ID + </h2> + <div class="row justify-content-center"> + <div class="col-6"> + <div class="box-login clickable" @click.prevent="customIDPush"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-data"></i> + <div class="bx-login-name"> + Custom ID Example + </div> + </div> + </div> + </div> + </div> + <div class="col-6"> + <div class="box-login clickable" @click.prevent="hexIDPush"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-data"></i> + <div class="bx-login-name"> + Hex ID Example + </div> + </div> + </div> + </div> + </div> + </div> + </div> +</template> + +<script> +import MQL from '@/plugins/mql.js' +export default { + data () { + return { + obj: {}, + hobj: {} + } + }, + methods: { + customIDPush () { + this.$router.push('/customID') + }, + hexIDPush () { + this.$router.push('/hexID') + }, + saveCustomId () { + new MQL() + .setActivity('o.[SaveCustomObjectID]') + .setData(this.obj) + .fetch() + .then((rs) => { + rs.getActivity('SaveCustomObjectID', true) + if (rs.isValid('SaveCustomObjectID')) { + this.obj = {} + alert('Custom objectId saved successfully') + } else { + rs.showErrorToast('SaveCustomObjectID') + } + }) + }, + saveCustomHexId () { + new MQL() + .setActivity('o.[SaveCustomHexObjectID]') + .setData(this.hobj) + .fetch() + .then((rs) => { + rs.getActivity('SaveCustomHexObjectID', true) + if (rs.isValid('SaveCustomHexObjectID')) { + this.hobj = {} + alert('Custom hex objectId saved successfully') + } else { + rs.showErrorToast('SaveCustomHexObjectID') + } + }) + } + } +} +</script> \ No newline at end of file diff --git a/app/src/views/otp.vue b/app/src/views/otp.vue new file mode 100644 index 0000000000000000000000000000000000000000..2e89131ce06956f0471a2a8e2db644b837c28f96 --- /dev/null +++ b/app/src/views/otp.vue @@ -0,0 +1,72 @@ +<template> + <div class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + OTP + </h2> + <div class="row justify-content-center"> + <div class="col-6"> + <div class="box-login clickable" @click.prevent="generated"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-message"></i> + </div> + <div class="bx-login-name"> + Generate OTP Example + </div> + </div> + </div> + </div> + <div class="col-6"> + <div class="box-login clickable" @click.prevent="verified"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-message-edit"></i> + </div> + <div class="bx-login-name"> + Verify OTP Example + </div> + </div> + </div> + </div> + </div> +</div> +</template> + +<script> +import MQL from '@/plugins/mql.js' +export default { + data () { + return { + otp: {}, + otpResult: '' + } + }, + components: { + }, + methods: { + generated () { + this.$router.push('/generateOTP') + }, + verified () { + this.$router.push('/validateOTP') + }, + generateOTP () { + new MQL() + .setActivity('o.[SendOTP]') + .setData(this.otp) + .fetch() + .then((rs) => { + let res = rs.getActivity('SendOTP', true) + if (rs.isValid('SendOTP')) { + this.otp = {} + this.otpResult = res.result + this.$toast.add({severity:'success', summary: 'OTP', detail:'OTP generated successfully', life: 3000}) + } else { + rs.showErrorToast('SendOTP') + } + }) + } + } +} +</script> \ No newline at end of file diff --git a/app/src/views/sendDynamicEmails.vue b/app/src/views/sendDynamicEmails.vue new file mode 100644 index 0000000000000000000000000000000000000000..48e8ed45ff333dfa379a4c7e98e320a6098f4422 --- /dev/null +++ b/app/src/views/sendDynamicEmails.vue @@ -0,0 +1,64 @@ +<template> + <div class="container-fluid" id="dynamicEmail"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Dynamic Emails + </h2> + <div class="row justify-content-center"> + <div class="col-auto"> + <div class="box-login"> + <div class="p-card p-component"> + <div class="field"> + <div class="p-float-label"> + <input type="email" id="email" v-model="email.to" :class="email.to ? 'p-filled' : ''" class="p-inputtext p-component"> + <label for="email">Enter email ID</label> + </div> + </div> + <div class="field"> + <div class="p-float-label"> + <input type="email" id="email" v-model="email.text" :class="email.text ? 'p-filled' : ''" class="p-inputtext p-component"> + <label for="email">Enter message </label> + </div> + </div> + <div class="btn-wrapper"> + <button class="btn btn-submit" @click.prevent="submitDynamic"> + <i class="isax isax-bold-sms-tracking"></i> + Send + </button> + </div> + </div> + </div> + </div> + </div> +</div> +</template> + +<script> +import MQL from '@/plugins/mql.js' +export default { + data () { + return { + email: {} + } + }, + components: { + }, + methods: { + submitDynamic () { + new MQL() + .setActivity('o.[SendDynamicEmails]') + .setData(this.email) + .fetch() + .then((rs) => { + rs.getActivity('SendDynamicEmails', true) + if (rs.isValid('SendDynamicEmails')) { + this.email = {} + this.$toast.add({severity:'success', summary: 'Email Sent ', detail:'Email Sent Successfully', life: 3000}) + } else { + rs.showErrorToast('SendDynamicEmails') + } + }) + } + } +} +</script> diff --git a/app/src/views/sendDynamicMessages.vue b/app/src/views/sendDynamicMessages.vue new file mode 100644 index 0000000000000000000000000000000000000000..63ec2c4e2bdc6bfab22a0eb9ff1254f9dcbae04c --- /dev/null +++ b/app/src/views/sendDynamicMessages.vue @@ -0,0 +1,69 @@ +<template> +<div class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Dynamic Messages + </h2> + <div class="row justify-content-center"> + <div class="col-auto"> + <div class="box-login"> + <div class="p-card p-component"> + <div class="field"> + <div class="p-float-label"> + <input type="text" class="p-inputtext p-component" v-model="sms.number" id="number" :class="sms.number ? 'p-filled' : ''"> + <label for="number">Enter mobile number</label> + </div> + </div> + <div class="field"> + <div class="p-float-label"> + <input type="text" class="p-inputtext p-component" v-model="sms.message" id="message" :class="sms.message ? 'p-filled' : ''"> + <label for="number">Enter message</label> + </div> + </div> + <div class="field"> + <div class="p-float-label"> + <input type="text" class="p-inputtext p-component" v-model="sms.templateId" id="templateId" :class="sms.templateId ? 'p-filled' : ''"> + <label for="templateId">Enter template Id</label> + </div> + </div> + <div class="btn-wrapper"> + <button class="btn btn-submit" @click.prevent="sendDynamicMessages"> + <i class="isax isax-bold-sms"></i> + Send + </button> + </div> + </div> + </div> + </div> + </div> +</div> +</template> + +<script> +import MQL from '@/plugins/mql.js' +export default { + data () { + return { + sms: {} + } + }, + + methods: { + sendDynamicMessages () { + new MQL() + .setActivity('o.[SendDynamicMessages]') + .setData(this.sms) + .fetch() + .then((rs) => { + rs.getActivity('SendDynamicMessages', true) + if (rs.isValid('SendDynamicMessages')) { + this.sms = {} + this.$toast.add({severity:'success', summary: 'SMS Sent ', detail:'SMS Sent Successfully', life: 3000}) + } else { + rs.showErrorToast('SendDynamicMessages') + } + }) + } + } +} +</script> \ No newline at end of file diff --git a/app/src/views/sendStaticEmails.vue b/app/src/views/sendStaticEmails.vue new file mode 100644 index 0000000000000000000000000000000000000000..ee7dc3df6fecbfa57da68b3d8d8b08072ff9cf05 --- /dev/null +++ b/app/src/views/sendStaticEmails.vue @@ -0,0 +1,57 @@ +<template> + <div class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Static Email + </h2> + <div class="row justify-content-center"> + <div class="col-auto"> + <div class="box-login"> + <div class="p-card p-component"> + <div class="field"> + <div class="p-float-label"> + <input type="email" v-model="email.to" class="p-inputtext p-component" :class="email.to ? 'p-filled' : ''" id="email" required> + <label for="email">Enter Email ID</label> + </div> + </div> + <div class="btn-wrapper"> + <button class="btn btn-submit" @click.prevent="sendemail" > + <i class="isax isax-bold-sms"></i> + Send Email + </button> + </div> + </div> + </div> + </div> + </div> +</div> +</template> + +<script> +import MQL from '@/plugins/mql.js' +export default { + data () { + return { + email: {} + } + }, + + methods: { + sendemail () { + new MQL() + .setActivity('o.[SendEmails]') + .setData(this.email) + .fetch() + .then((rs) => { + rs.getActivity('SendEmails', true) + if (rs.isValid('SendEmails')) { + this.email = {} + this.$toast.add({severity:'success', summary: 'Email Sent ', detail:'Email Sent Successfully', life: 3000}) + } else { + rs.showErrorToast('SendEmails') + } + }) + } + } +} +</script> \ No newline at end of file diff --git a/app/src/views/sendStaticMessages.vue b/app/src/views/sendStaticMessages.vue new file mode 100644 index 0000000000000000000000000000000000000000..244360a9ca378b2bd093fc4baab522e3fa441778 --- /dev/null +++ b/app/src/views/sendStaticMessages.vue @@ -0,0 +1,66 @@ +<template> +<div class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Static Messages + </h2> + <div class="row justify-content-center"> + <div class="col-auto"> + <div class="box-login"> + <div class="p-card p-component"> + <div class="field"> + <div class="p-float-label"> + <input type="text" v-model="msg.number" class="p-inputtext p-component" :class="msg.number ? 'p-filled' : ''" id="number"> + <label for="number">Enter mobile number</label> + </div> + <div class="mt-1"> + <small><b>{{ text }}</b></small> + </div> + <div class="mt-1"> + <small><b>{{ alert }}</b></small> + </div> + </div> + <div class="btn-wrapper"> + <button class="btn btn-submit" @click.prevent="mysms"> + <i class="isax isax-bold-sms"></i> + Send + </button> + </div> + </div> + </div> + </div> + </div> +</div> +</template> + +<script> +import MQL from '@/plugins/mql.js' +export default { + data () { + return { + number: null, + text: null, + alert: null, + msg: {} + } + }, + + methods: { + mysms () { + new MQL() + .setActivity('o.[MySMSTestActivity]') + .setData(this.msg) + .fetch() + .then((rs) => { + rs.getActivity('MySMSTestActivity', true) + if (rs.isValid('MySMSTestActivity')) { + this.sms = {} + this.$toast.add({severity:'success', summary: 'SMS Sent ', detail:'SMS Sent Successfully', life: 3000}) + } else { + rs.showErrorToast('MySMSTestActivity') + } + }) + } + } +} +</script> \ No newline at end of file diff --git a/app/src/views/sms.vue b/app/src/views/sms.vue new file mode 100644 index 0000000000000000000000000000000000000000..3c9ff9319568a5a74feec994469bd04121941da4 --- /dev/null +++ b/app/src/views/sms.vue @@ -0,0 +1,70 @@ +<template> +<div class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + SMS + </h2> + <div class="row justify-content-center"> + <div class="col-6"> + <div class="box-login clickable" @click.prevent="staticPage"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-sms"></i> + </div> + <div class="bx-login-name"> + Send Static Message Example + </div> + </div> + </div> + </div> + <div class="col-6"> + <div class="box-login clickable" @click.prevent="dynamicPage"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-sms"></i> + </div> + <div class="bx-login-name"> + Send Dynamic Message Example + </div> + </div> + </div> + </div> + </div> +</div> +</template> + +<script> +import MQL from '@/plugins/mql.js' +export default { + data () { + return { + sms: {} + } + }, + + methods: { + staticPage () { + this.$router.push('/sendStaticMessages') + }, + dynamicPage () { + this.$router.push('/sendDynamicMessages') + }, + + sendsms () { + new MQL() + .setActivity('o.[SendSMS]') + .setData(this.sms) + .fetch() + .then((rs) => { + rs.getActivity('SendSMS', true) + if (rs.isValid('SendSMS')) { + this.sms = {} + this.$toast.add({severity:'success', summary: 'SMS Sent ', detail:'SMS sent successfully', life: 3000}) + } else { + rs.showErrorToast('SendSMS') + } + }) + } + } +} +</script> \ No newline at end of file diff --git a/app/src/views/tailwindForm.vue b/app/src/views/tailwindForm.vue new file mode 100644 index 0000000000000000000000000000000000000000..3cf9e96f82c549270c9aa678170109f7198ca8d9 --- /dev/null +++ b/app/src/views/tailwindForm.vue @@ -0,0 +1,178 @@ +<template> + <div> + + + + +<h1>Table 1</h1> + +<div class="relative overflow-x-auto"> + <table class="w-full text-sm text-left text-gray-500 dark:text-gray-400"> + <thead class="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-700 dark:text-gray-400"> + <tr> + <th scope="col" class="px-6 py-3"> + Product name + </th> + <th scope="col" class="px-6 py-3"> + Color + </th> + <th scope="col" class="px-6 py-3"> + Category + </th> + <th scope="col" class="px-6 py-3"> + Price + </th> + </tr> + </thead> + <tbody> + <tr class="bg-white border-b dark:bg-gray-800 dark:border-gray-700"> + <th scope="row" class="px-6 py-4 font-medium text-gray-900 whitespace-nowrap dark:text-white"> + Apple MacBook Pro 17" + </th> + <td class="px-6 py-4"> + Silver + </td> + <td class="px-6 py-4"> + Laptop + </td> + <td class="px-6 py-4"> + $2999 + </td> + </tr> + <tr class="bg-white border-b dark:bg-gray-800 dark:border-gray-700"> + <th scope="row" class="px-6 py-4 font-medium text-gray-900 whitespace-nowrap dark:text-white"> + Microsoft Surface Pro + </th> + <td class="px-6 py-4"> + White + </td> + <td class="px-6 py-4"> + Laptop PC + </td> + <td class="px-6 py-4"> + $1999 + </td> + </tr> + <tr class="bg-white dark:bg-gray-800"> + <th scope="row" class="px-6 py-4 font-medium text-gray-900 whitespace-nowrap dark:text-white"> + Magic Mouse 2 + </th> + <td class="px-6 py-4"> + Black + </td> + <td class="px-6 py-4"> + Accessories + </td> + <td class="px-6 py-4"> + $99 + </td> + </tr> + </tbody> + </table> +</div> + + + +<H1>Table 2</H1> + <div class="relative overflow-x-auto shadow-md sm:rounded-lg"> + <table class="w-full text-sm text-left text-gray-500 dark:text-gray-400"> + <thead class="text-xs text-gray-700 uppercase dark:text-gray-400"> + <tr> + <th scope="col" class="px-6 py-3 bg-gray-50 dark:bg-gray-800"> + Product name + </th> + <th scope="col" class="px-6 py-3"> + Color + </th> + <th scope="col" class="px-6 py-3 bg-gray-50 dark:bg-gray-800"> + Category + </th> + <th scope="col" class="px-6 py-3"> + Price + </th> + </tr> + </thead> + <tbody> + <tr class="border-b border-gray-200 dark:border-gray-700"> + <th scope="row" class="px-6 py-4 font-medium text-gray-900 whitespace-nowrap bg-gray-50 dark:text-white dark:bg-gray-800"> + Apple MacBook Pro 17" + </th> + <td class="px-6 py-4"> + Silver + </td> + <td class="px-6 py-4 bg-gray-50 dark:bg-gray-800"> + Laptop + </td> + <td class="px-6 py-4"> + $2999 + </td> + </tr> + <tr class="border-b border-gray-200 dark:border-gray-700"> + <th scope="row" class="px-6 py-4 font-medium text-gray-900 whitespace-nowrap bg-gray-50 dark:text-white dark:bg-gray-800"> + Microsoft Surface Pro + </th> + <td class="px-6 py-4"> + White + </td> + <td class="px-6 py-4 bg-gray-50 dark:bg-gray-800"> + Laptop PC + </td> + <td class="px-6 py-4"> + $1999 + </td> + </tr> + <tr class="border-b border-gray-200 dark:border-gray-700"> + <th scope="row" class="px-6 py-4 font-medium text-gray-900 whitespace-nowrap bg-gray-50 dark:text-white dark:bg-gray-800"> + Magic Mouse 2 + </th> + <td class="px-6 py-4"> + Black + </td> + <td class="px-6 py-4 bg-gray-50 dark:bg-gray-800"> + Accessories + </td> + <td class="px-6 py-4"> + $99 + </td> + </tr> + <tr class="border-b border-gray-200 dark:border-gray-700"> + <th scope="row" class="px-6 py-4 font-medium text-gray-900 whitespace-nowrap bg-gray-50 dark:text-white dark:bg-gray-800"> + Google Pixel Phone + </th> + <td class="px-6 py-4"> + Gray + </td> + <td class="px-6 py-4 bg-gray-50 dark:bg-gray-800"> + Phone + </td> + <td class="px-6 py-4"> + $799 + </td> + </tr> + <tr> + <th scope="row" class="px-6 py-4 font-medium text-gray-900 whitespace-nowrap bg-gray-50 dark:text-white dark:bg-gray-800"> + Apple Watch 5 + </th> + <td class="px-6 py-4"> + Red + </td> + <td class="px-6 py-4 bg-gray-50 dark:bg-gray-800"> + Wearables + </td> + <td class="px-6 py-4"> + $999 + </td> + </tr> + </tbody> + </table> +</div> + + + + +</div> + +</template> +<script> + +</script> \ No newline at end of file diff --git a/app/src/views/updateUserDataUsingBL.vue b/app/src/views/updateUserDataUsingBL.vue new file mode 100644 index 0000000000000000000000000000000000000000..afdcebb127fcda9811870f7a6f00534f8321c186 --- /dev/null +++ b/app/src/views/updateUserDataUsingBL.vue @@ -0,0 +1,83 @@ +<template> + <div id="updateUsingBl" class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Update Data using BL + </h2> + <div class="row justify-content-center"> + <div class="col-6"> + <div class="box-login clickable" @click.prevent="updateUserPush"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-refresh"></i> + </div> + <div class="bx-login-name"> + Update user data + </div> + </div> + </div> + </div> + <div class="col-6"> + <div class="box-login clickable" @click.prevent="updateDbSave"> + <div class="p-card p-component"> + <div class="icon-holder"> + <i class="isax isax-bold-document-download"></i> + </div> + <div class="bx-login-name"> + Updated and Save to Database + </div> + </div> + </div> + </div> + </div> + </div> +</template> +<script> +import MQL from '@/plugins/mql.js' +export default { + data () { + return { + obj: {}, + sobj: {}, + result: '' + } + }, + methods: { + updateUserPush () { + this.$router.push('/updateUser') + }, + updateDbSave () { + this.$router.push('/updateDbSave') + }, + updateObjectUsingBL () { + new MQL() + .setActivity('o.[UpdateObjectUsingBL]') + .setData(this.obj) + .fetch() + .then((rs) => { + let res = rs.getActivity('UpdateObjectUsingBL', true) + if (rs.isValid('UpdateObjectUsingBL')) { + alert('Data update success') + this.result = res.result + } else { + rs.showErrorToast('UpdateObjectUsingBL') + } + }) + }, + updateObjectUsingBLAndSave () { + new MQL() + .setActivity('o.[UpdateObjectUsingBLAndSave]') + .setData(this.sobj) + .fetch() + .then((rs) => { + rs.getActivity('UpdateObjectUsingBLAndSave', true) + if (rs.isValid('UpdateObjectUsingBLAndSave')) { + alert('Data update & save success') + } else { + rs.showErrorToast('UpdateObjectUsingBLAndSave') + } + }) + } + } +} +</script> \ No newline at end of file diff --git a/app/src/views/validateOTP.vue b/app/src/views/validateOTP.vue new file mode 100644 index 0000000000000000000000000000000000000000..1cd1a87544ae9dac258a710538fd157a81398217 --- /dev/null +++ b/app/src/views/validateOTP.vue @@ -0,0 +1,65 @@ +<template> + <div class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Verify OTP + </h2> + <div class="row justify-content-center"> + <div class="col-auto"> + <div class="box-login"> + <div class="p-card p-component"> + <div class="field"> + <div class="p-float-label"> + <input type="text" class="p-inputtext p-component" :class="otp.number ? 'p-filled' : ''" id="number" v-model="otp.number"> + <label for="number">Enter mobile number</label> + </div> + </div> + <div class="field"> + <div class="p-float-label"> + <input type="text" class="p-inputtext p-component" :class="otp.result ? 'p-filled' : ''" id="result" v-model="otp.result"> + <label for="result">Enter generated otp</label> + </div> + </div> + <div class="btn-wrapper"> + <button class="btn btn-submit" @click.prevent="validateOTP"> + <i class="isax isax-bold-message-edit"></i> + Verify + </button> + </div> + </div> + </div> + </div> + </div> +</div> +</template> + +<script> +import MQL from '@/plugins/mql.js' +export default { + data () { + return { + otp: {}, + result: '' + } + }, + + methods: { + validateOTP () { + new MQL() + .setActivity('o.[smsOTP]') + .setData(this.otp) + .fetch() + .then((rs) => { + let res = rs.getActivity('smsOTP', true) + if (rs.isValid('smsOTP')) { + this.otp = {} + this.result = res.result + this.$toast.add({severity:'success', summary: 'OTP ', detail:'OTP is verified', life: 3000}) + } else { + rs.showErrorToast('smsOTP') + } + }) + } + } +} +</script> \ No newline at end of file diff --git a/app/src/views/vueClipboard.vue b/app/src/views/vueClipboard.vue new file mode 100644 index 0000000000000000000000000000000000000000..5a5a752ec9745bfdab177acac04d3d7c9374a915 --- /dev/null +++ b/app/src/views/vueClipboard.vue @@ -0,0 +1,50 @@ +<template> + <div class="container-fluid"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Clipboard Demo + </h2> + <div class="row justify-content-center"> + <div class="col-auto"> + <div class="box-login"> + <div class="p-card p-component"> + <div class="field"> + <div > + <textarea class="p-inputtext p-component" v-model="content" rows="5" cols="90"/> + </div> + </div> + <div class="btn-wrapper"> + <button ref="container" class="btn btn-submit" @click="copyContent()" > + <i class="isax isax-bold-copy"></i> + Copy + </button> + + </div> + </div> + </div> + </div> + </div> + </div> + </template> + + <script> + export default { + data () { + return { + content: 'Computer programming is the process of telling a computer to do certain things by giving it instructions. These instructions are called programs. A person who writes instructions is a computer programmer. The instructions come in different languages; they are called programming languages.' + } + }, + + methods: { + copyContent () { + this.$copyText(this.content, undefined, (error, event) => { + if (error) { + this.$toast.add({ severity: 'error', summary: 'Text Copy', detail: 'Failed to copy text!', life: 3000 }) + } else { + this.$toast.add({ severity: 'success', summary: 'Text Copy', detail: 'Text copied successfully!', life: 3000 }) + } + }) + } + } + } + </script> \ No newline at end of file diff --git a/app/src/views/vueMetaExample.vue b/app/src/views/vueMetaExample.vue new file mode 100644 index 0000000000000000000000000000000000000000..7de11458b7a55fc5b666f4964fa0c41403c67f5f --- /dev/null +++ b/app/src/views/vueMetaExample.vue @@ -0,0 +1,67 @@ +<template> + <div class="container-fluid" id="vueMeta"> + <h2 class="title alt"> + <i class="isax isax-bold-arrow-left-2" @click="$router.go(-1)"></i> + Vue-Meta + </h2> + <div class="row justify-content-center"> + <div class="col-4"> + <div class="box-login"> + <div class="p-card p-component"> + <h3> + {{ response.name }} + </h3> + <p> + {{ response.description }} + </p> + </div> + </div> + </div> + </div> + </div> +</template> +<script> +import MQL from '@/plugins/mql.js' +export default { + name: 'Data', + metaInfo () { + return { + title: this.response.title, + meta: [ + { + vmid: 'description', + name: 'description', + content: this.response.description + } + ] + } + }, + data () { + return { + description: 'I am Data', + result: this.$route.params.title, + response: '' + } + }, + mounted () { + // sample activity present in playground project + if (this.result) { + let data = { + name: this.result + } + new MQL() + .setActivity('o.[GetClassRoomName]') + .setData(data) + .fetch() + .then(rs => { + let res = rs.getActivity('GetClassRoomName', true) + if (rs.isValid('GetClassRoomName')) { + this.response = res.result[0] + } else { + rs.showErrorToast('GetClassRoomName') + } + }) + } + } +} +</script> diff --git a/app/tailwind.config.js b/app/tailwind.config.js new file mode 100644 index 0000000000000000000000000000000000000000..c84709af256c637415e8b5b231fc51a254e45676 --- /dev/null +++ b/app/tailwind.config.js @@ -0,0 +1,12 @@ +/* @type {import('tailwindcss').Config} */ +export default { + content: ["./index.html", "./src/**/*.{vue,js,ts,jsx,tsx,html}"], + theme: { + extend: {}, + }, + plugins: [require("daisyui"),require('tailwind-scrollbar'), +], + daisyui: { + themes: ["light", "dark", "cupcake", "bumblebee", "emerald", "corporate", "synthwave", "retro", "cyberpunk", "valentine", "halloween", "garden", "forest", "aqua", "lofi", "pastel", "fantasy", "wireframe", "black", "luxury", "dracula", "cmyk", "autumn", "business", "acid", "lemonade", "night", "coffee", "winter"], + }, +}; diff --git a/app/tests/e2e/custom-assertions/elementCount.js b/app/tests/e2e/custom-assertions/elementCount.js new file mode 100644 index 0000000000000000000000000000000000000000..528830385897b187a62973455fa9580dad3b84eb --- /dev/null +++ b/app/tests/e2e/custom-assertions/elementCount.js @@ -0,0 +1,19 @@ +// A custom Nightwatch assertion. +// The assertion name is the filename. +// Example usage: +// +// browser.assert.elementCount(selector, count) +// +// For more information on custom assertions see: +// http://nightwatchjs.org/guide#writing-custom-assertions + +exports.assertion = function elementCount (selector, count) { + this.message = `Testing if element <${selector}> has count: ${count}` + this.expected = count + this.pass = val => val === count + this.value = res => res.value + function evaluator (_selector) { + return document.querySelectorAll(_selector).length + } + this.command = cb => this.api.execute(evaluator, [selector], cb) +} diff --git a/app/tests/e2e/specs/login.specs.js b/app/tests/e2e/specs/login.specs.js new file mode 100644 index 0000000000000000000000000000000000000000..24952eacc7a7208e288b3aeaebc893299f88d822 --- /dev/null +++ b/app/tests/e2e/specs/login.specs.js @@ -0,0 +1,18 @@ + +module.exports = { + 'Test For Login Success': function (client) { + client + .url(process.env.VUE_DEV_SERVER_URL) + .waitForElementVisible('#app', 5000) + .click('[name="loginlink"]') + .waitForElementVisible('input[name="email"]', 30000) + .waitForElementVisible('input[name="password"]', 30000) + .assert.visible('input[name="email"]') + .assert.visible('input[name="password"]') + .setValue('input[name="email"]', 'test') + .setValue('input[name="password"]', 'test') + .click('button[name="btnlogin"]') + .pause(5000) + .end() + } +} diff --git a/app/tests/e2e/specs/test.js b/app/tests/e2e/specs/test.js new file mode 100644 index 0000000000000000000000000000000000000000..123740719fea6d14da700f5398ba4f038d1a7ab1 --- /dev/null +++ b/app/tests/e2e/specs/test.js @@ -0,0 +1,14 @@ +// For authoring Nightwatch tests, see +// http://nightwatchjs.org/guide#usage + +module.exports = { + 'default e2e tests': browser => { + browser + .url(process.env.VUE_DEV_SERVER_URL) + .waitForElementVisible('#app', 5000) + .assert.elementPresent('.hello') + .assert.containsText('h1', 'Welcome to Golang Full Stack Vue App') + .assert.elementCount('img', 1) + .end() + } +} diff --git a/app/tests/unit/.eslintrc.js b/app/tests/unit/.eslintrc.js new file mode 100644 index 0000000000000000000000000000000000000000..4e51c63f4ec969a7230037ce517cba59bc7565b7 --- /dev/null +++ b/app/tests/unit/.eslintrc.js @@ -0,0 +1,8 @@ +module.exports = { + env: { + jest: true + }, + rules: { + 'import/no-extraneous-dependencies': 'off' + } +} \ No newline at end of file diff --git a/app/tests/unit/HelloWorld.spec.js b/app/tests/unit/HelloWorld.spec.js new file mode 100644 index 0000000000000000000000000000000000000000..f84fb39dce9c0ed294ee896a8ab8fd97332b221b --- /dev/null +++ b/app/tests/unit/HelloWorld.spec.js @@ -0,0 +1,12 @@ +import { shallowMount } from '@vue/test-utils' +import HelloWorld from '@/components/HelloWorld.vue' + +describe('HelloWorld.vue', () => { + it('renders props.msg when passed', () => { + const msg = 'new message' + const wrapper = shallowMount(HelloWorld, { + propsData: { msg } + }) + expect(wrapper.text()).toMatch(msg) + }) +}) diff --git a/app/tests/unit/login.spec.js b/app/tests/unit/login.spec.js new file mode 100644 index 0000000000000000000000000000000000000000..4cc755295d2efc96cdada87dc5df87b51418330a --- /dev/null +++ b/app/tests/unit/login.spec.js @@ -0,0 +1,37 @@ +import Vue from 'vue' +import Vuex from 'vuex' +import { shallowMount } from '@vue/test-utils' +import Login from '@/views/Login.vue' + +Vue.use(Vuex) + +describe('Login', () => { + let store + let actions + let state + + beforeEach(() => { + state = { data: {} } + actions = { + AUTH_REQUEST: jest.fn() + } + + store = new Vuex.Store({ + state, + actions + }) + }) + + it('Test for Login form data entry', () => { + const wrapper = shallowMount(Login, { + store + }) + + wrapper.vm.username = 'Test' + wrapper.vm.password = 'Test' + + wrapper.find('button').trigger('click') + + expect(actions.AUTH_REQUEST.mock.calls).toHaveLength(1) + }) +}) diff --git a/app/vite.config.js b/app/vite.config.js new file mode 100644 index 0000000000000000000000000000000000000000..429fc521ac4243aada3ab3831511f5161dc5d9fa --- /dev/null +++ b/app/vite.config.js @@ -0,0 +1,66 @@ +import { defineConfig } from "vite"; +import vue from "@vitejs/plugin-vue"; +import vitePluginCompression from "vite-plugin-compression"; +import VueDevTools from 'vite-plugin-vue-devtools' +import path from "path"; + +// https://vitejs.dev/config/ +export default defineConfig({ + publicDir: process.env.NODE_ENV === "production" ? "/app/" : "", + base: process.env.NODE_ENV === "production" ? "/app/" : "", + + resolve: { + alias: { + "@": path.resolve(__dirname, "src"), + }, + }, + chainWebpack: (config) => { + config.plugins.delete("prefetch"); + }, + pluginOptions: { + webpackBundleAnalyzer: { + analyzerMode: "disabled", + }, + }, + plugins: [vue(), vitePluginCompression(),VueDevTools()], + build: { + minify: "terser", + terserOptions: { + ecma: undefined, + warnings: false, + parse: {}, + compress: {}, + mangle: true, + module: false, + output: { + comments: false, + }, + toplevel: false, + nameCache: null, + ie8: false, + keep_classnames: undefined, + keep_fnames: false, + safari10: false, + }, + sourcemap: true, + }, + server: { + port: 8080, + proxy: { + "/server": { + target: "https://cs.mkcl.org/1JFfwe3g8vHuNOtxk2BsH09pBA5", + ws: true, + secure: false, + changeOrigin: true, + rewrite: (p) => p.replace(/^\/server/, ""), + }, + "/cdnserver": { + target: "https://testcdncs.mkcl.org", + ws: true, + secure: false, + changeOrigin: true, + rewrite: (p) => p.replace(/^\/cdnserver/, ""), + }, + }, + }, +});