Advertisement
djbob2000

Untitled

Feb 26th, 2025
515
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //src/lm/lead/actions/export-leads-action/export-leads-action.ts
  2. import { FdTableComponent } from "@/meta/table/table-models";
  3. import { resourceNames } from "@/fd/fd-toolbox/resources/resource-names";
  4. import { exportItemsInCSVFile } from "@/fd/fd-toolbox/converters/csv-converter";
  5.  
  6. export async function exportLeadInCSVFile(table: FdTableComponent | undefined) {
  7.     return exportItemsInCSVFile(table, resourceNames.lead);
  8. }
  9.  
  10.  
  11. //src/fd/fd-toolbox/converters/csv-converter.ts
  12. import { WithIdAndStringIndexer, withIdProps } from "@/fd/fd-toolbox/types/resource-with-id";
  13. import { metaQueryParams } from "@/fd/fd-toolbox/constants/meta-query-params";
  14. import { apiPost } from "@/fd/fd-toolbox/api/api-client";
  15. import { ApiResponse } from "@/fd/fd-toolbox/api/api-response";
  16. import { notify } from "@/fd/fd-toolbox/notifications";
  17. import { routes } from "@/fd/fd-toolbox/routing/routes";
  18. import { FdTableComponent } from "@/meta/table/table-models";
  19. import { getUiResourceMeta } from "@/meta/ui-meta-providers";
  20. import { isString, isObject } from "@/fd/fd-toolbox/types/ensure-type";
  21. import { WithIndexer } from "@/fd/fd-toolbox/types/with-indexer";
  22.  
  23. interface EmailObject {
  24.     email: string;
  25. }
  26.  
  27. interface UiResourceMeta {
  28.     resourceMeta: {
  29.         properties: WithIndexer<{ displayName?: string }>;
  30.     };
  31. }
  32.  
  33. const notifications = {
  34.     noItemsSelected: "Please select at least one item to export",
  35.     exportCompleted: "Items were exported successfully",
  36. };
  37.  
  38. const csvType = "text/csv";
  39. const defaultFileName = "Export";
  40. const emailProperty = "email";
  41.  
  42. export function createAndDownloadCsv(data: string, fileName?: string) {
  43.     const blob = new Blob([data], { type: csvType });
  44.     const url = URL.createObjectURL(blob);
  45.     const downloadLink = document.createElement("a");
  46.     downloadLink.href = url;
  47.     downloadLink.download =
  48.         fileName ||
  49.         new URL(window.location.href).searchParams.get(metaQueryParams.resource) ||
  50.         defaultFileName;
  51.     document.body.appendChild(downloadLink);
  52.     downloadLink.click();
  53.     downloadLink.remove();
  54. }
  55.  
  56. function processArrayValue(value: unknown[]) {
  57.     if (value.length > 0 && isObject(value[0]) && emailProperty in value[0]) {
  58.         return value.map((obj) => (obj as EmailObject).email).join(", ");
  59.     }
  60.  
  61.     return value.join(", ");
  62. }
  63.  
  64. function processArrayProperties(item: WithIdAndStringIndexer) {
  65.     const processedItem: WithIdAndStringIndexer = Object.create(null) as WithIdAndStringIndexer;
  66.  
  67.     for (const [key, value] of Object.entries(item)) {
  68.         if (Array.isArray(value)) {
  69.             processedItem[key] = processArrayValue(value);
  70.         } else {
  71.             processedItem[key] = value;
  72.         }
  73.     }
  74.  
  75.     return processedItem;
  76. }
  77.  
  78. function formatItemForExport(item: WithIdAndStringIndexer, uiResourceMeta: UiResourceMeta) {
  79.     const processedItem = processArrayProperties(item);
  80.     const result: WithIdAndStringIndexer = { id: "" };
  81.     const idValue = isString(processedItem.id) ? processedItem.id : String(processedItem.id ?? "");
  82.     let idDisplayName = withIdProps.id;
  83.  
  84.     for (const [propertyName, value] of Object.entries(processedItem)) {
  85.         const propertyMeta = uiResourceMeta.resourceMeta.properties[propertyName];
  86.         const displayName = propertyMeta?.displayName || propertyName;
  87.  
  88.         if (propertyName === withIdProps.id) {
  89.             idDisplayName = displayName;
  90.             continue;
  91.         }
  92.  
  93.         result[displayName] = String(value ?? "");
  94.     }
  95.  
  96.     result[idDisplayName] = idValue;
  97.     return result;
  98. }
  99.  
  100. export async function exportItemsInCSVFile(table: FdTableComponent | undefined, resourceName: string) {
  101.     if (!table) {
  102.         return;
  103.     }
  104.  
  105.     const tableSelectedRows = table.getSelectedRows();
  106.  
  107.     if (!tableSelectedRows || tableSelectedRows.length === 0) {
  108.         notify(notifications.noItemsSelected);
  109.         return;
  110.     }
  111.  
  112.     const uiResourceMeta = await getUiResourceMeta(resourceName);
  113.     const items = tableSelectedRows.map(({ item }) => formatItemForExport(item, uiResourceMeta));
  114.  
  115.     const response = await apiPost<ApiResponse<string>, { items: WithIdAndStringIndexer[] }>(routes.export, {
  116.         items,
  117.     });
  118.  
  119.     if (response && response.data) {
  120.         createAndDownloadCsv(response.data);
  121.         notify(notifications.exportCompleted);
  122.     }
  123. }
  124.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement