diff --git a/frontend/app/components/workspace/CrmWorkspaceApp.vue b/frontend/app/components/workspace/CrmWorkspaceApp.vue index 13b037b..2835334 100644 --- a/frontend/app/components/workspace/CrmWorkspaceApp.vue +++ b/frontend/app/components/workspace/CrmWorkspaceApp.vue @@ -259,6 +259,7 @@ const { // --------------------------------------------------------------------------- const { clientTimelineItems, + timelineLoading, timelineContactId, timelineLimit, loadClientTimeline, @@ -1624,6 +1625,12 @@ onBeforeUnmount(() => {
+ +
+ +
+ +
}) { ); const clientTimelineItems = ref([]); + const timelineLoading = ref(false); watch(() => timelineResult.value?.getClientTimeline, (v) => { - if (v) clientTimelineItems.value = v as ClientTimelineItem[]; + if (v) { + clientTimelineItems.value = v as ClientTimelineItem[]; + timelineLoading.value = false; + } }, { immediate: true }); async function loadClientTimeline(contactId: string, limit = 500) { @@ -40,18 +44,28 @@ export function useTimeline(opts: { apolloAuthReady: ComputedRef }) { if (!normalizedContactId) { clientTimelineItems.value = []; timelineContactId.value = ""; + timelineLoading.value = false; return; } + // Clear old data immediately and show loader + clientTimelineItems.value = []; + timelineLoading.value = true; + timelineContactId.value = normalizedContactId; timelineLimit.value = limit; - await refetchTimeline(); + try { + await refetchTimeline(); + } finally { + timelineLoading.value = false; + } } async function refreshSelectedClientTimeline(selectedCommThreadId: string) { const contactId = String(selectedCommThreadId ?? "").trim(); if (!contactId) { clientTimelineItems.value = []; + timelineLoading.value = false; return; } await loadClientTimeline(contactId); @@ -59,6 +73,7 @@ export function useTimeline(opts: { apolloAuthReady: ComputedRef }) { return { clientTimelineItems, + timelineLoading, timelineContactId, timelineLimit, loadClientTimeline,