diff --git a/src/app/app.component.html b/src/app/app.component.html index eb44e8a..21e17d7 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -49,6 +49,7 @@ } @else { -
Panel 4
+ @if (selectedFile()) { + + }
(undefined); + protected selectedFileColumns = signal([]); protected tabs = signal([]); protected selectedTab = signal(0); protected dragging = signal(false); diff --git a/src/app/column-editor/column-editor.component.ts b/src/app/column-editor/column-editor.component.ts new file mode 100644 index 0000000..755450a --- /dev/null +++ b/src/app/column-editor/column-editor.component.ts @@ -0,0 +1,55 @@ +import { ChangeDetectionStrategy, Component, model } from '@angular/core'; +import { AccordionModule } from 'primeng/accordion'; +import { Column } from '../duckdb.service'; +import { Checkbox, CheckboxChangeEvent } from 'primeng/checkbox'; +import { FormsModule } from '@angular/forms'; + +@Component({ + selector: 'app-column-editor', + standalone: true, + imports: [AccordionModule, Checkbox, FormsModule], + template: ` + + + Columns + +
    + @for (column of columns(); track $index) { +
  • + + + {{ column.name }} +
  • + } +
+
+
+
+ `, + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class ColumnEditorComponent { + columns = model(); + + protected checkboxChanged(index: number) { + this.columns.update((columns) => { + if (columns) { + let enabledColumns = columns?.slice(); + enabledColumns[index] = { + ...enabledColumns[index], + enabled: !enabledColumns[index].enabled, + }; + return enabledColumns; + } + return columns; + }); + } +} diff --git a/src/app/duckdb.service.ts b/src/app/duckdb.service.ts index f521525..cee9671 100644 --- a/src/app/duckdb.service.ts +++ b/src/app/duckdb.service.ts @@ -5,6 +5,7 @@ import { z } from 'zod'; export const Column = z.object({ name: z.string(), type: z.string(), + enabled: z.boolean().default(true), }); export const SortColumn = z.object({ @@ -142,6 +143,7 @@ export class DuckdbService { cols.push({ name: jsonData['column_name'], type: jsonData['column_type'], + enabled: true, }); } return cols; diff --git a/src/app/file-viewer/file-viewer.component.ts b/src/app/file-viewer/file-viewer.component.ts index 46c679e..bccba63 100644 --- a/src/app/file-viewer/file-viewer.component.ts +++ b/src/app/file-viewer/file-viewer.component.ts @@ -5,6 +5,7 @@ import { effect, inject, input, + model, signal, viewChild, } from '@angular/core'; @@ -43,14 +44,14 @@ import { PaginatorModule, PaginatorState } from 'primeng/paginator'; PaginatorModule, ], template: ` - @if (file() && columns().length > 0) { + @if (file() && enabledColumns().length > 0) {
- @for (col of columns(); track $index) { + @for (col of enabledColumns(); track $index) { @if (col.type === 'DOUBLE' || col.type === 'BIGINT') {
@@ -174,7 +175,7 @@ export class FileViewerComponent { private duckdbService = inject(DuckdbService); // Can't be computed since effect has to run first so file exists in duckdb - protected columns = signal([]); + columns = model([]); protected aggregates = signal<(Aggregate | undefined)[]>([]); protected currentAggregateColumn = signal(undefined); protected aggregateValues = signal<(number | undefined)[]>([]); @@ -195,6 +196,10 @@ export class FileViewerComponent { () => !!this.columns().find((col) => this.isAggregateColumn(col)), ); + protected enabledColumns = computed(() => + this.columns().filter((col) => col.enabled), + ); + protected aggregateItems: MenuItem[] = aggregateTypes.map((type) => ({ label: type, command: () => this.updateAggregateValue(type),