From dd534e1f1b5cbaff3d1715402ead31cb7043fbd2 Mon Sep 17 00:00:00 2001 From: Matias De lellis Date: Tue, 16 Jun 2020 22:56:34 -0300 Subject: [PATCH] Initial settings that allow to choose the default color of the notes. --- appinfo/routes.php | 18 ++++- css/style.scss | 7 +- js/script.js | 55 +++++++++++-- js/templates/settings.handlebars | 19 +++++ lib/Controller/NoteController.php | 2 +- lib/Controller/SettingsController.php | 112 ++++++++++++++++++++++++++ lib/Service/NoteService.php | 11 ++- lib/Service/SettingsService.php | 65 +++++++++++++++ templates/fake.php | 3 +- templates/part.settings.php | 6 +- 10 files changed, 279 insertions(+), 19 deletions(-) create mode 100644 js/templates/settings.handlebars create mode 100644 lib/Controller/SettingsController.php create mode 100644 lib/Service/SettingsService.php diff --git a/appinfo/routes.php b/appinfo/routes.php index 744c438..8e1d357 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -5,6 +5,22 @@ return ['resources' => 'noteApi' => ['url' => '/api/v1/notes'] ], 'routes' => [ - ['name' => 'page#index', 'url' => '/', 'verb' => 'GET'] + // Main page + [ + 'name' => 'page#index', + 'url' => '/', + 'verb' => 'GET' + ], + // User Settings + [ + 'name' => 'settings#setUserValue', + 'url' => '/setuservalue', + 'verb' => 'POST' + ], + [ + 'name' => 'settings#getUserValue', + 'url' => '/getuservalue', + 'verb' => 'GET' + ] ] ]; diff --git a/css/style.scss b/css/style.scss index 7e5f89a..a82a5ce 100644 --- a/css/style.scss +++ b/css/style.scss @@ -267,12 +267,13 @@ div[contenteditable="true"] { background-color: rgba(0,0,0,0.12); } -.note-tags { - margin-top: 8px; +.note-shares > .slim-share, +.note-tags > .slim-tag { + margin-top: 5px; } -/* Restore defaults select2 rules */ +/* Restore defaults select2 rules */ .select2-container-multi .select2-choices diff --git a/js/script.js b/js/script.js index d82b3d8..f21ce8b 100644 --- a/js/script.js +++ b/js/script.js @@ -563,8 +563,7 @@ View.prototype = { $('#new-note').click(function () { var fakenote = { title: t('quicknotes', 'New note'), - content: '', - color: '#F7EB96' + content: '' }; self._notes.create(fakenote).done(function(note) { if (self._notes.length() > 1) { @@ -588,7 +587,7 @@ View.prototype = { $('#all-notes').click(function () { $('.notes-grid').isotope({ filter: '*'}); - var oldColorTool = $('#app-navigation .circle-toolbar.icon-checkmark'); + var oldColorTool = $('#colors-folder .circle-toolbar.icon-checkmark'); $.each(oldColorTool, function(i, oct) { $(oct).removeClass('icon-checkmark'); }); @@ -625,9 +624,9 @@ View.prototype = { event.stopPropagation(); }); - $('#app-navigation .circle-toolbar').click(function (event) { + $('#colors-folder .circle-toolbar').click(function (event) { event.stopPropagation(); - var oldColorTool = $('#app-navigation .circle-toolbar.icon-checkmark'); + var oldColorTool = $('#colors-folder .circle-toolbar.icon-checkmark'); $.each(oldColorTool, function(i, oct) { $(oct).removeClass('icon-checkmark'); }); @@ -687,8 +686,48 @@ View.prototype = { $(oct).removeClass('icon-checkmark'); }); }); - }, + }, + renderSettings: function () { + /* Render view */ + var html = Handlebars.templates['settings']({}); + $('#app-settings-content').html(html); + var self = this; + $.get(OC.generateUrl('apps/quicknotes/getuservalue'), {'type': 'default_color'}) + .done(function (response) { + var color = response.value;; + var colors = $("#setting-defaul-color")[0].getElementsByClassName("circle-toolbar"); + $.each(colors, function(i, c) { + if (color === self._colorToHex(c.style.backgroundColor)) { + c.className += " icon-checkmark"; + } + }); + }); + + /* Settings */ + + $("#app-settings-content").off(); + + $('#app-settings-content').on('click', '.circle-toolbar', function (event) { + event.stopPropagation(); + + var currentColor = $(this); + var color = self._colorToHex(currentColor.css("background-color")); + + $.ajax({ + url: OC.generateUrl('apps/quicknotes/setuservalue'), + type: 'POST', + data: { + 'type': 'default_color', + 'value': color + }, + success: function (response) { + $('#setting-defaul-color .circle-toolbar').removeClass('icon-checkmark'); + currentColor.addClass('icon-checkmark'); + } + }); + }); + }, /** * Some 'private' functions as helpers. */ @@ -977,6 +1016,7 @@ View.prototype = { render: function () { this.renderNavigation(); this.renderContent(); + this.renderSettings(); } }; @@ -1038,8 +1078,7 @@ view.renderContent(); * Loading notes and render final view. */ notes.load().done(function () { - view.renderNavigation(); - view.renderContent(); + view.render(); }).fail(function () { alert('Could not load notes'); }); diff --git a/js/templates/settings.handlebars b/js/templates/settings.handlebars new file mode 100644 index 0000000..fcb44c2 --- /dev/null +++ b/js/templates/settings.handlebars @@ -0,0 +1,19 @@ +
+ +
+
+
+
+ + + + + + + + + + +
+
+
\ No newline at end of file diff --git a/lib/Controller/NoteController.php b/lib/Controller/NoteController.php index ee18753..623e96a 100644 --- a/lib/Controller/NoteController.php +++ b/lib/Controller/NoteController.php @@ -91,7 +91,7 @@ class NoteController extends Controller { * @param string $content * @param string $color */ - public function create($title, $content, $color = "#F7EB96") { + public function create($title, $content, $color = NULL) { $note = $this->noteService->create($this->userId, $title, $content, $color); $etag = md5(json_encode($note)); diff --git a/lib/Controller/SettingsController.php b/lib/Controller/SettingsController.php new file mode 100644 index 0000000..6cff97a --- /dev/null +++ b/lib/Controller/SettingsController.php @@ -0,0 +1,112 @@ + + * + * @author Matias De lellis + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OCA\QuickNotes\Controller; + +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http\JSONResponse; +use OCP\IRequest; + +use OCA\QuickNotes\Service\SettingsService; + + +class SettingsController extends Controller { + + /** @var SettingsService */ + private $settingsService; + + /** @var string */ + private $userId; + + const STATE_OK = 0; + const STATE_FALSE = 1; + const STATE_SUCCESS = 2; + const STATE_ERROR = 3; + + public function __construct ($appName, + IRequest $request, + SettingsService $settingsService, + $userId) + { + parent::__construct($appName, $request); + + $this->appName = $appName; + $this->settingsService = $settingsService; + $this->userId = $userId; + } + + /** + * @NoAdminRequired + * @param $type + * @param $value + * @return JSONResponse + */ + public function setUserValue($type, $value) { + $status = self::STATE_SUCCESS; + + switch ($type) { + case SettingsService::COLOR_FOR_NEW_NOTES_KEY: + $this->settingsService->setColorForNewNotes($value); + break; + default: + $status = self::STATE_ERROR; + break; + } + + // Response + $result = [ + 'status' => $status, + 'value' => $value + ]; + + return new JSONResponse($result); + } + + /** + * @NoAdminRequired + * @param $type + * @return JSONResponse + */ + public function getUserValue($type) { + $status = self::STATE_OK; + $value ='nodata'; + + switch ($type) { + case SettingsService::COLOR_FOR_NEW_NOTES_KEY: + $value = $this->settingsService->getColorForNewNotes($this->userId); + break; + default: + $status = self::STATE_FALSE; + break; + } + + $result = [ + 'status' => $status, + 'value' => $value + ]; + + return new JSONResponse($result); + } + +} diff --git a/lib/Service/NoteService.php b/lib/Service/NoteService.php index 14c4b5f..99c7b9b 100644 --- a/lib/Service/NoteService.php +++ b/lib/Service/NoteService.php @@ -52,6 +52,7 @@ class NoteService { private $attachMapper; private $tagmapper; private $fileService; + private $settingsService; public function __construct(NoteMapper $notemapper, NoteTagMapper $notetagmapper, @@ -59,7 +60,8 @@ class NoteService { ColorMapper $colormapper, AttachMapper $attachMapper, TagMapper $tagmapper, - FileService $fileService) + FileService $fileService, + SettingsService $settingsService) { $this->notemapper = $notemapper; $this->notetagmapper = $notetagmapper; @@ -68,6 +70,7 @@ class NoteService { $this->attachMapper = $attachMapper; $this->tagmapper = $tagmapper; $this->fileService = $fileService; + $this->settingsService = $settingsService; } /** @@ -154,7 +157,11 @@ class NoteService { * @param string $content * @param string $color */ - public function create(string $userId, string $title, string $content, string $color = "#F7EB96"): Note { + public function create(string $userId, string $title, string $content, string $color = NULL): Note { + if (is_null($color)) { + $color = $this->settingsService->getColorForNewNotes(); + } + // Get color or append it if ($this->colormapper->colorExists($color)) { $hcolor = $this->colormapper->findByColor($color); diff --git a/lib/Service/SettingsService.php b/lib/Service/SettingsService.php new file mode 100644 index 0000000..97ff5bc --- /dev/null +++ b/lib/Service/SettingsService.php @@ -0,0 +1,65 @@ + + * + * @author Matias De lellis + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OCA\QuickNotes\Service; + +use OCA\QuickNotes\AppInfo\Application; + +use OCP\IConfig; + +class SettingsService { + + /** + * Settings keys and default values. + */ + const COLOR_FOR_NEW_NOTES_KEY = 'default_color'; + const DEFAULT_COLOR_FOR_NEW_NOTES = '#F7EB96'; + + /** @var IConfig Config */ + private $config; + + /** @var string|null */ + private $userId; + + /** + * @param IConfig $config + * @param string $userId + */ + public function __construct(IConfig $config, + $userId) + { + $this->config = $config; + $this->userId = $userId; + } + + + public function getColorForNewNotes(): string { + return $this->config->getUserValue($this->userId, Application::APP_NAME, self::COLOR_FOR_NEW_NOTES_KEY, self::DEFAULT_COLOR_FOR_NEW_NOTES); + } + + public function setColorForNewNotes(string $color) { + $this->config->setUserValue($this->userId, Application::APP_NAME, self::COLOR_FOR_NEW_NOTES_KEY, $color); + } + +} diff --git a/templates/fake.php b/templates/fake.php index 8a20d5c..73b15c4 100644 --- a/templates/fake.php +++ b/templates/fake.php @@ -8,4 +8,5 @@ p($l->t('Shared')); p($l->t('Shared with others')); p($l->t('Shared with you')); p($l->t('Share note')); -p($l->t('Close')); \ No newline at end of file +p($l->t('Close')); +p($l->t('Default color for new notes')); \ No newline at end of file diff --git a/templates/part.settings.php b/templates/part.settings.php index 7eebe65..594ef30 100644 --- a/templates/part.settings.php +++ b/templates/part.settings.php @@ -1,8 +1,8 @@
- +