Files
MobilApp/lib/pages/measured_data/presentation/views/measured_data_view.dart
T
gitea_admin e801090e90
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6s
Felvételek képének megjelenítése a Mérés menüpontbam
2026-09-09 02:05:10 +02:00

124 lines
4.3 KiB
Dart

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:terepi_seged/models/measured_record.dart';
import 'package:terepi_seged/pages/measured_data/presentation/controllers/measured_data_controller.dart';
import 'package:terepi_seged/services/project_service.dart';
class MeasuredDataView extends GetView<MeasuredDataController> {
const MeasuredDataView({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Obx(() => Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
const Text('Mérési adatok'),
Text(
ProjectService.to.activeProject.value?.name ?? '',
style: const TextStyle(fontSize: 12.0),
),
],
)),
),
body: Column(
children: [
Padding(
padding: const EdgeInsets.all(12),
child: Row(
children: [
Expanded(
flex: 2,
child: TextField(
decoration: const InputDecoration(
prefixIcon: Icon(Icons.search),
hintText: 'FFID / forráspont / vonal…',
border: OutlineInputBorder(),
isDense: true,
),
onChanged: controller.onSearchChanged,
),
),
const SizedBox(width: 8),
Expanded(
child: Obx(() => DropdownButtonFormField<double?>(
value: controller.lineFilter.value,
isExpanded: true,
decoration: const InputDecoration(
labelText: 'Vonal', isDense: true),
items: [
const DropdownMenuItem(
value: null, child: Text('Mind')),
...controller.availableLines.map((l) =>
DropdownMenuItem(
value: l, child: Text(_fmtNum(l)))),
],
onChanged: controller.setLineFilter,
)),
),
],
),
),
Expanded(
child: Obx(() {
if (controller.isLoading.value) {
return const Center(child: CircularProgressIndicator());
}
final list = controller.filteredRecords;
if (list.isEmpty) {
return const Center(child: Text('Nincs mérési adat.'));
}
return ListView.builder(
itemCount: list.length,
itemBuilder: (context, i) => _RecordTile(record: list[i]),
);
}),
),
],
),
);
}
}
String _fmtNum(double v) =>
v == v.roundToDouble() ? v.toInt().toString() : v.toString();
String _fmtDate(DateTime dt) {
final local = dt.toLocal();
String two(int n) => n.toString().padLeft(2, '0');
return '${local.year}.${two(local.month)}.${two(local.day)} '
'${two(local.hour)}:${two(local.minute)}:${two(local.second)}';
}
class _RecordTile extends StatelessWidget {
final MeasuredRecord record;
const _RecordTile({required this.record});
@override
Widget build(BuildContext context) {
final hasImage = record.hasImage;
return ListTile(
title: Text(
'FFID ${record.ffid ?? "—"} · VP '
'${record.sourcePointNumber != null ? _fmtNum(record.sourcePointNumber!) : "—"}',
style: const TextStyle(fontWeight: FontWeight.w600),
),
subtitle: Text(
'Vonal ${record.sourceLineNumber != null ? _fmtNum(record.sourceLineNumber!) : "—"}'
'${record.geophoneRange != null ? " · Geofon ${record.geophoneRange}" : ""}'
'\n${_fmtDate(record.measuredAt)}',
),
isThreeLine: true,
trailing: Icon(
hasImage ? Icons.image_outlined : Icons.image_not_supported_outlined,
color: hasImage ? null : Colors.grey.shade400,
),
onTap: hasImage
? () => MeasuredDataController.to.showSeismicImage(record)
: null,
);
}
}