From 11a9023e99dff6bf39c874c50e6ab2ccff764a60 Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Wed, 25 Sep 2019 15:41:19 +0200 Subject: [PATCH] Allow the Note FileName to be configured This is super ugly, but it solves a real use case, and hopefully I'll eventually get around to improving the UI of the Settings page. --- lib/datetime_utils.dart | 4 ++++ lib/note_fileName.dart | 16 ++++++++++++++++ lib/screens/settings_screen.dart | 29 +++++++++++++++++++++++++++++ lib/state_container.dart | 4 ++-- lib/storage/file_storage.dart | 2 -- 5 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 lib/note_fileName.dart diff --git a/lib/datetime_utils.dart b/lib/datetime_utils.dart index 81ae00b3..bd028d1c 100644 --- a/lib/datetime_utils.dart +++ b/lib/datetime_utils.dart @@ -1,5 +1,9 @@ import 'package:intl/intl.dart'; +String toIso8601(DateTime dt) { + return DateFormat("yyyy-MM-ddTHH:mm:ss").format(dt); +} + String toIso8601WithTimezone(DateTime dt) { var result = DateFormat("yyyy-MM-ddTHH:mm:ss").format(dt); diff --git a/lib/note_fileName.dart b/lib/note_fileName.dart new file mode 100644 index 00000000..cd546a98 --- /dev/null +++ b/lib/note_fileName.dart @@ -0,0 +1,16 @@ +import 'package:journal/note.dart'; +import 'package:journal/datetime_utils.dart'; +import 'package:journal/settings.dart'; + +String getFileName(Note note) { + switch (Settings.instance.noteFileNameFormat) { + case NoteFileNameFormat.Iso8601: + return toIso8601(note.created) + ".md"; + case NoteFileNameFormat.Iso8601WithTimeZone: + return toIso8601WithTimezone(note.created) + ".md"; + case NoteFileNameFormat.Iso8601WithTimeZoneWithoutColon: + return toIso8601WithTimezone(note.created).replaceAll(":", "_") + ".md"; + } + + return note.created.toString(); +} diff --git a/lib/screens/settings_screen.dart b/lib/screens/settings_screen.dart index 8fc4a2b8..8841412a 100644 --- a/lib/screens/settings_screen.dart +++ b/lib/screens/settings_screen.dart @@ -183,6 +183,35 @@ class SettingsListState extends State { ListTile(title: gitAuthorForm), ListTile(title: gitAuthorEmailForm), SizedBox(height: 16.0), + PreferenceTitle("Storage"), + DropdownPreference( + 'File Name', + 'file_name', + defaultVal: "ISO8601 With TimeZone", + values: [ + "ISO8601 With TimeZone", + "ISO8601", + "ISO8601 without Colons", + ], + onChange: (newVal) { + NoteFileNameFormat format; + switch (newVal) { + case "ISO8601 With TimeZone": + format = NoteFileNameFormat.Iso8601WithTimeZone; + break; + case "ISO8601": + format = NoteFileNameFormat.Iso8601; + break; + case "ISO8601 without Colons": + format = NoteFileNameFormat.Iso8601WithTimeZoneWithoutColon; + break; + default: + format = NoteFileNameFormat.Iso8601WithTimeZone; + } + Settings.instance.noteFileNameFormat = format; + Settings.instance.save(); + }, + ), VersionNumberTile(), ]); } diff --git a/lib/state_container.dart b/lib/state_container.dart index 432b1ab3..172a3cd3 100644 --- a/lib/state_container.dart +++ b/lib/state_container.dart @@ -7,8 +7,8 @@ import 'package:flutter/material.dart'; import 'package:journal/analytics.dart'; import 'package:journal/apis/git_migration.dart'; import 'package:journal/appstate.dart'; -import 'package:journal/datetime_utils.dart'; import 'package:journal/note.dart'; +import 'package:journal/note_fileName.dart'; import 'package:journal/storage/git_storage.dart'; import 'package:journal/storage/notes_repository.dart'; import 'package:path/path.dart' as p; @@ -217,7 +217,7 @@ class StateContainerState extends State { Fimber.d("State Container insertNote"); setState(() { if (note.filePath == null || note.filePath.isEmpty) { - note.filePath = toIso8601WithTimezone(note.created) + '.md'; + note.filePath = getFileName(note); } appState.notes.insert(index, note); appState.hasJournalEntries = true; diff --git a/lib/storage/file_storage.dart b/lib/storage/file_storage.dart index 8d5d4127..e163c474 100644 --- a/lib/storage/file_storage.dart +++ b/lib/storage/file_storage.dart @@ -8,8 +8,6 @@ import 'package:journal/storage/notes_repository.dart'; import 'package:journal/storage/serializers.dart'; import 'package:path/path.dart' as p; -typedef String NoteFileNameGenerator(Note note); - /// Each Note is saved in a different file /// Each note must have a fileName which ends in a .md class FileStorage implements NoteRepository {