CSV Tool - Wails-based CSV editor with spreadsheet UI

Features:
- Spreadsheet-like table with cell navigation (arrow keys)
- Formula bar for editing cell values
- Click and drag cell selection with Shift+Arrow extend
- Column resize by dragging header borders, double-click for best fit
- Editable headers via double-click
- Command palette (Cmd+P) with 12 commands
- Copy/Cut/Paste with CSV, Markdown, and Jira formats
- Insert rows/columns above/below/left/right
- File drag-and-drop to open CSV files
- Native Open/Save dialogs
- Go backend for CSV parsing, formatting, and file I/O
- Vanilla JS frontend, no frameworks

Co-authored-by: Shelley <shelley@exe.dev>
This commit is contained in:
exe.dev user 2026-03-03 21:34:09 +00:00
commit 55a25f6d63
24 changed files with 3283 additions and 0 deletions

31
frontend/wailsjs/go/main/App.d.ts vendored Executable file
View file

@ -0,0 +1,31 @@
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
// This file is automatically generated. DO NOT EDIT
import {main} from '../models';
export function FormatAsCSV(arg1:Array<string>,arg2:Array<any>):Promise<string>;
export function FormatAsJira(arg1:Array<string>,arg2:Array<any>):Promise<string>;
export function FormatAsMarkdown(arg1:Array<string>,arg2:Array<any>):Promise<string>;
export function FormatAsSingleColumn(arg1:Array<any>):Promise<string>;
export function FormatRowsAsCSV(arg1:Array<any>):Promise<string>;
export function GetTableData():Promise<main.CSVData>;
export function LoadCSV(arg1:string):Promise<main.CSVData>;
export function OpenFileDialog():Promise<string>;
export function ParseCSVString(arg1:string):Promise<main.CSVData>;
export function SaveCSV(arg1:string,arg2:Array<string>,arg3:Array<any>):Promise<void>;
export function SaveCurrentFile(arg1:Array<string>,arg2:Array<any>):Promise<void>;
export function SaveFileDialog():Promise<string>;
export function SetTableData(arg1:Array<string>,arg2:Array<any>):Promise<void>;
export function SetWindowTitle(arg1:string):Promise<void>;

59
frontend/wailsjs/go/main/App.js Executable file
View file

@ -0,0 +1,59 @@
// @ts-check
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
// This file is automatically generated. DO NOT EDIT
export function FormatAsCSV(arg1, arg2) {
return window['go']['main']['App']['FormatAsCSV'](arg1, arg2);
}
export function FormatAsJira(arg1, arg2) {
return window['go']['main']['App']['FormatAsJira'](arg1, arg2);
}
export function FormatAsMarkdown(arg1, arg2) {
return window['go']['main']['App']['FormatAsMarkdown'](arg1, arg2);
}
export function FormatAsSingleColumn(arg1) {
return window['go']['main']['App']['FormatAsSingleColumn'](arg1);
}
export function FormatRowsAsCSV(arg1) {
return window['go']['main']['App']['FormatRowsAsCSV'](arg1);
}
export function GetTableData() {
return window['go']['main']['App']['GetTableData']();
}
export function LoadCSV(arg1) {
return window['go']['main']['App']['LoadCSV'](arg1);
}
export function OpenFileDialog() {
return window['go']['main']['App']['OpenFileDialog']();
}
export function ParseCSVString(arg1) {
return window['go']['main']['App']['ParseCSVString'](arg1);
}
export function SaveCSV(arg1, arg2, arg3) {
return window['go']['main']['App']['SaveCSV'](arg1, arg2, arg3);
}
export function SaveCurrentFile(arg1, arg2) {
return window['go']['main']['App']['SaveCurrentFile'](arg1, arg2);
}
export function SaveFileDialog() {
return window['go']['main']['App']['SaveFileDialog']();
}
export function SetTableData(arg1, arg2) {
return window['go']['main']['App']['SetTableData'](arg1, arg2);
}
export function SetWindowTitle(arg1) {
return window['go']['main']['App']['SetWindowTitle'](arg1);
}

View file

@ -0,0 +1,5 @@
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
// This file is automatically generated. DO NOT EDIT
import {main} from '../models';
export function GetCommands():Promise<Array<main.Command>>;

View file

@ -0,0 +1,7 @@
// @ts-check
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
// This file is automatically generated. DO NOT EDIT
export function GetCommands() {
return window['go']['main']['CommandRegistry']['GetCommands']();
}

37
frontend/wailsjs/go/models.ts Executable file
View file

@ -0,0 +1,37 @@
export namespace main {
export class CSVData {
Headers: string[];
Rows: string[][];
FilePath: string;
static createFrom(source: any = {}) {
return new CSVData(source);
}
constructor(source: any = {}) {
if ('string' === typeof source) source = JSON.parse(source);
this.Headers = source["Headers"];
this.Rows = source["Rows"];
this.FilePath = source["FilePath"];
}
}
export class Command {
ID: string;
Name: string;
Shortcut: string;
static createFrom(source: any = {}) {
return new Command(source);
}
constructor(source: any = {}) {
if ('string' === typeof source) source = JSON.parse(source);
this.ID = source["ID"];
this.Name = source["Name"];
this.Shortcut = source["Shortcut"];
}
}
}