Skip to content
Snippets Groups Projects
Commit b89e1232 authored by \nrlucke's avatar \nrlucke
Browse files

fixes #120

parent 84fe37f2
No related branches found
No related tags found
No related merge requests found
......@@ -37,7 +37,7 @@ class Block extends SchemaProvider
{
return [
'position' => (int) $resource['position'],
'block-type' => (string) $resource['block_type'],
'block-type' => (string) $resource->getBlockType(),
'title' => (string) $resource->type->getTitle(),
'visible' => (bool) $resource['visible'],
'payload' => $resource->type->getPayload(),
......
......@@ -191,4 +191,16 @@ class Block extends \SimpleORMap
return $block;
}
public function getBlockType(): ?string
{
if ($this->type->findBlockType($this->block_type)) {
return $this->block_type;
} else {
$this->payload = json_encode(array(
'original_block_type' => $this->block_type
));
return 'error';
}
}
}
......@@ -160,7 +160,8 @@ abstract class BlockType
{
if (!($class = self::findBlockType($block['block_type']))) {
// TODO: Hier müsste es eine weniger allgemeine Exception geben.
throw new \RuntimeException('Invalid `block_type` attribute in database.');
// throw new \RuntimeException('Invalid `block_type` attribute in database.');
return new \Courseware\BlockTypes\Error($block);
}
return new $class($block);
......
{
"title": "Payload schema of Courseware\\BlockType\\Error",
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}
<?php
namespace Courseware\BlockTypes;
use Opis\JsonSchema\Schema;
/**
* This class represents the content of a Courseware error block.
*
* @author Ron Lucke <lucke@elan-ev.de>
* @license GPL2 or any later version
*
* @since Stud.IP 5.0
*/
class Error extends BlockType
{
public static function getType(): string
{
return 'error';
}
public static function getTitle(): string
{
return _('Fehler');
}
public static function getDescription(): string
{
return _('Zeigt eine Fehlemeldung an.');
}
public function initialPayload(): array
{
return [];
}
public static function getJsonSchema(): Schema
{
$schemaFile = __DIR__.'/Error.json';
return Schema::fromJsonString(file_get_contents($schemaFile));
}
public static function getCategories(): array
{
return [];
}
public static function getContentTypes(): array
{
return [];
}
public static function getFileTypes(): array
{
return [];
}
}
......@@ -23,6 +23,10 @@ export default {
},
props: {
canEdit: Boolean,
deleteOnly: {
type: Boolean,
default: false
},
block: Object,
},
data() {
......@@ -44,7 +48,11 @@ export default {
},
},
mounted() {
if (this.deleteOnly) {
this.menuItems = [];
}
if (this.canEdit) {
if (!this.deleteOnly) {
this.menuItems.push({ id: 1, label: this.$gettext('Block bearbeiten'), icon: 'edit', emit: 'editBlock' });
this.menuItems.push({
id: 2,
......@@ -66,6 +74,7 @@ export default {
icon: 'info',
emit: 'showInfo',
});
}
this.menuItems.push({
id: 9,
label: this.$gettext('Block löschen'),
......
<template>
<div class="cw-companion-box" :class="[mood]">
<div>
<p>{{ msgCompanion }}</p>
<p v-html="msgCompanion"></p>
<slot name="companionActions"></slot>
</div>
</div>
......
......@@ -12,6 +12,7 @@
<courseware-block-actions
:block="block"
:canEdit="canEdit"
:deleteOnly="deleteOnly"
@editBlock="displayFeature('Edit')"
@showFeedback="displayFeature('Feedback')"
@showComments="displayFeature('Comments')"
......@@ -101,9 +102,14 @@ export default {
props: {
block: Object,
canEdit: Boolean,
deleteOnly: {
type: Boolean,
default: false
},
isTeacher: Boolean,
preview: Boolean,
defaultGrade: {
type: Boolean,
default: true,
},
},
......@@ -152,7 +158,7 @@ export default {
blockTitle() {
const type = this.block.attributes['block-type'];
return this.blockTypes.find((blockType) => blockType.type === type)?.title || '';
return this.blockTypes.find((blockType) => blockType.type === type)?.title || this.$gettext('Fehler');
},
},
mounted() {
......
<template>
<div class="cw-block cw-block-error">
<courseware-default-block
:block="block"
:canEdit="canEdit"
:deleteOnly="true"
:isTeacher="isTeacher"
:preview="false"
:defaultGrade="false"
>
<template #content>
<div class="cw-block-error-content">
<courseware-companion-box
mood="sad"
:msgCompanion="errorMessage"
>
</courseware-companion-box>
</div>
</template>
</courseware-default-block>
</div>
</template>
<script>
import CoursewareDefaultBlock from './CoursewareDefaultBlock.vue';
import { blockMixin } from './block-mixin.js';
import CoursewareCompanionBox from './CoursewareCompanionBox.vue';
export default {
name: 'courseware-error-block',
mixins: [blockMixin],
components: {
CoursewareDefaultBlock,
CoursewareCompanionBox,
},
props: {
block: Object,
canEdit: Boolean,
isTeacher: Boolean,
},
computed: {
originalBlockType() {
return this.block?.attributes?.payload?.original_block_type;
},
errorMessage() {
let message = '<b>'
message += this.$gettext('Es ist ein Fehler aufgetretten! Der Block-Typ dieses Blocks ist nicht verfügbar.');
message += '</b><br>'
message += 'block_type: ' + this.originalBlockType + ' not found';
return message;
}
},
};
</script>
......@@ -13,6 +13,7 @@ import CoursewareDialogCardsBlock from './CoursewareDialogCardsBlock.vue';
import CoursewareDocumentBlock from './CoursewareDocumentBlock.vue';
import CoursewareDownloadBlock from './CoursewareDownloadBlock.vue';
import CoursewareEmbedBlock from './CoursewareEmbedBlock.vue';
import CoursewareErrorBlock from './CoursewareErrorBlock.vue';
import CoursewareFolderBlock from './CoursewareFolderBlock.vue';
import CoursewareGalleryBlock from './CoursewareGalleryBlock.vue';
import CoursewareHeadlineBlock from './CoursewareHeadlineBlock.vue';
......@@ -41,6 +42,7 @@ const ContainerComponents = {
CoursewareDocumentBlock,
CoursewareDownloadBlock,
CoursewareEmbedBlock,
CoursewareErrorBlock,
CoursewareFolderBlock,
CoursewareGalleryBlock,
CoursewareHeadlineBlock,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment