new keywirds and ideas export fix
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user