import { defineComponent, HTMLAttributes, inject, onMounted, PropType, ref } from 'vue' import useZoomPanHelper from '../../hooks/useZoomPanHelper' import { FitViewParams, RevueFlowStore, ZoomPanHelperFunctions } from '../../types' import PlusIcon from '../../../assets/icons/plus.svg' import MinusIcon from '../../../assets/icons/minus.svg' import Fitview from '../../../assets/icons/fitview.svg' import Lock from '../../../assets/icons/lock.svg' import Unlock from '../../../assets/icons/unlock.svg' export interface ControlProps extends HTMLAttributes { showZoom?: boolean showFitView?: boolean showInteractive?: boolean fitViewParams?: FitViewParams onZoomIn?: () => void onZoomOut?: () => void onFitView?: () => void onInteractiveChange?: (interactiveStatus: boolean) => void } export type ControlButtonProps = HTMLButtonElement export const ControlButton = defineComponent({ props: { disabled: { type: Boolean as PropType, required: false, default: undefined }, onClick: { type: Function as PropType<() => any>, required: false, default: undefined } }, setup(props, { slots }) { return () => ( {slots.default ? slots.default() : ''} ) } }) const Controls = defineComponent({ name: 'Controls', props: { showZoom: { type: Boolean as PropType, required: false, default: true }, showFitView: { type: Boolean as PropType, required: false, default: true }, showInteractive: { type: Boolean as PropType, required: false, default: true }, fitViewParams: { type: Object as PropType, required: false, default: undefined }, onZoomIn: { type: Function() as PropType, required: false, default: undefined }, onZoomOut: { type: Function() as PropType, required: false, default: undefined }, onFitView: { type: Function() as PropType, required: false, default: undefined }, onInteractiveChange: { type: Function() as PropType, required: false, default: undefined } }, setup(props, { slots }) { const store = inject('store')! const isVisible = ref(false) const zoomHelper = ref() const { onReady } = useZoomPanHelper() onReady((helper) => { zoomHelper.value = helper }) const isInteractive = store.nodesDraggable && store.nodesConnectable && store.elementsSelectable const mapClasses = ['revue-flow__controls'] const onZoomInHandler = () => { zoomHelper.value?.zoomIn?.() props.onZoomIn?.() } const onZoomOutHandler = () => { zoomHelper.value?.zoomOut?.() props.onZoomOut?.() } const onFitViewHandler = () => { zoomHelper.value?.fitView?.(props.fitViewParams) props.onFitView?.() } const onInteractiveChangeHandler = () => { store.setInteractive?.(!isInteractive) props.onInteractiveChange?.(!isInteractive) } onMounted(() => { isVisible.value = true }) return () => ( {props.showZoom && ( <> > )} {props.showFitView && ( )} {props.showInteractive && ( {isInteractive ? : } )} {slots.default ? slots.default() : ''} ) } }) export default Controls