Add initial frontend implementation for spell checks
This commit is contained in:
parent
bdda817533
commit
7f71977523
|
|
@ -13,20 +13,25 @@
|
||||||
@saveInput="saveInput"
|
@saveInput="saveInput"
|
||||||
@reopen="reopen"
|
@reopen="reopen"
|
||||||
@changeDocumentUrl="changeDocumentUrl"
|
@changeDocumentUrl="changeDocumentUrl"
|
||||||
|
@spellcheck="spellcheck"
|
||||||
:user-input="submission"
|
:user-input="submission"
|
||||||
placeholder="Ergebnis erfassen"
|
placeholder="Ergebnis erfassen"
|
||||||
action="Ergebnis mit Lehrperson teilen"
|
action="Ergebnis mit Lehrperson teilen"
|
||||||
shared-msg="Das Ergebnis wurde mit der Lehrperson geteilt."
|
shared-msg="Das Ergebnis wurde mit der Lehrperson geteilt."
|
||||||
:saved="!unsaved"
|
:saved="!unsaved"
|
||||||
>
|
:spellcheck="true"
|
||||||
|
>
|
||||||
</submission-form>
|
</submission-form>
|
||||||
|
|
||||||
|
<div v-html="corrections"></div>
|
||||||
|
|
||||||
<div v-if="this.assignment.submission.submissionFeedback" class="assignment__feedback">
|
<div v-if="this.assignment.submission.submissionFeedback" class="assignment__feedback">
|
||||||
<p>{{feedbackText}}</p>
|
<p>{{feedbackText}}</p>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template v-if="!isStudent">
|
<template v-if="!isStudent">
|
||||||
<router-link class="button button--primary" :to="{name: 'submissions', params: { id: assignment.id }}">Zu den Ergebnissen
|
<router-link class="button button--primary" :to="{name: 'submissions', params: { id: assignment.id }}">Zu den
|
||||||
|
Ergebnissen
|
||||||
</router-link>
|
</router-link>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -38,6 +43,7 @@
|
||||||
import ME_QUERY from '@/graphql/gql/meQuery.gql';
|
import ME_QUERY from '@/graphql/gql/meQuery.gql';
|
||||||
import UPDATE_ASSIGNMENT_MUTATION from '@/graphql/gql/mutations/updateAssignmentMutation.gql';
|
import UPDATE_ASSIGNMENT_MUTATION from '@/graphql/gql/mutations/updateAssignmentMutation.gql';
|
||||||
import UPDATE_ASSIGNMENT_MUTATION_WITH_SUCCESS from '@/graphql/gql/mutations/updateAssignmentMutationWithSuccess.gql';
|
import UPDATE_ASSIGNMENT_MUTATION_WITH_SUCCESS from '@/graphql/gql/mutations/updateAssignmentMutationWithSuccess.gql';
|
||||||
|
import SPELL_CHECK_MUTATION from '@/graphql/gql/mutations/spellCheck.gql';
|
||||||
import debounce from 'lodash/debounce';
|
import debounce from 'lodash/debounce';
|
||||||
import cloneDeep from 'lodash/cloneDeep'
|
import cloneDeep from 'lodash/cloneDeep'
|
||||||
|
|
||||||
|
|
@ -178,6 +184,31 @@
|
||||||
final: false,
|
final: false,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
spellcheck() {
|
||||||
|
let self = this;
|
||||||
|
this.$apollo.mutate({
|
||||||
|
mutation: SPELL_CHECK_MUTATION,
|
||||||
|
variables: {
|
||||||
|
input: {
|
||||||
|
assignment: 'Hallo',
|
||||||
|
text: this.assignment.submission.text
|
||||||
|
}
|
||||||
|
},
|
||||||
|
update(store, {data: {spellCheck: {correct, results}}}) {
|
||||||
|
console.log(results);
|
||||||
|
console.log(correct);
|
||||||
|
let corrections = results.map(result => {
|
||||||
|
let first, middle, last;
|
||||||
|
first = result.sentence.substring(0, result.offset);
|
||||||
|
middle = result.sentence.substring(result.offset, result.offset + result.length);
|
||||||
|
last = result.sentence.substring(result.offset + result.length);
|
||||||
|
|
||||||
|
return `<p>${first}<span class="taskbase__correction">${middle}</span>${last}</p>`;
|
||||||
|
});
|
||||||
|
self.corrections = corrections.join('');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
apollo: {
|
apollo: {
|
||||||
|
|
@ -212,7 +243,8 @@
|
||||||
},
|
},
|
||||||
inputType: 'text',
|
inputType: 'text',
|
||||||
unsaved: false,
|
unsaved: false,
|
||||||
saving: 0
|
saving: 0,
|
||||||
|
corrections: ''
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -258,6 +290,7 @@
|
||||||
&__feedback {
|
&__feedback {
|
||||||
margin-top: $medium-spacing;
|
margin-top: $medium-spacing;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
|
|
@ -1,44 +1,49 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="feedback__submission submission-form-container">
|
<div class="feedback__submission submission-form-container">
|
||||||
<div class="submission-form-container__inputs">
|
<div class="submission-form-container__inputs">
|
||||||
<submission-input
|
<submission-input
|
||||||
@input="saveInput"
|
@input="saveInput"
|
||||||
:input-text="userInput.text"
|
:input-text="userInput.text"
|
||||||
:saved="saved"
|
:saved="saved"
|
||||||
:final="final"
|
:final="final"
|
||||||
:placeholder="placeholder"
|
:placeholder="placeholder"
|
||||||
:reopen="reopenSubmission"
|
:reopen="reopenSubmission"
|
||||||
></submission-input>
|
></submission-input>
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="submission-form-container__actions" v-if="!final">
|
|
||||||
<button class="submission-form-container__submit button button--primary button--white-bg"
|
|
||||||
@click="$emit('turnIn')"
|
|
||||||
>{{action}}
|
|
||||||
</button>
|
|
||||||
<div v-if="userInput.document">
|
|
||||||
<document-block
|
|
||||||
:value="{url: userInput.document}"
|
|
||||||
show-trash-icon
|
|
||||||
v-on:trash="changeDocumentUrl('')"
|
|
||||||
></document-block>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<simple-file-upload
|
|
||||||
v-if="allowsDocuments"
|
|
||||||
v-on:link-change-url="changeDocumentUrl"
|
|
||||||
:value="userInput.document"
|
|
||||||
class="submission-form-container__document"
|
|
||||||
></simple-file-upload>
|
|
||||||
<slot></slot>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<final-submission
|
|
||||||
v-if="final"
|
|
||||||
:user-input="userInput"
|
|
||||||
:shared-msg="sharedMsg"
|
|
||||||
@reopen="$emit('reopen')"></final-submission>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="submission-form-container__actions" v-if="!final">
|
||||||
|
<button class="submission-form-container__submit button button--primary button--white-bg"
|
||||||
|
@click="$emit('turnIn')"
|
||||||
|
>{{action}}
|
||||||
|
</button>
|
||||||
|
<button class="submission-form-container__submit button button--primary button--white-bg"
|
||||||
|
v-if="spellcheck"
|
||||||
|
@click="$emit('spellcheck')"
|
||||||
|
>Rechtschreibung prüfen
|
||||||
|
</button>
|
||||||
|
<div v-if="userInput.document">
|
||||||
|
<document-block
|
||||||
|
:value="{url: userInput.document}"
|
||||||
|
show-trash-icon
|
||||||
|
v-on:trash="changeDocumentUrl('')"
|
||||||
|
></document-block>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<simple-file-upload
|
||||||
|
v-if="allowsDocuments"
|
||||||
|
v-on:link-change-url="changeDocumentUrl"
|
||||||
|
:value="userInput.document"
|
||||||
|
class="submission-form-container__document"
|
||||||
|
></simple-file-upload>
|
||||||
|
<slot></slot>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<final-submission
|
||||||
|
v-if="final"
|
||||||
|
:user-input="userInput"
|
||||||
|
:shared-msg="sharedMsg"
|
||||||
|
@reopen="$emit('reopen')"></final-submission>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|
@ -62,6 +67,10 @@
|
||||||
action: String,
|
action: String,
|
||||||
reopen: Function,
|
reopen: Function,
|
||||||
document: String,
|
document: String,
|
||||||
|
spellcheck: {
|
||||||
|
tyoe: Boolean,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
sharedMsg: String
|
sharedMsg: String
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
@ -90,34 +99,34 @@
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
@import '@/styles/_mixins.scss';
|
@import '@/styles/_mixins.scss';
|
||||||
|
|
||||||
.submission-form-container {
|
.submission-form-container {
|
||||||
|
|
||||||
@include input-box-shadow;
|
@include input-box-shadow;
|
||||||
background-color: $color-white;
|
background-color: $color-white;
|
||||||
border-radius: $input-border-radius;
|
border-radius: $input-border-radius;
|
||||||
border: 1px solid $color-silver;
|
border: 1px solid $color-silver;
|
||||||
padding: $medium-spacing;
|
padding: $medium-spacing;
|
||||||
|
|
||||||
&__inputs {
|
&__inputs {
|
||||||
margin-bottom: 12px;
|
margin-bottom: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
&__submit {
|
&__submit {
|
||||||
margin-right: $medium-spacing;
|
margin-right: $medium-spacing;
|
||||||
}
|
}
|
||||||
|
|
||||||
&__actions {
|
&__actions {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
&__document {
|
&__document {
|
||||||
&:hover {
|
&:hover {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
mutation SpellCheck($input: SpellCheckInput!) {
|
||||||
|
spellCheck(input: $input) {
|
||||||
|
correct
|
||||||
|
results {
|
||||||
|
sentence
|
||||||
|
offset
|
||||||
|
length
|
||||||
|
affected
|
||||||
|
corrected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
.taskbase {
|
||||||
|
&__correction {
|
||||||
|
background: yellow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -22,3 +22,4 @@
|
||||||
@import "public-page";
|
@import "public-page";
|
||||||
@import "student-submission";
|
@import "student-submission";
|
||||||
@import "module-activity";
|
@import "module-activity";
|
||||||
|
@import "taskbase";
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue