From 8a6e300c476479dc4eca67bae28aae621b1a224d Mon Sep 17 00:00:00 2001 From: Thomas Mack Date: Mon, 28 Mar 2022 08:31:59 +0200 Subject: [PATCH] Running Version with indexDB --- package-lock.json | 206 ++++++++++++++++++--- package.json | 7 +- src/components/TheNavbar.vue | 51 +++++ src/components/auth/AuthRedirect.vue | 35 ++++ src/components/auth/LoginUser.vue | 139 +++++++++++++- src/components/auth/RegisterUser.vue | 137 +++++++++++++- src/components/camera/CameraEditDetail.vue | 124 +++++++++++++ src/components/camera/CameraList.vue | 40 ++-- src/components/camera/CameraListItem.vue | 34 +++- src/components/camera/CameraReadDetail.vue | 72 +++++++ src/indexdDB/index.ts | 154 +++++++++++++++ src/layouts/TheCameraLayout.vue | 61 ++++++ src/main.js | 44 ++++- src/main.ts | 96 +++++++++- src/pages/HomePage.vue | 5 +- src/pages/ReadListPage.vue | 57 +++--- src/router/index.ts | 23 ++- src/routes/app-routes.ts | 34 +++- src/seed.js | 31 ++++ src/seed.ts | 63 ++++++- src/store/modules/auth/index.ts | 54 +++++- src/store/modules/camera/index.ts | 127 ++++++++++--- tsconfig.json | 5 +- 23 files changed, 1461 insertions(+), 138 deletions(-) create mode 100644 src/components/TheNavbar.vue create mode 100644 src/components/auth/AuthRedirect.vue create mode 100644 src/components/camera/CameraEditDetail.vue create mode 100644 src/components/camera/CameraReadDetail.vue create mode 100644 src/indexdDB/index.ts diff --git a/package-lock.json b/package-lock.json index 783ed41..e67e0af 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,19 +5,23 @@ "requires": true, "packages": { "": { - "name": "billibox-vue", "version": "0.1.0", "dependencies": { + "@dsb-norge/vue-keycloak-js": "*", "@fortawesome/fontawesome-pro": "^6.1.1", "animate.css": "^4.1.1", "bootstrap": "^5.1.3", "core-js": "^3.8.3", "fs": "^0.0.1-security", "keycloak-js": "^17.0.1", + "uuid": "^8.3.2", + "vee-validate": "^4.5.10", "vue": "^3.2.13", "vue-class-component": "^8.0.0-0", "vue-router": "^4.0.14", - "vuex": "^4.0.2" + "vue-validate": "^1.0.1", + "vuex": "^4.0.2", + "yup": "^0.32.11" }, "devDependencies": { "@babel/core": "^7.12.16", @@ -1642,7 +1646,6 @@ "version": "7.17.8", "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.17.8.tgz", "integrity": "sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==", - "dev": true, "dependencies": { "regenerator-runtime": "^0.13.4" }, @@ -1698,6 +1701,31 @@ "node": ">=6.9.0" } }, + "node_modules/@dsb-norge/vue-keycloak-js": { + "version": "2.1.3-beta", + "resolved": "https://registry.npmjs.org/@dsb-norge/vue-keycloak-js/-/vue-keycloak-js-2.1.3-beta.tgz", + "integrity": "sha512-RXnX/qwuUzNblxgQ8maxIKofhyQndpcIm8+egKonzSiTMAMUhyV8poSBoGEA3RCgcaxwOZhEw6rF0F39fc4BAg==", + "dependencies": { + "keycloak-js": "^15.0.2" + }, + "peerDependencies": { + "vue": "^2.6.0 || >=3.0.0-rc.0" + } + }, + "node_modules/@dsb-norge/vue-keycloak-js/node_modules/base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "node_modules/@dsb-norge/vue-keycloak-js/node_modules/keycloak-js": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/keycloak-js/-/keycloak-js-15.1.1.tgz", + "integrity": "sha512-PPu70WfSI2CWX7GoF5AQ4HkqYJLTAOV/25wDG//9S5SUOhqIDxKjAv6P54hy8nKt2+rIZF2kqpv7FNEmBN2W4g==", + "dependencies": { + "base64-js": "1.3.1", + "js-sha256": "0.9.0" + } + }, "node_modules/@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -2095,6 +2123,11 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, + "node_modules/@types/lodash": { + "version": "4.14.180", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.180.tgz", + "integrity": "sha512-XOKXa1KIxtNXgASAnwj7cnttJxS4fksBRywK/9LzRV5YxrF80BXZIGeQSuoESQ/VkUj30Ae0+YcuHc15wJCB2g==" + }, "node_modules/@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmmirror.com/@types/mime/-/mime-1.3.2.tgz", @@ -3430,6 +3463,8 @@ "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.11.0.tgz", "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -3441,7 +3476,9 @@ "version": "1.0.0", "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/ajv-keywords": { "version": "3.5.2", @@ -7302,8 +7339,12 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, "node_modules/lodash.debounce": { "version": "4.0.8", @@ -7876,6 +7917,11 @@ "thenify-all": "^1.0.0" } }, + "node_modules/nanoclone": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz", + "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==" + }, "node_modules/nanoid": { "version": "3.3.1", "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.1.tgz", @@ -9079,6 +9125,11 @@ "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" } }, + "node_modules/property-expr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz", + "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==" + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -9268,8 +9319,7 @@ "node_modules/regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "node_modules/regenerator-transform": { "version": "0.14.5", @@ -10316,6 +10366,11 @@ "node": ">=0.6" } }, + "node_modules/toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=" + }, "node_modules/totalist": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/totalist/-/totalist-1.1.0.tgz", @@ -10595,7 +10650,6 @@ "version": "8.3.2", "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, "bin": { "uuid": "dist/bin/uuid" } @@ -10625,6 +10679,17 @@ "node": ">= 0.8" } }, + "node_modules/vee-validate": { + "version": "4.5.10", + "resolved": "https://registry.npmjs.org/vee-validate/-/vee-validate-4.5.10.tgz", + "integrity": "sha512-7dZE0PZTNY3Ztp6Gz8iw+QS7Fz59vU1qkD0rBJkldkf9Faw2lFjWgE0tiCist5RQkLgt7/HaVbojzb/SCdutfA==", + "dependencies": { + "@vue/devtools-api": "^6.0.0-beta.15" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, "node_modules/vue": { "version": "3.2.31", "resolved": "https://registry.npmmirror.com/vue/-/vue-3.2.31.tgz", @@ -10860,6 +10925,11 @@ "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", "dev": true }, + "node_modules/vue-validate": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vue-validate/-/vue-validate-1.0.1.tgz", + "integrity": "sha1-M7YT7lmM2y8uNbQ9f59HxYbbILc=" + }, "node_modules/vuex": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/vuex/-/vuex-4.0.2.tgz", @@ -11571,6 +11641,23 @@ "resolved": "https://registry.npmmirror.com/yallist/-/yallist-2.1.2.tgz", "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", "dev": true + }, + "node_modules/yup": { + "version": "0.32.11", + "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz", + "integrity": "sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==", + "dependencies": { + "@babel/runtime": "^7.15.4", + "@types/lodash": "^4.14.175", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "nanoclone": "^0.2.1", + "property-expr": "^2.0.4", + "toposort": "^2.0.2" + }, + "engines": { + "node": ">=10" + } } }, "dependencies": { @@ -12686,7 +12773,6 @@ "version": "7.17.8", "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.17.8.tgz", "integrity": "sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==", - "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } @@ -12730,6 +12816,30 @@ "to-fast-properties": "^2.0.0" } }, + "@dsb-norge/vue-keycloak-js": { + "version": "2.1.3-beta", + "resolved": "https://registry.npmjs.org/@dsb-norge/vue-keycloak-js/-/vue-keycloak-js-2.1.3-beta.tgz", + "integrity": "sha512-RXnX/qwuUzNblxgQ8maxIKofhyQndpcIm8+egKonzSiTMAMUhyV8poSBoGEA3RCgcaxwOZhEw6rF0F39fc4BAg==", + "requires": { + "keycloak-js": "^15.0.2" + }, + "dependencies": { + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "keycloak-js": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/keycloak-js/-/keycloak-js-15.1.1.tgz", + "integrity": "sha512-PPu70WfSI2CWX7GoF5AQ4HkqYJLTAOV/25wDG//9S5SUOhqIDxKjAv6P54hy8nKt2+rIZF2kqpv7FNEmBN2W4g==", + "requires": { + "base64-js": "1.3.1", + "js-sha256": "0.9.0" + } + } + } + }, "@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -13074,6 +13184,11 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, + "@types/lodash": { + "version": "4.14.180", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.180.tgz", + "integrity": "sha512-XOKXa1KIxtNXgASAnwj7cnttJxS4fksBRywK/9LzRV5YxrF80BXZIGeQSuoESQ/VkUj30Ae0+YcuHc15wJCB2g==" + }, "@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmmirror.com/@types/mime/-/mime-1.3.2.tgz", @@ -13358,7 +13473,6 @@ "integrity": "sha512-vf4KqrmuOSnoEYGUiHPeMoxhh6wpiucLWXISn7xYFU80pK1lqcuhbl6tpurAanUIyRO/ENDUQBH7RAdbLNq1bA==", "dev": true, "requires": { - "@babel/core": "^7.12.16", "@babel/helper-compilation-targets": "^7.12.16", "@babel/helper-module-imports": "^7.12.13", "@babel/plugin-proposal-class-properties": "^7.12.13", @@ -13371,7 +13485,6 @@ "@vue/babel-plugin-jsx": "^1.0.3", "@vue/babel-preset-jsx": "^1.1.2", "babel-plugin-dynamic-import-node": "^2.3.3", - "core-js": "^3.8.3", "core-js-compat": "^3.8.3", "semver": "^7.3.4" }, @@ -14140,15 +14253,14 @@ "resolved": "https://registry.npmmirror.com/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, - "requires": { - "ajv": "^8.0.0" - }, + "requires": {}, "dependencies": { "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.11.0.tgz", + "version": "https://registry.npmmirror.com/ajv/-/ajv-8.11.0.tgz", "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, + "optional": true, + "peer": true, "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -14160,7 +14272,9 @@ "version": "1.0.0", "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "optional": true, + "peer": true } } }, @@ -17229,8 +17343,12 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, "lodash.debounce": { "version": "4.0.8", @@ -17697,6 +17815,11 @@ "thenify-all": "^1.0.0" } }, + "nanoclone": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz", + "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==" + }, "nanoid": { "version": "3.3.1", "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.1.tgz", @@ -18562,6 +18685,11 @@ "log-update": "^2.1.0" } }, + "property-expr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz", + "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==" + }, "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -18718,8 +18846,7 @@ "regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "regenerator-transform": { "version": "0.14.5", @@ -19583,6 +19710,11 @@ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true }, + "toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=" + }, "totalist": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/totalist/-/totalist-1.1.0.tgz", @@ -19791,8 +19923,7 @@ "uuid": { "version": "8.3.2", "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "v8-compile-cache": { "version": "2.3.0", @@ -19816,6 +19947,14 @@ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true }, + "vee-validate": { + "version": "4.5.10", + "resolved": "https://registry.npmjs.org/vee-validate/-/vee-validate-4.5.10.tgz", + "integrity": "sha512-7dZE0PZTNY3Ztp6Gz8iw+QS7Fz59vU1qkD0rBJkldkf9Faw2lFjWgE0tiCist5RQkLgt7/HaVbojzb/SCdutfA==", + "requires": { + "@vue/devtools-api": "^6.0.0-beta.15" + } + }, "vue": { "version": "3.2.31", "resolved": "https://registry.npmmirror.com/vue/-/vue-3.2.31.tgz", @@ -20004,6 +20143,11 @@ "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", "dev": true }, + "vue-validate": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vue-validate/-/vue-validate-1.0.1.tgz", + "integrity": "sha1-M7YT7lmM2y8uNbQ9f59HxYbbILc=" + }, "vuex": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/vuex/-/vuex-4.0.2.tgz", @@ -20562,6 +20706,20 @@ "dev": true } } + }, + "yup": { + "version": "0.32.11", + "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz", + "integrity": "sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==", + "requires": { + "@babel/runtime": "^7.15.4", + "@types/lodash": "^4.14.175", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "nanoclone": "^0.2.1", + "property-expr": "^2.0.4", + "toposort": "^2.0.2" + } } } } diff --git a/package.json b/package.json index e2149f5..02e6bce 100644 --- a/package.json +++ b/package.json @@ -8,16 +8,21 @@ "lint": "vue-cli-service lint" }, "dependencies": { + "@dsb-norge/vue-keycloak-js": "*", "@fortawesome/fontawesome-pro": "^6.1.1", "animate.css": "^4.1.1", "bootstrap": "^5.1.3", "core-js": "^3.8.3", "fs": "^0.0.1-security", "keycloak-js": "^17.0.1", + "uuid": "^8.3.2", + "vee-validate": "^4.5.10", "vue": "^3.2.13", "vue-class-component": "^8.0.0-0", "vue-router": "^4.0.14", - "vuex": "^4.0.2" + "vue-validate": "^1.0.1", + "vuex": "^4.0.2", + "yup": "^0.32.11" }, "devDependencies": { "@babel/core": "^7.12.16", diff --git a/src/components/TheNavbar.vue b/src/components/TheNavbar.vue new file mode 100644 index 0000000..92f38d9 --- /dev/null +++ b/src/components/TheNavbar.vue @@ -0,0 +1,51 @@ + + + + + + \ No newline at end of file diff --git a/src/components/auth/AuthRedirect.vue b/src/components/auth/AuthRedirect.vue new file mode 100644 index 0000000..b56fb30 --- /dev/null +++ b/src/components/auth/AuthRedirect.vue @@ -0,0 +1,35 @@ + + + + + \ No newline at end of file diff --git a/src/components/auth/LoginUser.vue b/src/components/auth/LoginUser.vue index 34bfbf1..6b67eb7 100644 --- a/src/components/auth/LoginUser.vue +++ b/src/components/auth/LoginUser.vue @@ -1,13 +1,146 @@ \ No newline at end of file + + + diff --git a/src/components/auth/RegisterUser.vue b/src/components/auth/RegisterUser.vue index bd98f7e..bc93ca2 100644 --- a/src/components/auth/RegisterUser.vue +++ b/src/components/auth/RegisterUser.vue @@ -1,10 +1,143 @@ diff --git a/src/components/camera/CameraEditDetail.vue b/src/components/camera/CameraEditDetail.vue new file mode 100644 index 0000000..268b674 --- /dev/null +++ b/src/components/camera/CameraEditDetail.vue @@ -0,0 +1,124 @@ + + + + + \ No newline at end of file diff --git a/src/components/camera/CameraList.vue b/src/components/camera/CameraList.vue index e5458c6..3a7a163 100644 --- a/src/components/camera/CameraList.vue +++ b/src/components/camera/CameraList.vue @@ -1,27 +1,26 @@ diff --git a/src/components/camera/CameraListItem.vue b/src/components/camera/CameraListItem.vue index 3033fd2..f1f68a3 100644 --- a/src/components/camera/CameraListItem.vue +++ b/src/components/camera/CameraListItem.vue @@ -1,13 +1,29 @@ + + \ No newline at end of file diff --git a/src/indexdDB/index.ts b/src/indexdDB/index.ts new file mode 100644 index 0000000..1d3f42f --- /dev/null +++ b/src/indexdDB/index.ts @@ -0,0 +1,154 @@ + + +export default class BilliDB { + private DB_VERSION: number; + private DB_NAME: string; + constructor(dbName:string, dbVersion:number) { + this.DB_NAME = dbName; + this.DB_VERSION = dbVersion; + } + + + + async getDb():Promise { + return new Promise((resolve, reject) => { + + const request = window.indexedDB.open(this.DB_NAME, this.DB_VERSION); + + request.onerror = e => { + console.log("Error opening db", e); + reject("Error"); + } + + request.onsuccess =e => { + + console.log("connect erfolgreich"); + // @ts-ignore + resolve(e.target.result) + } + request.onupgradeneeded = e => { + console.log("onupgradeneeded"); + // @ts-ignore + const db = e.target.result; + db.createObjectStore("cameras", {autoIncrement: false, keyPath: 'id'}); + db.createObjectStore("brands", {autoIncrement: false, keyPath: 'schluessel'}); + db.createObjectStore("conditions", {autoIncrement: false, keyPath: 'schluessel'}); + db.createObjectStore("buildtypes", {autoIncrement: false, keyPath: 'schluessel'}); + } + }) + } + + async saveItem(item, storeId:string) { + const db = await this.getDb(); + + return new Promise((resolve, reject) => { + console.log("Starting Add Transaction"); + + // @ts-ignore + const trans = db.transaction([storeId], 'readwrite'); + + trans.oncomplete = (e) => { + resolve(e); + }; + + trans.onerror = (e) => { + console.log("on Error", e) + reject(e); + }; + const store = trans.objectStore(storeId); + + store.add(item); + + store.onerror = (e) => { + console.log("Error on Store", e) + } + store.oncomplete = (e) => { + console.log("oncomplete on Store", e) + } + store.onsuccess = (e) => { + console.log("onsuccess on Store", e) + } + }) + } + async saveItems(items, storeId:string) { + const db = await this.getDb(); + + return new Promise((resolve, reject) => { + console.log("Starting Add Transaction"); + + // @ts-ignore + const trans = db.transaction([storeId], 'readwrite'); + + trans.oncomplete = (e) => { + resolve(e); + }; + + trans.onerror = (e) => { + console.log("on Error", e) + reject(e); + }; + const store = trans.objectStore(storeId); + + items.forEach((item) => { + store.add(item); + }) + + store.onerror = (e) => { + console.log("Error on Store", e) + } + store.oncomplete = (e) => { + console.log("oncomplete on Store", e) + } + store.onsuccess = (e) => { + console.log("onsuccess on Store", e) + } + }) + } + async getItems(storeId:string) { + console.log("DB-getItems", storeId) + const db = await this.getDb(); + + return new Promise((resolve, reject) => { + console.log("DB-getItems: Starting Get Transaction"); + const items = []; + // @ts-ignore + const trans = db.transaction([storeId], 'readonly'); + + trans.oncomplete = (e) => { + resolve(items); + }; + + trans.onerror = (e) => { + console.log("on Error", e) + reject(e); + }; + const store = trans.objectStore(storeId); + console.log("--> We have try to get a cursor"); + + store.openCursor().onsuccess = (e) => { + console.log("--> We have a cursor", e.target.result); + const cursor = e.target.result; + if(cursor) { + + items.push(cursor.value); + cursor.continue(); + } + console.log("onsuccess on getAll", items) + // resolve(e.target.result); + } + + + store.onerror = (e) => { + console.log("Error on getAll", e) + } + store.oncomplete = (e) => { + console.log("oncomplete on getAll", e) + } + }) + } + +} + + + + diff --git a/src/layouts/TheCameraLayout.vue b/src/layouts/TheCameraLayout.vue index e69de29..ceda3eb 100644 --- a/src/layouts/TheCameraLayout.vue +++ b/src/layouts/TheCameraLayout.vue @@ -0,0 +1,61 @@ + + + + + \ No newline at end of file diff --git a/src/main.js b/src/main.js index 89480a7..fdc0f5b 100644 --- a/src/main.js +++ b/src/main.js @@ -1,9 +1,37 @@ -import { createApp } from 'vue'; +import Vue from 'vue'; import App from './App.vue'; -import store from './store'; -import router from './router'; -createApp(App) - .use(store) - .use(router) - .mount('#app'); -//# sourceMappingURL=main.js.map \ No newline at end of file +import Keycloak from "keycloak-js"; +const initOptions = { + url: 'http://auth.toking.de/', realm: 'toking', clientId: 'billibox', onLoad: 'login-required', + redirectUri: 'http://127.0.0.1:8080/' +}; +//const app = createApp(App); +const keycloak = Keycloak(initOptions); +keycloak.init({ onLoad: initOptions.onLoad }).then((auth) => { + if (!auth) { + window.location.reload(); + } + else { + Vue.$log.info("Authenticated"); + new Vue({ + el: '#app', + render: h => h(App, { props: { keycloak: keycloak } }) + }); + } + //Token Refresh + setInterval(() => { + keycloak.updateToken(70).then((refreshed) => { + if (refreshed) { + Vue.$log.info('Token refreshed' + refreshed); + } + else { + Vue.$log.warn('Token not refreshed, valid for ' + + Math.round(keycloak.tokenParsed.exp + keycloak.timeSkew - new Date().getTime() / 1000) + ' seconds'); + } + }).catch(() => { + Vue.$log.error('Failed to refresh token'); + }); + }, 6000); +}).catch(() => { + Vue.$log.error("Authenticated Failed"); +}); diff --git a/src/main.ts b/src/main.ts index f7a5a08..5b04656 100644 --- a/src/main.ts +++ b/src/main.ts @@ -2,9 +2,97 @@ import { createApp } from 'vue' import App from './App.vue' import store from './store'; import router from './router' +import VueKeyCloak from '@dsb-norge/vue-keycloak-js' +import { KeycloakInstance } from "keycloak-js"; +import { VueKeycloakInstance } from "@dsb-norge/vue-keycloak-js/dist/types"; + +const app = +createApp(App); -createApp(App) - .use(store) - .use(router) - .mount('#app') + +app.use(store) +app.use(router) +app.use(VueKeyCloak, { + config: { + url: 'https://auth.toking.de/', + realm: 'toking', + clientId: 'billibox', + redirectUri: 'http://127.0.0.1:8080/', + onLoad: 'login-required', + enableLogging: true, + scope: 'open-id' + }, + init: { + onLoad: 'login-required' + }, + onReady (keycloak: KeycloakInstance) { + store.dispatch("storeKeycloak", keycloak).then( (res) => { + + keycloak.loadUserProfile().then( (res) => { + store.dispatch("storeUserProfile", res); + console.log("res", res); + }); + + } + ) + } + }) + +app.mount('#app') + + +declare module '@vue/runtime-core' { + interface ComponentCustomProperties { + $keycloak: VueKeycloakInstance + } +} + +// import Vue from 'vue'; +// import App from './App.vue'; +// import Keycloak from "keycloak-js"; +// const initOptions = { +// url: 'https://auth.toking.de/', realm: 'toking', clientId: 'billibox', onLoad: 'login-required', +// redirectUri: 'http://127.0.0.1:8080/' +// }; +// //const app = createApp(App); +// const keycloak = Keycloak(initOptions); +// keycloak.init({ onLoad: 'login-required', redirectUri: 'http://127.0.0.1:8080/' }).then((auth) => { +// if (!auth) { +// window.location.reload(); +// } +// else { +// // @ts-ignore +// console.info("Authenticated", auth); +// // @ts-ignore +// +// new Vue({ +// el: '#app', +// render: h => h(App, { props: { keycloak: keycloak } }) +// }); +// } +// //Token Refresh +// // setInterval(() => { +// // keycloak.updateToken(70).then((refreshed) => { +// // if (refreshed) { +// // // @ts-ignore +// // +// // console.info('Token refreshed' + refreshed); +// // } +// // else { +// // // @ts-ignore +// // +// // console.warn('Token not refreshed, valid for ' +// // + Math.round(keycloak.tokenParsed.exp + keycloak.timeSkew - new Date().getTime() / 1000) + ' seconds'); +// // } +// // }).catch(() => { +// // // @ts-ignore +// // +// // console.error('Failed to refresh token'); +// // }); +// // }, 6000); +// }).catch(() => { +// // @ts-ignore +// +// console.error("Authenticated Failed"); +// }); diff --git a/src/pages/HomePage.vue b/src/pages/HomePage.vue index 116f78e..344f3c9 100644 --- a/src/pages/HomePage.vue +++ b/src/pages/HomePage.vue @@ -1,4 +1,5 @@