From 249b01d7a87e899af413bc5ec81eac4465bf5205 Mon Sep 17 00:00:00 2001 From: Bernd Bestel Date: Tue, 24 Jul 2018 20:45:14 +0200 Subject: [PATCH] Added possibility to track who did a habit (this implements and closes #21) --- app.php | 1 + controllers/HabitsApiController.php | 8 ++- controllers/HabitsController.php | 3 +- controllers/UsersApiController.php | 6 +-- helpers/extensions.php | 24 +++++++++ localization/de.php | 1 + migrations/0028.sql | 2 + public/viewjs/components/productpicker.js | 4 +- public/viewjs/components/userpicker.js | 62 +++++++++++++++++++++++ public/viewjs/habittracking.js | 2 +- services/HabitsService.php | 11 +++- views/components/productpicker.blade.php | 2 +- views/components/userpicker.blade.php | 16 ++++++ views/habittracking.blade.php | 7 +++ views/layout/default.blade.php | 2 - views/users.blade.php | 2 +- 16 files changed, 139 insertions(+), 14 deletions(-) create mode 100644 migrations/0028.sql create mode 100644 public/viewjs/components/userpicker.js create mode 100644 views/components/userpicker.blade.php diff --git a/app.php b/app.php index 10a3a65e..06fc239a 100644 --- a/app.php +++ b/app.php @@ -9,6 +9,7 @@ use \Grocy\Controllers\LoginController; if (file_exists(__DIR__ . '/embedded.txt')) { define('GROCY_DATAPATH', file_get_contents(__DIR__ . '/embedded.txt')); + define('GROCY_USER_ID', 1); } else { diff --git a/controllers/HabitsApiController.php b/controllers/HabitsApiController.php index ad27516c..292bbfd8 100644 --- a/controllers/HabitsApiController.php +++ b/controllers/HabitsApiController.php @@ -22,9 +22,15 @@ class HabitsApiController extends BaseApiController $trackedTime = $request->getQueryParams()['tracked_time']; } + $doneBy = GROCY_USER_ID; + if (isset($request->getQueryParams()['done_by']) && !empty($request->getQueryParams()['done_by'])) + { + $doneBy = $request->getQueryParams()['done_by']; + } + try { - $this->HabitsService->TrackHabit($args['habitId'], $trackedTime); + $this->HabitsService->TrackHabit($args['habitId'], $trackedTime, $doneBy); return $this->VoidApiActionResponse($response); } catch (\Exception $ex) diff --git a/controllers/HabitsController.php b/controllers/HabitsController.php index 9753880b..304d1764 100644 --- a/controllers/HabitsController.php +++ b/controllers/HabitsController.php @@ -38,7 +38,8 @@ class HabitsController extends BaseController public function TrackHabitExecution(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args) { return $this->AppContainer->view->render($response, 'habittracking', [ - 'habits' => $this->Database->habits()->orderBy('name') + 'habits' => $this->Database->habits()->orderBy('name'), + 'users' => $this->Database->users()->orderBy('username') ]); } diff --git a/controllers/UsersApiController.php b/controllers/UsersApiController.php index c2eb33fc..f6156025 100644 --- a/controllers/UsersApiController.php +++ b/controllers/UsersApiController.php @@ -21,7 +21,7 @@ class UsersApiController extends BaseApiController try { $this->UsersService->CreateUser($requestBody['username'], $requestBody['first_name'], $requestBody['last_name'], $requestBody['password']); - return $this->ApiResponse(array('success' => $success)); + return $this->ApiResponse(array('success' => true)); } catch (\Exception $ex) { @@ -33,7 +33,7 @@ class UsersApiController extends BaseApiController { try { - $this->UsersService->DeleteUser($args['userId']); + $success = $this->UsersService->DeleteUser($args['userId']); return $this->ApiResponse(array('success' => $success)); } catch (\Exception $ex) @@ -49,7 +49,7 @@ class UsersApiController extends BaseApiController try { $this->UsersService->EditUser($args['userId'], $requestBody['username'], $requestBody['first_name'], $requestBody['last_name'], $requestBody['password']); - return $this->ApiResponse(array('success' => $success)); + return $this->ApiResponse(array('success' => true)); } catch (\Exception $ex) { diff --git a/helpers/extensions.php b/helpers/extensions.php index c000d088..a23a73af 100644 --- a/helpers/extensions.php +++ b/helpers/extensions.php @@ -144,3 +144,27 @@ function Setting(string $name, $value) } } } + +function GetUserDisplayName($user) +{ + $displayName = ''; + + if (empty($user->first_name) && !empty($user->last_name)) + { + $displayName = $user->last_name; + } + elseif (empty($user->last_name) && !empty($user->first_name)) + { + $displayName = $user->first_name; + } + elseif (!empty($user->last_name) && !empty($user->first_name)) + { + $displayName = $user->first_name . ' ' . $user->last_name; + } + else + { + $displayName = $user->username; + } + + return $displayName; +} diff --git a/localization/de.php b/localization/de.php index 88a98222..879a2db1 100644 --- a/localization/de.php +++ b/localization/de.php @@ -180,6 +180,7 @@ return array( 'Confirm password' => 'Passwort bestätigen', 'Passwords do not match' => 'Passwörter stimmen nicht überein', 'Change password' => 'Passwort ändern', + 'Done by' => 'Ausgeführt von', //Constants 'manually' => 'Manuell', diff --git a/migrations/0028.sql b/migrations/0028.sql new file mode 100644 index 00000000..fd8248e0 --- /dev/null +++ b/migrations/0028.sql @@ -0,0 +1,2 @@ +ALTER TABLE habits_log +ADD done_by_user_id diff --git a/public/viewjs/components/productpicker.js b/public/viewjs/components/productpicker.js index 47f5a449..6cfc3bcc 100644 --- a/public/viewjs/components/productpicker.js +++ b/public/viewjs/components/productpicker.js @@ -1,6 +1,6 @@ Grocy.Components.ProductPicker = { }; -Grocy.Components.ProductPicker.GetPicker = function () +Grocy.Components.ProductPicker.GetPicker = function() { return $('#product_id'); } @@ -43,7 +43,7 @@ Grocy.Components.ProductPicker.HideCustomError = function() $("#custom-productpicker-error").addClass("d-none"); } -$('.combobox').combobox({ +$('.product-combobox').combobox({ appendId: '_text_input', bsVersion: '4' }); diff --git a/public/viewjs/components/userpicker.js b/public/viewjs/components/userpicker.js new file mode 100644 index 00000000..cca792b1 --- /dev/null +++ b/public/viewjs/components/userpicker.js @@ -0,0 +1,62 @@ +Grocy.Components.UserPicker = { }; + +Grocy.Components.UserPicker.GetPicker = function() +{ + return $('#user_id'); +} + +Grocy.Components.UserPicker.GetInputElement = function() +{ + return $('#user_id_text_input'); +} + +Grocy.Components.UserPicker.GetValue = function() +{ + return $('#user_id').val(); +} + +Grocy.Components.UserPicker.SetValue = function(value) +{ + Grocy.Components.UserPicker.GetInputElement().val(value); + Grocy.Components.UserPicker.GetInputElement().trigger('change'); +} + +$('.user-combobox').combobox({ + appendId: '_text_input', + bsVersion: '4' +}); + +var prefillUser = Grocy.Components.UserPicker.GetPicker().parent().data('prefill-by-username').toString(); +if (typeof prefillUser !== "undefined") +{ + var possibleOptionElement = $("#user_id option[data-additional-searchdata*='" + prefillUser + "']").first(); + if (possibleOptionElement.length === 0) + { + possibleOptionElement = $("#user_id option:contains('" + prefillUser + "')").first(); + } + + if (possibleOptionElement.length > 0) + { + $('#user_id').val(possibleOptionElement.val()); + $('#user_id').data('combobox').refresh(); + $('#user_id').trigger('change'); + + var nextInputElement = $(Grocy.Components.UserPicker.GetPicker().parent().data('next-input-selector').toString()); + nextInputElement.focus(); + } +} + +var prefillUserId = Grocy.Components.UserPicker.GetPicker().parent().data('prefill-by-user-id').toString(); +if (typeof prefillUserId !== "undefined") +{ + var possibleOptionElement = $("#user_id option[value='" + prefillUserId + "']").first(); + if (possibleOptionElement.length > 0) + { + $('#user_id').val(possibleOptionElement.val()); + $('#user_id').data('combobox').refresh(); + $('#user_id').trigger('change'); + + var nextInputElement = $(Grocy.Components.UserPicker.GetPicker().parent().data('next-input-selector').toString()); + nextInputElement.focus(); + } +} diff --git a/public/viewjs/habittracking.js b/public/viewjs/habittracking.js index 7807f421..853a235e 100644 --- a/public/viewjs/habittracking.js +++ b/public/viewjs/habittracking.js @@ -7,7 +7,7 @@ Grocy.Api.Get('habits/get-habit-details/' + jsonForm.habit_id, function (habitDetails) { - Grocy.Api.Get('habits/track-habit-execution/' + jsonForm.habit_id + '?tracked_time=' + Grocy.Components.DateTimePicker.GetValue(), + Grocy.Api.Get('habits/track-habit-execution/' + jsonForm.habit_id + '?tracked_time=' + Grocy.Components.DateTimePicker.GetValue() + "&done_by=" + Grocy.Components.UserPicker.GetValue(), function(result) { toastr.success(L('Tracked execution of habit #1 on #2', habitDetails.habit.name, Grocy.Components.DateTimePicker.GetValue())); diff --git a/services/HabitsService.php b/services/HabitsService.php index 6256cafe..445444f9 100644 --- a/services/HabitsService.php +++ b/services/HabitsService.php @@ -52,16 +52,23 @@ class HabitsService extends BaseService ); } - public function TrackHabit(int $habitId, string $trackedTime) + public function TrackHabit(int $habitId, string $trackedTime, $doneBy = GROCY_USER_ID) { if (!$this->HabitExists($habitId)) { throw new \Exception('Habit does not exist'); } + + $userRow = $this->Database->users()->where('id = :1', $doneBy)->fetch(); + if ($userRow === null) + { + throw new \Exception('User does not exist'); + } $logRow = $this->Database->habits_log()->createRow(array( 'habit_id' => $habitId, - 'tracked_time' => $trackedTime + 'tracked_time' => $trackedTime, + 'done_by_user_id' => $doneBy )); $logRow->save(); diff --git a/views/components/productpicker.blade.php b/views/components/productpicker.blade.php index 9f21a393..98d20e82 100644 --- a/views/components/productpicker.blade.php +++ b/views/components/productpicker.blade.php @@ -7,7 +7,7 @@
- @foreach($products as $product) diff --git a/views/components/userpicker.blade.php b/views/components/userpicker.blade.php new file mode 100644 index 00000000..ca5a9ed5 --- /dev/null +++ b/views/components/userpicker.blade.php @@ -0,0 +1,16 @@ +@push('componentScripts') + +@endpush + +@php if(empty($prefillByUsername)) { $prefillByUsername = ''; } @endphp +@php if(empty($prefillByUserId)) { $prefillByUserId = ''; } @endphp + +
+ + +
diff --git a/views/habittracking.blade.php b/views/habittracking.blade.php index 718ecfe1..75b56bc4 100644 --- a/views/habittracking.blade.php +++ b/views/habittracking.blade.php @@ -32,6 +32,13 @@ 'invalidFeedback' => $L('This can only be before now') )) + @include('components.userpicker', array( + 'label' => 'Done by', + 'users' => $users, + 'nextInputSelector' => '#user_id', + 'prefillByUserId' => GROCY_USER_ID + )) + diff --git a/views/layout/default.blade.php b/views/layout/default.blade.php index 8035a4a8..a6692fec 100644 --- a/views/layout/default.blade.php +++ b/views/layout/default.blade.php @@ -180,10 +180,8 @@ {{ $L('Settings') }}