cashumit/lib/utils/app_text_styles.dart

35 lines
940 B
Dart
Raw Normal View History

feat: multi-grup sumber, batch send, & perbaikan tip Multi-Grup Sumber & UI: - Model ReceiptGroup: satu struk bisa punya banyak grup sumber ( revenue) - Tombol "Tambah Sumber" dengan dashed border (max 10 grup) - Hapus label "Dari:" di SourceAccountSelector (chip saja) - Default 1 grup kosong di ReceiptProvider constructor & _resetState Akun Tujuan ke Config: - Pindah DestinationAccountSelector dari receipt body ke Config screen - Persist & load via SharedPreferences (permanen, tidak di-reset) - Dropdown auto-load dari cache/mirror saat buka Config - Tombol "Sinkronisasi Manual" sekarang simpan ke mirror & refresh dropdown Batch Send via SubmissionTask: - Model SubmissionTask: konteks per-grup (group/tip + destination + date) - TransactionSubmissionDialog refactor: terima List<SubmissionTask> - Helper buildTasksFromReceipt & buildTasksFromAllUnsubmittedReceipts - LocalReceiptsScreen: tombol "Kirim Semua Nota" + post-process status Bug Fix: - copyWith sentinel pattern: field nullable (tipSourceAccount, destinationAccount, fireflyUrl, accessToken) kini bisa di-set ke null - Tip dapat dibersihkan dengan "Batal Tip" & reset antar transaksi - Hapus tombol "Muat Akun" (redundan dgn Sinkronisasi Manual) Lainnya: - Date picker untuk tanggal transaksi - Font courier prime caching via CourierStyles - Perf: compute() untuk decode image, cancel stream bluetooth, fix rebuild loop - External link: <queries> AndroidManifest + skip canLaunchUrl - Layout cetak: hapus Ke:, sederhanakan separator grup, hapus TIP: TIDAK - Hapus TransactionLinksScreen, ganti inline copy/open di popup
2026-06-27 20:18:51 +07:00
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
/// Cache TextStyle courier prime agar tidak dibuat ulang tiap rebuild.
/// Dipakai bersama oleh semua widget struk untuk konsistensi tema.
class CourierStyles {
static TextStyle? _base;
static TextStyle? _bold;
static TextStyle get base {
if (_base != null) return _base!;
try {
_base = GoogleFonts.courierPrime(
textStyle: const TextStyle(fontSize: 14, height: 1.2),
);
} catch (_) {
_base = const TextStyle(
fontFamily: 'CourierPrime, Courier, monospace',
fontSize: 14,
height: 1.2,
);
}
return _base!;
}
static TextStyle get bold {
if (_bold != null) return _bold!;
_bold = base.copyWith(fontWeight: FontWeight.bold);
return _bold!;
}
/// Variabel ukuran lebih besar untuk total.
static TextStyle get big => bold.copyWith(fontSize: 16);
}