diff --git a/package-lock.json b/package-lock.json index 1991c10..0ba11df 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2704,6 +2704,12 @@ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.3.1.tgz", "integrity": "sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag==" }, + "bootstrap-sass": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/bootstrap-sass/-/bootstrap-sass-3.4.1.tgz", + "integrity": "sha512-p5rxsK/IyEDQm2CwiHxxUi0MZZtvVFbhWmyMOt4lLkA4bujDA1TGoKT0i1FKIWiugAdP+kK8T5KMDFIKQCLYIA==", + "dev": true + }, "bootstrap-vue": { "version": "2.0.0-rc.13", "resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-2.0.0-rc.13.tgz", @@ -7545,6 +7551,11 @@ "topo": "3.x.x" } }, + "jquery": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz", + "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==" + }, "js-base64": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", @@ -9483,9 +9494,9 @@ "dev": true }, "popper.js": { - "version": "1.14.7", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.14.7.tgz", - "integrity": "sha512-4q1hNvoUre/8srWsH7hnoSJ5xVmIL4qgz+s4qf2TnJIMyZFUFMGH+9vE7mXynAlHSZ/NdTmmow86muD0myUkVQ==" + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.15.0.tgz", + "integrity": "sha512-w010cY1oCUmI+9KwwlWki+r5jxKfTFDVoadl7MSrIujHU5MJ5OR6HTDj6Xo8aoR/QsA56x8jKjA59qGH4ELtrA==" }, "portfinder": { "version": "1.0.20", diff --git a/package.json b/package.json index 4a26e88..ac835b7 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,11 @@ "dependencies": { "@vue/cli": "^3.4.1", "axios": "^0.18.0", + "bootstrap": "^4.3.1", "bootstrap-vue": "^2.0.0-rc.13", + "jquery": "^3.3.1", "js-cookie": "^2.2.0", + "popper.js": "^1.15.0", "vue": "^2.6.6", "vue-axios": "^2.1.4", "vue-class-component": "^6.0.0", @@ -34,8 +37,9 @@ "@vue/cli-plugin-unit-mocha": "^3.4.0", "@vue/cli-service": "^3.4.0", "@vue/test-utils": "^1.0.0-beta.20", + "bootstrap-sass": "^3.4.1", "chai": "^4.1.2", - "node-sass": "^4.9.0", + "node-sass": "^4.11.0", "sass-loader": "^7.1.0", "typescript": "^3.0.0", "vue-template-compiler": "^2.5.21" diff --git a/public/index.html b/public/index.html index 8abcdfc..2293587 100644 --- a/public/index.html +++ b/public/index.html @@ -5,7 +5,7 @@ - + diff --git a/src/App.vue b/src/App.vue index 983b936..c7d7fb0 100644 --- a/src/App.vue +++ b/src/App.vue @@ -4,21 +4,66 @@ Home | About | Login | - Profile + Profile | + +
+ + + +
| + ({{tokenValidity}}) | + ({{refreshTokenValidity}}) + + diff --git a/src/components/Group.vue b/src/components/Group.vue new file mode 100644 index 0000000..897fae6 --- /dev/null +++ b/src/components/Group.vue @@ -0,0 +1,59 @@ + + + + + + diff --git a/src/components/User.vue b/src/components/User.vue new file mode 100644 index 0000000..b360b80 --- /dev/null +++ b/src/components/User.vue @@ -0,0 +1,47 @@ + + + + + + diff --git a/src/main.ts b/src/main.ts index edee401..4395d13 100644 --- a/src/main.ts +++ b/src/main.ts @@ -12,6 +12,9 @@ import FlagIcon from 'vue-flag-icon'; // following is to avoid missing type definitions // const FlagIcon = require('vue-flag-icon'); +import 'bootstrap'; +import 'bootstrap/dist/css/bootstrap.min.css'; + const isProduction = process.env.NODE_ENV === 'production'; const options = { diff --git a/src/router.ts b/src/router.ts index 4504d04..1947b3d 100644 --- a/src/router.ts +++ b/src/router.ts @@ -6,7 +6,10 @@ import NotFound from './views/NotFound.vue'; import Survey from '@/components/Survey.vue'; import NewSurvey from '@/components/NewSurvey.vue'; import Login from '@/components/Login.vue'; +import Admin from '@/components/Admin.vue'; import Profile from '@/components/Profile.vue'; +import User from '@/components/User.vue'; +import Group from '@/components/Group.vue'; import store from '@/store'; Vue.use(Router); @@ -23,9 +26,26 @@ export const router = new Router({ }, { path: '/login', - name: 'Login', + name: 'login', component: Login, }, + { + path: '/admin', + name: 'admin', + component: Admin, + children: [ + { + name: 'admin.user', + path: 'user', + component: User, + }, + { + name: 'admin.group', + path: 'group', + component: Group, + }, + ], + }, { path: '/about', name: 'about', @@ -56,6 +76,7 @@ export const router = new Router({ if (!store.getters.isAuthenticated) { Vue.$log.debug('not authenticated!'); if (store.getters.isRefreshTokenValid) { + Vue.$log.debug('refresh token is still valid :)'); store.dispatch('refreshToken') .then(() => next()) .catch(() => next('/login')); diff --git a/src/scss/_base.scss b/src/scss/_base.scss new file mode 100644 index 0000000..97b7aa2 --- /dev/null +++ b/src/scss/_base.scss @@ -0,0 +1,7 @@ +/* + * Copyright (c) 2019. Tobias Kurze + */ + +.router-link-exact-active { + color: #42b983; +} diff --git a/vue.config.js b/vue.config.js index 049dc0a..943c17c 100644 --- a/vue.config.js +++ b/vue.config.js @@ -3,9 +3,10 @@ module.exports = { loaderOptions: { sass: { data: ` - @import "@/scss/_variables.scss"; - ` - } - } - } + @import "@/scss/_variables.scss"; + @import "@/scss/_base.scss"; + `, + }, + }, + }, };