2020-05-20 14:21:08 +00:00
|
|
|
import {
|
|
|
|
reactive,
|
2020-05-24 15:33:25 +00:00
|
|
|
computed,
|
2020-05-20 14:21:08 +00:00
|
|
|
defineComponent,
|
2020-05-24 15:33:25 +00:00
|
|
|
watch,
|
2020-05-24 20:00:14 +00:00
|
|
|
PropType,
|
2020-05-20 14:21:08 +00:00
|
|
|
} from '@vue/composition-api';
|
|
|
|
import {
|
|
|
|
model,
|
2020-05-24 15:33:25 +00:00
|
|
|
blockProps,
|
|
|
|
useDynamicBlocks,
|
|
|
|
useActivation,
|
|
|
|
BlockData,
|
2020-05-24 20:00:14 +00:00
|
|
|
BlockDefinition,
|
2020-05-20 14:21:08 +00:00
|
|
|
} from '@components/TreeElement';
|
2020-05-25 18:07:34 +00:00
|
|
|
|
|
|
|
import SbBlock from '@internal/Block';
|
|
|
|
import SbToolbar from '@internal/Toolbar';
|
|
|
|
import SbBlockPlaceholder from '@internal/BlockPlaceholder';
|
|
|
|
|
2020-05-24 20:00:14 +00:00
|
|
|
import {
|
|
|
|
LayoutData,
|
|
|
|
LayoutProps,
|
|
|
|
getDefaultData,
|
|
|
|
} from './util';
|
2020-05-20 14:21:08 +00:00
|
|
|
|
2020-05-24 20:00:14 +00:00
|
|
|
import './style.scss';
|
2020-05-20 14:21:08 +00:00
|
|
|
|
|
|
|
export default defineComponent({
|
2020-05-24 20:00:14 +00:00
|
|
|
name: 'sb-layout-edit',
|
2020-05-20 14:21:08 +00:00
|
|
|
|
|
|
|
model,
|
|
|
|
|
|
|
|
props: {
|
2020-05-24 15:33:25 +00:00
|
|
|
...blockProps,
|
2020-05-24 20:00:14 +00:00
|
|
|
data: {
|
|
|
|
type: (null as unknown) as PropType<LayoutData>,
|
|
|
|
default: getDefaultData,
|
|
|
|
},
|
2020-05-20 14:21:08 +00:00
|
|
|
},
|
|
|
|
|
2020-05-24 20:00:14 +00:00
|
|
|
setup(props: LayoutProps, context) {
|
2020-05-24 15:33:25 +00:00
|
|
|
const { getBlock } = useDynamicBlocks();
|
|
|
|
const { isActive, activate } = useActivation(props.blockId);
|
2020-05-20 14:21:08 +00:00
|
|
|
|
2020-05-24 20:00:14 +00:00
|
|
|
const localData: LayoutData = reactive({
|
2020-05-24 15:33:25 +00:00
|
|
|
orientation: props.data.orientation,
|
|
|
|
children: [...props.data.children],
|
2020-05-20 14:21:08 +00:00
|
|
|
});
|
|
|
|
|
2020-05-24 15:33:25 +00:00
|
|
|
watch(() => props.data, () => {
|
|
|
|
localData.orientation = props.data.orientation;
|
|
|
|
localData.children = [...props.data.children];
|
2020-05-20 14:21:08 +00:00
|
|
|
});
|
|
|
|
|
2020-05-24 15:33:25 +00:00
|
|
|
const classes = computed(() => ({
|
2020-05-20 14:21:08 +00:00
|
|
|
'sb-layout': true,
|
|
|
|
[`sb-layout_${localData.orientation}`]: true,
|
2020-05-24 15:33:25 +00:00
|
|
|
}));
|
2020-05-20 14:21:08 +00:00
|
|
|
|
|
|
|
const toggleOrientation = () => {
|
2020-05-24 15:33:25 +00:00
|
|
|
context.emit('update', {
|
2020-05-20 14:21:08 +00:00
|
|
|
orientation: localData.orientation === 'vertical' ? 'horizontal' : 'vertical',
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
const onChildUpdate = (child, updated) => {
|
|
|
|
const index = localData.children.indexOf(child);
|
2020-05-24 15:33:25 +00:00
|
|
|
context.emit('update', {
|
2020-05-20 14:21:08 +00:00
|
|
|
children: [
|
|
|
|
...localData.children.slice(0, index),
|
2020-05-24 15:33:25 +00:00
|
|
|
{
|
|
|
|
...child,
|
|
|
|
...updated,
|
|
|
|
},
|
2020-05-20 14:21:08 +00:00
|
|
|
...localData.children.slice(index + 1),
|
|
|
|
],
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2020-05-24 15:33:25 +00:00
|
|
|
const appendBlock = (block: BlockData) => {
|
|
|
|
context.emit('update', {
|
2020-05-20 14:21:08 +00:00
|
|
|
children: [
|
|
|
|
...localData.children,
|
|
|
|
block,
|
|
|
|
],
|
|
|
|
});
|
2020-05-24 20:39:14 +00:00
|
|
|
activate(block.blockId);
|
2020-05-20 14:21:08 +00:00
|
|
|
};
|
|
|
|
|
2020-05-24 15:33:25 +00:00
|
|
|
const insertBlock = (index: number, block: BlockData) => {
|
|
|
|
context.emit('update', {
|
|
|
|
children: [
|
|
|
|
...localData.children.slice(0, index + 1),
|
|
|
|
block,
|
|
|
|
...localData.children.slice(index + 1),
|
|
|
|
],
|
|
|
|
});
|
2020-05-24 20:39:14 +00:00
|
|
|
activate(block.blockId);
|
2020-05-24 15:33:25 +00:00
|
|
|
};
|
|
|
|
|
2020-05-20 14:21:08 +00:00
|
|
|
return {
|
2020-05-24 15:33:25 +00:00
|
|
|
isActive,
|
|
|
|
activate,
|
|
|
|
|
2020-05-20 14:21:08 +00:00
|
|
|
classes,
|
|
|
|
onChildUpdate,
|
|
|
|
toggleOrientation,
|
|
|
|
localData,
|
2020-05-24 15:33:25 +00:00
|
|
|
getBlock,
|
|
|
|
appendBlock,
|
|
|
|
insertBlock,
|
2020-05-20 14:21:08 +00:00
|
|
|
};
|
|
|
|
},
|
|
|
|
|
|
|
|
render() {
|
2020-05-24 15:33:25 +00:00
|
|
|
console.log('render layout');
|
2020-05-20 14:21:08 +00:00
|
|
|
return (
|
2020-05-24 15:33:25 +00:00
|
|
|
<div class={this.classes}>
|
2020-05-20 14:21:08 +00:00
|
|
|
<SbToolbar slot="toolbar">
|
|
|
|
<button
|
|
|
|
type="button"
|
|
|
|
{...{
|
|
|
|
on: {
|
|
|
|
click: this.toggleOrientation,
|
|
|
|
},
|
|
|
|
}}
|
2020-05-24 15:33:25 +00:00
|
|
|
>{this.localData.orientation}</button>
|
2020-05-20 14:21:08 +00:00
|
|
|
</SbToolbar>
|
|
|
|
|
2020-05-24 15:33:25 +00:00
|
|
|
{...this.localData.children.map((child, index) => (
|
|
|
|
<SbBlock
|
2020-05-20 14:21:08 +00:00
|
|
|
key={child.id}
|
2020-05-24 15:33:25 +00:00
|
|
|
block={child}
|
2020-05-20 14:21:08 +00:00
|
|
|
{...{
|
|
|
|
on: {
|
2020-05-24 15:33:25 +00:00
|
|
|
update: (updated) => this.onChildUpdate(child, updated),
|
|
|
|
'insert-block': (block: BlockDefinition) => this.insertBlock(index, block),
|
|
|
|
'append-block': this.appendBlock,
|
2020-05-20 14:21:08 +00:00
|
|
|
},
|
|
|
|
}}
|
2020-05-24 15:33:25 +00:00
|
|
|
/>
|
|
|
|
))}
|
|
|
|
|
2020-05-20 14:21:08 +00:00
|
|
|
<SbBlockPlaceholder
|
|
|
|
{...{
|
|
|
|
on: {
|
2020-05-24 15:33:25 +00:00
|
|
|
'insert-block': this.appendBlock,
|
2020-05-20 14:21:08 +00:00
|
|
|
},
|
|
|
|
}}
|
|
|
|
/>
|
2020-05-24 15:33:25 +00:00
|
|
|
</div>
|
2020-05-20 14:21:08 +00:00
|
|
|
);
|
|
|
|
},
|
|
|
|
});
|