feat: implement new grid creation with inline rename in DataGridsManager

- Add new_grid() method to create empty DataGrid under selected folder/leaf parent
  - Generate unique sheet names (Sheet1, Sheet2, ...) with _generate_unique_sheet_name()
  - Auto-select and open new node in edit mode for immediate renaming
  - Fix TreeView to cancel edit mode when selecting any node
  - Wire "New grid" icon to new_grid() instead of clear_tree()
  - Add 14 unit tests covering new_grid() scenarios and TreeView behavior
This commit is contained in:
2026-02-20 21:50:47 +01:00
parent 8f3b2e795e
commit 40a90c7ff5
4 changed files with 368 additions and 10 deletions

View File

@@ -583,6 +583,44 @@ class TestTreeviewBehaviour:
assert len(tree_view._state.items) == 1, "Node should not have been added to items"
assert tree_view._state.items[node1.id] == node2, "Node should not have been replaced"
def test_selecting_node_cancels_edit_mode(self, root_instance):
"""Test that selecting a node cancels any active edit mode."""
tree_view = TreeView(root_instance)
node1 = TreeNode(label="Node 1", type="folder")
node2 = TreeNode(label="Node 2", type="folder")
tree_view.add_node(node1)
tree_view.add_node(node2)
# Start editing node1
tree_view._start_rename(node1.id)
assert tree_view._state.editing == node1.id
# Select node2
tree_view._select_node(node2.id)
# Edit mode should be cancelled
assert tree_view._state.editing is None
assert tree_view._state.selected == node2.id
def test_selecting_same_editing_node_cancels_edit_mode(self, root_instance):
"""Test that selecting the same node being edited cancels edit mode."""
tree_view = TreeView(root_instance)
node = TreeNode(label="Node", type="folder")
tree_view.add_node(node)
# Start editing the node
tree_view._start_rename(node.id)
assert tree_view._state.editing == node.id
# Select the same node
tree_view._select_node(node.id)
# Edit mode should be cancelled
assert tree_view._state.editing is None
assert tree_view._state.selected == node.id
class TestTreeViewRender:
"""Tests for TreeView HTML rendering."""