diff --git a/assets/langs/en.yaml b/assets/langs/en.yaml index e3fbfc00..7c2b41e8 100644 --- a/assets/langs/en.yaml +++ b/assets/langs/en.yaml @@ -269,6 +269,7 @@ widgets: failed: Purchase Failed NoteViewer: linkNotFound: Link '{}' not found + linkInvalid: Link '{}' is invalid. FolderSelectionDialog: title: Select a Folder diff --git a/changelog.yml b/changelog.yml index e3691a4e..0e103a77 100644 --- a/changelog.yml +++ b/changelog.yml @@ -9,6 +9,7 @@ - text: "Add Shortcuts support in iOS - #262" image: ios_shortcuts.png - text: "Custom SSH keys with passwords can now be used - #227" + - text: "Create new note when clicking on non existing Wiki Link - #240" bugs: - text: "Fix notes not always showing up - #270" diff --git a/lib/core/note.dart b/lib/core/note.dart index d4a201c5..147c4829 100644 --- a/lib/core/note.dart +++ b/lib/core/note.dart @@ -104,7 +104,11 @@ class Note with NotesNotifier { noteSerializer = NoteSerializer.fromConfig(parent.config); } - Note.newNote(this.parent, {Map extraProps = const {}}) { + Note.newNote( + this.parent, { + Map extraProps = const {}, + String fileName = "", + }) { created = DateTime.now(); _loadState = NoteLoadState.Loaded; _fileFormat = NoteFileFormat.Markdown; @@ -116,6 +120,17 @@ class Note with NotesNotifier { }); noteSerializer.decode(_data, this); } + + if (fileName.isNotEmpty) { + // FIXME: We should ensure a note with this fileName does not already + // exist + if (!NoteFileFormatInfo.isAllowedFileName(fileName)) { + fileName += + NoteFileFormatInfo.defaultExtension(NoteFileFormat.Markdown); + } + _filePath = p.join(parent.folderPath, fileName); + Log.i("Constructing new note with path $_filePath"); + } } String get filePath { diff --git a/lib/folder_views/common.dart b/lib/folder_views/common.dart index ec15911d..09f07e89 100644 --- a/lib/folder_views/common.dart +++ b/lib/folder_views/common.dart @@ -1,13 +1,16 @@ import 'package:flutter/material.dart'; +import 'package:path/path.dart' as p; import 'package:provider/provider.dart'; import 'package:gitjournal/core/note.dart'; import 'package:gitjournal/core/notes_folder.dart'; +import 'package:gitjournal/core/notes_folder_fs.dart'; import 'package:gitjournal/folder_views/card_view.dart'; import 'package:gitjournal/folder_views/grid_view.dart'; import 'package:gitjournal/folder_views/journal_view.dart'; import 'package:gitjournal/screens/note_editor.dart'; +import 'package:gitjournal/settings.dart'; import 'package:gitjournal/state_container.dart'; import 'package:gitjournal/utils.dart'; import 'package:gitjournal/utils/logger.dart'; @@ -83,7 +86,8 @@ void openNoteEditor( bool editMode = false, }) async { var route = MaterialPageRoute( - builder: (context) => NoteEditor.fromNote(note, parentFolder, editMode: editMode), + builder: (context) => + NoteEditor.fromNote(note, parentFolder, editMode: editMode), settings: const RouteSettings(name: '/note/'), ); var showUndoSnackBar = await Navigator.of(context).push(route); @@ -97,3 +101,33 @@ void openNoteEditor( ..showSnackBar(snackBar); } } + +bool openNewNoteEditor(BuildContext context, String term) { + var rootFolder = Provider.of(context, listen: false); + var parentFolder = rootFolder; + var settings = Provider.of(context, listen: false); + var defaultEditor = settings.defaultEditor.toEditorType(); + + var fileName = term; + if (fileName.contains(p.separator)) { + parentFolder = rootFolder.getFolderWithSpec(p.dirname(fileName)); + if (parentFolder == null) { + return false; + } + Log.i("New Note Parent Folder: ${parentFolder.folderPath}"); + + fileName = p.basename(term); + } + + var route = MaterialPageRoute( + builder: (context) => NoteEditor.newNote( + parentFolder, + parentFolder, + defaultEditor, + newNoteFileName: fileName, + ), + settings: const RouteSettings(name: '/newNote/'), + ); + Navigator.of(context).push(route); + return true; +} diff --git a/lib/screens/note_editor.dart b/lib/screens/note_editor.dart index 32c75589..5b701471 100644 --- a/lib/screens/note_editor.dart +++ b/lib/screens/note_editor.dart @@ -37,6 +37,7 @@ class NoteEditor extends StatefulWidget { final List existingImages; final Map newNoteExtraProps; + final String newNoteFileName; final bool editMode; NoteEditor.fromNote( @@ -47,6 +48,7 @@ class NoteEditor extends StatefulWidget { defaultEditorType = null, existingText = null, existingImages = null, + newNoteFileName = "", newNoteExtraProps = null; NoteEditor.newNote( @@ -56,6 +58,7 @@ class NoteEditor extends StatefulWidget { this.existingText, this.existingImages, this.newNoteExtraProps = const {}, + this.newNoteFileName = "", }) : note = null, editMode = true; @@ -67,6 +70,7 @@ class NoteEditor extends StatefulWidget { existingText, existingImages, newNoteExtraProps, + newNoteFileName, ); } else { return NoteEditorState.fromNote(note); @@ -95,8 +99,9 @@ class NoteEditorState extends State with WidgetsBindingObserver { String existingText, List existingImages, Map extraProps, + String fileName, ) { - note = Note.newNote(folder, extraProps: extraProps); + note = Note.newNote(folder, extraProps: extraProps, fileName: fileName); if (existingText != null) { note.body = existingText; } diff --git a/lib/utils/link_resolver.dart b/lib/utils/link_resolver.dart index 8f016fcf..d0a933bf 100644 --- a/lib/utils/link_resolver.dart +++ b/lib/utils/link_resolver.dart @@ -22,15 +22,22 @@ class LinkResolver { } Note resolve(String link) { - if (link.startsWith('[[') && link.endsWith(']]') && link.length > 4) { + if (isWikiLink(link)) { // FIXME: What if the case is different? - var wikiLinkTerm = link.substring(2, link.length - 2).trim(); - return resolveWikiLink(wikiLinkTerm); + return resolveWikiLink(stripWikiSyntax(link)); } return _getNoteWithSpec(inputNote.parent, link); } + static bool isWikiLink(String link) { + return link.startsWith('[[') && link.endsWith(']]') && link.length > 4; + } + + static String stripWikiSyntax(String link) { + return link.substring(2, link.length - 2).trim(); + } + Note resolveWikiLink(String term) { if (term.contains(p.separator)) { var spec = p.normalize(term); diff --git a/lib/widgets/note_viewer.dart b/lib/widgets/note_viewer.dart index 571725bc..96a10954 100644 --- a/lib/widgets/note_viewer.dart +++ b/lib/widgets/note_viewer.dart @@ -89,6 +89,18 @@ class NoteViewer extends StatelessWidget { return; } + if (LinkResolver.isWikiLink(link)) { + var opened = openNewNoteEditor( + context, LinkResolver.stripWikiSyntax(link)); + if (!opened) { + showSnackbar( + context, + tr('wigets.NoteViewer.linkInvalid', args: [link]), + ); + } + return; + } + // External Link try { await launch(link);