diff --git a/package.json b/package.json
index 8a9eb07..fd99f13 100644
--- a/package.json
+++ b/package.json
@@ -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",
diff --git a/src/components/atoms/Definition.tsx b/src/components/atoms/Definition.tsx
index 3bd5770..8279017 100644
--- a/src/components/atoms/Definition.tsx
+++ b/src/components/atoms/Definition.tsx
@@ -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);
@@ -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 },
});
}}
>
diff --git a/src/components/atoms/form/ListProperty.tsx b/src/components/atoms/form/ListProperty.tsx
index d693931..ee062ba 100644
--- a/src/components/atoms/form/ListProperty.tsx
+++ b/src/components/atoms/form/ListProperty.tsx
@@ -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';
@@ -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 (
+
+ {(provided, snapshot) => (
+
+
+
+
+
+
+
+ )}
+
+ );
+};
+
+// TODO: Refactor
const ListProperty = ({
label,
values,
@@ -51,48 +92,11 @@ const ListProperty = ({
className="p-2 pr-0"
>
{values?.map((cmd: any, index: number) => (
-
- {(provided, snapshot) => (
-
-
-
-
-
-
-
- )}
-
+ arrayHelper={arrayHelper}
+ />
))}
{provided.placeholder}
diff --git a/src/components/atoms/summaries/ExecutorSummary.tsx b/src/components/atoms/summaries/ExecutorSummary.tsx
index 49840bf..1c302a3 100644
--- a/src/components/atoms/summaries/ExecutorSummary.tsx
+++ b/src/components/atoms/summaries/ExecutorSummary.tsx
@@ -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 }> = (
diff --git a/src/components/containers/DefinitionsContainer.tsx b/src/components/containers/DefinitionsContainer.tsx
index 23689fb..79b51f1 100644
--- a/src/components/containers/DefinitionsContainer.tsx
+++ b/src/components/containers/DefinitionsContainer.tsx
@@ -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 },
},
)
}
diff --git a/src/components/containers/inspector/CommandInspector.tsx b/src/components/containers/inspector/CommandInspector.tsx
index dd34413..8639fb1 100644
--- a/src/components/containers/inspector/CommandInspector.tsx
+++ b/src/components/containers/inspector/CommandInspector.tsx
@@ -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 (
+
+ );
+};
+const CommandInspector = (
+ props: FormikValues & { definitions: DefinitionModel },
+) => {
return (
{
- 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
-
- }
- >
+ titleExpanded={}
+ />
);
};
diff --git a/src/components/containers/inspector/ExecutorInspector.tsx b/src/components/containers/inspector/ExecutorInspector.tsx
index 8336bfa..6e68bc5 100644
--- a/src/components/containers/inspector/ExecutorInspector.tsx
+++ b/src/components/containers/inspector/ExecutorInspector.tsx
@@ -4,19 +4,32 @@ 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
+ Something went wrong!
+
;
+ }
+
return (
-
+
- {executorSubtypes[props.values.type]?.resourceClasses?.map(
+ {executorSubtypes[props.subtype]?.resourceClasses?.map(
(resourceClass) => (
- {executorSubtypes[props.values.type]?.fields}
-
-
+ {executorSubtypes[props.subtype]?.fields}
+
+
);
};
diff --git a/src/components/containers/inspector/subtypes/ExecutorSubtypes.tsx b/src/components/containers/inspector/subtypes/ExecutorSubtypes.tsx
index c7b201e..35e74ac 100644
--- a/src/components/containers/inspector/subtypes/ExecutorSubtypes.tsx
+++ b/src/components/containers/inspector/subtypes/ExecutorSubtypes.tsx
@@ -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',
@@ -23,34 +22,35 @@ const executorSubtypes: ExecutorSubTypes = {
'2xlarge+',
],
fields: (
-
+
),
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: ,
+ fields: ,
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: ,
+ fields: ,
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: ,
- 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: ,
+ docsLink:
+ 'https://circleci.com/docs/2.0/executor-types/#using-the-windows-executor',
description: 'Steps run on Windows Virtual Machine',
},
};
diff --git a/src/components/containers/inspector/subtypes/ParameterSubtypes.tsx b/src/components/containers/inspector/subtypes/ParameterSubtypes.tsx
index c4f1f46..437e77f 100644
--- a/src/components/containers/inspector/subtypes/ParameterSubtypes.tsx
+++ b/src/components/containers/inspector/subtypes/ParameterSubtypes.tsx
@@ -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';
diff --git a/src/components/menus/SubTypeMenu.tsx b/src/components/menus/SubTypeMenu.tsx
index fb8e1bf..f68ca51 100644
--- a/src/components/menus/SubTypeMenu.tsx
+++ b/src/components/menus/SubTypeMenu.tsx
@@ -14,7 +14,7 @@ export type SubTypeSelectPageProps = {
};
export type SubTypeMenuPageProps = {
subtype: SubTypeReference;
- selectSubtype: () => void;
+ onSelectSubtype: () => void;
};
export interface SelectedSubType {
current?: SubTypeReference;
@@ -42,7 +42,7 @@ const SubTypeMenu = (props: SubTypeMenuProps) => {
{subtype?.current ? (
) : (
diff --git a/src/components/menus/definitions/InspectorDefinitionMenu.tsx b/src/components/menus/definitions/InspectorDefinitionMenu.tsx
index 30e3c43..d19cf5d 100644
--- a/src/components/menus/definitions/InspectorDefinitionMenu.tsx
+++ b/src/components/menus/definitions/InspectorDefinitionMenu.tsx
@@ -1,4 +1,5 @@
import { Form, Formik } from 'formik';
+import GenerableMapping from '../../../mappings/ComponentMapping';
import { useStoreActions, useStoreState } from '../../../state/Hooks';
import { DataModel, NavigationComponent } from '../../../state/Store';
import BreadCrumbs from '../../containers/BreadCrumbs';
@@ -7,9 +8,10 @@ import { SubTypeMenuPageProps } from '../SubTypeMenu';
import TabbedMenu from '../TabbedMenu';
type InspectorDefinitionProps = DataModel & {
- values: any;
+ values: Record;
editing?: boolean;
passBackKey?: string;
+ activeTab?: number;
} & SubTypeMenuPageProps;
const InspectorDefinitionMenu = (props: InspectorDefinitionProps) => {
@@ -35,9 +37,17 @@ const InspectorDefinitionMenu = (props: InspectorDefinitionProps) => {
}
};
+ const getValues = () => {
+ if (props.values) {
+ return props.values;
+ }
+
+ return props.subtype ? dataMapping?.defaults[props.subtype] : dataMapping?.defaults;
+ }
+
const tabs = ['PROPERTIES'];
- const subtype =
- props.subtype || dataMapping?.subtypes?.getSubtype(props.values);
+ const unpacked = getValues();
+ const subtype = props.subtype || dataMapping?.subtypes?.getSubtype(unpacked);
if (dataMapping?.parameters) {
tabs.push('PARAMETERS');
@@ -58,25 +68,25 @@ const InspectorDefinitionMenu = (props: InspectorDefinitionProps) => {
{
- const newDefinition = dataMapping.transform(values, definitions);
-
- if (newDefinition) {
- generateConfig({ [dataMapping.type]: [newDefinition] });
- }
+ // TODO: handle error handling
+ // const newDefinition = dataMapping.transform(values, definitions);
+ // if (newDefinition) {
+ // generateConfig({ [dataMapping.type]: [newDefinition] });
+ // }
}}
enableReinitialize
onSubmit={(values) => {
const newDefinition = dataMapping.transform(values, definitions);
+ const submitData = props.editing
+ ? { old: unpacked, new: newDefinition }
+ : newDefinition;
if (!props.passBackKey) {
- submitToStore(newDefinition);
+ submitToStore(submitData);
}
if (
@@ -104,7 +114,7 @@ const InspectorDefinitionMenu = (props: InspectorDefinitionProps) => {
>
{(formikProps) => (