✨ Implement duplication and deletion of timetables
This commit is contained in:
@ -1,14 +1,24 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
|
import { ref, watch } from "vue";
|
||||||
import {
|
import {
|
||||||
CircleIcon,
|
CircleIcon,
|
||||||
CheckCircleIcon,
|
CheckCircleIcon,
|
||||||
Edit2Icon,
|
Edit2Icon,
|
||||||
TrashIcon,
|
TrashIcon,
|
||||||
|
AlertCircleIcon,
|
||||||
CopyIcon,
|
CopyIcon,
|
||||||
} from "lucide-vue-next";
|
} from "lucide-vue-next";
|
||||||
|
|
||||||
defineProps(["timetable", "editable", "selected"]);
|
defineProps(["timetable", "editable", "selected"]);
|
||||||
defineEmits(["click", "edit", "delete", "copy"]);
|
defineEmits(["click", "edit", "delete", "copy"]);
|
||||||
|
|
||||||
|
const deleteConfirm = ref(false);
|
||||||
|
|
||||||
|
watch(deleteConfirm, (value) => {
|
||||||
|
if (value) {
|
||||||
|
setTimeout(() => (deleteConfirm.value = false), 2000);
|
||||||
|
}
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@ -27,8 +37,16 @@ defineEmits(["click", "edit", "delete", "copy"]);
|
|||||||
|
|
||||||
<div class="buttons">
|
<div class="buttons">
|
||||||
<Edit2Icon v-if="editable" @click="$emit('edit')" />
|
<Edit2Icon v-if="editable" @click="$emit('edit')" />
|
||||||
<TrashIcon v-if="editable" @click="$emit('delete')" />
|
<CopyIcon @click="$emit('copy')" />
|
||||||
<CopyIcon v-if="!editable" @click="$emit('copy')" />
|
<TrashIcon
|
||||||
|
v-if="editable && !deleteConfirm"
|
||||||
|
@click="deleteConfirm = true"
|
||||||
|
/>
|
||||||
|
<AlertCircleIcon
|
||||||
|
v-if="editable && deleteConfirm"
|
||||||
|
color="red"
|
||||||
|
@click="$emit('delete')"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -1,6 +1,14 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import TimetableCard from "@/components/settings/timetable-card.vue";
|
import TimetableCard from "@/components/settings/timetable-card.vue";
|
||||||
import { timetables, localTimetables, timetableId } from "@/store";
|
import { timetables, localTimetables, timetableId } from "@/store";
|
||||||
|
import { toRaw } from "vue";
|
||||||
|
|
||||||
|
function copyTimetable(timetable) {
|
||||||
|
const newTimetable = structuredClone(toRaw(timetable));
|
||||||
|
newTimetable.title = "Copy of " + timetable.title;
|
||||||
|
newTimetable.id = new Date().getTime();
|
||||||
|
localTimetables.value.push(newTimetable);
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@ -13,6 +21,13 @@ import { timetables, localTimetables, timetableId } from "@/store";
|
|||||||
:selected="timetableId == timetable.id"
|
:selected="timetableId == timetable.id"
|
||||||
:editable="true"
|
:editable="true"
|
||||||
@click="timetableId = timetable.id"
|
@click="timetableId = timetable.id"
|
||||||
|
@copy="copyTimetable(timetable)"
|
||||||
|
@delete="
|
||||||
|
localTimetables.splice(
|
||||||
|
localTimetables.findIndex((e) => e.id == timetable.id),
|
||||||
|
1
|
||||||
|
)
|
||||||
|
"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<h2>{{ $t("settings.heading.remoteTimetables") }}</h2>
|
<h2>{{ $t("settings.heading.remoteTimetables") }}</h2>
|
||||||
@ -24,6 +39,7 @@ import { timetables, localTimetables, timetableId } from "@/store";
|
|||||||
:selected="timetableId == timetable.id"
|
:selected="timetableId == timetable.id"
|
||||||
:editable="false"
|
:editable="false"
|
||||||
@click="timetableId = timetable.id"
|
@click="timetableId = timetable.id"
|
||||||
|
@copy="copyTimetable(timetable)"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
Reference in New Issue
Block a user