schlechtenburg/packages/core/lib/components/BlockOrdering.tsx

65 lines
1.7 KiB
TypeScript
Raw Normal View History

2020-12-30 20:17:34 +00:00
import { debounce } from 'lodash-es';
2020-05-28 20:16:35 +00:00
import {
watch,
reactive,
computed,
2020-12-30 01:32:46 +00:00
defineComponent,
2020-12-27 21:32:43 +00:00
} from 'vue';
2020-12-30 13:34:23 +00:00
import { useBlockSizing } from '../use-resize-observer';
2020-05-28 20:16:35 +00:00
2020-12-30 20:17:34 +00:00
import { SbButton } from './Button';
2020-05-28 20:16:35 +00:00
import './BlockOrdering.scss';
2020-12-30 13:34:23 +00:00
export const SbBlockOrdering = defineComponent({
2020-05-28 20:16:35 +00:00
name: 'sb-block-ordering',
props: {
sortable: {
type: String,
default: null,
},
2021-02-22 18:13:37 +00:00
onRemove: { type: Function, default: () => {} },
onMoveUp: { type: Function, default: () => {} },
onMoveDown: { type: Function, default: () => {} },
2020-05-28 20:16:35 +00:00
},
setup(props) {
const styles = reactive({
top: '',
right: '',
});
const classes = computed(() => ({
'sb-block-ordering': true,
[`sb-block-ordering_${props.sortable}`]: !!props.sortable,
}));
const { editorDimensions, blockDimensions } = useBlockSizing();
const resetStyles = debounce(() => {
if (!editorDimensions.value || !blockDimensions.value) {
return;
}
const right = editorDimensions.value.width - blockDimensions.value.left;
styles.top = `${blockDimensions.value.top}px`;
styles.right = `${right}px`;
});
watch(editorDimensions, resetStyles);
watch(blockDimensions, resetStyles);
watch(() => props.sortable, resetStyles);
return () => (
<div
class={classes.value}
style={styles}
2020-05-28 20:55:03 +00:00
onClick={($event: MouseEvent) => $event.stopPropagation()}
2020-05-28 20:16:35 +00:00
>
2021-02-22 18:13:37 +00:00
<SbButton onClick={props.onMoveUp}>{props.sortable === 'vertical' ? '↑' : '←'}</SbButton>
<SbButton onClick={props.onRemove}>x</SbButton>
<SbButton onClick={props.onMoveDown}>{props.sortable === 'vertical' ? '↓' : '→'}</SbButton>
2020-05-28 20:16:35 +00:00
</div>
);
},
});