mirror of
https://github.com/ansible/awx.git
synced 2026-05-09 18:37:36 -02:30
make VariablesInput detect whether value is JSON or YAML on init
This commit is contained in:
@@ -3,7 +3,7 @@ import { string, func, bool, number } from 'prop-types';
|
|||||||
import { Button, Split, SplitItem } from '@patternfly/react-core';
|
import { Button, Split, SplitItem } from '@patternfly/react-core';
|
||||||
import styled from 'styled-components';
|
import styled from 'styled-components';
|
||||||
import ButtonGroup from '@components/ButtonGroup';
|
import ButtonGroup from '@components/ButtonGroup';
|
||||||
import { yamlToJson, jsonToYaml } from '@util/yaml';
|
import { yamlToJson, jsonToYaml, isJson } from '@util/yaml';
|
||||||
import CodeMirrorInput from './CodeMirrorInput';
|
import CodeMirrorInput from './CodeMirrorInput';
|
||||||
|
|
||||||
const YAML_MODE = 'yaml';
|
const YAML_MODE = 'yaml';
|
||||||
@@ -15,8 +15,19 @@ const SmallButton = styled(Button)`
|
|||||||
`;
|
`;
|
||||||
|
|
||||||
function VariablesInput (props) {
|
function VariablesInput (props) {
|
||||||
const { id, label, value, readOnly, rows, error, onChange, onError, className } = props;
|
const { id, label, readOnly, rows, error, onError, className } = props;
|
||||||
const [mode, setMode] = useState(YAML_MODE);
|
// eslint-disable-next-line react/destructuring-assignment
|
||||||
|
const [value, setValue] = useState(props.value);
|
||||||
|
const [mode, setMode] = useState(isJson(value) ? JSON_MODE : YAML_MODE);
|
||||||
|
// eslint-disable-next-line react/destructuring-assignment
|
||||||
|
const isControlled = !!props.onChange;
|
||||||
|
|
||||||
|
const onChange = (newValue) => {
|
||||||
|
if (isControlled) {
|
||||||
|
props.onChange(newValue);
|
||||||
|
}
|
||||||
|
setValue(newValue);
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={`pf-c-form__group ${className || ''}`}>
|
<div className={`pf-c-form__group ${className || ''}`}>
|
||||||
@@ -88,7 +99,7 @@ VariablesInput.propTypes = {
|
|||||||
};
|
};
|
||||||
VariablesInput.defaultProps = {
|
VariablesInput.defaultProps = {
|
||||||
readOnly: false,
|
readOnly: false,
|
||||||
onChange: () => {},
|
onChange: null,
|
||||||
rows: 6,
|
rows: 6,
|
||||||
error: null,
|
error: null,
|
||||||
onError: () => {},
|
onError: () => {},
|
||||||
@@ -14,9 +14,13 @@ export function ucFirst(str) {
|
|||||||
return `${str[0].toUpperCase()}${str.substr(1)}`;
|
return `${str[0].toUpperCase()}${str.substr(1)}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const toTitleCase = string =>
|
export const toTitleCase = string => {
|
||||||
string
|
if (!string) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
return string
|
||||||
.toLowerCase()
|
.toLowerCase()
|
||||||
.split('_')
|
.split('_')
|
||||||
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
|
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
|
||||||
.join(' ');
|
.join(' ');
|
||||||
|
};
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { pluralize, getArticle, ucFirst } from './strings';
|
import { pluralize, getArticle, ucFirst, toTitleCase } from './strings';
|
||||||
|
|
||||||
describe('string utils', () => {
|
describe('string utils', () => {
|
||||||
describe('pluralize', () => {
|
describe('pluralize', () => {
|
||||||
@@ -31,4 +31,14 @@ describe('string utils', () => {
|
|||||||
expect(ucFirst('team')).toEqual('Team');
|
expect(ucFirst('team')).toEqual('Team');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('toTitleCase', () => {
|
||||||
|
test('should upper case each word', () => {
|
||||||
|
expect(toTitleCase('a_string_of_words')).toEqual('A String Of Words');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('should return empty string for undefined', () => {
|
||||||
|
expect(toTitleCase(undefined)).toEqual('');
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -21,3 +21,15 @@ export function jsonToYaml(jsonString) {
|
|||||||
}
|
}
|
||||||
return yaml.safeDump(value);
|
return yaml.safeDump(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function isJson (jsonString) {
|
||||||
|
if (typeof jsonString !== 'string') { return false; }
|
||||||
|
let value;
|
||||||
|
try {
|
||||||
|
value = JSON.parse(jsonString);
|
||||||
|
} catch (e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return typeof value === 'object' && value !== null;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user