diff --git a/packages/my-joy-images/package.json b/packages/my-joy-images/package.json
index 697f5708..2c72f917 100644
--- a/packages/my-joy-images/package.json
+++ b/packages/my-joy-images/package.json
@@ -56,7 +56,8 @@
"styled-components-spacing": "^2.1.3",
"styled-flex-component": "^2.2.1",
"styled-is": "^1.1.2",
- "title-case": "^2.1.1"
+ "title-case": "^2.1.1",
+ "yup": "^0.24.1"
},
"devDependencies": {
"babel-cli": "^6.26.0",
diff --git a/packages/my-joy-instances/src/components/__tests__/__image_snapshots__/key-value-ui-js-key-value-submitting-1-snap.png b/packages/my-joy-instances/src/components/__tests__/__image_snapshots__/key-value-ui-js-key-value-submitting-1-snap.png
index 23d05a9e..00f49e53 100644
Binary files a/packages/my-joy-instances/src/components/__tests__/__image_snapshots__/key-value-ui-js-key-value-submitting-1-snap.png and b/packages/my-joy-instances/src/components/__tests__/__image_snapshots__/key-value-ui-js-key-value-submitting-1-snap.png differ
diff --git a/packages/my-joy-instances/src/components/__tests__/__image_snapshots__/network-ui-js-network-network-fabric-1-snap.png b/packages/my-joy-instances/src/components/__tests__/__image_snapshots__/network-ui-js-network-network-fabric-1-snap.png
index 6965264e..f0a23cfc 100644
Binary files a/packages/my-joy-instances/src/components/__tests__/__image_snapshots__/network-ui-js-network-network-fabric-1-snap.png and b/packages/my-joy-instances/src/components/__tests__/__image_snapshots__/network-ui-js-network-network-fabric-1-snap.png differ
diff --git a/packages/my-joy-instances/src/components/__tests__/__image_snapshots__/network-ui-js-network-network-fabric-2-snap.png b/packages/my-joy-instances/src/components/__tests__/__image_snapshots__/network-ui-js-network-network-fabric-2-snap.png
index d6efbae0..6965264e 100644
Binary files a/packages/my-joy-instances/src/components/__tests__/__image_snapshots__/network-ui-js-network-network-fabric-2-snap.png and b/packages/my-joy-instances/src/components/__tests__/__image_snapshots__/network-ui-js-network-network-fabric-2-snap.png differ
diff --git a/packages/my-joy-instances/src/components/cns.js b/packages/my-joy-instances/src/components/cns.js
index 34cdb92e..bff38134 100644
--- a/packages/my-joy-instances/src/components/cns.js
+++ b/packages/my-joy-instances/src/components/cns.js
@@ -104,7 +104,7 @@ export const AddServiceForm = ({
);
-export const Header = rule => (
+export const Header = ({ rule }) => (
{titleCase(rule.conditional)}: be on a {rule.placement} node as
the instance(s) identified by the instance {rule.type}
diff --git a/packages/my-joy-instances/src/components/instances/__tests__/__image_snapshots__/list-ui-js-item-mutating-1-snap.png b/packages/my-joy-instances/src/components/instances/__tests__/__image_snapshots__/list-ui-js-item-mutating-1-snap.png
index 87bf4404..045a0364 100644
Binary files a/packages/my-joy-instances/src/components/instances/__tests__/__image_snapshots__/list-ui-js-item-mutating-1-snap.png and b/packages/my-joy-instances/src/components/instances/__tests__/__image_snapshots__/list-ui-js-item-mutating-1-snap.png differ
diff --git a/packages/my-joy-instances/src/components/instances/__tests__/__image_snapshots__/snapshots-ui-js-item-mutating-1-snap.png b/packages/my-joy-instances/src/components/instances/__tests__/__image_snapshots__/snapshots-ui-js-item-mutating-1-snap.png
index 835c0f22..029909cf 100644
Binary files a/packages/my-joy-instances/src/components/instances/__tests__/__image_snapshots__/snapshots-ui-js-item-mutating-1-snap.png and b/packages/my-joy-instances/src/components/instances/__tests__/__image_snapshots__/snapshots-ui-js-item-mutating-1-snap.png differ
diff --git a/packages/my-joy-instances/src/components/instances/__tests__/__image_snapshots__/summary-ui-js-summary-starting-stopping-rebooting-removing-1-snap.png b/packages/my-joy-instances/src/components/instances/__tests__/__image_snapshots__/summary-ui-js-summary-starting-stopping-rebooting-removing-1-snap.png
index 9fe95502..41b7d996 100644
Binary files a/packages/my-joy-instances/src/components/instances/__tests__/__image_snapshots__/summary-ui-js-summary-starting-stopping-rebooting-removing-1-snap.png and b/packages/my-joy-instances/src/components/instances/__tests__/__image_snapshots__/summary-ui-js-summary-starting-stopping-rebooting-removing-1-snap.png differ
diff --git a/packages/my-joy-instances/src/constants.js b/packages/my-joy-instances/src/constants.js
new file mode 100644
index 00000000..9404206d
--- /dev/null
+++ b/packages/my-joy-instances/src/constants.js
@@ -0,0 +1,48 @@
+export const Forms = {
+ IC_AFF_F_ADD: 'INSTANCE_CREATION_AFFINITY_FORM_ADD',
+ IC_AFF_F_EDIT: 'INSTANCE_CREATION_AFFINITY_FORM_EDIT',
+ IC_CNS_F: 'INSTANCE_CREATION_CNS_FORM',
+ IC_NAME_F: 'INSTANCE_CREATION_NAME_FORM',
+ IC_FW_F_ENABLED: 'INSTANCE_CREATION_FW_ENABLED',
+ IC_FW_F_INACTIVE: 'INSTANCE_CREATION_FW_INACTIVE',
+ IC_IMG_F: 'INSTANCE_CREATION_IMAGE_FORM',
+ IC_MD_F_ADD: 'INSTANCE_CREATION_METADATA_FORM_ADD',
+ IC_MD_F_EDIT: index => `INSTANCE_CREATION_METADATA_FORM_EDIT_${index}`,
+ IC_TAG_F_ADD: 'INSTANCE_CREATION_TAG_FORM_ADD',
+ IC_TAG_F_EDIT: index => `INSTANCE_CREATION_TAG_FORM_EDIT_${index}`,
+ IC_NW_F: 'INSTANCE_CREATION_NETWORKS_FORM',
+ IC_PKG_F_SELECT: 'INSTANCE_CREATION_PACKAGE_FORM_SELECT',
+ IC_PKG_F_FILTER: 'INSTANCE_CREATION_PACKAGE_FORM_FILTER',
+ IC_US_F: 'INSTANCE_CREATION_USERSCRIPT_FORM',
+ IC_F: 'INSTANCE_CREATION_FORM'
+};
+
+export const Values = {
+ IC_AFF_V_ADD_OPEN: 'INSTANCE_CREATION_AFFINITY_VALUE_ADD_OPEN',
+ IC_AFF_V_EDIT_OPEN: 'INSTANCE_CREATION_AFFINITY_VALUE_EDIT_OPEN',
+ IC_AFF_V_AFF: 'INSTANCE_CREATION_AFFINITY_VALUE_AFFINITY',
+ IC_CNS_V_ENABLED: 'INSTANCE_CREATION_CNS_VALUE_ENABLED',
+ IC_CNS_V_PROCEEDED: 'INSTANCE_CREATION_CNS_VALUE_PROCEEDED',
+ IC_CNS_V_SERVICES: 'INSTANCE_CREATION_CNS_VALUE_SERVICES',
+ IC_FW_V_PROCEEDED: 'INSTANCE_CREATION_FIREWALL_VALUE_PROCEEDED',
+ IC_IMG_V_PROCEEDED: 'INSTANCE_CREATION_IMG_VALUE_PROCEEDED',
+ IC_IMG_V_VMS: 'INSTANCE_CREATION_IMG_VALUE_VMS',
+ IC_MD_V_PROCEEDED: 'INSTANCE_CREATION_METADATA_VALUE_PROCEEDED',
+ IC_MD_V_ADD_OPEN: 'INSTANCE_CREATION_METADATA_VALUE_ADD_OPEN',
+ IC_MD_V_MD: 'INSTANCE_CREATION_METADATA_VALUE_ADD_METADATA',
+ IC_NAME_V_PROCEEDED: 'INSTANCE_CREATION_NAME_VALUE_PROCEEDED',
+ IC_NAME_V_RANDOMIZING: 'INSTANCE_CREATION_NAME_VALUE_RANDOMIZING',
+ IC_NW_V_PROCEEDED: 'INSTANCE_CREATION_NETWORKS_VALUE_PROCEEDED',
+ IC_NW_V_INFO_EXPANDED: id =>
+ `INSTANCE_CREATION_NETWORKS_VALUE_${id}_INFO_EXPANDED`,
+ IC_NW_V_MACHINES_EXPANDED: id =>
+ `INSTANCE_CREATION_NETWORKS_VALUE_${id}_MACHINES_EXPANDED`,
+ IC_PKG_V_PROCEEDED: 'INSTANCE_CREATION_PACKAGE_VALUE_PROCEEDED',
+ IC_PKG_V_SORT_BY: 'INSTANCE_CREATION_PACKAGE_VALUE_SORT_BY',
+ IC_PKG_V_SORT_ORDER: 'INSTANCE_CREATION_PACKAGE_VALUE_SORT_ORDER',
+ IC_TAG_V_PROCEEDED: 'INSTANCE_CREATION_TAG_VALUE_PROCEEDED',
+ IC_TAG_V_ADD_OPEN: 'INSTANCE_CREATION_TAG_VALUE_ADD_OPEN',
+ IC_TAG_V_TAGS: 'INSTANCE_CREATION_TAG_VALUE_TAGS',
+ IC_US_V_PROCEEDED: 'INSTANCE_CREATION_USERSCRIPT_VALUE_PROCEEDED',
+ IC_US_V_OPEN: 'INSTANCE_CREATION_USERSCRIPT_VALUE_OPEN'
+};
diff --git a/packages/my-joy-instances/src/containers/create-instance/__tests__/__image_snapshots__/networks-ui-js-networks-loading-expanded-1-snap.png b/packages/my-joy-instances/src/containers/create-instance/__tests__/__image_snapshots__/networks-ui-js-networks-loading-expanded-1-snap.png
index 1b2fea9b..525f9e43 100644
Binary files a/packages/my-joy-instances/src/containers/create-instance/__tests__/__image_snapshots__/networks-ui-js-networks-loading-expanded-1-snap.png and b/packages/my-joy-instances/src/containers/create-instance/__tests__/__image_snapshots__/networks-ui-js-networks-loading-expanded-1-snap.png differ
diff --git a/packages/my-joy-instances/src/containers/create-instance/affinity.js b/packages/my-joy-instances/src/containers/create-instance/affinity.js
index 1af0d875..14a3ee0b 100644
--- a/packages/my-joy-instances/src/containers/create-instance/affinity.js
+++ b/packages/my-joy-instances/src/containers/create-instance/affinity.js
@@ -14,9 +14,10 @@ import Title from '@components/create-instance/title';
import { Rule, Header } from '@components/create-instance/affinity';
import Description from '@components/description';
import { addAffinityRule as validateRule } from '@state/validators';
+import { Forms, Values } from '@root/constants';
-const FORM_NAME_CREATE = 'CREATE-INSTANCE-AFFINITY-ADD';
-const FORM_NAME_EDIT = 'CREATE-INSTANCE-AFFINITY-EDIT';
+const { IC_AFF_F_ADD, IC_AFF_F_EDIT } = Forms;
+const { IC_AFF_V_ADD_OPEN, IC_AFF_V_EDIT_OPEN, IC_AFF_V_AFF } = Values;
const RULE_DEFAULTS = {
conditional: 'should',
@@ -69,7 +70,7 @@ export const Affinity = ({
) : null}
}
+ customHeader={}
method="edit"
input={inputProps => (
{
- const editingRule = get(form, `${FORM_NAME_EDIT}.values`, null);
- const creatingRule = get(form, `${FORM_NAME_CREATE}.values`, null);
- const exitingRule = get(values, 'create-instance-affinity', null);
+ const editingRule = get(form, `${IC_AFF_F_EDIT}.values`, null);
+ const creatingRule = get(form, `${IC_AFF_F_ADD}.values`, null);
+ const exitingRule = get(values, IC_AFF_V_AFF, null);
- const addOpen = get(values, 'create-instance-affinity-add-open', false);
- const editOpen = get(values, 'create-instance-affinity-edit-open', false);
+ const addOpen = get(values, IC_AFF_V_ADD_OPEN, false);
+ const editOpen = get(values, IC_AFF_V_EDIT_OPEN, false);
return {
addOpen,
@@ -182,53 +183,44 @@ export default compose(
shouldAsyncValidate: ({ trigger }) => {
return trigger === 'submit';
},
- handleAsyncValidate: validateRule,
+ handleAsyncValidate: ({ type, ...aff }) => {
+ return type === 'name'
+ ? validateRule({ ...aff, key: 'default', type })
+ : validateRule({ ...aff, type });
+ },
handleEdit: () => {
return history.push(`/~create/affinity${history.location.search}`);
},
handleCreateAffinityRules: value => {
- const toggleToClosed = set({
- name: 'create-instance-affinity-add-open',
- value: false
- });
-
- const appendAffinityRule = set({
- name: 'create-instance-affinity',
- value
- });
-
return dispatch([
- destroy(FORM_NAME_CREATE),
- toggleToClosed,
- appendAffinityRule
+ destroy(IC_AFF_F_ADD),
+ set({ name: IC_AFF_V_ADD_OPEN, value: false }),
+ set({ name: IC_AFF_V_AFF, value })
]);
},
handleUpdateAffinityRule: value => {
return dispatch([
- destroy(FORM_NAME_EDIT),
- set({ name: 'create-instance-affinity', value })
+ destroy(IC_AFF_F_EDIT),
+ set({ name: IC_AFF_V_EDIT_OPEN, value: false }),
+ set({ name: IC_AFF_V_AFF, value })
]);
},
handleChangeAddOpen: value => {
return dispatch([
- reset(FORM_NAME_CREATE),
- set({ name: 'create-instance-affinity-add-open', value })
+ reset(IC_AFF_F_ADD),
+ set({ name: IC_AFF_V_ADD_OPEN, value })
]);
},
handleToggleExpanded: value => {
- return dispatch(
- set({ name: 'create-instance-affinity-edit-open', value })
- );
+ return dispatch(set({ name: IC_AFF_V_EDIT_OPEN, value }));
},
handleCancelEdit: () => {
- return dispatch([
- set({ name: 'create-instance-affinity-edit-open', value: false })
- ]);
+ return dispatch([set({ name: IC_AFF_V_EDIT_OPEN, value: false })]);
},
handleRemoveAffinityRule: () => {
return dispatch([
- destroy(FORM_NAME_EDIT),
- set({ name: 'create-instance-affinity', value: null })
+ destroy(IC_AFF_F_EDIT),
+ set({ name: IC_AFF_V_AFF, value: null })
]);
}
}))
diff --git a/packages/my-joy-instances/src/containers/create-instance/cns.js b/packages/my-joy-instances/src/containers/create-instance/cns.js
index 07c571f6..9cda39ff 100644
--- a/packages/my-joy-instances/src/containers/create-instance/cns.js
+++ b/packages/my-joy-instances/src/containers/create-instance/cns.js
@@ -14,8 +14,10 @@ import Cns, { Footer, AddServiceForm } from '@components/cns';
import Description from '@components/description';
import GetAccount from '@graphql/get-account.gql';
import { addCnsService as validateServiceName } from '@state/validators';
+import { Forms, Values } from '@root/constants';
-const CNS_FORM = 'create-instance-cns';
+const { IC_CNS_F, IC_NAME_F } = Forms;
+const { IC_CNS_V_ENABLED, IC_CNS_V_PROCEEDED, IC_CNS_V_SERVICES } = Values;
const CNSContainer = ({
submitted,
@@ -66,7 +68,7 @@ const CNSContainer = ({
onRemoveService={handleRemoveService}
>
{
- const proceeded = get(values, `${CNS_FORM}-proceeded`, false);
- const instanceName = get(
- form,
- 'create-instance-name.values.name',
- ''
- );
-
- const serviceNames = get(values, `${CNS_FORM}-services`, []);
+ const proceeded = get(values, IC_CNS_V_PROCEEDED, false);
+ const instanceName = get(form, `${IC_NAME_F}.values.name`, '');
+ const serviceNames = get(values, IC_CNS_V_SERVICES, []);
// REPLACE WITH DATA CENTER
const dataCenter = 'us-east-1';
@@ -158,7 +155,7 @@ export default compose(
});
return {
- cnsEnabled: get(values, `${CNS_FORM}-enabled`, true),
+ cnsEnabled: get(values, IC_CNS_V_ENABLED, true),
instanceName,
proceeded: proceeded || serviceNames.length,
hostnames,
@@ -167,32 +164,30 @@ export default compose(
}),
connect(null, (dispatch, { history, cnsEnabled, serviceNames = [] }) => ({
handleNext: () => {
- dispatch(set({ name: `${CNS_FORM}-proceeded`, value: true }));
+ dispatch(set({ name: IC_CNS_V_PROCEEDED, value: true }));
return history.push(`/~create/affinity${history.location.search}`);
},
handleEdit: () => {
- dispatch(set({ name: `${CNS_FORM}-proceeded`, value: true }));
+ dispatch(set({ name: IC_CNS_V_PROCEEDED, value: true }));
history.push(`/~create/cns${history.location.search}`);
},
shouldAsyncValidate: ({ trigger }) => {
return trigger === 'submit';
},
handleAsyncValidate: validateServiceName,
- handleToggleCnsEnabled: ({ target }) =>
- dispatch(set({ name: `${CNS_FORM}-enabled`, value: !cnsEnabled })),
+ handleToggleCnsEnabled: ({ target }) => {
+ return dispatch(set({ name: IC_CNS_V_ENABLED, value: !cnsEnabled }));
+ },
handleAddService: ({ name }) => {
- dispatch([
- destroy(`${CNS_FORM}-new-service`),
- set({
- name: `${CNS_FORM}-services`,
- value: serviceNames.concat(name)
- })
+ return dispatch([
+ destroy(IC_CNS_F),
+ set({ name: IC_CNS_V_SERVICES, value: serviceNames.concat(name) })
]);
},
handleRemoveService: value => {
return dispatch(
set({
- name: `${CNS_FORM}-services`,
+ name: IC_CNS_V_SERVICES,
value: serviceNames.filter(name => name !== value)
})
);
diff --git a/packages/my-joy-instances/src/containers/create-instance/firewall.js b/packages/my-joy-instances/src/containers/create-instance/firewall.js
index 033dbef8..d201546a 100644
--- a/packages/my-joy-instances/src/containers/create-instance/firewall.js
+++ b/packages/my-joy-instances/src/containers/create-instance/firewall.js
@@ -22,8 +22,10 @@ import Title from '@components/create-instance/title';
import Description from '@components/description';
import Empty from '@components/empty';
import ListFwRules from '@graphql/list-fw-rules.gql';
+import { Forms, Values } from '@root/constants';
-const FORM_NAME = 'CREATE-INSTANCE-FIREWALL';
+const { IC_FW_F_ENABLED, IC_FW_F_INACTIVE } = Forms;
+const { IC_FW_V_PROCEEDED, IC_TAG_V_TAGS } = Values;
const Firewall = ({
defaultRules = [],
@@ -62,7 +64,7 @@ const Firewall = ({
@@ -77,7 +79,7 @@ const Firewall = ({
@@ -154,24 +156,18 @@ export default compose(
connect(
({ form, values }, ownProps) => ({
...ownProps,
- proceeded: get(values, 'create-instance-firewall-proceeded', false),
- enabled: get(form, `${FORM_NAME}-enabled.values.enabled`, false),
- showInactive: get(form, `${FORM_NAME}-inactive.values.inactive`, false),
- tags: get(values, 'create-instance-tags', [])
+ proceeded: get(values, IC_FW_V_PROCEEDED, false),
+ enabled: get(form, `${IC_FW_F_ENABLED}.values.enabled`, false),
+ showInactive: get(form, `${IC_FW_F_INACTIVE}.values.inactive`, false),
+ tags: get(values, IC_TAG_V_TAGS, [])
}),
(dispatch, { history }) => ({
handleNext: () => {
- dispatch(
- set({ name: 'create-instance-firewall-proceeded', value: true })
- );
-
+ dispatch(set({ name: IC_FW_V_PROCEEDED, value: true }));
return history.push(`/~create/cns${history.location.search}`);
},
handleEdit: () => {
- dispatch(
- set({ name: 'create-instance-firewall-proceeded', value: true })
- );
-
+ dispatch(set({ name: IC_FW_V_PROCEEDED, value: true }));
return history.push(`/~create/firewall${history.location.search}`);
}
})
diff --git a/packages/my-joy-instances/src/containers/create-instance/image.js b/packages/my-joy-instances/src/containers/create-instance/image.js
index 44b3ab5f..bd4ea1fe 100644
--- a/packages/my-joy-instances/src/containers/create-instance/image.js
+++ b/packages/my-joy-instances/src/containers/create-instance/image.js
@@ -19,6 +19,10 @@ import Title from '@components/create-instance/title';
import Description from '@components/description';
import imageData from '@data/images-map.json';
import GetImages from '@graphql/get-images.gql';
+import { Forms, Values } from '@root/constants';
+
+const { IC_IMG_F } = Forms;
+const { IC_IMG_V_PROCEEDED, IC_IMG_V_VMS } = Values;
const HarcodedImage = (image = {}) => (
@@ -27,7 +31,7 @@ const HarcodedImage = (image = {}) => (
{image.id ? (
) : null}
{
- const proceeded = get(values, 'create-instance-image-proceeded', false);
- const image = get(form, 'create-instance-image.values.image', null);
- const vms = get(values, 'vms', true);
+ const proceeded = get(values, IC_IMG_V_PROCEEDED, false);
+ const image = get(form, `${IC_IMG_F}.values.image`, null);
+ const vms = get(values, IC_IMG_V_VMS, true);
return {
...ownProps,
@@ -143,19 +147,17 @@ export default compose(
},
(dispatch, { history }) => ({
handleNext: () => {
- dispatch(set({ name: 'create-instance-image-proceeded', value: true }));
-
+ dispatch(set({ name: IC_IMG_V_PROCEEDED, value: true }));
return history.push(`/~create/package${history.location.search}`);
},
handleEdit: () => {
return history.push(`/~create/image${history.location.search}`);
},
handleSelectLatest: ({ versions }) => {
- const id = versions[0].id;
- return dispatch(change('create-instance-image', 'image', id));
+ return dispatch(change(IC_IMG_F, 'image', versions[0].id));
},
setImageType: isVm => {
- return dispatch(set({ name: 'vms', value: isVm }));
+ return dispatch(set({ name: IC_IMG_V_VMS, value: isVm }));
}
})
),
diff --git a/packages/my-joy-instances/src/containers/create-instance/index.js b/packages/my-joy-instances/src/containers/create-instance/index.js
index e4f3a505..661f7c75 100644
--- a/packages/my-joy-instances/src/containers/create-instance/index.js
+++ b/packages/my-joy-instances/src/containers/create-instance/index.js
@@ -11,7 +11,7 @@ import intercept from 'apr-intercept';
import constantCase from 'constant-case';
import queryString from 'query-string';
import get from 'lodash.get';
-import Values from 'lodash.values';
+import lvalues from 'lodash.values';
import omit from 'lodash.omit';
import uniqBy from 'lodash.uniqby';
@@ -36,8 +36,18 @@ import CNS from '@containers/create-instance/cns';
import Affinity from '@containers/create-instance/affinity';
import CreateInstanceMutation from '@graphql/create-instance.gql';
import parseError from '@state/parse-error';
+import { Forms, Values } from '@root/constants';
-const CREATE_FORM = 'CREATE-INSTANCE';
+const { IC_F, IC_NAME_F, IC_IMG_F, IC_PKG_F_SELECT, IC_NW_F, IC_US_F } = Forms;
+
+const {
+ IC_MD_V_MD,
+ IC_TAG_V_TAGS,
+ IC_AFF_V_AFF,
+ IC_CNS_V_ENABLED,
+ IC_CNS_V_SERVICES,
+ IC_FW_F_ENABLED
+} = Values;
const CreateInstance = ({
step,
@@ -137,7 +147,7 @@ const CreateInstance = ({
) : null}
-
+
{({ handleSubmit, submitting }) => (
) : null}
{
- const proceeded = get(values, 'create-instance-tags-proceeded', false);
- const addOpen = get(values, 'create-instance-tags-add-open', false);
- const tags = get(values, 'create-instance-tags', []);
+ const proceeded = get(values, IC_TAG_V_PROCEEDED, false);
+ const addOpen = get(values, IC_TAG_V_ADD_OPEN, false);
+ const tags = get(values, IC_TAG_V_TAGS, []);
return {
proceeded: proceeded || tags.length,
@@ -144,11 +145,11 @@ export default compose(
}),
connect(null, (dispatch, { tags = [], history }) => ({
handleNext: () => {
- dispatch(set({ name: 'create-instance-tags-proceeded', value: true }));
+ dispatch(set({ name: IC_TAG_V_PROCEEDED, value: true }));
return history.push(`/~create/metadata${history.location.search}`);
},
handleEdit: () => {
- dispatch(set({ name: 'create-instance-tags-proceeded', value: true }));
+ dispatch(set({ name: IC_TAG_V_PROCEEDED, value: true }));
return history.push(`/~create/tags${history.location.search}`);
},
shouldAsyncValidate: ({ trigger }) => {
@@ -156,17 +157,14 @@ export default compose(
},
handleAsyncValidate: validateTag,
handleAddTag: value => {
- const toggleToClosed = set({
- name: `create-instance-tags-add-open`,
- value: false
- });
+ const toggleToClosed = set({ name: IC_TAG_V_ADD_OPEN, value: false });
const appendTag = set({
- name: `create-instance-tags`,
+ name: IC_TAG_V_TAGS,
value: tags.concat([{ ...value, expanded: false }])
});
- return dispatch([destroy(FORM_NAME_CREATE), toggleToClosed, appendTag]);
+ return dispatch([destroy(IC_TAG_F_ADD), toggleToClosed, appendTag]);
},
handleUpdateTag: (index, newTag) => {
tags[index] = {
@@ -175,14 +173,14 @@ export default compose(
};
return dispatch([
- destroy(FORM_NAME_EDIT(index)),
- set({ name: `create-instance-tags`, value: tags.slice() })
+ destroy(IC_TAG_F_EDIT(index)),
+ set({ name: IC_TAG_V_TAGS, value: tags.slice() })
]);
},
handleChangeAddOpen: value => {
return dispatch([
- reset(FORM_NAME_CREATE),
- set({ name: `create-instance-tags-add-open`, value })
+ reset(IC_TAG_F_ADD),
+ set({ name: IC_TAG_V_ADD_OPEN, value })
]);
},
handleToggleExpanded: index => {
@@ -191,12 +189,7 @@ export default compose(
expanded: !tags[index].expanded
};
- return dispatch(
- set({
- name: `create-instance-tags`,
- value: tags.slice()
- })
- );
+ return dispatch(set({ name: IC_TAG_V_TAGS, value: tags.slice() }));
},
handleCancelEdit: index => {
tags[index] = {
@@ -205,16 +198,16 @@ export default compose(
};
return dispatch([
- reset(FORM_NAME_EDIT(index)),
- set({ name: `create-instance-tags`, value: tags.slice() })
+ reset(IC_TAG_F_EDIT(index)),
+ set({ name: IC_TAG_V_TAGS, value: tags.slice() })
]);
},
handleRemoveTag: index => {
tags.splice(index, 1);
return dispatch([
- destroy(FORM_NAME_EDIT(index)),
- set({ name: `create-instance-tags`, value: tags.slice() })
+ destroy(IC_TAG_F_EDIT(index)),
+ set({ name: IC_TAG_V_TAGS, value: tags.slice() })
]);
}
}))
diff --git a/packages/my-joy-instances/src/containers/create-instance/user-script.js b/packages/my-joy-instances/src/containers/create-instance/user-script.js
index 575e7061..3610c390 100644
--- a/packages/my-joy-instances/src/containers/create-instance/user-script.js
+++ b/packages/my-joy-instances/src/containers/create-instance/user-script.js
@@ -11,9 +11,13 @@ import { ScriptIcon, Button } from 'joyent-ui-toolkit';
import Title from '@components/create-instance/title';
import Description from '@components/description';
-import UserScriptForm, { Overview } from '@components/create-instance/user-script';
+import UserScriptForm, {
+ Overview
+} from '@components/create-instance/user-script';
+import { Forms, Values } from '@root/constants';
-const FORM_NAME = 'create-instance-user-script';
+const { IC_US_F } = Forms;
+const { IC_US_V_PROCEEDED, IC_US_V_OPEN } = Values;
export const UserScript = ({
expanded,
@@ -44,7 +48,7 @@ export const UserScript = ({
{formOpen ? (
{
- const formOpen = get(values, 'create-instance-user-script-open', false);
- const script = get(form, `${FORM_NAME}.values.value`, '');
+ const formOpen = get(values, IC_US_V_OPEN, false);
+ const script = get(form, `${IC_US_F}.values.value`, '');
const lines = script.split('\n').length;
- const proceeded = get(
- values,
- 'create-instance-user-script-proceeded',
- false
- );
+ const proceeded = get(values, IC_US_V_PROCEEDED, false);
return {
script,
@@ -109,21 +109,19 @@ export default compose(
(dispatch, { history }) => ({
handleEdit: () => {
dispatch([
- set({ name: 'create-instance-user-script-proceeded', value: true }),
- set({ name: `create-instance-user-script-open`, value: true })
+ set({ name: IC_US_V_PROCEEDED, value: true }),
+ set({ name: IC_US_V_OPEN, value: true })
]);
return history.push(`/~create/user-script${history.location.search}`);
},
handleChangeOpenForm: value => {
- return dispatch([
- set({ name: `create-instance-user-script-open`, value })
- ]);
+ return dispatch([set({ name: IC_US_V_OPEN, value })]);
},
handleSubmit: value => {
dispatch([
- set({ name: `create-instance-user-script-open`, value: false }),
- set({ name: 'create-instance-user-script-proceeded', value: true })
+ set({ name: IC_US_V_OPEN, value: false }),
+ set({ name: IC_US_V_PROCEEDED, value: true })
]);
return history.push(`/~create/networks${history.location.search}`);
diff --git a/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/cns-ui-js-cns-loading-1-snap.png b/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/cns-ui-js-cns-loading-1-snap.png
index bb74b9a7..92b6af88 100644
Binary files a/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/cns-ui-js-cns-loading-1-snap.png and b/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/cns-ui-js-cns-loading-1-snap.png differ
diff --git a/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/firewall-ui-js-firewall-loading-1-snap.png b/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/firewall-ui-js-firewall-loading-1-snap.png
index 994934ab..eabce65a 100644
Binary files a/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/firewall-ui-js-firewall-loading-1-snap.png and b/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/firewall-ui-js-firewall-loading-1-snap.png differ
diff --git a/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/list-ui-js-list-loading-1-snap.png b/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/list-ui-js-list-loading-1-snap.png
index e8f8a37b..c62a777a 100644
Binary files a/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/list-ui-js-list-loading-1-snap.png and b/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/list-ui-js-list-loading-1-snap.png differ
diff --git a/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/metadata-ui-js-metadata-loading-1-snap.png b/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/metadata-ui-js-metadata-loading-1-snap.png
index 4757b1c8..2ab6d529 100644
Binary files a/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/metadata-ui-js-metadata-loading-1-snap.png and b/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/metadata-ui-js-metadata-loading-1-snap.png differ
diff --git a/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/metadata-ui-js-metadata-metadata-1-snap.png b/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/metadata-ui-js-metadata-metadata-1-snap.png
index ff3de4ab..114cb5f9 100644
Binary files a/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/metadata-ui-js-metadata-metadata-1-snap.png and b/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/metadata-ui-js-metadata-metadata-1-snap.png differ
diff --git a/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/networks-ui-js-networks-loading-1-snap.png b/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/networks-ui-js-networks-loading-1-snap.png
index 023e6b2f..b57541ca 100644
Binary files a/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/networks-ui-js-networks-loading-1-snap.png and b/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/networks-ui-js-networks-loading-1-snap.png differ
diff --git a/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/summary-ui-js-summary-1-snap.png b/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/summary-ui-js-summary-1-snap.png
index 217b0c57..a141971c 100644
Binary files a/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/summary-ui-js-summary-1-snap.png and b/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/summary-ui-js-summary-1-snap.png differ
diff --git a/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/summary-ui-js-summary-loading-error-1-snap.png b/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/summary-ui-js-summary-loading-error-1-snap.png
index a141971c..217b0c57 100644
Binary files a/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/summary-ui-js-summary-loading-error-1-snap.png and b/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/summary-ui-js-summary-loading-error-1-snap.png differ
diff --git a/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/summary-ui-js-summary-mutation-error-1-snap.png b/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/summary-ui-js-summary-mutation-error-1-snap.png
index c672f70e..e143a855 100644
Binary files a/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/summary-ui-js-summary-mutation-error-1-snap.png and b/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/summary-ui-js-summary-mutation-error-1-snap.png differ
diff --git a/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/summary-ui-js-summary-starting-stopping-rebooting-removing-1-snap.png b/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/summary-ui-js-summary-starting-stopping-rebooting-removing-1-snap.png
index 217b0c57..2328decd 100644
Binary files a/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/summary-ui-js-summary-starting-stopping-rebooting-removing-1-snap.png and b/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/summary-ui-js-summary-starting-stopping-rebooting-removing-1-snap.png differ
diff --git a/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/tags-ui-js-tags-editing-removing-1-snap.png b/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/tags-ui-js-tags-editing-removing-1-snap.png
index 9c6a47f2..d2439f20 100644
Binary files a/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/tags-ui-js-tags-editing-removing-1-snap.png and b/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/tags-ui-js-tags-editing-removing-1-snap.png differ
diff --git a/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/tags-ui-js-tags-loading-1-snap.png b/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/tags-ui-js-tags-loading-1-snap.png
index 8eebdfeb..689a7a78 100644
Binary files a/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/tags-ui-js-tags-loading-1-snap.png and b/packages/my-joy-instances/src/containers/instances/__tests__/__image_snapshots__/tags-ui-js-tags-loading-1-snap.png differ
diff --git a/packages/my-joy-instances/src/containers/instances/tags.js b/packages/my-joy-instances/src/containers/instances/tags.js
index 9ea0f109..89c49f4c 100644
--- a/packages/my-joy-instances/src/containers/instances/tags.js
+++ b/packages/my-joy-instances/src/containers/instances/tags.js
@@ -101,7 +101,7 @@ export const Tags = ({
form={editing.form}
initialValues={{ name: editing.name, value: editing.value }}
shouldAsyncValidate={shouldAsyncValidate}
- handleAsyncValidate={handleAsyncValidate}
+ asyncValidate={handleAsyncValidate}
onSubmit={handleEdit}
>
{props => (
diff --git a/packages/my-joy-instances/src/state/validators.js b/packages/my-joy-instances/src/state/validators.js
index 19b93c19..37d38a10 100644
--- a/packages/my-joy-instances/src/state/validators.js
+++ b/packages/my-joy-instances/src/state/validators.js
@@ -14,14 +14,16 @@ const validateField = async (field, value) => {
const validateSchema = async (schema, value) => {
const errors = await reduce(
keys(schema),
- async (errors, name) =>
- assign(errors, {
- [name]: await validateField(schema[name], value[name])
- }),
+ async (errors, name) => {
+ const msg = await validateField(schema[name], value[name]);
+ return !msg ? errors : assign(errors, { [name]: msg });
+ },
{}
);
- throw errors;
+ if (keys(errors).length) {
+ throw errors;
+ }
};
/*****************************************************************************/