Skip to content

Commit 1200b4d

Browse files
Copilothotlong
andcommitted
fix: add explicit type annotations to fix TS7006 implicit any errors in plugin-report
Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
1 parent 93398d9 commit 1200b4d

4 files changed

Lines changed: 24 additions & 24 deletions

File tree

packages/plugin-report/src/LiveReportExporter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ export function exportExcelWithFormulas(
189189

190190
// Optional aggregation row
191191
if (includeAggregationRow && data.length > 0) {
192-
const aggRow = cols.map((col, colIndex) => {
192+
const aggRow = cols.map((col: ExcelColumnConfig, colIndex: number) => {
193193
const field = (report.fields || []).find(f => f.name === col.name);
194194
if (field?.aggregation) {
195195
const colLetter = getExcelColumnLetter(colIndex);

packages/plugin-report/src/ReportBuilder.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
import React, { useState } from 'react';
1010
import { Card, CardContent, CardHeader, CardTitle, CardDescription, Button, Input, Label, Tabs, TabsContent, TabsList, TabsTrigger } from '@object-ui/components';
11-
import type { ReportBuilderSchema, ReportSchema, ReportField, ReportFilter, ReportGroupBy, ReportSection } from '@object-ui/types';
11+
import type { ReportBuilderSchema, ReportSchema, ReportField, ReportFilter, ReportGroupBy, ReportSection, DataSource } from '@object-ui/types';
1212
import { Plus, Trash2, Save, X, Settings, Filter, Layers, Calendar } from 'lucide-react';
1313
import { ReportViewer } from './ReportViewer';
1414
import { ScheduleConfig } from './ScheduleConfig';
@@ -51,7 +51,7 @@ export const ReportBuilder: React.FC<ReportBuilderProps> = ({ schema }) => {
5151
const handleAddField = () => {
5252
if (availableFields.length > 0 && selectedFields.length < availableFields.length) {
5353
const nextField = availableFields.find(
54-
f => !selectedFields.some(sf => sf.name === f.name)
54+
(f: ReportField) => !selectedFields.some(sf => sf.name === f.name)
5555
);
5656
if (nextField) {
5757
const newFields = [...selectedFields, nextField];
@@ -226,7 +226,7 @@ export const ReportBuilder: React.FC<ReportBuilderProps> = ({ schema }) => {
226226
<Label>Data Source</Label>
227227
<select className="w-full border rounded-md p-2">
228228
<option value="">Select a data source</option>
229-
{dataSources.map((_ds, idx) => (
229+
{dataSources.map((_ds: DataSource, idx: number) => (
230230
<option key={idx} value={idx}>
231231
Data Source {idx + 1}
232232
</option>
@@ -364,7 +364,7 @@ export const ReportBuilder: React.FC<ReportBuilderProps> = ({ schema }) => {
364364
value={filter.field}
365365
onChange={(e) => handleFilterChange(index, { ...filter, field: e.target.value })}
366366
>
367-
{availableFields.map((f, i) => (
367+
{availableFields.map((f: ReportField, i: number) => (
368368
<option key={i} value={f.name}>{f.label || f.name}</option>
369369
))}
370370
</select>
@@ -432,7 +432,7 @@ export const ReportBuilder: React.FC<ReportBuilderProps> = ({ schema }) => {
432432
value={group.field}
433433
onChange={(e) => handleGroupByChange(index, { ...group, field: e.target.value })}
434434
>
435-
{availableFields.map((f, i) => (
435+
{availableFields.map((f: ReportField, i: number) => (
436436
<option key={i} value={f.name}>{f.label || f.name}</option>
437437
))}
438438
</select>
@@ -557,7 +557,7 @@ export const ReportBuilder: React.FC<ReportBuilderProps> = ({ schema }) => {
557557
})}
558558
>
559559
<option value="">Select Field...</option>
560-
{availableFields.map(f => (
560+
{availableFields.map((f: ReportField) => (
561561
<option key={f.name} value={f.name}>{f.label || f.name}</option>
562562
))}
563563
{/* Use mock fields if no available fields provided */}

packages/plugin-report/src/ReportExportEngine.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* LICENSE file in the root directory of this source tree.
77
*/
88

9-
import type { ReportSchema, ReportExportConfig, ReportExportFormat } from '@object-ui/types';
9+
import type { ReportSchema, ReportExportConfig, ReportExportFormat, ReportField } from '@object-ui/types';
1010

1111
/**
1212
* Report Export Engine
@@ -18,8 +18,8 @@ import type { ReportSchema, ReportExportConfig, ReportExportFormat } from '@obje
1818
*/
1919
export function exportAsCSV(report: ReportSchema, data: any[], config?: ReportExportConfig): void {
2020
const fields = report.fields || [];
21-
const headers = fields.map(f => f.label || f.name);
22-
const rows = data.map(row => fields.map(f => {
21+
const headers = fields.map((f: ReportField) => f.label || f.name);
22+
const rows = data.map((row: Record<string, any>) => fields.map((f: ReportField) => {
2323
let val = row[f.name];
2424
val = sanitizeCSVValue(val);
2525
// Escape CSV values
@@ -81,8 +81,8 @@ export function exportAsHTML(report: ReportSchema, data: any[], config?: ReportE
8181
${report.description ? `<p class="description">${escapeHTML(report.description)}</p>` : ''}
8282
<p class="meta">Generated: ${new Date().toLocaleString()}</p>
8383
<table>
84-
<thead><tr>${fields.map(f => `<th>${escapeHTML(f.label || f.name)}</th>`).join('')}</tr></thead>
85-
<tbody>${data.map(row => `<tr>${fields.map(f => `<td>${escapeHTML(String(row[f.name] ?? ''))}</td>`).join('')}</tr>`).join('')}</tbody>
84+
<thead><tr>${fields.map((f: ReportField) => `<th>${escapeHTML(f.label || f.name)}</th>`).join('')}</tr></thead>
85+
<tbody>${data.map((row: Record<string, any>) => `<tr>${fields.map((f: ReportField) => `<td>${escapeHTML(String(row[f.name] ?? ''))}</td>`).join('')}</tr>`).join('')}</tbody>
8686
</table>
8787
</body>
8888
</html>`;
@@ -133,8 +133,8 @@ export function exportAsPDF(report: ReportSchema, data: any[], config?: ReportEx
133133
${report.description ? `<p class="description">${escapeHTML(report.description)}</p>` : ''}
134134
<p class="meta">Generated: ${new Date().toLocaleString()}</p>
135135
<table>
136-
<thead><tr>${fields.map(f => `<th>${escapeHTML(f.label || f.name)}</th>`).join('')}</tr></thead>
137-
<tbody>${data.map(row => `<tr>${fields.map(f => `<td>${escapeHTML(String(row[f.name] ?? ''))}</td>`).join('')}</tr>`).join('')}</tbody>
136+
<thead><tr>${fields.map((f: ReportField) => `<th>${escapeHTML(f.label || f.name)}</th>`).join('')}</tr></thead>
137+
<tbody>${data.map((row: Record<string, any>) => `<tr>${fields.map((f: ReportField) => `<td>${escapeHTML(String(row[f.name] ?? ''))}</td>`).join('')}</tr>`).join('')}</tbody>
138138
</table>
139139
</body>
140140
</html>`);
@@ -150,8 +150,8 @@ ${report.description ? `<p class="description">${escapeHTML(report.description)}
150150
*/
151151
export function exportAsExcel(report: ReportSchema, data: any[], config?: ReportExportConfig): void {
152152
const fields = report.fields || [];
153-
const headers = fields.map(f => f.label || f.name);
154-
const rows = data.map(row => fields.map(f => {
153+
const headers = fields.map((f: ReportField) => f.label || f.name);
154+
const rows = data.map((row: Record<string, any>) => fields.map((f: ReportField) => {
155155
let val = row[f.name];
156156
val = sanitizeCSVValue(val);
157157
if (typeof val === 'string' && (val.includes(',') || val.includes('"') || val.includes('\n') || val.includes('\t'))) {

packages/plugin-report/src/ReportViewer.tsx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,12 @@ export const ReportViewer: React.FC<ReportViewerProps> = ({ schema, onRefresh })
5454

5555
const computeAggregation = (fieldName: string, aggregation?: string): string | number => {
5656
if (!data) return 0;
57-
const values = data.map(item => Number(item[fieldName]) || 0);
57+
const values = data.map((item: Record<string, any>) => Number(item[fieldName]) || 0);
5858
switch (aggregation) {
5959
case 'count': return data.length;
60-
case 'sum': return values.reduce((sum, v) => sum + v, 0);
60+
case 'sum': return values.reduce((sum: number, v: number) => sum + v, 0);
6161
case 'avg': return values.length > 0
62-
? (values.reduce((sum, v) => sum + v, 0) / values.length).toFixed(2)
62+
? (values.reduce((sum: number, v: number) => sum + v, 0) / values.length).toFixed(2)
6363
: 0;
6464
case 'min': return values.length > 0 ? Math.min(...values) : 0;
6565
case 'max': return values.length > 0 ? Math.max(...values) : 0;
@@ -167,8 +167,8 @@ export const ReportViewer: React.FC<ReportViewerProps> = ({ schema, onRefresh })
167167
{section.type === 'summary' && (
168168
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
169169
{report.fields
170-
?.filter(f => f.showInSummary)
171-
.map((field, idx) => (
170+
?.filter((f: ReportField) => f.showInSummary)
171+
.map((field: ReportField, idx: number) => (
172172
<Card key={idx}>
173173
<CardContent className="p-4">
174174
<div className="text-sm text-muted-foreground">{field.label || field.name}</div>
@@ -232,17 +232,17 @@ export const ReportViewer: React.FC<ReportViewerProps> = ({ schema, onRefresh })
232232
<table className="w-full text-sm">
233233
<thead className="bg-muted">
234234
<tr>
235-
{section.columns?.map((col, idx) => (
235+
{section.columns?.map((col: ReportField, idx: number) => (
236236
<th key={idx} className="px-4 py-2 text-left font-medium">
237237
{col.label || col.name}
238238
</th>
239239
))}
240240
</tr>
241241
</thead>
242242
<tbody>
243-
{data?.map((row, rowIdx) => (
243+
{data?.map((row: Record<string, any>, rowIdx: number) => (
244244
<tr key={rowIdx} className="border-t">
245-
{section.columns?.map((col, colIdx) => (
245+
{section.columns?.map((col: ReportField, colIdx: number) => (
246246
<td key={colIdx} className="px-4 py-2">
247247
{row[col.name]}
248248
</td>

0 commit comments

Comments
 (0)