diff --git a/awx/ui_next/src/screens/Template/Survey/SurveyQuestionAdd.jsx b/awx/ui_next/src/screens/Template/Survey/SurveyQuestionAdd.jsx
index 72ed7644e9..b4960edf37 100644
--- a/awx/ui_next/src/screens/Template/Survey/SurveyQuestionAdd.jsx
+++ b/awx/ui_next/src/screens/Template/Survey/SurveyQuestionAdd.jsx
@@ -18,6 +18,13 @@ export default function SurveyQuestionAdd({ survey, updateSurvey }) {
);
return;
}
+ if (question.type === 'multiselect') {
+ question.default = question.default
+ .split('\n')
+ .filter(v => v !== '' || '\n')
+ .map(v => v.trim())
+ .join('\n');
+ }
const newSpec = survey.spec ? survey.spec.concat(question) : [question];
await updateSurvey(newSpec);
history.push(match.url.replace('/add', ''));
diff --git a/awx/ui_next/src/screens/Template/Survey/SurveyQuestionEdit.jsx b/awx/ui_next/src/screens/Template/Survey/SurveyQuestionEdit.jsx
index 18006a9c5b..439f445572 100644
--- a/awx/ui_next/src/screens/Template/Survey/SurveyQuestionEdit.jsx
+++ b/awx/ui_next/src/screens/Template/Survey/SurveyQuestionEdit.jsx
@@ -39,6 +39,13 @@ export default function SurveyQuestionEdit({ survey, updateSurvey }) {
if (questionIndex === -1) {
throw new Error('Question not found in spec');
}
+ if (formData.type === 'multiselect') {
+ formData.default = formData.default
+ .split('\n')
+ .filter(v => v !== '' || '\n')
+ .map(v => v.trim())
+ .join('\n');
+ }
await updateSurvey([
...survey.spec.slice(0, questionIndex),
formData,
diff --git a/awx/ui_next/src/screens/Template/Survey/SurveyQuestionForm.jsx b/awx/ui_next/src/screens/Template/Survey/SurveyQuestionForm.jsx
index 8b682ee86f..a55e21a4f6 100644
--- a/awx/ui_next/src/screens/Template/Survey/SurveyQuestionForm.jsx
+++ b/awx/ui_next/src/screens/Template/Survey/SurveyQuestionForm.jsx
@@ -73,12 +73,15 @@ function SurveyQuestionForm({
}) {
const defaultIsNotAvailable = choices => {
return defaultValue => {
- if (!choices.includes(defaultValue)) {
- return i18n._(
+ let errorMessage;
+ const found = [...defaultValue].every(dA => choices.indexOf(dA) > -1);
+
+ if (!found) {
+ errorMessage = i18n._(
t`Default choice must be answered from the choices listed.`
);
}
- return undefined;
+ return errorMessage;
};
};
diff --git a/awx/ui_next/src/screens/Template/Survey/SurveyQuestionForm.test.jsx b/awx/ui_next/src/screens/Template/Survey/SurveyQuestionForm.test.jsx
index 5811135aeb..d514628b66 100644
--- a/awx/ui_next/src/screens/Template/Survey/SurveyQuestionForm.test.jsx
+++ b/awx/ui_next/src/screens/Template/Survey/SurveyQuestionForm.test.jsx
@@ -225,4 +225,67 @@ describe('', () => {
wrapper.find('FormField#question-default input').prop('type')
).toEqual('number');
});
+ test('should not throw validation error', async () => {
+ let wrapper;
+
+ act(() => {
+ wrapper = mountWithContexts(
+
+ );
+ });
+ await selectType(wrapper, 'multiselect');
+ await act(async () =>
+ wrapper.find('TextArea#question-options').prop('onChange')('a \n b', {
+ target: { value: 'a \n b', name: 'choices' },
+ })
+ );
+ await act(async () =>
+ wrapper.find('TextArea#question-default').prop('onChange')('b \n a', {
+ target: { value: 'b \n a', name: 'default' },
+ })
+ );
+ wrapper.find('FormField#question-default').prop('validate')('b \n a', {});
+ wrapper.update();
+ expect(
+ wrapper
+ .find('FormGroup[fieldId="question-default"]')
+ .prop('helperTextInvalid')
+ ).toBe(undefined);
+ });
+
+ test('should throw validation error', async () => {
+ let wrapper;
+
+ act(() => {
+ wrapper = mountWithContexts(
+
+ );
+ });
+ await selectType(wrapper, 'multiselect');
+ await act(async () =>
+ wrapper.find('TextArea#question-options').prop('onChange')('a \n b', {
+ target: { value: 'a \n b', name: 'choices' },
+ })
+ );
+ await act(async () =>
+ wrapper.find('TextArea#question-default').prop('onChange')('c', {
+ target: { value: 'c', name: 'default' },
+ })
+ );
+ wrapper.find('FormField#question-default').prop('validate')('c', {});
+ wrapper.update();
+ expect(
+ wrapper
+ .find('FormGroup[fieldId="question-default"]')
+ .prop('helperTextInvalid')
+ ).toBe('Default choice must be answered from the choices listed.');
+ });
});