style(app): остальные экраны под новый визуальный язык и форматирование
Доходы, ребалансировка, налоги, импорт, цели, здоровье данных, правила, транзакции, категории, cashflow, pending: новые виджеты и токены темы, dart format. Тесты подстроены под новые модели.
This commit is contained in:
@@ -43,7 +43,8 @@ class IncomeCalendarTab extends ConsumerWidget {
|
||||
padding: EdgeInsets.only(top: 48),
|
||||
child: EmptyState(
|
||||
icon: Icons.event_available_outlined,
|
||||
message: 'Ожидаемых выплат в этом окне нет.\n'
|
||||
message:
|
||||
'Ожидаемых выплат в этом окне нет.\n'
|
||||
'Либо по бумагам нет объявленных выплат и истории, либо портфель пуст.',
|
||||
),
|
||||
)
|
||||
@@ -77,13 +78,15 @@ class _CalendarControls extends ConsumerWidget {
|
||||
ChoiceChip(
|
||||
label: Text('$m мес'),
|
||||
selected: months == m,
|
||||
onSelected: (_) => ref.read(calendarMonthsProvider.notifier).state = m,
|
||||
onSelected: (_) =>
|
||||
ref.read(calendarMonthsProvider.notifier).state = m,
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
FilterChip(
|
||||
label: const Text('Показать выплаченные'),
|
||||
selected: includePaid,
|
||||
onSelected: (v) => ref.read(calendarIncludePaidProvider.notifier).state = v,
|
||||
onSelected: (v) =>
|
||||
ref.read(calendarIncludePaidProvider.notifier).state = v,
|
||||
),
|
||||
],
|
||||
);
|
||||
@@ -130,7 +133,11 @@ class _Totals extends StatelessWidget {
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Icon(Icons.info_outline, size: 16, color: basisColor('history')),
|
||||
Icon(
|
||||
Icons.info_outline,
|
||||
size: 16,
|
||||
color: basisColor('history'),
|
||||
),
|
||||
const SizedBox(width: 6),
|
||||
Expanded(
|
||||
child: Text(
|
||||
@@ -164,7 +171,11 @@ class _BasisTotal extends StatelessWidget {
|
||||
children: [
|
||||
BasisChip(basis: basis),
|
||||
const SizedBox(height: 4),
|
||||
MoneyText(amount, currency: 'RUB', style: Theme.of(context).textTheme.titleSmall),
|
||||
MoneyText(
|
||||
amount,
|
||||
currency: 'RUB',
|
||||
style: Theme.of(context).textTheme.titleSmall,
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
@@ -240,7 +251,11 @@ class _EntryRow extends StatelessWidget {
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
if (entry.amount != null)
|
||||
MoneyText(entry.amount!, currency: entry.currency, style: theme.textTheme.titleSmall),
|
||||
MoneyText(
|
||||
entry.amount!,
|
||||
currency: entry.currency,
|
||||
style: theme.textTheme.titleSmall,
|
||||
),
|
||||
// no FX rate for the date ⇒ no rouble figure. An em dash, never 0 ₽.
|
||||
if (entry.currency != 'RUB')
|
||||
Text(
|
||||
@@ -257,7 +272,9 @@ class _EntryRow extends StatelessWidget {
|
||||
|
||||
/// Groups entries by month, preserving the server's order inside each month. Entries with
|
||||
/// no date go last, under their own heading — they are still expected money.
|
||||
List<MapEntry<DateTime, List<IncomeEntry>>> _groupByMonth(List<IncomeEntry> entries) {
|
||||
List<MapEntry<DateTime, List<IncomeEntry>>> _groupByMonth(
|
||||
List<IncomeEntry> entries,
|
||||
) {
|
||||
final groups = <DateTime, List<IncomeEntry>>{};
|
||||
for (final e in entries) {
|
||||
final d = e.expectedDate;
|
||||
@@ -272,5 +289,8 @@ List<MapEntry<DateTime, List<IncomeEntry>>> _groupByMonth(List<IncomeEntry> entr
|
||||
List<String> _orderedBases(Iterable<String> bases) {
|
||||
const order = ['schedule', 'announced', 'history', 'paid'];
|
||||
final set = bases.toSet();
|
||||
return [...order.where(set.contains), ...set.where((b) => !order.contains(b))];
|
||||
return [
|
||||
...order.where(set.contains),
|
||||
...set.where((b) => !order.contains(b)),
|
||||
];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user