diff --git a/src/lib/transferComponents/newFormatDetection.ts b/src/lib/transferComponents/newFormatDetection.svelte.ts similarity index 69% rename from src/lib/transferComponents/newFormatDetection.ts rename to src/lib/transferComponents/newFormatDetection.svelte.ts index 456db48f..784e143f 100644 --- a/src/lib/transferComponents/newFormatDetection.ts +++ b/src/lib/transferComponents/newFormatDetection.svelte.ts @@ -1,3 +1,46 @@ +import type { ColumnFormat } from "$lib/types/columnModel"; + + // πŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈ This is FORMATTING only + 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 formatGps(value: any): string { + return "Gps:" + value; + } + + function formatNumber(value: any): string { + return "Number: " + value; + } + + function formatString(value: any): string { + return "String: " + value; + } + + + +function numberFormat(value: number): string { + return new Intl.NumberFormat('en-US', { + style: 'decimal', + minimumFractionDigits: 0, + maximumFractionDigits: 2 + }).format(value); +} + +function formatDate(value: string): string { + return new Date(value).toLocaleDateString('en-US', { + year: 'numeric', + month: '2-digit', + day: '2-digit' + }); +} + +// πŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈπŸ”‰οΈ This is detection only // πŸ‘οΈπŸŒ²οΈπŸ‘οΈπŸŒ²οΈπŸ‘οΈπŸŒ²οΈπŸ‘οΈπŸŒ²οΈπŸ‘οΈπŸŒ²οΈNUMBERS🌲️🌲️🌲️🌲️🌲️🌲️🌲️ // Number detection with debug @@ -16,6 +59,7 @@ return false; } + // 🌲️🌲️🌲️🌲️🌲️🌲️🌲️DATES🌲️🌲️🌲️🌲️🌲️🌲️🌲️ function isDate(value: any): boolean { if (typeof value === 'number') { @@ -47,15 +91,16 @@ /^\d{1,2}(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\d{4}$/i ]; return DATE_FORMATS.some((format) => format.test(value)); + // print as JavaScript data string } return false; } // 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 +112,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..8a2bc49c 100644 --- a/src/lib/transferComponents/newTableData.svelte +++ b/src/lib/transferComponents/newTableData.svelte @@ -2,7 +2,12 @@ import type { ColumnRep } from '$lib/types/columnModel'; import FormatSelectorComponent from './FormatSelectorComponent.svelte'; import { importedData } from '$lib/transferComponents/modelState.svelte'; - +<<<<<<< HEAD + import {formatValue} from "./newFormatDetection.svelte"; + +======= + import {formatValue} from './newFormatDetection.svelte' +>>>>>>> 9d97b0f (Introduce some reactivity and state modifications.) let columnFormats = $state>({}); // Number formatting function @@ -27,18 +32,18 @@ // 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); } - {#if importedData.columns.length > 0} @@ -47,9 +52,9 @@ {#each importedData.columns as column} formatEvent(column, event)} /> {/each} @@ -66,10 +71,7 @@ {#each importedData.columns as column, columnIndex} - {columnFormats[column.headerName] === 'number' && - typeof column.values[rowIndex] === 'number' - ? numberFormat(column.values[rowIndex] as number) - : (column.values[rowIndex] ?? '')} + {formatValue(column.type, column.values[rowIndex])} {/each} diff --git a/src/lib/transferComponents/transferCSVImporter.svelte b/src/lib/transferComponents/transferCSVImporter.svelte index ab898839..a590f226 100644 --- a/src/lib/transferComponents/transferCSVImporter.svelte +++ b/src/lib/transferComponents/transferCSVImporter.svelte @@ -1,4 +1,4 @@ -