feat: assignments list and form
This commit is contained in:
80
frontend/src/utils/assignment.js
Normal file
80
frontend/src/utils/assignment.js
Normal file
@@ -0,0 +1,80 @@
|
||||
import { Pencil } from 'lucide-vue-next'
|
||||
import { createApp, h } from 'vue'
|
||||
import AssessmentPlugin from '@/components/AssessmentPlugin.vue'
|
||||
import translationPlugin from '../translation'
|
||||
import { usersStore } from '../stores/user'
|
||||
|
||||
export class Assignment {
|
||||
constructor({ data, api, readOnly }) {
|
||||
this.data = data
|
||||
this.readOnly = readOnly
|
||||
}
|
||||
|
||||
static get toolbox() {
|
||||
const app = createApp({
|
||||
render: () =>
|
||||
h(Pencil, { size: 18, strokeWidth: 1.5, color: 'black' }),
|
||||
})
|
||||
|
||||
const div = document.createElement('div')
|
||||
app.mount(div)
|
||||
|
||||
return {
|
||||
title: __('Assignment'),
|
||||
icon: div.innerHTML,
|
||||
}
|
||||
}
|
||||
|
||||
static get isReadOnlySupported() {
|
||||
return true
|
||||
}
|
||||
|
||||
render() {
|
||||
this.wrapper = document.createElement('div')
|
||||
if (Object.keys(this.data).length) {
|
||||
this.renderAssignment(this.data.assignment)
|
||||
} else {
|
||||
this.renderAssignmentModal()
|
||||
}
|
||||
return this.wrapper
|
||||
}
|
||||
|
||||
renderAssignment(assignment) {
|
||||
if (this.readOnly) {
|
||||
const app = createApp(AssignmentBlock, {
|
||||
assignment: assignment,
|
||||
})
|
||||
app.use(translationPlugin)
|
||||
const { userResource } = usersStore()
|
||||
app.provide('$user', userResource)
|
||||
app.mount(this.wrapper)
|
||||
return
|
||||
}
|
||||
this.wrapper.innerHTML = `<div class='border rounded-md p-10 text-center bg-gray-50 mb-2'>
|
||||
<span class="font-medium">
|
||||
Assignment: ${assignment}
|
||||
</span>
|
||||
</div>`
|
||||
return
|
||||
}
|
||||
|
||||
renderAssignmentModal() {
|
||||
if (this.readOnly) {
|
||||
return
|
||||
}
|
||||
const app = createApp(AssessmentPlugin, {
|
||||
onAddition: (assignment) => {
|
||||
this.data.assignment = assignment
|
||||
this.renderAssignment(assignment)
|
||||
},
|
||||
})
|
||||
app.use(translationPlugin)
|
||||
app.mount(this.wrapper)
|
||||
}
|
||||
|
||||
save(blockContent) {
|
||||
return {
|
||||
assignment: this.data.assignment,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
import { toast } from 'frappe-ui'
|
||||
import { useTimeAgo } from '@vueuse/core'
|
||||
import { Quiz } from '@/utils/quiz'
|
||||
import { Assignment } from '@/utils/Assignment'
|
||||
import { Upload } from '@/utils/upload'
|
||||
import { Markdown } from '@/utils/markdownParser'
|
||||
import Header from '@editorjs/header'
|
||||
@@ -155,6 +156,7 @@ export function getEditorTools() {
|
||||
},
|
||||
},
|
||||
quiz: Quiz,
|
||||
assignment: Assignment,
|
||||
upload: Upload,
|
||||
markdown: Markdown,
|
||||
image: SimpleImage,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import QuizBlock from '@/components/QuizBlock.vue'
|
||||
import QuizPlugin from '@/components/QuizPlugin.vue'
|
||||
import AssessmentPlugin from '@/components/AssessmentPlugin.vue'
|
||||
import { createApp, h } from 'vue'
|
||||
import { usersStore } from '../stores/user'
|
||||
import translationPlugin from '../translation'
|
||||
@@ -63,8 +63,8 @@ export class Quiz {
|
||||
if (this.readOnly) {
|
||||
return
|
||||
}
|
||||
const app = createApp(QuizPlugin, {
|
||||
onQuizAddition: (quiz) => {
|
||||
const app = createApp(AssessmentPlugin, {
|
||||
onAddition: (quiz) => {
|
||||
this.data.quiz = quiz
|
||||
this.renderQuiz(quiz)
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user