Skip to content
This repository was archived by the owner on Jun 13, 2024. It is now read-only.

Commit 95dc252

Browse files
authored
feat: base organization of graph during generation (#107)
* feat: organize the graph during generation * refactor: cleaned up generation
1 parent fd51c47 commit 95dc252

1 file changed

Lines changed: 67 additions & 28 deletions

File tree

src/state/Store.tsx

Lines changed: 67 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
parsers,
66
reusable,
77
Workflow,
8+
WorkflowJob,
89
} from '@circleci/circleci-config-sdk';
910
import { CustomCommand } from '@circleci/circleci-config-sdk/dist/src/lib/Components/Commands/exports/Reusable';
1011
import { CustomParameter } from '@circleci/circleci-config-sdk/dist/src/lib/Components/Parameters';
@@ -372,48 +373,86 @@ const Actions: StoreActions = {
372373
commands: config.commands || [],
373374
};
374375

376+
const nodeWidth = 250; // Make this dynamic
377+
const nodeHeight = 60; // Make this dynamic
378+
375379
state.workflows = config.workflows.map(({ name, jobs }) => {
376-
const nodeWidth = 200; // Make this dynamic
380+
const jobTable: Record<string, WorkflowJob> = {};
381+
382+
jobs.forEach((workflowJob) => {
383+
const jobName = workflowJob.parameters.name || workflowJob.job.name;
384+
jobTable[jobName] = workflowJob;
385+
});
386+
377387
const elements: Elements = [];
378-
const requireTable: Record<ElementId, ElementId[]> = {};
388+
const columns: Array<number> = [];
389+
const solved: Record<ElementId, number> = {};
390+
391+
const solve = (workflowJob: WorkflowJob) => {
392+
const jobName = workflowJob.parameters.name || workflowJob.job.name;
393+
394+
if (solved[jobName] !== undefined) {
395+
return solved[jobName];
396+
}
397+
398+
let column = 0;
399+
400+
if (workflowJob.parameters.requires) {
401+
let greatestColumn = 0;
402+
403+
workflowJob.parameters.requires.forEach((requiredJob) => {
404+
let requiredJobColumn = 0;
405+
406+
if (solved[requiredJob] === undefined) {
407+
requiredJobColumn = solve(jobTable[requiredJob]);
408+
} else {
409+
requiredJobColumn = solved[requiredJob];
410+
}
411+
412+
greatestColumn = Math.max(greatestColumn, requiredJobColumn);
413+
414+
// add connection line
415+
elements.push({
416+
id: v4(),
417+
source: requiredJob,
418+
target: jobName,
419+
type: 'requires',
420+
sourceHandle: `${requiredJob}_source`,
421+
targetHandle: `${jobName}_target`,
422+
animated: false,
423+
style: { stroke: '#A3A3A3', strokeWidth: '2px' },
424+
});
425+
});
379426

380-
// Build workflow and prep requirement connection generation
381-
jobs.forEach((workflowJob, i) => {
382-
const jobName = workflowJob.job.name;
427+
column = greatestColumn + 1;
428+
}
429+
430+
if (columns.length > column) {
431+
columns[column]++;
432+
} else {
433+
columns.push(1);
434+
}
383435

436+
const row = columns[column] * nodeHeight;
437+
438+
// add job node
384439
elements.push({
385440
id: jobName,
386441
data: { job: workflowJob.job, parameters: workflowJob.parameters },
387442
connectable: true,
388443
dragHandle: '.node',
389444
type: 'jobs',
390-
position: { x: i * nodeWidth, y: 0 },
445+
position: { x: column * nodeWidth, y: row },
391446
});
392447

393-
workflowJob.parameters.requires?.forEach((requiredJob) => {
394-
if (!requireTable[requiredJob]) {
395-
requireTable[requiredJob] = [jobName];
396-
return;
397-
}
448+
solved[jobName] = column;
398449

399-
requireTable[requiredJob].push(jobName);
400-
});
401-
});
450+
return column;
451+
};
402452

403-
// Generate connections
404-
Object.entries(requireTable).forEach(([jobName, requiredBy]) => {
405-
requiredBy.forEach((requiredId) => {
406-
elements.push({
407-
id: v4(),
408-
source: jobName,
409-
target: requiredId,
410-
type: 'requires',
411-
sourceHandle: `${jobName}_source`,
412-
targetHandle: `${requiredId}_target`,
413-
animated: false,
414-
style: { stroke: '#A3A3A3', strokeWidth: '2px' },
415-
});
416-
});
453+
// Build workflow and prep requirement connection generation
454+
jobs.forEach((workflowJob) => {
455+
solve(workflowJob);
417456
});
418457

419458
return {

0 commit comments

Comments
 (0)