diff --git a/client/src/components/AssignmentWithSubmissions.vue b/client/src/components/AssignmentWithSubmissions.vue index b9c8545c..186b4c57 100644 --- a/client/src/components/AssignmentWithSubmissions.vue +++ b/client/src/components/AssignmentWithSubmissions.vue @@ -1,13 +1,15 @@ @@ -19,6 +21,11 @@ components: { StudentSubmission + }, + methods: { + submissionLink(submission) { + return `/submission/${submission.id}` + } } } diff --git a/client/src/components/StudentSubmission.vue b/client/src/components/StudentSubmission.vue index f4cd086f..4696d476 100644 --- a/client/src/components/StudentSubmission.vue +++ b/client/src/components/StudentSubmission.vue @@ -4,7 +4,7 @@ {{name}}
- {{submission.text}} + {{submission.text | trimToLength(50)}}
@@ -18,6 +18,21 @@ return this.submission && this.submission.student ? `${this.submission.student.firstName} ${this.submission.student.lastName}` : ''; } + }, + filters: { + trimToLength: function(text, numberOfChars) { + if (!text) { + return ''; + } + if (text.length <= numberOfChars) { + return text; + } + const index = text.indexOf(' ', numberOfChars - 1); + if (index === -1) { + return text; + } + return `${text.substring(0, index)}...`; + } } } diff --git a/client/src/graphql/gql/studentSubmissionQuery.gql b/client/src/graphql/gql/studentSubmissionQuery.gql new file mode 100644 index 00000000..6f60fc62 --- /dev/null +++ b/client/src/graphql/gql/studentSubmissionQuery.gql @@ -0,0 +1,14 @@ +query StudentSubmissions($id: ID!) { + studentSubmission(id: $id) { + id + text + document + student { + firstName + lastName + } + assignment { + title + } + } +} diff --git a/client/src/pages/studentSubmission.vue b/client/src/pages/studentSubmission.vue new file mode 100644 index 00000000..1ea96856 --- /dev/null +++ b/client/src/pages/studentSubmission.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/client/src/router/index.js b/client/src/router/index.js index 838ef557..6e735003 100644 --- a/client/src/router/index.js +++ b/client/src/router/index.js @@ -14,6 +14,7 @@ import basicknowledge from '@/pages/basicknowledge' import submissions from '@/pages/submissions' import p404 from '@/pages/p404' import start from '@/pages/start' +import submission from '@/pages/studentSubmission' const routes = [ {path: '/', component: start, meta: {layout: 'blank'}}, @@ -43,6 +44,7 @@ const routes = [ {path: '/room/:slug', name: 'room', component: room, props: true}, {path: '/article/:slug', name: 'article', component: article, meta: {layout: 'simple'}}, {path: '/basic-knowledge', name: 'basic-knowledge', component: basicknowledge, meta: {layout: 'simple'}}, + {path: '/submission/:id', name: 'submission', component: submission}, { path: '/book', name: 'book', diff --git a/server/api/schema.py b/server/api/schema.py index 274a43b5..14aaabe9 100644 --- a/server/api/schema.py +++ b/server/api/schema.py @@ -6,7 +6,7 @@ from graphene_django.debug import DjangoDebug # noinspection PyUnresolvedReferences from api import graphene_wagtail # Keep this import exactly here, it's necessary for StreamField conversion from assignments.schema.mutations import AssignmentMutations -from assignments.schema.queries import AssignmentsQuery +from assignments.schema.queries import AssignmentsQuery, StudentSubmissionQuery from books.schema.mutations.main import BookMutations from books.schema.queries import BookQuery from objectives.mutations import ObjectiveMutations @@ -16,7 +16,8 @@ from rooms.schema import RoomsQuery from users.schema import UsersQuery -class Query(UsersQuery, RoomsQuery, ObjectivesQuery, BookQuery, AssignmentsQuery, graphene.ObjectType): +class Query(UsersQuery, RoomsQuery, ObjectivesQuery, BookQuery, AssignmentsQuery, StudentSubmissionQuery, + graphene.ObjectType): node = relay.Node.Field() if settings.DEBUG: diff --git a/server/assignments/schema/queries.py b/server/assignments/schema/queries.py index 7a77a920..5cccf6ad 100644 --- a/server/assignments/schema/queries.py +++ b/server/assignments/schema/queries.py @@ -1,9 +1,14 @@ from graphene import relay from graphene_django.filter import DjangoFilterConnectionField -from assignments.schema.types import AssignmentNode +from assignments.schema.types import AssignmentNode, StudentSubmissionNode class AssignmentsQuery(object): assignment = relay.Node.Field(AssignmentNode) assignments = DjangoFilterConnectionField(AssignmentNode) + + +class StudentSubmissionQuery(object): + studentSubmission = relay.Node.Field(StudentSubmissionNode) +