Add bookmark actions to instrument, implement instrument bookmark

This commit is contained in:
Ramon Wenger 2020-01-08 15:00:40 +01:00
parent c8a09badad
commit 2b40f81764
5 changed files with 167 additions and 81 deletions

View File

@ -39,8 +39,7 @@
import Solution from '@/components/content-blocks/Solution'; import Solution from '@/components/content-blocks/Solution';
import BookmarkActions from '@/components/notes/BookmarkActions'; import BookmarkActions from '@/components/notes/BookmarkActions';
import UPDATE_CONTENT_BOOKMARK from '@/graphql/gql/mutations/updateContentBookmark.gql'; import {constructContentComponentBookmarkMutation} from '@/helpers/update-content-bookmark-mutation';
import CONTENT_BLOCK_QUERY from '@/graphql/gql/contentBlockQuery.gql';
export default { export default {
props: ['component', 'parent', 'bookmarks', 'notes', 'root'], props: ['component', 'parent', 'bookmarks', 'notes', 'root'],
@ -91,56 +90,7 @@
this.$store.dispatch('editNote', this.note); this.$store.dispatch('editNote', this.note);
}, },
bookmarkContent(uuid, bookmarked) { bookmarkContent(uuid, bookmarked) {
this.$apollo.mutate({ this.$apollo.mutate(constructContentComponentBookmarkMutation(uuid, bookmarked, this.parent, this.root));
mutation: UPDATE_CONTENT_BOOKMARK,
variables: {
input: {
uuid,
contentBlock: this.root,
bookmarked
}
},
update: (store, response) => {
const query = CONTENT_BLOCK_QUERY;
const variables = {id: this.root};
const data = store.readQuery({
query,
variables
});
const bookmarks = data.contentBlock.bookmarks;
if (bookmarked) {
bookmarks.push({
note: null,
uuid: uuid,
__typename: 'ContentBlockBookmarkNode'
});
} else {
let index = bookmarks.findIndex(element => {
return element.uuid === uuid;
});
if (index > -1) {
bookmarks.splice(index, 1);
}
}
data.contentBlock.bookmarks = bookmarks;
store.writeQuery({
data,
query,
variables
});
},
optimisticResponse: {
__typename: 'Mutation',
updateContentBookmark: {
__typename: 'UpdateContentBookmarkPayload',
success: true
}
}
});
} }
} }
}; };

View File

@ -0,0 +1,5 @@
mutation UpdateInstrumentBookmark($input: UpdateInstrumentBookmarkInput!) {
updateInstrumentBookmark(input: $input) {
success
}
}

View File

@ -0,0 +1,113 @@
import UPDATE_CONTENT_BOOKMARK from '@/graphql/gql/mutations/updateContentBookmark.gql';
import UPDATE_INSTRUMENT_BOOKMARK from '@/graphql/gql/mutations/updateInstrumentBookmark.gql';
import CONTENT_BLOCK_QUERY from '@/graphql/gql/contentBlockQuery.gql';
import INSTRUMENT_QUERY from '@/graphql/gql/instrumentQueryById.gql';
export const constructContentComponentBookmarkMutation = (uuid, bookmarked, parent, root) => {
let mutation = {};
console.log(uuid, bookmarked, parent, root);
if (parent.__typename === 'ContentBlockNode') {
mutation = {
mutation: UPDATE_CONTENT_BOOKMARK,
variables: {
input: {
uuid,
contentBlock: root,
bookmarked
}
},
update: (store, response) => {
const query = CONTENT_BLOCK_QUERY;
const variables = {id: root};
const data = store.readQuery({
query,
variables
});
const bookmarks = data.contentBlock.bookmarks;
if (bookmarked) {
bookmarks.push({
note: null,
uuid,
__typename: 'ContentBlockBookmarkNode'
});
} else {
let index = bookmarks.findIndex(element => {
return element.uuid === uuid;
});
if (index > -1) {
bookmarks.splice(index, 1);
}
}
data.contentBlock.bookmarks = bookmarks;
store.writeQuery({
data,
query,
variables
});
},
optimisticResponse: {
__typename: 'Mutation',
updateContentBookmark: {
__typename: 'UpdateContentBookmarkPayload',
success: true
}
}
}
} else {
mutation = {
mutation: UPDATE_INSTRUMENT_BOOKMARK,
variables: {
input: {
uuid,
instrument: root,
bookmarked
}
},
update: (store, response) => {
const query = INSTRUMENT_QUERY;
const variables = {id: root};
const data = store.readQuery({
query,
variables
});
const bookmarks = data.instrument.bookmarks;
if (bookmarked) {
bookmarks.push({
note: null,
uuid,
__typename: 'InstrumentBookmarkNode'
})
} else {
let index = bookmarks.findIndex(element => {
return element.uuid === uuid;
});
if (index > -1) {
bookmarks.splice(index, 1);
}
}
data.instrument.bookmarks = bookmarks;
store.writeQuery({
data,
query,
variables
});
},
optimisticResponse: {
__typename: 'Mutation',
updateInstrumentBookmark: {
__typename: 'UpdateInstrumentBookmarkPayload',
success: true
}
}
};
}
return mutation;
};

