added event duplication

This commit is contained in:
2023-03-14 07:57:30 +10:00
parent 19c5bd5c25
commit b21468f265

View File

@@ -48,6 +48,7 @@
<SMButton <SMButton
label="Edit" label="Edit"
:dropdown="{ :dropdown="{
duplicate: 'Duplicate',
delete: 'Delete', delete: 'Delete',
}" }"
@click="handleClick(item, $event)"></SMButton> @click="handleClick(item, $event)"></SMButton>
@@ -73,6 +74,7 @@ import SMInput from "../../components/SMInput.vue";
import { api } from "../../helpers/api"; import { api } from "../../helpers/api";
import { SMDate } from "../../helpers/datetime"; import { SMDate } from "../../helpers/datetime";
import { debounce } from "../../helpers/debounce"; import { debounce } from "../../helpers/debounce";
import { Event, EventCollection, EventResponse } from "../../helpers/api.types";
const router = useRouter(); const router = useRouter();
const search = ref(""); const search = ref("");
@@ -104,6 +106,8 @@ const serverOptions = ref({
const handleClick = (item, extra: string): void => { const handleClick = (item, extra: string): void => {
if (extra.length == 0) { if (extra.length == 0) {
handleEdit(item); handleEdit(item);
} else if (extra.toLowerCase() == "duplicate") {
handleDuplicate(item);
} else if (extra.toLowerCase() == "delete") { } else if (extra.toLowerCase() == "delete") {
handleDelete(item); handleDelete(item);
} }
@@ -134,16 +138,18 @@ const loadFromServer = async () => {
params["title"] = search.value; params["title"] = search.value;
} }
let res = await api.get({ let result = await api.get({
url: "/events", url: "/events",
params: params, params: params,
}); });
if (!res.data.events) { const data = result.data as EventCollection;
if (!data.events) {
throw new Error("The server is currently not available"); throw new Error("The server is currently not available");
} }
items.value = res.data.events; items.value = data.events;
items.value.forEach((row) => { items.value.forEach((row) => {
if (row.start_at !== "undefined") { if (row.start_at !== "undefined") {
@@ -166,7 +172,7 @@ const loadFromServer = async () => {
} }
}); });
serverItemsLength.value = res.data.total; serverItemsLength.value = data.total;
} catch (err) { } catch (err) {
// restParseErrors(formData, [formMessage, "message"], err); // restParseErrors(formData, [formMessage, "message"], err);
} }
@@ -201,6 +207,69 @@ const handleEdit = (item) => {
router.push({ name: "dashboard-event-edit", params: { id: item.id } }); router.push({ name: "dashboard-event-edit", params: { id: item.id } });
}; };
const handleDuplicate = async (item) => {
try {
let tries = 1;
let number = 2;
let originalSlug = item.slug;
let originalTitle = item.title;
const slugMatch = originalSlug.match(/-(\d+)$/);
if (slugMatch == true) {
number = parseInt(slugMatch[1], 10);
originalSlug = originalSlug.replace(new RegExp(`-${number}$`), "");
originalTitle = originalTitle.replace(
new RegExp(`[- ]${number}$`),
""
);
}
delete item.id;
delete item.created_at;
delete item.updated_at;
while (tries < 25) {
const slug = `${originalSlug}-${number}`;
try {
await api.get({
url: `/events/?slug=${slug}`,
});
} catch (err) {
if (err.status === 404) {
item.slug = slug;
item.title = `${originalTitle} ${number}`;
break;
} else {
formMessage.message = "The post could not be duplicated.";
formMessage.type = "error";
return;
}
}
}
const result = await api.post({
url: "/events",
body: item,
});
const data = result.data as EventResponse;
loadFromServer();
formMessage.message = "Post duplicated successfully";
formMessage.type = "success";
router.push({
name: "dashboard-event-edit",
params: { id: data.event.id },
});
} catch (err) {
formMessage.message = err.response?.data?.message;
}
};
const handleDelete = async (item) => { const handleDelete = async (item) => {
let result = await openDialog(SMDialogConfirm, { let result = await openDialog(SMDialogConfirm, {
title: "Delete User?", title: "Delete User?",