84 lines
2.0 KiB
Dart
84 lines
2.0 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:okane/screen.dart';
|
|
import 'package:okane/ui/widgets/piechart.dart';
|
|
|
|
class ResponsiveCard extends StatelessWidget {
|
|
final String titleText;
|
|
final String? subtitleText;
|
|
|
|
final Widget child;
|
|
|
|
const ResponsiveCard({
|
|
super.key,
|
|
required this.titleText,
|
|
required this.child,
|
|
this.subtitleText,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final screenSize = getScreenSize(context);
|
|
final card = Card(
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
children: [
|
|
Padding(
|
|
padding: EdgeInsets.only(top: 8, left: 8, right: 8),
|
|
child: Text(
|
|
titleText,
|
|
style: Theme.of(
|
|
context,
|
|
).textTheme.titleLarge!.copyWith(fontWeight: FontWeight.bold),
|
|
),
|
|
),
|
|
|
|
child,
|
|
|
|
if (subtitleText != null)
|
|
Padding(padding: EdgeInsets.all(8), child: Text(subtitleText!)),
|
|
],
|
|
),
|
|
);
|
|
return switch (screenSize) {
|
|
ScreenSize.small => Row(children: [Expanded(child: card)]),
|
|
ScreenSize.normal => Container(
|
|
constraints: BoxConstraints(maxWidth: ScreenSize.normal.size),
|
|
child: card,
|
|
),
|
|
};
|
|
}
|
|
}
|
|
|
|
class PieChartCard extends StatelessWidget {
|
|
final String titleText;
|
|
|
|
// Text to display when items is empty.
|
|
final String fallbackText;
|
|
|
|
final OkanePieChartValueConverter valueConverter;
|
|
|
|
final List<OkanePieChartSection> items;
|
|
|
|
const PieChartCard({
|
|
super.key,
|
|
this.valueConverter = numToString,
|
|
required this.items,
|
|
required this.fallbackText,
|
|
required this.titleText,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final child =
|
|
items.isEmpty
|
|
? SizedBox(
|
|
width: 150,
|
|
height: 150,
|
|
child: Center(child: Text(fallbackText)),
|
|
)
|
|
: OkanePieChart(valueConverter: valueConverter, items: items);
|
|
|
|
return ResponsiveCard(titleText: titleText, child: child);
|
|
}
|
|
}
|