Merge branch 'release/new-portfolio' into develop

This commit is contained in:
Ramon Wenger 2021-10-27 18:13:51 +02:00
commit ef6d76aee1
14 changed files with 166 additions and 68 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -46,7 +46,7 @@ describe('New project', () => {
}); });
cy.visit('/portfolio'); cy.visit('/portfolio');
cy.get('[data-cy=add-project-button]').click(); cy.get('[data-cy=create-project-button]').click();
cy.get('[data-cy=page-form-input-titel]').type('Some random title'); cy.get('[data-cy=page-form-input-titel]').type('Some random title');
cy.get('[data-cy=page-form-input-beschreibung]').should('exist').should('be.empty'); cy.get('[data-cy=page-form-input-beschreibung]').should('exist').should('be.empty');
cy.get('[data-cy=page-form-input-ziele]').should('not.exist'); cy.get('[data-cy=page-form-input-ziele]').should('not.exist');

View File

@ -3,6 +3,32 @@ import {PROJECT_ENTRY_TEMPLATE} from '../../../../src/consts/strings.consts';
describe('Project Page', () => { describe('Project Page', () => {
const created = '2021-06-01T11:49:00+00:00'; const created = '2021-06-01T11:49:00+00:00';
const createdLater = '2021-06-01T12:49:00+00:00'; const createdLater = '2021-06-01T12:49:00+00:00';
let final = false;
const project = {
id: 'UHJvamVjdE5vZGU6MzY=',
title: 'Groot',
appearance: 'yellow',
description: 'I am Groot',
slug: 'groot',
objectives: 'Be Groot\nBe awesome',
final: false,
student: {
firstName: 'Rachel',
lastName: 'Green',
id: 'VXNlck5vZGU6NQ==',
avatarUrl: '',
},
entriesCount: 1,
entries: [
{
id: 'UHJvamVjdEVudHJ5Tm9kZTo2NQ==',
description: 'Aktivität:\nKill Thanos\n\n\nReflexion:\nHe sucks\n\n\nNächste Schritte:\nGo for the head',
documentUrl: '',
created,
},
],
};
const operations = { const operations = {
MeQuery: { MeQuery: {
@ -32,30 +58,7 @@ describe('Project Page', () => {
], ],
}, },
ProjectQuery: { ProjectQuery: {
project: { project,
id: 'UHJvamVjdE5vZGU6MzY=',
title: 'Groot',
appearance: 'yellow',
description: 'I am Groot',
slug: 'groot',
objectives: 'Be Groot\nBe awesome',
final: false,
student: {
firstName: 'Rachel',
lastName: 'Green',
id: 'VXNlck5vZGU6NQ==',
avatarUrl: '',
},
entriesCount: 1,
entries: [
{
id: 'UHJvamVjdEVudHJ5Tm9kZTo2NQ==',
description: 'Aktivität:\nKill Thanos\n\n\nReflexion:\nHe sucks\n\n\nNächste Schritte:\nGo for the head',
documentUrl: '',
created,
},
],
},
}, },
AddProjectEntry: variables => ({ AddProjectEntry: variables => ({
addProjectEntry: { addProjectEntry: {
@ -77,6 +80,16 @@ describe('Project Page', () => {
success: true, success: true,
}, },
}, },
UpdateProjectShareState: variables => {
final = !final;
return {
updateProjectSharedState: {
errors: null,
success: true,
shared: final,
},
};
},
}; };
beforeEach(() => { beforeEach(() => {
@ -103,6 +116,34 @@ describe('Project Page', () => {
cy.getByDataCy('edit-project').should('exist'); cy.getByDataCy('edit-project').should('exist');
}); });
it('shares and unshares the project', () => {
const getOperationsForSharing = () => {
let projectForSharing = {
...project,
final,
};
return {
...operations,
ProjectQuery: {
project: projectForSharing,
},
};
};
cy.mockGraphqlOps({
operations: getOperationsForSharing,
});
cy.visit('/portfolio/groot');
const unsharedText = 'Mit Lehrperson teilen';
const sharedText = 'Nicht mehr teilen';
cy.getByDataCy('project-share-link').should('contain', unsharedText);
cy.getByDataCy('project-share-link').click();
cy.getByDataCy('project-share-link').should('contain', sharedText);
cy.getByDataCy('project-share-link').click();
cy.getByDataCy('project-share-link').should('contain', unsharedText);
});
describe('Project Entry', () => { describe('Project Entry', () => {
it('should create a new project entry', () => { it('should create a new project entry', () => {
cy.visit('/portfolio'); cy.visit('/portfolio');
@ -156,4 +197,5 @@ describe('Project Page', () => {
cy.getByDataCy('project-entry-textarea').should('have.value', PROJECT_ENTRY_TEMPLATE); cy.getByDataCy('project-entry-textarea').should('have.value', PROJECT_ENTRY_TEMPLATE);
}); });
}); });
}); })
;

File diff suppressed because one or more lines are too long

View File

@ -26,7 +26,7 @@ describe('Read Only Portfolio', () => {
cy.visit('/portfolio'); cy.visit('/portfolio');
cy.getByDataCy('project-list').should('exist'); cy.getByDataCy('project-list').should('exist');
cy.getByDataCy('add-project-button').should('exist'); cy.getByDataCy('create-project-button').should('exist');
cy.getByDataCy('project').should('have.length', 1); cy.getByDataCy('project').should('have.length', 1);
cy.getByDataCy('project-actions').should('exist'); cy.getByDataCy('project-actions').should('exist');
}); });

View File

@ -34,8 +34,7 @@
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
@import "@/styles/_variables.scss"; @import "~styles/helpers";
@import "@/styles/_mixins.scss";
.more-options { .more-options {
display: flex; display: flex;
@ -58,7 +57,7 @@
} }
&__popover { &__popover {
width: 180px; min-width: 200px;
@include popover-defaults(); @include popover-defaults();
} }
} }

View File

@ -1,8 +1,7 @@
<template> <template>
<router-link <router-link
:to="createProjectRoute" :to="createProjectRoute"
class="button button--primary" class="button button--primary">Projekt erstellen
data-cy="add-project-button">Projekt erstellen
</router-link> </router-link>
</template> </template>

View File

@ -15,7 +15,7 @@
Hier können Sie Projekte erstellen, um Ihre Gedanken festzuhalten oder Ihre Arbeit zu dokumentieren. Hier können Sie Projekte erstellen, um Ihre Gedanken festzuhalten oder Ihre Arbeit zu dokumentieren.
</p> </p>
<create-project-button /> <create-project-button data-cy="create-project-button-onboarding" />
</div> </div>
</template> </template>

View File

@ -6,13 +6,15 @@
class="project-entry__more" class="project-entry__more"
data-cy="project-entry-more" data-cy="project-entry-more"
v-if="!readOnly"> v-if="!readOnly">
<li class="popover-links__link"><a <li class="popover-links__link">
data-cy="edit-project-entry" <a
@click="editProjectEntry()">Eintrag bearbeiten</a> data-cy="edit-project-entry"
@click="editProjectEntry()">Eintrag bearbeiten</a>
</li> </li>
<li class="popover-links__link"><a <li class="popover-links__link">
data-cy="delete-project-entry" <a
@click="deleteProjectEntry()">Eintrag löschen</a> data-cy="delete-project-entry"
@click="deleteProjectEntry()">Eintrag löschen</a>
</li> </li>
</more-options-widget> </more-options-widget>
@ -46,7 +48,7 @@
props: ['description', 'documentUrl', 'created', 'id', 'readOnly'], props: ['description', 'documentUrl', 'created', 'id', 'readOnly'],
components: { components: {
DocumentBlock, DocumentBlock,
MoreOptionsWidget MoreOptionsWidget,
}, },
methods: { methods: {
@ -59,14 +61,14 @@
mutation: DELETE_PROJECT_ENTRY_MUTATION, mutation: DELETE_PROJECT_ENTRY_MUTATION,
variables: { variables: {
input: { input: {
id: this.id id: this.id,
} },
}, },
update(store, {data: {deleteProjectEntry: {success}}}) { update(store, {data: {deleteProjectEntry: {success}}}) {
if (success) { if (success) {
const query = PROJECT_QUERY; const query = PROJECT_QUERY;
const variables = { const variables = {
slug: projectEntry.$route.params.slug slug: projectEntry.$route.params.slug,
}; };
const data = store.readQuery({query, variables}); const data = store.readQuery({query, variables});
if (data) { if (data) {
@ -74,10 +76,10 @@
store.writeQuery({query, variables, data}); store.writeQuery({query, variables, data});
} }
} }
} },
}); });
} },
} },
}; };
</script> </script>

