feat(core,edges): add a11y to edge wrapper

Signed-off-by: braks <78412429+bcakmakoglu@users.noreply.github.com>
This commit is contained in:
braks
2022-12-20 00:38:56 +01:00
committed by Braks
parent 912cba3844
commit ffbbc35fe9
2 changed files with 38 additions and 6 deletions
@@ -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,