Add new client elements for snapshots

This commit is contained in:
Ramon Wenger 2021-04-28 00:40:10 +02:00
parent d4a1c201f2
commit 69b3353931
12 changed files with 352 additions and 6 deletions

View File

@ -0,0 +1,8 @@
describe('Snapshot', () => {
it('Menu is visible for teacher', () => {
cy.get('NotImplemented');
});
it('Menu is not visible for student', () => {
cy.get('NotImplemented');
});
});

View File

@ -36,6 +36,7 @@
import FullscreenInfographic from '@/components/FullscreenInfographic';
import FullscreenVideo from '@/components/FullscreenVideo';
import DeactivatePerson from '@/components/profile/DeactivatePerson';
import SnapshotCreated from '@/components/modules/SnapshotCreated';
import {mapGetters} from 'vuex';
import ScrollUp from '@/components/ScrollUp';
@ -64,7 +65,8 @@
FullscreenImage,
FullscreenInfographic,
FullscreenVideo,
DeactivatePerson
DeactivatePerson,
SnapshotCreated
},
computed: {

View File

@ -44,10 +44,7 @@
class="module-navigation__toggle-menu"
v-if="canManageContent"
>
<!-- <a-->
<!-- class="module-navigation__actions"-->
<!-- data-cy="module-snapshots-button">Snapshots</a>-->
<snapshot-menu class="module-navigation__actions"/>
<router-link
:to="{name: 'module-settings'}"
class="module-navigation__actions"
@ -66,6 +63,7 @@
import SubNavigationItem from '@/components/book-navigation/SubNavigationItem';
import ToggleEditing from '@/components/toggle-menu/ToggleEditing';
import me from '@/mixins/me';
import SnapshotMenu from '@/components/modules/SnapshotMenu';
export default {
apollo: {
@ -75,6 +73,7 @@
mixins: [me],
components: {
SnapshotMenu,
BackLink,
SubNavigationItem,
ToggleEditing,

View File

@ -0,0 +1,91 @@
<template>
<modal
:hide-header="false"
:small="true"
class="snapshot-created">
<div slot="header">
<h1 class="snapshot-created__heading">Ein neuer Snapshot wurde erstellt</h1>
</div>
<div class="snapshot-created__content">
<div class="snapshot-created__entry">
<span class="snapshot-created__title">{{ snapshot.title }}</span>
<span class="snapshot-created__meta">30.11.2020 - 17:31 - Simone Gerber</span>
</div>
</div>
<div slot="footer">
<a
class="button button--primary"
@click="toList">Alle Snapshots anzeigen</a>
<a
class="button"
@click="close">Zurück zum Modul</a>
</div>
</modal>
</template>
<script>
import Modal from '@/components/Modal';
import {SNAPSHOT_LIST} from '@/router/module.names';
export default {
components: {
Modal,
},
data() {
return {
snapshotList: {
name: SNAPSHOT_LIST,
},
};
},
computed: {
snapshot() {
return this.$modal.state.payload.snapshot;
}
},
methods: {
toList() {
this.$router.push(this.snapshotList);
this.$modal.confirm();
},
close() {
this.$modal.cancel();
},
},
};
</script>
<style scoped lang="scss">
@import '~styles/helpers';
.snapshot-created {
&__heading {
@include heading-2;
margin-bottom: 0;
line-height: 1.5;
}
&__content {
min-height: 200px;
}
&__entry {
padding: $medium-spacing;
background-color: $color-brand-light;
display: flex;
align-items: center;
}
&__title {
@include heading-4;
margin-right: $medium-spacing;
}
&__meta {
@include small-text;
}
}
</style>

View File

@ -0,0 +1,28 @@
<template>
<div class="snapshot-list-item">
<span
class="snapshot-list-item__title"
v-html="snapshot.title"/>
</div>
</template>
<script>
export default {
props: {
snapshot: {
type: Object,
default: () => ({})
}
}
};
</script>
<style scoped lang="scss">
@import '~styles/helpers';
.snapshot-list-item {
&__title {
@include heading-4;
}
}
</style>

View File

@ -0,0 +1,99 @@
<template>
<div class="snapshot-menu">
<a
data-cy="module-snapshots-button"
class="snapshot-menu__toggle"
@click="showPopover = true">Snapshots</a>
<widget-popover
class="snapshot-menu__popover"
v-if="showPopover"
@hide-me="showPopover = false">
<a
class="popover-links__link snapshot-menu__link snapshot-menu__button snapshot-menu__button--primary"
@click="createSnapshot">Neuen
Snapshot erstellen</a>
<router-link
:to="snapshotListRoute"
class="popover-links__link snapshot-menu__link">Snapshots anzeigen
</router-link>
<a class="popover-links__link snapshot-menu__link">Was ist ein Snapshot?</a>
</widget-popover>
</div>
</template>
<script>
import WidgetPopover from '@/components/WidgetPopover';
import {SNAPSHOT_LIST} from '@/router/module.names';
import me from '@/mixins/me';
import CREATE_SNAPSHOT_MUTATION from '@/graphql/gql/mutations/createSnapshot.gql';
export default {
mixins: [me],
components: {
WidgetPopover,
},
data() {
return {
snapshotListRoute: {
name: SNAPSHOT_LIST,
},
showPopover: false,
};
},
methods: {
createSnapshot() {
this.$apollo.mutate({
mutation: CREATE_SNAPSHOT_MUTATION,
variables: {
input: {
module: this.$route.params.slug,
selectedClass: this.me.selectedClass.id,
},
},
}).then(({data: {createSnapshot: {snapshot}}}) => {
this.showPopover = false;
this.$modal.open('snapshot-created', {
snapshot
});
});
},
},
};
</script>
<style scoped lang="scss">
@import '~styles/helpers';
.snapshot-menu {
position: relative;
&__toggle {
@include regular-text;
cursor: pointer;
}
&__popover {
box-sizing: border-box;
width: 300px;
height: 170px;
left: 0;
top: 35px;
padding: $medium-spacing;
}
&__link {
@include large-link;
line-height: 27px;
padding: $small-spacing 0;
}
&__button {
@include button-border;
padding: 5px $small-spacing;
}
}
</style>

View File

@ -0,0 +1,14 @@
query ModuleSnapshotsQuery($slug: String!) {
module(slug: $slug) {
id
title
metaTitle
topic {
title
}
snapshots {
id
title
}
}
}

View File

@ -0,0 +1,9 @@
mutation CreateSnapshot($input: CreateSnapshotInput!) {
createSnapshot(input: $input) {
snapshot {
id
title
}
success
}
}

View File

@ -0,0 +1,13 @@
query SnapshotsQuery($slug: String!) {
snapshot(slug: $slug) {
id
module {
id
title
metaTitle
topic {
title
}
}
}
}

View File

@ -0,0 +1,73 @@
<template>
<div class="snapshots">
<h1>Snapshots</h1>
<p class="snapshots__details">Thema: {{ module.topic.title }} - {{ module.metaTitle }}: {{ module.title }}</p>
<div class="snapshots__list">
<snapshot-list-item
:key="snapshot.id"
:snapshot="snapshot"
class="snapshots__snapshot"
v-for="snapshot in module.snapshots"/>
</div>
</div>
</template>
<script>
import SnapshotListItem from '@/components/modules/SnapshotListItem';
import MODULE_SNAPSHOTS_QUERY from '@/graphql/gql/moduleSnapshots.gql';
const defaultModule = {topic: {}, snapshots: []};
export default {
components: {
SnapshotListItem
},
data() {
return {
module: defaultModule
};
},
apollo: {
module: {
query: MODULE_SNAPSHOTS_QUERY,
variables() {
return {
slug: this.$route.params.slug
};
},
error(error, vm, key, type, options) {
console.log(error, vm, key, type, options);
},
update(data) {
return data.module || defaultModule;
}
},
},
};
</script>
<style scoped lang="scss">
@import '~styles/helpers';
.snapshots {
@include centered(800px);
display: flex;
flex-direction: column;
padding: $section-spacing 0;
align-items: flex-start;
&__details {
@include regular-text;
}
&__list {
width: 100%;
}
&__snapshot {
@include table-row;
}
}
</style>

View File

@ -2,3 +2,4 @@ export const SUBMISSIONS_PAGE = 'submissions';
export const MODULE_PAGE = 'module';
export const MODULE_SETTINGS_PAGE = 'module-settings';
export const VISIBILITY_PAGE = 'visibility';
export const SNAPSHOT_LIST = 'snapshot-list';

View File

@ -2,8 +2,9 @@ import moduleBase from '@/pages/module/module-base';
import module from '@/pages/module/module';
import submissions from '@/pages/submissions';
import moduleVisibility from '@/pages/module/moduleVisibility';
import {MODULE_PAGE, MODULE_SETTINGS_PAGE, SUBMISSIONS_PAGE, VISIBILITY_PAGE} from '@/router/module.names';
import {MODULE_PAGE, MODULE_SETTINGS_PAGE, SUBMISSIONS_PAGE, VISIBILITY_PAGE, SNAPSHOT_LIST} from '@/router/module.names';
import settingsPage from '@/pages/module/moduleSettings';
import snapshots from '@/pages/snapshot/snapshots';
export default [
{
@ -42,6 +43,14 @@ export default [
hideNavigation: true,
},
},
{
path: 'snapshots',
component: snapshots,
name: SNAPSHOT_LIST,
meta: {
showSubNavigation: true,
},
},
],
},
];