Add real workspace channels
This commit is contained in:
@@ -1,17 +1,20 @@
|
||||
<script setup>
|
||||
import { computed, ref } from 'vue';
|
||||
import { computed, ref, watch } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { useRoute, useRouter } from 'vue-router';
|
||||
import { mdiChevronLeft, mdiChevronRight } from '@mdi/js';
|
||||
import { useCampaignsStore } from '@/features/campaigns/stores/campaignsStore.js';
|
||||
import { useContentItemsStore } from '@/features/content/stores/contentItemsStore.js';
|
||||
|
||||
const { t, locale } = useI18n();
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
const campaignsStore = useCampaignsStore();
|
||||
const contentItemsStore = useContentItemsStore();
|
||||
|
||||
const today = startOfDay(new Date());
|
||||
const viewMode = ref('month');
|
||||
const cursorDate = ref(today);
|
||||
const viewMode = ref(parseViewMode(route.query.view));
|
||||
const cursorDate = ref(parseCursorDate(route.query.date, today));
|
||||
|
||||
const contentStatusMeta = {
|
||||
Draft: { tone: 'production' },
|
||||
@@ -165,7 +168,7 @@
|
||||
dayKey: dateKey(item.dueDate),
|
||||
timeLabel: formatHour(item.dueDate),
|
||||
tone: statusMeta.tone,
|
||||
route: { name: 'content-item-detail', params: { id: item.id } },
|
||||
route: { name: 'content-item-detail', params: { id: item.id }, query: { returnTo: route.fullPath } },
|
||||
};
|
||||
}
|
||||
|
||||
@@ -275,6 +278,45 @@
|
||||
function sortByDate(left, right) {
|
||||
return left.scheduledAt.getTime() - right.scheduledAt.getTime();
|
||||
}
|
||||
|
||||
function parseViewMode(value) {
|
||||
return ['month', 'week', 'upcoming'].includes(value) ? value : 'month';
|
||||
}
|
||||
|
||||
function parseCursorDate(value, fallback) {
|
||||
if (typeof value !== 'string') {
|
||||
return fallback;
|
||||
}
|
||||
|
||||
const parsed = new Date(`${value}T00:00:00`);
|
||||
return Number.isNaN(parsed.getTime()) ? fallback : startOfDay(parsed);
|
||||
}
|
||||
|
||||
watch(
|
||||
() => route.query,
|
||||
query => {
|
||||
viewMode.value = parseViewMode(query.view);
|
||||
cursorDate.value = parseCursorDate(query.date, today);
|
||||
}
|
||||
);
|
||||
|
||||
watch(
|
||||
() => [viewMode.value, dateKey(cursorDate.value)],
|
||||
([view, date]) => {
|
||||
if (route.query.view === view && route.query.date === date) {
|
||||
return;
|
||||
}
|
||||
|
||||
router.replace({
|
||||
name: 'content-items',
|
||||
query: {
|
||||
...route.query,
|
||||
view,
|
||||
date,
|
||||
},
|
||||
});
|
||||
}
|
||||
);
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@@ -429,7 +471,7 @@
|
||||
<router-link
|
||||
v-for="item in upcomingItems"
|
||||
:key="item.id"
|
||||
:to="{ name: 'content-item-detail', params: { id: item.id } }"
|
||||
:to="{ name: 'content-item-detail', params: { id: item.id }, query: { returnTo: route.fullPath } }"
|
||||
class="item-card"
|
||||
>
|
||||
<div class="version-chip">{{ item.currentRevisionLabel }}</div>
|
||||
|
||||
Reference in New Issue
Block a user