From 8c7a79b80eca72809b4d66cb50b39b2574978a7d Mon Sep 17 00:00:00 2001 From: Mira Weller Date: Thu, 17 Sep 2026 16:11:03 +0200 Subject: [PATCH] Editor UX rework --- .../js/ui/questionnaires/Editor.vue | 144 +++++++++++++----- .../js/ui/questionnaires/I18nTextArea.vue | 13 ++ .../js/ui/questionnaires/I18nTextField.vue | 9 +- .../js/ui/questionnaires/QuestionElement.vue | 97 ++++++------ .../QuestionnaireChildListElement.vue | 0 .../questionnaires/QuestionnaireElement.vue | 117 +++++++++----- .../pretixcontrol/js/ui/questionnaires/api.ts | 28 +++- .../js/ui/questionnaires/gettextstub.js | 29 ++++ .../js/ui/questionnaires/helper.js | 3 +- .../js/ui/questionnaires/model.ts | 17 ++- 10 files changed, 318 insertions(+), 139 deletions(-) create mode 100644 src/pretix/static/pretixcontrol/js/ui/questionnaires/I18nTextArea.vue create mode 100644 src/pretix/static/pretixcontrol/js/ui/questionnaires/QuestionnaireChildListElement.vue create mode 100644 src/pretix/static/pretixcontrol/js/ui/questionnaires/gettextstub.js diff --git a/src/pretix/static/pretixcontrol/js/ui/questionnaires/Editor.vue b/src/pretix/static/pretixcontrol/js/ui/questionnaires/Editor.vue index 863f897288..e2a05b0bdd 100644 --- a/src/pretix/static/pretixcontrol/js/ui/questionnaires/Editor.vue +++ b/src/pretix/static/pretixcontrol/js/ui/questionnaires/Editor.vue @@ -2,7 +2,7 @@ import QuestionnaireElement from './QuestionnaireElement.vue'; import * as api from './api'; import { Questionnaire } from './model'; -import { i18n_any, sort, numericComp, groupBy } from './helper'; +import {i18n_any, sort, numericComp, groupBy, SYSTEM_DATAFIELDS} from './helper'; import { gettext } from './gettextstub'; import { ref } from 'vue'; import { SlickList, SlickItem } from 'vue-slicksort'; @@ -21,17 +21,31 @@ const all_questionnaires: (Omit & { _new_id?: number, id?: const order_questionnaires = ref(all_questionnaires.filter(q => q.type.startsWith('O'))); const position_questionnaires = ref(all_questionnaires.filter(q => q.type.startsWith('P'))); const order_datafields = ref(await api.getDatafields('O')); -const position_datafields = ref(await api.getDatafields('P')); +const position_datafields = ref((await api.getDatafields('P')).concat(Object.values(SYSTEM_DATAFIELDS))); function saveQuestionnaire(questionnaire) { + let result; + questionnaire._loading = true if (questionnaire.id) { - return api.updateQuestionnaire(questionnaire.id, questionnaire); + result = api.updateQuestionnaire(questionnaire.id, questionnaire); } else { - return api.createQuestionnaire(questionnaire).then(d => { + result = api.createQuestionnaire(questionnaire).then(d => { questionnaire.id = d.id; return d; }); } + result = result.then(d => { + console.log(questionnaire, 'ok') + questionnaire._err_mes = null + questionnaire._loading = false + return d; + }, err => { + console.log(questionnaire, 'err:', err) + questionnaire._err_mes = err + questionnaire._loading = false + return err; + }) + return result; } function addPositionQuestionnaire () { position_questionnaires.value.push({ @@ -90,16 +104,24 @@ const preview_mode = ref(false) diff --git a/src/pretix/static/pretixcontrol/js/ui/questionnaires/I18nTextArea.vue b/src/pretix/static/pretixcontrol/js/ui/questionnaires/I18nTextArea.vue new file mode 100644 index 0000000000..505795d48a --- /dev/null +++ b/src/pretix/static/pretixcontrol/js/ui/questionnaires/I18nTextArea.vue @@ -0,0 +1,13 @@ + + + diff --git a/src/pretix/static/pretixcontrol/js/ui/questionnaires/I18nTextField.vue b/src/pretix/static/pretixcontrol/js/ui/questionnaires/I18nTextField.vue index 690f8d09a8..9397125506 100644 --- a/src/pretix/static/pretixcontrol/js/ui/questionnaires/I18nTextField.vue +++ b/src/pretix/static/pretixcontrol/js/ui/questionnaires/I18nTextField.vue @@ -1,16 +1,13 @@ diff --git a/src/pretix/static/pretixcontrol/js/ui/questionnaires/QuestionElement.vue b/src/pretix/static/pretixcontrol/js/ui/questionnaires/QuestionElement.vue index 32b40d7a67..72e5862e6f 100644 --- a/src/pretix/static/pretixcontrol/js/ui/questionnaires/QuestionElement.vue +++ b/src/pretix/static/pretixcontrol/js/ui/questionnaires/QuestionElement.vue @@ -5,10 +5,11 @@ import I18nTextField from './I18nTextField.vue'; import {useId, ref, computed} from 'vue' import { DragHandle } from 'vue-slicksort'; import {getDatafieldEditUrl} from "./api"; +import I18nTextArea from "./I18nTextArea.vue"; const id = useId(); const props = defineProps(['question', 'datafields', 'editable', 'possible_dependencies']) -const emit = defineEmits(['removeSelf']); +const emit = defineEmits(['removeSelf', 'update']); const gettext = (window as any).gettext; const question = ref(props.question); @@ -28,55 +29,61 @@ const editor = ref();