feat(core,edges): add a11y to edge wrapper
Signed-off-by: braks <78412429+bcakmakoglu@users.noreply.github.com>
This commit is contained in:
@@ -7,6 +7,7 @@ interface Props {
|
|||||||
type: EdgeComponent | Function | Object | false
|
type: EdgeComponent | Function | Object | false
|
||||||
name: string
|
name: string
|
||||||
selectable?: boolean
|
selectable?: boolean
|
||||||
|
focusable?: boolean
|
||||||
updatable?: EdgeUpdatable
|
updatable?: EdgeUpdatable
|
||||||
edge: GraphEdge
|
edge: GraphEdge
|
||||||
sourceNode: GraphNode
|
sourceNode: GraphNode
|
||||||
@@ -14,10 +15,20 @@ interface Props {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const EdgeWrapper = defineComponent({
|
const EdgeWrapper = defineComponent({
|
||||||
props: ['name', 'type', 'id', 'updatable', 'selectable', 'edge', 'sourceNode', 'targetNode'],
|
props: ['name', 'type', 'id', 'updatable', 'selectable', 'focusable', 'edge', 'sourceNode', 'targetNode'],
|
||||||
setup(props: Props) {
|
setup(props: Props) {
|
||||||
const { addSelectedEdges, connectionMode, edgeUpdaterRadius, emits, nodesSelectionActive, getEdges, getEdgeTypes } =
|
const {
|
||||||
useVueFlow()
|
id: vueFlowId,
|
||||||
|
addSelectedEdges,
|
||||||
|
connectionMode,
|
||||||
|
edgeUpdaterRadius,
|
||||||
|
emits,
|
||||||
|
nodesSelectionActive,
|
||||||
|
getEdges,
|
||||||
|
getEdgeTypes,
|
||||||
|
removeSelectedEdges,
|
||||||
|
findEdge,
|
||||||
|
} = useVueFlow()
|
||||||
|
|
||||||
const hooks = useEdgeHooks(props.edge, emits)
|
const hooks = useEdgeHooks(props.edge, emits)
|
||||||
|
|
||||||
@@ -32,7 +43,7 @@ const EdgeWrapper = defineComponent({
|
|||||||
const elementEdgeUpdaterType = ref<HandleType>('source')
|
const elementEdgeUpdaterType = ref<HandleType>('source')
|
||||||
const mouseEvent = ref<MouseEvent>()
|
const mouseEvent = ref<MouseEvent>()
|
||||||
|
|
||||||
const edgeEl = ref()
|
const edgeEl = ref<SVGElement>()
|
||||||
|
|
||||||
provide(EdgeId, props.id)
|
provide(EdgeId, props.id)
|
||||||
provide(EdgeRef, edgeEl)
|
provide(EdgeRef, edgeEl)
|
||||||
@@ -103,6 +114,19 @@ const EdgeWrapper = defineComponent({
|
|||||||
handleEdgeUpdater(event, false)
|
handleEdgeUpdater(event, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const onKeyDown = (event: KeyboardEvent) => {
|
||||||
|
if (elementSelectionKeys.includes(event.key) && props.selectable) {
|
||||||
|
const unselect = event.key === 'Escape'
|
||||||
|
|
||||||
|
if (unselect) {
|
||||||
|
edgeEl.value?.blur()
|
||||||
|
removeSelectedEdges([findEdge(props.id)!])
|
||||||
|
} else {
|
||||||
|
addSelectedEdges([findEdge(props.id)!])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
if (!props.sourceNode || !props.targetNode) return null
|
if (!props.sourceNode || !props.targetNode) return null
|
||||||
|
|
||||||
@@ -162,6 +186,11 @@ const EdgeWrapper = defineComponent({
|
|||||||
'onMouseenter': onEdgeMouseEnter,
|
'onMouseenter': onEdgeMouseEnter,
|
||||||
'onMousemove': onEdgeMouseMove,
|
'onMousemove': onEdgeMouseMove,
|
||||||
'onMouseleave': onEdgeMouseLeave,
|
'onMouseleave': onEdgeMouseLeave,
|
||||||
|
'onKeyDown': props.focusable ? onKeyDown : undefined,
|
||||||
|
'tabIndex': props.focusable ? 0 : undefined,
|
||||||
|
'aria-label': edge.ariaLabel === null ? undefined : edge.ariaLabel || `Edge from ${edge.source} to ${edge.target}`,
|
||||||
|
'aria-describedby': props.focusable ? `${ARIA_EDGE_DESC_KEY}-${vueFlowId}` : undefined,
|
||||||
|
'role': props.focusable ? 'button' : undefined,
|
||||||
},
|
},
|
||||||
[
|
[
|
||||||
updating
|
updating
|
||||||
@@ -185,8 +214,8 @@ const EdgeWrapper = defineComponent({
|
|||||||
data: edge.data,
|
data: edge.data,
|
||||||
events: { ...edge.events, ...hooks.on },
|
events: { ...edge.events, ...hooks.on },
|
||||||
style: edgeStyle,
|
style: edgeStyle,
|
||||||
markerStart: `url(#${getMarkerId(edge.markerStart)})`,
|
markerStart: `url(#${getMarkerId(edge.markerStart, vueFlowId)})`,
|
||||||
markerEnd: `url(#${getMarkerId(edge.markerEnd)})`,
|
markerEnd: `url(#${getMarkerId(edge.markerEnd, vueFlowId)})`,
|
||||||
sourcePosition,
|
sourcePosition,
|
||||||
targetPosition,
|
targetPosition,
|
||||||
sourceX,
|
sourceX,
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ const {
|
|||||||
connectionStartHandle,
|
connectionStartHandle,
|
||||||
nodesConnectable,
|
nodesConnectable,
|
||||||
edgesUpdatable,
|
edgesUpdatable,
|
||||||
|
edgesFocusable,
|
||||||
elementsSelectable,
|
elementsSelectable,
|
||||||
getSelectedNodes,
|
getSelectedNodes,
|
||||||
getSelectedEdges,
|
getSelectedEdges,
|
||||||
@@ -32,6 +33,8 @@ const selectable = (s?: boolean) => (typeof s === 'undefined' ? elementsSelectab
|
|||||||
|
|
||||||
const updatable = (u?: EdgeUpdatable) => (typeof u === 'undefined' ? edgesUpdatable : u)
|
const updatable = (u?: EdgeUpdatable) => (typeof u === 'undefined' ? edgesUpdatable : u)
|
||||||
|
|
||||||
|
const focusable = (f?: boolean) => (typeof f === 'undefined' ? edgesFocusable : f)
|
||||||
|
|
||||||
const sourceNode = $(
|
const sourceNode = $(
|
||||||
controlledComputed(
|
controlledComputed(
|
||||||
() => connectionStartHandle?.nodeId,
|
() => connectionStartHandle?.nodeId,
|
||||||
|
|||||||
Reference in New Issue
Block a user