Show exact entity target in sync repair route
This commit is contained in:
@@ -33,6 +33,7 @@ Added direct repair navigation from rejected sync items:
|
|||||||
- `giftIdea`/`eventIdea` -> Ideas
|
- `giftIdea`/`eventIdea` -> Ideas
|
||||||
- `reminderRule` -> Reminders
|
- `reminderRule` -> Reminders
|
||||||
- keeps existing payload inspect + requeue/dismiss actions
|
- keeps existing payload inspect + requeue/dismiss actions
|
||||||
|
- opened repair screen now shows exact `entityType:entityId` focus banner
|
||||||
|
|
||||||
Validation for this milestone:
|
Validation for this milestone:
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
import 'package:relationship_saver/core/config/app_theme.dart';
|
import 'package:relationship_saver/core/config/app_theme.dart';
|
||||||
import 'package:relationship_saver/features/ideas/ideas_view.dart';
|
import 'package:relationship_saver/features/ideas/ideas_view.dart';
|
||||||
@@ -525,6 +526,8 @@ class _SyncViewState extends ConsumerState<SyncView> {
|
|||||||
MaterialPageRoute<void>(
|
MaterialPageRoute<void>(
|
||||||
builder: (BuildContext context) => _EntityResolveScreen(
|
builder: (BuildContext context) => _EntityResolveScreen(
|
||||||
title: _titleForEntityType(matched.entityType),
|
title: _titleForEntityType(matched.entityType),
|
||||||
|
entityType: matched.entityType,
|
||||||
|
entityId: matched.entityId,
|
||||||
child: view,
|
child: view,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -565,16 +568,54 @@ class _SyncViewState extends ConsumerState<SyncView> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _EntityResolveScreen extends StatelessWidget {
|
class _EntityResolveScreen extends StatelessWidget {
|
||||||
const _EntityResolveScreen({required this.title, required this.child});
|
const _EntityResolveScreen({
|
||||||
|
required this.title,
|
||||||
|
required this.entityType,
|
||||||
|
required this.entityId,
|
||||||
|
required this.child,
|
||||||
|
});
|
||||||
|
|
||||||
final String title;
|
final String title;
|
||||||
|
final String entityType;
|
||||||
|
final String entityId;
|
||||||
final Widget child;
|
final Widget child;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(title: Text(title)),
|
appBar: AppBar(title: Text(title)),
|
||||||
body: child,
|
body: Column(
|
||||||
|
children: <Widget>[
|
||||||
|
Container(
|
||||||
|
width: double.infinity,
|
||||||
|
padding: const EdgeInsets.fromLTRB(16, 12, 16, 12),
|
||||||
|
color: const Color(0xFFEAF7FB),
|
||||||
|
child: Wrap(
|
||||||
|
spacing: 8,
|
||||||
|
runSpacing: 8,
|
||||||
|
crossAxisAlignment: WrapCrossAlignment.center,
|
||||||
|
children: <Widget>[
|
||||||
|
Text('Focus: $entityType:$entityId'),
|
||||||
|
TextButton.icon(
|
||||||
|
onPressed: () async {
|
||||||
|
await Clipboard.setData(
|
||||||
|
ClipboardData(text: '$entityType:$entityId'),
|
||||||
|
);
|
||||||
|
if (context.mounted) {
|
||||||
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
|
const SnackBar(content: Text('Entity ID copied.')),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
icon: const Icon(Icons.copy_rounded),
|
||||||
|
label: const Text('Copy'),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Expanded(child: child),
|
||||||
|
],
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user