diff --git a/app/src/interfaces/list/list.vue b/app/src/interfaces/list/list.vue index d436747d5e..709d3427d9 100644 --- a/app/src/interfaces/list/list.vue +++ b/app/src/interfaces/list/list.vue @@ -14,7 +14,7 @@ @update:model-value="$emit('input', $event)" > @@ -68,6 +81,7 @@ import { i18n } from '@/lang'; import { renderStringTemplate } from '@/utils/render-string-template'; import hideDragImage from '@/utils/hide-drag-image'; import formatTitle from '@directus/format-title'; +import { isEqual } from 'lodash'; export default defineComponent({ components: { Draggable }, @@ -123,7 +137,7 @@ export default defineComponent({ return false; }); - const activeItem = computed(() => (active.value !== null ? value.value[active.value] : null)); + const activeItem = computed(() => (active.value !== null ? edits.value : null)); const { displayValue } = renderStringTemplate(templateWithDefaults, activeItem); @@ -148,6 +162,10 @@ export default defineComponent({ }) ); + const isNewItem = ref(false); + const edits = ref({}); + const confirmDiscard = ref(false); + return { t, updateValues, @@ -164,8 +182,47 @@ export default defineComponent({ templateWithDefaults, defaults, fieldsWithNames, + isNewItem, + edits, + confirmDiscard, + openItem, + saveItem, + trackEdits, + checkDiscard, + discardAndLeave, }; + function openItem(index: number) { + isNewItem.value = false; + + edits.value = { ...props.value[index] }; + active.value = index; + } + + function saveItem(index: number) { + isNewItem.value = false; + + updateValues(index, edits.value); + closeDrawer(); + } + + function trackEdits(updatedValues: any) { + Object.assign(edits.value, updatedValues); + } + + function checkDiscard() { + if (active.value !== null && !isEqual(edits.value, props.value[active.value])) { + confirmDiscard.value = true; + } else { + closeDrawer(); + } + } + + function discardAndLeave() { + closeDrawer(); + confirmDiscard.value = false; + } + function updateValues(index: number, updatedValues: any) { emitValue( props.value.map((item: any, i: number) => { @@ -187,6 +244,8 @@ export default defineComponent({ } function addNew() { + isNewItem.value = true; + const newDefaults: any = {}; props.fields.forEach((field) => { @@ -200,6 +259,7 @@ export default defineComponent({ emitValue([newDefaults]); } + edits.value = { ...newDefaults }; active.value = (props.value || []).length; } @@ -220,6 +280,10 @@ export default defineComponent({ } function closeDrawer() { + if (isNewItem.value) { + emitValue(props.value.slice(0, -1)); + } + active.value = null; } },