foreman_templates 7.0.1 → 7.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.babelrc +16 -0
- data/lib/foreman_templates/version.rb +1 -1
- data/package.json +68 -0
- data/webpack/ForemanTemplates.js +29 -0
- data/webpack/Routes.js +33 -0
- data/webpack/__mocks__/foremanReact/common/helpers.js +27 -0
- data/webpack/__mocks__/foremanReact/components/Pagination/PaginationWrapper.js +2 -0
- data/webpack/__mocks__/foremanReact/components/common/forms/CommonForm.js +2 -0
- data/webpack/__mocks__/foremanReact/components/common/forms/Form.js +2 -0
- data/webpack/__mocks__/foremanReact/components/common/forms/TextField.js +2 -0
- data/webpack/__mocks__/foremanReact/redux/actions/common/forms.js +1 -0
- data/webpack/__mocks__/foremanReact/routes/common/PageLayout/PageLayout.js +2 -0
- data/webpack/__tests__/__snapshots__/helpers.test.js.snap +5 -0
- data/webpack/__tests__/helpers.test.js +17 -0
- data/webpack/components/NewTemplateSync/NewTemplateSync.js +60 -0
- data/webpack/components/NewTemplateSync/NewTemplateSync.scss +19 -0
- data/webpack/components/NewTemplateSync/NewTemplateSyncActions.js +39 -0
- data/webpack/components/NewTemplateSync/NewTemplateSyncReducer.js +34 -0
- data/webpack/components/NewTemplateSync/NewTemplateSyncSelectors.js +7 -0
- data/webpack/components/NewTemplateSync/__fixtures__/templateSyncSettings.fixtures.js +71 -0
- data/webpack/components/NewTemplateSync/__tests__/NewTemplateSync.test.js +31 -0
- data/webpack/components/NewTemplateSync/__tests__/NewTemplateSyncReducer.test.js +55 -0
- data/webpack/components/NewTemplateSync/__tests__/NewTemplateSyncSelectors.test.js +28 -0
- data/webpack/components/NewTemplateSync/__tests__/__snapshots__/NewTemplateSync.test.js.snap +53 -0
- data/webpack/components/NewTemplateSync/__tests__/__snapshots__/NewTemplateSyncReducer.test.js.snap +74 -0
- data/webpack/components/NewTemplateSync/__tests__/__snapshots__/NewTemplateSyncSelectors.test.js.snap +59 -0
- data/webpack/components/NewTemplateSync/components/ButtonTooltip.js +23 -0
- data/webpack/components/NewTemplateSync/components/NewTemplateSyncForm/NewTemplateSyncForm.js +145 -0
- data/webpack/components/NewTemplateSync/components/NewTemplateSyncForm/NewTemplateSyncFormConstants.js +1 -0
- data/webpack/components/NewTemplateSync/components/NewTemplateSyncForm/NewTemplateSyncFormSelectors.js +24 -0
- data/webpack/components/NewTemplateSync/components/NewTemplateSyncForm/__tests__/NewTemplateSyncForm.test.js +42 -0
- data/webpack/components/NewTemplateSync/components/NewTemplateSyncForm/__tests__/NewTemplateSyncFormSelectors.test.js +37 -0
- data/webpack/components/NewTemplateSync/components/NewTemplateSyncForm/__tests__/__snapshots__/NewTemplateSyncForm.test.js.snap +176 -0
- data/webpack/components/NewTemplateSync/components/NewTemplateSyncForm/__tests__/__snapshots__/NewTemplateSyncFormSelectors.test.js.snap +42 -0
- data/webpack/components/NewTemplateSync/components/NewTemplateSyncForm/index.js +44 -0
- data/webpack/components/NewTemplateSync/components/SyncSettingField.js +54 -0
- data/webpack/components/NewTemplateSync/components/SyncSettingFields.js +69 -0
- data/webpack/components/NewTemplateSync/components/SyncTypeRadios.js +52 -0
- data/webpack/components/NewTemplateSync/components/TextButtonField/BlankOption.js +19 -0
- data/webpack/components/NewTemplateSync/components/TextButtonField/CheckboxField.js +15 -0
- data/webpack/components/NewTemplateSync/components/TextButtonField/FieldType.js +46 -0
- data/webpack/components/NewTemplateSync/components/TextButtonField/InputField.js +14 -0
- data/webpack/components/NewTemplateSync/components/TextButtonField/RenderField.js +74 -0
- data/webpack/components/NewTemplateSync/components/TextButtonField/SelectField.js +24 -0
- data/webpack/components/NewTemplateSync/components/TextButtonField/index.js +69 -0
- data/webpack/components/NewTemplateSync/components/__tests__/SyncSettingField.test.js +34 -0
- data/webpack/components/NewTemplateSync/components/__tests__/SyncSettingFields.test.js +33 -0
- data/webpack/components/NewTemplateSync/components/__tests__/SyncTypeRadios.test.js +20 -0
- data/webpack/components/NewTemplateSync/components/__tests__/TextButtonField.test.js +65 -0
- data/webpack/components/NewTemplateSync/components/__tests__/__snapshots__/SyncSettingField.test.js.snap +131 -0
- data/webpack/components/NewTemplateSync/components/__tests__/__snapshots__/SyncSettingFields.test.js.snap +94 -0
- data/webpack/components/NewTemplateSync/components/__tests__/__snapshots__/SyncTypeRadios.test.js.snap +46 -0
- data/webpack/components/NewTemplateSync/components/__tests__/__snapshots__/TextButtonField.test.js.snap +112 -0
- data/webpack/components/NewTemplateSync/index.js +32 -0
- data/webpack/components/PageNotFound.js +13 -0
- data/webpack/components/PermissionDenied.js +33 -0
- data/webpack/components/TemplateSyncResult/TemplateSyncResult.js +61 -0
- data/webpack/components/TemplateSyncResult/TemplateSyncResult.scss +39 -0
- data/webpack/components/TemplateSyncResult/TemplateSyncResultActions.js +4 -0
- data/webpack/components/TemplateSyncResult/TemplateSyncResultHelpers.js +6 -0
- data/webpack/components/TemplateSyncResult/TemplateSyncResultReducer.js +33 -0
- data/webpack/components/TemplateSyncResult/TemplateSyncResultSelectors.js +1 -0
- data/webpack/components/TemplateSyncResult/__fixtures__/templateSyncResult.fixtures.js +86 -0
- data/webpack/components/TemplateSyncResult/__tests__/TemplateSyncResult.test.js +37 -0
- data/webpack/components/TemplateSyncResult/__tests__/TemplateSyncResultReducer.test.js +48 -0
- data/webpack/components/TemplateSyncResult/__tests__/__snapshots__/TemplateSyncResult.test.js.snap +112 -0
- data/webpack/components/TemplateSyncResult/__tests__/__snapshots__/TemplateSyncResultReducer.test.js.snap +88 -0
- data/webpack/components/TemplateSyncResult/components/EmptySyncResult.js +25 -0
- data/webpack/components/TemplateSyncResult/components/FinishedSyncResult.js +77 -0
- data/webpack/components/TemplateSyncResult/components/ListViewHeader.js +38 -0
- data/webpack/components/TemplateSyncResult/components/SyncResultList.js +41 -0
- data/webpack/components/TemplateSyncResult/components/SyncedTemplate/EmptyInfoItem.js +16 -0
- data/webpack/components/TemplateSyncResult/components/SyncedTemplate/IconInfoItem.js +21 -0
- data/webpack/components/TemplateSyncResult/components/SyncedTemplate/InfoItem.js +34 -0
- data/webpack/components/TemplateSyncResult/components/SyncedTemplate/LinkInfoItem.js +37 -0
- data/webpack/components/TemplateSyncResult/components/SyncedTemplate/StringInfoItem.js +50 -0
- data/webpack/components/TemplateSyncResult/components/SyncedTemplate/helpers.js +128 -0
- data/webpack/components/TemplateSyncResult/components/SyncedTemplate/index.js +33 -0
- data/webpack/components/TemplateSyncResult/components/__tests__/SyncResultList.test.js +27 -0
- data/webpack/components/TemplateSyncResult/components/__tests__/SyncedTemplate.test.js +30 -0
- data/webpack/components/TemplateSyncResult/components/__tests__/__snapshots__/SyncResultList.test.js.snap +102 -0
- data/webpack/components/TemplateSyncResult/components/__tests__/__snapshots__/SyncedTemplate.test.js.snap +548 -0
- data/webpack/components/TemplateSyncResult/index.js +13 -0
- data/webpack/consts.js +6 -0
- data/webpack/index.js +11 -0
- data/webpack/reducer.js +6 -0
- data/webpack/testSetup.js +11 -0
- data/webpack/withProtectedView.js +16 -0
- metadata +89 -2
@@ -0,0 +1,54 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import PropTypes from 'prop-types';
|
3
|
+
import { FieldLevelHelp } from 'patternfly-react';
|
4
|
+
|
5
|
+
import TextButtonField from './TextButtonField';
|
6
|
+
import ButtonTooltip from './ButtonTooltip';
|
7
|
+
|
8
|
+
const SyncSettingField = ({ setting, resetField, disabled }) => {
|
9
|
+
const label = settingObj => `${settingObj.fullName} `;
|
10
|
+
|
11
|
+
const fieldSelector = settingObj => {
|
12
|
+
if (settingObj.settingsType === 'boolean') {
|
13
|
+
return 'checkbox';
|
14
|
+
}
|
15
|
+
|
16
|
+
if (settingObj.selection.length !== 0) {
|
17
|
+
return 'select';
|
18
|
+
}
|
19
|
+
|
20
|
+
return 'text';
|
21
|
+
};
|
22
|
+
|
23
|
+
const handleReset = (settingName, settingValue) => {
|
24
|
+
resetField(settingName, settingValue);
|
25
|
+
};
|
26
|
+
|
27
|
+
return (
|
28
|
+
<TextButtonField
|
29
|
+
name={setting.name}
|
30
|
+
label={label(setting)}
|
31
|
+
blank={{}}
|
32
|
+
item={setting}
|
33
|
+
buttonAttrs={{
|
34
|
+
buttonText: <ButtonTooltip tooltipId={setting.name} />,
|
35
|
+
buttonAction: () => handleReset(setting.name, setting.value),
|
36
|
+
}}
|
37
|
+
fieldSelector={fieldSelector}
|
38
|
+
disabled={disabled}
|
39
|
+
fieldRequired={setting.required}
|
40
|
+
validate={setting.validate}
|
41
|
+
tooltipHelp={<FieldLevelHelp content={setting.description} />}
|
42
|
+
>
|
43
|
+
{setting.value}
|
44
|
+
</TextButtonField>
|
45
|
+
);
|
46
|
+
};
|
47
|
+
|
48
|
+
SyncSettingField.propTypes = {
|
49
|
+
setting: PropTypes.object.isRequired,
|
50
|
+
resetField: PropTypes.func.isRequired,
|
51
|
+
disabled: PropTypes.bool.isRequired,
|
52
|
+
};
|
53
|
+
|
54
|
+
export default SyncSettingField;
|
@@ -0,0 +1,69 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { memoize } from 'lodash';
|
3
|
+
import PropTypes from 'prop-types';
|
4
|
+
|
5
|
+
import SyncSettingField from './SyncSettingField';
|
6
|
+
|
7
|
+
const repoFormat = memoize(formatAry => value => {
|
8
|
+
if (value) {
|
9
|
+
const valid = formatAry
|
10
|
+
.map(item => value.startsWith(item))
|
11
|
+
.reduce((memo, item) => item || memo, false);
|
12
|
+
|
13
|
+
if (valid) {
|
14
|
+
return undefined;
|
15
|
+
}
|
16
|
+
}
|
17
|
+
|
18
|
+
return `Invalid repo format, must start with one of: ${formatAry.join(', ')}`;
|
19
|
+
});
|
20
|
+
|
21
|
+
const SyncSettingsFields = ({
|
22
|
+
importSettings,
|
23
|
+
exportSettings,
|
24
|
+
syncType,
|
25
|
+
resetField,
|
26
|
+
disabled,
|
27
|
+
validationData,
|
28
|
+
}) => {
|
29
|
+
const addValidationToSetting = (setting, validations) =>
|
30
|
+
setting.name === 'repo'
|
31
|
+
? setting.merge({
|
32
|
+
required: true,
|
33
|
+
validate: [repoFormat(validations.repo)],
|
34
|
+
})
|
35
|
+
: setting;
|
36
|
+
|
37
|
+
const settingsAry = syncType === 'import' ? importSettings : exportSettings;
|
38
|
+
|
39
|
+
return (
|
40
|
+
<React.Fragment>
|
41
|
+
{settingsAry
|
42
|
+
.map(setting => addValidationToSetting(setting, validationData))
|
43
|
+
.map(setting => (
|
44
|
+
<SyncSettingField
|
45
|
+
setting={setting}
|
46
|
+
key={setting.name}
|
47
|
+
disabled={disabled}
|
48
|
+
resetField={resetField}
|
49
|
+
/>
|
50
|
+
))}
|
51
|
+
</React.Fragment>
|
52
|
+
);
|
53
|
+
};
|
54
|
+
|
55
|
+
SyncSettingsFields.propTypes = {
|
56
|
+
importSettings: PropTypes.array.isRequired,
|
57
|
+
exportSettings: PropTypes.array.isRequired,
|
58
|
+
syncType: PropTypes.string.isRequired,
|
59
|
+
resetField: PropTypes.func.isRequired,
|
60
|
+
disabled: PropTypes.bool,
|
61
|
+
validationData: PropTypes.object,
|
62
|
+
};
|
63
|
+
|
64
|
+
SyncSettingsFields.defaultProps = {
|
65
|
+
disabled: false,
|
66
|
+
validationData: {},
|
67
|
+
};
|
68
|
+
|
69
|
+
export default SyncSettingsFields;
|
@@ -0,0 +1,52 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
|
3
|
+
import { Radio } from 'patternfly-react';
|
4
|
+
import PropTypes from 'prop-types';
|
5
|
+
|
6
|
+
import CommonForm from 'foremanReact/components/common/forms/CommonForm';
|
7
|
+
|
8
|
+
const SyncTypeRadios = ({
|
9
|
+
controlLabel,
|
10
|
+
radios,
|
11
|
+
name,
|
12
|
+
className = '',
|
13
|
+
inputClassName = 'col-md-6',
|
14
|
+
disabled = false,
|
15
|
+
}) => (
|
16
|
+
<CommonForm
|
17
|
+
label={controlLabel}
|
18
|
+
className={className}
|
19
|
+
inputClassName={inputClassName}
|
20
|
+
>
|
21
|
+
{radios.map((item, index) => (
|
22
|
+
<Radio
|
23
|
+
key={index}
|
24
|
+
inline
|
25
|
+
title={item.label}
|
26
|
+
checked={item.checked}
|
27
|
+
disabled={disabled}
|
28
|
+
value={item.value}
|
29
|
+
onChange={item.onChange}
|
30
|
+
>
|
31
|
+
{item.label}
|
32
|
+
</Radio>
|
33
|
+
))}
|
34
|
+
</CommonForm>
|
35
|
+
);
|
36
|
+
|
37
|
+
SyncTypeRadios.propTypes = {
|
38
|
+
controlLabel: PropTypes.string.isRequired,
|
39
|
+
radios: PropTypes.array.isRequired,
|
40
|
+
name: PropTypes.string.isRequired,
|
41
|
+
className: PropTypes.string,
|
42
|
+
inputClassName: PropTypes.string,
|
43
|
+
disabled: PropTypes.bool,
|
44
|
+
};
|
45
|
+
|
46
|
+
SyncTypeRadios.defaultProps = {
|
47
|
+
className: undefined,
|
48
|
+
inputClassName: undefined,
|
49
|
+
disabled: false,
|
50
|
+
};
|
51
|
+
|
52
|
+
export default SyncTypeRadios;
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import PropTypes from 'prop-types';
|
3
|
+
|
4
|
+
const BlankOption = ({ blank }) => {
|
5
|
+
if (Object.keys(blank).length === 0) {
|
6
|
+
return null;
|
7
|
+
}
|
8
|
+
return (
|
9
|
+
<option key={blank.value} value={blank.value}>
|
10
|
+
{blank.label}
|
11
|
+
</option>
|
12
|
+
);
|
13
|
+
};
|
14
|
+
|
15
|
+
BlankOption.propTypes = {
|
16
|
+
blank: PropTypes.object.isRequired,
|
17
|
+
};
|
18
|
+
|
19
|
+
export default BlankOption;
|
@@ -0,0 +1,15 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { Checkbox } from 'patternfly-react';
|
3
|
+
import PropTypes from 'prop-types';
|
4
|
+
|
5
|
+
const CheckboxField = ({ input, item, disabled }) => (
|
6
|
+
<Checkbox {...input} disabled={disabled} checked={input.value} />
|
7
|
+
);
|
8
|
+
|
9
|
+
CheckboxField.propTypes = {
|
10
|
+
input: PropTypes.object.isRequired,
|
11
|
+
item: PropTypes.object.isRequired,
|
12
|
+
disabled: PropTypes.bool.isRequired,
|
13
|
+
};
|
14
|
+
|
15
|
+
export default CheckboxField;
|
@@ -0,0 +1,46 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import PropTypes from 'prop-types';
|
3
|
+
|
4
|
+
import InputField from './InputField';
|
5
|
+
import SelectField from './SelectField';
|
6
|
+
import CheckboxField from './CheckboxField';
|
7
|
+
|
8
|
+
const FieldType = ({ item, fieldSelector, input, disabled, blank }) => {
|
9
|
+
if (!fieldSelector) {
|
10
|
+
return <InputField input={input} disabled={disabled} />;
|
11
|
+
}
|
12
|
+
|
13
|
+
switch (fieldSelector(item)) {
|
14
|
+
case 'text':
|
15
|
+
return <InputField input={input} disabled={disabled} />;
|
16
|
+
case 'select':
|
17
|
+
return (
|
18
|
+
<SelectField
|
19
|
+
input={input}
|
20
|
+
blank={blank}
|
21
|
+
item={item}
|
22
|
+
disabled={disabled}
|
23
|
+
/>
|
24
|
+
);
|
25
|
+
case 'checkbox':
|
26
|
+
return <CheckboxField input={input} item={item} disabled={disabled} />;
|
27
|
+
default:
|
28
|
+
throw new Error(`Unknown field type ${fieldSelector(item)} for ${item}`);
|
29
|
+
}
|
30
|
+
};
|
31
|
+
|
32
|
+
FieldType.propTypes = {
|
33
|
+
item: PropTypes.object.isRequired,
|
34
|
+
fieldSelector: PropTypes.func,
|
35
|
+
input: PropTypes.object.isRequired,
|
36
|
+
disabled: PropTypes.bool,
|
37
|
+
blank: PropTypes.object,
|
38
|
+
};
|
39
|
+
|
40
|
+
FieldType.defaultProps = {
|
41
|
+
fieldSelector: null,
|
42
|
+
disabled: false,
|
43
|
+
blank: {},
|
44
|
+
};
|
45
|
+
|
46
|
+
export default FieldType;
|
@@ -0,0 +1,14 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { FormControl } from 'patternfly-react';
|
3
|
+
import PropTypes from 'prop-types';
|
4
|
+
|
5
|
+
const InputField = ({ input, disabled }) => (
|
6
|
+
<FormControl {...input} type="text" disabled={disabled} />
|
7
|
+
);
|
8
|
+
|
9
|
+
InputField.propTypes = {
|
10
|
+
input: PropTypes.object.isRequired,
|
11
|
+
disabled: PropTypes.bool.isRequired,
|
12
|
+
};
|
13
|
+
|
14
|
+
export default InputField;
|
@@ -0,0 +1,74 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import CommonForm from 'foremanReact/components/common/forms/CommonForm';
|
3
|
+
import { InputGroup, Button } from 'patternfly-react';
|
4
|
+
import PropTypes from 'prop-types';
|
5
|
+
|
6
|
+
import FieldType from './FieldType';
|
7
|
+
|
8
|
+
const RenderField = ({
|
9
|
+
input,
|
10
|
+
label,
|
11
|
+
className,
|
12
|
+
inputClassName,
|
13
|
+
fieldRequired,
|
14
|
+
disabled,
|
15
|
+
blank,
|
16
|
+
item,
|
17
|
+
fieldSelector,
|
18
|
+
tooltipHelp,
|
19
|
+
meta: { error, touched },
|
20
|
+
buttonAttrs: { buttonText, buttonAction },
|
21
|
+
}) => (
|
22
|
+
<CommonForm
|
23
|
+
label={label}
|
24
|
+
className={className}
|
25
|
+
inputClassName={inputClassName}
|
26
|
+
required={fieldRequired}
|
27
|
+
error={error}
|
28
|
+
touched={touched}
|
29
|
+
tooltipHelp={tooltipHelp}
|
30
|
+
>
|
31
|
+
<InputGroup>
|
32
|
+
<FieldType
|
33
|
+
item={item}
|
34
|
+
fieldSelector={fieldSelector}
|
35
|
+
input={input}
|
36
|
+
disabled={disabled}
|
37
|
+
blank={blank}
|
38
|
+
/>
|
39
|
+
<InputGroup.Button className="left-padded">
|
40
|
+
<Button onClick={buttonAction} disabled={disabled}>
|
41
|
+
{buttonText}
|
42
|
+
</Button>
|
43
|
+
</InputGroup.Button>
|
44
|
+
</InputGroup>
|
45
|
+
</CommonForm>
|
46
|
+
);
|
47
|
+
|
48
|
+
RenderField.propTypes = {
|
49
|
+
input: PropTypes.object.isRequired,
|
50
|
+
label: PropTypes.string.isRequired,
|
51
|
+
className: PropTypes.string,
|
52
|
+
inputClassName: PropTypes.string,
|
53
|
+
fieldRequired: PropTypes.bool,
|
54
|
+
disabled: PropTypes.bool.isRequired,
|
55
|
+
blank: PropTypes.object,
|
56
|
+
item: PropTypes.object.isRequired,
|
57
|
+
fieldSelector: PropTypes.func,
|
58
|
+
tooltipHelp: PropTypes.node,
|
59
|
+
meta: PropTypes.object,
|
60
|
+
buttonAttrs: PropTypes.object,
|
61
|
+
};
|
62
|
+
|
63
|
+
RenderField.defaultProps = {
|
64
|
+
className: '',
|
65
|
+
inputClassName: 'col-md-4',
|
66
|
+
fieldRequired: false,
|
67
|
+
blank: {},
|
68
|
+
fieldSelector: null,
|
69
|
+
tooltipHelp: null,
|
70
|
+
meta: {},
|
71
|
+
buttonAttrs: {},
|
72
|
+
};
|
73
|
+
|
74
|
+
export default RenderField;
|
@@ -0,0 +1,24 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import PropTypes from 'prop-types';
|
3
|
+
import { FormControl } from 'patternfly-react';
|
4
|
+
import BlankOption from './BlankOption';
|
5
|
+
|
6
|
+
const SelectField = ({ input, blank, item, disabled }) => (
|
7
|
+
<FormControl {...input} componentClass="select" disabled={disabled}>
|
8
|
+
<BlankOption blank={blank} />
|
9
|
+
{item.selection.map(opt => (
|
10
|
+
<option key={opt.value} value={opt.value}>
|
11
|
+
{opt.label}
|
12
|
+
</option>
|
13
|
+
))}
|
14
|
+
</FormControl>
|
15
|
+
);
|
16
|
+
|
17
|
+
SelectField.propTypes = {
|
18
|
+
input: PropTypes.object.isRequired,
|
19
|
+
blank: PropTypes.object.isRequired,
|
20
|
+
item: PropTypes.object.isRequired,
|
21
|
+
disabled: PropTypes.bool.isRequired,
|
22
|
+
};
|
23
|
+
|
24
|
+
export default SelectField;
|
@@ -0,0 +1,69 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { Field } from 'redux-form';
|
3
|
+
import PropTypes from 'prop-types';
|
4
|
+
|
5
|
+
import RenderField from './RenderField';
|
6
|
+
|
7
|
+
const TextButtonField = ({
|
8
|
+
item = {},
|
9
|
+
label,
|
10
|
+
name,
|
11
|
+
className,
|
12
|
+
inputClassName,
|
13
|
+
blank,
|
14
|
+
buttonAttrs,
|
15
|
+
fieldSelector,
|
16
|
+
validate,
|
17
|
+
disabled,
|
18
|
+
fieldRequired,
|
19
|
+
tooltipHelp,
|
20
|
+
}) => (
|
21
|
+
<Field
|
22
|
+
name={name}
|
23
|
+
label={label}
|
24
|
+
fieldSelector={fieldSelector}
|
25
|
+
tooltipHelp={tooltipHelp}
|
26
|
+
component={RenderField}
|
27
|
+
buttonAttrs={buttonAttrs}
|
28
|
+
blank={blank}
|
29
|
+
item={item}
|
30
|
+
disabled={disabled}
|
31
|
+
validate={item.validate}
|
32
|
+
fieldRequired={fieldRequired}
|
33
|
+
/>
|
34
|
+
);
|
35
|
+
|
36
|
+
TextButtonField.propTypes = {
|
37
|
+
item: PropTypes.object,
|
38
|
+
label: PropTypes.string.isRequired,
|
39
|
+
name: PropTypes.string.isRequired,
|
40
|
+
className: PropTypes.string,
|
41
|
+
inputClassName: PropTypes.string,
|
42
|
+
blank: PropTypes.shape({
|
43
|
+
label: PropTypes.string,
|
44
|
+
value: PropTypes.string,
|
45
|
+
}),
|
46
|
+
buttonAttrs: PropTypes.shape({
|
47
|
+
buttonText: PropTypes.node,
|
48
|
+
buttonAction: PropTypes.func,
|
49
|
+
}).isRequired,
|
50
|
+
fieldSelector: PropTypes.func,
|
51
|
+
validate: PropTypes.array,
|
52
|
+
disabled: PropTypes.bool,
|
53
|
+
fieldRequired: PropTypes.bool,
|
54
|
+
tooltipHelp: PropTypes.node,
|
55
|
+
};
|
56
|
+
|
57
|
+
TextButtonField.defaultProps = {
|
58
|
+
blank: { label: 'Choose one...', value: '' },
|
59
|
+
className: '',
|
60
|
+
inputClassName: 'col-md-6',
|
61
|
+
validate: [],
|
62
|
+
disabled: false,
|
63
|
+
fieldRequired: false,
|
64
|
+
tooltipHelp: null,
|
65
|
+
fieldSelector: () => 'text',
|
66
|
+
item: {},
|
67
|
+
};
|
68
|
+
|
69
|
+
export default TextButtonField;
|
@@ -0,0 +1,34 @@
|
|
1
|
+
import { testComponentSnapshotsWithFixtures } from 'react-redux-test-utils';
|
2
|
+
|
3
|
+
import SyncSettingField from '../SyncSettingField';
|
4
|
+
|
5
|
+
import {
|
6
|
+
associateSetting,
|
7
|
+
forceSetting,
|
8
|
+
filterSetting,
|
9
|
+
} from '../../__fixtures__/templateSyncSettings.fixtures';
|
10
|
+
|
11
|
+
const noop = () => {};
|
12
|
+
|
13
|
+
const commonFixtures = {
|
14
|
+
resetField: noop,
|
15
|
+
disabled: false,
|
16
|
+
};
|
17
|
+
|
18
|
+
const fixtures = {
|
19
|
+
'should render setting with select choices': {
|
20
|
+
setting: associateSetting,
|
21
|
+
...commonFixtures,
|
22
|
+
},
|
23
|
+
'should render setting with input field': {
|
24
|
+
setting: filterSetting,
|
25
|
+
...commonFixtures,
|
26
|
+
},
|
27
|
+
'should render boolean setting as checkbox': {
|
28
|
+
setting: forceSetting,
|
29
|
+
...commonFixtures,
|
30
|
+
},
|
31
|
+
};
|
32
|
+
|
33
|
+
describe('SyncSettingField', () =>
|
34
|
+
testComponentSnapshotsWithFixtures(SyncSettingField, fixtures));
|
@@ -0,0 +1,33 @@
|
|
1
|
+
import { testComponentSnapshotsWithFixtures } from 'react-redux-test-utils';
|
2
|
+
|
3
|
+
import SyncSettingFields from '../SyncSettingFields';
|
4
|
+
|
5
|
+
import {
|
6
|
+
importSettings,
|
7
|
+
exportSettings,
|
8
|
+
} from '../../__fixtures__/templateSyncSettings.fixtures';
|
9
|
+
|
10
|
+
const noop = () => {};
|
11
|
+
|
12
|
+
const commonFixtures = {
|
13
|
+
importSettings,
|
14
|
+
exportSettings,
|
15
|
+
resetField: noop,
|
16
|
+
disabled: false,
|
17
|
+
};
|
18
|
+
|
19
|
+
const fixtures = {
|
20
|
+
'should show export settings': {
|
21
|
+
syncType: 'export',
|
22
|
+
validationData: {},
|
23
|
+
...commonFixtures,
|
24
|
+
},
|
25
|
+
'should show import settings': {
|
26
|
+
syncType: 'import',
|
27
|
+
validationData: { repo: ['http', 'https'] },
|
28
|
+
...commonFixtures,
|
29
|
+
},
|
30
|
+
};
|
31
|
+
|
32
|
+
describe('SyncSettingFields', () =>
|
33
|
+
testComponentSnapshotsWithFixtures(SyncSettingFields, fixtures));
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import { testComponentSnapshotsWithFixtures } from 'react-redux-test-utils';
|
2
|
+
|
3
|
+
import SyncTypeRadios from '../SyncTypeRadios';
|
4
|
+
|
5
|
+
const noop = () => {};
|
6
|
+
|
7
|
+
const fixtures = {
|
8
|
+
'should render': {
|
9
|
+
controlLabel: 'Test radios',
|
10
|
+
name: 'radios',
|
11
|
+
radios: [
|
12
|
+
{ label: 'A', checked: false, value: 'a', onChange: noop },
|
13
|
+
{ label: 'B', checked: true, value: 'b', onChange: noop },
|
14
|
+
{ label: 'C', checked: false, value: 'c', onChange: noop },
|
15
|
+
],
|
16
|
+
},
|
17
|
+
};
|
18
|
+
|
19
|
+
describe('SyncTypeRadios', () =>
|
20
|
+
testComponentSnapshotsWithFixtures(SyncTypeRadios, fixtures));
|
@@ -0,0 +1,65 @@
|
|
1
|
+
import { testComponentSnapshotsWithFixtures } from 'react-redux-test-utils';
|
2
|
+
|
3
|
+
import TextButtonField from '../TextButtonField';
|
4
|
+
|
5
|
+
const textItem = {
|
6
|
+
type: 'text',
|
7
|
+
};
|
8
|
+
|
9
|
+
const selectItem = {
|
10
|
+
type: 'select',
|
11
|
+
selection: [
|
12
|
+
{ label: 'A', value: 'a' },
|
13
|
+
{ label: 'B', value: 'b' },
|
14
|
+
{ label: 'C', value: 'c' },
|
15
|
+
],
|
16
|
+
};
|
17
|
+
|
18
|
+
const checkboxItem = {
|
19
|
+
type: 'checkbox',
|
20
|
+
};
|
21
|
+
|
22
|
+
const blank = { label: 'Bare Metal', value: 'bareMetal' };
|
23
|
+
|
24
|
+
const fieldSelector = item => item.type;
|
25
|
+
const buttonAttrs = { buttonText: 'Button', buttonAction: () => {} };
|
26
|
+
|
27
|
+
const fixtures = {
|
28
|
+
'should render text item': {
|
29
|
+
name: 'Text field',
|
30
|
+
item: textItem,
|
31
|
+
fieldSelector,
|
32
|
+
buttonAttrs,
|
33
|
+
disabled: false,
|
34
|
+
label: 'Text',
|
35
|
+
blank: {},
|
36
|
+
},
|
37
|
+
'should render checkbox item': {
|
38
|
+
name: 'Checkbox field',
|
39
|
+
item: checkboxItem,
|
40
|
+
fieldSelector,
|
41
|
+
buttonAttrs,
|
42
|
+
disabled: false,
|
43
|
+
label: 'Checkbox',
|
44
|
+
blank: {},
|
45
|
+
},
|
46
|
+
'should render select item with custom blank opt': {
|
47
|
+
name: 'select field',
|
48
|
+
item: selectItem,
|
49
|
+
fieldSelector,
|
50
|
+
buttonAttrs,
|
51
|
+
label: 'Select',
|
52
|
+
disabled: false,
|
53
|
+
blank,
|
54
|
+
},
|
55
|
+
'should render text field without field selector': {
|
56
|
+
name: 'no selector',
|
57
|
+
label: 'Text field',
|
58
|
+
buttonAttrs,
|
59
|
+
disabled: false,
|
60
|
+
blank: {},
|
61
|
+
},
|
62
|
+
};
|
63
|
+
|
64
|
+
describe('TextButtonField', () =>
|
65
|
+
testComponentSnapshotsWithFixtures(TextButtonField, fixtures));
|