airflow
airflow copied to clipboard
Use sentinel to elide the dag object on reserialization
When we pass a task over RPC call we can't include the dag as part of the task without running into recursion trouble. So we just "elide" the dag from the task object, require that it be passed separately and then get reattatched to the task after deserialization. We introduce a sentinel so that way we can raise a helpful error if someone tries to access the dag attr after it's been elided. Additionally, the sentinel lets us short circuit some logic in the task.dag setter that is not helpful.
The motivator for this PR is avoiding conditional code like this:
# when taking task over RPC, we need to add the dag back
if isinstance(task, MappedOperator):
if not task.dag:
task.dag = dag
elif not task._dag:
task._dag = dag
And the idea for this approach came from a discussion with @uranusjr .
The addition of method get_relevant_upstream_map_indexes to the pydantic TI model is just a driveby addition and i can split it out if necessary.
You might wanna read this section of the docs.
TL;DR: add the nodrag class name to elements that should not initiate a drag action inside a node.
But that only prevents dragging the node, and you still cannot start drag selection from inside the node.
Well, add some css to the element user-select: text; or all and you're good.
I did and it still doesn't work.
https://github.com/xyflow/xyflow/assets/139328005/c8e81e0f-6259-458f-b839-e15efb395da6
Mh... not quite sure what the video is supposed to tell me? What exactly are you trying to achieve with "dragging" here?
In the video I start dragging outside of the box it triggers drag selection but when I do it from inside the box nothing happens.
Aha! Well that's quite different from the original issue I assumed you had (thought you were trying to use some input text selection or whatever inside of a node, which the above class name + css would've allowed). So the problem is using the RF built-in selection box while having the mouse on a node, is that correct?
If that's the case, I don't think that works out of the box sadly - so your initial request might make sense although that's for the maintainers to decide and not me 😄
At least we were able to clarify what the exact issue here is ^^
That's a good question @hiepnguyen3001. Unfortunately this is only possible with a workaround. You could listen to the selection key and set nodesDraggable={false} for example. Would that work?
That's a good question @hiepnguyen3001. Unfortunately this is only possible with a workaround. You could listen to the selection key and set
nodesDraggable={false}for example. Would that work?
I don't think so @moklick. Even when I set nodesDraggable={false}, it's still not possible to start a selection box from inside a node.
Damn.. The only way I see then is to add a class or set a style directly that prevents all pointer events.
pointer-events: none; on the node that you want to start the drag selection in worked for me.
We needed this as well and found the same workaround with pointer-events: none; You can still have other elements inside your Group node that do have pointer events.
Basically we wanted the inner part of a Group node to act more like the Pane. Additionaly, we wanted the Group node itself to be not selectable by default when using the selection rectangle. Our hacky solution for that was;
useEffect(() => {
// Selectable group nodes only when spacekey is pressed
if (spaceKeyPressed) {
updateNode(props.id, { selectable: true });
} else {
updateNode(props.id, { selectable: false });
}
}, [updateNode, props.id, spaceKeyPressed]);
// note: we use a custom store for the nodes, so the reactflow way looks a bit different
There are more things that could still be improved with Group nodes, but the recent update was already nice to see.
If you need this feature, the workaround is to set pointer-events: none.