added event duplication
This commit is contained in:
@@ -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?",
|
||||||
|
|||||||
Reference in New Issue
Block a user