@principal-ade/dynamic-file-tree 0.1.59 → 0.1.61
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +291 -61
- package/dist/src/components/WorkflowScenarioTree/WorkflowScenarioTree.stories.d.ts +9 -0
- package/dist/src/components/WorkflowScenarioTree/WorkflowScenarioTree.stories.d.ts.map +1 -0
- package/dist/src/components/WorkflowScenarioTree/WorkflowScenarioTreeCore.d.ts +4 -0
- package/dist/src/components/WorkflowScenarioTree/WorkflowScenarioTreeCore.d.ts.map +1 -0
- package/dist/src/components/WorkflowScenarioTree/index.d.ts +3 -0
- package/dist/src/components/WorkflowScenarioTree/index.d.ts.map +1 -0
- package/dist/src/components/WorkflowScenarioTree/types.d.ts +76 -0
- package/dist/src/components/WorkflowScenarioTree/types.d.ts.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -20,6 +20,8 @@ export { MultiFileTree, MultiFileTreeCore } from './src/components/MultiFileTree
|
|
|
20
20
|
export type { MultiFileTreeProps, MultiFileTreeCoreProps } from './src/components/MultiFileTree';
|
|
21
21
|
export { StoryboardWorkflowsTreeCore } from './src/components/StoryboardWorkflowsTree/StoryboardWorkflowsTreeCore';
|
|
22
22
|
export type { StoryboardWorkflowsTreeProps, StoryboardWorkflowNodeData, StoryboardWorkflowNodeType, DiscoveredStoryboard, DiscoveredWorkflow, } from './src/components/StoryboardWorkflowsTree/types';
|
|
23
|
+
export { WorkflowScenarioTreeCore } from './src/components/WorkflowScenarioTree';
|
|
24
|
+
export type { WorkflowScenarioTreeProps, WorkflowScenarioNodeData, WorkflowScenarioNodeType, WorkflowWithScenarios, WorkflowFilterMode, } from './src/components/WorkflowScenarioTree';
|
|
23
25
|
export { CanvasListTreeCore } from './src/components/CanvasListTree/CanvasListTreeCore';
|
|
24
26
|
export type { CanvasListTreeProps, CanvasListNodeData, CanvasListNodeType, DiscoveredCanvas, } from './src/components/CanvasListTree/types';
|
|
25
27
|
export { TelemetryCoverageFileTree, calculateTelemetryCoverageStats, } from './src/components/TelemetryCoverageFileTree';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,YAAY,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAGxG,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAG7E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,YAAY,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAG7E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,YAAY,EAAE,oBAAoB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAGhG,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,YAAY,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAGnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,YAAY,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAGjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,YAAY,EACV,sBAAsB,EACtB,aAAa,EACb,SAAS,EACV,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AACzF,YAAY,EAAE,+BAA+B,EAAE,MAAM,6CAA6C,CAAC;AAGnG,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAClF,YAAY,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAGjG,OAAO,EAAE,2BAA2B,EAAE,MAAM,sEAAsE,CAAC;AACnH,YAAY,EACV,4BAA4B,EAC5B,0BAA0B,EAC1B,0BAA0B,EAC1B,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,gDAAgD,CAAC;AAGxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;AACxF,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,uCAAuC,CAAC;AAG/C,OAAO,EACL,yBAAyB,EACzB,+BAA+B,GAChC,MAAM,4CAA4C,CAAC;AACpD,YAAY,EACV,8BAA8B,EAC9B,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EAAE,kCAAkC,EAAE,MAAM,qDAAqD,CAAC;AACzG,YAAY,EAAE,uCAAuC,EAAE,MAAM,qDAAqD,CAAC;AAGnH,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,YAAY,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAGxG,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAG7E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,YAAY,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAG7E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,YAAY,EAAE,oBAAoB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAGhG,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,YAAY,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAGnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,YAAY,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAGjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,YAAY,EACV,sBAAsB,EACtB,aAAa,EACb,SAAS,EACV,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AACzF,YAAY,EAAE,+BAA+B,EAAE,MAAM,6CAA6C,CAAC;AAGnG,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAClF,YAAY,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAGjG,OAAO,EAAE,2BAA2B,EAAE,MAAM,sEAAsE,CAAC;AACnH,YAAY,EACV,4BAA4B,EAC5B,0BAA0B,EAC1B,0BAA0B,EAC1B,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,gDAAgD,CAAC;AAGxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACjF,YAAY,EACV,yBAAyB,EACzB,wBAAwB,EACxB,wBAAwB,EACxB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,uCAAuC,CAAC;AAG/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;AACxF,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,uCAAuC,CAAC;AAG/C,OAAO,EACL,yBAAyB,EACzB,+BAA+B,GAChC,MAAM,4CAA4C,CAAC;AACpD,YAAY,EACV,8BAA8B,EAC9B,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EAAE,kCAAkC,EAAE,MAAM,qDAAqD,CAAC;AACzG,YAAY,EAAE,uCAAuC,EAAE,MAAM,qDAAqD,CAAC;AAGnH,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/index.mjs
CHANGED
|
@@ -2178,10 +2178,239 @@ var StoryboardWorkflowsTreeCore = ({
|
|
|
2178
2178
|
...dndProps
|
|
2179
2179
|
}, NodeRenderer));
|
|
2180
2180
|
};
|
|
2181
|
-
// src/components/
|
|
2182
|
-
import { Package as Package2,
|
|
2183
|
-
import React12, { useMemo as useMemo10
|
|
2181
|
+
// src/components/WorkflowScenarioTree/WorkflowScenarioTreeCore.tsx
|
|
2182
|
+
import { Package as Package2, Workflow as Workflow2, GitCommit as GitCommit2, ListChecks, List } from "lucide-react";
|
|
2183
|
+
import React12, { useMemo as useMemo10 } from "react";
|
|
2184
2184
|
import { Tree as Tree4 } from "react-arborist";
|
|
2185
|
+
var buildTreeDataFromWorkflows = (workflows, workflowTraceCounts, scenarioTraceCounts, filterMode, minTraceCount) => {
|
|
2186
|
+
const packagesMap = new Map;
|
|
2187
|
+
const rootWorkflows = [];
|
|
2188
|
+
for (const workflow of workflows) {
|
|
2189
|
+
if (workflow.scope === "package" && workflow.packageName) {
|
|
2190
|
+
const existing = packagesMap.get(workflow.packageName) || [];
|
|
2191
|
+
existing.push(workflow);
|
|
2192
|
+
packagesMap.set(workflow.packageName, existing);
|
|
2193
|
+
} else {
|
|
2194
|
+
rootWorkflows.push(workflow);
|
|
2195
|
+
}
|
|
2196
|
+
}
|
|
2197
|
+
const buildWorkflowNode = (workflow) => {
|
|
2198
|
+
const workflowTraceCount = workflowTraceCounts?.[workflow.id] ?? 0;
|
|
2199
|
+
const hasTraces = workflowTraceCount > 0;
|
|
2200
|
+
if (filterMode === "with-traces" && !hasTraces) {
|
|
2201
|
+
return null;
|
|
2202
|
+
}
|
|
2203
|
+
if (filterMode === "without-traces" && hasTraces) {
|
|
2204
|
+
return null;
|
|
2205
|
+
}
|
|
2206
|
+
if (filterMode === "minimum-traces" && workflowTraceCount < (minTraceCount ?? 1)) {
|
|
2207
|
+
return null;
|
|
2208
|
+
}
|
|
2209
|
+
const scenarioNodes = workflow.scenarios.map((scenario) => {
|
|
2210
|
+
const scenarioKey = `${workflow.id}/${scenario.id}`;
|
|
2211
|
+
const scenarioTraceCount = scenarioTraceCounts?.[scenarioKey] ?? 0;
|
|
2212
|
+
return {
|
|
2213
|
+
id: `scenario:${workflow.id}:${scenario.id}`,
|
|
2214
|
+
name: scenario.description,
|
|
2215
|
+
type: "scenario",
|
|
2216
|
+
scenario,
|
|
2217
|
+
workflow,
|
|
2218
|
+
traceCount: scenarioTraceCount,
|
|
2219
|
+
hasTraces: scenarioTraceCount > 0
|
|
2220
|
+
};
|
|
2221
|
+
}).sort((a, b) => (b.traceCount ?? 0) - (a.traceCount ?? 0));
|
|
2222
|
+
const displayName = `${workflow.storyboard.name}: ${workflow.name}`;
|
|
2223
|
+
return {
|
|
2224
|
+
id: `workflow:${workflow.id}`,
|
|
2225
|
+
name: displayName,
|
|
2226
|
+
type: "workflow",
|
|
2227
|
+
workflow,
|
|
2228
|
+
storyboard: workflow.storyboard,
|
|
2229
|
+
traceCount: workflowTraceCount,
|
|
2230
|
+
hasTraces,
|
|
2231
|
+
children: scenarioNodes.length > 0 ? scenarioNodes : undefined
|
|
2232
|
+
};
|
|
2233
|
+
};
|
|
2234
|
+
const hasMultiplePackages = packagesMap.size > 1;
|
|
2235
|
+
const hasRootAndPackages = packagesMap.size > 0 && rootWorkflows.length > 0;
|
|
2236
|
+
const shouldShowPackageLevel = hasMultiplePackages || hasRootAndPackages;
|
|
2237
|
+
if (shouldShowPackageLevel) {
|
|
2238
|
+
const result = [];
|
|
2239
|
+
for (const [packageName, packageWorkflows] of packagesMap) {
|
|
2240
|
+
const workflowNodes = packageWorkflows.map(buildWorkflowNode).filter((node) => node !== null).sort((a, b) => (b.traceCount ?? 0) - (a.traceCount ?? 0));
|
|
2241
|
+
if (workflowNodes.length > 0) {
|
|
2242
|
+
result.push({
|
|
2243
|
+
id: `package:${packageName}`,
|
|
2244
|
+
name: packageName,
|
|
2245
|
+
type: "package",
|
|
2246
|
+
packageName,
|
|
2247
|
+
scope: "package",
|
|
2248
|
+
children: workflowNodes
|
|
2249
|
+
});
|
|
2250
|
+
}
|
|
2251
|
+
}
|
|
2252
|
+
if (rootWorkflows.length > 0) {
|
|
2253
|
+
const rootWorkflowNodes = rootWorkflows.map(buildWorkflowNode).filter((node) => node !== null).sort((a, b) => (b.traceCount ?? 0) - (a.traceCount ?? 0));
|
|
2254
|
+
if (rootWorkflowNodes.length > 0) {
|
|
2255
|
+
result.push({
|
|
2256
|
+
id: "package:root",
|
|
2257
|
+
name: "Root",
|
|
2258
|
+
type: "package",
|
|
2259
|
+
packageName: "root",
|
|
2260
|
+
scope: "root",
|
|
2261
|
+
children: rootWorkflowNodes
|
|
2262
|
+
});
|
|
2263
|
+
}
|
|
2264
|
+
}
|
|
2265
|
+
return result.sort((a, b) => {
|
|
2266
|
+
if (a.packageName === "root")
|
|
2267
|
+
return 1;
|
|
2268
|
+
if (b.packageName === "root")
|
|
2269
|
+
return -1;
|
|
2270
|
+
return a.name.localeCompare(b.name);
|
|
2271
|
+
});
|
|
2272
|
+
} else {
|
|
2273
|
+
const allWorkflows = [...rootWorkflows];
|
|
2274
|
+
for (const packageWorkflows of packagesMap.values()) {
|
|
2275
|
+
allWorkflows.push(...packageWorkflows);
|
|
2276
|
+
}
|
|
2277
|
+
return allWorkflows.map(buildWorkflowNode).filter((node) => node !== null).sort((a, b) => (b.traceCount ?? 0) - (a.traceCount ?? 0));
|
|
2278
|
+
}
|
|
2279
|
+
};
|
|
2280
|
+
var buildTreeDataFromVersions2 = (versionSnapshots, workflowsByVersion, workflowTraceCounts, scenarioTraceCounts, filterMode, minTraceCount) => {
|
|
2281
|
+
const result = [];
|
|
2282
|
+
for (const snapshot of versionSnapshots) {
|
|
2283
|
+
const versionKey = `${snapshot.repositoryUrl}@${snapshot.commitSha}`;
|
|
2284
|
+
const versionWorkflows = workflowsByVersion.get(versionKey) || [];
|
|
2285
|
+
const workflowChildren = buildTreeDataFromWorkflows(versionWorkflows, workflowTraceCounts, scenarioTraceCounts, filterMode, minTraceCount);
|
|
2286
|
+
if (workflowChildren.length === 0) {
|
|
2287
|
+
continue;
|
|
2288
|
+
}
|
|
2289
|
+
const versionTraceCount = versionWorkflows.reduce((sum, workflow) => {
|
|
2290
|
+
return sum + (workflowTraceCounts?.[workflow.id] ?? 0);
|
|
2291
|
+
}, 0);
|
|
2292
|
+
const repoName = snapshot.repositoryUrl.replace("https://github.com/", "");
|
|
2293
|
+
const shortSha = snapshot.commitSha.substring(0, 8);
|
|
2294
|
+
result.push({
|
|
2295
|
+
id: `version:${versionKey}`,
|
|
2296
|
+
name: `${repoName}@${shortSha}`,
|
|
2297
|
+
type: "version",
|
|
2298
|
+
versionSnapshot: snapshot,
|
|
2299
|
+
repositoryUrl: snapshot.repositoryUrl,
|
|
2300
|
+
commitSha: snapshot.commitSha,
|
|
2301
|
+
traceCount: versionTraceCount,
|
|
2302
|
+
hasTraces: versionTraceCount > 0,
|
|
2303
|
+
children: workflowChildren
|
|
2304
|
+
});
|
|
2305
|
+
}
|
|
2306
|
+
return result.sort((a, b) => (b.traceCount ?? 0) - (a.traceCount ?? 0));
|
|
2307
|
+
};
|
|
2308
|
+
var WorkflowScenarioTreeCore = ({
|
|
2309
|
+
workflows,
|
|
2310
|
+
theme,
|
|
2311
|
+
onClick,
|
|
2312
|
+
selectedNodeId,
|
|
2313
|
+
defaultOpen = false,
|
|
2314
|
+
initialOpenState,
|
|
2315
|
+
horizontalNodePadding = "16px",
|
|
2316
|
+
verticalNodePadding = "6px",
|
|
2317
|
+
verticalPadding = "20px",
|
|
2318
|
+
versionSnapshots,
|
|
2319
|
+
workflowTraceCounts,
|
|
2320
|
+
scenarioTraceCounts,
|
|
2321
|
+
workflowFilterMode = "all",
|
|
2322
|
+
minTraceCount = 1
|
|
2323
|
+
}) => {
|
|
2324
|
+
const rowHeight = useMemo10(() => {
|
|
2325
|
+
const paddingValue = parseFloat(verticalNodePadding);
|
|
2326
|
+
const contentLineHeight = 20;
|
|
2327
|
+
const borderHeight = 2;
|
|
2328
|
+
return contentLineHeight + paddingValue * 2 + borderHeight;
|
|
2329
|
+
}, [verticalNodePadding]);
|
|
2330
|
+
const treeData = useMemo10(() => {
|
|
2331
|
+
if (versionSnapshots && versionSnapshots.length > 0) {
|
|
2332
|
+
const workflowsByVersion = new Map;
|
|
2333
|
+
for (const snapshot of versionSnapshots) {
|
|
2334
|
+
const versionKey = `${snapshot.repositoryUrl}@${snapshot.commitSha}`;
|
|
2335
|
+
const versionWorkflows = workflows.filter((workflow) => {
|
|
2336
|
+
return snapshot.storyboards.some((sb) => sb.id === workflow.storyboardId);
|
|
2337
|
+
});
|
|
2338
|
+
workflowsByVersion.set(versionKey, versionWorkflows);
|
|
2339
|
+
}
|
|
2340
|
+
return buildTreeDataFromVersions2(versionSnapshots, workflowsByVersion, workflowTraceCounts, scenarioTraceCounts, workflowFilterMode, minTraceCount);
|
|
2341
|
+
} else {
|
|
2342
|
+
return buildTreeDataFromWorkflows(workflows, workflowTraceCounts, scenarioTraceCounts, workflowFilterMode, minTraceCount);
|
|
2343
|
+
}
|
|
2344
|
+
}, [workflows, versionSnapshots, workflowTraceCounts, scenarioTraceCounts, workflowFilterMode, minTraceCount]);
|
|
2345
|
+
const NodeRenderer = (props) => {
|
|
2346
|
+
const { node } = props;
|
|
2347
|
+
const data = node.data;
|
|
2348
|
+
const icon = data.type === "version" ? /* @__PURE__ */ React12.createElement(GitCommit2, {
|
|
2349
|
+
size: 16
|
|
2350
|
+
}) : data.type === "package" ? /* @__PURE__ */ React12.createElement(Package2, {
|
|
2351
|
+
size: 16
|
|
2352
|
+
}) : data.type === "workflow" ? /* @__PURE__ */ React12.createElement(Workflow2, {
|
|
2353
|
+
size: 16
|
|
2354
|
+
}) : data.type === "scenario" ? data.hasTraces ? /* @__PURE__ */ React12.createElement(ListChecks, {
|
|
2355
|
+
size: 16
|
|
2356
|
+
}) : /* @__PURE__ */ React12.createElement(List, {
|
|
2357
|
+
size: 16
|
|
2358
|
+
}) : null;
|
|
2359
|
+
const nameColor = data.type === "version" ? data.hasTraces ? "#a855f7" : theme.colors.textMuted : data.type === "package" ? theme.colors.primary : data.type === "workflow" ? data.hasTraces ? theme.colors.success : theme.colors.textSecondary : data.hasTraces ? theme.colors.secondary : theme.colors.textMuted;
|
|
2360
|
+
const nodeHorizontalPadding = data.type === "workflow" || data.type === "scenario" ? `calc(${horizontalNodePadding} + 12px)` : horizontalNodePadding;
|
|
2361
|
+
const rightContent = data.traceCount !== undefined ? /* @__PURE__ */ React12.createElement("span", {
|
|
2362
|
+
style: {
|
|
2363
|
+
marginLeft: "8px",
|
|
2364
|
+
fontSize: "12px",
|
|
2365
|
+
color: data.hasTraces ? data.type === "scenario" ? theme.colors.secondary : theme.colors.success : theme.colors.textMuted,
|
|
2366
|
+
fontWeight: 500
|
|
2367
|
+
}
|
|
2368
|
+
}, data.traceCount) : undefined;
|
|
2369
|
+
return /* @__PURE__ */ React12.createElement(TreeNode, {
|
|
2370
|
+
...props,
|
|
2371
|
+
theme,
|
|
2372
|
+
nameColor,
|
|
2373
|
+
leftIcon: icon,
|
|
2374
|
+
rightContent,
|
|
2375
|
+
horizontalNodePadding: nodeHorizontalPadding,
|
|
2376
|
+
verticalNodePadding
|
|
2377
|
+
});
|
|
2378
|
+
};
|
|
2379
|
+
const handleSelect = (selectedNodes) => {
|
|
2380
|
+
if (selectedNodes.length === 0)
|
|
2381
|
+
return;
|
|
2382
|
+
const node = selectedNodes[0];
|
|
2383
|
+
const nodeData = node.data;
|
|
2384
|
+
if (nodeData.type === "workflow" || nodeData.type === "scenario") {
|
|
2385
|
+
onClick(nodeData);
|
|
2386
|
+
}
|
|
2387
|
+
};
|
|
2388
|
+
const initialHeight = 600;
|
|
2389
|
+
const [containerRef, containerHeight] = useContainerHeight(initialHeight);
|
|
2390
|
+
return /* @__PURE__ */ React12.createElement("div", {
|
|
2391
|
+
ref: containerRef,
|
|
2392
|
+
style: {
|
|
2393
|
+
backgroundColor: theme.colors.background,
|
|
2394
|
+
color: theme.colors.text,
|
|
2395
|
+
fontFamily: theme.fonts.body,
|
|
2396
|
+
height: "100%",
|
|
2397
|
+
...verticalPadding ? { paddingTop: verticalPadding, paddingBottom: verticalPadding } : {}
|
|
2398
|
+
}
|
|
2399
|
+
}, /* @__PURE__ */ React12.createElement(Tree4, {
|
|
2400
|
+
data: treeData,
|
|
2401
|
+
onSelect: handleSelect,
|
|
2402
|
+
openByDefault: defaultOpen,
|
|
2403
|
+
...initialOpenState !== undefined && { initialOpenState },
|
|
2404
|
+
...selectedNodeId !== undefined && { selection: selectedNodeId },
|
|
2405
|
+
width: "100%",
|
|
2406
|
+
height: containerHeight,
|
|
2407
|
+
rowHeight
|
|
2408
|
+
}, NodeRenderer));
|
|
2409
|
+
};
|
|
2410
|
+
// src/components/CanvasListTree/CanvasListTreeCore.tsx
|
|
2411
|
+
import { Package as Package3, Folder, LayoutDashboard as LayoutDashboard2, FileText } from "lucide-react";
|
|
2412
|
+
import React13, { useMemo as useMemo11, useRef as useRef6 } from "react";
|
|
2413
|
+
import { Tree as Tree5 } from "react-arborist";
|
|
2185
2414
|
var buildTreeData = (canvases) => {
|
|
2186
2415
|
const packagesMap = new Map;
|
|
2187
2416
|
const rootCanvases = [];
|
|
@@ -2274,28 +2503,28 @@ var CanvasListTreeCore = ({
|
|
|
2274
2503
|
enableDragAndDrop = false
|
|
2275
2504
|
}) => {
|
|
2276
2505
|
const dndProps = getDndProps(enableDragAndDrop);
|
|
2277
|
-
const rowHeight =
|
|
2506
|
+
const rowHeight = useMemo11(() => {
|
|
2278
2507
|
const paddingValue = parseFloat(verticalNodePadding);
|
|
2279
2508
|
const contentLineHeight = 20;
|
|
2280
2509
|
const borderHeight = 2;
|
|
2281
2510
|
return contentLineHeight + paddingValue * 2 + borderHeight;
|
|
2282
2511
|
}, [verticalNodePadding]);
|
|
2283
|
-
const treeData =
|
|
2512
|
+
const treeData = useMemo11(() => buildTreeData(canvases), [canvases]);
|
|
2284
2513
|
const NodeRenderer = (props) => {
|
|
2285
2514
|
const { node } = props;
|
|
2286
2515
|
const data = node.data;
|
|
2287
|
-
const icon = data.type === "package" ? /* @__PURE__ */
|
|
2516
|
+
const icon = data.type === "package" ? /* @__PURE__ */ React13.createElement(Package3, {
|
|
2288
2517
|
size: 16
|
|
2289
|
-
}) : data.type === "canvas-folder" ? /* @__PURE__ */
|
|
2518
|
+
}) : data.type === "canvas-folder" ? /* @__PURE__ */ React13.createElement(Folder, {
|
|
2290
2519
|
size: 16
|
|
2291
|
-
}) : data.type === "overview" ? /* @__PURE__ */
|
|
2520
|
+
}) : data.type === "overview" ? /* @__PURE__ */ React13.createElement(FileText, {
|
|
2292
2521
|
size: 16
|
|
2293
|
-
}) : /* @__PURE__ */
|
|
2522
|
+
}) : /* @__PURE__ */ React13.createElement(LayoutDashboard2, {
|
|
2294
2523
|
size: 16
|
|
2295
2524
|
});
|
|
2296
2525
|
const nameColor = data.type === "package" ? theme.colors.primary : data.type === "canvas-folder" ? theme.colors.textSecondary : data.type === "overview" ? theme.colors.info || "#3b82f6" : theme.colors.warning || "#f59e0b";
|
|
2297
2526
|
const nodeHorizontalPadding = data.type === "overview" || data.type === "canvas" ? `calc(${horizontalNodePadding} + 12px)` : horizontalNodePadding;
|
|
2298
|
-
return /* @__PURE__ */
|
|
2527
|
+
return /* @__PURE__ */ React13.createElement(TreeNode, {
|
|
2299
2528
|
...props,
|
|
2300
2529
|
theme,
|
|
2301
2530
|
nameColor,
|
|
@@ -2322,7 +2551,7 @@ var CanvasListTreeCore = ({
|
|
|
2322
2551
|
};
|
|
2323
2552
|
const initialHeight = 600;
|
|
2324
2553
|
const [containerRef, containerHeight] = useContainerHeight(initialHeight);
|
|
2325
|
-
return /* @__PURE__ */
|
|
2554
|
+
return /* @__PURE__ */ React13.createElement("div", {
|
|
2326
2555
|
ref: containerRef,
|
|
2327
2556
|
style: {
|
|
2328
2557
|
backgroundColor: theme.colors.background,
|
|
@@ -2331,7 +2560,7 @@ var CanvasListTreeCore = ({
|
|
|
2331
2560
|
height: "100%",
|
|
2332
2561
|
...verticalPadding ? { paddingTop: verticalPadding, paddingBottom: verticalPadding } : {}
|
|
2333
2562
|
}
|
|
2334
|
-
}, /* @__PURE__ */
|
|
2563
|
+
}, /* @__PURE__ */ React13.createElement(Tree5, {
|
|
2335
2564
|
initialData: treeData,
|
|
2336
2565
|
onSelect: handleSelect,
|
|
2337
2566
|
openByDefault: defaultOpen,
|
|
@@ -2350,9 +2579,9 @@ import {
|
|
|
2350
2579
|
Circle as Circle2,
|
|
2351
2580
|
TestTube
|
|
2352
2581
|
} from "lucide-react";
|
|
2353
|
-
import
|
|
2354
|
-
import { Tree as
|
|
2355
|
-
var TelemetryCoverageContext =
|
|
2582
|
+
import React14, { useMemo as useMemo12, useRef as useRef7 } from "react";
|
|
2583
|
+
import { Tree as Tree6 } from "react-arborist";
|
|
2584
|
+
var TelemetryCoverageContext = React14.createContext(null);
|
|
2356
2585
|
var DEFAULT_TEST_PATTERNS = [
|
|
2357
2586
|
/\.test\.[jt]sx?$/,
|
|
2358
2587
|
/\.spec\.[jt]sx?$/,
|
|
@@ -2369,7 +2598,7 @@ var getCoverageStatusDisplay = (coverage, _theme) => {
|
|
|
2369
2598
|
switch (status) {
|
|
2370
2599
|
case "covered":
|
|
2371
2600
|
return {
|
|
2372
|
-
icon: /* @__PURE__ */
|
|
2601
|
+
icon: /* @__PURE__ */ React14.createElement(Activity, {
|
|
2373
2602
|
size: 14
|
|
2374
2603
|
}),
|
|
2375
2604
|
color: "#22c55e",
|
|
@@ -2378,7 +2607,7 @@ var getCoverageStatusDisplay = (coverage, _theme) => {
|
|
|
2378
2607
|
};
|
|
2379
2608
|
case "partial":
|
|
2380
2609
|
return {
|
|
2381
|
-
icon: /* @__PURE__ */
|
|
2610
|
+
icon: /* @__PURE__ */ React14.createElement(CircleDot2, {
|
|
2382
2611
|
size: 14
|
|
2383
2612
|
}),
|
|
2384
2613
|
color: "#eab308",
|
|
@@ -2387,7 +2616,7 @@ var getCoverageStatusDisplay = (coverage, _theme) => {
|
|
|
2387
2616
|
};
|
|
2388
2617
|
case "none":
|
|
2389
2618
|
return {
|
|
2390
|
-
icon: /* @__PURE__ */
|
|
2619
|
+
icon: /* @__PURE__ */ React14.createElement(Circle2, {
|
|
2391
2620
|
size: 14
|
|
2392
2621
|
}),
|
|
2393
2622
|
color: "#6b7280",
|
|
@@ -2489,7 +2718,7 @@ var TelemetryCoverageFileTree = ({
|
|
|
2489
2718
|
enableDragAndDrop = false
|
|
2490
2719
|
}) => {
|
|
2491
2720
|
const dndProps = getDndProps(enableDragAndDrop);
|
|
2492
|
-
const coverageMap =
|
|
2721
|
+
const coverageMap = useMemo12(() => {
|
|
2493
2722
|
const map = new Map;
|
|
2494
2723
|
coverageData.forEach((item) => {
|
|
2495
2724
|
map.set(item.filePath, item);
|
|
@@ -2498,7 +2727,7 @@ var TelemetryCoverageFileTree = ({
|
|
|
2498
2727
|
}, [coverageData]);
|
|
2499
2728
|
const NodeRenderer = (props) => {
|
|
2500
2729
|
const { node } = props;
|
|
2501
|
-
const ctx =
|
|
2730
|
+
const ctx = React14.useContext(TelemetryCoverageContext);
|
|
2502
2731
|
const coverage = ctx?.coverageMap.get(node.data.id);
|
|
2503
2732
|
const hasTracedChildren = ctx?.hasTracedChildrenMap.get(node.data.id);
|
|
2504
2733
|
const coverageDisplay = coverage ? getCoverageStatusDisplay(coverage, theme) : null;
|
|
@@ -2510,11 +2739,11 @@ var TelemetryCoverageFileTree = ({
|
|
|
2510
2739
|
} else if (node.data.isTestFile) {
|
|
2511
2740
|
nameColor = "#6b728080";
|
|
2512
2741
|
}
|
|
2513
|
-
const leftIcon = node.data.isTestFile && !coverage ? /* @__PURE__ */
|
|
2742
|
+
const leftIcon = node.data.isTestFile && !coverage ? /* @__PURE__ */ React14.createElement(TestTube, {
|
|
2514
2743
|
size: 14,
|
|
2515
2744
|
style: { marginRight: 4, color: "#6b7280" }
|
|
2516
2745
|
}) : null;
|
|
2517
|
-
const rightContent = coverageDisplay ? /* @__PURE__ */
|
|
2746
|
+
const rightContent = coverageDisplay ? /* @__PURE__ */ React14.createElement("div", {
|
|
2518
2747
|
style: {
|
|
2519
2748
|
display: "flex",
|
|
2520
2749
|
alignItems: "center",
|
|
@@ -2522,14 +2751,14 @@ var TelemetryCoverageFileTree = ({
|
|
|
2522
2751
|
marginRight: "8px"
|
|
2523
2752
|
},
|
|
2524
2753
|
title: coverageDisplay.label
|
|
2525
|
-
}, coverageDisplay.icon, /* @__PURE__ */
|
|
2754
|
+
}, coverageDisplay.icon, /* @__PURE__ */ React14.createElement("span", {
|
|
2526
2755
|
style: {
|
|
2527
2756
|
marginLeft: "4px",
|
|
2528
2757
|
fontSize: theme.fontSizes[0],
|
|
2529
2758
|
fontWeight: "bold",
|
|
2530
2759
|
fontFamily: "monospace"
|
|
2531
2760
|
}
|
|
2532
|
-
}, coverageDisplay.badge)) : node.data.isTestFile ? /* @__PURE__ */
|
|
2761
|
+
}, coverageDisplay.badge)) : node.data.isTestFile ? /* @__PURE__ */ React14.createElement("div", {
|
|
2533
2762
|
style: {
|
|
2534
2763
|
display: "flex",
|
|
2535
2764
|
alignItems: "center",
|
|
@@ -2538,10 +2767,10 @@ var TelemetryCoverageFileTree = ({
|
|
|
2538
2767
|
opacity: 0.5
|
|
2539
2768
|
},
|
|
2540
2769
|
title: "No telemetry instrumentation"
|
|
2541
|
-
}, /* @__PURE__ */
|
|
2770
|
+
}, /* @__PURE__ */ React14.createElement(Circle2, {
|
|
2542
2771
|
size: 14
|
|
2543
2772
|
})) : null;
|
|
2544
|
-
return /* @__PURE__ */
|
|
2773
|
+
return /* @__PURE__ */ React14.createElement(TreeNode, {
|
|
2545
2774
|
...props,
|
|
2546
2775
|
theme,
|
|
2547
2776
|
rightContent,
|
|
@@ -2556,16 +2785,16 @@ var TelemetryCoverageFileTree = ({
|
|
|
2556
2785
|
}
|
|
2557
2786
|
});
|
|
2558
2787
|
};
|
|
2559
|
-
const treeStructure =
|
|
2788
|
+
const treeStructure = useMemo12(() => {
|
|
2560
2789
|
return transformTreeStructure2(fileTree, showOnlyTestFiles, testFilePatterns);
|
|
2561
2790
|
}, [fileTree, showOnlyTestFiles, testFilePatterns]);
|
|
2562
|
-
const treeData =
|
|
2791
|
+
const treeData = useMemo12(() => {
|
|
2563
2792
|
if (showUncoveredFiles) {
|
|
2564
2793
|
return treeStructure;
|
|
2565
2794
|
}
|
|
2566
2795
|
return filterCoveredNodes(treeStructure, coverageMap);
|
|
2567
2796
|
}, [treeStructure, showUncoveredFiles, coverageMap]);
|
|
2568
|
-
const hasTracedChildrenMap =
|
|
2797
|
+
const hasTracedChildrenMap = useMemo12(() => {
|
|
2569
2798
|
const map = new Map;
|
|
2570
2799
|
const markTracedParents = (nodes) => {
|
|
2571
2800
|
let hasTraced = false;
|
|
@@ -2606,7 +2835,7 @@ var TelemetryCoverageFileTree = ({
|
|
|
2606
2835
|
onDirectorySelect(selectedDirs);
|
|
2607
2836
|
}
|
|
2608
2837
|
};
|
|
2609
|
-
const calculatedHeight =
|
|
2838
|
+
const calculatedHeight = useMemo12(() => {
|
|
2610
2839
|
if (autoHeight) {
|
|
2611
2840
|
const visibleNodeCount = countVisibleNodes3(treeData, openByDefault);
|
|
2612
2841
|
return visibleNodeCount * 28;
|
|
@@ -2614,7 +2843,7 @@ var TelemetryCoverageFileTree = ({
|
|
|
2614
2843
|
return initialHeight;
|
|
2615
2844
|
}, [autoHeight, treeData, openByDefault, initialHeight]);
|
|
2616
2845
|
const [containerRef, containerHeight] = useContainerHeight(calculatedHeight);
|
|
2617
|
-
return /* @__PURE__ */
|
|
2846
|
+
return /* @__PURE__ */ React14.createElement("div", {
|
|
2618
2847
|
ref: containerRef,
|
|
2619
2848
|
style: {
|
|
2620
2849
|
backgroundColor: transparentBackground ? "transparent" : theme.colors.background,
|
|
@@ -2623,9 +2852,9 @@ var TelemetryCoverageFileTree = ({
|
|
|
2623
2852
|
...autoHeight ? {} : { height: "100%" },
|
|
2624
2853
|
...verticalPadding ? { paddingTop: verticalPadding, paddingBottom: verticalPadding } : {}
|
|
2625
2854
|
}
|
|
2626
|
-
}, /* @__PURE__ */
|
|
2855
|
+
}, /* @__PURE__ */ React14.createElement(TelemetryCoverageContext.Provider, {
|
|
2627
2856
|
value: { coverageMap, hasTracedChildrenMap }
|
|
2628
|
-
}, /* @__PURE__ */
|
|
2857
|
+
}, /* @__PURE__ */ React14.createElement(Tree6, {
|
|
2629
2858
|
data: treeData,
|
|
2630
2859
|
onSelect: handleSelect,
|
|
2631
2860
|
...selectedFile !== undefined && { selection: selectedFile },
|
|
@@ -2654,7 +2883,7 @@ var calculateTelemetryCoverageStats = (coverageData) => {
|
|
|
2654
2883
|
};
|
|
2655
2884
|
// src/components/TelemetryCoverageFileTreeContainer.tsx
|
|
2656
2885
|
import { RefreshCw as RefreshCw2, Eye as Eye2, EyeOff as EyeOff2, AlertCircle as AlertCircle4, Activity as Activity2 } from "lucide-react";
|
|
2657
|
-
import
|
|
2886
|
+
import React15, { useState as useState7, useMemo as useMemo13 } from "react";
|
|
2658
2887
|
var TelemetryCoverageFileTreeContainer = ({
|
|
2659
2888
|
fileTree,
|
|
2660
2889
|
theme,
|
|
@@ -2676,10 +2905,10 @@ var TelemetryCoverageFileTreeContainer = ({
|
|
|
2676
2905
|
}) => {
|
|
2677
2906
|
const [filters, setFilters] = useState7([]);
|
|
2678
2907
|
const [showUncoveredFiles, setShowUncoveredFiles] = useState7(true);
|
|
2679
|
-
const selectedDirectories =
|
|
2908
|
+
const selectedDirectories = useMemo13(() => {
|
|
2680
2909
|
return filters.filter((f) => f.mode === "include").map((f) => f.path);
|
|
2681
2910
|
}, [filters]);
|
|
2682
|
-
const stats =
|
|
2911
|
+
const stats = useMemo13(() => calculateTelemetryCoverageStats(coverageData), [coverageData]);
|
|
2683
2912
|
const handleRefresh = () => {
|
|
2684
2913
|
onRefresh?.();
|
|
2685
2914
|
};
|
|
@@ -2687,34 +2916,34 @@ var TelemetryCoverageFileTreeContainer = ({
|
|
|
2687
2916
|
setShowUncoveredFiles(!showUncoveredFiles);
|
|
2688
2917
|
};
|
|
2689
2918
|
const percentageColor = stats.percentage >= 80 ? "#22c55e" : stats.percentage >= 50 ? "#eab308" : stats.percentage > 0 ? "#f97316" : "#6b7280";
|
|
2690
|
-
return /* @__PURE__ */
|
|
2919
|
+
return /* @__PURE__ */ React15.createElement("div", {
|
|
2691
2920
|
style: { display: "flex", flexDirection: "column", height: "100%" }
|
|
2692
|
-
}, showControls && /* @__PURE__ */
|
|
2921
|
+
}, showControls && /* @__PURE__ */ React15.createElement("div", {
|
|
2693
2922
|
style: {
|
|
2694
2923
|
padding: "12px",
|
|
2695
2924
|
borderBottom: `1px solid ${theme.colors.border || "#e0e0e0"}`,
|
|
2696
2925
|
backgroundColor: theme.colors.backgroundSecondary || theme.colors.background
|
|
2697
2926
|
}
|
|
2698
|
-
}, /* @__PURE__ */
|
|
2927
|
+
}, /* @__PURE__ */ React15.createElement("div", {
|
|
2699
2928
|
style: {
|
|
2700
2929
|
display: "flex",
|
|
2701
2930
|
alignItems: "center",
|
|
2702
2931
|
justifyContent: "space-between",
|
|
2703
2932
|
marginBottom: "8px"
|
|
2704
2933
|
}
|
|
2705
|
-
}, /* @__PURE__ */
|
|
2934
|
+
}, /* @__PURE__ */ React15.createElement("div", {
|
|
2706
2935
|
style: { display: "flex", alignItems: "center", gap: "8px" }
|
|
2707
|
-
}, /* @__PURE__ */
|
|
2936
|
+
}, /* @__PURE__ */ React15.createElement(Activity2, {
|
|
2708
2937
|
size: 16,
|
|
2709
2938
|
color: theme.colors.primary
|
|
2710
|
-
}), /* @__PURE__ */
|
|
2939
|
+
}), /* @__PURE__ */ React15.createElement("h3", {
|
|
2711
2940
|
style: {
|
|
2712
2941
|
margin: 0,
|
|
2713
2942
|
fontSize: theme.fontSizes[1],
|
|
2714
2943
|
fontWeight: "bold",
|
|
2715
2944
|
color: theme.colors.text
|
|
2716
2945
|
}
|
|
2717
|
-
}, title), stats.testFiles > 0 && /* @__PURE__ */
|
|
2946
|
+
}, title), stats.testFiles > 0 && /* @__PURE__ */ React15.createElement("span", {
|
|
2718
2947
|
style: {
|
|
2719
2948
|
backgroundColor: percentageColor,
|
|
2720
2949
|
color: "#ffffff",
|
|
@@ -2724,14 +2953,14 @@ var TelemetryCoverageFileTreeContainer = ({
|
|
|
2724
2953
|
fontWeight: "bold",
|
|
2725
2954
|
fontFamily: "monospace"
|
|
2726
2955
|
}
|
|
2727
|
-
}, stats.percentage, "%"), isLoading && /* @__PURE__ */
|
|
2956
|
+
}, stats.percentage, "%"), isLoading && /* @__PURE__ */ React15.createElement(RefreshCw2, {
|
|
2728
2957
|
size: 16,
|
|
2729
2958
|
color: theme.colors.text,
|
|
2730
2959
|
className: "telemetry-coverage-spinner",
|
|
2731
2960
|
style: { animation: "spin 1s linear infinite" }
|
|
2732
|
-
})), /* @__PURE__ */
|
|
2961
|
+
})), /* @__PURE__ */ React15.createElement("div", {
|
|
2733
2962
|
style: { display: "flex", gap: "8px" }
|
|
2734
|
-
}, /* @__PURE__ */
|
|
2963
|
+
}, /* @__PURE__ */ React15.createElement("button", {
|
|
2735
2964
|
onClick: toggleShowUncoveredFiles,
|
|
2736
2965
|
style: {
|
|
2737
2966
|
background: "none",
|
|
@@ -2746,11 +2975,11 @@ var TelemetryCoverageFileTreeContainer = ({
|
|
|
2746
2975
|
color: theme.colors.text
|
|
2747
2976
|
},
|
|
2748
2977
|
title: showUncoveredFiles ? "Show only covered files" : "Show all test files"
|
|
2749
|
-
}, showUncoveredFiles ? /* @__PURE__ */
|
|
2978
|
+
}, showUncoveredFiles ? /* @__PURE__ */ React15.createElement(EyeOff2, {
|
|
2750
2979
|
size: 14
|
|
2751
|
-
}) : /* @__PURE__ */
|
|
2980
|
+
}) : /* @__PURE__ */ React15.createElement(Eye2, {
|
|
2752
2981
|
size: 14
|
|
2753
|
-
}), showUncoveredFiles ? "Hide uncovered" : "Show all"), onRefresh && /* @__PURE__ */
|
|
2982
|
+
}), showUncoveredFiles ? "Hide uncovered" : "Show all"), onRefresh && /* @__PURE__ */ React15.createElement("button", {
|
|
2754
2983
|
onClick: handleRefresh,
|
|
2755
2984
|
disabled: isLoading,
|
|
2756
2985
|
style: {
|
|
@@ -2767,9 +2996,9 @@ var TelemetryCoverageFileTreeContainer = ({
|
|
|
2767
2996
|
opacity: isLoading ? 0.6 : 1
|
|
2768
2997
|
},
|
|
2769
2998
|
title: "Refresh coverage data"
|
|
2770
|
-
}, /* @__PURE__ */
|
|
2999
|
+
}, /* @__PURE__ */ React15.createElement(RefreshCw2, {
|
|
2771
3000
|
size: 14
|
|
2772
|
-
}), "Refresh"))), error && /* @__PURE__ */
|
|
3001
|
+
}), "Refresh"))), error && /* @__PURE__ */ React15.createElement("div", {
|
|
2773
3002
|
style: {
|
|
2774
3003
|
display: "flex",
|
|
2775
3004
|
alignItems: "center",
|
|
@@ -2782,36 +3011,36 @@ var TelemetryCoverageFileTreeContainer = ({
|
|
|
2782
3011
|
color: "#856404",
|
|
2783
3012
|
marginBottom: "8px"
|
|
2784
3013
|
}
|
|
2785
|
-
}, /* @__PURE__ */
|
|
3014
|
+
}, /* @__PURE__ */ React15.createElement(AlertCircle4, {
|
|
2786
3015
|
size: 14
|
|
2787
|
-
}), error), !error && stats.testFiles > 0 && /* @__PURE__ */
|
|
3016
|
+
}), error), !error && stats.testFiles > 0 && /* @__PURE__ */ React15.createElement("div", {
|
|
2788
3017
|
style: {
|
|
2789
3018
|
display: "flex",
|
|
2790
3019
|
gap: "16px",
|
|
2791
3020
|
fontSize: theme.fontSizes[0],
|
|
2792
3021
|
color: theme.colors.textSecondary || "#666"
|
|
2793
3022
|
}
|
|
2794
|
-
}, /* @__PURE__ */
|
|
3023
|
+
}, /* @__PURE__ */ React15.createElement("span", null, /* @__PURE__ */ React15.createElement("strong", {
|
|
2795
3024
|
style: { color: "#22c55e" }
|
|
2796
|
-
}, stats.coveredFiles), " covered"), stats.partialFiles > 0 && /* @__PURE__ */
|
|
3025
|
+
}, stats.coveredFiles), " covered"), stats.partialFiles > 0 && /* @__PURE__ */ React15.createElement("span", null, /* @__PURE__ */ React15.createElement("strong", {
|
|
2797
3026
|
style: { color: "#eab308" }
|
|
2798
|
-
}, stats.partialFiles), " partial"), /* @__PURE__ */
|
|
3027
|
+
}, stats.partialFiles), " partial"), /* @__PURE__ */ React15.createElement("span", null, /* @__PURE__ */ React15.createElement("strong", {
|
|
2799
3028
|
style: { color: "#6b7280" }
|
|
2800
|
-
}, stats.uncoveredFiles), " uncovered"), /* @__PURE__ */
|
|
3029
|
+
}, stats.uncoveredFiles), " uncovered"), /* @__PURE__ */ React15.createElement("span", {
|
|
2801
3030
|
style: { marginLeft: "auto" }
|
|
2802
|
-
}, stats.totalTraced, "/", stats.totalTests, " tests traced")), !error && stats.testFiles === 0 && /* @__PURE__ */
|
|
3031
|
+
}, stats.totalTraced, "/", stats.totalTests, " tests traced")), !error && stats.testFiles === 0 && /* @__PURE__ */ React15.createElement("div", {
|
|
2803
3032
|
style: {
|
|
2804
3033
|
fontSize: theme.fontSizes[0],
|
|
2805
3034
|
color: theme.colors.textSecondary || "#666"
|
|
2806
3035
|
}
|
|
2807
|
-
}, "No test files with coverage data found")), /* @__PURE__ */
|
|
3036
|
+
}, "No test files with coverage data found")), /* @__PURE__ */ React15.createElement(DirectoryFilterInput, {
|
|
2808
3037
|
fileTree,
|
|
2809
3038
|
theme,
|
|
2810
3039
|
filters,
|
|
2811
3040
|
onFiltersChange: setFilters
|
|
2812
|
-
}), /* @__PURE__ */
|
|
3041
|
+
}), /* @__PURE__ */ React15.createElement("div", {
|
|
2813
3042
|
style: { flex: 1, marginTop: "1rem", overflow: "hidden" }
|
|
2814
|
-
}, /* @__PURE__ */
|
|
3043
|
+
}, /* @__PURE__ */ React15.createElement(TelemetryCoverageFileTree, {
|
|
2815
3044
|
fileTree,
|
|
2816
3045
|
theme,
|
|
2817
3046
|
coverageData,
|
|
@@ -2837,6 +3066,7 @@ export {
|
|
|
2837
3066
|
extractNameFromPath,
|
|
2838
3067
|
combineRepositoryTrees,
|
|
2839
3068
|
calculateTelemetryCoverageStats,
|
|
3069
|
+
WorkflowScenarioTreeCore,
|
|
2840
3070
|
TreeNode,
|
|
2841
3071
|
TelemetryCoverageFileTreeContainer,
|
|
2842
3072
|
TelemetryCoverageFileTree,
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { WorkflowScenarioTreeCore } from './WorkflowScenarioTreeCore';
|
|
3
|
+
declare const meta: Meta<typeof WorkflowScenarioTreeCore>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof WorkflowScenarioTreeCore>;
|
|
6
|
+
export declare const Default: Story;
|
|
7
|
+
export declare const WithFilterMode: Story;
|
|
8
|
+
export declare const WithVersions: Story;
|
|
9
|
+
//# sourceMappingURL=WorkflowScenarioTree.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkflowScenarioTree.stories.d.ts","sourceRoot":"","sources":["../../../../src/components/WorkflowScenarioTree/WorkflowScenarioTree.stories.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AA8MtE,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,wBAAwB,CAI/C,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAEvD,eAAO,MAAM,OAAO,EAAE,KASrB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAuG5B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAwC1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkflowScenarioTreeCore.d.ts","sourceRoot":"","sources":["../../../../src/components/WorkflowScenarioTree/WorkflowScenarioTreeCore.tsx"],"names":[],"mappings":"AACA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAMvC,OAAO,KAAK,EAEV,yBAAyB,EAI1B,MAAM,SAAS,CAAC;AAwMjB,eAAO,MAAM,wBAAwB,EAAE,KAAK,CAAC,EAAE,CAAC,yBAAyB,CAgKxE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/WorkflowScenarioTree/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,YAAY,EACV,yBAAyB,EACzB,wBAAwB,EACxB,wBAAwB,EACxB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { Theme } from '@principal-ade/industry-theme';
|
|
2
|
+
import type { DiscoveredStoryboard, DiscoveredWorkflow, WorkflowScenario, VersionSnapshot } from '@principal-ai/principal-view-core';
|
|
3
|
+
import type { TreeNodeData } from '../TreeNode';
|
|
4
|
+
export type { DiscoveredStoryboard, DiscoveredWorkflow, WorkflowScenario, VersionSnapshot };
|
|
5
|
+
/**
|
|
6
|
+
* Workflow filter mode
|
|
7
|
+
* - 'all': Show all workflows
|
|
8
|
+
* - 'with-traces': Show only workflows that have traces
|
|
9
|
+
* - 'without-traces': Show only workflows that don't have traces
|
|
10
|
+
* - 'minimum-traces': Show workflows with at least N traces (use minTraceCount)
|
|
11
|
+
*/
|
|
12
|
+
export type WorkflowFilterMode = 'all' | 'with-traces' | 'without-traces' | 'minimum-traces';
|
|
13
|
+
/**
|
|
14
|
+
* Node types in the workflow-scenario tree
|
|
15
|
+
*/
|
|
16
|
+
export type WorkflowScenarioNodeType = 'version' | 'package' | 'workflow' | 'scenario';
|
|
17
|
+
/**
|
|
18
|
+
* Extended workflow with scenarios and parent storyboard info
|
|
19
|
+
*/
|
|
20
|
+
export interface WorkflowWithScenarios extends DiscoveredWorkflow {
|
|
21
|
+
/** Parent storyboard for context */
|
|
22
|
+
storyboard: DiscoveredStoryboard;
|
|
23
|
+
/** Workflow scenarios (from WorkflowTemplate.scenarios) */
|
|
24
|
+
scenarios: WorkflowScenario[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Node data for workflow-scenario tree
|
|
28
|
+
*/
|
|
29
|
+
export interface WorkflowScenarioNodeData extends TreeNodeData {
|
|
30
|
+
type: WorkflowScenarioNodeType;
|
|
31
|
+
children?: WorkflowScenarioNodeData[];
|
|
32
|
+
versionSnapshot?: VersionSnapshot;
|
|
33
|
+
repositoryUrl?: string;
|
|
34
|
+
commitSha?: string;
|
|
35
|
+
packageName?: string;
|
|
36
|
+
scope?: 'package' | 'root';
|
|
37
|
+
workflow?: WorkflowWithScenarios;
|
|
38
|
+
scenario?: WorkflowScenario;
|
|
39
|
+
storyboard?: DiscoveredStoryboard;
|
|
40
|
+
traceCount?: number;
|
|
41
|
+
hasTraces?: boolean;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Props for WorkflowScenarioTree component
|
|
45
|
+
*/
|
|
46
|
+
export interface WorkflowScenarioTreeProps {
|
|
47
|
+
/** Workflows with scenarios and storyboard context */
|
|
48
|
+
workflows: WorkflowWithScenarios[];
|
|
49
|
+
/** Theme for styling */
|
|
50
|
+
theme: Theme;
|
|
51
|
+
/** Click handler */
|
|
52
|
+
onClick: (node: WorkflowScenarioNodeData) => void;
|
|
53
|
+
/** Selected node ID */
|
|
54
|
+
selectedNodeId?: string;
|
|
55
|
+
/** Default open state */
|
|
56
|
+
defaultOpen?: boolean;
|
|
57
|
+
/** Initial open state for specific nodes */
|
|
58
|
+
initialOpenState?: Record<string, boolean>;
|
|
59
|
+
/** Horizontal padding for nodes */
|
|
60
|
+
horizontalNodePadding?: string;
|
|
61
|
+
/** Vertical padding for nodes */
|
|
62
|
+
verticalNodePadding?: string;
|
|
63
|
+
/** Vertical padding for container */
|
|
64
|
+
verticalPadding?: string;
|
|
65
|
+
/** Optional version snapshots for grouping workflows by version */
|
|
66
|
+
versionSnapshots?: VersionSnapshot[];
|
|
67
|
+
/** Map of workflow ID to trace count */
|
|
68
|
+
workflowTraceCounts?: Record<string, number>;
|
|
69
|
+
/** Map of scenario ID to trace count (format: "workflowId/scenarioId") */
|
|
70
|
+
scenarioTraceCounts?: Record<string, number>;
|
|
71
|
+
/** Filter mode for workflows/scenarios */
|
|
72
|
+
workflowFilterMode?: WorkflowFilterMode;
|
|
73
|
+
/** Minimum trace count (when workflowFilterMode is 'minimum-traces') */
|
|
74
|
+
minTraceCount?: number;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/components/WorkflowScenarioTree/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAErI,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,YAAY,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC;AAE5F;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,aAAa,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;AAE7F;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAEvF;;GAEG;AACH,MAAM,WAAW,qBAAsB,SAAQ,kBAAkB;IAC/D,oCAAoC;IACpC,UAAU,EAAE,oBAAoB,CAAC;IACjC,2DAA2D;IAC3D,SAAS,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,YAAY;IAC5D,IAAI,EAAE,wBAAwB,CAAC;IAC/B,QAAQ,CAAC,EAAE,wBAAwB,EAAE,CAAC;IAGtC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAGlC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,sDAAsD;IACtD,SAAS,EAAE,qBAAqB,EAAE,CAAC;IACnC,wBAAwB;IACxB,KAAK,EAAE,KAAK,CAAC;IACb,oBAAoB;IACpB,OAAO,EAAE,CAAC,IAAI,EAAE,wBAAwB,KAAK,IAAI,CAAC;IAClD,uBAAuB;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yBAAyB;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,mCAAmC;IACnC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,iCAAiC;IACjC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,qCAAqC;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,mEAAmE;IACnE,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IAGrC,wCAAwC;IACxC,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,0EAA0E;IAC1E,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAG7C,0CAA0C;IAC1C,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB"}
|
package/package.json
CHANGED