From 3c9caae26a9b9df8b061f68497aa963298dd8227 Mon Sep 17 00:00:00 2001 From: Ryan Livingston <43882944+rlivings39@users.noreply.github.com> Date: Thu, 3 Apr 2025 21:39:17 -0400 Subject: [PATCH 1/3] Introduce some reactivity and state modifications. 1. Format detection is run after parsing the CSV but before setting the program state and rendering the main table. 2. Format detection updates the main model state's type field on each column 3. Table rendering uses example custom formatters for each type 4. Changing the format dropdown updates the main model state's type field which redraws the table and reformats the contents --- ...ection.ts => newFormatDetection.svelte.ts} | 38 ++++++++++++++----- .../transferComponents/newTableData.svelte | 17 +++++---- .../transferCSVImporter.svelte | 7 +++- src/lib/types/columnModel.ts | 19 +++++----- 4 files changed, 55 insertions(+), 26 deletions(-) rename src/lib/transferComponents/{newFormatDetection.ts => newFormatDetection.svelte.ts} (80%) diff --git a/src/lib/transferComponents/newFormatDetection.ts b/src/lib/transferComponents/newFormatDetection.svelte.ts similarity index 80% rename from src/lib/transferComponents/newFormatDetection.ts rename to src/lib/transferComponents/newFormatDetection.svelte.ts index 456db48f..d825f24a 100644 --- a/src/lib/transferComponents/newFormatDetection.ts +++ b/src/lib/transferComponents/newFormatDetection.svelte.ts @@ -1,3 +1,29 @@ +import type { ColumnFormat } from "$lib/types/columnModel"; + + type FormatT = 'string' | 'number' | 'date' | 'gps'; + export function formatValue(format: FormatT, value: any): string { + if (format === "date") { return formatDate(value); } + if (format == "gps") { return formatGps(value); } + if (format === "number") { return formatNumber(value); } + if (format === "string") { return formatString(value); } + return value; + } + + function formatDate(value: any): string { + return "Date: " + value; + } + + function formatGps(value: any): string { + return "Gps:" + value; + } + + function formatNumber(value: any): string { + return "Number: " + value; + } + + function formatString(value: any): string { + return "String: " + value; + } // πŸ‘οΈπŸŒ²οΈπŸ‘οΈπŸŒ²οΈπŸ‘οΈπŸŒ²οΈπŸ‘οΈπŸŒ²οΈπŸ‘οΈπŸŒ²οΈNUMBERS🌲️🌲️🌲️🌲️🌲️🌲️🌲️ // Number detection with debug @@ -52,10 +78,10 @@ } // 3 Apr 2025 8:55β€―AM New function - export function detectFormat(columnData: Array, currentColumnHeader: string, selectedFormat: string) { + export function detectFormat(columnData: Array, currentColumnHeader: string): ColumnFormat { console.log('Checking column format for:', currentColumnHeader); // Reset detected format for new column - selectedFormat = 'string'; + let selectedFormat: ColumnFormat = 'string'; // Get first 3 non-empty values const sampleValues = columnData .filter((val: string | number | null) => val !== null && val !== '') @@ -67,19 +93,13 @@ // If majority format if (dateCount >= Math.ceil(sampleValues.length / 2)) { - if (selectedFormat !== 'date') { - // console.log(`Setting format to 'date' (${dateCount}/${sampleValues.length} dates)`); selectedFormat = 'date'; - } } else if (numberCount >= Math.ceil(sampleValues.length / 2)) { - if (selectedFormat !== 'number') { - // console.log(`Setting format to 'number' (${numberCount}/${sampleValues.length} numbers)`); selectedFormat = 'number'; - } } else { console.log( `No majority format - keeping as '${selectedFormat}' (${numberCount} numbers, ${dateCount} dates)` ); } return selectedFormat; - }; \ No newline at end of file + }; diff --git a/src/lib/transferComponents/newTableData.svelte b/src/lib/transferComponents/newTableData.svelte index d3db5788..1e690ab2 100644 --- a/src/lib/transferComponents/newTableData.svelte +++ b/src/lib/transferComponents/newTableData.svelte @@ -2,7 +2,8 @@ import type { ColumnRep } from '$lib/types/columnModel'; import FormatSelectorComponent from './FormatSelectorComponent.svelte'; import { importedData } from '$lib/transferComponents/modelState.svelte'; - + import {formatValue} from "./newFormatDetection.svelte"; + let columnFormats = $state>({}); // Number formatting function @@ -27,14 +28,15 @@ // then run detection and formatting for that type on the columnRep // Whenever select dropdown changes, this updates. Handle format changes - export function formatEvent( + export function formatEvent(column: ColumnRep, event: CustomEvent<{ destinationFormat: string; headerName: string }> ) { // this is dropdown value user chose. - const selectedFormat = event.detail.destinationFormat; + const selectedFormat = event.detail.destinationFormat as 'string' | 'number' | 'date' | 'gps'; console.log(`Called from format event from table: ${selectedFormat}`); // Update column format in state // might be better to update main model + column.type = selectedFormat; columnFormats[event.detail.headerName] = selectedFormat; console.log('calling column formats', columnFormats); } @@ -47,9 +49,9 @@ {#each importedData.columns as column} formatEvent(column, event)} /> {/each} @@ -66,10 +68,11 @@ {#each importedData.columns as column, columnIndex} - {columnFormats[column.headerName] === 'number' && + {formatValue(column.type, column.values[rowIndex])} + {/each} diff --git a/src/lib/transferComponents/transferCSVImporter.svelte b/src/lib/transferComponents/transferCSVImporter.svelte index ab898839..952a9211 100644 --- a/src/lib/transferComponents/transferCSVImporter.svelte +++ b/src/lib/transferComponents/transferCSVImporter.svelte @@ -1,4 +1,4 @@ - {/each}