feat(events): add tag selector to admin event form
This commit is contained in:
parent
3797ff7925
commit
337664790f
2 changed files with 37 additions and 6 deletions
|
|
@ -232,6 +232,26 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Tags -->
|
||||||
|
<div class="form-section">
|
||||||
|
<h2 class="section-heading">Tags</h2>
|
||||||
|
|
||||||
|
<div class="field">
|
||||||
|
<label>Event Tags</label>
|
||||||
|
<USelectMenu
|
||||||
|
v-model="eventForm.tags"
|
||||||
|
:items="tagOptions"
|
||||||
|
value-key="value"
|
||||||
|
multiple
|
||||||
|
placeholder="Select tags..."
|
||||||
|
class="w-full"
|
||||||
|
/>
|
||||||
|
<p class="help-text">
|
||||||
|
Tag this event to help with discovery and recommendations
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- Ticketing -->
|
<!-- Ticketing -->
|
||||||
<div class="form-section">
|
<div class="form-section">
|
||||||
<h2 class="section-heading">Ticketing</h2>
|
<h2 class="section-heading">Ticketing</h2>
|
||||||
|
|
@ -584,6 +604,11 @@ const formErrors = ref([]);
|
||||||
const fieldErrors = ref({});
|
const fieldErrors = ref({});
|
||||||
const selectedSeriesId = ref(null);
|
const selectedSeriesId = ref(null);
|
||||||
const availableSeries = ref([]);
|
const availableSeries = ref([]);
|
||||||
|
const availableTags = ref([]);
|
||||||
|
|
||||||
|
const tagOptions = computed(() =>
|
||||||
|
availableTags.value.map((t) => ({ label: t.label, value: t.slug }))
|
||||||
|
);
|
||||||
|
|
||||||
const eventForm = reactive({
|
const eventForm = reactive({
|
||||||
title: "",
|
title: "",
|
||||||
|
|
@ -599,6 +624,7 @@ const eventForm = reactive({
|
||||||
isCancelled: false,
|
isCancelled: false,
|
||||||
cancellationMessage: "",
|
cancellationMessage: "",
|
||||||
targetCircles: [],
|
targetCircles: [],
|
||||||
|
tags: [],
|
||||||
maxAttendees: "",
|
maxAttendees: "",
|
||||||
registrationRequired: false,
|
registrationRequired: false,
|
||||||
registrationDeadline: "",
|
registrationDeadline: "",
|
||||||
|
|
@ -632,15 +658,17 @@ const removeAgendaItem = (index) => {
|
||||||
eventForm.agenda.splice(index, 1);
|
eventForm.agenda.splice(index, 1);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Load available series
|
// Load available series and tags
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
try {
|
try {
|
||||||
const response = await $fetch("/api/admin/series");
|
const [seriesResponse, tagsResponse] = await Promise.all([
|
||||||
console.log("Loaded series:", response);
|
$fetch("/api/admin/series"),
|
||||||
availableSeries.value = response;
|
$fetch("/api/tags"),
|
||||||
console.log("availableSeries.value:", availableSeries.value);
|
]);
|
||||||
|
availableSeries.value = seriesResponse;
|
||||||
|
availableTags.value = tagsResponse.tags || [];
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Failed to load series:", error);
|
console.error("Failed to load form data:", error);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -692,6 +720,7 @@ if (route.query.edit) {
|
||||||
isCancelled: event.isCancelled || false,
|
isCancelled: event.isCancelled || false,
|
||||||
cancellationMessage: event.cancellationMessage || "",
|
cancellationMessage: event.cancellationMessage || "",
|
||||||
targetCircles: event.targetCircles || [],
|
targetCircles: event.targetCircles || [],
|
||||||
|
tags: event.tags || [],
|
||||||
maxAttendees: event.maxAttendees || "",
|
maxAttendees: event.maxAttendees || "",
|
||||||
registrationRequired: event.registrationRequired,
|
registrationRequired: event.registrationRequired,
|
||||||
registrationDeadline: event.registrationDeadline
|
registrationDeadline: event.registrationDeadline
|
||||||
|
|
@ -912,6 +941,7 @@ const saveAndCreateAnother = async () => {
|
||||||
isCancelled: false,
|
isCancelled: false,
|
||||||
cancellationMessage: "",
|
cancellationMessage: "",
|
||||||
targetCircles: [],
|
targetCircles: [],
|
||||||
|
tags: [],
|
||||||
maxAttendees: "",
|
maxAttendees: "",
|
||||||
registrationRequired: false,
|
registrationRequired: false,
|
||||||
registrationDeadline: "",
|
registrationDeadline: "",
|
||||||
|
|
|
||||||
|
|
@ -142,6 +142,7 @@ const eventSchema = new mongoose.Schema({
|
||||||
maxAttendees: Number,
|
maxAttendees: Number,
|
||||||
registrationRequired: { type: Boolean, default: false },
|
registrationRequired: { type: Boolean, default: false },
|
||||||
registrationDeadline: Date,
|
registrationDeadline: Date,
|
||||||
|
tags: [String], // Tag slugs from Tag collection
|
||||||
agenda: [String],
|
agenda: [String],
|
||||||
speakers: [
|
speakers: [
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue