enhanced the restore button logic

This commit is contained in:
Vaibhav Surve 2025-10-10 20:01:16 +05:30
parent 16e2f5a4f3
commit e8acfe10d9

View File

@ -197,185 +197,192 @@ class NotesView extends StatelessWidget {
)
: null;
return AnimatedOpacity(
duration: const Duration(milliseconds: 200),
opacity: note.isActive ? 1.0 : 0.6,
child: IgnorePointer(
ignoring: !note.isActive,
ignoringSemantics: false,
child: AnimatedContainer(
duration: const Duration(milliseconds: 250),
padding: MySpacing.xy(12, 12),
decoration: BoxDecoration(
color: isEditing
? Colors.indigo[50]
: note.isActive
? Colors.white
: Colors.grey.shade100,
border: Border.all(
color: note.isActive
? (isEditing
? Colors.indigo
: Colors.grey.shade300)
: Colors.grey.shade400,
width: 1.1,
),
borderRadius: BorderRadius.circular(5),
boxShadow: const [
BoxShadow(
color: Colors.black12,
blurRadius: 4,
offset: Offset(0, 2),
),
],
return AnimatedContainer(
duration: const Duration(milliseconds: 250),
padding: MySpacing.xy(12, 12),
decoration: BoxDecoration(
color: isEditing
? Colors.indigo[50]
: note.isActive
? Colors.white
: Colors.grey.shade100,
border: Border.all(
color: note.isActive
? (isEditing
? Colors.indigo
: Colors.grey.shade300)
: Colors.grey.shade400,
width: 1.1,
),
borderRadius: BorderRadius.circular(5),
boxShadow: const [
BoxShadow(
color: Colors.black12,
blurRadius: 4,
offset: Offset(0, 2),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
/// Header
Row(
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Header & Note content (fade them if inactive)
AnimatedOpacity(
duration: const Duration(milliseconds: 200),
opacity: note.isActive ? 1.0 : 0.6,
child: IgnorePointer(
ignoring: !note.isActive,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Avatar(
firstName: initials,
lastName: '',
size: 40),
MySpacing.width(12),
Expanded(
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
MyText.titleSmall(
"${note.contactName} (${note.organizationName})",
fontWeight: 600,
overflow: TextOverflow.ellipsis,
color: Colors.indigo[800],
),
MyText.bodySmall(
"by ${note.createdBy.firstName}$createdDate, $createdTime",
color: Colors.grey[600],
),
],
),
),
],
),
MySpacing.height(12),
if (isEditing && quillController != null)
CommentEditorCard(
controller: quillController,
onCancel: () =>
controller.editingNoteId.value = null,
onSave: (quillCtrl) async {
final delta = quillCtrl.document.toDelta();
final htmlOutput =
_convertDeltaToHtml(delta);
final updated =
note.copyWith(note: htmlOutput);
await controller.updateNote(updated);
controller.editingNoteId.value = null;
},
)
else
html.Html(
data: note.note,
style: {
"body": html.Style(
margin: html.Margins.zero,
padding: html.HtmlPaddings.zero,
fontSize: html.FontSize.medium,
color: Colors.black87,
),
},
),
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
if (note.isActive) ...[
Row(
children: [
IconButton(
icon: Icon(
isEditing
? Icons.close
: Icons.edit,
color: Colors.indigo,
size: 20,
),
padding: EdgeInsets.all(
2),
constraints: const BoxConstraints(),
onPressed: () {
controller.editingNoteId.value =
isEditing ? null : note.id;
},
),
IconButton(
icon: const Icon(
Icons.delete_outline,
color: Colors.redAccent,
size: 20,
),
padding: EdgeInsets.all(2),
constraints: const BoxConstraints(),
onPressed: () async {
await Get.dialog(
ConfirmDialog(
title: "Delete Note",
message:
"Are you sure you want to delete this note?",
confirmText: "Delete",
confirmColor: Colors.redAccent,
icon: Icons.delete_forever,
onConfirm: () async {
await controller
.restoreOrDeleteNote(note,
restore: false);
},
),
barrierDismissible: false,
);
},
),
],
),
],
if (!note.isActive)
IconButton(
icon: const Icon(
Icons.restore,
color: Colors.green,
size: 22,
Row(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Avatar(
firstName: initials,
lastName: '',
size: 40,
backgroundColor: note.isActive
? null
: Colors.grey.shade400,
),
tooltip: "Restore",
padding: EdgeInsets.zero,
onPressed: () async {
await Get.dialog(
ConfirmDialog(
title: "Restore Note",
message:
"Are you sure you want to restore this note?",
confirmText: "Restore",
confirmColor: Colors.green,
icon: Icons.restore,
onConfirm: () async {
await controller
.restoreOrDeleteNote(note,
restore: true);
},
),
barrierDismissible: false,
);
MySpacing.width(12),
Expanded(
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
MyText.titleSmall(
"${note.contactName} (${note.organizationName})",
fontWeight: 600,
overflow: TextOverflow.ellipsis,
color: note.isActive
? Colors.indigo[800]
: Colors.grey,
),
MyText.bodySmall(
"by ${note.createdBy.firstName}$createdDate, $createdTime",
color: note.isActive
? Colors.grey[600]
: Colors.grey,
),
],
),
),
],
),
MySpacing.height(12),
if (isEditing && quillController != null)
CommentEditorCard(
controller: quillController,
onCancel: () =>
controller.editingNoteId.value = null,
onSave: (quillCtrl) async {
final delta =
quillCtrl.document.toDelta();
final htmlOutput =
_convertDeltaToHtml(delta);
final updated =
note.copyWith(note: htmlOutput);
await controller.updateNote(updated);
controller.editingNoteId.value = null;
},
)
else
html.Html(
data: note.note,
style: {
"body": html.Style(
margin: html.Margins.zero,
padding: html.HtmlPaddings.zero,
fontSize: html.FontSize.medium,
color: note.isActive
? Colors.black87
: Colors.grey,
),
},
),
],
),
),
),
// Action buttons (always fully visible)
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
if (note.isActive) ...[
IconButton(
icon: Icon(
isEditing ? Icons.close : Icons.edit,
color: Colors.indigo,
size: 20,
),
padding: EdgeInsets.all(2),
constraints: const BoxConstraints(),
onPressed: () {
controller.editingNoteId.value =
isEditing ? null : note.id;
},
),
IconButton(
icon: const Icon(
Icons.delete_outline,
color: Colors.redAccent,
size: 20,
),
constraints: const BoxConstraints(),
onPressed: () async {
await Get.dialog(
ConfirmDialog(
title: "Delete Note",
message:
"Are you sure you want to delete this note?",
confirmText: "Delete",
confirmColor: Colors.redAccent,
icon: Icons.delete_forever,
onConfirm: () async {
await controller.restoreOrDeleteNote(
note,
restore: false);
},
),
barrierDismissible: false,
);
},
),
],
if (!note.isActive)
IconButton(
icon: const Icon(
Icons.restore,
color: Colors.green,
size: 22,
),
tooltip: "Restore",
onPressed: () async {
await Get.dialog(
ConfirmDialog(
title: "Restore Note",
message:
"Are you sure you want to restore this note?",
confirmText: "Restore",
confirmColor: Colors.green,
icon: Icons.restore,
onConfirm: () async {
await controller.restoreOrDeleteNote(
note,
restore: true);
},
),
barrierDismissible: false,
);
},
),
],
),
),
],
),
);
});