diff --git a/assets/langs/en.yaml b/assets/langs/en.yaml
index 2ef014b4..cf47d755 100644
--- a/assets/langs/en.yaml
+++ b/assets/langs/en.yaml
@@ -73,4 +73,13 @@ widgets:
empty: Please enter a name
exists: Already Exists
contains: Cannot contain /
+ backlinks:
+ title:
+ zero: ""
+ one: "{} Note links to this Note"
+ many: "{} Notes link to this Note"
+ two: "{} Notes link to this Note"
+ few: "{} Notes link to this Note"
+ other: "{} Notes link to this Note"
+
rootFolder: Root Folder
diff --git a/lib/core/note.dart b/lib/core/note.dart
index 8b03f6be..f8db3eca 100644
--- a/lib/core/note.dart
+++ b/lib/core/note.dart
@@ -406,6 +406,10 @@ class Note with NotesNotifier {
_links = links;
return links;
}
+
+ List links() {
+ return _links;
+ }
}
String buildTitleFileName(String parentDir, String title) {
diff --git a/lib/widgets/note_viewer.dart b/lib/widgets/note_viewer.dart
index 493edb3c..4d3516ca 100644
--- a/lib/widgets/note_viewer.dart
+++ b/lib/widgets/note_viewer.dart
@@ -76,6 +76,7 @@ class NoteViewer extends StatelessWidget {
url, note.parent.folderPath + p.separator, null, null),
),
),
+ const SizedBox(height: 16.0),
NoteBacklinkRenderer(note: note, rootFolder: rootFolder),
// _buildFooter(context),
],
diff --git a/lib/widgets/notes_backlinks.dart b/lib/widgets/notes_backlinks.dart
index 0abe16fa..9b255d8f 100644
--- a/lib/widgets/notes_backlinks.dart
+++ b/lib/widgets/notes_backlinks.dart
@@ -1,3 +1,4 @@
+import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:gitjournal/folder_views/common.dart';
@@ -51,49 +52,110 @@ class _NoteBacklinkRendererState extends State {
return Container();
}
+ var title = widget.note.title;
+ if (title.isEmpty) {
+ title = widget.note.fileName;
+ }
+
+ var num = linkedNotes.length;
var textTheme = Theme.of(context).textTheme;
var c = Column(
children: [
- Text('BackLinks', style: textTheme.headline5),
+ Text(
+ plural("widgets.backlinks.title", num),
+ style: textTheme.headline6,
+ ),
const SizedBox(height: 8.0),
- for (var n in linkedNotes)
- NoteSnippet(n, () {
- openNoteEditor(context, n);
- }),
+ for (var note in linkedNotes)
+ NoteSnippet(
+ note: note,
+ parentNote: widget.note,
+ onTap: () {
+ openNoteEditor(context, note);
+ },
+ ),
],
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
);
- return Padding(
- padding: const EdgeInsets.fromLTRB(0.0, 16.0, 0.0, 16.0),
- child: c,
+ var backgroundColor = Colors.grey[200];
+ if (Theme.of(context).brightness == Brightness.dark) {
+ backgroundColor = Theme.of(context).backgroundColor;
+ }
+ return Container(
+ color: backgroundColor,
+ width: MediaQuery.of(context).size.width,
+ child: Padding(
+ padding: const EdgeInsets.fromLTRB(16.0, 16.0, 16.0, 16.0),
+ child: c,
+ ),
);
}
}
class NoteSnippet extends StatelessWidget {
final Note note;
+ final Note parentNote;
final Function onTap;
- NoteSnippet(this.note, this.onTap);
+ NoteSnippet({
+ @required this.note,
+ @required this.parentNote,
+ @required this.onTap,
+ });
@override
Widget build(BuildContext context) {
- var textTheme = Theme.of(context).textTheme;
+ var theme = Theme.of(context);
+ var textTheme = theme.textTheme;
var title = note.title;
if (title.isEmpty) {
title = note.fileName;
}
return Padding(
- padding: const EdgeInsets.fromLTRB(0.0, 8.0, 0, 8.0),
- child: GestureDetector(
- onTap: () {
- openNoteEditor(context, note);
- },
- child: Text('- $title', style: textTheme.bodyText1),
+ padding: const EdgeInsets.fromLTRB(0.0, 8.0, 0.0, 8.0),
+ child: Container(
+ color: theme.scaffoldBackgroundColor,
+ width: MediaQuery.of(context).size.width,
+ child: GestureDetector(
+ onTap: () {
+ openNoteEditor(context, note);
+ },
+ child: Column(
+ children: [
+ Text('$title', style: textTheme.bodyText1),
+ const SizedBox(height: 8.0),
+ _buildSummary(context),
+ ],
+ mainAxisAlignment: MainAxisAlignment.start,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ ),
+ ),
),
);
}
+
+ Widget _buildSummary(BuildContext context) {
+ var textTheme = Theme.of(context).textTheme;
+ var links = note.links();
+ if (links == null) {
+ return Container();
+ }
+
+ var link = links.where((l) => l.filePath == parentNote.filePath).first;
+ var body = note.body.split('\n');
+ var paragraph = body.firstWhere(
+ (line) => line.contains('[${link.term}]'),
+ orElse: () => "",
+ );
+ // vHanda: This isn't a very fool proof way of figuring out the line
+
+ return Text(
+ paragraph,
+ style: textTheme.bodyText2,
+ maxLines: 3,
+ );
+ }
}