Add draggable for fields
This commit is contained in:
parent
df4f911d8e
commit
f70c0db783
|
@ -26,6 +26,7 @@
|
||||||
"vite": "^4.5.2",
|
"vite": "^4.5.2",
|
||||||
"vue": "^3.3.4",
|
"vue": "^3.3.4",
|
||||||
"vue-toastification": "^2.0.0-rc.5",
|
"vue-toastification": "^2.0.0-rc.5",
|
||||||
|
"vuedraggable": "^4.1.0",
|
||||||
"wnumb": "^1.2.0"
|
"wnumb": "^1.2.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
@ -3799,6 +3800,11 @@
|
||||||
"tslib": "^2.0.3"
|
"tslib": "^2.0.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/sortablejs": {
|
||||||
|
"version": "1.14.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.14.0.tgz",
|
||||||
|
"integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w=="
|
||||||
|
},
|
||||||
"node_modules/source-map": {
|
"node_modules/source-map": {
|
||||||
"version": "0.6.1",
|
"version": "0.6.1",
|
||||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
|
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
|
||||||
|
@ -4407,6 +4413,17 @@
|
||||||
"vue": "^3.0.2"
|
"vue": "^3.0.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/vuedraggable": {
|
||||||
|
"version": "4.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-4.1.0.tgz",
|
||||||
|
"integrity": "sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==",
|
||||||
|
"dependencies": {
|
||||||
|
"sortablejs": "1.14.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"vue": "^3.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/which": {
|
"node_modules/which": {
|
||||||
"version": "2.0.2",
|
"version": "2.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
|
||||||
|
|
|
@ -45,6 +45,7 @@
|
||||||
"vite": "^4.5.2",
|
"vite": "^4.5.2",
|
||||||
"vue": "^3.3.4",
|
"vue": "^3.3.4",
|
||||||
"vue-toastification": "^2.0.0-rc.5",
|
"vue-toastification": "^2.0.0-rc.5",
|
||||||
|
"vuedraggable": "^4.1.0",
|
||||||
"wnumb": "^1.2.0"
|
"wnumb": "^1.2.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 846f2697d3a91d47232240b9dc95ed74f5420506
|
Subproject commit 31b03b69ed3d57888cd82d1bfedcd0cb2b9cdc3c
|
|
@ -2,7 +2,7 @@
|
||||||
<form class="grid gap-3 mt-4 grid-cols-[1fr_max-content] items-start" @submit.prevent="submit">
|
<form class="grid gap-3 mt-4 grid-cols-[1fr_max-content] items-start" @submit.prevent="submit">
|
||||||
<div class="grid gap-3">
|
<div class="grid gap-3">
|
||||||
<slot name="meta"></slot>
|
<slot name="meta"></slot>
|
||||||
<asideform v-if="singleSection !== null"
|
<asideform v-if="singleSection !== null && singleSection.mode === 'edit'"
|
||||||
:heading="`Sektion ${singleSection.index !== null ? 'bearbeiten' : 'erstellen'}`"
|
:heading="`Sektion ${singleSection.index !== null ? 'bearbeiten' : 'erstellen'}`"
|
||||||
@close="singleSection = null" @submit="storeSection">
|
@close="singleSection = null" @submit="storeSection">
|
||||||
<f-text :id="`sectionform-name`" v-model="singleSection.model.name" label="Name"
|
<f-text :id="`sectionform-name`" v-model="singleSection.model.name" label="Name"
|
||||||
|
@ -10,6 +10,20 @@
|
||||||
<f-textarea :id="`sectionform-intro`" v-model="singleSection.model.intro" label="Einleitung"
|
<f-textarea :id="`sectionform-intro`" v-model="singleSection.model.intro" label="Einleitung"
|
||||||
:name="`sectionform-intro`"></f-textarea>
|
:name="`sectionform-intro`"></f-textarea>
|
||||||
</asideform>
|
</asideform>
|
||||||
|
<asideform v-if="singleSection !== null && singleSection.mode === 'reorder'" heading="Felder ordnen"
|
||||||
|
@close="singleSection = null" @submit="storeSection">
|
||||||
|
<draggable item-key="key" :component-data="{ class: 'mt-3 grid gap-3' }" v-model="singleSection.model.fields">
|
||||||
|
<template #item="{ element }">
|
||||||
|
<div
|
||||||
|
class="py-2 px-3 border rounded bg-zinc-800 hover:bg-zinc-700 transition justify-between flex items-center">
|
||||||
|
<span v-text="element.name"></span>
|
||||||
|
<a href="#">
|
||||||
|
<ui-sprite class="w-5 h-5" v-tooltip="`Umordnen`" src="menu"></ui-sprite>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</draggable>
|
||||||
|
</asideform>
|
||||||
<asideform v-if="singleSection === null && singleField === null" heading="Feld erstellen" :closeable="false"
|
<asideform v-if="singleSection === null && singleField === null" heading="Feld erstellen" :closeable="false"
|
||||||
:storeable="false" @submit="storeField">
|
:storeable="false" @submit="storeField">
|
||||||
<div class="mt-3 grid gap-3">
|
<div class="mt-3 grid gap-3">
|
||||||
|
@ -43,7 +57,8 @@
|
||||||
:base-url="meta.base_url" :value="previewString" @editSection="editSection($event.detail[0])"
|
:base-url="meta.base_url" :value="previewString" @editSection="editSection($event.detail[0])"
|
||||||
@addSection="addSection" @editField="editField($event.detail[0], $event.detail[1])"
|
@addSection="addSection" @editField="editField($event.detail[0], $event.detail[1])"
|
||||||
@deleteField="deleteField($event.detail[0], $event.detail[1])"
|
@deleteField="deleteField($event.detail[0], $event.detail[1])"
|
||||||
@deleteSection="deleteSection($event.detail[0])" @active="updateActive($event.detail[0])"></event-form>
|
@editFields="startReordering($event.detail[0])" @deleteSection="deleteSection($event.detail[0])"
|
||||||
|
@active="updateActive($event.detail[0])"></event-form>
|
||||||
</ui-box>
|
</ui-box>
|
||||||
</form>
|
</form>
|
||||||
</template>
|
</template>
|
||||||
|
@ -63,11 +78,19 @@ import NumberField from './NumberField.vue';
|
||||||
import CheckboxField from './CheckboxField.vue';
|
import CheckboxField from './CheckboxField.vue';
|
||||||
import CheckboxesField from './CheckboxesField.vue';
|
import CheckboxesField from './CheckboxesField.vue';
|
||||||
import ColumnSelector from './ColumnSelector.vue';
|
import ColumnSelector from './ColumnSelector.vue';
|
||||||
|
import Draggable from 'vuedraggable';
|
||||||
|
|
||||||
const singleSection = ref(null);
|
const singleSection = ref(null);
|
||||||
const singleField = ref(null);
|
const singleField = ref(null);
|
||||||
const active = ref(null);
|
const active = ref(null);
|
||||||
|
|
||||||
|
async function onReorder() {
|
||||||
|
var order = this.inner.map((f) => f.id);
|
||||||
|
this.loading = true;
|
||||||
|
this.inner = (await this.axios.patch(`/mediaupload/${this.parentName}/${this.parentId}/${this.collection}`, { order })).data;
|
||||||
|
this.loading = false;
|
||||||
|
}
|
||||||
|
|
||||||
function updateActive(a) {
|
function updateActive(a) {
|
||||||
active.value = a;
|
active.value = a;
|
||||||
if (a === null) {
|
if (a === null) {
|
||||||
|
@ -97,6 +120,15 @@ function editSection(sectionIndex) {
|
||||||
singleSection.value = {
|
singleSection.value = {
|
||||||
model: { ...inner.value.sections[sectionIndex] },
|
model: { ...inner.value.sections[sectionIndex] },
|
||||||
index: sectionIndex,
|
index: sectionIndex,
|
||||||
|
mode: 'edit',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function startReordering(index) {
|
||||||
|
singleSection.value = {
|
||||||
|
model: { ...inner.value.sections[index] },
|
||||||
|
index: index,
|
||||||
|
mode: 'reorder',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,6 +143,7 @@ function addSection() {
|
||||||
singleSection.value = {
|
singleSection.value = {
|
||||||
model: JSON.parse(JSON.stringify(innerMeta.value.section_default)),
|
model: JSON.parse(JSON.stringify(innerMeta.value.section_default)),
|
||||||
index: null,
|
index: null,
|
||||||
|
mode: 'edit',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue