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 'package:app_finance/_classes/herald/app_locale.dart';
5 : import 'package:app_finance/_configs/theme_helper.dart';
6 : import 'package:app_finance/_ext/build_context_ext.dart';
7 : import 'package:app_finance/design/wrapper/row_widget.dart';
8 : import 'package:app_finance/design/wrapper/text_wrapper.dart';
9 : import 'package:flutter/material.dart';
10 :
11 : class RequiredWidget extends StatelessWidget {
12 : final String title;
13 : final bool showError;
14 :
15 2 : const RequiredWidget({
16 : super.key,
17 : required this.title,
18 : required this.showError,
19 : });
20 :
21 4 : Widget _requiredText(TextTheme textTheme, ColorScheme colorScheme) => RichText(
22 : maxLines: 1,
23 : overflow: TextOverflow.ellipsis,
24 2 : text: TextSpan(
25 2 : style: textTheme.bodyLarge,
26 2 : children: [
27 4 : TextSpan(text: title),
28 2 : TextSpan(
29 : text: '*',
30 4 : semanticsLabel: AppLocale.labels.isRequired,
31 6 : style: textTheme.bodyLarge?.copyWith(color: colorScheme.primary),
32 : )
33 : ],
34 : ),
35 : );
36 :
37 2 : @override
38 : Widget build(BuildContext context) {
39 2 : final textTheme = context.textTheme;
40 2 : final colorScheme = context.colorScheme;
41 2 : if (!showError) {
42 2 : return _requiredText(textTheme, colorScheme);
43 : }
44 0 : return LayoutBuilder(builder: (context, constraints) {
45 0 : final indent = ThemeHelper.getIndent();
46 0 : return RowWidget(
47 : alignment: MainAxisAlignment.spaceBetween,
48 : indent: indent,
49 0 : maxWidth: constraints.maxWidth - indent,
50 0 : chunk: [null, ThemeHelper.getTextWidth(Text(AppLocale.labels.isRequired)), 12],
51 0 : children: [
52 0 : [
53 0 : _requiredText(textTheme, colorScheme),
54 : ],
55 0 : [
56 0 : Container(
57 : alignment: Alignment.centerRight,
58 : padding: const EdgeInsets.only(top: 2),
59 0 : child: TextWrapper(
60 0 : AppLocale.labels.isRequired,
61 0 : style: TextStyle(
62 0 : color: colorScheme.error,
63 : ),
64 : ),
65 : ),
66 : ],
67 0 : [
68 0 : Icon(
69 : Icons.error,
70 0 : semanticLabel: '$title: ${AppLocale.labels.isRequired}',
71 0 : color: colorScheme.error,
72 : ),
73 : ],
74 : ],
75 : );
76 : });
77 : }
78 : }
|