Skip to content

Commit 2379c20

Browse files
authored
Merge pull request #176 from BrawlerXull/csv-chinmay
Csv Previewer added
2 parents 325978a + ad05c3f commit 2379c20

File tree

5 files changed

+90
-0
lines changed

5 files changed

+90
-0
lines changed

lib/consts.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,7 @@ const Map<String, Map<String, List<ResponseBodyView>>>
378378
kSubTypeDefaultViewOptions: kRawBodyViewOptions,
379379
kSubTypeCss: kCodeRawBodyViewOptions,
380380
kSubTypeHtml: kCodeRawBodyViewOptions,
381+
kSubTypeCsv: kPreviewCodeRawBodyViewOptions,
381382
kSubTypeJavascript: kCodeRawBodyViewOptions,
382383
kSubTypeMarkdown: kCodeRawBodyViewOptions,
383384
kSubTypeTextXml: kCodeRawBodyViewOptions,
@@ -495,6 +496,10 @@ const kAudioError =
495496
const kRaiseIssue =
496497
"\nPlease raise an issue in API Dash GitHub repo so that we can resolve it.";
497498

499+
const kCsvError =
500+
"There seems to be an issue rendering this CSV. Please raise an issue in API Dash GitHub repo so that we can resolve it.";
501+
502+
498503
const kHintTextUrlCard = "Enter API endpoint like api.foss42.com/country/codes";
499504
const kLabelPlusNew = "+ New";
500505
const kLabelSend = "Send";

lib/widgets/csv_previewer.dart

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:csv/csv.dart';
3+
import 'package:apidash/consts.dart';
4+
import 'package:apidash/widgets/widgets.dart';
5+
6+
class CsvPreviewer extends StatelessWidget {
7+
const CsvPreviewer({Key? key, required this.body}) : super(key: key);
8+
9+
final String body;
10+
11+
@override
12+
Widget build(BuildContext context) {
13+
try {
14+
final List<List<dynamic>> csvData =
15+
const CsvToListConverter().convert(body, eol: '\n');
16+
return SingleChildScrollView(
17+
scrollDirection: Axis.vertical,
18+
child: SingleChildScrollView(
19+
scrollDirection: Axis.horizontal,
20+
child: DataTable(
21+
columns: csvData[0]
22+
.map(
23+
(item) => DataColumn(
24+
label: Text(
25+
item.toString(),
26+
),
27+
),
28+
)
29+
.toList(),
30+
rows: csvData
31+
.skip(1)
32+
.map(
33+
(csvrow) => DataRow(
34+
cells: csvrow
35+
.map(
36+
(csvItem) => DataCell(
37+
Text(
38+
csvItem.toString(),
39+
),
40+
),
41+
)
42+
.toList(),
43+
),
44+
)
45+
.toList(),
46+
),
47+
),
48+
);
49+
} catch (e) {
50+
return const ErrorMessage(message: kCsvError);
51+
}
52+
}
53+
}

lib/widgets/previewer.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'dart:convert';
2+
import 'package:apidash/widgets/csv_previewer.dart';
23
import 'package:flutter/foundation.dart';
34
import 'package:flutter/material.dart';
45
import 'package:printing/printing.dart';
@@ -81,6 +82,13 @@ class _PreviewerState extends State<Previewer> {
8182
},
8283
);
8384
}
85+
if (widget.type == kTypeText && widget.subtype == kSubTypeCsv) {
86+
try {
87+
return CsvPreviewer(body: widget.body);
88+
} catch (e) {
89+
return const ErrorMessage(message: kCsvError);
90+
}
91+
}
8492
if (widget.type == kTypeVideo) {
8593
// TODO: Video Player
8694
}
@@ -89,4 +97,5 @@ class _PreviewerState extends State<Previewer> {
8997
: "$kMimeTypeRaiseIssueStart${widget.type}/${widget.subtype}$kMimeTypeRaiseIssue";
9098
return ErrorMessage(message: message);
9199
}
100+
92101
}

pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ dependencies:
5454
code_builder: ^4.9.0
5555
dart_style: ^2.3.4
5656
json_text_field: ^1.1.0
57+
csv: ^5.1.1
5758

5859
dev_dependencies:
5960
flutter_test:

test/widgets/previewer_test.dart

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,4 +231,26 @@ void main() {
231231
await tester.pumpAndSettle();
232232
expect(find.text(kSvgError), findsOneWidget);
233233
});
234+
235+
testWidgets('Testing when type/subtype is text/csv', (tester) async {
236+
String csvDataString =
237+
'Id,Name,Age\n1,John Doe,40\n2,Dbestech,41\n3,Voldermort,71\n4,Joe Biden,80\n5,Ryo Hanamura,35';
238+
239+
await tester.pumpWidget(
240+
MaterialApp(
241+
home: Scaffold(
242+
body: Previewer(
243+
type: kTypeText,
244+
subtype: kSubTypeCsv,
245+
bytes: Uint8List.fromList([]),
246+
body: csvDataString,
247+
),
248+
),
249+
),
250+
);
251+
252+
expect(find.byType(DataTable), findsOneWidget);
253+
expect(find.text('John Doe'), findsOneWidget);
254+
expect(find.text('41'), findsOneWidget);
255+
});
234256
}

0 commit comments

Comments
 (0)