diff --git a/src/components/OptionInputDialog.vue b/src/components/OptionInputDialog.vue
new file mode 100644
index 000000000..a87ce10b6
--- /dev/null
+++ b/src/components/OptionInputDialog.vue
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/Questions/QuestionDropdown.vue b/src/components/Questions/QuestionDropdown.vue
index 459d0ecf6..b6c8c4af6 100644
--- a/src/components/Questions/QuestionDropdown.vue
+++ b/src/components/Questions/QuestionDropdown.vue
@@ -34,6 +34,12 @@
@update:checked="onShuffleOptionsChange">
{{ t('forms', 'Shuffle options') }}
+
+
+
+
+ {{ t('forms', 'Add multiple options') }}
+
-
-
-
-
- -
-
-
-
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
@@ -87,9 +103,14 @@ import { emit } from '@nextcloud/event-bus'
import { generateOcsUrl } from '@nextcloud/router'
import axios from '@nextcloud/axios'
import NcActionCheckbox from '@nextcloud/vue/dist/Components/NcActionCheckbox.js'
+import NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton.js'
+import NcLoadingIcon from '@nextcloud/vue/dist/Components/NcLoadingIcon.js'
import NcSelect from '@nextcloud/vue/dist/Components/NcSelect.js'
+import IconContentPaste from 'vue-material-design-icons/ContentPaste.vue'
+
import AnswerInput from './AnswerInput.vue'
+import OptionInputDialog from '../OptionInputDialog.vue'
import QuestionMixin from '../../mixins/QuestionMixin.js'
import GenRandomId from '../../utils/GenRandomId.js'
import logger from '../../utils/Logger.js'
@@ -99,8 +120,12 @@ export default {
components: {
AnswerInput,
+ IconContentPaste,
+ NcActionButton,
NcActionCheckbox,
+ NcLoadingIcon,
NcSelect,
+ OptionInputDialog,
},
mixins: [QuestionMixin],
@@ -109,6 +134,8 @@ export default {
return {
selectedOption: null,
inputValue: '',
+ isOptionDialogShown: false,
+ isLoading: false,
}
},
diff --git a/src/components/Questions/QuestionMultiple.vue b/src/components/Questions/QuestionMultiple.vue
index 09c7f821a..9c21cb4a1 100644
--- a/src/components/Questions/QuestionMultiple.vue
+++ b/src/components/Questions/QuestionMultiple.vue
@@ -79,6 +79,12 @@
:value="extraSettings.optionsLimitMax"
@update:value="onLimitOptionsMax" />
+
+
+
+
+ {{ t('forms', 'Add multiple options') }}
+
-
+
+
+
+
+
+
+
+
+
+
+
@@ -173,18 +191,23 @@ import { emit } from '@nextcloud/event-bus'
import { translate as t, translatePlural as n } from '@nextcloud/l10n'
import { generateOcsUrl } from '@nextcloud/router'
import axios from '@nextcloud/axios'
+import NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton.js'
import NcActionCheckbox from '@nextcloud/vue/dist/Components/NcActionCheckbox.js'
import NcActionInput from '@nextcloud/vue/dist/Components/NcActionInput.js'
import NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'
import NcInputField from '@nextcloud/vue/dist/Components/NcInputField.js'
+import NcLoadingIcon from '@nextcloud/vue/dist/Components/NcLoadingIcon.js'
import NcNoteCard from '@nextcloud/vue/dist/Components/NcNoteCard.js'
+
import IconCheckboxBlankOutline from 'vue-material-design-icons/CheckboxBlankOutline.vue'
+import IconContentPaste from 'vue-material-design-icons/ContentPaste.vue'
import IconRadioboxBlank from 'vue-material-design-icons/RadioboxBlank.vue'
import AnswerInput from './AnswerInput.vue'
import QuestionMixin from '../../mixins/QuestionMixin.js'
import GenRandomId from '../../utils/GenRandomId.js'
import logger from '../../utils/Logger.js'
+import OptionInputDialog from '../OptionInputDialog.vue'
const QUESTION_EXTRASETTINGS_OTHER_PREFIX = 'system-other-answer:'
@@ -194,12 +217,16 @@ export default {
components: {
AnswerInput,
IconCheckboxBlankOutline,
+ IconContentPaste,
IconRadioboxBlank,
+ NcActionButton,
NcActionCheckbox,
NcActionInput,
NcCheckboxRadioSwitch,
NcInputField,
+ NcLoadingIcon,
NcNoteCard,
+ OptionInputDialog,
},
mixins: [QuestionMixin],
@@ -216,6 +243,9 @@ export default {
*/
cachedOtherAnswerText: '',
QUESTION_EXTRASETTINGS_OTHER_PREFIX,
+
+ isOptionDialogShown: false,
+ isLoading: false,
}
},
diff --git a/src/mixins/QuestionMixin.js b/src/mixins/QuestionMixin.js
index c75911fa8..d84f43b3d 100644
--- a/src/mixins/QuestionMixin.js
+++ b/src/mixins/QuestionMixin.js
@@ -26,6 +26,7 @@ import axios from '@nextcloud/axios'
import debounce from 'debounce'
import logger from '../utils/Logger.js'
+import OcsResponse2Data from '../utils/OcsResponse2Data.js'
import Question from '../components/Questions/Question.vue'
export default {
@@ -376,5 +377,37 @@ export default {
showError(t('forms', 'Error while saving question'))
}
},
+
+ /**
+ * Handles multiple options for a question.
+ *
+ * @param {Array} answers - The array of answers for the question.
+ */
+ async handleMultipleOptions(answers) {
+ const options = this.options.slice()
+ this.isLoading = true
+ for (let i = 0; i < answers.length; i++) {
+ const response = await axios.post(
+ generateOcsUrl('apps/forms/api/v2/option'),
+ {
+ questionId: this.id,
+ text: answers[i],
+ },
+ )
+ const newServerOption = OcsResponse2Data(response)
+ const option = {
+ id: newServerOption.id, // use the ID from the server
+ questionId: this.id,
+ text: answers[i],
+ local: false,
+ }
+ options.push(option)
+ }
+ this.updateOptions(options)
+ this.$nextTick(() => {
+ this.focusIndex(options.length - 1)
+ })
+ this.isLoading = false
+ },
},
}