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

View File

@ -6,6 +6,7 @@
</a> </a>
<widget-popover entity="Eintrag" <widget-popover entity="Eintrag"
@delete="deleteRoomEntry" @delete="deleteRoomEntry"
@edit="editRoomEntry"
@hide-me="showMenu = false" @hide-me="showMenu = false"
:id="id" :id="id"
class="room-entry__popover" class="room-entry__popover"
@ -67,7 +68,7 @@
} }
}) })
}, },
editRoomEntry(id){ editRoomEntry(id) {
this.$store.dispatch('editRoomEntry', id); this.$store.dispatch('editRoomEntry', id);
} }
}, },

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

View File

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

View File

@ -1,9 +1,9 @@
import graphene import graphene
from graphene import relay 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 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.models import Room, RoomEntry
from rooms.schema import RoomNode, RoomEntryNode from rooms.schema import RoomNode, RoomEntryNode
from rooms.serializers import RoomSerializer, RoomEntrySerializer from rooms.serializers import RoomSerializer, RoomEntrySerializer
@ -71,20 +71,22 @@ class DeleteRoom(relay.ClientIDMutation):
return cls(success=True) return cls(success=True)
class AddRoomEntry(relay.ClientIDMutation): class MutateRoomEntry(relay.ClientIDMutation):
class Input:
room_entry = graphene.Argument(AddRoomEntryArgument)
room_entry = graphene.Field(RoomEntryNode) room_entry = graphene.Field(RoomEntryNode)
errors = graphene.List(graphene.String) errors = graphene.List(graphene.String)
@classmethod @classmethod
def mutate_and_get_payload(cls, root, info, **kwargs): def mutate_and_get_payload(cls, root, info, **kwargs):
room_entry_data = kwargs.get('room_entry') room_entry_data = kwargs.get('room_entry')
room_entry_data['room'] = get_object(Room, room_entry_data.get('room')).id 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 room_entry_data['author'] = info.context.user.pk
serializer = RoomEntrySerializer(data=room_entry_data) 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(): if serializer.is_valid():
serializer.save() serializer.save()
@ -94,6 +96,16 @@ class AddRoomEntry(relay.ClientIDMutation):
return cls(room_entry=None, errors=['{}: {}'.format(key, value) for key, value in serializer.errors.items()]) 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 DeleteRoomEntry(relay.ClientIDMutation):
class Input: class Input:
id = graphene.ID(required=True) id = graphene.ID(required=True)
@ -121,3 +133,4 @@ class RoomMutations:
delete_room = DeleteRoom.Field() delete_room = DeleteRoom.Field()
add_room_entry = AddRoomEntry.Field() add_room_entry = AddRoomEntry.Field()
delete_room_entry = DeleteRoomEntry.Field() delete_room_entry = DeleteRoomEntry.Field()
update_room_entry = UpdateRoomEntry.Field()