new keywirds and ideas export fix

This commit is contained in:
IGNY8 VPS (Salman)
2026-02-19 07:38:56 +00:00
parent 2996c86893
commit 0ca8e8c0e3
20 changed files with 452 additions and 4 deletions

View File

@@ -21,6 +21,7 @@ import {
Cluster,
fetchPlannerIdeasFilterOptions,
FilterOption,
API_BASE_URL,
} from '../../services/api';
import FormModal from '../../components/common/FormModal';
import ProgressModal from '../../components/common/ProgressModal';
@@ -32,6 +33,7 @@ import { createIdeasPageConfig } from '../../config/pages/ideas.config';
import { useSectorStore } from '../../store/sectorStore';
import { useSiteStore } from '../../store/siteStore';
import { usePageSizeStore } from '../../store/pageSizeStore';
import { useAuthStore } from '../../store/authStore';
import PageHeader from '../../components/common/PageHeader';
import StandardThreeWidgetFooter from '../../components/dashboard/StandardThreeWidgetFooter';
@@ -296,9 +298,39 @@ export default function Ideas() {
if (!ids || ids.length === 0) {
throw new Error('No records selected for export');
}
toast.info('Export functionality coming soon');
// Build URL with only IDs parameter for bulk export
const idsParam = ids.join(',');
const exportUrl = `${API_BASE_URL}/v1/planner/ideas/export/?ids=${encodeURIComponent(idsParam)}`;
const token = useAuthStore.getState().token;
const headers: HeadersInit = {};
if (token) {
headers['Authorization'] = `Bearer ${token}`;
}
const response = await fetch(exportUrl, {
method: 'GET',
credentials: 'include',
headers,
});
if (!response.ok) {
const errorText = await response.text();
throw new Error(`Export failed: ${errorText}`);
}
const blob = await response.blob();
const downloadUrl = window.URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = downloadUrl;
link.download = 'ideas.csv';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
window.URL.revokeObjectURL(downloadUrl);
} catch (error: any) {
throw error;
throw error; // Let TablePageTemplate handle toast
}
}, []);
@@ -529,7 +561,36 @@ export default function Ideas() {
onRowAction={handleRowAction}
getItemDisplayName={(row: ContentIdea) => row.idea_title}
onExport={async () => {
toast.info('Export functionality coming soon');
try {
const params = new URLSearchParams();
if (searchTerm) params.set('search', searchTerm);
if (statusFilter) params.set('status', statusFilter);
if (clusterFilter) params.set('keyword_cluster_id', clusterFilter);
if (structureFilter) params.set('content_structure', structureFilter);
if (typeFilter) params.set('content_type', typeFilter);
const exportUrl = `${API_BASE_URL}/v1/planner/ideas/export/?${params.toString()}`;
const token = useAuthStore.getState().token;
const headers: HeadersInit = {};
if (token) {
headers['Authorization'] = `Bearer ${token}`;
}
const response = await fetch(exportUrl, { method: 'GET', credentials: 'include', headers });
if (!response.ok) {
throw new Error(`Export failed: ${response.statusText}`);
}
const blob = await response.blob();
const downloadUrl = window.URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = downloadUrl;
link.download = 'ideas.csv';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
window.URL.revokeObjectURL(downloadUrl);
toast.success('Export successful', 'Ideas exported successfully.');
} catch (error: any) {
toast.error(`Export failed: ${error.message}`);
}
}}
onExportIcon={<DownloadIcon />}
selectionLabel="idea"

View File

@@ -28,6 +28,7 @@ import {
import { useSiteStore } from '../../store/siteStore';
import { useSectorStore } from '../../store/sectorStore';
import { usePageSizeStore } from '../../store/pageSizeStore';
import { useAuthStore } from '../../store/authStore';
import PageHeader from '../../components/common/PageHeader';
import StandardThreeWidgetFooter from '../../components/dashboard/StandardThreeWidgetFooter';
import { getDifficultyNumber } from '../../utils/difficulty';
@@ -535,14 +536,21 @@ export default function Keywords() {
const idsParam = ids.join(',');
const exportUrl = `${API_BASE_URL}/v1/planner/keywords/export/?ids=${encodeURIComponent(idsParam)}`;
const token = useAuthStore.getState().token;
const headers: HeadersInit = {};
if (token) {
headers['Authorization'] = `Bearer ${token}`;
}
const response = await fetch(exportUrl, {
method: 'GET',
credentials: 'include',
headers,
});
if (!response.ok) {
const errorText = await response.text();
throw new Error(`Export failed: ${response.statusText} - ${errorText}`);
throw new Error(`Export failed: ${errorText}`);
}
const blob = await response.blob();