Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

261 logout pop up #427

Merged
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
bd4d2b8
Add UserDetails
pniedzwiedzinski Feb 8, 2020
473a3e0
Add LogoutModal
pniedzwiedzinski Feb 8, 2020
6e1a0f2
Add routes
pniedzwiedzinski Feb 8, 2020
94a3635
Add modal to UserDetails
pniedzwiedzinski Feb 8, 2020
981d7e3
Add redirect after logout
pniedzwiedzinski Feb 8, 2020
33d3417
Fix lint errors
pniedzwiedzinski Feb 9, 2020
8b5ca0c
Open logout model if offline
pniedzwiedzinski Feb 9, 2020
4a71e28
Add translations
pniedzwiedzinski Feb 9, 2020
15aafc0
Fix router location
pniedzwiedzinski Feb 9, 2020
62f85ce
Move logout action to logout path
pniedzwiedzinski Feb 9, 2020
c38a35b
Logout on router push
pniedzwiedzinski Feb 9, 2020
c314343
Remove unnecessary logout progress
pniedzwiedzinski Feb 9, 2020
8486bd2
Add danger button
pniedzwiedzinski Feb 9, 2020
3676009
Fix lint errors
pniedzwiedzinski Feb 9, 2020
aa10413
Remove comment
pniedzwiedzinski Feb 10, 2020
3da7ee8
Update frontend/src/translations.json
pniedzwiedzinski Feb 10, 2020
d1a7fee
Update translations
pniedzwiedzinski Feb 10, 2020
eb166fd
Fix lint errors
pniedzwiedzinski Feb 10, 2020
2fe1bb2
Merge branch '261-logout-pop-up' of github.com:pniedzwiedzinski/pah-f…
pniedzwiedzinski Feb 10, 2020
6641c73
Remove comment
pniedzwiedzinski Feb 10, 2020
5a71dac
Fix lint errors
pniedzwiedzinski Feb 12, 2020
d6b0ac9
Fix eslint ignore name
pniedzwiedzinski Feb 12, 2020
f6c31ab
Revert GroupGuardMixin
pniedzwiedzinski Feb 12, 2020
7d85b21
Add pop-up for online users
pniedzwiedzinski Feb 26, 2020
8caa7cb
Fix lint errors
pniedzwiedzinski Feb 26, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
35 changes: 35 additions & 0 deletions frontend/src/components/LogoutModal.vue
@@ -0,0 +1,35 @@
<template>
<b-modal
id="logout-modal"
:title="$t('common.are_you_sure')"
:ok-title="$t('common.logout')"
:cancel-title="$t('common.cancel')"
ok-variant="danger"
@ok="logout"
class="logout-modal"
>
<p>
{{ $t('logout.offline_logout_warning') }}
</p>
</b-modal>
</template>

<script>
import router from '../router';
import { logoutRoute } from '../router/routes';

export default {
name: 'LogoutModal',
methods: {
logout() {
router.push(logoutRoute);
},
},
};
</script>

<style scoped>
.logout-modal {
color: black;
}
</style>
2 changes: 1 addition & 1 deletion frontend/src/components/NavigationItems.vue
Expand Up @@ -16,7 +16,7 @@
import flatMap from 'array.prototype.flatmap';
import { mapState } from 'vuex';
import { USER } from '../store';
import { groupBasedRoutes } from '../router/index';
import { groupBasedRoutes } from '../router/routes';

export default {
name: 'NavigationItems',
Expand Down
41 changes: 7 additions & 34 deletions frontend/src/components/Sidebar.vue
@@ -1,12 +1,12 @@
<template>
<ScaleRotate
<scale-rotate
class="mobile-menu"
v-if="show"
right
>
<b-nav fill>
<NavigationItems />
<Language />
<navigation-items />
<language />

<a
class="out-link"
Expand All @@ -18,30 +18,15 @@
src="../assets/logo_codeforpoznan.svg"
>
</a>

<b-nav-item
v-if="user"
@click="LOGOUT"
to="/logout"
key="logout"
class="username"
:class="{ offline: !isOnline }"
>
{{ $t('common.logout') }}
<p>{{ user.username }}</p>
</b-nav-item>
<user-details />
</b-nav>
</ScaleRotate>
</scale-rotate>
</template>

<script>
import { ScaleRotate } from 'vue-burger-menu';
import { mapActions, mapGetters, mapState } from 'vuex';

import { USER } from '../store';
import * as actions from '../store/actions';
import { IS_ONLINE } from '../store/constants';

import UserDetails from './UserDetails.vue';
import NavigationItems from './NavigationItems.vue';
import Language from './Language.vue';

Expand All @@ -51,20 +36,14 @@ export default {
ScaleRotate,
NavigationItems,
Language,
UserDetails,
},
props: {
show: {
type: Boolean,
required: true,
},
},
computed: {
...mapState([USER]),
...mapGetters([IS_ONLINE]),
},
methods: {
...mapActions([actions.LOGOUT]),
},
};
</script>

Expand All @@ -79,10 +58,4 @@ export default {
width: 100%;
height: 100%;
}

.offline {
cursor: default;
pointer-events: none;
text-decoration: none;
}
</style>
3 changes: 1 addition & 2 deletions frontend/src/components/Status.vue
Expand Up @@ -10,8 +10,7 @@
import { mapState } from 'vuex';
import { USER } from '../store';
import { IS_ONLINE } from '../store/constants';
import { loginRoute } from '../router';

import { loginRoute } from '../router/routes';

