Kontaktok listázási hibájának javítása, csv export
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:path/path.dart' as p;
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:share_plus/share_plus.dart';
|
||||
|
||||
import '../models/contact.dart';
|
||||
|
||||
/// Kapcsolatok CSV-export — a kitűzési jegyzőkönyv-exporttal azonos elvek.
|
||||
///
|
||||
/// Két dialektus:
|
||||
/// * MAGYAR (Excel-barát): pontosvessző elválasztó, UTF-8 BOM-mal
|
||||
/// (enélkül az Excel elrontja az ékezeteket)
|
||||
/// * NEMZETKÖZI: vessző elválasztó
|
||||
///
|
||||
/// Mivel a lista már projekthez szűrt (ContactsController.filtered), az
|
||||
/// export mindig a JELENLEG LÁTOTT (kereséssel/projekttel szűrt) sorokat
|
||||
/// menti — amit a képernyőn látsz, azt kapod a fájlban is.
|
||||
class ContactExportService {
|
||||
ContactExportService._();
|
||||
|
||||
static Future<void> exportAndShare({
|
||||
required List<Contact> contacts,
|
||||
required bool hungarian,
|
||||
String projectName = '',
|
||||
}) async {
|
||||
if (contacts.isEmpty) {
|
||||
throw StateError('Nincs exportálható kapcsolat.');
|
||||
}
|
||||
|
||||
final rows = List<Contact>.from(contacts)
|
||||
..sort((a, b) => a.name.toLowerCase().compareTo(b.name.toLowerCase()));
|
||||
|
||||
final sep = hungarian ? ';' : ',';
|
||||
|
||||
String txt(String s) {
|
||||
final v = s.trim();
|
||||
return v.contains(sep) || v.contains('"') || v.contains('\n')
|
||||
? '"${v.replaceAll('"', '""')}"'
|
||||
: v;
|
||||
}
|
||||
|
||||
final header = ['Nev', 'Cim', 'Telefon', 'Email', 'Megjegyzes'].join(sep);
|
||||
|
||||
final sb = StringBuffer();
|
||||
sb.write('\uFEFF'); // UTF-8 BOM — az Excel enélkül elrontja az ékezeteket
|
||||
sb.writeln(header);
|
||||
for (final c in rows) {
|
||||
sb.writeln([
|
||||
txt(c.name),
|
||||
txt(c.address),
|
||||
txt(c.phone),
|
||||
txt(c.email),
|
||||
txt(c.note),
|
||||
].join(sep));
|
||||
}
|
||||
|
||||
final dir = await getTemporaryDirectory();
|
||||
final stamp = DateTime.now()
|
||||
.toIso8601String()
|
||||
.substring(0, 16)
|
||||
.replaceAll(':', '')
|
||||
.replaceAll('-', '')
|
||||
.replaceAll('T', '_');
|
||||
final safeName = projectName.isEmpty
|
||||
? 'kapcsolatok'
|
||||
: 'kapcsolatok_${projectName.replaceAll(RegExp(r'[^\w\-]'), '_')}';
|
||||
final path = p.join(dir.path, '${safeName}_$stamp.csv');
|
||||
await File(path).writeAsString(sb.toString(), flush: true);
|
||||
|
||||
await SharePlus.instance.share(ShareParams(
|
||||
files: [XFile(path, mimeType: 'text/csv')],
|
||||
subject: 'Kapcsolatok — $projectName',
|
||||
text: '${rows.length} kapcsolat',
|
||||
));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user