+
onToggleGroup(group.mandateId)}
+ onMouseEnter={() => setHovered(true)}
+ onMouseLeave={() => setHovered(false)}
+ style={{
+ display: 'flex', alignItems: 'center', gap: 4,
+ paddingLeft: 4, paddingRight: 4, paddingTop: 3, paddingBottom: 3,
+ cursor: 'pointer', borderRadius: 3,
+ background: hovered ? 'var(--hover-bg, #f5f5f5)' : 'transparent',
+ transition: 'background 0.1s', userSelect: 'none',
+ }}
+ >
+
+ {chevron}
+
+
+ {group.mandateLabel}
+
+
+
+ {group.expanded && (
+
+ {group.featureConnections.map(fNode => (
+ <_FeatureNodeView
+ key={fNode.featureInstanceId}
+ node={fNode}
+ onToggle={onToggleFeature}
+ onAddTable={onAddTable}
+ isTableAdded={isTableAdded}
+ addingKey={addingKey}
+ />
+ ))}
+
+ )}
+
+ );
+};
+
/* ─── FeatureNodeView (feature instance + tables) ─────────────────── */
interface FeatureNodeViewProps {
@@ -748,28 +880,40 @@ async function _loadServices(instanceId: string, connectionId: string): Promise<
connectionId,
service: s.service,
path: '/',
+ displayPath: s.label || s.service,
}));
}
async function _browseService(
- instanceId: string, connectionId: string, service: string, path: string,
+ instanceId: string,
+ connectionId: string,
+ service: string,
+ path: string,
+ parentDisplayPath: string | undefined,
): Promise