export default {
name: 'Refresh',
Expand Down
44 changes: 44 additions & 0 deletions frontend/src/components/UserDetails.vue
@@ -0,0 +1,44 @@
<template>
<div>
<b-nav-item
v-if="user"
v-b-modal.logout-modal
@click="logout"
key="logout"
class="username"
>
{{ $t('common.logout') }}
<p>{{ user.username }}</p>
</b-nav-item>
<logout-modal v-if="!isOnline" />
</div>
</template>

<script>
import { mapGetters, mapState } from 'vuex';

import router from '../router';
import { logoutRoute } from '../router/routes';
import { USER } from '../store';
import { IS_ONLINE } from '../store/constants';

import LogoutModal from './LogoutModal.vue';

export default {
name: 'UserDetails',
components: {
LogoutModal,
},
computed: {
...mapState([USER]),
...mapGetters([IS_ONLINE]),
},
methods: {
logout() {
if (this.isOnline) {
router.push(logoutRoute);
}
},
},
};
</script>
4 changes: 2 additions & 2 deletions frontend/src/mixins/GroupGuardMixin.js
@@ -1,8 +1,8 @@
import store from '../store';
import { groupBasedRoutes } from '../router';
import { groupBasedRoutes } from '../router/routes';
import { reverseObject } from '../services/reverseObject';

const { user } = store.state;
const { user } = store ? store.state : { user: undefined };
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
const { user } = store ? store.state : { user: undefined };
const { user } = store && store.state ? store.state : { user: undefined };

?

const groups = user ? user.groups.map(({ name }) => name.toLowerCase()) : [];
arturtamborski marked this conversation as resolved.
Show resolved Hide resolved

const getRouteGroup = (routeName) => {
Expand Down
125 changes: 13 additions & 112 deletions frontend/src/router/index.js
@@ -1,112 +1,27 @@
import Vue from 'vue';
import Router from 'vue-router';
import flatMap from 'array.prototype.flatmap';

import HomeView from '../views/HomeView.vue';
import LoginView from '../views/LoginView.vue';
import DriveFormView from '../views/DriveFormView.vue';
import DrivesView from '../views/DrivesView.vue';
import SuccessfulLogoutView from '../views/SuccessfulLogoutView.vue';
import PassengerView from '../views/PassengerView.vue';
import PassengerSubmitView from '../views/PassengerSubmitView.vue';
import flatMap from 'array.prototype.flatmap';

import store from '../store';
import * as mutations from '../store/mutations';
import { deleteStorageData } from '../services/api/auth';
import { isUserLoggedIn } from '../services/api/user';

Vue.use(Router);
import routes, {
arturtamborski marked this conversation as resolved.
Show resolved Hide resolved
openRoutes,
homeRoute,
pageNotFoundRoute,
loginRoute,
groupBasedRoutes,
allGroupBasedRoutes,
} from './routes';

export const loginRoute = {
path: '/login',
name: 'Login',
component: LoginView,
};
export const driveCreateRoute = {
path: '/drive',
name: 'Drive',
component: DriveFormView,
};
export const driveListRoute = {
path: '/drives',
name: 'Drives',
component: DrivesView,
};
export const passengerRoute = {
path: '/passenger',
name: 'Passenger',
component: PassengerView,
};
export const passengerSubmitRoute = {
path: '/confirm',
name: 'Confirm',
component: PassengerSubmitView,
};
export const homeRoute = {
path: '/',
name: 'Home',
component: HomeView,
};
export const logoutRoute = {
path: '/logout',
name: 'Logout',
component: SuccessfulLogoutView,
};
export const pageNotFoundRoute = {
path: '*',
name: 'PageNotFound',
component: HomeView,
props: { pageNotFound: true },
};
Vue.use(Router);

const router = new Router({
mode: 'history',
routes: [
loginRoute,
driveCreateRoute,
driveListRoute,
passengerRoute,
passengerSubmitRoute,
homeRoute,
pageNotFoundRoute,
logoutRoute,
],
routes,
});

export const groupBasedRoutes = {
driver: [
{
text: 'common.new_drive',
to: driveCreateRoute,
visibleOnMenu: true,
},
{
text: 'common.drives',
to: driveListRoute,
visibleOnMenu: true,
},
],
passenger: [
{
text: 'common.confirm_drive',
to: passengerRoute,
visibleOnMenu: true,
},
{
text: '',
to: passengerSubmitRoute,
visibleOnMenu: false,
},
],
};

const allGroupBasedRoutes = [
...groupBasedRoutes.driver,
...groupBasedRoutes.passenger,
].map(route => route.to.name);

const openRoutes = [loginRoute.name];

router.beforeEach((to, _from, next) => {
const userLoggedIn = isUserLoggedIn();

Expand All @@ -115,20 +30,6 @@ router.beforeEach((to, _from, next) => {
return next({ path: homeRoute.path });
}

// user is going to log out
if (userLoggedIn && to.name === logoutRoute.name) {
store.commit(mutations.SET_USER, null);
deleteStorageData();
store.commit(mutations.SET_LOGOUT_PROGRESS, true);
return next();
}

// user logged out
if (store.state.logoutInProgress && to.name === logoutRoute.name) {
store.commit(mutations.SET_LOGOUT_PROGRESS, false);
return next();
}

// route is open
if (openRoutes.includes(to.name)) {
return next();
Expand All @@ -147,8 +48,8 @@ router.beforeEach((to, _from, next) => {
if (userLoggedIn && allGroupBasedRoutes.includes(to.name)) {
const availableRoutes = flatMap(
store.state.user.groups,
group => groupBasedRoutes[group.name.toLowerCase()],
).map(route => route.to.name);
(group) => groupBasedRoutes[group.name.toLowerCase()]
).map((route) => route.to.name);

const routeAccessible = availableRoutes.includes(to.name);

Expand Down