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 @@