From fe08b5353900c8f78f2c87abbe103381d0872f8c Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Tue, 31 Mar 2020 14:02:38 +0200 Subject: [PATCH] Add a .gitjournal.yaml file in a folder This file will be added to save the settings of how we want that folder to behave. For example - default Editor, view, sorting mode, etc. This feature is currently disabled as it will only be a part of the pro mode. --- lib/core/git_repo.dart | 13 +++++++++ lib/core/notes_folder_fs.dart | 20 +++++++++++--- lib/core/virtual_notes_folder.dart | 4 +-- lib/features.dart | 2 +- lib/screens/folder_view.dart | 27 ++++++++++++------- lib/state_container.dart | 16 +++++++++++ pubspec.lock | 7 +++++ pubspec.yaml | 1 + test/notes_folder_config_test.dart | 43 ++++++++++++++++++++++++++++++ 9 files changed, 118 insertions(+), 15 deletions(-) create mode 100644 test/notes_folder_config_test.dart diff --git a/lib/core/git_repo.dart b/lib/core/git_repo.dart index 85eb4639..dcd599e5 100644 --- a/lib/core/git_repo.dart +++ b/lib/core/git_repo.dart @@ -7,6 +7,7 @@ import 'package:fimber/fimber.dart'; import 'package:git_bindings/git_bindings.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/settings.dart'; @@ -55,6 +56,18 @@ class GitNoteRepository { return NoteRepoResult(noteFilePath: folder.folderPath, error: false); } + Future addFolderConfig(NotesFolderConfig config) async { + var pathSpec = config.folder.pathSpec(); + pathSpec = pathSpec.isNotEmpty ? pathSpec : '/'; + + await _gitRepo.add("."); + await _gitRepo.commit( + message: "Update folder config for $pathSpec", + ); + + return NoteRepoResult(noteFilePath: config.folder.folderPath, error: false); + } + Future renameFolder( String oldFullPath, String newFullPath, diff --git a/lib/core/notes_folder_fs.dart b/lib/core/notes_folder_fs.dart index 48c6187a..04f21196 100644 --- a/lib/core/notes_folder_fs.dart +++ b/lib/core/notes_folder_fs.dart @@ -1,6 +1,7 @@ import 'dart:io'; import 'package:fimber/fimber.dart'; +import 'package:gitjournal/features.dart'; import 'package:path/path.dart' as p; import 'package:path/path.dart'; import 'package:synchronized/synchronized.dart'; @@ -18,6 +19,7 @@ class NotesFolderFS with NotesFolderNotifier implements NotesFolder { List _folders = []; Map _entityMap = {}; + NotesFolderConfig _config; NotesFolderFS(this._parent, this._folderPath); @@ -149,6 +151,11 @@ class NotesFolderFS with NotesFolderNotifier implements NotesFolder { Future _load() async { Set pathsFound = {}; + // Load the Folder config if exists + if (Features.perFolderConfig) { + _config = await NotesFolderConfig.fromFS(this); + } + final dir = Directory(folderPath); var lister = dir.list(recursive: false, followLinks: false); await for (var fsEntity in lister) { @@ -344,11 +351,18 @@ class NotesFolderFS with NotesFolderNotifier implements NotesFolder { @override NotesFolderConfig get config { - return NotesFolderConfig.fromSettings(); + if (Features.perFolderConfig && _config != null) { + return _config; + } + return NotesFolderConfig.fromSettings(this); } @override - set config(NotesFolderConfig conf) { - conf.save(); + set config(NotesFolderConfig config) { + if (Features.perFolderConfig) { + _config = config; + } else { + config.saveToSettings(); + } } } diff --git a/lib/core/virtual_notes_folder.dart b/lib/core/virtual_notes_folder.dart index 91a4eb50..8f004ee6 100644 --- a/lib/core/virtual_notes_folder.dart +++ b/lib/core/virtual_notes_folder.dart @@ -35,12 +35,12 @@ class VirtualNotesFolder with NotesFolderNotifier implements NotesFolder { @override NotesFolderConfig get config { - return NotesFolderConfig.fromSettings(); + return NotesFolderConfig.fromSettings(fsFolder); } @override set config(NotesFolderConfig conf) { assert(false, "A Virtual Notes Folder Config cannot change"); - conf.save(); + conf.saveToSettings(); } } diff --git a/lib/features.dart b/lib/features.dart index 6a1056bc..51d98688 100644 --- a/lib/features.dart +++ b/lib/features.dart @@ -1,3 +1,3 @@ class Features { - static bool perFolderConfig = true; + static bool perFolderConfig = false; } diff --git a/lib/screens/folder_view.dart b/lib/screens/folder_view.dart index 10c45eaf..65e89bc5 100644 --- a/lib/screens/folder_view.dart +++ b/lib/screens/folder_view.dart @@ -237,10 +237,14 @@ class _FolderViewState extends State { ); if (newSortingMode != null) { + sortedNotesFolder.config = sortedNotesFolder.config.copyWith( + sortingMode: newSortingMode, + ); + + var container = Provider.of(context, listen: false); + container.saveFolderConfig(sortedNotesFolder.config); + setState(() { - sortedNotesFolder.config = sortedNotesFolder.config.copyWith( - sortingMode: newSortingMode, - ); sortedNotesFolder.changeSortingMode(newSortingMode); }); } @@ -258,7 +262,8 @@ class _FolderViewState extends State { sortedNotesFolder.config = sortedNotesFolder.config.copyWith( viewHeader: _headerType, ); - sortedNotesFolder.config.save(); + var container = Provider.of(context, listen: false); + container.saveFolderConfig(sortedNotesFolder.config); }; var summaryChanged = (bool newVal) { @@ -269,7 +274,8 @@ class _FolderViewState extends State { sortedNotesFolder.config = sortedNotesFolder.config.copyWith( showNoteSummary: newVal, ); - sortedNotesFolder.config.save(); + var container = Provider.of(context, listen: false); + container.saveFolderConfig(sortedNotesFolder.config); }; return StatefulBuilder( @@ -377,11 +383,14 @@ class _FolderViewState extends State { if (newViewType != null) { setState(() { _viewType = newViewType; - widget.notesFolder.config = widget.notesFolder.config.copyWith( - defaultView: newViewType, - ); - widget.notesFolder.config.save(); }); + + widget.notesFolder.config = widget.notesFolder.config.copyWith( + defaultView: newViewType, + ); + + var container = Provider.of(context, listen: false); + container.saveFolderConfig(widget.notesFolder.config); } } } diff --git a/lib/state_container.dart b/lib/state_container.dart index af213285..d9fcf375 100644 --- a/lib/state_container.dart +++ b/lib/state_container.dart @@ -8,8 +8,10 @@ import 'package:gitjournal/apis/git_migration.dart'; import 'package:gitjournal/appstate.dart'; import 'package:gitjournal/core/note.dart'; import 'package:gitjournal/core/notes_cache.dart'; +import 'package:gitjournal/core/notes_folder.dart'; import 'package:gitjournal/core/notes_folder_fs.dart'; import 'package:gitjournal/core/git_repo.dart'; +import 'package:gitjournal/features.dart'; import 'package:gitjournal/settings.dart'; import 'package:path/path.dart' as p; import 'package:shared_preferences/shared_preferences.dart'; @@ -235,6 +237,20 @@ class StateContainer with ChangeNotifier { }); } + void saveFolderConfig(NotesFolderConfig config) async { + if (!Features.perFolderConfig) { + return; + } + + return _opLock.synchronized(() async { + Fimber.d("State Container saveFolderConfig"); + await config.saveToFS(); + _gitRepo.addFolderConfig(config).then((NoteRepoResult _) { + _syncNotes(); + }); + }); + } + void completeGitHostSetup() { () async { appState.remoteGitRepoConfigured = true; diff --git a/pubspec.lock b/pubspec.lock index 58326777..f6e71bc2 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -141,6 +141,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.1" + equatable: + dependency: "direct main" + description: + name: equatable + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" fetch_app_logs: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index d404ea88..18f0cbea 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -40,6 +40,7 @@ dependencies: steel_crypt: ^1.7.1+1 font_awesome_flutter: ^8.7.0 sentry: ">=3.0.0 <4.0.0" + equatable: ^1.1.0 dev_dependencies: flutter_launcher_icons: "^0.7.2" diff --git a/test/notes_folder_config_test.dart b/test/notes_folder_config_test.dart new file mode 100644 index 00000000..a9a65724 --- /dev/null +++ b/test/notes_folder_config_test.dart @@ -0,0 +1,43 @@ +import 'dart:io'; + +import 'package:gitjournal/core/notes_folder_config.dart'; +import 'package:gitjournal/core/notes_folder_fs.dart'; +import 'package:gitjournal/core/sorting_mode.dart'; +import 'package:gitjournal/folder_views/common.dart'; +import 'package:gitjournal/folder_views/standard_view.dart'; +import 'package:gitjournal/screens/note_editor.dart'; +import 'package:path/path.dart' as p; +import 'package:test/test.dart'; + +void main() { + group('Notes Folder Config', () { + Directory tempDir; + + setUp(() async { + tempDir = await Directory.systemTemp.createTemp('__notes_config_test__'); + }); + + tearDown(() async { + tempDir.deleteSync(recursive: true); + }); + + test('Should load from FS correctly', () async { + var folder = NotesFolderFS(null, tempDir.path); + var config = NotesFolderConfig( + defaultEditor: EditorType.Checklist, + defaultView: FolderViewType.Standard, + showNoteSummary: true, + sortingMode: SortingMode.Modified, + viewHeader: StandardViewHeader.TitleOrFileName, + folder: folder, + ); + + await config.saveToFS(); + var file = File(p.join(tempDir.path, NotesFolderConfig.FILENAME)); + expect(file.existsSync(), true); + + var config2 = await NotesFolderConfig.fromFS(folder); + expect(config, config2); + }); + }); +}