Add room entry edit mask

This commit is contained in:
Ramon Wenger 2018-10-30 11:57:41 +01:00
parent c536a04122
commit 5b50e497c9
8 changed files with 120 additions and 11 deletions

View File

@ -13,6 +13,7 @@
import NewContentBlockWizard from '@/components/content-block-form/NewContentBlockWizard';
import EditContentBlockWizard from '@/components/content-block-form/EditContentBlockWizard';
import NewRoomEntryWizard from '@/components/rooms/room-entries/NewRoomEntryWizard';
import EditRoomEntryWizard from '@/components/rooms/room-entries/EditRoomEntryWizard';
export default {
name: 'App',
@ -24,7 +25,8 @@
Modal,
NewContentBlockWizard,
EditContentBlockWizard,
NewRoomEntryWizard
NewRoomEntryWizard,
EditRoomEntryWizard
},
computed: {

View File

@ -6,6 +6,7 @@
</a>
<widget-popover entity="Eintrag"
@delete="deleteRoomEntry"
@edit="editRoomEntry"
@hide-me="showMenu = false"
:id="id"
class="room-entry__popover"

View File

@ -0,0 +1,63 @@
<template>
<contents-form
v-if="entry.id"
:content-block="entry"
:show-task-selection="false"
@save="saveEntry"
block-type="RoomEntry"
@hide="hideModal"
></contents-form>
</template>
<script>
import UPDATE_ROOM_ENTRY_MUTATION from '@/graphql/gql/mutations/updateRoomEntry.gql';
import ROOM_ENTRY_QUERY from '@/graphql/gql/roomEntryByIdQuery.gql';
import ContentsForm from '@/components/content-block-form/ContentsForm';
export default {
components: {
ContentsForm
},
data() {
return {
entry: {}
}
},
apollo: {
entry() {
return {
query: ROOM_ENTRY_QUERY,
variables: {
id: this.$store.state.currentRoomEntry
},
update(data) {
return data.roomEntry;
}
}
}
},
computed: {},
methods: {
saveEntry(entry) {
this.$apollo.mutate({
mutation: UPDATE_ROOM_ENTRY_MUTATION,
variables: {
input: {
roomEntry: entry
}
}
}).then(() => {
this.hideModal();
});
},
hideModal() {
this.$store.dispatch('hideModal');
},
}
}
</script>

View File

@ -0,0 +1,9 @@
#import "../fragments/roomEntryParts.gql"
mutation UpdateRoomEntry($input: UpdateRoomEntryInput!){
updateRoomEntry(input: $input) {
roomEntry {
...RoomEntryParts
}
errors
}
}

View File

@ -0,0 +1,6 @@
#import "./fragments/roomEntryParts.gql"
query RoomEntryQuery($id: ID!) {
roomEntry(id: $id) {
...RoomEntryParts
}
}

View File

@ -13,6 +13,7 @@ export default new Vuex.Store({
scrollPosition: 0,
filterForSchoolClass: '',
currentContentBlock: '',
currentRoomEntry: '',
parentRoom: null
},
@ -44,6 +45,10 @@ export default new Vuex.Store({
commit('setParentRoom', payload);
dispatch('showModal', 'new-room-entry-wizard');
},
editRoomEntry({commit, dispatch}, payload) {
commit('setCurrentRoomEntry', payload);
dispatch('showModal', 'edit-room-entry-wizard');
},
showModal({commit}, payload) {
document.body.classList.add('no-scroll'); // won't get at the body any other way
commit('setModal', payload);
@ -77,6 +82,9 @@ export default new Vuex.Store({
},
setParentRoom(state, payload) {
state.parentRoom = payload;
},
setCurrentRoomEntry(state, payload) {
state.currentRoomEntry = payload;
}
}
})

View File

@ -20,8 +20,15 @@ class UpdateRoomArgument(RoomInput):
id = graphene.ID(required=True)
class AddRoomEntryArgument(InputObjectType):
class RoomEntryArgument(InputObjectType):
title = graphene.String(required=True)
subtitle = graphene.String()
contents = graphene.List(ContentElementInput)
class AddRoomEntryArgument(RoomEntryArgument):
room = graphene.ID(required=True)
class UpdateRoomEntryArgument(RoomEntryArgument):
id = graphene.ID(required=True)

View File

@ -1,9 +1,9 @@
import graphene
from graphene import relay
from graphql_relay import to_global_id
from graphql_relay import to_global_id, from_global_id
from api.utils import get_object
from rooms.inputs import UpdateRoomArgument, AddRoomArgument, AddRoomEntryArgument
from rooms.inputs import UpdateRoomArgument, AddRoomArgument, AddRoomEntryArgument, UpdateRoomEntryArgument
from rooms.models import Room, RoomEntry
from rooms.schema import RoomNode, RoomEntryNode
from rooms.serializers import RoomSerializer, RoomEntrySerializer
@ -71,19 +71,21 @@ class DeleteRoom(relay.ClientIDMutation):
return cls(success=True)
class AddRoomEntry(relay.ClientIDMutation):
class Input:
room_entry = graphene.Argument(AddRoomEntryArgument)
class MutateRoomEntry(relay.ClientIDMutation):
room_entry = graphene.Field(RoomEntryNode)
errors = graphene.List(graphene.String)
@classmethod
def mutate_and_get_payload(cls, root, info, **kwargs):
room_entry_data = kwargs.get('room_entry')
if room_entry_data.get('room') is not None:
room_entry_data['room'] = get_object(Room, room_entry_data.get('room')).id
room_entry_data['author'] = info.context.user.pk
if room_entry_data.get('id') is not None:
instance = get_object(RoomEntry, room_entry_data.get('id'))
serializer = RoomEntrySerializer(instance, data=room_entry_data, partial=True)
else:
serializer = RoomEntrySerializer(data=room_entry_data)
if serializer.is_valid():
@ -94,6 +96,16 @@ class AddRoomEntry(relay.ClientIDMutation):
return cls(room_entry=None, errors=['{}: {}'.format(key, value) for key, value in serializer.errors.items()])
class AddRoomEntry(MutateRoomEntry):
class Input:
room_entry = graphene.Argument(AddRoomEntryArgument)
class UpdateRoomEntry(MutateRoomEntry):
class Input:
room_entry = graphene.Argument(UpdateRoomEntryArgument)
class DeleteRoomEntry(relay.ClientIDMutation):
class Input:
id = graphene.ID(required=True)
@ -121,3 +133,4 @@ class RoomMutations:
delete_room = DeleteRoom.Field()
add_room_entry = AddRoomEntry.Field()
delete_room_entry = DeleteRoomEntry.Field()
update_room_entry = UpdateRoomEntry.Field()