From 485ed001d4500c25f552d4e85cb1bd4e77e04760 Mon Sep 17 00:00:00 2001 From: RajPatil152 Date: Wed, 8 Jul 2026 07:12:54 +0000 Subject: [PATCH 1/3] Heirarchical lineage --- docs/assets/Hierarchical_lineage.png | Bin 0 -> 180496 bytes docs/ui/lineage.md | 19 + server/app/main.py | 26 +- server/app/utils.py | 245 +++++++ ui/package-lock.json | 681 +++++++++++++++++- ui/package.json | 9 +- ui/src/client.js | 7 + .../heirarchical_lineage.jsx | 278 +++++++ .../HeirarchicalLineageFlow/index.css | 74 ++ .../HeirarchicalLineageFlow/lineagenode.jsx | 64 ++ .../trasformeddata.jsx | 83 +++ ui/src/components/Sidebar/index.jsx | 8 + ui/src/pages/lineage/index.jsx | 31 + 13 files changed, 1514 insertions(+), 11 deletions(-) create mode 100644 docs/assets/Hierarchical_lineage.png create mode 100644 ui/src/components/HeirarchicalLineageFlow/heirarchical_lineage.jsx create mode 100644 ui/src/components/HeirarchicalLineageFlow/index.css create mode 100644 ui/src/components/HeirarchicalLineageFlow/lineagenode.jsx create mode 100644 ui/src/components/HeirarchicalLineageFlow/trasformeddata.jsx diff --git a/docs/assets/Hierarchical_lineage.png b/docs/assets/Hierarchical_lineage.png new file mode 100644 index 0000000000000000000000000000000000000000..4b1fc6395ba4a156527fd8f07c470191dd64c8c1 GIT binary patch literal 180496 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 z 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

