diff --git a/src/pretix/static/pretixcontrol/js/ui/questionnaires/App.vue b/src/pretix/static/pretixcontrol/js/ui/questionnaires/App.vue index 23d86dc0ff..c6bbf67ebf 100644 --- a/src/pretix/static/pretixcontrol/js/ui/questionnaires/App.vue +++ b/src/pretix/static/pretixcontrol/js/ui/questionnaires/App.vue @@ -1,13 +1,41 @@ diff --git a/src/pretix/static/pretixcontrol/js/ui/questionnaires/QuestionnaireElement.vue b/src/pretix/static/pretixcontrol/js/ui/questionnaires/QuestionnaireElement.vue index 036180695e..06772319ad 100644 --- a/src/pretix/static/pretixcontrol/js/ui/questionnaires/QuestionnaireElement.vue +++ b/src/pretix/static/pretixcontrol/js/ui/questionnaires/QuestionnaireElement.vue @@ -6,7 +6,7 @@ import { QUESTION_TYPE, QUESTION_TYPE_LABEL, QUESTIONNAIRE_TYPE, - QUESTIONNAIRE_TYPE_LABEL, + QUESTIONNAIRE_TYPE_LABEL, setListState, SYSTEM_DATAFIELDS } from "./helper"; import { gettext } from './gettextstub'; @@ -15,6 +15,8 @@ import NativeDialog from "./NativeDialog.vue"; import { SlickList, SlickItem, DragHandle } from 'vue-slicksort'; import {getDatafieldCreateUrl} from "./api"; import DjangoDialog from "./DjangoDialog.vue"; +import * as api from './api'; +import QuestionnaireDetailForm from "./QuestionnaireDetailForm.vue"; const dlgEditor = ref() const dlgAddExisting = ref() @@ -25,8 +27,8 @@ const newTextblockTitle = ref() const newTextblockText = ref() const id = useId(); -const props = defineProps(['questionnaire', 'datafields', 'sales_channels', 'selected_product', 'grouped_items', 'preview_mode', 'err_mes']) -const emit = defineEmits(['update', 'invalidate:datafields']) +const props = defineProps(['questionnaire', 'datafields', 'selected_product', 'grouped_items', 'preview_mode', 'err_mes']) +const emit = defineEmits(['update', 'invalidate:datafields', 'invalidate:questionnaires']) let nextId = 1; watch(() => props.questionnaire.children, () => { @@ -35,15 +37,6 @@ watch(() => props.questionnaire.children, () => { } }) -function setVisibleOnItem (checked, itemId) { - const i = props.questionnaire.items.indexOf(itemId) - if (i === -1) { - props.questionnaire.items.push(itemId) - } else { - props.questionnaire.items.splice(i, 1) - } -} - function addExistingDatafield (field) { props.questionnaire.children.push({ _cid: useId(), @@ -94,6 +87,18 @@ async function onNewDatafieldCreated (data) { emit('invalidate:datafields') } +async function deleteQuestionnaire () { + if (confirm("Are you sure?")) { + try { + await api.deleteQuestionnaire(props.questionnaire.id) + } catch (e) { + console.error('Failed to delete questionnaire', e) + alert('Error while deleting questionnaire') + } + emit('invalidate:questionnaires') + } +} + const isHidden = computed(() => props.selected_product && props.questionnaire.items.indexOf(props.selected_product) === -1) const isEditable = computed(() => props.selected_product && props.questionnaire.items.indexOf(props.selected_product) !== -1) @@ -107,7 +112,7 @@ const isEditable = computed(() => props.selected_product && props.questionnaire.
- + {{ props.questionnaire.internal_name }} @@ -152,61 +157,10 @@ const isEditable = computed(() => props.selected_product && props.questionnaire. -
- -
- -
-
-
- -
- -
-
-
- -
-
- -
-
- -
-
-
-
- -
-
-
{{ category.internal_name || i18n_any(category.name) }}
-
- -
-
-
-
- - + + + +
= 400) + if (response.status === 204) + return {} + else if (response.status >= 400) throw new APIError(await response.json()); else return await response.json() @@ -61,6 +63,10 @@ export async function createQuestionnaire(data) { return await api_json_request(`organizers/${organizer_slug}/events/${event_slug}/questionnaires/`, 'POST', data); } +export async function deleteQuestionnaire(id) { + return await api_json_request(`organizers/${organizer_slug}/events/${event_slug}/questionnaires/${id}/`, 'DELETE', {}); +} + export async function getItems() { using pb = ProgressBar.show('loading product list') return await api_get_all(`organizers/${organizer_slug}/events/${event_slug}/items/`); @@ -72,7 +78,7 @@ export async function getCategories() { } export async function getSalesChannels() { - return await api_get_all(`organizers/${organizer_slug}/saleschannels/`); + return await api_get_all(`organizers/${organizer_slug}/saleschannels/`); } export function getEventLocales() { diff --git a/src/pretix/static/pretixcontrol/js/ui/questionnaires/helper.js b/src/pretix/static/pretixcontrol/js/ui/questionnaires/helper.ts similarity index 88% rename from src/pretix/static/pretixcontrol/js/ui/questionnaires/helper.js rename to src/pretix/static/pretixcontrol/js/ui/questionnaires/helper.ts index 2ff48460e7..c94babdaa7 100644 --- a/src/pretix/static/pretixcontrol/js/ui/questionnaires/helper.js +++ b/src/pretix/static/pretixcontrol/js/ui/questionnaires/helper.ts @@ -37,7 +37,7 @@ export function sort (array, ...orderBy) { return 0 }) } -export function *groupBy (array, key) { +export function *groupBy (array: V[], key: (v: V) => K): Generator<[K, V[]]> { let lastKey, lastArray for (const x of array) { const k = key(x) @@ -55,6 +55,15 @@ export function *groupBy (array, key) { } } +export function setListState(list, state, identifier) { + const i = list.indexOf(identifier) + if (i === -1) { + if (state) list.push(identifier) + } else { + if (!state) list.splice(i, 1) + } +} + export function fromJsonScript (id) { return JSON.parse(document.getElementById(id).textContent) } diff --git a/src/pretix/static/pretixcontrol/js/ui/questionnaires/model.ts b/src/pretix/static/pretixcontrol/js/ui/questionnaires/model.ts index fbbf9cb7cd..2a55be2f58 100644 --- a/src/pretix/static/pretixcontrol/js/ui/questionnaires/model.ts +++ b/src/pretix/static/pretixcontrol/js/ui/questionnaires/model.ts @@ -70,3 +70,12 @@ export type Category = { name: I18nString, internal_name: string | null, } + +export type SalesChannel = { + identifier: string, + type: string, + label: I18nString, + position: number, +} + +export type GroupedItems = [Category, Item[]][];