View File

@ -2,11 +2,15 @@
<div class="instrument"> <div class="instrument">
<h1 class="instrument__title">{{instrument.title}}</h1> <h1 class="instrument__title">{{instrument.title}}</h1>
<component v-for="component in instrument.contents" <content-component v-for="component in instrument.contents"
:key="component.id" :key="component.id"
:is="component.type" :component="component"
v-bind="component"> :root="instrument.id"
</component> :parent="instrument"
:bookmarks="instrument.bookmarks"
:notes="instrument.notes"
>
</content-component>
</div> </div>
</template> </template>
@ -14,17 +18,7 @@
<script> <script>
import INSTRUMENT_QUERY from '@/graphql/gql/instrumentQuery.gql'; import INSTRUMENT_QUERY from '@/graphql/gql/instrumentQuery.gql';
import TextBlock from '@/components/content-blocks/TextBlock'; import ContentComponent from '@/components/content-blocks/ContentComponent';
import InstrumentWidget from '@/components/content-blocks/InstrumentWidget';
import ImageBlock from '@/components/content-blocks/ImageBlock';
import ImageUrlBlock from '@/components/content-blocks/ImageUrlBlock';
import VideoBlock from '@/components/content-blocks/VideoBlock';
import LinkBlock from '@/components/content-blocks/LinkBlock';
import DocumentBlock from '@/components/content-blocks/DocumentBlock';
import SectionTitleBlock from '@/components/content-blocks/SectionTitleBlock';
import SubtitleBlock from '@/components/content-blocks/SubtitleBlock';
import GeniallyBlock from '@/components/content-blocks/GeniallyBlock';
import ThinglinkBlock from '@/components/content-blocks/ThinglinkBlock';
export default { export default {
apollo: { apollo: {
@ -39,18 +33,7 @@
}, },
components: { components: {
'text_block': TextBlock, ContentComponent
'basic_knowledge': InstrumentWidget, // for legacy
'instrument': InstrumentWidget,
'image_block': ImageBlock,
'image_url_block': ImageUrlBlock,
'video_block': VideoBlock,
'link_block': LinkBlock,
'document_block': DocumentBlock,
'section_title': SectionTitleBlock,
'subtitle': SubtitleBlock,
'genially_block': GeniallyBlock,
'thinglink_block': ThinglinkBlock
}, },
data() { data() {

View File

@ -6,9 +6,10 @@ from graphene import relay
from graphql_relay import from_global_id from graphql_relay import from_global_id
from api.utils import get_object from api.utils import get_object
from basicknowledge.models import BasicKnowledge
from books.models import ContentBlock, Chapter, Module from books.models import ContentBlock, Chapter, Module
from notes.inputs import AddNoteArgument, UpdateNoteArgument from notes.inputs import AddNoteArgument, UpdateNoteArgument
from notes.models import ContentBlockBookmark, Note, ChapterBookmark, ModuleBookmark from notes.models import ContentBlockBookmark, Note, ChapterBookmark, ModuleBookmark, InstrumentBookmark
from notes.schema import NoteNode from notes.schema import NoteNode
@ -172,9 +173,43 @@ class UpdateModuleBookmark(relay.ClientIDMutation):
return cls(success=True) return cls(success=True)
class UpdateInstrumentBookmark(relay.ClientIDMutation):
class Input:
uuid = graphene.UUID(required=True)
instrument = graphene.ID(required=True)
bookmarked = graphene.Boolean(required=True)
success = graphene.Boolean()
@classmethod
def mutate_and_get_payload(cls, root, info, **kwargs):
user = info.context.user
instrument_id = kwargs.get('instrument')
uuid = kwargs.get('uuid')
bookmarked = kwargs.get('bookmarked')
instrument = get_object(BasicKnowledge, instrument_id)
if bookmarked:
InstrumentBookmark.objects.create(
instrument=instrument,
uuid=uuid,
user=user
)
else:
InstrumentBookmark.objects.get(
instrument=instrument,
uuid=uuid,
user=user
).delete()
return cls(success=True)
class NoteMutations: class NoteMutations:
add_note = AddNote.Field() add_note = AddNote.Field()
update_note = UpdateNote.Field() update_note = UpdateNote.Field()
update_content_bookmark = UpdateContentBookmark.Field() update_content_bookmark = UpdateContentBookmark.Field()
update_chapter_bookmark = UpdateChapterBookmark.Field() update_chapter_bookmark = UpdateChapterBookmark.Field()
update_module_bookmark = UpdateModuleBookmark.Field() update_module_bookmark = UpdateModuleBookmark.Field()
update_instrument_bookmark = UpdateInstrumentBookmark.Field()