schlechtenburg/src/components/Schlechtenburg.tsx

85 lines
1.8 KiB
TypeScript
Raw Normal View History

2020-05-20 14:21:08 +00:00
import {
defineComponent,
2020-05-24 15:33:25 +00:00
provide,
2020-05-20 14:21:08 +00:00
reactive,
2020-05-24 15:33:25 +00:00
ref,
PropType,
2020-05-20 14:21:08 +00:00
} from '@vue/composition-api';
2020-05-24 15:33:25 +00:00
import {
model,
ActiveBlock,
2020-05-27 15:06:14 +00:00
Block,
2020-05-27 13:57:57 +00:00
SbMode,
Mode,
2020-05-24 15:33:25 +00:00
BlockDefinition,
BlockLibraryDefinition,
BlockLibrary,
} from '@components/TreeElement';
import SbBlock from '@internal/Block';
2020-05-20 14:21:08 +00:00
2020-05-24 20:00:14 +00:00
import SbLayout from '@user/Layout/index';
import SbParagraph from '@user/Paragraph/index';
import SbImage from '@user/Image/index';
import SbHeading from '@user/Heading/index';
2020-05-27 13:57:57 +00:00
import './Schlechtenburg.scss';
2020-05-25 21:10:21 +00:00
export interface SchlechtenburgProps {
customBlocks: BlockDefinition[];
2020-05-27 15:06:14 +00:00
eventUpdate: (b: Block) => void;
block: Block;
2020-05-27 13:57:57 +00:00
mode: SbMode;
2020-05-25 21:10:21 +00:00
}
2020-05-20 14:21:08 +00:00
export default defineComponent({
name: 'schlechtenburg-main',
model,
props: {
2020-05-27 13:57:57 +00:00
customBlocks: { type: Array as PropType<BlockDefinition[]>, default: () => [] },
2020-05-27 15:06:14 +00:00
block: { type: Object as PropType<Block>, required: true },
eventUpdate: { type: Function, default: () => {} },
2020-05-27 13:57:57 +00:00
mode: {
type: String,
validator(value: string) {
return ['edit', 'display'].includes(value);
},
default: 'edit',
},
2020-05-20 14:21:08 +00:00
},
2020-05-27 15:06:14 +00:00
setup(props: SchlechtenburgProps) {
2020-05-27 13:57:57 +00:00
const mode = ref(props.mode);
provide(Mode, mode);
2020-05-24 15:33:25 +00:00
const activeBlock = ref(null);
provide(ActiveBlock, activeBlock);
2020-05-20 14:21:08 +00:00
2020-05-24 15:33:25 +00:00
const blockLibrary: BlockLibraryDefinition = reactive({
2020-05-24 20:00:14 +00:00
'sb-layout': SbLayout,
'sb-image': SbImage,
'sb-paragraph': SbParagraph,
'sb-heading': SbHeading,
2020-05-24 15:33:25 +00:00
...props.customBlocks.reduce(
(
2020-05-25 21:10:21 +00:00
blocks,
block,
2020-05-24 15:33:25 +00:00
) => ({ ...blocks, [block.name]: block }),
{},
),
});
provide(BlockLibrary, blockLibrary);
2020-05-20 14:21:08 +00:00
2020-05-25 21:10:21 +00:00
return () => (
2020-05-27 13:57:57 +00:00
<div class="sb-main">
<SbBlock
block={props.block}
eventUpdate={props.eventUpdate}
/>
</div>
2020-05-20 14:21:08 +00:00
);
},
});