270 lines
6.5 KiB
Vue
270 lines
6.5 KiB
Vue
<template>
|
|
<!-- eslint-disable vue/no-v-html -->
|
|
<div
|
|
data-cy="snapshot-entry"
|
|
class="snapshot-list-item"
|
|
>
|
|
<router-link
|
|
:to="snapshotRoute"
|
|
class="snapshot-list-item__title"
|
|
data-cy="snapshot-link"
|
|
>
|
|
{{ snapshot.title }}
|
|
</router-link>
|
|
<span
|
|
class="snapshot-list-item__date"
|
|
v-html="meta"
|
|
/>
|
|
<div class="snapshot-list-item__actions">
|
|
<button
|
|
class="icon-button"
|
|
data-cy="delete-snapshot-button"
|
|
v-if="snapshot.mine"
|
|
@click="deleteSnapshot"
|
|
>
|
|
<trash-icon class="snapshot-list-item__icon" />
|
|
</button>
|
|
<button
|
|
class="icon-button"
|
|
data-cy="rename-snapshot-button"
|
|
v-if="snapshot.mine"
|
|
@click="changeTitle"
|
|
>
|
|
<pen-icon class="snapshot-list-item__icon" />
|
|
</button>
|
|
<a
|
|
class="snapshot-list-item__link"
|
|
v-if="snapshot.mine"
|
|
@click="share"
|
|
>
|
|
<template v-if="snapshot.shared">Nicht mehr teilen</template>
|
|
<template v-else>Mit Team teilen</template>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import dateformat from '@/helpers/date-format';
|
|
import { SNAPSHOT_DETAIL } from '@/router/module.names';
|
|
import SHARE_SNAPSHOT_MUTATION from 'gql/mutations/snapshots/share.gql';
|
|
import UPDATE_SNAPSHOT_MUTATION from 'gql/mutations/snapshots/update.gql';
|
|
import DELETE_SNAPSHOT_MUTATION from 'gql/mutations/snapshots/delete.gql';
|
|
import SNAPSHOTS_QUERY from 'gql/queries/moduleSnapshots.gql';
|
|
import PenIcon from '@/components/icons/PenIcon.vue';
|
|
import TrashIcon from '@/components/icons/TrashIcon.vue';
|
|
import { removeAtIndex } from '@/graphql/immutable-operations';
|
|
import { matomoTrackEvent } from '@/helpers/matomo-client';
|
|
import { graphql } from '@/__generated__';
|
|
|
|
export const SnapshotListItemFragment = graphql(`
|
|
fragment SnapshotListItem on SnapshotNode {
|
|
shared
|
|
}
|
|
`);
|
|
|
|
export const SnapshotTitleListItem = graphql(`
|
|
fragment SnapshotTitle on SnapshotNode {
|
|
title
|
|
}
|
|
`);
|
|
|
|
export default {
|
|
props: {
|
|
snapshot: {
|
|
type: Object,
|
|
default: () => ({}),
|
|
},
|
|
},
|
|
components: {
|
|
PenIcon,
|
|
TrashIcon,
|
|
},
|
|
|
|
computed: {
|
|
meta() {
|
|
const created = dateformat(this.snapshot.created);
|
|
if (this.snapshot.mine) {
|
|
return created;
|
|
}
|
|
return `${created} - ${this.snapshot.creator}`;
|
|
},
|
|
snapshotRoute() {
|
|
return {
|
|
name: SNAPSHOT_DETAIL,
|
|
params: {
|
|
id: this.snapshot.id,
|
|
},
|
|
};
|
|
},
|
|
},
|
|
|
|
methods: {
|
|
changeTitle() {
|
|
this.$modal
|
|
.open('edit-snapshot-title-wizard', { name: this.snapshot.title })
|
|
.then((title) => {
|
|
console.log(title);
|
|
this.$apollo.mutate({
|
|
mutation: UPDATE_SNAPSHOT_MUTATION,
|
|
variables: {
|
|
input: {
|
|
id: this.snapshot.id,
|
|
title: title,
|
|
},
|
|
},
|
|
update(
|
|
store,
|
|
{
|
|
data: {
|
|
updateSnapshot: { snapshot },
|
|
},
|
|
}
|
|
) {
|
|
if (snapshot.__typename === 'SnapshotNode') {
|
|
const { id, title } = snapshot;
|
|
store.writeFragment({
|
|
id,
|
|
fragment: SnapshotTitleListItem,
|
|
data: {
|
|
title,
|
|
__typename: 'SnapshotNode',
|
|
},
|
|
});
|
|
}
|
|
},
|
|
});
|
|
})
|
|
.catch();
|
|
},
|
|
deleteSnapshot() {
|
|
this.$modal
|
|
.open('confirm', {
|
|
title: 'Snapshot löschen',
|
|
})
|
|
.then(() => {
|
|
this.$apollo
|
|
.mutate({
|
|
mutation: DELETE_SNAPSHOT_MUTATION,
|
|
variables: {
|
|
input: {
|
|
id: this.snapshot.id,
|
|
},
|
|
},
|
|
update: (
|
|
store,
|
|
{
|
|
data: {
|
|
deleteSnapshot: { result },
|
|
},
|
|
}
|
|
) => {
|
|
if (result.__typename === 'Success') {
|
|
const slug = this.$route.params.slug;
|
|
const query = SNAPSHOTS_QUERY;
|
|
const variables = {
|
|
slug,
|
|
};
|
|
const { module } = store.readQuery({
|
|
query,
|
|
variables,
|
|
});
|
|
const index = module.snapshots.findIndex((snapshot) => snapshot.id === this.snapshot.id);
|
|
const snapshots = removeAtIndex(module.snapshots, index);
|
|
|
|
const data = {
|
|
module: {
|
|
...module,
|
|
snapshots,
|
|
},
|
|
};
|
|
|
|
store.writeQuery({
|
|
query,
|
|
variables,
|
|
data,
|
|
});
|
|
}
|
|
},
|
|
})
|
|
.then(() => {
|
|
matomoTrackEvent('Modul Snapshot', 'Snapshot gelöscht', this.$route.params.slug);
|
|
});
|
|
})
|
|
.catch(() => {});
|
|
},
|
|
share() {
|
|
this.$apollo.mutate({
|
|
mutation: SHARE_SNAPSHOT_MUTATION,
|
|
variables: {
|
|
input: {
|
|
snapshot: this.snapshot.id,
|
|
shared: !this.snapshot.shared,
|
|
},
|
|
},
|
|
update(
|
|
store,
|
|
{
|
|
data: {
|
|
shareSnapshot: {
|
|
snapshot: { id, shared },
|
|
},
|
|
},
|
|
}
|
|
) {
|
|
store.writeFragment({
|
|
id,
|
|
fragment: SnapshotListItemFragment,
|
|
data: {
|
|
shared,
|
|
__typename: 'SnapshotNode',
|
|
},
|
|
});
|
|
},
|
|
});
|
|
|
|
const slug = this.$route.params.slug;
|
|
if (this.snapshot.shared) {
|
|
matomoTrackEvent('Modul Snapshot', 'Snapshot mit Team geteilt', slug);
|
|
} else {
|
|
matomoTrackEvent('Modul Snapshot', 'Snapshot nicht mehr geteilt', slug);
|
|
}
|
|
},
|
|
},
|
|
};
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
@import 'styles/helpers';
|
|
|
|
.snapshot-list-item {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: flex-start;
|
|
|
|
&__title {
|
|
@include heading-4;
|
|
width: 180px;
|
|
}
|
|
|
|
&__date {
|
|
@include regular-text;
|
|
}
|
|
|
|
&__link {
|
|
@include default-link;
|
|
color: $color-brand;
|
|
}
|
|
|
|
&__icon {
|
|
@include default-icon;
|
|
}
|
|
|
|
&__actions {
|
|
display: flex;
|
|
align-items: center;
|
|
margin-left: auto;
|
|
}
|
|
}
|
|
</style>
|