From e8acfe10d98fc22edd5fb42a452406c85ea0a8a4 Mon Sep 17 00:00:00 2001 From: Vaibhav Surve Date: Fri, 10 Oct 2025 20:01:16 +0530 Subject: [PATCH] enhanced the restore button logic --- lib/view/directory/notes_view.dart | 345 +++++++++++++++-------------- 1 file changed, 176 insertions(+), 169 deletions(-) diff --git a/lib/view/directory/notes_view.dart b/lib/view/directory/notes_view.dart index 272d4e0..fa65804 100644 --- a/lib/view/directory/notes_view.dart +++ b/lib/view/directory/notes_view.dart @@ -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, + ); + }, + ), ], ), - ), + ], ), ); });