- Adds new localization keys for transaction details. - Deletes obsolete localization files, switching to a single ARB file per language. - Adds `Equatable` to data models (`Category`, `Tag`, `TransactionRecord`, `User`) for improved state management and change detection. - Introduces the transaction creation dialog. - Adds development note to GEMINI.md Improves internationalization and data models - Adds new localization keys for transaction details, supporting enhanced user experience. - Migrates to single ARB file for each language, streamlining the localization process. - Implements Equatable in data models (Category, Tag, TransactionRecord, User) for improved state management and simplified change detection. - Introduces transaction creation dialog, simplifying the transaction creation process. - Adds development note to GEMINI.md
107 lines
4.1 KiB
Dart
107 lines
4.1 KiB
Dart
import 'package:equatable/equatable.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:hive_ce/hive.dart';
|
|
import '../utils/id_generator.dart';
|
|
|
|
part 'category.g.dart';
|
|
|
|
@HiveType(typeId: 1000)
|
|
|
|
/// Модель категории для группировки транзакций
|
|
/// Содержит основные параметры для визуализации и классификации
|
|
class Category extends Equatable {
|
|
/// Уникальный идентификатор категории
|
|
@HiveField(0)
|
|
final String id;
|
|
|
|
@HiveField(1)
|
|
/// Название категории (например: "Еда", "Транспорт")
|
|
final String name;
|
|
|
|
@HiveField(2)
|
|
/// Цвет категории для визуального выделения
|
|
final Color color;
|
|
|
|
@HiveField(3)
|
|
/// Иконка категории для быстрой визуальной идентификации
|
|
final IconData icon;
|
|
|
|
@HiveField(4)
|
|
/// Флаг указывающий тип операции:
|
|
/// true - доход (например зарплата)
|
|
/// false - расход (например покупки)
|
|
final bool isIncome;
|
|
|
|
@HiveField(5)
|
|
/// Идентификатор пользователя, которому принадлежит эта категория
|
|
/// Это позволяет разделять категории между разными пользователями
|
|
final String userId;
|
|
|
|
@HiveField(6)
|
|
/// Дата и время последнего обновления объекта
|
|
final DateTime updatedAt;
|
|
|
|
/// Конструктор с обязательными параметрами
|
|
Category({
|
|
String? id,
|
|
required this.name,
|
|
required this.color,
|
|
required this.icon,
|
|
required this.isIncome,
|
|
required this.userId, // Теперь userId обязательный параметр
|
|
DateTime? updatedAt, // Добавлено поле updatedAt, теперь необязательное
|
|
}) : id = id ?? IdGenerator.generateId(),
|
|
updatedAt = updatedAt ?? DateTime.now(); // Устанавливаем текущее время по умолчанию
|
|
|
|
/// Метод для преобразования объекта в Map (полезно для работы с БД)
|
|
Map<String, dynamic> toMap() {
|
|
return {
|
|
'id': id,
|
|
'name': name,
|
|
'color': color.toARGB32(), // Сохраняем только значение цвета
|
|
'icon': icon.codePoint,
|
|
'isIncome': isIncome,
|
|
'userId': userId, // Добавляем userId в Map
|
|
'updatedAt': updatedAt.toIso8601String(), // Добавлено updatedAt в Map
|
|
};
|
|
}
|
|
|
|
/// Фабричный метод для создания объекта из Map (например из БД)
|
|
factory Category.fromMap(Map<String, dynamic> map) {
|
|
return Category(
|
|
id: map['id'],
|
|
name: map['name'],
|
|
color: Color(map['color']),
|
|
icon: IconData(map['icon'], fontFamily: 'MaterialIcons'),
|
|
isIncome: map['isIncome'],
|
|
userId: map['userId'], // Добавляем userId при создании из Map
|
|
updatedAt: DateTime.parse(map['updatedAt']), // Добавлено updatedAt при создании из Map
|
|
);
|
|
}
|
|
|
|
/// Метод для создания копии объекта с возможностью изменения полей
|
|
Category copyWith({
|
|
String? id,
|
|
String? name,
|
|
Color? color,
|
|
IconData? icon,
|
|
bool? isIncome,
|
|
String? userId,
|
|
}) {
|
|
return Category(
|
|
id: id ?? this.id,
|
|
name: name ?? this.name,
|
|
color: color ?? this.color,
|
|
icon: icon ?? this.icon,
|
|
isIncome: isIncome ?? this.isIncome,
|
|
userId: userId ?? this.userId,
|
|
updatedAt: DateTime.now(), // Обновляем updatedAt при каждом копировании
|
|
);
|
|
}
|
|
|
|
// Используем Equatable для сравнения объектов по их свойствам.
|
|
// В данном случае, мы считаем категории уникальными по их 'id'.
|
|
@override
|
|
List<Object?> get props => [id];
|
|
}
|