From 6d0007619212d67c61de73ef73097a059f080595 Mon Sep 17 00:00:00 2001 From: hamza221 Date: Sat, 19 Nov 2022 19:36:09 +0100 Subject: [PATCH] Add multiple options with one paste #337 Signed-off-by: hamza221 Signed-off-by: Christian Hartmann --- src/components/OptionInputDialog.vue | 138 ++++++++++++++++++ src/components/Questions/QuestionDropdown.vue | 89 +++++++---- src/components/Questions/QuestionMultiple.vue | 110 +++++++++----- src/mixins/QuestionMixin.js | 33 +++++ 4 files changed, 299 insertions(+), 71 deletions(-) create mode 100644 src/components/OptionInputDialog.vue 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') }} + -
    - - - -
  1. - -
  2. -
+ + + + @@ -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 + }, }, }