mLqQtg|IW6FXO0ia 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 z zM;XR;+)mwo)BueGyz^>U*8hk3$-C78`5-@U1jk6I_-j)F7Bc8vm4jxSf41ux5s0zS zMD}FyuaL<>?!}NUlE{CkKnrtD^Os_(97mu7tI#Q1C4iXLWy0Aa02#$nPV6a4Ui%| zpJ6^zpo;8lAr$oNDy{#alrL5VVJ&&7E- zOgY!G@Vr`5#ot|911lg3!skZWbJnH%Lo>^a044{fpFUe$J`|(Aw4)ES(3p7b#>E1^ zSx%)0kI=>h(-=&F<$i~;0l==`Omi1k(IRtktDzW0dhDE&r;JrhKmb2?blokzNDGFu zA)8YHW<=@^ZWj%@GB0*go8(+h+7lV+0Rx$2+R=JfEVL%kV=Oi{>B&$^C_3&FSb28; z@nJ&YS{1$VzBJ8c8lw4D+#(FAef(|BZTEsSBX0lE){1NG+^I590b+xnM@1K&g}{q7 ziQ`H;*qGp&+V}=waQxIG#5@Y*rBAZ*S8TfymkN< zmq__9QvE+^6nefv5bO_`1f%sm_^y`E+aE^l45h9#V6pjpwzRaO4Xn5}SYMm6_mK|kb1U&&qk;pID>|Y- zhPV0bsbbtCtgS5e$DQ)W!u)Qpv5eYtcQpuiS2z{GSKCGRuir=>q+bQ4X6Dz+ndw(E zl^si`YGW2%DE-NOD8JsFP4VhSf4W0|(V|*~buQ`qxgr_nj#`cC$yq3uT=?<4uXdru zoBix^h0v00sz~*avLy;?6ANpnDyC){mbH>=WN9M)ZX2omb&56z!_PXM*;qVdqe5n>T z=nQSHZ^lvEy_oHe={=k1y$8*9eiAomm$h(otf|RrE`(SGr*l<%jvCq;8L}D_C7U*O z3O991qkPz=x{Ct3nmco2RV-1$sUpy#8vk^!DRpEha(- z)fV<`^|O+xc=dU+yF>o9$djnVeLW?HcAauv#qD^{L}z_wEQJIdI2_W;FypA4rYvk+ nJjJxUDrV}FaWQe8Z}}#L(gbauxMKMWXoFH$(N@k?MEn06-5I7s literal 0 HcmV?d00001 diff --git a/docs/ui/lineage.md b/docs/ui/lineage.md index f28c16e68..84f3b2977 100644 --- a/docs/ui/lineage.md +++ b/docs/ui/lineage.md @@ -69,6 +69,25 @@ The Lineage page offers three different visualization modes: ![Artifact Execution Tree Lineage](../assets/artifact_exec_tree_lineage.png) +### 4. Heirarchical Lineage + +**Purpose**: High-level, multi-column tree abstraction tracking task orchestration flows branching from root configurations down through execution chains. + +**Use Cases**: + +- Tracking simultaneous execution tracks branching from a single environment or pipeline root. +- Tracing linear execution histories sequentially across multiple stages like preparation, features, training, and evaluation. +- Auditing full procedural histories by analyzing vertically ordered step progressions. + +**Features**: + +- Environment-centric root anchoring branching into independent functional swimlanes. +- Color-coded stage markers distinguishing entry hooks from down-stream operational tasks. +- Distinct step blocks capturing individual execution hashes sequentially. +- Vertical progression layouts tracing step dependencies from top to bottom. + +![Heirarchical Lineage](../assets/Hierarchical_lineage.png) + ## Using the Lineage Page diff --git a/server/app/main.py b/server/app/main.py index db2c6023c..74087dfe9 100644 --- a/server/app/main.py +++ b/server/app/main.py @@ -13,7 +13,7 @@ import asyncio from sqlalchemy.ext.asyncio import AsyncSession from collections import defaultdict -from server.app.utils import extract_hostname, get_fqdn +from server.app.utils import extract_hostname, get_fqdn, convert_to_stage_json from server.app.get_data import ( get_mlmd_from_server, get_artifact_types, @@ -611,6 +611,30 @@ async def artifact_execution_lineage(request: Request, pipeline_name: str): return response +@app.get("/hierarchical-lineage/tangled-tree/{pipeline_name}") +async def hierarchical_lineage(request: Request, pipeline_name: str): + """ + Return MLMD data for the given pipeline converted into the UI `stage.json` schema. + """ + # checks if mlmd file exists on server + await check_mlmd_file_exists() + # checks if pipeline exists + await check_pipeline_exists(pipeline_name) + + # Pull MLMD JSON for the pipeline + json_payload = await async_api(get_mlmd_from_server, query, pipeline_name, None, None, dict_of_exe_ids) + + if json_payload is None: + raise HTTPException(status_code=404, detail=f"Pipeline {pipeline_name} not found or has no MLMD data.") + + try: + converted = convert_to_stage_json(json_payload) + except Exception as e: + raise HTTPException(status_code=500, detail=f"Failed to convert MLMD to stage JSON: {e}") + + return converted + + @app.get("/list-of-executions/{pipeline_name}") async def list_of_executions(request: Request, pipeline_name: str): ''' diff --git a/server/app/utils.py b/server/app/utils.py index db483f73b..251856f10 100644 --- a/server/app/utils.py +++ b/server/app/utils.py @@ -99,3 +99,248 @@ def get_fqdn(name: str) -> str: return fqdn except Exception: return "127.0.0.1" + + +# def convert_to_stage_json(input_json: dict) -> dict: +# """ +# Convert arbitrary MLMD-like JSON into the `stage.json` schema expected by the UI. + +# This function is permissive and will attempt to map common shapes into the +# schema produced previously by the static `stage.json` used in the UI. +# It will synthesize `stage_id`, `execution_id` and `node_id` values when +# they are missing. +# """ +# # If input already matches expected format, return unchanged +# if isinstance(input_json, dict) and "stages" in input_json and isinstance(input_json.get("stages"), list): +# return input_json + +# # attempt to find stages list in input under common keys +# stages_candidate = None +# if isinstance(input_json, dict): +# for key in ("stages", "stage_list", "stages_input", "stageList", "Pipeline", "pipelines"): +# val = input_json.get(key) +# if isinstance(val, list): +# stages_candidate = val +# break + +# if stages_candidate is None and isinstance(input_json, list): +# stages_candidate = input_json + +# if stages_candidate is None: +# # fallback: wrap whole payload as single stage with one execution +# stages_candidate = [{"stage_name": "stage_1", "executions": [input_json]}] + +# out = { +# "environment": input_json.get("environment", "test-env") if isinstance(input_json, dict) else "test-env", +# "metadata": input_json.get("metadata", {"version": "1.0.0", "description": "converted"}) if isinstance(input_json, dict) else {"version": "1.0.0", "description": "converted"}, +# "stages": [] +# } + +# stage_idx = 1 +# exec_idx = 1 +# node_idx = 1 + +# def next_stage_id(): +# nonlocal stage_idx +# sid = f"stage_{stage_idx:02d}" +# stage_idx += 1 +# return sid + +# def next_exec_id(): +# nonlocal exec_idx +# eid = f"exec_{exec_idx:03d}" +# exec_idx += 1 +# return eid + +# def next_node_id(): +# nonlocal node_idx +# nid = f"node_{node_idx:03d}" +# node_idx += 1 +# return nid + +# for s in stages_candidate: +# # s may be string, dict, or other +# if isinstance(s, str): +# stage_name = s +# executions = [] +# elif isinstance(s, dict): +# # prefer explicit names used in MLMD -> try common keys +# stage_name = s.get("stage_name") or s.get("stage") or s.get("name") or s.get("Context_Type") or f"stage_{stage_idx}" +# executions = s.get("executions") or s.get("executions_list") or s.get("runs") or s.get("Execution") or [] +# else: +# stage_name = str(s) +# executions = [] + +# stage_obj = { +# "stage_id": next_stage_id(), +# "stage_name": stage_name, +# "status": "completed", +# "executions": [] +# } + +# # If executions is a dict, convert to list +# if isinstance(executions, dict): +# exec_items = [] +# for k, v in executions.items(): +# exec_items.append({"execution_type": k, "children": v}) +# executions = exec_items + +# for e in executions: +# if isinstance(e, str): +# execution_type = e +# children = [] +# elif isinstance(e, dict): +# execution_type = e.get("execution_type") or e.get("type") or e.get("name") or e.get("Execution_Type") or f"execution_{exec_idx}" +# children = e.get("children") or e.get("nodes") or e.get("steps") or [] +# else: +# execution_type = str(e) +# children = [] + +# exec_obj = { +# "execution_id": next_exec_id(), +# "execution_type": execution_type, +# "children": [] +# } + +# # normalize children +# for c in children: +# if isinstance(c, str): +# node_name = c +# elif isinstance(c, dict): +# node_name = c.get("node_name") or c.get("name") or c.get("node") or str(c) +# else: +# node_name = str(c) +# node_obj = {"node_id": next_node_id(), "node_name": node_name} +# exec_obj["children"].append(node_obj) + +# stage_obj["executions"].append(exec_obj) + +# out["stages"].append(stage_obj) + +# return out + +import json + +def convert_to_stage_json(input_json: dict) -> dict: + """ + Converts MLMD JSON for a clean hierarchy map. + - Removes trailing child nodes underneath executions. + - Combines Execution Type name and a 6-digit truncated UUID. + - Includes rich metadata fields for frontend hover/tooltip parsing. + """ + + def extract_stages_recursively(data): + """Recursively parses and drills down to locate the raw stages list.""" + if isinstance(data, str): + cleaned = data.strip() + try: + return extract_stages_recursively(json.loads(cleaned)) + except Exception: + if "stages" in cleaned or "Pipeline" in cleaned: + try: + if not (cleaned.startswith('{') and cleaned.endswith('}')): + return extract_stages_recursively(json.loads("{" + cleaned + "}")) + except Exception: + pass + return None + + if isinstance(data, dict): + for key in ("stages", "stage_list", "stageList"): + if key in data and isinstance(data[key], list): + return data[key] + for key in ("Pipeline", "pipelines", "name"): + if key in data: + res = extract_stages_recursively(data[key]) + if res: return res + for v in data.values(): + if isinstance(v, (dict, list, str)): + res = extract_stages_recursively(v) + if res: return res + + if isinstance(data, list): + for item in data: + res = extract_stages_recursively(item) + if res: return res + + return None + + stages_candidate = extract_stages_recursively(input_json) + if not stages_candidate: + stages_candidate = [] + + out = { + "environment": "test-env", + "metadata": { "version": "4.0.0", "description": "Executions Lineage Map" }, + "stages": [] + } + + stage_idx = 1 + exec_idx = 1 + + for s_item in stages_candidate: + if not isinstance(s_item, dict): + continue + + raw_executions = s_item.get("executions") or [] + if isinstance(raw_executions, str): + try: raw_executions = json.loads(raw_executions) + except Exception: raw_executions = [] + + if not raw_executions: + continue + + # Extract context attributes from the execution definition + first_exec = raw_executions[0] if isinstance(raw_executions, list) and len(raw_executions) > 0 else {} + props = first_exec.get("properties") or {} if isinstance(first_exec, dict) else {} + + context_type = props.get("Context_Type") or props.get("Execution_type_name") or first_exec.get("type") or "" + if "/" in context_type: + stage_name = context_type.split("/", 1)[1] + elif context_type: + stage_name = context_type + else: + stage_name = f"stage_{stage_idx}" + + stage_obj = { + "stage_id": f"stage_{stage_idx:02d}", + "stage_name": stage_name, + "status": "completed", + "executions": [] + } + stage_idx += 1 + + for e in raw_executions: + if not isinstance(e, dict): + continue + + e_props = e.get("properties") or {} + + # 1. Fetch execution base name (e.g., "Prepare") + exec_base_name = e.get("type") or "Execution" + + # 2. Extract full UUID/Commit hash string + full_uuid = str(e_props.get("Git_End_Commit") or e_props.get("Git_Start_Commit") or e.get("id") or "") + truncated_uuid = full_uuid[:6] if full_uuid else f"ex_{exec_idx}" + + # 3. Create the multi-line UI text block + # Note: '\n' handles line breaks in graph frameworks configured with CSS white-space: pre-wrap + display_text = f"{exec_base_name}\n{truncated_uuid}" + + exec_obj = { + "execution_id": f"exec_{exec_idx:03d}", + "execution_type": display_text, + "children": [], # Empty array ensures no leaf artifact nodes render underneath + + # Broad compatibility fields for the UI graphing framework's hover tooltip engine + "tooltip": full_uuid, + "title": full_uuid, + "description": f"Full UUID: {full_uuid}", + "full_uuid": full_uuid + } + exec_idx += 1 + + stage_obj["executions"].append(exec_obj) + + out["stages"].append(stage_obj) + + return out diff --git a/ui/package-lock.json b/ui/package-lock.json index 68b9d0474..aacdb7840 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -14,16 +14,21 @@ "@testing-library/user-event": "^13.5.0", "axios": "^0.24.0", "create-react-app": "^5.0.1", + "dagre": "^0.8.5", "file-system": "^2.2.2", "fs": "^0.0.1-security", "moment": "^2.29.4", + "papaparse": "^5.5.2", "path": "^0.12.7", "rc-tabs": "^12.5.10", "react": "^18.2.0", + "react-data-table-component": "^7.7.0", "react-dom": "^18.2.0", + "react-flow": "^1.0.3", "react-native": "^0.71.4", "react-scripts": "5.0.1", "react-table": "^7.8.0", + "reactflow": "^11.11.4", "web-vitals": "^2.1.4" }, "devDependencies": { @@ -2360,6 +2365,23 @@ "postcss-selector-parser": "^6.0.10" } }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT", + "peer": true + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.3.0.tgz", @@ -5292,6 +5314,108 @@ "resolved": "https://registry.npmjs.org/@react-native/polyfills/-/polyfills-2.0.0.tgz", "integrity": "sha512-K0aGNn1TjalKj+65D7ycc1//H9roAQ51GJVk5ZJQFb2teECGmzd86bYDC0aYdbRf7gtovescq4Zt6FR0tgXiHQ==" }, + "node_modules/@reactflow/background": { + "version": "11.3.14", + "resolved": "https://registry.npmjs.org/@reactflow/background/-/background-11.3.14.tgz", + "integrity": "sha512-Gewd7blEVT5Lh6jqrvOgd4G6Qk17eGKQfsDXgyRSqM+CTwDqRldG2LsWN4sNeno6sbqVIC2fZ+rAUBFA9ZEUDA==", + "license": "MIT", + "dependencies": { + "@reactflow/core": "11.11.4", + "classcat": "^5.0.3", + "zustand": "^4.4.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/controls": { + "version": "11.2.14", + "resolved": "https://registry.npmjs.org/@reactflow/controls/-/controls-11.2.14.tgz", + "integrity": "sha512-MiJp5VldFD7FrqaBNIrQ85dxChrG6ivuZ+dcFhPQUwOK3HfYgX2RHdBua+gx+40p5Vw5It3dVNp/my4Z3jF0dw==", + "license": "MIT", + "dependencies": { + "@reactflow/core": "11.11.4", + "classcat": "^5.0.3", + "zustand": "^4.4.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/core": { + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@reactflow/core/-/core-11.11.4.tgz", + "integrity": "sha512-H4vODklsjAq3AMq6Np4LE12i1I4Ta9PrDHuBR9GmL8uzTt2l2jh4CiQbEMpvMDcp7xi4be0hgXj+Ysodde/i7Q==", + "license": "MIT", + "dependencies": { + "@types/d3": "^7.4.0", + "@types/d3-drag": "^3.0.1", + "@types/d3-selection": "^3.0.3", + "@types/d3-zoom": "^3.0.1", + "classcat": "^5.0.3", + "d3-drag": "^3.0.0", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0", + "zustand": "^4.4.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/minimap": { + "version": "11.7.14", + "resolved": "https://registry.npmjs.org/@reactflow/minimap/-/minimap-11.7.14.tgz", + "integrity": "sha512-mpwLKKrEAofgFJdkhwR5UQ1JYWlcAAL/ZU/bctBkuNTT1yqV+y0buoNVImsRehVYhJwffSWeSHaBR5/GJjlCSQ==", + "license": "MIT", + "dependencies": { + "@reactflow/core": "11.11.4", + "@types/d3-selection": "^3.0.3", + "@types/d3-zoom": "^3.0.1", + "classcat": "^5.0.3", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0", + "zustand": "^4.4.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/node-resizer": { + "version": "2.2.14", + "resolved": "https://registry.npmjs.org/@reactflow/node-resizer/-/node-resizer-2.2.14.tgz", + "integrity": "sha512-fwqnks83jUlYr6OHcdFEedumWKChTHRGw/kbCxj0oqBd+ekfs+SIp4ddyNU0pdx96JIm5iNFS0oNrmEiJbbSaA==", + "license": "MIT", + "dependencies": { + "@reactflow/core": "11.11.4", + "classcat": "^5.0.4", + "d3-drag": "^3.0.0", + "d3-selection": "^3.0.0", + "zustand": "^4.4.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/node-toolbar": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@reactflow/node-toolbar/-/node-toolbar-1.3.14.tgz", + "integrity": "sha512-rbynXQnH/xFNu4P9H+hVqlEUafDCkEoCy0Dg9mG22Sg+rY/0ck6KkrAQrYrTgXusd+cEJOMK0uOOFCK2/5rSGQ==", + "license": "MIT", + "dependencies": { + "@reactflow/core": "11.11.4", + "classcat": "^5.0.3", + "zustand": "^4.4.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, "node_modules/@remix-run/router": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.4.0.tgz", @@ -6011,6 +6135,259 @@ "@types/node": "*" } }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "license": "MIT", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "license": "MIT" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.4.tgz", + "integrity": "sha512-UHYId5WTCx4L4YNel7NU00XUXXgvgpgZOvp10PuvsQENjMDXhh2RyFc0KBjO7B45ne4Ha1yVH7ii0vnzKkuzWA==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, "node_modules/@types/eslint": { "version": "8.21.3", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.3.tgz", @@ -6055,6 +6432,12 @@ "@types/range-parser": "*" } }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, "node_modules/@types/graceful-fs": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", @@ -8177,6 +8560,16 @@ "node": ">= 6" } }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -8391,6 +8784,12 @@ "node": ">=0.10.0" } }, + "node_modules/classcat": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz", + "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==", + "license": "MIT" + }, "node_modules/classnames": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", @@ -8935,6 +9334,16 @@ "postcss": "^8.4" } }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=4" + } + }, "node_modules/css-declaration-sorter": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", @@ -9092,6 +9501,18 @@ "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, "node_modules/css-tree": { "version": "1.0.0-alpha.37", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", @@ -9279,9 +9700,125 @@ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" }, "node_modules/csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", + "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", + "license": "MIT", + "dependencies": { + "graphlib": "^2.1.8", + "lodash": "^4.17.15" + } }, "node_modules/damerau-levenshtein": { "version": "1.0.8", @@ -11911,6 +12448,15 @@ "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" }, + "node_modules/graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.15" + } + }, "node_modules/gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", @@ -17915,6 +18461,12 @@ "node": ">=6" } }, + "node_modules/papaparse": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.5.4.tgz", + "integrity": "sha512-SwzWD9gl/ElwYLCI0nUja1mFJzjq2D8ziShfNBa7zCHzkOozeOGDwHWQ+tvCzEZcewecWZ5U7kUopDnG+DFYEQ==", + "license": "MIT" + }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -19884,6 +20436,24 @@ "node": ">=14" } }, + "node_modules/react-data-table-component": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/react-data-table-component/-/react-data-table-component-7.7.1.tgz", + "integrity": "sha512-F1qciUONe0EiItxd+LZg9K7UXxvilSQH8WvUoSnPnAVZ/PK2x4Djr3nzkuCqCIfiMuU3imI+8gI7nYRIW2Kfxw==", + "license": "Apache-2.0", + "dependencies": { + "deepmerge": "^4.3.1" + }, + "peerDependencies": { + "react": ">= 17.0.0", + "styled-components": ">= 5.0.0" + }, + "peerDependenciesMeta": { + "styled-components": { + "optional": false + } + } + }, "node_modules/react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", @@ -20026,6 +20596,12 @@ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" }, + "node_modules/react-flow": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/react-flow/-/react-flow-1.0.3.tgz", + "integrity": "sha512-Rx4Oqqbe9y7NyrUGzCrmtNvuGuMJBVjfIeMFuwbtbMc9f22sUSmxMjIA0c8r6Z7iMtB1zOWoGkTgfpmmpH9ReQ==", + "license": "ISC" + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -20528,6 +21104,24 @@ "react": "^16.8.3 || ^17.0.0-0 || ^18.0.0" } }, + "node_modules/reactflow": { + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/reactflow/-/reactflow-11.11.4.tgz", + "integrity": "sha512-70FOtJkUWH3BAOsN+LU9lCrKoKbtOPnz2uq0CV2PLdNSwxTXOhCbsZr50GmZ+Rtw3jx8Uv7/vBFtCGixLfd4Og==", + "license": "MIT", + "dependencies": { + "@reactflow/background": "11.3.14", + "@reactflow/controls": "11.2.14", + "@reactflow/core": "11.11.4", + "@reactflow/minimap": "11.7.14", + "@reactflow/node-resizer": "2.2.14", + "@reactflow/node-toolbar": "1.3.14" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -22266,6 +22860,43 @@ "webpack": "^5.0.0" } }, + "node_modules/styled-components": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.4.3.tgz", + "integrity": "sha512-wYXrhu+JmDjZ1Tv7O0OopGTfztbzun43Pjjhh2H+xc0h5A09dwpZ5FJbrifJDcL8g5TA9btpWOX2+iSRuJTExw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@emotion/is-prop-valid": "1.4.0", + "css-to-react-native": "3.2.0", + "csstype": "3.2.3", + "stylis": "4.3.6" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "css-to-react-native": ">= 3.2.0", + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0", + "react-native": ">= 0.68.0" + }, + "peerDependenciesMeta": { + "css-to-react-native": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, "node_modules/stylehacks": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", @@ -22281,6 +22912,13 @@ "postcss": "^8.2.15" } }, + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT", + "peer": true + }, "node_modules/sudo-prompt": { "version": "9.2.1", "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", @@ -23180,11 +23818,12 @@ } }, "node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/util": { @@ -24160,6 +24799,34 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zustand": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz", + "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==", + "license": "MIT", + "dependencies": { + "use-sync-external-store": "^1.2.2" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } } } } diff --git a/ui/package.json b/ui/package.json index 2a965fe22..0213302e8 100644 --- a/ui/package.json +++ b/ui/package.json @@ -9,19 +9,22 @@ "@testing-library/user-event": "^13.5.0", "axios": "^0.24.0", "create-react-app": "^5.0.1", + "dagre": "^0.8.5", "file-system": "^2.2.2", "fs": "^0.0.1-security", "moment": "^2.29.4", + "papaparse": "^5.5.2", "path": "^0.12.7", "rc-tabs": "^12.5.10", "react": "^18.2.0", + "react-data-table-component": "^7.7.0", "react-dom": "^18.2.0", + "react-flow": "^1.0.3", "react-native": "^0.71.4", "react-scripts": "5.0.1", "react-table": "^7.8.0", - "web-vitals": "^2.1.4", - "react-data-table-component": "^7.7.0", - "papaparse": "^5.5.2" + "reactflow": "^11.11.4", + "web-vitals": "^2.1.4" }, "scripts": { "start": "react-scripts start", diff --git a/ui/src/client.js b/ui/src/client.js index f1b6e6484..c32e1748a 100644 --- a/ui/src/client.js +++ b/ui/src/client.js @@ -125,6 +125,13 @@ class FastAPIClient { }); } + async getHierarchicalLineage(pipeline) { + return this.apiClient + .get(`/hierarchical-lineage/tangled-tree/${pipeline}`) + .then(({ data }) => { + return data; + }); + } // Deprecated legacy method (unused by current stage-based grid pages). // Replaced by: getExecutionsByStage // async getExecutions(pipeline_name, active_page, filter_value, sort_order) { diff --git a/ui/src/components/HeirarchicalLineageFlow/heirarchical_lineage.jsx b/ui/src/components/HeirarchicalLineageFlow/heirarchical_lineage.jsx new file mode 100644 index 000000000..dfdfe53fd --- /dev/null +++ b/ui/src/components/HeirarchicalLineageFlow/heirarchical_lineage.jsx @@ -0,0 +1,278 @@ +import React, { useMemo } from "react"; +import ReactFlow, { Controls, Background, MiniMap, MarkerType, useNodes } from "reactflow"; +import dagre from "dagre"; +import "reactflow/dist/style.css"; +import "./index.css"; +import LineageNode1 from "./lineagenode"; + +const nodeTypes = { lineageNode: LineageNode1 }; +const nodeWidth = 220; +const nodeHeight = 80; + +// Central color thematic scheme helper matching your MiniMap rules +const getNodeThemeColor = (type) => { + switch (type) { + case "Environment": return "#10b981"; // Green + case "Stage": return "#f59e0b"; // Amber / Orange + case "Model": return "#f59e0b"; // Alias fallback + case "Node": return "#ef4444"; // Red + case "Execution": return "#3b82f6"; // Blue + default: return "#64748b"; // Gray + } +}; + +// MiniMap Node Component +const CustomMiniMapNode = ({ id, x, y, width, height }) => { + const nodes = useNodes(); + const graphNode = nodes.find((n) => n.id === id); + + const nodeType = graphNode?.data?.type || "Node"; + const nodeName = graphNode?.data?.name || ""; + + return ( + + + + {nodeType.toUpperCase()} + + + {nodeName.length > 18 ? `${nodeName.substring(0, 16)}...` : nodeName} + + + ); +}; + +// MODIFIED: Generates the exact clean layout tree seen in your example image +const transformLineageData = (rawJson) => { + const nodesMap = new Map(); + const links = []; + const flatItems = rawJson.flat(); + + const determineType = (id) => { + if (id.toLowerCase().includes("metrics")) return "Metrics"; + if (id.toLowerCase().includes("model")) return "Stage"; + if (id.toLowerCase().includes("train") || id.toLowerCase().includes("test") || id.toLowerCase().includes(".xml") || id.toLowerCase().includes("dataset") || id.toLowerCase().includes("input") || id.toLowerCase().includes("output")) return "Dataset"; + return "Execution"; + }; + + // Step 1: Parse every element as an independent individual tree node (No Collapsing) + flatItems.forEach((item) => { + if (!item || !item.id) return; + + // Clean string name labels cleanly + let cleanName = item.id.split("/").pop().split(":")[0]; + const type = determineType(item.id); + + if (!nodesMap.has(item.id)) { + nodesMap.set(item.id, { + id: item.id, + name: cleanName, + type: type, + parents: item.parents || [] + }); + } + }); + + // Step 2: Directly map one-to-one edges to allow separate parallel branching + const finalizedEdgesSet = new Set(); + nodesMap.forEach((node) => { + node.parents.forEach((parentId) => { + if (nodesMap.has(parentId) && parentId !== node.id) { + const edgeKey = `${parentId}->${node.id}`; + if (!finalizedEdgesSet.has(edgeKey)) { + finalizedEdgesSet.add(edgeKey); + links.push({ source: parentId, target: node.id }); + } + } + }); + }); + + return { nodes: Array.from(nodesMap.values()), links }; +}; + +// Layout reconfigured for a top-down vertical tree structure with side-by-side spacing +// FIXED LAYOUT ENGINE: Keeps stages horizontal, stacks ONLY execution leaf nodes vertically +// FIXED LAYOUT ENGINE: Removes massive empty horizontal spacing between stages +const getLayoutedElements = (nodes = [], edges = []) => { + const g = new dagre.graphlib.Graph(); + + g.setGraph({ + rankdir: "TB", + ranksep: 100, // Vertical gap between Environment and Stages + nodesep: 40, // MUCH closer horizontal spacing between your Stage blocks + edgesep: 20, + marginx: 40, + marginy: 40 + }); + g.setDefaultEdgeLabel(() => ({})); + + // STEP 1: Only feed non-Execution nodes (Environment & Stages) into Dagre + nodes.forEach((node) => { + if (node.data?.type !== "Execution") { + g.setNode(node.id, { width: nodeWidth, height: nodeHeight }); + } + }); + + // Only feed edges that don't point to an execution node into Dagre + edges.forEach((edge) => { + const targetNode = nodes.find((n) => n.id === edge.target); + if (targetNode && targetNode.data?.type !== "Execution") { + g.setEdge(edge.source, edge.target, { weight: 10, minlen: 1 }); + } + }); + + // Layout the main horizontal backbone (Environment -> Stages) + dagre.layout(g); + + // STEP 2: Group the execution leaves manually by their stage parent + const parentToExecutionLeavesMap = {}; + nodes.forEach((node) => { + if (node.data?.type === "Execution") { + const parentEdge = edges.find((e) => e.target === node.id); + if (parentEdge) { + const pId = parentEdge.source; + if (!parentToExecutionLeavesMap[pId]) parentToExecutionLeavesMap[pId] = []; + parentToExecutionLeavesMap[pId].push(node.id); + } + } + }); + + // STEP 3: Assign positions to all elements + return nodes?.map((node) => { + // Default top-down connection routing + node.targetPosition = 'top'; + node.sourcePosition = 'bottom'; + + if (node.data?.type !== "Execution") { + // Use the compact positions generated by Dagre for main stages + const pos = g.node(node.id) || { x: 0, y: 0 }; + node.position = { + x: pos.x - nodeWidth / 2, + y: pos.y - nodeHeight / 2, + }; + } else { + // Calculate clean, compact vertical positions for Execution nodes + const parentEdge = edges.find((e) => e.target === node.id); + if (parentEdge) { + const parentId = parentEdge.source; + const parentPos = g.node(parentId) || { x: 0, y: 0 }; + const siblings = parentToExecutionLeavesMap[parentId] || []; + const siblingIndex = siblings.indexOf(node.id); + + node.position = { + // Centered directly with the parent stage block axis + x: parentPos.x - nodeWidth / 2, + // Stacking cleanly downwards with 20px padding intervals + y: (parentPos.y + nodeHeight / 2) + 50 + (siblingIndex * (nodeHeight + 20)), + }; + } + } + return node; + }); +}; + + + +const Hierarchical_LineageFlow = ({ data }) => { + const proOptions = { hideAttribution: true }; + const { nodes, edges } = useMemo(() => { + if (!data || data.length === 0) return { nodes: [], edges: [] }; + + const formattedData = Array?.isArray(data) && !data?.nodes ? transformLineageData(data) : data; + + const rfNodes = formattedData?.nodes?.map((node) => ({ + id: node.id, + type: "lineageNode", + position: { x: 0, y: 0 }, + data: { + ...node, + backgroundColor: getNodeThemeColor(node.type) // Injects colors directly to the node payload + }, + })); + + const rfEdges = (formattedData?.links ?? formattedData?.edges ??[]).map((link, index) => ({ + id: `edge-${index}`, + source: link.source, + target: link.target, + type: "step", + markerEnd: { + type: MarkerType.Arrow, + color: "#b1b1b7" + }, + style: { + stroke: "#b1b1b7", + strokeWidth: 1.5, + } + })); + + return { + nodes: getLayoutedElements(rfNodes, rfEdges), + edges: rfEdges, + }; + }, [data]); + + return ( +

