Skip to content
This repository was archived by the owner on Jun 13, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"version": "0.1.0",
"homepage": "https://circleci-public.github.io/visual-config-editor/",
"dependencies": {
"@circleci/circleci-config-sdk": "0.5.0-alpha.11",
"@circleci/circleci-config-sdk": "0.6.0-alpha.2",
"@craco/craco": "^6.3.0",
"@monaco-editor/react": "^4.3.1",
"@testing-library/jest-dom": "^5.11.4",
Expand Down
12 changes: 10 additions & 2 deletions src/components/atoms/Definition.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { Generable } from '@circleci/circleci-config-sdk/dist/src/lib/Components';
import ComponentMapping from '../../mappings/ComponentMapping';
import { useStoreActions } from '../../state/Hooks';
import { InspectorDefinitionMenuNav } from '../menus/definitions/InspectorDefinitionMenu';

const Definition = (props: { data: any; type: ComponentMapping }) => {
const Definition = (props: { data: Generable; type: ComponentMapping }) => {
const Summary = props.type.components.summary;
const navigateTo = useStoreActions((actions) => actions.navigateTo);
const setDragging = useStoreActions((actions) => actions.setDragging);
Expand All @@ -20,9 +21,16 @@ const Definition = (props: { data: any; type: ComponentMapping }) => {
}
}}
onClick={(e) => {
// this generated object should always have a single key
const generated = props.data.generate() as { [key: string]: object };
const flattened = Object.entries(generated).map(([key, value]) => ({
name: key,
...value,
}))[0];

navigateTo({
component: InspectorDefinitionMenuNav,
props: { editing: true, values: props.data, dataType: props.type },
props: { editing: true, values: flattened, dataType: props.type },
});
}}
>
Expand Down
88 changes: 46 additions & 42 deletions src/components/atoms/form/ListProperty.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { FieldArray, useField } from 'formik';
import { ArrayHelpers, FieldArray, useField } from 'formik';
import { ReactElement } from 'react';
import { DragDropContext, Draggable, Droppable } from 'react-beautiful-dnd';
import DeleteItemIcon from '../../../icons/ui/DeleteItemIcon';
Expand All @@ -14,6 +14,47 @@ export type ListPropertyProps = InspectorFieldProps & {
emptyText?: string;
};

export type ListItemProps = {
index: number;
name: string;
arrayHelper: ArrayHelpers;
};

const ListItem = ({ index, name, arrayHelper }: ListItemProps) => {
return (
<Draggable key={index} draggableId={`${index}`} index={index}>
{(provided, snapshot) => (
<div
className="w-full mb-2 p-1 px-3 text-sm
bg-white border border-circle-gray-300 rounded-md2 flex flex-row"
ref={provided.innerRef}
{...provided.draggableProps}
>
<button
className="flex-1 cursor-pointer text-left text-circle-black leading-6"
type="button"
>
{name}
</button>
<div className="ml-auto mr-3" {...provided.dragHandleProps}>
<DragListIcon className="w-4 h-6 py-1" color="#AAAAAA" />
</div>
<button
onClick={() => {
arrayHelper.remove(index);
}}
type="button"
className="my-auto"
>
<DeleteItemIcon className="w-3 h-3" color="#AAAAAA" />
</button>
</div>
)}
</Draggable>
);
};

// TODO: Refactor
const ListProperty = ({
label,
values,
Expand Down Expand Up @@ -51,48 +92,11 @@ const ListProperty = ({
className="p-2 pr-0"
>
{values?.map((cmd: any, index: number) => (
<Draggable
key={index}
draggableId={`${index}`}
<ListItem
name={cmd.name}
index={index}
>
{(provided, snapshot) => (
<div
className="w-full mb-2 p-1 px-3 text-sm
bg-white border border-circle-gray-300 rounded-md2 flex flex-row"
ref={provided.innerRef}
{...provided.draggableProps}
>
<button
className="flex-1 cursor-pointer text-left text-circle-black leading-6"
type="button"
>
{cmd.name}
</button>
<div
className="ml-auto mr-3"
{...provided.dragHandleProps}
>
<DragListIcon
className="w-4 h-6 py-1"
color="#AAAAAA"
/>
</div>
<button
onClick={() => {
arrayHelper.remove(index);
}}
type="button"
className="my-auto"
>
<DeleteItemIcon
className="w-3 h-3"
color="#AAAAAA"
/>
</button>
</div>
)}
</Draggable>
arrayHelper={arrayHelper}
/>
))}
{provided.placeholder}
</div>
Expand Down
2 changes: 1 addition & 1 deletion src/components/atoms/summaries/ExecutorSummary.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ReusableExecutor } from '@circleci/circleci-config-sdk/dist/src/lib/Components/Executor';
import { ReusableExecutor } from '@circleci/circleci-config-sdk/dist/src/lib/Components/Reusable';
import ExecutorIcon from '../../../icons/components/ExecutorIcon';

const ExecutorSummary: React.FunctionComponent<{ data: ReusableExecutor }> = (
Expand Down
4 changes: 2 additions & 2 deletions src/components/containers/DefinitionsContainer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,12 @@ const DefinitionsContainer = (props: DefinitionsProps) => {
props: {
typePage: props.type.subtypes?.component,
menuPage: InspectorDefinitionMenu,
menuProps: { dataType: props.type },
menuProps: { dataType: props.type, flatten: true },
},
}
: {
component: InspectorDefinitionMenuNav,
props: { dataType: props.type },
props: { dataType: props.type, flatten: true },
},
)
}
Expand Down
52 changes: 30 additions & 22 deletions src/components/containers/inspector/CommandInspector.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,37 @@ import StepPropertiesMenu from '../../menus/definitions/StepDefinitionMenu';
import StepTypePageNav from '../../menus/definitions/subtypes/StepTypePage';
import SubTypeMenuNav from '../../menus/SubTypeMenu';

const CommandInspector = (
props: FormikValues & { definitions: DefinitionModel },
const NewButton = (
props: FormikValues & {
definitions: DefinitionModel;
},
) => {
const navigateTo = useStoreActions((actions) => actions.navigateTo);
return (
<button
type="button"
onClick={() => {

navigateTo({
component: SubTypeMenuNav,
props: {
typePage: StepTypePageNav,
menuPage: StepPropertiesMenu,
passThrough: { dataType: CommandMapping },
},
values: props.values,
});
}}
className="ml-auto tracking-wide hover:underline leading-6 text-sm text-circle-blue font-medium"
>
New
</button>
);
};

const CommandInspector = (
props: FormikValues & { definitions: DefinitionModel },
) => {
return (
<div>
<InspectorProperty
Expand All @@ -29,26 +55,8 @@ const CommandInspector = (
expanded
required
emptyText="No steps defined yet. At least one step is required."
titleExpanded={
<button
type="button"
onClick={() => {
navigateTo({
component: SubTypeMenuNav,
props: {
typePage: StepTypePageNav,
menuPage: StepPropertiesMenu,
passThrough: { dataType: CommandMapping },
},
values: props.values,
});
}}
className="ml-auto tracking-wide hover:underline leading-6 text-sm text-circle-blue font-medium"
>
New
</button>
}
></ListProperty>
titleExpanded={<NewButton values={props.values} definitions={props.definitions} />}
/>
</div>
);
};
Expand Down
31 changes: 25 additions & 6 deletions src/components/containers/inspector/ExecutorInspector.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,48 @@ import InspectorProperty from '../../atoms/form/InspectorProperty';
import { executorSubtypes } from './subtypes/ExecutorSubtypes';

const ExecutorInspector = (
props: FormikValues & { definitions: DefinitionModel },
props: FormikValues & {
definitions: DefinitionModel;
subtype?: string;
},
) => {
if (!props.subtype) {
return <div>
Something went wrong!
</div>;
}

return (
<div>
<InspectorProperty label="Name" name="name" required />
<InspectorProperty label="Description" name="executor.parameters.description" as="textarea" />
<InspectorProperty
label="Description"
name={`${props.values.type}.parameters.description`}
as="textarea"
/>
<InspectorProperty
label="Resource Class"
name="resource_class"
required
as="select"
>
{executorSubtypes[props.values.type]?.resourceClasses?.map(
{executorSubtypes[props.subtype]?.resourceClasses?.map(
(resourceClass) => (
<option value={resourceClass} key={resourceClass}>
{resourceClass}
</option>
),
)}
</InspectorProperty>
{executorSubtypes[props.values.type]?.fields}
<InspectorProperty label="Shell" name="executor.parameters.shell" />
<InspectorProperty label="Working Directory" name="executor.parameters.working_directory" />
{executorSubtypes[props.subtype]?.fields}
<InspectorProperty
label="Shell"
name={`${props.values.type}.parameters.shell`}
/>
<InspectorProperty
label="Working Directory"
name={`${props.values.type}.parameters.working_directory`}
/>
</div>
);
};
Expand Down
26 changes: 13 additions & 13 deletions src/components/containers/inspector/subtypes/ExecutorSubtypes.tsx
Original file line number Diff line number Diff line change
@@ -1,18 +1,17 @@
import { executor } from '@circleci/circleci-config-sdk';
import { DockerExecutor, MachineExecutor, MacOSExecutor, WindowsExecutor } from '@circleci/circleci-config-sdk/dist/src/lib/Components/Executor';
import { executors } from '@circleci/circleci-config-sdk';
import { SubTypeMapping } from '../../../../mappings/ComponentMapping';
import InspectorProperty from '../../../atoms/form/InspectorProperty';

export interface ExecutorSubTypes {
[type: string]: SubTypeMapping & {
resourceClasses: string[];
};
};
}

const executorSubtypes: ExecutorSubTypes = {
docker: {
text: 'Docker',
component: executor.DockerExecutor,
component: executors.DockerExecutor,
resourceClasses: [
'small',
'medium',
Expand All @@ -23,34 +22,35 @@ const executorSubtypes: ExecutorSubTypes = {
'2xlarge+',
],
fields: (
<InspectorProperty label="Image" name="executor.image.image" required />
<InspectorProperty label="Image" name="docker[0].image" required />
),
docsLink: 'https://circleci.com/docs/2.0/executor-types/#using-docker',
description: 'Steps run in container with provided image',
},
machine: {
text: 'Machine',
component: executor.MachineExecutor,
component: executors.MachineExecutor,
resourceClasses: ['medium', 'large', 'xlarge', '2xlarge'],
fields: <InspectorProperty label="Image" name="executor.image" required />,
fields: <InspectorProperty label="Image" name="machine.image" required />,
docsLink: 'https://circleci.com/docs/2.0/executor-types/#using-machine',
description: 'Steps run on Linux Virtual Machine',
},
macos: {
text: 'MacOS',
component: executor.MacOSExecutor,
component: executors.MacOSExecutor,
resourceClasses: ['medium', 'large'],
fields: <InspectorProperty label="Xcode" name="executor.xcode" required />,
fields: <InspectorProperty label="Xcode" name="macos.xcode" required />,
docsLink: 'https://circleci.com/docs/2.0/executor-types/#using-macos',
description:
'Steps run on macOS Virtual Machine with specific Xcode version',
},
windows: {
text: 'Windows',
component: executor.WindowsExecutor,
resourceClasses: ['medium', 'large', 'xlarge', '2xlarge'],
fields: <InspectorProperty label="Image" name="executor.image" required />,
docsLink: 'https://circleci.com/docs/2.0/executor-types/#using-the-windows-executor',
component: executors.WindowsExecutor,
resourceClasses: ['windows.medium', 'windows.large', 'windows.xlarge', 'windows.2xlarge'],
fields: <InspectorProperty label="Image" name="machine.image" required />,
docsLink:
'https://circleci.com/docs/2.0/executor-types/#using-the-windows-executor',
description: 'Steps run on Windows Virtual Machine',
},
};
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ReusableExecutor } from '@circleci/circleci-config-sdk/dist/src/lib/Components/Executor';
import { ReusableExecutor } from '@circleci/circleci-config-sdk/dist/src/lib/Components/Reusable';
import { SubTypeMapping } from '../../../../mappings/ComponentMapping';
import InspectorProperty from '../../../atoms/form/InspectorProperty';

Expand Down
4 changes: 2 additions & 2 deletions src/components/menus/SubTypeMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export type SubTypeSelectPageProps<T> = {
};
export type SubTypeMenuPageProps<T> = {
subtype: SubTypeReference<T>;
selectSubtype: () => void;
onSelectSubtype: () => void;
};
export interface SelectedSubType<T> {
current?: SubTypeReference<T>;
Expand Down Expand Up @@ -42,7 +42,7 @@ const SubTypeMenu = <SubTypeRef,>(props: SubTypeMenuProps<SubTypeRef>) => {
{subtype?.current ? (
<SubTypeMenuPage
subtype={subtype.current}
selectSubtype={navBack}
onSelectSubtype={navBack}
{...props.menuProps}
/>
) : (
Expand Down
Loading