LCOV - code coverage report
Current view: top level - lib/design/generic - base_group_widget.dart Coverage Total Hit
Test: lcov.info Lines: 0.0 % 59 0
Test Date: 2026-11-14 15:04:37 Functions: - 0 0

            Line data    Source code
       1              : // Copyright 2023 The terCAD team. All rights reserved.
       2              : // Use of this source code is governed by a CC BY-NC-ND 4.0 license that can be found in the LICENSE file.
       3              : 
       4              : import 'dart:math';
       5              : 
       6              : import 'package:app_finance/_classes/herald/app_design.dart';
       7              : import 'package:app_finance/_classes/herald/app_locale.dart';
       8              : import 'package:app_finance/_classes/structure/navigation/app_route.dart';
       9              : import 'package:app_finance/_ext/build_context_ext.dart';
      10              : import 'package:app_finance/charts/bar_vertical_group.dart';
      11              : import 'package:app_finance/charts/bar_vertical_single.dart';
      12              : import 'package:app_finance/charts/radial_bar_chart.dart';
      13              : import 'package:app_finance/_configs/theme_helper.dart';
      14              : import 'package:app_finance/design/wrapper/row_widget.dart';
      15              : import 'package:app_finance/design/wrapper/tap_widget.dart';
      16              : import 'package:material_ui/material_ui.dart';
      17              : 
      18              : class BaseGroupWidget extends StatelessWidget {
      19              :   final String title;
      20              :   final String description;
      21              :   final List<dynamic> items;
      22              :   final List<double> progress;
      23              :   final List<Color> color;
      24              :   final double width;
      25              :   final double total;
      26              :   final String route;
      27              :   static const double size = 32;
      28              : 
      29            0 :   const BaseGroupWidget({
      30              :     super.key,
      31              :     required this.items,
      32              :     required this.title,
      33              :     required this.description,
      34              :     required this.color,
      35              :     required this.width,
      36              :     this.progress = const [],
      37              :     this.route = '',
      38              :     this.total = 0,
      39              :   });
      40              : 
      41            0 :   Widget buildCategory(BuildContext context, int index, bool toSwap) {
      42            0 :     final item = items[index];
      43            0 :     final tooltip = StringBuffer();
      44            0 :     tooltip.writeAll(
      45            0 :         ['${AppLocale.labels.title}: "${item.title}"\n', '${AppLocale.labels.details}: ${item.detailsFormatted}']);
      46            0 :     return TapWidget(
      47            0 :       tooltip: tooltip.toString(),
      48            0 :       route: RouteSettings(name: '$route/view', arguments: {routeArguments.uuid: item.uuid}),
      49              :       child: toSwap
      50            0 :           ? Column(
      51            0 :               children: [
      52            0 :                 Icon(item.icon, size: size / 2, color: item.color),
      53              :                 const SizedBox(height: 6.0),
      54            0 :                 BarVerticalSingle(value: item.progress, height: 14.0, color: item.color ?? Colors.transparent),
      55              :               ],
      56              :             )
      57            0 :           : SizedBox(
      58              :               height: size,
      59              :               width: size,
      60            0 :               child: RadialBarChart(
      61            0 :                 color: item.color,
      62            0 :                 icon: item.icon,
      63            0 :                 progress: progress[index],
      64              :               ),
      65              :             ),
      66              :     );
      67              :   }
      68              : 
      69            0 :   @override
      70              :   Widget build(BuildContext context) {
      71            0 :     double indent = ThemeHelper.getIndent();
      72            0 :     final textTheme = context.textTheme;
      73            0 :     final titleText = Text(
      74            0 :       title,
      75            0 :       style: textTheme.headlineMedium,
      76              :       overflow: TextOverflow.ellipsis,
      77              :     );
      78            0 :     final subTitle = Text(
      79            0 :       description,
      80            0 :       style: textTheme.bodySmall,
      81              :       overflow: TextOverflow.ellipsis,
      82              :     );
      83            0 :     double titleWidth = [ThemeHelper.getTextWidth(titleText), ThemeHelper.getTextWidth(subTitle)].reduce(max);
      84            0 :     if (titleWidth > width / 2) {
      85            0 :       titleWidth = width / 2;
      86              :     }
      87            0 :     final toSwap = items.length * size + items.length * indent * 2 > width - titleWidth - indent * 3;
      88              : 
      89            0 :     return Column(
      90            0 :       crossAxisAlignment: AppDesign.getAlignment(),
      91            0 :       children: [
      92            0 :         TapWidget(
      93            0 :           route: RouteSettings(name: '$route/search', arguments: {routeArguments.search: title}),
      94            0 :           tooltip: AppLocale.labels.search(title),
      95            0 :           child: RowWidget(
      96              :             indent: indent,
      97            0 :             alignment: AppDesign.getAlignment<MainAxisAlignment>(),
      98            0 :             maxWidth: width + indent,
      99            0 :             chunk: [indent * 1.5, titleWidth, null],
     100            0 :             children: [
     101            0 :               [
     102            0 :                 Padding(
     103            0 :                   padding: EdgeInsets.only(left: indent),
     104            0 :                   child: BarVerticalGroup(value: progress, height: 32.0, width: indent / 2, color: color),
     105              :                 ),
     106              :               ],
     107            0 :               [
     108            0 :                 Column(
     109            0 :                   crossAxisAlignment: AppDesign.getAlignment(),
     110            0 :                   children: [titleText, subTitle],
     111              :                 ),
     112              :               ],
     113            0 :               [
     114            0 :                 Row(
     115            0 :                   crossAxisAlignment: AppDesign.getInverseAlignment(),
     116            0 :                   mainAxisAlignment: AppDesign.getInverseAlignment<MainAxisAlignment>(),
     117            0 :                   children: List.generate(
     118            0 :                     items.length * 2,
     119            0 :                     (index) {
     120            0 :                       if (index % 2 != 0) {
     121              :                         return ThemeHelper.wIndent;
     122              :                       } else {
     123            0 :                         return buildCategory(context, index ~/ 2, toSwap);
     124              :                       }
     125              :                     },
     126              :                   ),
     127              :                 ),
     128              :               ]
     129              :             ],
     130              :           ),
     131              :         ),
     132              :         const Divider(),
     133              :       ],
     134              :     );
     135              :   }
     136              : }
        

Generated by: LCOV version 2.0-1