+ + + + + +
+ ); +}; + +export default Hierarchical_LineageFlow; \ No newline at end of file diff --git a/ui/src/components/HeirarchicalLineageFlow/index.css b/ui/src/components/HeirarchicalLineageFlow/index.css new file mode 100644 index 000000000..21fbeec6f --- /dev/null +++ b/ui/src/components/HeirarchicalLineageFlow/index.css @@ -0,0 +1,74 @@ +.lineage-title { + font-size: 14px; + font-weight: 600; + margin-top: 8px; +} + +.lineage-subtitle { + font-size: 11px; + color: #666; +} + +.lineage-badge { + color: white; + display: inline-block; + padding: 4px 8px; + border-radius: 4px; + font-size: 11px; +} + +.lineage-card { + padding: 10px; + border-radius: 6px; + background: #ffffff; + border: 1px solid #e2e8f0; + width: 200px; /* MATCHES nodeWidth */ + word-break: break-word; + overflow-wrap: break-word; + white-space: normal; + box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1); + box-sizing: border-box; + position: relative; +} + +/* Ensure the react-flow minimap sub-canvas container doesn't overlap completely */ +.react-flow__minimap { + border-radius: 8px; + overflow: hidden; + box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1); +} + +/* Styling for individual nodes inside the MiniMap element container */ +.react-flow__minimap-node { + rx: 4px !important; /* Rounded corners */ + ry: 4px !important; + stroke: #ffffff !important; + stroke-width: 2px !important; +} + +/* Color matching rules mapping exactly to your main lineage diagram */ +.minimap-node-Dataset { + fill: #10b981 !important; /* Emerald Green */ +} + +.minimap-node-Model { + fill: #f59e0b !important; /* Warm Amber */ +} + +.minimap-node-Metrics { + fill: #ef4444 !important; /* Rose Red */ +} + +.minimap-node-Execution, .minimap-node-default { + fill: #3b82f6 !important; /* Blue Accent */ +} + +/* Enhances the viewport bounding box look */ +.react-flow__minimap-mask { + stroke: #cbd5e1 !important; + stroke-width: 1px !important; +} + +.react-flow__attribution { + display: none !important; +} \ No newline at end of file diff --git a/ui/src/components/HeirarchicalLineageFlow/lineagenode.jsx b/ui/src/components/HeirarchicalLineageFlow/lineagenode.jsx new file mode 100644 index 000000000..689efe52e --- /dev/null +++ b/ui/src/components/HeirarchicalLineageFlow/lineagenode.jsx @@ -0,0 +1,64 @@ +import React from "react"; +import { Handle, Position } from "reactflow"; + +const getColor = (type) => { + switch (type) { + case "Dataset": + return "#10b981"; + + case "Execution": + return "#3b82f6"; + + case "Node": + case "Metrics": + return "#ef4444"; + + case "Model": + case "Stage": + return "#f59e0b"; + + case "Environment": + return "#14b8a6"; + + default: + return "#64748b"; + } +}; + +const LineageNode1 = ({ data }) => { + return ( +
+ + + + +
+ {data.type ? data.type.toUpperCase() : "NODE"} +
+ + + +
+ {data.name} +
+ + {data.uuid && ( +
+ {data.uuid} +
+ )} + + +
+ ); +}; + +export default LineageNode1; \ No newline at end of file diff --git a/ui/src/components/HeirarchicalLineageFlow/trasformeddata.jsx b/ui/src/components/HeirarchicalLineageFlow/trasformeddata.jsx new file mode 100644 index 000000000..06c66242a --- /dev/null +++ b/ui/src/components/HeirarchicalLineageFlow/trasformeddata.jsx @@ -0,0 +1,83 @@ +export const transformNestedStageData = (rawJson) => { + const nodes = []; + const links = []; + + if (!rawJson?.stages) { + return { nodes, links }; + } + + const envId = `env-${rawJson.environment || "env"}`; + + nodes.push({ + id: envId, + name: rawJson.environment || "Environment", + type: "Environment", + }); + + const addExecutionChildren = (execution, executionId) => { + if (!Array.isArray(execution.children)) return; + + execution.children.forEach((child) => { + const childId = + child.node_id || + child.execution_id || + `${executionId}-${child.node_name}`; + + nodes.push({ + id: childId, + name: + child.node_name || + child.execution_type || + "Node", + type: "Node", + }); + + links.push({ + source: executionId, + target: childId, + }); + + // Recursive support + if (Array.isArray(child.children)) { + addExecutionChildren(child, childId); + } + }); + }; + + rawJson.stages.forEach((stage) => { + const stageId = `stage-${stage.stage_id}`; + + nodes.push({ + id: stageId, + name: stage.stage_name, + type: "Stage", + }); + + links.push({ + source: envId, + target: stageId, + }); + + if (Array.isArray(stage.executions)) { + stage.executions.forEach((exec) => { + const execId = `exec-${exec.execution_id}`; + + nodes.push({ + id: execId, + name: exec.execution_type, + type: "Execution", + }); + + links.push({ + source: stageId, + target: execId, + }); + + // ADD CHILD NODES HERE + addExecutionChildren(exec, execId); + }); + } + }); + + return { nodes, links }; +}; \ No newline at end of file diff --git a/ui/src/components/Sidebar/index.jsx b/ui/src/components/Sidebar/index.jsx index 73b3f997d..719bf48fa 100644 --- a/ui/src/components/Sidebar/index.jsx +++ b/ui/src/components/Sidebar/index.jsx @@ -23,6 +23,7 @@ const LINEAGE_LABELS = { Artifact_Tree: "Artifact Lineage", Execution_Tree: "Execution Lineage", Artifact_Execution_Tree: "Artifact Execution Lineage", + Heirarchical_Lineage: "Hierarchical Lineage", }; // Icon per lineage type @@ -41,6 +42,13 @@ const LineageIcon = ({ type }) => { ); } + if (type === "Heirarchical_Lineage") { + return ( + + + + ); + } return ( diff --git a/ui/src/pages/lineage/index.jsx b/ui/src/pages/lineage/index.jsx index 9e11eea54..91b8b2bc0 100644 --- a/ui/src/pages/lineage/index.jsx +++ b/ui/src/pages/lineage/index.jsx @@ -27,6 +27,8 @@ import ExecutionTree from "../../components/ExecutionTree"; import ExecutionTangledDropdown from "../../components/ExecutionTangledDropdown"; import ArtifactExecutionTangledTree from "../../components/ArtifactExecutionTangledTree"; import Loader from "../../components/Loader"; +import Hierarchical_LineageFlow from "../../components/HeirarchicalLineageFlow/heirarchical_lineage"; +import { transformNestedStageData } from "../../components/HeirarchicalLineageFlow/trasformeddata"; const client = new FastAPIClient(config); @@ -37,6 +39,7 @@ const Lineage = () => { "Artifact_Tree", "Execution_Tree", "Artifact_Execution_Tree", + "Heirarchical_Lineage" ]; const [selectedLineageType, setSelectedLineageType] = useState("Artifact_Tree"); const [selectedExecutionType, setSelectedExecutionType] = useState(null); @@ -47,6 +50,7 @@ const Lineage = () => { const [artitreeData, setArtiTreeData] = useState(null); const [artiexetreeData, setArtiExeTreeData] = useState(null); const [loading, setLoading] = useState(true); + const [hierarchicalDataImp, setHierarchicalDataImp] = useState(null); // fetching list of pipelines useEffect(() => { @@ -90,6 +94,8 @@ const Lineage = () => { fetchExecutionTypes(pipeline, selectedLineageType); } else if (selectedLineageType === "Artifact_Execution_Tree") { fetchArtiExeTree(pipeline); + } else if (selectedLineageType === "Heirarchical_Lineage") { + fetchHierarchicalLineageImp(pipeline); } else { fetchArtifactTree(pipeline); } @@ -112,6 +118,8 @@ const Lineage = () => { fetchExecutionTypes(selectedPipeline, lineageType); } else if (lineageType === "Artifact_Execution_Tree") { fetchArtiExeTree(selectedPipeline); + } else if (lineageType === "Heirarchical_Lineage") { + fetchHierarchicalLineageImp(selectedPipeline, ""); } else { fetchArtifactTree(selectedPipeline); } @@ -174,6 +182,25 @@ const Lineage = () => { setLineageArtifactsKey((prevKey) => prevKey + 1); }; + const fetchHierarchicalLineageImp = (pipelineName) => { + setLoading(true); + client.getHierarchicalLineage(pipelineName).then((data) => { + if (data === null) { + setHierarchicalDataImp(null); + setLoading(false); + return; + } + const transformed = transformNestedStageData(data); + setHierarchicalDataImp(transformed); + setLoading(false); + + }).catch((err) => { + console.error("Failed to fetch hierarchical lineage:", err); + setHierarchicalDataImp(null); + setLoading(false); + }); + }; + // Extract uuid from execution_type_name "Prepare_3f45" ---> "3f45" const extractUuid = (data) => { return data.split("_").pop(); @@ -324,6 +351,10 @@ const Lineage = () => { /> )} + {!loading && selectedPipeline !== null && + selectedLineageType === "Heirarchical_Lineage" && + hierarchicalDataImp && () + }
From 484f3825d5f3198cfd373d64b2c70106874a7220 Mon Sep 17 00:00:00 2001 From: RajPatil152 Date: Thu, 9 Jul 2026 04:21:32 +0000 Subject: [PATCH 2/3] Remove commented code --- server/app/utils.py | 119 -------------------------------------------- 1 file changed, 119 deletions(-) diff --git a/server/app/utils.py b/server/app/utils.py index 251856f10..9088387b5 100644 --- a/server/app/utils.py +++ b/server/app/utils.py @@ -100,125 +100,6 @@ def get_fqdn(name: str) -> str: except Exception: return "127.0.0.1" - -# def convert_to_stage_json(input_json: dict) -> dict: -# """ -# Convert arbitrary MLMD-like JSON into the `stage.json` schema expected by the UI. - -# This function is permissive and will attempt to map common shapes into the -# schema produced previously by the static `stage.json` used in the UI. -# It will synthesize `stage_id`, `execution_id` and `node_id` values when -# they are missing. -# """ -# # If input already matches expected format, return unchanged -# if isinstance(input_json, dict) and "stages" in input_json and isinstance(input_json.get("stages"), list): -# return input_json - -# # attempt to find stages list in input under common keys -# stages_candidate = None -# if isinstance(input_json, dict): -# for key in ("stages", "stage_list", "stages_input", "stageList", "Pipeline", "pipelines"): -# val = input_json.get(key) -# if isinstance(val, list): -# stages_candidate = val -# break - -# if stages_candidate is None and isinstance(input_json, list): -# stages_candidate = input_json - -# if stages_candidate is None: -# # fallback: wrap whole payload as single stage with one execution -# stages_candidate = [{"stage_name": "stage_1", "executions": [input_json]}] - -# out = { -# "environment": input_json.get("environment", "test-env") if isinstance(input_json, dict) else "test-env", -# "metadata": input_json.get("metadata", {"version": "1.0.0", "description": "converted"}) if isinstance(input_json, dict) else {"version": "1.0.0", "description": "converted"}, -# "stages": [] -# } - -# stage_idx = 1 -# exec_idx = 1 -# node_idx = 1 - -# def next_stage_id(): -# nonlocal stage_idx -# sid = f"stage_{stage_idx:02d}" -# stage_idx += 1 -# return sid - -# def next_exec_id(): -# nonlocal exec_idx -# eid = f"exec_{exec_idx:03d}" -# exec_idx += 1 -# return eid - -# def next_node_id(): -# nonlocal node_idx -# nid = f"node_{node_idx:03d}" -# node_idx += 1 -# return nid - -# for s in stages_candidate: -# # s may be string, dict, or other -# if isinstance(s, str): -# stage_name = s -# executions = [] -# elif isinstance(s, dict): -# # prefer explicit names used in MLMD -> try common keys -# stage_name = s.get("stage_name") or s.get("stage") or s.get("name") or s.get("Context_Type") or f"stage_{stage_idx}" -# executions = s.get("executions") or s.get("executions_list") or s.get("runs") or s.get("Execution") or [] -# else: -# stage_name = str(s) -# executions = [] - -# stage_obj = { -# "stage_id": next_stage_id(), -# "stage_name": stage_name, -# "status": "completed", -# "executions": [] -# } - -# # If executions is a dict, convert to list -# if isinstance(executions, dict): -# exec_items = [] -# for k, v in executions.items(): -# exec_items.append({"execution_type": k, "children": v}) -# executions = exec_items - -# for e in executions: -# if isinstance(e, str): -# execution_type = e -# children = [] -# elif isinstance(e, dict): -# execution_type = e.get("execution_type") or e.get("type") or e.get("name") or e.get("Execution_Type") or f"execution_{exec_idx}" -# children = e.get("children") or e.get("nodes") or e.get("steps") or [] -# else: -# execution_type = str(e) -# children = [] - -# exec_obj = { -# "execution_id": next_exec_id(), -# "execution_type": execution_type, -# "children": [] -# } - -# # normalize children -# for c in children: -# if isinstance(c, str): -# node_name = c -# elif isinstance(c, dict): -# node_name = c.get("node_name") or c.get("name") or c.get("node") or str(c) -# else: -# node_name = str(c) -# node_obj = {"node_id": next_node_id(), "node_name": node_name} -# exec_obj["children"].append(node_obj) - -# stage_obj["executions"].append(exec_obj) - -# out["stages"].append(stage_obj) - -# return out - import json def convert_to_stage_json(input_json: dict) -> dict: From 6088a55c2a926a6c3e8dad61db721a02a225c655 Mon Sep 17 00:00:00 2001 From: RajPatil152 Date: Tue, 14 Jul 2026 05:17:40 +0000 Subject: [PATCH 3/3] added changes --- server/app/main.py | 2 +- server/app/utils.py | 11 ++-- .../heirarchical_lineage.jsx | 8 ++- .../HeirarchicalLineageFlow/index.css | 34 ++++++++++++- .../HeirarchicalLineageFlow/lineagenode.jsx | 50 ++++++++++--------- .../trasformeddata.jsx | 16 +++--- 6 files changed, 76 insertions(+), 45 deletions(-) diff --git a/server/app/main.py b/server/app/main.py index 74087dfe9..17a23504b 100644 --- a/server/app/main.py +++ b/server/app/main.py @@ -628,7 +628,7 @@ async def hierarchical_lineage(request: Request, pipeline_name: str): raise HTTPException(status_code=404, detail=f"Pipeline {pipeline_name} not found or has no MLMD data.") try: - converted = convert_to_stage_json(json_payload) + converted = convert_to_stage_json(json_payload, pipeline_name) except Exception as e: raise HTTPException(status_code=500, detail=f"Failed to convert MLMD to stage JSON: {e}") diff --git a/server/app/utils.py b/server/app/utils.py index 9088387b5..79c92a160 100644 --- a/server/app/utils.py +++ b/server/app/utils.py @@ -102,7 +102,7 @@ def get_fqdn(name: str) -> str: import json -def convert_to_stage_json(input_json: dict) -> dict: +def convert_to_stage_json(input_json: dict, pipeline_name: str) -> dict: """ Converts MLMD JSON for a clean hierarchy map. - Removes trailing child nodes underneath executions. @@ -150,7 +150,7 @@ def extract_stages_recursively(data): stages_candidate = [] out = { - "environment": "test-env", + "environment": pipeline_name, "metadata": { "version": "4.0.0", "description": "Executions Lineage Map" }, "stages": [] } @@ -199,9 +199,10 @@ def extract_stages_recursively(data): # 1. Fetch execution base name (e.g., "Prepare") exec_base_name = e.get("type") or "Execution" - # 2. Extract full UUID/Commit hash string - full_uuid = str(e_props.get("Git_End_Commit") or e_props.get("Git_Start_Commit") or e.get("id") or "") - truncated_uuid = full_uuid[:6] if full_uuid else f"ex_{exec_idx}" + # 2. Use Execution_uuid first — same field the tangled-tree lineage keys off of, + # so the same execution shows the same short UUID in both views. + full_uuid = str(e_props.get("Execution_uuid") or e_props.get("Git_End_Commit") or e_props.get("Git_Start_Commit") or e.get("id") or "") + truncated_uuid = full_uuid[:4] if full_uuid else f"ex_{exec_idx}" # 3. Create the multi-line UI text block # Note: '\n' handles line breaks in graph frameworks configured with CSS white-space: pre-wrap diff --git a/ui/src/components/HeirarchicalLineageFlow/heirarchical_lineage.jsx b/ui/src/components/HeirarchicalLineageFlow/heirarchical_lineage.jsx index dfdfe53fd..7a21e00dd 100644 --- a/ui/src/components/HeirarchicalLineageFlow/heirarchical_lineage.jsx +++ b/ui/src/components/HeirarchicalLineageFlow/heirarchical_lineage.jsx @@ -1,4 +1,4 @@ -import React, { useMemo } from "react"; +import React, { useMemo, useState } from "react"; import ReactFlow, { Controls, Background, MiniMap, MarkerType, useNodes } from "reactflow"; import dagre from "dagre"; import "reactflow/dist/style.css"; @@ -189,10 +189,9 @@ const getLayoutedElements = (nodes = [], edges = []) => { const siblingIndex = siblings.indexOf(node.id); node.position = { - // Centered directly with the parent stage block axis x: parentPos.x - nodeWidth / 2, - // Stacking cleanly downwards with 20px padding intervals - y: (parentPos.y + nodeHeight / 2) + 50 + (siblingIndex * (nodeHeight + 20)), + // Increased gap: was +20, now +40 for clearer separation between stacked nodes + y: (parentPos.y + nodeHeight / 2) + 60 + (siblingIndex * (nodeHeight + 40)), }; } } @@ -215,7 +214,6 @@ const Hierarchical_LineageFlow = ({ data }) => { position: { x: 0, y: 0 }, data: { ...node, - backgroundColor: getNodeThemeColor(node.type) // Injects colors directly to the node payload }, })); diff --git a/ui/src/components/HeirarchicalLineageFlow/index.css b/ui/src/components/HeirarchicalLineageFlow/index.css index 21fbeec6f..af6ad730b 100644 --- a/ui/src/components/HeirarchicalLineageFlow/index.css +++ b/ui/src/components/HeirarchicalLineageFlow/index.css @@ -5,8 +5,10 @@ } .lineage-subtitle { - font-size: 11px; + font-size: 14px; color: #666; + font-weight: 600; + margin-top: 2px; } .lineage-badge { @@ -22,7 +24,7 @@ border-radius: 6px; background: #ffffff; border: 1px solid #e2e8f0; - width: 200px; /* MATCHES nodeWidth */ + width: 200px; word-break: break-word; overflow-wrap: break-word; white-space: normal; @@ -71,4 +73,32 @@ .react-flow__attribution { display: none !important; +} + +.lineage-tooltip { + position: absolute; + top: 0; + left: 100%; + margin-left: 12px; + z-index: 9999; + padding: 12px 16px; + background: #ffffff; + border: 1px solid #cbd5e1; + border-radius: 8px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + font-size: 13px; + line-height: 1.5; + white-space: pre-wrap; + min-width: 260px; + max-width: 360px; + pointer-events: none; +} + +/* Raise the whole node above its siblings while hovered, so the tooltip escapes cleanly */ +.react-flow__node { + transition: z-index 0s; +} + +.react-flow__node:hover { + z-index: 9999 !important; } \ No newline at end of file diff --git a/ui/src/components/HeirarchicalLineageFlow/lineagenode.jsx b/ui/src/components/HeirarchicalLineageFlow/lineagenode.jsx index 689efe52e..e9ff2e3ba 100644 --- a/ui/src/components/HeirarchicalLineageFlow/lineagenode.jsx +++ b/ui/src/components/HeirarchicalLineageFlow/lineagenode.jsx @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useState } from "react"; import { Handle, Position } from "reactflow"; const getColor = (type) => { @@ -9,51 +9,53 @@ const getColor = (type) => { case "Execution": return "#3b82f6"; - case "Node": + case "Node": case "Metrics": - return "#ef4444"; + return "#ef4444"; case "Model": case "Stage": - return "#f59e0b"; + return "#f59e0b"; case "Environment": - return "#14b8a6"; - + return "#14b8a6"; + default: return "#64748b"; } }; +const getBadgeLabel = (type) => { + if (type === "Environment") return "PIPELINE_NAME"; + return type ? type.toUpperCase() : "NODE"; +}; + const LineageNode1 = ({ data }) => { + const [showTooltip, setShowTooltip] = useState(false); + const { backgroundColor, fullUuid, ...rest } = data; + const tooltipData = { ...rest, uuid: fullUuid || data.uuid }; + return (
setShowTooltip(true)} + onMouseLeave={() => setShowTooltip(false)} + style={{ position: "relative" }} > - - -
- {data.type ? data.type.toUpperCase() : "NODE"} +
+ {getBadgeLabel(data.type)}
- +
{data.name}
-
- {data.name} -
+ {data.uuid &&
{data.uuid}
} - {data.uuid && ( -
- {data.uuid} -
+ {showTooltip && ( +
+          {JSON.stringify(tooltipData, null, 2)}
+        
)} diff --git a/ui/src/components/HeirarchicalLineageFlow/trasformeddata.jsx b/ui/src/components/HeirarchicalLineageFlow/trasformeddata.jsx index 06c66242a..330da82c8 100644 --- a/ui/src/components/HeirarchicalLineageFlow/trasformeddata.jsx +++ b/ui/src/components/HeirarchicalLineageFlow/trasformeddata.jsx @@ -6,7 +6,7 @@ export const transformNestedStageData = (rawJson) => { return { nodes, links }; } - const envId = `env-${rawJson.environment || "env"}`; + const envId = `${rawJson.environment || "env"}`; nodes.push({ id: envId, @@ -25,10 +25,7 @@ export const transformNestedStageData = (rawJson) => { nodes.push({ id: childId, - name: - child.node_name || - child.execution_type || - "Node", + name: child.node_name || child.execution_type || "Node", type: "Node", }); @@ -37,7 +34,6 @@ export const transformNestedStageData = (rawJson) => { target: childId, }); - // Recursive support if (Array.isArray(child.children)) { addExecutionChildren(child, childId); } @@ -59,13 +55,17 @@ export const transformNestedStageData = (rawJson) => { }); if (Array.isArray(stage.executions)) { - stage.executions.forEach((exec) => { + const orderedExecutions = [...stage.executions].reverse(); // fix reversed backend order + orderedExecutions.forEach((exec) => { const execId = `exec-${exec.execution_id}`; + const [execName, execUuidLine] = (exec.execution_type || "Execution").split("\n"); nodes.push({ id: execId, - name: exec.execution_type, + name: execName || "Execution", type: "Execution", + uuid: execUuidLine || (exec.full_uuid ? exec.full_uuid.substring(0, 4) : ""), + fullUuid: exec.full_uuid || execUuidLine || "", }); links.push({