From 43aeec4c6fe1d8ea6d1eb87a17a4910cc35ea16e Mon Sep 17 00:00:00 2001 From: Vaibhav Surve Date: Mon, 7 Jul 2025 13:57:20 +0530 Subject: [PATCH] feat(directory): integrate NotesController in DirectoryMainScreen and improve code formatting in NotesView --- lib/view/directory/directory_main_screen.dart | 13 +- lib/view/directory/notes_view.dart | 207 ++++++++++-------- 2 files changed, 121 insertions(+), 99 deletions(-) diff --git a/lib/view/directory/directory_main_screen.dart b/lib/view/directory/directory_main_screen.dart index cdc02b7..d66f39a 100644 --- a/lib/view/directory/directory_main_screen.dart +++ b/lib/view/directory/directory_main_screen.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:marco/controller/directory/directory_controller.dart'; +import 'package:marco/controller/directory/notes_controller.dart'; import 'package:marco/controller/project_controller.dart'; import 'package:marco/helpers/widgets/my_spacing.dart'; import 'package:marco/helpers/widgets/my_text.dart'; @@ -13,6 +14,7 @@ class DirectoryMainScreen extends StatelessWidget { DirectoryMainScreen({super.key}); final DirectoryController controller = Get.put(DirectoryController()); + final NotesController notesController = Get.put(NotesController()); @override Widget build(BuildContext context) { @@ -49,9 +51,9 @@ class DirectoryMainScreen extends StatelessWidget { MySpacing.height(2), GetBuilder( builder: (projectController) { - final projectName = projectController - .selectedProject?.name ?? - 'Select Project'; + final projectName = + projectController.selectedProject?.name ?? + 'Select Project'; return Row( children: [ const Icon(Icons.work_outline, @@ -111,9 +113,8 @@ class DirectoryMainScreen extends StatelessWidget { // Main View Expanded( - child: Obx(() => controller.isNotesView.value - ? NotesView() - : DirectoryView()), + child: Obx(() => + controller.isNotesView.value ? NotesView() : DirectoryView()), ), ], ), diff --git a/lib/view/directory/notes_view.dart b/lib/view/directory/notes_view.dart index ffe2997..c4f56c3 100644 --- a/lib/view/directory/notes_view.dart +++ b/lib/view/directory/notes_view.dart @@ -87,7 +87,8 @@ class NotesView extends StatelessWidget { onChanged: (value) => controller.searchQuery.value = value, decoration: InputDecoration( contentPadding: const EdgeInsets.symmetric(horizontal: 6), - prefixIcon: const Icon(Icons.search, size: 20, color: Colors.grey), + prefixIcon: const Icon(Icons.search, + size: 20, color: Colors.grey), hintText: 'Search notes...', filled: true, fillColor: Colors.white, @@ -136,7 +137,8 @@ class NotesView extends StatelessWidget { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - const Icon(Icons.note_alt_outlined, size: 60, color: Colors.grey), + const Icon(Icons.note_alt_outlined, + size: 60, color: Colors.grey), const SizedBox(height: 12), MyText.bodyMedium('No notes found.', fontWeight: 500), ], @@ -150,106 +152,125 @@ class NotesView extends StatelessWidget { separatorBuilder: (_, __) => MySpacing.height(12), itemBuilder: (_, index) { final note = notes[index]; - final isEditing = controller.editingNoteId.value == note.id; - final initials = note.contactName.trim().isNotEmpty - ? note.contactName.trim().split(' ').map((e) => e[0]).take(2).join().toUpperCase() - : "NA"; + return Obx(() { + final isEditing = controller.editingNoteId.value == note.id; - final createdDate = DateTimeUtils.convertUtcToLocal(note.createdAt.toString(), format: 'dd MMM yyyy'); - final createdTime = DateTimeUtils.convertUtcToLocal(note.createdAt.toString(), format: 'hh:mm a'); + final initials = note.contactName.trim().isNotEmpty + ? note.contactName + .trim() + .split(' ') + .map((e) => e[0]) + .take(2) + .join() + .toUpperCase() + : "NA"; - final decodedDelta = HtmlToDelta().convert(note.note); - final quillController = isEditing - ? quill.QuillController( - document: quill.Document.fromDelta(decodedDelta), - selection: TextSelection.collapsed(offset: decodedDelta.length), - ) - : null; + final createdDate = DateTimeUtils.convertUtcToLocal( + note.createdAt.toString(), + format: 'dd MMM yyyy'); + final createdTime = DateTimeUtils.convertUtcToLocal( + note.createdAt.toString(), + format: 'hh:mm a'); - return AnimatedContainer( - duration: const Duration(milliseconds: 250), - padding: MySpacing.xy(12, 12), - decoration: BoxDecoration( - color: isEditing ? Colors.indigo[50] : Colors.white, - border: Border.all( - color: isEditing ? Colors.indigo : Colors.grey.shade300, - width: 1.1, + final decodedDelta = HtmlToDelta().convert(note.note); + final quillController = isEditing + ? quill.QuillController( + document: quill.Document.fromDelta(decodedDelta), + selection: TextSelection.collapsed( + offset: decodedDelta.length), + ) + : null; + + return AnimatedContainer( + duration: const Duration(milliseconds: 250), + padding: MySpacing.xy(12, 12), + decoration: BoxDecoration( + color: isEditing ? Colors.indigo[50] : Colors.white, + border: Border.all( + color: isEditing ? Colors.indigo : Colors.grey.shade300, + width: 1.1, + ), + borderRadius: BorderRadius.circular(12), + boxShadow: const [ + BoxShadow( + color: Colors.black12, + blurRadius: 4, + offset: Offset(0, 2)), + ], ), - borderRadius: BorderRadius.circular(12), - boxShadow: const [ - BoxShadow(color: Colors.black12, blurRadius: 4, offset: Offset(0, 2)), - ], - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - /// Header Row - Row( - 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], - ), - ], + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + /// Header Row + Row( + 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], + ), + ], + ), ), - ), - IconButton( - icon: Icon( - isEditing ? Icons.close : Icons.edit, - color: Colors.indigo, - size: 20, + IconButton( + icon: Icon( + isEditing ? Icons.close : Icons.edit, + color: Colors.indigo, + size: 20, + ), + onPressed: () { + controller.editingNoteId.value = + isEditing ? null : note.id; + }, ), - onPressed: () { - controller.editingNoteId.value = isEditing ? null : note.id; + ], + ), + + MySpacing.height(12), + + /// Content + 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, + ), }, ), - ], - ), - - MySpacing.height(12), - - /// Content - 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, - ), - }, - ), - ], - ), - ); + ], + ), + ); + }); }, ); }),