View File

@ -2,7 +2,7 @@
<a class="share-icon"> <a class="share-icon">
<share-icon class="share-icon__icon"/> <share-icon class="share-icon__icon"/>
<span class="share-icon__text"> <span class="share-icon__text">
<template v-if="final">Mit Lehrperson teilen</template> <template v-if="!final">Mit Lehrperson teilen</template>
<template v-else>Nicht mehr teilen</template> <template v-else>Nicht mehr teilen</template>
</span> </span>
</a> </a>

View File

@ -1,4 +1,4 @@
import {InMemoryCache, defaultDataIdFromObject} from 'apollo-cache-inmemory'; import {defaultDataIdFromObject, InMemoryCache} from 'apollo-cache-inmemory';
import {createHttpLink} from 'apollo-link-http'; import {createHttpLink} from 'apollo-link-http';
import {onError} from 'apollo-link-error'; import {onError} from 'apollo-link-error';
import {ApolloClient} from 'apollo-client'; import {ApolloClient} from 'apollo-client';
@ -13,18 +13,18 @@ const writeLocalCache = cache => {
data: { data: {
scrollPosition: { scrollPosition: {
__typename: 'ScrollPosition', __typename: 'ScrollPosition',
scrollTo: '' scrollTo: '',
}, },
sidebar: { sidebar: {
__typename: 'Sidebar', __typename: 'Sidebar',
profile: false, profile: false,
navigation: false navigation: false,
}, },
helloEmail: { helloEmail: {
__typename: 'HelloEmail', __typename: 'HelloEmail',
email: '' email: '',
}, },
} },
}); });
}; };
@ -35,8 +35,8 @@ export default function (uri, networkErrorCallback) {
credentials: 'include', credentials: 'include',
fetch: fetch, fetch: fetch,
headers: { headers: {
'X-CSRFToken': document.cookie.replace(/(?:(?:^|.*;\s*)csrftoken\s*=\s*([^;]*).*$)|^.*$/, '$1') 'X-CSRFToken': document.cookie.replace(/(?:(?:^|.*;\s*)csrftoken\s*=\s*([^;]*).*$)|^.*$/, '$1'),
} },
}); });
const consoleLink = new ApolloLink((operation, forward) => { const consoleLink = new ApolloLink((operation, forward) => {
@ -71,8 +71,8 @@ export default function (uri, networkErrorCallback) {
if (graphQLErrors) { if (graphQLErrors) {
graphQLErrors.forEach(({message, locations, path}) => graphQLErrors.forEach(({message, locations, path}) =>
console.log( console.log(
`[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}` `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`,
) ),
); );
} }
@ -106,8 +106,16 @@ export default function (uri, networkErrorCallback) {
objective: (_, args, {getCacheKey}) => getCacheKey({__typename: 'ObjectiveNode', id: args.id}), objective: (_, args, {getCacheKey}) => getCacheKey({__typename: 'ObjectiveNode', id: args.id}),
objectiveGroup: (_, args, {getCacheKey}) => getCacheKey({__typename: 'ObjectiveGroupNode', id: args.id}), objectiveGroup: (_, args, {getCacheKey}) => getCacheKey({__typename: 'ObjectiveGroupNode', id: args.id}),
projectEntry: (_, args, {getCacheKey}) => getCacheKey({__typename: 'ProjectEntryNode', id: args.id}), projectEntry: (_, args, {getCacheKey}) => getCacheKey({__typename: 'ProjectEntryNode', id: args.id}),
} project: (_, args, {getCacheKey}) => {
} console.log(args);
if (args.slug) {
return getCacheKey({__typename: 'ProjectNode', id: args.slug});
} else {
return getCacheKey({__typename: 'ProjectNode', id: args.id});
}
},
},
},
}); });
// TODO: Monkey-patching in a fix for an open issue suggesting that // TODO: Monkey-patching in a fix for an open issue suggesting that
@ -132,7 +140,7 @@ export default function (uri, networkErrorCallback) {
cache, cache,
connectToDevTools: true, connectToDevTools: true,
typeDefs, typeDefs,
resolvers resolvers,
}); });
client.onResetStore(() => { client.onResetStore(() => {
writeLocalCache(cache); writeLocalCache(cache);

View File

@ -39,10 +39,7 @@
try { try {
const data = store.readQuery({query: PROJECTS_QUERY}); const data = store.readQuery({query: PROJECTS_QUERY});
if (data.projects) { if (data.projects) {
data.projects.edges.unshift({ data.projects.unshift(project);
node: project,
__typename: 'ProjectNode'
});
store.writeQuery({query: PROJECTS_QUERY, data}); store.writeQuery({query: PROJECTS_QUERY, data});
} }
} catch (e) { } catch (e) {

View File

@ -5,6 +5,7 @@
<h1 data-cy="page-title">Portfolio</h1> <h1 data-cy="page-title">Portfolio</h1>
<create-project-button <create-project-button
data-cy="create-project-button"
class="portfolio__create-button" class="portfolio__create-button"
v-if="!isReadOnly" /> v-if="!isReadOnly" />

View File

@ -11,6 +11,7 @@
<div class="project__actions"> <div class="project__actions">
<share-link <share-link
:final="project.final" :final="project.final"
data-cy="project-share-link"
class="project__share" class="project__share"
@click.native="updateProjectShareState(project.id, !project.final)" /> @click.native="updateProjectShareState(project.id, !project.final)" />